From 74dae8d165b7de632f12463c67c061eab1a3304f Mon Sep 17 00:00:00 2001 From: malenov Date: Tue, 31 Jan 2023 14:43:28 +0100 Subject: [PATCH 001/331] dynamical allocation of ind_list[] based on the actual number of transport channels --- apps/encoder.c | 17 ++++ lib_com/bitstream.c | 9 +++ lib_com/ivas_prot.h | 4 + lib_com/options.h | 7 +- lib_enc/init_enc.c | 10 +++ lib_enc/ivas_corecoder_enc_reconfig.c | 112 +++++++++++++++++++++++++- lib_enc/ivas_init_enc.c | 108 ++++++++++++++++++++++--- lib_enc/lib_enc.c | 43 +++++++++- lib_enc/stat_enc.h | 8 ++ 9 files changed, 303 insertions(+), 15 deletions(-) diff --git a/apps/encoder.c b/apps/encoder.c index d789fd5486..b7bc8b6433 100644 --- a/apps/encoder.c +++ b/apps/encoder.c @@ -48,6 +48,10 @@ #define WMC_TOOL_SKIP +#ifdef DEBUG_IND +extern int16_t total_num_id; +#endif + /*------------------------------------------------------------------------------------------* * Local constants, enums, structures *------------------------------------------------------------------------------------------*/ @@ -551,6 +555,7 @@ int main( fprintf( stdout, "\n\n-- Start the encoder (quiet mode) --\n\n" ); } + #ifdef WMOPS reset_stack(); reset_wmops(); @@ -567,6 +572,10 @@ int main( while ( 1 ) { +#ifdef DEBUG_IND + total_num_id = 0; +#endif + /* Read the input data */ if ( ( error = AudioFileReader_read( audioReader, pcmBuf, pcmBufSize, &numSamplesRead ) ) != IVAS_ERR_OK ) { @@ -709,6 +718,14 @@ int main( goto cleanup; } +#ifdef DEBUG_IND + { + int16_t tmp_i = -1; + + dbgwrite( &tmp_i, sizeof( int16_t ), 1, 960 - total_num_id, "res/ind_list.x" ); + } +#endif + frame++; if ( !arg.quietModeEnabled ) { diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index e5f72590a6..5f7be30f67 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -53,6 +53,10 @@ #ifdef DEBUGGING +#ifdef DEBUG_IND +int16_t total_num_id = 0; +#endif + #define FEC_SEED 12558 /*-------------------------------------------------------------------* @@ -300,6 +304,11 @@ ivas_error push_indice( hBstr->last_ind = id; hBstr->nb_bits_tot += nb_bits; +#ifdef DEBUG_IND + dbgwrite( &i, sizeof( int16_t ), 1, 1, "res/ind_list.x" ); + total_num_id++; +#endif + return error; } diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index c91013ca92..142f6a0059 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -285,7 +285,11 @@ void ivas_initialize_handles_enc( ivas_error ivas_init_encoder( Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ +#ifdef IND_LIST_DYN + //Indice *ind_list[], /* i : list of indices */ +#else Indice ind_list[][MAX_NUM_INDICES], /* i : indices list */ +#endif Indice ind_list_metadata[][MAX_BITS_METADATA] /* i : indices list metadata */ ); diff --git a/lib_com/options.h b/lib_com/options.h index 1efe925fe0..2096942f81 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -50,12 +50,16 @@ #ifndef RELEASE #define DEBUGGING /* Activate debugging part of the code */ #endif -/*#define WMOPS*/ /* Activate complexity and memory counters */ +#define WMOPS /* Activate complexity and memory counters */ /*#define WMOPS_PER_FRAME*/ /* Output per-frame complexity (writes one float value per frame to the file "wmops_analysis") */ /*#define WMOPS_DETAIL*/ /* Output detailed complexity printout for every function. Increases runtime overhead */ /*#define WMOPS_WC_FRAME_ANALYSIS*/ /* Output detailed complexity analysis for the worst-case frame */ /*#define MEM_COUNT_DETAILS*/ /* Output detailed memory analysis for the worst-case frame (writes to the file "mem_analysis.csv") */ +/*#define BITSTREAM_INDICES_MEMORY*/ /* Don't count memory for bitstream Indice at the encoder - it is a temporary solution for development only */ +#define DEBUG_IND +#define IND_LIST_DYN /* dynamic allocation of ind_list based on transport channels */ + #ifdef DEBUGGING /*#define DEBUG_MODE_INFO*/ /* output most important parameters to the subdirectory "res/" */ @@ -132,7 +136,6 @@ /* ################# Start DEVELOPMENT switches ######################## */ #define BASOP_NOGLOB /* Disable global symbols in BASOPs, Overflow/Carry in BASOPs disabled, additional BASOPs in case of Overflow */ -#define BITSTREAM_INDICES_MEMORY /* Don't count memory for bitstream Indice at the encoder - it is a temporary solution for development only */ #define LSF_RE_USE_SECONDARY_CHANNEL /* TD stereo Secondary channel LSF Q improvement */ #ifdef LSF_RE_USE_SECONDARY_CHANNEL diff --git a/lib_enc/init_enc.c b/lib_enc/init_enc.c index e456a52a61..dbd5693f1c 100644 --- a/lib_enc/init_enc.c +++ b/lib_enc/init_enc.c @@ -111,6 +111,16 @@ ivas_error init_encoder( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Bitstream structure\n" ) ); } + +#ifdef IND_LIST_DYN + /* allocate buffer of indices */ + if ( ( st->hBstr->ind_list = (INDICE_HANDLE) malloc( MAX_NUM_INDICES * sizeof( Indice ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); + } + + reset_indices_enc( st->hBstr, MAX_NUM_INDICES ); +#endif } else { diff --git a/lib_enc/ivas_corecoder_enc_reconfig.c b/lib_enc/ivas_corecoder_enc_reconfig.c index e8486d7738..233f7681f7 100644 --- a/lib_enc/ivas_corecoder_enc_reconfig.c +++ b/lib_enc/ivas_corecoder_enc_reconfig.c @@ -63,7 +63,14 @@ ivas_error ivas_corecoder_enc_reconfig( int16_t len_inp_memory, n_CoreCoder_existing, nSCE_existing, nCPE_existing; float input_buff[MCT_MAX_BLOCKS][L_FRAME48k + NS2SA( 48000, IVAS_FB_ENC_DELAY_NS )]; BSTR_ENC_HANDLE hBstr, hMetaData; - Indice *ind_list, *ind_list_metadata; +#ifndef IND_LIST_DYN + Indice *ind_list; +#endif + Indice *ind_list_metadata; +#ifdef IND_LIST_DYN + int16_t i, nb_bits; + Indice temp_ind_list[10]; +#endif int16_t nb_bits_tot, next_ind, last_ind; ENCODER_CONFIG_HANDLE hEncoderConfig; ivas_error error; @@ -131,8 +138,10 @@ ivas_error ivas_corecoder_enc_reconfig( } /* something in transport changes */ +#ifndef IND_LIST_DYN ind_list = NULL; ind_list_metadata = NULL; +#endif hBstr = NULL; hMetaData = NULL; @@ -155,10 +164,31 @@ ivas_error ivas_corecoder_enc_reconfig( #endif /* save bitstream information */ +#ifndef IND_LIST_DYN ind_list = hBstr->ind_list; /* pointer to the beginning of the global list */ +#endif nb_bits_tot = hBstr->nb_bits_tot; next_ind = hBstr->next_ind; last_ind = hBstr->last_ind; +#ifdef IND_LIST_DYN + i = 0; + nb_bits = 0; + while ( nb_bits < nb_bits_tot && i < 10 ) + { + if ( hBstr->ind_list[i].nb_bits > 0 ) + { + temp_ind_list[i].value = hBstr->ind_list[i].value; + temp_ind_list[i].nb_bits = hBstr->ind_list[i].nb_bits; + } + + nb_bits += temp_ind_list[i].nb_bits; + i++; + } + +#ifdef DEBUGGING + assert( (nb_bits == nb_bits_tot) && "Error saving bitstream information during core-coder reconfiguration!\n" ); +#endif +#endif ind_list_metadata = hMetaData->ind_list; /* pointer to the beginning of the global list */ if ( hEncoderConfig->ivas_format == MC_FORMAT && last_mc_mode == MC_MODE_MCMASA && st_ivas->mc_mode == MC_MODE_MCMASA ) @@ -255,8 +285,17 @@ ivas_error ivas_corecoder_enc_reconfig( mvr2r( input_buff[sce_id], st_ivas->hSCE[sce_id]->hCoreCoder[0]->input_buff, len_inp_memory ); } - /* prepare bitstream buffers */ + /* allocate buffer of indices */ +#ifdef IND_LIST_DYN + //if ( ( ind_list = (INDICE_HANDLE) malloc( MAX_NUM_INDICES * sizeof( Indice ) ) ) == NULL ) + //{ + // return IVAS_ERR_FAILED_ALLOC; + //} + + //st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list; +#else st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list + sce_id * MAX_NUM_INDICES; +#endif /* only reset indices if it is not the first index list, this already contains the IVAS format bits */ if ( sce_id > 0 ) @@ -268,6 +307,24 @@ ivas_error ivas_corecoder_enc_reconfig( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->last_ind = last_ind; st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->nb_bits_tot = nb_bits_tot; st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->next_ind = next_ind; +#ifdef IND_LIST_DYN + i = 0; + nb_bits = 0; + while ( nb_bits < nb_bits_tot && i < 10 ) + { + if ( temp_ind_list[i].nb_bits > 0 ) + { + st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list[i].value = temp_ind_list[i].value; + st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; + } + + nb_bits += temp_ind_list[i].nb_bits; + i++; + } +#ifdef DEBUGGING + assert( ( nb_bits == nb_bits_tot ) && "Error restoring bitstream information during core-coder reconfiguration!\n" ); +#endif +#endif } st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata + sce_id * MAX_BITS_METADATA; @@ -282,13 +339,23 @@ ivas_error ivas_corecoder_enc_reconfig( for ( cpe_id = 0; cpe_id < nCPE_existing; cpe_id++ ) { st_ivas->hCPE[cpe_id]->element_brate = brate_CPE; - /* prepare bitstream buffers */ + + /* allocate buffer of indices */ for ( n = 0; n < CPE_CHANNELS; n++ ) { copy_encoder_config( st_ivas, st_ivas->hCPE[cpe_id]->hCoreCoder[n], 0 ); st_ivas->hCPE[cpe_id]->hCoreCoder[n]->total_brate = st_ivas->hCPE[cpe_id]->element_brate / ( st_ivas->nCPE > 1 ? 1 : CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ +#ifdef IND_LIST_DYN + //if ( ( ind_list = (INDICE_HANDLE) malloc( MAX_NUM_INDICES * sizeof( Indice ) ) ) == NULL ) + //{ + // return IVAS_ERR_FAILED_ALLOC; + //} + + //st_ivas->hSCE[cpe_id]->hCoreCoder[0]->hBstr->ind_list = ind_list; +#else st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list + ( cpe_id * CPE_CHANNELS + n + st_ivas->nSCE ) * MAX_NUM_INDICES; +#endif if ( cpe_id * CPE_CHANNELS + n > 0 || ( st_ivas->mc_mode == MC_MODE_MCMASA && st_ivas->nSCE > 0 ) ) { reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); @@ -298,6 +365,24 @@ ivas_error ivas_corecoder_enc_reconfig( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->last_ind = last_ind; st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_bits_tot = nb_bits_tot; st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->next_ind = next_ind; +#ifdef IND_LIST_DYN + i = 0; + nb_bits = 0; + while ( nb_bits < nb_bits_tot && i < 10 ) + { + if ( temp_ind_list[i].nb_bits > 0 ) + { + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list[i].value = temp_ind_list[i].value; + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; + } + + nb_bits += temp_ind_list[i].nb_bits; + i++; + } +#ifdef DEBUGGING + assert( ( nb_bits == nb_bits_tot ) && "Error restoring bitstream information during core-coder reconfiguration!\n" ); +#endif +#endif } } } @@ -326,7 +411,9 @@ ivas_error ivas_corecoder_enc_reconfig( /* prepare bitstream buffers */ for ( n = 0; n < CPE_CHANNELS; n++ ) { +#ifndef IND_LIST_DYN st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list + ( cpe_id * CPE_CHANNELS + n + st_ivas->nSCE ) * MAX_NUM_INDICES; +#endif if ( cpe_id * CPE_CHANNELS + n > 0 || ( st_ivas->mc_mode == MC_MODE_MCMASA && st_ivas->nSCE > 0 ) ) { reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); @@ -336,6 +423,25 @@ ivas_error ivas_corecoder_enc_reconfig( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->last_ind = last_ind; st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_bits_tot = nb_bits_tot; st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->next_ind = next_ind; +#ifdef IND_LIST_DYN + i = 0; + nb_bits = 0; + while ( nb_bits < nb_bits_tot && i < 10 ) + { + if ( temp_ind_list[i].nb_bits > 0 ) + { + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list[i].value = temp_ind_list[i].value; + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; + } + + nb_bits += temp_ind_list[i].nb_bits; + i++; + } +#ifdef DEBUGGING + assert( ( nb_bits == nb_bits_tot ) && "Error restoring bitstream information during core-coder reconfiguration!\n" ); +#endif +#endif + } if ( hEncoderConfig->Opt_DTX_ON ) diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index fd92453980..26809f733d 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -311,7 +311,11 @@ void ivas_initialize_handles_enc( ivas_error ivas_init_encoder( Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ +#ifdef IND_LIST_DYN + //Indice *ind_list[], /* i : list of indices */ +#else Indice ind_list[][MAX_NUM_INDICES], /* o : bitstream indices */ +#endif Indice ind_list_metadata[][MAX_BITS_METADATA] /* o : bitstream indices metadata */ ) { @@ -363,9 +367,17 @@ ivas_error ivas_init_encoder( return error; } - /* prepare bitstream buffers */ +#ifdef IND_LIST_DYN + ///* allocate buffer of indices */ + //if ( ( ind_list[sce_id] = (INDICE_HANDLE) malloc( MAX_NUM_INDICES * sizeof( Indice ) ) ) == NULL ) + //{ + // return IVAS_ERR_FAILED_ALLOC; + //} +#endif +#ifndef IND_LIST_DYN st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); +#endif /* prepare stereo downmix for EVS */ if ( hEncoderConfig->stereo_dmx_evs == 1 ) @@ -388,11 +400,20 @@ ivas_error ivas_init_encoder( return error; } - /* prepare bitstream buffers */ + /* allocate buffer of indices */ for ( n = 0; n < CPE_CHANNELS; n++ ) { +#ifdef IND_LIST_DYN + //if ( ( ind_list[n] = (INDICE_HANDLE) malloc( MAX_NUM_INDICES * sizeof( Indice ) ) ) == NULL ) + //{ + // return IVAS_ERR_FAILED_ALLOC; + //} +#endif + +#ifndef IND_LIST_DYN st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[n]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); +#endif } /* MetaData for DFT stereo */ @@ -417,9 +438,18 @@ ivas_error ivas_init_encoder( return error; } - /* prepare bitstream buffers */ +#ifdef IND_LIST_DYN + /* allocate buffer of indices */ + //if ( ( ind_list[sce_id] = (INDICE_HANDLE) malloc( MAX_NUM_INDICES * sizeof( Indice ) ) ) == NULL ) + //{ + // return IVAS_ERR_FAILED_ALLOC; + //} +#endif + +#ifndef IND_LIST_DYN st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); +#endif st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA ); @@ -475,9 +505,18 @@ ivas_error ivas_init_encoder( return error; } - /* prepare bitstream buffers */ +#ifdef IND_LIST_DYN + /* allocate buffer of indices */ + //if ( ( ind_list[sce_id] = (INDICE_HANDLE) malloc( MAX_NUM_INDICES * sizeof( Indice ) ) ) == NULL ) + //{ + // return IVAS_ERR_FAILED_ALLOC; + //} +#endif + +#ifndef IND_LIST_DYN st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); +#endif st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA ); @@ -495,11 +534,20 @@ ivas_error ivas_init_encoder( return error; } - /* prepare bitstream buffers */ + /* allocate buffer of indices */ for ( n = 0; n < CPE_CHANNELS; n++ ) { +#ifdef IND_LIST_DYN + //if ( ( ind_list[cpe_id * CPE_CHANNELS + n] = (INDICE_HANDLE) malloc( MAX_NUM_INDICES * sizeof( Indice ) ) ) == NULL ) + //{ + // return IVAS_ERR_FAILED_ALLOC; + //} +#endif + +#ifndef IND_LIST_DYN st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[cpe_id * CPE_CHANNELS + n]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); +#endif if ( hEncoderConfig->Opt_DTX_ON ) { @@ -541,13 +589,23 @@ ivas_error ivas_init_encoder( return error; } + /* allocate buffer of indices */ for ( n = 0; n < CPE_CHANNELS; n++ ) { +#ifdef IND_LIST_DYN + //if ( ( ind_list[cpe_id * CPE_CHANNELS + n] = (INDICE_HANDLE) malloc( MAX_NUM_INDICES * sizeof( Indice ) ) ) == NULL ) + //{ + // return IVAS_ERR_FAILED_ALLOC; + //} +#endif /* we need the correct bitstream also for the LFE channel since it might become a proper coded channel when switching to ParamMC and ind_list is only visible here, can't be done later */ +#ifndef IND_LIST_DYN st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[cpe_id * CPE_CHANNELS + n]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); +#endif } + /* Metadata only initialized for the last CPE index*/ if ( cpe_id == st_ivas->nCPE - 1 ) { @@ -582,12 +640,19 @@ ivas_error ivas_init_encoder( return error; } - - /* prepare bitstream buffers */ + /* allocate buffer of indices */ for ( n = 0; n < CPE_CHANNELS; n++ ) { +#ifdef IND_LIST_DYN + //if ( ( ind_list[cpe_id * CPE_CHANNELS + n] = (INDICE_HANDLE) malloc( MAX_NUM_INDICES * sizeof( Indice ) ) ) == NULL ) + //{ + // return IVAS_ERR_FAILED_ALLOC; + //} +#endif +#ifndef IND_LIST_DYN st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[cpe_id * CPE_CHANNELS + n]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); +#endif } /* Metadata only initialized for the last CPE index*/ @@ -636,9 +701,18 @@ ivas_error ivas_init_encoder( return error; } - /* prepare bitstream buffers */ + /* allocate buffer of indices */ +#ifdef IND_LIST_DYN + //if ( ( ind_list[sce_id] = (INDICE_HANDLE) malloc( MAX_NUM_INDICES * sizeof( Indice ) ) ) == NULL ) + //{ + // return IVAS_ERR_FAILED_ALLOC; + //} +#endif + +#ifndef IND_LIST_DYN st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); +#endif st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA ); @@ -653,11 +727,19 @@ ivas_error ivas_init_encoder( return error; } - /* prepare bitstream buffers */ + /* allocate buffer of indices */ for ( n = 0; n < CPE_CHANNELS; n++ ) { +#ifdef IND_LIST_DYN + //if ( ( ind_list[cpe_id * CPE_CHANNELS + n + st_ivas->nSCE] = (INDICE_HANDLE) malloc( MAX_NUM_INDICES * sizeof( Indice ) ) ) == NULL ) + //{ + // return IVAS_ERR_FAILED_ALLOC; + //} +#endif +#ifndef IND_LIST_DYN st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[cpe_id * CPE_CHANNELS + n + st_ivas->nSCE]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); +#endif } /* Metadata only initialized for the last CPE index*/ @@ -729,6 +811,14 @@ void destroy_core_enc( if ( hCoreCoder->hBstr != NULL ) { +#ifdef IND_LIST_DYN + /* deallocate buffer of indices */ + if ( hCoreCoder->hBstr->ind_list != NULL ) + { + free( hCoreCoder->hBstr->ind_list ); + } +#endif + free( hCoreCoder->hBstr ); hCoreCoder->hBstr = NULL; } diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 8049f5215c..c9c664f7c7 100644 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -48,7 +48,11 @@ struct IVAS_ENC { Encoder_Struct *st_ivas; +#ifdef IND_LIST_DYN + //Indice *ind_list[MAX_NUM_DATA]; /* list of indices */ +#else Indice ind_list[MAX_NUM_DATA][MAX_NUM_INDICES]; /* list of indices */ +#endif Indice ind_list_metadata[MAX_NUM_METADATA][MAX_BITS_METADATA]; /* list of indices for metadata */ ENC_CORE_HANDLE hCoreCoder; bool isConfigured; @@ -134,6 +138,19 @@ ivas_error IVAS_ENC_Open( * Initialize indices *-----------------------------------------------------------------*/ +#ifdef IND_LIST_DYN + /* allocate ind_list[0] - for the first transport channel */ + //if ( ( ( *phIvasEnc )->ind_list[0] = (INDICE_HANDLE) malloc( MAX_NUM_INDICES * sizeof( Indice ) ) ) == NULL ) + //{ + // return IVAS_ERR_FAILED_ALLOC; + //} + + //for ( i = 0; i < MAX_NUM_DATA; ++i ) + //{ + // ( *phIvasEnc )->ind_list[i] = NULL; + //} +#else + for ( i = 0; i < MAX_NUM_DATA; ++i ) { for ( j = 0; j < MAX_NUM_INDICES; ++j ) @@ -142,6 +159,7 @@ ivas_error IVAS_ENC_Open( ( *phIvasEnc )->ind_list[i][j].value = 0; } } +#endif for ( i = 0; i < MAX_NUM_METADATA; ++i ) { @@ -198,6 +216,10 @@ void IVAS_ENC_Close( IVAS_ENC_HANDLE *phIvasEnc /* i/o: pointer to IVAS encoder handle */ ) { +#ifdef IND_LIST_DYN + //int16_t i; +#endif + /* Free all memory */ if ( phIvasEnc == NULL || *phIvasEnc == NULL ) { @@ -220,6 +242,20 @@ void IVAS_ENC_Close( ( *phIvasEnc )->st_ivas = NULL; +#ifdef IND_LIST_DYN + //for ( i = 0; i < MAX_NUM_DATA; ++i ) + //{ + // if ( ( *phIvasEnc )->ind_list[i] != NULL ) + // { + // free( ( *phIvasEnc )->ind_list[i] ); + // } + // else + // { + // break; + // } + //} +#endif + #ifdef BITSTREAM_INDICES_MEMORY #define WMC_TOOL_SKIP free( *phIvasEnc ); @@ -228,6 +264,7 @@ void IVAS_ENC_Close( free( *phIvasEnc ); #endif + *phIvasEnc = NULL; phIvasEnc = NULL; @@ -904,7 +941,11 @@ static ivas_error configureEncoder( * Finalize initialization *-----------------------------------------------------------------*/ - if ( ( error = ivas_init_encoder( st_ivas, hIvasEnc->ind_list, hIvasEnc->ind_list_metadata ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_init_encoder( st_ivas, +#ifndef IND_LIST_DYN + hIvasEnc->ind_list, +#endif + hIvasEnc->ind_list_metadata ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index ec7fb594d1..3fe7f6b019 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -51,11 +51,19 @@ * Indice *------------------------------------------------------------------------------------------*/ +#ifdef IND_LIST_DYN +typedef struct +{ + uint16_t value; /* value of the quantized indice */ + int16_t nb_bits; /* number of bits used for the quantization of the indice */ +} Indice, *INDICE_HANDLE; +#else typedef struct { uint16_t value; /* value of the quantized indice */ int16_t nb_bits; /* number of bits used for the quantization of the indice */ } Indice; +#endif /*----------------------------------------------------------------------------------* * Bitstream structure -- GitLab From fa905e29d2a1b87e7aa649bf901bd150c9b4eae5 Mon Sep 17 00:00:00 2001 From: malenov Date: Fri, 10 Feb 2023 17:08:45 +0100 Subject: [PATCH 002/331] dynamical allocation of ind_list[] --- apps/encoder.c | 6 +- lib_com/bitstream.c | 222 +++++++++++++++++++++++++- lib_com/prot.h | 18 ++- lib_enc/acelp_core_switch_enc.c | 17 ++ lib_enc/cng_enc.c | 8 + lib_enc/eval_pit_contr.c | 8 + lib_enc/igf_enc.c | 85 ++++++++++ lib_enc/ivas_corecoder_enc_reconfig.c | 7 + lib_enc/ivas_lfe_enc.c | 16 ++ lib_enc/ivas_sba_enc.c | 10 ++ lib_enc/stat_enc.h | 4 + lib_rend/lib_rend.c | 13 +- 12 files changed, 398 insertions(+), 16 deletions(-) diff --git a/apps/encoder.c b/apps/encoder.c index b7bc8b6433..37388677dc 100644 --- a/apps/encoder.c +++ b/apps/encoder.c @@ -720,9 +720,9 @@ int main( #ifdef DEBUG_IND { - int16_t tmp_i = -1; - - dbgwrite( &tmp_i, sizeof( int16_t ), 1, 960 - total_num_id, "res/ind_list.x" ); + //int16_t tmp_i = -1; + //dbgwrite( &tmp_i, sizeof( int16_t ), 1, 960 - total_num_id, "res/ind_list.x" ); + dbgwrite( &total_num_id, sizeof( int16_t ), 1, 1, "res/ind_total_num.x" ); } #endif diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index 5f7be30f67..7db451ae9d 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -66,6 +66,7 @@ int16_t total_num_id = 0; FILE *FEC_pattern = NULL; /* FEC pattern file (for simulation of FEC) */ #endif +#ifndef IND_LIST_DYN /*-------------------------------------------------------------------* * pack_bit() * @@ -119,6 +120,7 @@ static Word16 unpack_bit( return bit; } +#endif /*-------------------------------------------------------------------* * rate2AMRWB_IOmode() @@ -241,6 +243,9 @@ ivas_error push_indice( ) { int16_t i; +#ifdef IND_LIST_DYN + int16_t j; +#endif ivas_error error; error = IVAS_ERR_OK; @@ -271,8 +276,35 @@ ivas_error push_indice( { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Indice ID = %d exceeds the total number of indices: %d (frame %d) !\n", id, MAX_NUM_INDICES, frame ); } + +#ifdef IND_LIST_DYN + /* check, if max number of indices has not been exceeded */ + if ( hBstr->nb_ind_tot >= MAX_NUM_INDICES ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Maximum number of indices %d has been exceeded (frame %d) !\n", MAX_NUM_INDICES, frame ); + } +#endif #endif +#ifdef IND_LIST_DYN + /* find the location in the list of indices */ + i = hBstr->nb_ind_tot; + while ( i > 0 && id < hBstr->ind_list[i - 1].id ) + { + i--; + } + + /* shift indices, if the new id is to be written somewhere inside the list */ + if ( i < hBstr->nb_ind_tot ) + { + for ( j = hBstr->nb_ind_tot; j > i; j-- ) + { + hBstr->ind_list[j].id = hBstr->ind_list[j - 1].id; + hBstr->ind_list[j].nb_bits = hBstr->ind_list[j - 1].nb_bits; + hBstr->ind_list[j].value = hBstr->ind_list[j - 1].value; + } + } +#else if ( hBstr->last_ind == id ) { /* indice with the same name as the previous one */ @@ -287,20 +319,31 @@ ivas_error push_indice( i++; } } +#endif +#ifndef IND_LIST_DYN #ifdef DEBUGGING if ( hBstr->ind_list[i].nb_bits > 0 ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Indice ID = %d with value %d is trying to re-write an existing indice (frame %d) !\n", id, value, frame ); } +#endif #endif /* store the new indice in the list */ +#ifdef IND_LIST_DYN + hBstr->ind_list[i].id = id; +#endif hBstr->ind_list[i].value = value; hBstr->ind_list[i].nb_bits = nb_bits; /* updates */ +#ifdef IND_LIST_DYN + hBstr->nb_ind_tot++; + hBstr->next_ind++; +#else hBstr->next_ind = i + 1; +#endif hBstr->last_ind = id; hBstr->nb_bits_tot += nb_bits; @@ -333,6 +376,9 @@ ivas_error push_next_indice( #endif ) { +#ifdef IND_LIST_DYN + int16_t prev_id; +#endif ivas_error error; error = IVAS_ERR_OK; @@ -356,20 +402,47 @@ ivas_error push_next_indice( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Total number of indices exceeded: %d !\n", MAX_NUM_INDICES ); } +#ifndef IND_LIST_DYN if ( hBstr->ind_list[hBstr->next_ind].nb_bits > 0 ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Indice with value %d is trying to re-write an existing indice (frame %d) !\n", value, frame ); } #endif +#endif + +#ifdef IND_LIST_DYN + /* get the id of the previous indice -> it will be re-used */ + if ( hBstr->nb_ind_tot > 0 ) + { + prev_id = hBstr->ind_list[hBstr->nb_ind_tot - 1].id; + } + else + { + prev_id = 0; + } +#endif /* store the values in the list */ - hBstr->ind_list[hBstr->next_ind].value = value; - hBstr->ind_list[hBstr->next_ind].nb_bits = nb_bits; +#ifdef IND_LIST_DYN + hBstr->ind_list[hBstr->nb_ind_tot].id = prev_id; +#endif + hBstr->ind_list[hBstr->nb_ind_tot].value = value; + hBstr->ind_list[hBstr->nb_ind_tot].nb_bits = nb_bits; + + /* updates */ +#ifdef IND_LIST_DYN + hBstr->nb_ind_tot++; + hBstr->next_ind = hBstr->nb_ind_tot; +#else hBstr->next_ind++; +#endif - /* update the total number of bits already written */ hBstr->nb_bits_tot += nb_bits; +#ifdef DEBUG_IND + dbgwrite( &hBstr->last_ind, sizeof( int16_t ), 1, 1, "res/ind_list.x" ); + total_num_id++; +#endif return error; } @@ -398,10 +471,27 @@ void push_next_bits( uint16_t code; int16_t i, nb_bits_m15; Indice *ptr; +#ifdef IND_LIST_DYN + int16_t prev_id; +#endif #ifdef DEBUG_BS_READ_WRITE printf( "%s: %d: %d\n", func, line, nb_bits ); #endif +#ifdef IND_LIST_DYN + ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; + + /* get the id of the previous indice -> will be re-used here as well */ + if ( hBstr->nb_ind_tot > 0 ) + { + prev_id = hBstr->ind_list[hBstr->nb_ind_tot - 1].id; + } + else + { + prev_id = 0; + } +#else ptr = &hBstr->ind_list[hBstr->next_ind]; +#endif nb_bits_m15 = nb_bits - 15; for ( i = 0; i < nb_bits_m15; i += 16 ) @@ -413,8 +503,18 @@ void push_next_bits( printf( "code: %d\n", code ); #endif ptr->nb_bits = 16; +#ifdef IND_LIST_DYN + ptr->id = prev_id; + hBstr->nb_ind_tot++; +#endif ++ptr; + +#ifdef DEBUG_IND + dbgwrite( &hBstr->last_ind, sizeof( int16_t ), 1, 1, "res/ind_list.x" ); + total_num_id++; +#endif } + for ( ; i < nb_bits; ++i ) { ptr->value = bits[i]; @@ -422,15 +522,104 @@ void push_next_bits( printf( "value: %d\n", ptr->value ); #endif ptr->nb_bits = 1; +#ifdef IND_LIST_DYN + ptr->id = prev_id; + hBstr->nb_ind_tot++; +#endif ++ptr; + +#ifdef DEBUG_IND + dbgwrite( &hBstr->last_ind, sizeof( int16_t ), 1, 1, "res/ind_list.x" ); + total_num_id++; +#endif } + hBstr->next_ind = (int16_t) ( ptr - hBstr->ind_list ); hBstr->nb_bits_tot = hBstr->nb_bits_tot + nb_bits; + return; } +#ifdef IND_LIST_DYN +/*-------------------------------------------------------------------* + * find_indice() + * + * Find indice based on its id + *-------------------------------------------------------------------*/ + +/*! r: result: index of the indice in the list, -1 if not found */ +int16_t find_indice( + BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ + int16_t id, /* i : ID of the indice */ + uint16_t *value, /* o : value of the quantized indice */ + int16_t *nb_bits /* o : number of bits used to quantize the indice */ +) +{ + int16_t i; + + for ( i = 0; i < hBstr->nb_ind_tot; i++ ) + { + if ( hBstr->ind_list[i].id == id && hBstr->ind_list[i].nb_bits > 0 ) + { + *value = hBstr->ind_list[i].value; + *nb_bits = hBstr->ind_list[i].nb_bits; + return i; + } + } + + return -1; +} + +/*-------------------------------------------------------------------* + * delete_indice() + * + * Delete indice based on its id (note, that nb_ind_tot and nb_bits_tot are updated) + *-------------------------------------------------------------------*/ + +/*! r: number of deleted indices */ +uint16_t delete_indice( + BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ + int16_t id /* i : ID of the indice */ +) +{ + int16_t i, j; + + j = 0; + for ( i = 0; i < hBstr->nb_ind_tot; i++ ) + { + if ( hBstr->ind_list[i].id == id ) + { + hBstr->nb_bits_tot -= hBstr->ind_list[i].nb_bits; + continue; + } + + if ( j < i ) + { + /* shift the indice left */ + hBstr->ind_list[j].id = hBstr->ind_list[i].id; + hBstr->ind_list[j].value = hBstr->ind_list[i].value; + hBstr->ind_list[j].nb_bits = hBstr->ind_list[i].nb_bits; + } + + j++; + } + + hBstr->nb_ind_tot = j; + hBstr->next_ind = j; + + for ( ; j < i; j++ ) + { + /* reset the shifted indices at the end of the list */ + hBstr->ind_list[j].nb_bits = -1; + } + + return i - j; +} +#endif + + /*-------------------------------------------------------------------* * get_next_indice() * @@ -647,6 +836,9 @@ void reset_indices_enc( int16_t i; hBstr->nb_bits_tot = 0; +#ifdef IND_LIST_DYN + hBstr->nb_ind_tot = 0; +#endif hBstr->next_ind = 0; hBstr->last_ind = -1; @@ -679,7 +871,11 @@ void reset_indices_dec( *-------------------------------------------------------------------*/ static int16_t write_indices_to_stream( +#ifdef IND_LIST_DYN + Indice *ind_list, +#else Indice *ind_list_metadata, +#endif uint16_t **pt_stream, const int16_t inc, const int16_t num_indices ) @@ -693,8 +889,13 @@ static int16_t write_indices_to_stream( for ( i = 0; i < num_indices; i++ ) { +#ifdef IND_LIST_DYN + value = ind_list[i].value; + nb_bits = ind_list[i].nb_bits; +#else value = ind_list_metadata[i].value; nb_bits = ind_list_metadata[i].nb_bits; +#endif if ( nb_bits > 0 ) { @@ -726,6 +927,10 @@ static int16_t write_indices_to_stream( { /* fprintf( stderr, "Warning: %s: nb_bits == 0!\n", __func__ ); */ } + else + { + /* fprintf( stderr, "Warning: %s: nb_bits == %d!\n", __func__, nb_bits ); */ + } #endif } #ifdef ENABLE_BITRATE_VERIFICATION @@ -851,7 +1056,13 @@ static ivas_error write_indices_element( #ifdef ENABLE_BITRATE_VERIFICATION total_nb_bits = #endif - write_indices_to_stream( sts[n]->hBstr->ind_list, &pt_stream_loc, 1, MAX_NUM_INDICES ); + write_indices_to_stream( sts[n]->hBstr->ind_list, &pt_stream_loc, 1, +#ifdef IND_LIST_DYN + sts[n]->hBstr->nb_ind_tot +#else + MAX_NUM_INDICES +#endif + ); #ifdef ENABLE_BITRATE_VERIFICATION if ( total_nb_bits != sts[n]->hBstr->nb_bits_tot ) @@ -984,7 +1195,7 @@ ivas_error write_indices_ivas( return error; } - +#ifndef IND_LIST_DYN /*-------------------------------------------------------------------* * indices_to_serial_generic() * @@ -1034,6 +1245,7 @@ void indices_to_serial_generic( return; } +#endif /*---------------------------------------------------------------------* * convertSerialToBytestream( ) diff --git a/lib_com/prot.h b/lib_com/prot.h index 784527e1bf..a94c2a7441 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -515,6 +515,21 @@ void push_next_bits( #endif ); +#ifdef IND_LIST_DYN +int16_t find_indice( /* o : index of the indice in the list, -1 if not found */ + BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ + int16_t id, /* i : ID of the indice */ + uint16_t *value, /* o : value of the quantized indice */ + int16_t *nb_bits /* o : number of bits used to quantize the indice */ +); + +uint16_t delete_indice( /* o : number of deleted indices */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + int16_t id /* i : ID of the indice */ +); +#endif + + /*! r: value of the indice */ #ifdef DEBUG_BS_READ_WRITE #define get_next_indice( ... ) get_next_indice_( __VA_ARGS__, __LINE__, __func__ ) @@ -612,13 +627,14 @@ Decoder_State **reset_elements( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); - +#ifndef IND_LIST_DYN void indices_to_serial_generic( const Indice *ind_list, /* i : indices list */ const Word16 num_indices, /* i : number of indices to write */ UWord8 *pFrame, /* o : byte array with bit packet and byte aligned coded speech data */ Word16 *pFrame_size /* o : size of the binary encoded access unit [bits] */ ); +#endif void convertSerialToBytestream( const uint16_t *const serial, /* i : input serial bitstream with values 0 and 1 */ diff --git a/lib_enc/acelp_core_switch_enc.c b/lib_enc/acelp_core_switch_enc.c index 291c2128a1..1a3488d92d 100644 --- a/lib_enc/acelp_core_switch_enc.c +++ b/lib_enc/acelp_core_switch_enc.c @@ -73,6 +73,10 @@ void acelp_core_switch_enc( const float *inp; int32_t cbrate; float Aq[2 * ( M + 1 )]; +#ifdef IND_LIST_DYN + uint16_t value; + int16_t nb_bits; +#endif BSTR_ENC_HANDLE hBstr = st->hBstr; /* initializations */ @@ -159,12 +163,25 @@ void acelp_core_switch_enc( * Manipulate ACELP subframe indices (move them to their proper place) *----------------------------------------------------------------*/ +#ifdef IND_LIST_DYN + i = find_indice( hBstr, TAG_ACELP_SUBFR_LOOP_START, &value, &nb_bits ); +#ifdef DEBUGGING + assert( i >= 0 && "Internal error in ACELP core switching - unable to find ACELP subframe indices!" ); +#endif + while ( hBstr->ind_list[i].id == TAG_ACELP_SUBFR_LOOP_START ) + { + push_indice( hBstr, IND_CORE_SWITCHING_CELP_SUBFRAME, hBstr->ind_list[i].value, hBstr->ind_list[i].nb_bits ); + i++; + } + delete_indice( hBstr, TAG_ACELP_SUBFR_LOOP_START ); +#else for ( i = 0; i < 20; i++ ) { hBstr->ind_list[IND_CORE_SWITCHING_CELP_SUBFRAME + i].value = hBstr->ind_list[TAG_ACELP_SUBFR_LOOP_START + i].value; hBstr->ind_list[IND_CORE_SWITCHING_CELP_SUBFRAME + i].nb_bits = hBstr->ind_list[TAG_ACELP_SUBFR_LOOP_START + i].nb_bits; hBstr->ind_list[TAG_ACELP_SUBFR_LOOP_START + i].nb_bits = -1; } +#endif /*----------------------------------------------------------------* * BWE encoding diff --git a/lib_enc/cng_enc.c b/lib_enc/cng_enc.c index 04d9e41166..0f17b82923 100644 --- a/lib_enc/cng_enc.c +++ b/lib_enc/cng_enc.c @@ -885,8 +885,12 @@ void swb_CNG_enc( else if ( st->element_mode == IVAS_CPE_DFT && st->core_brate == SID_2k40 ) { /* LF-boost not used in DFT-stereo, instead the bandwidth is transmitted */ +#ifdef IND_LIST_DYN + delete_indice( st->hBstr, IND_CNG_ENV1 ); +#else st->hBstr->nb_bits_tot = st->hBstr->nb_bits_tot - st->hBstr->ind_list[IND_CNG_ENV1].nb_bits; st->hBstr->ind_list[IND_CNG_ENV1].nb_bits = -1; +#endif push_indice( st->hBstr, IND_BWIDTH, st->bwidth, 2 ); push_indice( st->hBstr, IND_UNUSED, 0, 4 ); push_indice( st->hBstr, IND_SID_BW, 1, 1 ); @@ -962,8 +966,12 @@ static void shb_CNG_encod( push_indice( hBstr, IND_SHB_CNG_GAIN, idx_ener, 4 ); push_indice( hBstr, IND_SID_BW, 1, 1 ); +#ifdef IND_LIST_DYN + delete_indice( hBstr, IND_CNG_ENV1 ); +#else hBstr->nb_bits_tot = hBstr->nb_bits_tot - hBstr->ind_list[IND_CNG_ENV1].nb_bits; hBstr->ind_list[IND_CNG_ENV1].nb_bits = -1; +#endif if ( st->element_mode == IVAS_CPE_DFT ) { push_indice( st->hBstr, IND_BWIDTH, st->bwidth, 2 ); diff --git a/lib_enc/eval_pit_contr.c b/lib_enc/eval_pit_contr.c index 5dd3101772..76bf54b025 100644 --- a/lib_enc/eval_pit_contr.c +++ b/lib_enc/eval_pit_contr.c @@ -326,18 +326,26 @@ int16_t Pit_exc_contribution_len( /* pitch contribution useless - delete all previously written indices belonging to pitch contribution */ for ( i = TAG_ACELP_SUBFR_LOOP_START; i < TAG_ACELP_SUBFR_LOOP_END; i++ ) { +#ifdef IND_LIST_DYN + delete_indice( hBstr, i ); +#else if ( hBstr->ind_list[i].nb_bits != -1 ) { hBstr->nb_bits_tot -= hBstr->ind_list[i].nb_bits; hBstr->ind_list[i].nb_bits = -1; } +#endif } +#ifdef IND_LIST_DYN + delete_indice( hBstr, IND_ES_PRED ); +#else if ( hBstr->ind_list[IND_ES_PRED].nb_bits != -1 ) { hBstr->nb_bits_tot -= hBstr->ind_list[IND_ES_PRED].nb_bits; hBstr->ind_list[IND_ES_PRED].nb_bits = -1; } +#endif } if ( st->core_brate < CFREQ_BITRATE ) diff --git a/lib_enc/igf_enc.c b/lib_enc/igf_enc.c index 9c68e3fcc7..1f18bb8d13 100644 --- a/lib_enc/igf_enc.c +++ b/lib_enc/igf_enc.c @@ -1707,6 +1707,41 @@ void IGFEncSetMode( return; } +#ifdef IND_LIST_DYN + +/*-------------------------------------------------------------------* + * pack_bit() + * + * insert a bit into packed octet + *-------------------------------------------------------------------*/ + +static void pack_bit( + const int16_t bit, /* i : bit to be packed */ + uint8_t **pt, /* i/o: pointer to octet array into which bit will be placed */ + uint8_t *omask /* i/o: output mask to indicate where in the octet the bit is to be written */ +) +{ + if ( *omask == 0x80 ) + { + **pt = 0; + } + + if ( bit != 0 ) + { + **pt = **pt | *omask; + } + + *omask >>= 1; + if ( *omask == 0 ) + { + *omask = 0x80; + ( *pt )++; + } + + return; +} + +#endif /*-------------------------------------------------------------------* * IGFEncConcatenateBitstream() @@ -1722,9 +1757,58 @@ void IGFEncConcatenateBitstream( { int16_t i; IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; +#ifdef IND_LIST_DYN + Indice *ind_list; + uint8_t *pFrame; /* byte array with bit packet and byte aligned coded speech data */ + int16_t *pFrame_size; /* number of bits in the binary encoded access unit [bits] */ + int16_t k, nb_bits_written; + int32_t imask; + uint8_t omask; +#endif hPrivateData = &hIGFEnc->igfData; +#ifndef IND_LIST_DYN hBstr->next_ind -= bsBits; +#endif + +#ifdef IND_LIST_DYN + ind_list = &hBstr->ind_list[hBstr->nb_ind_tot - bsBits]; /* here, we assume that each bit has been written as a single indice */ + pFrame = hPrivateData->igfBitstream; + pFrame_size = &hPrivateData->igfBitstreamBits; + nb_bits_written = 0; + + omask = ( 0x80 >> ( *pFrame_size & 0x7 ) ); + pFrame += *pFrame_size >> 3; + + /* bitstream packing (conversion of individual indices into a serial stream) */ + for ( i = 0; i < bsBits; i++ ) + { + if ( ind_list[i].nb_bits > 0 ) + { + /* mask from MSB to LSB */ + imask = 1 << ( ind_list[i].nb_bits - 1 ); + + /* write bit by bit */ + for ( k = 0; k < ind_list[i].nb_bits; k++ ) + { + pack_bit( ind_list[i].value & imask, &pFrame, &omask ); + imask >>= 1; + } + nb_bits_written += ind_list[i].nb_bits; + + /* delete the indice */ + ind_list[i].nb_bits = -1; + } + } + + *pFrame_size += nb_bits_written; + + /* update list of indices */ + hBstr->nb_ind_tot -= bsBits; + hBstr->nb_bits_tot -= nb_bits_written; + hBstr->next_ind -= bsBits; + +#else indices_to_serial_generic( &hBstr->ind_list[hBstr->next_ind], bsBits, hPrivateData->igfBitstream, &hPrivateData->igfBitstreamBits ); @@ -1735,6 +1819,7 @@ void IGFEncConcatenateBitstream( } hBstr->nb_bits_tot -= hIGFEnc->infoTotalBitsPerFrameWritten; +#endif return; } diff --git a/lib_enc/ivas_corecoder_enc_reconfig.c b/lib_enc/ivas_corecoder_enc_reconfig.c index 233f7681f7..a2428a0630 100644 --- a/lib_enc/ivas_corecoder_enc_reconfig.c +++ b/lib_enc/ivas_corecoder_enc_reconfig.c @@ -177,6 +177,7 @@ ivas_error ivas_corecoder_enc_reconfig( { if ( hBstr->ind_list[i].nb_bits > 0 ) { + temp_ind_list[i].id = hBstr->ind_list[i].id; temp_ind_list[i].value = hBstr->ind_list[i].value; temp_ind_list[i].nb_bits = hBstr->ind_list[i].nb_bits; } @@ -314,6 +315,7 @@ ivas_error ivas_corecoder_enc_reconfig( { if ( temp_ind_list[i].nb_bits > 0 ) { + st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list[i].id = temp_ind_list[i].id; st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list[i].value = temp_ind_list[i].value; st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; } @@ -321,6 +323,7 @@ ivas_error ivas_corecoder_enc_reconfig( nb_bits += temp_ind_list[i].nb_bits; i++; } + st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->nb_ind_tot = i; #ifdef DEBUGGING assert( ( nb_bits == nb_bits_tot ) && "Error restoring bitstream information during core-coder reconfiguration!\n" ); #endif @@ -372,6 +375,7 @@ ivas_error ivas_corecoder_enc_reconfig( { if ( temp_ind_list[i].nb_bits > 0 ) { + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list[i].id = temp_ind_list[i].id; st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list[i].value = temp_ind_list[i].value; st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; } @@ -379,6 +383,7 @@ ivas_error ivas_corecoder_enc_reconfig( nb_bits += temp_ind_list[i].nb_bits; i++; } + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_ind_tot = i; #ifdef DEBUGGING assert( ( nb_bits == nb_bits_tot ) && "Error restoring bitstream information during core-coder reconfiguration!\n" ); #endif @@ -430,6 +435,7 @@ ivas_error ivas_corecoder_enc_reconfig( { if ( temp_ind_list[i].nb_bits > 0 ) { + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list[i].id = temp_ind_list[i].id; st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list[i].value = temp_ind_list[i].value; st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; } @@ -437,6 +443,7 @@ ivas_error ivas_corecoder_enc_reconfig( nb_bits += temp_ind_list[i].nb_bits; i++; } + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_ind_tot = i; #ifdef DEBUGGING assert( ( nb_bits == nb_bits_tot ) && "Error restoring bitstream information during core-coder reconfiguration!\n" ); #endif diff --git a/lib_enc/ivas_lfe_enc.c b/lib_enc/ivas_lfe_enc.c index fc16c279ee..4cdf46640a 100644 --- a/lib_enc/ivas_lfe_enc.c +++ b/lib_enc/ivas_lfe_enc.c @@ -259,11 +259,20 @@ static void ivas_lfe_enc_quant( { if ( quant_strategy == ( num_quant_strategies - 1 ) || ( ( target_bits + IVAS_LFE_ID_BITS ) >= base2_num_bits_tot ) ) { +#ifdef IND_LIST_DYN + /* reset bits buffer and code the indices with base 2 coding */ + for ( j = hBstr->nb_ind_tot - 1; j >= next_ind_pos_arith_enc; j-- ) + { + hBstr->ind_list[j].nb_bits = -1; + } + hBstr->nb_ind_tot = next_ind_pos_arith_enc; +#else /* reset bits buffer and code the indices with base 2 coding */ for ( j = hBstr->next_ind - 1; j >= next_ind_pos_arith_enc; j-- ) { hBstr->ind_list[j].nb_bits = -1; } +#endif hBstr->nb_bits_tot = bits_written_arith_enc; hBstr->next_ind = next_ind_pos_arith_enc; coding_strategy = 1; @@ -298,12 +307,19 @@ static void ivas_lfe_enc_quant( if ( quant_strategy < ( num_quant_strategies - 1 ) ) { /* reset all indices that were already written - TODO: maybe better store them temporarily first and write at the very end? */ +#ifdef IND_LIST_DYN + for ( j = hBstr->nb_ind_tot - 1; j >= next_ind_pos; j-- ) +#else for ( j = hBstr->next_ind - 1; j >= next_ind_pos; j-- ) +#endif { hBstr->ind_list[j].nb_bits = -1; } hBstr->nb_bits_tot = bits_written; +#ifdef IND_LIST_DYN + hBstr->nb_ind_tot = next_ind_pos; +#endif hBstr->next_ind = next_ind_pos; } } diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index eda030cebe..c6d6abd3b8 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -115,7 +115,9 @@ ivas_error ivas_sba_enc_reinit( ivas_error error; ENCODER_CONFIG_HANDLE hEncoderConfig; +#ifndef IND_LIST_DYN Indice *ind_list; +#endif BSTR_ENC_HANDLE hBstr; BSTR_ENC_HANDLE hMetaData; hEncoderConfig = st_ivas->hEncoderConfig; @@ -146,7 +148,9 @@ ivas_error ivas_sba_enc_reinit( } /* save bitstream information */ +#ifndef IND_LIST_DYN ind_list = hBstr->ind_list; +#endif ind_list_metadata = hMetaData->ind_list; /*------------------------------------------------------------------------------------------* @@ -240,9 +244,11 @@ ivas_error ivas_sba_enc_reinit( return error; } +#ifndef IND_LIST_DYN /* prepare bitstream buffers */ st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list + sce_id * MAX_NUM_INDICES; reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); +#endif st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata + sce_id * MAX_BITS_METADATA; reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA ); @@ -260,11 +266,15 @@ ivas_error ivas_sba_enc_reinit( return error; } +#ifndef IND_LIST_DYN /* prepare bitstream buffers */ +#endif for ( n = 0; n < CPE_CHANNELS; n++ ) { +#ifndef IND_LIST_DYN st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list + ( cpe_id * CPE_CHANNELS + n ) * MAX_NUM_INDICES; reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); +#endif if ( hEncoderConfig->Opt_DTX_ON ) { diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index 3fe7f6b019..0da30af73d 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -54,6 +54,7 @@ #ifdef IND_LIST_DYN typedef struct { + int16_t id; /* id of the indice */ uint16_t value; /* value of the quantized indice */ int16_t nb_bits; /* number of bits used for the quantization of the indice */ } Indice, *INDICE_HANDLE; @@ -71,6 +72,9 @@ typedef struct typedef struct bitstream_enc_data_structure { +#ifdef IND_LIST_DYN + int16_t nb_ind_tot; /* total number of indices already written */ +#endif int16_t nb_bits_tot; /* total number of bits already written */ Indice *ind_list; /* list of indices */ int16_t next_ind; /* pointer to the next empty slot in the list of indices */ diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index c3b3ef07c2..3da85f14fe 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -30,6 +30,12 @@ *******************************************************************************************************/ +#include +#include +#include +#include +#include +#include #include "options.h" #include "ivas_cnst.h" #include "lib_rend.h" @@ -44,13 +50,6 @@ #include "prot.h" #include "wmc_auto.h" -#include -#include -#include -#include -#include -#include - /* Maximum buffer length (per channel) in samples. * Keep this separate from L_FRAME48k in case we want to support different size later */ #define MAX_BUFFER_LENGTH_PER_CHANNEL ( L_FRAME48k ) -- GitLab From 5c9b1761d795daa44f0a731d7c60b1741bdcfd36 Mon Sep 17 00:00:00 2001 From: malenov Date: Tue, 14 Feb 2023 13:30:42 +0100 Subject: [PATCH 003/331] fixes within IND_LIST_DYN --- apps/encoder.c | 21 +++--- lib_com/bitstream.c | 94 +++++++++++++++++++-------- lib_com/cnst.h | 2 + lib_com/options.h | 2 +- lib_com/prot.h | 3 + lib_enc/dtx.c | 8 ++- lib_enc/enc_ppp.c | 8 ++- lib_enc/fd_cng_enc.c | 16 ++++- lib_enc/init_enc.c | 87 ++++++++++++++++++++++++- lib_enc/ivas_corecoder_enc_reconfig.c | 36 +++++++++- lib_enc/ivas_cpe_enc.c | 6 +- lib_enc/ivas_init_enc.c | 24 +++++++ lib_enc/ivas_ism_metadata_enc.c | 3 + lib_enc/ivas_sba_enc.c | 6 ++ lib_enc/ivas_sce_enc.c | 6 +- lib_enc/ivas_spar_encoder.c | 6 +- lib_enc/ivas_spar_md_enc.c | 3 + lib_enc/stat_enc.h | 2 +- 18 files changed, 278 insertions(+), 55 deletions(-) diff --git a/apps/encoder.c b/apps/encoder.c index 37388677dc..dec934b511 100644 --- a/apps/encoder.c +++ b/apps/encoder.c @@ -48,8 +48,9 @@ #define WMC_TOOL_SKIP -#ifdef DEBUG_IND -extern int16_t total_num_id; +#ifdef DEBUG_IND_LIST +extern int16_t max_total_num_ind; +extern int32_t max_at_brate; #endif /*------------------------------------------------------------------------------------------* @@ -572,9 +573,6 @@ int main( while ( 1 ) { -#ifdef DEBUG_IND - total_num_id = 0; -#endif /* Read the input data */ if ( ( error = AudioFileReader_read( audioReader, pcmBuf, pcmBufSize, &numSamplesRead ) ) != IVAS_ERR_OK ) @@ -718,14 +716,6 @@ int main( goto cleanup; } -#ifdef DEBUG_IND - { - //int16_t tmp_i = -1; - //dbgwrite( &tmp_i, sizeof( int16_t ), 1, 960 - total_num_id, "res/ind_list.x" ); - dbgwrite( &total_num_id, sizeof( int16_t ), 1, 1, "res/ind_total_num.x" ); - } -#endif - frame++; if ( !arg.quietModeEnabled ) { @@ -753,6 +743,11 @@ int main( print_snr(); #endif +#ifdef DEBUG_IND_LIST + printf( "\nMaximum total number of indices: %d at bitrate: %d\n", max_total_num_ind, max_at_brate ); +#endif + + /*------------------------------------------------------------------------------------------* * Close files and deallocate resources *------------------------------------------------------------------------------------------*/ diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index 7db451ae9d..e92a86b78e 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -53,10 +53,6 @@ #ifdef DEBUGGING -#ifdef DEBUG_IND -int16_t total_num_id = 0; -#endif - #define FEC_SEED 12558 /*-------------------------------------------------------------------* @@ -66,6 +62,11 @@ int16_t total_num_id = 0; FILE *FEC_pattern = NULL; /* FEC pattern file (for simulation of FEC) */ #endif +#ifdef DEBUG_IND_LIST +int16_t max_total_num_ind = 0; +int32_t max_at_brate; +#endif + #ifndef IND_LIST_DYN /*-------------------------------------------------------------------* * pack_bit() @@ -272,16 +273,18 @@ ivas_error push_indice( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Indice ID = %d with value %d is trying to allocate %d bits which exceeds 16 bits (frame %d) !\n", id, value, nb_bits, frame ); } +#ifndef IND_LIST_DYN if ( id >= MAX_NUM_INDICES ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Indice ID = %d exceeds the total number of indices: %d (frame %d) !\n", id, MAX_NUM_INDICES, frame ); } +#endif #ifdef IND_LIST_DYN /* check, if max number of indices has not been exceeded */ - if ( hBstr->nb_ind_tot >= MAX_NUM_INDICES ) + if ( hBstr->nb_ind_tot >= hBstr->max_num_indices ) { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Maximum number of indices %d has been exceeded (frame %d) !\n", MAX_NUM_INDICES, frame ); + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Maximum number of indices %d has been exceeded (frame %d) !\n", hBstr->max_num_indices, frame ); } #endif #endif @@ -341,17 +344,15 @@ ivas_error push_indice( #ifdef IND_LIST_DYN hBstr->nb_ind_tot++; hBstr->next_ind++; +#ifdef DEBUG_IND_LIST + assert( (hBstr->nb_ind_tot < hBstr->max_num_indices) && "Maximum number of indices has been exceeded!" ); +#endif #else hBstr->next_ind = i + 1; #endif hBstr->last_ind = id; hBstr->nb_bits_tot += nb_bits; -#ifdef DEBUG_IND - dbgwrite( &i, sizeof( int16_t ), 1, 1, "res/ind_list.x" ); - total_num_id++; -#endif - return error; } @@ -397,10 +398,12 @@ ivas_error push_next_indice( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Indice with value %d is trying to allocate %d bits which exceeds 16 bits !\n", value, nb_bits ); } +#ifndef IND_LIST_DYN if ( hBstr->next_ind >= MAX_NUM_INDICES ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Total number of indices exceeded: %d !\n", MAX_NUM_INDICES ); } +#endif #ifndef IND_LIST_DYN if ( hBstr->ind_list[hBstr->next_ind].nb_bits > 0 ) @@ -425,25 +428,27 @@ ivas_error push_next_indice( /* store the values in the list */ #ifdef IND_LIST_DYN hBstr->ind_list[hBstr->nb_ind_tot].id = prev_id; -#endif hBstr->ind_list[hBstr->nb_ind_tot].value = value; hBstr->ind_list[hBstr->nb_ind_tot].nb_bits = nb_bits; +#else + hBstr->ind_list[hBstr->next_ind].value = value; + hBstr->ind_list[hBstr->next_ind].nb_bits = nb_bits; +#endif /* updates */ #ifdef IND_LIST_DYN hBstr->nb_ind_tot++; hBstr->next_ind = hBstr->nb_ind_tot; +#ifdef DEBUG_IND_LIST + assert( ( hBstr->nb_ind_tot < hBstr->max_num_indices ) && "Maximum number of indices has been exceeded!" ); +#endif + #else hBstr->next_ind++; #endif hBstr->nb_bits_tot += nb_bits; -#ifdef DEBUG_IND - dbgwrite( &hBstr->last_ind, sizeof( int16_t ), 1, 1, "res/ind_list.x" ); - total_num_id++; -#endif - return error; } @@ -506,13 +511,12 @@ void push_next_bits( #ifdef IND_LIST_DYN ptr->id = prev_id; hBstr->nb_ind_tot++; +#ifdef DEBUG_IND_LIST + assert( ( hBstr->nb_ind_tot < hBstr->max_num_indices ) && "Maximum number of indices has been exceeded!" ); +#endif #endif ++ptr; -#ifdef DEBUG_IND - dbgwrite( &hBstr->last_ind, sizeof( int16_t ), 1, 1, "res/ind_list.x" ); - total_num_id++; -#endif } for ( ; i < nb_bits; ++i ) @@ -525,19 +529,17 @@ void push_next_bits( #ifdef IND_LIST_DYN ptr->id = prev_id; hBstr->nb_ind_tot++; +#ifdef DEBUG_IND_LIST + assert( ( hBstr->nb_ind_tot < hBstr->max_num_indices ) && "Maximum number of indices has been exceeded!" ); +#endif #endif ++ptr; -#ifdef DEBUG_IND - dbgwrite( &hBstr->last_ind, sizeof( int16_t ), 1, 1, "res/ind_list.x" ); - total_num_id++; -#endif } hBstr->next_ind = (int16_t) ( ptr - hBstr->ind_list ); hBstr->nb_bits_tot = hBstr->nb_bits_tot + nb_bits; - return; } @@ -1086,20 +1088,56 @@ static ivas_error write_indices_element( if ( st_ivas->hSCE[element_id]->hMetaData != NULL ) { reset_indices_enc( st_ivas->hSCE[element_id]->hMetaData, MAX_BITS_METADATA ); +#ifdef IND_LIST_DYN + st_ivas->hSCE[element_id]->hMetaData->max_num_indices = MAX_BITS_METADATA; +#endif } - reset_indices_enc( sts[0]->hBstr, MAX_NUM_INDICES ); +#ifdef DEBUG_IND_LIST + /* find the maximum number of core-coder indices */ + if ( sts[0]->hBstr->nb_ind_tot > max_total_num_ind ) + { + max_total_num_ind = sts[0]->hBstr->nb_ind_tot; + max_at_brate = sts[0]->total_brate; + } +#endif + + reset_indices_enc( sts[0]->hBstr, +#ifdef IND_LIST_DYN + sts[0]->hBstr->max_num_indices +#else + MAX_NUM_INDICES +#endif + ); } else { if ( st_ivas->hCPE[element_id]->hMetaData != NULL ) { reset_indices_enc( st_ivas->hCPE[element_id]->hMetaData, MAX_BITS_METADATA ); +#ifdef IND_LIST_DYN + st_ivas->hCPE[element_id]->hMetaData->max_num_indices = MAX_BITS_METADATA; +#endif } for ( n = 0; n < n_channels; n++ ) { - reset_indices_enc( sts[n]->hBstr, MAX_NUM_INDICES ); +#ifdef DEBUG_IND_LIST + /* find the maximum number of core-coder indices */ + if ( sts[n]->hBstr->nb_ind_tot > max_total_num_ind ) + { + max_total_num_ind = sts[n]->hBstr->nb_ind_tot; + max_at_brate = sts[0]->total_brate; + } +#endif + + reset_indices_enc( sts[n]->hBstr, +#ifdef IND_LIST_DYN + sts[n]->hBstr->max_num_indices +#else + MAX_NUM_INDICES +#endif + ); } } diff --git a/lib_com/cnst.h b/lib_com/cnst.h index db1dc3d898..4f03276837 100644 --- a/lib_com/cnst.h +++ b/lib_com/cnst.h @@ -449,7 +449,9 @@ enum IND_STEREO_2ND_CODER_T, IND_UNUSED, +#ifndef IND_LIST_DYN MAX_NUM_INDICES = IND_UNUSED + 772 /* Total 2640 in line with MAX_BITS_METADATA */ +#endif }; /*----------------------------------------------------------------------------------* diff --git a/lib_com/options.h b/lib_com/options.h index 2096942f81..603a041ded 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -57,8 +57,8 @@ /*#define MEM_COUNT_DETAILS*/ /* Output detailed memory analysis for the worst-case frame (writes to the file "mem_analysis.csv") */ /*#define BITSTREAM_INDICES_MEMORY*/ /* Don't count memory for bitstream Indice at the encoder - it is a temporary solution for development only */ -#define DEBUG_IND #define IND_LIST_DYN /* dynamic allocation of ind_list based on transport channels */ +#define DEBUG_IND_LIST #ifdef DEBUGGING diff --git a/lib_com/prot.h b/lib_com/prot.h index a94c2a7441..cb7f02cabe 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -2238,6 +2238,9 @@ void read_next_force( #endif ivas_error init_encoder( Encoder_State *st, /* i/o: state structure */ +#ifdef IND_LIST_DYN + ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : encoder configuration handle */ +#endif const int16_t idchan, /* i : channel ID */ const int16_t var_SID_rate_flag, /* i : flag for variable SID update rate */ const int16_t interval_SID, /* i : interval for SID update */ diff --git a/lib_enc/dtx.c b/lib_enc/dtx.c index 3aa78adb65..5916e94288 100644 --- a/lib_enc/dtx.c +++ b/lib_enc/dtx.c @@ -260,7 +260,13 @@ void dtx( /* reset the bitstream (IVAS format signaling was already written) */ if ( st->element_mode != IVAS_CPE_MDCT && st->hBstr != NULL ) { - reset_indices_enc( st->hBstr, MAX_NUM_INDICES ); + reset_indices_enc( st->hBstr, +#ifdef IND_LIST_DYN + st->hBstr->max_num_indices +#else + MAX_NUM_INDICES +#endif + ); } } diff --git a/lib_enc/enc_ppp.c b/lib_enc/enc_ppp.c index 823d6cf3cd..8d1ffcecd7 100644 --- a/lib_enc/enc_ppp.c +++ b/lib_enc/enc_ppp.c @@ -169,7 +169,13 @@ ivas_error encod_ppp( } /* delete previous indices */ - reset_indices_enc( hBstr, MAX_NUM_INDICES ); + reset_indices_enc( hBstr, +#ifdef IND_LIST_DYN + hBstr->max_num_indices +#else + MAX_NUM_INDICES +#endif + ); /* signaling matrix (writing of signaling bits) */ signaling_enc( st ); diff --git a/lib_enc/fd_cng_enc.c b/lib_enc/fd_cng_enc.c index 20aa31f3ca..414749aa83 100644 --- a/lib_enc/fd_cng_enc.c +++ b/lib_enc/fd_cng_enc.c @@ -893,8 +893,20 @@ void stereoFdCngCoherence( else if ( sts[0]->core_brate <= SID_2k40 && sts[1]->core_brate <= SID_2k40 ) { /* case: no VAD for both channels -> INACTIVE FRAME */ - reset_indices_enc( sts[0]->hBstr, MAX_NUM_INDICES ); - reset_indices_enc( sts[1]->hBstr, MAX_NUM_INDICES ); + reset_indices_enc( sts[0]->hBstr, +#ifdef IND_LIST_DYN + sts[0]->hBstr->max_num_indices +#else + MAX_NUM_INDICES +#endif + ); + reset_indices_enc( sts[1]->hBstr, +#ifdef IND_LIST_DYN + sts[1]->hBstr->max_num_indices +#else + MAX_NUM_INDICES +#endif + ); /* synchronize SID sending for variable SID rate */ if ( sts[0]->core_brate != sts[1]->core_brate ) diff --git a/lib_enc/init_enc.c b/lib_enc/init_enc.c index dbd5693f1c..194c11907b 100644 --- a/lib_enc/init_enc.c +++ b/lib_enc/init_enc.c @@ -55,6 +55,9 @@ ivas_error init_encoder( Encoder_State *st, /* i/o: state structure */ +#ifdef IND_LIST_DYN + ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : encoder configuration handle */ +#endif const int16_t idchan, /* i : channel ID */ const int16_t var_SID_rate_flag, /* i : flag for variable SID update rate */ const int16_t interval_SID, /* i : interval for SID update */ @@ -113,13 +116,93 @@ ivas_error init_encoder( } #ifdef IND_LIST_DYN + /* set the maximum required number of indices */ + if ( hEncoderConfig->ivas_format == MONO_FORMAT ) + { + if ( st->total_brate < IVAS_24k4 ) + { + st->hBstr->max_num_indices = 450; + } + else + { + st->hBstr->max_num_indices = 450; + } + } + else if ( hEncoderConfig->ivas_format == STEREO_FORMAT ) + { + if ( st->total_brate < IVAS_24k4 ) + { + st->hBstr->max_num_indices = 240; + } + else + { + st->hBstr->max_num_indices = 350; + } + } + else if ( hEncoderConfig->ivas_format == ISM_FORMAT ) + { + if ( st->total_brate < IVAS_24k4 ) + { + st->hBstr->max_num_indices = 150; + } + else + { + st->hBstr->max_num_indices = 350; + } + } + else if ( hEncoderConfig->ivas_format == SBA_FORMAT ) + { + if ( st->total_brate < IVAS_24k4 ) + { + st->hBstr->max_num_indices = 250; + } + else if ( st->total_brate < IVAS_128k ) + { + st->hBstr->max_num_indices = 450; + } + else + { + st->hBstr->max_num_indices = 700; + } + } + else if ( hEncoderConfig->ivas_format == MASA_FORMAT ) + { + if ( st->total_brate < IVAS_24k4 ) + { + st->hBstr->max_num_indices = 250; + } + else if ( st->total_brate < IVAS_160k ) + { + st->hBstr->max_num_indices = 450; + } + else + { + st->hBstr->max_num_indices = 700; + } + } + else if ( hEncoderConfig->ivas_format == MC_FORMAT ) + { + if ( st->total_brate < IVAS_24k4 ) + { + st->hBstr->max_num_indices = 550; + } + else + { + st->hBstr->max_num_indices = 1050; + } + } + else + { + st->hBstr->max_num_indices = 1050; + } + /* allocate buffer of indices */ - if ( ( st->hBstr->ind_list = (INDICE_HANDLE) malloc( MAX_NUM_INDICES * sizeof( Indice ) ) ) == NULL ) + if ( ( st->hBstr->ind_list = (INDICE_HANDLE) malloc( st->hBstr->max_num_indices * sizeof( Indice ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); } - reset_indices_enc( st->hBstr, MAX_NUM_INDICES ); + reset_indices_enc( st->hBstr, st->hBstr->max_num_indices ); #endif } else diff --git a/lib_enc/ivas_corecoder_enc_reconfig.c b/lib_enc/ivas_corecoder_enc_reconfig.c index a2428a0630..9189ce3876 100644 --- a/lib_enc/ivas_corecoder_enc_reconfig.c +++ b/lib_enc/ivas_corecoder_enc_reconfig.c @@ -301,7 +301,13 @@ ivas_error ivas_corecoder_enc_reconfig( /* only reset indices if it is not the first index list, this already contains the IVAS format bits */ if ( sce_id > 0 ) { - reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); + reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, +#ifdef IND_LIST_DYN + st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->max_num_indices +#else + MAX_NUM_INDICES +#endif + ); } else { @@ -332,6 +338,10 @@ ivas_error ivas_corecoder_enc_reconfig( st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata + sce_id * MAX_BITS_METADATA; reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA ); +#ifdef IND_LIST_DYN + st_ivas->hSCE[sce_id]->hMetaData->max_num_indices = MAX_BITS_METADATA; +#endif + } } @@ -361,7 +371,13 @@ ivas_error ivas_corecoder_enc_reconfig( #endif if ( cpe_id * CPE_CHANNELS + n > 0 || ( st_ivas->mc_mode == MC_MODE_MCMASA && st_ivas->nSCE > 0 ) ) { - reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); + reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, +#ifdef IND_LIST_DYN + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->max_num_indices +#else + MAX_NUM_INDICES +#endif + ); } else { @@ -421,7 +437,13 @@ ivas_error ivas_corecoder_enc_reconfig( #endif if ( cpe_id * CPE_CHANNELS + n > 0 || ( st_ivas->mc_mode == MC_MODE_MCMASA && st_ivas->nSCE > 0 ) ) { - reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); + reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, +#ifdef IND_LIST_DYN + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->max_num_indices +#else + MAX_NUM_INDICES +#endif + ); } else { @@ -526,8 +548,16 @@ ivas_error ivas_corecoder_enc_reconfig( } } +#ifdef IND_LIST_DYN + /* VM: Check, if this is correct */ + st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->ind_list = ind_list_metadata + st_ivas->nSCE * MAX_BITS_METADATA; +#else st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->ind_list = ind_list_metadata + st_ivas->nSCE * MAX_NUM_INDICES; +#endif reset_indices_enc( st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData, MAX_BITS_METADATA ); +#ifdef IND_LIST_DYN + st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->max_num_indices = MAX_BITS_METADATA; +#endif for ( cpe_id = 0; cpe_id < st_ivas->nCPE - 1; cpe_id++ ) { diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index 9aec652f05..25b74bba1c 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -831,7 +831,11 @@ ivas_error create_cpe_enc( st->mct_chan_mode = MCT_CHAN_MODE_LFE; } - if ( ( error = init_encoder( st, n, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 0 ) ) != IVAS_ERR_OK ) + if ( ( error = init_encoder( st, +#ifdef IND_LIST_DYN + hEncoderConfig, +#endif + n, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 0 ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index 26809f733d..a2c38b109f 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -419,6 +419,9 @@ ivas_error ivas_init_encoder( /* MetaData for DFT stereo */ st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[0]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA ); +#ifdef IND_LIST_DYN + st_ivas->hCPE[cpe_id]->hMetaData->max_num_indices = MAX_BITS_METADATA; +#endif } else if ( ivas_format == ISM_FORMAT ) { @@ -453,6 +456,9 @@ ivas_error ivas_init_encoder( st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA ); +#ifdef IND_LIST_DYN + st_ivas->hSCE[sce_id]->hMetaData->max_num_indices = MAX_BITS_METADATA; +#endif } if ( st_ivas->ism_mode == ISM_MODE_PARAM ) @@ -520,6 +526,9 @@ ivas_error ivas_init_encoder( st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA ); +#ifdef IND_LIST_DYN + st_ivas->hSCE[sce_id]->hMetaData->max_num_indices = MAX_BITS_METADATA; +#endif if ( st_ivas->sba_mode == SBA_MODE_SPAR && st_ivas->hEncoderConfig->Opt_DTX_ON ) { @@ -560,6 +569,9 @@ ivas_error ivas_init_encoder( { st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[st_ivas->nSCE]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA ); +#ifdef IND_LIST_DYN + st_ivas->hCPE[cpe_id]->hMetaData->max_num_indices = MAX_BITS_METADATA; +#endif } } @@ -611,6 +623,9 @@ ivas_error ivas_init_encoder( { st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[st_ivas->nSCE]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA ); +#ifdef IND_LIST_DYN + st_ivas->hCPE[cpe_id]->hMetaData->max_num_indices = MAX_BITS_METADATA; +#endif } } @@ -660,6 +675,9 @@ ivas_error ivas_init_encoder( { st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[st_ivas->nSCE]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA ); +#ifdef IND_LIST_DYN + st_ivas->hCPE[cpe_id]->hMetaData->max_num_indices = MAX_BITS_METADATA; +#endif } } @@ -716,6 +734,9 @@ ivas_error ivas_init_encoder( st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA ); +#ifdef IND_LIST_DYN + st_ivas->hSCE[sce_id]->hMetaData->max_num_indices = MAX_BITS_METADATA; +#endif } for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) @@ -747,6 +768,9 @@ ivas_error ivas_init_encoder( { st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[st_ivas->nSCE]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA ); +#ifdef IND_LIST_DYN + st_ivas->hCPE[cpe_id]->hMetaData->max_num_indices = MAX_BITS_METADATA; +#endif } } } diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index 970a54b665..d735777baa 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -714,6 +714,9 @@ ivas_error ivas_ism_metadata_enc( if ( hSCE[0]->hCoreCoder[0]->core_brate > SID_2k40 ) { reset_indices_enc( hSCE[ch]->hMetaData, MAX_BITS_METADATA ); +#ifdef IND_LIST_DYN + hSCE[ch]->hMetaData->max_num_indices = MAX_BITS_METADATA; +#endif } } diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index c6d6abd3b8..a04d1d4cc2 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -252,6 +252,9 @@ ivas_error ivas_sba_enc_reinit( st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata + sce_id * MAX_BITS_METADATA; reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA ); +#ifdef IND_LIST_DYN + st_ivas->hSCE[sce_id]->hMetaData->max_num_indices = MAX_BITS_METADATA; +#endif if ( st_ivas->sba_mode == SBA_MODE_SPAR && st_ivas->hEncoderConfig->Opt_DTX_ON ) { @@ -287,6 +290,9 @@ ivas_error ivas_sba_enc_reinit( { st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata + sce_id * MAX_BITS_METADATA; reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA ); +#ifdef IND_LIST_DYN + st_ivas->hCPE[cpe_id]->hMetaData->max_num_indices = MAX_BITS_METADATA; +#endif } } diff --git a/lib_enc/ivas_sce_enc.c b/lib_enc/ivas_sce_enc.c index 0134efc0f0..d19c3f5460 100644 --- a/lib_enc/ivas_sce_enc.c +++ b/lib_enc/ivas_sce_enc.c @@ -329,7 +329,11 @@ ivas_error create_sce_enc( st->total_brate = hSCE->element_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ st->mct_chan_mode = MCT_CHAN_MODE_REGULAR; - if ( ( error = init_encoder( st, 0, st_ivas->hEncoderConfig->var_SID_rate_flag, st_ivas->hEncoderConfig->interval_SID, 0 ) ) != IVAS_ERR_OK ) + if ( ( error = init_encoder( st, +#ifdef IND_LIST_DYN + st_ivas->hEncoderConfig, +#endif + 0, st_ivas->hEncoderConfig->var_SID_rate_flag, st_ivas->hEncoderConfig->interval_SID, 0 ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 5e9dd6400c..cb53616e43 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -189,7 +189,11 @@ ivas_error ivas_spar_enc_open( hSpar->hCoreCoderVAD->total_brate = hEncoderConfig->ivas_total_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ hSpar->hCoreCoderVAD->mct_chan_mode = MCT_CHAN_MODE_IGNORE; - if ( ( error = init_encoder( hSpar->hCoreCoderVAD, 0, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 1 ) ) != IVAS_ERR_OK ) + if ( ( error = init_encoder( hSpar->hCoreCoderVAD, +#ifdef IND_LIST_DYN + hEncoderConfig, +#endif + 0, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 1 ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index 20a3e4322b..3602c2be68 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -880,6 +880,9 @@ ivas_error ivas_spar_md_enc_process( if ( strat != NO_STRAT ) { reset_indices_enc( &hMetaData_tmp, MAX_BITS_METADATA ); +#ifdef IND_LIST_DYN + hMetaData_tmp.max_num_indices = MAX_BITS_METADATA; +#endif ivas_write_spar_md_bitstream( hMdEnc, num_bands, bands_bw, &hMetaData_tmp, hEncoderConfig->ivas_total_brate, strat, qsi, planarCP ); diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index 0da30af73d..7b51714831 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -79,7 +79,7 @@ typedef struct bitstream_enc_data_structure Indice *ind_list; /* list of indices */ int16_t next_ind; /* pointer to the next empty slot in the list of indices */ int16_t last_ind; /* last written indice */ - + int16_t max_num_indices; /* maximum number of indices in the list */ } BSTR_ENC_DATA, *BSTR_ENC_HANDLE; /*----------------------------------------------------------------------------------* -- GitLab From beda0f087504b85206efd3bfe64b90a0cbfbeafc Mon Sep 17 00:00:00 2001 From: malenov Date: Tue, 14 Feb 2023 13:36:01 +0100 Subject: [PATCH 004/331] cleanup within IND_LIST_DYN --- lib_com/ivas_prot.h | 4 +- lib_enc/ivas_corecoder_enc_reconfig.c | 18 +------ lib_enc/ivas_init_enc.c | 72 ++------------------------- lib_enc/lib_enc.c | 36 +------------- 4 files changed, 9 insertions(+), 121 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 142f6a0059..3a30c59b50 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -285,9 +285,7 @@ void ivas_initialize_handles_enc( ivas_error ivas_init_encoder( Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ -#ifdef IND_LIST_DYN - //Indice *ind_list[], /* i : list of indices */ -#else +#ifndef IND_LIST_DYN Indice ind_list[][MAX_NUM_INDICES], /* i : indices list */ #endif Indice ind_list_metadata[][MAX_BITS_METADATA] /* i : indices list metadata */ diff --git a/lib_enc/ivas_corecoder_enc_reconfig.c b/lib_enc/ivas_corecoder_enc_reconfig.c index 9189ce3876..293462d501 100644 --- a/lib_enc/ivas_corecoder_enc_reconfig.c +++ b/lib_enc/ivas_corecoder_enc_reconfig.c @@ -287,14 +287,7 @@ ivas_error ivas_corecoder_enc_reconfig( } /* allocate buffer of indices */ -#ifdef IND_LIST_DYN - //if ( ( ind_list = (INDICE_HANDLE) malloc( MAX_NUM_INDICES * sizeof( Indice ) ) ) == NULL ) - //{ - // return IVAS_ERR_FAILED_ALLOC; - //} - - //st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list; -#else +#ifndef IND_LIST_DYN st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list + sce_id * MAX_NUM_INDICES; #endif @@ -359,14 +352,7 @@ ivas_error ivas_corecoder_enc_reconfig( copy_encoder_config( st_ivas, st_ivas->hCPE[cpe_id]->hCoreCoder[n], 0 ); st_ivas->hCPE[cpe_id]->hCoreCoder[n]->total_brate = st_ivas->hCPE[cpe_id]->element_brate / ( st_ivas->nCPE > 1 ? 1 : CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ -#ifdef IND_LIST_DYN - //if ( ( ind_list = (INDICE_HANDLE) malloc( MAX_NUM_INDICES * sizeof( Indice ) ) ) == NULL ) - //{ - // return IVAS_ERR_FAILED_ALLOC; - //} - - //st_ivas->hSCE[cpe_id]->hCoreCoder[0]->hBstr->ind_list = ind_list; -#else +#ifndef IND_LIST_DYN st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list + ( cpe_id * CPE_CHANNELS + n + st_ivas->nSCE ) * MAX_NUM_INDICES; #endif if ( cpe_id * CPE_CHANNELS + n > 0 || ( st_ivas->mc_mode == MC_MODE_MCMASA && st_ivas->nSCE > 0 ) ) diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index a2c38b109f..692c410f32 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -311,9 +311,7 @@ void ivas_initialize_handles_enc( ivas_error ivas_init_encoder( Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ -#ifdef IND_LIST_DYN - //Indice *ind_list[], /* i : list of indices */ -#else +#ifndef IND_LIST_DYN Indice ind_list[][MAX_NUM_INDICES], /* o : bitstream indices */ #endif Indice ind_list_metadata[][MAX_BITS_METADATA] /* o : bitstream indices metadata */ @@ -367,13 +365,6 @@ ivas_error ivas_init_encoder( return error; } -#ifdef IND_LIST_DYN - ///* allocate buffer of indices */ - //if ( ( ind_list[sce_id] = (INDICE_HANDLE) malloc( MAX_NUM_INDICES * sizeof( Indice ) ) ) == NULL ) - //{ - // return IVAS_ERR_FAILED_ALLOC; - //} -#endif #ifndef IND_LIST_DYN st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); @@ -403,13 +394,6 @@ ivas_error ivas_init_encoder( /* allocate buffer of indices */ for ( n = 0; n < CPE_CHANNELS; n++ ) { -#ifdef IND_LIST_DYN - //if ( ( ind_list[n] = (INDICE_HANDLE) malloc( MAX_NUM_INDICES * sizeof( Indice ) ) ) == NULL ) - //{ - // return IVAS_ERR_FAILED_ALLOC; - //} -#endif - #ifndef IND_LIST_DYN st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[n]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); @@ -441,14 +425,6 @@ ivas_error ivas_init_encoder( return error; } -#ifdef IND_LIST_DYN - /* allocate buffer of indices */ - //if ( ( ind_list[sce_id] = (INDICE_HANDLE) malloc( MAX_NUM_INDICES * sizeof( Indice ) ) ) == NULL ) - //{ - // return IVAS_ERR_FAILED_ALLOC; - //} -#endif - #ifndef IND_LIST_DYN st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); @@ -511,14 +487,6 @@ ivas_error ivas_init_encoder( return error; } -#ifdef IND_LIST_DYN - /* allocate buffer of indices */ - //if ( ( ind_list[sce_id] = (INDICE_HANDLE) malloc( MAX_NUM_INDICES * sizeof( Indice ) ) ) == NULL ) - //{ - // return IVAS_ERR_FAILED_ALLOC; - //} -#endif - #ifndef IND_LIST_DYN st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); @@ -546,13 +514,6 @@ ivas_error ivas_init_encoder( /* allocate buffer of indices */ for ( n = 0; n < CPE_CHANNELS; n++ ) { -#ifdef IND_LIST_DYN - //if ( ( ind_list[cpe_id * CPE_CHANNELS + n] = (INDICE_HANDLE) malloc( MAX_NUM_INDICES * sizeof( Indice ) ) ) == NULL ) - //{ - // return IVAS_ERR_FAILED_ALLOC; - //} -#endif - #ifndef IND_LIST_DYN st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[cpe_id * CPE_CHANNELS + n]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); @@ -604,12 +565,6 @@ ivas_error ivas_init_encoder( /* allocate buffer of indices */ for ( n = 0; n < CPE_CHANNELS; n++ ) { -#ifdef IND_LIST_DYN - //if ( ( ind_list[cpe_id * CPE_CHANNELS + n] = (INDICE_HANDLE) malloc( MAX_NUM_INDICES * sizeof( Indice ) ) ) == NULL ) - //{ - // return IVAS_ERR_FAILED_ALLOC; - //} -#endif /* we need the correct bitstream also for the LFE channel since it might become a proper coded channel when switching to ParamMC and ind_list is only visible here, can't be done later */ #ifndef IND_LIST_DYN @@ -658,12 +613,6 @@ ivas_error ivas_init_encoder( /* allocate buffer of indices */ for ( n = 0; n < CPE_CHANNELS; n++ ) { -#ifdef IND_LIST_DYN - //if ( ( ind_list[cpe_id * CPE_CHANNELS + n] = (INDICE_HANDLE) malloc( MAX_NUM_INDICES * sizeof( Indice ) ) ) == NULL ) - //{ - // return IVAS_ERR_FAILED_ALLOC; - //} -#endif #ifndef IND_LIST_DYN st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[cpe_id * CPE_CHANNELS + n]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); @@ -719,15 +668,8 @@ ivas_error ivas_init_encoder( return error; } - /* allocate buffer of indices */ -#ifdef IND_LIST_DYN - //if ( ( ind_list[sce_id] = (INDICE_HANDLE) malloc( MAX_NUM_INDICES * sizeof( Indice ) ) ) == NULL ) - //{ - // return IVAS_ERR_FAILED_ALLOC; - //} -#endif - #ifndef IND_LIST_DYN + /* allocate buffer of indices */ st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); #endif @@ -748,20 +690,14 @@ ivas_error ivas_init_encoder( return error; } +#ifndef IND_LIST_DYN /* allocate buffer of indices */ for ( n = 0; n < CPE_CHANNELS; n++ ) { -#ifdef IND_LIST_DYN - //if ( ( ind_list[cpe_id * CPE_CHANNELS + n + st_ivas->nSCE] = (INDICE_HANDLE) malloc( MAX_NUM_INDICES * sizeof( Indice ) ) ) == NULL ) - //{ - // return IVAS_ERR_FAILED_ALLOC; - //} -#endif -#ifndef IND_LIST_DYN st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[cpe_id * CPE_CHANNELS + n + st_ivas->nSCE]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); -#endif } +#endif /* Metadata only initialized for the last CPE index*/ if ( cpe_id == st_ivas->nCPE - 1 ) diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index c9c664f7c7..686e6393ac 100644 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -48,9 +48,7 @@ struct IVAS_ENC { Encoder_Struct *st_ivas; -#ifdef IND_LIST_DYN - //Indice *ind_list[MAX_NUM_DATA]; /* list of indices */ -#else +#ifndef IND_LIST_DYN Indice ind_list[MAX_NUM_DATA][MAX_NUM_INDICES]; /* list of indices */ #endif Indice ind_list_metadata[MAX_NUM_METADATA][MAX_BITS_METADATA]; /* list of indices for metadata */ @@ -138,19 +136,7 @@ ivas_error IVAS_ENC_Open( * Initialize indices *-----------------------------------------------------------------*/ -#ifdef IND_LIST_DYN - /* allocate ind_list[0] - for the first transport channel */ - //if ( ( ( *phIvasEnc )->ind_list[0] = (INDICE_HANDLE) malloc( MAX_NUM_INDICES * sizeof( Indice ) ) ) == NULL ) - //{ - // return IVAS_ERR_FAILED_ALLOC; - //} - - //for ( i = 0; i < MAX_NUM_DATA; ++i ) - //{ - // ( *phIvasEnc )->ind_list[i] = NULL; - //} -#else - +#ifndef IND_LIST_DYN for ( i = 0; i < MAX_NUM_DATA; ++i ) { for ( j = 0; j < MAX_NUM_INDICES; ++j ) @@ -216,10 +202,6 @@ void IVAS_ENC_Close( IVAS_ENC_HANDLE *phIvasEnc /* i/o: pointer to IVAS encoder handle */ ) { -#ifdef IND_LIST_DYN - //int16_t i; -#endif - /* Free all memory */ if ( phIvasEnc == NULL || *phIvasEnc == NULL ) { @@ -242,20 +224,6 @@ void IVAS_ENC_Close( ( *phIvasEnc )->st_ivas = NULL; -#ifdef IND_LIST_DYN - //for ( i = 0; i < MAX_NUM_DATA; ++i ) - //{ - // if ( ( *phIvasEnc )->ind_list[i] != NULL ) - // { - // free( ( *phIvasEnc )->ind_list[i] ); - // } - // else - // { - // break; - // } - //} -#endif - #ifdef BITSTREAM_INDICES_MEMORY #define WMC_TOOL_SKIP free( *phIvasEnc ); -- GitLab From 2aaf10bc06a54095c8c778093beb7f8f37761b76 Mon Sep 17 00:00:00 2001 From: malenov Date: Thu, 16 Feb 2023 08:52:29 +0100 Subject: [PATCH 005/331] auxiliary function for realllocation of ind_list --- lib_com/bitstream.c | 158 ++++++++++++++++++++++++++ lib_com/ivas_cnst.h | 3 + lib_com/ivas_prot.h | 3 + lib_com/prot.h | 11 ++ lib_enc/init_enc.c | 83 +------------- lib_enc/ivas_core_enc.c | 14 ++- lib_enc/ivas_corecoder_enc_reconfig.c | 124 ++++++++++++++++++-- lib_enc/ivas_stereo_mdct_core_enc.c | 9 ++ 8 files changed, 316 insertions(+), 89 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index e92a86b78e..eaca61a681 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -221,6 +221,164 @@ Word16 rate2EVSmode( return rate2AMRWB_IOmode( brate ); } +#ifdef IND_LIST_DYN +/*-------------------------------------------------------------------* + * ind_list_realloc() + * + * Re-allocate list of indices if the maximum number of allowed indices has changed + *-------------------------------------------------------------------*/ + +ivas_error ind_list_realloc( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t total_brate /* i : total bitrate */ +) +{ + int16_t i, max_num_indices; + INDICE_HANDLE new_ind_list; + + /* get the maximum allowed number of indices in the list */ + max_num_indices = set_max_num_indices( ivas_format, total_brate ); + + /* check, if the maximum number of allowed indices has changed */ + if ( max_num_indices != hBstr->max_num_indices ) + { + /* allocate new buffer of indices */ + if ( ( new_ind_list = (INDICE_HANDLE) malloc( max_num_indices * sizeof( Indice ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); + } + + /* move indices from the old list to the new list */ + i = 0; + while ( hBstr->ind_list[i].nb_bits > 0 ) + { + new_ind_list[i].id = hBstr->ind_list[i].id; + new_ind_list[i].value = hBstr->ind_list[i].value; + new_ind_list[i].nb_bits = hBstr->ind_list[i].nb_bits; + i++; + } + + /* reset nb_bits of all other indices to -1 */ + for ( ; i < max_num_indices; i++ ) + { + new_ind_list[i].nb_bits = -1; + } + + /* free the old list */ + free( hBstr->ind_list ); + + /* set pointer to the new list */ + hBstr->ind_list = new_ind_list; + + /* set the new maximum for the allowed number of indices */ + hBstr->max_num_indices = max_num_indices; + } + + return IVAS_ERR_OK; +} + +#ifdef IND_LIST_DYN +/*-----------------------------------------------------------------------* + * set_max_num_indices() + * + * Set the maximum allowed number of indices in the list + *-----------------------------------------------------------------------*/ + +int16_t set_max_num_indices( /* o : maximum number of indices */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t total_brate /* i : total bitrate */ +) +{ + /* set the maximum required number of indices */ + if ( ivas_format == MONO_FORMAT ) + { + if ( total_brate < IVAS_24k4 ) + { + return 450; + } + else + { + return 450; + } + } + else if ( ivas_format == STEREO_FORMAT ) + { + if ( total_brate < IVAS_24k4 ) + { + return 250; + } + else if ( total_brate < IVAS_128k ) + { + return 450; + } + else + { + return 550; + } + } + else if ( ivas_format == ISM_FORMAT ) + { + if ( total_brate < IVAS_24k4 ) + { + return 250; + } + else if ( total_brate < IVAS_128k ) + { + return 450; + } + else + { + return 700; + } + } + else if ( ivas_format == SBA_FORMAT ) + { + if ( total_brate < IVAS_24k4 ) + { + return 250; + } + else if ( total_brate < IVAS_128k ) + { + return 450; + } + else + { + return 700; + } + } + else if ( ivas_format == MASA_FORMAT ) + { + if ( total_brate < IVAS_24k4 ) + { + return 250; + } + else if ( total_brate < IVAS_160k ) + { + return 450; + } + else + { + return 700; + } + } + else if ( ivas_format == MC_FORMAT ) + { + if ( total_brate < IVAS_24k4 ) + { + return 450; + } + else + { + return 1050; + } + } + + return 1050; +} +#endif +#endif + /*-------------------------------------------------------------------* * push_indice() * diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index e625095817..62848e5066 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -179,6 +179,9 @@ typedef enum #define MAX_BITS_METADATA 2640 /* max. bit-budget of metadata, one channel */ /* IVAS_fmToDo: to be confirmed for final value once mature */ #define MAX_NUM_METADATA max( 2, MAX_NUM_OBJECTS ) /* number of max. metadata (now only 2 for DirAC) */ +#ifdef IND_LIST_DYN +#define MAX_NUM_IND_TEMP_LIST 10 /* maximum number of indices in the temporary list */ +#endif #define IVAS_ENC_DELAY_NS ACELP_LOOK_NS #define IVAS_DEC_DELAY_NS 3250000L /* 3.25 ms: IVAS decoder delay (without renderer delay) */ diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 3a30c59b50..29aa795a56 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -1979,6 +1979,9 @@ void InternalTCXDecoder( void stereo_mdct_core_enc( CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ +#ifdef IND_LIST_DYN + const int16_t ivas_format, /* i : IVAS format */ +#endif float new_samples[CPE_CHANNELS][L_INP], /* i : new samples */ float old_wsp[CPE_CHANNELS][L_WSP], /* i : 12.8kHz weighted speech (for LTP */ float pitch_buf[CPE_CHANNELS][NB_SUBFR16k] /* o : floating pitch for each subframe */ diff --git a/lib_com/prot.h b/lib_com/prot.h index cb7f02cabe..2740a305fd 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -516,6 +516,17 @@ void push_next_bits( ); #ifdef IND_LIST_DYN +int16_t set_max_num_indices( /* o : maximum number of indices */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t total_brate /* i : total bitrate */ +); + +ivas_error ind_list_realloc( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t total_brate /* i : total bitrate */ +); + int16_t find_indice( /* o : index of the indice in the list, -1 if not found */ BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ int16_t id, /* i : ID of the indice */ diff --git a/lib_enc/init_enc.c b/lib_enc/init_enc.c index 194c11907b..10be4e86f4 100644 --- a/lib_enc/init_enc.c +++ b/lib_enc/init_enc.c @@ -116,85 +116,8 @@ ivas_error init_encoder( } #ifdef IND_LIST_DYN - /* set the maximum required number of indices */ - if ( hEncoderConfig->ivas_format == MONO_FORMAT ) - { - if ( st->total_brate < IVAS_24k4 ) - { - st->hBstr->max_num_indices = 450; - } - else - { - st->hBstr->max_num_indices = 450; - } - } - else if ( hEncoderConfig->ivas_format == STEREO_FORMAT ) - { - if ( st->total_brate < IVAS_24k4 ) - { - st->hBstr->max_num_indices = 240; - } - else - { - st->hBstr->max_num_indices = 350; - } - } - else if ( hEncoderConfig->ivas_format == ISM_FORMAT ) - { - if ( st->total_brate < IVAS_24k4 ) - { - st->hBstr->max_num_indices = 150; - } - else - { - st->hBstr->max_num_indices = 350; - } - } - else if ( hEncoderConfig->ivas_format == SBA_FORMAT ) - { - if ( st->total_brate < IVAS_24k4 ) - { - st->hBstr->max_num_indices = 250; - } - else if ( st->total_brate < IVAS_128k ) - { - st->hBstr->max_num_indices = 450; - } - else - { - st->hBstr->max_num_indices = 700; - } - } - else if ( hEncoderConfig->ivas_format == MASA_FORMAT ) - { - if ( st->total_brate < IVAS_24k4 ) - { - st->hBstr->max_num_indices = 250; - } - else if ( st->total_brate < IVAS_160k ) - { - st->hBstr->max_num_indices = 450; - } - else - { - st->hBstr->max_num_indices = 700; - } - } - else if ( hEncoderConfig->ivas_format == MC_FORMAT ) - { - if ( st->total_brate < IVAS_24k4 ) - { - st->hBstr->max_num_indices = 550; - } - else - { - st->hBstr->max_num_indices = 1050; - } - } - else - { - st->hBstr->max_num_indices = 1050; - } + /* set the maximum allowed number of indices in the list */ + st->hBstr->max_num_indices = set_max_num_indices( hEncoderConfig->ivas_format, st->total_brate ); /* allocate buffer of indices */ if ( ( st->hBstr->ind_list = (INDICE_HANDLE) malloc( st->hBstr->max_num_indices * sizeof( Indice ) ) ) == NULL ) @@ -928,6 +851,8 @@ ivas_error init_encoder( } + + /*-----------------------------------------------------------------------* * LPDmem_enc_init() * diff --git a/lib_enc/ivas_core_enc.c b/lib_enc/ivas_core_enc.c index e53033ab98..d1bc85d759 100644 --- a/lib_enc/ivas_core_enc.c +++ b/lib_enc/ivas_core_enc.c @@ -195,6 +195,14 @@ ivas_error ivas_core_enc( { st = sts[n]; +#ifdef IND_LIST_DYN + /*---------------------------------------------------------------------* + * Re-allocate list of indices, if needed + *---------------------------------------------------------------------*/ + + ind_list_realloc( st->hBstr, ivas_format, st->total_brate ); +#endif + /*---------------------------------------------------------------------* * Write signaling info into the bitstream *---------------------------------------------------------------------*/ @@ -263,7 +271,11 @@ ivas_error ivas_core_enc( } else { - stereo_mdct_core_enc( hCPE, old_inp_16k, old_wsp, pitch_buf ); + stereo_mdct_core_enc( hCPE, +#ifdef IND_LIST_DYN + ivas_format, +#endif + old_inp_16k, old_wsp, pitch_buf ); } } else if ( sts[0]->core_brate == SID_2k40 && sts[1]->core_brate == SID_2k40 ) diff --git a/lib_enc/ivas_corecoder_enc_reconfig.c b/lib_enc/ivas_corecoder_enc_reconfig.c index 293462d501..758dd73575 100644 --- a/lib_enc/ivas_corecoder_enc_reconfig.c +++ b/lib_enc/ivas_corecoder_enc_reconfig.c @@ -42,7 +42,6 @@ #endif #include "wmc_auto.h" - /*-------------------------------------------------------------------* * ivas_corecoder_enc_reconfig() * @@ -69,7 +68,8 @@ ivas_error ivas_corecoder_enc_reconfig( Indice *ind_list_metadata; #ifdef IND_LIST_DYN int16_t i, nb_bits; - Indice temp_ind_list[10]; + //int16_t max_num_indices; + Indice temp_ind_list[MAX_NUM_IND_TEMP_LIST]; #endif int16_t nb_bits_tot, next_ind, last_ind; ENCODER_CONFIG_HANDLE hEncoderConfig; @@ -173,7 +173,7 @@ ivas_error ivas_corecoder_enc_reconfig( #ifdef IND_LIST_DYN i = 0; nb_bits = 0; - while ( nb_bits < nb_bits_tot && i < 10 ) + while ( nb_bits < nb_bits_tot && i < MAX_NUM_IND_TEMP_LIST ) { if ( hBstr->ind_list[i].nb_bits > 0 ) { @@ -186,6 +186,12 @@ ivas_error ivas_corecoder_enc_reconfig( i++; } + for ( ; i < MAX_NUM_IND_TEMP_LIST; i++ ) + { + /* reset nb_bits of all other indices to -1 */ + temp_ind_list[i].nb_bits = -1; + } + #ifdef DEBUGGING assert( (nb_bits == nb_bits_tot) && "Error saving bitstream information during core-coder reconfiguration!\n" ); #endif @@ -271,6 +277,30 @@ ivas_error ivas_corecoder_enc_reconfig( copy_encoder_config( st_ivas, st_ivas->hSCE[sce_id]->hCoreCoder[0], 0 ); st_ivas->hSCE[sce_id]->element_brate = brate_SCE; st_ivas->hSCE[sce_id]->hCoreCoder[0]->total_brate = st_ivas->hSCE[sce_id]->element_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ +#ifdef IND_LIST_DYN + ///* set the maximum allowed number of indices in the list */ + //max_num_indices = set_max_num_indices( hEncoderConfig->ivas_format, st_ivas->hSCE[sce_id]->hCoreCoder[0]->total_brate ); + //if ( max_num_indices != st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->max_num_indices ) + //{ + // /* Maximum number of indices has increased -> reallocate buffer of indices */ + // free( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list ); + // st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->max_num_indices = max_num_indices; + // if ( ( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = (INDICE_HANDLE) malloc( max_num_indices * sizeof( Indice ) ) ) == NULL ) + // { + // return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); + // } + + // /* re-fill the buffer of indices with already written indices */ + // i = 0; + // while ( sce_id == 0 && temp_ind_list[i].nb_bits > 0 && i < MAX_NUM_IND_TEMP_LIST ) + // { + // st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list[i].id = temp_ind_list[i].id; + // st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list[i].value = temp_ind_list[i].value; + // st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; + // i++; + // } + //} +#endif } for ( sce_id = nSCE_existing; sce_id < st_ivas->nSCE; sce_id++ ) @@ -286,8 +316,8 @@ ivas_error ivas_corecoder_enc_reconfig( mvr2r( input_buff[sce_id], st_ivas->hSCE[sce_id]->hCoreCoder[0]->input_buff, len_inp_memory ); } - /* allocate buffer of indices */ #ifndef IND_LIST_DYN + /* allocate buffer of indices */ st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list + sce_id * MAX_NUM_INDICES; #endif @@ -308,9 +338,10 @@ ivas_error ivas_corecoder_enc_reconfig( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->nb_bits_tot = nb_bits_tot; st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->next_ind = next_ind; #ifdef IND_LIST_DYN + /* re-fill the buffer of indices with already written indices */ i = 0; nb_bits = 0; - while ( nb_bits < nb_bits_tot && i < 10 ) + while ( nb_bits < nb_bits_tot && i < MAX_NUM_IND_TEMP_LIST ) { if ( temp_ind_list[i].nb_bits > 0 ) { @@ -352,6 +383,31 @@ ivas_error ivas_corecoder_enc_reconfig( copy_encoder_config( st_ivas, st_ivas->hCPE[cpe_id]->hCoreCoder[n], 0 ); st_ivas->hCPE[cpe_id]->hCoreCoder[n]->total_brate = st_ivas->hCPE[cpe_id]->element_brate / ( st_ivas->nCPE > 1 ? 1 : CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ +#ifdef IND_LIST_DYN + ///* set the maximum allowed number of indices in the list */ + //max_num_indices = set_max_num_indices( hEncoderConfig->ivas_format, st_ivas->hCPE[cpe_id]->hCoreCoder[n]->total_brate ); + //if ( max_num_indices != st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->max_num_indices ) + //{ + // /* Maximum number of indices has increased -> reallocate buffer of indices */ + // free( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list ); + // st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->max_num_indices = max_num_indices; + // if ( ( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = (INDICE_HANDLE) malloc( max_num_indices * sizeof( Indice ) ) ) == NULL ) + // { + // return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); + // } + + // /* re-fill the buffer of indices with already written indices */ + // i = 0; + // while ( n == 0 && temp_ind_list[i].nb_bits > 0 && i < MAX_NUM_IND_TEMP_LIST ) + // { + // st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list[i].id = temp_ind_list[i].id; + // st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list[i].value = temp_ind_list[i].value; + // st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; + // i++; + // } + //} +#endif + #ifndef IND_LIST_DYN st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list + ( cpe_id * CPE_CHANNELS + n + st_ivas->nSCE ) * MAX_NUM_INDICES; #endif @@ -373,7 +429,7 @@ ivas_error ivas_corecoder_enc_reconfig( #ifdef IND_LIST_DYN i = 0; nb_bits = 0; - while ( nb_bits < nb_bits_tot && i < 10 ) + while ( nb_bits < nb_bits_tot && i < MAX_NUM_IND_TEMP_LIST ) { if ( temp_ind_list[i].nb_bits > 0 ) { @@ -415,12 +471,12 @@ ivas_error ivas_corecoder_enc_reconfig( } } - /* prepare bitstream buffers */ for ( n = 0; n < CPE_CHANNELS; n++ ) { #ifndef IND_LIST_DYN st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list + ( cpe_id * CPE_CHANNELS + n + st_ivas->nSCE ) * MAX_NUM_INDICES; #endif + /* only reset indices if it is not the first index list, this already contains the IVAS format bits */ if ( cpe_id * CPE_CHANNELS + n > 0 || ( st_ivas->mc_mode == MC_MODE_MCMASA && st_ivas->nSCE > 0 ) ) { reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, @@ -439,7 +495,7 @@ ivas_error ivas_corecoder_enc_reconfig( #ifdef IND_LIST_DYN i = 0; nb_bits = 0; - while ( nb_bits < nb_bits_tot && i < 10 ) + while ( nb_bits < nb_bits_tot && i < MAX_NUM_IND_TEMP_LIST ) { if ( temp_ind_list[i].nb_bits > 0 ) { @@ -491,6 +547,31 @@ ivas_error ivas_corecoder_enc_reconfig( for ( n = 0; n < CPE_CHANNELS; n++ ) { st_ivas->hCPE[0]->hCoreCoder[n]->total_brate = st_ivas->hCPE[0]->element_brate; +#ifdef IND_LIST_DYN + ///* set the maximum allowed number of indices in the list */ + //max_num_indices = set_max_num_indices( hEncoderConfig->ivas_format, st_ivas->hCPE[0]->hCoreCoder[n]->total_brate ); + //if ( max_num_indices != st_ivas->hCPE[0]->hCoreCoder[n]->hBstr->max_num_indices ) + //{ + // /* Maximum number of indices has increased -> reallocate buffer of indices */ + // free( st_ivas->hCPE[0]->hCoreCoder[n]->hBstr->ind_list ); + // st_ivas->hCPE[0]->hCoreCoder[n]->hBstr->max_num_indices = max_num_indices; + // if ( ( st_ivas->hCPE[0]->hCoreCoder[n]->hBstr->ind_list = (INDICE_HANDLE) malloc( max_num_indices * sizeof( Indice ) ) ) == NULL ) + // { + // return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); + // } + + // /* re-fill the buffer of indices with already written indices */ + // i = 0; + // while ( n == 0 && temp_ind_list[i].nb_bits > 0 && i < MAX_NUM_IND_TEMP_LIST ) + // { + // st_ivas->hCPE[0]->hCoreCoder[n]->hBstr->ind_list[i].id = temp_ind_list[i].id; + // st_ivas->hCPE[0]->hCoreCoder[n]->hBstr->ind_list[i].value = temp_ind_list[i].value; + // st_ivas->hCPE[0]->hCoreCoder[n]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; + // i++; + // } + + //} +#endif st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal = (int16_t) ( st_ivas->hCPE[0]->element_brate / FRAMES_PER_SEC ); st_ivas->hCPE[0]->hCoreCoder[n]->igf = getIgfPresent( st_ivas->hCPE[0]->hCoreCoder[n]->element_mode, @@ -535,7 +616,7 @@ ivas_error ivas_corecoder_enc_reconfig( } #ifdef IND_LIST_DYN - /* VM: Check, if this is correct */ + /* TODO VoiceAge: check, if the last multiplication is really * MAX_BITS_METADATA and not MAX_NUM_INDICES */ st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->ind_list = ind_list_metadata + st_ivas->nSCE * MAX_BITS_METADATA; #else st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->ind_list = ind_list_metadata + st_ivas->nSCE * MAX_NUM_INDICES; @@ -568,6 +649,31 @@ ivas_error ivas_corecoder_enc_reconfig( { st_ivas->hCPE[0]->hCoreCoder[n]->total_brate = st_ivas->hCPE[0]->element_brate; +#ifdef IND_LIST_DYN + ///* set the maximum allowed number of indices in the list */ + //max_num_indices = set_max_num_indices( hEncoderConfig->ivas_format, st_ivas->hCPE[0]->hCoreCoder[n]->total_brate ); + //if ( max_num_indices != st_ivas->hCPE[0]->hCoreCoder[n]->hBstr->max_num_indices ) + //{ + // /* Maximum number of indices has increased -> reallocate buffer of indices */ + // free( st_ivas->hCPE[0]->hCoreCoder[n]->hBstr->ind_list ); + // st_ivas->hCPE[0]->hCoreCoder[n]->hBstr->max_num_indices = max_num_indices; + // if ( ( st_ivas->hCPE[0]->hCoreCoder[n]->hBstr->ind_list = (INDICE_HANDLE) malloc( max_num_indices * sizeof( Indice ) ) ) == NULL ) + // { + // return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); + // } + + // /* re-fill the buffer of indices with already written indices */ + // i = 0; + // while ( n == 0 && temp_ind_list[i].nb_bits > 0 && i < MAX_NUM_IND_TEMP_LIST ) + // { + // st_ivas->hCPE[0]->hCoreCoder[n]->hBstr->ind_list[i].id = temp_ind_list[i].id; + // st_ivas->hCPE[0]->hCoreCoder[n]->hBstr->ind_list[i].value = temp_ind_list[i].value; + // st_ivas->hCPE[0]->hCoreCoder[n]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; + // i++; + // } + //} +#endif + st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal = (int16_t) ( st_ivas->hCPE[0]->element_brate / FRAMES_PER_SEC ); st_ivas->hCPE[0]->hCoreCoder[n]->igf = getIgfPresent( st_ivas->hCPE[0]->hCoreCoder[n]->element_mode, st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal * FRAMES_PER_SEC, diff --git a/lib_enc/ivas_stereo_mdct_core_enc.c b/lib_enc/ivas_stereo_mdct_core_enc.c index 9500da4fb9..79659a8f84 100644 --- a/lib_enc/ivas_stereo_mdct_core_enc.c +++ b/lib_enc/ivas_stereo_mdct_core_enc.c @@ -117,6 +117,9 @@ static void sync_tcx_mode( void stereo_mdct_core_enc( CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ +#ifdef IND_LIST_DYN + const int16_t ivas_format, /* i : IVAS format */ +#endif float new_samples[CPE_CHANNELS][L_INP], /* i : new samples */ float old_wsp[CPE_CHANNELS][L_WSP], /* i : 12.8kHz weighted speech (for LTP */ float pitch_buf[CPE_CHANNELS][NB_SUBFR16k] /* o : floating pitch for each subframe */ @@ -179,6 +182,12 @@ void stereo_mdct_core_enc( { st = sts[ch]; SetTCXModeInfo( st, st->hTranDet, &st->hTcxCfg->tcx_curr_overlap_mode ); + +#ifdef IND_LIST_DYN + /* Re-allocate list of indices, if needed (note that st->total_brate is modified later in this function) */ + ind_list_realloc( st->hBstr, ivas_format, st->total_brate ); +#endif + } /* adaptively sync tcx modes*/ -- GitLab From 388c180cebd67ad86e386116bfa89103c3e20aa7 Mon Sep 17 00:00:00 2001 From: malenov Date: Fri, 17 Feb 2023 13:32:04 +0100 Subject: [PATCH 006/331] Allocate ind_list_metadata[] dynamically --- apps/encoder.c | 2 + lib_com/bitstream.c | 193 ++++++++++++++++++++++++-- lib_com/ivas_cnst.h | 2 + lib_com/ivas_prot.h | 8 +- lib_com/options.h | 4 +- lib_com/prot.h | 13 +- lib_enc/init_enc.c | 2 +- lib_enc/ivas_corecoder_enc_reconfig.c | 152 ++++++-------------- lib_enc/ivas_cpe_enc.c | 19 +++ lib_enc/ivas_init_enc.c | 56 ++++---- lib_enc/ivas_ism_metadata_enc.c | 5 +- lib_enc/ivas_sba_enc.c | 8 +- lib_enc/ivas_sce_enc.c | 19 +++ lib_enc/ivas_spar_md_enc.c | 4 +- lib_enc/lib_enc.c | 15 +- 15 files changed, 332 insertions(+), 170 deletions(-) diff --git a/apps/encoder.c b/apps/encoder.c index dec934b511..865b0e67dd 100644 --- a/apps/encoder.c +++ b/apps/encoder.c @@ -50,6 +50,7 @@ #ifdef DEBUG_IND_LIST extern int16_t max_total_num_ind; +extern int16_t max_total_num_ind_metadata; extern int32_t max_at_brate; #endif @@ -745,6 +746,7 @@ int main( #ifdef DEBUG_IND_LIST printf( "\nMaximum total number of indices: %d at bitrate: %d\n", max_total_num_ind, max_at_brate ); + printf( "\nMaximum total number of indices for metadata: %d\n", max_total_num_ind_metadata ); #endif diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index eaca61a681..3aa0f21bac 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -64,6 +64,7 @@ FILE *FEC_pattern = NULL; /* FEC pattern file (for simulation of FEC) */ #ifdef DEBUG_IND_LIST int16_t max_total_num_ind = 0; +int16_t max_total_num_ind_metadata = 0; int32_t max_at_brate; #endif @@ -238,7 +239,7 @@ ivas_error ind_list_realloc( INDICE_HANDLE new_ind_list; /* get the maximum allowed number of indices in the list */ - max_num_indices = set_max_num_indices( ivas_format, total_brate ); + max_num_indices = get_max_num_indices( ivas_format, total_brate ); /* check, if the maximum number of allowed indices has changed */ if ( max_num_indices != hBstr->max_num_indices ) @@ -278,14 +279,71 @@ ivas_error ind_list_realloc( return IVAS_ERR_OK; } -#ifdef IND_LIST_DYN +/*-------------------------------------------------------------------* + * ind_list_metadata_realloc() + * + * Re-allocate list of metadata indices if the IVAS total bitrate has changed + *-------------------------------------------------------------------*/ + +ivas_error ind_list_metadata_realloc( + BSTR_ENC_HANDLE hMetaData, /* i/o: encoder bitstream handle */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +) +{ + int16_t i, max_num_indices_metadata; + INDICE_HANDLE new_ind_list_metadata; + + if ( hMetaData != NULL && hMetaData->ind_list != NULL ) + { + /* get the maximum allowed number of indices in the list */ + max_num_indices_metadata = get_max_num_indices_metadata( ivas_format, ivas_total_brate ); + + /* check, if the maximum number of allowed indices has changed */ + if ( max_num_indices_metadata != hMetaData->max_num_indices ) + { + /* allocate new buffer of metadata indices */ + if ( ( new_ind_list_metadata = (INDICE_HANDLE) malloc( max_num_indices_metadata * sizeof( Indice ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of metadata indices!\n" ) ); + } + + /* move indices from the old list to the new list */ + i = 0; + while ( hMetaData->ind_list[i].nb_bits > 0 ) + { + new_ind_list_metadata[i].id = hMetaData->ind_list[i].id; + new_ind_list_metadata[i].value = hMetaData->ind_list[i].value; + new_ind_list_metadata[i].nb_bits = hMetaData->ind_list[i].nb_bits; + i++; + } + + /* reset nb_bits of all other indices to -1 */ + for ( ; i < max_num_indices_metadata; i++ ) + { + new_ind_list_metadata[i].nb_bits = -1; + } + + /* free the old list */ + free( hMetaData->ind_list ); + + /* set pointer to the new list */ + hMetaData->ind_list = new_ind_list_metadata; + + /* set the new maximum for the allowed number of indices */ + hMetaData->max_num_indices = max_num_indices_metadata; + } + } + + return IVAS_ERR_OK; +} /*-----------------------------------------------------------------------* - * set_max_num_indices() + * get_max_num_indices() * * Set the maximum allowed number of indices in the list *-----------------------------------------------------------------------*/ -int16_t set_max_num_indices( /* o : maximum number of indices */ +int16_t get_max_num_indices( /* o : maximum number of indices */ const IVAS_FORMAT ivas_format, /* i : IVAS format */ const int32_t total_brate /* i : total bitrate */ ) @@ -376,6 +434,88 @@ int16_t set_max_num_indices( /* o : maximum number of indices */ return 1050; } + +#ifdef IND_LIST_DYN +/*-----------------------------------------------------------------------* + * set_max_set_max_num_indices_metadatanum_indices() + * + * Set the maximum allowed number of metadata indices in the list + *-----------------------------------------------------------------------*/ + +int16_t get_max_num_indices_metadata( /* o : maximum number of indices */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +) +{ + /* set the maximum required number of metadata indices */ + if ( ivas_format == MONO_FORMAT ) + { + return 0; + } + else if ( ivas_format == STEREO_FORMAT ) + { + return 80; + } + else if ( ivas_format == ISM_FORMAT ) + { + return 60; + } + else if ( ivas_format == SBA_FORMAT ) + { + if ( ivas_total_brate < IVAS_24k4 ) + { + return 80; + } + else if ( ivas_total_brate < IVAS_48k ) + { + return 670; + } + else + { + return 1060; + } + } + else if ( ivas_format == MASA_FORMAT ) + { + if ( ivas_total_brate < IVAS_32k ) + { + return 80; + } + else if ( ivas_total_brate < IVAS_48k ) + { + return 110; + } + else if ( ivas_total_brate < IVAS_192k ) + { + return 330; + } + else if ( ivas_total_brate < IVAS_384k ) + { + return 1000; + } + else + { + return 1950; + } + } + else if ( ivas_format == MC_FORMAT ) + { + if ( ivas_total_brate == IVAS_32k || ivas_total_brate == IVAS_48k || ivas_total_brate == IVAS_64k ) + { + return 300; + } + if ( ivas_total_brate == IVAS_80k || ivas_total_brate == IVAS_96k ) + { + return 170; + } + else + { + return 90; + } + } + + return 1050; +} #endif #endif @@ -1119,6 +1259,10 @@ static ivas_error write_indices_element( uint16_t *pt_stream_backup; uint16_t *pt_stream_end; int16_t nb_bits_tot_metadata; +#ifdef IND_LIST_DYN + int16_t nb_ind_tot_metadata; +#endif + Indice *ind_list_metadata; int16_t n, n_channels; #ifdef ENABLE_BITRATE_VERIFICATION @@ -1129,6 +1273,9 @@ static ivas_error write_indices_element( error = IVAS_ERR_OK; ind_list_metadata = NULL; +#ifdef IND_LIST_DYN + nb_ind_tot_metadata = 0; +#endif if ( st_ivas->hEncoderConfig->ivas_format == MONO_FORMAT ) { @@ -1146,6 +1293,9 @@ static ivas_error write_indices_element( { nb_bits_tot_metadata = st_ivas->hSCE[element_id]->hMetaData->nb_bits_tot; ind_list_metadata = st_ivas->hSCE[element_id]->hMetaData->ind_list; +#ifdef IND_LIST_DYN + nb_ind_tot_metadata = st_ivas->hSCE[element_id]->hMetaData->nb_ind_tot; +#endif } } else if ( !is_SCE && st_ivas->hCPE[element_id] != NULL ) @@ -1156,6 +1306,9 @@ static ivas_error write_indices_element( { nb_bits_tot_metadata = st_ivas->hCPE[element_id]->hMetaData->nb_bits_tot; ind_list_metadata = st_ivas->hCPE[element_id]->hMetaData->ind_list; +#ifdef IND_LIST_DYN + nb_ind_tot_metadata = st_ivas->hCPE[element_id]->hMetaData->nb_ind_tot; +#endif } } #ifdef DEBUGGING @@ -1196,7 +1349,13 @@ static ivas_error write_indices_element( #ifdef ENABLE_BITRATE_VERIFICATION total_nb_bits = #endif - write_indices_to_stream( ind_list_metadata, &pt_stream_loc, -1, MAX_BITS_METADATA ); + write_indices_to_stream( ind_list_metadata, &pt_stream_loc, -1, +#ifdef IND_LIST_DYN + nb_ind_tot_metadata +#else + MAX_BITS_METADATA +#endif + ); #ifdef ENABLE_BITRATE_VERIFICATION if ( total_nb_bits != nb_bits_tot_metadata ) @@ -1245,9 +1404,17 @@ static ivas_error write_indices_element( { if ( st_ivas->hSCE[element_id]->hMetaData != NULL ) { - reset_indices_enc( st_ivas->hSCE[element_id]->hMetaData, MAX_BITS_METADATA ); +#ifdef DEBUG_IND_LIST + /* find the maximum number of metadata indices */ + if ( st_ivas->hSCE[element_id]->hMetaData->nb_ind_tot > max_total_num_ind_metadata ) + { + max_total_num_ind_metadata = st_ivas->hSCE[element_id]->hMetaData->nb_ind_tot; + } +#endif #ifdef IND_LIST_DYN - st_ivas->hSCE[element_id]->hMetaData->max_num_indices = MAX_BITS_METADATA; + reset_indices_enc( st_ivas->hSCE[element_id]->hMetaData, st_ivas->hSCE[element_id]->hMetaData->max_num_indices ); +#else + reset_indices_enc( st_ivas->hSCE[element_id]->hMetaData, MAX_BITS_METADATA ); #endif } @@ -1272,9 +1439,17 @@ static ivas_error write_indices_element( { if ( st_ivas->hCPE[element_id]->hMetaData != NULL ) { - reset_indices_enc( st_ivas->hCPE[element_id]->hMetaData, MAX_BITS_METADATA ); +#ifdef DEBUG_IND_LIST + /* find the maximum number of metadata indices */ + if ( st_ivas->hCPE[element_id]->hMetaData->nb_ind_tot > max_total_num_ind_metadata ) + { + max_total_num_ind_metadata = st_ivas->hCPE[element_id]->hMetaData->nb_ind_tot; + } +#endif #ifdef IND_LIST_DYN - st_ivas->hCPE[element_id]->hMetaData->max_num_indices = MAX_BITS_METADATA; + reset_indices_enc( st_ivas->hCPE[element_id]->hMetaData, st_ivas->hCPE[element_id]->hMetaData->max_num_indices ); +#else + reset_indices_enc( st_ivas->hCPE[element_id]->hMetaData, MAX_BITS_METADATA ); #endif } diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 62848e5066..9e81a2a32d 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -177,7 +177,9 @@ typedef enum #define MAX_CPE ( MAX_TRANSPORT_CHANNELS / CPE_CHANNELS ) /* max. number of CPEs */ #define MAX_BITS_METADATA 2640 /* max. bit-budget of metadata, one channel */ /* IVAS_fmToDo: to be confirmed for final value once mature */ +#ifndef IND_LIST_DYN #define MAX_NUM_METADATA max( 2, MAX_NUM_OBJECTS ) /* number of max. metadata (now only 2 for DirAC) */ +#endif #ifdef IND_LIST_DYN #define MAX_NUM_IND_TEMP_LIST 10 /* maximum number of indices in the temporary list */ diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 29aa795a56..70d71e0159 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -284,11 +284,13 @@ void ivas_initialize_handles_enc( ); ivas_error ivas_init_encoder( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +#ifndef IND_LIST_DYN + ,Indice ind_list[][MAX_NUM_INDICES] /* i : indices list */ +#endif #ifndef IND_LIST_DYN - Indice ind_list[][MAX_NUM_INDICES], /* i : indices list */ + ,Indice ind_list_metadata[][MAX_BITS_METADATA] /* i : indices list metadata */ #endif - Indice ind_list_metadata[][MAX_BITS_METADATA] /* i : indices list metadata */ ); void destroy_core_enc( diff --git a/lib_com/options.h b/lib_com/options.h index 603a041ded..6ea15c2b48 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -56,9 +56,9 @@ /*#define WMOPS_WC_FRAME_ANALYSIS*/ /* Output detailed complexity analysis for the worst-case frame */ /*#define MEM_COUNT_DETAILS*/ /* Output detailed memory analysis for the worst-case frame (writes to the file "mem_analysis.csv") */ -/*#define BITSTREAM_INDICES_MEMORY*/ /* Don't count memory for bitstream Indice at the encoder - it is a temporary solution for development only */ +/*#define BITSTREAM_INDICES_MEMORY*/ /* Don't count memory for bitstream Indice at the encoder - it is a temporary solution for development only */ #define IND_LIST_DYN /* dynamic allocation of ind_list based on transport channels */ -#define DEBUG_IND_LIST +/*#define DEBUG_IND_LIST*/ #ifdef DEBUGGING diff --git a/lib_com/prot.h b/lib_com/prot.h index 2740a305fd..f1740e2e95 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -516,17 +516,28 @@ void push_next_bits( ); #ifdef IND_LIST_DYN -int16_t set_max_num_indices( /* o : maximum number of indices */ +int16_t get_max_num_indices( /* o : maximum number of indices */ const IVAS_FORMAT ivas_format, /* i : IVAS format */ const int32_t total_brate /* i : total bitrate */ ); +int16_t get_max_num_indices_metadata( /* o : maximum number of indices */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +); + ivas_error ind_list_realloc( BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ const IVAS_FORMAT ivas_format, /* i : IVAS format */ const int32_t total_brate /* i : total bitrate */ ); +ivas_error ind_list_metadata_realloc( + BSTR_ENC_HANDLE hMetaData, /* i/o: encoder bitstream handle */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +); + int16_t find_indice( /* o : index of the indice in the list, -1 if not found */ BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ int16_t id, /* i : ID of the indice */ diff --git a/lib_enc/init_enc.c b/lib_enc/init_enc.c index 10be4e86f4..b7ec66ad53 100644 --- a/lib_enc/init_enc.c +++ b/lib_enc/init_enc.c @@ -117,7 +117,7 @@ ivas_error init_encoder( #ifdef IND_LIST_DYN /* set the maximum allowed number of indices in the list */ - st->hBstr->max_num_indices = set_max_num_indices( hEncoderConfig->ivas_format, st->total_brate ); + st->hBstr->max_num_indices = get_max_num_indices( hEncoderConfig->ivas_format, st->total_brate ); /* allocate buffer of indices */ if ( ( st->hBstr->ind_list = (INDICE_HANDLE) malloc( st->hBstr->max_num_indices * sizeof( Indice ) ) ) == NULL ) diff --git a/lib_enc/ivas_corecoder_enc_reconfig.c b/lib_enc/ivas_corecoder_enc_reconfig.c index 758dd73575..fe8b751166 100644 --- a/lib_enc/ivas_corecoder_enc_reconfig.c +++ b/lib_enc/ivas_corecoder_enc_reconfig.c @@ -61,14 +61,16 @@ ivas_error ivas_corecoder_enc_reconfig( int16_t n, sce_id, cpe_id; int16_t len_inp_memory, n_CoreCoder_existing, nSCE_existing, nCPE_existing; float input_buff[MCT_MAX_BLOCKS][L_FRAME48k + NS2SA( 48000, IVAS_FB_ENC_DELAY_NS )]; - BSTR_ENC_HANDLE hBstr, hMetaData; + BSTR_ENC_HANDLE hBstr; #ifndef IND_LIST_DYN Indice *ind_list; #endif +#ifndef IND_LIST_DYN Indice *ind_list_metadata; + BSTR_ENC_HANDLE hMetaData; +#endif #ifdef IND_LIST_DYN int16_t i, nb_bits; - //int16_t max_num_indices; Indice temp_ind_list[MAX_NUM_IND_TEMP_LIST]; #endif int16_t nb_bits_tot, next_ind, last_ind; @@ -99,6 +101,10 @@ ivas_error ivas_corecoder_enc_reconfig( copy_encoder_config( st_ivas, st_ivas->hSCE[sce_id]->hCoreCoder[0], 0 ); st_ivas->hSCE[sce_id]->element_brate = brate_SCE; st_ivas->hSCE[sce_id]->hCoreCoder[0]->total_brate = st_ivas->hSCE[sce_id]->element_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ +#ifdef IND_LIST_DYN + /* re-allocate list of metadata indices, if needed */ + ind_list_metadata_realloc( st_ivas->hSCE[sce_id]->hMetaData, hEncoderConfig->ivas_format, hEncoderConfig->ivas_total_brate ); +#endif } for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) @@ -111,6 +117,10 @@ ivas_error ivas_corecoder_enc_reconfig( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->total_brate = st_ivas->hCPE[cpe_id]->element_brate / ( st_ivas->nCPE > 1 ? 1 : CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ } +#ifdef IND_LIST_DYN + /* re-allocate list of metadata indices, if needed */ + ind_list_metadata_realloc( st_ivas->hCPE[cpe_id]->hMetaData, hEncoderConfig->ivas_format, hEncoderConfig->ivas_total_brate ); +#endif } if ( st_ivas->nCPE > 1 ) @@ -143,18 +153,24 @@ ivas_error ivas_corecoder_enc_reconfig( ind_list_metadata = NULL; #endif hBstr = NULL; +#ifndef IND_LIST_DYN hMetaData = NULL; +#endif /* get the index list pointers */ if ( nSCE_old ) { hBstr = st_ivas->hSCE[0]->hCoreCoder[0]->hBstr; +#ifndef IND_LIST_DYN hMetaData = st_ivas->hSCE[0]->hMetaData; +#endif } else if ( nCPE_old ) { hBstr = st_ivas->hCPE[0]->hCoreCoder[0]->hBstr; +#ifndef IND_LIST_DYN hMetaData = st_ivas->hCPE[nCPE_old - 1]->hMetaData; +#endif } #ifdef DEBUGGING else @@ -196,7 +212,9 @@ ivas_error ivas_corecoder_enc_reconfig( assert( (nb_bits == nb_bits_tot) && "Error saving bitstream information during core-coder reconfiguration!\n" ); #endif #endif +#ifndef IND_LIST_DYN ind_list_metadata = hMetaData->ind_list; /* pointer to the beginning of the global list */ +#endif if ( hEncoderConfig->ivas_format == MC_FORMAT && last_mc_mode == MC_MODE_MCMASA && st_ivas->mc_mode == MC_MODE_MCMASA ) { @@ -277,30 +295,6 @@ ivas_error ivas_corecoder_enc_reconfig( copy_encoder_config( st_ivas, st_ivas->hSCE[sce_id]->hCoreCoder[0], 0 ); st_ivas->hSCE[sce_id]->element_brate = brate_SCE; st_ivas->hSCE[sce_id]->hCoreCoder[0]->total_brate = st_ivas->hSCE[sce_id]->element_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ -#ifdef IND_LIST_DYN - ///* set the maximum allowed number of indices in the list */ - //max_num_indices = set_max_num_indices( hEncoderConfig->ivas_format, st_ivas->hSCE[sce_id]->hCoreCoder[0]->total_brate ); - //if ( max_num_indices != st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->max_num_indices ) - //{ - // /* Maximum number of indices has increased -> reallocate buffer of indices */ - // free( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list ); - // st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->max_num_indices = max_num_indices; - // if ( ( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = (INDICE_HANDLE) malloc( max_num_indices * sizeof( Indice ) ) ) == NULL ) - // { - // return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); - // } - - // /* re-fill the buffer of indices with already written indices */ - // i = 0; - // while ( sce_id == 0 && temp_ind_list[i].nb_bits > 0 && i < MAX_NUM_IND_TEMP_LIST ) - // { - // st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list[i].id = temp_ind_list[i].id; - // st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list[i].value = temp_ind_list[i].value; - // st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; - // i++; - // } - //} -#endif } for ( sce_id = nSCE_existing; sce_id < st_ivas->nSCE; sce_id++ ) @@ -360,12 +354,10 @@ ivas_error ivas_corecoder_enc_reconfig( #endif } +#ifndef IND_LIST_DYN st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata + sce_id * MAX_BITS_METADATA; reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA ); -#ifdef IND_LIST_DYN - st_ivas->hSCE[sce_id]->hMetaData->max_num_indices = MAX_BITS_METADATA; #endif - } } @@ -383,31 +375,6 @@ ivas_error ivas_corecoder_enc_reconfig( copy_encoder_config( st_ivas, st_ivas->hCPE[cpe_id]->hCoreCoder[n], 0 ); st_ivas->hCPE[cpe_id]->hCoreCoder[n]->total_brate = st_ivas->hCPE[cpe_id]->element_brate / ( st_ivas->nCPE > 1 ? 1 : CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ -#ifdef IND_LIST_DYN - ///* set the maximum allowed number of indices in the list */ - //max_num_indices = set_max_num_indices( hEncoderConfig->ivas_format, st_ivas->hCPE[cpe_id]->hCoreCoder[n]->total_brate ); - //if ( max_num_indices != st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->max_num_indices ) - //{ - // /* Maximum number of indices has increased -> reallocate buffer of indices */ - // free( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list ); - // st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->max_num_indices = max_num_indices; - // if ( ( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = (INDICE_HANDLE) malloc( max_num_indices * sizeof( Indice ) ) ) == NULL ) - // { - // return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); - // } - - // /* re-fill the buffer of indices with already written indices */ - // i = 0; - // while ( n == 0 && temp_ind_list[i].nb_bits > 0 && i < MAX_NUM_IND_TEMP_LIST ) - // { - // st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list[i].id = temp_ind_list[i].id; - // st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list[i].value = temp_ind_list[i].value; - // st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; - // i++; - // } - //} -#endif - #ifndef IND_LIST_DYN st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list + ( cpe_id * CPE_CHANNELS + n + st_ivas->nSCE ) * MAX_NUM_INDICES; #endif @@ -547,32 +514,6 @@ ivas_error ivas_corecoder_enc_reconfig( for ( n = 0; n < CPE_CHANNELS; n++ ) { st_ivas->hCPE[0]->hCoreCoder[n]->total_brate = st_ivas->hCPE[0]->element_brate; -#ifdef IND_LIST_DYN - ///* set the maximum allowed number of indices in the list */ - //max_num_indices = set_max_num_indices( hEncoderConfig->ivas_format, st_ivas->hCPE[0]->hCoreCoder[n]->total_brate ); - //if ( max_num_indices != st_ivas->hCPE[0]->hCoreCoder[n]->hBstr->max_num_indices ) - //{ - // /* Maximum number of indices has increased -> reallocate buffer of indices */ - // free( st_ivas->hCPE[0]->hCoreCoder[n]->hBstr->ind_list ); - // st_ivas->hCPE[0]->hCoreCoder[n]->hBstr->max_num_indices = max_num_indices; - // if ( ( st_ivas->hCPE[0]->hCoreCoder[n]->hBstr->ind_list = (INDICE_HANDLE) malloc( max_num_indices * sizeof( Indice ) ) ) == NULL ) - // { - // return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); - // } - - // /* re-fill the buffer of indices with already written indices */ - // i = 0; - // while ( n == 0 && temp_ind_list[i].nb_bits > 0 && i < MAX_NUM_IND_TEMP_LIST ) - // { - // st_ivas->hCPE[0]->hCoreCoder[n]->hBstr->ind_list[i].id = temp_ind_list[i].id; - // st_ivas->hCPE[0]->hCoreCoder[n]->hBstr->ind_list[i].value = temp_ind_list[i].value; - // st_ivas->hCPE[0]->hCoreCoder[n]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; - // i++; - // } - - //} -#endif - st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal = (int16_t) ( st_ivas->hCPE[0]->element_brate / FRAMES_PER_SEC ); st_ivas->hCPE[0]->hCoreCoder[n]->igf = getIgfPresent( st_ivas->hCPE[0]->hCoreCoder[n]->element_mode, st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal * FRAMES_PER_SEC, @@ -604,7 +545,7 @@ ivas_error ivas_corecoder_enc_reconfig( } } - /* metadata handling for CPEs */ + /* alllocate buffer for metadata indices */ if ( st_ivas->nCPE > 0 ) { if ( st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData == NULL ) @@ -613,23 +554,36 @@ ivas_error ivas_corecoder_enc_reconfig( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MetaData structure\n" ) ); } + +#ifdef IND_LIST_DYN + /* set the maximum allowed number of metadata indices in the list */ + st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->max_num_indices = get_max_num_indices_metadata( hEncoderConfig->ivas_total_brate, hEncoderConfig->ivas_format ); + + /* allocate buffer of metadata indices */ + if ( ( st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->ind_list = (INDICE_HANDLE) malloc( st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->max_num_indices * sizeof( Indice ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); + } +#endif } #ifdef IND_LIST_DYN - /* TODO VoiceAge: check, if the last multiplication is really * MAX_BITS_METADATA and not MAX_NUM_INDICES */ - st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->ind_list = ind_list_metadata + st_ivas->nSCE * MAX_BITS_METADATA; + reset_indices_enc( st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData, st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->max_num_indices ); #else st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->ind_list = ind_list_metadata + st_ivas->nSCE * MAX_NUM_INDICES; -#endif reset_indices_enc( st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData, MAX_BITS_METADATA ); -#ifdef IND_LIST_DYN - st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->max_num_indices = MAX_BITS_METADATA; #endif for ( cpe_id = 0; cpe_id < st_ivas->nCPE - 1; cpe_id++ ) { if ( st_ivas->hCPE[cpe_id]->hMetaData != NULL ) { +#ifdef IND_LIST_DYN + if ( st_ivas->hCPE[cpe_id]->hMetaData->ind_list != NULL ) + { + free( st_ivas->hCPE[cpe_id]->hMetaData->ind_list ); + } +#endif free( st_ivas->hCPE[cpe_id]->hMetaData ); st_ivas->hCPE[cpe_id]->hMetaData = NULL; } @@ -648,32 +602,6 @@ ivas_error ivas_corecoder_enc_reconfig( for ( n = 0; n < CPE_CHANNELS; n++ ) { st_ivas->hCPE[0]->hCoreCoder[n]->total_brate = st_ivas->hCPE[0]->element_brate; - -#ifdef IND_LIST_DYN - ///* set the maximum allowed number of indices in the list */ - //max_num_indices = set_max_num_indices( hEncoderConfig->ivas_format, st_ivas->hCPE[0]->hCoreCoder[n]->total_brate ); - //if ( max_num_indices != st_ivas->hCPE[0]->hCoreCoder[n]->hBstr->max_num_indices ) - //{ - // /* Maximum number of indices has increased -> reallocate buffer of indices */ - // free( st_ivas->hCPE[0]->hCoreCoder[n]->hBstr->ind_list ); - // st_ivas->hCPE[0]->hCoreCoder[n]->hBstr->max_num_indices = max_num_indices; - // if ( ( st_ivas->hCPE[0]->hCoreCoder[n]->hBstr->ind_list = (INDICE_HANDLE) malloc( max_num_indices * sizeof( Indice ) ) ) == NULL ) - // { - // return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); - // } - - // /* re-fill the buffer of indices with already written indices */ - // i = 0; - // while ( n == 0 && temp_ind_list[i].nb_bits > 0 && i < MAX_NUM_IND_TEMP_LIST ) - // { - // st_ivas->hCPE[0]->hCoreCoder[n]->hBstr->ind_list[i].id = temp_ind_list[i].id; - // st_ivas->hCPE[0]->hCoreCoder[n]->hBstr->ind_list[i].value = temp_ind_list[i].value; - // st_ivas->hCPE[0]->hCoreCoder[n]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; - // i++; - // } - //} -#endif - st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal = (int16_t) ( st_ivas->hCPE[0]->element_brate / FRAMES_PER_SEC ); st_ivas->hCPE[0]->hCoreCoder[n]->igf = getIgfPresent( st_ivas->hCPE[0]->hCoreCoder[n]->element_mode, st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal * FRAMES_PER_SEC, diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index 25b74bba1c..01bb3a6171 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -810,6 +810,19 @@ ivas_error create_cpe_enc( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MetaData structure\n" ) ); } + +#ifdef IND_LIST_DYN + /* set the maximum allowed number of indices in the list */ + hCPE->hMetaData->max_num_indices = get_max_num_indices_metadata( hEncoderConfig->ivas_format, hEncoderConfig->ivas_total_brate ); + + /* allocate buffer of metadata indices */ + if ( ( hCPE->hMetaData->ind_list = (INDICE_HANDLE) malloc( hCPE->hMetaData->max_num_indices * sizeof( Indice ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); + } + + reset_indices_enc( hCPE->hMetaData, hCPE->hMetaData->max_num_indices ); +#endif } /*-----------------------------------------------------------------* @@ -1007,6 +1020,12 @@ void destroy_cpe_enc( if ( hCPE->hMetaData != NULL ) { +#ifdef IND_LIST_DYN + if ( hCPE->hMetaData->ind_list != NULL ) + { + free( hCPE->hMetaData->ind_list ); + } +#endif free( hCPE->hMetaData ); hCPE->hMetaData = NULL; } diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index 692c410f32..fbaa1ad65d 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -310,11 +310,13 @@ void ivas_initialize_handles_enc( *-------------------------------------------------------------------*/ ivas_error ivas_init_encoder( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ #ifndef IND_LIST_DYN - Indice ind_list[][MAX_NUM_INDICES], /* o : bitstream indices */ + ,Indice ind_list[][MAX_NUM_INDICES] /* o : bitstream indices */ +#endif +#ifndef IND_LIST_DYN + ,Indice ind_list_metadata[][MAX_BITS_METADATA] /* o : bitstream indices metadata */ #endif - Indice ind_list_metadata[][MAX_BITS_METADATA] /* o : bitstream indices metadata */ ) { int16_t i, n; @@ -391,20 +393,19 @@ ivas_error ivas_init_encoder( return error; } +#ifndef IND_LIST_DYN /* allocate buffer of indices */ for ( n = 0; n < CPE_CHANNELS; n++ ) { -#ifndef IND_LIST_DYN st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[n]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); -#endif } +#endif +#ifndef IND_LIST_DYN /* MetaData for DFT stereo */ st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[0]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA ); -#ifdef IND_LIST_DYN - st_ivas->hCPE[cpe_id]->hMetaData->max_num_indices = MAX_BITS_METADATA; #endif } else if ( ivas_format == ISM_FORMAT ) @@ -425,15 +426,15 @@ ivas_error ivas_init_encoder( return error; } + /* MetaData for ISMs */ #ifndef IND_LIST_DYN st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); #endif +#ifndef IND_LIST_DYN st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA ); -#ifdef IND_LIST_DYN - st_ivas->hSCE[sce_id]->hMetaData->max_num_indices = MAX_BITS_METADATA; #endif } @@ -487,15 +488,15 @@ ivas_error ivas_init_encoder( return error; } + /* MetaData for SBA */ #ifndef IND_LIST_DYN st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); #endif +#ifndef IND_LIST_DYN st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA ); -#ifdef IND_LIST_DYN - st_ivas->hSCE[sce_id]->hMetaData->max_num_indices = MAX_BITS_METADATA; #endif if ( st_ivas->sba_mode == SBA_MODE_SPAR && st_ivas->hEncoderConfig->Opt_DTX_ON ) @@ -511,7 +512,6 @@ ivas_error ivas_init_encoder( return error; } - /* allocate buffer of indices */ for ( n = 0; n < CPE_CHANNELS; n++ ) { #ifndef IND_LIST_DYN @@ -525,15 +525,14 @@ ivas_error ivas_init_encoder( } } +#ifndef IND_LIST_DYN /* Metadata only initialized for the last CPE index */ if ( cpe_id == st_ivas->nCPE - 1 ) { st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[st_ivas->nSCE]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA ); -#ifdef IND_LIST_DYN - st_ivas->hCPE[cpe_id]->hMetaData->max_num_indices = MAX_BITS_METADATA; -#endif } +#endif } if ( st_ivas->nCPE > 1 ) @@ -562,26 +561,25 @@ ivas_error ivas_init_encoder( return error; } +#ifndef IND_LIST_DYN /* allocate buffer of indices */ for ( n = 0; n < CPE_CHANNELS; n++ ) { /* we need the correct bitstream also for the LFE channel since it might become a proper coded channel when switching to ParamMC and ind_list is only visible here, can't be done later */ -#ifndef IND_LIST_DYN st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[cpe_id * CPE_CHANNELS + n]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); -#endif } +#endif +#ifndef IND_LIST_DYN /* Metadata only initialized for the last CPE index*/ if ( cpe_id == st_ivas->nCPE - 1 ) { st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[st_ivas->nSCE]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA ); -#ifdef IND_LIST_DYN - st_ivas->hCPE[cpe_id]->hMetaData->max_num_indices = MAX_BITS_METADATA; -#endif } +#endif } if ( ( error = create_mct_enc( st_ivas ) ) != IVAS_ERR_OK ) @@ -610,24 +608,23 @@ ivas_error ivas_init_encoder( return error; } +#ifndef IND_LIST_DYN /* allocate buffer of indices */ for ( n = 0; n < CPE_CHANNELS; n++ ) { -#ifndef IND_LIST_DYN st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[cpe_id * CPE_CHANNELS + n]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); -#endif } +#endif +#ifndef IND_LIST_DYN /* Metadata only initialized for the last CPE index*/ if ( cpe_id == st_ivas->nCPE - 1 ) { st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[st_ivas->nSCE]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA ); -#ifdef IND_LIST_DYN - st_ivas->hCPE[cpe_id]->hMetaData->max_num_indices = MAX_BITS_METADATA; -#endif } +#endif } if ( st_ivas->nCPE > 1 ) @@ -673,11 +670,9 @@ ivas_error ivas_init_encoder( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); #endif - +#ifndef IND_LIST_DYN st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA ); -#ifdef IND_LIST_DYN - st_ivas->hSCE[sce_id]->hMetaData->max_num_indices = MAX_BITS_METADATA; #endif } @@ -699,15 +694,14 @@ ivas_error ivas_init_encoder( } #endif +#ifndef IND_LIST_DYN /* Metadata only initialized for the last CPE index*/ if ( cpe_id == st_ivas->nCPE - 1 ) { st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[st_ivas->nSCE]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA ); -#ifdef IND_LIST_DYN - st_ivas->hCPE[cpe_id]->hMetaData->max_num_indices = MAX_BITS_METADATA; -#endif } +#endif } } } diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index d735777baa..1e3c3af723 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -713,9 +713,10 @@ ivas_error ivas_ism_metadata_enc( /* write metadata only in active frames */ if ( hSCE[0]->hCoreCoder[0]->core_brate > SID_2k40 ) { - reset_indices_enc( hSCE[ch]->hMetaData, MAX_BITS_METADATA ); #ifdef IND_LIST_DYN - hSCE[ch]->hMetaData->max_num_indices = MAX_BITS_METADATA; + reset_indices_enc( hSCE[ch]->hMetaData, hSCE[ch]->hMetaData->max_num_indices ); +#else + reset_indices_enc( hSCE[ch]->hMetaData, MAX_BITS_METADATA ); #endif } } diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index a04d1d4cc2..01098f45d3 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -250,10 +250,9 @@ ivas_error ivas_sba_enc_reinit( reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); #endif +#ifndef IND_LIST_DYN st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata + sce_id * MAX_BITS_METADATA; reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA ); -#ifdef IND_LIST_DYN - st_ivas->hSCE[sce_id]->hMetaData->max_num_indices = MAX_BITS_METADATA; #endif if ( st_ivas->sba_mode == SBA_MODE_SPAR && st_ivas->hEncoderConfig->Opt_DTX_ON ) @@ -285,15 +284,14 @@ ivas_error ivas_sba_enc_reinit( } } +#ifndef IND_LIST_DYN /* Metadata only initialized for the last CPE index */ if ( cpe_id == st_ivas->nCPE - 1 ) { st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata + sce_id * MAX_BITS_METADATA; reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA ); -#ifdef IND_LIST_DYN - st_ivas->hCPE[cpe_id]->hMetaData->max_num_indices = MAX_BITS_METADATA; -#endif } +#endif } if ( st_ivas->nCPE > 1 ) diff --git a/lib_enc/ivas_sce_enc.c b/lib_enc/ivas_sce_enc.c index d19c3f5460..b156ba05c9 100644 --- a/lib_enc/ivas_sce_enc.c +++ b/lib_enc/ivas_sce_enc.c @@ -309,6 +309,19 @@ ivas_error create_sce_enc( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MetaData structure\n" ) ); } + +#ifdef IND_LIST_DYN + /* set the maximum allowed number of indices in the list */ + hSCE->hMetaData->max_num_indices = get_max_num_indices_metadata( st_ivas->hEncoderConfig->ivas_format, st_ivas->hEncoderConfig->ivas_total_brate ); + + /* allocate buffer of metadata indices */ + if ( ( hSCE->hMetaData->ind_list = (INDICE_HANDLE) malloc( hSCE->hMetaData->max_num_indices * sizeof( Indice ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); + } + + reset_indices_enc( hSCE->hMetaData, hSCE->hMetaData->max_num_indices ); +#endif } else { @@ -368,6 +381,12 @@ void destroy_sce_enc( if ( hSCE->hMetaData != NULL ) { +#ifdef IND_LIST_DYN + if ( hSCE->hMetaData->ind_list != NULL ) + { + free( hSCE->hMetaData->ind_list ); + } +#endif free( hSCE->hMetaData ); hSCE->hMetaData = NULL; } diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index 3602c2be68..77c0c9c063 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -879,9 +879,11 @@ ivas_error ivas_spar_md_enc_process( strat = cs[i]; if ( strat != NO_STRAT ) { - reset_indices_enc( &hMetaData_tmp, MAX_BITS_METADATA ); #ifdef IND_LIST_DYN hMetaData_tmp.max_num_indices = MAX_BITS_METADATA; + reset_indices_enc( &hMetaData_tmp, hMetaData_tmp.max_num_indices ); +#else + reset_indices_enc( &hMetaData_tmp, MAX_BITS_METADATA ); #endif ivas_write_spar_md_bitstream( hMdEnc, num_bands, bands_bw, &hMetaData_tmp, hEncoderConfig->ivas_total_brate, strat, qsi, planarCP ); diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 686e6393ac..55186f1ecc 100644 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -51,7 +51,9 @@ struct IVAS_ENC #ifndef IND_LIST_DYN Indice ind_list[MAX_NUM_DATA][MAX_NUM_INDICES]; /* list of indices */ #endif +#ifndef IND_LIST_DYN Indice ind_list_metadata[MAX_NUM_METADATA][MAX_BITS_METADATA]; /* list of indices for metadata */ +#endif ENC_CORE_HANDLE hCoreCoder; bool isConfigured; #ifdef DEBUGGING @@ -101,7 +103,9 @@ ivas_error IVAS_ENC_Open( ) { Encoder_Struct *st_ivas; +#ifndef IND_LIST_DYN int16_t i, j; +#endif if ( phIvasEnc == NULL ) { @@ -147,6 +151,7 @@ ivas_error IVAS_ENC_Open( } #endif +#ifndef IND_LIST_DYN for ( i = 0; i < MAX_NUM_METADATA; ++i ) { for ( j = 0; j < MAX_BITS_METADATA; ++j ) @@ -155,6 +160,7 @@ ivas_error IVAS_ENC_Open( ( *phIvasEnc )->ind_list_metadata[i][j].value = 0; } } +#endif /*-----------------------------------------------------------------* * Allocate IVAS-codec encoder state @@ -909,11 +915,14 @@ static ivas_error configureEncoder( * Finalize initialization *-----------------------------------------------------------------*/ - if ( ( error = ivas_init_encoder( st_ivas, + if ( ( error = ivas_init_encoder( st_ivas #ifndef IND_LIST_DYN - hIvasEnc->ind_list, + ,hIvasEnc->ind_list #endif - hIvasEnc->ind_list_metadata ) ) != IVAS_ERR_OK ) +#ifndef IND_LIST_DYN + ,hIvasEnc->ind_list_metadata +#endif + ) ) != IVAS_ERR_OK ) { return error; } -- GitLab From eb1bd85cd40d52202e41a5f77fc841060f348f87 Mon Sep 17 00:00:00 2001 From: malenov Date: Mon, 6 Mar 2023 13:43:35 +0100 Subject: [PATCH 007/331] add debugging output message when writing indices out-of-order --- lib_com/bitstream.c | 3 +++ lib_com/options.h | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index 3aa0f21bac..c7a62da2c2 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -598,6 +598,9 @@ ivas_error push_indice( /* shift indices, if the new id is to be written somewhere inside the list */ if ( i < hBstr->nb_ind_tot ) { +#ifdef DEBUG_IND_LIST + printf( "Indice ID=%d is written before the last indice with ID=%d!\n", id, hBstr->ind_list[hBstr->nb_ind_tot - 1].id ); +#endif for ( j = hBstr->nb_ind_tot; j > i; j-- ) { hBstr->ind_list[j].id = hBstr->ind_list[j - 1].id; diff --git a/lib_com/options.h b/lib_com/options.h index 6ea15c2b48..995b693a3f 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -58,7 +58,7 @@ /*#define BITSTREAM_INDICES_MEMORY*/ /* Don't count memory for bitstream Indice at the encoder - it is a temporary solution for development only */ #define IND_LIST_DYN /* dynamic allocation of ind_list based on transport channels */ -/*#define DEBUG_IND_LIST*/ +#define DEBUG_IND_LIST #ifdef DEBUGGING -- GitLab From aee15bfc298177585b74adfdf52154af02cc35be Mon Sep 17 00:00:00 2001 From: malenov Date: Mon, 6 Mar 2023 14:30:52 +0100 Subject: [PATCH 008/331] deactive DEBUG_IND_LIST by default --- .gitignore | 22 ++++++++++++++++++++++ lib_com/options.h | 2 +- scripts/IvasBuildAndRun.py | 1 + scripts/pyivastest/IvasModeAnalyzer.py | 5 ++++- scripts/pyivastest/IvasScriptsCommon.py | 3 +++ scripts/pyivastest/IvasSvnBuilder.py | 2 ++ 6 files changed, 33 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index c87c691a4a..6a8896ad76 100644 --- a/.gitignore +++ b/.gitignore @@ -72,3 +72,25 @@ Externals/ # coan output files that are created when cleaning out switches coan_out_* +/ci/complexity_measurements/__zaloha +/COMPLEXITY +/scripts/ivas_pytests/tests/unit_tests/crend/tv +/scripts/wmops +/scripts/__zaloha +/tv +/scripts/td_object_renderer/object_renderer_standalone +/scripts/ivas_pytests/tests/unit_tests/crend +/scripts/config/short_test.prm +/NTT_critical_data.pwv +/IvasBuilder.txt +/ind_list.pwv +/I18-comments.c +/build.txt +/__zaloha +/Workspace_msvc/decoder.args.json +/Workspace_msvc/encoder.args.json +/Workspace_msvc/lib_dec.args.json +/scripts/Vlad_mergeNewsletters.py +/scripts/Vlad_extract_max_num_ind.py +/scripts/max_num_indices.xlsx +/res diff --git a/lib_com/options.h b/lib_com/options.h index 85762417ed..9249366ad5 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -58,7 +58,7 @@ /*#define BITSTREAM_INDICES_MEMORY*/ /* Don't count memory for bitstream Indice at the encoder - it is a temporary solution for development only */ #define IND_LIST_DYN /* dynamic allocation of ind_list based on transport channels */ -#define DEBUG_IND_LIST +/*#define DEBUG_IND_LIST*/ #ifdef DEBUGGING diff --git a/scripts/IvasBuildAndRun.py b/scripts/IvasBuildAndRun.py index 554c216b18..77c0e3ad60 100755 --- a/scripts/IvasBuildAndRun.py +++ b/scripts/IvasBuildAndRun.py @@ -32,6 +32,7 @@ import os.path import sys +import pdb from pyivastest.IvasSvnBuilder import * from pyivastest import IvasScriptsCommon diff --git a/scripts/pyivastest/IvasModeAnalyzer.py b/scripts/pyivastest/IvasModeAnalyzer.py index fed4f29ecd..3562837e34 100644 --- a/scripts/pyivastest/IvasModeAnalyzer.py +++ b/scripts/pyivastest/IvasModeAnalyzer.py @@ -36,6 +36,7 @@ import operator from copy import deepcopy import logging import functools +import pdb from pyivastest.IvasModeCollector import IvasModeCollector from pyivastest.constants import LOG_FILE_EXT @@ -44,7 +45,7 @@ from pyivastest.IvasBaseClass import IvasBaseClass INSTRUMENTED_RESULTS = { "WMOPS": { - "keyword": "total", + "keyword": " total", "number_format": "{:.5g}", "position": 2, "max_or_add": "add", @@ -938,6 +939,8 @@ class IvasModeAnalyzer(IvasModeCollector): """ + # pdb.set_trace() + if not os.path.exists(os.path.dirname(csv_file_name)): os.makedirs(os.path.dirname(csv_file_name)) diff --git a/scripts/pyivastest/IvasScriptsCommon.py b/scripts/pyivastest/IvasScriptsCommon.py index 3df9994170..dcbd08c146 100644 --- a/scripts/pyivastest/IvasScriptsCommon.py +++ b/scripts/pyivastest/IvasScriptsCommon.py @@ -39,6 +39,7 @@ from pyivastest.IvasBaseClass import * import pyivastest.constants as constants import logging import platform +import pdb # make sure we have colored output using shell escapes correctly on windows if platform.system() == "Windows": # Only if we are running on Windows @@ -303,6 +304,8 @@ class IvasScriptArgParser(argparse.ArgumentParser): args["loglevel"] = args["loglevel"].upper() # do some sanity checks here + # pdb.set_trace() + # check if config file exists if ( "config" in args.keys() diff --git a/scripts/pyivastest/IvasSvnBuilder.py b/scripts/pyivastest/IvasSvnBuilder.py index 0d7cc9c847..edcea1bb18 100644 --- a/scripts/pyivastest/IvasSvnBuilder.py +++ b/scripts/pyivastest/IvasSvnBuilder.py @@ -42,6 +42,7 @@ import logging from getpass import getpass import urllib.parse from multiprocessing import cpu_count +import pdb from pyivastest.IvasModeRunner import * from pyivastest.IvasModeAnalyzer import * @@ -1110,6 +1111,7 @@ class IvasBuilderAndRunner(IvasBaseClass): self.build_and_run_dict[cfg_name]["runner"].dir_name = run_dir self.build_and_run_dict[cfg_name]["analyzer"].dir = run_dir self.build_and_run_dict[cfg_name]["runner"].run() + if self.build_and_run_dict[cfg_name]["analyzer"].get_errors: failed_modes = self.build_and_run_dict[cfg_name]["runner"].failed_modes self.build_and_run_dict[cfg_name]["analyzer"].get_errors(failed_modes) -- GitLab From 0f2085bb5ad2a01298da2df40e3b874315c2d942 Mon Sep 17 00:00:00 2001 From: malenov Date: Mon, 6 Mar 2023 14:45:47 +0100 Subject: [PATCH 009/331] fixing auto-merge problems in SPAR reconfig --- lib_enc/ivas_ism_dtx_enc.c | 8 +++++- lib_enc/ivas_sba_enc.c | 51 ++++++++++++-------------------------- 2 files changed, 23 insertions(+), 36 deletions(-) diff --git a/lib_enc/ivas_ism_dtx_enc.c b/lib_enc/ivas_ism_dtx_enc.c index 2fea85e44a..f8eebe6d61 100644 --- a/lib_enc/ivas_ism_dtx_enc.c +++ b/lib_enc/ivas_ism_dtx_enc.c @@ -170,7 +170,13 @@ int16_t ivas_ism_dtx_enc( if ( ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == -1 ) && ( st_ivas->hSCE[0]->hCoreCoder[0]->last_core_brate == SID_2k40 || st_ivas->hSCE[0]->hCoreCoder[0]->last_core_brate == FRAME_NO_DATA ) ) { st_ivas->hSCE[0]->hCoreCoder[0]->core_brate = st_ivas->hSCE[0]->hCoreCoder[0]->last_core_brate; - reset_indices_enc( st_ivas->hSCE[0]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); + reset_indices_enc( st_ivas->hSCE[0]->hCoreCoder[0]->hBstr, +#ifdef IND_LIST_DYN + st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->max_num_indices +#else + MAX_NUM_INDICES +#endif + ); } st_ivas->hSCE[1]->hCoreCoder[0]->core_brate = st_ivas->hSCE[0]->hCoreCoder[0]->core_brate; diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index 8591ff91df..7181684367 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -111,11 +111,7 @@ ivas_error ivas_sba_enc_reconfigure( ivas_error error; ENCODER_CONFIG_HANDLE hEncoderConfig; -#ifndef IND_LIST_DYN - Indice *ind_list; -#endif - BSTR_ENC_HANDLE hBstr; - BSTR_ENC_HANDLE hMetaData; + error = IVAS_ERR_OK; hEncoderConfig = st_ivas->hEncoderConfig; ivas_total_brate = hEncoderConfig->ivas_total_brate; @@ -143,11 +139,8 @@ ivas_error ivas_sba_enc_reconfigure( int16_t n, i, n_old; float **old_mem_hp20_in; - /* save bitstream information */ -#ifndef IND_LIST_DYN - ind_list = hBstr->ind_list; -#endif - ind_list_metadata = hMetaData->ind_list; + n_old = ivas_sba_get_nchan_metadata( analysis_order_old ); + n = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order ); if ( n > n_old ) { @@ -173,34 +166,19 @@ ivas_error ivas_sba_enc_reconfigure( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); } -#ifndef IND_LIST_DYN - /* prepare bitstream buffers */ -#endif - for ( n = 0; n < CPE_CHANNELS; n++ ) - { -#ifndef IND_LIST_DYN - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list + ( cpe_id * CPE_CHANNELS + n ) * MAX_NUM_INDICES; - reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); -#endif + set_f( st_ivas->mem_hp20_in[i], 0.0f, L_HP20_MEM ); + } - if ( hEncoderConfig->Opt_DTX_ON ) - { - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->cng_sba_flag = 1; + free( old_mem_hp20_in ); + old_mem_hp20_in = NULL; } - } - -#ifndef IND_LIST_DYN - /* Metadata only initialized for the last CPE index */ - if ( cpe_id == st_ivas->nCPE - 1 ) - { - st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata + sce_id * MAX_BITS_METADATA; - reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA ); - } -#endif - } + else if ( n < n_old ) + { + /* save old mem_hp_20 pointer */ + old_mem_hp20_in = st_ivas->mem_hp20_in; + st_ivas->mem_hp20_in = NULL; - if ( st_ivas->nCPE > 1 ) - { + if ( ( st_ivas->mem_hp20_in = (float **) malloc( n * sizeof( float * ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); } @@ -289,8 +267,10 @@ ivas_error ivas_sba_enc_reconfigure( { return error; } + /*Initialization*/ hSpar->hMdEnc->table_idx = -1; + /* FB mixer handle */ ivas_FB_mixer_close( &hSpar->hFbMixer, hEncoderConfig->input_Fs ); @@ -377,6 +357,7 @@ ivas_error ivas_sba_enc_reconfigure( mvs2s( hDirAC->dirac_to_spar_md_bands, hSpar->dirac_to_spar_md_bands, DIRAC_MAX_NBANDS ); hSpar->enc_param_start_band = hDirAC->hConfig->enc_param_start_band; } + /*-----------------------------------------------------------------* * Allocate, initalize, and configure SCE/CPE/MCT handles *-----------------------------------------------------------------*/ -- GitLab From 970d9ef68aac045743ab41038a4d50c855b31981 Mon Sep 17 00:00:00 2001 From: malenov Date: Mon, 6 Mar 2023 16:09:37 +0100 Subject: [PATCH 010/331] fixing re-allocation of the buffer of indices in case of MASA bitrate switching --- lib_enc/ivas_masa_enc.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 3a7ac61038..3091d62d1c 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -1688,6 +1688,11 @@ void ivas_masa_enc_reconfigure( copy_encoder_config( st_ivas, st_ivas->hSCE[sce_id]->hCoreCoder[0], 0 ); st_ivas->hSCE[sce_id]->element_brate = ivas_total_brate / st_ivas->nchan_transport; st_ivas->hSCE[sce_id]->hCoreCoder[0]->total_brate = st_ivas->hSCE[sce_id]->element_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ + +#ifdef IND_LIST_DYN + /* re-allocate list of metadata indices, if needed */ + ind_list_metadata_realloc( st_ivas->hSCE[sce_id]->hMetaData, st_ivas->hEncoderConfig->ivas_format, st_ivas->hEncoderConfig->ivas_total_brate ); +#endif } for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) @@ -1699,6 +1704,11 @@ void ivas_masa_enc_reconfigure( { copy_encoder_config( st_ivas, st_ivas->hCPE[cpe_id]->hCoreCoder[n], 0 ); st_ivas->hCPE[cpe_id]->hCoreCoder[n]->total_brate = st_ivas->hCPE[cpe_id]->element_brate / ( st_ivas->nCPE > 1 ? 1 : CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ + +#ifdef IND_LIST_DYN + /* re-allocate list of metadata indices, if needed */ + ind_list_metadata_realloc( st_ivas->hCPE[cpe_id]->hMetaData, st_ivas->hEncoderConfig->ivas_format, st_ivas->hEncoderConfig->ivas_total_brate ); +#endif } if ( ivas_total_brate < MASA_STEREO_MIN_BITRATE ) -- GitLab From 2d51151810ee20bb43b8118f101dcbc87c0d931a Mon Sep 17 00:00:00 2001 From: malenov Date: Mon, 6 Mar 2023 16:10:14 +0100 Subject: [PATCH 011/331] increasiing maximum number of indices in MASA modes --- lib_com/bitstream.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index c7a62da2c2..ee68ba60f3 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -479,11 +479,11 @@ int16_t get_max_num_indices_metadata( /* o : maximum number of indices */ { if ( ivas_total_brate < IVAS_32k ) { - return 80; + return 90; } else if ( ivas_total_brate < IVAS_48k ) { - return 110; + return 130; } else if ( ivas_total_brate < IVAS_192k ) { @@ -598,7 +598,7 @@ ivas_error push_indice( /* shift indices, if the new id is to be written somewhere inside the list */ if ( i < hBstr->nb_ind_tot ) { -#ifdef DEBUG_IND_LIST +#ifdef DEBUG_IND_LIST_OUT_OF_ORDER printf( "Indice ID=%d is written before the last indice with ID=%d!\n", id, hBstr->ind_list[hBstr->nb_ind_tot - 1].id ); #endif for ( j = hBstr->nb_ind_tot; j > i; j-- ) -- GitLab From d1cadd3419f94d21542b3e30e40f28ed6917788a Mon Sep 17 00:00:00 2001 From: malenov Date: Thu, 9 Mar 2023 10:55:24 +0100 Subject: [PATCH 012/331] removal of the next_ind parameter -> it is replaced by nb_ind_tot --- lib_com/bitstream.c | 11 ++-- lib_enc/igf_enc.c | 3 -- lib_enc/ivas_corecoder_enc_reconfig.c | 13 ++++- lib_enc/ivas_lfe_enc.c | 21 ++++++-- lib_enc/ivas_qmetadata_enc.c | 75 +++++++++++++++++++++++++-- lib_enc/ivas_spar_md_enc.c | 8 +++ lib_enc/stat_enc.h | 4 +- lib_enc/tcx_utils_enc.c | 16 ++++++ 8 files changed, 136 insertions(+), 15 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index ee68ba60f3..043ec48761 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -644,7 +644,6 @@ ivas_error push_indice( /* updates */ #ifdef IND_LIST_DYN hBstr->nb_ind_tot++; - hBstr->next_ind++; #ifdef DEBUG_IND_LIST assert( (hBstr->nb_ind_tot < hBstr->max_num_indices) && "Maximum number of indices has been exceeded!" ); #endif @@ -739,7 +738,6 @@ ivas_error push_next_indice( /* updates */ #ifdef IND_LIST_DYN hBstr->nb_ind_tot++; - hBstr->next_ind = hBstr->nb_ind_tot; #ifdef DEBUG_IND_LIST assert( ( hBstr->nb_ind_tot < hBstr->max_num_indices ) && "Maximum number of indices has been exceeded!" ); #endif @@ -838,7 +836,9 @@ void push_next_bits( } - hBstr->next_ind = (int16_t) ( ptr - hBstr->ind_list ); +#ifndef IND_LIST_DYN + hBstr->next_ind = ( int16_t )( ptr - hBstr->ind_list ); +#endif hBstr->nb_bits_tot = hBstr->nb_bits_tot + nb_bits; return; @@ -910,7 +910,9 @@ uint16_t delete_indice( } hBstr->nb_ind_tot = j; +#ifndef IND_LIST_DYN hBstr->next_ind = j; +#endif for ( ; j < i; j++ ) { @@ -1141,8 +1143,9 @@ void reset_indices_enc( hBstr->nb_bits_tot = 0; #ifdef IND_LIST_DYN hBstr->nb_ind_tot = 0; -#endif +#else hBstr->next_ind = 0; +#endif hBstr->last_ind = -1; for ( i = 0; i < max_num_indices; i++ ) diff --git a/lib_enc/igf_enc.c b/lib_enc/igf_enc.c index 1f18bb8d13..d01ca40057 100644 --- a/lib_enc/igf_enc.c +++ b/lib_enc/igf_enc.c @@ -1806,10 +1806,7 @@ void IGFEncConcatenateBitstream( /* update list of indices */ hBstr->nb_ind_tot -= bsBits; hBstr->nb_bits_tot -= nb_bits_written; - hBstr->next_ind -= bsBits; - #else - indices_to_serial_generic( &hBstr->ind_list[hBstr->next_ind], bsBits, hPrivateData->igfBitstream, &hPrivateData->igfBitstreamBits ); /* make sure there are no leftovers from the temporary bitstream writing */ diff --git a/lib_enc/ivas_corecoder_enc_reconfig.c b/lib_enc/ivas_corecoder_enc_reconfig.c index fe8b751166..b49771b93a 100644 --- a/lib_enc/ivas_corecoder_enc_reconfig.c +++ b/lib_enc/ivas_corecoder_enc_reconfig.c @@ -73,7 +73,10 @@ ivas_error ivas_corecoder_enc_reconfig( int16_t i, nb_bits; Indice temp_ind_list[MAX_NUM_IND_TEMP_LIST]; #endif - int16_t nb_bits_tot, next_ind, last_ind; + int16_t nb_bits_tot, last_ind; +#ifndef IND_LIST_DYN + int16_t next_ind; +#endif ENCODER_CONFIG_HANDLE hEncoderConfig; ivas_error error; @@ -184,7 +187,9 @@ ivas_error ivas_corecoder_enc_reconfig( ind_list = hBstr->ind_list; /* pointer to the beginning of the global list */ #endif nb_bits_tot = hBstr->nb_bits_tot; +#ifndef IND_LIST_DYN next_ind = hBstr->next_ind; +#endif last_ind = hBstr->last_ind; #ifdef IND_LIST_DYN i = 0; @@ -330,7 +335,9 @@ ivas_error ivas_corecoder_enc_reconfig( { st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->last_ind = last_ind; st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->nb_bits_tot = nb_bits_tot; +#ifndef IND_LIST_DYN st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->next_ind = next_ind; +#endif #ifdef IND_LIST_DYN /* re-fill the buffer of indices with already written indices */ i = 0; @@ -392,7 +399,9 @@ ivas_error ivas_corecoder_enc_reconfig( { st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->last_ind = last_ind; st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_bits_tot = nb_bits_tot; +#ifndef IND_LIST_DYN st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->next_ind = next_ind; +#endif #ifdef IND_LIST_DYN i = 0; nb_bits = 0; @@ -458,7 +467,9 @@ ivas_error ivas_corecoder_enc_reconfig( { st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->last_ind = last_ind; st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_bits_tot = nb_bits_tot; +#ifndef IND_LIST_DYN st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->next_ind = next_ind; +#endif #ifdef IND_LIST_DYN i = 0; nb_bits = 0; diff --git a/lib_enc/ivas_lfe_enc.c b/lib_enc/ivas_lfe_enc.c index 4cdf46640a..fe2e0d3c02 100644 --- a/lib_enc/ivas_lfe_enc.c +++ b/lib_enc/ivas_lfe_enc.c @@ -98,7 +98,11 @@ static void ivas_lfe_enc_quant( BSTR_ENC_HANDLE hBstr ) { int16_t bits_written; +#ifdef IND_LIST_DYN + int16_t nb_ind_tot; +#else int16_t next_ind_pos; +#endif uint16_t quant_strategy, write_bit; int16_t num_quant_strategies; int16_t shift_bits; @@ -117,7 +121,11 @@ static void ivas_lfe_enc_quant( num_quant_strategies = IVAS_MAX_NUM_QUANT_STRATS; shift_bits = IVAS_LFE_SHIFT_BITS; bits_written = hBstr->nb_bits_tot; +#ifdef IND_LIST_DYN + nb_ind_tot = hBstr->nb_ind_tot; +#else next_ind_pos = hBstr->next_ind; +#endif for ( quant_strategy = 0; quant_strategy < num_quant_strategies; quant_strategy++ ) @@ -243,7 +251,11 @@ static void ivas_lfe_enc_quant( } bits_written_arith_enc = hBstr->nb_bits_tot; +#ifdef IND_LIST_DYN + next_ind_pos_arith_enc = hBstr->nb_ind_tot; +#else next_ind_pos_arith_enc = hBstr->next_ind; +#endif push_next_indice( hBstr, coding_strategy, 1 ); base2_num_bits_tot = hBstr->nb_bits_tot - bits_written; @@ -274,7 +286,9 @@ static void ivas_lfe_enc_quant( } #endif hBstr->nb_bits_tot = bits_written_arith_enc; +#ifndef IND_LIST_DYN hBstr->next_ind = next_ind_pos_arith_enc; +#endif coding_strategy = 1; push_next_indice( hBstr, coding_strategy, 1 ); @@ -308,7 +322,7 @@ static void ivas_lfe_enc_quant( { /* reset all indices that were already written - TODO: maybe better store them temporarily first and write at the very end? */ #ifdef IND_LIST_DYN - for ( j = hBstr->nb_ind_tot - 1; j >= next_ind_pos; j-- ) + for ( j = hBstr->nb_ind_tot - 1; j >= nb_ind_tot; j-- ) #else for ( j = hBstr->next_ind - 1; j >= next_ind_pos; j-- ) #endif @@ -318,9 +332,10 @@ static void ivas_lfe_enc_quant( hBstr->nb_bits_tot = bits_written; #ifdef IND_LIST_DYN - hBstr->nb_ind_tot = next_ind_pos; -#endif + hBstr->nb_ind_tot = nb_ind_tot; +#else hBstr->next_ind = next_ind_pos; +#endif } } } diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index ac4f83a657..01bd0a3bca 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -403,7 +403,11 @@ ivas_error ivas_qmetadata_enc_encode( /* Save state of metadata bitstream buffer after writing energy ratios, number of dirs and save space for coherence*/ bit_pos_start = hMetaData->nb_bits_tot; +#ifdef IND_LIST_DYN + next_ind_start = hMetaData->nb_ind_tot; +#else next_ind_start = hMetaData->next_ind; +#endif last_ind_start = hMetaData->last_ind; /* Encode quantized directions with EC frame-wise*/ @@ -413,7 +417,11 @@ ivas_error ivas_qmetadata_enc_encode( bits_signaling[d]++; } +#ifdef IND_LIST_DYN + next_ind_raw_flag = hMetaData->nb_ind_tot; +#else next_ind_raw_flag = hMetaData->next_ind; +#endif push_next_indice( hMetaData, 0, 1 ); /* Raw coding flag*/ bits_dir_bands[0] = ivas_qmetadata_raw_encode_dir( NULL, q_direction, q_direction->cfg.nbands, q_direction->cfg.start_band ); @@ -453,7 +461,11 @@ ivas_error ivas_qmetadata_enc_encode( bits_signaling[d] = 3; /* Write raw flags */ +#ifdef IND_LIST_DYN + next_ind_raw_flag = hMetaData->nb_ind_tot; +#else next_ind_raw_flag = hMetaData->next_ind; +#endif for ( i = start_band; i < nbands; i++ ) { push_next_indice( hMetaData, 0, 1 ); /* Raw coding flag*/ @@ -908,15 +920,19 @@ void ivas_qmetadata_enc_sid_encode( void reset_metadata_spatial( const IVAS_FORMAT ivas_format, /* i : IVAS format */ - BSTR_ENC_HANDLE hMetaData, /* i/o: Metadata bitstream handle */ + BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ const int32_t element_brate, /* i : element bitrate */ int32_t *total_brate, /* o : total bitrate */ const int32_t core_brate, /* i : core bitrate */ - const int16_t nb_bits_metadata, /* i : number of meatdata bits */ + const int16_t nb_bits_metadata, /* i : number of metadata bits */ const SBA_MODE sba_mode /* i : SBA mode */ ) { int16_t i, next_ind_sid, last_ind_sid; +#ifdef IND_LIST_DYN + int16_t j; +#endif + int16_t metadata_sid_bits; if ( core_brate == SID_2k40 || core_brate == FRAME_NO_DATA ) @@ -925,7 +941,9 @@ void reset_metadata_spatial( { if ( sba_mode == SBA_MODE_SPAR ) { +#ifdef DEBUGGING assert( hMetaData->ind_list[0].nb_bits == 1 ); +#endif hMetaData->ind_list[0].value = 1; metadata_sid_bits = (int16_t) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; while ( hMetaData->nb_bits_tot < metadata_sid_bits ) @@ -936,15 +954,22 @@ void reset_metadata_spatial( else { /* Reset metadata and keep only SID metadata*/ +#ifdef IND_LIST_DYN + last_ind_sid = hMetaData->nb_ind_tot; + next_ind_sid = hMetaData->nb_ind_tot; +#else last_ind_sid = hMetaData->next_ind; next_ind_sid = hMetaData->next_ind; +#endif while ( hMetaData->nb_bits_tot > nb_bits_metadata ) { next_ind_sid--; hMetaData->nb_bits_tot -= hMetaData->ind_list[next_ind_sid].nb_bits; } +#ifndef IND_LIST_DYN hMetaData->next_ind = 0; +#endif hMetaData->nb_bits_tot = 0; for ( i = 0; i < next_ind_sid; i++ ) @@ -952,6 +977,18 @@ void reset_metadata_spatial( hMetaData->ind_list[i].nb_bits = -1; } +#ifdef IND_LIST_DYN + for ( j = 0, i = next_ind_sid; i < last_ind_sid; i++, j++ ) + { + hMetaData->ind_list[j].value = hMetaData->ind_list[i].value; + hMetaData->ind_list[j].nb_bits = hMetaData->ind_list[i].nb_bits; + hMetaData->nb_bits_tot += hMetaData->ind_list[j].nb_bits; + hMetaData->ind_list[i].nb_bits = -1; + } + + hMetaData->nb_ind_tot = j; + hMetaData->last_ind = j - 1; +#else for ( i = next_ind_sid; i < last_ind_sid; i++ ) { hMetaData->ind_list[hMetaData->next_ind].value = hMetaData->ind_list[i].value; @@ -960,13 +997,20 @@ void reset_metadata_spatial( hMetaData->next_ind++; hMetaData->ind_list[i].nb_bits = -1; } + hMetaData->last_ind = hMetaData->next_ind; +#endif +#ifdef DEBUGGING assert( ( hMetaData->nb_bits_tot == ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS ) && "Problem of SID metadata in SCE" ); +#endif } } else { /*Reset metadata*/ +#ifdef IND_LIST_DYN + reset_indices_enc( hMetaData, hMetaData->max_num_indices ); +#else for ( i = 0; i < hMetaData->next_ind; i++ ) { hMetaData->ind_list[i].nb_bits = -1; @@ -974,6 +1018,7 @@ void reset_metadata_spatial( hMetaData->nb_bits_tot = 0; hMetaData->next_ind = 0; hMetaData->last_ind = 0; +#endif } *total_brate = element_brate; @@ -983,12 +1028,24 @@ void reset_metadata_spatial( /* Reset SID metadata bits*/ while ( hMetaData->nb_bits_tot > nb_bits_metadata ) { +#ifdef IND_LIST_DYN + hMetaData->nb_ind_tot--; + hMetaData->nb_bits_tot -= hMetaData->ind_list[hMetaData->nb_ind_tot].nb_bits; + hMetaData->ind_list[hMetaData->nb_ind_tot].nb_bits = -1; +#else hMetaData->next_ind--; hMetaData->nb_bits_tot -= hMetaData->ind_list[hMetaData->next_ind].nb_bits; hMetaData->ind_list[hMetaData->next_ind].nb_bits = -1; +#endif } +#ifdef DEBUGGING assert( hMetaData->nb_bits_tot == nb_bits_metadata && "Problem in metadata for SCE" ); +#endif +#ifdef IND_LIST_DYN + hMetaData->last_ind = hMetaData->nb_ind_tot; +#else hMetaData->last_ind = hMetaData->next_ind; +#endif } return; @@ -1494,7 +1551,7 @@ static int16_t ivas_qmetadata_entropy_encode_df_ratio( /*------------------------------------------------------------------------- * restore_metadata_buffer() * - * Reset metadata buffer + * Restore metadata buffer *------------------------------------------------------------------------*/ void restore_metadata_buffer( @@ -1505,12 +1562,20 @@ void restore_metadata_buffer( { int16_t i; +#ifdef IND_LIST_DYN + for ( i = next_ind_start; i <= hMetaData->nb_ind_tot; i++ ) +#else for ( i = next_ind_start; i <= hMetaData->next_ind; i++ ) +#endif { hMetaData->ind_list[i].nb_bits = -1; } hMetaData->nb_bits_tot = bit_pos_start; +#ifdef IND_LIST_DYN + hMetaData->nb_ind_tot = next_ind_start; +#else hMetaData->next_ind = next_ind_start; +#endif hMetaData->last_ind = last_ind_start; return; @@ -4701,7 +4766,11 @@ static int16_t ivas_qmetadata_quantize_coherence( else { /* write dummy data now and save the position */ +#ifdef IND_LIST_DYN + *indice_coherence = hMetaData->nb_ind_tot; +#else *indice_coherence = hMetaData->next_ind; +#endif k = nbits; while ( k > 0 ) { diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index 4936813bd7..6ec83e710b 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -520,7 +520,11 @@ static void write_metadata_buffer( restore_metadata_buffer( hMetaData, next_ind_start, last_ind_start, bit_pos_start ); } +#ifdef IND_LIST_DYN + for ( i = 0; i < hMetaData_tmp->nb_ind_tot; i++ ) +#else for ( i = 0; i < hMetaData_tmp->next_ind; i++ ) +#endif { push_next_indice( hMetaData, hMetaData_tmp->ind_list[i].value, hMetaData_tmp->ind_list[i].nb_bits ); } @@ -609,7 +613,11 @@ ivas_error ivas_spar_md_enc_process( /* Save state of metadata bitstream buffer */ bit_pos_start = hMetaData->nb_bits_tot; +#ifdef IND_LIST_DYN + next_ind_start = hMetaData->nb_ind_tot; +#else next_ind_start = hMetaData->next_ind; +#endif last_ind_start = hMetaData->last_ind; dmx_switch = 0; diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index 7b51714831..d3c1530b58 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -77,7 +77,9 @@ typedef struct bitstream_enc_data_structure #endif int16_t nb_bits_tot; /* total number of bits already written */ Indice *ind_list; /* list of indices */ - int16_t next_ind; /* pointer to the next empty slot in the list of indices */ +#ifndef IND_LIST_DYN + int16_t next_ind; /* pointer to the next empty slot in the list of indices */ +#endif int16_t last_ind; /* last written indice */ int16_t max_num_indices; /* maximum number of indices in the list */ } BSTR_ENC_DATA, *BSTR_ENC_HANDLE; diff --git a/lib_enc/tcx_utils_enc.c b/lib_enc/tcx_utils_enc.c index ba709f0158..2dd5340992 100644 --- a/lib_enc/tcx_utils_enc.c +++ b/lib_enc/tcx_utils_enc.c @@ -1486,11 +1486,19 @@ void ProcessIGF( } else { +#ifdef IND_LIST_DYN + pBsStart = hBstr->nb_ind_tot; +#else pBsStart = hBstr->next_ind; +#endif IGFEncWriteBitstream( hIGFEnc, hBstr, &hIGFEnc->infoTotalBitsPerFrameWritten, igfGridIdx, isIndepFlag ); +#ifdef IND_LIST_DYN + bsBits = hBstr->nb_ind_tot - pBsStart; +#else bsBits = hBstr->next_ind - pBsStart; +#endif IGFEncConcatenateBitstream( hIGFEnc, bsBits, hBstr ); } @@ -1570,11 +1578,19 @@ void ProcessStereoIGF( else { hBstr = sts[ch]->hBstr; +#ifdef IND_LIST_DYN + pBsStart = hBstr->nb_ind_tot; +#else pBsStart = hBstr->next_ind; +#endif IGFEncWriteBitstream( hIGFEnc[ch], hBstr, &hIGFEnc[ch]->infoTotalBitsPerFrameWritten, igfGridIdx, isIndepFlag ); +#ifdef IND_LIST_DYN + bsBits = hBstr->nb_ind_tot - pBsStart; +#else bsBits = hBstr->next_ind - pBsStart; +#endif IGFEncConcatenateBitstream( hIGFEnc[ch], bsBits, hBstr ); } } -- GitLab From 064d3e8b2837f2ef3e2f31700d3a75a7ecf9ac66 Mon Sep 17 00:00:00 2001 From: malenov Date: Fri, 10 Mar 2023 12:06:44 +0100 Subject: [PATCH 013/331] Removal of obsolete parameter hBstr->last_ind -> replaced by hBstr->nb_ind_tot --- lib_com/bitstream.c | 186 +++++++++++++------------- lib_com/ivas_prot.h | 2 + lib_enc/ivas_core_enc.c | 15 ++- lib_enc/ivas_corecoder_enc_reconfig.c | 45 +++++-- lib_enc/ivas_masa_enc.c | 31 ++++- lib_enc/ivas_qmetadata_enc.c | 28 ++-- lib_enc/ivas_spar_md_enc.c | 27 +++- lib_enc/ivas_stereo_mdct_core_enc.c | 16 ++- lib_enc/stat_enc.h | 2 +- 9 files changed, 224 insertions(+), 128 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index 043ec48761..e1d24f1745 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -62,6 +62,10 @@ FILE *FEC_pattern = NULL; /* FEC pattern file (for simulation of FEC) */ #endif +#ifdef IND_LIST_DYN +#define STEP_MAX_NUM_INDICES 20 /* increase the maximum number of allowed indices in the list by this amount */ +#endif + #ifdef DEBUG_IND_LIST int16_t max_total_num_ind = 0; int16_t max_total_num_ind_metadata = 0; @@ -226,55 +230,47 @@ Word16 rate2EVSmode( /*-------------------------------------------------------------------* * ind_list_realloc() * - * Re-allocate list of indices if the maximum number of allowed indices has changed + * Re-allocate the list of indices as the maximum number of allowed indices has changed *-------------------------------------------------------------------*/ ivas_error ind_list_realloc( BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const int32_t total_brate /* i : total bitrate */ + int16_t max_num_indices /* i : new maximum number of allowed indices in the list */ ) { - int16_t i, max_num_indices; + int16_t i; INDICE_HANDLE new_ind_list; - /* get the maximum allowed number of indices in the list */ - max_num_indices = get_max_num_indices( ivas_format, total_brate ); - - /* check, if the maximum number of allowed indices has changed */ - if ( max_num_indices != hBstr->max_num_indices ) + /* allocate new buffer of indices */ + if ( ( new_ind_list = (INDICE_HANDLE) malloc( max_num_indices * sizeof( Indice ) ) ) == NULL ) { - /* allocate new buffer of indices */ - if ( ( new_ind_list = (INDICE_HANDLE) malloc( max_num_indices * sizeof( Indice ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); - } + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); + } - /* move indices from the old list to the new list */ - i = 0; - while ( hBstr->ind_list[i].nb_bits > 0 ) - { - new_ind_list[i].id = hBstr->ind_list[i].id; - new_ind_list[i].value = hBstr->ind_list[i].value; - new_ind_list[i].nb_bits = hBstr->ind_list[i].nb_bits; - i++; - } + /* move indices from the old list to the new list */ + i = 0; + while ( hBstr->ind_list[i].nb_bits > 0 ) + { + new_ind_list[i].id = hBstr->ind_list[i].id; + new_ind_list[i].value = hBstr->ind_list[i].value; + new_ind_list[i].nb_bits = hBstr->ind_list[i].nb_bits; + i++; + } - /* reset nb_bits of all other indices to -1 */ - for ( ; i < max_num_indices; i++ ) - { - new_ind_list[i].nb_bits = -1; - } + /* reset nb_bits of all other indices to -1 */ + for ( ; i < max_num_indices; i++ ) + { + new_ind_list[i].nb_bits = -1; + } - /* free the old list */ - free( hBstr->ind_list ); + /* free the old list */ + free( hBstr->ind_list ); - /* set pointer to the new list */ - hBstr->ind_list = new_ind_list; + /* set pointer to the new list */ + hBstr->ind_list = new_ind_list; - /* set the new maximum for the allowed number of indices */ - hBstr->max_num_indices = max_num_indices; - } + /* set the new maximum for the allowed number of indices */ + hBstr->max_num_indices = max_num_indices; return IVAS_ERR_OK; } @@ -285,58 +281,59 @@ ivas_error ind_list_realloc( * Re-allocate list of metadata indices if the IVAS total bitrate has changed *-------------------------------------------------------------------*/ -ivas_error ind_list_metadata_realloc( - BSTR_ENC_HANDLE hMetaData, /* i/o: encoder bitstream handle */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const int32_t ivas_total_brate /* i : IVAS total bitrate */ -) -{ - int16_t i, max_num_indices_metadata; - INDICE_HANDLE new_ind_list_metadata; - - if ( hMetaData != NULL && hMetaData->ind_list != NULL ) - { - /* get the maximum allowed number of indices in the list */ - max_num_indices_metadata = get_max_num_indices_metadata( ivas_format, ivas_total_brate ); +//ivas_error ind_list_metadata_realloc( +// BSTR_ENC_HANDLE hMetaData, /* i/o: encoder bitstream handle */ +// const IVAS_FORMAT ivas_format, /* i : IVAS format */ +// const int32_t ivas_total_brate /* i : IVAS total bitrate */ +//) +//{ +// int16_t i, max_num_indices_metadata; +// INDICE_HANDLE new_ind_list_metadata; +// +// if ( hMetaData != NULL && hMetaData->ind_list != NULL ) +// { +// /* get the maximum allowed number of indices in the list */ +// max_num_indices_metadata = get_max_num_indices_metadata( ivas_format, ivas_total_brate ); +// +// /* check, if the maximum number of allowed indices has changed */ +// if ( max_num_indices_metadata != hMetaData->max_num_indices ) +// { +// /* allocate new buffer of metadata indices */ +// if ( ( new_ind_list_metadata = (INDICE_HANDLE) malloc( max_num_indices_metadata * sizeof( Indice ) ) ) == NULL ) +// { +// return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of metadata indices!\n" ) ); +// } +// +// /* move indices from the old list to the new list */ +// i = 0; +// while ( hMetaData->ind_list[i].nb_bits > 0 ) +// { +// new_ind_list_metadata[i].id = hMetaData->ind_list[i].id; +// new_ind_list_metadata[i].value = hMetaData->ind_list[i].value; +// new_ind_list_metadata[i].nb_bits = hMetaData->ind_list[i].nb_bits; +// i++; +// } +// +// /* reset nb_bits of all other indices to -1 */ +// for ( ; i < max_num_indices_metadata; i++ ) +// { +// new_ind_list_metadata[i].nb_bits = -1; +// } +// +// /* free the old list */ +// free( hMetaData->ind_list ); +// +// /* set pointer to the new list */ +// hMetaData->ind_list = new_ind_list_metadata; +// +// /* set the new maximum for the allowed number of indices */ +// hMetaData->max_num_indices = max_num_indices_metadata; +// } +// } +// +// return IVAS_ERR_OK; +//} - /* check, if the maximum number of allowed indices has changed */ - if ( max_num_indices_metadata != hMetaData->max_num_indices ) - { - /* allocate new buffer of metadata indices */ - if ( ( new_ind_list_metadata = (INDICE_HANDLE) malloc( max_num_indices_metadata * sizeof( Indice ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of metadata indices!\n" ) ); - } - - /* move indices from the old list to the new list */ - i = 0; - while ( hMetaData->ind_list[i].nb_bits > 0 ) - { - new_ind_list_metadata[i].id = hMetaData->ind_list[i].id; - new_ind_list_metadata[i].value = hMetaData->ind_list[i].value; - new_ind_list_metadata[i].nb_bits = hMetaData->ind_list[i].nb_bits; - i++; - } - - /* reset nb_bits of all other indices to -1 */ - for ( ; i < max_num_indices_metadata; i++ ) - { - new_ind_list_metadata[i].nb_bits = -1; - } - - /* free the old list */ - free( hMetaData->ind_list ); - - /* set pointer to the new list */ - hMetaData->ind_list = new_ind_list_metadata; - - /* set the new maximum for the allowed number of indices */ - hMetaData->max_num_indices = max_num_indices_metadata; - } - } - - return IVAS_ERR_OK; -} /*-----------------------------------------------------------------------* * get_max_num_indices() * @@ -577,14 +574,21 @@ ivas_error push_indice( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Indice ID = %d exceeds the total number of indices: %d (frame %d) !\n", id, MAX_NUM_INDICES, frame ); } #endif +#endif #ifdef IND_LIST_DYN - /* check, if max number of indices has not been exceeded */ + /* check, if the maximum number of indices has been reached and re-allocate the buffer */ + /* the re-allocation can be avoided by increasing the limits in get_max_num_indices() and get_max_num_indices_metadata() */ if ( hBstr->nb_ind_tot >= hBstr->max_num_indices ) { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Maximum number of indices %d has been exceeded (frame %d) !\n", hBstr->max_num_indices, frame ); - } +#ifdef DEBUGGING + DEBUG_LINE( 1 ) + printf( "Warning: Maximum number of indices %d has been exceeded (frame %d)! Increase the limits in get_max_num_indices() or get_max_num_indices_metadata().\n", hBstr->max_num_indices, frame ); #endif + + /* reallocate the buffer of indices with increased limit */ + ind_list_realloc( hBstr, hBstr->nb_ind_tot + STEP_MAX_NUM_INDICES ); + } #endif #ifdef IND_LIST_DYN @@ -649,8 +653,8 @@ ivas_error push_indice( #endif #else hBstr->next_ind = i + 1; -#endif hBstr->last_ind = id; +#endif hBstr->nb_bits_tot += nb_bits; return error; @@ -1146,7 +1150,9 @@ void reset_indices_enc( #else hBstr->next_ind = 0; #endif +#ifndef IND_LIST_DYN hBstr->last_ind = -1; +#endif for ( i = 0; i < max_num_indices; i++ ) { diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index c0d3f575fe..b66c99e1aa 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -2944,7 +2944,9 @@ void ivas_qmetadata_close( void restore_metadata_buffer( BSTR_ENC_HANDLE hMetaData, const int16_t next_ind_start, +#ifndef IND_LIST_DYN const int16_t last_ind_start, +#endif const int16_t bit_pos_start ); diff --git a/lib_enc/ivas_core_enc.c b/lib_enc/ivas_core_enc.c index d1bc85d759..603e5b1468 100644 --- a/lib_enc/ivas_core_enc.c +++ b/lib_enc/ivas_core_enc.c @@ -103,6 +103,9 @@ ivas_error ivas_core_enc( int16_t last_element_mode, tdm_Pitch_reuse_flag; int32_t element_brate, last_element_brate, input_Fs; ivas_error error; +#ifdef IND_LIST_DYN + int16_t max_num_indices; +#endif push_wmops( "ivas_core_enc" ); @@ -197,10 +200,18 @@ ivas_error ivas_core_enc( #ifdef IND_LIST_DYN /*---------------------------------------------------------------------* - * Re-allocate list of indices, if needed + * Re-allocate the list of indices, if needed *---------------------------------------------------------------------*/ - ind_list_realloc( st->hBstr, ivas_format, st->total_brate ); + /* get the maximum allowed number of indices in the list */ + max_num_indices = get_max_num_indices( ivas_format, st->total_brate ); + + /* check, if the maximum number of allowed indices has changed */ + if ( max_num_indices != st->hBstr->max_num_indices ) + { + /* re-allocate the list of indices */ + ind_list_realloc( st->hBstr, max_num_indices ); + } #endif /*---------------------------------------------------------------------* diff --git a/lib_enc/ivas_corecoder_enc_reconfig.c b/lib_enc/ivas_corecoder_enc_reconfig.c index b49771b93a..b7403bb0fd 100644 --- a/lib_enc/ivas_corecoder_enc_reconfig.c +++ b/lib_enc/ivas_corecoder_enc_reconfig.c @@ -70,11 +70,12 @@ ivas_error ivas_corecoder_enc_reconfig( BSTR_ENC_HANDLE hMetaData; #endif #ifdef IND_LIST_DYN - int16_t i, nb_bits; + int16_t i, nb_bits, max_num_indices_metadata; Indice temp_ind_list[MAX_NUM_IND_TEMP_LIST]; #endif - int16_t nb_bits_tot, last_ind; + int16_t nb_bits_tot; #ifndef IND_LIST_DYN + int16_t last_ind; int16_t next_ind; #endif ENCODER_CONFIG_HANDLE hEncoderConfig; @@ -105,8 +106,18 @@ ivas_error ivas_corecoder_enc_reconfig( st_ivas->hSCE[sce_id]->element_brate = brate_SCE; st_ivas->hSCE[sce_id]->hCoreCoder[0]->total_brate = st_ivas->hSCE[sce_id]->element_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ #ifdef IND_LIST_DYN - /* re-allocate list of metadata indices, if needed */ - ind_list_metadata_realloc( st_ivas->hSCE[sce_id]->hMetaData, hEncoderConfig->ivas_format, hEncoderConfig->ivas_total_brate ); + if ( st_ivas->hSCE[sce_id]->hMetaData != NULL ) + { + /* get the maximum allowed number of indices in the list */ + max_num_indices_metadata = get_max_num_indices_metadata( hEncoderConfig->ivas_format, hEncoderConfig->ivas_total_brate ); + + /* check, if the maximum number of allowed indices has changed */ + if ( max_num_indices_metadata != st_ivas->hSCE[sce_id]->hMetaData->max_num_indices ) + { + /* re-allocate the list of metadata indices */ + ind_list_realloc( st_ivas->hSCE[sce_id]->hMetaData, max_num_indices_metadata ); + } + } #endif } @@ -121,8 +132,18 @@ ivas_error ivas_corecoder_enc_reconfig( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->total_brate = st_ivas->hCPE[cpe_id]->element_brate / ( st_ivas->nCPE > 1 ? 1 : CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ } #ifdef IND_LIST_DYN - /* re-allocate list of metadata indices, if needed */ - ind_list_metadata_realloc( st_ivas->hCPE[cpe_id]->hMetaData, hEncoderConfig->ivas_format, hEncoderConfig->ivas_total_brate ); + if ( st_ivas->hCPE[cpe_id]->hMetaData != NULL ) + { + /* get the maximum allowed number of indices in the list */ + max_num_indices_metadata = get_max_num_indices_metadata( hEncoderConfig->ivas_format, hEncoderConfig->ivas_total_brate ); + + /* check, if the maximum number of allowed indices has changed */ + if ( max_num_indices_metadata != st_ivas->hCPE[cpe_id]->hMetaData->max_num_indices ) + { + /* re-allocate the list of metadata indices */ + ind_list_realloc( st_ivas->hCPE[cpe_id]->hMetaData, max_num_indices_metadata ); + } + } #endif } @@ -183,14 +204,12 @@ ivas_error ivas_corecoder_enc_reconfig( #endif /* save bitstream information */ -#ifndef IND_LIST_DYN - ind_list = hBstr->ind_list; /* pointer to the beginning of the global list */ -#endif nb_bits_tot = hBstr->nb_bits_tot; #ifndef IND_LIST_DYN + ind_list = hBstr->ind_list; /* pointer to the beginning of the global list */ next_ind = hBstr->next_ind; -#endif last_ind = hBstr->last_ind; +#endif #ifdef IND_LIST_DYN i = 0; nb_bits = 0; @@ -333,9 +352,9 @@ ivas_error ivas_corecoder_enc_reconfig( } else { - st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->last_ind = last_ind; st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->nb_bits_tot = nb_bits_tot; #ifndef IND_LIST_DYN + st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->last_ind = last_ind; st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->next_ind = next_ind; #endif #ifdef IND_LIST_DYN @@ -397,9 +416,9 @@ ivas_error ivas_corecoder_enc_reconfig( } else { - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->last_ind = last_ind; st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_bits_tot = nb_bits_tot; #ifndef IND_LIST_DYN + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->last_ind = last_ind; st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->next_ind = next_ind; #endif #ifdef IND_LIST_DYN @@ -465,9 +484,9 @@ ivas_error ivas_corecoder_enc_reconfig( } else { - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->last_ind = last_ind; st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_bits_tot = nb_bits_tot; #ifndef IND_LIST_DYN + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->last_ind = last_ind; st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->next_ind = next_ind; #endif #ifdef IND_LIST_DYN diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 3091d62d1c..0698c39fc3 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -1678,6 +1678,9 @@ void ivas_masa_enc_reconfigure( int16_t n, tmp; int16_t sce_id, cpe_id; int32_t ivas_total_brate; +#ifdef IND_LIST_DYN + int16_t max_num_indices_metadata; +#endif ivas_total_brate = st_ivas->hEncoderConfig->ivas_total_brate; @@ -1690,8 +1693,18 @@ void ivas_masa_enc_reconfigure( st_ivas->hSCE[sce_id]->hCoreCoder[0]->total_brate = st_ivas->hSCE[sce_id]->element_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ #ifdef IND_LIST_DYN - /* re-allocate list of metadata indices, if needed */ - ind_list_metadata_realloc( st_ivas->hSCE[sce_id]->hMetaData, st_ivas->hEncoderConfig->ivas_format, st_ivas->hEncoderConfig->ivas_total_brate ); + if ( st_ivas->hSCE[sce_id]->hMetaData != NULL ) + { + /* get the maximum allowed number of indices in the list */ + max_num_indices_metadata = get_max_num_indices_metadata( st_ivas->hEncoderConfig->ivas_format, st_ivas->hEncoderConfig->ivas_total_brate ); + + /* check, if the maximum number of allowed indices has changed */ + if ( max_num_indices_metadata != st_ivas->hSCE[sce_id]->hMetaData->max_num_indices ) + { + /* re-allocate the list of metadata indices */ + ind_list_realloc( st_ivas->hSCE[sce_id]->hMetaData, max_num_indices_metadata ); + } + } #endif } @@ -1706,8 +1719,18 @@ void ivas_masa_enc_reconfigure( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->total_brate = st_ivas->hCPE[cpe_id]->element_brate / ( st_ivas->nCPE > 1 ? 1 : CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ #ifdef IND_LIST_DYN - /* re-allocate list of metadata indices, if needed */ - ind_list_metadata_realloc( st_ivas->hCPE[cpe_id]->hMetaData, st_ivas->hEncoderConfig->ivas_format, st_ivas->hEncoderConfig->ivas_total_brate ); + if ( st_ivas->hCPE[cpe_id]->hMetaData != NULL ) + { + /* get the maximum allowed number of indices in the list */ + max_num_indices_metadata = get_max_num_indices_metadata( st_ivas->hEncoderConfig->ivas_format, st_ivas->hEncoderConfig->ivas_total_brate ); + + /* check, if the maximum number of allowed indices has changed */ + if ( max_num_indices_metadata != st_ivas->hCPE[cpe_id]->hMetaData->max_num_indices ) + { + /* re-allocate the list of metadata indices */ + ind_list_realloc( st_ivas->hCPE[cpe_id]->hMetaData, max_num_indices_metadata ); + } + } #endif } diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index 01bd0a3bca..2b969a6d76 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -130,7 +130,10 @@ ivas_error ivas_qmetadata_enc_encode( ) { int16_t i, bit_pos_start, bit_pos_start_coh; - int16_t next_ind_start, last_ind_start; + int16_t next_ind_start; +#ifndef IND_LIST_DYN + int16_t last_ind_start; +#endif uint16_t diffuseness_index_max_ec_frame; uint16_t diffuseness_index_max_ec_frame_pre[QMETADATA_MAX_NO_DIRECTIONS]; int16_t bits_dir_raw_pre[QMETADATA_MAX_NO_DIRECTIONS]; @@ -407,8 +410,8 @@ ivas_error ivas_qmetadata_enc_encode( next_ind_start = hMetaData->nb_ind_tot; #else next_ind_start = hMetaData->next_ind; -#endif last_ind_start = hMetaData->last_ind; +#endif /* Encode quantized directions with EC frame-wise*/ if ( total_bits_1dir + bits_surround_coh <= hQMetaData->qmetadata_max_bit_req ) @@ -453,7 +456,11 @@ ivas_error ivas_qmetadata_enc_encode( /* Encode quantized directions with EC band-wise */ if ( ( total_bits_1dir + bits_surround_coh <= hQMetaData->qmetadata_max_bit_req ) && ( bits_dir[d] + bits_diff[d] + bits_coherence[d] + bits_signaling[d] > total_bits_1dir ) && q_direction->cfg.nblocks > 1 ) { - restore_metadata_buffer( hMetaData, next_ind_start, last_ind_start, bit_pos_start ); + restore_metadata_buffer( hMetaData, next_ind_start, +#ifndef IND_LIST_DYN + last_ind_start, +#endif + bit_pos_start ); /* Write signaling */ push_next_indice( hMetaData, 1, 1 ); /*Write 1 bit to signal no EC frame-wise (EC1)*/ @@ -534,7 +541,11 @@ ivas_error ivas_qmetadata_enc_encode( /*Bit budget exceeded, bit reduction strategy?*/ extra_bits = 0; - restore_metadata_buffer( hMetaData, next_ind_start, last_ind_start, bit_pos_start ); + restore_metadata_buffer( hMetaData, next_ind_start, +#ifndef IND_LIST_DYN + last_ind_start, +#endif + bit_pos_start ); push_next_indice( hMetaData, 1, 1 ); /*Write 1 bit to signal no EC frame-wise (EC1)*/ if ( nblocks > 1 ) @@ -987,7 +998,6 @@ void reset_metadata_spatial( } hMetaData->nb_ind_tot = j; - hMetaData->last_ind = j - 1; #else for ( i = next_ind_sid; i < last_ind_sid; i++ ) { @@ -1041,9 +1051,7 @@ void reset_metadata_spatial( #ifdef DEBUGGING assert( hMetaData->nb_bits_tot == nb_bits_metadata && "Problem in metadata for SCE" ); #endif -#ifdef IND_LIST_DYN - hMetaData->last_ind = hMetaData->nb_ind_tot; -#else +#ifndef IND_LIST_DYN hMetaData->last_ind = hMetaData->next_ind; #endif } @@ -1557,7 +1565,9 @@ static int16_t ivas_qmetadata_entropy_encode_df_ratio( void restore_metadata_buffer( BSTR_ENC_HANDLE hMetaData, const int16_t next_ind_start, +#ifndef IND_LIST_DYN const int16_t last_ind_start, +#endif const int16_t bit_pos_start ) { int16_t i; @@ -1575,8 +1585,8 @@ void restore_metadata_buffer( hMetaData->nb_ind_tot = next_ind_start; #else hMetaData->next_ind = next_ind_start; -#endif hMetaData->last_ind = last_ind_start; +#endif return; } diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index 6ec83e710b..e1bc2b0d7d 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -510,14 +510,22 @@ static void write_metadata_buffer( BSTR_ENC_HANDLE hMetaData_tmp, BSTR_ENC_HANDLE hMetaData, const int16_t bit_pos_start, - const int16_t next_ind_start, - const int16_t last_ind_start ) + const int16_t next_ind_start +#ifndef IND_LIST_DYN + , + const int16_t last_ind_start +#endif +) { int16_t i; if ( hMetaData->nb_bits_tot > 0 ) { - restore_metadata_buffer( hMetaData, next_ind_start, last_ind_start, bit_pos_start ); + restore_metadata_buffer( hMetaData, next_ind_start, +#ifndef IND_LIST_DYN + last_ind_start, +#endif + bit_pos_start ); } #ifdef IND_LIST_DYN @@ -560,7 +568,10 @@ ivas_error ivas_spar_md_enc_process( int16_t nB, bands_bw, packed_ok = 0; ivas_strats_t cs[MAX_CODING_STRATS]; int16_t code_strat; - int16_t bit_pos_start, next_ind_start, last_ind_start; + int16_t bit_pos_start, next_ind_start; +#ifndef IND_LIST_DYN + int16_t last_ind_start; +#endif BSTR_ENC_DATA hMetaData_tmp; Indice ind_list_tmp[MAX_BITS_METADATA]; // IVAS_fmToDo: size to be optimized float Wscale[IVAS_MAX_NUM_BANDS]; @@ -617,8 +628,8 @@ ivas_error ivas_spar_md_enc_process( next_ind_start = hMetaData->nb_ind_tot; #else next_ind_start = hMetaData->next_ind; -#endif last_ind_start = hMetaData->last_ind; +#endif dmx_switch = 0; @@ -890,7 +901,11 @@ ivas_error ivas_spar_md_enc_process( if ( hMetaData->nb_bits_tot == bit_pos_start || hMetaData_tmp.nb_bits_tot < ( hMetaData->nb_bits_tot - bit_pos_start ) ) { - write_metadata_buffer( &hMetaData_tmp, hMetaData, bit_pos_start, next_ind_start, last_ind_start ); + write_metadata_buffer( &hMetaData_tmp, hMetaData, bit_pos_start, next_ind_start +#ifndef IND_LIST_DYN + , last_ind_start +#endif + ); code_strat = strat; } if ( hMetaData->nb_bits_tot - bit_pos_start + ( ( ( hEncoderConfig->ivas_total_brate == IVAS_256k ) && ( sba_order == SBA_FOA_ORDER ) ) ? 1 : 0 ) <= hMdEnc->spar_md_cfg.tgt_bits_per_blk ) diff --git a/lib_enc/ivas_stereo_mdct_core_enc.c b/lib_enc/ivas_stereo_mdct_core_enc.c index 79659a8f84..ec5277925b 100644 --- a/lib_enc/ivas_stereo_mdct_core_enc.c +++ b/lib_enc/ivas_stereo_mdct_core_enc.c @@ -148,6 +148,9 @@ void stereo_mdct_core_enc( int16_t p_param[CPE_CHANNELS][2]; int16_t stereo_bits; int16_t meta_bits, signal_bits; +#ifdef IND_LIST_DYN + int16_t max_num_indices; +#endif push_wmops( "stereo_mdct_core_enc" ); @@ -184,10 +187,17 @@ void stereo_mdct_core_enc( SetTCXModeInfo( st, st->hTranDet, &st->hTcxCfg->tcx_curr_overlap_mode ); #ifdef IND_LIST_DYN - /* Re-allocate list of indices, if needed (note that st->total_brate is modified later in this function) */ - ind_list_realloc( st->hBstr, ivas_format, st->total_brate ); -#endif + /* re-allocate list of indices, if needed (note that st->total_brate is modified later in this function) */ + /* get the maximum allowed number of indices in the list */ + max_num_indices = get_max_num_indices( ivas_format, st->total_brate ); + /* check, if the maximum number of allowed indices has changed */ + if ( max_num_indices != st->hBstr->max_num_indices ) + { + /* re-allocate the list of indices */ + ind_list_realloc( st->hBstr, max_num_indices ); + } +#endif } /* adaptively sync tcx modes*/ diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index d3c1530b58..3386bc724e 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -79,8 +79,8 @@ typedef struct bitstream_enc_data_structure Indice *ind_list; /* list of indices */ #ifndef IND_LIST_DYN int16_t next_ind; /* pointer to the next empty slot in the list of indices */ + int16_t last_ind; /* last written indice */ #endif - int16_t last_ind; /* last written indice */ int16_t max_num_indices; /* maximum number of indices in the list */ } BSTR_ENC_DATA, *BSTR_ENC_HANDLE; -- GitLab From f8fafc1720dca5236363568a14cb8f2c69077ae8 Mon Sep 17 00:00:00 2001 From: malenov Date: Fri, 10 Mar 2023 12:07:02 +0100 Subject: [PATCH 014/331] add max_num_indices as a parameter to ind_list_realloc() --- lib_com/prot.h | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/lib_com/prot.h b/lib_com/prot.h index 7b6021fd00..db2da8d57e 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -528,14 +528,7 @@ int16_t get_max_num_indices_metadata( /* o : maximum number of indices */ ivas_error ind_list_realloc( BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const int32_t total_brate /* i : total bitrate */ -); - -ivas_error ind_list_metadata_realloc( - BSTR_ENC_HANDLE hMetaData, /* i/o: encoder bitstream handle */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const int32_t ivas_total_brate /* i : IVAS total bitrate */ + int16_t max_num_indices /* i : new maximum number of allowed indices in the list */ ); int16_t find_indice( /* o : index of the indice in the list, -1 if not found */ -- GitLab From f2fe22b120a22c070106aba84decc10e20095211 Mon Sep 17 00:00:00 2001 From: malenov Date: Fri, 10 Mar 2023 12:16:14 +0100 Subject: [PATCH 015/331] cleanup (removal of DEBUG_IND_LIST) insert safety mechanism for ind_list reallocation also in push_next_indice() and push_next_bits() --- apps/encoder.c | 12 ----- lib_com/bitstream.c | 104 ++++++++++++++++++++------------------------ 2 files changed, 47 insertions(+), 69 deletions(-) diff --git a/apps/encoder.c b/apps/encoder.c index 19d89ef91e..cba4a26408 100644 --- a/apps/encoder.c +++ b/apps/encoder.c @@ -47,12 +47,6 @@ #define WMC_TOOL_SKIP -#ifdef DEBUG_IND_LIST -extern int16_t max_total_num_ind; -extern int16_t max_total_num_ind_metadata; -extern int32_t max_at_brate; -#endif - /*------------------------------------------------------------------------------------------* * Local constants, enums, structures *------------------------------------------------------------------------------------------*/ @@ -804,12 +798,6 @@ int main( print_snr(); #endif -#ifdef DEBUG_IND_LIST - printf( "\nMaximum total number of indices: %d at bitrate: %d\n", max_total_num_ind, max_at_brate ); - printf( "\nMaximum total number of indices for metadata: %d\n", max_total_num_ind_metadata ); -#endif - - /*------------------------------------------------------------------------------------------* * Close files and deallocate resources *------------------------------------------------------------------------------------------*/ diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index e1d24f1745..f40e980105 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -66,12 +66,6 @@ FILE *FEC_pattern = NULL; /* FEC pattern file (for simulation of FEC) */ #define STEP_MAX_NUM_INDICES 20 /* increase the maximum number of allowed indices in the list by this amount */ #endif -#ifdef DEBUG_IND_LIST -int16_t max_total_num_ind = 0; -int16_t max_total_num_ind_metadata = 0; -int32_t max_at_brate; -#endif - #ifndef IND_LIST_DYN /*-------------------------------------------------------------------* * pack_bit() @@ -602,9 +596,6 @@ ivas_error push_indice( /* shift indices, if the new id is to be written somewhere inside the list */ if ( i < hBstr->nb_ind_tot ) { -#ifdef DEBUG_IND_LIST_OUT_OF_ORDER - printf( "Indice ID=%d is written before the last indice with ID=%d!\n", id, hBstr->ind_list[hBstr->nb_ind_tot - 1].id ); -#endif for ( j = hBstr->nb_ind_tot; j > i; j-- ) { hBstr->ind_list[j].id = hBstr->ind_list[j - 1].id; @@ -648,9 +639,6 @@ ivas_error push_indice( /* updates */ #ifdef IND_LIST_DYN hBstr->nb_ind_tot++; -#ifdef DEBUG_IND_LIST - assert( (hBstr->nb_ind_tot < hBstr->max_num_indices) && "Maximum number of indices has been exceeded!" ); -#endif #else hBstr->next_ind = i + 1; hBstr->last_ind = id; @@ -707,9 +695,7 @@ ivas_error push_next_indice( { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Total number of indices exceeded: %d !\n", MAX_NUM_INDICES ); } -#endif -#ifndef IND_LIST_DYN if ( hBstr->ind_list[hBstr->next_ind].nb_bits > 0 ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Indice with value %d is trying to re-write an existing indice (frame %d) !\n", value, frame ); @@ -717,6 +703,22 @@ ivas_error push_next_indice( #endif #endif +#ifdef IND_LIST_DYN + /* check, if the maximum number of indices has been reached and re-allocate the buffer */ + /* the re-allocation can be avoided by increasing the limits in get_max_num_indices() and get_max_num_indices_metadata() */ + if ( hBstr->nb_ind_tot >= hBstr->max_num_indices ) + { +#ifdef DEBUGGING + DEBUG_LINE( 1 ) + printf( "Warning: Maximum number of indices %d has been exceeded (frame %d)! Increase the limits in get_max_num_indices() or get_max_num_indices_metadata().\n", hBstr->max_num_indices, frame ); +#endif + + /* reallocate the buffer of indices with increased limit */ + ind_list_realloc( hBstr, hBstr->nb_ind_tot + STEP_MAX_NUM_INDICES ); + } +#endif + + #ifdef IND_LIST_DYN /* get the id of the previous indice -> it will be re-used */ if ( hBstr->nb_ind_tot > 0 ) @@ -742,14 +744,9 @@ ivas_error push_next_indice( /* updates */ #ifdef IND_LIST_DYN hBstr->nb_ind_tot++; -#ifdef DEBUG_IND_LIST - assert( ( hBstr->nb_ind_tot < hBstr->max_num_indices ) && "Maximum number of indices has been exceeded!" ); -#endif - #else hBstr->next_ind++; #endif - hBstr->nb_bits_tot += nb_bits; return error; @@ -785,6 +782,7 @@ void push_next_bits( #ifdef DEBUG_BS_READ_WRITE printf( "%s: %d: %d\n", func, line, nb_bits ); #endif + #ifdef IND_LIST_DYN ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; @@ -814,12 +812,24 @@ void push_next_bits( #ifdef IND_LIST_DYN ptr->id = prev_id; hBstr->nb_ind_tot++; -#ifdef DEBUG_IND_LIST - assert( ( hBstr->nb_ind_tot < hBstr->max_num_indices ) && "Maximum number of indices has been exceeded!" ); #endif + +#ifdef IND_LIST_DYN + /* check, if the maximum number of indices has been reached and re-allocate the buffer */ + /* the re-allocation can be avoided by increasing the limits in get_max_num_indices() and get_max_num_indices_metadata() */ + if ( hBstr->nb_ind_tot >= hBstr->max_num_indices ) + { +#ifdef DEBUGGING + DEBUG_LINE( 1 ) + printf( "Warning: Maximum number of indices %d has been exceeded (frame %d)! Increase the limits in get_max_num_indices() or get_max_num_indices_metadata().\n", hBstr->max_num_indices, frame ); +#endif + + /* reallocate the buffer of indices with increased limit */ + ind_list_realloc( hBstr, hBstr->nb_ind_tot + STEP_MAX_NUM_INDICES ); + } #endif - ++ptr; + ++ptr; } for ( ; i < nb_bits; ++i ) @@ -832,12 +842,24 @@ void push_next_bits( #ifdef IND_LIST_DYN ptr->id = prev_id; hBstr->nb_ind_tot++; -#ifdef DEBUG_IND_LIST - assert( ( hBstr->nb_ind_tot < hBstr->max_num_indices ) && "Maximum number of indices has been exceeded!" ); #endif + +#ifdef IND_LIST_DYN + /* check, if the maximum number of indices has been reached and re-allocate the buffer */ + /* the re-allocation can be avoided by increasing the limits in get_max_num_indices() and get_max_num_indices_metadata() */ + if ( hBstr->nb_ind_tot >= hBstr->max_num_indices ) + { +#ifdef DEBUGGING + DEBUG_LINE( 1 ) + printf( "Warning: Maximum number of indices %d has been exceeded (frame %d)! Increase the limits in get_max_num_indices() or get_max_num_indices_metadata().\n", hBstr->max_num_indices, frame ); #endif - ++ptr; + /* reallocate the buffer of indices with increased limit */ + ind_list_realloc( hBstr, hBstr->nb_ind_tot + STEP_MAX_NUM_INDICES ); + } +#endif + + ++ptr; } #ifndef IND_LIST_DYN @@ -1416,13 +1438,6 @@ static ivas_error write_indices_element( { if ( st_ivas->hSCE[element_id]->hMetaData != NULL ) { -#ifdef DEBUG_IND_LIST - /* find the maximum number of metadata indices */ - if ( st_ivas->hSCE[element_id]->hMetaData->nb_ind_tot > max_total_num_ind_metadata ) - { - max_total_num_ind_metadata = st_ivas->hSCE[element_id]->hMetaData->nb_ind_tot; - } -#endif #ifdef IND_LIST_DYN reset_indices_enc( st_ivas->hSCE[element_id]->hMetaData, st_ivas->hSCE[element_id]->hMetaData->max_num_indices ); #else @@ -1430,15 +1445,6 @@ static ivas_error write_indices_element( #endif } -#ifdef DEBUG_IND_LIST - /* find the maximum number of core-coder indices */ - if ( sts[0]->hBstr->nb_ind_tot > max_total_num_ind ) - { - max_total_num_ind = sts[0]->hBstr->nb_ind_tot; - max_at_brate = sts[0]->total_brate; - } -#endif - reset_indices_enc( sts[0]->hBstr, #ifdef IND_LIST_DYN sts[0]->hBstr->max_num_indices @@ -1451,13 +1457,6 @@ static ivas_error write_indices_element( { if ( st_ivas->hCPE[element_id]->hMetaData != NULL ) { -#ifdef DEBUG_IND_LIST - /* find the maximum number of metadata indices */ - if ( st_ivas->hCPE[element_id]->hMetaData->nb_ind_tot > max_total_num_ind_metadata ) - { - max_total_num_ind_metadata = st_ivas->hCPE[element_id]->hMetaData->nb_ind_tot; - } -#endif #ifdef IND_LIST_DYN reset_indices_enc( st_ivas->hCPE[element_id]->hMetaData, st_ivas->hCPE[element_id]->hMetaData->max_num_indices ); #else @@ -1467,15 +1466,6 @@ static ivas_error write_indices_element( for ( n = 0; n < n_channels; n++ ) { -#ifdef DEBUG_IND_LIST - /* find the maximum number of core-coder indices */ - if ( sts[n]->hBstr->nb_ind_tot > max_total_num_ind ) - { - max_total_num_ind = sts[n]->hBstr->nb_ind_tot; - max_at_brate = sts[0]->total_brate; - } -#endif - reset_indices_enc( sts[n]->hBstr, #ifdef IND_LIST_DYN sts[n]->hBstr->max_num_indices -- GitLab From 38561e92689c661231cd34aa59dd229c4d749a9f Mon Sep 17 00:00:00 2001 From: malenov Date: Fri, 10 Mar 2023 12:22:17 +0100 Subject: [PATCH 016/331] remove macro BITSTREAM_INDICES_MEMORY --- .gitignore | 22 ---------------------- lib_com/options.h | 16 ++++++++-------- lib_enc/lib_enc.c | 13 ------------- 3 files changed, 8 insertions(+), 43 deletions(-) diff --git a/.gitignore b/.gitignore index 6a8896ad76..c87c691a4a 100644 --- a/.gitignore +++ b/.gitignore @@ -72,25 +72,3 @@ Externals/ # coan output files that are created when cleaning out switches coan_out_* -/ci/complexity_measurements/__zaloha -/COMPLEXITY -/scripts/ivas_pytests/tests/unit_tests/crend/tv -/scripts/wmops -/scripts/__zaloha -/tv -/scripts/td_object_renderer/object_renderer_standalone -/scripts/ivas_pytests/tests/unit_tests/crend -/scripts/config/short_test.prm -/NTT_critical_data.pwv -/IvasBuilder.txt -/ind_list.pwv -/I18-comments.c -/build.txt -/__zaloha -/Workspace_msvc/decoder.args.json -/Workspace_msvc/encoder.args.json -/Workspace_msvc/lib_dec.args.json -/scripts/Vlad_mergeNewsletters.py -/scripts/Vlad_extract_max_num_ind.py -/scripts/max_num_indices.xlsx -/res diff --git a/lib_com/options.h b/lib_com/options.h index 9249366ad5..1c21751bfc 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -50,16 +50,12 @@ #ifndef RELEASE #define DEBUGGING /* Activate debugging part of the code */ #endif -#define WMOPS /* Activate complexity and memory counters */ +/*#define WMOPS*/ /* Activate complexity and memory counters */ /*#define WMOPS_PER_FRAME*/ /* Output per-frame complexity (writes one float value per frame to the file "wmops_analysis") */ /*#define WMOPS_DETAIL*/ /* Output detailed complexity printout for every function. Increases runtime overhead */ /*#define WMOPS_WC_FRAME_ANALYSIS*/ /* Output detailed complexity analysis for the worst-case frame */ /*#define MEM_COUNT_DETAILS*/ /* Output detailed memory analysis for the worst-case frame (writes to the file "mem_analysis.csv") */ -/*#define BITSTREAM_INDICES_MEMORY*/ /* Don't count memory for bitstream Indice at the encoder - it is a temporary solution for development only */ -#define IND_LIST_DYN /* dynamic allocation of ind_list based on transport channels */ -/*#define DEBUG_IND_LIST*/ - #ifdef DEBUGGING /*#define DEBUG_MODE_INFO*/ /* output most important parameters to the subdirectory "res/" */ @@ -136,6 +132,7 @@ /* ################# Start DEVELOPMENT switches ######################## */ #define BASOP_NOGLOB /* Disable global symbols in BASOPs, Overflow/Carry in BASOPs disabled, additional BASOPs in case of Overflow */ +#define IND_LIST_DYN /* VA: Issue 18: Dynamic allocation of ind_list[] and ind_list_metadata[] based on # of transport channels */ #define LSF_RE_USE_SECONDARY_CHANNEL /* TD stereo Secondary channel LSF Q improvement */ #ifdef LSF_RE_USE_SECONDARY_CHANNEL @@ -144,10 +141,12 @@ #define DISABLE_ADAP_RES_COD_TMP /* temporary fix for IVAS-403, disables adaptive residual coding */ /*#define ITD_WINNER_GAIN_MODIFY */ /* ITD optimization - WORK IN PROGRESS */ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ - +#define SBA_BR_SWITCHING_CLEAN_UP /*Issue 114: Clean up changes for the SBA reconfiguation functions*/ #define LOW_RATE_TRANS_CORE_CODER /* Eri: Activate low-rate-encoding-of-transients contribution for core coder, affects MC, MASA and SBA */ -#define FIX_197_CREND_INTERFACE +#define FIX_197_CREND_INTERFACE #define FIX_329_ENABLE_TD_RENDERER_REVERB_MC /* Eri: Enable reverb for TD renderer for 5.1 and 7.1 with headtracking enabled for IVAS_dec */ +#define FIX_330_ENABLE_TD_RENDERER_REVERB_REND /* Eri: Enable reverb for TD renderer for ISM, 5.1 and 7.1 with headtracking enabled for IVAS_rend */ + #define FIX_347_DTX_CRASH /* FhG: Fix crash that can happen with DTX */ #define DISABLE_RES_CHANNELS_MCT /* decode only W and residual for Y when outputting to stereo */ #define FIX_107_5MS_SUBFRAME_RENDERING @@ -165,9 +164,10 @@ #define BINAURALIZATION_DELAY_REPORT /* VA: Issue 255 - Changes the way the decoder delay is reported */ #define FIX_351_HRTF_COMMAND /* VA: Issue 354 - improve "-hrtf" command-line option */ - #define FIX_94_VERIFY_WAV_NUM_CHANNELS /* FhG: Issue 94 - Check if number of channels in input wav file matches encoder/renderer configuration */ #define ISM_HIGHEST_BITRATE /* VA: Issue 284: Update highest bitrate limit in ISM format */ +#define TUNE_360_OBJECT_WITH_NOISE /* VA: issue 360: consider objects being speech+noise for active speech coding */ +#define FIX_350_MASA_DELAY_COMP /* Nokia: Issue 350: MASA audio/meta delay compensation */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 91b12d298d..d2b1fe4e84 100755 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -116,13 +116,7 @@ ivas_error IVAS_ENC_Open( * Allocate and initialize IVAS application encoder handle *-----------------------------------------------------------------*/ -#ifdef BITSTREAM_INDICES_MEMORY -#define WMC_TOOL_SKIP if ( ( *phIvasEnc = (IVAS_ENC_HANDLE) malloc( sizeof( struct IVAS_ENC ) ) ) == NULL ) -#undef WMC_TOOL_SKIP -#else - if ( ( *phIvasEnc = (IVAS_ENC_HANDLE) malloc( sizeof( struct IVAS_ENC ) ) ) == NULL ) -#endif { return IVAS_ERR_FAILED_ALLOC; } @@ -230,14 +224,7 @@ void IVAS_ENC_Close( ( *phIvasEnc )->st_ivas = NULL; -#ifdef BITSTREAM_INDICES_MEMORY -#define WMC_TOOL_SKIP free( *phIvasEnc ); -#undef WMC_TOOL_SKIP -#else - free( *phIvasEnc ); -#endif - *phIvasEnc = NULL; phIvasEnc = NULL; -- GitLab From 7230a6caf648fc16225bcd6065ddc25d2fd2e65b Mon Sep 17 00:00:00 2001 From: malenov Date: Mon, 13 Mar 2023 09:40:54 +0100 Subject: [PATCH 017/331] clang formatting --- lib_com/bitstream.c | 126 +++++++++++++------------- lib_com/prot.h | 34 +++---- lib_enc/enc_ppp.c | 2 +- lib_enc/fd_cng_enc.c | 6 +- lib_enc/igf_enc.c | 2 +- lib_enc/init_enc.c | 4 +- lib_enc/ivas_core_enc.c | 4 +- lib_enc/ivas_corecoder_enc_reconfig.c | 9 +- lib_enc/ivas_cpe_enc.c | 12 +-- lib_enc/ivas_init_enc.c | 8 +- lib_enc/ivas_ism_dtx_enc.c | 4 +- lib_enc/ivas_qmetadata_enc.c | 8 +- lib_enc/ivas_sce_enc.c | 16 ++-- lib_enc/ivas_spar_encoder.c | 12 +-- lib_enc/ivas_spar_md_enc.c | 9 +- lib_enc/ivas_stereo_mdct_core_enc.c | 4 +- lib_enc/lib_enc.c | 12 ++- lib_enc/stat_enc.h | 4 +- 18 files changed, 139 insertions(+), 137 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index f40e980105..d0d7f442c6 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -63,7 +63,7 @@ FILE *FEC_pattern = NULL; /* FEC pattern file (for simulation of FEC) */ #endif #ifdef IND_LIST_DYN -#define STEP_MAX_NUM_INDICES 20 /* increase the maximum number of allowed indices in the list by this amount */ +#define STEP_MAX_NUM_INDICES 20 /* increase the maximum number of allowed indices in the list by this amount */ #endif #ifndef IND_LIST_DYN @@ -228,8 +228,8 @@ Word16 rate2EVSmode( *-------------------------------------------------------------------*/ ivas_error ind_list_realloc( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - int16_t max_num_indices /* i : new maximum number of allowed indices in the list */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + int16_t max_num_indices /* i : new maximum number of allowed indices in the list */ ) { int16_t i; @@ -275,58 +275,58 @@ ivas_error ind_list_realloc( * Re-allocate list of metadata indices if the IVAS total bitrate has changed *-------------------------------------------------------------------*/ -//ivas_error ind_list_metadata_realloc( -// BSTR_ENC_HANDLE hMetaData, /* i/o: encoder bitstream handle */ -// const IVAS_FORMAT ivas_format, /* i : IVAS format */ -// const int32_t ivas_total_brate /* i : IVAS total bitrate */ +// ivas_error ind_list_metadata_realloc( +// BSTR_ENC_HANDLE hMetaData, /* i/o: encoder bitstream handle */ +// const IVAS_FORMAT ivas_format, /* i : IVAS format */ +// const int32_t ivas_total_brate /* i : IVAS total bitrate */ //) //{ -// int16_t i, max_num_indices_metadata; -// INDICE_HANDLE new_ind_list_metadata; +// int16_t i, max_num_indices_metadata; +// INDICE_HANDLE new_ind_list_metadata; // -// if ( hMetaData != NULL && hMetaData->ind_list != NULL ) -// { -// /* get the maximum allowed number of indices in the list */ -// max_num_indices_metadata = get_max_num_indices_metadata( ivas_format, ivas_total_brate ); +// if ( hMetaData != NULL && hMetaData->ind_list != NULL ) +// { +// /* get the maximum allowed number of indices in the list */ +// max_num_indices_metadata = get_max_num_indices_metadata( ivas_format, ivas_total_brate ); // -// /* check, if the maximum number of allowed indices has changed */ -// if ( max_num_indices_metadata != hMetaData->max_num_indices ) -// { -// /* allocate new buffer of metadata indices */ -// if ( ( new_ind_list_metadata = (INDICE_HANDLE) malloc( max_num_indices_metadata * sizeof( Indice ) ) ) == NULL ) -// { -// return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of metadata indices!\n" ) ); -// } +// /* check, if the maximum number of allowed indices has changed */ +// if ( max_num_indices_metadata != hMetaData->max_num_indices ) +// { +// /* allocate new buffer of metadata indices */ +// if ( ( new_ind_list_metadata = (INDICE_HANDLE) malloc( max_num_indices_metadata * sizeof( Indice ) ) ) == NULL ) +// { +// return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of metadata indices!\n" ) ); +// } // -// /* move indices from the old list to the new list */ -// i = 0; -// while ( hMetaData->ind_list[i].nb_bits > 0 ) -// { -// new_ind_list_metadata[i].id = hMetaData->ind_list[i].id; -// new_ind_list_metadata[i].value = hMetaData->ind_list[i].value; -// new_ind_list_metadata[i].nb_bits = hMetaData->ind_list[i].nb_bits; -// i++; -// } +// /* move indices from the old list to the new list */ +// i = 0; +// while ( hMetaData->ind_list[i].nb_bits > 0 ) +// { +// new_ind_list_metadata[i].id = hMetaData->ind_list[i].id; +// new_ind_list_metadata[i].value = hMetaData->ind_list[i].value; +// new_ind_list_metadata[i].nb_bits = hMetaData->ind_list[i].nb_bits; +// i++; +// } // -// /* reset nb_bits of all other indices to -1 */ -// for ( ; i < max_num_indices_metadata; i++ ) -// { -// new_ind_list_metadata[i].nb_bits = -1; -// } +// /* reset nb_bits of all other indices to -1 */ +// for ( ; i < max_num_indices_metadata; i++ ) +// { +// new_ind_list_metadata[i].nb_bits = -1; +// } // -// /* free the old list */ -// free( hMetaData->ind_list ); +// /* free the old list */ +// free( hMetaData->ind_list ); // -// /* set pointer to the new list */ -// hMetaData->ind_list = new_ind_list_metadata; +// /* set pointer to the new list */ +// hMetaData->ind_list = new_ind_list_metadata; // -// /* set the new maximum for the allowed number of indices */ -// hMetaData->max_num_indices = max_num_indices_metadata; -// } -// } +// /* set the new maximum for the allowed number of indices */ +// hMetaData->max_num_indices = max_num_indices_metadata; +// } +// } // -// return IVAS_ERR_OK; -//} +// return IVAS_ERR_OK; +// } /*-----------------------------------------------------------------------* * get_max_num_indices() @@ -334,9 +334,9 @@ ivas_error ind_list_realloc( * Set the maximum allowed number of indices in the list *-----------------------------------------------------------------------*/ -int16_t get_max_num_indices( /* o : maximum number of indices */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const int32_t total_brate /* i : total bitrate */ +int16_t get_max_num_indices( /* o : maximum number of indices */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t total_brate /* i : total bitrate */ ) { /* set the maximum required number of indices */ @@ -433,9 +433,9 @@ int16_t get_max_num_indices( /* o : maximum number of indices */ * Set the maximum allowed number of metadata indices in the list *-----------------------------------------------------------------------*/ -int16_t get_max_num_indices_metadata( /* o : maximum number of indices */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const int32_t ivas_total_brate /* i : IVAS total bitrate */ +int16_t get_max_num_indices_metadata( /* o : maximum number of indices */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ ) { /* set the maximum required number of metadata indices */ @@ -863,7 +863,7 @@ void push_next_bits( } #ifndef IND_LIST_DYN - hBstr->next_ind = ( int16_t )( ptr - hBstr->ind_list ); + hBstr->next_ind = (int16_t) ( ptr - hBstr->ind_list ); #endif hBstr->nb_bits_tot = hBstr->nb_bits_tot + nb_bits; @@ -1385,10 +1385,10 @@ static ivas_error write_indices_element( #endif write_indices_to_stream( ind_list_metadata, &pt_stream_loc, -1, #ifdef IND_LIST_DYN - nb_ind_tot_metadata + nb_ind_tot_metadata #else - MAX_BITS_METADATA -#endif + MAX_BITS_METADATA +#endif ); #ifdef ENABLE_BITRATE_VERIFICATION @@ -1411,10 +1411,10 @@ static ivas_error write_indices_element( #endif write_indices_to_stream( sts[n]->hBstr->ind_list, &pt_stream_loc, 1, #ifdef IND_LIST_DYN - sts[n]->hBstr->nb_ind_tot + sts[n]->hBstr->nb_ind_tot #else - MAX_NUM_INDICES -#endif + MAX_NUM_INDICES +#endif ); #ifdef ENABLE_BITRATE_VERIFICATION @@ -1447,10 +1447,10 @@ static ivas_error write_indices_element( reset_indices_enc( sts[0]->hBstr, #ifdef IND_LIST_DYN - sts[0]->hBstr->max_num_indices + sts[0]->hBstr->max_num_indices #else - MAX_NUM_INDICES -#endif + MAX_NUM_INDICES +#endif ); } else @@ -1466,12 +1466,12 @@ static ivas_error write_indices_element( for ( n = 0; n < n_channels; n++ ) { - reset_indices_enc( sts[n]->hBstr, + reset_indices_enc( sts[n]->hBstr, #ifdef IND_LIST_DYN sts[n]->hBstr->max_num_indices #else MAX_NUM_INDICES -#endif +#endif ); } } diff --git a/lib_com/prot.h b/lib_com/prot.h index cc3fb8d93b..5ffb9d0946 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -516,31 +516,31 @@ void push_next_bits( ); #ifdef IND_LIST_DYN -int16_t get_max_num_indices( /* o : maximum number of indices */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const int32_t total_brate /* i : total bitrate */ +int16_t get_max_num_indices( /* o : maximum number of indices */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t total_brate /* i : total bitrate */ ); -int16_t get_max_num_indices_metadata( /* o : maximum number of indices */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const int32_t ivas_total_brate /* i : IVAS total bitrate */ +int16_t get_max_num_indices_metadata( /* o : maximum number of indices */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ ); ivas_error ind_list_realloc( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - int16_t max_num_indices /* i : new maximum number of allowed indices in the list */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + int16_t max_num_indices /* i : new maximum number of allowed indices in the list */ ); -int16_t find_indice( /* o : index of the indice in the list, -1 if not found */ - BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ - int16_t id, /* i : ID of the indice */ - uint16_t *value, /* o : value of the quantized indice */ - int16_t *nb_bits /* o : number of bits used to quantize the indice */ +int16_t find_indice( /* o : index of the indice in the list, -1 if not found */ + BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ + int16_t id, /* i : ID of the indice */ + uint16_t *value, /* o : value of the quantized indice */ + int16_t *nb_bits /* o : number of bits used to quantize the indice */ ); -uint16_t delete_indice( /* o : number of deleted indices */ - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - int16_t id /* i : ID of the indice */ +uint16_t delete_indice( /* o : number of deleted indices */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + int16_t id /* i : ID of the indice */ ); #endif @@ -2255,7 +2255,7 @@ void read_next_force( ); #endif ivas_error init_encoder( - Encoder_State *st, /* i/o: state structure */ + Encoder_State *st, /* i/o: state structure */ #ifdef IND_LIST_DYN ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : encoder configuration handle */ #endif diff --git a/lib_enc/enc_ppp.c b/lib_enc/enc_ppp.c index 8d1ffcecd7..a70d37a4dc 100644 --- a/lib_enc/enc_ppp.c +++ b/lib_enc/enc_ppp.c @@ -175,7 +175,7 @@ ivas_error encod_ppp( #else MAX_NUM_INDICES #endif - ); + ); /* signaling matrix (writing of signaling bits) */ signaling_enc( st ); diff --git a/lib_enc/fd_cng_enc.c b/lib_enc/fd_cng_enc.c index 2d81bd433f..e0341e00c3 100644 --- a/lib_enc/fd_cng_enc.c +++ b/lib_enc/fd_cng_enc.c @@ -899,20 +899,20 @@ void stereoFdCngCoherence( else if ( sts[0]->core_brate <= SID_2k40 && sts[1]->core_brate <= SID_2k40 ) { /* case: no VAD for both channels -> INACTIVE FRAME */ - reset_indices_enc( sts[0]->hBstr, + reset_indices_enc( sts[0]->hBstr, #ifdef IND_LIST_DYN sts[0]->hBstr->max_num_indices #else MAX_NUM_INDICES #endif - ); + ); reset_indices_enc( sts[1]->hBstr, #ifdef IND_LIST_DYN sts[1]->hBstr->max_num_indices #else MAX_NUM_INDICES #endif - ); + ); /* synchronize SID sending for variable SID rate */ if ( sts[0]->core_brate != sts[1]->core_brate ) diff --git a/lib_enc/igf_enc.c b/lib_enc/igf_enc.c index d01ca40057..677bc1639e 100644 --- a/lib_enc/igf_enc.c +++ b/lib_enc/igf_enc.c @@ -1759,7 +1759,7 @@ void IGFEncConcatenateBitstream( IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; #ifdef IND_LIST_DYN Indice *ind_list; - uint8_t *pFrame; /* byte array with bit packet and byte aligned coded speech data */ + uint8_t *pFrame; /* byte array with bit packet and byte aligned coded speech data */ int16_t *pFrame_size; /* number of bits in the binary encoded access unit [bits] */ int16_t k, nb_bits_written; int32_t imask; diff --git a/lib_enc/init_enc.c b/lib_enc/init_enc.c index fd5ae491b3..a2a168262d 100644 --- a/lib_enc/init_enc.c +++ b/lib_enc/init_enc.c @@ -54,7 +54,7 @@ *-----------------------------------------------------------------------*/ ivas_error init_encoder( - Encoder_State *st, /* i/o: state structure */ + Encoder_State *st, /* i/o: state structure */ #ifdef IND_LIST_DYN ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : encoder configuration handle */ #endif @@ -859,8 +859,6 @@ ivas_error init_encoder( } - - /*-----------------------------------------------------------------------* * LPDmem_enc_init() * diff --git a/lib_enc/ivas_core_enc.c b/lib_enc/ivas_core_enc.c index 603e5b1468..d4e5e6c686 100644 --- a/lib_enc/ivas_core_enc.c +++ b/lib_enc/ivas_core_enc.c @@ -284,9 +284,9 @@ ivas_error ivas_core_enc( { stereo_mdct_core_enc( hCPE, #ifdef IND_LIST_DYN - ivas_format, + ivas_format, #endif - old_inp_16k, old_wsp, pitch_buf ); + old_inp_16k, old_wsp, pitch_buf ); } } else if ( sts[0]->core_brate == SID_2k40 && sts[1]->core_brate == SID_2k40 ) diff --git a/lib_enc/ivas_corecoder_enc_reconfig.c b/lib_enc/ivas_corecoder_enc_reconfig.c index 06cbe153ce..18d7f06e0e 100644 --- a/lib_enc/ivas_corecoder_enc_reconfig.c +++ b/lib_enc/ivas_corecoder_enc_reconfig.c @@ -235,7 +235,7 @@ ivas_error ivas_corecoder_enc_reconfig( } #ifdef DEBUGGING - assert( (nb_bits == nb_bits_tot) && "Error saving bitstream information during core-coder reconfiguration!\n" ); + assert( ( nb_bits == nb_bits_tot ) && "Error saving bitstream information during core-coder reconfiguration!\n" ); #endif #endif #ifndef IND_LIST_DYN @@ -344,13 +344,13 @@ ivas_error ivas_corecoder_enc_reconfig( /* only reset indices if it is not the first index list, this already contains the IVAS format bits */ if ( sce_id > 0 ) { - reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, + reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, #ifdef IND_LIST_DYN st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->max_num_indices #else MAX_NUM_INDICES #endif - ); + ); } else { @@ -408,7 +408,7 @@ ivas_error ivas_corecoder_enc_reconfig( #endif if ( cpe_id * CPE_CHANNELS + n > 0 || ( st_ivas->mc_mode == MC_MODE_MCMASA && st_ivas->nSCE > 0 ) ) { - reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, + reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, #ifdef IND_LIST_DYN st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->max_num_indices #else @@ -511,7 +511,6 @@ ivas_error ivas_corecoder_enc_reconfig( assert( ( nb_bits == nb_bits_tot ) && "Error restoring bitstream information during core-coder reconfiguration!\n" ); #endif #endif - } if ( hEncoderConfig->Opt_DTX_ON ) diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index 47709dc036..054804372b 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -856,15 +856,15 @@ ivas_error create_cpe_enc( #ifdef PARAM_ISM_DTX_CNG if ( ( error = init_encoder( st, #ifdef IND_LIST_DYN - hEncoderConfig, -#endif - n, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 0, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) + hEncoderConfig, +#endif + n, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 0, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) #else if ( ( error = init_encoder( st, #ifdef IND_LIST_DYN - hEncoderConfig, -#endif - n, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 0 ) ) != IVAS_ERR_OK ) + hEncoderConfig, +#endif + n, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 0 ) ) != IVAS_ERR_OK ) #endif { return error; diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index 2b976761f2..9af3c7e8a8 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -319,12 +319,14 @@ void ivas_initialize_handles_enc( *-------------------------------------------------------------------*/ ivas_error ivas_init_encoder( - Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ #ifndef IND_LIST_DYN - ,Indice ind_list[][MAX_NUM_INDICES] /* o : bitstream indices */ + , + Indice ind_list[][MAX_NUM_INDICES] /* o : bitstream indices */ #endif #ifndef IND_LIST_DYN - ,Indice ind_list_metadata[][MAX_BITS_METADATA] /* o : bitstream indices metadata */ + , + Indice ind_list_metadata[][MAX_BITS_METADATA] /* o : bitstream indices metadata */ #endif ) { diff --git a/lib_enc/ivas_ism_dtx_enc.c b/lib_enc/ivas_ism_dtx_enc.c index f8eebe6d61..bc8134f365 100644 --- a/lib_enc/ivas_ism_dtx_enc.c +++ b/lib_enc/ivas_ism_dtx_enc.c @@ -174,8 +174,8 @@ int16_t ivas_ism_dtx_enc( #ifdef IND_LIST_DYN st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->max_num_indices #else - MAX_NUM_INDICES -#endif + MAX_NUM_INDICES +#endif ); } diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index 2b969a6d76..97bc34a9cb 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -456,11 +456,11 @@ ivas_error ivas_qmetadata_enc_encode( /* Encode quantized directions with EC band-wise */ if ( ( total_bits_1dir + bits_surround_coh <= hQMetaData->qmetadata_max_bit_req ) && ( bits_dir[d] + bits_diff[d] + bits_coherence[d] + bits_signaling[d] > total_bits_1dir ) && q_direction->cfg.nblocks > 1 ) { - restore_metadata_buffer( hMetaData, next_ind_start, + restore_metadata_buffer( hMetaData, next_ind_start, #ifndef IND_LIST_DYN last_ind_start, #endif - bit_pos_start ); + bit_pos_start ); /* Write signaling */ push_next_indice( hMetaData, 1, 1 ); /*Write 1 bit to signal no EC frame-wise (EC1)*/ @@ -541,11 +541,11 @@ ivas_error ivas_qmetadata_enc_encode( /*Bit budget exceeded, bit reduction strategy?*/ extra_bits = 0; - restore_metadata_buffer( hMetaData, next_ind_start, + restore_metadata_buffer( hMetaData, next_ind_start, #ifndef IND_LIST_DYN last_ind_start, #endif - bit_pos_start ); + bit_pos_start ); push_next_indice( hMetaData, 1, 1 ); /*Write 1 bit to signal no EC frame-wise (EC1)*/ if ( nblocks > 1 ) diff --git a/lib_enc/ivas_sce_enc.c b/lib_enc/ivas_sce_enc.c index 5657eac579..03cc8d9028 100644 --- a/lib_enc/ivas_sce_enc.c +++ b/lib_enc/ivas_sce_enc.c @@ -357,17 +357,17 @@ ivas_error create_sce_enc( st->mct_chan_mode = MCT_CHAN_MODE_REGULAR; #ifdef PARAM_ISM_DTX_CNG - if ( ( error = init_encoder( st, + if ( ( error = init_encoder( st, #ifdef IND_LIST_DYN - st_ivas->hEncoderConfig, -#endif - 0, st_ivas->hEncoderConfig->var_SID_rate_flag, st_ivas->hEncoderConfig->interval_SID, 0, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) + st_ivas->hEncoderConfig, +#endif + 0, st_ivas->hEncoderConfig->var_SID_rate_flag, st_ivas->hEncoderConfig->interval_SID, 0, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) #else - if ( ( error = init_encoder( st, + if ( ( error = init_encoder( st, #ifdef IND_LIST_DYN - st_ivas->hEncoderConfig, -#endif - 0, st_ivas->hEncoderConfig->var_SID_rate_flag, st_ivas->hEncoderConfig->interval_SID, 0 ) ) != IVAS_ERR_OK ) + st_ivas->hEncoderConfig, +#endif + 0, st_ivas->hEncoderConfig->var_SID_rate_flag, st_ivas->hEncoderConfig->interval_SID, 0 ) ) != IVAS_ERR_OK ) #endif { return error; diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index aca9fed994..43058148d4 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -222,15 +222,15 @@ ivas_error ivas_spar_enc_open( #ifdef PARAM_ISM_DTX_CNG if ( ( error = init_encoder( hSpar->hCoreCoderVAD, #ifdef IND_LIST_DYN - hEncoderConfig, -#endif - 0, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 1, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) + hEncoderConfig, +#endif + 0, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 1, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) #else if ( ( error = init_encoder( hSpar->hCoreCoderVAD, #ifdef IND_LIST_DYN - hEncoderConfig, -#endif - 0, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 1 ) ) != IVAS_ERR_OK ) + hEncoderConfig, +#endif + 0, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 1 ) ) != IVAS_ERR_OK ) #endif { return error; diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index e1bc2b0d7d..6b2492ebb4 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -513,7 +513,7 @@ static void write_metadata_buffer( const int16_t next_ind_start #ifndef IND_LIST_DYN , - const int16_t last_ind_start + const int16_t last_ind_start #endif ) { @@ -525,7 +525,7 @@ static void write_metadata_buffer( #ifndef IND_LIST_DYN last_ind_start, #endif - bit_pos_start ); + bit_pos_start ); } #ifdef IND_LIST_DYN @@ -903,8 +903,9 @@ ivas_error ivas_spar_md_enc_process( { write_metadata_buffer( &hMetaData_tmp, hMetaData, bit_pos_start, next_ind_start #ifndef IND_LIST_DYN - , last_ind_start -#endif + , + last_ind_start +#endif ); code_strat = strat; } diff --git a/lib_enc/ivas_stereo_mdct_core_enc.c b/lib_enc/ivas_stereo_mdct_core_enc.c index ec5277925b..047db979e2 100644 --- a/lib_enc/ivas_stereo_mdct_core_enc.c +++ b/lib_enc/ivas_stereo_mdct_core_enc.c @@ -116,9 +116,9 @@ static void sync_tcx_mode( *-------------------------------------------------------------------*/ void stereo_mdct_core_enc( - CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ #ifdef IND_LIST_DYN - const int16_t ivas_format, /* i : IVAS format */ + const int16_t ivas_format, /* i : IVAS format */ #endif float new_samples[CPE_CHANNELS][L_INP], /* i : new samples */ float old_wsp[CPE_CHANNELS][L_WSP], /* i : 12.8kHz weighted speech (for LTP */ diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 3103b87b30..1b771a041c 100755 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -49,7 +49,7 @@ struct IVAS_ENC { Encoder_Struct *st_ivas; #ifndef IND_LIST_DYN - Indice ind_list[MAX_NUM_DATA][MAX_NUM_INDICES]; /* list of indices */ + Indice ind_list[MAX_NUM_DATA][MAX_NUM_INDICES]; /* list of indices */ #endif #ifndef IND_LIST_DYN Indice ind_list_metadata[MAX_NUM_METADATA][MAX_BITS_METADATA]; /* list of indices for metadata */ @@ -914,12 +914,14 @@ static ivas_error configureEncoder( if ( ( error = ivas_init_encoder( st_ivas #ifndef IND_LIST_DYN - ,hIvasEnc->ind_list + , + hIvasEnc->ind_list #endif #ifndef IND_LIST_DYN - ,hIvasEnc->ind_list_metadata -#endif - ) ) != IVAS_ERR_OK ) + , + hIvasEnc->ind_list_metadata +#endif + ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index 3386bc724e..c37ed76dc7 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -78,8 +78,8 @@ typedef struct bitstream_enc_data_structure int16_t nb_bits_tot; /* total number of bits already written */ Indice *ind_list; /* list of indices */ #ifndef IND_LIST_DYN - int16_t next_ind; /* pointer to the next empty slot in the list of indices */ - int16_t last_ind; /* last written indice */ + int16_t next_ind; /* pointer to the next empty slot in the list of indices */ + int16_t last_ind; /* last written indice */ #endif int16_t max_num_indices; /* maximum number of indices in the list */ } BSTR_ENC_DATA, *BSTR_ENC_HANDLE; -- GitLab From 3b0318ec2f1a97478ef3d0aedefae5f20ac4f6cb Mon Sep 17 00:00:00 2001 From: Shikha Shetgeri <100861@ittiam.com> Date: Mon, 20 Mar 2023 20:34:46 +0530 Subject: [PATCH 018/331] Added functionality to populate the hMetaData_tmp buffer dynamically --- lib_com/options.h | 1 + lib_enc/ivas_spar_encoder.c | 1 - lib_enc/ivas_spar_md_enc.c | 60 +++++++++++++++++++++++++++++++++++-- lib_enc/ivas_stat_enc.h | 6 ++-- 4 files changed, 63 insertions(+), 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 940d3857fa..6fb4689323 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -170,6 +170,7 @@ #define FIX_350_MASA_DELAY_COMP /* Nokia: Issue 350: MASA audio/meta delay compensation */ #define FIX_372_LIB_REND_VALIDATE_IO /* FhG: Issue 372: IVAS_rend segfaults with unsupported I/O configs - add validation checks of I/O config */ +#define ARITH_HUFF_CODER_CHANGES /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ #endif diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index b156c524d2..bb91e0b5b9 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -236,7 +236,6 @@ ivas_error ivas_spar_enc_open( #ifdef SBA_BR_SWITCHING_CLEAN_UP } #endif - /*-----------------------------------------------------------------* * Final assignment *-----------------------------------------------------------------*/ diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index bcc6718e9a..6d5304031e 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -111,7 +111,11 @@ ivas_error ivas_spar_md_enc_open( ivas_spar_md_enc_state_t *hMdEnc; ivas_error error; int16_t num_channels, i, j; - +#ifdef ARITH_HUFF_CODER_CHANGES + int16_t bits_per_PR, bits_per_C, bits_per_P = 0; + int16_t wc_coarse_strat = 0; + int16_t num_bands_arith_huff = ivas_get_num_bands_from_bw_idx( SPAR_CONFIG_BW ); +#endif error = IVAS_ERR_OK; if ( ( hMdEnc = (ivas_spar_md_enc_state_t *) malloc( sizeof( ivas_spar_md_enc_state_t ) ) ) == NULL ) @@ -206,6 +210,41 @@ ivas_error ivas_spar_md_enc_open( return error; } +#ifdef ARITH_HUFF_CODER_CHANGES + i = 0; + /*calculate the worst case strat vlaue*/ + while ( i <= IVAS_SPAR_BR_TABLE_LEN ) + { + if ( sba_order == SBA_FOA_ORDER && ivas_spar_br_table_consts[i].ivas_total_brate == hEncoderConfig->ivas_total_brate && hEncoderConfig->ivas_total_brate <= 192000 ) + { + bits_per_PR = ( (int16_t) log2( ivas_spar_br_table_consts[i].q_lvls[2][0] ) + 1 ) * 3; + bits_per_C = ( (int16_t) log2( ivas_spar_br_table_consts[i].q_lvls[2][1] ) + 1 ) * 2; + bits_per_P = ( (int16_t) log2( ivas_spar_br_table_consts[i].q_lvls[2][2] ) + 1 ) * 1; + wc_coarse_strat = bits_per_PR + bits_per_C + bits_per_P; + wc_coarse_strat = ( wc_coarse_strat * num_bands_arith_huff * 50 ) + 550; + wc_coarse_strat = wc_coarse_strat / 50; + break; + } + else if ( sba_order == SBA_FOA_ORDER && ivas_spar_br_table_consts[i].ivas_total_brate == hEncoderConfig->ivas_total_brate && hEncoderConfig->ivas_total_brate > 192000 ) + { + bits_per_PR = ( (int16_t) log2( ivas_spar_br_table_consts[i].q_lvls[0][0] ) + 1 ) * 3; + bits_per_C = ( (int16_t) log2( ivas_spar_br_table_consts[i].q_lvls[0][1] ) + 1 ) * 2; + bits_per_P = ( (int16_t) log2( ivas_spar_br_table_consts[i].q_lvls[0][2] ) + 1 ) * 1; + wc_coarse_strat = bits_per_PR + bits_per_C + bits_per_P; + wc_coarse_strat = ( wc_coarse_strat * num_bands_arith_huff * 50 ) + 550; + wc_coarse_strat = wc_coarse_strat / 50; + break; + } + else if ( sba_order == SBA_HOA2_ORDER || sba_order == SBA_HOA3_ORDER ) + { + wc_coarse_strat = MAX_BITS_METADATA; + break; + } + i++; + } + hMdEnc->wc_strat = wc_coarse_strat; + hMdEnc->wc_coarse_strat_buff = (Indice *) malloc( wc_coarse_strat * sizeof( Indice ) ); +#endif *hMdEnc_in = hMdEnc; return error; @@ -287,7 +326,14 @@ void ivas_spar_md_enc_close( } free( hMdEnc->mixer_mat_local ); } - +#ifdef ARITH_HUFF_CODER_CHANGES + if ( hMdEnc->wc_coarse_strat_buff != NULL ) + { + free( hMdEnc->wc_coarse_strat_buff ); + hMdEnc->wc_coarse_strat_buff = NULL; + hMdEnc->wc_strat = 0; + } +#endif if ( hMdEnc != NULL ) { free( hMdEnc ); @@ -558,7 +604,9 @@ ivas_error ivas_spar_md_enc_process( int16_t code_strat; int16_t bit_pos_start, next_ind_start, last_ind_start; BSTR_ENC_DATA hMetaData_tmp; +#ifndef ARITH_HUFF_CODER_CHANGES Indice ind_list_tmp[MAX_BITS_METADATA]; // IVAS_fmToDo: size to be optimized +#endif float Wscale[IVAS_MAX_NUM_BANDS]; num_quant_strats = hMdEnc->spar_md_cfg.num_quant_strats; @@ -605,7 +653,11 @@ ivas_error ivas_spar_md_enc_process( num_quant_strats = 1; } +#ifdef ARITH_HUFF_CODER_CHANGES + hMetaData_tmp.ind_list = hMdEnc->wc_coarse_strat_buff; +#else hMetaData_tmp.ind_list = ind_list_tmp; +#endif /* Save state of metadata bitstream buffer */ bit_pos_start = hMetaData->nb_bits_tot; @@ -871,8 +923,12 @@ ivas_error ivas_spar_md_enc_process( strat = cs[i]; if ( strat != NO_STRAT ) { +#ifndef ARITH_HUFF_CODER_CHANGES reset_indices_enc( &hMetaData_tmp, MAX_BITS_METADATA ); +#else + reset_indices_enc( &hMetaData_tmp, hMdEnc->wc_strat ); +#endif ivas_write_spar_md_bitstream( hMdEnc, num_bands, bands_bw, &hMetaData_tmp, hEncoderConfig->ivas_total_brate, strat, qsi, planarCP ); if ( hMetaData->nb_bits_tot == bit_pos_start || hMetaData_tmp.nb_bits_tot < ( hMetaData->nb_bits_tot - bit_pos_start ) ) diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index e450990254..df8fd719e2 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -674,6 +674,10 @@ typedef struct ivas_spar_md_enc_state_t ivas_huff_coeffs_t huff_coeffs; int16_t table_idx; int16_t spar_hoa_md_flag; +#ifdef ARITH_HUFF_CODER_CHANGES + int16_t wc_strat; + Indice* wc_coarse_strat_buff; +#endif } ivas_spar_md_enc_state_t; /* PCA structure */ @@ -1041,8 +1045,6 @@ typedef struct encoder_config_structure int16_t Opt_AGC_ON; /* flag indicating AGC operation in SBA */ #endif #endif - - } ENCODER_CONFIG, *ENCODER_CONFIG_HANDLE; -- GitLab From d30cddda583ba0f11a45dffb25c9df7144f375fd Mon Sep 17 00:00:00 2001 From: Shikha Shetgeri <100861@ittiam.com> Date: Tue, 21 Mar 2023 13:21:21 +0530 Subject: [PATCH 019/331] addressed review comments --- lib_com/ivas_cnst.h | 4 +++ lib_enc/ivas_spar_md_enc.c | 51 ++++++++++++++++---------------------- 2 files changed, 25 insertions(+), 30 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 04e11c4656..657a6521be 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1618,6 +1618,10 @@ typedef enum #define SPAR_DIRAC_DTX_BANDS ( SPAR_DTX_BANDS + DIRAC_DTX_BANDS ) #define CLDFB_PAR_WEIGHT_START_BAND 7 +#ifdef ARITH_HUFF_CODER_CHANGES +#define IVAS_SBA_SIGNALLING_OVERHEAD 550 +#endif + /*----------------------------------------------------------------------------------* * Limiter constants diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index 6d5304031e..f426b24e6f 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -113,8 +113,10 @@ ivas_error ivas_spar_md_enc_open( int16_t num_channels, i, j; #ifdef ARITH_HUFF_CODER_CHANGES int16_t bits_per_PR, bits_per_C, bits_per_P = 0; - int16_t wc_coarse_strat = 0; - int16_t num_bands_arith_huff = ivas_get_num_bands_from_bw_idx( SPAR_CONFIG_BW ); + int32_t wc_coarse_strat = 0; + int16_t num_bands_arith_huff = IVAS_MAX_NUM_BANDS; + int16_t n_input, n_dmx, n_dec = 0; + int16_t table_idx, quant_start = 0; #endif error = IVAS_ERR_OK; @@ -211,37 +213,26 @@ ivas_error ivas_spar_md_enc_open( } #ifdef ARITH_HUFF_CODER_CHANGES - i = 0; /*calculate the worst case strat vlaue*/ - while ( i <= IVAS_SPAR_BR_TABLE_LEN ) + if ( hEncoderConfig->ivas_total_brate <= 192000 ) { - if ( sba_order == SBA_FOA_ORDER && ivas_spar_br_table_consts[i].ivas_total_brate == hEncoderConfig->ivas_total_brate && hEncoderConfig->ivas_total_brate <= 192000 ) - { - bits_per_PR = ( (int16_t) log2( ivas_spar_br_table_consts[i].q_lvls[2][0] ) + 1 ) * 3; - bits_per_C = ( (int16_t) log2( ivas_spar_br_table_consts[i].q_lvls[2][1] ) + 1 ) * 2; - bits_per_P = ( (int16_t) log2( ivas_spar_br_table_consts[i].q_lvls[2][2] ) + 1 ) * 1; - wc_coarse_strat = bits_per_PR + bits_per_C + bits_per_P; - wc_coarse_strat = ( wc_coarse_strat * num_bands_arith_huff * 50 ) + 550; - wc_coarse_strat = wc_coarse_strat / 50; - break; - } - else if ( sba_order == SBA_FOA_ORDER && ivas_spar_br_table_consts[i].ivas_total_brate == hEncoderConfig->ivas_total_brate && hEncoderConfig->ivas_total_brate > 192000 ) - { - bits_per_PR = ( (int16_t) log2( ivas_spar_br_table_consts[i].q_lvls[0][0] ) + 1 ) * 3; - bits_per_C = ( (int16_t) log2( ivas_spar_br_table_consts[i].q_lvls[0][1] ) + 1 ) * 2; - bits_per_P = ( (int16_t) log2( ivas_spar_br_table_consts[i].q_lvls[0][2] ) + 1 ) * 1; - wc_coarse_strat = bits_per_PR + bits_per_C + bits_per_P; - wc_coarse_strat = ( wc_coarse_strat * num_bands_arith_huff * 50 ) + 550; - wc_coarse_strat = wc_coarse_strat / 50; - break; - } - else if ( sba_order == SBA_HOA2_ORDER || sba_order == SBA_HOA3_ORDER ) - { - wc_coarse_strat = MAX_BITS_METADATA; - break; - } - i++; + quant_start = 2; + table_idx = ivas_get_spar_table_idx( hEncoderConfig->ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL ); } + else + { + quant_start = 0; + table_idx = ivas_get_spar_table_idx( hEncoderConfig->ivas_total_brate, hEncoderConfig->sba_order, SPAR_CONFIG_BW, NULL, NULL ); + } + n_input = ivas_sba_get_nchan_metadata( hEncoderConfig->sba_order ); + n_dmx = ivas_spar_br_table_consts[table_idx].nchan_transport; + n_dec = n_input - n_dmx; + bits_per_PR = ( (int16_t) log2( ivas_spar_br_table_consts[table_idx].q_lvls[quant_start][0] ) + 1 ) * ( n_input - 1 ); + bits_per_C = ( (int16_t) log2( ivas_spar_br_table_consts[table_idx].q_lvls[quant_start][1] ) + 1 ) * ( ( n_dmx - 1 ) * n_dec ); + bits_per_P = ( (int16_t) log2( ivas_spar_br_table_consts[table_idx].q_lvls[quant_start][2] ) + 1 ) * n_dec; + wc_coarse_strat = bits_per_PR + bits_per_C + bits_per_P; + wc_coarse_strat = ( wc_coarse_strat * num_bands_arith_huff * FRAMES_PER_SECOND ) + IVAS_SBA_SIGNALLING_OVERHEAD; + wc_coarse_strat = wc_coarse_strat / FRAMES_PER_SECOND; hMdEnc->wc_strat = wc_coarse_strat; hMdEnc->wc_coarse_strat_buff = (Indice *) malloc( wc_coarse_strat * sizeof( Indice ) ); #endif -- GitLab From b7e494c2dcb754c0e49d86552c7294d08e91b8c7 Mon Sep 17 00:00:00 2001 From: Shikha Shetgeri <100861@ittiam.com> Date: Tue, 21 Mar 2023 18:47:04 +0530 Subject: [PATCH 020/331] Defined some macros --- lib_com/ivas_cnst.h | 3 +++ lib_enc/ivas_spar_md_enc.c | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 657a6521be..d3eec287e7 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1620,6 +1620,9 @@ typedef enum #ifdef ARITH_HUFF_CODER_CHANGES #define IVAS_SBA_SIGNALLING_OVERHEAD 550 +#define FRAMES_PER_SECOND_HUFF_ARITH 50 +#define QUANT_STRAT_0 0 +#define QUANT_STRAT_2 2 #endif diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index f426b24e6f..4648efb07e 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -216,12 +216,12 @@ ivas_error ivas_spar_md_enc_open( /*calculate the worst case strat vlaue*/ if ( hEncoderConfig->ivas_total_brate <= 192000 ) { - quant_start = 2; + quant_start = QUANT_STRAT_2; table_idx = ivas_get_spar_table_idx( hEncoderConfig->ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL ); } else { - quant_start = 0; + quant_start = QUANT_STRAT_0; table_idx = ivas_get_spar_table_idx( hEncoderConfig->ivas_total_brate, hEncoderConfig->sba_order, SPAR_CONFIG_BW, NULL, NULL ); } n_input = ivas_sba_get_nchan_metadata( hEncoderConfig->sba_order ); @@ -231,7 +231,7 @@ ivas_error ivas_spar_md_enc_open( bits_per_C = ( (int16_t) log2( ivas_spar_br_table_consts[table_idx].q_lvls[quant_start][1] ) + 1 ) * ( ( n_dmx - 1 ) * n_dec ); bits_per_P = ( (int16_t) log2( ivas_spar_br_table_consts[table_idx].q_lvls[quant_start][2] ) + 1 ) * n_dec; wc_coarse_strat = bits_per_PR + bits_per_C + bits_per_P; - wc_coarse_strat = ( wc_coarse_strat * num_bands_arith_huff * FRAMES_PER_SECOND ) + IVAS_SBA_SIGNALLING_OVERHEAD; + wc_coarse_strat = ( wc_coarse_strat * num_bands_arith_huff * FRAMES_PER_SECOND_HUFF_ARITH ) + IVAS_SBA_SIGNALLING_OVERHEAD; wc_coarse_strat = wc_coarse_strat / FRAMES_PER_SECOND; hMdEnc->wc_strat = wc_coarse_strat; hMdEnc->wc_coarse_strat_buff = (Indice *) malloc( wc_coarse_strat * sizeof( Indice ) ); -- GitLab From 3e007194336f0abf49b094165f00d291cec56f2e Mon Sep 17 00:00:00 2001 From: Shikha Shetgeri <100861@ittiam.com> Date: Thu, 23 Mar 2023 16:10:20 +0530 Subject: [PATCH 021/331] addressed review comments --- lib_com/ivas_cnst.h | 5 +++-- lib_enc/ivas_spar_md_enc.c | 26 ++++++++++++++------------ lib_enc/ivas_stat_enc.h | 2 +- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index d3eec287e7..977e68cbe2 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -79,6 +79,9 @@ typedef enum #define IVAS_FORMAT_SIGNALING_NBITS 2 /* number of bits for signaling the IVAS format */ #define IVAS_FORMAT_SIGNALING_NBITS_SBA ( IVAS_FORMAT_SIGNALING_NBITS + 1 ) +#ifdef ARITH_HUFF_CODER_CHANGES +#define IVAS_SBA_SIGNALING_OVERHEAD 550 +#endif /*----------------------------------------------------------------------------------* @@ -1619,8 +1622,6 @@ typedef enum #define CLDFB_PAR_WEIGHT_START_BAND 7 #ifdef ARITH_HUFF_CODER_CHANGES -#define IVAS_SBA_SIGNALLING_OVERHEAD 550 -#define FRAMES_PER_SECOND_HUFF_ARITH 50 #define QUANT_STRAT_0 0 #define QUANT_STRAT_2 2 #endif diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index 4648efb07e..53c0fa0559 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -112,11 +112,11 @@ ivas_error ivas_spar_md_enc_open( ivas_error error; int16_t num_channels, i, j; #ifdef ARITH_HUFF_CODER_CHANGES - int16_t bits_per_PR, bits_per_C, bits_per_P = 0; + int16_t bits_PR, bits_C, bits_P = 0; int32_t wc_coarse_strat = 0; int16_t num_bands_arith_huff = IVAS_MAX_NUM_BANDS; int16_t n_input, n_dmx, n_dec = 0; - int16_t table_idx, quant_start = 0; + int16_t table_idx, quant_strat = 0; #endif error = IVAS_ERR_OK; @@ -214,24 +214,26 @@ ivas_error ivas_spar_md_enc_open( #ifdef ARITH_HUFF_CODER_CHANGES /*calculate the worst case strat vlaue*/ - if ( hEncoderConfig->ivas_total_brate <= 192000 ) + table_idx = ivas_get_spar_table_idx( hEncoderConfig->ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL ); + if ( ( ivas_spar_br_table_consts[table_idx].q_lvls[2][0] == 1 && + ivas_spar_br_table_consts[table_idx].q_lvls[2][1] == 1 && + ivas_spar_br_table_consts[table_idx].q_lvls[2][2] == 1 && + ivas_spar_br_table_consts[table_idx].q_lvls[2][3] == 1 ) ) { - quant_start = QUANT_STRAT_2; - table_idx = ivas_get_spar_table_idx( hEncoderConfig->ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL ); + quant_strat = QUANT_STRAT_0; } else { - quant_start = QUANT_STRAT_0; - table_idx = ivas_get_spar_table_idx( hEncoderConfig->ivas_total_brate, hEncoderConfig->sba_order, SPAR_CONFIG_BW, NULL, NULL ); + quant_strat = QUANT_STRAT_2; } n_input = ivas_sba_get_nchan_metadata( hEncoderConfig->sba_order ); n_dmx = ivas_spar_br_table_consts[table_idx].nchan_transport; n_dec = n_input - n_dmx; - bits_per_PR = ( (int16_t) log2( ivas_spar_br_table_consts[table_idx].q_lvls[quant_start][0] ) + 1 ) * ( n_input - 1 ); - bits_per_C = ( (int16_t) log2( ivas_spar_br_table_consts[table_idx].q_lvls[quant_start][1] ) + 1 ) * ( ( n_dmx - 1 ) * n_dec ); - bits_per_P = ( (int16_t) log2( ivas_spar_br_table_consts[table_idx].q_lvls[quant_start][2] ) + 1 ) * n_dec; - wc_coarse_strat = bits_per_PR + bits_per_C + bits_per_P; - wc_coarse_strat = ( wc_coarse_strat * num_bands_arith_huff * FRAMES_PER_SECOND_HUFF_ARITH ) + IVAS_SBA_SIGNALLING_OVERHEAD; + bits_PR = ( (int16_t) log2( ivas_spar_br_table_consts[table_idx].q_lvls[quant_strat][0] ) + 1 ) * ( n_input - 1 ); + bits_C = ( (int16_t) log2( ivas_spar_br_table_consts[table_idx].q_lvls[quant_strat][1] ) + 1 ) * ( ( n_dmx - 1 ) * n_dec ); + bits_P = ( (int16_t) log2( ivas_spar_br_table_consts[table_idx].q_lvls[quant_strat][2] ) + 1 ) * n_dec; + wc_coarse_strat = bits_PR + bits_C + bits_P; + wc_coarse_strat = ( wc_coarse_strat * num_bands_arith_huff * FRAMES_PER_SECOND ) + IVAS_SBA_SIGNALING_OVERHEAD; wc_coarse_strat = wc_coarse_strat / FRAMES_PER_SECOND; hMdEnc->wc_strat = wc_coarse_strat; hMdEnc->wc_coarse_strat_buff = (Indice *) malloc( wc_coarse_strat * sizeof( Indice ) ); diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index df8fd719e2..fe4d57ef60 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -676,7 +676,7 @@ typedef struct ivas_spar_md_enc_state_t int16_t spar_hoa_md_flag; #ifdef ARITH_HUFF_CODER_CHANGES int16_t wc_strat; - Indice* wc_coarse_strat_buff; + Indice *wc_coarse_strat_buff; #endif } ivas_spar_md_enc_state_t; -- GitLab From 3cdb7c4a121a3e8bba20d41525da6a4093730572 Mon Sep 17 00:00:00 2001 From: Shikha Shetgeri <100861@ittiam.com> Date: Fri, 24 Mar 2023 15:49:29 +0530 Subject: [PATCH 022/331] modified macro defination --- lib_com/ivas_cnst.h | 5 ++++- lib_enc/ivas_spar_md_enc.c | 5 ++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 977e68cbe2..5c667c5d27 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -80,7 +80,7 @@ typedef enum #define IVAS_FORMAT_SIGNALING_NBITS 2 /* number of bits for signaling the IVAS format */ #define IVAS_FORMAT_SIGNALING_NBITS_SBA ( IVAS_FORMAT_SIGNALING_NBITS + 1 ) #ifdef ARITH_HUFF_CODER_CHANGES -#define IVAS_SBA_SIGNALING_OVERHEAD 550 +#define IVAS_SBA_SIGNALING_OVERHEAD IVAS_FORMAT_SIGNALING_NBITS_SBA + SBA_ORDER_BITS + SBA_PLANAR_BITS + AGC_HUFF_ARTH + SPAR_NUM_CODING_STRAT_BITS #endif @@ -968,6 +968,9 @@ typedef enum /* AGC constants */ #define AGC_BITS_PER_CH 3 #define AGC_EMAX 0 +#ifdef ARITH_HUFF_CODER_CHANGES +#define AGC_HUFF_ARTH 1 +#endif /* Common SPAR metadata constants */ #define IVAS_ACTIVEW_DM_F_SCALE 0.5f diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index 53c0fa0559..ade5e9af3e 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -42,7 +42,6 @@ #include #include "wmc_auto.h" - /*------------------------------------------------------------------------------------------* * PreProcessor *------------------------------------------------------------------------------------------*/ @@ -233,8 +232,8 @@ ivas_error ivas_spar_md_enc_open( bits_C = ( (int16_t) log2( ivas_spar_br_table_consts[table_idx].q_lvls[quant_strat][1] ) + 1 ) * ( ( n_dmx - 1 ) * n_dec ); bits_P = ( (int16_t) log2( ivas_spar_br_table_consts[table_idx].q_lvls[quant_strat][2] ) + 1 ) * n_dec; wc_coarse_strat = bits_PR + bits_C + bits_P; - wc_coarse_strat = ( wc_coarse_strat * num_bands_arith_huff * FRAMES_PER_SECOND ) + IVAS_SBA_SIGNALING_OVERHEAD; - wc_coarse_strat = wc_coarse_strat / FRAMES_PER_SECOND; + wc_coarse_strat = ( ( wc_coarse_strat * num_bands_arith_huff ) + ( IVAS_SBA_SIGNALING_OVERHEAD + hMdEnc->spar_md_cfg.quant_strat_bits ) ) * FRAMES_PER_SEC; + wc_coarse_strat = wc_coarse_strat / FRAMES_PER_SEC; hMdEnc->wc_strat = wc_coarse_strat; hMdEnc->wc_coarse_strat_buff = (Indice *) malloc( wc_coarse_strat * sizeof( Indice ) ); #endif -- GitLab From 0f3d7d7d4d54f82a8d20ad4c2c09c075cd1bba09 Mon Sep 17 00:00:00 2001 From: Shikha Shetgeri <100861@ittiam.com> Date: Mon, 27 Mar 2023 11:45:45 +0530 Subject: [PATCH 023/331] addressed review comments --- lib_com/ivas_cnst.h | 4 ++-- lib_com/ivas_rom_com.c | 8 +++++++- lib_enc/ivas_spar_md_enc.c | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 5c667c5d27..afdf8a2675 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -80,7 +80,7 @@ typedef enum #define IVAS_FORMAT_SIGNALING_NBITS 2 /* number of bits for signaling the IVAS format */ #define IVAS_FORMAT_SIGNALING_NBITS_SBA ( IVAS_FORMAT_SIGNALING_NBITS + 1 ) #ifdef ARITH_HUFF_CODER_CHANGES -#define IVAS_SBA_SIGNALING_OVERHEAD IVAS_FORMAT_SIGNALING_NBITS_SBA + SBA_ORDER_BITS + SBA_PLANAR_BITS + AGC_HUFF_ARTH + SPAR_NUM_CODING_STRAT_BITS +#define IVAS_SBA_SIGNALING_OVERHEAD IVAS_FORMAT_SIGNALING_NBITS_SBA + SBA_ORDER_BITS + SBA_PLANAR_BITS + AGC_SIGNALLING_BITS + SPAR_NUM_CODING_STRAT_BITS #endif @@ -969,7 +969,7 @@ typedef enum #define AGC_BITS_PER_CH 3 #define AGC_EMAX 0 #ifdef ARITH_HUFF_CODER_CHANGES -#define AGC_HUFF_ARTH 1 +#define AGC_SIGNALLING_BITS 1 #endif /* Common SPAR metadata constants */ diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index f04538c479..9e87e84964 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -936,7 +936,13 @@ const ivas_spar_br_table_t ivas_spar_br_table_consts[IVAS_SPAR_BR_TABLE_LEN] = { { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, { 256000, 0, SBA_HOA3_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 76300, 73550, 112000 },{ 59350, 57200, 56000 },{ 42400, 40850, 48000 },{ 25450, 24500, 40000 } }, - { { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 31, 1, 1, 1 } }, 1, 2, 0 }, + { { 31, 11, 11, 1 },{ 1, 1, 1, 1 }, +#ifdef ARITH_HUFF_CODER_CHANGES + { 1, 1, 1, 1 } +#else + { 31, 1, 1, 1 } +#endif + }, 1, 2, 0 }, { 384000, 0, SBA_FOA_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 128000, 128000, 128000 },{ 100000, 100000, 128000 },{ 79850, 79850, 104000 },{ 66600, 66600, 104000 } }, // not yet optimized { { 31, 1, 1, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index ade5e9af3e..fcb8358dbe 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -225,7 +225,7 @@ ivas_error ivas_spar_md_enc_open( { quant_strat = QUANT_STRAT_2; } - n_input = ivas_sba_get_nchan_metadata( hEncoderConfig->sba_order ); + n_input = ivas_sba_get_nchan_metadata(sba_order); n_dmx = ivas_spar_br_table_consts[table_idx].nchan_transport; n_dec = n_input - n_dmx; bits_PR = ( (int16_t) log2( ivas_spar_br_table_consts[table_idx].q_lvls[quant_strat][0] ) + 1 ) * ( n_input - 1 ); -- GitLab From e1e6613a4fb0a84c9c38cace74d2991a4c5e8988 Mon Sep 17 00:00:00 2001 From: malenov Date: Tue, 28 Mar 2023 12:59:42 +0200 Subject: [PATCH 024/331] cleanup --- lib_com/bitstream.c | 58 --------------------------------------------- 1 file changed, 58 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index d0d7f442c6..c28c04112b 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -269,64 +269,6 @@ ivas_error ind_list_realloc( return IVAS_ERR_OK; } -/*-------------------------------------------------------------------* - * ind_list_metadata_realloc() - * - * Re-allocate list of metadata indices if the IVAS total bitrate has changed - *-------------------------------------------------------------------*/ - -// ivas_error ind_list_metadata_realloc( -// BSTR_ENC_HANDLE hMetaData, /* i/o: encoder bitstream handle */ -// const IVAS_FORMAT ivas_format, /* i : IVAS format */ -// const int32_t ivas_total_brate /* i : IVAS total bitrate */ -//) -//{ -// int16_t i, max_num_indices_metadata; -// INDICE_HANDLE new_ind_list_metadata; -// -// if ( hMetaData != NULL && hMetaData->ind_list != NULL ) -// { -// /* get the maximum allowed number of indices in the list */ -// max_num_indices_metadata = get_max_num_indices_metadata( ivas_format, ivas_total_brate ); -// -// /* check, if the maximum number of allowed indices has changed */ -// if ( max_num_indices_metadata != hMetaData->max_num_indices ) -// { -// /* allocate new buffer of metadata indices */ -// if ( ( new_ind_list_metadata = (INDICE_HANDLE) malloc( max_num_indices_metadata * sizeof( Indice ) ) ) == NULL ) -// { -// return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of metadata indices!\n" ) ); -// } -// -// /* move indices from the old list to the new list */ -// i = 0; -// while ( hMetaData->ind_list[i].nb_bits > 0 ) -// { -// new_ind_list_metadata[i].id = hMetaData->ind_list[i].id; -// new_ind_list_metadata[i].value = hMetaData->ind_list[i].value; -// new_ind_list_metadata[i].nb_bits = hMetaData->ind_list[i].nb_bits; -// i++; -// } -// -// /* reset nb_bits of all other indices to -1 */ -// for ( ; i < max_num_indices_metadata; i++ ) -// { -// new_ind_list_metadata[i].nb_bits = -1; -// } -// -// /* free the old list */ -// free( hMetaData->ind_list ); -// -// /* set pointer to the new list */ -// hMetaData->ind_list = new_ind_list_metadata; -// -// /* set the new maximum for the allowed number of indices */ -// hMetaData->max_num_indices = max_num_indices_metadata; -// } -// } -// -// return IVAS_ERR_OK; -// } /*-----------------------------------------------------------------------* * get_max_num_indices() -- GitLab From ca8911fe24f139512bad08021fbc463bd814949b Mon Sep 17 00:00:00 2001 From: Shikha Shetgeri <100861@ittiam.com> Date: Tue, 28 Mar 2023 18:02:42 +0530 Subject: [PATCH 025/331] modified the coders to stop writing to the bitstream before running out of space --- lib_com/ivas_prot.h | 6 +- lib_com/ivas_stat_com.h | 1 - lib_enc/ivas_entropy_coder.c | 62 +++++++++++++++--- lib_enc/ivas_spar_md_enc.c | 118 +++++++++++++++++++++++++++++++---- 4 files changed, 164 insertions(+), 23 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 6711b998c9..c1b5227886 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -4377,7 +4377,11 @@ int16_t ivas_get_bits_to_encode( void ivas_huffman_encode( ivas_huffman_cfg_t *huff_cfg, int16_t in, int16_t *hcode, int16_t *hlen ); void ivas_spar_huff_coeffs_com_init( ivas_huff_coeffs_t *pHuff_coeffs, ivas_spar_md_com_cfg *pSpar_cfg, const int16_t table_idx, const int16_t enc_dec ); void ivas_spar_arith_coeffs_com_init( ivas_arith_coeffs_t *pArith_coeffs, ivas_spar_md_com_cfg *pSpar_cfg, const int16_t table_idx, const int16_t enc_dec ); -void ivas_arith_encode_cmplx_cell_array(ivas_arith_t *pArith_re, ivas_arith_t *pArith_re_diff, const int16_t *pDo_diff, const int16_t nB, int16_t *pSymbol_re, int16_t *pSymbol_old_re, ivas_cell_dim_t *pCell_dims, BSTR_ENC_HANDLE hMetaData, const int16_t any_diff); +void ivas_arith_encode_cmplx_cell_array(ivas_arith_t *pArith_re, ivas_arith_t *pArith_re_diff, const int16_t *pDo_diff, const int16_t nB, int16_t *pSymbol_re, int16_t *pSymbol_old_re, ivas_cell_dim_t *pCell_dims, BSTR_ENC_HANDLE hMetaData, const int16_t any_diff +#ifdef ARITH_HUFF_CODER_CHANGES + , int32_t wc_strat_arith +#endif +); ivas_error ivas_huffman_decode( ivas_huffman_cfg_t *huff_cfg, Decoder_State *st0, int16_t *dec_out ); void ivas_arith_decode_cmplx_cell_array( ivas_arith_t *pArith_re, ivas_arith_t *pArith_re_diff, Decoder_State *st0, ivas_cell_dim_t *pCell_dims, int16_t *pDo_diff, const int16_t nB, int16_t *pSymbol_re, int16_t *pSymbol_re_old ); diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index 8231588551..c1849e7d2c 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -290,7 +290,6 @@ typedef struct ivas_arith_t int16_t range; int16_t num_models; float saved_dist_arr[IVAS_NUM_PROB_MODELS][IVAS_MAX_QUANT_LEVELS]; - } ivas_arith_t; typedef struct ivas_arith_coeffs_t diff --git a/lib_enc/ivas_entropy_coder.c b/lib_enc/ivas_entropy_coder.c index a8f5219f2a..2834817a6a 100644 --- a/lib_enc/ivas_entropy_coder.c +++ b/lib_enc/ivas_entropy_coder.c @@ -133,7 +133,12 @@ static void ivas_arith_encode_array( int16_t *pInput, ivas_arith_t *pArith, BSTR_ENC_HANDLE hMetaData, - const int16_t in_len ) + const int16_t in_len +#ifdef ARITH_HUFF_CODER_CHANGES + , + int32_t wc_strat_arith +#endif +) { int16_t model_index, i, ind; int16_t *pCum_freq = NULL; @@ -144,7 +149,18 @@ static void ivas_arith_encode_array( if ( pArith->dyn_model_bits > 0 ) { ivas_get_dyn_freq_model( pInput, in_len, &model_index, pArith, &pCum_freq ); - push_next_indice( hMetaData, model_index, pArith->dyn_model_bits ); +#ifdef ARITH_HUFF_CODER_CHANGES + if ( hMetaData->nb_bits_tot <= wc_strat_arith ) + { +#endif + push_next_indice( hMetaData, model_index, pArith->dyn_model_bits ); +#ifdef ARITH_HUFF_CODER_CHANGES + } + else + { + return; + } +#endif } else { @@ -191,7 +207,12 @@ static void ivas_arithCoder_encode_array_diff( ivas_wrap_arround( pIn_old_scratch, pArith_diff->vals[0], pArith_diff->vals[pArith_diff->range - 1], length ); - ivas_arith_encode_array( pIn_old_scratch, pArith_diff, hMetaData, length ); + ivas_arith_encode_array( pIn_old_scratch, pArith_diff, hMetaData, length +#ifdef ARITH_HUFF_CODER_CHANGES + , + MAX_NUM_INDICES +#endif + ); } return; @@ -234,7 +255,12 @@ static void arith_encode_cell_array( BSTR_ENC_HANDLE hMetaData, const int16_t nB, ivas_arith_t *pArith, - int16_t *pSymbol ) + int16_t *pSymbol +#ifdef ARITH_HUFF_CODER_CHANGES + , + int32_t wc_strat_arith +#endif +) { int16_t total_symbol_len = 0; int16_t i; @@ -250,7 +276,12 @@ static void arith_encode_cell_array( { if ( pArith->range > 1 ) { - ivas_arith_encode_array( pSymbol, pArith, hMetaData, total_symbol_len ); + ivas_arith_encode_array( pSymbol, pArith, hMetaData, total_symbol_len +#ifdef ARITH_HUFF_CODER_CHANGES + , + wc_strat_arith +#endif + ); } } @@ -309,7 +340,12 @@ void ivas_arith_encode_cmplx_cell_array( int16_t *pSymbol_old_re, ivas_cell_dim_t *pCell_dims, BSTR_ENC_HANDLE hMetaData, - const int16_t any_diff ) + const int16_t any_diff +#ifdef ARITH_HUFF_CODER_CHANGES + , + int32_t wc_strat_arith +#endif +) { int16_t input_old[IVAS_MAX_INPUT_LEN]; int16_t input_new[IVAS_MAX_INPUT_LEN]; @@ -382,13 +418,23 @@ void ivas_arith_encode_cmplx_cell_array( }*/ #endif - arith_encode_cell_array( cell_dim, hMetaData, nB, pArith_re, input ); + arith_encode_cell_array( cell_dim, hMetaData, nB, pArith_re, input +#ifdef ARITH_HUFF_CODER_CHANGES + , + wc_strat_arith +#endif + ); arith_encode_cell_array_diff( cell_dim_diff, hMetaData, nB, pArith_re_diff, input_old, input_new ); } else { - arith_encode_cell_array( pCell_dims, hMetaData, nB, pArith_re, pSymbol_re ); + arith_encode_cell_array( pCell_dims, hMetaData, nB, pArith_re, pSymbol_re +#ifdef ARITH_HUFF_CODER_CHANGES + , + wc_strat_arith +#endif + ); } return; diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index fcb8358dbe..f5403b717b 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -116,6 +116,7 @@ ivas_error ivas_spar_md_enc_open( int16_t num_bands_arith_huff = IVAS_MAX_NUM_BANDS; int16_t n_input, n_dmx, n_dec = 0; int16_t table_idx, quant_strat = 0; + int32_t table_cal_wc = 0; #endif error = IVAS_ERR_OK; @@ -225,7 +226,15 @@ ivas_error ivas_spar_md_enc_open( { quant_strat = QUANT_STRAT_2; } - n_input = ivas_sba_get_nchan_metadata(sba_order); + /*worst case table calculated value*/ + for ( i = 0; i < ivas_spar_br_table_consts[table_idx].nchan_transport; i++ ) + { + table_cal_wc += ivas_spar_br_table_consts[table_idx].core_brs[i][1]; + } + table_cal_wc = hEncoderConfig->ivas_total_brate - table_cal_wc; + table_cal_wc = table_cal_wc / FRAMES_PER_SEC; + + n_input = ivas_sba_get_nchan_metadata( sba_order ); n_dmx = ivas_spar_br_table_consts[table_idx].nchan_transport; n_dec = n_input - n_dmx; bits_PR = ( (int16_t) log2( ivas_spar_br_table_consts[table_idx].q_lvls[quant_strat][0] ) + 1 ) * ( n_input - 1 ); @@ -234,8 +243,12 @@ ivas_error ivas_spar_md_enc_open( wc_coarse_strat = bits_PR + bits_C + bits_P; wc_coarse_strat = ( ( wc_coarse_strat * num_bands_arith_huff ) + ( IVAS_SBA_SIGNALING_OVERHEAD + hMdEnc->spar_md_cfg.quant_strat_bits ) ) * FRAMES_PER_SEC; wc_coarse_strat = wc_coarse_strat / FRAMES_PER_SEC; + if ( wc_coarse_strat >= table_cal_wc ) + { + printf("wc_coarse_strat is greater than table_cal_wc!"); + } hMdEnc->wc_strat = wc_coarse_strat; - hMdEnc->wc_coarse_strat_buff = (Indice *) malloc( wc_coarse_strat * sizeof( Indice ) ); + hMdEnc->wc_coarse_strat_buff = (Indice *)malloc(wc_coarse_strat * sizeof(Indice)); #endif *hMdEnc_in = hMdEnc; @@ -1325,7 +1338,18 @@ static void ivas_get_huffman_coded_bs( for ( j = pred_offset; j < pred_coeff_dim; j++ ) { ivas_huffman_encode( &hMdEnc->huff_coeffs.pred_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j], &code, &len ); - push_next_indice( hMetaData, code, len ); +#ifdef ARITH_HUFF_CODER_CHANGES + if ( hMetaData->nb_bits_tot <= hMdEnc->wc_strat ) + { +#endif + push_next_indice( hMetaData, code, len ); +#ifdef ARITH_HUFF_CODER_CHANGES + } + else + { + return; + } +#endif } for ( j = 0; j < ndec * ( ndm - 1 ); j++ ) @@ -1333,7 +1357,18 @@ static void ivas_get_huffman_coded_bs( if ( keep_planar[(int16_t) floor( j / ( ndm - 1 ) )] ) { ivas_huffman_encode( &hMdEnc->huff_coeffs.drct_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].drct_index_re[j], &code, &len ); - push_next_indice( hMetaData, code, len ); +#ifdef ARITH_HUFF_CODER_CHANGES + if ( hMetaData->nb_bits_tot <= hMdEnc->wc_strat ) + { +#endif + push_next_indice( hMetaData, code, len ); +#ifdef ARITH_HUFF_CODER_CHANGES + } + else + { + return; + } +#endif } } @@ -1342,7 +1377,18 @@ static void ivas_get_huffman_coded_bs( if ( keep_planar[j] ) { ivas_huffman_encode( &hMdEnc->huff_coeffs.decd_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].decd_index_re[j], &code, &len ); - push_next_indice( hMetaData, code, len ); +#ifdef ARITH_HUFF_CODER_CHANGES + if ( hMetaData->nb_bits_tot <= hMdEnc->wc_strat ) + { +#endif + push_next_indice( hMetaData, code, len ); +#ifdef ARITH_HUFF_CODER_CHANGES + } + else + { + return; + } +#endif } } } @@ -1351,19 +1397,52 @@ static void ivas_get_huffman_coded_bs( for ( j = pred_offset; j < pred_coeff_dim; j++ ) { ivas_huffman_encode( &hMdEnc->huff_coeffs.pred_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j], &code, &len ); - push_next_indice( hMetaData, code, len ); +#ifdef ARITH_HUFF_CODER_CHANGES + if ( hMetaData->nb_bits_tot <= hMdEnc->wc_strat ) + { +#endif + push_next_indice( hMetaData, code, len ); +#ifdef ARITH_HUFF_CODER_CHANGES + } + else + { + return; + } +#endif } for ( j = 0; j < ndec * ( ndm - 1 ); j++ ) { ivas_huffman_encode( &hMdEnc->huff_coeffs.drct_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].drct_index_re[j], &code, &len ); - push_next_indice( hMetaData, code, len ); +#ifdef ARITH_HUFF_CODER_CHANGES + if ( hMetaData->nb_bits_tot <= hMdEnc->wc_strat ) + { +#endif + push_next_indice( hMetaData, code, len ); +#ifdef ARITH_HUFF_CODER_CHANGES + } + else + { + return; + } +#endif } for ( j = 0; j < ndec; j++ ) { ivas_huffman_encode( &hMdEnc->huff_coeffs.decd_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].decd_index_re[j], &code, &len ); - push_next_indice( hMetaData, code, len ); +#ifdef ARITH_HUFF_CODER_CHANGES + if ( hMetaData->nb_bits_tot <= hMdEnc->wc_strat ) + { +#endif + push_next_indice( hMetaData, code, len ); +#ifdef ARITH_HUFF_CODER_CHANGES + } + else + { + return; + } +#endif } } } @@ -1394,7 +1473,6 @@ static void ivas_get_arith_coded_bs( ivas_cell_dim_t decx_cell_dims[IVAS_MAX_NUM_BANDS]; int16_t symbol_arr_re[IVAS_MAX_INPUT_LEN]; int16_t symbol_arr_old_re[IVAS_MAX_INPUT_LEN]; - for ( i = 0; i < nB; i++ ) { int16_t ndm, ndec; @@ -1454,8 +1532,12 @@ static void ivas_get_arith_coded_bs( } ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.pred_arith_re[qsi], &hMdEnc->arith_coeffs.pred_arith_re_diff[qsi], pDo_diff, nB, - symbol_arr_re, symbol_arr_old_re, pred_cell_dims, hMetaData, any_diff ); - + symbol_arr_re, symbol_arr_old_re, pred_cell_dims, hMetaData, any_diff +#ifdef ARITH_HUFF_CODER_CHANGES + , + hMdEnc->wc_strat +#endif + ); if ( hMdEnc->spar_hoa_md_flag ) { for ( i = 0; i < nB; i++ ) @@ -1497,7 +1579,12 @@ static void ivas_get_arith_coded_bs( } ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.drct_arith_re[qsi], &hMdEnc->arith_coeffs.drct_arith_re_diff[qsi], pDo_diff, nB, - symbol_arr_re, symbol_arr_old_re, drct_cell_dims, hMetaData, any_diff ); + symbol_arr_re, symbol_arr_old_re, drct_cell_dims, hMetaData, any_diff +#ifdef ARITH_HUFF_CODER_CHANGES + , + hMdEnc->wc_strat +#endif + ); ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md.band_coeffs_idx, nB, symbol_arr_re, decd_cell_dims, DECD_COEFF, planarCP ); @@ -1515,7 +1602,12 @@ static void ivas_get_arith_coded_bs( } ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.decd_arith_re[qsi], &hMdEnc->arith_coeffs.decd_arith_re_diff[qsi], pDo_diff, nB, - symbol_arr_re, symbol_arr_old_re, decd_cell_dims, hMetaData, any_diff ); + symbol_arr_re, symbol_arr_old_re, decd_cell_dims, hMetaData, any_diff +#ifdef ARITH_HUFF_CODER_CHANGES + , + hMdEnc->wc_strat +#endif + ); ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md.band_coeffs_idx, nB, symbol_arr_re, decx_cell_dims, DECX_COEFF, planarCP ); -- GitLab From 49caf14da453748d2b43982f9e43c80eb7a7bced Mon Sep 17 00:00:00 2001 From: Shikha Shetgeri <100861@ittiam.com> Date: Tue, 28 Mar 2023 18:16:45 +0530 Subject: [PATCH 026/331] addressed review comments --- lib_enc/ivas_entropy_coder.c | 2 +- lib_enc/ivas_spar_md_enc.c | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/lib_enc/ivas_entropy_coder.c b/lib_enc/ivas_entropy_coder.c index 2834817a6a..fbdd95a089 100644 --- a/lib_enc/ivas_entropy_coder.c +++ b/lib_enc/ivas_entropy_coder.c @@ -150,7 +150,7 @@ static void ivas_arith_encode_array( { ivas_get_dyn_freq_model( pInput, in_len, &model_index, pArith, &pCum_freq ); #ifdef ARITH_HUFF_CODER_CHANGES - if ( hMetaData->nb_bits_tot <= wc_strat_arith ) + if ( ( hMetaData->nb_bits_tot + in_len ) <= wc_strat_arith ) { #endif push_next_indice( hMetaData, model_index, pArith->dyn_model_bits ); diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index f5403b717b..9b6b667ac7 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -245,10 +245,10 @@ ivas_error ivas_spar_md_enc_open( wc_coarse_strat = wc_coarse_strat / FRAMES_PER_SEC; if ( wc_coarse_strat >= table_cal_wc ) { - printf("wc_coarse_strat is greater than table_cal_wc!"); + printf( "wc_coarse_strat is greater than table_cal_wc!" ); } hMdEnc->wc_strat = wc_coarse_strat; - hMdEnc->wc_coarse_strat_buff = (Indice *)malloc(wc_coarse_strat * sizeof(Indice)); + hMdEnc->wc_coarse_strat_buff = (Indice *) malloc( wc_coarse_strat * sizeof( Indice ) ); #endif *hMdEnc_in = hMdEnc; @@ -1339,7 +1339,7 @@ static void ivas_get_huffman_coded_bs( { ivas_huffman_encode( &hMdEnc->huff_coeffs.pred_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j], &code, &len ); #ifdef ARITH_HUFF_CODER_CHANGES - if ( hMetaData->nb_bits_tot <= hMdEnc->wc_strat ) + if ( ( hMetaData->nb_bits_tot + len ) <= hMdEnc->wc_strat ) { #endif push_next_indice( hMetaData, code, len ); @@ -1358,7 +1358,7 @@ static void ivas_get_huffman_coded_bs( { ivas_huffman_encode( &hMdEnc->huff_coeffs.drct_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].drct_index_re[j], &code, &len ); #ifdef ARITH_HUFF_CODER_CHANGES - if ( hMetaData->nb_bits_tot <= hMdEnc->wc_strat ) + if ( ( hMetaData->nb_bits_tot + len ) <= hMdEnc->wc_strat ) { #endif push_next_indice( hMetaData, code, len ); @@ -1378,7 +1378,7 @@ static void ivas_get_huffman_coded_bs( { ivas_huffman_encode( &hMdEnc->huff_coeffs.decd_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].decd_index_re[j], &code, &len ); #ifdef ARITH_HUFF_CODER_CHANGES - if ( hMetaData->nb_bits_tot <= hMdEnc->wc_strat ) + if ( ( hMetaData->nb_bits_tot + len ) <= hMdEnc->wc_strat ) { #endif push_next_indice( hMetaData, code, len ); @@ -1398,7 +1398,7 @@ static void ivas_get_huffman_coded_bs( { ivas_huffman_encode( &hMdEnc->huff_coeffs.pred_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j], &code, &len ); #ifdef ARITH_HUFF_CODER_CHANGES - if ( hMetaData->nb_bits_tot <= hMdEnc->wc_strat ) + if ( ( hMetaData->nb_bits_tot + len ) <= hMdEnc->wc_strat ) { #endif push_next_indice( hMetaData, code, len ); @@ -1415,7 +1415,7 @@ static void ivas_get_huffman_coded_bs( { ivas_huffman_encode( &hMdEnc->huff_coeffs.drct_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].drct_index_re[j], &code, &len ); #ifdef ARITH_HUFF_CODER_CHANGES - if ( hMetaData->nb_bits_tot <= hMdEnc->wc_strat ) + if ( ( hMetaData->nb_bits_tot + len ) <= hMdEnc->wc_strat ) { #endif push_next_indice( hMetaData, code, len ); @@ -1432,7 +1432,7 @@ static void ivas_get_huffman_coded_bs( { ivas_huffman_encode( &hMdEnc->huff_coeffs.decd_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].decd_index_re[j], &code, &len ); #ifdef ARITH_HUFF_CODER_CHANGES - if ( hMetaData->nb_bits_tot <= hMdEnc->wc_strat ) + if ( ( hMetaData->nb_bits_tot + len ) <= hMdEnc->wc_strat ) { #endif push_next_indice( hMetaData, code, len ); @@ -1858,7 +1858,7 @@ static void ivas_write_parameter_bitstream_dtx( pr -= idx; pr_pd_bits = ivas_get_bits_to_encode( pd_q_lvls * pr_q_lvls ); - value = (uint16_t) ( pr * pd_q_lvls + pd ); + value = ( uint16_t )( pr * pd_q_lvls + pd ); push_next_indice( hMetaData, value, pr_pd_bits ); } @@ -1882,7 +1882,7 @@ static void ivas_write_parameter_bitstream_dtx( pr_idx2 = pSpar_md->band_coeffs_idx[i].pred_index_re[pr_idx_2 - 1]; pr_idx2 -= idx; - value = (uint16_t) ( pr_idx2 * pr_q_lvls1 + pr_idx1 ); + value = ( uint16_t )( pr_idx2 * pr_q_lvls1 + pr_idx1 ); pr_pr_bits = ivas_get_bits_to_encode( pr_q_lvls1 * pr_q_lvls2 ); -- GitLab From 720d67a1a66887b96a4e5e43ede458534c40e265 Mon Sep 17 00:00:00 2001 From: Shikha Shetgeri <100861@ittiam.com> Date: Tue, 28 Mar 2023 18:19:30 +0530 Subject: [PATCH 027/331] minor clean up --- lib_enc/ivas_spar_md_enc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index 9b6b667ac7..6e2e35fdc3 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -1858,7 +1858,7 @@ static void ivas_write_parameter_bitstream_dtx( pr -= idx; pr_pd_bits = ivas_get_bits_to_encode( pd_q_lvls * pr_q_lvls ); - value = ( uint16_t )( pr * pd_q_lvls + pd ); + value = (uint16_t) ( pr * pd_q_lvls + pd ); push_next_indice( hMetaData, value, pr_pd_bits ); } @@ -1882,7 +1882,7 @@ static void ivas_write_parameter_bitstream_dtx( pr_idx2 = pSpar_md->band_coeffs_idx[i].pred_index_re[pr_idx_2 - 1]; pr_idx2 -= idx; - value = ( uint16_t )( pr_idx2 * pr_q_lvls1 + pr_idx1 ); + value = (uint16_t) ( pr_idx2 * pr_q_lvls1 + pr_idx1 ); pr_pr_bits = ivas_get_bits_to_encode( pr_q_lvls1 * pr_q_lvls2 ); -- GitLab From 698d49f5dd0c9804cf0abdfb330dc121cdcfc1cd Mon Sep 17 00:00:00 2001 From: Shikha Shetgeri <100861@ittiam.com> Date: Tue, 28 Mar 2023 18:35:36 +0530 Subject: [PATCH 028/331] clean up --- lib_com/ivas_stat_com.h | 1 + lib_enc/ivas_entropy_coder.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index c1849e7d2c..8231588551 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -290,6 +290,7 @@ typedef struct ivas_arith_t int16_t range; int16_t num_models; float saved_dist_arr[IVAS_NUM_PROB_MODELS][IVAS_MAX_QUANT_LEVELS]; + } ivas_arith_t; typedef struct ivas_arith_coeffs_t diff --git a/lib_enc/ivas_entropy_coder.c b/lib_enc/ivas_entropy_coder.c index fbdd95a089..69b665b391 100644 --- a/lib_enc/ivas_entropy_coder.c +++ b/lib_enc/ivas_entropy_coder.c @@ -150,7 +150,7 @@ static void ivas_arith_encode_array( { ivas_get_dyn_freq_model( pInput, in_len, &model_index, pArith, &pCum_freq ); #ifdef ARITH_HUFF_CODER_CHANGES - if ( ( hMetaData->nb_bits_tot + in_len ) <= wc_strat_arith ) + if ( ( hMetaData->nb_bits_tot + pArith->dyn_model_bits) <= wc_strat_arith ) { #endif push_next_indice( hMetaData, model_index, pArith->dyn_model_bits ); -- GitLab From d9cbb3212b10341fdbe07f72baf91d832f90d3e7 Mon Sep 17 00:00:00 2001 From: Vladimir Malenovsky Date: Tue, 28 Mar 2023 17:50:15 +0200 Subject: [PATCH 029/331] Revert "cleanup" This reverts commit e1e6613a4fb0a84c9c38cace74d2991a4c5e8988. --- lib_com/bitstream.c | 58 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index c28c04112b..d0d7f442c6 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -269,6 +269,64 @@ ivas_error ind_list_realloc( return IVAS_ERR_OK; } +/*-------------------------------------------------------------------* + * ind_list_metadata_realloc() + * + * Re-allocate list of metadata indices if the IVAS total bitrate has changed + *-------------------------------------------------------------------*/ + +// ivas_error ind_list_metadata_realloc( +// BSTR_ENC_HANDLE hMetaData, /* i/o: encoder bitstream handle */ +// const IVAS_FORMAT ivas_format, /* i : IVAS format */ +// const int32_t ivas_total_brate /* i : IVAS total bitrate */ +//) +//{ +// int16_t i, max_num_indices_metadata; +// INDICE_HANDLE new_ind_list_metadata; +// +// if ( hMetaData != NULL && hMetaData->ind_list != NULL ) +// { +// /* get the maximum allowed number of indices in the list */ +// max_num_indices_metadata = get_max_num_indices_metadata( ivas_format, ivas_total_brate ); +// +// /* check, if the maximum number of allowed indices has changed */ +// if ( max_num_indices_metadata != hMetaData->max_num_indices ) +// { +// /* allocate new buffer of metadata indices */ +// if ( ( new_ind_list_metadata = (INDICE_HANDLE) malloc( max_num_indices_metadata * sizeof( Indice ) ) ) == NULL ) +// { +// return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of metadata indices!\n" ) ); +// } +// +// /* move indices from the old list to the new list */ +// i = 0; +// while ( hMetaData->ind_list[i].nb_bits > 0 ) +// { +// new_ind_list_metadata[i].id = hMetaData->ind_list[i].id; +// new_ind_list_metadata[i].value = hMetaData->ind_list[i].value; +// new_ind_list_metadata[i].nb_bits = hMetaData->ind_list[i].nb_bits; +// i++; +// } +// +// /* reset nb_bits of all other indices to -1 */ +// for ( ; i < max_num_indices_metadata; i++ ) +// { +// new_ind_list_metadata[i].nb_bits = -1; +// } +// +// /* free the old list */ +// free( hMetaData->ind_list ); +// +// /* set pointer to the new list */ +// hMetaData->ind_list = new_ind_list_metadata; +// +// /* set the new maximum for the allowed number of indices */ +// hMetaData->max_num_indices = max_num_indices_metadata; +// } +// } +// +// return IVAS_ERR_OK; +// } /*-----------------------------------------------------------------------* * get_max_num_indices() -- GitLab From 9920cf1a990116abe7b2082b9b08c12294d988b6 Mon Sep 17 00:00:00 2001 From: Vladimir Malenovsky Date: Tue, 28 Mar 2023 17:51:05 +0200 Subject: [PATCH 030/331] Revert "merge main to branch" This reverts commit c4d68f64840cef87f0bccad9a3c66e245040bb7b, reversing changes made to 7230a6caf648fc16225bcd6065ddc25d2fd2e65b. --- .gitlab-ci.yml | 43 - Workspace_msvc/lib_com.vcxproj | 2 +- Workspace_msvc/lib_com.vcxproj.filters | 6 +- Workspace_msvc/lib_util.vcxproj | 2 - lib_enc/acelp_core_enc.c | 4 + lib_enc/amr_wb_enc.c | 7 +- lib_enc/bw_detect.c | 51 - lib_enc/fd_cng_enc.c | 4 + lib_enc/init_enc.c | 37 +- lib_enc/ivas_agc_enc.c | 24 +- lib_enc/ivas_core_enc.c | 2 - lib_enc/ivas_core_pre_proc_front.c | 18 +- lib_enc/ivas_corecoder_enc_reconfig.c | 3 +- lib_enc/ivas_cpe_enc.c | 14 + lib_enc/ivas_decision_matrix_enc.c | 4 +- lib_enc/ivas_dirac_enc.c | 25 +- lib_enc/ivas_enc.c | 5 +- lib_enc/ivas_enc_cov_handler.c | 27 +- lib_enc/ivas_init_enc.c | 99 +- lib_enc/ivas_ism_dtx_enc.c | 226 +- lib_enc/ivas_ism_enc.c | 197 +- lib_enc/ivas_ism_metadata_enc.c | 750 +---- lib_enc/ivas_ism_param_enc.c | 135 +- lib_enc/ivas_lfe_enc.c | 22 +- lib_enc/ivas_masa_enc.c | 22 +- lib_enc/ivas_mc_param_enc.c | 30 +- lib_enc/ivas_mcmasa_enc.c | 80 +- lib_enc/ivas_mct_enc.c | 96 +- lib_enc/ivas_mdct_core_enc.c | 17 - lib_enc/ivas_sba_enc.c | 112 +- lib_enc/ivas_sce_enc.c | 17 + lib_enc/ivas_spar_encoder.c | 138 +- lib_enc/ivas_spar_md_enc.c | 14 +- lib_enc/ivas_stat_enc.h | 14 +- lib_enc/ivas_stereo_dmx_evs.c | 16 +- lib_enc/ivas_tcx_core_enc.c | 4 + lib_enc/lib_enc.c | 69 +- lib_enc/lib_enc.h | 7 +- lib_enc/pre_proc.c | 7 +- lib_enc/rst_enc.c | 4 + lib_rend/ivas_crend.c | 1432 +++++++- lib_rend/ivas_dirac_dec_binaural_functions.c | 17 +- lib_rend/ivas_hrtf.c | 36 + lib_rend/ivas_objectRenderer.c | 281 +- lib_rend/ivas_objectRenderer_hrFilt.c | 11 - lib_rend/ivas_objectRenderer_sfx.c | 12 +- lib_rend/ivas_objectRenderer_sources.c | 15 - lib_rend/ivas_objectRenderer_vec.c | 17 +- lib_rend/ivas_orient_trk.c | 620 +--- lib_rend/ivas_prot_rend.h | 167 +- lib_rend/ivas_render_config.c | 7 - lib_rend/ivas_reverb.c | 177 +- lib_rend/ivas_rom_TdBinauralRenderer.c | 3 - lib_rend/ivas_rom_binauralRenderer.c | 4 - lib_rend/ivas_rom_binaural_crend_head.c | 2 - lib_rend/ivas_rom_rend.c | 2 +- lib_rend/ivas_rotation.c | 156 +- lib_rend/ivas_stat_rend.h | 86 +- lib_rend/lib_rend.c | 842 ++--- lib_rend/lib_rend.h | 35 - lib_util/audio_file_reader.c | 46 +- lib_util/audio_file_reader.h | 10 + lib_util/audio_file_writer.c | 4 - lib_util/head_rotation_file_reader.c | 92 +- lib_util/head_rotation_file_reader.h | 18 +- lib_util/ism_file_reader.c | 47 +- lib_util/ism_file_writer.c | 19 +- lib_util/ism_file_writer.h | 2 +- lib_util/ls_custom_file_reader.c | 6 +- lib_util/ls_custom_file_reader.h | 6 +- lib_util/masa_file_writer.c | 2 - lib_util/render_config_reader.c | 9 - lib_util/vector3_pair_file_reader.c | 166 - lib_util/vector3_pair_file_reader.h | 89 - scripts/config/self_test.prm | 198 +- scripts/testv/stv16c.wav | 4 +- scripts/testv/stv16n.wav | 4 +- scripts/testv/stv1ISM48s.wav | 4 +- scripts/testv/stv1MASA1TC48c.wav | 4 +- scripts/testv/stv1MASA1TC48n.wav | 4 +- scripts/testv/stv1MASA2TC48c.wav | 4 +- scripts/testv/stv1MASA2TC48n.wav | 2 +- scripts/testv/stv2ISM48s.wav | 4 +- scripts/testv/stv2MASA1TC48c.wav | 4 +- scripts/testv/stv2MASA2TC48c.wav | 4 +- scripts/testv/stv2OA32c.wav | 4 +- scripts/testv/stv2OA48c.wav | 4 +- scripts/testv/stv32c.wav | 4 +- scripts/testv/stv32n.wav | 4 +- scripts/testv/stv3ISM48s.wav | 4 +- scripts/testv/stv3OA32c.wav | 4 +- scripts/testv/stv3OA48c.wav | 4 +- scripts/testv/stv48c.wav | 4 +- scripts/testv/stv48n.wav | 4 +- scripts/testv/stv4ISM48n.wav | 2 +- scripts/testv/stv4ISM48s.wav | 4 +- scripts/testv/stv512MC48c.wav | 4 +- scripts/testv/stv514MC48c.wav | 4 +- scripts/testv/stv51MC48c.wav | 4 +- scripts/testv/stv714MC48c.wav | 4 +- scripts/testv/stv71MC48c.wav | 4 +- scripts/testv/stv8c.wav | 4 +- scripts/testv/stv8n.wav | 4 +- scripts/testv/stvFOA16c.wav | 4 +- scripts/testv/stvFOA32c.wav | 4 +- scripts/testv/stvFOA48c.wav | 4 +- scripts/testv/stvST16c.wav | 4 +- scripts/testv/stvST16n.wav | 4 +- scripts/testv/stvST32c.wav | 4 +- scripts/testv/stvST32n.wav | 4 +- scripts/testv/stvST48c.wav | 4 +- scripts/testv/stvST48n.wav | 4 +- ...=> azi+2-ele+2-every-100-frames-Euler.csv} | 0 ...s.csv => azi+2-ele+2-every-100-frames.csv} | 0 .../azi_plus_2-ele_plus_2-every-25-rows.csv | 3000 ----------------- scripts/trajectories/const000-Vector3.csv | 4 - .../trajectories/full-circle-4s-Vector3.csv | 200 -- .../full-circle-4s-ccw-Vector3.csv | 200 -- scripts/trajectories/full-circle-4s-ccw.csv | 800 ----- scripts/trajectories/full-circle-4s.csv | 800 ----- ...ull-circle-with-up-and-down-4s-Vector3.csv | 200 -- ...circle-with-up-and-down-4s-ccw-Vector3.csv | 200 -- .../full-circle-with-up-and-down-4s-ccw.csv | 800 ----- ...p-and-down-4s-fixed-pos-offset-Vector3.csv | 200 -- .../full-circle-with-up-and-down-4s.csv | 800 ----- tests/renderer/test_renderer.py | 203 +- tests/renderer/utils.py | 43 +- 127 files changed, 3223 insertions(+), 11361 deletions(-) mode change 100755 => 100644 lib_enc/amr_wb_enc.c mode change 100755 => 100644 lib_enc/bw_detect.c mode change 100755 => 100644 lib_enc/ivas_core_pre_proc_front.c mode change 100755 => 100644 lib_enc/ivas_mdct_core_enc.c mode change 100755 => 100644 lib_enc/pre_proc.c delete mode 100644 lib_util/vector3_pair_file_reader.c delete mode 100644 lib_util/vector3_pair_file_reader.h rename scripts/trajectories/{azi_plus_2-ele_plus_2-every-100-frames-Euler.csv => azi+2-ele+2-every-100-frames-Euler.csv} (100%) rename scripts/trajectories/{azi_plus_2-ele_plus_2-every-100-frames.csv => azi+2-ele+2-every-100-frames.csv} (100%) delete mode 100644 scripts/trajectories/azi_plus_2-ele_plus_2-every-25-rows.csv delete mode 100644 scripts/trajectories/const000-Vector3.csv delete mode 100644 scripts/trajectories/full-circle-4s-Vector3.csv delete mode 100644 scripts/trajectories/full-circle-4s-ccw-Vector3.csv delete mode 100644 scripts/trajectories/full-circle-4s-ccw.csv delete mode 100644 scripts/trajectories/full-circle-4s.csv delete mode 100644 scripts/trajectories/full-circle-with-up-and-down-4s-Vector3.csv delete mode 100644 scripts/trajectories/full-circle-with-up-and-down-4s-ccw-Vector3.csv delete mode 100644 scripts/trajectories/full-circle-with-up-and-down-4s-ccw.csv delete mode 100644 scripts/trajectories/full-circle-with-up-and-down-4s-fixed-pos-offset-Vector3.csv delete mode 100644 scripts/trajectories/full-circle-with-up-and-down-4s.csv diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 082cf40cab..6d00b37f0a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -49,13 +49,6 @@ stages: echo "Commit time was $CI_COMMIT_TIMESTAMP" date | xargs echo "System time is" -.print-common-info-windows: &print-common-info-windows - - | - echo "Printing common information for build job." - echo "Current job is run on commit $CI_COMMIT_SHA" - echo "Commit time was $CI_COMMIT_TIMESTAMP" - ("echo 'System time is'", "Get-Date -Format 'dddd dd/MM/yyyy HH:mm K'") | Invoke-Expression - .get-previous-merge-commit-sha: &get-previous-merge-commit-sha - previous_merge_commit=$(git --no-pager log --merges HEAD~1 -n 1 --pretty=format:%H) @@ -163,11 +156,6 @@ stages: tags: - ivas-linux -.build-job-windows: - stage: build - timeout: "4 minutes" - tags: - - ivas-windows # template for test jobs on linux that need the TESTV_DIR .test-job-linux-needs-testv-dir: @@ -184,12 +172,6 @@ stages: exit_codes: - 123 -.build-job-windows-with-check-for-warnings: - extends: .build-job-windows - stage: build - allow_failure: - exit_codes: - - 123 # --------------------------------------------------------------- @@ -280,31 +262,6 @@ build-codec-sanitizers-linux: - *print-common-info - bash ci/build_codec_sanitizers_linux.sh -build-codec-windows-cmake: - extends: - - .build-job-windows-with-check-for-warnings - - .rules-basis - script: - - *print-common-info-windows - - $winoutdata = $null - - cmake -G "Visual Studio 15 2017" . -Bbuild - - cmake --build build -j | tee -variable winoutdata - - $winoutdata | Out-File $BUILD_OUTPUT -Encoding Utf8 - - ("& python ci/check_for_warnings.py '$BUILD_OUTPUT'") | Invoke-Expression - - ("exit $LASTEXITCODE") | Invoke-Expression - -build-codec-windows-msbuild: - extends: - - .build-job-windows-with-check-for-warnings - - .rules-basis - script: - - *print-common-info-windows - - $winoutdata = $null - - MSBuild.exe .\Workspace_msvc\Workspace_msvc.sln /property:Configuration=Debug | tee -variable winoutdata - - $winoutdata | Out-File $BUILD_OUTPUT -Encoding Utf8 - - ("& python ci/check_for_warnings.py '$BUILD_OUTPUT'") | Invoke-Expression - - ("exit $LASTEXITCODE") | Invoke-Expression - # --------------------------------------------------------------- # Test jobs for merge requests # --------------------------------------------------------------- diff --git a/Workspace_msvc/lib_com.vcxproj b/Workspace_msvc/lib_com.vcxproj index 23aa2ae3f0..d55896b03c 100644 --- a/Workspace_msvc/lib_com.vcxproj +++ b/Workspace_msvc/lib_com.vcxproj @@ -244,9 +244,9 @@ - + diff --git a/Workspace_msvc/lib_com.vcxproj.filters b/Workspace_msvc/lib_com.vcxproj.filters index 7b6854e718..baa1700361 100644 --- a/Workspace_msvc/lib_com.vcxproj.filters +++ b/Workspace_msvc/lib_com.vcxproj.filters @@ -379,6 +379,9 @@ common_evs_c + + common_ivas_c + common_ivas_c @@ -463,9 +466,6 @@ common_ivas_c - - common_ivas_c - diff --git a/Workspace_msvc/lib_util.vcxproj b/Workspace_msvc/lib_util.vcxproj index 5b5e5f30cc..32bebc7536 100644 --- a/Workspace_msvc/lib_util.vcxproj +++ b/Workspace_msvc/lib_util.vcxproj @@ -146,7 +146,6 @@ - @@ -168,7 +167,6 @@ - diff --git a/lib_enc/acelp_core_enc.c b/lib_enc/acelp_core_enc.c index 48cdb5c536..272d36fb9c 100644 --- a/lib_enc/acelp_core_enc.c +++ b/lib_enc/acelp_core_enc.c @@ -314,13 +314,17 @@ ivas_error acelp_core_enc( if ( st->core_brate == SID_2k40 ) { +#ifdef PARAM_ISM_DTX_CNG if ( st->hTdCngEnc != NULL ) { +#endif tmpF = cng_energy( st->element_mode, st->bwidth, st->hDtxEnc->CNG_mode, st->hTdCngEnc->CNG_att, exc, st->L_frame ); i = (int16_t) ( ( tmpF + 2.0f ) * STEP_SID ); i = min( max( i, 0 ), 127 ); st->hTdCngEnc->old_enr_index = i; +#ifdef PARAM_ISM_DTX_CNG } +#endif } } diff --git a/lib_enc/amr_wb_enc.c b/lib_enc/amr_wb_enc.c old mode 100755 new mode 100644 index 88b3faa5d6..80520d4c38 --- a/lib_enc/amr_wb_enc.c +++ b/lib_enc/amr_wb_enc.c @@ -342,12 +342,7 @@ void amr_wb_enc( * WB, SWB and FB bandwidth detector *----------------------------------------------------------------*/ - bw_detect( st, st->input, NULL, NULL -#ifdef FIX_MDCT_BASED_BWD - , - 0 -#endif - ); + bw_detect( st, st->input, NULL, NULL ); /* in AMR_WB IO, limit the maximum band-width to WB */ if ( st->bwidth > WB ) diff --git a/lib_enc/bw_detect.c b/lib_enc/bw_detect.c old mode 100755 new mode 100644 index 8ca63d28f2..5f46910c57 --- a/lib_enc/bw_detect.c +++ b/lib_enc/bw_detect.c @@ -57,9 +57,6 @@ #define BWD_COUNT_MAX 100 #define BWD_COUNT_WIDER_BW 10 -#ifdef FIX_MDCT_BASED_BWD -#define BWD_COUNT_WIDER_BW_MDCT 0 -#endif #define CLDFB_ENER_OFFSET 1.6f @@ -74,10 +71,6 @@ void bw_detect( const float signal_in[], /* i : input signal */ float *spectrum, /* i : MDCT spectrum */ const float *enerBuffer /* i : energy buffer */ -#ifdef FIX_MDCT_BASED_BWD - , - const int16_t mct_on /* i : flag MCT mode */ -#endif ) { int16_t i, j, k, bw_max, bin_width, n_bins; @@ -87,15 +80,6 @@ void bw_detect( const float *pt, *pt1; float max_NB, max_WB, max_SWB, max_FB, mean_NB, mean_WB, mean_SWB, mean_FB; int16_t cldfb_bin_width = 4; -#ifdef FIX_MDCT_BASED_BWD - int16_t bwd_count_wider_bw, l_frame; - - bwd_count_wider_bw = BWD_COUNT_WIDER_BW; - if ( st->element_mode == IVAS_CPE_MDCT && ( st->element_brate > IVAS_64k || mct_on ) ) - { - bwd_count_wider_bw = BWD_COUNT_WIDER_BW_MDCT; - } -#endif if ( st->input_Fs > 8000 ) { @@ -189,19 +173,8 @@ void bw_detect( } else { -#ifndef FIX_MDCT_BASED_BWD bin_width *= (int16_t) ( ( st->input_Fs / FRAMES_PER_SEC ) / BWD_TOTAL_WIDTH ); mvr2r( spectrum, spect, (int16_t) ( st->input_Fs / FRAMES_PER_SEC ) ); -#else - l_frame = (int16_t) ( st->input_Fs / FRAMES_PER_SEC ); - if ( st->core == TCX_10_CORE ) - { - l_frame /= 2; - } - - bin_width *= ( l_frame / BWD_TOTAL_WIDTH ); - mvr2r( spectrum, spect, l_frame ); -#endif } /*---------------------------------------------------------------------* * compute energy per spectral bins @@ -419,29 +392,17 @@ void bw_detect( /* switching to a higher BW */ if ( st->last_input_bwidth == NB ) { -#ifdef FIX_MDCT_BASED_BWD - if ( st->count_WB > bwd_count_wider_bw ) -#else if ( st->count_WB > BWD_COUNT_WIDER_BW ) -#endif { st->input_bwidth = WB; st->count_WB = BWD_COUNT_MAX; -#ifdef FIX_MDCT_BASED_BWD - if ( st->count_SWB > bwd_count_wider_bw ) -#else if ( st->count_SWB > BWD_COUNT_WIDER_BW ) -#endif { st->input_bwidth = SWB; st->count_SWB = BWD_COUNT_MAX; -#ifdef FIX_MDCT_BASED_BWD - if ( st->count_FB > bwd_count_wider_bw ) -#else if ( st->count_FB > BWD_COUNT_WIDER_BW ) -#endif { st->input_bwidth = FB; st->count_FB = BWD_COUNT_MAX; @@ -452,20 +413,12 @@ void bw_detect( if ( st->last_input_bwidth == WB && st->input_Fs > 16000 ) { -#ifdef FIX_MDCT_BASED_BWD - if ( st->count_SWB > bwd_count_wider_bw ) -#else if ( st->count_SWB > BWD_COUNT_WIDER_BW ) -#endif { st->input_bwidth = SWB; st->count_SWB = BWD_COUNT_MAX; -#ifdef FIX_MDCT_BASED_BWD - if ( st->count_FB > bwd_count_wider_bw ) -#else if ( st->count_FB > BWD_COUNT_WIDER_BW ) -#endif { st->input_bwidth = FB; st->count_FB = BWD_COUNT_MAX; @@ -475,11 +428,7 @@ void bw_detect( if ( st->last_input_bwidth == SWB && st->input_Fs > 32000 ) { -#ifdef FIX_MDCT_BASED_BWD - if ( st->count_FB > bwd_count_wider_bw ) -#else if ( st->count_FB > BWD_COUNT_WIDER_BW ) -#endif { st->input_bwidth = FB; st->count_FB = BWD_COUNT_MAX; diff --git a/lib_enc/fd_cng_enc.c b/lib_enc/fd_cng_enc.c index 70abfcbfcb..e0341e00c3 100644 --- a/lib_enc/fd_cng_enc.c +++ b/lib_enc/fd_cng_enc.c @@ -708,14 +708,18 @@ void generate_comfort_noise_enc( /* Perform STFT synthesis */ SynthesisSTFT( fftBuffer, timeDomainOutput, hFdCngCom->olapBufferSynth, hFdCngCom->olapWinSyn, tcx_transition, hFdCngCom, -1, -1 ); +#ifdef PARAM_ISM_DTX_CNG if ( st->hTdCngEnc != NULL ) { +#endif /* update CNG excitation energy for LP_CNG */ /* calculate the residual signal energy */ enr = cng_energy( st->element_mode, st->bwidth, st->hDtxEnc->CNG_mode, st->hTdCngEnc->CNG_att, hFdCngCom->exc_cng, hFdCngCom->frameSize ); st->hTdCngEnc->lp_ener = (float) ( 0.8f * st->hTdCngEnc->lp_ener + 0.2f * pow( 2.0f, enr ) ); +#ifdef PARAM_ISM_DTX_CNG } +#endif /* Overlap-add when previous frame is active */ if ( st->last_core_brate > SID_2k40 && st->codec_mode == MODE2 ) diff --git a/lib_enc/init_enc.c b/lib_enc/init_enc.c index 9c11420560..a2a168262d 100644 --- a/lib_enc/init_enc.c +++ b/lib_enc/init_enc.c @@ -61,8 +61,11 @@ ivas_error init_encoder( const int16_t idchan, /* i : channel ID */ const int16_t var_SID_rate_flag, /* i : flag for variable SID update rate */ const int16_t interval_SID, /* i : interval for SID update */ - const int16_t vad_only_flag, /* i : flag to indicate front-VAD structure */ - const ISM_MODE ism_mode /* i : ISM mode */ + const int16_t vad_only_flag /* i : flag to indicate front-VAD structure */ +#ifdef PARAM_ISM_DTX_CNG + , + const ISM_MODE ism_mode /* i : ISM mode */ +#endif ) { int16_t i; @@ -479,10 +482,10 @@ ivas_error init_encoder( * LP-CNG *-----------------------------------------------------------------*/ -#ifdef DISCRETE_ISM_DTX_CNG - if ( ( ( idchan == 0 && st->Opt_DTX_ON && st->element_mode != IVAS_CPE_MDCT ) || st->element_mode == EVS_MONO ) && !( ism_mode == ISM_MODE_PARAM || ism_mode == ISM_MODE_DISC ) ) -#else +#ifdef PARAM_ISM_DTX_CNG if ( ( ( idchan == 0 && st->Opt_DTX_ON && st->element_mode != IVAS_CPE_MDCT ) || st->element_mode == EVS_MONO ) && !( ism_mode == ISM_MODE_PARAM ) ) +#else + if ( ( ( idchan == 0 && st->Opt_DTX_ON && st->element_mode != IVAS_CPE_MDCT ) || st->element_mode == EVS_MONO ) ) #endif { if ( ( st->hTdCngEnc = (TD_CNG_ENC_HANDLE) malloc( sizeof( TD_CNG_ENC_DATA ) ) ) == NULL ) @@ -882,22 +885,32 @@ void LPDmem_enc_init( return; } - - /*-----------------------------------------------------------------------* - * destroy_cldfb_encoder() + * destroy_encoder() * * Free memory which was allocated in init_encoder() *-----------------------------------------------------------------------*/ -void destroy_cldfb_encoder( +void destroy_encoder( Encoder_State *st /* i/o: Encoder static variables structure */ ) { - deleteCldfb( &st->cldfbSynTd ); - deleteCldfb( &st->cldfbAnaEnc ); + if ( st->cldfbSynTd != NULL ) + { + deleteCldfb( &st->cldfbSynTd ); + } + + if ( st->cldfbAnaEnc != NULL ) + { + deleteCldfb( &st->cldfbAnaEnc ); + } + + if ( st->hFdCngEnc != NULL ) + { + deleteFdCngEnc( &st->hFdCngEnc ); + } - deleteFdCngEnc( &st->hFdCngEnc ); + /* Close Core */ return; } diff --git a/lib_enc/ivas_agc_enc.c b/lib_enc/ivas_agc_enc.c index 83dbdad1e1..f98c22b97e 100644 --- a/lib_enc/ivas_agc_enc.c +++ b/lib_enc/ivas_agc_enc.c @@ -195,24 +195,22 @@ void ivas_spar_agc_enc_close( { ivas_agc_enc_state_t *hAgc; - if ( hAgcEnc == NULL || *hAgcEnc == NULL ) - { - return; - } - hAgc = *hAgcEnc; - free( hAgc->agc_com.winFunc ); - hAgc->agc_com.winFunc = NULL; + if ( hAgc != NULL ) + { + free( hAgc->agc_com.winFunc ); + hAgc->agc_com.winFunc = NULL; - free( hAgc->gain_state ); - hAgc->gain_state = NULL; + free( hAgc->gain_state ); + hAgc->gain_state = NULL; - free( hAgc->gain_data ); - hAgc->gain_data = NULL; + free( hAgc->gain_data ); + hAgc->gain_data = NULL; - free( *hAgcEnc ); - *hAgcEnc = NULL; + free( hAgc ); + hAgc = NULL; + } return; } diff --git a/lib_enc/ivas_core_enc.c b/lib_enc/ivas_core_enc.c index 040a8469c5..d4e5e6c686 100644 --- a/lib_enc/ivas_core_enc.c +++ b/lib_enc/ivas_core_enc.c @@ -471,8 +471,6 @@ ivas_error ivas_core_enc( dbgwrite( &st->sp_aud_decision1, sizeof( int16_t ), 1, input_frame, fname( debug_dir, "sp_aud_decision1", n, id, ENC ) ); dbgwrite( &st->sp_aud_decision2, sizeof( int16_t ), 1, input_frame, fname( debug_dir, "sp_aud_decision2", n, id, ENC ) ); - dbgwrite( &st->lp_noise, sizeof( float ), 1, input_frame, fname( debug_dir, "lp_noise", n, id, ENC ) ); - #if ( defined DEBUG_MODE_ACELP ) || ( defined DEBUG_MODE_TCX ) if ( st->coder_type == INACTIVE || st->coder_type == UNVOICED ) { diff --git a/lib_enc/ivas_core_pre_proc_front.c b/lib_enc/ivas_core_pre_proc_front.c old mode 100755 new mode 100644 index 85eba72f00..000fbab33e --- a/lib_enc/ivas_core_pre_proc_front.c +++ b/lib_enc/ivas_core_pre_proc_front.c @@ -107,7 +107,12 @@ ivas_error pre_proc_front_ivas( const int16_t front_vad_flag, /* i : front-VAD flag to overwrite VAD decision */ const int16_t force_front_vad, /* i : flag to force VAD decision */ const int16_t front_vad_dtx_flag, /* i : front-VAD DTX flag to overwrite VAD decision*/ - const int32_t ivas_total_brate /* i : IVAS total bitrate - for setting the DTX */ +#ifdef LOW_RATE_TRANS_CORE_CODER + const int32_t ivas_total_brate /* i : IVAS total bitrate - for setting the DTX */ +#else + const int32_t ivas_total_brate, /* i : IVAS total bitrate - for setting the DTX */ + const int16_t ivas_format /* i : IVAS format */ +#endif ) { @@ -486,12 +491,7 @@ ivas_error pre_proc_front_ivas( if ( st->idchan == 0 && element_mode != IVAS_CPE_MDCT ) { - bw_detect( st, st->input, NULL, enerBuffer -#ifdef FIX_MDCT_BASED_BWD - , - 0 -#endif - ); + bw_detect( st, st->input, NULL, enerBuffer ); } if ( element_mode != IVAS_CPE_MDCT ) /* in MDCT stereo, set_bw_stereo() is used instead */ @@ -811,7 +811,11 @@ ivas_error pre_proc_front_ivas( } } /* Switch to ACELP for non-harmonic transient signals */ +#ifdef LOW_RATE_TRANS_CORE_CODER else if ( ( ( element_mode >= IVAS_CPE_DFT && element_brate <= IVAS_16k4 ) || ( element_mode == IVAS_SCE && element_brate < SCE_SMC_THR ) ) && ( loc_harm[0] != 1 ) && smc_dec == MUSIC ) +#else + else if ( ( ( ivas_format == STEREO_FORMAT && element_brate <= IVAS_16k4 ) || ( ivas_format == ISM_FORMAT && element_brate < SCE_SMC_THR ) ) && ( loc_harm[0] != 1 ) && smc_dec == MUSIC ) +#endif { if ( element_mode == IVAS_SCE ) { diff --git a/lib_enc/ivas_corecoder_enc_reconfig.c b/lib_enc/ivas_corecoder_enc_reconfig.c index 74c27f4bff..18d7f06e0e 100644 --- a/lib_enc/ivas_corecoder_enc_reconfig.c +++ b/lib_enc/ivas_corecoder_enc_reconfig.c @@ -300,7 +300,8 @@ ivas_error ivas_corecoder_enc_reconfig( if ( st_ivas->nCPE <= 1 && st_ivas->hMCT != NULL ) { - ivas_mct_enc_close( &( st_ivas->hMCT ) ); + ivas_mct_enc_close( st_ivas->hMCT ); + st_ivas->hMCT = NULL; } /* special case, if we have MCT now and had a single CPE before, remove the MDCT Stereo handles */ diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index a62f2efbe2..054804372b 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -429,11 +429,19 @@ ivas_error ivas_cpe_enc( for ( n = 0; n < n_CoreChannels; n++ ) { +#ifdef LOW_RATE_TRANS_CORE_CODER error = pre_proc_front_ivas( NULL, hCPE, hCPE->element_brate, nb_bits_metadata, input_frame, n, old_inp_12k8[n], old_inp_16k[n], &ener[n], &relE[n], A[n], Aw[n], epsP[n], lsp_new[n], lsp_mid[n], &vad_hover_flag[n], &attack_flag[n], realBuffer[n], imagBuffer[n], old_wsp[n], pitch_fr[n], voicing_fr[n], &loc_harm[n], &cor_map_sum[n], &vad_flag_dtx[n], enerBuffer[n], fft_buff[n], A[0], lsp_new[0], currFlatness[n], tdm_ratio_idx, fr_bands, Etot_LR, lf_E, localVAD_HE_SAD, band_energies_LR, 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_flag : 0, 0, 0, ivas_total_brate ); +#else + error = pre_proc_front_ivas( NULL, hCPE, hCPE->element_brate, nb_bits_metadata, input_frame, n, old_inp_12k8[n], old_inp_16k[n], + &ener[n], &relE[n], A[n], Aw[n], epsP[n], lsp_new[n], lsp_mid[n], + &vad_hover_flag[n], &attack_flag[n], realBuffer[n], imagBuffer[n], old_wsp[n], pitch_fr[n], voicing_fr[n], &loc_harm[n], &cor_map_sum[n], &vad_flag_dtx[n], enerBuffer[n], + fft_buff[n], A[0], lsp_new[0], currFlatness[n], tdm_ratio_idx, fr_bands, Etot_LR, lf_E, localVAD_HE_SAD, band_energies_LR, 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_flag : 0, 0, 0, + ivas_total_brate, st_ivas->hEncoderConfig->ivas_format ); +#endif if ( error != IVAS_ERR_OK ) { return error; @@ -845,11 +853,17 @@ ivas_error create_cpe_enc( st->mct_chan_mode = MCT_CHAN_MODE_LFE; } +#ifdef PARAM_ISM_DTX_CNG if ( ( error = init_encoder( st, #ifdef IND_LIST_DYN hEncoderConfig, #endif n, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 0, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) +#else + if ( ( error = init_encoder( st, +#ifdef IND_LIST_DYN + hEncoderConfig, +#endif n, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 0 ) ) != IVAS_ERR_OK ) #endif { diff --git a/lib_enc/ivas_decision_matrix_enc.c b/lib_enc/ivas_decision_matrix_enc.c index b894932958..7b4685251f 100644 --- a/lib_enc/ivas_decision_matrix_enc.c +++ b/lib_enc/ivas_decision_matrix_enc.c @@ -114,7 +114,7 @@ void ivas_decision_matrix_enc( if ( st->element_mode == IVAS_SCE && st->low_rate_mode ) { - /* ISM low-rate mode */ + /* ISm low-rate mode */ st->core = ACELP_CORE; st->coder_type = INACTIVE; } @@ -391,7 +391,7 @@ void ivas_signaling_enc( } else if ( st->element_mode == IVAS_SCE && st->low_rate_mode ) { - /* ISM Low-rate mode -> do nothing -> always WB, ACELP core, IC coder_type */ + /* ISm Low-rate mode -> do nothing -> always WB, ACELP core, IC coder_type */ } else if ( ( st->element_mode == IVAS_CPE_MDCT && st->idchan == 1 ) || st->core_brate <= SID_2k40 ) { diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index 43bc94fb04..a143ff37d2 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -104,7 +104,11 @@ ivas_error ivas_dirac_enc_open( return error; } /* Allocate and initialize FB mixer handle */ +#ifdef SBA_BR_SWITCHING_CLEAN_UP if ( ( error = ivas_FB_mixer_open( &( hDirAC->hFbMixer ), input_Fs, fb_cfg, 0 ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_FB_mixer_open( &( hDirAC->hFbMixer ), input_Fs, fb_cfg ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -245,27 +249,23 @@ ivas_error ivas_dirac_enc_reconfigure( /*------------------------------------------------------------------------- * ivas_dirac_enc_close() * - * Close DirAC encoder handle + * Close DirAC *------------------------------------------------------------------------*/ void ivas_dirac_enc_close( - DIRAC_ENC_HANDLE *hDirAC_out, /* i/o: encoder DirAC handle */ - const int32_t input_Fs /* i : input sampling rate */ + DIRAC_ENC_HANDLE hDirAC, /* i/o: encoder DirAC handle */ + const int32_t input_Fs /* i : input sampling rate */ ) { int16_t i, j; - DIRAC_ENC_HANDLE hDirAC; - - if ( hDirAC_out == NULL || *hDirAC_out == NULL ) - { - return; - } - - hDirAC = *hDirAC_out; if ( hDirAC->hFbMixer != NULL ) { +#ifdef SBA_BR_SWITCHING_CLEAN_UP ivas_FB_mixer_close( &hDirAC->hFbMixer, input_Fs, 0 ); +#else + ivas_FB_mixer_close( &hDirAC->hFbMixer, input_Fs ); +#endif } for ( i = 0; i < DIRAC_MAX_ANA_CHANS; i++ ) @@ -311,8 +311,7 @@ void ivas_dirac_enc_close( hDirAC->hConfig = NULL; } - free( *hDirAC_out ); - *hDirAC_out = NULL; + free( hDirAC ); return; } diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index 1e4ba82207..0500a8e775 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -132,11 +132,14 @@ ivas_error ivas_enc( /* bypass EVS coding in float precision, emulating EVS encoder/decoder delay */ for ( i = 0; i < n; i++ ) { +#ifdef SBA_HPF_TUNING_ENC if ( ( ivas_format == SBA_FORMAT ) && ( st_ivas->sba_mode == SBA_MODE_SPAR ) ) { hp20( data_f[HOA_keep_ind[i]], input_frame, st_ivas->mem_hp20_in[i], input_Fs ); } - else if ( !( ivas_format == MC_FORMAT && i == LFE_CHANNEL ) ) /*TODO: is the HPF needed for LFE channel? */ + else +#endif + if ( !( ivas_format == MC_FORMAT && i == LFE_CHANNEL ) ) /*TODO: is the HPF needed for LFE channel? */ { hp20( data_f[i], input_frame, st_ivas->mem_hp20_in[i], input_Fs ); } diff --git a/lib_enc/ivas_enc_cov_handler.c b/lib_enc/ivas_enc_cov_handler.c index e117cfc5a5..b70c05e962 100644 --- a/lib_enc/ivas_enc_cov_handler.c +++ b/lib_enc/ivas_enc_cov_handler.c @@ -117,19 +117,17 @@ void ivas_spar_covar_enc_close( { ivas_enc_cov_handler_state_t *hCovState; - if ( hCovEnc == NULL || *hCovEnc == NULL ) - { - return; - } - hCovState = *hCovEnc; - ivas_spar_covar_smooth_enc_close( &hCovState->pCov_state, nchan_inp ); + if ( hCovState != NULL ) + { + ivas_spar_covar_smooth_enc_close( &hCovState->pCov_state, nchan_inp ); - ivas_spar_covar_smooth_enc_close( &hCovState->pCov_dtx_state, nchan_inp ); + ivas_spar_covar_smooth_enc_close( &hCovState->pCov_dtx_state, nchan_inp ); - free( *hCovEnc ); - *hCovEnc = NULL; + free( hCovState ); + hCovState = NULL; + } return; } @@ -152,7 +150,12 @@ void ivas_enc_cov_handler_process( const int16_t end_band, const int16_t num_ch, const int16_t dtx_vad, - const int16_t transient_det[2] ) +#ifdef SMOOTH_WITH_TRANS_DET + const int16_t transient_det[2] +#else + const int16_t transient_det +#endif +) { int16_t i, j; int16_t dtx_cov_flag; @@ -215,7 +218,11 @@ void ivas_enc_cov_handler_process( } else { +#ifdef SMOOTH_WITH_TRANS_DET if ( ( transient_det[0] == 0 ) && ( transient_det[1] == 0 ) ) +#else + if ( transient_det == 0 ) +#endif { ivas_cov_smooth_process( hCovEnc->pCov_dtx_state, cov_dtx_real, pFb, start_band, end_band, num_ch, transient_det ); hCovEnc->prior_dtx_present = 1; diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index e0713950ca..9af3c7e8a8 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -184,7 +184,11 @@ int16_t getNumChanAnalysis( n = st_ivas->nSCE + CPE_CHANNELS * st_ivas->nCPE; if ( st_ivas->hEncoderConfig->ivas_format == SBA_FORMAT ) { +#ifdef SBA_HPF_TUNING_ENC n = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order ); +#else + n = DIRAC_MAX_ANA_CHANS; +#endif } else if ( st_ivas->hEncoderConfig->ivas_format == MC_FORMAT && ( st_ivas->mc_mode == MC_MODE_PARAMMC || st_ivas->mc_mode == MC_MODE_MCMASA ) ) { @@ -266,14 +270,16 @@ void ivas_initialize_handles_enc( st_ivas->mem_hp20_in = NULL; - /* ISM metadata handles */ + /* ISm metadata handles */ for ( i = 0; i < MAX_NUM_OBJECTS; i++ ) { st_ivas->hIsmMetaData[i] = NULL; } +#ifdef PARAM_ISM_DTX_CNG /* ISM DTX handle */ st_ivas->hISMDTX = NULL; +#endif /* Q Metadata handle */ st_ivas->hQMetaData = NULL; @@ -446,17 +452,15 @@ ivas_error ivas_init_encoder( } } -#ifdef DISCRETE_ISM_DTX_CNG - if ( st_ivas->hEncoderConfig->Opt_DTX_ON ) -#else +#ifdef PARAM_ISM_DTX_CNG if ( st_ivas->hEncoderConfig->Opt_DTX_ON && st_ivas->ism_mode == ISM_MODE_PARAM ) -#endif { if ( ( error = ivas_ism_dtx_open( st_ivas ) ) != IVAS_ERR_OK ) { return error; } } +#endif } else if ( ivas_format == SBA_FORMAT || ivas_format == MASA_FORMAT ) { @@ -473,7 +477,11 @@ ivas_error ivas_init_encoder( if ( st_ivas->sba_mode == SBA_MODE_SPAR ) { +#ifdef SBA_BR_SWITCHING_CLEAN_UP if ( ( error = ivas_spar_enc_open( st_ivas, 0 ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_spar_enc_open( st_ivas ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -767,7 +775,7 @@ void destroy_core_enc( ENC_CORE_HANDLE hCoreCoder /* i/o: core encoder structure */ ) { - destroy_cldfb_encoder( hCoreCoder ); + destroy_encoder( hCoreCoder ); if ( hCoreCoder->hSignalBuf != NULL ) { @@ -966,52 +974,97 @@ void ivas_destroy_enc( } /* ISM metadata handles */ - ivas_ism_metadata_close( st_ivas->hIsmMetaData ); + for ( n = 0; n < MAX_NUM_OBJECTS; n++ ) + { + if ( st_ivas->hIsmMetaData[n] != NULL ) + { + free( st_ivas->hIsmMetaData[n] ); + st_ivas->hIsmMetaData[n] = NULL; + } + } +#ifdef PARAM_ISM_DTX_CNG /* ISM DTX Handle */ if ( st_ivas->hISMDTX != NULL ) { free( st_ivas->hISMDTX ); st_ivas->hISMDTX = NULL; } +#endif /* Q Metadata handle */ ivas_qmetadata_close( &( st_ivas->hQMetaData ) ); /* DirAC handle */ - if ( ivas_format == ISM_FORMAT ) - { - ivas_param_ism_enc_close( &( st_ivas->hDirAC ), st_ivas->hEncoderConfig->input_Fs ); - } - else + if ( st_ivas->hDirAC != NULL ) { - ivas_dirac_enc_close( &( st_ivas->hDirAC ), st_ivas->hEncoderConfig->input_Fs ); + if ( ivas_format == ISM_FORMAT ) + { + ivas_param_ism_enc_close( st_ivas->hDirAC, st_ivas->hEncoderConfig->input_Fs ); + } + else + { + ivas_dirac_enc_close( st_ivas->hDirAC, st_ivas->hEncoderConfig->input_Fs ); + } + st_ivas->hDirAC = NULL; } /* SPAR handle */ - ivas_spar_enc_close( &( st_ivas->hSpar ), st_ivas->hEncoderConfig->input_Fs, nchan_inp, 0 ); + if ( st_ivas->hSpar != NULL ) + { +#ifdef SBA_BR_SWITCHING_CLEAN_UP + ivas_spar_enc_close( st_ivas->hSpar, st_ivas->hEncoderConfig->input_Fs, nchan_inp, 0 ); +#else + ivas_spar_enc_close( st_ivas->hSpar, st_ivas->hEncoderConfig->input_Fs, nchan_inp ); +#endif + st_ivas->hSpar = NULL; + } /* MASA handle */ + if ( st_ivas->hMasa != NULL ) + { #ifdef FIX_350_MASA_DELAY_COMP - ivas_masa_enc_close( &( st_ivas->hMasa ) ); + ivas_masa_enc_close( st_ivas->hMasa ); #else - ivas_masa_enc_close( &( st_ivas->hMasa ), st_ivas->nchan_transport, ivas_format ); + ivas_masa_enc_close( st_ivas->hMasa, st_ivas->nchan_transport, ivas_format ); #endif + st_ivas->hMasa = NULL; + } /* MCT handle */ - ivas_mct_enc_close( &( st_ivas->hMCT ) ); - - /* LFE handle */ - ivas_lfe_enc_close( &( st_ivas->hLFE ) ); + if ( st_ivas->hMCT != NULL ) + { + ivas_mct_enc_close( st_ivas->hMCT ); + st_ivas->hMCT = NULL; + } /* Parametric MC handle */ - ivas_param_mc_enc_close( &( st_ivas->hParamMC ), st_ivas->hEncoderConfig->input_Fs ); + if ( st_ivas->hParamMC != NULL ) + { + ivas_param_mc_enc_close( st_ivas->hParamMC, st_ivas->hEncoderConfig->input_Fs ); + st_ivas->hParamMC = NULL; + } /* Multi-channel MASA handle */ - ivas_mcmasa_enc_close( &( st_ivas->hMcMasa ), st_ivas->hEncoderConfig->input_Fs ); + if ( st_ivas->hMcMasa != NULL ) + { + ivas_mcmasa_enc_close( st_ivas->hMcMasa, st_ivas->hEncoderConfig->input_Fs ); + st_ivas->hMcMasa = NULL; + } /* Stereo downmix for EVS encoder handle */ - stereo_dmx_evs_close_encoder( &( st_ivas->hStereoDmxEVS ) ); + if ( st_ivas->hStereoDmxEVS != NULL ) + { + stereo_dmx_evs_close_encoder( st_ivas->hStereoDmxEVS ); + st_ivas->hStereoDmxEVS = NULL; + } + + /* LFE handle */ + if ( st_ivas->hLFE != NULL ) + { + ivas_lfe_enc_close( st_ivas->hLFE ); + st_ivas->hLFE = NULL; + } /* Encoder configuration handle */ if ( st_ivas->hEncoderConfig != NULL ) diff --git a/lib_enc/ivas_ism_dtx_enc.c b/lib_enc/ivas_ism_dtx_enc.c index 0bd1411424..bc8134f365 100644 --- a/lib_enc/ivas_ism_dtx_enc.c +++ b/lib_enc/ivas_ism_dtx_enc.c @@ -41,16 +41,7 @@ #endif #include "wmc_auto.h" - -#ifdef DISCRETE_ISM_DTX_CNG -/*-----------------------------------------------------------------------* - * Local constants - *-----------------------------------------------------------------------*/ - -#define MD_MAX_DIFF_AZIMUTH 10 -#define MD_MAX_DIFF_ELEVATION 10 -#endif - +#ifdef PARAM_ISM_DTX_CNG /*-------------------------------------------------------------------* * ivas_ism_dtx_open() @@ -76,11 +67,8 @@ ivas_error ivas_ism_dtx_open( hISMDTX->dtx_flag = 0; hISMDTX->sce_id_dtx = 0; -#ifdef DISCRETE_ISM_DTX_CNG - hISMDTX->cnt_SID_ISM = -1; -#else + set_s( hISMDTX->dtx_speech_buffer_enc, 0, PARAM_ISM_HYS_BUF_SIZE ); -#endif for ( i = 0; i < MAX_NUM_OBJECTS; i++ ) { @@ -95,209 +83,6 @@ ivas_error ivas_ism_dtx_open( } -#ifdef DISCRETE_ISM_DTX_CNG -/*-------------------------------------------------------------------* - * ivas_ism_get_dtx_enc() - * - * Analysis and decision about DTX in ISM format - *-------------------------------------------------------------------*/ - -/*! r: indication of DTX frame */ -int16_t ivas_ism_dtx_enc( - ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ - SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */ - const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - const int16_t nchan_ism, /* i : number of objects */ - const int16_t nchan_transport, /* i : number of transport channels */ - int16_t vad_flag[MAX_NUM_OBJECTS], /* i : VAD flag */ - ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ - int16_t md_diff_flag[], /* o : metadata differential flag */ - int16_t *sid_flag /* o : indication of SID frame */ -) -{ - int16_t ch, dtx_flag; - int16_t nBits, nBits_MD_max; - int16_t nBits_azimuth, nBits_elevation, nBits_coh, nBits_sce_id; - float lp_noise[MAX_NUM_OBJECTS], lp_noise_variation, lp_noise_mean; - float lp_noise_max; - float tmp1, tmp2; - - /* initialization */ - for ( ch = 0; ch < nchan_transport; ch++ ) - { - hSCE[ch]->hCoreCoder[0]->low_rate_mode = 0; - } - - /*------------------------------------------------------------------* - * compute global ISM DTX flag - *-----------------------------------------------------------------*/ - - /* compute global ISM based on localVAD */ - dtx_flag = 1; - for ( ch = 0; ch < nchan_transport; ch++ ) - { - dtx_flag &= !vad_flag[ch]; - } - - /* compute global ISM based on long-term background noise */ - /* one of the channels is active -> no DTX */ - for ( ch = 0; ch < nchan_transport; ch++ ) - { - lp_noise[ch] = hSCE[ch]->hCoreCoder[0]->lp_noise; - } - - lp_noise_variation = var( lp_noise, nchan_transport ); - lp_noise_mean = mean( lp_noise, nchan_transport ); - - if ( lp_noise_mean > 50 || ( lp_noise_mean > 25 && lp_noise_variation > 32 ) ) - { - dtx_flag = 0; - } - - - /* default DTX is applied at lower bitrates; otherwise DTX is applied only in silence */ - maximum( lp_noise, nchan_transport, &lp_noise_max ); - - if ( !( ( nchan_ism == 1 && ivas_total_brate <= IVAS_24k4 ) || - ( nchan_ism == 2 && ivas_total_brate <= IVAS_48k ) || - ( nchan_ism == 3 && ivas_total_brate <= IVAS_80k ) || - ( nchan_ism == 4 && ivas_total_brate <= IVAS_96k ) || - lp_noise_max < 15 ) ) - { - dtx_flag = 0; - } - - /*------------------------------------------------------------------* - * Reset the bitstream - *-----------------------------------------------------------------*/ - - if ( dtx_flag ) - { - /* reset the bitstream (IVAS format signaling was already written) */ - reset_indices_enc( hSCE[0]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); - } - - /*------------------------------------------------------------------* - * decide about SID metadata to be sent or not (per object) - * estimate the MD bit-budget consumption - *-----------------------------------------------------------------*/ - - if ( dtx_flag ) - { - ivas_get_ism_sid_quan_bitbudget( nchan_ism, &nBits_azimuth, &nBits_elevation, &tmp1, &tmp2, &nBits_coh, &nBits_sce_id ); - - nBits = 0; - for ( ch = 0; ch < nchan_ism; ch++ ) - { - /* check difference between current and last metadata */ - md_diff_flag[ch] = 0; - if ( fabsf( hIsmMeta[ch]->azimuth - hIsmMeta[ch]->last_azimuth ) > MD_MAX_DIFF_AZIMUTH ) - { - md_diff_flag[ch] = 1; - } - - if ( fabsf( hIsmMeta[ch]->elevation - hIsmMeta[ch]->last_elevation ) > MD_MAX_DIFF_ELEVATION ) - { - md_diff_flag[ch] = 1; - } - - /* estimate SID metadata bit-budget */ - nBits++; /* number of objects */ - nBits++; /* SID metadata flag */ - if ( md_diff_flag[ch] == 1 ) - { - nBits += nBits_azimuth; - nBits += nBits_elevation; - } - } - - /* calculate maximum available MD bit-budget */ - nBits_MD_max = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC; - nBits_MD_max -= SID_FORMAT_NBITS; - if ( nchan_transport > 1 ) - { - nBits_MD_max -= nBits_sce_id; - } - - for ( ch = 0; ch < nchan_transport - 1; ch++ ) - { - nBits_MD_max -= nBits_coh; /* coherence */ - } - - if ( nchan_ism > 3 ) - { - nBits_MD_max--; /* ism_mode flag */ - } - - /* too many metadata bits -> switch to active coding */ - if ( nBits > nBits_MD_max ) - { - dtx_flag = 0; - } - } - - /*------------------------------------------------------------------* - * set core_brate for all channels - * get 'sid_flag' value - *-----------------------------------------------------------------*/ - - *sid_flag = 0; - - if ( !dtx_flag ) - { - /* at least one of the channels is active -> no DTX */ - for ( ch = 0; ch < nchan_transport; ch++ ) - { - hSCE[ch]->hCoreCoder[0]->core_brate = -1; - set_bw( IVAS_SCE, hSCE[ch]->element_brate, hSCE[ch]->hCoreCoder[0], MODE1 ); - } - - hISMDTX->cnt_SID_ISM = -1; - - /* IVAS format signaling was erased in dtx() */ - if ( hSCE[0]->hCoreCoder[0]->hBstr->nb_bits_tot == 0 ) - { - /* replicate ivas_write_format() */ - push_indice( hSCE[0]->hCoreCoder[0]->hBstr, IND_IVAS_FORMAT, 2 /* == ISM format */, IVAS_FORMAT_SIGNALING_NBITS ); - } - } - else /* ism_dtx_flag == 1 */ - { - for ( ch = 0; ch < nchan_transport; ch++ ) - { - hSCE[ch]->hCoreCoder[0]->cng_type = FD_CNG; - } - - /* * update the global SID counter */ - hISMDTX->cnt_SID_ISM++; - if ( hISMDTX->cnt_SID_ISM >= hSCE[0]->hCoreCoder[0]->hDtxEnc->max_SID ) - { - /* adaptive SID update interval */ - hSCE[0]->hCoreCoder[0]->hDtxEnc->max_SID = hSCE[0]->hCoreCoder[0]->hDtxEnc->interval_SID; - hISMDTX->cnt_SID_ISM = 0; - } - - /* encode SID in one channel only */ - for ( ch = 0; ch < nchan_transport; ch++ ) - { - hSCE[ch]->hCoreCoder[0]->core_brate = FRAME_NO_DATA; - } - - if ( hISMDTX->cnt_SID_ISM == 0 ) - { - hSCE[hISMDTX->sce_id_dtx]->hCoreCoder[0]->core_brate = SID_2k40; - *sid_flag = 1; - } - } - - if ( dtx_flag == 1 && *sid_flag == 0 ) - { - set_s( md_diff_flag, 0, nchan_transport ); - } - - return dtx_flag; -} -#else /*-------------------------------------------------------------------* * ivas_ism_dtx_enc() * @@ -438,7 +223,7 @@ int16_t ivas_ism_dtx_enc( return dtx_flag; } -#endif + /*-------------------------------------------------------------------* * ivas_ism_get_sce_id_dtx() @@ -510,11 +295,7 @@ void ivas_ism_coh_estim_dtx_enc( { Encoder_State *st, *st_id0; int16_t sce_id, i; -#ifdef DISCRETE_ISM_DTX_CNG - float acorr_ene[MAX_NUM_OBJECTS], xcorr_ene; -#else float acorr_ene[PARAM_ISM_MAX_DMX], xcorr_ene; -#endif if ( nchan_transport == 1 ) { @@ -558,3 +339,4 @@ void ivas_ism_coh_estim_dtx_enc( return; } +#endif diff --git a/lib_enc/ivas_ism_enc.c b/lib_enc/ivas_ism_enc.c index 25ce78ff2e..85b8e0c4aa 100644 --- a/lib_enc/ivas_ism_enc.c +++ b/lib_enc/ivas_ism_enc.c @@ -85,16 +85,9 @@ ivas_error ivas_ism_enc( float Etot_LR[1]; /* total energy; correlation shift */ float lf_E[1][2 * VOIC_BINS]; /* per bin spectrum energy in lf */ int16_t localVAD_HE_SAD[1]; /* local HE VAD */ -#ifdef DISCRETE_ISM_DTX_CNG - int16_t nchan_ism, dtx_flag, sid_flag, flag_noisy_speech; - int16_t md_diff_flag[MAX_NUM_OBJECTS]; -#else -#ifdef NCHAN_ISM_PARAMETER - int16_t nchan_ism, dtx_flag, sid_flag; -#else - int16_t dtx_flag, sid_flag, flag_noisy_speech; -#endif int16_t i, nBits; +#ifdef PARAM_ISM_DTX_CNG + int16_t dtx_flag, sid_flag; #endif ivas_error error; @@ -106,27 +99,10 @@ ivas_error ivas_ism_enc( error = IVAS_ERR_OK; +#ifdef PARAM_ISM_DTX_CNG dtx_flag = 0; sid_flag = 0; -#if ( !defined NCHAN_ISM_PARAMETER || defined DISCRETE_ISM_DTX_CNG ) - flag_noisy_speech = 0; -#endif - -#ifdef NCHAN_ISM_PARAMETER - nchan_ism = st_ivas->hEncoderConfig->nchan_ism; -#else -#ifdef DISCRETE_ISM_DTX_CNG - if ( st_ivas->ism_mode == ISM_MODE_PARAM ) - { - nchan_ism = st_ivas->hDirAC->hParamIsm->num_obj; - } - else /* ism_mode == ISM_MODE_DISC */ - { - nchan_ism = st_ivas->nchan_transport; - } -#endif #endif - set_s( md_diff_flag, 1, nchan_ism ); /*------------------------------------------------------------------* * Preprocesing @@ -182,47 +158,39 @@ ivas_error ivas_ism_enc( * Front Pre-processing *----------------------------------------------------------------*/ +#ifdef LOW_RATE_TRANS_CORE_CODER error = pre_proc_front_ivas( hSCE, NULL, hSCE->element_brate, nb_bits_metadata[sce_id], input_frame, 0, old_inp_12k8[sce_id][0], old_inp_16k[sce_id][0], &ener[sce_id][0], &relE[sce_id][0], A[sce_id][0], Aw[sce_id][0], epsP[sce_id][0], lsp_new[sce_id][0], lsp_mid[sce_id][0], &vad_hover_flag[sce_id][0], &attack_flag[sce_id][0], realBuffer[sce_id][0], imagBuffer[sce_id][0], old_wsp[sce_id][0], pitch_fr[sce_id][0], voicing_fr[sce_id][0], &loc_harm[sce_id][0], &cor_map_sum[sce_id][0], &vad_flag_dtx[sce_id][0], enerBuffer[sce_id][0], fft_buff[sce_id][0], A[sce_id][0], lsp_new[sce_id][0], currFlatness[0], 0, fr_bands, Etot_LR, lf_E, localVAD_HE_SAD, NULL, 0, 0, 0, 0, st_ivas->hEncoderConfig->ivas_total_brate ); +#else + error = pre_proc_front_ivas( hSCE, NULL, hSCE->element_brate, nb_bits_metadata[sce_id], input_frame, 0, old_inp_12k8[sce_id][0], old_inp_16k[sce_id][0], + &ener[sce_id][0], &relE[sce_id][0], A[sce_id][0], Aw[sce_id][0], epsP[sce_id][0], lsp_new[sce_id][0], lsp_mid[sce_id][0], + &vad_hover_flag[sce_id][0], &attack_flag[sce_id][0], realBuffer[sce_id][0], imagBuffer[sce_id][0], old_wsp[sce_id][0], pitch_fr[sce_id][0], voicing_fr[sce_id][0], &loc_harm[sce_id][0], &cor_map_sum[sce_id][0], &vad_flag_dtx[sce_id][0], enerBuffer[sce_id][0], + fft_buff[sce_id][0], A[sce_id][0], lsp_new[sce_id][0], currFlatness[0], 0, fr_bands, Etot_LR, lf_E, localVAD_HE_SAD, NULL, 0, 0, 0, 0, + st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->hEncoderConfig->ivas_format ); +#endif if ( error != IVAS_ERR_OK ) { return error; } -#ifdef DISCRETE_ISM_DTX_CNG - if ( st_ivas->hEncoderConfig->Opt_DTX_ON ) - { - vad_flag[sce_id] = vad_flag_dtx[sce_id][0]; - } - else -#endif - { - vad_flag[sce_id] = st->vad_flag; - } + vad_flag[sce_id] = st->vad_flag; } +#ifdef PARAM_ISM_DTX_CNG /*------------------------------------------------------------------* * DTX analysis *-----------------------------------------------------------------*/ -#ifdef DISCRETE_ISM_DTX_CNG - if ( st_ivas->hEncoderConfig->Opt_DTX_ON ) -#else if ( st_ivas->hEncoderConfig->Opt_DTX_ON && st_ivas->ism_mode == ISM_MODE_PARAM ) -#endif { /* compute the dominant sce_id using long term energy */ ivas_ism_get_sce_id_dtx( st_ivas->hISMDTX, st_ivas->hSCE, st_ivas->nchan_transport, input_frame ); /* analysis and decision about DTX */ -#ifdef DISCRETE_ISM_DTX_CNG - dtx_flag = ivas_ism_dtx_enc( st_ivas->hISMDTX, st_ivas->hSCE, st_ivas->hEncoderConfig->ivas_total_brate, nchan_ism, st_ivas->nchan_transport, vad_flag, st_ivas->hIsmMetaData, md_diff_flag, &sid_flag ); -#else dtx_flag = ivas_ism_dtx_enc( st_ivas, &sid_flag ); -#endif if ( sid_flag ) { @@ -231,96 +199,85 @@ ivas_error ivas_ism_enc( } #ifdef DEBUG_MODE_PARAM_ISM - if ( st_ivas->hDirAC != NULL ) - dbgwrite( &( st_ivas->hDirAC->hParamIsm->flag_noisy_speech ), sizeof( int16_t ), 1, 1, "./res/ParamISM_noisy_speech_flag_enc.dat" ); + dbgwrite( &( st_ivas->hISMDTX->flag_noisy_speech ), sizeof( int16_t ), 1, 1, "./res/ParamISM_noisy_speech_flag_enc.dat" ); dbgwrite( &( st_ivas->hISMDTX->dtx_flag ), sizeof( int16_t ), 1, 1, "./res/ParamISM_DTX_CNG_flag_enc.dat" ); - dbgwrite( &( st_ivas->hISMDTX->sce_id_dtx ), sizeof( int16_t ), 1, input_frame, "./res/sce_id_dtx" ); - dbgwrite( &( dtx_flag ), sizeof( int16_t ), 1, input_frame, "./res/dtx_flag" ); #endif } +#endif /*------------------------------------------------------------------* * Analysis of objects, configuration and decision about bitrates per channel * Metadata quantization and encoding *-----------------------------------------------------------------*/ +#ifdef PARAM_ISM_DTX_CNG if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { ivas_param_ism_compute_noisy_speech_flag( st_ivas ); -#ifdef DISCRETE_ISM_DTX_CNG - flag_noisy_speech = st_ivas->hDirAC->hParamIsm->flag_noisy_speech; -#endif } if ( dtx_flag ) { -#ifdef DISCRETE_ISM_DTX_CNG - ivas_ism_metadata_sid_enc( st_ivas->hISMDTX, flag_noisy_speech, nchan_ism, st_ivas->nchan_transport, st_ivas->ism_mode, st_ivas->hIsmMetaData, sid_flag, md_diff_flag, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata ); -#else if ( sid_flag ) { -#ifdef NCHAN_ISM_PARAMETER - ivas_param_ism_metadata_dtx_enc( st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, st_ivas->hIsmMetaData, st_ivas->hISMDTX, st_ivas->hDirAC->hParamIsm, nchan_ism ); -#else ivas_param_ism_metadata_dtx_enc( st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, st_ivas->hIsmMetaData, st_ivas->hISMDTX, st_ivas->hDirAC->hParamIsm ); -#endif } -#endif } - else if ( st_ivas->ism_mode == ISM_MODE_PARAM ) - { - // VE: call ivas_ism_metadata_enc() with 'st_ivas' - TBD -#ifdef TD5 - ivas_ism_metadata_enc( st_ivas->hEncoderConfig->ivas_total_brate, -#ifdef NCHAN_ISM_PARAMETER - nchan_ism, + else #endif - st_ivas->nchan_transport, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata, vad_flag, st_ivas->ism_mode, st_ivas->hDirAC->hParamIsm, st_ivas->hEncoderConfig->ism_extended_metadata_flag ); -#else - ivas_ism_metadata_enc( st_ivas->hEncoderConfig->ivas_total_brate, -#ifdef NCHAN_ISM_PARAMETER - nchan_ism, -#endif - st_ivas->nchan_transport, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata, vad_flag, st_ivas->ism_mode, st_ivas->hDirAC->hParamIsm ); + if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { +#ifndef PARAM_ISM_DTX_CNG + /* Move the Noisy speech buffer */ + for ( i = 0; i < ( PARAM_ISM_HYS_BUF_SIZE - 1 ); i++ ) + { + st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i] = st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i + 1]; + } + + /* For the current frame, make a decision based on some core-coder flags */ + if ( st_ivas->hSCE[0]->hCoreCoder[0]->flag_noisy_speech_snr && st_ivas->hSCE[1]->hCoreCoder[0]->flag_noisy_speech_snr ) + { + if ( st_ivas->hSCE[0]->hCoreCoder[0]->vad_flag || st_ivas->hSCE[1]->hCoreCoder[0]->vad_flag ) + { + st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i] = 0; + } + else + { + st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i] = 1; + } + } + else + { + st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i] = 0; + } + + /* Do a decision based on hysterisis */ + st_ivas->hDirAC->hParamIsm->flag_noisy_speech = 1; + for ( i = 0; i < PARAM_ISM_HYS_BUF_SIZE; i++ ) + { + st_ivas->hDirAC->hParamIsm->flag_noisy_speech = st_ivas->hDirAC->hParamIsm->flag_noisy_speech && st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i]; + } #endif + ivas_ism_metadata_enc( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata, vad_flag, st_ivas->ism_mode, st_ivas->hDirAC->hParamIsm ); } else /* ISM_MODE_DISC */ { -#ifdef TD5 - ivas_ism_metadata_enc( st_ivas->hEncoderConfig->ivas_total_brate, -#ifdef NCHAN_ISM_PARAMETER - nchan_ism, -#endif - st_ivas->nchan_transport, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata, vad_flag, st_ivas->ism_mode, NULL, st_ivas->hEncoderConfig->ism_extended_metadata_flag ); -#else - ivas_ism_metadata_enc( st_ivas->hEncoderConfig->ivas_total_brate, -#ifdef NCHAN_ISM_PARAMETER - nchan_ism, -#endif - st_ivas->nchan_transport, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata, vad_flag, st_ivas->ism_mode, NULL ); -#endif + ivas_ism_metadata_enc( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata, vad_flag, st_ivas->ism_mode, NULL ); } -#ifdef DISCRETE_ISM_DTX_CNG - update_last_metadata( nchan_ism, st_ivas->hIsmMetaData, md_diff_flag ); -#endif - /*----------------------------------------------------------------* * Write IVAS format signaling in SID frames *----------------------------------------------------------------*/ st = st_ivas->hSCE[0]->hCoreCoder[0]; -#ifdef DISCRETE_ISM_DTX_CNG - if ( sid_flag ) -#else if ( st->core_brate == SID_2k40 ) -#endif { ivas_write_format_sid( st_ivas->hEncoderConfig->ivas_format, IVAS_SCE, st->hBstr ); -#ifndef DISCRETE_ISM_DTX_CNG +#ifdef PARAM_ISM_DTX_CNG if ( st_ivas->ism_mode != ISM_MODE_PARAM ) +#endif { /* write unused bits */ nBits = ( IVAS_SID_5k2 - SID_2k40 ) / 50 - SID_FORMAT_NBITS; @@ -331,7 +288,6 @@ ivas_error ivas_ism_enc( nBits -= i; } } -#endif } /*------------------------------------------------------------------* @@ -373,7 +329,9 @@ ivas_error ivas_ism_enc( * Encoder *----------------------------------------------------------------*/ +#ifdef PARAM_ISM_DTX_CNG if ( !dtx_flag || ( dtx_flag && sce_id == st_ivas->hISMDTX->sce_id_dtx ) ) +#endif { if ( ( error = ivas_core_enc( hSCE, NULL, NULL, 1, old_inp_12k8[sce_id], old_inp_16k[sce_id], ener[sce_id], A[sce_id], Aw[sce_id], epsP[sce_id], lsp_new[sce_id], lsp_mid[sce_id], vad_hover_flag[sce_id], attack_flag[sce_id], realBuffer[sce_id], imagBuffer[sce_id], old_wsp[sce_id], loc_harm[sce_id], cor_map_sum[sce_id], vad_flag_dtx[sce_id], enerBuffer[sce_id], fft_buff[sce_id], 0, ISM_FORMAT, 0 ) ) != IVAS_ERR_OK ) { @@ -392,6 +350,7 @@ ivas_error ivas_ism_enc( st->hTranDet->transientDetector.prev_bIsAttackPresent = st->hTranDet->transientDetector.bIsAttackPresent; } +#ifdef PARAM_ISM_DTX_CNG if ( dtx_flag ) { for ( sce_id = 0; sce_id < st_ivas->nchan_transport; sce_id++ ) @@ -400,47 +359,11 @@ ivas_error ivas_ism_enc( { st_ivas->hSCE[sce_id]->hCoreCoder[0]->last_core = st_ivas->hSCE[st_ivas->hISMDTX->sce_id_dtx]->hCoreCoder[0]->last_core; st_ivas->hSCE[sce_id]->hCoreCoder[0]->last_core_brate = st_ivas->hSCE[st_ivas->hISMDTX->sce_id_dtx]->hCoreCoder[0]->core_brate; - st_ivas->hSCE[sce_id]->hCoreCoder[0]->last_L_frame = st_ivas->hSCE[st_ivas->hISMDTX->sce_id_dtx]->hCoreCoder[0]->last_L_frame; - } - } - } - -#ifdef DISCRETE_ISM_DTX_CNG -#ifdef DEBUG_MODE_INFO - if ( dtx_flag ) - { - float tmpF; - int16_t id, n; - - n = 0; - for ( sce_id = 0; sce_id < st_ivas->nchan_transport; sce_id++ ) - { - if ( sce_id != st_ivas->hISMDTX->sce_id_dtx ) - { - st = st_ivas->hSCE[sce_id]->hCoreCoder[0]; - id = st->id_element; - - dbgwrite( &st->core, sizeof( int16_t ), 1, input_frame, fname( debug_dir, "core", n, id, ENC ) ); - dbgwrite( &st->extl, sizeof( int16_t ), 1, input_frame, fname( debug_dir, "extl", n, id, ENC ) ); - dbgwrite( &st->bwidth, sizeof( int16_t ), 1, input_frame, fname( debug_dir, "bwidth", n, id, ENC ) ); - tmpF = st->total_brate / 1000.0f; - dbgwrite( &tmpF, sizeof( float ), 1, input_frame, fname( debug_dir, "total_brate", n, id, ENC ) ); - tmpF = st->core_brate / 1000.0f; - dbgwrite( &tmpF, sizeof( float ), 1, input_frame, fname( debug_dir, "core_brate", n, id, ENC ) ); - tmpF = st->extl_brate / 1000.0f; - dbgwrite( &tmpF, sizeof( float ), 1, input_frame, fname( debug_dir, "extl_brate", n, id, ENC ) ); - - dbgwrite( &st->coder_type, sizeof( int16_t ), 1, input_frame, fname( debug_dir, "coder_type", n, id, ENC ) ); - dbgwrite( &st->coder_type_raw, sizeof( int16_t ), 1, input_frame, fname( debug_dir, "coder_type_raw", n, id, ENC ) ); - dbgwrite( &st->vad_flag, sizeof( int16_t ), 1, input_frame, fname( debug_dir, "vad_flag", n, id, ENC ) ); - dbgwrite( &st->localVAD, sizeof( int16_t ), 1, input_frame, fname( debug_dir, "localVAD", n, id, ENC ) ); - - dbgwrite( &st->lp_noise, sizeof( float ), 1, input_frame, fname( debug_dir, "lp_noise", n, id, ENC ) ); } } } #endif -#endif + pop_wmops(); return error; @@ -454,6 +377,7 @@ ivas_error ivas_ism_enc( * - reconfigure the ISM format encoder *-------------------------------------------------------------------------*/ +/*! r : ISM format mode */ ivas_error ivas_ism_enc_config( Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ) @@ -479,7 +403,7 @@ ivas_error ivas_ism_enc_config( /* Reset and Initialize */ if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { - st_ivas->nchan_transport = MAX_PARAM_ISM_WAVE; + st_ivas->nchan_transport = 2; } else { @@ -513,7 +437,8 @@ ivas_error ivas_ism_enc_config( if ( st_ivas->ism_mode == ISM_MODE_DISC && last_ism_mode == ISM_MODE_PARAM ) { /* Deallocate the memory used by ParamISM when switch to Discrete ISM */ - ivas_param_ism_enc_close( &( st_ivas->hDirAC ), st_ivas->hEncoderConfig->input_Fs ); + ivas_param_ism_enc_close( st_ivas->hDirAC, st_ivas->hEncoderConfig->input_Fs ); + st_ivas->hDirAC = NULL; } } diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index ddac05ff00..41e0f8ac78 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -49,34 +49,16 @@ * Local constants *-----------------------------------------------------------------------*/ -#ifdef TD5 -#define ISM_NUM_PARAM 5 /* number of coded metadata parameters */ -#else #define ISM_NUM_PARAM 2 /* number of coded metadata parameters */ -#endif #define ISM_MAX_AZIMUTH_DIFF_IDX ( ISM_AZIMUTH_NBITS - 1 /*zero*/ - 1 /*sign*/ ) #define ISM_MAX_ELEVATION_DIFF_IDX ( ISM_ELEVATION_NBITS - 1 /*zero*/ - 1 /*sign*/ ) -#ifdef TD5 -#define ISM_MAX_RADIUS_DIFF_IDX ( ISM_RADIUS_NBITS - 1 /*zero*/ - 1 /*sign*/ ) -#endif #define ISM_FEC_MAX 10 #define INTER_OBJECT_PARAM_CHECK ( ( ISM_FEC_MAX / 2 ) - 2 ) /* note: constant must be less than (ISM_FEC_MAX / number of coded parameters) */ -#ifdef TD5 -/*-----------------------------------------------------------------------* - * Local function declarations - *-----------------------------------------------------------------------*/ - -static void encode_angle_indices( BSTR_ENC_HANDLE hBstr, ISM_METADATA_ANGLE_HANDLE angle, const int16_t last_ism_metadata_flag, const int16_t ini_frame, const int16_t idx_azimuth_abs, const int16_t idx_elevation_abs, int16_t *flag_abs_azimuth, int16_t *flag_abs_elevation ); - -static void encode_radius( BSTR_ENC_HANDLE hBstr, int16_t *last_radius_idx, int16_t *radius_diff_cnt, const int16_t last_ism_metadata_flag, const int16_t idx_radius_abs, int16_t *flag_abs_radius ); - -#endif - /*-------------------------------------------------------------------------* * ivas_set_ism_metadata() * @@ -86,14 +68,7 @@ static void encode_radius( BSTR_ENC_HANDLE hBstr, int16_t *last_radius_idx, int1 ivas_error ivas_set_ism_metadata( ISM_METADATA_HANDLE hIsmMeta, /* o : ISM metadata handle */ const float azimuth, /* i : azimuth value */ -#ifdef TD5 - const float elevation, /* i : elevation */ - const float radius_meta, /* i : radius */ - const float yaw, /* i : yaw */ - const float pitch /* i : pitch */ -#else - const float elevation /* i : elevation value */ -#endif + const float elevation /* i : elevation value */ ) { if ( hIsmMeta == NULL ) @@ -106,11 +81,6 @@ ivas_error ivas_set_ism_metadata( /* save read metadata parameters to the internal codec structure */ hIsmMeta->azimuth = azimuth; hIsmMeta->elevation = elevation; -#ifdef TD5 - hIsmMeta->radius = radius_meta; - hIsmMeta->yaw = yaw; - hIsmMeta->pitch = pitch; -#endif return IVAS_ERR_OK; } @@ -119,7 +89,7 @@ ivas_error ivas_set_ism_metadata( /*-------------------------------------------------------------------------* * rate_ism_importance() * - * Rate importance of particular ISM streams + * Rate importance of particular ISm streams *-------------------------------------------------------------------------*/ static void rate_ism_importance( @@ -176,96 +146,64 @@ static void rate_ism_importance( *-------------------------------------------------------------------------*/ ivas_error ivas_ism_metadata_enc( - const int32_t ism_total_brate, /* i : ISM total bitrate */ -#ifdef NCHAN_ISM_PARAMETER - const int16_t nchan_ism, /* i : number of ISM channels */ -#endif - const int16_t nchan_transport, /* i : number of transport channels */ - ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ - SCE_ENC_HANDLE hSCE[], /* i/o: SCE encoder handles */ - BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ - int16_t nb_bits_metadata[], /* o : number of metadata bits */ - const int16_t localVAD[], /* i : VAD flag */ - const int16_t ism_mode, /* i : ISM mode */ -#ifdef TD5 - const PARAM_ISM_CONFIG_HANDLE hParamIsm, /* i : Param ISM Enc Handle */ - const int16_t ism_extended_metadata_flag /* i : Extended metadata flag */ -#else + const int32_t ism_total_brate, /* i : ISms total bitrate */ + const int16_t nchan_transport, /* i : number of transport channels */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + SCE_ENC_HANDLE hSCE[], /* i/o: SCE encoder handles */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + int16_t nb_bits_metadata[], /* o : number of metadata bits */ + const int16_t localVAD[], /* i : VAD flag */ + const int16_t ism_mode, /* i : ISM mode */ const PARAM_ISM_CONFIG_HANDLE hParamIsm /* i : Param ISM Enc Handle */ -#endif ) { -#ifdef TD5 -#ifdef TUNE_360_OBJECT_WITH_NOISE - int16_t i, ch, nb_bits_start = 0; -#else - int16_t i, ch, nb_bits_start = 0, diff; -#endif - int16_t idx_azimuth_abs = 0, flag_abs_azimuth[MAX_NUM_OBJECTS]; - int16_t idx_elevation_abs = 0, flag_abs_elevation[MAX_NUM_OBJECTS]; - int16_t flag_abs_azimuth_orientation[MAX_NUM_OBJECTS]; - int16_t idx_radius_abs = 0, flag_abs_radius[MAX_NUM_OBJECTS]; -#else int16_t i, ch, nb_bits_start = 0, diff; int16_t idx_azimuth, idx_azimuth_abs = 0, flag_abs_azimuth[MAX_NUM_OBJECTS], nbits_diff_azimuth; int16_t idx_elevation, idx_elevation_abs = 0, flag_abs_elevation[MAX_NUM_OBJECTS], nbits_diff_elevation; -#endif float valQ; ISM_METADATA_HANDLE hIsmMetaData; int32_t element_brate[MAX_NUM_OBJECTS], total_brate[MAX_NUM_OBJECTS]; int16_t ism_metadata_flag_global; int16_t ism_imp[MAX_NUM_OBJECTS]; -#ifdef NCHAN_ISM_PARAMETER - int16_t nbands, nblocks; -#else - int16_t nchan_ism, nbands, nblocks; -#endif + int16_t num_obj, nbands, nblocks; ivas_error error; error = IVAS_ERR_OK; push_wmops( "ism_meta_enc" ); -#ifndef NCHAN_ISM_PARAMETER if ( ism_mode == ISM_MODE_PARAM ) { - nchan_ism = hParamIsm->num_obj; + num_obj = hParamIsm->num_obj; } else if ( ism_mode == ISM_MODE_DISC ) { - nchan_ism = nchan_transport; + num_obj = nchan_transport; } else { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: incorrect ISM mode" ); } -#endif -#ifndef DISCRETE_ISM_DTX_CNG - if ( nchan_ism == 1 && ( hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 || hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA ) && ism_mode == ISM_MODE_DISC ) + if ( num_obj == 1 && ( hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 || hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA ) && ism_mode == ISM_MODE_DISC ) { /* no metadata encoding in CNG */ pop_wmops(); return error; } -#endif /* initialization */ ism_metadata_flag_global = 0; set_s( nb_bits_metadata, 0, nchan_transport ); - set_s( flag_abs_azimuth, 0, nchan_ism ); - set_s( flag_abs_elevation, 0, nchan_ism ); -#ifdef TD5 - set_s( flag_abs_azimuth_orientation, 0, nchan_ism ); - set_s( flag_abs_radius, 0, nchan_ism ); -#endif + set_s( flag_abs_azimuth, 0, num_obj ); + set_s( flag_abs_elevation, 0, num_obj ); /*----------------------------------------------------------------* * Set Metadata presence / importance flag *----------------------------------------------------------------*/ - for ( ch = 0; ch < nchan_ism; ch++ ) + for ( ch = 0; ch < num_obj; ch++ ) { if ( ism_mode == ISM_MODE_PARAM ) { @@ -273,39 +211,6 @@ ivas_error ivas_ism_metadata_enc( } else if ( ism_mode == ISM_MODE_DISC ) { -#ifdef TD5 -#ifdef TUNE_360_OBJECT_WITH_NOISE -#ifdef DISCRETE_ISM_DTX_CNG - hIsmMeta[ch]->ism_metadata_flag = localVAD[ch] || hSCE[ch]->hCoreCoder[0]->lp_noise > 10; -#else - /* In case of low level noise for low bitrate inactive frames, do not sent metadata */ - if ( localVAD[ch] == 0 && !( hSCE[ch]->hCoreCoder[0]->tcxonly ) && ( hSCE[ch]->hCoreCoder[0]->lp_noise <= 10 ) ) - { - hIsmMeta[ch]->ism_metadata_flag = 0; - } -#endif -#else - if ( hIsmMeta[ch]->ism_metadata_flag ) - { - /* at highest bitrates (with TCX core only) metadata are sent also for inactive frames */ - if ( localVAD[ch] == 0 && !( hSCE[ch]->hCoreCoder[0]->tcxonly ) ) - { - /* send metadata even in inactive segments when noise is audible and metadata are changing */ - diff = (int16_t) fabsf( hIsmMeta[ch]->azimuth - ism_dequant_meta( hIsmMeta[ch]->angle[0].last_azimuth_idx, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ) ); - diff = max( diff, (int16_t) fabsf( hIsmMeta[ch]->elevation - ism_dequant_meta( hIsmMeta[ch]->angle[0].last_elevation_idx, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ) ) ); - if ( ism_total_brate >= ISM_EXTENDED_METADATA_BRATE && ism_extended_metadata_flag ) - { - diff = max( diff, (int16_t) fabsf( hIsmMeta[ch]->yaw - ism_dequant_meta( hIsmMeta[ch]->angle[1].last_azimuth_idx, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ) ) ); - diff = max( diff, (int16_t) fabsf( hIsmMeta[ch]->pitch - ism_dequant_meta( hIsmMeta[ch]->angle[1].last_elevation_idx, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ) ) ); - } - if ( !( hSCE[ch]->hCoreCoder[0]->lp_noise > 15 && diff >= 10 ) ) - { - hIsmMeta[ch]->ism_metadata_flag = 0; - } - } - } -#endif -#else #ifdef TUNE_360_OBJECT_WITH_NOISE hIsmMeta[ch]->ism_metadata_flag = localVAD[ch] || hSCE[ch]->hCoreCoder[0]->lp_noise > 10; #else @@ -314,8 +219,8 @@ ivas_error ivas_ism_metadata_enc( if ( hIsmMeta[ch]->ism_metadata_flag == 0 ) { /* send metadata even in inactive segments when noise is audible and metadata are changing */ - diff = (int16_t) fabsf( hIsmMeta[ch]->azimuth - ism_dequant_meta( hIsmMeta[ch]->last_azimuth_idx, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ) ); - diff = max( diff, (int16_t) fabsf( hIsmMeta[ch]->elevation - ism_dequant_meta( hIsmMeta[ch]->last_elevation_idx, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ) ) ); + diff = (int16_t) fabsf( hIsmMeta[ch]->azimuth - ism_dequant_meta( hIsmMeta[ch]->last_azimuth_idx, ism_azimuth_borders, 1 << ISM_AZIMUTH_NBITS ) ); + diff = max( diff, (int16_t) fabsf( hIsmMeta[ch]->elevation - ism_dequant_meta( hIsmMeta[ch]->last_elevation_idx, ism_elevation_borders, 1 << ISM_ELEVATION_NBITS ) ) ); if ( hSCE[ch]->hCoreCoder[0]->lp_noise > 15 && diff >= 10 ) { @@ -329,25 +234,24 @@ ivas_error ivas_ism_metadata_enc( /* at highest bitrates (with TCX core only) metadata are sent in every frame */ hIsmMeta[ch]->ism_metadata_flag = 1; } -#endif } } /*----------------------------------------------------------------* - * Rate importance of particular ISM streams + * Rate importance of particular ISm streams *----------------------------------------------------------------*/ rate_ism_importance( nchan_transport, hIsmMeta, hSCE, ism_imp ); #ifndef TUNE_360_OBJECT_WITH_NOISE /* relax the importance decision in "stereo" coding for noisy audio */ - if ( ism_mode == ISM_MODE_DISC && nchan_ism == 2 ) + if ( ism_mode == ISM_MODE_DISC && num_obj == 2 ) { float diff_F; if ( hIsmMeta[0]->ism_metadata_flag ^ hIsmMeta[1]->ism_metadata_flag ) { - for ( ch = 0; ch < nchan_ism; ch++ ) + for ( ch = 0; ch < num_obj; ch++ ) { diff_F = hSCE[ch]->hCoreCoder[0]->lp_speech - hSCE[ch]->hCoreCoder[0]->lp_noise; @@ -360,33 +264,24 @@ ivas_error ivas_ism_metadata_enc( } } #endif - /*----------------------------------------------------------------* - * Write ISM common signaling + * Write ISm common signaling *----------------------------------------------------------------*/ /* write number of objects - unary coding */ - for ( ch = 1; ch < nchan_ism; ch++ ) + for ( ch = 1; ch < num_obj; ch++ ) { push_indice( hBstr, IND_ISM_NUM_OBJECTS, 1, 1 ); } push_indice( hBstr, IND_ISM_NUM_OBJECTS, 0, 1 ); -#ifdef TD5 - /* write extended metadata presence flag */ - if ( ism_total_brate >= ISM_EXTENDED_METADATA_BRATE ) - { - push_indice( hBstr, IND_ISM_EXTENDED_FLAG, ism_extended_metadata_flag, ISM_EXTENDED_METADATA_BITS ); - } -#endif - - /* write ISM metadata flag (one per object) */ + /* write ISm metadata flag (one per object) */ for ( ch = 0; ch < nchan_transport; ch++ ) { push_indice( hBstr, IND_ISM_METADATA_FLAG, ism_imp[ch], ISM_METADATA_FLAG_BITS ); } - for ( ch = 0; ch < nchan_ism; ch++ ) + for ( ch = 0; ch < num_obj; ch++ ) { ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag; } @@ -418,7 +313,7 @@ ivas_error ivas_ism_metadata_enc( nb_bits_start = hBstr->nb_bits_tot; } - for ( ch = 0; ch < nchan_ism; ch++ ) + for ( ch = 0; ch < num_obj; ch++ ) { hIsmMetaData = hIsmMeta[ch]; if ( ism_mode == ISM_MODE_DISC ) @@ -428,43 +323,6 @@ ivas_error ivas_ism_metadata_enc( if ( hIsmMeta[ch]->ism_metadata_flag ) { -#ifdef TD5 - /*----------------------------------------------------------------* - * Quantize and encode azimuth and elevation - *----------------------------------------------------------------*/ - - if ( ism_mode == ISM_MODE_DISC ) - { - idx_azimuth_abs = ism_quant_meta( hIsmMetaData->azimuth, &valQ, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); - idx_elevation_abs = ism_quant_meta( hIsmMetaData->elevation, &valQ, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); - } - else /* ISM_MODE_PARAM */ - { - idx_azimuth_abs = hParamIsm->azi_index[ch]; - idx_elevation_abs = hParamIsm->ele_index[ch]; - } - - encode_angle_indices( hBstr, &( hIsmMetaData->angle[0] ), hIsmMetaData->last_ism_metadata_flag, hSCE[0]->hCoreCoder[0]->ini_frame, idx_azimuth_abs, idx_elevation_abs, &flag_abs_azimuth[ch], &flag_abs_elevation[ch] ); - - /*----------------------------------------------------------------* - * Quantize and encode radius, yaw, and pitch - *----------------------------------------------------------------*/ - - if ( ism_mode == ISM_MODE_DISC && ism_extended_metadata_flag ) - { - idx_azimuth_abs = ism_quant_meta( hIsmMetaData->yaw, &valQ, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); - idx_elevation_abs = ism_quant_meta( hIsmMetaData->pitch, &valQ, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); - idx_radius_abs = usquant( hIsmMetaData->radius, &valQ, ISM_RADIUS_MIN, ISM_RADIUS_DELTA, 1 << ISM_RADIUS_NBITS ); - encode_angle_indices( hBstr, &( hIsmMetaData->angle[1] ), hIsmMetaData->last_ism_metadata_flag, hSCE[0]->hCoreCoder[0]->ini_frame, idx_azimuth_abs, idx_elevation_abs, &flag_abs_azimuth_orientation[ch], &flag_abs_elevation[ch] ); - encode_radius( hBstr, &hIsmMetaData->last_radius_idx, &hIsmMetaData->radius_diff_cnt, hIsmMetaData->last_ism_metadata_flag, idx_radius_abs, &flag_abs_radius[ch] ); - } - - /* save number of metadata bits written */ - if ( ism_mode == ISM_MODE_DISC ) - { - nb_bits_metadata[ch] = hBstr->nb_bits_tot - nb_bits_start; - } -#else /*----------------------------------------------------------------* * Azimuth quantization and encoding *----------------------------------------------------------------*/ @@ -472,7 +330,7 @@ ivas_error ivas_ism_metadata_enc( /* Azimuth quantization (quantize azimuth to the AZIMUTH_NBITS-bit index */ if ( ism_mode == ISM_MODE_DISC ) { - idx_azimuth_abs = ism_quant_meta( hIsmMetaData->azimuth, &valQ, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); + idx_azimuth_abs = ism_quant_meta( hIsmMetaData->azimuth, &valQ, ism_azimuth_borders, 1 << ISM_AZIMUTH_NBITS ); } else if ( ism_mode == ISM_MODE_PARAM ) { @@ -578,7 +436,7 @@ ivas_error ivas_ism_metadata_enc( /* Elevation quantization (quantize azimuth to the ELEVATION_NBITS-bit index */ if ( ism_mode == ISM_MODE_DISC ) { - idx_elevation_abs = ism_quant_meta( hIsmMetaData->elevation, &valQ, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); + idx_elevation_abs = ism_quant_meta( hIsmMetaData->elevation, &valQ, ism_elevation_borders, 1 << ISM_ELEVATION_NBITS ); } else /* ISM_MODE_PARAM */ { @@ -709,7 +567,6 @@ ivas_error ivas_ism_metadata_enc( { nb_bits_metadata[ch] = hBstr->nb_bits_tot - nb_bits_start; } -#endif } } @@ -719,16 +576,12 @@ ivas_error ivas_ism_metadata_enc( *----------------------------------------------------------------*/ i = 0; - while ( i == 0 || i < nchan_ism / INTER_OBJECT_PARAM_CHECK ) + while ( i == 0 || i < num_obj / INTER_OBJECT_PARAM_CHECK ) { int16_t num, abs_num, abs_first, abs_next, pos_zero; -#ifdef TD5 - int16_t abs_matrice[INTER_OBJECT_PARAM_CHECK * ISM_NUM_PARAM]; -#else int16_t abs_matrice[INTER_OBJECT_PARAM_CHECK * 2]; -#endif - num = min( INTER_OBJECT_PARAM_CHECK, nchan_ism - i * INTER_OBJECT_PARAM_CHECK ); + num = min( INTER_OBJECT_PARAM_CHECK, num_obj - i * INTER_OBJECT_PARAM_CHECK ); i++; set_s( abs_matrice, 0, INTER_OBJECT_PARAM_CHECK * ISM_NUM_PARAM ); @@ -774,20 +627,12 @@ ivas_error ivas_ism_metadata_enc( if ( abs_next % ISM_NUM_PARAM == 0 ) { -#ifdef TD5 - hIsmMeta[ch]->angle[0].azimuth_diff_cnt = abs_num - 1; -#else hIsmMeta[ch]->azimuth_diff_cnt = abs_num - 1; -#endif } if ( abs_next % ISM_NUM_PARAM == 1 ) { -#ifdef TD5 - hIsmMeta[ch]->angle[0].elevation_diff_cnt = abs_num - 1; -#else hIsmMeta[ch]->elevation_diff_cnt = abs_num - 1; -#endif /*hIsmMeta[ch]->elevation_diff_cnt = min( hIsmMeta[ch]->elevation_diff_cnt, ISM_FEC_MAX );*/ } @@ -850,12 +695,12 @@ ivas_error ivas_ism_metadata_enc( * Configuration and decision about bitrates per channel *----------------------------------------------------------------*/ - if ( ( error = ivas_ism_config( ism_total_brate, nchan_transport, nchan_ism, hIsmMeta, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_ism_config( ism_total_brate, nchan_transport, num_obj, hIsmMeta, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) { return error; } - for ( ch = 0; ch < nchan_ism; ch++ ) + for ( ch = 0; ch < num_obj; ch++ ) { hIsmMeta[ch]->last_ism_metadata_flag = hIsmMeta[ch]->ism_metadata_flag; } @@ -890,7 +735,6 @@ ivas_error ivas_ism_metadata_enc( return error; } - /*------------------------------------------------------------------------- * ivas_ism_metadata_enc_create() * @@ -908,7 +752,7 @@ ivas_error ivas_ism_metadata_enc_create( if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { - nchan_transport = MAX_PARAM_ISM_WAVE; + nchan_transport = 2; } else { @@ -919,39 +763,21 @@ ivas_error ivas_ism_metadata_enc_create( st_ivas->nSCE = nchan_transport; st_ivas->nCPE = 0; - /* allocate ISM metadata handles */ + /* allocate ISm metadata handles */ for ( ch = 0; ch < n_ISms; ch++ ) { if ( ( st_ivas->hIsmMetaData[ch] = (ISM_METADATA_HANDLE) malloc( sizeof( ISM_METADATA_FRAME ) ) ) == NULL ) { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ISM MetaData\n" ) ); + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ISm MetaData\n" ) ); } -#ifdef TD5 - st_ivas->hIsmMetaData[ch]->angle[0].last_azimuth_idx = 0; - st_ivas->hIsmMetaData[ch]->angle[0].azimuth_diff_cnt = ISM_FEC_MAX; - st_ivas->hIsmMetaData[ch]->angle[0].last_elevation_idx = 0; - st_ivas->hIsmMetaData[ch]->angle[0].elevation_diff_cnt = ISM_FEC_MAX - 1; - st_ivas->hIsmMetaData[ch]->last_radius_idx = 0; - st_ivas->hIsmMetaData[ch]->radius_diff_cnt = ISM_FEC_MAX - 2; - st_ivas->hIsmMetaData[ch]->angle[1].last_azimuth_idx = 0; - st_ivas->hIsmMetaData[ch]->angle[1].azimuth_diff_cnt = ISM_FEC_MAX - 2; - st_ivas->hIsmMetaData[ch]->angle[1].last_elevation_idx = 0; - st_ivas->hIsmMetaData[ch]->angle[1].elevation_diff_cnt = ISM_FEC_MAX - 2; -#else st_ivas->hIsmMetaData[ch]->last_azimuth_idx = 0; st_ivas->hIsmMetaData[ch]->azimuth_diff_cnt = ISM_FEC_MAX; st_ivas->hIsmMetaData[ch]->last_elevation_idx = 0; st_ivas->hIsmMetaData[ch]->elevation_diff_cnt = ISM_FEC_MAX - 1; -#endif st_ivas->hIsmMetaData[ch]->last_ism_metadata_flag = 0; ivas_ism_reset_metadata( st_ivas->hIsmMetaData[ch] ); - -#ifdef DISCRETE_ISM_DTX_CNG - st_ivas->hIsmMetaData[ch]->last_azimuth = 0.0f; - st_ivas->hIsmMetaData[ch]->last_elevation = 0.0f; -#endif } if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, n_ISms, NULL, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) @@ -961,507 +787,3 @@ ivas_error ivas_ism_metadata_enc_create( return IVAS_ERR_OK; } - - -#ifdef TD5 -/*------------------------------------------------------------------------- - * encode_radius() - * - * Radius index encoding - *-------------------------------------------------------------------------*/ - -static void encode_radius( - BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ - int16_t *last_radius_idx, /* i/o: last radius index */ - int16_t *radius_diff_cnt, /* i/o: radius diff coding counter */ - const int16_t last_ism_metadata_flag, /* last frame ism_metadata_flag */ - const int16_t idx_radius_abs, /* i : Azimuth index */ - int16_t *flag_abs_radius /* o : Radius encoding mode */ -) -{ - int16_t idx_radius, nbits_diff_radius, diff; - - idx_radius = idx_radius_abs; - nbits_diff_radius = 0; - *flag_abs_radius = 0; /* differential coding by default */ - - if ( *radius_diff_cnt == ISM_FEC_MAX /* make differential encoding in ISM_FEC_MAX consecutive frames at maximum (in order to control the decoding in FEC) */ - || last_ism_metadata_flag == 0 /* If last frame had no metadata coded, do not use differential coding */ - ) - { - *flag_abs_radius = 1; - } - - diff = idx_radius_abs - *last_radius_idx; - - /* try differential coding */ - if ( *flag_abs_radius == 0 ) - { - if ( diff == 0 ) - { - idx_radius = 0; - nbits_diff_radius = 1; - } - else if ( ABSVAL( diff ) <= ISM_MAX_RADIUS_DIFF_IDX ) - { - idx_radius = 1 << 1; - nbits_diff_radius = 1; - - if ( diff < 0 ) - { - idx_radius += 1; /* negative sign */ - diff *= -1; - } - else - { - idx_radius += 0; /* positive sign */ - } - - idx_radius = idx_radius << diff; - nbits_diff_radius++; - - /* unary coding of "diff */ - idx_radius += ( ( 1 << diff ) - 1 ); - nbits_diff_radius += diff; - - if ( nbits_diff_radius < ISM_RADIUS_NBITS ) - { - /* add stop bit */ - idx_radius = idx_radius << 1; - nbits_diff_radius++; - } - } - else - { - *flag_abs_radius = 1; - } - } - - /* update counter */ - if ( *flag_abs_radius == 0 ) - { - ( *radius_diff_cnt )++; - *radius_diff_cnt = min( *radius_diff_cnt, ISM_FEC_MAX ); - } - else - { - *radius_diff_cnt = 0; - } - - /* Write radius */ - push_indice( hBstr, IND_ISM_RADIUS_DIFF_FLAG, *flag_abs_radius, 1 ); - - if ( *flag_abs_radius ) - { - push_indice( hBstr, IND_ISM_RADIUS, idx_radius, ISM_RADIUS_NBITS ); - } - else - { - push_indice( hBstr, IND_ISM_RADIUS, idx_radius, nbits_diff_radius ); - } - - /* Updates */ - *last_radius_idx = idx_radius_abs; - - return; -} - - -/*----------------------------------------------------------------* - * encode_angle_indices() - * - * Encoding of an angle - *----------------------------------------------------------------*/ - -static void encode_angle_indices( - BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ - ISM_METADATA_ANGLE_HANDLE angle, /* i/o: angle handle */ - const int16_t last_ism_metadata_flag, /* i : last frame ism_metadata_flag */ - const int16_t ini_frame, /* i : initialization frames counter */ - const int16_t idx_azimuth_abs, /* i : Azimuth index */ - const int16_t idx_elevation_abs, /* i : Elevation index */ - int16_t *flag_abs_azimuth, /* o : Azimuth encoding mode */ - int16_t *flag_abs_elevation /* o : Elevation encoding mode */ -) -{ - int16_t idx_azimuth, nbits_diff_azimuth, diff; - int16_t idx_elevation, nbits_diff_elevation; - - /*----------------------------------------------------------------* - * Azimuth index encoding - *----------------------------------------------------------------*/ - - idx_azimuth = idx_azimuth_abs; - - nbits_diff_azimuth = 0; - - *flag_abs_azimuth = 0; /* differential coding by default */ - if ( angle->azimuth_diff_cnt == ISM_FEC_MAX /* make differential encoding in ISM_FEC_MAX consecutive frames at maximum (in order to control the decoding in FEC) */ - || last_ism_metadata_flag == 0 /* If last frame had no metadata coded, do not use differential coding */ - ) - { - *flag_abs_azimuth = 1; - } - - /* try differential coding */ - if ( *flag_abs_azimuth == 0 ) - { - diff = idx_azimuth_abs - angle->last_azimuth_idx; - - /* azimuth is on a circle - check for diff coding for -180° -> 180° and vice versa changes */ - if ( abs( diff ) > ( ( 1 << ISM_AZIMUTH_NBITS ) - 1 ) - ISM_MAX_AZIMUTH_DIFF_IDX ) - { - if ( diff > 0 ) - { - diff -= ( 1 << ISM_AZIMUTH_NBITS ) - 1; - } - else - { - diff += ( 1 << ISM_AZIMUTH_NBITS ) - 1; - } - } - - if ( diff == 0 ) - { - idx_azimuth = 0; - nbits_diff_azimuth = 1; - } - else if ( ABSVAL( diff ) < ISM_MAX_AZIMUTH_DIFF_IDX ) /* when diff bits >= abs bits, prefer abs */ - { - idx_azimuth = 1 << 1; - nbits_diff_azimuth = 1; - - if ( diff < 0 ) - { - idx_azimuth += 1; /* negative sign */ - diff *= -1; - } - else - { - idx_azimuth += 0; /* positive sign */ - } - - idx_azimuth = idx_azimuth << diff; - nbits_diff_azimuth++; - - /* unary coding of "diff */ - idx_azimuth += ( ( 1 << diff ) - 1 ); - nbits_diff_azimuth += diff; - - if ( nbits_diff_azimuth < ISM_AZIMUTH_NBITS - 1 ) - { - /* add stop bit - only for codewords shorter than ISM_AZIMUTH_NBITS */ - idx_azimuth = idx_azimuth << 1; - nbits_diff_azimuth++; - } - } - else - { - *flag_abs_azimuth = 1; - } - } - - /* update counter */ - if ( *flag_abs_azimuth == 0 ) - { - angle->azimuth_diff_cnt++; - angle->elevation_diff_cnt = min( angle->elevation_diff_cnt, ISM_FEC_MAX ); - } - else - { - angle->azimuth_diff_cnt = 0; - } - - /* Write azimuth */ - push_indice( hBstr, IND_ISM_AZIMUTH_DIFF_FLAG, *flag_abs_azimuth, 1 ); - - if ( *flag_abs_azimuth ) - { - push_indice( hBstr, IND_ISM_AZIMUTH, idx_azimuth, ISM_AZIMUTH_NBITS ); - } - else - { - push_indice( hBstr, IND_ISM_AZIMUTH, idx_azimuth, nbits_diff_azimuth ); - } - - /*----------------------------------------------------------------* - * Elevation index encoding - *----------------------------------------------------------------*/ - - idx_elevation = idx_elevation_abs; - nbits_diff_elevation = 0; - *flag_abs_elevation = 0; /* differential coding by default */ - if ( angle->elevation_diff_cnt == ISM_FEC_MAX /* make differential encoding in ISM_FEC_MAX consecutive frames at maximum (in order to control the decoding in FEC) */ - || last_ism_metadata_flag == 0 /* If last frame had no metadata coded, do not use differential coding */ - ) - { - *flag_abs_elevation = 1; - } - - /* note: elevation is coded starting from the second frame only (it is meaningless in the init_frame) */ - if ( ini_frame == 0 ) - { - *flag_abs_elevation = 1; - angle->last_elevation_idx = idx_elevation_abs; - } - - diff = idx_elevation_abs - angle->last_elevation_idx; - - /* avoid absolute coding of elevation if absolute coding was already used for azimuth */ - if ( *flag_abs_azimuth == 1 ) - { - int16_t diff_orig = diff; - - *flag_abs_elevation = 0; - - - if ( diff >= 0 ) - { - diff = min( diff, ISM_MAX_ELEVATION_DIFF_IDX ); - } - else - { - diff = -1 * min( -diff, ISM_MAX_ELEVATION_DIFF_IDX ); - } - - if ( last_ism_metadata_flag == 0 || abs( diff_orig - diff ) > ISM_MAX_ELEVATION_DIFF_IDX ) - { - angle->elevation_diff_cnt = ISM_FEC_MAX - 1; - } - } - - /* try differential coding */ - if ( *flag_abs_elevation == 0 ) - { - if ( diff == 0 ) - { - idx_elevation = 0; - nbits_diff_elevation = 1; - } - else if ( ABSVAL( diff ) <= ISM_MAX_ELEVATION_DIFF_IDX ) - { - idx_elevation = 1 << 1; - nbits_diff_elevation = 1; - - if ( diff < 0 ) - { - idx_elevation += 1; /* negative sign */ - diff *= -1; - } - else - { - idx_elevation += 0; /* positive sign */ - } - - idx_elevation = idx_elevation << diff; - nbits_diff_elevation++; - - /* unary coding of "diff */ - idx_elevation += ( ( 1 << diff ) - 1 ); - nbits_diff_elevation += diff; - - if ( nbits_diff_elevation < ISM_ELEVATION_NBITS ) - { - /* add stop bit */ - idx_elevation = idx_elevation << 1; - nbits_diff_elevation++; - } - } - else - { - *flag_abs_elevation = 1; - } - } - - /* update counter */ - if ( *flag_abs_elevation == 0 ) - { - angle->elevation_diff_cnt++; - angle->elevation_diff_cnt = min( angle->elevation_diff_cnt, ISM_FEC_MAX ); - } - else - { - angle->elevation_diff_cnt = 0; - } - - /* Write elevation */ - if ( *flag_abs_azimuth == 0 ) /* do not write "flag_abs_elevation" if "flag_abs_azimuth == 1" */ - { - push_indice( hBstr, IND_ISM_ELEVATION_DIFF_FLAG, *flag_abs_elevation, 1 ); - } - - if ( *flag_abs_elevation ) - { - push_indice( hBstr, IND_ISM_ELEVATION, idx_elevation, ISM_ELEVATION_NBITS ); - } - else - { - push_indice( hBstr, IND_ISM_ELEVATION, idx_elevation, nbits_diff_elevation ); - } - - /*----------------------------------------------------------------* - * Updates - *----------------------------------------------------------------*/ - - angle->last_azimuth_idx = idx_azimuth_abs; - angle->last_elevation_idx = idx_elevation_abs; - - return; -} -#endif - - -#ifdef DISCRETE_ISM_DTX_CNG -/*-------------------------------------------------------------------* - * ivas_ism_metadata_sid_enc() - * - * Quantize and encode ISM metadata in SID frame - *-------------------------------------------------------------------*/ - -void ivas_ism_metadata_sid_enc( - ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ - const int16_t flag_noisy_speech, /* i : noisy speech flag */ - const int16_t nchan_ism, /* i : number of objects */ - const int16_t nchan_transport, /* i : number of transport channels */ - const ISM_MODE ism_mode, /* i : ISM mode */ - ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ - const int16_t sid_flag, /* i : indication of SID frame */ - const int16_t md_diff_flag[], /* i : metadata differental flag */ - BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ - int16_t nb_bits_metadata[] /* o : number of metadata bits */ -) -{ - int16_t i, ch, nBits, nBits_start, nBits_unused; - float q_step, q_step_border; - int16_t idx, idx_azimuth, idx_elevation; - int16_t nBits_azimuth, nBits_elevation, nBits_coh, nBits_sce_id; - float valQ; - ISM_METADATA_HANDLE hIsmMetaData; - - if ( sid_flag ) - { - nBits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC; - nBits -= SID_FORMAT_NBITS; - nBits_start = hBstr->nb_bits_tot; - - /*----------------------------------------------------------------* - * Write ISm common signaling - *----------------------------------------------------------------*/ - - /* write number of objects - unary coding */ - for ( ch = 1; ch < nchan_ism; ch++ ) - { - push_indice( hBstr, IND_ISM_NUM_OBJECTS, 1, 1 ); - } - push_indice( hBstr, IND_ISM_NUM_OBJECTS, 0, 1 ); - - /* write SID metadata flag (one per object) */ - for ( ch = 0; ch < nchan_ism; ch++ ) - { - push_indice( hBstr, IND_ISM_METADATA_FLAG, md_diff_flag[ch], 1 ); - } - - /*----------------------------------------------------------------* - * Set quantization bits based on the number of coded objects - *----------------------------------------------------------------*/ - - ivas_get_ism_sid_quan_bitbudget( nchan_ism, &nBits_azimuth, &nBits_elevation, &q_step, &q_step_border, &nBits_coh, &nBits_sce_id ); - - /*----------------------------------------------------------------* - * Spatial parameters, loop over TCs - 1 - *----------------------------------------------------------------*/ - - /* write ISM mode flag to explicitly signal number of spatial parameters */ - if ( nchan_ism > 2 ) - { - if ( ism_mode == ISM_MODE_DISC ) - { - push_indice( hBstr, IND_ISM_VAD_FLAG, 0, 1 ); - } - else - { - push_indice( hBstr, IND_ISM_VAD_FLAG, 1, 1 ); - } - - if ( ism_mode == ISM_MODE_PARAM ) - { - /* write noisy speech flag */ - push_indice( hBstr, IND_ISM_NOISY_SPEECH_FLAG, flag_noisy_speech, 1 ); - nBits_sce_id = 1; - } - } - - if ( nchan_transport > 1 ) - { - /* write sce id */ - push_indice( hBstr, IND_ISM_SCE_ID_DTX, hISMDTX->sce_id_dtx, nBits_sce_id ); - - /* quantize and write coherence */ - for ( ch = 0; ch < nchan_transport; ch++ ) - { - if ( ch == hISMDTX->sce_id_dtx ) - { - continue; - } - - idx = (int16_t) ( hISMDTX->coh[ch] * ( ( 1 << nBits_coh ) - 1 ) + 0.5f ); - assert( ( idx >= 0 ) && ( idx <= ( ( 1 << nBits_coh ) - 1 ) ) ); - push_indice( hBstr, IND_ISM_DTX_COH_SCA, idx, nBits_coh ); - } - } - - /*----------------------------------------------------------------* - * Metadata quantization and coding, loop over all objects - *----------------------------------------------------------------*/ - - for ( ch = 0; ch < nchan_ism; ch++ ) - { - if ( md_diff_flag[ch] == 1 ) - { - hIsmMetaData = hIsmMeta[ch]; - - idx_azimuth = ism_quant_meta( hIsmMetaData->azimuth, &valQ, ism_azimuth_borders, q_step, q_step_border, 1 << nBits_azimuth ); - idx_elevation = ism_quant_meta( hIsmMetaData->elevation, &valQ, ism_elevation_borders, q_step, q_step_border, 1 << nBits_elevation ); - - push_indice( hBstr, IND_ISM_AZIMUTH, idx_azimuth, nBits_azimuth ); - push_indice( hBstr, IND_ISM_ELEVATION, idx_elevation, nBits_elevation ); - - /* update last indexes to correspond to active frames coding */ - if ( nBits_azimuth > ISM_AZIMUTH_NBITS ) - { -#ifdef TD5 - hIsmMetaData->angle[0].last_azimuth_idx = idx_azimuth >> ( nBits_azimuth - ISM_AZIMUTH_NBITS ); - hIsmMetaData->angle[0].last_elevation_idx = idx_elevation >> ( nBits_elevation - ISM_ELEVATION_NBITS ); -#else - hIsmMetaData->last_azimuth_idx = idx_azimuth >> ( nBits_azimuth - ISM_AZIMUTH_NBITS ); - hIsmMetaData->last_elevation_idx = idx_elevation >> ( nBits_elevation - ISM_ELEVATION_NBITS ); -#endif - } - else - { -#ifdef TD5 - hIsmMetaData->angle[0].last_azimuth_idx = idx_azimuth << ( ISM_AZIMUTH_NBITS - nBits_azimuth ); - hIsmMetaData->angle[0].last_elevation_idx = idx_elevation << ( ISM_ELEVATION_NBITS - nBits_elevation ); -#else - hIsmMetaData->last_azimuth_idx = idx_azimuth << ( ISM_AZIMUTH_NBITS - nBits_azimuth ); - hIsmMetaData->last_elevation_idx = idx_elevation << ( ISM_ELEVATION_NBITS - nBits_elevation ); -#endif - } - } - } - - /* Write unused (padding) bits */ - nBits_unused = nBits - hBstr->nb_bits_tot; - while ( nBits_unused > 0 ) - { - i = min( nBits_unused, 16 ); - push_indice( hBstr, IND_UNUSED, 0, i ); - nBits_unused -= i; - } - - nb_bits_metadata[0] = hBstr->nb_bits_tot - nBits_start; - } - - return; -} -#endif diff --git a/lib_enc/ivas_ism_param_enc.c b/lib_enc/ivas_ism_param_enc.c index 63c1fcea81..ef66df5a90 100644 --- a/lib_enc/ivas_ism_param_enc.c +++ b/lib_enc/ivas_ism_param_enc.c @@ -47,27 +47,16 @@ static void ivas_param_ism_compute_obj_parameters( -#ifdef NCHAN_ISM_PARAMETER - const int16_t nchan_ism, /* i : number of ISM channels */ -#endif float reference_power_obj[MAX_NUM_OBJECTS][PARAM_ISM_MDFT_NO_SLOTS][DIRAC_NO_FB_BANDS_MAX], /* i : Reference power */ PARAM_ISM_CONFIG_HANDLE hParamIsm /* i/o: Param ISM Enc Handle */ ) { -#ifdef NCHAN_ISM_PARAMETER - int16_t i, b, m, br, mr; -#else int16_t i, b, m, br, mr, num_obj; -#endif int16_t brange_start, brange_end, mrange_start, mrange_end, time_merge_fac; float power_ratios_m[MAX_PARAM_ISM_NBANDS][MAX_PARAM_ISM_NBLOCKS]; -#ifdef NCHAN_ISM_PARAMETER - assert( nchan_ism == 3 || nchan_ism == 4 ); -#else num_obj = hParamIsm->num_obj; assert( num_obj == 3 || num_obj == 4 ); -#endif for ( b = 0; b < hParamIsm->nbands; b++ ) { @@ -92,11 +81,7 @@ static void ivas_param_ism_compute_obj_parameters( /* for each object, sum up reference power within current T/F tile */ -#ifdef NCHAN_ISM_PARAMETER - for ( i = 0; i < nchan_ism; i++ ) -#else for ( i = 0; i < num_obj; i++ ) -#endif { for ( mr = mrange_start; mr < mrange_end; mr++ ) { @@ -118,12 +103,7 @@ static void ivas_param_ism_compute_obj_parameters( index_1 = 1; index_2 = 0; } - -#ifdef NCHAN_ISM_PARAMETER - for ( i = MAX_PARAM_ISM_WAVE; i < nchan_ism; i++ ) -#else - for ( i = MAX_PARAM_ISM_WAVE; i < num_obj; i++ ) -#endif + for ( i = 2; i < num_obj; i++ ) { if ( ref_power_local[i] > ref_power_local[index_1] ) { @@ -169,36 +149,23 @@ static void ivas_param_ism_compute_obj_parameters( static void ivas_param_ism_enc_quantize_DOA( -#ifdef NCHAN_ISM_PARAMETER - const int16_t nchan_ism, /* i : number of ISM channels */ -#endif ISM_METADATA_HANDLE hIsmMetaData[MAX_NUM_OBJECTS], /* i : ISM metadata */ PARAM_ISM_CONFIG_HANDLE hParamIsm /* i/o: Param ISM encoder handle */ ) { -#ifdef NCHAN_ISM_PARAMETER - int16_t i, azi_idx, ele_idx; -#else int16_t i, azi_idx, ele_idx, num_obj; -#endif float valQ; -#ifndef NCHAN_ISM_PARAMETER num_obj = hParamIsm->num_obj; -#endif /* Loop over objects */ -#ifdef NCHAN_ISM_PARAMETER - for ( i = 0; i < nchan_ism; i++ ) -#else for ( i = 0; i < num_obj; i++ ) -#endif { /* Quantize the elevation and obtain quantized elevation value and index */ - ele_idx = ism_quant_meta( hIsmMetaData[i]->elevation, &valQ, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); + ele_idx = ism_quant_meta( hIsmMetaData[i]->elevation, &valQ, ism_elevation_borders, 1 << ISM_ELEVATION_NBITS ); /* Obtain the index of quantized azimuth values */ - azi_idx = ism_quant_meta( hIsmMetaData[i]->azimuth, &valQ, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); + azi_idx = ism_quant_meta( hIsmMetaData[i]->azimuth, &valQ, ism_azimuth_borders, 1 << ISM_AZIMUTH_NBITS ); /*Replace azimuth with quantized values */ hIsmMetaData[i]->azimuth = valQ; @@ -224,11 +191,7 @@ void ivas_param_ism_stereo_dmx( const int16_t input_frame /* i : Length of input frame */ ) { -#ifdef NCHAN_ISM_PARAMETER - int16_t i, j; -#else int16_t i, j, num_obj; -#endif float alpha, azi_shift, tmp, tmp_1; float cardioid_left[MAX_NUM_OBJECTS], cardioid_right[MAX_NUM_OBJECTS]; float stereo_dmx[2][L_FRAME48k]; @@ -239,20 +202,14 @@ void ivas_param_ism_stereo_dmx( /*Initialization*/ alpha = 0.5; azi_shift = 0; -#ifndef NCHAN_ISM_PARAMETER num_obj = st_ivas->hDirAC->hParamIsm->num_obj; -#endif /* Set the stereo dmx to zero */ set_zero( stereo_dmx[0], L_FRAME48k ); set_zero( stereo_dmx[1], L_FRAME48k ); /* Loop over all objects */ -#ifdef NCHAN_ISM_PARAMETER - for ( i = 0; i < st_ivas->hEncoderConfig->nchan_ism; i++ ) -#else for ( i = 0; i < num_obj; i++ ) -#endif { hIsmMetaData = st_ivas->hIsmMetaData[i]; @@ -314,10 +271,8 @@ ivas_error ivas_param_ism_enc_open( input_Fs = st_ivas->hEncoderConfig->input_Fs; -#ifndef NCHAN_ISM_PARAMETER /* Assign the number of objects */ hDirAC->hParamIsm->num_obj = st_ivas->hEncoderConfig->nchan_inp; -#endif /* set FB config. */ if ( ( error = ivas_fb_set_cfg( &fb_cfg, ISM_FORMAT, SBA_MODE_NONE, st_ivas->hEncoderConfig->nchan_inp, 0, 0, input_Fs ) ) != IVAS_ERR_OK ) @@ -326,16 +281,16 @@ ivas_error ivas_param_ism_enc_open( } /* Allocate and initialize FB mixer handle */ +#ifdef SBA_BR_SWITCHING_CLEAN_UP if ( ( error = ivas_FB_mixer_open( &( hDirAC->hFbMixer ), input_Fs, fb_cfg, 0 ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_FB_mixer_open( &( hDirAC->hFbMixer ), input_Fs, fb_cfg ) ) != IVAS_ERR_OK ) +#endif { return error; } -#ifdef NCHAN_ISM_PARAMETER - ivas_param_ism_config( hDirAC->hParamIsm, st_ivas->hEncoderConfig->nchan_inp ); -#else ivas_param_ism_config( hDirAC->hParamIsm ); -#endif /* Assign memories for Band and Block grouping */ hDirAC->hParamIsm->nbands = MAX_PARAM_ISM_NBANDS; @@ -361,29 +316,27 @@ ivas_error ivas_param_ism_enc_open( /*-------------------------------------------------------------------------* * ivas_param_ism_enc_close() * - * Close Param ISM encoder handle + * Close Param ISM handle *-------------------------------------------------------------------------*/ void ivas_param_ism_enc_close( - DIRAC_ENC_HANDLE *hDirAC, /* i/o: encoder DirAC handle */ - const int32_t input_Fs /* i : input sampling_rate */ + DIRAC_ENC_HANDLE hDirAC, /* i/o: encoder DirAC handle */ + const int32_t input_Fs /* i : input sampling_rate */ ) { - if ( hDirAC == NULL || *hDirAC == NULL ) - { - return; - } - - ivas_FB_mixer_close( &( *hDirAC )->hFbMixer, input_Fs, 0 ); +#ifdef SBA_BR_SWITCHING_CLEAN_UP + ivas_FB_mixer_close( &hDirAC->hFbMixer, input_Fs, 0 ); +#else + ivas_FB_mixer_close( &hDirAC->hFbMixer, input_Fs ); +#endif - if ( ( *hDirAC )->hParamIsm != NULL ) + if ( hDirAC->hParamIsm != NULL ) { - free( ( *hDirAC )->hParamIsm ); - ( *hDirAC )->hParamIsm = NULL; + free( hDirAC->hParamIsm ); + hDirAC->hParamIsm = NULL; } - free( ( *hDirAC ) ); - ( *hDirAC ) = NULL; + free( hDirAC ); return; } @@ -402,9 +355,6 @@ void ivas_param_ism_enc( ) { int16_t i, j, ts, l_ts; -#ifdef NCHAN_ISM_PARAMETER - int16_t nchan_ism; -#endif int16_t num_time_slots; float *pcm_in[MAX_NUM_OBJECTS]; float fb_RealBuffer[MAX_NUM_OBJECTS][DIRAC_NO_FB_BANDS_MAX]; @@ -415,9 +365,6 @@ void ivas_param_ism_enc( DIRAC_ENC_HANDLE hDirAC; PARAM_ISM_CONFIG_HANDLE hParamIsm; -#ifdef NCHAN_ISM_PARAMETER - nchan_ism = st_ivas->hEncoderConfig->nchan_ism; -#endif hDirAC = st_ivas->hDirAC; hParamIsm = hDirAC->hParamIsm; @@ -426,11 +373,7 @@ void ivas_param_ism_enc( l_ts = input_frame / PARAM_ISM_MDFT_NO_SLOTS; num_time_slots = PARAM_ISM_MDFT_NO_SLOTS; -#ifdef NCHAN_ISM_PARAMETER - for ( i = 0; i < nchan_ism; i++ ) -#else for ( i = 0; i < hParamIsm->num_obj; i++ ) -#endif { pcm_in[i] = &data[i][0]; @@ -439,18 +382,12 @@ void ivas_param_ism_enc( p_fb_RealBuffer[i] = &fb_RealBuffer[i][0]; p_fb_ImagBuffer[i] = &fb_ImagBuffer[i][0]; } - for ( ts = 0; ts < num_time_slots; ts++ ) { ivas_fb_mixer_get_windowed_fr( hDirAC->hFbMixer, pcm_in, p_fb_RealBuffer, p_fb_ImagBuffer, l_ts, l_ts ); - ivas_fb_mixer_update_prior_input( hDirAC->hFbMixer, pcm_in, l_ts ); -#ifdef NCHAN_ISM_PARAMETER - for ( i = 0; i < nchan_ism; i++ ) -#else for ( i = 0; i < hParamIsm->num_obj; i++ ) -#endif { pcm_in[i] += l_ts; for ( j = 0; j < DIRAC_NO_FB_BANDS_MAX; j++ ) @@ -459,27 +396,18 @@ void ivas_param_ism_enc( } } } - /* Quantize DOAs */ -#ifdef NCHAN_ISM_PARAMETER - ivas_param_ism_enc_quantize_DOA( nchan_ism, st_ivas->hIsmMetaData, hParamIsm ); -#else ivas_param_ism_enc_quantize_DOA( st_ivas->hIsmMetaData, hParamIsm ); -#endif /* Compute object indices and power ratios */ -#ifdef NCHAN_ISM_PARAMETER - ivas_param_ism_compute_obj_parameters( nchan_ism, reference_power_obj, hParamIsm ); -#else ivas_param_ism_compute_obj_parameters( reference_power_obj, hParamIsm ); -#endif pop_wmops(); return; } -#ifndef DISCRETE_ISM_DTX_CNG +#ifdef PARAM_ISM_DTX_CNG static void ivas_param_ism_enc_quantize_DOA_dtx( float azimuth, float elevation, @@ -546,14 +474,10 @@ static void ivas_param_ism_enc_quantize_DOA_dtx( *-------------------------------------------------------------------------*/ void ivas_param_ism_metadata_dtx_enc( - BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ - ISM_METADATA_HANDLE hIsmMeta[], /* i : ISM metadata handles */ - ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ - PARAM_ISM_CONFIG_HANDLE hParamIsm /* i : Param ISM Enc Handle */ -#ifdef NCHAN_ISM_PARAMETER - , - const int16_t nchan_ism /* i : number of ISM channels */ -#endif + BSTR_ENC_HANDLE hBstr, /* i/o : bitstream handle */ + ISM_METADATA_HANDLE hIsmMeta[], /* i : ISM metadata handles */ + ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ + PARAM_ISM_CONFIG_HANDLE hParamIsm /* i : Param ISM Enc Handle */ ) { int16_t i, nBits, nBits_unused; @@ -565,11 +489,7 @@ void ivas_param_ism_metadata_dtx_enc( /* Transmit the metadata */ /* write number of objects - unary coding */ -#ifdef NCHAN_ISM_PARAMETER - for ( i = 0; i < nchan_ism; i++ ) -#else for ( i = 1; i < hParamIsm->num_obj; i++ ) -#endif { push_indice( hBstr, IND_ISM_NUM_OBJECTS, 1, 1 ); } @@ -586,11 +506,7 @@ void ivas_param_ism_metadata_dtx_enc( assert( ( coh_idx >= 0 ) && ( coh_idx <= ( ( 1 << PARAM_ISM_DTX_COH_SCA_BITS ) - 1 ) ) ); push_indice( hBstr, IND_ISM_DTX_COH_SCA, coh_idx, PARAM_ISM_DTX_COH_SCA_BITS ); -#ifdef NCHAN_ISM_PARAMETER - for ( i = 0; i < nchan_ism; i++ ) -#else for ( i = 0; i < hParamIsm->num_obj; i++ ) -#endif { ivas_param_ism_enc_quantize_DOA_dtx( hIsmMeta[i]->azimuth, hIsmMeta[i]->elevation, PARAM_ISM_DTX_AZI_BITS, PARAM_ISM_DTX_ELE_BITS, &azi_idx, &ele_idx ); push_indice( hBstr, IND_ISM_AZIMUTH, azi_idx, PARAM_ISM_DTX_AZI_BITS ); @@ -616,7 +532,7 @@ void ivas_param_ism_metadata_dtx_enc( return; } -#endif + /*-------------------------------------------------------------------* * ivas_param_ism_compute_noisy_speech_flag() @@ -664,3 +580,4 @@ void ivas_param_ism_compute_noisy_speech_flag( return; } +#endif diff --git a/lib_enc/ivas_lfe_enc.c b/lib_enc/ivas_lfe_enc.c index 9a5b754942..fe2e0d3c02 100644 --- a/lib_enc/ivas_lfe_enc.c +++ b/lib_enc/ivas_lfe_enc.c @@ -491,27 +491,21 @@ ivas_error ivas_create_lfe_enc( *-------------------------------------------------------------------------*/ void ivas_lfe_enc_close( - LFE_ENC_HANDLE *hLFE /* i/o: LFE encoder handle */ + LFE_ENC_HANDLE hLFE /* i/o: LFE encoder handle */ ) { - if ( hLFE == NULL || *hLFE == NULL ) + if ( hLFE->old_wtda_audio != NULL ) { - return; + free( hLFE->old_wtda_audio ); + hLFE->old_wtda_audio = NULL; } - - if ( ( *hLFE )->old_wtda_audio != NULL ) - { - free( ( *hLFE )->old_wtda_audio ); - ( *hLFE )->old_wtda_audio = NULL; - } - if ( ( *hLFE )->pWindow_state ) + if ( hLFE->pWindow_state ) { - free( ( *hLFE )->pWindow_state ); - ( *hLFE )->pWindow_state = NULL; + free( hLFE->pWindow_state ); + hLFE->pWindow_state = NULL; } - free( ( *hLFE ) ); - ( *hLFE ) = NULL; + free( hLFE ); return; } diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index b5e100145d..eb685cd0bc 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -149,7 +149,7 @@ ivas_error ivas_masa_enc_open( *-----------------------------------------------------------------------*/ void ivas_masa_enc_close( - MASA_ENCODER_HANDLE *hMasa /* i/o: MASA metadata structure */ + MASA_ENCODER_HANDLE hMasa /* i/o: MASA metadata structure */ #ifndef FIX_350_MASA_DELAY_COMP , const int16_t nchan_transport, /* i : Number of transport channels */ @@ -159,14 +159,9 @@ void ivas_masa_enc_close( { int16_t i; - if ( hMasa == NULL || *hMasa == NULL ) - { - return; - } - - for ( i = 0; i < ( *hMasa )->data.num_Cldfb_instances; i++ ) + for ( i = 0; i < hMasa->data.num_Cldfb_instances; i++ ) { - deleteCldfb( &( ( *hMasa )->data.cldfbAnaEnc[i] ) ); + deleteCldfb( &( hMasa->data.cldfbAnaEnc[i] ) ); } #ifndef FIX_350_MASA_DELAY_COMP @@ -174,14 +169,13 @@ void ivas_masa_enc_close( { for ( i = 0; i < nchan_transport; i++ ) { - free( ( *hMasa )->data.delay_buffer[i] ); - ( *hMasa )->data.delay_buffer[i] = NULL; + free( hMasa->data.delay_buffer[i] ); + hMasa->data.delay_buffer[i] = NULL; } } #endif - free( ( *hMasa ) ); - ( *hMasa ) = NULL; + free( hMasa ); return; } @@ -595,11 +589,7 @@ ivas_error ivas_masa_enc_config( ivas_set_qmetadata_maxbit_req( hQMetaData, ivas_format ); -#ifdef FIX_373_MASA_DELAY_COMP_MSAN - masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, hQMetaData, st_ivas->hEncoderConfig->input_Fs, NULL ); -#else masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, hQMetaData, st_ivas->hEncoderConfig->input_Fs ); -#endif /* Transmit stereo signals using a mono downmix at lowest bitrates */ if ( ivas_format == MASA_FORMAT && st_ivas->nCPE == 1 && st_ivas->hCPE[0]->hStereoDft != NULL && st_ivas->hCPE[0]->hStereoDft->hConfig != NULL ) diff --git a/lib_enc/ivas_mc_param_enc.c b/lib_enc/ivas_mc_param_enc.c index db9945d0ce..9b1241f234 100644 --- a/lib_enc/ivas_mc_param_enc.c +++ b/lib_enc/ivas_mc_param_enc.c @@ -146,7 +146,11 @@ ivas_error ivas_param_mc_enc_open( } /* Allocate and initialize FB mixer handle */ +#ifdef SBA_BR_SWITCHING_CLEAN_UP if ( ( error = ivas_FB_mixer_open( &( hParamMC->hFbMixer ), input_Fs, fb_cfg, 0 ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_FB_mixer_open( &( hParamMC->hFbMixer ), input_Fs, fb_cfg ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -360,20 +364,18 @@ ivas_error ivas_param_mc_enc_reconfig( *------------------------------------------------------------------------*/ void ivas_param_mc_enc_close( - PARAM_MC_ENC_HANDLE *hParamMC, /* i/o: Parametric MC encoder handle */ + PARAM_MC_ENC_HANDLE hParamMC, /* i/o: Parametric MC encoder handle */ const int32_t sampling_rate ) { - if ( hParamMC == NULL || *hParamMC == NULL ) - { - return; - } - - ivas_param_mc_metadata_close( &( *hParamMC )->hMetadataPMC ); + ivas_param_mc_metadata_close( &hParamMC->hMetadataPMC ); - ivas_FB_mixer_close( &( *hParamMC )->hFbMixer, sampling_rate, 0 ); +#ifdef SBA_BR_SWITCHING_CLEAN_UP + ivas_FB_mixer_close( &hParamMC->hFbMixer, sampling_rate, 0 ); +#else + ivas_FB_mixer_close( &hParamMC->hFbMixer, sampling_rate ); +#endif - free( ( *hParamMC ) ); - ( *hParamMC ) = NULL; + free( hParamMC ); return; } @@ -386,10 +388,10 @@ void ivas_param_mc_enc_close( *------------------------------------------------------------------------*/ void ivas_param_mc_enc( - Encoder_Struct *st_ivas, /* i/o: IVAS Encoder handle */ - BSTR_ENC_HANDLE hMetaData, /* i/o: IVAS Metadata bitstream handle */ - float data_f[][L_FRAME48k], /* i/o: input: CICP6, CICP12, CICP14, CICP16 or CICP19 MC data */ - const int16_t input_frame /* i : input frame length */ + Encoder_Struct *st_ivas, /* i/o: IVAS Encoder handle */ + BSTR_ENC_HANDLE hMetaData, /* i/o: IVAS Metadata bitstream handle */ + float data_f[][L_FRAME48k], /* i/o: input: CICP6, CICP12, CICP14, CICP16 or CICP19 MC data */ + const int16_t input_frame /* i : input frame length */ ) { int16_t k; diff --git a/lib_enc/ivas_mcmasa_enc.c b/lib_enc/ivas_mcmasa_enc.c index 866e4e176c..153bc3ecad 100644 --- a/lib_enc/ivas_mcmasa_enc.c +++ b/lib_enc/ivas_mcmasa_enc.c @@ -194,7 +194,11 @@ ivas_error ivas_mcmasa_enc_open( } /* Allocate and initialize FB mixer handle */ +#ifdef SBA_BR_SWITCHING_CLEAN_UP if ( ( error = ivas_FB_mixer_open( &( hMcMasa->hFbMixer ), input_Fs, fb_cfg, 0 ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_FB_mixer_open( &( hMcMasa->hFbMixer ), input_Fs, fb_cfg ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -224,7 +228,11 @@ ivas_error ivas_mcmasa_enc_open( return error; } +#ifdef SBA_BR_SWITCHING_CLEAN_UP if ( ( error = ivas_FB_mixer_open( &( hMcMasa->hFbMixerLfe ), input_Fs, fb_cfgLfe, 0 ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_FB_mixer_open( &( hMcMasa->hFbMixerLfe ), input_Fs, fb_cfgLfe ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -451,11 +459,11 @@ ivas_error ivas_mcmasa_enc_reconfig( /* brute-force solution: close McMASA and re-instantiate with new settings */ #ifdef FIX_350_MASA_DELAY_COMP - ivas_masa_enc_close( &( st_ivas->hMasa ) ); + ivas_masa_enc_close( st_ivas->hMasa ); #else - ivas_masa_enc_close( &( st_ivas->hMasa ), st_ivas->nchan_transport, st_ivas->hEncoderConfig->ivas_format ); + ivas_masa_enc_close( st_ivas->hMasa, st_ivas->nchan_transport, st_ivas->hEncoderConfig->ivas_format ); #endif - ivas_mcmasa_enc_close( &( st_ivas->hMcMasa ), st_ivas->hEncoderConfig->input_Fs ); + ivas_mcmasa_enc_close( st_ivas->hMcMasa, st_ivas->hEncoderConfig->input_Fs ); /* Determine if to separate some channels from the analysis */ ivas_mcmasa_setNumTransportChannels( &( st_ivas->nchan_transport ), &( st_ivas->hEncoderConfig->element_mode_init ), ivas_total_brate ); @@ -483,33 +491,36 @@ ivas_error ivas_mcmasa_enc_reconfig( *--------------------------------------------------------------------------*/ void ivas_mcmasa_enc_close( - MCMASA_ENC_HANDLE *hMcMasa, /* i/o: encoder McMASA handle */ - const int32_t input_Fs /* i : input sampling rate */ + MCMASA_ENC_HANDLE hMcMasa, /* i/o: encoder McMASA handle */ + const int32_t input_Fs /* i : input sampling rate */ ) { int16_t i, j; - if ( hMcMasa == NULL || *hMcMasa == NULL ) - { - return; - } - - if ( ( *hMcMasa )->separateChannelEnabled ) + if ( hMcMasa->separateChannelEnabled ) { - free( ( *hMcMasa )->delay_buffer_lfe[0] ); - free( ( *hMcMasa )->delay_buffer_lfe[1] ); + free( hMcMasa->delay_buffer_lfe[0] ); + free( hMcMasa->delay_buffer_lfe[1] ); for ( i = 0; i < 2; i++ ) { - free( ( *hMcMasa )->lfeAnaRingBuffer[i] ); + free( hMcMasa->lfeAnaRingBuffer[i] ); } } - ivas_FB_mixer_close( &( *hMcMasa )->hFbMixer, input_Fs, 0 ); +#ifdef SBA_BR_SWITCHING_CLEAN_UP + ivas_FB_mixer_close( &hMcMasa->hFbMixer, input_Fs, 0 ); +#else + ivas_FB_mixer_close( &hMcMasa->hFbMixer, input_Fs ); +#endif - if ( !( *hMcMasa )->separateChannelEnabled ) + if ( !hMcMasa->separateChannelEnabled ) { - ivas_FB_mixer_close( &( *hMcMasa )->hFbMixerLfe, input_Fs, 0 ); +#ifdef SBA_BR_SWITCHING_CLEAN_UP + ivas_FB_mixer_close( &hMcMasa->hFbMixerLfe, input_Fs, 0 ); +#else + ivas_FB_mixer_close( &hMcMasa->hFbMixerLfe, input_Fs ); +#endif } /* intensity 3-dim */ @@ -517,36 +528,35 @@ void ivas_mcmasa_enc_close( { for ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) { - free( ( *hMcMasa )->direction_vector_m[i][j] ); - ( *hMcMasa )->direction_vector_m[i][j] = NULL; + free( hMcMasa->direction_vector_m[i][j] ); + hMcMasa->direction_vector_m[i][j] = NULL; } - for ( j = 0; j < ( *hMcMasa )->no_col_avg_diff; j++ ) + for ( j = 0; j < hMcMasa->no_col_avg_diff; j++ ) { - free( ( *hMcMasa )->buffer_intensity_real[i][j] ); - ( *hMcMasa )->buffer_intensity_real[i][j] = NULL; + free( hMcMasa->buffer_intensity_real[i][j] ); + hMcMasa->buffer_intensity_real[i][j] = NULL; } - free( ( *hMcMasa )->buffer_intensity_real[i] ); - ( *hMcMasa )->buffer_intensity_real[i] = NULL; + free( hMcMasa->buffer_intensity_real[i] ); + hMcMasa->buffer_intensity_real[i] = NULL; - free( ( *hMcMasa )->direction_vector_m[i] ); - ( *hMcMasa )->direction_vector_m[i] = NULL; + free( hMcMasa->direction_vector_m[i] ); + hMcMasa->direction_vector_m[i] = NULL; } - for ( j = 0; j < ( *hMcMasa )->no_col_avg_diff; j++ ) + for ( j = 0; j < hMcMasa->no_col_avg_diff; j++ ) { - free( ( *hMcMasa )->buffer_intensity_real_vert[j] ); - ( *hMcMasa )->buffer_intensity_real_vert[j] = NULL; + free( hMcMasa->buffer_intensity_real_vert[j] ); + hMcMasa->buffer_intensity_real_vert[j] = NULL; } - free( ( *hMcMasa )->buffer_intensity_real_vert ); - ( *hMcMasa )->buffer_intensity_real_vert = NULL; + free( hMcMasa->buffer_intensity_real_vert ); + hMcMasa->buffer_intensity_real_vert = NULL; - free( ( *hMcMasa )->buffer_energy ); - ( *hMcMasa )->buffer_energy = NULL; + free( hMcMasa->buffer_energy ); + hMcMasa->buffer_energy = NULL; - free( ( *hMcMasa ) ); - ( *hMcMasa ) = NULL; + free( hMcMasa ); return; } diff --git a/lib_enc/ivas_mct_enc.c b/lib_enc/ivas_mct_enc.c index b66a2c5733..707e74e329 100644 --- a/lib_enc/ivas_mct_enc.c +++ b/lib_enc/ivas_mct_enc.c @@ -173,7 +173,8 @@ ivas_error ivas_mct_enc( } /* joint MCT encoding */ - ivas_mct_core_enc( ivas_format, hMCT, st_ivas->hCPE, hMCT->nchan_out_woLFE + hMCT->num_lfe, ivas_total_brate, switch_bw, ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT ) ? (int16_t) st_ivas->hLFE->lfe_bits : 0, st_ivas->hEncoderConfig->sba_order ); + ivas_mct_core_enc( ivas_format, hMCT, st_ivas->hCPE, hMCT->nchan_out_woLFE + hMCT->num_lfe, ivas_total_brate, switch_bw, + ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT ) ? (int16_t) st_ivas->hLFE->lfe_bits : 0, st_ivas->hEncoderConfig->sba_order ); /* Spectrum quantization and coding */ for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) @@ -498,35 +499,29 @@ ivas_error mct_enc_reconfigure( *-------------------------------------------------------------------------*/ void ivas_mct_enc_close( - MCT_ENC_HANDLE *hMCT /* i/o: MCT encoder structure */ + MCT_ENC_HANDLE hMCT /* i/o: MCT encoder structure */ ) { int16_t n, maxBlocks; - if ( hMCT == NULL || *hMCT == NULL ) - { - return; - } - - maxBlocks = ( *hMCT )->nchan_out_woLFE / 2; + maxBlocks = hMCT->nchan_out_woLFE / 2; for ( n = 0; n < maxBlocks; n++ ) { - if ( ( *hMCT )->hBlockData[n] != NULL ) + if ( hMCT->hBlockData[n] != NULL ) { - if ( ( *hMCT )->hBlockData[n]->hStereoMdct != NULL ) + if ( hMCT->hBlockData[n]->hStereoMdct != NULL ) { - free( ( *hMCT )->hBlockData[n]->hStereoMdct ); - ( *hMCT )->hBlockData[n]->hStereoMdct = NULL; + free( hMCT->hBlockData[n]->hStereoMdct ); + hMCT->hBlockData[n]->hStereoMdct = NULL; } - free( ( *hMCT )->hBlockData[n] ); - ( *hMCT )->hBlockData[n] = NULL; + free( hMCT->hBlockData[n] ); + hMCT->hBlockData[n] = NULL; } } - free( ( *hMCT ) ); - ( *hMCT ) = NULL; + free( hMCT ); return; } @@ -613,18 +608,34 @@ static ivas_error ivas_mc_enc_reconfig( } /*De-allocate handles for other MC modes*/ - ivas_param_mc_enc_close( &( st_ivas->hParamMC ), st_ivas->hEncoderConfig->input_Fs ); + if ( st_ivas->hParamMC != NULL ) + { + ivas_param_mc_enc_close( st_ivas->hParamMC, st_ivas->hEncoderConfig->input_Fs ); + st_ivas->hParamMC = NULL; + } /* De-allocate McMasa-related handles */ - ivas_mcmasa_enc_close( &( st_ivas->hMcMasa ), st_ivas->hEncoderConfig->input_Fs ); + if ( st_ivas->hMcMasa != NULL ) + { + ivas_mcmasa_enc_close( st_ivas->hMcMasa, st_ivas->hEncoderConfig->input_Fs ); + st_ivas->hMcMasa = NULL; + } + if ( st_ivas->hMasa != NULL ) + { #ifdef FIX_350_MASA_DELAY_COMP - ivas_masa_enc_close( &( st_ivas->hMasa ) ); + ivas_masa_enc_close( st_ivas->hMasa ); #else - ivas_masa_enc_close( &( st_ivas->hMasa ), nchan_transport_old, MC_FORMAT ); + ivas_masa_enc_close( st_ivas->hMasa, nchan_transport_old, MC_FORMAT ); #endif + st_ivas->hMasa = NULL; + } - ivas_qmetadata_close( &st_ivas->hQMetaData ); + if ( st_ivas->hQMetaData != NULL ) + { + ivas_qmetadata_close( &st_ivas->hQMetaData ); + st_ivas->hQMetaData = NULL; + } } } else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) @@ -645,30 +656,39 @@ static ivas_error ivas_mc_enc_reconfig( } /* De-allocate McMasa-related handles */ - ivas_mcmasa_enc_close( &( st_ivas->hMcMasa ), st_ivas->hEncoderConfig->input_Fs ); - + if ( st_ivas->hMcMasa != NULL ) + { + ivas_mcmasa_enc_close( st_ivas->hMcMasa, st_ivas->hEncoderConfig->input_Fs ); + st_ivas->hMcMasa = NULL; + } if ( st_ivas->hMasa != NULL ) { #ifdef FIX_350_MASA_DELAY_COMP - ivas_masa_enc_close( &( st_ivas->hMasa ) ); + ivas_masa_enc_close( st_ivas->hMasa ); #else - ivas_masa_enc_close( &( st_ivas->hMasa ), nchan_transport_old, MC_FORMAT ); + ivas_masa_enc_close( st_ivas->hMasa, nchan_transport_old, MC_FORMAT ); #endif st_ivas->hMasa = NULL; } - ivas_qmetadata_close( &st_ivas->hQMetaData ); + if ( st_ivas->hQMetaData != NULL ) + { + ivas_qmetadata_close( &st_ivas->hQMetaData ); + st_ivas->hQMetaData = NULL; + } /* De-allocate MCT handle if last mode was MCT */ - if ( last_mc_mode == MC_MODE_MCT && st_ivas->nchan_transport <= CPE_CHANNELS ) + if ( last_mc_mode == MC_MODE_MCT && st_ivas->hMCT != NULL && st_ivas->nchan_transport <= CPE_CHANNELS ) { - ivas_mct_enc_close( &( st_ivas->hMCT ) ); + ivas_mct_enc_close( st_ivas->hMCT ); + st_ivas->hMCT = NULL; } if ( last_mc_mode == MC_MODE_MCT && st_ivas->hLFE != NULL ) { /* LFE handle */ - ivas_lfe_enc_close( &( st_ivas->hLFE ) ); + ivas_lfe_enc_close( st_ivas->hLFE ); + st_ivas->hLFE = NULL; } } else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) @@ -701,14 +721,26 @@ static ivas_error ivas_mc_enc_reconfig( } } - ivas_param_mc_enc_close( &( st_ivas->hParamMC ), st_ivas->hEncoderConfig->input_Fs ); + if ( st_ivas->hParamMC != NULL ) + { + ivas_param_mc_enc_close( st_ivas->hParamMC, st_ivas->hEncoderConfig->input_Fs ); + st_ivas->hParamMC = NULL; + } if ( last_mc_mode == MC_MODE_MCT ) { /* LFE handle */ - ivas_lfe_enc_close( &( st_ivas->hLFE ) ); + if ( st_ivas->hLFE != NULL ) + { + ivas_lfe_enc_close( st_ivas->hLFE ); + st_ivas->hLFE = NULL; + } - ivas_mct_enc_close( &( st_ivas->hMCT ) ); + if ( st_ivas->hMCT != NULL ) + { + ivas_mct_enc_close( st_ivas->hMCT ); + st_ivas->hMCT = NULL; + } } } diff --git a/lib_enc/ivas_mdct_core_enc.c b/lib_enc/ivas_mdct_core_enc.c old mode 100755 new mode 100644 index ef9264d5df..626dcf2631 --- a/lib_enc/ivas_mdct_core_enc.c +++ b/lib_enc/ivas_mdct_core_enc.c @@ -686,7 +686,6 @@ void ivas_mdct_core_whitening_enc( core_signal_analysis_high_bitrate( new_samples[ch] + L_INP_MEM, T_op[ch], NULL, NULL, st, mdst_spectrum[ch], tnsSize[ch], tnsBits[ch], param_core[ch], <pBits[ch], windowedSignal[ch], st->L_frame, st->hTcxEnc->L_frameTCX, hCPE->last_element_mode, 0 ); /* BWD in MDCT domain */ -#ifndef FIX_MDCT_BASED_BWD if ( st->hTcxEnc->transform_type[0] == TCX_20 && st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP ) { if ( st->mct_chan_mode != MCT_CHAN_MODE_LFE ) @@ -694,22 +693,6 @@ void ivas_mdct_core_whitening_enc( bw_detect( st, NULL, st->hTcxEnc->spectrum[0], NULL ); } } -#else - if ( st->mct_chan_mode != MCT_CHAN_MODE_LFE && st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP ) - { - nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; - - for ( n = 0; n < nSubframes; n++ ) - { - bw_detect( st, NULL, st->hTcxEnc->spectrum[n], NULL, mct_on ); - - if ( nSubframes == NB_DIV && n == 0 ) - { - st->last_input_bwidth = st->input_bwidth; - } - } - } -#endif if ( st->last_core == ACELP_CORE ) /* reset past kernel info */ { diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index d3aab0a6e8..e878d74183 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -120,10 +120,14 @@ ivas_error ivas_sba_enc_reconfigure( DIRAC_ENC_HANDLE hDirAC = st_ivas->hDirAC; SPAR_ENC_HANDLE hSpar; SBA_MODE sba_mode_old; +#ifdef SBA_HPF_TUNING_ENC int16_t analysis_order_old; +#endif +#ifdef SBA_BR_SWITCHING_CLEAN_UP int16_t spar_reconfig_flag; spar_reconfig_flag = 0; +#endif nchan_transport_old = st_ivas->nchan_transport; nCPE_old = st_ivas->nCPE; nSCE_old = st_ivas->nSCE; @@ -132,6 +136,7 @@ ivas_error ivas_sba_enc_reconfigure( st_ivas->sba_analysis_order = ivas_sba_get_analysis_order( ivas_total_brate, hEncoderConfig->sba_order ); st_ivas->sba_mode = ivas_sba_mode_select( ivas_total_brate ); +#ifdef SBA_HPF_TUNING_ENC analysis_order_old = ivas_sba_get_analysis_order( hEncoderConfig->last_ivas_total_brate, hEncoderConfig->sba_order ); if ( analysis_order_old != st_ivas->sba_analysis_order ) @@ -199,12 +204,17 @@ ivas_error ivas_sba_enc_reconfigure( old_mem_hp20_in = NULL; } } +#endif if ( st_ivas->sba_mode == SBA_MODE_SPAR ) { if ( st_ivas->hSpar == NULL ) { +#ifdef SBA_BR_SWITCHING_CLEAN_UP if ( ( error = ivas_spar_enc_open( st_ivas, spar_reconfig_flag ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_spar_enc_open( st_ivas ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -213,6 +223,7 @@ ivas_error ivas_sba_enc_reconfigure( ivas_spar_config( ivas_total_brate, min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ), &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->hSpar->core_nominal_brate, -1 ); +#ifdef SBA_BR_SWITCHING_CLEAN_UP for ( n = 0; n < DIRAC_MAX_ANA_CHANS; n++ ) { if ( hDirAC->sba_synchro_buffer[n] != NULL ) @@ -222,10 +233,17 @@ ivas_error ivas_sba_enc_reconfigure( } } hDirAC->num_samples_synchro_delay = 0; +#endif } else { - ivas_spar_enc_close( &( st_ivas->hSpar ), hEncoderConfig->input_Fs, hEncoderConfig->nchan_inp, spar_reconfig_flag ); +#ifdef SBA_BR_SWITCHING_CLEAN_UP + ivas_spar_enc_close( st_ivas->hSpar, hEncoderConfig->input_Fs, hEncoderConfig->nchan_inp, spar_reconfig_flag ); + +#else + ivas_spar_enc_close( st_ivas->hSpar, hEncoderConfig->input_Fs, hEncoderConfig->nchan_inp ); +#endif + st_ivas->hSpar = NULL; } hSpar = st_ivas->hSpar; @@ -246,19 +264,68 @@ ivas_error ivas_sba_enc_reconfigure( { if ( hDirAC->hFbMixer != NULL ) { +#ifndef SBA_BR_SWITCHING_CLEAN_UP + ivas_FB_mixer_close( &( hDirAC->hFbMixer ), hEncoderConfig->input_Fs ); +#else ivas_FB_mixer_close( &( hDirAC->hFbMixer ), hEncoderConfig->input_Fs, 0 ); +#endif hDirAC->hFbMixer = NULL; } if ( sba_mode_old == SBA_MODE_SPAR ) { +#ifndef SBA_BR_SWITCHING_CLEAN_UP + IVAS_FB_CFG *fb_cfg; + int16_t nchan_internal, sba_order_internal; + int16_t table_idx, active_w_mixing; + + sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); + nchan_internal = ivas_sba_get_nchan_metadata( sba_order_internal ); + + /* Covar. State handle */ + ivas_spar_covar_enc_close( &hSpar->hCovEnc, hSpar->hFbMixer->fb_cfg->num_in_chans ); + + /* MD handle */ + ivas_spar_md_enc_close( &hSpar->hMdEnc ); + + if ( ( error = ivas_spar_md_enc_open( &( hSpar->hMdEnc ), hEncoderConfig, sba_order_internal ) ) != IVAS_ERR_OK ) + { + return error; + } + + /*Initialization*/ + hSpar->hMdEnc->table_idx = -1; + + /* FB mixer handle */ + ivas_FB_mixer_close( &hSpar->hFbMixer, hEncoderConfig->input_Fs ); + + table_idx = ivas_get_spar_table_idx( ivas_total_brate, sba_order_internal, SPAR_CONFIG_BW, NULL, NULL ); + active_w_mixing = ivas_spar_br_table_consts[table_idx].active_w; + if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_SPAR, nchan_internal, st_ivas->nchan_transport, active_w_mixing, hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + fb_cfg->remix_order = remix_order_set[hSpar->hMdEnc->spar_md_cfg.remix_unmix_order]; + + if ( ( error = ivas_FB_mixer_open( &( hSpar->hFbMixer ), hEncoderConfig->input_Fs, fb_cfg ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Covar. State handle */ + if ( ( error = ivas_spar_covar_enc_open( &( hSpar->hCovEnc ), hSpar->hFbMixer->pFb, hEncoderConfig->input_Fs, nchan_internal ) ) != IVAS_ERR_OK ) + { + return error; + } +#else spar_reconfig_flag = 1; - ivas_spar_enc_close( &( st_ivas->hSpar ), hEncoderConfig->input_Fs, hEncoderConfig->nchan_inp, spar_reconfig_flag ); + ivas_spar_enc_close( st_ivas->hSpar, hEncoderConfig->input_Fs, hEncoderConfig->nchan_inp, spar_reconfig_flag ); if ( ( error = ivas_spar_enc_open( st_ivas, spar_reconfig_flag ) ) != IVAS_ERR_OK ) { return error; } +#endif } } else @@ -273,7 +340,11 @@ ivas_error ivas_sba_enc_reconfigure( } /* Allocate and initialize FB mixer handle */ +#ifdef SBA_BR_SWITCHING_CLEAN_UP if ( ( error = ivas_FB_mixer_open( &( hDirAC->hFbMixer ), hEncoderConfig->input_Fs, fb_cfg, 0 ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_FB_mixer_open( &( hDirAC->hFbMixer ), hEncoderConfig->input_Fs, fb_cfg ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -297,6 +368,43 @@ ivas_error ivas_sba_enc_reconfigure( } } } +#ifndef SBA_BR_SWITCHING_CLEAN_UP + /* initialize delay for SPAR/DirAC delay synchronization */ + if ( ( st_ivas->sba_mode == SBA_MODE_DIRAC ) && ( ( sba_mode_old != st_ivas->sba_mode ) || ( nchan_transport_old != st_ivas->nchan_transport ) ) ) + { + if ( hDirAC->num_samples_synchro_delay == 0 ) + { + hDirAC->num_samples_synchro_delay = NS2SA( hEncoderConfig->input_Fs, IVAS_FB_ENC_DELAY_NS ); + + for ( n = 0; n < DIRAC_MAX_ANA_CHANS; n++ ) + { + if ( ( hDirAC->sba_synchro_buffer[n] = (float *) malloc( hDirAC->num_samples_synchro_delay * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hDirAC synchro buffer\n" ) ); + } + set_zero( hDirAC->sba_synchro_buffer[n], hDirAC->num_samples_synchro_delay ); + } + for ( ; n < DIRAC_MAX_ANA_CHANS; n++ ) + { + hDirAC->sba_synchro_buffer[n] = NULL; + } + } + } + else + { + for ( n = 0; n < DIRAC_MAX_ANA_CHANS; n++ ) + { + if ( hDirAC->sba_synchro_buffer[n] != NULL ) + { + free( hDirAC->sba_synchro_buffer[n] ); + hDirAC->sba_synchro_buffer[n] = NULL; + } + } + hDirAC->num_samples_synchro_delay = 0; + } + + +#endif } if ( ( error = ivas_dirac_enc_reconfigure( st_ivas ) ) != IVAS_ERR_OK ) diff --git a/lib_enc/ivas_sce_enc.c b/lib_enc/ivas_sce_enc.c index a713c4273c..03cc8d9028 100644 --- a/lib_enc/ivas_sce_enc.c +++ b/lib_enc/ivas_sce_enc.c @@ -180,12 +180,21 @@ ivas_error ivas_sce_enc( * Front Pre-processing *----------------------------------------------------------------*/ +#ifdef LOW_RATE_TRANS_CORE_CODER error = pre_proc_front_ivas( hSCE, NULL, hSCE->element_brate, nb_bits_metadata, input_frame, 0, old_inp_12k8[0], old_inp_16k[0], &ener[0], &relE[0], A[0], Aw[0], epsP[0], lsp_new[0], lsp_mid[0], &vad_hover_flag[0], &attack_flag[0], realBuffer[0], imagBuffer[0], old_wsp[0], pitch_fr[0], voicing_fr[0], &loc_harm[0], &cor_map_sum[0], &vad_flag_dtx[0], enerBuffer[0], fft_buff[0], A[0], lsp_new[0], currFlatness[0], 0, fr_bands, Etot_LR, lf_E, localVAD_HE_SAD, NULL, flag_16k_smc, st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_flag : 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->force_front_vad : 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_dtx_flag : 0, st_ivas->hEncoderConfig->ivas_total_brate ); +#else + error = pre_proc_front_ivas( hSCE, NULL, hSCE->element_brate, nb_bits_metadata, input_frame, 0, old_inp_12k8[0], old_inp_16k[0], + &ener[0], &relE[0], A[0], Aw[0], epsP[0], lsp_new[0], lsp_mid[0], + &vad_hover_flag[0], &attack_flag[0], realBuffer[0], imagBuffer[0], old_wsp[0], pitch_fr[0], voicing_fr[0], &loc_harm[0], &cor_map_sum[0], &vad_flag_dtx[0], enerBuffer[0], + fft_buff[0], A[0], lsp_new[0], currFlatness[0], 0, fr_bands, Etot_LR, lf_E, localVAD_HE_SAD, NULL, flag_16k_smc, + st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_flag : 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->force_front_vad : 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_dtx_flag : 0, + st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->hEncoderConfig->ivas_format ); +#endif if ( error != IVAS_ERR_OK ) { return error; @@ -251,8 +260,10 @@ ivas_error ivas_sce_enc( hSCE->last_element_brate = hSCE->element_brate; +#ifdef LOW_RATE_TRANS_CORE_CODER /* Store previous attack detection flag */ st->hTranDet->transientDetector.prev_bIsAttackPresent = st->hTranDet->transientDetector.bIsAttackPresent; +#endif #ifdef DEBUG_MODE_INFO { @@ -345,11 +356,17 @@ ivas_error create_sce_enc( st->total_brate = hSCE->element_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ st->mct_chan_mode = MCT_CHAN_MODE_REGULAR; +#ifdef PARAM_ISM_DTX_CNG if ( ( error = init_encoder( st, #ifdef IND_LIST_DYN st_ivas->hEncoderConfig, #endif 0, st_ivas->hEncoderConfig->var_SID_rate_flag, st_ivas->hEncoderConfig->interval_SID, 0, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) +#else + if ( ( error = init_encoder( st, +#ifdef IND_LIST_DYN + st_ivas->hEncoderConfig, +#endif 0, st_ivas->hEncoderConfig->var_SID_rate_flag, st_ivas->hEncoderConfig->interval_SID, 0 ) ) != IVAS_ERR_OK ) #endif { diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 2a9909286d..43058148d4 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -58,8 +58,11 @@ static ivas_error ivas_spar_enc_process( Encoder_Struct *st_ivas, const ENCODER_ *------------------------------------------------------------------------*/ ivas_error ivas_spar_enc_open( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder handle */ + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ +#ifdef SBA_BR_SWITCHING_CLEAN_UP + , const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ +#endif ) { SPAR_ENC_HANDLE hSpar; @@ -72,16 +75,20 @@ ivas_error ivas_spar_enc_open( hEncoderConfig = st_ivas->hEncoderConfig; error = IVAS_ERR_OK; +#ifdef SBA_BR_SWITCHING_CLEAN_UP hSpar = st_ivas->hSpar; if ( !spar_reconfig_flag ) { +#endif /* SPAR encoder handle */ if ( ( hSpar = (SPAR_ENC_HANDLE) malloc( sizeof( SPAR_ENC_DATA ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR encoder" ); } +#ifdef SBA_BR_SWITCHING_CLEAN_UP } +#endif input_Fs = hEncoderConfig->input_Fs; sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); @@ -106,8 +113,12 @@ ivas_error ivas_spar_enc_open( ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_SPAR, nchan_inp, nchan_transport, active_w_mixing, input_Fs ); fb_cfg->remix_order = remix_order_set[hSpar->hMdEnc->spar_md_cfg.remix_unmix_order]; - /* FB mixer handle */ +/* FB mixer handle */ +#ifdef SBA_BR_SWITCHING_CLEAN_UP if ( ( error = ivas_FB_mixer_open( &( hSpar->hFbMixer ), input_Fs, fb_cfg, spar_reconfig_flag ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_FB_mixer_open( &( hSpar->hFbMixer ), input_Fs, fb_cfg ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -118,14 +129,18 @@ ivas_error ivas_spar_enc_open( return error; } +#ifdef SBA_BR_SWITCHING_CLEAN_UP if ( !spar_reconfig_flag ) { +#endif /* Transient Detector handle */ if ( ( error = ivas_transient_det_open( &( hSpar->hTranDet ), input_Fs ) ) != IVAS_ERR_OK ) { return error; } +#ifdef SBA_BR_SWITCHING_CLEAN_UP } +#endif /* initialization */ hSpar->hMdEnc->table_idx = -1; @@ -179,8 +194,10 @@ ivas_error ivas_spar_enc_open( * Allocate and initialize Front-VAD handle *-----------------------------------------------------------------*/ +#ifdef SBA_BR_SWITCHING_CLEAN_UP if ( !spar_reconfig_flag ) { +#endif hSpar->front_vad_flag = 0; hSpar->front_vad_dtx_flag = 0; hSpar->force_front_vad = 0; @@ -202,11 +219,17 @@ ivas_error ivas_spar_enc_open( hSpar->hCoreCoderVAD->total_brate = hEncoderConfig->ivas_total_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ hSpar->hCoreCoderVAD->mct_chan_mode = MCT_CHAN_MODE_IGNORE; +#ifdef PARAM_ISM_DTX_CNG if ( ( error = init_encoder( hSpar->hCoreCoderVAD, #ifdef IND_LIST_DYN hEncoderConfig, #endif 0, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 1, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) +#else + if ( ( error = init_encoder( hSpar->hCoreCoderVAD, +#ifdef IND_LIST_DYN + hEncoderConfig, +#endif 0, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 1 ) ) != IVAS_ERR_OK ) #endif { @@ -218,7 +241,9 @@ ivas_error ivas_spar_enc_open( hSpar->hCoreCoderVAD = NULL; hSpar->hFrontVad = NULL; } +#ifdef SBA_BR_SWITCHING_CLEAN_UP } +#endif /*-----------------------------------------------------------------* * Final assignment @@ -237,66 +262,81 @@ ivas_error ivas_spar_enc_open( *------------------------------------------------------------------------*/ void ivas_spar_enc_close( - SPAR_ENC_HANDLE *hSpar, /* i/o: SPAR encoder handle */ - const int32_t input_Fs, /* i : input sampling rate */ - const int16_t nchan_inp, /* i : number of input channels */ + SPAR_ENC_HANDLE hSpar, /* i/o: SPAR encoder handle */ + const int32_t input_Fs, /* i : input sampling rate */ + const int16_t nchan_inp /* i : number of input channels */ +#ifdef SBA_BR_SWITCHING_CLEAN_UP + , const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ +#endif ) { int16_t num_chans; - if ( hSpar == NULL || *hSpar == NULL ) - { - return; - } - - if ( !spar_reconfig_flag ) + if ( hSpar != NULL ) { - /* core-coder-VAD handle */ - if ( ( *hSpar )->hCoreCoderVAD != NULL ) +#ifdef SBA_BR_SWITCHING_CLEAN_UP + if ( !spar_reconfig_flag ) { - destroy_core_enc( ( *hSpar )->hCoreCoderVAD ); - ( *hSpar )->hCoreCoderVAD = NULL; - } +#endif + /* core-coder-VAD handle */ + if ( hSpar->hCoreCoderVAD != NULL ) + { + destroy_core_enc( hSpar->hCoreCoderVAD ); + hSpar->hCoreCoderVAD = NULL; + } - /* front-VAD handle */ - if ( ( *hSpar )->hFrontVad != NULL ) - { - front_vad_destroy( &( *hSpar )->hFrontVad ); - ( *hSpar )->hFrontVad = NULL; + /* front-VAD handle */ + if ( hSpar->hFrontVad != NULL ) + { + front_vad_destroy( &hSpar->hFrontVad ); + hSpar->hFrontVad = NULL; + } +#ifdef SBA_BR_SWITCHING_CLEAN_UP } - } +#endif - num_chans = ( *hSpar )->hFbMixer->fb_cfg->num_in_chans; - assert( num_chans <= nchan_inp ); + num_chans = hSpar->hFbMixer->fb_cfg->num_in_chans; + assert( num_chans <= nchan_inp ); - /* MD handle */ - ivas_spar_md_enc_close( &( *hSpar )->hMdEnc ); + /* MD handle */ + ivas_spar_md_enc_close( &hSpar->hMdEnc ); - /* Covar. State handle */ - ivas_spar_covar_enc_close( &( *hSpar )->hCovEnc, num_chans ); + /* Covar. State handle */ + ivas_spar_covar_enc_close( &hSpar->hCovEnc, num_chans ); - /* FB mixer handle */ - ivas_FB_mixer_close( &( *hSpar )->hFbMixer, input_Fs, spar_reconfig_flag ); + /* FB mixer handle */ +#ifdef SBA_BR_SWITCHING_CLEAN_UP + ivas_FB_mixer_close( &hSpar->hFbMixer, input_Fs, spar_reconfig_flag ); +#else + ivas_FB_mixer_close( &hSpar->hFbMixer, input_Fs ); - /* AGC */ - ivas_spar_agc_enc_close( &( *hSpar )->hAgcEnc ); + /* Trans Det handle */ + ivas_transient_det_close( &hSpar->hTranDet ); +#endif - /* PCA */ - if ( ( *hSpar )->hPCA != NULL ) - { - free( ( *hSpar )->hPCA ); - ( *hSpar )->hPCA = NULL; - } + /* AGC */ + ivas_spar_agc_enc_close( &hSpar->hAgcEnc ); - if ( !spar_reconfig_flag ) - { - /* Trans Det handle */ - ivas_transient_det_close( &( *hSpar )->hTranDet ); - free( ( *hSpar ) ); - ( *hSpar ) = NULL; - } + /* PCA */ + if ( hSpar->hPCA != NULL ) + { + free( hSpar->hPCA ); + hSpar->hPCA = NULL; + } +#ifdef SBA_BR_SWITCHING_CLEAN_UP + if ( !spar_reconfig_flag ) + { + /* Trans Det handle */ + ivas_transient_det_close( &hSpar->hTranDet ); +#endif + free( hSpar ); + hSpar = NULL; +#ifdef SBA_BR_SWITCHING_CLEAN_UP + } +#endif + } return; } @@ -398,7 +438,11 @@ static ivas_error ivas_spar_enc_process( float pcm_tmp[IVAS_SPAR_MAX_CH][L_FRAME48k * 2]; float *p_pcm_tmp[IVAS_SPAR_MAX_CH]; int16_t i, j, b, i_ts, input_frame, dtx_vad; +#ifdef SMOOTH_WITH_TRANS_DET int16_t transient_det[2]; +#else + int16_t transient_det; +#endif int32_t ivas_total_brate, input_Fs; float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; float *cov_dtx_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; @@ -441,11 +485,15 @@ static ivas_error ivas_spar_enc_process( * Transient detector *-----------------------------------------------------------------------------------------*/ +#ifdef SMOOTH_WITH_TRANS_DET ivas_transient_det_process( hSpar->hTranDet, data_f[0], input_frame, transient_det ); if ( sba_order == 1 ) { transient_det[1] = transient_det[0]; } +#else + transient_det = ivas_transient_det_process( hSpar->hTranDet, data_f[0], input_frame ); +#endif /* store previous input samples for W in local buffer */ assert( num_del_samples <= IVAS_FB_1MS_48K_SAMP ); diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index 44fb18dbc2..6b2492ebb4 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -225,11 +225,6 @@ void ivas_spar_md_enc_close( int16_t num_channels, i, j; ivas_spar_md_enc_state_t *hMdEnc; - if ( hMdEnc_in == NULL || *hMdEnc_in == NULL ) - { - return; - } - hMdEnc = *hMdEnc_in; num_channels = hMdEnc->num_umx_ch; @@ -255,6 +250,7 @@ void ivas_spar_md_enc_close( { for ( i = 0; i < num_channels; i++ ) { + for ( j = 0; j < num_channels; j++ ) { free( hMdEnc->cov_real[i][j] ); @@ -268,6 +264,7 @@ void ivas_spar_md_enc_close( { for ( i = 0; i < num_channels; i++ ) { + for ( j = 0; j < num_channels; j++ ) { free( hMdEnc->cov_dtx_real[i][j] ); @@ -291,8 +288,11 @@ void ivas_spar_md_enc_close( free( hMdEnc->mixer_mat_local ); } - free( *hMdEnc_in ); - *hMdEnc_in = NULL; + if ( hMdEnc != NULL ) + { + free( hMdEnc ); + hMdEnc = NULL; + } return; } diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index a56f6423d3..e450990254 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -550,6 +550,7 @@ typedef struct ivas_stereo_classifier_data_structure } STEREO_CLASSIF_DATA, *STEREO_CLASSIF_HANDLE; +#ifdef PARAM_ISM_DTX_CNG /*----------------------------------------------------------------------------------* * ISM DTX structure *----------------------------------------------------------------------------------*/ @@ -559,16 +560,13 @@ typedef struct int16_t dtx_flag; int16_t sce_id_dtx; -#ifdef DISCRETE_ISM_DTX_CNG - int16_t cnt_SID_ISM; -#else int16_t dtx_speech_buffer_enc[PARAM_ISM_HYS_BUF_SIZE]; -#endif float long_term_energy_stereo_dmx_enc[MAX_NUM_OBJECTS][PARAM_ISM_HYS_BUF_SIZE]; float coh[MAX_NUM_OBJECTS]; } ISM_DTX_DATA, *ISM_DTX_HANDLE; +#endif /*----------------------------------------------------------------------------------* * Front-VAD structure @@ -1014,15 +1012,9 @@ typedef struct encoder_config_structure int16_t element_mode_init; /* element mode used at initialization */ int16_t stereo_dmx_evs; /* flag to indicate that stereo downmix for EVS encoder */ -#ifdef NCHAN_ISM_PARAMETER - int16_t nchan_ism; /* number of ISM channels */ -#endif int16_t sba_order; /* Ambisonic (SBA) order */ int16_t sba_planar; /* Ambisonic (SBA) planar flag */ MC_LS_SETUP mc_input_setup; /* multichannel input ls setup */ -#ifdef TD5 - int16_t ism_extended_metadata_flag; /* flag indicating extended metadata encoding, including radius and orientation (yaw, pitch) in ISM format */ -#endif int16_t Opt_AMR_WB; /* flag indicating AMR-WB IO mode */ @@ -1079,7 +1071,9 @@ typedef struct /* multichannel modules */ ISM_METADATA_HANDLE hIsmMetaData[MAX_NUM_OBJECTS]; /* ISM metadata handles (storage for one frame of read ISM metadata) */ +#ifdef PARAM_ISM_DTX_CNG ISM_DTX_HANDLE hISMDTX; /* ISM DTX handle */ +#endif DIRAC_ENC_HANDLE hDirAC; /* DirAC data handle */ SPAR_ENC_HANDLE hSpar; /* SPAR encoder handle */ MASA_ENCODER_HANDLE hMasa; /* MASA encoder data and configuration */ diff --git a/lib_enc/ivas_stereo_dmx_evs.c b/lib_enc/ivas_stereo_dmx_evs.c index a5c0fe147f..052970fa70 100644 --- a/lib_enc/ivas_stereo_dmx_evs.c +++ b/lib_enc/ivas_stereo_dmx_evs.c @@ -946,22 +946,16 @@ ivas_error stereo_dmx_evs_init_encoder( *-------------------------------------------------------------------*/ void stereo_dmx_evs_close_encoder( - STEREO_DMX_EVS_ENC_HANDLE *hStereoDmxEVS /* i/o: Stereo downmix for EVS encoder handle */ + STEREO_DMX_EVS_ENC_HANDLE hStereoDmxEVS /* i/o: Stereo downmix for EVS encoder handle */ ) { - if ( hStereoDmxEVS == NULL || *hStereoDmxEVS == NULL ) + if ( hStereoDmxEVS->hPOC != NULL ) { - return; + free( hStereoDmxEVS->hPOC ); + hStereoDmxEVS->hPOC = NULL; } - if ( ( *hStereoDmxEVS )->hPOC != NULL ) - { - free( ( *hStereoDmxEVS )->hPOC ); - ( *hStereoDmxEVS )->hPOC = NULL; - } - - free( ( *hStereoDmxEVS ) ); - ( *hStereoDmxEVS ) = NULL; + free( hStereoDmxEVS ); return; } diff --git a/lib_enc/ivas_tcx_core_enc.c b/lib_enc/ivas_tcx_core_enc.c index 40a97cc33e..3971c6740e 100644 --- a/lib_enc/ivas_tcx_core_enc.c +++ b/lib_enc/ivas_tcx_core_enc.c @@ -457,7 +457,11 @@ void stereo_tcx_core_enc( mvr2r( lsp_q, st->lsp_old, M ); } +#ifdef PARAM_ISM_DTX_CNG if ( st->Opt_DTX_ON && !st->tcxonly && st->hTdCngEnc != NULL ) +#else + if ( st->Opt_DTX_ON && !st->tcxonly ) +#endif { /* update CNG parameters in active frames */ if ( st->bwidth == NB && st->enableTcxLpc && st->core != ACELP_CORE ) diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index f3db751e0a..1b771a041c 100755 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -364,12 +364,7 @@ ivas_error IVAS_ENC_ConfigureForObjects( const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */ const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */ const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ -#ifdef TD5 - const uint16_t numObjects, /* i : number of objects to be encoded */ - const bool ism_extended_metadata /* i : Extended metadata used (true/false), where extended metadata includes radius and orientation */ -#else - const uint16_t numObjects /* i : number of objects to be encoded */ -#endif + const uint16_t numObjects /* i : number of objects to be encoded */ ) { Encoder_Struct *st_ivas; @@ -389,12 +384,7 @@ ivas_error IVAS_ENC_ConfigureForObjects( st_ivas->hEncoderConfig->ivas_format = ISM_FORMAT; st_ivas->hEncoderConfig->element_mode_init = IVAS_SCE; st_ivas->hEncoderConfig->nchan_inp = numObjects; -#ifdef NCHAN_ISM_PARAMETER - st_ivas->hEncoderConfig->nchan_ism = numObjects; -#endif -#ifdef TD5 - st_ivas->hEncoderConfig->ism_extended_metadata_flag = ism_extended_metadata; -#endif + hIvasEnc->maxBandwidthUser = max_bwidth_user; error = configureEncoder( hIvasEnc, inputFs, bitrate, maxBandwidth, dtxConfig, IVAS_ENC_GetDefaultChannelAwareConfig() ); @@ -434,12 +424,7 @@ ivas_error IVAS_ENC_FeedObjectMetadata( return IVAS_ERR_INDEX_OUT_OF_BOUNDS; } -#ifdef TD5 - error = ivas_set_ism_metadata( hIvasEnc->st_ivas->hIsmMetaData[ismIndex], metadata.azimuth, metadata.elevation, metadata.radius, metadata.yaw, metadata.pitch ); -#else error = ivas_set_ism_metadata( hIvasEnc->st_ivas->hIsmMetaData[ismIndex], metadata.azimuth, metadata.elevation ); -#endif - if ( error != IVAS_ERR_OK ) { return error; @@ -886,16 +871,22 @@ static ivas_error configureEncoder( return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "8kHz input sampling rate is not supported in IVAS." ); } +#ifdef PARAM_ISM_DTX_CNG if ( hEncoderConfig->Opt_DTX_ON && hEncoderConfig->ivas_format != MONO_FORMAT && - ( -#ifndef DISCRETE_ISM_DTX_CNG - ( hEncoderConfig->ivas_format == ISM_FORMAT && hEncoderConfig->nchan_inp == 2 ) || // ToDo: see Issue 113 - ( hEncoderConfig->ivas_format == ISM_FORMAT && hEncoderConfig->nchan_inp > 2 && hEncoderConfig->ivas_total_brate != IVAS_24k4 && hEncoderConfig->ivas_total_brate != IVAS_32k ) || // ParamISM + ( ( hEncoderConfig->ivas_format == ISM_FORMAT && hEncoderConfig->nchan_inp == 2 ) || // ToDo: see Issue 113 + ( hEncoderConfig->ivas_format == ISM_FORMAT && hEncoderConfig->nchan_inp > 2 && hEncoderConfig->ivas_total_brate != IVAS_24k4 && hEncoderConfig->ivas_total_brate != IVAS_32k ) || // ParamISM + ( hEncoderConfig->ivas_format == MASA_FORMAT && hEncoderConfig->ivas_total_brate > IVAS_128k ) || // ToDo: remove the bitrate limitation + ( hEncoderConfig->ivas_format == SBA_FORMAT && ivas_get_sba_num_TCs( hEncoderConfig->ivas_total_brate, 1 ) > 2 ) || // ToDo: support for 3+ TCs to be done + hEncoderConfig->ivas_format == MC_FORMAT // ToDo: TBD + ) ) +#else + if ( hEncoderConfig->Opt_DTX_ON && hEncoderConfig->ivas_format != MONO_FORMAT && + ( ( hEncoderConfig->ivas_format == ISM_FORMAT && hEncoderConfig->nchan_inp > 1 ) || // ToDo: see Issue 113 + ( hEncoderConfig->ivas_format == MASA_FORMAT && hEncoderConfig->ivas_total_brate > IVAS_128k ) || // ToDo: remove the bitrate limitation + ( hEncoderConfig->ivas_format == SBA_FORMAT && ivas_get_sba_num_TCs( hEncoderConfig->ivas_total_brate, 1 ) > 2 ) || // ToDo: support for 3+ TCs to be done + hEncoderConfig->ivas_format == MC_FORMAT // ToDo: TBD + ) ) #endif - ( hEncoderConfig->ivas_format == MASA_FORMAT && hEncoderConfig->ivas_total_brate > IVAS_128k ) || // ToDo: remove the bitrate limitation - ( hEncoderConfig->ivas_format == SBA_FORMAT && ivas_get_sba_num_TCs( hEncoderConfig->ivas_total_brate, 1 ) > 2 ) || // ToDo: support for 3+ TCs to be done - hEncoderConfig->ivas_format == MC_FORMAT // ToDo: TBD - ) ) { return IVAS_ERROR( IVAS_ERR_DTX_NOT_SUPPORTED, "DTX is not supported in this IVAS format and element mode." ); } @@ -935,7 +926,7 @@ static ivas_error configureEncoder( return error; } -#ifndef DISCRETE_ISM_DTX_CNG +#ifdef PARAM_ISM_DTX_CNG if ( hEncoderConfig->Opt_DTX_ON && ( hEncoderConfig->ivas_format == ISM_FORMAT ) && !( st_ivas->ism_mode == ISM_MODE_DISC && hEncoderConfig->nchan_inp == 1 ) && !( st_ivas->ism_mode == ISM_MODE_PARAM && ( hEncoderConfig->nchan_inp == 3 || hEncoderConfig->nchan_inp == 4 ) ) ) { return IVAS_ERROR( IVAS_ERR_UNKNOWN, "DTX is not supported in this IVAS format and element mode." ); @@ -1010,6 +1001,7 @@ static int16_t getInputBufferSize( return (int16_t) ( st_ivas->hEncoderConfig->input_Fs * st_ivas->hEncoderConfig->nchan_inp / FRAMES_PER_SEC ); } +#ifdef FIX_94_VERIFY_WAV_NUM_CHANNELS /*---------------------------------------------------------------------* * IVAS_ENC_GetNumInChannels() * @@ -1034,6 +1026,7 @@ ivas_error IVAS_ENC_GetNumInChannels( return IVAS_ERR_OK; } +#endif /*---------------------------------------------------------------------* @@ -1552,11 +1545,11 @@ static ivas_error printConfigInfo_enc( { if ( hEncoderConfig->ivas_total_brate <= ACELP_32k && hEncoderConfig->nchan_inp > 2 ) { - fprintf( stdout, "IVAS format: Param-ISM (%i streams)\n", hEncoderConfig->nchan_inp ); + fprintf( stdout, "IVAS format: Param-ISm (%i streams)\n", hEncoderConfig->nchan_inp ); } else { - fprintf( stdout, "IVAS format: ISM (%i streams)\n", hEncoderConfig->nchan_inp ); + fprintf( stdout, "IVAS format: ISm (%i streams)\n", hEncoderConfig->nchan_inp ); } } else if ( hEncoderConfig->ivas_format == SBA_FORMAT ) @@ -1999,6 +1992,7 @@ static ivas_error sanitizeBandwidth( static ivas_error sanitizeBitrateISM( const ENCODER_CONFIG_HANDLE hEncoderConfig ) { +#ifdef ISM_HIGHEST_BITRATE if ( hEncoderConfig->ivas_total_brate > IVAS_128k && hEncoderConfig->nchan_inp == 1 ) { return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too high bitrate for 1 ISM specified in IVAS: %d", hEncoderConfig->ivas_total_brate ); @@ -2013,6 +2007,12 @@ static ivas_error sanitizeBitrateISM( { return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too high bitrate for 3 ISM specified in IVAS: %d", hEncoderConfig->ivas_total_brate ); } +#else + if ( hEncoderConfig->ivas_total_brate > IVAS_256k ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too high bitrate for ISm specified in IVAS: %d", hEncoderConfig->ivas_total_brate ); + } +#endif if ( hEncoderConfig->ivas_total_brate < IVAS_16k4 && hEncoderConfig->nchan_inp == 2 ) { @@ -2029,13 +2029,6 @@ static ivas_error sanitizeBitrateISM( return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too low bitrate for 4 ISM specified in IVAS: %d", hEncoderConfig->ivas_total_brate ); } -#ifdef TD5 - if ( hEncoderConfig->ivas_total_brate < ISM_EXTENDED_METADATA_BRATE && hEncoderConfig->ism_extended_metadata_flag == 1 ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too low bitrate for extended metadata format specified in IVAS: %d", hEncoderConfig->ivas_total_brate ); - } -#endif - return IVAS_ERR_OK; } @@ -2291,14 +2284,8 @@ static void init_encoder_config( hEncoderConfig->var_SID_rate_flag = 1; hEncoderConfig->mc_input_setup = MC_LS_SETUP_INVALID; hEncoderConfig->stereo_dmx_evs = 0; -#ifdef NCHAN_ISM_PARAMETER - hEncoderConfig->nchan_ism = 0; -#endif hEncoderConfig->sba_order = 0; hEncoderConfig->sba_planar = 0; -#ifdef TD5 - hEncoderConfig->ism_extended_metadata_flag = 0; -#endif #ifdef DEBUGGING hEncoderConfig->stereo_mode_cmdl = 0; hEncoderConfig->force = -1; diff --git a/lib_enc/lib_enc.h b/lib_enc/lib_enc.h index 37fd4b4dee..7430822642 100644 --- a/lib_enc/lib_enc.h +++ b/lib_enc/lib_enc.h @@ -180,12 +180,7 @@ ivas_error IVAS_ENC_ConfigureForObjects( const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */ const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */ const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ -#ifdef TD5 - const uint16_t numObjects, /* i : number of objects to be encoded */ - const bool ism_extended_metadata /* i : Extended metadata used (true/false), where extended metadata includes radius and orientation */ -#else const uint16_t numObjects /* i : number of objects to be encoded */ -#endif ); /*! r: error code */ @@ -303,11 +298,13 @@ ivas_error IVAS_ENC_GetDelay( int16_t *delay /* o : encoder delay */ ); +#ifdef FIX_94_VERIFY_WAV_NUM_CHANNELS /*! r: encoder error code */ ivas_error IVAS_ENC_GetNumInChannels( const IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ int16_t *numInChannels /* o : total number of samples expected in the input buffer for current encoder configuration */ ); +#endif /*! r: encoder error code */ ivas_error IVAS_ENC_GetInputBufferSize( diff --git a/lib_enc/pre_proc.c b/lib_enc/pre_proc.c old mode 100755 new mode 100644 index bbeba48a16..300cb79787 --- a/lib_enc/pre_proc.c +++ b/lib_enc/pre_proc.c @@ -219,12 +219,7 @@ void pre_proc( * NB/WB/SWB/FB bandwidth detector *----------------------------------------------------------------*/ - bw_detect( st, st->input, NULL, enerBuffer -#ifdef FIX_MDCT_BASED_BWD - , - 0 -#endif - ); + bw_detect( st, st->input, NULL, enerBuffer ); /*----------------------------------------------------------------* * Noise energy down-ward update and total noise energy estimation diff --git a/lib_enc/rst_enc.c b/lib_enc/rst_enc.c index 3a20418759..2f19c41665 100644 --- a/lib_enc/rst_enc.c +++ b/lib_enc/rst_enc.c @@ -84,11 +84,15 @@ void CNG_reset_enc( set_f( voice_factors, 1.0, NB_SUBFR16k ); +#ifdef PARAM_ISM_DTX_CNG if ( st->hTdCngEnc != NULL ) { +#endif /* Reset active frame counter */ st->hTdCngEnc->act_cnt2 = 0; +#ifdef PARAM_ISM_DTX_CNG } +#endif /* deactivate bass post-filter */ st->bpf_off = 1; diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index c4941b610c..caf9a562d5 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -147,6 +147,1225 @@ static ivas_error ivas_hrtf_close( return IVAS_ERR_OK; } + +#ifndef FIX_197_CREND_INTERFACE +/*------------------------------------------------------------------------- + * ivas_crend_init_from_rom() + * + * Allocate and initialize crend renderer handle + *------------------------------------------------------------------------*/ + +ivas_error ivas_crend_init_from_rom( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + int16_t i, j, tmp; + int32_t output_Fs; + AUDIO_CONFIG intern_config; + HRTFS_HANDLE hHrtf; + +#ifdef FIX_197_CREND_INTERFACE + hHrtf = st_ivas->hCrendWrapper->hHrtfCrend; +#else + hHrtf = st_ivas->hHrtf; +#endif + + output_Fs = st_ivas->hDecoderConfig->output_Fs; + + intern_config = st_ivas->intern_config; + + if ( intern_config == AUDIO_CONFIG_BINAURAL || intern_config == AUDIO_CONFIG_BINAURAL_ROOM ) + { + return IVAS_ERR_INTERNAL_FATAL; + } + + if ( hHrtf == NULL ) + { + if ( ivas_hrtf_open( &hHrtf ) != IVAS_ERR_OK ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for HRTF handle" ); + } + } + + hHrtf->max_num_ir = audioCfg2channels( intern_config ); + + if ( hHrtf->max_num_ir <= 0 ) + { + return IVAS_ERR_INTERNAL_FATAL; + } + + /* Do all error checks up front so that the nested if later is easier */ + if ( st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV && st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Encountered unsupported renderer type" ); + } + + if ( intern_config != AUDIO_CONFIG_5_1 && intern_config != AUDIO_CONFIG_5_1_2 && intern_config != AUDIO_CONFIG_5_1_4 && + intern_config != AUDIO_CONFIG_7_1 && intern_config != AUDIO_CONFIG_7_1_4 && + intern_config != AUDIO_CONFIG_FOA && intern_config != AUDIO_CONFIG_HOA2 && intern_config != AUDIO_CONFIG_HOA3 ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Encountered unsupported transport config in Crend" ); + } + + if ( ( ( st_ivas->hRenderConfig != NULL ) && !st_ivas->hRenderConfig->roomAcoustics.use_brir ) || ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV ) ) + { + if ( intern_config == AUDIO_CONFIG_5_1 || intern_config == AUDIO_CONFIG_5_1_2 || intern_config == AUDIO_CONFIG_5_1_4 || + intern_config == AUDIO_CONFIG_7_1 || intern_config == AUDIO_CONFIG_7_1_4 ) + { + hHrtf->max_num_ir -= 1; /* subtract LFE */ + hHrtf->gain_lfe = GAIN_LFE; + + if ( output_Fs == 48000 ) + { + hHrtf->latency_s = CRendBin_Combined_HRIR_latency_s; + + hHrtf->max_num_iterations = CRendBin_Combined_HRIR_max_num_iterations_48kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_Combined_HRIR_index_frequency_max_diffuse_48kHz; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_HRIR_num_iterations_diffuse_48kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_HRIR_coeff_diffuse_re_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_HRIR_coeff_diffuse_im_48kHz[j]; + } + } + else if ( output_Fs == 32000 ) + { + hHrtf->latency_s = CRendBin_Combined_HRIR_latency_s; + + hHrtf->max_num_iterations = CRendBin_Combined_HRIR_max_num_iterations_32kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_Combined_HRIR_index_frequency_max_diffuse_32kHz; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_HRIR_num_iterations_diffuse_32kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_HRIR_coeff_diffuse_re_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_HRIR_coeff_diffuse_im_32kHz[j]; + } + } + else if ( output_Fs == 16000 ) + { + hHrtf->latency_s = CRendBin_Combined_HRIR_latency_s; + + hHrtf->max_num_iterations = CRendBin_Combined_HRIR_max_num_iterations_16kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_Combined_HRIR_index_frequency_max_diffuse_16kHz; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_HRIR_num_iterations_diffuse_16kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz[j]; + } + } + else + { + return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" ); + } + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + if ( intern_config == AUDIO_CONFIG_5_1 ) + { + tmp = channelIndex_CICP6[i]; + } + else if ( intern_config == AUDIO_CONFIG_7_1 ) + { + tmp = channelIndex_CICP12[i]; + } + else if ( intern_config == AUDIO_CONFIG_5_1_2 ) + { + tmp = channelIndex_CICP14[i]; + } + else if ( intern_config == AUDIO_CONFIG_5_1_4 ) + { + tmp = channelIndex_CICP16[i]; + } + else if ( intern_config == AUDIO_CONFIG_7_1_4 ) + { + tmp = channelIndex_CICP19[i]; + } + else + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: Channel configuration not specified!\n\n" ); + } + + if ( output_Fs == 48000 ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz[tmp]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_Combined_HRIR_num_iterations_48kHz[tmp][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_HRIR_pIndex_frequency_max_48kHz[tmp][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_HRIR_coeff_re_48kHz[tmp][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_HRIR_coeff_im_48kHz[tmp][j]; + } + } + else if ( output_Fs == 32000 ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz[tmp]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_Combined_HRIR_num_iterations_32kHz[tmp][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_HRIR_pIndex_frequency_max_32kHz[tmp][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_HRIR_coeff_re_32kHz[tmp][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_HRIR_coeff_im_32kHz[tmp][j]; + } + } + else if ( output_Fs == 16000 ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz[tmp]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_Combined_HRIR_num_iterations_16kHz[tmp][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_HRIR_pIndex_frequency_max_16kHz[tmp][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_HRIR_coeff_re_16kHz[tmp][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_HRIR_coeff_im_16kHz[tmp][j]; + } + } + else + { + return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" ); + } + } + } + else if ( intern_config == AUDIO_CONFIG_FOA || intern_config == AUDIO_CONFIG_HOA2 || intern_config == AUDIO_CONFIG_HOA3 ) + { + if ( output_Fs == 48000 ) + { + hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s; + + hHrtf->max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_48kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_48kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_48kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_48kHz[i][j]; + } + } + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[j]; + } + } + else if ( output_Fs == 32000 ) + { + hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s; + + hHrtf->max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_32kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_32kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_32kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_32kHz[i][j]; + } + } + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[j]; + } + } + else if ( output_Fs == 16000 ) + { + hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s; + + hHrtf->max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_16kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_16kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_16kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_16kHz[i][j]; + } + } + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[j]; + } + } + else + { + return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" ); + } + } + } + else if ( ( ( st_ivas->hRenderConfig != NULL ) && st_ivas->hRenderConfig->roomAcoustics.use_brir ) || ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) + { + if ( intern_config == AUDIO_CONFIG_5_1 || intern_config == AUDIO_CONFIG_5_1_2 || intern_config == AUDIO_CONFIG_5_1_4 || + intern_config == AUDIO_CONFIG_7_1 || intern_config == AUDIO_CONFIG_7_1_4 ) + { + hHrtf->max_num_ir -= 1; /* subtract LFE */ + hHrtf->gain_lfe = GAIN_LFE; + + if ( output_Fs == 48000 ) + { + hHrtf->latency_s = CRendBin_Combined_BRIR_latency_s; + + hHrtf->max_num_iterations = CRendBin_Combined_BRIR_max_num_iterations_48kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_Combined_BRIR_index_frequency_max_diffuse_48kHz; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_BRIR_num_iterations_diffuse_48kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_BRIR_coeff_diffuse_re_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_BRIR_coeff_diffuse_im_48kHz[j]; + } + } + else if ( output_Fs == 32000 ) + { + hHrtf->latency_s = CRendBin_Combined_BRIR_latency_s; + + hHrtf->max_num_iterations = CRendBin_Combined_BRIR_max_num_iterations_32kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_Combined_BRIR_index_frequency_max_diffuse_32kHz; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_BRIR_num_iterations_diffuse_32kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_BRIR_coeff_diffuse_re_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_BRIR_coeff_diffuse_im_32kHz[j]; + } + } + else if ( output_Fs == 16000 ) + { + hHrtf->latency_s = CRendBin_Combined_BRIR_latency_s; + + hHrtf->max_num_iterations = CRendBin_Combined_BRIR_max_num_iterations_16kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_Combined_BRIR_index_frequency_max_diffuse_16kHz; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_BRIR_num_iterations_diffuse_16kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_BRIR_coeff_diffuse_re_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz[j]; + } + } + else + { + return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" ); + } + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + if ( intern_config == AUDIO_CONFIG_5_1 ) + { + tmp = channelIndex_CICP6[i]; + } + else if ( intern_config == AUDIO_CONFIG_7_1 ) + { + tmp = channelIndex_CICP12[i]; + } + else if ( intern_config == AUDIO_CONFIG_5_1_2 ) + { + tmp = channelIndex_CICP14[i]; + } + else if ( intern_config == AUDIO_CONFIG_5_1_4 ) + { + tmp = channelIndex_CICP16[i]; + } + else if ( intern_config == AUDIO_CONFIG_7_1_4 ) + { + tmp = channelIndex_CICP19[i]; + } + else + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: Channel configuration not specified!\n\n" ); + } + + if ( output_Fs == 48000 ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz[tmp]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_48kHz[tmp][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz[tmp][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_BRIR_coeff_re_48kHz[tmp][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_BRIR_coeff_im_48kHz[tmp][j]; + } + } + else if ( output_Fs == 32000 ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz[tmp]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_32kHz[tmp][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz[tmp][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_BRIR_coeff_re_32kHz[tmp][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_BRIR_coeff_im_32kHz[tmp][j]; + } + } + else if ( output_Fs == 16000 ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz[tmp]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_16kHz[tmp][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz[tmp][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_BRIR_coeff_re_16kHz[tmp][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_BRIR_coeff_im_16kHz[tmp][j]; + } + } + else + { + return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" ); + } + } + } + else if ( intern_config == AUDIO_CONFIG_FOA || intern_config == AUDIO_CONFIG_HOA2 || intern_config == AUDIO_CONFIG_HOA3 ) + { + if ( output_Fs == 48000 ) + { + hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s; + + hHrtf->max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_48kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_48kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_48kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_48kHz[i][j]; + } + } + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[j]; + } + } + else if ( output_Fs == 32000 ) + { + hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s; + + hHrtf->max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_32kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_32kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_32kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_32kHz[i][j]; + } + } + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[j]; + } + } + else if ( output_Fs == 16000 ) + { + hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s; + + hHrtf->max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_16kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_16kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_16kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_16kHz[i][j]; + } + } + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[j]; + } + } + else + { + return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" ); + } + } + else + { + return IVAS_ERROR( IVAS_ERR_INTERNAL, "Unsupported intern_config type in Crend" ); + } + } + else + { + return IVAS_ERROR( IVAS_ERR_INTERNAL, "Unsupported renderer type in Crend" ); + } + +#ifdef FIX_197_CREND_INTERFACE + st_ivas->hCrendWrapper->hHrtfCrend = hHrtf; +#else + st_ivas->hHrtf = hHrtf; +#endif + + return IVAS_ERR_OK; +} +#endif + +#ifndef FIX_197_CREND_INTERFACE +/*------------------------------------------------------------------------- + * ivas_crend_init_from_hrtf_handle() + * + * Allocate and initialize Crend HRTF handle from external file + *------------------------------------------------------------------------*/ + +ivas_error ivas_crend_init_from_hrtf_handle( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + HRTFS_HANDLE hrtf ) +{ + int16_t i, j, as_lfe_filter; + const int16_t *hchannelIndex = NULL; + AUDIO_CONFIG transport_config; + + if ( st_ivas == NULL ) + { + return IVAS_ERR_INTERNAL; + } + + if ( hrtf == NULL ) + { + return IVAS_ERR_INVALID_HRTF; + } + + if ( st_ivas->hHrtf != NULL ) + { + ivas_hrtf_close( &st_ivas->hHrtf ); + } + + if ( ivas_hrtf_open( &( st_ivas->hHrtf ) ) != IVAS_ERR_OK ) + { + return IVAS_ERR_INTERNAL; + } + + if ( st_ivas->hHrtf != NULL ) + { + st_ivas->hHrtf->latency_s = hrtf->latency_s; + // st_ivas->hHrtf->max_num_ir->max_ir_len = hrtf->max_ir_len; + st_ivas->hHrtf->max_num_iterations = hrtf->max_num_iterations; + st_ivas->hHrtf->gain_lfe = hrtf->gain_lfe; + // st_ivas->hHrtf->crend_hr_gain_foa_to_bin = hrtf->crend_hr_gain_foa_to_bin; + st_ivas->hHrtf->max_num_ir = 0; + st_ivas->hIntSetup.nchan_out_woLFE = 0; + st_ivas->hIntSetup.num_lfe = 0; + st_ivas->hIntSetup.nchan_out_woLFE = 0; + + transport_config = st_ivas->intern_config == AUDIO_CONFIG_INVALID ? st_ivas->transport_config : st_ivas->intern_config; + + switch ( transport_config ) + { + case AUDIO_CONFIG_5_1: + st_ivas->hHrtf->max_num_ir = 5; + st_ivas->hHrtf->gain_lfe = GAIN_LFE; + st_ivas->hIntSetup.nchan_out_woLFE = st_ivas->hHrtf->max_num_ir; + st_ivas->hIntSetup.num_lfe = 1; + hchannelIndex = (const int16_t *) &channelIndex_CICP6; + break; + case AUDIO_CONFIG_7_1: + st_ivas->hHrtf->max_num_ir = 7; + st_ivas->hHrtf->gain_lfe = GAIN_LFE; + st_ivas->hIntSetup.nchan_out_woLFE = st_ivas->hHrtf->max_num_ir; + st_ivas->hIntSetup.num_lfe = 1; + hchannelIndex = (const int16_t *) &channelIndex_CICP12; + break; + case AUDIO_CONFIG_5_1_2: + st_ivas->hHrtf->max_num_ir = 7; + st_ivas->hHrtf->gain_lfe = GAIN_LFE; + st_ivas->hIntSetup.nchan_out_woLFE = st_ivas->hHrtf->max_num_ir; + st_ivas->hIntSetup.num_lfe = 1; + hchannelIndex = (const int16_t *) &channelIndex_CICP14; + break; + case AUDIO_CONFIG_5_1_4: + st_ivas->hHrtf->max_num_ir = 9; + st_ivas->hHrtf->gain_lfe = GAIN_LFE; + st_ivas->hIntSetup.nchan_out_woLFE = st_ivas->hHrtf->max_num_ir; + st_ivas->hIntSetup.num_lfe = 1; + hchannelIndex = (const int16_t *) &channelIndex_CICP16; + break; + case AUDIO_CONFIG_7_1_4: + st_ivas->hHrtf->max_num_ir = 11; + st_ivas->hHrtf->gain_lfe = GAIN_LFE; + st_ivas->hIntSetup.nchan_out_woLFE = st_ivas->hHrtf->max_num_ir; + st_ivas->hIntSetup.num_lfe = 1; + hchannelIndex = (const int16_t *) &channelIndex_CICP19; + break; + case AUDIO_CONFIG_FOA: + st_ivas->hIntSetup.ambisonics_order = 1; + st_ivas->hHrtf->max_num_ir = 4; + break; + case AUDIO_CONFIG_HOA2: + st_ivas->hIntSetup.ambisonics_order = 2; + st_ivas->hHrtf->max_num_ir = 9; + break; + case AUDIO_CONFIG_HOA3: + st_ivas->hIntSetup.ambisonics_order = 3; + st_ivas->hHrtf->max_num_ir = 16; + break; + default: + break; + } + + as_lfe_filter = 0; + if ( ( st_ivas->hHrtf->max_num_ir != hrtf->max_num_ir ) && ( st_ivas->hHrtf->max_num_ir + 1 == hrtf->max_num_ir ) ) + { + as_lfe_filter = 1; + hchannelIndex = NULL; + } + + if ( st_ivas->hHrtf->max_num_ir == 0 ) + { + return IVAS_ERR_INTERNAL; + } + + for ( i = 0; i < st_ivas->hHrtf->max_num_ir; i++ ) + { + int16_t tmp = i; + if ( hchannelIndex != NULL ) + { + tmp = hchannelIndex[i]; + } + if ( as_lfe_filter ) + { + if ( tmp > 2 ) + { + tmp++; + } + } + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + st_ivas->hHrtf->pOut_to_bin_re[i][j] = hrtf->pOut_to_bin_re[tmp][j]; + st_ivas->hHrtf->pOut_to_bin_im[i][j] = hrtf->pOut_to_bin_im[tmp][j]; + st_ivas->hHrtf->num_iterations[i][j] = hrtf->num_iterations[tmp][j]; + st_ivas->hHrtf->pIndex_frequency_max[i][j] = hrtf->pIndex_frequency_max[tmp][j]; + } + st_ivas->hHrtf->inv_diffuse_weight[i] = hrtf->inv_diffuse_weight[tmp]; + } + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + st_ivas->hHrtf->pOut_to_bin_diffuse_re[j] = hrtf->pOut_to_bin_diffuse_re[j]; + st_ivas->hHrtf->pOut_to_bin_diffuse_im[j] = hrtf->pOut_to_bin_diffuse_im[j]; + st_ivas->hHrtf->num_iterations_diffuse[j] = hrtf->num_iterations_diffuse[j]; + st_ivas->hHrtf->pIndex_frequency_max_diffuse[j] = hrtf->pIndex_frequency_max_diffuse[j]; + } + st_ivas->hHrtf->index_frequency_max_diffuse = hrtf->index_frequency_max_diffuse; + } + return IVAS_ERR_OK; +} + +/*------------------------------------------------------------------------- + * ivas_crend_init_from_setofhrtf() + * + * Allocate and initialize crend renderer handle + *------------------------------------------------------------------------*/ + +ivas_error ivas_crend_init_from_setofhrtf( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + ivas_error error; + AUDIO_CONFIG transport_config; + + transport_config = st_ivas->intern_config == AUDIO_CONFIG_INVALID ? st_ivas->transport_config : st_ivas->intern_config; + switch ( transport_config ) + { + case AUDIO_CONFIG_5_1: + case AUDIO_CONFIG_5_1_2: + case AUDIO_CONFIG_5_1_4: + case AUDIO_CONFIG_7_1: + case AUDIO_CONFIG_7_1_4: + if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + { + if ( ( error = ivas_crend_init_from_hrtf_handle( st_ivas, st_ivas->hSetOfHRTF->hHRTF_brir_combined ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + if ( ( error = ivas_crend_init_from_hrtf_handle( st_ivas, st_ivas->hSetOfHRTF->hHRTF_hrir_combined ) ) != IVAS_ERR_OK ) + { + return error; + } + } + break; + case AUDIO_CONFIG_FOA: + case AUDIO_CONFIG_HOA2: + case AUDIO_CONFIG_HOA3: + if ( ( error = ivas_crend_init_from_hrtf_handle( st_ivas, st_ivas->hSetOfHRTF->hHRTF_hrir_hoa3 ) ) != IVAS_ERR_OK ) + { + return error; + } + break; + default: + return IVAS_ERR_INTERNAL; + } + + return IVAS_ERR_OK; +} + +#endif + +#ifndef FIX_197_CREND_INTERFACE +/*------------------------------------------------------------------------- + * ivas_crend_open() + * + * Allocate and initialize Crend renderer handle + *------------------------------------------------------------------------*/ + +ivas_error ivas_crend_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + int16_t i, subframe_length; + int16_t max_total_ir_len; + HRTFS_HANDLE hHrtf; + CREND_HANDLE hCrend; + ivas_error error; + + error = IVAS_ERR_OK; + subframe_length = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ) / MAX_PARAM_SPATIAL_SUBFRAMES; + + if ( ( st_ivas->hHrtf == NULL ) && ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) + { + if ( st_ivas->hSetOfHRTF != NULL ) + { + if ( ( error = ivas_crend_init_from_setofhrtf( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + if ( ( error = ivas_crend_init_from_rom( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + if ( ( hCrend = (CREND_HANDLE) malloc( sizeof( CREND_DATA ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for renderer handle" ); + } + + hCrend->lfe_delay_line = NULL; + + for ( i = 0; i < MAX_INTERN_CHANNELS; i++ ) + { + hCrend->freq_buffer_re[i] = NULL; + hCrend->freq_buffer_im[i] = NULL; + } + + for ( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + hCrend->prev_out_buffer[i] = NULL; + } + + hCrend->freq_buffer_re_diffuse = NULL; + hCrend->freq_buffer_im_diffuse = NULL; + hCrend->hReverb = NULL; + hCrend->delay_line_rw_index = 0; + hCrend->diffuse_delay_line_rw_index = 0; + hCrend->hTrack = NULL; + hCrend->m_fYaw = 0; + hCrend->m_fPitch = 0; + hCrend->m_fRoll = 0; + + hHrtf = st_ivas->hHrtf; + + if ( ( hHrtf != NULL ) && ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) + { + max_total_ir_len = hHrtf->max_num_iterations * subframe_length; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + if ( ( hCrend->freq_buffer_re[i] = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + } + set_f( hCrend->freq_buffer_re[i], 0, max_total_ir_len ); + + if ( ( hCrend->freq_buffer_im[i] = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + } + set_f( hCrend->freq_buffer_im[i], 0, max_total_ir_len ); + } + + for ( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + if ( ( hCrend->prev_out_buffer[i] = (float *) malloc( sizeof( float ) * subframe_length ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + } + set_f( hCrend->prev_out_buffer[i], 0, subframe_length ); + } + + max_total_ir_len = hHrtf->num_iterations_diffuse[0] * subframe_length; + + if ( max_total_ir_len > 0 ) + { + if ( ( hCrend->freq_buffer_re_diffuse = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + } + set_f( hCrend->freq_buffer_re_diffuse, 0, max_total_ir_len ); + + if ( ( hCrend->freq_buffer_im_diffuse = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + } + set_f( hCrend->freq_buffer_im_diffuse, 0, max_total_ir_len ); + } + else + { + hCrend->freq_buffer_re_diffuse = NULL; + hCrend->freq_buffer_im_diffuse = NULL; + } + + max_total_ir_len = (int16_t) ( hHrtf->latency_s * st_ivas->hDecoderConfig->output_Fs + 0.5f ) + subframe_length; + if ( max_total_ir_len > 0 ) + { + if ( ( hCrend->lfe_delay_line = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + } + set_f( hCrend->lfe_delay_line, 0, max_total_ir_len ); + } + else + { + hCrend->lfe_delay_line = NULL; + } + + if ( st_ivas->hDecoderConfig->Opt_Headrotation ) + { + if ( ( hCrend->hTrack = (ivas_orient_trk_state_t *) malloc( sizeof( ivas_orient_trk_state_t ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Orientation tracking" ); + } + + ivas_orient_trk_Init( hCrend->hTrack ); + } + else + { + hCrend->hTrack = NULL; + } + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM && st_ivas->ivas_format == MC_FORMAT && st_ivas->hDecoderConfig->Opt_Headrotation ) + { + if ( ( error = efap_init_data( &( st_ivas->hEFAPdata ), st_ivas->hIntSetup.ls_azimuth, st_ivas->hIntSetup.ls_elevation, st_ivas->hIntSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( ( ( st_ivas->hRenderConfig != NULL ) && st_ivas->hRenderConfig->roomAcoustics.late_reverb_on ) ) + { + if ( ( error = ivas_reverb_open( &( hCrend->hReverb ), st_ivas->intern_config, hHrtf, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + hCrend->hReverb = NULL; + } + + st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtf->latency_s * 1000000000.f ); + } + + st_ivas->hCrend = hCrend; + + return error; +} +#endif + +#ifndef FIX_197_CREND_INTERFACE + +/*------------------------------------------------------------------------- + * ivas_crend_close() + * + * Deallocate Crend renderer handle + *------------------------------------------------------------------------*/ + +ivas_error ivas_crend_close( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + int16_t i; + + if ( st_ivas->hHrtf != NULL ) + { + ivas_hrtf_close( &st_ivas->hHrtf ); + } + + if ( st_ivas->hCrend != NULL ) + { + if ( st_ivas->renderer_type != RENDERER_BINAURAL_OBJECTS_TD ) + { + for ( i = 0; i < MAX_INTERN_CHANNELS; i++ ) + { + if ( st_ivas->hCrend->freq_buffer_re[i] != NULL ) + { + free( st_ivas->hCrend->freq_buffer_re[i] ); + st_ivas->hCrend->freq_buffer_re[i] = NULL; + } + if ( st_ivas->hCrend->freq_buffer_im[i] != NULL ) + { + free( st_ivas->hCrend->freq_buffer_im[i] ); + st_ivas->hCrend->freq_buffer_im[i] = NULL; + } + } + + for ( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + if ( st_ivas->hCrend->prev_out_buffer[i] != NULL ) + { + free( st_ivas->hCrend->prev_out_buffer[i] ); + st_ivas->hCrend->prev_out_buffer[i] = NULL; + } + } + + if ( st_ivas->hCrend->lfe_delay_line != NULL ) + { + free( st_ivas->hCrend->lfe_delay_line ); + st_ivas->hCrend->lfe_delay_line = NULL; + } + + if ( st_ivas->hCrend->freq_buffer_re_diffuse != NULL ) + { + free( st_ivas->hCrend->freq_buffer_re_diffuse ); + st_ivas->hCrend->freq_buffer_re_diffuse = NULL; + } + + if ( st_ivas->hCrend->freq_buffer_im_diffuse != NULL ) + { + free( st_ivas->hCrend->freq_buffer_im_diffuse ); + st_ivas->hCrend->freq_buffer_im_diffuse = NULL; + } + + if ( st_ivas->hCrend->hTrack != NULL ) + { + free( st_ivas->hCrend->hTrack ); + st_ivas->hCrend->hTrack = NULL; + } + } + + ivas_reverb_close( &st_ivas->hCrend->hReverb ); + + free( st_ivas->hCrend ); + st_ivas->hCrend = NULL; + } + + return IVAS_ERR_OK; +} +#endif + +#ifndef FIX_197_CREND_INTERFACE + +/*-----------------------------------------------------------------------------------------* + * Function ivas_crend_convolver() + * + * Convolver block + *-----------------------------------------------------------------------------------------*/ + +static ivas_error ivas_crend_convolver( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float pcm_in[][L_FRAME48k], + float pcm_out[][L_FRAME48k], + const int16_t i_ts ) +{ + float *pIn; + float *pFreq_buf_re; + float *pFreq_buf_im; + float *pFreq_filt_re; + float *pFreq_filt_im; + int16_t i, j, k, m, nchan_out, subframe_length, nchan_intern, idx_in; + float pOut[L_FRAME48k * 2]; + float tmp_out_re[L_FRAME48k], tmp_out_im[L_FRAME48k]; + int16_t offset, offset_in, offset_diffuse; + int32_t output_Fs; + + nchan_intern = audioCfg2channels( st_ivas->intern_config ); + nchan_out = st_ivas->hDecoderConfig->nchan_out; + output_Fs = st_ivas->hDecoderConfig->output_Fs; + subframe_length = (int16_t) ( output_Fs / FRAMES_PER_SEC ) / MAX_PARAM_SPATIAL_SUBFRAMES; + + offset = st_ivas->hCrend->delay_line_rw_index * subframe_length; /* subframe_length * ( st_ivas->hHrtf->max_num_iterations - 1 ); */ + offset_diffuse = st_ivas->hCrend->diffuse_delay_line_rw_index * subframe_length; /* subframe_length *( st_ivas->hHrtf->num_iterations_diffuse[0] - 1 ); */ + + if ( st_ivas->hHrtf->num_iterations_diffuse[0] > 0 ) + { + set_zero( &st_ivas->hCrend->freq_buffer_re_diffuse[offset_diffuse], subframe_length ); + set_zero( &st_ivas->hCrend->freq_buffer_im_diffuse[offset_diffuse], subframe_length ); + } + + i = 0; + for ( idx_in = 0; idx_in < nchan_intern; idx_in++ ) + { + pIn = &pcm_in[idx_in][i_ts * subframe_length]; + if ( st_ivas->hIntSetup.index_lfe[0] != idx_in ) + { + if ( st_ivas->hHrtf->num_iterations_diffuse[0] > 0 ) + { + pFreq_buf_re = &st_ivas->hCrend->freq_buffer_re_diffuse[offset_diffuse]; + pFreq_buf_im = &st_ivas->hCrend->freq_buffer_im_diffuse[offset_diffuse]; + pFreq_filt_re = &st_ivas->hCrend->freq_buffer_re[i][offset]; + pFreq_filt_im = &st_ivas->hCrend->freq_buffer_im[i][offset]; + + for ( k = 0; k < st_ivas->hHrtf->index_frequency_max_diffuse; k++ ) + { + pFreq_buf_re[k] += pFreq_filt_re[k] * st_ivas->hHrtf->inv_diffuse_weight[i]; + pFreq_buf_im[k] += pFreq_filt_im[k] * st_ivas->hHrtf->inv_diffuse_weight[i]; + } + } + + pFreq_buf_re = &st_ivas->hCrend->freq_buffer_re[i][offset]; + pFreq_buf_im = &st_ivas->hCrend->freq_buffer_im[i][offset]; + + ivas_mdft( pIn, pFreq_buf_re, pFreq_buf_im, subframe_length, subframe_length ); + i++; + } + } + + for ( j = 0; j < nchan_out; j++ ) + { + set_zero( tmp_out_re, subframe_length ); + set_zero( tmp_out_im, subframe_length ); + + i = 0; + for ( idx_in = 0; idx_in < nchan_intern; idx_in++ ) + { + if ( idx_in != st_ivas->hIntSetup.index_lfe[0] ) + { + offset = 0; + for ( m = 0; m < st_ivas->hHrtf->num_iterations[i][j]; m++ ) + { + offset_in = ( st_ivas->hCrend->delay_line_rw_index + st_ivas->hHrtf->max_num_iterations - st_ivas->hHrtf->num_iterations[i][j] + m + 1 ); + offset_in = offset_in % ( st_ivas->hHrtf->max_num_iterations ); + offset_in = offset_in * subframe_length; + pFreq_buf_re = &st_ivas->hCrend->freq_buffer_re[i][offset_in]; + pFreq_buf_im = &st_ivas->hCrend->freq_buffer_im[i][offset_in]; + pFreq_filt_re = &st_ivas->hHrtf->pOut_to_bin_re[i][j][offset]; + pFreq_filt_im = &st_ivas->hHrtf->pOut_to_bin_im[i][j][offset]; + + for ( k = 0; k < st_ivas->hHrtf->pIndex_frequency_max[i][j][m]; k++ ) + { + tmp_out_re[k] += pFreq_buf_re[k] * pFreq_filt_re[k] - pFreq_buf_im[k] * pFreq_filt_im[k]; + tmp_out_im[k] += pFreq_buf_re[k] * pFreq_filt_im[k] + pFreq_buf_im[k] * pFreq_filt_re[k]; + } + offset = offset + k; + } + i++; + } + } + + offset = 0; + for ( m = 0; m < st_ivas->hHrtf->num_iterations_diffuse[j]; m++ ) + { + offset_diffuse = ( st_ivas->hCrend->diffuse_delay_line_rw_index + m + 1 ); + offset_diffuse = offset_diffuse % st_ivas->hHrtf->num_iterations_diffuse[0]; + offset_diffuse = offset_diffuse * subframe_length; + pFreq_buf_re = &st_ivas->hCrend->freq_buffer_re_diffuse[offset_diffuse]; + pFreq_buf_im = &st_ivas->hCrend->freq_buffer_im_diffuse[offset_diffuse]; + pFreq_filt_re = &st_ivas->hHrtf->pOut_to_bin_diffuse_re[j][offset]; + pFreq_filt_im = &st_ivas->hHrtf->pOut_to_bin_diffuse_im[j][offset]; + + for ( k = 0; k < st_ivas->hHrtf->pIndex_frequency_max_diffuse[j][m]; k++ ) + { + tmp_out_re[k] += pFreq_buf_re[k] * pFreq_filt_re[k] - pFreq_buf_im[k] * pFreq_filt_im[k]; + tmp_out_im[k] += pFreq_buf_re[k] * pFreq_filt_im[k] + pFreq_buf_im[k] * pFreq_filt_re[k]; + } + offset = offset + k; + } + + ivas_imdft( tmp_out_re, tmp_out_im, pOut, subframe_length ); + + pFreq_buf_re = &pcm_out[j][i_ts * subframe_length]; + for ( k = 0; k < subframe_length; k++ ) + { + pFreq_buf_re[k] = pOut[k] + st_ivas->hCrend->prev_out_buffer[j][k]; + st_ivas->hCrend->prev_out_buffer[j][k] = pOut[k + subframe_length]; + } + } + + st_ivas->hCrend->delay_line_rw_index++; + st_ivas->hCrend->delay_line_rw_index = st_ivas->hCrend->delay_line_rw_index % ( st_ivas->hHrtf->max_num_iterations ); + if ( st_ivas->hHrtf->num_iterations_diffuse[0] > 0 ) + { + st_ivas->hCrend->diffuse_delay_line_rw_index++; + st_ivas->hCrend->diffuse_delay_line_rw_index = st_ivas->hCrend->diffuse_delay_line_rw_index % ( st_ivas->hHrtf->num_iterations_diffuse[0] ); + } + + return IVAS_ERR_OK; +} +#endif + +#ifndef FIX_197_CREND_INTERFACE + +/*-----------------------------------------------------------------------------------------* + * Function ivas_crend_process() + * + * Process call for IVAS Crend renderer + *-----------------------------------------------------------------------------------------*/ + +ivas_error ivas_crend_process( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float output[][L_FRAME48k] /* i/o: input/output audio channels */ +) +{ + int16_t i, nchan_out, output_frame; + int16_t subframe_len, subframe_idx; + float pcm_tmp[BINAURAL_CHANNELS][L_FRAME48k]; + AUDIO_CONFIG intern_config; + ivas_error error; + + push_wmops( "ivas_crend_process" ); + + intern_config = st_ivas->intern_config; + nchan_out = st_ivas->hDecoderConfig->nchan_out; + output_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + subframe_len = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES; + + for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) + { + if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData && st_ivas->hHeadTrackData->num_quaternions >= 0 ) + { + /* Orientation tracking */ + if ( st_ivas->hCrend->hTrack != NULL ) + { + if ( st_ivas->hDecoderConfig->orientation_tracking == IVAS_ORIENT_TRK_AVG ) + { + ivas_orient_trk_SetTrackingType( st_ivas->hCrend->hTrack, OTR_TRACKING_AVG_ORIENT ); + } + else + { + ivas_orient_trk_SetTrackingType( st_ivas->hCrend->hTrack, OTR_TRACKING_REF_ORIENT ); + } + + /* get current subframe quaternion and convert to euler angles */ + Quat2Euler( st_ivas->hHeadTrackData->Quaternions[subframe_idx], &( st_ivas->hCrend->m_fYaw ), &( st_ivas->hCrend->m_fPitch ), &( st_ivas->hCrend->m_fRoll ) ); + ivas_orient_trk_SetAbsoluteOrientation( st_ivas->hCrend->hTrack, st_ivas->hCrend->m_fYaw, st_ivas->hCrend->m_fPitch, st_ivas->hCrend->m_fRoll ); + ivas_orient_trk_Process( st_ivas->hCrend->hTrack ); + ivas_orient_trk_GetTrackedOrientation( st_ivas->hCrend->hTrack, &( st_ivas->hCrend->m_fYaw ), &( st_ivas->hCrend->m_fPitch ), &( st_ivas->hCrend->m_fRoll ) ); + } + + /* Rotation in SHD for: + MC with elevation (5_1_2 / 5_1_4 / 7_1_4) -> BINAURAL + SBA SPAR -> BINAURAL or BINAURAL_ROOM + */ + if ( intern_config == AUDIO_CONFIG_FOA || intern_config == AUDIO_CONFIG_HOA2 || intern_config == AUDIO_CONFIG_HOA3 ) + { + rotateFrame_shd( st_ivas->hHeadTrackData, output, subframe_len, st_ivas->hIntSetup, subframe_idx ); + } + /* Rotation in SD for MC -> BINAURAL_ROOM */ + else if ( st_ivas->ivas_format != ISM_FORMAT && st_ivas->hIntSetup.is_loudspeaker_setup ) + { + rotateFrame_sd( st_ivas->hHeadTrackData, output, subframe_len, st_ivas->hIntSetup, st_ivas->hEFAPdata, subframe_idx ); + } + } + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + { + if ( ( intern_config == AUDIO_CONFIG_FOA ) || ( intern_config == AUDIO_CONFIG_HOA2 ) || ( intern_config == AUDIO_CONFIG_HOA3 ) || + ( intern_config == AUDIO_CONFIG_5_1 ) || ( intern_config == AUDIO_CONFIG_7_1 ) || + ( intern_config == AUDIO_CONFIG_5_1_2 ) || ( intern_config == AUDIO_CONFIG_5_1_4 ) || ( intern_config == AUDIO_CONFIG_7_1_4 ) ) + { + ivas_crend_convolver( st_ivas, output, pcm_tmp, subframe_idx ); + + if ( st_ivas->hCrend->hReverb != NULL ) + { + if ( ( error = ivas_reverb_process( st_ivas->hCrend->hReverb, intern_config, 1, output, pcm_tmp, subframe_idx ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else + { + return IVAS_ERR_INVALID_INPUT_FORMAT; + } + } + else + { + return IVAS_ERR_INTERNAL_FATAL; + } + } + + /* move to output */ + for ( i = 0; i < nchan_out; i++ ) + { + mvr2r( pcm_tmp[i], output[i], output_frame ); + } + + pop_wmops(); + + return IVAS_ERR_OK; +} +#endif + + /*------------------------------------------------------------------------- * initCrend_from_rom() * @@ -197,10 +1416,17 @@ static ivas_error ivas_rend_initCrend( /* set BRIR flag */ use_brir = false; +#ifdef FIX_197_CREND_INTERFACE if ( ( ( hRendCfg != NULL ) && hRendCfg->roomAcoustics.use_brir ) || ( ( hRendCfg == NULL ) && ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) ) ) { use_brir = true; } +#else + if ( ( hRendCfg != NULL && hRendCfg->roomAcoustics.use_brir ) || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) + { + use_brir = true; + } +#endif if ( ( error = getAudioConfigNumChannels( inConfig, &nchan_in ) ) != IVAS_ERR_OK ) @@ -667,6 +1893,8 @@ static ivas_error ivas_rend_initCrend( return IVAS_ERR_OK; } +#ifdef FIX_197_CREND_INTERFACE +#ifdef FIX_329_ENABLE_TD_RENDERER_REVERB_MC /*------------------------------------------------------------------------- * ivas_rend_initCrendWrapper() * @@ -722,6 +1950,8 @@ ivas_error ivas_rend_initCrendWrapper( return IVAS_ERR_OK; } +#endif +#endif /*------------------------------------------------------------------------- * ivas_rend_openCrend() * @@ -729,11 +1959,15 @@ ivas_error ivas_rend_initCrendWrapper( *------------------------------------------------------------------------*/ ivas_error ivas_rend_openCrend( +#ifdef FIX_197_CREND_INTERFACE CREND_WRAPPER_HANDLE *pCrend, +#else + CREND_WRAPPER *pCrend, +#endif const AUDIO_CONFIG inConfig, const AUDIO_CONFIG outConfig, RENDER_CONFIG_DATA *hRendCfg, -#ifndef FIX_I109_ORIENTATION_TRACKING +#ifdef FIX_197_CREND_INTERFACE int16_t Opt_Headrotation, #endif HRTFS_CREND_HANDLE hSetOfHRTF, @@ -747,14 +1981,35 @@ ivas_error ivas_rend_openCrend( ivas_error error; error = IVAS_ERR_OK; +#ifdef FIX_197_CREND_INTERFACE +#ifdef FIX_329_ENABLE_TD_RENDERER_REVERB_MC if ( ( error = ivas_rend_initCrendWrapper( pCrend ) ) != IVAS_ERR_OK ) { return error; } hCrend = ( *pCrend )->hCrend; +#else + if ( pCrend == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend Wrapper\n" ); + } + + if ( *pCrend == NULL ) + { + if ( ( *pCrend = (CREND_WRAPPER_HANDLE) malloc( sizeof( CREND_WRAPPER ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend Wrapper\n" ); + } + ( *pCrend )->binaural_latency_ns = 0; + ( *pCrend )->hCrend = NULL; + ( *pCrend )->hHrtfCrend = NULL; + } +#endif +#endif subframe_length = (int16_t) ( output_Fs / FRAMES_PER_SEC ) / MAX_PARAM_SPATIAL_SUBFRAMES; +#ifdef FIX_197_CREND_INTERFACE if ( ( *pCrend )->hHrtfCrend == NULL ) { if ( ( error = ivas_rend_initCrend( *pCrend, inConfig, outConfig, hRendCfg, hSetOfHRTF, output_Fs ) ) != IVAS_ERR_OK ) @@ -762,8 +2017,53 @@ ivas_error ivas_rend_openCrend( return error; } } +#else + if ( pCrend->hHrtfCrend == NULL ) + { + if ( ( error = ivas_rend_initCrend( pCrend, inConfig, outConfig, hRendCfg, hSetOfHRTF, output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + } +#endif + +#ifndef FIX_329_ENABLE_TD_RENDERER_REVERB_MC + + if ( ( hCrend = (CREND_HANDLE) malloc( sizeof( CREND_DATA ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for renderer handle" ); + } + + hCrend->lfe_delay_line = NULL; + + for ( i = 0; i < MAX_INTERN_CHANNELS; i++ ) + { + hCrend->freq_buffer_re[i] = NULL; + hCrend->freq_buffer_im[i] = NULL; + } + + for ( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + hCrend->prev_out_buffer[i] = NULL; + } + + hCrend->freq_buffer_re_diffuse = NULL; + hCrend->freq_buffer_im_diffuse = NULL; + hCrend->hReverb = NULL; + hCrend->delay_line_rw_index = 0; + hCrend->diffuse_delay_line_rw_index = 0; + hCrend->hTrack = NULL; + hCrend->m_fYaw = 0; + hCrend->m_fPitch = 0; + hCrend->m_fRoll = 0; +#endif + +#ifdef FIX_197_CREND_INTERFACE hHrtf = ( *pCrend )->hHrtfCrend; +#else + hHrtf = pCrend->hHrtfCrend; +#endif if ( hHrtf != NULL ) { @@ -828,10 +2128,35 @@ ivas_error ivas_rend_openCrend( { hCrend->lfe_delay_line = NULL; } +#ifdef FIX_197_CREND_INTERFACE + if ( Opt_Headrotation ) +#else + if ( false ) /* TODO tmu : check renderer headrotation flag */ +#endif + { + if ( ( hCrend->hTrack = (ivas_orient_trk_state_t *) malloc( sizeof( ivas_orient_trk_state_t ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Orientation tracking" ); + } + + ivas_orient_trk_Init( hCrend->hTrack ); + } + else + { + hCrend->hTrack = NULL; + } if ( ( hRendCfg != NULL ) && ( hRendCfg->roomAcoustics.late_reverb_on ) ) { - if ( ( error = ivas_reverb_open( &( hCrend->hReverb ), inConfig, ( *pCrend )->hHrtfCrend, hRendCfg, output_Fs ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_reverb_open( &( hCrend->hReverb ), + inConfig, +#ifdef FIX_197_CREND_INTERFACE + ( *pCrend )->hHrtfCrend, +#else + pCrend->hHrtfCrend, +#endif + hRendCfg, + output_Fs ) ) != IVAS_ERR_OK ) { return error; } @@ -841,27 +2166,45 @@ ivas_error ivas_rend_openCrend( hCrend->hReverb = NULL; } +#ifdef FIX_197_CREND_INTERFACE ( *pCrend )->binaural_latency_ns = (int32_t) ( ( *pCrend )->hHrtfCrend->latency_s * 1000000000.f ); +#else + pCrend->binaural_latency_ns = (int32_t) ( pCrend->hHrtfCrend->latency_s * 1000000000.f ); +#endif } +#ifdef FIX_197_CREND_INTERFACE ( *pCrend )->hCrend = hCrend; +#else + pCrend->hCrend = hCrend; +#endif return IVAS_ERR_OK; } - /*------------------------------------------------------------------------- * ivas_crend_close() * * Deallocate Crend renderer handle *------------------------------------------------------------------------*/ +#ifdef FIX_197_CREND_INTERFACE void ivas_rend_closeCrend( CREND_WRAPPER_HANDLE *pCrend ) +#else +ivas_error ivas_rend_closeCrend( + CREND_WRAPPER *pCrend ) +#endif { int16_t i; - if ( pCrend == NULL || *pCrend == NULL ) +#ifdef FIX_197_CREND_INTERFACE + if ( pCrend == NULL ) + { + return; + } + + if ( *pCrend == NULL ) { return; } @@ -927,10 +2270,71 @@ void ivas_rend_closeCrend( free( *pCrend ); *pCrend = NULL; } - return; -} +#else + if ( pCrend->hHrtfCrend != NULL ) + { + ivas_hrtf_close( &pCrend->hHrtfCrend ); + } + + if ( pCrend->hCrend != NULL ) + { + + for ( i = 0; i < MAX_INTERN_CHANNELS; i++ ) + { + if ( pCrend->hCrend->freq_buffer_re[i] != NULL ) + { + free( pCrend->hCrend->freq_buffer_re[i] ); + pCrend->hCrend->freq_buffer_re[i] = NULL; + } + if ( pCrend->hCrend->freq_buffer_im[i] != NULL ) + { + free( pCrend->hCrend->freq_buffer_im[i] ); + pCrend->hCrend->freq_buffer_im[i] = NULL; + } + } + + for ( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + if ( pCrend->hCrend->prev_out_buffer[i] != NULL ) + { + free( pCrend->hCrend->prev_out_buffer[i] ); + pCrend->hCrend->prev_out_buffer[i] = NULL; + } + } + + if ( pCrend->hCrend->lfe_delay_line != NULL ) + { + free( pCrend->hCrend->lfe_delay_line ); + pCrend->hCrend->lfe_delay_line = NULL; + } + + if ( pCrend->hCrend->freq_buffer_re_diffuse != NULL ) + { + free( pCrend->hCrend->freq_buffer_re_diffuse ); + pCrend->hCrend->freq_buffer_re_diffuse = NULL; + } + + if ( pCrend->hCrend->freq_buffer_im_diffuse != NULL ) + { + free( pCrend->hCrend->freq_buffer_im_diffuse ); + pCrend->hCrend->freq_buffer_im_diffuse = NULL; + } + + if ( pCrend->hCrend->hTrack != NULL ) + { + free( pCrend->hCrend->hTrack ); + pCrend->hCrend->hTrack = NULL; + } + + ivas_reverb_close( &pCrend->hCrend->hReverb ); + free( pCrend->hCrend ); + pCrend->hCrend = NULL; + } + return IVAS_ERR_OK; +#endif +} /*-----------------------------------------------------------------------------------------* * Function ivas_crend_convolver() @@ -1104,14 +2508,20 @@ ivas_error ivas_rend_crendProcess( const CREND_WRAPPER *pCrend, const AUDIO_CONFIG inConfig, const AUDIO_CONFIG outConfig, +#ifdef FIX_197_CREND_INTERFACE DECODER_CONFIG_HANDLE hDecoderConfig, HEAD_TRACK_DATA_HANDLE hHeadTrackData, IVAS_OUTPUT_SETUP_HANDLE hIntSetup, EFAP_HANDLE hEFAPdata, +#endif float output[][L_FRAME48k], /* i/o: input/output audio channels */ const int32_t output_Fs ) { +#ifdef FIX_197_CREND_INTERFACE int16_t i, subframe_idx, output_frame, subframe_len; +#else + int16_t i, subframe_idx, output_frame; +#endif int16_t nchan_out; float pcm_tmp[BINAURAL_CHANNELS][L_FRAME48k]; AUDIO_CONFIG in_config; @@ -1125,7 +2535,11 @@ ivas_error ivas_rend_crendProcess( inRendConfig = getRendAudioConfigFromIvasAudioConfig( inConfig ); outRendConfig = getRendAudioConfigFromIvasAudioConfig( outConfig ); +#ifdef FIX_197_CREND_INTERFACE in_config = getIvasAudioConfigFromRendAudioConfig( inRendConfig ); +#else + in_config = rendAudioConfigToIvasAudioConfig( inRendConfig ); +#endif inConfigType = getAudioConfigType( inRendConfig ); @@ -1135,13 +2549,15 @@ ivas_error ivas_rend_crendProcess( } output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC ); +#ifdef FIX_197_CREND_INTERFACE subframe_len = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES; +#endif for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) { +#ifdef FIX_197_CREND_INTERFACE if ( hDecoderConfig && hDecoderConfig->Opt_Headrotation && hHeadTrackData && hHeadTrackData->num_quaternions >= 0 ) { /* Orientation tracking */ -#ifndef FIX_I109_ORIENTATION_TRACKING if ( pCrend->hCrend->hTrack != NULL ) { if ( hDecoderConfig->orientation_tracking == IVAS_ORIENT_TRK_AVG ) @@ -1164,7 +2580,6 @@ ivas_error ivas_rend_crendProcess( ivas_orient_trk_GetTrackedOrientation( pCrend->hCrend->hTrack, &( pCrend->hCrend->m_fYaw ), &( pCrend->hCrend->m_fPitch ), &( pCrend->hCrend->m_fRoll ) ); } -#endif /* Rotation in SHD for: MC with elevation (5_1_2 / 5_1_4 / 7_1_4) -> BINAURAL @@ -1180,6 +2595,7 @@ ivas_error ivas_rend_crendProcess( rotateFrame_sd( hHeadTrackData, output, subframe_len, *hIntSetup, hEFAPdata, subframe_idx ); } } +#endif if ( ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) || ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) ) { diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 58de4819e8..020dd27cfa 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -139,7 +139,22 @@ ivas_error ivas_dirac_dec_init_binaural_data( set_zero( hBinaural->ChCrossImOutPrev, nBins ); hBinaural->renderStereoOutputInsteadOfBinaural = 0; +#ifdef FIX_107_5MS_SUBFRAME_RENDERING hBinaural->useSubframeMode = 1; +#else + if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR ) /* Use subframe-mode with SPAR, since the metadata is not in sync on a frame level */ + { + hBinaural->useSubframeMode = 1; + } + else + { +#ifdef DEBUGGING + hBinaural->useSubframeMode = st_ivas->hDecoderConfig->forceSubframeBinauralization; +#else + hBinaural->useSubframeMode = 0; /* Default to 20 ms mode. */ +#endif + } +#endif hBinaural->useTdDecorr = 0; if ( st_ivas->ivas_format == SBA_FORMAT ) @@ -284,7 +299,7 @@ void ivas_dirac_dec_close_binaural_data( DIRAC_DEC_BIN_HANDLE *hBinaural /* i/o: decoder DirAC binaural data handle */ ) { - if ( hBinaural == NULL || *hBinaural == NULL ) + if ( *hBinaural == NULL ) { return; } diff --git a/lib_rend/ivas_hrtf.c b/lib_rend/ivas_hrtf.c index 2b1f16d025..b53c636932 100644 --- a/lib_rend/ivas_hrtf.c +++ b/lib_rend/ivas_hrtf.c @@ -116,6 +116,7 @@ void ivas_HRTF_CRend_binary_close( return; } + free( *hSetOfHRTF ); *hSetOfHRTF = NULL; @@ -201,3 +202,38 @@ void ivas_HRTF_parambin_binary_close( return; } + + +/*-----------------------------------------------------------------------* + * ivas_headTrack_open() + * + * Allocate and initialize Head-Tracking handle + *-----------------------------------------------------------------------*/ + +ivas_error ivas_headTrack_open( + HEAD_TRACK_DATA_HANDLE *hHeadTrackData /* o : head track handle */ +) +{ + int16_t i; + + /* Allocate Head-Tracking handle */ + if ( ( *hHeadTrackData = (HEAD_TRACK_DATA_HANDLE) malloc( sizeof( HEAD_TRACK_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for head-tracking memory\n" ) ); + } + + /* Initialization */ + ( *hHeadTrackData )->num_quaternions = 0; + ( *hHeadTrackData )->lrSwitchInterpVal = 0.0f; + ( *hHeadTrackData )->lrSwitchedCurrent = 0; + ( *hHeadTrackData )->lrSwitchedNext = 0; + + /* Initialise Rmat_prev to I, Rmat will be computed later */ + for ( i = 0; i < 3; i++ ) + { + set_zero( ( *hHeadTrackData )->Rmat_prev[i], 3 ); + ( *hHeadTrackData )->Rmat_prev[i][i] = 1.0f; + } + + return IVAS_ERR_OK; +} diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 67f73fab30..a8be0b5ba3 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -30,7 +30,6 @@ *******************************************************************************************************/ -#include "ivas_stat_rend.h" #include #include "options.h" #include "prot.h" @@ -48,9 +47,6 @@ *---------------------------------------------------------------------*/ static void TDREND_Clear_Update_flags( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd ); -#ifdef TD5 -static void angles_to_vec( const float radius, const float azimuth, const float elevation, float *vec ); -#endif /*---------------------------------------------------------------------* * ivas_td_binaural_open_unwrap() @@ -59,14 +55,11 @@ static void angles_to_vec( const float radius, const float azimuth, const float *---------------------------------------------------------------------*/ ivas_error ivas_td_binaural_open_unwrap( - TDREND_HRFILT_FiltSet_t **hHrtfTD, /* i/o: HR filter model (from file or NULL) */ - const int32_t output_Fs, /* i : Output sampling rate */ - const int16_t nchan_transport, /* i : Number of channels */ - const IVAS_FORMAT ivas_format, /* i : IVAS format (ISM/MC) */ - const AUDIO_CONFIG transport_config, /* i : Transport configuration */ -#ifdef TD5 - const float *directivity, /* i : Directivity pattern (used for ISM) */ -#endif + TDREND_HRFILT_FiltSet_t **hHrtfTD, /* i/o: HR filter model (from file or NULL) */ + const int32_t output_Fs, /* i : Output sampling rate */ + const int16_t nchan_transport, /* i : Number of channels */ + const IVAS_FORMAT ivas_format, /* i : IVAS format (ISM/MC) */ + const AUDIO_CONFIG transport_config, /* i : Transport configuration */ const IVAS_OUTPUT_SETUP hTransSetup, /* i : Loudspeaker layout */ BINAURAL_TD_OBJECT_RENDERER_HANDLE *hBinRendererTd, /* o : TD renderer handle */ int32_t *binaural_latency_ns /* i : Binauralization delay */ @@ -175,13 +168,9 @@ ivas_error ivas_td_binaural_open_unwrap( for ( nS = 0; nS < nchan_rend; nS++ ) { /* Set source positions according to loudspeaker layout */ -#ifdef TD5 - angles_to_vec( 1.0f, ls_azimuth[nS], ls_elevation[nS], Pos ); -#else Pos[0] = cosf( ls_elevation[nS] * PI_OVER_180 ) * cosf( ls_azimuth[nS] * PI_OVER_180 ); Pos[1] = cosf( ls_elevation[nS] * PI_OVER_180 ) * sinf( ls_azimuth[nS] * PI_OVER_180 ); Pos[2] = sinf( ls_elevation[nS] * PI_OVER_180 ); -#endif Dir[0] = 1.0f; Dir[1] = 0.0f; Dir[2] = 0.0f; @@ -197,35 +186,6 @@ ivas_error ivas_td_binaural_open_unwrap( TDREND_MIX_SRC_SetDirAtten( pBinRendTd, nS, DirAtten_p ); } } -#ifdef TD5 - if ( ivas_format == ISM_FORMAT ) - { - DirAtten_p = pBinRendTd->DirAtten_p; -#ifdef TD5_FIX_INVALID_MEMORY_ACCESS - if ( NULL == directivity ) - { - DirAtten_p->ConeInnerAngle = 360.0f; /* Front cone */ - DirAtten_p->ConeOuterAngle = 360.0f; /* Back cone */ - DirAtten_p->ConeOuterGain = 1.0f; /* Back attenuation */ - } - else - { - DirAtten_p->ConeInnerAngle = directivity[0]; - DirAtten_p->ConeOuterAngle = directivity[1]; - DirAtten_p->ConeOuterGain = directivity[2]; - } -#else - DirAtten_p->ConeInnerAngle = directivity[0]; - DirAtten_p->ConeOuterAngle = directivity[1]; - DirAtten_p->ConeOuterGain = directivity[2]; -#endif - - for ( nS = 0; nS < nchan_rend; nS++ ) - { - TDREND_MIX_SRC_SetDirAtten( pBinRendTd, nS, DirAtten_p ); - } - } -#endif *hBinRendererTd = pBinRendTd; *binaural_latency_ns = (int32_t) ( ( *hBinRendererTd )->HrFiltSet_p->latency_s * 1000000000.f ); @@ -267,20 +227,30 @@ void ivas_td_binaural_close( *---------------------------------------------------------------------*/ ivas_error ivas_td_binaural_renderer_unwrap( - const REVERB_HANDLE hReverb, /* i : Reverberator handle */ - const AUDIO_CONFIG transport_config, /* i : Transport configuration */ +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND + REVERB_HANDLE hReverb, /* i : reverb handle */ +#else + RENDER_CONFIG_DATA *hRenderConfig, /* i : Renderer configuration */ + const int16_t ini_frame, /* i : Initialization frame counter */ +#ifdef FIX_197_CREND_INTERFACE + CREND_WRAPPER_HANDLE hCrendWrapper, /* i : Crend wrapper handle */ +#else + CREND_HANDLE hCrend, /* i : Crend handle */ +#endif +#endif + AUDIO_CONFIG transport_config, /* i : Transport configuration */ +#ifndef FIX_330_ENABLE_TD_RENDERER_REVERB_REND + const int32_t output_Fs, /* i : Output sampling rate */ +#endif BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD binaural object renderer handle */ - const int16_t num_src, /* i : number of sources to render */ + const int16_t nchan_transport, /* i : Transport channels (ISms) */ const int16_t lfe_idx, /* i : LFE channel index */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ + IVAS_FORMAT ivas_format, /* i : IVAS format */ ISM_METADATA_HANDLE *hIsmMetaData, /* i : ISM metadata handle */ const int16_t Opt_Headrotation, /* i : Head rotation flag */ const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ -#ifdef TD5 - const IVAS_POSITION *Pos, /* i : Listener position data per subframe */ -#endif - float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ - const int16_t output_frame /* i : output frame length */ + float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ + const int16_t output_frame /* i : output frame length */ ) { int16_t subframe_length; @@ -289,25 +259,68 @@ ivas_error ivas_td_binaural_renderer_unwrap( ivas_error error; subframe_length = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES; +#ifndef FIX_330_ENABLE_TD_RENDERER_REVERB_REND + if ( hRenderConfig != NULL ) + { + + if ( hRenderConfig->roomAcoustics.late_reverb_on && ( ini_frame == 0 ) ) + { + ivas_reverb_open( +#ifdef FIX_197_CREND_INTERFACE + &hCrendWrapper->hCrend->hReverb, +#else + &hCrend->hReverb, +#endif + transport_config, + NULL, + hRenderConfig, + output_Fs ); + } + } +#endif /* Update object position(s) */ - TDREND_Update_object_positions( hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, output ); + TDREND_Update_object_positions( hBinRendererTd, nchan_transport, lfe_idx, ivas_format, hIsmMetaData, output ); for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) { /* Update the listener's location/orientation */ -#ifdef TD5 - TDREND_Update_listener_orientation( hBinRendererTd, Opt_Headrotation, ( Quaternions != NULL ) ? &Quaternions[subframe_idx] : NULL, ( Pos != NULL ) ? &Pos[subframe_idx] : NULL ); -#else TDREND_Update_listener_orientation( hBinRendererTd, Opt_Headrotation, ( Quaternions != NULL ) ? &Quaternions[subframe_idx] : NULL ); -#endif - if ( hReverb != NULL && hReverb->pConfig.roomAcoustics.late_reverb_on ) +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND + if ( ( hReverb != NULL ) && ( hReverb->pConfig.roomAcoustics.late_reverb_on ) ) +#else + if ( ( hRenderConfig != NULL ) && ( hRenderConfig->roomAcoustics.late_reverb_on ) ) +#endif { - if ( ( error = ivas_reverb_process( hReverb, transport_config, 0, output, reverb_signal, subframe_idx ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_reverb_process( +#ifdef FIX_197_CREND_INTERFACE +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND + hReverb, +#else + hCrendWrapper->hCrend->hReverb, +#endif +#else + hCrend->hReverb, +#endif + transport_config, 0, output, reverb_signal, subframe_idx ) ) != IVAS_ERR_OK ) { return error; } + +#ifndef FIX_330_ENABLE_TD_RENDERER_REVERB_REND + ivas_reverb_process( +#ifdef FIX_197_CREND_INTERFACE + hCrendWrapper->hCrend->hReverb, +#else + hCrend->hReverb, +#endif + transport_config, + 0, + output, + reverb_signal, + subframe_idx ); +#endif } /* Render subframe */ @@ -318,12 +331,24 @@ ivas_error ivas_td_binaural_renderer_unwrap( } - if ( hReverb != NULL && hReverb->pConfig.roomAcoustics.late_reverb_on ) +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND + if ( ( hReverb != NULL ) && ( hReverb->pConfig.roomAcoustics.late_reverb_on ) ) { /* add reverb to rendered signals */ v_add( reverb_signal[0], output[0], output[0], output_frame ); v_add( reverb_signal[1], output[1], output[1], output_frame ); } +#else + if ( hRenderConfig != NULL ) /* Renderer Configuration not enabled in TD standalone renderer */ + { + if ( hRenderConfig->roomAcoustics.late_reverb_on ) + { + /* add reverb to rendered signals */ + v_add( reverb_signal[0], output[0], output[0], output_frame ); + v_add( reverb_signal[1], output[1], output[1], output_frame ); + } + } +#endif return IVAS_ERR_OK; } @@ -337,7 +362,7 @@ ivas_error ivas_td_binaural_renderer_unwrap( ivas_error TDREND_GetMix( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ - float output[][L_FRAME48k], /* i/o: ISM object synth / rendered output in 0,1 */ + float output[][L_FRAME48k], /* i/o: ISm object synth / rendered output in 0,1 */ const int16_t subframe_length, /* i/o: subframe length */ const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ ) @@ -426,7 +451,7 @@ static void TDREND_Clear_Update_flags( void TDREND_Update_object_positions( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o : TD Renderer handle */ - const int16_t num_src, /* i : number of sources to render */ + const int16_t numSources, /* i : Number of sources to render */ const int16_t lfe_idx, /* i : Input LFE index */ const IVAS_FORMAT in_format, /* i : Format of input sources */ const ISM_METADATA_HANDLE *hIsmMetaData, /* i : Input metadata for ISM objects */ @@ -443,7 +468,7 @@ void TDREND_Update_object_positions( /* For each source, write the frame data to the source object*/ c_indx = 0; - for ( nS = 0; nS < num_src; nS++ ) + for ( nS = 0; nS < numSources; nS++ ) { if ( !( in_format == MC_FORMAT && nS == lfe_idx ) ) /* Skip LFE for MC */ { @@ -457,10 +482,6 @@ void TDREND_Update_object_positions( /* Update the source positions */ /* Source position and direction */ -#ifdef TD5 - angles_to_vec( hIsmMetaData[nS]->radius, hIsmMetaData[nS]->azimuth, hIsmMetaData[nS]->elevation, Pos ); - angles_to_vec( 1.0f, hIsmMetaData[nS]->yaw, hIsmMetaData[nS]->pitch, Dir ); -#else Pos[0] = cosf( hIsmMetaData[nS]->elevation * PI_OVER_180 ) * cosf( hIsmMetaData[nS]->azimuth * PI_OVER_180 ); Pos[1] = cosf( hIsmMetaData[nS]->elevation * PI_OVER_180 ) * sinf( hIsmMetaData[nS]->azimuth * PI_OVER_180 ); Pos[2] = sinf( hIsmMetaData[nS]->elevation * PI_OVER_180 ); @@ -468,7 +489,6 @@ void TDREND_Update_object_positions( Dir[1] = 0.0f; Dir[2] = 0.0f; -#endif /* Source directivity info */ DirAtten_p->ConeInnerAngle = 360.0f; DirAtten_p->ConeOuterAngle = 360.0f; @@ -495,29 +515,19 @@ void TDREND_Update_object_positions( void TDREND_Update_listener_orientation( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD Renderer handle */ const int16_t headRotEnabled, /* i : Headrotation flag */ -#ifdef TD5 - const IVAS_QUATERNION *headPosition, /* i : Listener orientation */ - const IVAS_POSITION *Pos /* i : Listener Position */ -#else - const IVAS_QUATERNION *headPosition /* i : Head Position */ -#endif + const IVAS_QUATERNION *headPosition /* i : Head Position */ ) { -#ifndef TD5 float Pos[3]; -#endif float FrontVec[3]; float UpVec[3]; float Rmat[3][3]; -#ifdef TD5 - float Pos_p[3]; -#else + /* Update the listener's location/orientation */ /* Listener at the origin */ Pos[0] = 0.0f; Pos[1] = 0.0f; Pos[2] = 0.0f; -#endif if ( headRotEnabled ) { @@ -531,12 +541,6 @@ void TDREND_Update_listener_orientation( UpVec[0] = Rmat[2][0]; UpVec[1] = Rmat[2][1]; UpVec[2] = Rmat[2][2]; -#ifdef TD5 - /* Input position */ - Pos_p[0] = ( *Pos ).x; - Pos_p[1] = ( *Pos ).y; - Pos_p[2] = ( *Pos ).z; -#endif } else { @@ -548,20 +552,10 @@ void TDREND_Update_listener_orientation( UpVec[0] = 0.0f; UpVec[1] = 0.0f; UpVec[2] = 1.0f; -#ifdef TD5 - /* Listener at the origin */ - Pos_p[0] = 0.0f; - Pos_p[1] = 0.0f; - Pos_p[2] = 0.0f; -#endif } /* Set the listener position and orientation:*/ -#ifdef TD5 - TDREND_MIX_LIST_SetPos( hBinRendererTd, Pos_p ); -#else TDREND_MIX_LIST_SetPos( hBinRendererTd, Pos ); -#endif TDREND_MIX_LIST_SetOrient( hBinRendererTd, FrontVec, UpVec ); return; @@ -577,9 +571,6 @@ void TDREND_Update_listener_orientation( ivas_error ivas_td_binaural_open_ext( TDREND_WRAPPER *pTDRend, IVAS_REND_AudioConfig inConfig, -#ifdef TD5 - RENDER_CONFIG_DATA *hRendCfg, /* i : Renderer configuration */ -#endif LSSETUP_CUSTOM_STRUCT *customLsInput, const int32_t outFs ) { @@ -588,9 +579,6 @@ ivas_error ivas_td_binaural_open_ext( IVAS_FORMAT ivas_format; IVAS_OUTPUT_SETUP hTransSetup; ivas_error error; -#ifdef TD5_FIX_INVALID_MEMORY_ACCESS - float *directivity = NULL; -#endif if ( inConfig != IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) { @@ -604,25 +592,16 @@ ivas_error ivas_td_binaural_open_ext( nchan_transport = customLsInput->num_spk; } +#ifdef FIX_197_CREND_INTERFACE transport_config = getIvasAudioConfigFromRendAudioConfig( inConfig ); +#else + transport_config = rendAudioConfigToIvasAudioConfig( inConfig ); +#endif ivas_format = ( getAudioConfigType( inConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ? MC_FORMAT : ISM_FORMAT; hTransSetup.ls_azimuth = customLsInput->ls_azimuth; hTransSetup.ls_elevation = customLsInput->ls_elevation; -#ifdef TD5 -#ifdef TD5_FIX_INVALID_MEMORY_ACCESS - if ( NULL != hRendCfg ) - { - directivity = hRendCfg->directivity; - } - - return ivas_td_binaural_open_unwrap( &pTDRend->hHrtfTD, outFs, nchan_transport, ivas_format, transport_config, directivity, hTransSetup, &pTDRend->hBinRendererTd, &pTDRend->binaural_latency_ns ); -#else - return ivas_td_binaural_open_unwrap( &pTDRend->hHrtfTD, outFs, nchan_transport, ivas_format, transport_config, hRendCfg->directivity, hTransSetup, &pTDRend->hBinRendererTd, &pTDRend->binaural_latency_ns ); -#endif -#else return ivas_td_binaural_open_unwrap( &pTDRend->hHrtfTD, outFs, nchan_transport, ivas_format, transport_config, hTransSetup, &pTDRend->hBinRendererTd, &pTDRend->binaural_latency_ns ); -#endif } @@ -639,19 +618,28 @@ ivas_error ivas_td_binaural_renderer_ext( const LSSETUP_CUSTOM_STRUCT *customLsInput, /* i : Input custom loudspeaker layout */ const IVAS_REND_HeadRotData *headRotData, /* i : Input head positions */ const IVAS_REND_AudioObjectPosition *currentPos, /* i : Object position */ - const REVERB_HANDLE hReverb, /* i : Reverberator handle */ - const int16_t output_frame, /* i : output frame length */ - float output[][L_FRAME48k] /* i/o: SCE channels / Binaural synthesis */ +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND + const REVERB_HANDLE reverb, /* i : reverb handle */ +#endif + const int16_t output_frame, /* i : output frame length */ + float output[][L_FRAME48k] /* i/o: SCE channels / Binaural synthesis */ ) { ISM_METADATA_FRAME hIsmMetaDataFrame; ISM_METADATA_HANDLE hIsmMetaData[1]; int16_t lfe_idx; int16_t num_src; +#ifndef FIX_330_ENABLE_TD_RENDERER_REVERB_REND + /* TODO tmu : pass down renderer config struct */ + // float reverb_signal[BINAURAL_CHANNELS][L_FRAME48k]; +#endif IVAS_FORMAT ivas_format; IVAS_REND_AudioConfigType inConfigType; AUDIO_CONFIG transport_config; ivas_error error; +#ifndef FIX_330_ENABLE_TD_RENDERER_REVERB_REND + int32_t output_Fs; +#endif push_wmops( "ivas_td_binaural_renderer_ext" ); @@ -662,7 +650,9 @@ ivas_error ivas_td_binaural_renderer_ext( if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) { ivas_format = MC_FORMAT; +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND transport_config = getIvasAudioConfigFromRendAudioConfig( inConfig ); +#endif if ( inConfig != IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) { if ( ( error = getAudioConfigNumChannels( inConfig, &num_src ) ) != IVAS_ERR_OK ) @@ -680,51 +670,38 @@ ivas_error ivas_td_binaural_renderer_ext( { ivas_format = ISM_FORMAT; num_src = 1; +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND transport_config = AUDIO_CONFIG_ISM1; +#endif hIsmMetaData[0] = &hIsmMetaDataFrame; hIsmMetaData[0]->azimuth = currentPos->azimuth; hIsmMetaData[0]->elevation = currentPos->elevation; -#ifdef TD5 - hIsmMetaData[0]->yaw = currentPos->yaw; - hIsmMetaData[0]->pitch = currentPos->pitch; - hIsmMetaData[0]->radius = currentPos->radius; -#endif } - if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, - ( headRotData != NULL ) ? headRotData->headPositions : NULL, -#ifdef TD5 - ( headRotData != NULL ) ? headRotData->Pos : NULL, output, output_frame ) ) != IVAS_ERR_OK ) +#ifndef FIX_330_ENABLE_TD_RENDERER_REVERB_REND +#ifdef FIX_197_CREND_INTERFACE + transport_config = getIvasAudioConfigFromRendAudioConfig( inConfig ); #else - output, output_frame ) ) != IVAS_ERR_OK ) + transport_config = rendAudioConfigToIvasAudioConfig( inConfig ); +#endif + output_Fs = output_frame * 50; #endif +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND + if ( ( error = ivas_td_binaural_renderer_unwrap( reverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, + ( headRotData != NULL ) ? headRotData->headPositions : NULL, output, output_frame ) ) != IVAS_ERR_OK ) + { + return error; + } +#else + if ( ( error = error = ivas_td_binaural_renderer_unwrap( NULL, 1, NULL, transport_config, output_Fs, pTDRend->hBinRendererTd, num_src, lfe_idx, + ivas_format, hIsmMetaData, headRotData->headRotEnabled, ( headRotData != NULL ) ? headRotData->headPositions : NULL, + output, output_frame ) ) != IVAS_ERR_OK ) { return error; } +#endif pop_wmops(); return IVAS_ERR_OK; } - -#ifdef TD5 -/*---------------------------------------------------------------------* - * angles_to_vec() - * - * Convert azimuth and elevation angles to position/orientation vector - *---------------------------------------------------------------------*/ - -static void angles_to_vec( - const float radius, /* i : radius */ - const float azimuth, /* i : Azimuth angle */ - const float elevation, /* i : Elevation angle */ - float *vec /* o : Pos/Dir vector */ -) -{ - vec[0] = radius * cosf( elevation * PI_OVER_180 ) * cosf( azimuth * PI_OVER_180 ); - vec[1] = radius * cosf( elevation * PI_OVER_180 ) * sinf( azimuth * PI_OVER_180 ); - vec[2] = radius * sinf( elevation * PI_OVER_180 ); - - return; -} -#endif diff --git a/lib_rend/ivas_objectRenderer_hrFilt.c b/lib_rend/ivas_objectRenderer_hrFilt.c index d28abdba30..0220b48145 100644 --- a/lib_rend/ivas_objectRenderer_hrFilt.c +++ b/lib_rend/ivas_objectRenderer_hrFilt.c @@ -69,21 +69,10 @@ ivas_error TDREND_REND_RenderSourceHRFilt( { float LeftOutputFrame[L_SPATIAL_SUBFR_48k]; float RightOutputFrame[L_SPATIAL_SUBFR_48k]; -#ifdef TD5 - float Gain; - - Gain = ( *Src_p->SrcRend_p->DirGain_p ) * ( *Src_p->SrcRend_p->DistGain_p ); -#endif TDREND_Apply_ITD( Src_p->InputFrame_p, LeftOutputFrame, RightOutputFrame, &Src_p->previtd, Src_p->itd, Src_p->mem_itd, subframe_length ); -#ifdef TD5 - TDREND_firfilt( LeftOutputFrame, Src_p->hrf_left_prev, hrf_left_delta, intp_count, Src_p->mem_hrf_left, subframe_length, Src_p->filterlength, Gain ); - TDREND_firfilt( RightOutputFrame, Src_p->hrf_right_prev, hrf_right_delta, intp_count, Src_p->mem_hrf_right, subframe_length, Src_p->filterlength, Gain ); -#else TDREND_firfilt( LeftOutputFrame, Src_p->hrf_left_prev, hrf_left_delta, intp_count, Src_p->mem_hrf_left, subframe_length, Src_p->filterlength ); TDREND_firfilt( RightOutputFrame, Src_p->hrf_right_prev, hrf_right_delta, intp_count, Src_p->mem_hrf_right, subframe_length, Src_p->filterlength ); -#endif - /* Copy to accumulative output frame */ v_add( LeftOutputFrame, output_buf[0], output_buf[0], subframe_length ); v_add( RightOutputFrame, output_buf[1], output_buf[1], subframe_length ); diff --git a/lib_rend/ivas_objectRenderer_sfx.c b/lib_rend/ivas_objectRenderer_sfx.c index 72493b0501..005025827b 100644 --- a/lib_rend/ivas_objectRenderer_sfx.c +++ b/lib_rend/ivas_objectRenderer_sfx.c @@ -182,7 +182,6 @@ static void sincResample( const float *p_sinc_forward; const float *p_sinc_backward; - /* Compute fractional time step */ t_step = (float) ( length_in ) / (float) ( length_out ); t_frac = 0; @@ -235,12 +234,7 @@ void TDREND_firfilt( const int16_t intp_count, /* i : interpolation count */ float *mem, /* i/o: filter memory */ const int16_t subframe_length, /* i : Length of signal */ -#ifdef TD5 - const int16_t filterlength, /* i : Filter length */ - const float Gain /* i : Gain */ -#else - const int16_t filterlength /* i : Filter length */ -#endif + const int16_t filterlength /* i : Filter length */ ) { float buffer[SFX_SPAT_BIN_MAX_FILTER_LENGTH - 1 + L_SUBFRAME5MS_48k]; @@ -266,11 +260,7 @@ void TDREND_firfilt( { tmp += ( *p_filter++ ) * ( *p_tmp-- ); } -#ifdef TD5 - signal[i] = tmp * Gain; -#else signal[i] = tmp; -#endif if ( i < intp_count ) { diff --git a/lib_rend/ivas_objectRenderer_sources.c b/lib_rend/ivas_objectRenderer_sources.c index 2a13efc24c..d524228812 100644 --- a/lib_rend/ivas_objectRenderer_sources.c +++ b/lib_rend/ivas_objectRenderer_sources.c @@ -266,9 +266,6 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams( TDREND_MIX_Listener_t *Listener_p; TDREND_HRFILT_FiltSet_t *HrFiltSet_p; float ListRelPos[3], ListRelDist; -#ifdef TD5 - float ListRelPosAbs[3]; /* Relative position, ignoring orientation of listener */ -#endif float Azim, Elev; float hrf_left[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; float hrf_right[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; @@ -290,22 +287,14 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams( break; case TDREND_POSTYPE_ABSOLUTE: /* Absolute position */ -#ifdef TD5 - TDREND_SPATIAL_VecMapToNewCoordSystem( SrcSpatial_p->Pos_p, Listener_p->Pos, Listener_p->Front, Listener_p->Up, Listener_p->Right, ListRelPos, ListRelPosAbs ); -#else TDREND_SPATIAL_VecMapToNewCoordSystem( SrcSpatial_p->Pos_p, Listener_p->Pos, Listener_p->Front, Listener_p->Up, Listener_p->Right, ListRelPos ); -#endif break; default: /* Illegal position type */ #ifdef DEBUGGING printf( "Warning! TDREND_SRC_REND_UpdateFiltersFromSpatialParams: Invalid position type. Assuming absolute position!\n" ); #endif /* Assume absolute position */ -#ifdef TD5 - TDREND_SPATIAL_VecMapToNewCoordSystem( SrcSpatial_p->Pos_p, Listener_p->Pos, Listener_p->Front, Listener_p->Up, Listener_p->Right, ListRelPos, ListRelPosAbs ); -#else TDREND_SPATIAL_VecMapToNewCoordSystem( SrcSpatial_p->Pos_p, Listener_p->Pos, Listener_p->Front, Listener_p->Up, Listener_p->Right, ListRelPos ); -#endif break; } @@ -331,11 +320,7 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams( *SrcRend_p->DirGain_p = 1.0f; if ( SrcSpatial_p->DirAttenEnabled ) { -#ifdef TD5 - *SrcRend_p->DirGain_p = TDREND_SRC_SPATIAL_GetDirGain( &SrcSpatial_p->DirAtten, SrcSpatial_p->Front_p, ListRelPosAbs ); -#else *SrcRend_p->DirGain_p = TDREND_SRC_SPATIAL_GetDirGain( &SrcSpatial_p->DirAtten, SrcSpatial_p->Front_p, ListRelPos ); -#endif } /* Distance gain */ diff --git a/lib_rend/ivas_objectRenderer_vec.c b/lib_rend/ivas_objectRenderer_vec.c index f17d769821..c3a780c725 100644 --- a/lib_rend/ivas_objectRenderer_vec.c +++ b/lib_rend/ivas_objectRenderer_vec.c @@ -111,22 +111,9 @@ void TDREND_SPATIAL_VecMapToNewCoordSystem( const float *DirVec_p, /* i : Direction vector */ const float *UpVec_p, /* i : Up vector */ const float *RightVec_p, /* i : Right vector */ -#ifdef TD5 - float *MappedVec_p, /* o : Transformed vector */ - float *LisRelPosAbs /* o : Transformed vector ignoring orientation */ -#else - float *MappedVec_p /* o : Transformed vector */ -#endif + float *MappedVec_p /* o : Transformed vector */ ) { -#ifdef TD5 - v_sub( Vec_p, TranslVec_p, LisRelPosAbs, 3 ); - /* Evalute the relative Vec in the coordinates of the Orientation vectors, */ - /* which form an orthonormal basis */ - MappedVec_p[0] = dotp( LisRelPosAbs, DirVec_p, 3 ); - MappedVec_p[1] = dotp( LisRelPosAbs, RightVec_p, 3 ); - MappedVec_p[2] = dotp( LisRelPosAbs, UpVec_p, 3 ); -#else float RelVec[3]; /* Evaluate Vec relative to the new origin given by TranslVec */ @@ -137,7 +124,7 @@ void TDREND_SPATIAL_VecMapToNewCoordSystem( MappedVec_p[0] = dotp( RelVec, DirVec_p, 3 ); MappedVec_p[1] = dotp( RelVec, RightVec_p, 3 ); MappedVec_p[2] = dotp( RelVec, UpVec_p, 3 ); -#endif + return; } diff --git a/lib_rend/ivas_orient_trk.c b/lib_rend/ivas_orient_trk.c index af71cbf543..4eec8ecd56 100644 --- a/lib_rend/ivas_orient_trk.c +++ b/lib_rend/ivas_orient_trk.c @@ -30,7 +30,6 @@ *******************************************************************************************************/ -#include "common_api_types.h" #include #include "options.h" #include "ivas_prot.h" @@ -50,332 +49,15 @@ #define MAX_TRACKED_ANGLE_AVG_ORIENT PI_OVER_2 #define MAX_TRACKED_ANGLE_REF_ORIENT EVS_PI -#define OTR_UPDATE_RATE (float) FRAMES_PER_SEC /* rate of the Process() calls [Hz]; 1x per IVAS frame */ - -/*------------------------------------------------------------------------------------------* - * Local functions - *------------------------------------------------------------------------------------------*/ - -#ifdef FIX_I109_ORIENTATION_TRACKING -/*------------------------------------------------------------------------------------------* - * IdentityQuaternion() - * - * - *------------------------------------------------------------------------------------------*/ - -static IVAS_QUATERNION IdentityQuaternion( - void ) -{ - IVAS_QUATERNION q; - - q.w = 1.0f; - q.x = q.y = q.z = 0.0f; - - return q; -} - - -/*------------------------------------------------------------------------------------------* - * QuaternionProduct() - * - * Quaternion product - *------------------------------------------------------------------------------------------*/ - -static void QuaternionProduct( - const IVAS_QUATERNION q1, - const IVAS_QUATERNION q2, - IVAS_QUATERNION *const r ) -{ - IVAS_QUATERNION tmp; - tmp.w = q1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z; - tmp.x = q1.w * q2.x + q1.x * q2.w + q1.y * q2.z - q1.z * q2.y; - tmp.y = q1.w * q2.y - q1.x * q2.z + q1.y * q2.w + q1.z * q2.x; - tmp.z = q1.w * q2.z + q1.x * q2.y - q1.y * q2.x + q1.z * q2.w; - - *r = tmp; - - return; -} - -/*------------------------------------------------------------------------------------------* - * QuaternionDotProduct() - * - * Quaternion dot product - *------------------------------------------------------------------------------------------*/ - -static float QuaternionDotProduct( - const IVAS_QUATERNION q1, - const IVAS_QUATERNION q2 ) -{ - return q1.x * q2.x + q1.y * q2.y + q1.z * q2.z + q1.w * q2.w; -} - - -/*------------------------------------------------------------------------------------------* - * QuaternionDivision() - * - * Divides a quaternion by a scalar - *------------------------------------------------------------------------------------------*/ - -static void QuaternionDivision( - const IVAS_QUATERNION q, - const float d, - IVAS_QUATERNION *const r ) -{ - r->w = q.w / d; - r->x = q.x / d; - r->y = q.y / d; - r->z = q.z / d; - - return; -} - - -/*------------------------------------------------------------------------------------------* - * QuaternionNormalize() - * - * Normalizes a quaternion - *------------------------------------------------------------------------------------------*/ - -static void QuaternionNormalize( - const IVAS_QUATERNION q, - IVAS_QUATERNION *const r ) -{ - QuaternionDivision( q, sqrtf( QuaternionDotProduct( q, q ) ), r ); - - return; -} - - -/*------------------------------------------------------------------------------------------* - * QuaternionSlerp() - * - * Computes a spherical linear interpolation between two quaternions - *------------------------------------------------------------------------------------------*/ - -static void QuaternionSlerp( - const IVAS_QUATERNION q1, - const IVAS_QUATERNION q2, - const float t, - IVAS_QUATERNION *const r ) -{ - float angle, denom, s, s2; - - s = QuaternionDotProduct( q1, q2 ); - - if ( fabsf( s ) >= 1.0f ) - { - *r = q2; - return; - } - - angle = acosf( s ); - denom = sinf( angle ); - - s = sinf( ( 1 - t ) * angle ); - s2 = sinf( t * angle ); - r->x = ( q1.x * s + q2.x * s2 ) / denom; - r->y = ( q1.y * s + q2.y * s2 ) / denom; - r->z = ( q1.z * s + q2.z * s2 ) / denom; - r->w = ( q1.w * s + q2.w * s2 ) / denom; - - QuaternionNormalize( *r, r ); - - return; -} - - -/*------------------------------------------------------------------------------------------* - * QuaternionConjugate() - * - * Computes a quaternion conjugate - *------------------------------------------------------------------------------------------*/ - -static void QuaternionConjugate( - const IVAS_QUATERNION q, - IVAS_QUATERNION *const r ) -{ - r->w = q.w; - r->x = -q.x; - r->y = -q.y; - r->z = -q.z; - - return; -} - - -/*------------------------------------------------------------------------------------------* - * QuaternionAngle() - * - * Computes an angle between two quaternions - *------------------------------------------------------------------------------------------*/ - -static float QuaternionAngle( - const IVAS_QUATERNION q1, - const IVAS_QUATERNION q2 ) -{ - IVAS_QUATERNION q12; - float angle; - - QuaternionConjugate( q1, &q12 ); - QuaternionProduct( q12, q2, &q12 ); - angle = 2.0f * atan2f( sqrtf( q12.x * q12.x + q12.y * q12.y + q12.z * q12.z ), q12.w ); - - return angle; -} - - -/*------------------------------------------------------------------------------------------* - * QuaternionInverse() - * - * Computes an inverse quaternion - *------------------------------------------------------------------------------------------*/ - -static void QuaternionInverse( - const IVAS_QUATERNION q, - IVAS_QUATERNION *const r ) -{ - float dot_product; - - dot_product = QuaternionDotProduct( q, q ); - QuaternionConjugate( q, r ); - QuaternionDivision( *r, dot_product, r ); - - return; -} - - -#ifdef OTR_REFERENCE_VECTOR_TRACKING -/*------------------------------------------------------------------------------------------* - * VectorSubtract() - * - * Computes the difference of two vectors - *------------------------------------------------------------------------------------------*/ - -static IVAS_VECTOR3 VectorSubtract( - const IVAS_VECTOR3 p1, - const IVAS_VECTOR3 p2 ) -{ - IVAS_VECTOR3 result; - - result.x = p1.x - p2.x; - result.y = p1.y - p2.y; - result.z = p1.z - p2.z; - - return result; -} - - -/*------------------------------------------------------------------------------------------* - * VectorCrossProduct() - * - * Computes the cross product of two vectors - *------------------------------------------------------------------------------------------*/ - -static IVAS_VECTOR3 VectorCrossProduct( - const IVAS_VECTOR3 p1, - const IVAS_VECTOR3 p2 ) -{ - IVAS_VECTOR3 result; - result.x = p1.y * p2.z - p1.z * p2.y; - result.y = p1.z * p2.x - p1.x * p2.z; - result.z = p1.x * p2.y - p1.y * p2.x; - - return result; -} - - -/*------------------------------------------------------------------------------------------* - * VectorDotProduct( - * - * Computes the dot product of two vectors - *------------------------------------------------------------------------------------------*/ - -static float VectorDotProduct( - const IVAS_VECTOR3 p1, - const IVAS_VECTOR3 p2 ) -{ - return p1.x * p2.x + p1.y * p2.y + p1.z * p2.z; -} - - -/*------------------------------------------------------------------------------------------* - * VectorLength() - * - * Computes the length of a vector - *------------------------------------------------------------------------------------------*/ - -static float VectorLength( - const IVAS_VECTOR3 p ) -{ - return sqrtf( p.x * p.x + p.y * p.y + p.z * p.z ); -} +/* TODO relate to frame rate - assumed here 50Hz, i.e. 20ms frame length */ +#define OTR_UPDATE_RATE ( 50.0f ) /* rate of the Process() calls [Hz]; 1x per IVAS frame */ /*------------------------------------------------------------------------------------------* - * VectorNormalize() - * - * Normalizes a vector - *------------------------------------------------------------------------------------------*/ - -static IVAS_VECTOR3 VectorNormalize( - const IVAS_VECTOR3 p ) -{ - IVAS_VECTOR3 result; - - const float length = VectorLength( p ); - - result.x = p.x / length; - result.y = p.y / length; - result.z = p.z / length; - - return result; -} - - -/*------------------------------------------------------------------------------------------* - * VectorRotationToQuaternion() - * - * Computes a quaternion representing the rotation from vector p1 to vector p2 + * Local functions *------------------------------------------------------------------------------------------*/ -static void VectorRotationToQuaternion( - const IVAS_VECTOR3 p1, - const IVAS_VECTOR3 p2, - IVAS_QUATERNION *const r ) -{ - float dot_product; - IVAS_VECTOR3 cross_product, p1_normalized, p2_normalized; - - p1_normalized = VectorNormalize( p1 ); - p2_normalized = VectorNormalize( p2 ); - cross_product = VectorCrossProduct( p1_normalized, p2_normalized ); - dot_product = VectorDotProduct( p1_normalized, p2_normalized ); - - if ( dot_product < -0.999999 ) - { - /* happens when the p1 vector is parallel to p2, but direction is flipped */ - r->w = 0.0f; - r->x = 0.0f; - r->y = 0.0f; - r->z = 1.0f; - } - else - { - /* all regular cases */ - r->x = cross_product.x; - r->y = cross_product.y; - r->z = cross_product.z; - r->w = 1.0f + dot_product; - } - - QuaternionNormalize( *r, r ); - - return; -} -#endif /* OTR_REFERENCE_VECTOR_TRACKING */ -#else static float ClipAngle( const float angle, const float min_angle, @@ -413,7 +95,6 @@ static float ClipAngle( return result; } -#endif /*-------------------------------------------------------------------* * ivas_orient_trk_Init() @@ -421,27 +102,11 @@ static float ClipAngle( * *-------------------------------------------------------------------*/ -#ifdef FIX_I109_ORIENTATION_TRACKING -ivas_error ivas_orient_trk_Init( -#else void ivas_orient_trk_Init( -#endif - ivas_orient_trk_state_t *pOTR ) /* i/o : orientation tracker handle */ + ivas_orient_trk_state_t *pOTR ) { -#ifdef FIX_I109_ORIENTATION_TRACKING - IVAS_QUATERNION identity; - - if ( pOTR == NULL ) - { - return IVAS_ERR_UNEXPECTED_NULL_POINTER; - } - - identity.w = 1.0f; - identity.x = identity.y = identity.z = 0.0f; -#else /* Track relative to a reference orientation */ pOTR->trackingType = OTR_TRACKING_REF_ORIENT; -#endif /* configuration parameters */ pOTR->centerAdaptationRate = 1.0f / 30.0f; @@ -451,19 +116,6 @@ void ivas_orient_trk_Init( /* initial adaptivity filter coefficient, will be auto-adapted */ pOTR->alpha = sinf( PI2 * pOTR->offCenterAdaptationRate / OTR_UPDATE_RATE ); /* start adaptation at off-center rate = fastest rate */ -#ifdef FIX_I109_ORIENTATION_TRACKING -#ifdef OTR_REFERENCE_VECTOR_TRACKING - pOTR->trkRot = identity; -#endif /* OTR_REFERENCE_VECTOR_TRACKING */ - pOTR->absAvgRot = identity; - /* Use frontal and horiontal orientation as reference orientation, unless/until overridden */ - pOTR->refRot = identity; - - /* set safe default tracking mode */ - pOTR->trackingType = OTR_TRACKING_NONE; - - return IVAS_ERR_OK; -#else pOTR->absYaw = 0.0f; pOTR->absPitch = 0.0f; pOTR->absRoll = 0.0f; @@ -483,7 +135,6 @@ void ivas_orient_trk_Init( pOTR->trkRoll = 0.0f; return; -#endif } @@ -493,178 +144,16 @@ void ivas_orient_trk_Init( * *-------------------------------------------------------------------*/ -#ifdef FIX_I109_ORIENTATION_TRACKING -ivas_error ivas_orient_trk_SetTrackingType( - ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ - const OTR_TRACKING_T trackingType /* i/o: orientation tracking type */ -) -{ - if ( pOTR == NULL ) - { - return IVAS_ERR_UNEXPECTED_NULL_POINTER; - } - pOTR->trackingType = trackingType; - - return IVAS_ERR_OK; -} -#else void ivas_orient_trk_SetTrackingType( - ivas_orient_trk_state_t *pOTR, /* i/o : orientation tracker handle */ - const OTR_TRACKING_T trackingType ) /* i/o : orientation tracking type */ + ivas_orient_trk_state_t *pOTR, + const OTR_TRACKING_T trackingType ) { pOTR->trackingType = trackingType; -} -#endif - -#ifdef FIX_I109_ORIENTATION_TRACKING -/*-------------------------------------------------------------------* - * ivas_orient_trk_SetReferenceRotation() - * - * - *-------------------------------------------------------------------*/ - -ivas_error ivas_orient_trk_SetReferenceRotation( - ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ - const IVAS_QUATERNION refRot /* i : reference rotation */ -) -{ - if ( pOTR == NULL ) - { - return IVAS_ERR_UNEXPECTED_NULL_POINTER; - } - - /* check for Euler angle signaling */ - if ( refRot.w == -3.0f ) - { - Euler2Quat( deg2rad( refRot.x ), deg2rad( refRot.y ), deg2rad( refRot.z ), &pOTR->refRot ); - } - else - { - pOTR->refRot = refRot; - } - - return IVAS_ERR_OK; -} - -/*-------------------------------------------------------------------* - * ivas_orient_trk_GetMainOrientation() - * - * - *-------------------------------------------------------------------*/ - -ivas_error ivas_orient_trk_GetMainOrientation( - ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ - IVAS_QUATERNION *pOrientation /* i/o: average/reference orientation */ -) -{ - if ( pOTR == NULL || pOrientation == NULL ) - { - return IVAS_ERR_UNEXPECTED_NULL_POINTER; - } - switch ( pOTR->trackingType ) - { - case OTR_TRACKING_NONE: - *pOrientation = IdentityQuaternion(); - break; -#ifdef OTR_REFERENCE_VECTOR_TRACKING - case OTR_TRACKING_REF_VEC: - case OTR_TRACKING_REF_VEC_LEV: -#endif /* OTR_REFERENCE_VECTOR_TRACKING */ - case OTR_TRACKING_REF_ORIENT: - *pOrientation = pOTR->refRot; - break; - case OTR_TRACKING_AVG_ORIENT: - *pOrientation = pOTR->absAvgRot; - break; - } - - return IVAS_ERR_OK; -} - - -/*-------------------------------------------------------------------* - * ivas_orient_trk_GetTrackedRotation() - * - * - *-------------------------------------------------------------------*/ - -ivas_error ivas_orient_trk_GetTrackedRotation( - ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ - IVAS_QUATERNION *pRotation /* i/o: processed rotation */ -) -{ - if ( pOTR == NULL || pRotation == NULL ) - { - return IVAS_ERR_UNEXPECTED_NULL_POINTER; - } - - *pRotation = pOTR->trkRot; - - return IVAS_ERR_OK; + return; } -#ifdef OTR_REFERENCE_VECTOR_TRACKING -/*-------------------------------------------------------------------* - * ivas_orient_trk_SetReferenceVector() - * - * - *-------------------------------------------------------------------*/ - -ivas_error ivas_orient_trk_SetReferenceVector( - ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ - const IVAS_VECTOR3 listenerPos, /* i : Listener position */ - const IVAS_VECTOR3 refPos /* i : Reference position */ -) -{ - IVAS_VECTOR3 acousticFrontVector, ivasForwardVector; - IVAS_VECTOR3 listenerPosLevel, refPosLevel; - float acousticFrontVectorLength; - - if ( pOTR == NULL ) - { - return IVAS_ERR_UNEXPECTED_NULL_POINTER; - } - - switch ( pOTR->trackingType ) - { - case OTR_TRACKING_NONE: - case OTR_TRACKING_REF_ORIENT: - case OTR_TRACKING_AVG_ORIENT: - case OTR_TRACKING_REF_VEC: - acousticFrontVector = VectorSubtract( listenerPos, refPos ); - break; - case OTR_TRACKING_REF_VEC_LEV: - /* ignore the height difference between listener position and reference position */ - listenerPosLevel.z = refPosLevel.z = listenerPos.z; - listenerPosLevel.x = listenerPos.x; - listenerPosLevel.y = listenerPos.y; - refPosLevel.x = refPos.x; - refPosLevel.y = refPos.y; - acousticFrontVector = VectorSubtract( listenerPosLevel, refPosLevel ); - break; - default: - return IVAS_ERR_WRONG_PARAMS; - } - - acousticFrontVectorLength = VectorLength( acousticFrontVector ); - - /* if the length is zero, the user has entered insensible listener and reference positions */ - if ( acousticFrontVectorLength < 0.0001f ) - { - return IVAS_ERR_WRONG_PARAMS; - } - - ivasForwardVector.x = -1.0f; - ivasForwardVector.y = 0.0f; - ivasForwardVector.z = 0.0f; - VectorRotationToQuaternion( ivasForwardVector, acousticFrontVector, &pOTR->refRot ); - - return IVAS_ERR_OK; -} -#endif /* OTR_REFERENCE_VECTOR_TRACKING */ -#else /*-------------------------------------------------------------------* * ivas_orient_trk_SetAbsoluteOrientation() * @@ -684,7 +173,6 @@ void ivas_orient_trk_SetAbsoluteOrientation( return; } -#endif /*-------------------------------------------------------------------* @@ -693,99 +181,6 @@ void ivas_orient_trk_SetAbsoluteOrientation( * *-------------------------------------------------------------------*/ -#ifdef FIX_I109_ORIENTATION_TRACKING -ivas_error ivas_orient_trk_Process( - ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ - IVAS_QUATERNION absRot, /* i : absolute head rotation */ - float updateRate, /* i : rotation update rate [Hz] */ - IVAS_QUATERNION *pTrkRot /* o : tracked rotation */ -) -{ - float normalizedOrientation; - float relativeOrientationRate; - float rateRange; - float cutoffFrequency; - float alpha = pOTR->alpha; - float ang; - ivas_error result; - - if ( pOTR == NULL || pTrkRot == NULL ) - { - return IVAS_ERR_UNEXPECTED_NULL_POINTER; - } - - result = IVAS_ERR_OK; - - switch ( pOTR->trackingType ) - { - case OTR_TRACKING_NONE: - pOTR->trkRot = absRot; - break; -#ifdef OTR_REFERENCE_VECTOR_TRACKING - case OTR_TRACKING_REF_VEC: - case OTR_TRACKING_REF_VEC_LEV: -#endif /* OTR_REFERENCE_VECTOR_TRACKING */ - case OTR_TRACKING_REF_ORIENT: - /* Reset average orientation */ - pOTR->absAvgRot = absRot; - - /* Reset adaptation filter - start adaptation at center rate */ - pOTR->alpha = sinf( 2.0f * EVS_PI * pOTR->centerAdaptationRate / updateRate ); - - /* Compute relative orientation = (absolute orientation) - (reference orientation) */ - QuaternionInverse( pOTR->refRot, &pOTR->trkRot ); - QuaternionProduct( pOTR->trkRot, absRot, &pOTR->trkRot ); - break; - - case OTR_TRACKING_AVG_ORIENT: - /* Compute average (low-pass filtered) absolute orientation */ - QuaternionSlerp( pOTR->absAvgRot, absRot, alpha, &pOTR->absAvgRot ); - - /* Compute relative orientation = (absolute orientation) - (average absolute orientation) */ - QuaternionInverse( pOTR->absAvgRot, &pOTR->trkRot ); - QuaternionProduct( pOTR->trkRot, absRot, &pOTR->trkRot ); - - /* Adapt LPF constant based on orientation excursion relative to current mean: - - low cutoff (slow adaptation) for small excursions (around center) - - high cutoff (fast adaptation) for large excursions (off-center) - */ - ang = QuaternionAngle( absRot, pOTR->trkRot ); - normalizedOrientation = ang * ang; - - relativeOrientationRate = sqrtf( normalizedOrientation ) / pOTR->adaptationAngle; - /* 'if' assumed to perform comparison to 0 */ - if ( relativeOrientationRate > 1.0f ) - { - relativeOrientationRate = 1.0f; - } - - /* Compute range of the adaptation rate between center = lower rate and off-center = higher rate */ - rateRange = pOTR->offCenterAdaptationRate - pOTR->centerAdaptationRate; - /* 'if' assumed to perform comparison to 0 */ - if ( rateRange < 0.0f ) - { - rateRange = 0.0f; - } - - /* Compute adaptivity cutoff frequency: interpolate between minimum (center) and maximum (off-center) values */ - cutoffFrequency = pOTR->centerAdaptationRate + ( relativeOrientationRate * rateRange ); - - /* Compute filter coefficient corresponding to desired cutoff frequency */ - pOTR->alpha = sinf( 2.0f * EVS_PI * cutoffFrequency / updateRate ); - break; - default: - result = IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Non-supported orientation tracking adaptation type" ); - break; - } - - if ( result == IVAS_ERR_OK ) - { - *pTrkRot = pOTR->trkRot; - } - - return result; -} -#else ivas_error ivas_orient_trk_Process( ivas_orient_trk_state_t *pOTR ) { @@ -919,4 +314,3 @@ void ivas_orient_trk_GetTrackedOrientation( return; } -#endif diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 4c79280a86..9e92e45d57 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -54,7 +54,11 @@ ivas_error getAudioConfigNumChannels( int16_t *numChannels ); +#ifdef FIX_197_CREND_INTERFACE AUDIO_CONFIG getIvasAudioConfigFromRendAudioConfig( +#else +AUDIO_CONFIG rendAudioConfigToIvasAudioConfig( +#endif IVAS_REND_AudioConfig rendConfig ); IVAS_REND_AudioConfig getRendAudioConfigFromIvasAudioConfig( @@ -212,18 +216,28 @@ void ivas_HRTF_CRend_binary_close( *----------------------------------------------------------------------------------*/ ivas_error ivas_td_binaural_renderer_unwrap( - const REVERB_HANDLE hReverb, /* i : Reverberator handle */ - const AUDIO_CONFIG transport_config, /* i : Transport configuration */ +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND + REVERB_HANDLE hReverb, /* i : reverb handle */ +#else + RENDER_CONFIG_DATA *hRenderConfig, /* i : Renderer configuration */ + const int16_t ini_frame, /* i : Initialization frame counter */ +#ifdef FIX_197_CREND_INTERFACE + CREND_WRAPPER_HANDLE hCrendWrapper, /* i : Crend wrapper handle */ +#else + CREND_HANDLE hCrend, /* i : Crend handle */ +#endif +#endif + AUDIO_CONFIG transport_config, /* i : Transport configuration */ +#ifndef FIX_330_ENABLE_TD_RENDERER_REVERB_REND + const int32_t output_Fs, /* i : Output sampling rate */ +#endif BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD binaural object renderer handle */ - const int16_t num_src, /* i : number of sources to render */ + const int16_t nchan_transport, /* i : Transport channels (ISms) */ const int16_t lfe_idx, /* i : LFE channel index */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ + IVAS_FORMAT ivas_format, /* i : IVAS format */ ISM_METADATA_HANDLE *hIsmMetaData, /* i : ISM metadata handle */ const int16_t Opt_Headrotation, /* i : Head rotation flag */ const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ -#ifdef TD5 - const IVAS_POSITION *Pos, /* i : Listener position data per subframe */ -#endif float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ const int16_t output_frame /* i : output frame length */ ); @@ -234,7 +248,9 @@ ivas_error ivas_td_binaural_renderer_ext( const LSSETUP_CUSTOM_STRUCT *customLsInput, /* i : Input custom loudspeaker layout */ const IVAS_REND_HeadRotData *headRotData, /* i : Input head positions */ const IVAS_REND_AudioObjectPosition *currentPos, /* i : Object position */ - const REVERB_HANDLE hReverb, /* i : Reverberator handle */ +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND + const REVERB_HANDLE reverb, /* i : reverb handle */ +#endif const int16_t output_frame, /* i : output frame length */ float output[][L_FRAME48k] /* i/o: SCE channels / Binaural synthesis */ ); @@ -245,9 +261,6 @@ ivas_error ivas_td_binaural_open_unwrap( const int16_t nchan_transport, /* i : Number of channels */ const IVAS_FORMAT ivas_format, /* i : IVAS format (ISM/MC) */ const AUDIO_CONFIG transport_config, /* i : Transport configuration */ -#ifdef TD5 - const float *directivity, /* i : Directivity pattern (used for ISM) */ -#endif const IVAS_OUTPUT_SETUP hTransSetup, /* i : Loudspeaker layout */ BINAURAL_TD_OBJECT_RENDERER_HANDLE *hBinRendererTd, /* o : TD renderer handle */ int32_t *binaural_latency_ns /* i : Binauralization delay */ @@ -256,9 +269,6 @@ ivas_error ivas_td_binaural_open_unwrap( ivas_error ivas_td_binaural_open_ext( TDREND_WRAPPER *pTDRend, const IVAS_REND_AudioConfig inConfig, -#ifdef TD5 - RENDER_CONFIG_DATA *hRendCfg, /* i : Renderer configuration */ -#endif LSSETUP_CUSTOM_STRUCT *customLsInput, const int32_t output_Fs ); @@ -270,7 +280,7 @@ void ivas_td_binaural_close( ivas_error TDREND_GetMix( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ - float output[][L_FRAME48k], /* i/o: ISM object synth / rendered output in 0,1 */ + float output[][L_FRAME48k], /* i/o: ISm object synth / rendered output in 0,1 */ const int16_t subframe_length, /* i/o: subframe length */ const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ ); @@ -278,17 +288,12 @@ ivas_error TDREND_GetMix( void TDREND_Update_listener_orientation( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD Renderer handle */ const int16_t headRotEnabled, /* i : Headrotation flag */ -#ifdef TD5 - const IVAS_QUATERNION *headPosition, /* i : Listener orientation */ - const IVAS_POSITION *Pos /* i : Listener Position */ -#else const IVAS_QUATERNION *headPosition /* i : Head Position */ -#endif ); void TDREND_Update_object_positions( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o : TD Renderer handle */ - const int16_t num_src, /* i : number of sources to render */ + const int16_t numSources, /* i : Number of sources to render */ const int16_t lfe_idx, /* i : Input LFE index */ const IVAS_FORMAT in_format, /* i : Format of input sources */ const ISM_METADATA_HANDLE *hIsmMetaData, /* i : Input metadata for ISM objects */ @@ -404,12 +409,7 @@ void TDREND_SPATIAL_VecMapToNewCoordSystem( const float *DirVec_p, /* i : Direction vector */ const float *UpVec_p, /* i : Up vector */ const float *RightVec_p, /* i : Right vector */ -#ifdef TD5 - float *MappedVec_p, /* o : Transformed vector */ - float *LisRelPosAbs /* o : Transformed vector ignoring orientation */ -#else float *MappedVec_p /* o : Transformed vector */ -#endif ); /*! r: Flag if the orientation has been updated */ @@ -475,12 +475,7 @@ void TDREND_firfilt( const int16_t intp_count, /* i : interpolation count */ float *mem, /* i/o: filter memory */ const int16_t subframe_length, /* i : Length of signal */ -#ifdef TD5 - const int16_t filterlength, /* i : Filter length */ - const float Gain /* i : Gain */ -#else const int16_t filterlength /* i : Filter length */ -#endif ); @@ -489,35 +484,59 @@ void TDREND_firfilt( *----------------------------------------------------------------------------------*/ ivas_error ivas_rend_openCrend( +#ifdef FIX_197_CREND_INTERFACE CREND_WRAPPER_HANDLE *pCrend, +#else + CREND_WRAPPER *pCrend, +#endif const AUDIO_CONFIG inConfig, const AUDIO_CONFIG outConfig, RENDER_CONFIG_DATA *hRendCfg, -#ifndef FIX_I109_ORIENTATION_TRACKING +#ifdef FIX_197_CREND_INTERFACE int16_t Opt_Headrotation, #endif HRTFS_CREND_HANDLE hSetOfHRTF, const int32_t output_Fs ); +#ifdef FIX_197_CREND_INTERFACE void ivas_rend_closeCrend( CREND_WRAPPER_HANDLE *pCrend ); +#else +ivas_error ivas_rend_closeCrend( + CREND_WRAPPER *pCrend ); +#endif +#ifdef FIX_329_ENABLE_TD_RENDERER_REVERB_MC ivas_error ivas_rend_initCrendWrapper( CREND_WRAPPER_HANDLE *pCrend ); +#endif ivas_error ivas_rend_crendProcess( const CREND_WRAPPER *pCrend, const AUDIO_CONFIG inConfig, const AUDIO_CONFIG outConfig, +#ifdef FIX_197_CREND_INTERFACE DECODER_CONFIG_HANDLE hDecoderConfig, HEAD_TRACK_DATA_HANDLE hHeadTrackData, IVAS_OUTPUT_SETUP_HANDLE hIntSetup, EFAP_HANDLE hEFAPdata, +#endif float output[][L_FRAME48k], /* i/o: input/output audio channels */ const int32_t output_Fs ); +#ifndef FIX_197_CREND_INTERFACE + +ivas_error ivas_crend_init_from_setofhrtf( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + +ivas_error ivas_crend_init_from_hrtf_handle( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + HRTFS_HANDLE hrtf); + +#endif @@ -581,12 +600,12 @@ void ivas_reverb_close( ); ivas_error ivas_reverb_process( - const REVERB_HANDLE hReverb, /* i : Reverberator handle */ + REVERB_HANDLE hReverb, /* i/o: reverb state */ const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */ const int16_t mix_signals, /* i : add reverb to output signal */ float pcm_in[][L_FRAME48k], /* i : the PCM audio to apply reverb on */ float pcm_out[][L_FRAME48k], /* o : the PCM audio with reverb applied */ - const int16_t i_ts /* i : subframe index */ + const int16_t i_ts ); void ivas_rev_delay_line_init( @@ -771,29 +790,12 @@ ivas_error ivas_headTrack_open( HEAD_TRACK_DATA_HANDLE *hHeadTrackData /* o : head track handle */ ); -#ifdef FIX_I109_ORIENTATION_TRACKING -void ivas_headTrack_close( - HEAD_TRACK_DATA_HANDLE *hHeadTrackData /* i/o: head track handle */ -); - -void Euler2Quat( - const float yaw, /* i : yaw (x) */ - const float pitch, /* i : pitch (y) */ - const float roll, /* i : roll (z) */ - IVAS_QUATERNION *quat /* o : quaternion describing the rotation */ -); - -float deg2rad( float degrees ); - -#else void Quat2Euler( - const IVAS_QUATERNION quat, /* i : quaternion describing the rotation */ - float *yaw, /* o : yaw (z) */ - float *pitch, /* o : pitch (y) */ - float *roll /* o : roll (x) */ + const IVAS_QUATERNION quat, /* i : quaternion describing the rotation */ + float *yaw, /* o : yaw */ + float *pitch, /* o : pitch */ + float *roll /* o : roll */ ); -#endif - void QuatToRotMat( const IVAS_QUATERNION quat, /* i : quaternion describing the rotation */ @@ -872,57 +874,15 @@ ivas_error ivas_render_config_init_from_rom( * Orientation tracking *----------------------------------------------------------------------------------*/ -#ifdef FIX_I109_ORIENTATION_TRACKING -ivas_error ivas_orient_trk_Init( -#else -void ivas_orient_trk_Init( -#endif - ivas_orient_trk_state_t *pOTR /* i/o: orientation tracker handle */ +void ivas_orient_trk_Init( + ivas_orient_trk_state_t *pOTR ); -#ifdef FIX_I109_ORIENTATION_TRACKING -ivas_error ivas_orient_trk_SetTrackingType( -#else -void ivas_orient_trk_SetTrackingType( -#endif - ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ - const OTR_TRACKING_T trackingType /* i : orientation tracking type */ -); - -#ifdef FIX_I109_ORIENTATION_TRACKING -ivas_error ivas_orient_trk_SetReferenceRotation( - ivas_orient_trk_state_t *pOTR, /* i/o: orientatoin trakcer handle */ - const IVAS_QUATERNION refRot /* i : reference rotation */ -); - -#ifdef OTR_REFERENCE_VECTOR_TRACKING -ivas_error ivas_orient_trk_SetReferenceVector( - ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ - const IVAS_VECTOR3 listenerPos, /* i : Listener position */ - const IVAS_VECTOR3 refPos /* i : Reference position */ -); -#endif /* OTR_REFERENCE_VECTOR_TRACKING */ - -ivas_error ivas_orient_trk_GetMainOrientation( - ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ - IVAS_QUATERNION *pOrientation /* i/o: average/reference orientation */ -); - -ivas_error ivas_orient_trk_GetTrackedRotation( - ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ - IVAS_QUATERNION *pRotation /* i/o: processed rotation */ -); -#endif - -#ifdef FIX_I109_ORIENTATION_TRACKING -ivas_error ivas_orient_trk_Process( - ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ - IVAS_QUATERNION absRot, /* i : absolute head rotation */ - float updateRate, /* i : rotation update rate [Hz] */ - IVAS_QUATERNION *pTrkRot /* o : tracked rotation */ +void ivas_orient_trk_SetTrackingType( + ivas_orient_trk_state_t *pOTR, + const OTR_TRACKING_T trackingType ); -#else void ivas_orient_trk_SetAbsoluteOrientation( ivas_orient_trk_state_t *pOTR, const float yaw, @@ -931,7 +891,7 @@ void ivas_orient_trk_SetAbsoluteOrientation( ); ivas_error ivas_orient_trk_Process( - ivas_orient_trk_state_t *pOTR + ivas_orient_trk_state_t *pOTR ); void ivas_orient_trk_GetTrackedOrientation( @@ -940,7 +900,6 @@ void ivas_orient_trk_GetTrackedOrientation( float *pitch, float *roll ); -#endif /* clang-format on */ #endif /* IVAS_PROT_REND_H */ diff --git a/lib_rend/ivas_render_config.c b/lib_rend/ivas_render_config.c index 2fdbeff0eb..ccee4ffe72 100644 --- a/lib_rend/ivas_render_config.c +++ b/lib_rend/ivas_render_config.c @@ -103,7 +103,6 @@ ivas_error ivas_render_config_init_from_rom( const int16_t room_flag_on /* i : room effect on/off flag */ ) { - if ( hRenderConfig == NULL || *hRenderConfig == NULL ) { return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "Unexpected null pointer while attempting to fill renderer configuration from ROM" ); @@ -126,11 +125,5 @@ ivas_error ivas_render_config_init_from_rom( mvr2r( ivas_reverb_default_RT60, ( *hRenderConfig )->roomAcoustics.pAcoustic_rt60, IVAS_REVERB_DEFAULT_N_BANDS ); mvr2r( ivas_reverb_default_DSR, ( *hRenderConfig )->roomAcoustics.pAcoustic_dsr, IVAS_REVERB_DEFAULT_N_BANDS ); -#ifdef TD5 - ( *hRenderConfig )->directivity[0] = 360.0f; /* Front cone */ - ( *hRenderConfig )->directivity[1] = 360.0f; /* Back cone */ - ( *hRenderConfig )->directivity[2] = 1.0f; /* Back attenuation */ -#endif - return IVAS_ERR_OK; } diff --git a/lib_rend/ivas_reverb.c b/lib_rend/ivas_reverb.c index 7dc05cff09..3911c36601 100644 --- a/lib_rend/ivas_reverb.c +++ b/lib_rend/ivas_reverb.c @@ -675,34 +675,34 @@ static ivas_error calc_jot_t60_coeffs( *-----------------------------------------------------------------------------------------*/ static ivas_error initialize_reverb_filters( - REVERB_HANDLE hReverb ) + REVERB_HANDLE pState ) { ivas_error error; error = IVAS_ERR_OK; /* init correlation and coloration filters */ - if ( ( error = ivas_reverb_t2f_f2t_init( &hReverb->fft_filter_ols, hReverb->fft_size, hReverb->fft_subblock_size ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_reverb_t2f_f2t_init( &pState->fft_filter_ols, pState->fft_size, pState->fft_subblock_size ) ) != IVAS_ERR_OK ) { return error; } - if ( ( error = ivas_reverb_fft_filter_init( &hReverb->fft_filter_correl_0, hReverb->fft_size ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_reverb_fft_filter_init( &pState->fft_filter_correl_0, pState->fft_size ) ) != IVAS_ERR_OK ) { return error; } - if ( ( error = ivas_reverb_fft_filter_init( &hReverb->fft_filter_correl_1, hReverb->fft_size ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_reverb_fft_filter_init( &pState->fft_filter_correl_1, pState->fft_size ) ) != IVAS_ERR_OK ) { return error; } - if ( ( error = ivas_reverb_fft_filter_init( &hReverb->fft_filter_color_0, hReverb->fft_size ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_reverb_fft_filter_init( &pState->fft_filter_color_0, pState->fft_size ) ) != IVAS_ERR_OK ) { return error; } - if ( ( error = ivas_reverb_fft_filter_init( &hReverb->fft_filter_color_1, hReverb->fft_size ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_reverb_fft_filter_init( &pState->fft_filter_color_1, pState->fft_size ) ) != IVAS_ERR_OK ) { return error; } @@ -718,13 +718,13 @@ static ivas_error initialize_reverb_filters( *-----------------------------------------------------------------------------------------*/ static ivas_error set_t60_filter( - REVERB_HANDLE hReverb, + REVERB_HANDLE pState, const uint16_t branch, const uint16_t nr_taps, const float coefA[], const float coefB[] ) { - if ( branch >= hReverb->nr_of_branches ) + if ( branch >= pState->nr_of_branches ) { return IVAS_ERR_INTERNAL; } @@ -734,7 +734,7 @@ static ivas_error set_t60_filter( return IVAS_ERR_INTERNAL; } - ivas_reverb_iir_filt_set( &( hReverb->t60[branch] ), nr_taps, coefA, coefB ); + ivas_reverb_iir_filt_set( &( pState->t60[branch] ), nr_taps, coefA, coefB ); return IVAS_ERR_OK; } @@ -747,16 +747,16 @@ static ivas_error set_t60_filter( *-----------------------------------------------------------------------------------------*/ static ivas_error set_feedback_delay( - REVERB_HANDLE hReverb, + REVERB_HANDLE pState, const uint16_t branch, const int16_t fb_delay ) { - if ( branch >= hReverb->nr_of_branches ) + if ( branch >= pState->nr_of_branches ) { return IVAS_ERR_INTERNAL; } - hReverb->delay_line[branch].Delay = fb_delay; + pState->delay_line[branch].Delay = fb_delay; return IVAS_ERR_OK; } @@ -769,19 +769,19 @@ static ivas_error set_feedback_delay( *-----------------------------------------------------------------------------------------*/ static ivas_error set_feedback_gain( - REVERB_HANDLE hReverb, + REVERB_HANDLE pState, const uint16_t branch, const float *pGain ) { uint16_t gain_idx; - if ( branch >= hReverb->nr_of_branches ) + if ( branch >= pState->nr_of_branches ) { return IVAS_ERR_INTERNAL; } - for ( gain_idx = 0; gain_idx < hReverb->nr_of_branches; gain_idx++ ) + for ( gain_idx = 0; gain_idx < pState->nr_of_branches; gain_idx++ ) { - hReverb->gain_matrix[branch][gain_idx] = pGain[gain_idx]; + pState->gain_matrix[branch][gain_idx] = pGain[gain_idx]; } return IVAS_ERR_OK; @@ -795,7 +795,7 @@ static ivas_error set_feedback_gain( *-----------------------------------------------------------------------------------------*/ static ivas_error set_correl_fft_filter( - REVERB_HANDLE hReverb, + REVERB_HANDLE pState, const uint16_t channel, rv_fftwf_type_complex *pSpectrum ) { @@ -806,11 +806,11 @@ static ivas_error set_correl_fft_filter( if ( channel == 0 ) { - ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR( pSpectrum, hReverb->fft_filter_correl_0.fft_spectrum, hReverb->fft_filter_correl_0.fft_size ); + ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR( pSpectrum, pState->fft_filter_correl_0.fft_spectrum, pState->fft_filter_correl_0.fft_size ); } else { - ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR( pSpectrum, hReverb->fft_filter_correl_1.fft_spectrum, hReverb->fft_filter_correl_1.fft_size ); + ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR( pSpectrum, pState->fft_filter_correl_1.fft_spectrum, pState->fft_filter_correl_1.fft_size ); } return IVAS_ERR_OK; @@ -824,7 +824,7 @@ static ivas_error set_correl_fft_filter( *-----------------------------------------------------------------------------------------*/ static ivas_error set_color_fft_filter( - REVERB_HANDLE hReverb, + REVERB_HANDLE pState, const uint16_t channel, rv_fftwf_type_complex *pSpectrum ) { @@ -835,11 +835,11 @@ static ivas_error set_color_fft_filter( if ( channel == 0 ) { - ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR( pSpectrum, hReverb->fft_filter_color_0.fft_spectrum, hReverb->fft_filter_color_0.fft_size ); + ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR( pSpectrum, pState->fft_filter_color_0.fft_spectrum, pState->fft_filter_color_0.fft_size ); } else { - ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR( pSpectrum, hReverb->fft_filter_color_1.fft_spectrum, hReverb->fft_filter_color_1.fft_size ); + ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR( pSpectrum, pState->fft_filter_color_1.fft_spectrum, pState->fft_filter_color_1.fft_size ); } return IVAS_ERR_OK; @@ -853,7 +853,7 @@ static ivas_error set_color_fft_filter( *-----------------------------------------------------------------------------------------*/ static ivas_error set_mixer_level( - REVERB_HANDLE hReverb, + REVERB_HANDLE pState, const uint16_t channel, const float level[] ) { @@ -863,9 +863,9 @@ static ivas_error set_mixer_level( return IVAS_ERR_INTERNAL; } - for ( branch_idx = 0; branch_idx < hReverb->nr_of_branches; branch_idx++ ) + for ( branch_idx = 0; branch_idx < pState->nr_of_branches; branch_idx++ ) { - hReverb->mixer[channel][branch_idx] = level[branch_idx]; + pState->mixer[channel][branch_idx] = level[branch_idx]; } return IVAS_ERR_OK; @@ -879,7 +879,7 @@ static ivas_error set_mixer_level( *-----------------------------------------------------------------------------------------*/ static void clear_buffers( - REVERB_HANDLE hReverb ) + REVERB_HANDLE pState ) { int16_t branch_idx; ivas_rev_iir_filter_t *iirFilter; @@ -887,15 +887,15 @@ static void clear_buffers( for ( branch_idx = 0; branch_idx < IVAS_REV_MAX_NR_BRANCHES; branch_idx++ ) { - delay_line = &( hReverb->delay_line[branch_idx] ); + delay_line = &( pState->delay_line[branch_idx] ); set_f( delay_line->pBuffer, 0, delay_line->MaxDelay ); delay_line->BufferPos = 0; - iirFilter = &( hReverb->t60[branch_idx] ); + iirFilter = &( pState->t60[branch_idx] ); set_f( iirFilter->pBuffer, 0, iirFilter->MaxTaps ); } - ivas_reverb_t2f_f2t_ClearHistory( &hReverb->fft_filter_ols ); + ivas_reverb_t2f_f2t_ClearHistory( &pState->fft_filter_ols ); return; } @@ -908,31 +908,31 @@ static void clear_buffers( *-----------------------------------------------------------------------------------------*/ static void set_fft_and_datablock_sizes( - REVERB_HANDLE hReverb, + REVERB_HANDLE pState, const int16_t subframe_len ) { - hReverb->full_block_size = subframe_len; + pState->full_block_size = subframe_len; if ( subframe_len == L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES ) { - hReverb->fft_size = IVAS_REVERB_FFT_SIZE_48K; - hReverb->num_fft_subblocks = IVAS_REVERB_FFT_N_SUBBLOCKS_48K; + pState->fft_size = IVAS_REVERB_FFT_SIZE_48K; + pState->num_fft_subblocks = IVAS_REVERB_FFT_N_SUBBLOCKS_48K; } else if ( subframe_len == L_FRAME32k / MAX_PARAM_SPATIAL_SUBFRAMES ) { - hReverb->fft_size = IVAS_REVERB_FFT_SIZE_32K; - hReverb->num_fft_subblocks = IVAS_REVERB_FFT_N_SUBBLOCKS_32K; + pState->fft_size = IVAS_REVERB_FFT_SIZE_32K; + pState->num_fft_subblocks = IVAS_REVERB_FFT_N_SUBBLOCKS_32K; } else if ( subframe_len == L_FRAME16k / MAX_PARAM_SPATIAL_SUBFRAMES ) { - hReverb->fft_size = IVAS_REVERB_FFT_SIZE_16K; - hReverb->num_fft_subblocks = IVAS_REVERB_FFT_N_SUBBLOCKS_16K; + pState->fft_size = IVAS_REVERB_FFT_SIZE_16K; + pState->num_fft_subblocks = IVAS_REVERB_FFT_N_SUBBLOCKS_16K; } else { assert( 0 ); /* unsupported block size */ } - hReverb->fft_subblock_size = subframe_len / hReverb->num_fft_subblocks; + pState->fft_subblock_size = subframe_len / pState->num_fft_subblocks; return; } @@ -1030,7 +1030,7 @@ static void set_reverb_acoustic_data( *-----------------------------------------------------------------------------------------*/ static ivas_error setup_FDN_branches( - REVERB_HANDLE hReverb, + REVERB_HANDLE pState, ivas_reverb_params_t *pParams ) { int16_t nr_coefs, branch_idx, channel_idx; @@ -1041,12 +1041,12 @@ static ivas_error setup_FDN_branches( /* initialize feedback branches */ for ( branch_idx = 0; branch_idx < IVAS_REV_MAX_NR_BRANCHES; branch_idx++ ) { - ivas_rev_delay_line_init( &( hReverb->delay_line[branch_idx] ), hReverb->loop_delay_buffer[branch_idx], init_loop_delay[branch_idx], pParams->pLoop_delays[branch_idx] ); - ivas_reverb_iir_filt_init( &( hReverb->t60[branch_idx] ), IVAS_REV_MAX_IIR_FILTER_LENGTH ); - hReverb->mixer[0][branch_idx] = 0.0f; - hReverb->mixer[1][branch_idx] = 0.0f; + ivas_rev_delay_line_init( &( pState->delay_line[branch_idx] ), pState->loop_delay_buffer[branch_idx], init_loop_delay[branch_idx], pParams->pLoop_delays[branch_idx] ); + ivas_reverb_iir_filt_init( &( pState->t60[branch_idx] ), IVAS_REV_MAX_IIR_FILTER_LENGTH ); + pState->mixer[0][branch_idx] = 0.0f; + pState->mixer[1][branch_idx] = 0.0f; } - clear_buffers( hReverb ); + clear_buffers( pState ); nr_coefs = pParams->t60_filter_order + 1; if ( IVAS_REV_MAX_IIR_FILTER_LENGTH < nr_coefs ) @@ -1060,17 +1060,17 @@ static ivas_error setup_FDN_branches( pCoef_a = &pParams->pT60_filter_coeff[2 * nr_coefs * branch_idx + nr_coefs]; pCoef_b = &pParams->pT60_filter_coeff[2 * nr_coefs * branch_idx]; - if ( ( error = set_t60_filter( hReverb, branch_idx, nr_coefs, pCoef_a, pCoef_b ) ) != IVAS_ERR_OK ) + if ( ( error = set_t60_filter( pState, branch_idx, nr_coefs, pCoef_a, pCoef_b ) ) != IVAS_ERR_OK ) { return error; } - if ( ( error = set_feedback_delay( hReverb, branch_idx, pParams->pLoop_delays[branch_idx] ) ) != IVAS_ERR_OK ) + if ( ( error = set_feedback_delay( pState, branch_idx, pParams->pLoop_delays[branch_idx] ) ) != IVAS_ERR_OK ) { return error; } - if ( ( error = set_feedback_gain( hReverb, branch_idx, &( pParams->pLoop_feedback_matrix[branch_idx * pParams->nr_loops] ) ) ) != IVAS_ERR_OK ) + if ( ( error = set_feedback_gain( pState, branch_idx, &( pParams->pLoop_feedback_matrix[branch_idx * pParams->nr_loops] ) ) ) != IVAS_ERR_OK ) { return error; } @@ -1079,7 +1079,7 @@ static ivas_error setup_FDN_branches( for ( channel_idx = 0; channel_idx < pParams->nr_outputs; channel_idx++ ) { - if ( ( error = set_mixer_level( hReverb, channel_idx, &( pParams->pLoop_extract_matrix[channel_idx * pParams->nr_loops] ) ) ) != IVAS_ERR_OK ) + if ( ( error = set_mixer_level( pState, channel_idx, &( pParams->pLoop_extract_matrix[channel_idx * pParams->nr_loops] ) ) ) != IVAS_ERR_OK ) { return error; } @@ -1175,6 +1175,7 @@ ivas_error ivas_reverb_open( /* set up reverb acoustic data on the basis of HRTF data and renderer config */ set_reverb_acoustic_data( ¶ms, input_audio_config, hHrtf, &hRenderConfig->roomAcoustics, subframe_len, nr_fc_input, nr_fc_fft_filter ); +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND /* set reverb acoustic configuration based on renderer config */ #ifdef DEBUGGING pState->pConfig.renderer_type_override = hRenderConfig->renderer_type_override; @@ -1183,6 +1184,7 @@ ivas_error ivas_reverb_open( pState->pConfig.roomAcoustics.use_brir = hRenderConfig->roomAcoustics.use_brir; pState->pConfig.roomAcoustics.late_reverb_on = hRenderConfig->roomAcoustics.late_reverb_on; pState->pConfig.roomAcoustics.nBands = hRenderConfig->roomAcoustics.nBands; +#endif /* set up input downmix */ pState->dmx_gain = calc_dmx_gain(); @@ -1310,27 +1312,27 @@ void ivas_reverb_close( *-----------------------------------------------------------------------------------------*/ static void post_fft_filter( - REVERB_HANDLE hReverb, + REVERB_HANDLE pState, float *p0, float *p1, float *pBuffer_0, float *pBuffer_1 ) { - if ( hReverb->do_corr_filter ) + if ( pState->do_corr_filter ) { - ivas_reverb_t2f_f2t_in( &hReverb->fft_filter_ols, p0, p1, pBuffer_0, pBuffer_1 ); - ivas_reverb_fft_filter_ComplexMul( &hReverb->fft_filter_correl_0, pBuffer_0 ); - ivas_reverb_fft_filter_ComplexMul( &hReverb->fft_filter_correl_1, pBuffer_1 ); - ivas_reverb_fft_filter_CrossMix( pBuffer_0, pBuffer_1, hReverb->fft_filter_correl_0.fft_size ); + ivas_reverb_t2f_f2t_in( &pState->fft_filter_ols, p0, p1, pBuffer_0, pBuffer_1 ); + ivas_reverb_fft_filter_ComplexMul( &pState->fft_filter_correl_0, pBuffer_0 ); + ivas_reverb_fft_filter_ComplexMul( &pState->fft_filter_correl_1, pBuffer_1 ); + ivas_reverb_fft_filter_CrossMix( pBuffer_0, pBuffer_1, pState->fft_filter_correl_0.fft_size ); } else { - ivas_reverb_t2f_f2t_in( &hReverb->fft_filter_ols, p0, p1, pBuffer_0, pBuffer_1 ); + ivas_reverb_t2f_f2t_in( &pState->fft_filter_ols, p0, p1, pBuffer_0, pBuffer_1 ); } - ivas_reverb_fft_filter_ComplexMul( &hReverb->fft_filter_color_0, pBuffer_0 ); - ivas_reverb_fft_filter_ComplexMul( &hReverb->fft_filter_color_1, pBuffer_1 ); - ivas_reverb_t2f_f2t_out( &hReverb->fft_filter_ols, pBuffer_0, pBuffer_1, p0, p1 ); + ivas_reverb_fft_filter_ComplexMul( &pState->fft_filter_color_0, pBuffer_0 ); + ivas_reverb_fft_filter_ComplexMul( &pState->fft_filter_color_1, pBuffer_1 ); + ivas_reverb_t2f_f2t_out( &pState->fft_filter_ols, pBuffer_0, pBuffer_1, p0, p1 ); return; } @@ -1343,14 +1345,14 @@ static void post_fft_filter( *-----------------------------------------------------------------------------------------*/ static void reverb_block( - REVERB_HANDLE hReverb, + REVERB_HANDLE pState, float *pInput, float *pOut0, float *pOut1 ) { - uint16_t nr_branches = hReverb->nr_of_branches; - uint16_t bsize = hReverb->full_block_size; + uint16_t nr_branches = pState->nr_of_branches; + uint16_t bsize = pState->full_block_size; uint16_t inner_bsize = INNER_BLK_SIZE; uint16_t i, j, k, ns, branch_idx, blk_idx, start_sample_idx; @@ -1382,12 +1384,12 @@ static void reverb_block( for ( i = 0; i < nr_branches; i++ ) { float *pOutput_i = &ppOutput[i][0]; - float mixer_0_i = hReverb->mixer[0][i]; - float mixer_1_i = hReverb->mixer[1][i]; + float mixer_0_i = pState->mixer[0][i]; + float mixer_1_i = pState->mixer[1][i]; /* output and feedback are same, get sample from delay line ... */ - ivas_rev_delay_line_get_sample_blk( &( hReverb->delay_line[i] ), inner_bsize, pTemp ); - ivas_reverb_iir_filt_2taps_feed_blk( &( hReverb->t60[i] ), inner_bsize, pTemp, ppOutput[i] ); + ivas_rev_delay_line_get_sample_blk( &( pState->delay_line[i] ), inner_bsize, pTemp ); + ivas_reverb_iir_filt_2taps_feed_blk( &( pState->t60[i] ), inner_bsize, pTemp, ppOutput[i] ); for ( ns = 0; ns < inner_bsize; ns++ ) { pO0[ns] += pOutput_i[ns] * mixer_0_i; /* mixer ch 0 */ @@ -1406,7 +1408,7 @@ static void reverb_block( for ( j = 0; j < nr_branches; j++ ) { - float gain_matrix_j_i = hReverb->gain_matrix[j][i]; + float gain_matrix_j_i = pState->gain_matrix[j][i]; float *pOutput = &ppOutput[j][0]; for ( ns = 0; ns < inner_bsize; ns++ ) { @@ -1414,15 +1416,15 @@ static void reverb_block( } } - ivas_rev_delay_line_feed_sample_blk( &( hReverb->delay_line[i] ), inner_bsize, pFeedback_input ); + ivas_rev_delay_line_feed_sample_blk( &( pState->delay_line[i] ), inner_bsize, pFeedback_input ); } } /* Applying FFT filter to each sub-frame */ - for ( blk_idx = 0; blk_idx < hReverb->num_fft_subblocks; blk_idx++ ) + for ( blk_idx = 0; blk_idx < pState->num_fft_subblocks; blk_idx++ ) { - start_sample_idx = blk_idx * hReverb->fft_subblock_size; - post_fft_filter( hReverb, pOut0 + start_sample_idx, pOut1 + start_sample_idx, pFFT_buf[0], pFFT_buf[1] ); + start_sample_idx = blk_idx * pState->fft_subblock_size; + post_fft_filter( pState, pOut0 + start_sample_idx, pOut1 + start_sample_idx, pFFT_buf[0], pFFT_buf[1] ); } return; @@ -1436,14 +1438,14 @@ static void reverb_block( *-----------------------------------------------------------------------------------------*/ static ivas_error downmix_input_block( - const REVERB_HANDLE hReverb, + REVERB_HANDLE pState, float pcm_in[][L_FRAME48k], const AUDIO_CONFIG input_audio_config, float *pPcm_out, const int16_t input_offset ) { int16_t i, s, nchan_transport; - float dmx_gain = hReverb->dmx_gain; + float dmx_gain = pState->dmx_gain; switch ( input_audio_config ) { @@ -1459,7 +1461,7 @@ static ivas_error downmix_input_block( case AUDIO_CONFIG_ISM4: { nchan_transport = audioCfg2channels( input_audio_config ); - for ( s = 0; s < hReverb->full_block_size; s++ ) + for ( s = 0; s < pState->full_block_size; s++ ) { float temp = pcm_in[0][input_offset + s]; for ( i = 1; i < nchan_transport; i++ ) @@ -1475,7 +1477,7 @@ static ivas_error downmix_input_block( case AUDIO_CONFIG_HOA2: case AUDIO_CONFIG_HOA3: { - for ( s = 0; s < hReverb->full_block_size; s++ ) + for ( s = 0; s < pState->full_block_size; s++ ) { pPcm_out[s] = dmx_gain * pcm_in[0][input_offset + s]; } @@ -1497,35 +1499,35 @@ static ivas_error downmix_input_block( *-----------------------------------------------------------------------------------------*/ static void predelay_block( - const REVERB_HANDLE hReverb, + REVERB_HANDLE pState, float *pInput, float *pOutput ) { uint16_t i, idx, n_samples, blk_size; - uint16_t max_blk_size = (uint16_t) hReverb->predelay_line.Delay; + uint16_t max_blk_size = (uint16_t) pState->predelay_line.Delay; if ( max_blk_size < 2 ) { if ( max_blk_size == 0 ) /* zero-length delay line: just copy the data from input to output */ { - for ( i = 0; i < hReverb->full_block_size; i++ ) + for ( i = 0; i < pState->full_block_size; i++ ) { pOutput[i] = pInput[i]; } } else /* 1-sample length delay line: feed the data sample-by-sample */ { - for ( i = 0; i < hReverb->full_block_size; i++ ) + for ( i = 0; i < pState->full_block_size; i++ ) { - pOutput[i] = ivas_rev_delay_line_get_sample( &( hReverb->predelay_line ) ); - ivas_rev_delay_line_feed_sample( &( hReverb->predelay_line ), pInput[i] ); + pOutput[i] = ivas_rev_delay_line_get_sample( &( pState->predelay_line ) ); + ivas_rev_delay_line_feed_sample( &( pState->predelay_line ), pInput[i] ); } } } else /* multiple-sample length delay line: use block processing */ { idx = 0; - n_samples = hReverb->full_block_size; + n_samples = pState->full_block_size; while ( n_samples > 0 ) { blk_size = n_samples; @@ -1533,8 +1535,8 @@ static void predelay_block( { blk_size = max_blk_size; } - ivas_rev_delay_line_get_sample_blk( &( hReverb->predelay_line ), blk_size, &pOutput[idx] ); - ivas_rev_delay_line_feed_sample_blk( &( hReverb->predelay_line ), blk_size, &pInput[idx] ); + ivas_rev_delay_line_get_sample_blk( &( pState->predelay_line ), blk_size, &pOutput[idx] ); + ivas_rev_delay_line_feed_sample_blk( &( pState->predelay_line ), blk_size, &pInput[idx] ); idx += blk_size; n_samples -= blk_size; } @@ -1551,7 +1553,7 @@ static void predelay_block( *-----------------------------------------------------------------------------------------*/ static void mix_output_block( - const REVERB_HANDLE hReverb, + REVERB_HANDLE pState, const float *pInL, const float *pInR, float *pOutL, @@ -1559,7 +1561,7 @@ static void mix_output_block( { uint16_t i; - for ( i = 0; i < hReverb->full_block_size; i++ ) + for ( i = 0; i < pState->full_block_size; i++ ) { pOutL[i] += pInL[i]; pOutR[i] += pInR[i]; @@ -1576,13 +1578,12 @@ static void mix_output_block( *-----------------------------------------------------------------------------------------*/ ivas_error ivas_reverb_process( - const REVERB_HANDLE hReverb, /* i : Reverberator handle */ + REVERB_HANDLE hReverb, /* i/o: reverb state */ const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */ const int16_t mix_signals, /* i : add reverb to output signal */ float pcm_in[][L_FRAME48k], /* i : the PCM audio to apply reverb on */ float pcm_out[][L_FRAME48k], /* o : the PCM audio with reverb applied */ - const int16_t i_ts /* i : subframe index */ -) + const int16_t i_ts ) { float tmp0[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES], tmp1[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES], tmp2[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; ivas_error error; diff --git a/lib_rend/ivas_rom_TdBinauralRenderer.c b/lib_rend/ivas_rom_TdBinauralRenderer.c index 4b56fb4883..70daa6dff9 100644 --- a/lib_rend/ivas_rom_TdBinauralRenderer.c +++ b/lib_rend/ivas_rom_TdBinauralRenderer.c @@ -41,7 +41,6 @@ #include "ivas_cnst.h" #include "wmc_auto.h" -#define WMC_TOOL_SKIP /*------------------------------------------------------------------------- * TD Binaural rendering related ROM tables @@ -12457,6 +12456,4 @@ const uint32_t orange53_rom_ITD_elevBsShape[28] = { 0x3ebda12f,0x3f12f685,0x3f2aaaab, }; -#undef WMC_TOOL_SKIP - /* clang-format on */ diff --git a/lib_rend/ivas_rom_binauralRenderer.c b/lib_rend/ivas_rom_binauralRenderer.c index 9708bac83a..763777ad28 100644 --- a/lib_rend/ivas_rom_binauralRenderer.c +++ b/lib_rend/ivas_rom_binauralRenderer.c @@ -41,8 +41,6 @@ /* clang-format off */ -#define WMC_TOOL_SKIP - /*------------------------------------------------------------------------- * Binaural rendering related ROM tables *------------------------------------------------------------------------*/ @@ -44079,6 +44077,4 @@ const float parametricEarlyPartEneCorrection[CLDFB_NO_CHANNELS_MAX] = 0.016350f, 0.042709f, 0.077337f, 0.066238f, 0.042046f, 0.020017f, 0.007896f, 0.002947f, 0.000932f, 0.000152f }; -#undef WMC_TOOL_SKIP - /* clang-format on */ diff --git a/lib_rend/ivas_rom_binaural_crend_head.c b/lib_rend/ivas_rom_binaural_crend_head.c index 56a9a9ef53..a57d780378 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.c +++ b/lib_rend/ivas_rom_binaural_crend_head.c @@ -47,7 +47,6 @@ #include "cnst.h" #include "ivas_cnst.h" -#define WMC_TOOL_SKIP /********************** CRendBin_Combined_HRIR **********************/ #ifdef FIX_BINAURAL_DELAY_PRECISION @@ -6924,4 +6923,3 @@ const float CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS][252 0.050578f, 0.012222f, 0.020049f, -0.020057f, -0.032135f, -0.002553f, -0.037541f, -0.023567f, -0.008392f, -0.012215f, 0.001644f, -0.001142f, 0.000540f, 0.001404f, -0.027979f, -0.022362f, -0.012091f, -0.022963f, 0.009075f, 0.010977f, -0.007069f, -0.000183f, -0.022228f, -0.001348f, 0.006548f, -0.003034f} }; -#undef WMC_TOOL_SKIP diff --git a/lib_rend/ivas_rom_rend.c b/lib_rend/ivas_rom_rend.c index dd8ca99d80..0dfdaf0d28 100644 --- a/lib_rend/ivas_rom_rend.c +++ b/lib_rend/ivas_rom_rend.c @@ -104,7 +104,7 @@ const float diffuseFieldCoherenceDifferenceZ[BINAURAL_COHERENCE_DIFFERENCE_BINS] /*----------------------------------------------------------------------------------* - * TD ISM binaural renderer ROM tables + * TD ISm binaural renderer ROM tables *----------------------------------------------------------------------------------*/ const int16_t HRTF_MODEL_N_CPTS_VAR[HRTF_MODEL_N_SECTIONS] = diff --git a/lib_rend/ivas_rotation.c b/lib_rend/ivas_rotation.c index 2a45c6d61a..2622d02308 100644 --- a/lib_rend/ivas_rotation.c +++ b/lib_rend/ivas_rotation.c @@ -30,7 +30,6 @@ *******************************************************************************************************/ -#include "ivas_cnst.h" #include #include #include "options.h" @@ -44,83 +43,6 @@ #include "wmc_auto.h" -/*-----------------------------------------------------------------------* - * ivas_headTrack_open() - * - * Allocate and initialize Head-Tracking handle - *-----------------------------------------------------------------------*/ - -ivas_error ivas_headTrack_open( - HEAD_TRACK_DATA_HANDLE *hHeadTrackData /* o : head track handle */ -) -{ - int16_t i; - ivas_error error; - - /* Allocate Head-Tracking handle */ - if ( ( *hHeadTrackData = (HEAD_TRACK_DATA_HANDLE) malloc( sizeof( HEAD_TRACK_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for head-tracking memory\n" ) ); - } - - /* Initialization */ - ( *hHeadTrackData )->num_quaternions = 0; - ( *hHeadTrackData )->lrSwitchInterpVal = 0.0f; - ( *hHeadTrackData )->lrSwitchedCurrent = 0; - ( *hHeadTrackData )->lrSwitchedNext = 0; -#ifdef FIX_I109_ORIENTATION_TRACKING - if ( ( ( *hHeadTrackData )->OrientationTracker = (ivas_orient_trk_state_t *) malloc( sizeof( ivas_orient_trk_state_t ) ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Orientation tracking" ); - } - - if ( ( error = ivas_orient_trk_Init( ( *hHeadTrackData )->OrientationTracker ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif - - /* Initialise Rmat_prev to I, Rmat will be computed later */ - for ( i = 0; i < 3; i++ ) - { - set_zero( ( *hHeadTrackData )->Rmat_prev[i], 3 ); - ( *hHeadTrackData )->Rmat_prev[i][i] = 1.0f; - } - - return IVAS_ERR_OK; -} - - -#ifdef FIX_I109_ORIENTATION_TRACKING -/*-----------------------------------------------------------------------* - * ivas_headTrack_close() - * - * Deallocate Head-Tracking handle - *-----------------------------------------------------------------------*/ - -void ivas_headTrack_close( - HEAD_TRACK_DATA_HANDLE *hHeadTrackData /* i/o: head track handle */ -) -{ - if ( hHeadTrackData == NULL || *hHeadTrackData == NULL ) - { - return; - } - - if ( ( *hHeadTrackData )->OrientationTracker != NULL ) - { - free( ( *hHeadTrackData )->OrientationTracker ); - ( *hHeadTrackData )->OrientationTracker = NULL; - } - - free( ( *hHeadTrackData ) ); - *hHeadTrackData = NULL; - - return; -} -#endif - - /*---------------------------------------------------------------------------------- * QuatToRotMat() * @@ -132,21 +54,7 @@ void QuatToRotMat( float Rmat[3][3] /* o : real-space rotation matrix for this rotation */ ) { -#ifdef FIX_I109_ORIENTATION_TRACKING - Rmat[0][0] = quat.w * quat.w + quat.x * quat.x - quat.y * quat.y - quat.z * quat.z; - Rmat[0][1] = 2.0f * ( quat.x * quat.y - quat.w * quat.z ); - Rmat[0][2] = 2.0f * ( quat.x * quat.z + quat.w * quat.y ); - - Rmat[1][0] = 2.0f * ( quat.x * quat.y + quat.w * quat.z ); - Rmat[1][1] = quat.w * quat.w - quat.x * quat.x + quat.y * quat.y - quat.z * quat.z; - Rmat[1][2] = 2.0f * ( quat.y * quat.z - quat.w * quat.x ); - - Rmat[2][0] = 2.0f * ( quat.x * quat.z - quat.w * quat.y ); - Rmat[2][1] = 2.0f * ( quat.y * quat.z + quat.w * quat.x ); - Rmat[2][2] = quat.w * quat.w - quat.x * quat.x - quat.y * quat.y + quat.z * quat.z; -#else float s1, s2, s3, c1, c2, c3; - #ifdef DEBUGGING /* PrintQuat( quat ); */ #endif @@ -155,11 +63,7 @@ void QuatToRotMat( * Euler angles instead of quaternions. In this case, all the w values must * be set to -3.0 in the trajectory file to signal switching to Euler angles. * The x,y, and z components of the quaternion are then interpreted as -#ifdef FIX_I109_ORIENTATION_TRACKING * yaw-pitch-roll. -#else // see below: "Euler angles in R_X(roll)*R_Y(pitch)*R_Z(yaw) convention" - * roll-pitch-yaw. -#endif */ if ( quat.w != -3.0 ) { @@ -204,23 +108,21 @@ void QuatToRotMat( Rmat[2][1] = c3 * s1 + c1 * s2 * s3; Rmat[2][2] = c1 * c2; } -#endif return; } -#ifndef FIX_I109_ORIENTATION_TRACKING /*------------------------------------------------------------------------- * Quat2Euler() * - * Quaternion handling: calculate corresponding Euler angles in radians + * Quaternion handling: calculate corresponding Euler angles *------------------------------------------------------------------------*/ void Quat2Euler( const IVAS_QUATERNION quat, /* i : quaternion describing the rotation */ - float *yaw, /* o : yaw (z) */ - float *pitch, /* o : pitch (y) */ - float *roll /* o : roll (x) */ + float *yaw, /* o : yaw */ + float *pitch, /* o : pitch */ + float *roll /* o : roll */ ) { if ( quat.w != -3.0 ) @@ -244,57 +146,7 @@ void Quat2Euler( return; } -#endif - -#ifdef FIX_I109_ORIENTATION_TRACKING -/*------------------------------------------------------------------------- - * Euler2Quat() - * - * Calculate corresponding Quaternion from Euler angles in radians - *------------------------------------------------------------------------*/ -void Euler2Quat( - const float yaw, /* i : yaw (x) */ - const float pitch, /* i : pitch (y) */ - const float roll, /* i : roll (z) */ - IVAS_QUATERNION *quat /* o : quaternion describing the rotation */ -) -{ - float cr = cosf( roll * 0.5f ); - float sr = sinf( roll * 0.5f ); - float cp = cosf( pitch * 0.5f ); - float sp = sinf( -pitch * 0.5f ); - float cy = cosf( yaw * 0.5f ); - float sy = sinf( yaw * 0.5f ); - - quat->w = cr * cp * cy - sr * sp * sy; - quat->x = sr * cp * cy + cr * sp * sy; - quat->y = cr * sp * cy - sr * cp * sy; - quat->z = cr * cp * sy + sr * sp * cy; - - return; -} - -/*------------------------------------------------------------------------- - * deg2rad() - * - * Converts degrees to normalized radians - *------------------------------------------------------------------------*/ -float deg2rad( - float degrees ) -{ - while ( degrees >= 180.0f ) - { - degrees = degrees - 360.0f; - } - while ( degrees <= -180.0f ) - { - degrees = degrees + 360.0f; - } - - return PI_OVER_180 * degrees; -} -#endif /*------------------------------------------------------------------------- * rotateAziEle() diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 13c6084b2d..586a43c4f8 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -221,25 +221,39 @@ typedef struct EFAP } EFAP, *EFAP_HANDLE; + /*----------------------------------------------------------------------------------* - * Orientation tracking structure + * Head rotation data structure *----------------------------------------------------------------------------------*/ -#ifdef FIX_I109_ORIENTATION_TRACKING -typedef struct ivas_orient_trk_state_t +typedef struct { - OTR_TRACKING_T trackingType; - float centerAdaptationRate; - float offCenterAdaptationRate; - float adaptationAngle; + int8_t headRotEnabled; + IVAS_QUATERNION headPositions[RENDERER_HEAD_POSITIONS_PER_FRAME]; + float crossfade[L_FRAME48k / RENDERER_HEAD_POSITIONS_PER_FRAME]; - float alpha; - IVAS_QUATERNION absAvgRot; /* average absolute orientation */ - IVAS_QUATERNION refRot; /* reference orientation */ - IVAS_QUATERNION trkRot; /* tracked rotation */ +} IVAS_REND_HeadRotData; + +typedef struct ivas_binaural_head_track_struct +{ + int16_t num_quaternions; + IVAS_QUATERNION Quaternions[MAX_PARAM_SPATIAL_SUBFRAMES]; + float Rmat[3][3]; + float Rmat_prev[3][3]; + + uint8_t lrSwitchedNext; + uint8_t lrSwitchedCurrent; + float lrSwitchInterpVal; + + int16_t shd_rot_max_order; + +} HEAD_TRACK_DATA, *HEAD_TRACK_DATA_HANDLE; + + +/*----------------------------------------------------------------------------------* + * Orientation tracking structure + *----------------------------------------------------------------------------------*/ -} ivas_orient_trk_state_t; -#else typedef struct ivas_orient_trk_state_t { OTR_TRACKING_T trackingType; @@ -266,52 +280,11 @@ typedef struct ivas_orient_trk_state_t float trkRoll; } ivas_orient_trk_state_t; -#endif - -/*----------------------------------------------------------------------------------* - * Head rotation data structure - *----------------------------------------------------------------------------------*/ - -typedef struct -{ - int8_t headRotEnabled; - IVAS_QUATERNION headPositions[RENDERER_HEAD_POSITIONS_PER_FRAME]; -#ifdef TD5 - IVAS_POSITION Pos[RENDERER_HEAD_POSITIONS_PER_FRAME]; -#endif - float crossfade[L_FRAME48k / RENDERER_HEAD_POSITIONS_PER_FRAME]; -#ifdef FIX_I109_ORIENTATION_TRACKING - ivas_orient_trk_state_t *hOrientationTracker; -#endif - -} IVAS_REND_HeadRotData; - -typedef struct ivas_binaural_head_track_struct -{ - int16_t num_quaternions; - IVAS_QUATERNION Quaternions[MAX_PARAM_SPATIAL_SUBFRAMES]; -#ifdef TD5 - IVAS_POSITION Pos[MAX_PARAM_SPATIAL_SUBFRAMES]; -#endif - float Rmat[3][3]; - float Rmat_prev[3][3]; - uint8_t lrSwitchedNext; - uint8_t lrSwitchedCurrent; - float lrSwitchInterpVal; - - int16_t shd_rot_max_order; -#ifdef FIX_I109_ORIENTATION_TRACKING - ivas_orient_trk_state_t *OrientationTracker; -#endif - -} HEAD_TRACK_DATA, *HEAD_TRACK_DATA_HANDLE; /*----------------------------------------------------------------------------------* * Reverberator structure *----------------------------------------------------------------------------------*/ -/* Reverberator structures */ - typedef struct ivas_roomAcoustics_t { @@ -333,9 +306,6 @@ typedef struct ivas_render_config_t ivas_renderTypeOverride renderer_type_override; #endif ivas_roomAcoustics_t roomAcoustics; -#ifdef TD5 - float directivity[3]; -#endif } RENDER_CONFIG_DATA, *RENDER_CONFIG_HANDLE; @@ -419,7 +389,7 @@ typedef struct ivas_reverb_state_t /*----------------------------------------------------------------------------------* - * TD ISM Object Renderer structure + * TD ISm Object Renderer structure *----------------------------------------------------------------------------------*/ typedef struct diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 450eb896a1..574396ce0e 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -121,8 +121,14 @@ typedef struct IVAS_REND_AudioObjectPosition currentPos; IVAS_REND_AudioObjectPosition previousPos; TDREND_WRAPPER tdRendWrapper; +#ifdef FIX_197_CREND_INTERFACE CREND_WRAPPER_HANDLE crendWrapper; - REVERB_HANDLE hReverb; +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND + REVERB_HANDLE reverb; +#endif +#else + CREND_WRAPPER crendWrapper; +#endif rotation_matrix rot_mat_prev; } input_ism; @@ -147,8 +153,14 @@ typedef struct LSSETUP_CUSTOM_STRUCT customLsInput; EFAP_WRAPPER efapInWrapper; TDREND_WRAPPER tdRendWrapper; +#ifdef FIX_197_CREND_INTERFACE CREND_WRAPPER_HANDLE crendWrapper; - REVERB_HANDLE hReverb; +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND + REVERB_HANDLE reverb; +#endif +#else + CREND_WRAPPER crendWrapper; +#endif rotation_gains rot_gains_prev; lfe_routing lfeRouting; } input_mc; @@ -157,7 +169,11 @@ typedef struct { input_base base; pan_matrix hoaDecMtx; +#ifdef FIX_197_CREND_INTERFACE CREND_WRAPPER_HANDLE crendWrapper; +#else + CREND_WRAPPER crendWrapper; +#endif rotation_gains rot_gains_prev; } input_sba; @@ -319,7 +335,11 @@ static int32_t limitRendererOutput( * *-------------------------------------------------------------------*/ +#ifdef FIX_197_CREND_INTERFACE AUDIO_CONFIG getIvasAudioConfigFromRendAudioConfig( +#else +AUDIO_CONFIG rendAudioConfigToIvasAudioConfig( +#endif IVAS_REND_AudioConfig rendConfig ) { switch ( rendConfig ) @@ -907,16 +927,11 @@ static ivas_error getEfapGains( return IVAS_ERR_OK; } -#ifdef FIX_I109_ORIENTATION_TRACKING -static ivas_error initHeadRotation( -#else static void initHeadRotation( -#endif IVAS_REND_HANDLE hIvasRend ) { int16_t i, crossfade_len; float tmp; - ivas_error error; /* Head rotation is enabled by default */ hIvasRend->headRotData.headRotEnabled = 1; @@ -935,36 +950,9 @@ static void initHeadRotation( hIvasRend->headRotData.headPositions[i] = quaternionInit(); } -#ifdef FIX_I109_ORIENTATION_TRACKING - if ( ( hIvasRend->headRotData.hOrientationTracker = (ivas_orient_trk_state_t *) malloc( sizeof( ivas_orient_trk_state_t ) ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Orientation tracking" ); - } - - if ( ( error = ivas_orient_trk_Init( hIvasRend->headRotData.hOrientationTracker ) ) != IVAS_ERR_OK ) - { - return error; - } - - return IVAS_ERR_OK; -#else return; -#endif } -#ifdef FIX_I109_ORIENTATION_TRACKING -static void closeHeadRotation( - IVAS_REND_HANDLE hIvasRend ) -{ - if ( ( hIvasRend != NULL ) && ( hIvasRend->headRotData.hOrientationTracker != NULL ) ) - { - free( hIvasRend->headRotData.hOrientationTracker ); - } - - return; -} -#endif - static void initRotMatrix( rotation_matrix rot_mat ) { @@ -1023,11 +1011,6 @@ static IVAS_REND_AudioObjectPosition defaultObjectPosition( pos.azimuth = 0.0f; pos.elevation = 0.0f; -#ifdef TD5 - pos.radius = 1.0f; - pos.yaw = 0.0f; - pos.pitch = 0.0f; -#endif return pos; } @@ -1073,21 +1056,6 @@ static CREND_WRAPPER defaultCrendWrapper( return w; } -static bool isIoConfigPairSupported( - IVAS_REND_AudioConfig inConfig, - IVAS_REND_AudioConfig outConfig ) -{ - /* Rendering mono or stereo to binaural is not supported */ - if ( ( inConfig == IVAS_REND_AUDIO_CONFIG_MONO || inConfig == IVAS_REND_AUDIO_CONFIG_STEREO ) && - getAudioConfigType( outConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) - { - return false; - } - - /* If not returned so far, config pair is supported */ - return true; -} - static ivas_error setRendInputActiveIsm( void *input, const IVAS_REND_AudioConfig inConfig, @@ -1103,61 +1071,64 @@ static ivas_error setRendInputActiveIsm( rendCtx = inputIsm->base.ctx; outConfig = *rendCtx.pOutConfig; - if ( !isIoConfigPairSupported( inConfig, outConfig ) ) - { - return IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED; - } - initRendInputBase( &inputIsm->base, inConfig, id, rendCtx ); inputIsm->currentPos = defaultObjectPosition(); inputIsm->previousPos = defaultObjectPosition(); +#ifdef FIX_197_CREND_INTERFACE inputIsm->crendWrapper = NULL; - inputIsm->hReverb = NULL; +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND + inputIsm->reverb = NULL; +#endif +#else + inputIsm->crendWrapper = defaultCrendWrapper(); +#endif inputIsm->tdRendWrapper = defaultTdRendWrapper(); initRotMatrix( inputIsm->rot_mat_prev ); error = IVAS_ERR_OK; if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL ) { -#ifdef TD5 - if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) -#else if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) -#endif { return error; } } else if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) { +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND if ( hRendCfg != NULL && hRendCfg->roomAcoustics.use_brir == 0 && hRendCfg->roomAcoustics.late_reverb_on ) { -#ifdef TD5 - if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) -#else if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) -#endif { return error; } - if ( ( error = ivas_reverb_open( &( inputIsm->hReverb ), getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, hRendCfg, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_reverb_open( &( inputIsm->reverb ), getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, hRendCfg, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) { return error; } } else { - if ( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, AUDIO_CONFIG_7_1_4, getIvasAudioConfigFromRendAudioConfig( outConfig ), hRendCfg, -#ifndef FIX_I109_ORIENTATION_TRACKING +#endif + if ( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, AUDIO_CONFIG_7_1_4, +#ifdef FIX_197_CREND_INTERFACE + getIvasAudioConfigFromRendAudioConfig( outConfig ), +#else + rendAudioConfigToIvasAudioConfig( outConfig ), +#endif + hRendCfg, +#ifdef FIX_197_CREND_INTERFACE 0, #endif NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) { return error; } +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND } +#endif } return IVAS_ERR_OK; @@ -1173,10 +1144,21 @@ static void clearInputIsm( initRendInputBase( &inputIsm->base, IVAS_REND_AUDIO_CONFIG_UNKNOWN, 0, rendCtx ); /* Free input's internal handles */ +#ifdef FIX_197_CREND_INTERFACE + if ( inputIsm->crendWrapper != NULL ) +#else + if ( inputIsm->crendWrapper.hCrend != NULL ) +#endif + { + ivas_rend_closeCrend( &inputIsm->crendWrapper ); + } - ivas_rend_closeCrend( &inputIsm->crendWrapper ); - - ivas_reverb_close( &inputIsm->hReverb ); +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND + if ( inputIsm->reverb != NULL ) + { + ivas_reverb_close( &inputIsm->reverb ); + } +#endif if ( inputIsm->tdRendWrapper.hBinRendererTd != NULL ) { @@ -1234,8 +1216,6 @@ static void fillIdentityPanMatrix( { panMatrix[i][i] = 1.0f; } - - return; } static ivas_error initMcPanGainsWithIdentMatrix( @@ -1253,14 +1233,20 @@ static ivas_error initMcPanGainsWithConversionMapping( AUDIO_CONFIG ivasConfigIn, ivasConfigOut; int16_t i; +#ifdef FIX_197_CREND_INTERFACE ivasConfigIn = getIvasAudioConfigFromRendAudioConfig( inputMc->base.inConfig ); ivasConfigOut = getIvasAudioConfigFromRendAudioConfig( outConfig ); +#else + ivasConfigIn = rendAudioConfigToIvasAudioConfig( inputMc->base.inConfig ); + ivasConfigOut = rendAudioConfigToIvasAudioConfig( outConfig ); +#endif /* Find conversion mapping for current I/O config pair. * Stay with default panning matrix if conversion_matrix is NULL */ for ( i = 0; i < LS_SETUP_CONVERSION_NUM_MAPPINGS; ++i ) { - if ( ls_conversion_mapping[i].input_config == ivasConfigIn && ls_conversion_mapping[i].output_config == ivasConfigOut ) + if ( ls_conversion_mapping[i].input_config == ivasConfigIn && + ls_conversion_mapping[i].output_config == ivasConfigOut ) { /* Mapping found with valid matrix - copy */ if ( ls_conversion_mapping[i].conversion_matrix != NULL ) @@ -1816,9 +1802,21 @@ static ivas_error initMcBinauralRendering( inputMc->tdRendWrapper.hHrtfTD = NULL; } - ivas_rend_closeCrend( &inputMc->crendWrapper ); +#ifdef FIX_197_CREND_INTERFACE + if ( inputMc->crendWrapper != NULL ) +#else + if ( inputMc->crendWrapper.hCrend != NULL ) +#endif + { + ivas_rend_closeCrend( &inputMc->crendWrapper ); + } - ivas_reverb_close( &inputMc->hReverb ); +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND + if ( inputMc->reverb != NULL ) + { + ivas_reverb_close( &inputMc->reverb ); + } +#endif if ( inputMc->efapInWrapper.hEfap != NULL ) { @@ -1845,27 +1843,32 @@ static ivas_error initMcBinauralRendering( // if ( initTDRend ) { -#ifdef TD5 - if ( ( error = ivas_td_binaural_open_ext( &inputMc->tdRendWrapper, inConfig, hRendCfg, &inputMc->customLsInput, outSampleRate ) ) != IVAS_ERR_OK ) -#else if ( ( error = ivas_td_binaural_open_ext( &inputMc->tdRendWrapper, inConfig, &inputMc->customLsInput, outSampleRate ) ) != IVAS_ERR_OK ) -#endif { return error; } +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND if ( hRendCfg != NULL && hRendCfg->roomAcoustics.use_brir == 0 && hRendCfg->roomAcoustics.late_reverb_on ) { - if ( ( error = ivas_reverb_open( &( inputMc->hReverb ), getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, hRendCfg, outSampleRate ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_reverb_open( &( inputMc->reverb ), getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, hRendCfg, outSampleRate ) ) != IVAS_ERR_OK ) { return error; } } +#endif } { - if ( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) ? AUDIO_CONFIG_7_1_4 : getIvasAudioConfigFromRendAudioConfig( inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), hRendCfg, -#ifndef FIX_I109_ORIENTATION_TRACKING + if ( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, +#ifdef FIX_197_CREND_INTERFACE + ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) ? AUDIO_CONFIG_7_1_4 : getIvasAudioConfigFromRendAudioConfig( inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), +#else + ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) ? AUDIO_CONFIG_7_1_4 : rendAudioConfigToIvasAudioConfig( inConfig ), + rendAudioConfigToIvasAudioConfig( outConfig ), +#endif + hRendCfg, +#ifdef FIX_197_CREND_INTERFACE 0, #endif NULL, outSampleRate ) ) != IVAS_ERR_OK ) @@ -1892,7 +1895,7 @@ static lfe_routing defaultLfeRouting( const IVAS_REND_AudioConfig outConfig, const LSSETUP_CUSTOM_STRUCT customLsOut ) { - int16_t i; + int32_t i; lfe_routing routing; /* Set all output gains to zero, then route each input LFE consecutively to the next available output LFE. */ @@ -1959,17 +1962,18 @@ static ivas_error setRendInputActiveMc( rendCtx = inputMc->base.ctx; outConfig = *rendCtx.pOutConfig; - if ( !isIoConfigPairSupported( inConfig, outConfig ) ) - { - return IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED; - } - initRendInputBase( &inputMc->base, inConfig, id, rendCtx ); setZeroPanMatrix( inputMc->panGains ); inputMc->customLsInput = defaultCustomLs(); inputMc->tdRendWrapper = defaultTdRendWrapper(); +#ifdef FIX_197_CREND_INTERFACE inputMc->crendWrapper = NULL; - inputMc->hReverb = NULL; +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND + inputMc->reverb = NULL; +#endif +#else + inputMc->crendWrapper = defaultCrendWrapper(); +#endif initRotGains( inputMc->rot_gains_prev ); inputMc->lfeRouting = defaultLfeRouting( inConfig, inputMc->customLsInput, outConfig, *inputMc->base.ctx.pCustomLsOut ); @@ -2004,9 +2008,21 @@ static void clearInputMc( efap_free_data( &inputMc->efapInWrapper.hEfap ); } - ivas_rend_closeCrend( &inputMc->crendWrapper ); +#ifdef FIX_197_CREND_INTERFACE + if ( inputMc->crendWrapper != NULL ) +#else + if ( inputMc->crendWrapper.hCrend != NULL ) +#endif + { + ivas_rend_closeCrend( &inputMc->crendWrapper ); + } - ivas_reverb_close( &inputMc->hReverb ); +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND + if ( inputMc->reverb != NULL ) + { + ivas_reverb_close( &inputMc->reverb ); + } +#endif if ( inputMc->tdRendWrapper.hBinRendererTd != NULL ) { @@ -2044,7 +2060,11 @@ static ivas_error initSbaPanGainsForMcOut( case IVAS_REND_AUDIO_CONFIG_MONO: hOutSetup.ls_azimuth = ls_azimuth_CICP1; hOutSetup.ls_elevation = ls_elevation_CICP1; +#ifdef FIX_197_CREND_INTERFACE ivas_output_init( &hOutSetup, getIvasAudioConfigFromRendAudioConfig( outConfig ) ); +#else + ivas_output_init( &hOutSetup, rendAudioConfigToIvasAudioConfig( outConfig ) ); +#endif break; case IVAS_REND_AUDIO_CONFIG_STEREO: case IVAS_REND_AUDIO_CONFIG_5_1: @@ -2052,7 +2072,11 @@ static ivas_error initSbaPanGainsForMcOut( case IVAS_REND_AUDIO_CONFIG_5_1_2: case IVAS_REND_AUDIO_CONFIG_5_1_4: case IVAS_REND_AUDIO_CONFIG_7_1_4: +#ifdef FIX_197_CREND_INTERFACE ivas_output_init( &hOutSetup, getIvasAudioConfigFromRendAudioConfig( outConfig ) ); +#else + ivas_output_init( &hOutSetup, rendAudioConfigToIvasAudioConfig( outConfig ) ); +#endif break; case IVAS_REND_AUDIO_CONFIG_LS_CUSTOM: ivas_ls_custom_setup( &hOutSetup, outSetupCustom ); @@ -2133,10 +2157,15 @@ static ivas_error updateSbaPanGains( { case IVAS_REND_AUDIO_CONFIG_BINAURAL: error = ivas_rend_openCrend( &inputSba->crendWrapper, +#ifdef FIX_197_CREND_INTERFACE getIvasAudioConfigFromRendAudioConfig( inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), +#else + rendAudioConfigToIvasAudioConfig( inConfig ), + rendAudioConfigToIvasAudioConfig( outConfig ), +#endif hRendCfg, -#ifndef FIX_I109_ORIENTATION_TRACKING +#ifdef FIX_197_CREND_INTERFACE 0, #endif NULL, @@ -2150,9 +2179,13 @@ static ivas_error updateSbaPanGains( error = ivas_rend_openCrend( &inputSba->crendWrapper, AUDIO_CONFIG_7_1_4, +#ifdef FIX_197_CREND_INTERFACE getIvasAudioConfigFromRendAudioConfig( outConfig ), +#else + rendAudioConfigToIvasAudioConfig( outConfig ), +#endif hRendCfg, -#ifndef FIX_I109_ORIENTATION_TRACKING +#ifdef FIX_197_CREND_INTERFACE 0, #endif NULL, @@ -2189,14 +2222,13 @@ static ivas_error setRendInputActiveSba( rendCtx = inputSba->base.ctx; outConfig = *rendCtx.pOutConfig; - if ( !isIoConfigPairSupported( inConfig, outConfig ) ) - { - return IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED; - } - initRendInputBase( &inputSba->base, inConfig, id, rendCtx ); setZeroPanMatrix( inputSba->hoaDecMtx ); +#ifdef FIX_197_CREND_INTERFACE inputSba->crendWrapper = NULL; +#else + inputSba->crendWrapper = defaultCrendWrapper(); +#endif initRotGains( inputSba->rot_gains_prev ); if ( ( error = updateSbaPanGains( inputSba, outConfig, hRendCfg ) ) != IVAS_ERR_OK ) @@ -2217,7 +2249,14 @@ static void clearInputSba( initRendInputBase( &inputSba->base, IVAS_REND_AUDIO_CONFIG_UNKNOWN, 0, rendCtx ); /* Free input's internal handles */ - ivas_rend_closeCrend( &inputSba->crendWrapper ); +#ifdef FIX_197_CREND_INTERFACE + if ( inputSba->crendWrapper != NULL ) +#else + if ( inputSba->crendWrapper.hCrend != NULL ) +#endif + { + ivas_rend_closeCrend( &inputSba->crendWrapper ); + } return; } @@ -2234,7 +2273,11 @@ static ivas_error initMasaDummyDecForMcOut( DecoderDummy *decDummy; decDummy = inputMasa->decDummy; +#ifdef FIX_197_CREND_INTERFACE output_config = getIvasAudioConfigFromRendAudioConfig( outConfig ); +#else + output_config = rendAudioConfigToIvasAudioConfig( outConfig ); +#endif decDummy->hDecoderConfig->output_config = output_config; decDummy->hDecoderConfig->ivas_total_brate = IVAS_512k; /* Todo Nokia: This is preventing initialization of 2TC as 1TC, should be fixed properly in ivas_dirac_dec_config() */ @@ -2271,6 +2314,9 @@ static ivas_error initMasaDummyDecForMcOut( { return error; } +#ifndef FIX_107_5MS_SUBFRAME_RENDERING + decDummy->hDiracDecBin->useSubframeMode = 0; /* Todo Nokia: This will disappear in later work but needs to be this now. */ +#endif } numCldfbAnalyses = decDummy->nchan_transport; @@ -2316,7 +2362,11 @@ static ivas_error initMasaDummyDecForSbaOut( decDummy = inputMasa->decDummy; +#ifdef FIX_197_CREND_INTERFACE output_config = getIvasAudioConfigFromRendAudioConfig( outConfig ); +#else + output_config = rendAudioConfigToIvasAudioConfig( outConfig ); +#endif decDummy->hDecoderConfig->output_config = output_config; decDummy->hDecoderConfig->ivas_total_brate = IVAS_512k; /* Todo Nokia: This is preventing initialization of 2TC as 1TC, should be fixed properly in ivas_dirac_dec_config() */ @@ -2383,7 +2433,11 @@ static ivas_error initMasaDummyDecForBinauralOut( decDummy = inputMasa->decDummy; +#ifdef FIX_197_CREND_INTERFACE output_config = getIvasAudioConfigFromRendAudioConfig( outConfig ); +#else + output_config = rendAudioConfigToIvasAudioConfig( outConfig ); +#endif decDummy->hDecoderConfig->output_config = output_config; output_config = decDummy->hDecoderConfig->output_config; @@ -2403,6 +2457,11 @@ static ivas_error initMasaDummyDecForBinauralOut( } decDummy->ivas_format = MASA_FORMAT; decDummy->transport_config = AUDIO_CONFIG_INVALID; +#ifndef REMOVE_FORCE_SUBFRAME_BIN +#ifdef DEBUGGING + decDummy->hDecoderConfig->forceSubframeBinauralization = 0; +#endif +#endif if ( ( error = ivas_dirac_dec_open( decDummy ) ) != IVAS_ERR_OK ) { @@ -2419,6 +2478,9 @@ static ivas_error initMasaDummyDecForBinauralOut( return error; } +#ifndef FIX_107_5MS_SUBFRAME_RENDERING + decDummy->hDiracDecBin->useSubframeMode = 0; /* Todo Nokia: This will disappear in later work but needs to be this now. */ +#endif for ( i = 0; i < BINAURAL_CHANNELS; i++ ) { @@ -2484,12 +2546,17 @@ static DecoderDummy *initDecoderDummy( decDummy = malloc( sizeof( DecoderDummy ) ); decDummy->hDecoderConfig = malloc( sizeof( DECODER_CONFIG ) ); decDummy->hDecoderConfig->output_Fs = sampleRate; - decDummy->hDecoderConfig->nchan_out = numOutChannels; + decDummy->hDecoderConfig->nchan_out = (int16_t) numOutChannels; decDummy->hDecoderConfig->Opt_Headrotation = 0; decDummy->hBinRenderer = NULL; decDummy->hEFAPdata = NULL; +#ifdef FIX_197_CREND_INTERFACE decDummy->hCrendWrapper = NULL; +#else + decDummy->hHrtf = NULL; + decDummy->hCrend = NULL; +#endif decDummy->hHrtfTD = NULL; decDummy->hSpar = NULL; decDummy->hoa_dec_mtx = NULL; @@ -2497,7 +2564,11 @@ static DecoderDummy *initDecoderDummy( decDummy->hMasa = NULL; decDummy->hDiracDecBin = NULL; decDummy->hQMetaData = NULL; +#ifdef FIX_197_CREND_INTERFACE decDummy->hDecoderConfig->output_config = getIvasAudioConfigFromRendAudioConfig( outConfig ); +#else + decDummy->hDecoderConfig->output_config = rendAudioConfigToIvasAudioConfig( outConfig ); +#endif decDummy->nchan_transport = numTransChannels; if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) @@ -2514,10 +2585,6 @@ static DecoderDummy *initDecoderDummy( decDummy->hHeadTrackData->lrSwitchInterpVal = 0.0f; decDummy->hHeadTrackData->lrSwitchedCurrent = 0; decDummy->hHeadTrackData->lrSwitchedNext = 0; -#ifdef FIX_I109_ORIENTATION_TRACKING - decDummy->hHeadTrackData->OrientationTracker = (ivas_orient_trk_state_t *) malloc( sizeof( ivas_orient_trk_state_t ) ); - ivas_orient_trk_Init( decDummy->hHeadTrackData->OrientationTracker ); -#endif } else { @@ -2557,18 +2624,13 @@ static ivas_error setRendInputActiveMasa( outConfig = *rendCtx.pOutConfig; (void) hRendCfg; /* Suppress warning */ - if ( !isIoConfigPairSupported( inConfig, outConfig ) ) - { - return IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED; - } - initRendInputBase( &inputMasa->base, inConfig, id, rendCtx ); if ( ( error = getAudioConfigNumChannels( inConfig, &numInChannels ) ) != IVAS_ERR_OK ) { return error; } - inputMasa->decDummy = initDecoderDummy( *rendCtx.pOutSampleRate, numInChannels, outConfig, 0 ); + inputMasa->decDummy = initDecoderDummy( *rendCtx.pOutSampleRate, (int16_t) numInChannels, outConfig, 0 ); inputMasa->metadataHasBeenFed = false; if ( ( error = updateMasaDummyDec( inputMasa, outConfig ) ) != IVAS_ERR_OK ) @@ -2595,15 +2657,8 @@ static void freeDecoderDummy( { free( pDecDummy->hDecoderConfig ); } - if ( pDecDummy->hHeadTrackData != NULL ) { -#ifdef FIX_I109_ORIENTATION_TRACKING - if ( pDecDummy->hHeadTrackData->OrientationTracker != NULL ) - { - free( pDecDummy->hHeadTrackData->OrientationTracker ); - } -#endif free( pDecDummy->hHeadTrackData ); } ivas_render_config_close( &pDecDummy->hRenderConfig ); @@ -2614,6 +2669,7 @@ static void freeDecoderDummy( if ( pDecDummy->cldfbAnaDec[i] != NULL ) { deleteCldfb( &( pDecDummy->cldfbAnaDec[i] ) ); + pDecDummy->cldfbAnaDec[i] = NULL; } } @@ -2622,11 +2678,16 @@ static void freeDecoderDummy( if ( pDecDummy->cldfbSynDec[i] != NULL ) { deleteCldfb( &( pDecDummy->cldfbSynDec[i] ) ); + pDecDummy->cldfbSynDec[i] = NULL; } } /* DirAC handle */ - ivas_dirac_dec_close( &( pDecDummy->hDirAC ) ); + if ( pDecDummy->hDirAC != NULL ) + { + ivas_dirac_dec_close( pDecDummy->hDirAC ); + pDecDummy->hDirAC = NULL; + } /* Qmetadata handle */ ivas_qmetadata_close( &pDecDummy->hQMetaData ); @@ -2673,7 +2734,10 @@ ivas_error IVAS_REND_Open( ivas_error error; int16_t numOutChannels; - /* Validate function arguments */ + /*-----------------------------------------------------------------* + * Validate function arguments + *-----------------------------------------------------------------*/ + if ( phIvasRend == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -2718,14 +2782,7 @@ ivas_error IVAS_REND_Open( } /* Initialize headrotation data */ -#ifdef FIX_I109_ORIENTATION_TRACKING - if ( ( error = initHeadRotation( hIvasRend ) ) != IVAS_ERR_OK ) - { - return error; - } -#else initHeadRotation( hIvasRend ); -#endif /* Initialize EFAP */ if ( ( error = initEfap( &hIvasRend->efapOutWrapper, outConfig, &hIvasRend->customLsOut ) ) != IVAS_ERR_OK ) @@ -2737,8 +2794,14 @@ ivas_error IVAS_REND_Open( for ( i = 0; i < RENDERER_MAX_ISM_INPUTS; ++i ) { initRendInputBase( &hIvasRend->inputsIsm[i].base, IVAS_REND_AUDIO_CONFIG_UNKNOWN, 0, getRendCtx( hIvasRend ) ); +#ifdef FIX_197_CREND_INTERFACE hIvasRend->inputsIsm[i].crendWrapper = NULL; - hIvasRend->inputsIsm[i].hReverb = NULL; +#else + hIvasRend->inputsIsm[i].crendWrapper.hCrend = NULL; +#endif +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND + hIvasRend->inputsIsm[i].reverb = NULL; +#endif hIvasRend->inputsIsm[i].tdRendWrapper.hBinRendererTd = NULL; } @@ -2746,15 +2809,25 @@ ivas_error IVAS_REND_Open( { initRendInputBase( &hIvasRend->inputsMc[i].base, IVAS_REND_AUDIO_CONFIG_UNKNOWN, 0, getRendCtx( hIvasRend ) ); hIvasRend->inputsMc[i].efapInWrapper.hEfap = NULL; +#ifdef FIX_197_CREND_INTERFACE hIvasRend->inputsMc[i].crendWrapper = NULL; - hIvasRend->inputsMc[i].hReverb = NULL; +#else + hIvasRend->inputsMc[i].crendWrapper.hCrend = NULL; +#endif +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND + hIvasRend->inputsMc[i].reverb = NULL; +#endif hIvasRend->inputsMc[i].tdRendWrapper.hBinRendererTd = NULL; } for ( i = 0; i < RENDERER_MAX_SBA_INPUTS; ++i ) { initRendInputBase( &hIvasRend->inputsSba[i].base, IVAS_REND_AUDIO_CONFIG_UNKNOWN, 0, getRendCtx( hIvasRend ) ); +#ifdef FIX_197_CREND_INTERFACE hIvasRend->inputsSba[i].crendWrapper = NULL; +#else + hIvasRend->inputsSba[i].crendWrapper.hCrend = NULL; +#endif } for ( i = 0; i < RENDERER_MAX_MASA_INPUTS; ++i ) @@ -2832,7 +2905,10 @@ ivas_error IVAS_REND_ConfigureCustomOutputLoudspeakerLayout( input_mc *inputMc; input_sba *inputSba; - /* Validate function arguments */ + /*-----------------------------------------------------------------* + * Validate function arguments + *-----------------------------------------------------------------*/ + if ( hIvasRend == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -2914,7 +2990,10 @@ ivas_error IVAS_REND_NumOutChannels( { ivas_error error; - /* Validate function arguments */ + /*-----------------------------------------------------------------* + * Validate function arguments + *-----------------------------------------------------------------*/ + if ( hIvasRend == NULL || numOutChannels == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -3137,7 +3216,10 @@ ivas_error IVAS_REND_AddInput( ivas_error ( *activateInput )( void *, IVAS_REND_AudioConfig, IVAS_REND_InputId, RENDER_CONFIG_DATA * ); int32_t inputIndex; - /* Validate function arguments */ + /*-----------------------------------------------------------------* + * Validate function arguments + *-----------------------------------------------------------------*/ + if ( hIvasRend == NULL || inputId == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -3206,7 +3288,10 @@ ivas_error IVAS_REND_ConfigureCustomInputLoudspeakerLayout( input_mc *inputMc; ivas_error error; - /* Validate function arguments */ + /*-----------------------------------------------------------------* + * Validate function arguments + *-----------------------------------------------------------------*/ + if ( hIvasRend == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -3272,7 +3357,10 @@ ivas_error IVAS_REND_SetInputGain( input_base *inputBase; ivas_error error; - /* Validate function arguments */ + /*-----------------------------------------------------------------* + * Validate function arguments + *-----------------------------------------------------------------*/ + if ( hIvasRend == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -3306,7 +3394,10 @@ ivas_error IVAS_REND_SetInputLfeMtx( input_mc *pInputMc; ivas_error error; - /* Validate function arguments */ + /*-----------------------------------------------------------------* + * Validate function arguments + *-----------------------------------------------------------------*/ + if ( hIvasRend == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -3357,7 +3448,10 @@ ivas_error IVAS_REND_SetInputLfePos( input_mc *pInputMc; ivas_error error; - /* Validate function arguments */ + /*-----------------------------------------------------------------* + * Validate function arguments + *-----------------------------------------------------------------*/ + if ( hIvasRend == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -3403,7 +3497,10 @@ ivas_error IVAS_REND_RemoveInput( ivas_error error; input_base *inputBase; - /* Validate function arguments */ + /*-----------------------------------------------------------------* + * Validate function arguments + *-----------------------------------------------------------------*/ + if ( hIvasRend == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -3451,7 +3548,10 @@ ivas_error IVAS_REND_GetInputNumChannels( ivas_error error; const input_base *pInput; - /* Validate function arguments */ + /*-----------------------------------------------------------------* + * Validate function arguments + *-----------------------------------------------------------------*/ + if ( hIvasRend == NULL || numChannels == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -3490,7 +3590,10 @@ ivas_error IVAS_REND_GetDelay( int32_t latency_ns; int32_t max_latency_ns; - /* Validate function arguments */ + /*-----------------------------------------------------------------* + * Validate function arguments + *-----------------------------------------------------------------*/ + if ( hIvasRend == NULL || nSamples == NULL || timeScale == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -3505,8 +3608,13 @@ ivas_error IVAS_REND_GetDelay( { if ( hIvasRend->inputsIsm[i].base.inConfig != IVAS_REND_AUDIO_CONFIG_UNKNOWN ) { +#ifdef FIX_197_CREND_INTERFACE latency_ns = max( ( hIvasRend->inputsIsm[i].crendWrapper != NULL ) ? hIvasRend->inputsIsm[i].crendWrapper->binaural_latency_ns : 0, hIvasRend->inputsIsm[i].tdRendWrapper.binaural_latency_ns ); +#else + latency_ns = max( hIvasRend->inputsIsm[i].crendWrapper.binaural_latency_ns, + hIvasRend->inputsIsm[i].tdRendWrapper.binaural_latency_ns ); +#endif max_latency_ns = max( max_latency_ns, latency_ns ); } } @@ -3515,8 +3623,13 @@ ivas_error IVAS_REND_GetDelay( { if ( hIvasRend->inputsMc[i].base.inConfig != IVAS_REND_AUDIO_CONFIG_UNKNOWN ) { +#ifdef FIX_197_CREND_INTERFACE latency_ns = max( ( hIvasRend->inputsMc[i].crendWrapper != NULL ) ? hIvasRend->inputsMc[i].crendWrapper->binaural_latency_ns : 0, hIvasRend->inputsMc[i].tdRendWrapper.binaural_latency_ns ); +#else + latency_ns = max( hIvasRend->inputsMc[i].crendWrapper.binaural_latency_ns, + hIvasRend->inputsMc[i].tdRendWrapper.binaural_latency_ns ); +#endif max_latency_ns = max( max_latency_ns, latency_ns ); } } @@ -3525,7 +3638,11 @@ ivas_error IVAS_REND_GetDelay( { if ( hIvasRend->inputsSba[i].base.inConfig != IVAS_REND_AUDIO_CONFIG_UNKNOWN ) { +#ifdef FIX_197_CREND_INTERFACE latency_ns = ( hIvasRend->inputsSba[i].crendWrapper != NULL ) ? hIvasRend->inputsSba[i].crendWrapper->binaural_latency_ns : 0; +#else + latency_ns = hIvasRend->inputsSba[i].crendWrapper.binaural_latency_ns; +#endif max_latency_ns = max( max_latency_ns, latency_ns ); } } @@ -3561,7 +3678,10 @@ ivas_error IVAS_REND_FeedInputAudio( input_base *inputBase; int16_t numInputChannels; - /* Validate function arguments */ + /*-----------------------------------------------------------------* + * Validate function arguments + *-----------------------------------------------------------------*/ + if ( hIvasRend == NULL || inputAudio.data == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -3625,7 +3745,10 @@ ivas_error IVAS_REND_FeedInputObjectMetadata( input_ism *inputIsm; ivas_error error; - /* Validate function arguments */ + /*-----------------------------------------------------------------* + * Validate function arguments + *-----------------------------------------------------------------*/ + if ( hIvasRend == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -3666,7 +3789,10 @@ ivas_error IVAS_REND_FeedInputMasaMetadata( input_base *inputBase; input_masa *inputMasa; - /* Validate function arguments */ + /*-----------------------------------------------------------------* + * Validate function arguments + *-----------------------------------------------------------------*/ + if ( hIvasRend == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -3713,6 +3839,7 @@ ivas_error IVAS_REND_InitConfig( hIvasRend->rendererConfigEnabled = 0; } +#ifdef FIX_197_CREND_INTERFACE if ( rendererConfigEnabled ) { if ( ( error = ivas_render_config_open( &( hIvasRend->hRendererConfig ) ) ) != IVAS_ERR_OK ) @@ -3720,15 +3847,26 @@ ivas_error IVAS_REND_InitConfig( return error; } - if ( ( error = ivas_render_config_init_from_rom( &hIvasRend->hRendererConfig, hIvasRend->rendererConfigEnabled ) ) != IVAS_ERR_OK ) + if ( ivas_render_config_init_from_rom( &hIvasRend->hRendererConfig, hIvasRend->rendererConfigEnabled ) != IVAS_ERR_OK ) { - return error; + return IVAS_ERR_INTERNAL_FATAL; } } else { hIvasRend->hRendererConfig = NULL; } +#else + if ( ( error = ivas_render_config_open( &( hIvasRend->hRendererConfig ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ivas_render_config_init_from_rom( &hIvasRend->hRendererConfig, hIvasRend->rendererConfigEnabled ) != IVAS_ERR_OK ) + { + return IVAS_ERR_INTERNAL_FATAL; + } +#endif return IVAS_ERR_OK; } @@ -3801,9 +3939,6 @@ int16_t IVAS_REND_FeedRenderConfig( } hRenderConfig = hIvasRend->hRendererConfig; -#ifdef TD5 - mvr2r( renderConfig.directivity, hRenderConfig->directivity, 3 ); -#endif #ifdef DEBUGGING hRenderConfig->renderer_type_override = RENDER_TYPE_OVERRIDE_NONE; if ( renderConfig.renderer_type_override == IVAS_RENDER_TYPE_OVERRIDE_FASTCONV ) @@ -3836,21 +3971,16 @@ int16_t IVAS_REND_FeedRenderConfig( *-------------------------------------------------------------------*/ ivas_error IVAS_REND_SetHeadRotation( - IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ -#ifdef TD5 - const IVAS_QUATERNION headRot[RENDERER_HEAD_POSITIONS_PER_FRAME], /* i : head orientations for next rendering call */ - const IVAS_POSITION Pos[RENDERER_HEAD_POSITIONS_PER_FRAME] /* i : listener positions for next rendering call */ -#else + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ const IVAS_QUATERNION headRot[RENDERER_HEAD_POSITIONS_PER_FRAME] /* i : head positions for next rendering call */ -#endif ) { int16_t i; -#ifdef FIX_I109_ORIENTATION_TRACKING - IVAS_QUATERNION rotQuat; -#endif - /* Validate function arguments */ + /*-----------------------------------------------------------------* + * Validate function arguments + *-----------------------------------------------------------------*/ + if ( hIvasRend == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -3859,7 +3989,7 @@ ivas_error IVAS_REND_SetHeadRotation( if ( getAudioConfigType( hIvasRend->outputConfig ) != IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) { /* Head rotation can be set only with binaural output */ - return IVAS_ERR_INVALID_OUTPUT_FORMAT; + return IVAS_ERR_METADATA_NOT_EXPECTED; } if ( headRot == NULL ) @@ -3871,24 +4001,7 @@ ivas_error IVAS_REND_SetHeadRotation( hIvasRend->headRotData.headRotEnabled = 1; for ( i = 0; i < RENDERER_HEAD_POSITIONS_PER_FRAME; ++i ) { -#ifdef FIX_I109_ORIENTATION_TRACKING - /* check for Euler angle signaling */ - if ( headRot[i].w == -3.0f ) - { - Euler2Quat( deg2rad( headRot[i].x ), deg2rad( headRot[i].y ), deg2rad( headRot[i].z ), &rotQuat ); - } - else - { - rotQuat = headRot[i]; - } - - ivas_orient_trk_Process( hIvasRend->headRotData.hOrientationTracker, rotQuat, FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES, &hIvasRend->headRotData.headPositions[i] ); -#else hIvasRend->headRotData.headPositions[i] = headRot[i]; -#endif -#ifdef TD5 - hIvasRend->headRotData.Pos[i] = Pos[i]; -#endif } } @@ -3896,164 +4009,6 @@ ivas_error IVAS_REND_SetHeadRotation( } -#ifdef FIX_I109_ORIENTATION_TRACKING -/*-------------------------------------------------------------------* - * IVAS_REND_SetOrientationTrackingMode() - * - * - *-------------------------------------------------------------------*/ - -ivas_error IVAS_REND_SetOrientationTrackingMode( - IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ - const uint8_t otrMode /* i : Orientation tracking mode */ -) -{ - OTR_TRACKING_T mode; - ivas_error error; - - if ( hIvasRend == NULL ) - { - return IVAS_ERR_UNEXPECTED_NULL_POINTER; - } - - switch ( otrMode ) - { - case IVAS_ORIENT_TRK_AVG: - mode = OTR_TRACKING_AVG_ORIENT; - break; - case IVAS_ORIENT_TRK_REF: - mode = OTR_TRACKING_REF_ORIENT; - break; -#ifdef OTR_REFERENCE_VECTOR_TRACKING - case IVAS_ORIENT_TRK_REF_VEC: - mode = OTR_TRACKING_REF_VEC; - break; - case IVAS_ORIENT_TRK_REF_VEC_LEV: - mode = OTR_TRACKING_REF_VEC_LEV; - break; -#endif /* OTR_REFERENCE_VECTOR_TRACKING */ - case IVAS_ORIENT_TRK_NONE: - default: - mode = OTR_TRACKING_NONE; - break; - } - - if ( ( error = ivas_orient_trk_SetTrackingType( hIvasRend->headRotData.hOrientationTracker, mode ) ) != IVAS_ERR_OK ) - { - return error; - } - - return IVAS_ERR_OK; -} - - -/*-------------------------------------------------------------------* - * IVAS_REND_SetReferenceRotation() - * - * - *-------------------------------------------------------------------*/ - -ivas_error IVAS_REND_SetReferenceRotation( - IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ - const IVAS_QUATERNION refRot /* i : Reference rotation */ -) -{ - ivas_error error; - - /* Validate function arguments */ - if ( hIvasRend == NULL ) - { - return IVAS_ERR_UNEXPECTED_NULL_POINTER; - } - - if ( ( error = ivas_orient_trk_SetReferenceRotation( hIvasRend->headRotData.hOrientationTracker, refRot ) ) != IVAS_ERR_OK ) - { - return error; - } - - return IVAS_ERR_OK; -} - - -/*-------------------------------------------------------------------* - * IVAS_REND_GetMainOrientation() - * - * - *-------------------------------------------------------------------*/ - -ivas_error IVAS_REND_GetMainOrientation( - IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ - IVAS_QUATERNION *pOrientation /* i/o: Quaternion pointer for main orientation */ -) -{ - ivas_error error; - - if ( hIvasRend == NULL || pOrientation == NULL ) - { - return IVAS_ERR_UNEXPECTED_NULL_POINTER; - } - - if ( ( error = ivas_orient_trk_GetMainOrientation( hIvasRend->headRotData.hOrientationTracker, pOrientation ) ) != IVAS_ERR_OK ) - { - return error; - } - - return IVAS_ERR_OK; -} - - -/*-------------------------------------------------------------------* - * IVAS_REND_GetTrackedRotation() - * - * - *-------------------------------------------------------------------*/ - -ivas_error IVAS_REND_GetTrackedRotation( - IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ - IVAS_QUATERNION *pRotation /* i/o: Quaternion pointer processed rotation */ -) -{ - ivas_error error; - - if ( hIvasRend == NULL || pRotation == NULL ) - { - return IVAS_ERR_UNEXPECTED_NULL_POINTER; - } - - if ( ( error = ivas_orient_trk_GetTrackedRotation( hIvasRend->headRotData.hOrientationTracker, pRotation ) ) != IVAS_ERR_OK ) - { - return error; - } - - return IVAS_ERR_OK; -} - - -#ifdef OTR_REFERENCE_VECTOR_TRACKING -/*---------------------------------------------------------------------* - * IVAS_REND_SetReferenceVector( ) - * - * Sets a reference vector spanning from listenerPos to refPos. Only - * available in OTR_TRACKING_REF_VEC and OTR_TRACKING_REF_VEC_LEV modes. - *---------------------------------------------------------------------*/ - -ivas_error IVAS_REND_SetReferenceVector( - IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ - const IVAS_VECTOR3 listenerPos, /* i : Listener position */ - const IVAS_VECTOR3 refPos /* i : Reference position */ -) -{ - if ( hIvasRend == NULL || hIvasRend->headRotData.hOrientationTracker == NULL ) - { - return IVAS_ERR_UNEXPECTED_NULL_POINTER; - } - - return ivas_orient_trk_SetReferenceVector( hIvasRend->headRotData.hOrientationTracker, listenerPos, refPos ); -} -#endif /* OTR_REFERENCE_VECTOR_TRACKING */ -#endif - - /*-------------------------------------------------------------------* * Local functions *-------------------------------------------------------------------*/ @@ -4190,7 +4145,7 @@ static ivas_error rotateFrameMc( /* initialize gains to passthrough */ for ( ch_in = 0; ch_in < nchan; ch_in++ ) { - set_zero( gains[ch_in], nchan ); + set_zero( gains[ch_in], (int16_t) nchan ); gains[ch_in][ch_in] = 1.f; } @@ -4329,18 +4284,7 @@ static ivas_error rotateFrameSba( ( 1 - headRotData->crossfade[i] ) * gains_prev[n][m] * ( *readPtr ); } } -#ifdef FIX_376_SBA_ROTATE - /* write back the result */ - for ( n = m1; n < m2; n++ ) - { - writePtr = getSmplPtr( outAudio, n, subframe_idx * subframe_len + i ); - ( *writePtr ) = tmpRot[n - m1]; - } - m1 = m2; - m2 += 2 * ( l + 1 ) + 1; -#endif } -#ifndef FIX_376_SBA_ROTATE /* write back the result */ for ( n = m1; n < m2; n++ ) { @@ -4349,7 +4293,6 @@ static ivas_error rotateFrameSba( } m1 = m2; m2 += 2 * ( l + 1 ) + 1; -#endif } /*unoptimized code for reference (full matrix multiplication)*/ @@ -4396,7 +4339,9 @@ static ivas_error renderIsmToBinaural( NULL, ismInput->base.ctx.pHeadRotData, &ismInput->currentPos, - ismInput->hReverb, +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND + ismInput->reverb, +#endif outAudio.config.numSamplesPerChannel, tmpTDRendBuffer ) ) != IVAS_ERR_OK ) { @@ -4419,7 +4364,11 @@ static ivas_error renderIsmToBinauralRoom( int16_t subframe_idx, subframe_len; int16_t tmp; rotation_matrix Rmat; +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND float tmpRendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; +#else + float tmpCrendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; +#endif IVAS_QUATERNION quat; ivas_error error; pan_vector currentPanGains; @@ -4433,7 +4382,8 @@ static ivas_error renderIsmToBinauralRoom( headRotData = ismInput->base.ctx.pHeadRotData; rotatedPos = defaultObjectPosition(); - if ( ismInput->hReverb != NULL && ismInput->hReverb->pConfig.roomAcoustics.use_brir == 0 && ismInput->hReverb->pConfig.roomAcoustics.late_reverb_on == 1 && headRotData->headRotEnabled ) +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND + if ( ismInput->reverb != NULL && ismInput->reverb->pConfig.roomAcoustics.use_brir == 0 && ismInput->reverb->pConfig.roomAcoustics.late_reverb_on == 1 && headRotData->headRotEnabled ) { copyBufferTo2dArray( ismInput->base.inputBuffer, tmpRendBuffer ); @@ -4443,16 +4393,21 @@ static ivas_error renderIsmToBinauralRoom( NULL, ismInput->base.ctx.pHeadRotData, &ismInput->currentPos, - ismInput->hReverb, +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND + ismInput->reverb, +#endif outAudio.config.numSamplesPerChannel, tmpRendBuffer ) ) != IVAS_ERR_OK ) { return error; } +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND accumulate2dArrayToBuffer( tmpRendBuffer, &outAudio ); +#endif } else { +#endif if ( headRotData->headRotEnabled ) { @@ -4524,18 +4479,43 @@ static ivas_error renderIsmToBinauralRoom( renderBufferChannelLerp( ismInput->base.inputBuffer, 0, currentPanGains, previousPanGains, tmpMcBuffer ); +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND copyBufferTo2dArray( tmpMcBuffer, tmpRendBuffer ); +#else + copyBufferTo2dArray( tmpMcBuffer, tmpCrendBuffer ); +#endif + - if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, - NULL, NULL, NULL, NULL, tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_rend_crendProcess( +#ifdef FIX_197_CREND_INTERFACE + ismInput->crendWrapper, +#else + &ismInput->crendWrapper, +#endif + AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, +#ifdef FIX_197_CREND_INTERFACE + NULL, NULL, NULL, NULL, +#endif +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND + tmpRendBuffer, +#else + tmpCrendBuffer, +#endif + *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) { return error; } +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND accumulate2dArrayToBuffer( tmpRendBuffer, &outAudio ); +#else + accumulate2dArrayToBuffer( tmpCrendBuffer, &outAudio ); +#endif free( tmpMcBuffer.data ); +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND } +#endif pop_wmops(); return IVAS_ERR_OK; @@ -4614,7 +4594,6 @@ static ivas_error renderIsmToSba( { return error; } - if ( ( error = getAmbisonicsOrder( outConfig, &ambiOrderOut ) ) != IVAS_ERR_OK ) { return error; @@ -4669,6 +4648,7 @@ static ivas_error renderInputIsm( /* Apply input gain to new audio */ v_multc( inAudio.data, ismInput->base.gain, inAudio.data, inAudio.config.numSamplesPerChannel * inAudio.config.numChannels ); + switch ( getAudioConfigType( outConfig ) ) { case IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED: @@ -4792,12 +4772,21 @@ static ivas_error renderMcToBinaural( headRotEnabled = mcInput->base.ctx.pHeadRotData->headRotEnabled; inConfig = mcInput->base.inConfig; - if ( ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) || ( headRotEnabled && ( inConfig == IVAS_REND_AUDIO_CONFIG_5_1 || inConfig == IVAS_REND_AUDIO_CONFIG_7_1 ) ) ) + if ( ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) || + ( headRotEnabled && ( inConfig == IVAS_REND_AUDIO_CONFIG_5_1 || inConfig == IVAS_REND_AUDIO_CONFIG_7_1 ) ) ) { copyBufferTo2dArray( mcInput->base.inputBuffer, tmpRendBuffer ); - if ( ( error = ivas_td_binaural_renderer_ext( &mcInput->tdRendWrapper, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, NULL, - mcInput->hReverb, mcInput->base.inputBuffer.config.numSamplesPerChannel, tmpRendBuffer ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_td_binaural_renderer_ext( &mcInput->tdRendWrapper, + mcInput->base.inConfig, + &mcInput->customLsInput, + mcInput->base.ctx.pHeadRotData, + NULL, +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND + mcInput->reverb, +#endif + mcInput->base.inputBuffer.config.numSamplesPerChannel, + tmpRendBuffer ) ) != IVAS_ERR_OK ) { return error; } @@ -4811,8 +4800,13 @@ static ivas_error renderMcToBinaural( tmpRotBuffer.data = malloc( tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels * sizeof( float ) ); set_zero( tmpRotBuffer.data, tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels ); - if ( ( error = rotateFrameMc( mcInput->base.inputBuffer, mcInput->base.inConfig, mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, - mcInput->rot_gains_prev, mcInput->efapInWrapper.hEfap, tmpRotBuffer ) ) != IVAS_ERR_OK ) + if ( ( error = rotateFrameMc( mcInput->base.inputBuffer, + mcInput->base.inConfig, + mcInput->customLsInput, + mcInput->base.ctx.pHeadRotData, + mcInput->rot_gains_prev, + mcInput->efapInWrapper.hEfap, + tmpRotBuffer ) ) != IVAS_ERR_OK ) { return error; } @@ -4826,8 +4820,16 @@ static ivas_error renderMcToBinaural( } /* call CREND */ - if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( mcInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), - NULL, NULL, NULL, NULL, tmpRendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_rend_crendProcess( +#ifdef FIX_197_CREND_INTERFACE + mcInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( mcInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), + NULL, NULL, NULL, NULL, +#else + &mcInput->crendWrapper, + rendAudioConfigToIvasAudioConfig( mcInput->base.inConfig ), + rendAudioConfigToIvasAudioConfig( outConfig ), +#endif + tmpRendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) { return error; } @@ -4851,60 +4853,106 @@ static ivas_error renderMcToBinauralRoom( const IVAS_REND_AudioConfig outConfig, IVAS_REND_AudioBuffer outAudio ) { +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND int8_t headRotEnabled; float tmpRendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; IVAS_REND_AudioConfig inConfig; +#else + float tmpCrendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; +#endif ivas_error error; IVAS_REND_AudioBuffer tmpRotBuffer; push_wmops( "renderMcToBinauralRoom" ); +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND headRotEnabled = mcInput->base.ctx.pHeadRotData->headRotEnabled; inConfig = mcInput->base.inConfig; - if ( ( mcInput->hReverb != NULL && mcInput->hReverb->pConfig.roomAcoustics.use_brir == 0 && mcInput->hReverb->pConfig.roomAcoustics.late_reverb_on == 1 ) && ( ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) || ( headRotEnabled && ( inConfig == IVAS_REND_AUDIO_CONFIG_5_1 || inConfig == IVAS_REND_AUDIO_CONFIG_7_1 ) ) ) ) + if ( ( mcInput->reverb != NULL && mcInput->reverb->pConfig.roomAcoustics.use_brir == 0 && mcInput->reverb->pConfig.roomAcoustics.late_reverb_on == 1 ) && ( ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) || ( headRotEnabled && ( inConfig == IVAS_REND_AUDIO_CONFIG_5_1 || inConfig == IVAS_REND_AUDIO_CONFIG_7_1 ) ) ) ) { copyBufferTo2dArray( mcInput->base.inputBuffer, tmpRendBuffer ); - if ( ( error = ivas_td_binaural_renderer_ext( &mcInput->tdRendWrapper, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, - NULL, mcInput->hReverb, mcInput->base.inputBuffer.config.numSamplesPerChannel, tmpRendBuffer ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_td_binaural_renderer_ext( &mcInput->tdRendWrapper, + mcInput->base.inConfig, + &mcInput->customLsInput, + mcInput->base.ctx.pHeadRotData, + NULL, + mcInput->reverb, + mcInput->base.inputBuffer.config.numSamplesPerChannel, + tmpRendBuffer ) ) != IVAS_ERR_OK ) { return error; } } else { + /* apply rotation */ if ( headRotEnabled ) +#else + /* apply rotation */ + if ( mcInput->base.ctx.pHeadRotData->headRotEnabled ) +#endif { tmpRotBuffer = mcInput->base.inputBuffer; tmpRotBuffer.data = malloc( tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels * sizeof( float ) ); set_zero( tmpRotBuffer.data, tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels ); - if ( ( error = rotateFrameMc( mcInput->base.inputBuffer, mcInput->base.inConfig, mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, - mcInput->rot_gains_prev, mcInput->efapInWrapper.hEfap, tmpRotBuffer ) ) != IVAS_ERR_OK ) + if ( ( error = rotateFrameMc( mcInput->base.inputBuffer, + mcInput->base.inConfig, + mcInput->customLsInput, + mcInput->base.ctx.pHeadRotData, + mcInput->rot_gains_prev, + mcInput->efapInWrapper.hEfap, + tmpRotBuffer ) ) != IVAS_ERR_OK ) { return error; } +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND copyBufferTo2dArray( tmpRotBuffer, tmpRendBuffer ); +#else + copyBufferTo2dArray( tmpRotBuffer, tmpCrendBuffer ); +#endif free( tmpRotBuffer.data ); } else { +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND copyBufferTo2dArray( mcInput->base.inputBuffer, tmpRendBuffer ); +#else + copyBufferTo2dArray( mcInput->base.inputBuffer, tmpCrendBuffer ); +#endif } /* call CREND */ - if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( mcInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), - NULL, NULL, NULL, NULL, tmpRendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_rend_crendProcess( +#ifdef FIX_197_CREND_INTERFACE + mcInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( mcInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), + NULL, NULL, NULL, NULL, +#else + &mcInput->crendWrapper, + rendAudioConfigToIvasAudioConfig( mcInput->base.inConfig ), + rendAudioConfigToIvasAudioConfig( outConfig ), +#endif +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND + tmpRendBuffer, +#else + tmpCrendBuffer, +#endif + *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) { return error; } +#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND } - accumulate2dArrayToBuffer( tmpRendBuffer, &outAudio ); +#else + accumulate2dArrayToBuffer( tmpCrendBuffer, &outAudio ); +#endif + /* TODO tmu : needs delay compensation */ if ( ( error = renderLfeToBinaural( mcInput, outAudio ) ) != IVAS_ERR_OK ) { @@ -4957,7 +5005,7 @@ static ivas_error renderMcCustomLsToBinauralRoom( return error; } - tmpMcBuffer.config.numChannels = tmp; + tmpMcBuffer.config.numChannels = (int16_t) tmp; tmpMcBuffer.data = malloc( tmpMcBuffer.config.numSamplesPerChannel * tmpMcBuffer.config.numChannels * sizeof( float ) ); set_zero( tmpMcBuffer.data, tmpMcBuffer.config.numSamplesPerChannel * tmpMcBuffer.config.numChannels ); @@ -4969,8 +5017,15 @@ static ivas_error renderMcCustomLsToBinauralRoom( copyBufferTo2dArray( tmpMcBuffer, tmpCrendBuffer ); /* call CREND */ - if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, AUDIO_CONFIG_7_1_4, getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, NULL, NULL, NULL, - tmpCrendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_rend_crendProcess( +#ifdef FIX_197_CREND_INTERFACE + mcInput->crendWrapper, AUDIO_CONFIG_7_1_4, getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, NULL, NULL, NULL, +#else + &mcInput->crendWrapper, + AUDIO_CONFIG_7_1_4, + rendAudioConfigToIvasAudioConfig( outConfig ), +#endif + tmpCrendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) { return error; } @@ -5198,8 +5253,15 @@ static ivas_error renderSbaToBinaural( } /* call CREND */ - if ( ( error = ivas_rend_crendProcess( sbaInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( sbaInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), - NULL, NULL, NULL, NULL, tmpCrendBuffer, *sbaInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_rend_crendProcess( +#ifdef FIX_197_CREND_INTERFACE + sbaInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( sbaInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, NULL, NULL, NULL, +#else + &sbaInput->crendWrapper, + rendAudioConfigToIvasAudioConfig( sbaInput->base.inConfig ), + rendAudioConfigToIvasAudioConfig( outConfig ), +#endif + tmpCrendBuffer, *sbaInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) { return error; } @@ -5254,7 +5316,7 @@ static ivas_error renderSbaToBinauralRoom( return error; } - tmpMcBuffer.config.numChannels = tmp; + tmpMcBuffer.config.numChannels = (int16_t) tmp; tmpMcBuffer.data = malloc( tmpMcBuffer.config.numSamplesPerChannel * tmpMcBuffer.config.numChannels * sizeof( float ) ); set_zero( tmpMcBuffer.data, tmpMcBuffer.config.numChannels * tmpMcBuffer.config.numSamplesPerChannel ); @@ -5267,8 +5329,16 @@ static ivas_error renderSbaToBinauralRoom( copyBufferTo2dArray( tmpMcBuffer, tmpCrendBuffer ); /* call CREND */ - if ( ( error = ivas_rend_crendProcess( sbaInput->crendWrapper, AUDIO_CONFIG_7_1_4, getIvasAudioConfigFromRendAudioConfig( outConfig ), - NULL, NULL, NULL, NULL, tmpCrendBuffer, *sbaInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_rend_crendProcess( +#ifdef FIX_197_CREND_INTERFACE + sbaInput->crendWrapper, AUDIO_CONFIG_7_1_4, getIvasAudioConfigFromRendAudioConfig( outConfig ), + NULL, NULL, NULL, NULL, +#else + &sbaInput->crendWrapper, + AUDIO_CONFIG_7_1_4, + rendAudioConfigToIvasAudioConfig( outConfig ), +#endif + tmpCrendBuffer, *sbaInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) { return error; } @@ -5516,7 +5586,7 @@ static ivas_error renderActiveInputsMasa( IVAS_REND_HANDLE hIvasRend, IVAS_REND_AudioBuffer outAudio ) { - int16_t i; + int32_t i; input_masa *pCurrentInput; ivas_error error; @@ -5552,7 +5622,10 @@ ivas_error IVAS_REND_GetSamples( ivas_error error; int16_t numOutChannels; - /* Validate function arguments */ + /*-----------------------------------------------------------------* + * Validate function arguments + *-----------------------------------------------------------------*/ + if ( hIvasRend == NULL || outAudio.data == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -5630,7 +5703,10 @@ void IVAS_REND_Close( uint16_t i; IVAS_REND_HANDLE hIvasRend; - /* Validate function arguments */ + /*-----------------------------------------------------------------* + * Validate function arguments + *-----------------------------------------------------------------*/ + if ( phIvasRend == NULL || *phIvasRend == NULL ) { return; @@ -5665,10 +5741,6 @@ void IVAS_REND_Close( ivas_limiter_close( &hIvasRend->hLimiter ); -#ifdef FIX_I109_ORIENTATION_TRACKING - closeHeadRotation( hIvasRend ); -#endif - free( hIvasRend ); *phIvasRend = NULL; diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index b313bea5c1..6db5fd91dc 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -244,43 +244,8 @@ int16_t IVAS_REND_FeedRenderConfig( ivas_error IVAS_REND_SetHeadRotation( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ -#ifdef TD5 - const IVAS_QUATERNION headRot[RENDERER_HEAD_POSITIONS_PER_FRAME], /* i : head orientations for next rendering call */ - const IVAS_POSITION Pos[RENDERER_HEAD_POSITIONS_PER_FRAME] /* i : listener positions for next rendering call */ -#else const IVAS_QUATERNION headRot[RENDERER_HEAD_POSITIONS_PER_FRAME] /* i : head positions for next rendering call */ -#endif -); - -#ifdef FIX_I109_ORIENTATION_TRACKING -ivas_error IVAS_REND_SetOrientationTrackingMode( - IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ - const uint8_t otrMode /* i : Orientation tracking mode */ -); - -ivas_error IVAS_REND_SetReferenceRotation( - IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ - const IVAS_QUATERNION refRot /* i : Reference rotation */ -); - -ivas_error IVAS_REND_GetMainOrientation( - IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ - IVAS_QUATERNION *pOrientation /* i/o: Quaternion pointer for main orientation */ -); - -ivas_error IVAS_REND_GetTrackedRotation( - IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ - IVAS_QUATERNION *pRotation /* i/o: Quaternion pointer for processed rotation */ -); - -#ifdef OTR_REFERENCE_VECTOR_TRACKING -ivas_error IVAS_REND_SetReferenceVector( - IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ - const IVAS_VECTOR3 listenerPos, /* i : Listener position */ - const IVAS_VECTOR3 refPos /* i : Reference position */ ); -#endif /* OTR_REFERENCE_VECTOR_TRACKING */ -#endif /* FIX_I109_ORIENTATION_TRACKING */ ivas_error IVAS_REND_GetSamples( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ diff --git a/lib_util/audio_file_reader.c b/lib_util/audio_file_reader.c index 4f6bd0c34d..c7feefd7b7 100644 --- a/lib_util/audio_file_reader.c +++ b/lib_util/audio_file_reader.c @@ -40,7 +40,9 @@ struct AudioFileReader { FILE *rawFile; WAVEFILEIN *wavFile; +#ifdef FIX_94_VERIFY_WAV_NUM_CHANNELS uint32_t samplingRate; +#endif int16_t numChannels; }; @@ -55,12 +57,26 @@ static int8_t AudioFileReader_open_raw( static int8_t AudioFileReader_open_wav( AudioFileReader *self, - const char *fileName ) + const char *fileName +#ifndef FIX_94_VERIFY_WAV_NUM_CHANNELS + , + int32_t *sampleRate +#endif +) { +#ifdef FIX_94_VERIFY_WAV_NUM_CHANNELS uint32_t samplesInFile; +#else + uint32_t sampleRate_, samplesInFile; +#endif int16_t bps; +#ifdef FIX_94_VERIFY_WAV_NUM_CHANNELS self->wavFile = OpenWav( fileName, &self->samplingRate, &self->numChannels, &samplesInFile, &bps ); +#else + self->wavFile = OpenWav( fileName, &sampleRate_, &self->numChannels, &samplesInFile, &bps ); + *sampleRate = sampleRate_; +#endif if ( !self->wavFile ) { @@ -76,6 +92,10 @@ static int8_t AudioFileReader_open_wav( ivas_error AudioFileReader_open( AudioFileReader **audioReader, /* o : AudioFileReader handle */ const char *fileName /* i : path to wav/raw pcm file */ +#ifndef FIX_94_VERIFY_WAV_NUM_CHANNELS + , + int32_t *sampleRate /* o : sample rate of wav file, unused with pcm */ +#endif ) { AudioFileReader *self; @@ -98,12 +118,19 @@ ivas_error AudioFileReader_open( return IVAS_ERR_FAILED_FILE_OPEN; } self = calloc( sizeof( AudioFileReader ), 1 ); +#ifdef FIX_94_VERIFY_WAV_NUM_CHANNELS self->samplingRate = 0; +#endif self->numChannels = 0; if ( fileNameLen > wavSuffixLen && strncmp( fileName + fileNameLen - wavSuffixLen, wavSuffix, wavSuffixLen ) == 0 ) { - retCode = AudioFileReader_open_wav( self, fileName ); + retCode = AudioFileReader_open_wav( self, fileName +#ifndef FIX_94_VERIFY_WAV_NUM_CHANNELS + , + sampleRate +#endif + ); } else { @@ -179,6 +206,7 @@ ivas_error AudioFileReader_read( return error; } +#ifdef FIX_94_VERIFY_WAV_NUM_CHANNELS ivas_error AudioFileReader_getSamplingRate( AudioFileReader *self, int32_t *samplingRate ) @@ -229,3 +257,17 @@ ivas_error AudioFileReader_getNumChannels( return IVAS_ERR_OK; } +#else +/*! r: number of channels of the opened file */ +int16_t AudioFileReader_getNumChannels( + AudioFileReader *self /* i/o: AudioFileReader handle */ +) +{ + if ( self != NULL ) + { + return self->numChannels; + } + + return 0; +} +#endif diff --git a/lib_util/audio_file_reader.h b/lib_util/audio_file_reader.h index 0fd4da5ac7..a944c85dc1 100644 --- a/lib_util/audio_file_reader.h +++ b/lib_util/audio_file_reader.h @@ -43,6 +43,9 @@ typedef struct AudioFileReader AudioFileReader; ivas_error AudioFileReader_open( AudioFileReader **audioReader, /* o : AudioFileReader handle */ const char *fileName /* i : path to wav/raw pcm file */ +#ifndef FIX_94_VERIFY_WAV_NUM_CHANNELS + ,int32_t *sampleRate /* o : sample rate of wav file, unused with pcm */ +#endif ); ivas_error AudioFileReader_read( @@ -52,6 +55,7 @@ ivas_error AudioFileReader_read( int16_t *numSamplesRead /* i : number of samples actualy read */ ); +#ifdef FIX_94_VERIFY_WAV_NUM_CHANNELS /*! r: ivas error - in particular, IVAS_ERR_SAMPLING_RATE_UNKNOWN if the opened file has no sampling rate metadata */ ivas_error AudioFileReader_getSamplingRate( AudioFileReader *self, /* i/o: AudioFileReader handle */ @@ -63,6 +67,12 @@ ivas_error AudioFileReader_getNumChannels( AudioFileReader *self, /* i/o: AudioFileReader handle */ int16_t * numChannels /* o : number fo channels in opened audio file */ ); +#else +/*! r: number of channels of the opened file */ +int16_t AudioFileReader_getNumChannels( + AudioFileReader *self /* i/o: AudioFileReader handle */ +); +#endif void AudioFileReader_close( AudioFileReader **selfPtr /* i/o: pointer to AudioFileReader handle */ diff --git a/lib_util/audio_file_writer.c b/lib_util/audio_file_writer.c index b27a8ceca6..d6cbb1810e 100644 --- a/lib_util/audio_file_writer.c +++ b/lib_util/audio_file_writer.c @@ -98,11 +98,7 @@ ivas_error AudioFileWriter_open( int8_t retCode; -#ifdef FIX_I109_ORIENTATION_TRACKING - if ( ( fileNameLen > wavSuffixLen ) && ( strncmp( fileName + fileNameLen - wavSuffixLen, wavSuffix, wavSuffixLen ) == 0 ) ) -#else if ( fileNameLen > wavSuffixLen && strncmp( fileName + fileNameLen - wavSuffixLen, wavSuffix, wavSuffixLen ) == 0 ) -#endif { retCode = AudioFileWriter_open_wav( self, fileName, sampleRate, numChannels ); } diff --git a/lib_util/head_rotation_file_reader.c b/lib_util/head_rotation_file_reader.c index 500fdd2b7a..533c14a651 100644 --- a/lib_util/head_rotation_file_reader.c +++ b/lib_util/head_rotation_file_reader.c @@ -91,125 +91,39 @@ ivas_error HeadRotationFileReader_open( * Read values from the trajectory file *-----------------------------------------------------------------------*/ -#ifdef FIX_I109_ORIENTATION_TRACKING ivas_error HeadRotationFileReading( HeadRotFileReader *headRotReader, /* i/o: HeadRotFileReader handle */ -#ifdef TD5 - IVAS_QUATERNION *pQuaternion, /* o : head-tracking data */ - IVAS_POSITION *pPos /* o : listener position */ -#else - IVAS_QUATERNION *pQuaternion /* o : head-tracking data */ -#endif -) -{ - float w, x, y, z; -#ifdef TD5 - float posx, posy, posz; - int32_t read_values; - - posx = 0.0f; - posy = 0.0f; - posz = 0.0f; -#endif - -#ifdef TD5 - read_values = fscanf( headRotReader->trajFile, "%f,%f,%f,%f,%f,%f,%f", &w, &x, &y, &z, &posx, &posy, &posz ); - if ( ( read_values != 4 ) && ( read_values != 7 ) ) /* Allow either orientation (4) or orientation+position (4+3) */ -#else - if ( 4 != fscanf( headRotReader->trajFile, "%f,%f,%f,%f", &w, &x, &y, &z ) ) -#endif - { - if ( feof( headRotReader->trajFile ) ) - { - rewind( headRotReader->trajFile ); - headRotReader->fileRewind = true; -#ifdef TD5 - return HeadRotationFileReading( headRotReader, pQuaternion, pPos ); -#else - return HeadRotationFileReading( headRotReader, pQuaternion ); -#endif - } - return IVAS_ERR_FAILED_FILE_PARSE; - } - - ( headRotReader->frameCounter )++; - - pQuaternion->w = w; - pQuaternion->x = x; - pQuaternion->y = y; - pQuaternion->z = z; -#ifdef TD5 - if ( pPos != NULL ) - { - pPos->x = posx; - pPos->y = posy; - pPos->z = posz; - } -#endif - - return IVAS_ERR_OK; -} - -#else -ivas_error HeadRotationFileReading( - HeadRotFileReader *headRotReader, /* i/o: HeadRotFileReader handle */ - IVAS_QUATERNION *Quaternions, /* o : head-tracking data, listener orientation */ -#ifdef TD5 - IVAS_POSITION *Pos /* o : listener position */ -#else - const int32_t frame_dec /* i : decoded frame number */ -#endif + IVAS_QUATERNION *Quaternions, /* o : head-tracking data */ + const int32_t frame_dec /* i : decoded frame number */ ) { uint16_t i; float w, x, y, z; -#ifdef TD5 - float posx, posy, posz; - int32_t read_values; - - posx = 0.0f; - posy = 0.0f; - posz = 0.0f; -#endif for ( i = 0; i < IVAS_MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) { -#ifdef TD5 - read_values = fscanf( headRotReader->trajFile, "%f,%f,%f,%f,%f,%f,%f", &w, &x, &y, &z, &posx, &posy, &posz ); - if ( ( read_values != 4 ) && ( read_values != 7 ) ) /* Allow either orientation (4) or orientation+position (4+3) */ -#else if ( 4 != fscanf( headRotReader->trajFile, "%f,%f,%f,%f", &w, &x, &y, &z ) ) -#endif { if ( feof( headRotReader->trajFile ) ) { rewind( headRotReader->trajFile ); headRotReader->fileRewind = true; -#ifdef TD5 - return HeadRotationFileReading( headRotReader, Quaternions, Pos ); -#else return HeadRotationFileReading( headRotReader, Quaternions, frame_dec ); -#endif } return IVAS_ERR_FAILED_FILE_PARSE; } + ( headRotReader->frameCounter )++; Quaternions[i].w = w; Quaternions[i].x = x; Quaternions[i].y = y; Quaternions[i].z = z; -#ifdef TD5 - Pos[i].x = posx; - Pos[i].y = posy; - Pos[i].z = posz; -#endif } return IVAS_ERR_OK; } -#endif /*-----------------------------------------------------------------------* diff --git a/lib_util/head_rotation_file_reader.h b/lib_util/head_rotation_file_reader.h index d735423e2c..e70281401a 100644 --- a/lib_util/head_rotation_file_reader.h +++ b/lib_util/head_rotation_file_reader.h @@ -57,27 +57,11 @@ ivas_error HeadRotationFileReader_open( * Read values from the trajectory file *-----------------------------------------------------------------------*/ -#ifdef FIX_I109_ORIENTATION_TRACKING -ivas_error HeadRotationFileReading( - HeadRotFileReader *headRotReader, /* i/o: HeadRotFileReader handle */ -#ifdef TD5 - IVAS_QUATERNION *pQuaternion, /* o : head-tracking data */ - IVAS_POSITION *pPos /* o : listener position */ -#else - IVAS_QUATERNION *pQuaternion /* o : head-tracking data */ -#endif -); -#else ivas_error HeadRotationFileReading( HeadRotFileReader *headRotReader, /* i/o: HeadRotFileReader handle */ IVAS_QUATERNION *Quaternions, /* o : head-tracking data */ -#ifdef TD5 - IVAS_POSITION *Pos /* o : listener position */ -#else - const int32_t frame_dec /* i : decoded frame number */ -#endif + const int32_t frame_dec /* i : decoded frame number */ ); -#endif /*-----------------------------------------------------------------------* * HeadRotationFileReader_close() diff --git a/lib_util/ism_file_reader.c b/lib_util/ism_file_reader.c index d60a7c1984..77912f5c58 100644 --- a/lib_util/ism_file_reader.c +++ b/lib_util/ism_file_reader.c @@ -36,13 +36,8 @@ #include -#define META_LINE_LENGTH 200 /* max number of characters at one line of metadata input/output file */ -#ifdef TD5 -#define NUM_ISM_METADATA_PER_LINE 7 /* Number of ISM metadata per line in a metadata file */ -#define NUM_MIN_ISM_METADATA 2 /* Minimum number of metadata parameters (azimuth and elevation) */ -#else -#define NUM_ISM_METADATA_PER_LINE 5 /* Number of ISM metadata per line in a metadata file */ -#endif +#define META_LINE_LENGTH 200 /* max number of characters at one line of metadata input/output file */ +#define NUM_ISM_METADATA_PER_LINE 5 /* Number of ISM metadata per line in a metadata file */ struct IsmFileReader @@ -59,7 +54,7 @@ struct IsmFileReader *---------------------------------------------------------------------*/ IsmFileReader *IsmFileReader_open( - const char *filePath /* i : path to ISM metadata file */ + const char *filePath /* i : path to ism metadata file */ ) { IsmFileReader *self; @@ -95,26 +90,15 @@ IsmFileReader *IsmFileReader_open( /*! r: error code */ ivas_error IsmFileReader_readNextFrame( IsmFileReader *self, /* i/o: IsmFileReader handle */ - IVAS_ISM_METADATA *ismMetadata /* o : ISM metadata read from the opened file */ + IVAS_ISM_METADATA *ismMetadata /* o ISM : metadata read from the opened file */ ) { char char_buff[META_LINE_LENGTH]; float meta_prm[NUM_ISM_METADATA_PER_LINE]; -#ifdef TD5 - const float meta_prm_default[NUM_ISM_METADATA_PER_LINE] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f }; -#endif char *char_ptr; int16_t i; FILE *file; -#ifdef TD5 - /* Set default metadata parameters */ - for ( i = 0; i < NUM_ISM_METADATA_PER_LINE; i++ ) - { - meta_prm[i] = meta_prm_default[i]; - } -#endif - if ( ismMetadata == NULL || self->file == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -143,34 +127,24 @@ ivas_error IsmFileReader_readNextFrame( meta_prm[i++] = (float) atof( char_ptr ); } -#ifdef TD5 - /* Check if minimum number of metadata values were read. Additional values are ignored. */ - if ( i < NUM_MIN_ISM_METADATA ) -#else + if ( i != NUM_ISM_METADATA_PER_LINE ) -#endif { /* Not enough values provided in one line */ return IVAS_ERR_ISM_FILE_READER_INVALID_METADATA_FORMAT; } -#ifndef TD5 if ( char_ptr != NULL ) { /* Too many values provided in one line */ return IVAS_ERR_ISM_FILE_READER_INVALID_METADATA_FORMAT; } -#endif ismMetadata->azimuth = meta_prm[0]; ismMetadata->elevation = meta_prm[1]; ismMetadata->radius = meta_prm[2]; ismMetadata->spread = meta_prm[3]; ismMetadata->gainFactor = meta_prm[4]; -#ifdef TD5 - ismMetadata->yaw = meta_prm[5]; - ismMetadata->pitch = meta_prm[6]; -#endif /* verify whether the read metadata values are in an expected range */ if ( ismMetadata->azimuth > 180 || ismMetadata->azimuth < -180 ) @@ -197,17 +171,6 @@ ivas_error IsmFileReader_readNextFrame( { return IVAS_ERR_ISM_INVALID_METADATA_VALUE; } -#ifdef TD5 - if ( ismMetadata->yaw > 180 || ismMetadata->yaw < -180 ) - { - return IVAS_ERR_ISM_INVALID_METADATA_VALUE; - } - - if ( ismMetadata->pitch > 90 || ismMetadata->pitch < -90 ) - { - return IVAS_ERR_ISM_INVALID_METADATA_VALUE; - } -#endif return IVAS_ERR_OK; } diff --git a/lib_util/ism_file_writer.c b/lib_util/ism_file_writer.c index 870cf33586..c4dffe38b0 100644 --- a/lib_util/ism_file_writer.c +++ b/lib_util/ism_file_writer.c @@ -35,10 +35,8 @@ #include -#define META_LINE_LENGTH 200 /* max number of characters at one line of metadata input/output file */ -#ifndef TD5 -#define NUM_ISM_METADATA_PER_LINE 5 /* Number of ISM metadata per line in a metadata file */ -#endif +#define META_LINE_LENGTH 200 /* max number of characters at one line of metadata input/output file */ +#define NUM_ISM_METADATA_PER_LINE 5 /* Number of ISM metadata per line in a metadata file */ struct IsmFileWriter @@ -56,7 +54,7 @@ struct IsmFileWriter /*! r: error code */ ivas_error IsmFileWriter_open( const char *filePathWav, /* i : path to output file */ - const int16_t obj_num, /* i : number of ISM channels */ + const int16_t obj_num, /* i : ISm number */ IsmFileWriter **ismWriter /* o : IsmFileWriter handle */ ) { @@ -117,18 +115,7 @@ ivas_error IsmFileWriter_writeFrame( file = ismWriter->file; /* IVAS_fmToDo: work in progress; currently position_azimuth, position_elevation, position_radius, spread, gain_factor */ -#ifdef FIX_293_EXT_RENDERER_CLI -#ifdef TD5 - sprintf( char_buff, "%+07.2f,%+06.2f,%05.2f,%06.2f,%04.2f,%+07.2f,%+06.2f\n", ismMetadata.azimuth, ismMetadata.elevation, ismMetadata.radius, ismMetadata.spread, ismMetadata.gainFactor, ismMetadata.yaw, ismMetadata.pitch ); -#else - sprintf( char_buff, "%+07.2f,%+06.2f,%05.2f,%06.2f,%04.2f\n", ismMetadata.azimuth, ismMetadata.elevation, ismMetadata.radius, ismMetadata.spread, ismMetadata.gainFactor ); -#endif -#endif -#ifdef TD5 - snprintf( char_buff, sizeof( char_buff ), "%+07.2f,%+06.2f,%05.2f,%06.2f,%04.2f,%+07.2f,%+06.2f\n", ismMetadata.azimuth, ismMetadata.elevation, ismMetadata.radius, ismMetadata.spread, ismMetadata.gainFactor, ismMetadata.yaw, ismMetadata.pitch ); -#else snprintf( char_buff, sizeof( char_buff ), "%+07.2f,%+06.2f,%05.2f,%06.2f,%04.2f\n", ismMetadata.azimuth, ismMetadata.elevation, ismMetadata.radius, ismMetadata.spread, ismMetadata.gainFactor ); -#endif if ( file ) { diff --git a/lib_util/ism_file_writer.h b/lib_util/ism_file_writer.h index d9f731e87e..24b4c58bd4 100644 --- a/lib_util/ism_file_writer.h +++ b/lib_util/ism_file_writer.h @@ -43,7 +43,7 @@ typedef struct IsmFileWriter IsmFileWriter; /*! r: error code */ ivas_error IsmFileWriter_open( const char *filePathWav, /* i : path to output file */ - const int16_t obj_num, /* i : number of ISM channels */ + const int16_t obj_num, /* i : ISm number */ IsmFileWriter **ismWriter /* o : IsmFileReader handle */ ); diff --git a/lib_util/ls_custom_file_reader.c b/lib_util/ls_custom_file_reader.c index 9b39fab486..f73022e849 100644 --- a/lib_util/ls_custom_file_reader.c +++ b/lib_util/ls_custom_file_reader.c @@ -52,7 +52,7 @@ struct LsCustomFileReader ivas_error CustomLsReader_open( const char *LsFilePath, /* i : LS custom layout file name */ - LsCustomFileReader **hLsCustomReader /* o : LsCustomFileReader handle */ + LsCustomFileReader **hLsCustomReader /* o : HeadRotFileReader handle */ ) { LsCustomFileReader *self; @@ -89,7 +89,7 @@ ivas_error CustomLsReader_open( *-----------------------------------------------------------------------*/ void CustomLsReader_close( - LsCustomFileReader **hLsCustomReader /* i/o: LsCustomFileReader handle */ + LsCustomFileReader **hLsCustomReader /* i/o: HeadRotFileReader handle */ ) { if ( hLsCustomReader == NULL || *hLsCustomReader == NULL ) @@ -228,7 +228,7 @@ static void CustomLoudspeakerLayout_print_info( *-------------------------------------------------------------------------*/ LS_CUSTOM_FILEREADER_ERROR CustomLsFileReading( - LsCustomFileReader *hLsCustomReader, /* i/o: LsCustomFileReader handle */ + LsCustomFileReader *hLsCustomReader, /* i/o: HeadRotFileReader handle */ IVAS_CUSTOM_LS_DATA *hLsCustomData /* o : Custom loudspeaker setup data */ ) { diff --git a/lib_util/ls_custom_file_reader.h b/lib_util/ls_custom_file_reader.h index df7fe6bde7..70c854aa9c 100644 --- a/lib_util/ls_custom_file_reader.h +++ b/lib_util/ls_custom_file_reader.h @@ -64,7 +64,7 @@ typedef enum _LS_CUSTOM_FILEREADER_ERROR ivas_error CustomLsReader_open( const char *LsFilePath, /* i : LS custom layout file name */ - LsCustomFileReader **hLsCustomReader /* o : LsCustomFileReader handle */ + LsCustomFileReader **hLsCustomReader /* o : HeadRotFileReader handle */ ); /*-----------------------------------------------------------------------* @@ -74,7 +74,7 @@ ivas_error CustomLsReader_open( *-----------------------------------------------------------------------*/ void CustomLsReader_close( - LsCustomFileReader **hLsCustomReader /* i/o: LsCustomFileReader handle */ + LsCustomFileReader **hLsCustomReader /* i/o: HeadRotFileReader handle */ ); /*-------------------------------------------------------------------------* @@ -84,7 +84,7 @@ void CustomLsReader_close( *-------------------------------------------------------------------------*/ LS_CUSTOM_FILEREADER_ERROR CustomLsFileReading( - LsCustomFileReader *hLsCustomReader, /* i/o: LsCustomFileReader handle */ + LsCustomFileReader *hLsCustomReader, /* i/o: HeadRotFileReader handle */ IVAS_CUSTOM_LS_DATA *hLsCustomData /* o : Custom loudspeaker setup data */ ); diff --git a/lib_util/masa_file_writer.c b/lib_util/masa_file_writer.c index 74429f9185..5667968ece 100644 --- a/lib_util/masa_file_writer.c +++ b/lib_util/masa_file_writer.c @@ -67,10 +67,8 @@ struct MasaFileWriter *-----------------------------------------------------------------------*/ #ifndef FIX_350_MASA_DELAY_COMP -#ifndef FIX_373_MASA_DELAY_COMP_MSAN #define SPH_IDX_FRONT ( MASA_NO_POINTS_EQUATOR / 2 ) /* Spherical index corresponding to front direction for setting as default value */ #endif -#endif /*-----------------------------------------------------------------------* * Local functions diff --git a/lib_util/render_config_reader.c b/lib_util/render_config_reader.c index 907d148a6e..9fe7f019eb 100644 --- a/lib_util/render_config_reader.c +++ b/lib_util/render_config_reader.c @@ -522,15 +522,6 @@ ivas_error RenderConfigReader_read( errorHandler( pValue, ERROR_VALUE_INVALID ); } } -#ifdef TD5 - else if ( strcmp( item, "DIRECTIVITY" ) == 0 ) - { - if ( read_vector( pValue, 3, hRenderConfig->directivity ) ) - { - errorHandler( item, ERROR_VALUE_INVALID ); - } - } -#endif #ifdef DEBUGGING else { diff --git a/lib_util/vector3_pair_file_reader.c b/lib_util/vector3_pair_file_reader.c deleted file mode 100644 index 1b8a95bc88..0000000000 --- a/lib_util/vector3_pair_file_reader.c +++ /dev/null @@ -1,166 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -#include "vector3_pair_file_reader.h" -#include -#include -#include -#include -#include "prot.h" -#include "options.h" /* only included to get access to the feature-defines */ - -#ifdef OTR_REFERENCE_VECTOR_TRACKING - -struct Vector3PairFileReader -{ - FILE *trajFile; - char *file_path; -}; - -/*-----------------------------------------------------------------------* - * Vector3PairFileReader_open() - * - * Allocate and initialize reader - *-----------------------------------------------------------------------*/ - -ivas_error Vector3PairFileReader_open( - const char *trajFilePath, /* i : trajectory file name */ - Vector3PairFileReader **vector3PairReader /* o : Vector3PairFileReader handle */ -) -{ - Vector3PairFileReader *self; - FILE *trajFile; - - /* Open trajectory file */ - if ( strlen( trajFilePath ) < 1 ) - { - return IVAS_ERR_FAILED_FILE_OPEN; - } - - trajFile = fopen( trajFilePath, "r" ); - - if ( !trajFile ) - { - return IVAS_ERR_FAILED_FILE_OPEN; - } - - self = calloc( sizeof( Vector3PairFileReader ), 1 ); - self->trajFile = trajFile; - self->file_path = calloc( sizeof( char ), strlen( trajFilePath ) + 1 ); - strcpy( self->file_path, trajFilePath ); - - *vector3PairReader = self; - - return IVAS_ERR_OK; -} - - -/*-----------------------------------------------------------------------* - * Vector3PairFileReader_read() - * - * Read one line of values from the trajectory file - *-----------------------------------------------------------------------*/ - -ivas_error Vector3PairFileReader_read( - Vector3PairFileReader *vector3PairReader, /* i/o: Vector3PairFileReader handle */ - IVAS_VECTOR3 *pFirst, /* o : first x,y,z position in the line */ - IVAS_VECTOR3 *pSecond /* o : second x,y,z position in the line */ -) -{ - float x1, y1, z1, x2, y2, z2; - - if ( vector3PairReader == NULL || pFirst == NULL || pSecond == NULL ) - return IVAS_ERR_UNEXPECTED_NULL_POINTER; - - if ( 6 != fscanf( vector3PairReader->trajFile, "%f,%f,%f,%f,%f,%f", &x1, &y1, &z1, &x2, &y2, &z2 ) ) - { - if ( feof( vector3PairReader->trajFile ) ) - { - rewind( vector3PairReader->trajFile ); - return Vector3PairFileReader_read( vector3PairReader, pFirst, pSecond ); - } - return IVAS_ERR_FAILED_FILE_PARSE; - } - - pFirst->x = x1; - pFirst->y = y1; - pFirst->z = z1; - pSecond->x = x2; - pSecond->y = y2; - pSecond->z = z2; - - return IVAS_ERR_OK; -} - -/*-----------------------------------------------------------------------* - * Vector3PairFileReader_close() - * - * Deallocates memory for the Head-Tracking reader - *-----------------------------------------------------------------------*/ - -void Vector3PairFileReader_close( - Vector3PairFileReader **reader /* i/o: Vector3PairFileReader handle */ -) -{ - if ( reader == NULL || *reader == NULL ) - { - return; - } - - fclose( ( *reader )->trajFile ); - free( ( *reader )->file_path ); - free( *reader ); - *reader = NULL; - - return; -} - - -/*-----------------------------------------------------------------------* - * Vector3PairFileReader_getFilePath() - * - * - *-----------------------------------------------------------------------*/ - -const char *Vector3PairFileReader_getFilePath( - Vector3PairFileReader *reader /* i/o: Vector3PairFileReader handle */ -) -{ - if ( reader == NULL ) - { - return NULL; - } - - return reader->file_path; -} - -#endif /* OTR_REFERENCE_VECTOR_TRACKING */ diff --git a/lib_util/vector3_pair_file_reader.h b/lib_util/vector3_pair_file_reader.h deleted file mode 100644 index a2fd706fc2..0000000000 --- a/lib_util/vector3_pair_file_reader.h +++ /dev/null @@ -1,89 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -#ifndef IVAS_V3PAIR_FILE_READER_H -#define IVAS_V3PAIR_FILE_READER_H - -#include "common_api_types.h" -#include "ivas_error.h" -#include "options.h" /* only included to get access to the feature-defines */ - -#ifdef OTR_REFERENCE_VECTOR_TRACKING - -typedef struct Vector3PairFileReader Vector3PairFileReader; - -/*-----------------------------------------------------------------------* - * Vector3PairFileReader_open() - * - * Allocate and initialize Head-Tracking handle - *-----------------------------------------------------------------------*/ - -ivas_error Vector3PairFileReader_open( - const char *trajFilePath, /* i : trajectory file name */ - Vector3PairFileReader **vector3PairReader /* o : Vector3PairFileReader handle */ -); - -/*-----------------------------------------------------------------------* - * Vector3PairFileReader_read() - * - * Read one line of values from the trajectory file - *-----------------------------------------------------------------------*/ - -ivas_error Vector3PairFileReader_read( - Vector3PairFileReader *vector3PairReader, /* i/o: Vector3PairFileReader handle */ - IVAS_VECTOR3 *pFirst, /* o : first x,y,z position in the line */ - IVAS_VECTOR3 *pSecond /* o : second x,y,z position in the line */ -); - -/*-----------------------------------------------------------------------* - * Vector3PairFileReader_close() - * - * Deallocates memory for the handle - *-----------------------------------------------------------------------*/ - -void Vector3PairFileReader_close( - Vector3PairFileReader **vector3PairReader /* i/o: Vector3PairFileReader handle */ -); - -/*-----------------------------------------------------------------------* - * Vector3PairFileReader_getFilePath() - * - * - *-----------------------------------------------------------------------*/ - -const char *Vector3PairFileReader_getFilePath( - Vector3PairFileReader *vector3PairReader /* i/o: Vector3PairFileReader handle */ -); - -#endif /* OTR_REFERENCE_VECTOR_TRACKING */ - -#endif /* IVAS_V3PAIR_FILE_READER_H */ diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index f26fba423a..223ac0352c 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -161,19 +161,19 @@ ../IVAS_dec STEREO 48 bit testv/stvST48c.wav_stereo_32000_48-48_bandwidth_sw.tst // stereo at 32 kbps, 48kHz in, 32kHz out, random FEC at 6% -../IVAS_cod -stereo 32000 48 testv/stvST48c.wav bit +../IVAS_cod -stereo -max_band FB 32000 48 testv/stvST48c.wav bit ../IVAS_dec -fec testv/FEC_6pct.bin STEREO 32 bit testv/stvST48c.wav_stereo_32000_48-32_FEC5.tst // stereo at 32 kbps, 48kHz in, 48kHz out, DTX on, random FEC at 5% -../IVAS_cod -stereo -dtx 32000 48 testv/stvST48n.wav bit +../IVAS_cod -stereo -dtx -max_band FB 32000 48 testv/stvST48n.wav bit ../IVAS_dec -fec 5 STEREO 48 bit testv/stvST48n.wav_stereo_32000_48-48_DTX_FEC5.tst // stereo at 32 kbps, 48kHz in, 48kHz out, DTX on, MONO out, random FEC at 5% -../IVAS_cod -stereo -dtx 32000 48 testv/stvST48n.wav bit +../IVAS_cod -stereo -dtx -max_band FB 32000 48 testv/stvST48n.wav bit ../IVAS_dec -fec 5 MONO 48 bit testv/stvST48n.wav_stereo_32000_48-48_DTX_MONO_FEC5.tst // stereo at 32 kbps, 48kHz in, 16kHz out, DTX on, MONO out, random FEC at 5% -../IVAS_cod -stereo -dtx 32000 48 testv/stvST48n.wav bit +../IVAS_cod -stereo -dtx -max_band FB 32000 48 testv/stvST48n.wav bit ../IVAS_dec -fec 5 MONO 16 bit testv/stvST48n.wav_stereo_32000_48-16_DTX_MONO_FEC5.tst // stereo at 48 kbps, 16kHz in, 16kHz out @@ -250,175 +250,153 @@ -// 1 ISM with metadata at 13.2 kbps, 48 kHz in, 48 kHz out, MONO out +// 1 ISm with metadata at 13.2 kbps, 48 kHz in, 48 kHz out, MONO out ../IVAS_cod -ism 1 testv/stvISM1.csv 13200 48 testv/stv1ISM48s.wav bit ../IVAS_dec MONO 48 bit testv/stv1ISM48s.wav_13200_48-48_MONO.tst -// 1 ISM with metadata at 13.2 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL out, random FEC at 5% +// 1 ISm with metadata at 13.2 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL out, random FEC at 5% ../IVAS_cod -dtx -ism 1 testv/stvISM1.csv 13200 48 testv/stv48n.wav bit ../IVAS_dec -fec 5 BINAURAL 48 bit testv/stv48n.wav_13200_48-48_DTX_FEC5_BINAURAL.tst -// 2 ISM with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, STEREO out +// 2 ISm with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, STEREO out ../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 16400 48 testv/stv2ISM48s.wav bit ../IVAS_dec STEREO 48 bit testv/stv2ISM48s.wav_16400_48-48_STEREO.tst -// 2 ISM with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, BINAURAL out -../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 16400 48 testv/stv2ISM48s.wav bit -../IVAS_dec BINAURAL 48 bit testv/stv2ISM48s.wav_16400_48-48_binaural.tst - -// 1 ISM with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out -../IVAS_cod -ism 1 testv/stvISM1.csv 16400 48 testv/stv1ISM48s.wav bit -../IVAS_dec BINAURAL_ROOM 48 bit testv/stv1ISM48s.wav_16400_48-48_binaural_room.tst - -// 3 ISM with metadata at 24.4 kbps, 48 kHz in, 48 kHz out, 7_1 out +// 3 ISm with metadata at 24.4 kbps, 48 kHz in, 48 kHz out, 7_1 out ../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 24400 48 testv/stv3ISM48s.wav bit ../IVAS_dec 7_1 48 bit testv/stv3ISM48s.wav_24400_48-48_7_1.tst -// 3 ISM with metadata at 24.4 kbps, 48 kHz in, 48 kHz out, MONO out, random FEC at 5% +// 3 ISm with metadata at 24.4 kbps, 48 kHz in, 48 kHz out, MONO out, random FEC at 5% ../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 24400 48 testv/stv3ISM48s.wav bit ../IVAS_dec -fec 5 MONO 48 bit testv/stv3ISM48s.wav_24400_48-48_MONO_FEC5.tst -// 3 ISM with metadata at 24.4 kbps, 48 kHz in, 48 kHz out, BINAURAL out -../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 24400 48 testv/stv3ISM48s.wav bit -../IVAS_dec BINAURAL 48 bit testv/stv3ISM48s.wav_24400_48-48_binaural.tst - -// 1 ISM with metadata at 32 kbps, 32 kHz in, 32 kHz out, DTX on, MONO out +// 1 ISm with metadata at 32 kbps, 32 kHz in, 32 kHz out, DTX on, MONO out ../IVAS_cod -dtx -ism 1 testv/stvISM1.csv 32000 32 testv/stv32n.wav bit ../IVAS_dec MONO 32 bit testv/stv32n.wav_32000_32-32_DTX_MONO.tst -// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, FOA out +// 4 ISm with metadata at 32 kbps, 48 kHz in, 48 kHz out, FOA out ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48s.wav bit ../IVAS_dec FOA 48 bit testv/stv4ISM48s.wav_32000_48-48_FOA.tst -// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, STEREO out +// 4 ISm with metadata at 32 kbps, 48 kHz in, 48 kHz out, STEREO out ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48s.wav bit ../IVAS_dec STEREO 48 bit testv/stv4ISM48s.wav_32000_48-48_STEREO.tst -// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, BINAURAL out -../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48s.wav bit -../IVAS_dec BINAURAL 48 bit testv/stv4ISM48s.wav_32000_48-48_binaural.tst - -// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL out -../IVAS_cod -dtx -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48n.wav bit -../IVAS_dec BINAURAL 48 bit testv/stv4ISM48n.wav_32000_48-48_DTX_BINAURAL.tst - -// 2 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, DTX on, HOA2 out -../IVAS_cod -dtx -ism 2 testv/stvISM1.csv testv/stvISM2.csv 32000 48 testv/stvST48c.wav bit -../IVAS_dec HOA2 48 bit testv/stv2ST48c.wav_32000_48-48_DTX_HOA2.tst +// 3 ISm with metadata at 48 kbps, 48 kHz in, 48 kHz out, MONO out +../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 48000 48 testv/stv3ISM48s.wav bit +../IVAS_dec MONO 48 bit testv/stv43ISM48s_48000_48-48_MONO.tst +// 2 ISm with metadata at 64 kbps, 48 kHz in, 32 kHz out, 5_1 out +../IVAS_cod -max_band FB -ism 2 testv/stvISM1.csv testv/stvISM2.csv 64000 48 testv/stv2ISM48s.wav bit +../IVAS_dec 5_1 32 bit testv/stv2ISM48s.wav_64000_48-32_5_1.tst -// 2 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, EXTERNAL out -../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 32000 48 testv/stv2ISM48s.wav bit -../IVAS_dec EXT 48 bit testv/stv2ISM48s.wav_32000_48-48_external.tst +// 4 ISm with metadata at 80 kbps, 48 kHz in, 48 kHz out, HOA2 out +../IVAS_cod -max_band FB -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 80000 48 testv/stv4ISM48s.wav bit +../IVAS_dec HOA2 48 bit testv/stv4ISM48s.wav_80000_48-48_HOA2.tst -// 2 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out -../IVAS_cod -ism 2 testv/stvISM3.csv testv/stvISM4.csv 64000 48 testv/stv2ISM48s.wav bit -../IVAS_dec BINAURAL_ROOM 48 bit testv/stv2ISM48s.wav_64000_48-48_binaural_room.tst +// 4 ISm with metadata at 96 kbps, 48 kHz in, 48 kHz out, Custom LS setup out +../IVAS_cod -max_band FB -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 96000 48 testv/stv4ISM48s.wav bit +../IVAS_dec testv/ls_setup_16ch_8+4+4.txt 48 bit testv/stv4ISM48s.wav_96000_48-48_MC_custom_setup.tst -// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out, random FEC at 5% -../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48s.wav bit -../IVAS_dec -fec 5 BINAURAL_ROOM 48 bit testv/stv4ISM48s.wav_32000_48-48_binaural_room_FEC5.tst +// 3 ISm with metadata at 128 kbps, 48 kHz in, 32 kHz out, HOA3 out, random FEC at 5% +../IVAS_cod -max_band FB -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 128000 48 testv/stv3ISM48s.wav bit +../IVAS_dec -fec 5 HOA3 32 bit testv/stv3ISM48s.wav_128000_48-32_HOA3_FEC5.tst -// 3 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, MONO out -../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 48000 48 testv/stv3ISM48s.wav bit -../IVAS_dec MONO 48 bit testv/stv43ISM48s_48000_48-48_MONO.tst +// 4 ISm with metadata at 160 kbps, 48 kHz in, 48 kHz out, STEREO out +../IVAS_cod -max_band FB -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 160000 48 testv/stv4ISM48s.wav bit +../IVAS_dec STEREO 48 bit testv/stv4ISM48s.wav_160000_48-48_STEREO.tst -// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL out -../IVAS_cod -dtx -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48n.wav bit -../IVAS_dec BINAURAL 48 bit testv/stv4ISM48n.wav_32000_48-48_DTX_BINAURAL.tst +// 2 ISm with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, BINAURAL out +../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 16400 48 testv/stv2ISM48s.wav bit +../IVAS_dec BINAURAL 48 bit testv/stv2ISM48s.wav_16400_48-48_binaural.tst -// 4 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL ROOM out, random FEC at 5% -../IVAS_cod -dtx -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 48000 48 testv/stv4ISM48n.wav bit -../IVAS_dec -fec 5 BINAURAL_ROOM 48 bit testv/stv4ISM48n.wav_48000_48-48_DTX_TD_binaural_room_FEC5.tst +// 3 ISm with metadata at 24.4 kbps, 48 kHz in, 48 kHz out, BINAURAL out +../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 24400 48 testv/stv3ISM48s.wav bit +../IVAS_dec BINAURAL 48 bit testv/stv3ISM48s.wav_24400_48-48_binaural.tst -// 2 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL out, random FEC at 5% +// 2 ISm with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL out, random FEC at 5% ../IVAS_cod -ism 2 testv/stvISM3.csv testv/stvISM4.csv 48000 48 testv/stv2ISM48s.wav bit ../IVAS_dec -fec 5 BINAURAL 48 bit testv/stv2ISM48s.wav_48000_48-48_binaural_FEC5.tst -// 1 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out, head rotation, random FEC at 5% -../IVAS_cod -ism 1 testv/stvISM1.csv 48000 48 testv/stv1ISM48s.wav bit -../IVAS_dec -fec 5 -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM 48 bit testv/stv1ISM48s.wav_64000_48-48_binaural_room_HR.tst +// 4 ISm with metadata at 32 kbps, 48 kHz in, 48 kHz out, BINAURAL out +../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48s.wav bit +../IVAS_dec BINAURAL 48 bit testv/stv4ISM48s.wav_32000_48-48_binaural.tst -// 2 ISM with metadata at 64 kbps, 48 kHz in, 32 kHz out, 5_1 out -../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 64000 48 testv/stv2ISM48s.wav bit -../IVAS_dec 5_1 32 bit testv/stv2ISM48s.wav_64000_48-32_5_1.tst +// 1 ISm with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out +../IVAS_cod -ism 1 testv/stvISM1.csv 16400 48 testv/stv1ISM48s.wav bit +../IVAS_dec BINAURAL_ROOM 48 bit testv/stv1ISM48s.wav_16400_48-48_binaural_room.tst -// 4 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out -../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 64000 48 testv/stv4ISM48s.wav bit -../IVAS_dec BINAURAL_ROOM 48 bit testv/stv4ISM48s.wav_64000_48-48_binaural_room.tst +// 2 ISm with metadata at 32 kbps, 48 kHz in, 48 kHz out, EXTERNAL out +../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 32000 48 testv/stv2ISM48s.wav bit +../IVAS_dec EXT 48 bit testv/stv2ISM48s.wav_32000_48-48_external.tst -// 2 ISM with metadata at 80 kbps, 48 kHz in, 48 kHz out, DTX on, stereo out -../IVAS_cod -dtx -ism 2 testv/stvISM1.csv testv/stvISM2.csv 80000 48 testv/stvST48c.wav bit -../IVAS_dec STEREO 48 bit testv/stv2ST48c.wav_80000_48-48_DTX_STEREO.tst +// 2 ISm with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out +../IVAS_cod -ism 2 testv/stvISM3.csv testv/stvISM4.csv 64000 48 testv/stv2ISM48s.wav bit +../IVAS_dec BINAURAL_ROOM 48 bit testv/stv2ISM48s.wav_64000_48-48_binaural_room.tst -// 4 ISM with metadata at 80 kbps, 48 kHz in, 48 kHz out, HOA2 out -../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 80000 48 testv/stv4ISM48s.wav bit -../IVAS_dec HOA2 48 bit testv/stv4ISM48s.wav_80000_48-48_HOA2.tst +// 4 ISm with metadata at 32 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out, random FEC at 5% +../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48s.wav bit +../IVAS_dec -fec 5 BINAURAL_ROOM 48 bit testv/stv4ISM48s.wav_32000_48-48_binaural_room_FEC5.tst -// 1 ISM with metadata at 80 kbps, 48 kHz in, 16 kHz out, BINAURAL out (Model from file), head rotation, random FEC at 5% -../IVAS_cod -ism 1 testv/stvISM1.csv 80000 48 testv/stv1ISM48s.wav bit -../IVAS_dec -fec 5 -t testv/headrot_case00_3000_q.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL 16 bit testv/stv2ISM48s.wav_80000_48-16_binaural_file_TDHR_FEC5.tst +// 4 ISm with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out +../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 64000 48 testv/stv4ISM48s.wav bit +../IVAS_dec BINAURAL_ROOM 48 bit testv/stv4ISM48s.wav_64000_48-48_binaural_room.tst -// 4 ISM with metadata at 96 kbps, 48 kHz in, 48 kHz out, Custom LS setup out -../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 96000 48 testv/stv4ISM48s.wav bit -../IVAS_dec testv/ls_setup_16ch_8+4+4.txt 48 bit testv/stv4ISM48s.wav_96000_48-48_MC_custom_setup.tst +// 1 ISm with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out, head rotation, random FEC at 5% +../IVAS_cod -ism 1 testv/stvISM1.csv 48000 48 testv/stv1ISM48s.wav bit +../IVAS_dec -fec 5 -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM 48 bit testv/stv1ISM48s.wav_64000_48-48_binaural_room_HR.tst -// 1 ISM with metadata at 96 kbps, 48 kHz in, 16 kHz out, BINAURAL out (Model from file) +// 1 ISm with metadata at 96 kbps, 48 kHz in, 16 kHz out, TD BINAURAL out (Model from file) ../IVAS_cod -ism 1 testv/stvISM1.csv 96000 48 testv/stv1ISM48s.wav bit -../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL 16 bit testv/stv2ISM48s.wav_96000_48-16_binaural.tst - -// 3 ISM with metadata at 128 kbps, 48 kHz in, 32 kHz out, HOA3 out, random FEC at 5% -../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 128000 48 testv/stv3ISM48s.wav bit -../IVAS_dec -fec 5 HOA3 32 bit testv/stv3ISM48s.wav_128000_48-32_HOA3_FEC5.tst +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL 16 bit testv/stv2ISM48s.wav_96000_48-16_TD_binaural.tst +// 2 ISm with metadata at 160 kbps, 48 kHz in, 32 kHz out, TD BINAURAL out +../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 160000 48 testv/stv2ISM48s.wav bit +../IVAS_dec BINAURAL 32 bit testv/stv2ISM48s.wav_160000_48-32_TD_binaural.tst -// 2 ISM with metadata at 128 kbps, 48 kHz in, 32 kHz out, BINAURAL out (Model from file), head rotation -../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 128000 48 testv/stv2ISM48s.wav bit -../IVAS_dec -t testv/headrot_case01_3000_q.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin BINAURAL 32 bit testv/stv2ISM48s.wav_128000_48-32_binaural_file_TDHR.tst +// 3 ISm with metadata at 192 kbps, 48 kHz in, 48 kHz out, TD BINAURAL out (Model from file) +../IVAS_cod -ism 3 testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 192000 48 testv/stv3ISM48s.wav bit +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL 48 bit testv/stv3ISM48s.wav_192000_48-48_TD_binaural.tst -// 4 ISM with metadata at 160 kbps, 48 kHz in, 48 kHz out, STEREO out -../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 160000 48 testv/stv4ISM48s.wav bit -../IVAS_dec STEREO 48 bit testv/stv4ISM48s.wav_160000_48-48_STEREO.tst +// 4 ISm with metadata at 256 kbps, 48 kHz in, 48 kHz out, TD BINAURAL out +../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit +../IVAS_dec BINAURAL 48 bit testv/stv4ISM48s.wav_256000_48-48_TD_binaural.tst -// 2 ISM with metadata at 160 kbps, 48 kHz in, 32 kHz out, BINAURAL out -../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 160000 48 testv/stv2ISM48s.wav bit -../IVAS_dec BINAURAL 32 bit testv/stv2ISM48s.wav_160000_48-32_binaural.tst +// 1 ISm with metadata at 80 kbps, 48 kHz in, 16 kHz out, TD BINAURAL out (Model from file), head rotation, random FEC at 5% +../IVAS_cod -ism 1 testv/stvISM1.csv 80000 48 testv/stv1ISM48s.wav bit +../IVAS_dec -fec 5 -t testv/headrot_case00_3000_q.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL 16 bit testv/stv2ISM48s.wav_80000_48-16_TDHR_FEC5.tst -// 3 ISM with metadata at 192 kbps, 48 kHz in, 48 kHz out, BINAURAL out (Model from file) -../IVAS_cod -ism 3 testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 192000 48 testv/stv3ISM48s.wav bit -../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL 48 bit testv/stv3ISM48s.wav_192000_48-48_binaural)file.tst +// 2 ISm with metadata at 128 kbps, 48 kHz in, 32 kHz out, TD BINAURAL out (Model from file), head rotation +../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 128000 48 testv/stv2ISM48s.wav bit +../IVAS_dec -t testv/headrot_case01_3000_q.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin BINAURAL 32 bit testv/stv2ISM48s.wav_128000_48-32_TDHR.tst -// 3 ISM with metadata at 192 kbps, 48 kHz in, 48 kHz out, BINAURAL out, head rotation, random FEC at 5% +// 3 ISm with metadata at 192 kbps, 48 kHz in, 48 kHz out, TD BINAURAL out, head rotation, random FEC at 5% ../IVAS_cod -ism 3 testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 192000 48 testv/stv3ISM48s.wav bit -../IVAS_dec -fec 5 -t testv/headrot_case02_3000_q.csv BINAURAL 48 bit testv/stv3ISM48s.wav_192000_48-48_binaural_file_TDHR_FEC5.tst +../IVAS_dec -fec 5 -t testv/headrot_case02_3000_q.csv BINAURAL 48 bit testv/stv3ISM48s.wav_192000_48-48_TDHR_FEC5.tst -// 4 ISM with metadata at 256 kbps, 48 kHz in, 48 kHz out, BINAURAL out +// 4 ISm with metadata at 256 kbps, 48 kHz in, 48 kHz out, TD BINAURAL out, head rotation ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit -../IVAS_dec BINAURAL 48 bit testv/stv4ISM48s.wav_256000_48-48_binaural.tst +../IVAS_dec -t testv/headrot_case03_3000_q.csv BINAURAL 48 bit testv/stv4ISM48s.wav_256000_48-48_TDHR.tst -// 4 ISM with metadata at 256 kbps, 48 kHz in, 48 kHz out, BINAURAL out, head rotation -../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit -../IVAS_dec -t testv/headrot_case03_3000_q.csv BINAURAL 48 bit testv/stv4ISM48s.wav_256000_48-48_binaural_file_TDHR.tst - -// 3 ISM with metadata at 384 kbps, 48 kHz in, 32 kHz out, 7_1_4 out +// 3 ISm with metadata at 384 kbps, 48 kHz in, 32 kHz out, 7_1_4 out ../IVAS_cod -ism 3 testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 384000 48 testv/stv3ISM48s.wav bit ../IVAS_dec 7_1_4 32 bit testv/stv3ISM48s.wav_384000_48-32_7_1_4.tst -// 4 ISM with metadata at 512 kbps, 48 kHz in, 48 kHz out, 5_1 +// 4 ISm with metadata at 512 kbps, 48 kHz in, 48 kHz out, 5_1 ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 512000 48 testv/stv4ISM48s.wav bit ../IVAS_dec 5_1 48 bit testv/stv4ISM48s.wav_512000_48-48_5_1.tst -// 1 ISM with metadata bitrate switching from 13.2 kbps to 128 kbps, 32 kHz in, 32 kHz out, mono out, DTX on +// 1 ISm with metadata bitrate switching from 13.2 kbps to 128 kbps, 32 kHz in, 32 kHz out, mono out, DTX on ../IVAS_cod -dtx -ism 1 testv/stvISM1.csv ../scripts/switchPaths/sw_13k2_to_128k_10fr.bin 32 testv/stv32c.wav bit ../IVAS_dec MONO 32 bit testv/stv32c.wav_brate_sw_32-32_mono_dtx.tst -// 4 ISM with metadata bitrate switching from 24.4 kbps to 256 kbps, 48 kHz in, 48 kHz out, BINAURAL out +// 4 ISm with metadata bitrate switching from 24.4 kbps to 256 kbps, 48 kHz in, 48 kHz out, BINAURAL out ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stv4ISM48s.wav bit -../IVAS_dec BINAURAL 48 bit testv/stv4ISM48s.wav_brate_sw_48-48_binaural.tst +../IVAS_dec BINAURAL 48 bit testv/stv4ISM48s.wav_brate_sw_48-48_BINAURAL.tst -// 4 ISm with and without metadata bitrate switching from 24.4 kbps to 256 kbps, 48 kHz in, 48 kHz out, DTX on, HOA3 out -../IVAS_cod -dtx -ism 4 testv/stvISM1.csv NULL NULL testv/stvISM4.csv ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stv4ISM48s.wav bit -../IVAS_dec HOA3 48 bit testv/stv4ISM48s.wav_brate_sw_48-48_DTX_hoa3.tst +// 4 ISm with metadata at 256 kbps, 48 kHz in, 48 kHz out, DTX on, TD BINAURAL out +../IVAS_cod -dtx -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48n.wav bit +../IVAS_dec BINAURAL 48 bit testv/stv4ISM48n.wav_256000_48-48_DTX_TD_binaural.tst @@ -515,7 +493,7 @@ ../IVAS_dec -fec 5 FOA 32 bit testv/stvFOA32c.wav_SBA_64000_32-32_DTX_FOA.tst // SBA at 64 kbps, 48kHz in, 48kHz out, 5_1_4 out -../IVAS_cod -sba 1 64000 48 testv/stvFOA48c.wav bit +../IVAS_cod -max_band FB -sba 1 64000 48 testv/stvFOA48c.wav bit ../IVAS_dec 5_1_4 48 bit testv/stvFOA48c.wav_SBA_64000_48-48_5_1_4.tst // SBA at 64 kbps, 48kHz in, 48kHz out, 7_1_4 out diff --git a/scripts/testv/stv16c.wav b/scripts/testv/stv16c.wav index d107fe711d..6923cea4ed 100644 --- a/scripts/testv/stv16c.wav +++ b/scripts/testv/stv16c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:61f9eca5dafeb46a6aa29c82a8252ebb4ffd4e7a7255f5a4653d8335e685872e -size 640046 +oid sha256:787f5198da219f4a449b2269d9f2a7c592abdbc9554a991b8b9656d53aac1884 +size 640108 diff --git a/scripts/testv/stv16n.wav b/scripts/testv/stv16n.wav index 9a9c8798e5..dd94fc0e63 100644 --- a/scripts/testv/stv16n.wav +++ b/scripts/testv/stv16n.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7d0ac0846c3046d91843b390fbef3a0180dac92b7d53e4079b3541d43b8af188 -size 620846 +oid sha256:831f2439e3d728595e3583fea053a5f7130e5f09b69832e686b76a69d93bbcee +size 620908 diff --git a/scripts/testv/stv1ISM48s.wav b/scripts/testv/stv1ISM48s.wav index da05075565..ddcd5d3324 100644 --- a/scripts/testv/stv1ISM48s.wav +++ b/scripts/testv/stv1ISM48s.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:dfd1f55af3964c73b423efe64c7400c02ea3c5f289bf347b019350fe3165bcf3 -size 2880044 +oid sha256:c6914081054030a4a99ab3556f86ecd817b477a132df8d837a8b11568debd49e +size 2880106 diff --git a/scripts/testv/stv1MASA1TC48c.wav b/scripts/testv/stv1MASA1TC48c.wav index 263f109000..60c2de7967 100644 --- a/scripts/testv/stv1MASA1TC48c.wav +++ b/scripts/testv/stv1MASA1TC48c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2409df48bf501463db0e468aeeee11e5aa866f0adf91ef714a7c6fc506235aa1 -size 288044 +oid sha256:e9d4810b9aeee2f374c77ab3a0377c478e49e52d9e81b9ec2a01ddd0e8a0f8d4 +size 288106 diff --git a/scripts/testv/stv1MASA1TC48n.wav b/scripts/testv/stv1MASA1TC48n.wav index 1b0012d886..541ded9f6d 100644 --- a/scripts/testv/stv1MASA1TC48n.wav +++ b/scripts/testv/stv1MASA1TC48n.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:81065ed959b13b8c2a4bb1a05ef14095f523912bc3007fdd172cce87a8398046 -size 1927724 +oid sha256:c0a85059ba982f249e77391188a0d030acf6853fe326ab5ade480239ce80f07f +size 1927786 diff --git a/scripts/testv/stv1MASA2TC48c.wav b/scripts/testv/stv1MASA2TC48c.wav index 982e69fb20..aefec77efe 100644 --- a/scripts/testv/stv1MASA2TC48c.wav +++ b/scripts/testv/stv1MASA2TC48c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1bd8440cbf857f9376d053f780572213964c32a267f325948f3a3a02805dc998 -size 1152044 +oid sha256:ab7437cdf41e56338c93f5e593118a112a48bae5138be2cdd301eff5da59bb06 +size 1152106 diff --git a/scripts/testv/stv1MASA2TC48n.wav b/scripts/testv/stv1MASA2TC48n.wav index f25eb24353..d5e9d955b2 100644 --- a/scripts/testv/stv1MASA2TC48n.wav +++ b/scripts/testv/stv1MASA2TC48n.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:97f1a7a43012ce166b929df59bd756f5d96433ea00ce0a1005380368c01619a0 +oid sha256:8f745778ed4fa70a704f530049022827696fc4e0dd3389a4076a8658ed514926 size 3855404 diff --git a/scripts/testv/stv2ISM48s.wav b/scripts/testv/stv2ISM48s.wav index 02de53114d..a945db6b00 100644 --- a/scripts/testv/stv2ISM48s.wav +++ b/scripts/testv/stv2ISM48s.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e042a1a219fcd4f8a82d1d200071139b76c749d97a7b627774431ba961486b2c -size 5760044 +oid sha256:777052eddbd7cb2ddcf4539a064368efcb6c5155e08ce42fa7a508d98dd5f8c5 +size 5760106 diff --git a/scripts/testv/stv2MASA1TC48c.wav b/scripts/testv/stv2MASA1TC48c.wav index afe705b0b1..43096765fd 100644 --- a/scripts/testv/stv2MASA1TC48c.wav +++ b/scripts/testv/stv2MASA1TC48c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0d500a55bcc63dda1fd93329bcef272a21eb49731ceb0a60e546ef02e07cdd9b -size 576044 +oid sha256:ccf03f372e4836c9d5ef71d75cf92a00642a13f77464e7c0fcf5f46c961a7f8d +size 576106 diff --git a/scripts/testv/stv2MASA2TC48c.wav b/scripts/testv/stv2MASA2TC48c.wav index e159c4f9ae..0f72267ea0 100644 --- a/scripts/testv/stv2MASA2TC48c.wav +++ b/scripts/testv/stv2MASA2TC48c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:60a713ed1b97cf94b16849806951ef83d8f41c8ee455b267ec0a292c695cbbc1 -size 576044 +oid sha256:a5a0379965053087ef1ce4775c85384e8c06aaa8161f12888f5e5c06d8612c1f +size 576106 diff --git a/scripts/testv/stv2OA32c.wav b/scripts/testv/stv2OA32c.wav index 86d288de72..071c4866e0 100644 --- a/scripts/testv/stv2OA32c.wav +++ b/scripts/testv/stv2OA32c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1824c3afe43861b2ed1e4ff94591932f34bb1885d96796e282d3839906e50aed -size 11520350 +oid sha256:d608b108d8e38750d78f1691ed92cac2e92f48a86a4488a3dab9a893cfa6ecf2 +size 11520436 diff --git a/scripts/testv/stv2OA48c.wav b/scripts/testv/stv2OA48c.wav index 24bb1f0872..6ba780a84a 100644 --- a/scripts/testv/stv2OA48c.wav +++ b/scripts/testv/stv2OA48c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f573744bd97ad3dcb8e86c39d1770725a34f3c43c37c62c26d670a7f722a880e -size 17280494 +oid sha256:ef0935e08a571a9e88f2257e64c45394633252766a0fb91da582eabf5537a49e +size 17280580 diff --git a/scripts/testv/stv32c.wav b/scripts/testv/stv32c.wav index 640532cc12..1267f189de 100644 --- a/scripts/testv/stv32c.wav +++ b/scripts/testv/stv32c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:00089d67aa513a9f6b2f73526e94d5c32437c6944ec6467072dc27ccaa1f5080 -size 1389542 +oid sha256:9babeb07a95e9e23068a9c15eea1996a7c366e6000cf8347ce70661631e04ec4 +size 1389700 diff --git a/scripts/testv/stv32n.wav b/scripts/testv/stv32n.wav index 6a23d99d6e..888bbe819c 100644 --- a/scripts/testv/stv32n.wav +++ b/scripts/testv/stv32n.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1a92be333a359a77ec70324815d71282398dede88e59ac19a31f8d18913c0505 -size 1241644 +oid sha256:acbf022e8fbaafb811c14f75f78ec503ef8a1529ce4b04eabbb00c5066635592 +size 1241706 diff --git a/scripts/testv/stv3ISM48s.wav b/scripts/testv/stv3ISM48s.wav index c52500f610..12f31ee40a 100644 --- a/scripts/testv/stv3ISM48s.wav +++ b/scripts/testv/stv3ISM48s.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2a29dfd720edab2367f86c394d4abc9f641596d50697539be70cdfe178d2a28d -size 8640044 +oid sha256:ac91a0d2d1584c52799d7fb52eaa2741df9c6927f94f9d5293dd214938f18a50 +size 8640130 diff --git a/scripts/testv/stv3OA32c.wav b/scripts/testv/stv3OA32c.wav index 07cda52674..88c473707d 100644 --- a/scripts/testv/stv3OA32c.wav +++ b/scripts/testv/stv3OA32c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bdd1fd31b318bef4439a35baf2252c8edabb826198c75d705095b68dfa288fb0 -size 20480588 +oid sha256:7376200d96aafc156cd4f9907e0b727e1e04921bfcbdb580ac8ff58fea4a60d6 +size 20480674 diff --git a/scripts/testv/stv3OA48c.wav b/scripts/testv/stv3OA48c.wav index 960d9e2019..39a208555f 100644 --- a/scripts/testv/stv3OA48c.wav +++ b/scripts/testv/stv3OA48c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7ce54b1708a76f34eeedc40b01e806cb92d32b0813e8ac23bfceaaa8d25262e6 -size 30720844 +oid sha256:3d1bf1ccd3a2d59b8fd768df58c49f9abd2b090664745256eec7d23aa0ea8c70 +size 30720930 diff --git a/scripts/testv/stv48c.wav b/scripts/testv/stv48c.wav index 1be5a1dc3c..d6df0e8fe2 100644 --- a/scripts/testv/stv48c.wav +++ b/scripts/testv/stv48c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:59f39e02d601b453170cde1e49d50e58b58ff5154ba54c75fc5d79f4964d1e48 -size 1920044 +oid sha256:2a2553784fc796c20b2f7d12e159661e9a480438b0ca71bfaf613757c841a1bb +size 1920106 diff --git a/scripts/testv/stv48n.wav b/scripts/testv/stv48n.wav index 2d79cee520..040040fadc 100644 --- a/scripts/testv/stv48n.wav +++ b/scripts/testv/stv48n.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3c774e6fe4e22274ef72552901c4b4870d56d825fa67e8e3e59a30cc0a44dbfa -size 1862444 +oid sha256:621ec6a05e4e5064bd2f5699129e81335ac64f257e3dee293b0245ac1adcdb6b +size 1862506 diff --git a/scripts/testv/stv4ISM48n.wav b/scripts/testv/stv4ISM48n.wav index 0ca6e5f3f5..5294260a0f 100644 --- a/scripts/testv/stv4ISM48n.wav +++ b/scripts/testv/stv4ISM48n.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:74697fcb6241db1bed87121244c09a3499ea4024cdf15d279feafbedbca6123a +oid sha256:b48c4030982641afcaa0c61182f35d6648e2bea4a952d9430f710989e4e4646c size 7680044 diff --git a/scripts/testv/stv4ISM48s.wav b/scripts/testv/stv4ISM48s.wav index de034819ea..faffedc961 100644 --- a/scripts/testv/stv4ISM48s.wav +++ b/scripts/testv/stv4ISM48s.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:70433aebd892f38df31f12f10e71caaa1e794c64abb7d3e75fe895676e63609e -size 11520044 +oid sha256:361001b64a7ff11a22267df08ccd261728b9a455c2c4860f84f99ce2dc6dd485 +size 11520130 diff --git a/scripts/testv/stv512MC48c.wav b/scripts/testv/stv512MC48c.wav index e21644a5d9..a0c66dc86c 100644 --- a/scripts/testv/stv512MC48c.wav +++ b/scripts/testv/stv512MC48c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3be0c6dccbf26f8755200683bba42553eb36feed297110e289afcec32e0c8459 -size 2304044 +oid sha256:0f2bcf911eda4dc1069e113d82f2e72b0849db5fb28ebdd619a59971f16fc909 +size 2304130 diff --git a/scripts/testv/stv514MC48c.wav b/scripts/testv/stv514MC48c.wav index 113cd6219a..22d0c6e0ab 100644 --- a/scripts/testv/stv514MC48c.wav +++ b/scripts/testv/stv514MC48c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d2097dd80fa69f239689b06a62a44eb592bf2fe699e549347ae4567c1b690170 -size 2880044 +oid sha256:6ca93376cae09017177a1a49e2d7d006f5bf61c4c94b9e466dedee6e03a45efb +size 2880130 diff --git a/scripts/testv/stv51MC48c.wav b/scripts/testv/stv51MC48c.wav index e5f4bae7d4..7c98cc83d3 100644 --- a/scripts/testv/stv51MC48c.wav +++ b/scripts/testv/stv51MC48c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:daccececb4336a7f2492185767d108dbc5594a7d6e2841d861f43ef44437a377 -size 11520044 +oid sha256:377961aefebcea8dd87e5a63af8c17f6b0db588f328cee9ae6db5be95e23cd05 +size 11520130 diff --git a/scripts/testv/stv714MC48c.wav b/scripts/testv/stv714MC48c.wav index cabcb790b0..53c36268d0 100644 --- a/scripts/testv/stv714MC48c.wav +++ b/scripts/testv/stv714MC48c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:da62e19b166089efae2f22e68d76b82d3295d15785a4967465a04bc1c75b0462 -size 3456044 +oid sha256:6fa104a2015be912ea80d015ddb0a42774edea137bc9427954767efcae5e0b1c +size 3456130 diff --git a/scripts/testv/stv71MC48c.wav b/scripts/testv/stv71MC48c.wav index 72b3337e59..2a0b012ab0 100644 --- a/scripts/testv/stv71MC48c.wav +++ b/scripts/testv/stv71MC48c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3fb15d0c109c41d5e629b2e15a47be72ca8d209919ac39f79a7947e9cd2e5e02 -size 2304044 +oid sha256:d0ac38ddb16b2ce9cbca27965c5aedaf1af857a6fdce340bc01322794311e92d +size 2304130 diff --git a/scripts/testv/stv8c.wav b/scripts/testv/stv8c.wav index 5f3b0ed4d9..0ee4ea2b7a 100644 --- a/scripts/testv/stv8c.wav +++ b/scripts/testv/stv8c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:722081dcfaaee1c04254b0bde8436c73748a44f6760067907194a1ba24b199d7 -size 320046 +oid sha256:8659d17c088387b59f3a02e698c5dd32746f541493d68be1883a217f4d1b08cf +size 320108 diff --git a/scripts/testv/stv8n.wav b/scripts/testv/stv8n.wav index 2b35ec4dba..66e042366e 100644 --- a/scripts/testv/stv8n.wav +++ b/scripts/testv/stv8n.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:223e9f5353c49163803abedf97d557436d025f445fe9de4508c9559ca15b330b -size 310446 +oid sha256:d872103d81dcdf846105cdacdb33fc02cbae02104e2c77ff5ff6d985f409b81f +size 310508 diff --git a/scripts/testv/stvFOA16c.wav b/scripts/testv/stvFOA16c.wav index cb67e8b371..996ada1bcd 100644 --- a/scripts/testv/stvFOA16c.wav +++ b/scripts/testv/stvFOA16c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6725a5d2647516071033f83f385dc7dfe4ff6719d493b1b682ec0274c1347e93 -size 2560116 +oid sha256:30a766e574f03b20403b873443b837497a685c0c5ac28c5ac51c95ef226385fa +size 2560202 diff --git a/scripts/testv/stvFOA32c.wav b/scripts/testv/stvFOA32c.wav index 661a97a3dc..3a681bfa80 100644 --- a/scripts/testv/stvFOA32c.wav +++ b/scripts/testv/stvFOA32c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:273308e57de4c5f3ef2eeed164b0a9f34ba86ab05ca533ee5ee8a76528c01abe -size 5120180 +oid sha256:47176066fc373347564bc28ff56d8d9d52745ab7dd631ce4e051f81dff6908e5 +size 5120266 diff --git a/scripts/testv/stvFOA48c.wav b/scripts/testv/stvFOA48c.wav index 7ece23b084..ade8e3343d 100644 --- a/scripts/testv/stvFOA48c.wav +++ b/scripts/testv/stvFOA48c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:45a1dd6c4fe6802e98821657337b453d5dab2fe32089c675637b9d23cfe74c8d -size 7680244 +oid sha256:9c5da22f3ab1bd9681fff74a77f8ff543f1565f93a5c573125db8820c267376f +size 7680330 diff --git a/scripts/testv/stvST16c.wav b/scripts/testv/stvST16c.wav index 3fb9ec0b3b..e46f2e6f5d 100644 --- a/scripts/testv/stvST16c.wav +++ b/scripts/testv/stvST16c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:11a2f5887fe2407df03128634188d8aef6d3f76b52db14a1f834dbb98b7dd52e -size 1280048 +oid sha256:350c8b0d4c11d2e994158be287c07fda1eef6fd6f92aaf769a7f8529c88f16d0 +size 1280110 diff --git a/scripts/testv/stvST16n.wav b/scripts/testv/stvST16n.wav index 74c80dca93..63afe4f14b 100644 --- a/scripts/testv/stvST16n.wav +++ b/scripts/testv/stvST16n.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:60a8cfa5abf4e052840fea0054fec5331465149747fd7bc7eadab18b62d864f1 -size 1241648 +oid sha256:40d28848ee6fc8442738662e5cda78473fb099314aab49440afcfd68286d280d +size 1241710 diff --git a/scripts/testv/stvST32c.wav b/scripts/testv/stvST32c.wav index 68a4a1fa33..876c0e558b 100644 --- a/scripts/testv/stvST32c.wav +++ b/scripts/testv/stvST32c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1182294e7c3ba44e854219698e6a3c209e24345ab2e5e4296fce38029324f374 -size 2560044 +oid sha256:12737393e0bbcdb7b6d9d6dbef79984feac3ff5313daa97a6a8793d3e26099ba +size 2560106 diff --git a/scripts/testv/stvST32n.wav b/scripts/testv/stvST32n.wav index 7da590907d..6d77c6892d 100644 --- a/scripts/testv/stvST32n.wav +++ b/scripts/testv/stvST32n.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a6edbfd26681fa42f377891761ad79f97029a3380bc644e47bff1803c7904ff9 -size 2483244 +oid sha256:3642b2bce81ea794457655886f56bca58fb0b1431ed7ac52f1a27f8388c75eb4 +size 2483306 diff --git a/scripts/testv/stvST48c.wav b/scripts/testv/stvST48c.wav index df554e6521..250770d61f 100644 --- a/scripts/testv/stvST48c.wav +++ b/scripts/testv/stvST48c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:40929eb3eb266ed78c16daa2a9c987745fe8e005a577f2dd81264ffda845c118 -size 3840044 +oid sha256:cc028e71c94b43068dcc2c7557277ad1989ee20e7a6d8dd6fd30d70d384d56b3 +size 3840106 diff --git a/scripts/testv/stvST48n.wav b/scripts/testv/stvST48n.wav index cb2d8c4fc3..8dd24e4ca0 100644 --- a/scripts/testv/stvST48n.wav +++ b/scripts/testv/stvST48n.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6074a3a3b88c7868f62c9bcf7df56e4a8fd25ffed059886846220efc4fbc0992 -size 3724844 +oid sha256:ac4262d08b5e45e8ce8da4456740d1e7224aa25b0e3e3088381cb91436cec31f +size 3724906 diff --git a/scripts/trajectories/azi_plus_2-ele_plus_2-every-100-frames-Euler.csv b/scripts/trajectories/azi+2-ele+2-every-100-frames-Euler.csv similarity index 100% rename from scripts/trajectories/azi_plus_2-ele_plus_2-every-100-frames-Euler.csv rename to scripts/trajectories/azi+2-ele+2-every-100-frames-Euler.csv diff --git a/scripts/trajectories/azi_plus_2-ele_plus_2-every-100-frames.csv b/scripts/trajectories/azi+2-ele+2-every-100-frames.csv similarity index 100% rename from scripts/trajectories/azi_plus_2-ele_plus_2-every-100-frames.csv rename to scripts/trajectories/azi+2-ele+2-every-100-frames.csv diff --git a/scripts/trajectories/azi_plus_2-ele_plus_2-every-25-rows.csv b/scripts/trajectories/azi_plus_2-ele_plus_2-every-25-rows.csv deleted file mode 100644 index 4d8eb8d47b..0000000000 --- a/scripts/trajectories/azi_plus_2-ele_plus_2-every-25-rows.csv +++ /dev/null @@ -1,3000 +0,0 @@ - 0.653281, -0.270598, 0.270598, 0.653281 - 0.653281, -0.270598, 0.270598, 0.653281 - 0.653281, -0.270598, 0.270598, 0.653281 - 0.653281, -0.270598, 0.270598, 0.653281 - 0.653281, -0.270598, 0.270598, 0.653281 - 0.653281, -0.270598, 0.270598, 0.653281 - 0.653281, -0.270598, 0.270598, 0.653281 - 0.653281, -0.270598, 0.270598, 0.653281 - 0.653281, -0.270598, 0.270598, 0.653281 - 0.653281, -0.270598, 0.270598, 0.653281 - 0.653281, -0.270598, 0.270598, 0.653281 - 0.653281, -0.270598, 0.270598, 0.653281 - 0.653281, -0.270598, 0.270598, 0.653281 - 0.653281, -0.270598, 0.270598, 0.653281 - 0.653281, -0.270598, 0.270598, 0.653281 - 0.653281, -0.270598, 0.270598, 0.653281 - 0.653281, -0.270598, 0.270598, 0.653281 - 0.653281, -0.270598, 0.270598, 0.653281 - 0.653281, -0.270598, 0.270598, 0.653281 - 0.653281, -0.270598, 0.270598, 0.653281 - 0.653281, -0.270598, 0.270598, 0.653281 - 0.653281, -0.270598, 0.270598, 0.653281 - 0.653281, -0.270598, 0.270598, 0.653281 - 0.653281, -0.270598, 0.270598, 0.653281 - 0.653281, -0.270598, 0.270598, 0.653281 - 0.634602, -0.292582, 0.282543, 0.657150 - 0.634602, -0.292582, 0.282543, 0.657150 - 0.634602, -0.292582, 0.282543, 0.657150 - 0.634602, -0.292582, 0.282543, 0.657150 - 0.634602, -0.292582, 0.282543, 0.657150 - 0.634602, -0.292582, 0.282543, 0.657150 - 0.634602, -0.292582, 0.282543, 0.657150 - 0.634602, -0.292582, 0.282543, 0.657150 - 0.634602, -0.292582, 0.282543, 0.657150 - 0.634602, -0.292582, 0.282543, 0.657150 - 0.634602, -0.292582, 0.282543, 0.657150 - 0.634602, -0.292582, 0.282543, 0.657150 - 0.634602, -0.292582, 0.282543, 0.657150 - 0.634602, -0.292582, 0.282543, 0.657150 - 0.634602, -0.292582, 0.282543, 0.657150 - 0.634602, -0.292582, 0.282543, 0.657150 - 0.634602, -0.292582, 0.282543, 0.657150 - 0.634602, -0.292582, 0.282543, 0.657150 - 0.634602, -0.292582, 0.282543, 0.657150 - 0.634602, -0.292582, 0.282543, 0.657150 - 0.634602, -0.292582, 0.282543, 0.657150 - 0.634602, -0.292582, 0.282543, 0.657150 - 0.634602, -0.292582, 0.282543, 0.657150 - 0.634602, -0.292582, 0.282543, 0.657150 - 0.634602, -0.292582, 0.282543, 0.657150 - 0.615562, -0.314856, 0.293608, 0.660109 - 0.615562, -0.314856, 0.293608, 0.660109 - 0.615562, -0.314856, 0.293608, 0.660109 - 0.615562, -0.314856, 0.293608, 0.660109 - 0.615562, -0.314856, 0.293608, 0.660109 - 0.615562, -0.314856, 0.293608, 0.660109 - 0.615562, -0.314856, 0.293608, 0.660109 - 0.615562, -0.314856, 0.293608, 0.660109 - 0.615562, -0.314856, 0.293608, 0.660109 - 0.615562, -0.314856, 0.293608, 0.660109 - 0.615562, -0.314856, 0.293608, 0.660109 - 0.615562, -0.314856, 0.293608, 0.660109 - 0.615562, -0.314856, 0.293608, 0.660109 - 0.615562, -0.314856, 0.293608, 0.660109 - 0.615562, -0.314856, 0.293608, 0.660109 - 0.615562, -0.314856, 0.293608, 0.660109 - 0.615562, -0.314856, 0.293608, 0.660109 - 0.615562, -0.314856, 0.293608, 0.660109 - 0.615562, -0.314856, 0.293608, 0.660109 - 0.615562, -0.314856, 0.293608, 0.660109 - 0.615562, -0.314856, 0.293608, 0.660109 - 0.615562, -0.314856, 0.293608, 0.660109 - 0.615562, -0.314856, 0.293608, 0.660109 - 0.615562, -0.314856, 0.293608, 0.660109 - 0.615562, -0.314856, 0.293608, 0.660109 - 0.596200, -0.337381, 0.303779, 0.662147 - 0.596200, -0.337381, 0.303779, 0.662147 - 0.596200, -0.337381, 0.303779, 0.662147 - 0.596200, -0.337381, 0.303779, 0.662147 - 0.596200, -0.337381, 0.303779, 0.662147 - 0.596200, -0.337381, 0.303779, 0.662147 - 0.596200, -0.337381, 0.303779, 0.662147 - 0.596200, -0.337381, 0.303779, 0.662147 - 0.596200, -0.337381, 0.303779, 0.662147 - 0.596200, -0.337381, 0.303779, 0.662147 - 0.596200, -0.337381, 0.303779, 0.662147 - 0.596200, -0.337381, 0.303779, 0.662147 - 0.596200, -0.337381, 0.303779, 0.662147 - 0.596200, -0.337381, 0.303779, 0.662147 - 0.596200, -0.337381, 0.303779, 0.662147 - 0.596200, -0.337381, 0.303779, 0.662147 - 0.596200, -0.337381, 0.303779, 0.662147 - 0.596200, -0.337381, 0.303779, 0.662147 - 0.596200, -0.337381, 0.303779, 0.662147 - 0.596200, -0.337381, 0.303779, 0.662147 - 0.596200, -0.337381, 0.303779, 0.662147 - 0.596200, -0.337381, 0.303779, 0.662147 - 0.596200, -0.337381, 0.303779, 0.662147 - 0.596200, -0.337381, 0.303779, 0.662147 - 0.596200, -0.337381, 0.303779, 0.662147 - 0.576556, -0.360116, 0.313044, 0.663252 - 0.576556, -0.360116, 0.313044, 0.663252 - 0.576556, -0.360116, 0.313044, 0.663252 - 0.576556, -0.360116, 0.313044, 0.663252 - 0.576556, -0.360116, 0.313044, 0.663252 - 0.576556, -0.360116, 0.313044, 0.663252 - 0.576556, -0.360116, 0.313044, 0.663252 - 0.576556, -0.360116, 0.313044, 0.663252 - 0.576556, -0.360116, 0.313044, 0.663252 - 0.576556, -0.360116, 0.313044, 0.663252 - 0.576556, -0.360116, 0.313044, 0.663252 - 0.576556, -0.360116, 0.313044, 0.663252 - 0.576556, -0.360116, 0.313044, 0.663252 - 0.576556, -0.360116, 0.313044, 0.663252 - 0.576556, -0.360116, 0.313044, 0.663252 - 0.576556, -0.360116, 0.313044, 0.663252 - 0.576556, -0.360116, 0.313044, 0.663252 - 0.576556, -0.360116, 0.313044, 0.663252 - 0.576556, -0.360116, 0.313044, 0.663252 - 0.576556, -0.360116, 0.313044, 0.663252 - 0.576556, -0.360116, 0.313044, 0.663252 - 0.576556, -0.360116, 0.313044, 0.663252 - 0.576556, -0.360116, 0.313044, 0.663252 - 0.576556, -0.360116, 0.313044, 0.663252 - 0.576556, -0.360116, 0.313044, 0.663252 - 0.556670, -0.383022, 0.321394, 0.663414 - 0.556670, -0.383022, 0.321394, 0.663414 - 0.556670, -0.383022, 0.321394, 0.663414 - 0.556670, -0.383022, 0.321394, 0.663414 - 0.556670, -0.383022, 0.321394, 0.663414 - 0.556670, -0.383022, 0.321394, 0.663414 - 0.556670, -0.383022, 0.321394, 0.663414 - 0.556670, -0.383022, 0.321394, 0.663414 - 0.556670, -0.383022, 0.321394, 0.663414 - 0.556670, -0.383022, 0.321394, 0.663414 - 0.556670, -0.383022, 0.321394, 0.663414 - 0.556670, -0.383022, 0.321394, 0.663414 - 0.556670, -0.383022, 0.321394, 0.663414 - 0.556670, -0.383022, 0.321394, 0.663414 - 0.556670, -0.383022, 0.321394, 0.663414 - 0.556670, -0.383022, 0.321394, 0.663414 - 0.556670, -0.383022, 0.321394, 0.663414 - 0.556670, -0.383022, 0.321394, 0.663414 - 0.556670, -0.383022, 0.321394, 0.663414 - 0.556670, -0.383022, 0.321394, 0.663414 - 0.556670, -0.383022, 0.321394, 0.663414 - 0.556670, -0.383022, 0.321394, 0.663414 - 0.556670, -0.383022, 0.321394, 0.663414 - 0.556670, -0.383022, 0.321394, 0.663414 - 0.556670, -0.383022, 0.321394, 0.663414 - 0.536584, -0.406058, 0.328819, 0.662626 - 0.536584, -0.406058, 0.328819, 0.662626 - 0.536584, -0.406058, 0.328819, 0.662626 - 0.536584, -0.406058, 0.328819, 0.662626 - 0.536584, -0.406058, 0.328819, 0.662626 - 0.536584, -0.406058, 0.328819, 0.662626 - 0.536584, -0.406058, 0.328819, 0.662626 - 0.536584, -0.406058, 0.328819, 0.662626 - 0.536584, -0.406058, 0.328819, 0.662626 - 0.536584, -0.406058, 0.328819, 0.662626 - 0.536584, -0.406058, 0.328819, 0.662626 - 0.536584, -0.406058, 0.328819, 0.662626 - 0.536584, -0.406058, 0.328819, 0.662626 - 0.536584, -0.406058, 0.328819, 0.662626 - 0.536584, -0.406058, 0.328819, 0.662626 - 0.536584, -0.406058, 0.328819, 0.662626 - 0.536584, -0.406058, 0.328819, 0.662626 - 0.536584, -0.406058, 0.328819, 0.662626 - 0.536584, -0.406058, 0.328819, 0.662626 - 0.536584, -0.406058, 0.328819, 0.662626 - 0.536584, -0.406058, 0.328819, 0.662626 - 0.536584, -0.406058, 0.328819, 0.662626 - 0.536584, -0.406058, 0.328819, 0.662626 - 0.536584, -0.406058, 0.328819, 0.662626 - 0.536584, -0.406058, 0.328819, 0.662626 - 0.516337, -0.429181, 0.335313, 0.660881 - 0.516337, -0.429181, 0.335313, 0.660881 - 0.516337, -0.429181, 0.335313, 0.660881 - 0.516337, -0.429181, 0.335313, 0.660881 - 0.516337, -0.429181, 0.335313, 0.660881 - 0.516337, -0.429181, 0.335313, 0.660881 - 0.516337, -0.429181, 0.335313, 0.660881 - 0.516337, -0.429181, 0.335313, 0.660881 - 0.516337, -0.429181, 0.335313, 0.660881 - 0.516337, -0.429181, 0.335313, 0.660881 - 0.516337, -0.429181, 0.335313, 0.660881 - 0.516337, -0.429181, 0.335313, 0.660881 - 0.516337, -0.429181, 0.335313, 0.660881 - 0.516337, -0.429181, 0.335313, 0.660881 - 0.516337, -0.429181, 0.335313, 0.660881 - 0.516337, -0.429181, 0.335313, 0.660881 - 0.516337, -0.429181, 0.335313, 0.660881 - 0.516337, -0.429181, 0.335313, 0.660881 - 0.516337, -0.429181, 0.335313, 0.660881 - 0.516337, -0.429181, 0.335313, 0.660881 - 0.516337, -0.429181, 0.335313, 0.660881 - 0.516337, -0.429181, 0.335313, 0.660881 - 0.516337, -0.429181, 0.335313, 0.660881 - 0.516337, -0.429181, 0.335313, 0.660881 - 0.516337, -0.429181, 0.335313, 0.660881 - 0.495972, -0.452352, 0.340872, 0.658176 - 0.495972, -0.452352, 0.340872, 0.658176 - 0.495972, -0.452352, 0.340872, 0.658176 - 0.495972, -0.452352, 0.340872, 0.658176 - 0.495972, -0.452352, 0.340872, 0.658176 - 0.495972, -0.452352, 0.340872, 0.658176 - 0.495972, -0.452352, 0.340872, 0.658176 - 0.495972, -0.452352, 0.340872, 0.658176 - 0.495972, -0.452352, 0.340872, 0.658176 - 0.495972, -0.452352, 0.340872, 0.658176 - 0.495972, -0.452352, 0.340872, 0.658176 - 0.495972, -0.452352, 0.340872, 0.658176 - 0.495972, -0.452352, 0.340872, 0.658176 - 0.495972, -0.452352, 0.340872, 0.658176 - 0.495972, -0.452352, 0.340872, 0.658176 - 0.495972, -0.452352, 0.340872, 0.658176 - 0.495972, -0.452352, 0.340872, 0.658176 - 0.495972, -0.452352, 0.340872, 0.658176 - 0.495972, -0.452352, 0.340872, 0.658176 - 0.495972, -0.452352, 0.340872, 0.658176 - 0.495972, -0.452352, 0.340872, 0.658176 - 0.495972, -0.452352, 0.340872, 0.658176 - 0.495972, -0.452352, 0.340872, 0.658176 - 0.495972, -0.452352, 0.340872, 0.658176 - 0.495972, -0.452352, 0.340872, 0.658176 - 0.475528, -0.475528, 0.345492, 0.654508 - 0.475528, -0.475528, 0.345492, 0.654508 - 0.475528, -0.475528, 0.345492, 0.654508 - 0.475528, -0.475528, 0.345492, 0.654508 - 0.475528, -0.475528, 0.345492, 0.654508 - 0.475528, -0.475528, 0.345492, 0.654508 - 0.475528, -0.475528, 0.345492, 0.654508 - 0.475528, -0.475528, 0.345492, 0.654508 - 0.475528, -0.475528, 0.345492, 0.654508 - 0.475528, -0.475528, 0.345492, 0.654508 - 0.475528, -0.475528, 0.345492, 0.654508 - 0.475528, -0.475528, 0.345492, 0.654508 - 0.475528, -0.475528, 0.345492, 0.654508 - 0.475528, -0.475528, 0.345492, 0.654508 - 0.475528, -0.475528, 0.345492, 0.654508 - 0.475528, -0.475528, 0.345492, 0.654508 - 0.475528, -0.475528, 0.345492, 0.654508 - 0.475528, -0.475528, 0.345492, 0.654508 - 0.475528, -0.475528, 0.345492, 0.654508 - 0.475528, -0.475528, 0.345492, 0.654508 - 0.475528, -0.475528, 0.345492, 0.654508 - 0.475528, -0.475528, 0.345492, 0.654508 - 0.475528, -0.475528, 0.345492, 0.654508 - 0.475528, -0.475528, 0.345492, 0.654508 - 0.475528, -0.475528, 0.345492, 0.654508 - 0.455049, -0.498668, 0.349171, 0.649877 - 0.455049, -0.498668, 0.349171, 0.649877 - 0.455049, -0.498668, 0.349171, 0.649877 - 0.455049, -0.498668, 0.349171, 0.649877 - 0.455049, -0.498668, 0.349171, 0.649877 - 0.455049, -0.498668, 0.349171, 0.649877 - 0.455049, -0.498668, 0.349171, 0.649877 - 0.455049, -0.498668, 0.349171, 0.649877 - 0.455049, -0.498668, 0.349171, 0.649877 - 0.455049, -0.498668, 0.349171, 0.649877 - 0.455049, -0.498668, 0.349171, 0.649877 - 0.455049, -0.498668, 0.349171, 0.649877 - 0.455049, -0.498668, 0.349171, 0.649877 - 0.455049, -0.498668, 0.349171, 0.649877 - 0.455049, -0.498668, 0.349171, 0.649877 - 0.455049, -0.498668, 0.349171, 0.649877 - 0.455049, -0.498668, 0.349171, 0.649877 - 0.455049, -0.498668, 0.349171, 0.649877 - 0.455049, -0.498668, 0.349171, 0.649877 - 0.455049, -0.498668, 0.349171, 0.649877 - 0.455049, -0.498668, 0.349171, 0.649877 - 0.455049, -0.498668, 0.349171, 0.649877 - 0.455049, -0.498668, 0.349171, 0.649877 - 0.455049, -0.498668, 0.349171, 0.649877 - 0.455049, -0.498668, 0.349171, 0.649877 - 0.434575, -0.521730, 0.351911, 0.644283 - 0.434575, -0.521730, 0.351911, 0.644283 - 0.434575, -0.521730, 0.351911, 0.644283 - 0.434575, -0.521730, 0.351911, 0.644283 - 0.434575, -0.521730, 0.351911, 0.644283 - 0.434575, -0.521730, 0.351911, 0.644283 - 0.434575, -0.521730, 0.351911, 0.644283 - 0.434575, -0.521730, 0.351911, 0.644283 - 0.434575, -0.521730, 0.351911, 0.644283 - 0.434575, -0.521730, 0.351911, 0.644283 - 0.434575, -0.521730, 0.351911, 0.644283 - 0.434575, -0.521730, 0.351911, 0.644283 - 0.434575, -0.521730, 0.351911, 0.644283 - 0.434575, -0.521730, 0.351911, 0.644283 - 0.434575, -0.521730, 0.351911, 0.644283 - 0.434575, -0.521730, 0.351911, 0.644283 - 0.434575, -0.521730, 0.351911, 0.644283 - 0.434575, -0.521730, 0.351911, 0.644283 - 0.434575, -0.521730, 0.351911, 0.644283 - 0.434575, -0.521730, 0.351911, 0.644283 - 0.434575, -0.521730, 0.351911, 0.644283 - 0.434575, -0.521730, 0.351911, 0.644283 - 0.434575, -0.521730, 0.351911, 0.644283 - 0.434575, -0.521730, 0.351911, 0.644283 - 0.434575, -0.521730, 0.351911, 0.644283 - 0.414147, -0.544673, 0.353715, 0.637730 - 0.414147, -0.544673, 0.353715, 0.637730 - 0.414147, -0.544673, 0.353715, 0.637730 - 0.414147, -0.544673, 0.353715, 0.637730 - 0.414147, -0.544673, 0.353715, 0.637730 - 0.414147, -0.544673, 0.353715, 0.637730 - 0.414147, -0.544673, 0.353715, 0.637730 - 0.414147, -0.544673, 0.353715, 0.637730 - 0.414147, -0.544673, 0.353715, 0.637730 - 0.414147, -0.544673, 0.353715, 0.637730 - 0.414147, -0.544673, 0.353715, 0.637730 - 0.414147, -0.544673, 0.353715, 0.637730 - 0.414147, -0.544673, 0.353715, 0.637730 - 0.414147, -0.544673, 0.353715, 0.637730 - 0.414147, -0.544673, 0.353715, 0.637730 - 0.414147, -0.544673, 0.353715, 0.637730 - 0.414147, -0.544673, 0.353715, 0.637730 - 0.414147, -0.544673, 0.353715, 0.637730 - 0.414147, -0.544673, 0.353715, 0.637730 - 0.414147, -0.544673, 0.353715, 0.637730 - 0.414147, -0.544673, 0.353715, 0.637730 - 0.414147, -0.544673, 0.353715, 0.637730 - 0.414147, -0.544673, 0.353715, 0.637730 - 0.414147, -0.544673, 0.353715, 0.637730 - 0.414147, -0.544673, 0.353715, 0.637730 - 0.393807, -0.567455, 0.354585, 0.630223 - 0.393807, -0.567455, 0.354585, 0.630223 - 0.393807, -0.567455, 0.354585, 0.630223 - 0.393807, -0.567455, 0.354585, 0.630223 - 0.393807, -0.567455, 0.354585, 0.630223 - 0.393807, -0.567455, 0.354585, 0.630223 - 0.393807, -0.567455, 0.354585, 0.630223 - 0.393807, -0.567455, 0.354585, 0.630223 - 0.393807, -0.567455, 0.354585, 0.630223 - 0.393807, -0.567455, 0.354585, 0.630223 - 0.393807, -0.567455, 0.354585, 0.630223 - 0.393807, -0.567455, 0.354585, 0.630223 - 0.393807, -0.567455, 0.354585, 0.630223 - 0.393807, -0.567455, 0.354585, 0.630223 - 0.393807, -0.567455, 0.354585, 0.630223 - 0.393807, -0.567455, 0.354585, 0.630223 - 0.393807, -0.567455, 0.354585, 0.630223 - 0.393807, -0.567455, 0.354585, 0.630223 - 0.393807, -0.567455, 0.354585, 0.630223 - 0.393807, -0.567455, 0.354585, 0.630223 - 0.393807, -0.567455, 0.354585, 0.630223 - 0.393807, -0.567455, 0.354585, 0.630223 - 0.393807, -0.567455, 0.354585, 0.630223 - 0.393807, -0.567455, 0.354585, 0.630223 - 0.393807, -0.567455, 0.354585, 0.630223 - 0.373595, -0.590035, 0.354529, 0.621767 - 0.373595, -0.590035, 0.354529, 0.621767 - 0.373595, -0.590035, 0.354529, 0.621767 - 0.373595, -0.590035, 0.354529, 0.621767 - 0.373595, -0.590035, 0.354529, 0.621767 - 0.373595, -0.590035, 0.354529, 0.621767 - 0.373595, -0.590035, 0.354529, 0.621767 - 0.373595, -0.590035, 0.354529, 0.621767 - 0.373595, -0.590035, 0.354529, 0.621767 - 0.373595, -0.590035, 0.354529, 0.621767 - 0.373595, -0.590035, 0.354529, 0.621767 - 0.373595, -0.590035, 0.354529, 0.621767 - 0.373595, -0.590035, 0.354529, 0.621767 - 0.373595, -0.590035, 0.354529, 0.621767 - 0.373595, -0.590035, 0.354529, 0.621767 - 0.373595, -0.590035, 0.354529, 0.621767 - 0.373595, -0.590035, 0.354529, 0.621767 - 0.373595, -0.590035, 0.354529, 0.621767 - 0.373595, -0.590035, 0.354529, 0.621767 - 0.373595, -0.590035, 0.354529, 0.621767 - 0.373595, -0.590035, 0.354529, 0.621767 - 0.373595, -0.590035, 0.354529, 0.621767 - 0.373595, -0.590035, 0.354529, 0.621767 - 0.373595, -0.590035, 0.354529, 0.621767 - 0.373595, -0.590035, 0.354529, 0.621767 - 0.353553, -0.612372, 0.353553, 0.612372 - 0.353553, -0.612372, 0.353553, 0.612372 - 0.353553, -0.612372, 0.353553, 0.612372 - 0.353553, -0.612372, 0.353553, 0.612372 - 0.353553, -0.612372, 0.353553, 0.612372 - 0.353553, -0.612372, 0.353553, 0.612372 - 0.353553, -0.612372, 0.353553, 0.612372 - 0.353553, -0.612372, 0.353553, 0.612372 - 0.353553, -0.612372, 0.353553, 0.612372 - 0.353553, -0.612372, 0.353553, 0.612372 - 0.353553, -0.612372, 0.353553, 0.612372 - 0.353553, -0.612372, 0.353553, 0.612372 - 0.353553, -0.612372, 0.353553, 0.612372 - 0.353553, -0.612372, 0.353553, 0.612372 - 0.353553, -0.612372, 0.353553, 0.612372 - 0.353553, -0.612372, 0.353553, 0.612372 - 0.353553, -0.612372, 0.353553, 0.612372 - 0.353553, -0.612372, 0.353553, 0.612372 - 0.353553, -0.612372, 0.353553, 0.612372 - 0.353553, -0.612372, 0.353553, 0.612372 - 0.353553, -0.612372, 0.353553, 0.612372 - 0.353553, -0.612372, 0.353553, 0.612372 - 0.353553, -0.612372, 0.353553, 0.612372 - 0.353553, -0.612372, 0.353553, 0.612372 - 0.353553, -0.612372, 0.353553, 0.612372 - 0.333721, -0.634427, 0.351668, 0.602048 - 0.333721, -0.634427, 0.351668, 0.602048 - 0.333721, -0.634427, 0.351668, 0.602048 - 0.333721, -0.634427, 0.351668, 0.602048 - 0.333721, -0.634427, 0.351668, 0.602048 - 0.333721, -0.634427, 0.351668, 0.602048 - 0.333721, -0.634427, 0.351668, 0.602048 - 0.333721, -0.634427, 0.351668, 0.602048 - 0.333721, -0.634427, 0.351668, 0.602048 - 0.333721, -0.634427, 0.351668, 0.602048 - 0.333721, -0.634427, 0.351668, 0.602048 - 0.333721, -0.634427, 0.351668, 0.602048 - 0.333721, -0.634427, 0.351668, 0.602048 - 0.333721, -0.634427, 0.351668, 0.602048 - 0.333721, -0.634427, 0.351668, 0.602048 - 0.333721, -0.634427, 0.351668, 0.602048 - 0.333721, -0.634427, 0.351668, 0.602048 - 0.333721, -0.634427, 0.351668, 0.602048 - 0.333721, -0.634427, 0.351668, 0.602048 - 0.333721, -0.634427, 0.351668, 0.602048 - 0.333721, -0.634427, 0.351668, 0.602048 - 0.333721, -0.634427, 0.351668, 0.602048 - 0.333721, -0.634427, 0.351668, 0.602048 - 0.333721, -0.634427, 0.351668, 0.602048 - 0.333721, -0.634427, 0.351668, 0.602048 - 0.314138, -0.656158, 0.348885, 0.590807 - 0.314138, -0.656158, 0.348885, 0.590807 - 0.314138, -0.656158, 0.348885, 0.590807 - 0.314138, -0.656158, 0.348885, 0.590807 - 0.314138, -0.656158, 0.348885, 0.590807 - 0.314138, -0.656158, 0.348885, 0.590807 - 0.314138, -0.656158, 0.348885, 0.590807 - 0.314138, -0.656158, 0.348885, 0.590807 - 0.314138, -0.656158, 0.348885, 0.590807 - 0.314138, -0.656158, 0.348885, 0.590807 - 0.314138, -0.656158, 0.348885, 0.590807 - 0.314138, -0.656158, 0.348885, 0.590807 - 0.314138, -0.656158, 0.348885, 0.590807 - 0.314138, -0.656158, 0.348885, 0.590807 - 0.314138, -0.656158, 0.348885, 0.590807 - 0.314138, -0.656158, 0.348885, 0.590807 - 0.314138, -0.656158, 0.348885, 0.590807 - 0.314138, -0.656158, 0.348885, 0.590807 - 0.314138, -0.656158, 0.348885, 0.590807 - 0.314138, -0.656158, 0.348885, 0.590807 - 0.314138, -0.656158, 0.348885, 0.590807 - 0.314138, -0.656158, 0.348885, 0.590807 - 0.314138, -0.656158, 0.348885, 0.590807 - 0.314138, -0.656158, 0.348885, 0.590807 - 0.314138, -0.656158, 0.348885, 0.590807 - 0.294843, -0.677527, 0.345217, 0.578662 - 0.294843, -0.677527, 0.345217, 0.578662 - 0.294843, -0.677527, 0.345217, 0.578662 - 0.294843, -0.677527, 0.345217, 0.578662 - 0.294843, -0.677527, 0.345217, 0.578662 - 0.294843, -0.677527, 0.345217, 0.578662 - 0.294843, -0.677527, 0.345217, 0.578662 - 0.294843, -0.677527, 0.345217, 0.578662 - 0.294843, -0.677527, 0.345217, 0.578662 - 0.294843, -0.677527, 0.345217, 0.578662 - 0.294843, -0.677527, 0.345217, 0.578662 - 0.294843, -0.677527, 0.345217, 0.578662 - 0.294843, -0.677527, 0.345217, 0.578662 - 0.294843, -0.677527, 0.345217, 0.578662 - 0.294843, -0.677527, 0.345217, 0.578662 - 0.294843, -0.677527, 0.345217, 0.578662 - 0.294843, -0.677527, 0.345217, 0.578662 - 0.294843, -0.677527, 0.345217, 0.578662 - 0.294843, -0.677527, 0.345217, 0.578662 - 0.294843, -0.677527, 0.345217, 0.578662 - 0.294843, -0.677527, 0.345217, 0.578662 - 0.294843, -0.677527, 0.345217, 0.578662 - 0.294843, -0.677527, 0.345217, 0.578662 - 0.294843, -0.677527, 0.345217, 0.578662 - 0.294843, -0.677527, 0.345217, 0.578662 - 0.275876, -0.698494, 0.340678, 0.565629 - 0.275876, -0.698494, 0.340678, 0.565629 - 0.275876, -0.698494, 0.340678, 0.565629 - 0.275876, -0.698494, 0.340678, 0.565629 - 0.275876, -0.698494, 0.340678, 0.565629 - 0.275876, -0.698494, 0.340678, 0.565629 - 0.275876, -0.698494, 0.340678, 0.565629 - 0.275876, -0.698494, 0.340678, 0.565629 - 0.275876, -0.698494, 0.340678, 0.565629 - 0.275876, -0.698494, 0.340678, 0.565629 - 0.275876, -0.698494, 0.340678, 0.565629 - 0.275876, -0.698494, 0.340678, 0.565629 - 0.275876, -0.698494, 0.340678, 0.565629 - 0.275876, -0.698494, 0.340678, 0.565629 - 0.275876, -0.698494, 0.340678, 0.565629 - 0.275876, -0.698494, 0.340678, 0.565629 - 0.275876, -0.698494, 0.340678, 0.565629 - 0.275876, -0.698494, 0.340678, 0.565629 - 0.275876, -0.698494, 0.340678, 0.565629 - 0.275876, -0.698494, 0.340678, 0.565629 - 0.275876, -0.698494, 0.340678, 0.565629 - 0.275876, -0.698494, 0.340678, 0.565629 - 0.275876, -0.698494, 0.340678, 0.565629 - 0.275876, -0.698494, 0.340678, 0.565629 - 0.275876, -0.698494, 0.340678, 0.565629 - 0.257274, -0.719022, 0.335286, 0.551725 - 0.257274, -0.719022, 0.335286, 0.551725 - 0.257274, -0.719022, 0.335286, 0.551725 - 0.257274, -0.719022, 0.335286, 0.551725 - 0.257274, -0.719022, 0.335286, 0.551725 - 0.257274, -0.719022, 0.335286, 0.551725 - 0.257274, -0.719022, 0.335286, 0.551725 - 0.257274, -0.719022, 0.335286, 0.551725 - 0.257274, -0.719022, 0.335286, 0.551725 - 0.257274, -0.719022, 0.335286, 0.551725 - 0.257274, -0.719022, 0.335286, 0.551725 - 0.257274, -0.719022, 0.335286, 0.551725 - 0.257274, -0.719022, 0.335286, 0.551725 - 0.257274, -0.719022, 0.335286, 0.551725 - 0.257274, -0.719022, 0.335286, 0.551725 - 0.257274, -0.719022, 0.335286, 0.551725 - 0.257274, -0.719022, 0.335286, 0.551725 - 0.257274, -0.719022, 0.335286, 0.551725 - 0.257274, -0.719022, 0.335286, 0.551725 - 0.257274, -0.719022, 0.335286, 0.551725 - 0.257274, -0.719022, 0.335286, 0.551725 - 0.257274, -0.719022, 0.335286, 0.551725 - 0.257274, -0.719022, 0.335286, 0.551725 - 0.257274, -0.719022, 0.335286, 0.551725 - 0.257274, -0.719022, 0.335286, 0.551725 - 0.239074, -0.739074, 0.329057, 0.536969 - 0.239074, -0.739074, 0.329057, 0.536969 - 0.239074, -0.739074, 0.329057, 0.536969 - 0.239074, -0.739074, 0.329057, 0.536969 - 0.239074, -0.739074, 0.329057, 0.536969 - 0.239074, -0.739074, 0.329057, 0.536969 - 0.239074, -0.739074, 0.329057, 0.536969 - 0.239074, -0.739074, 0.329057, 0.536969 - 0.239074, -0.739074, 0.329057, 0.536969 - 0.239074, -0.739074, 0.329057, 0.536969 - 0.239074, -0.739074, 0.329057, 0.536969 - 0.239074, -0.739074, 0.329057, 0.536969 - 0.239074, -0.739074, 0.329057, 0.536969 - 0.239074, -0.739074, 0.329057, 0.536969 - 0.239074, -0.739074, 0.329057, 0.536969 - 0.239074, -0.739074, 0.329057, 0.536969 - 0.239074, -0.739074, 0.329057, 0.536969 - 0.239074, -0.739074, 0.329057, 0.536969 - 0.239074, -0.739074, 0.329057, 0.536969 - 0.239074, -0.739074, 0.329057, 0.536969 - 0.239074, -0.739074, 0.329057, 0.536969 - 0.239074, -0.739074, 0.329057, 0.536969 - 0.239074, -0.739074, 0.329057, 0.536969 - 0.239074, -0.739074, 0.329057, 0.536969 - 0.239074, -0.739074, 0.329057, 0.536969 - 0.221313, -0.758612, 0.322012, 0.521380 - 0.221313, -0.758612, 0.322012, 0.521380 - 0.221313, -0.758612, 0.322012, 0.521380 - 0.221313, -0.758612, 0.322012, 0.521380 - 0.221313, -0.758612, 0.322012, 0.521380 - 0.221313, -0.758612, 0.322012, 0.521380 - 0.221313, -0.758612, 0.322012, 0.521380 - 0.221313, -0.758612, 0.322012, 0.521380 - 0.221313, -0.758612, 0.322012, 0.521380 - 0.221313, -0.758612, 0.322012, 0.521380 - 0.221313, -0.758612, 0.322012, 0.521380 - 0.221313, -0.758612, 0.322012, 0.521380 - 0.221313, -0.758612, 0.322012, 0.521380 - 0.221313, -0.758612, 0.322012, 0.521380 - 0.221313, -0.758612, 0.322012, 0.521380 - 0.221313, -0.758612, 0.322012, 0.521380 - 0.221313, -0.758612, 0.322012, 0.521380 - 0.221313, -0.758612, 0.322012, 0.521380 - 0.221313, -0.758612, 0.322012, 0.521380 - 0.221313, -0.758612, 0.322012, 0.521380 - 0.221313, -0.758612, 0.322012, 0.521380 - 0.221313, -0.758612, 0.322012, 0.521380 - 0.221313, -0.758612, 0.322012, 0.521380 - 0.221313, -0.758612, 0.322012, 0.521380 - 0.221313, -0.758612, 0.322012, 0.521380 - 0.204025, -0.777602, 0.314172, 0.504981 - 0.204025, -0.777602, 0.314172, 0.504981 - 0.204025, -0.777602, 0.314172, 0.504981 - 0.204025, -0.777602, 0.314172, 0.504981 - 0.204025, -0.777602, 0.314172, 0.504981 - 0.204025, -0.777602, 0.314172, 0.504981 - 0.204025, -0.777602, 0.314172, 0.504981 - 0.204025, -0.777602, 0.314172, 0.504981 - 0.204025, -0.777602, 0.314172, 0.504981 - 0.204025, -0.777602, 0.314172, 0.504981 - 0.204025, -0.777602, 0.314172, 0.504981 - 0.204025, -0.777602, 0.314172, 0.504981 - 0.204025, -0.777602, 0.314172, 0.504981 - 0.204025, -0.777602, 0.314172, 0.504981 - 0.204025, -0.777602, 0.314172, 0.504981 - 0.204025, -0.777602, 0.314172, 0.504981 - 0.204025, -0.777602, 0.314172, 0.504981 - 0.204025, -0.777602, 0.314172, 0.504981 - 0.204025, -0.777602, 0.314172, 0.504981 - 0.204025, -0.777602, 0.314172, 0.504981 - 0.204025, -0.777602, 0.314172, 0.504981 - 0.204025, -0.777602, 0.314172, 0.504981 - 0.204025, -0.777602, 0.314172, 0.504981 - 0.204025, -0.777602, 0.314172, 0.504981 - 0.204025, -0.777602, 0.314172, 0.504981 - 0.187247, -0.796008, 0.305559, 0.487794 - 0.187247, -0.796008, 0.305559, 0.487794 - 0.187247, -0.796008, 0.305559, 0.487794 - 0.187247, -0.796008, 0.305559, 0.487794 - 0.187247, -0.796008, 0.305559, 0.487794 - 0.187247, -0.796008, 0.305559, 0.487794 - 0.187247, -0.796008, 0.305559, 0.487794 - 0.187247, -0.796008, 0.305559, 0.487794 - 0.187247, -0.796008, 0.305559, 0.487794 - 0.187247, -0.796008, 0.305559, 0.487794 - 0.187247, -0.796008, 0.305559, 0.487794 - 0.187247, -0.796008, 0.305559, 0.487794 - 0.187247, -0.796008, 0.305559, 0.487794 - 0.187247, -0.796008, 0.305559, 0.487794 - 0.187247, -0.796008, 0.305559, 0.487794 - 0.187247, -0.796008, 0.305559, 0.487794 - 0.187247, -0.796008, 0.305559, 0.487794 - 0.187247, -0.796008, 0.305559, 0.487794 - 0.187247, -0.796008, 0.305559, 0.487794 - 0.187247, -0.796008, 0.305559, 0.487794 - 0.187247, -0.796008, 0.305559, 0.487794 - 0.187247, -0.796008, 0.305559, 0.487794 - 0.187247, -0.796008, 0.305559, 0.487794 - 0.187247, -0.796008, 0.305559, 0.487794 - 0.187247, -0.796008, 0.305559, 0.487794 - 0.171010, -0.813798, 0.296198, 0.469846 - 0.171010, -0.813798, 0.296198, 0.469846 - 0.171010, -0.813798, 0.296198, 0.469846 - 0.171010, -0.813798, 0.296198, 0.469846 - 0.171010, -0.813798, 0.296198, 0.469846 - 0.171010, -0.813798, 0.296198, 0.469846 - 0.171010, -0.813798, 0.296198, 0.469846 - 0.171010, -0.813798, 0.296198, 0.469846 - 0.171010, -0.813798, 0.296198, 0.469846 - 0.171010, -0.813798, 0.296198, 0.469846 - 0.171010, -0.813798, 0.296198, 0.469846 - 0.171010, -0.813798, 0.296198, 0.469846 - 0.171010, -0.813798, 0.296198, 0.469846 - 0.171010, -0.813798, 0.296198, 0.469846 - 0.171010, -0.813798, 0.296198, 0.469846 - 0.171010, -0.813798, 0.296198, 0.469846 - 0.171010, -0.813798, 0.296198, 0.469846 - 0.171010, -0.813798, 0.296198, 0.469846 - 0.171010, -0.813798, 0.296198, 0.469846 - 0.171010, -0.813798, 0.296198, 0.469846 - 0.171010, -0.813798, 0.296198, 0.469846 - 0.171010, -0.813798, 0.296198, 0.469846 - 0.171010, -0.813798, 0.296198, 0.469846 - 0.171010, -0.813798, 0.296198, 0.469846 - 0.171010, -0.813798, 0.296198, 0.469846 - 0.155348, -0.830938, 0.286115, 0.451162 - 0.155348, -0.830938, 0.286115, 0.451162 - 0.155348, -0.830938, 0.286115, 0.451162 - 0.155348, -0.830938, 0.286115, 0.451162 - 0.155348, -0.830938, 0.286115, 0.451162 - 0.155348, -0.830938, 0.286115, 0.451162 - 0.155348, -0.830938, 0.286115, 0.451162 - 0.155348, -0.830938, 0.286115, 0.451162 - 0.155348, -0.830938, 0.286115, 0.451162 - 0.155348, -0.830938, 0.286115, 0.451162 - 0.155348, -0.830938, 0.286115, 0.451162 - 0.155348, -0.830938, 0.286115, 0.451162 - 0.155348, -0.830938, 0.286115, 0.451162 - 0.155348, -0.830938, 0.286115, 0.451162 - 0.155348, -0.830938, 0.286115, 0.451162 - 0.155348, -0.830938, 0.286115, 0.451162 - 0.155348, -0.830938, 0.286115, 0.451162 - 0.155348, -0.830938, 0.286115, 0.451162 - 0.155348, -0.830938, 0.286115, 0.451162 - 0.155348, -0.830938, 0.286115, 0.451162 - 0.155348, -0.830938, 0.286115, 0.451162 - 0.155348, -0.830938, 0.286115, 0.451162 - 0.155348, -0.830938, 0.286115, 0.451162 - 0.155348, -0.830938, 0.286115, 0.451162 - 0.155348, -0.830938, 0.286115, 0.451162 - 0.140291, -0.847398, 0.275336, 0.431771 - 0.140291, -0.847398, 0.275336, 0.431771 - 0.140291, -0.847398, 0.275336, 0.431771 - 0.140291, -0.847398, 0.275336, 0.431771 - 0.140291, -0.847398, 0.275336, 0.431771 - 0.140291, -0.847398, 0.275336, 0.431771 - 0.140291, -0.847398, 0.275336, 0.431771 - 0.140291, -0.847398, 0.275336, 0.431771 - 0.140291, -0.847398, 0.275336, 0.431771 - 0.140291, -0.847398, 0.275336, 0.431771 - 0.140291, -0.847398, 0.275336, 0.431771 - 0.140291, -0.847398, 0.275336, 0.431771 - 0.140291, -0.847398, 0.275336, 0.431771 - 0.140291, -0.847398, 0.275336, 0.431771 - 0.140291, -0.847398, 0.275336, 0.431771 - 0.140291, -0.847398, 0.275336, 0.431771 - 0.140291, -0.847398, 0.275336, 0.431771 - 0.140291, -0.847398, 0.275336, 0.431771 - 0.140291, -0.847398, 0.275336, 0.431771 - 0.140291, -0.847398, 0.275336, 0.431771 - 0.140291, -0.847398, 0.275336, 0.431771 - 0.140291, -0.847398, 0.275336, 0.431771 - 0.140291, -0.847398, 0.275336, 0.431771 - 0.140291, -0.847398, 0.275336, 0.431771 - 0.140291, -0.847398, 0.275336, 0.431771 - 0.125869, -0.863147, 0.263890, 0.411700 - 0.125869, -0.863147, 0.263890, 0.411700 - 0.125869, -0.863147, 0.263890, 0.411700 - 0.125869, -0.863147, 0.263890, 0.411700 - 0.125869, -0.863147, 0.263890, 0.411700 - 0.125869, -0.863147, 0.263890, 0.411700 - 0.125869, -0.863147, 0.263890, 0.411700 - 0.125869, -0.863147, 0.263890, 0.411700 - 0.125869, -0.863147, 0.263890, 0.411700 - 0.125869, -0.863147, 0.263890, 0.411700 - 0.125869, -0.863147, 0.263890, 0.411700 - 0.125869, -0.863147, 0.263890, 0.411700 - 0.125869, -0.863147, 0.263890, 0.411700 - 0.125869, -0.863147, 0.263890, 0.411700 - 0.125869, -0.863147, 0.263890, 0.411700 - 0.125869, -0.863147, 0.263890, 0.411700 - 0.125869, -0.863147, 0.263890, 0.411700 - 0.125869, -0.863147, 0.263890, 0.411700 - 0.125869, -0.863147, 0.263890, 0.411700 - 0.125869, -0.863147, 0.263890, 0.411700 - 0.125869, -0.863147, 0.263890, 0.411700 - 0.125869, -0.863147, 0.263890, 0.411700 - 0.125869, -0.863147, 0.263890, 0.411700 - 0.125869, -0.863147, 0.263890, 0.411700 - 0.125869, -0.863147, 0.263890, 0.411700 - 0.112112, -0.878156, 0.251807, 0.390980 - 0.112112, -0.878156, 0.251807, 0.390980 - 0.112112, -0.878156, 0.251807, 0.390980 - 0.112112, -0.878156, 0.251807, 0.390980 - 0.112112, -0.878156, 0.251807, 0.390980 - 0.112112, -0.878156, 0.251807, 0.390980 - 0.112112, -0.878156, 0.251807, 0.390980 - 0.112112, -0.878156, 0.251807, 0.390980 - 0.112112, -0.878156, 0.251807, 0.390980 - 0.112112, -0.878156, 0.251807, 0.390980 - 0.112112, -0.878156, 0.251807, 0.390980 - 0.112112, -0.878156, 0.251807, 0.390980 - 0.112112, -0.878156, 0.251807, 0.390980 - 0.112112, -0.878156, 0.251807, 0.390980 - 0.112112, -0.878156, 0.251807, 0.390980 - 0.112112, -0.878156, 0.251807, 0.390980 - 0.112112, -0.878156, 0.251807, 0.390980 - 0.112112, -0.878156, 0.251807, 0.390980 - 0.112112, -0.878156, 0.251807, 0.390980 - 0.112112, -0.878156, 0.251807, 0.390980 - 0.112112, -0.878156, 0.251807, 0.390980 - 0.112112, -0.878156, 0.251807, 0.390980 - 0.112112, -0.878156, 0.251807, 0.390980 - 0.112112, -0.878156, 0.251807, 0.390980 - 0.112112, -0.878156, 0.251807, 0.390980 - 0.099046, -0.892399, 0.239118, 0.369644 - 0.099046, -0.892399, 0.239118, 0.369644 - 0.099046, -0.892399, 0.239118, 0.369644 - 0.099046, -0.892399, 0.239118, 0.369644 - 0.099046, -0.892399, 0.239118, 0.369644 - 0.099046, -0.892399, 0.239118, 0.369644 - 0.099046, -0.892399, 0.239118, 0.369644 - 0.099046, -0.892399, 0.239118, 0.369644 - 0.099046, -0.892399, 0.239118, 0.369644 - 0.099046, -0.892399, 0.239118, 0.369644 - 0.099046, -0.892399, 0.239118, 0.369644 - 0.099046, -0.892399, 0.239118, 0.369644 - 0.099046, -0.892399, 0.239118, 0.369644 - 0.099046, -0.892399, 0.239118, 0.369644 - 0.099046, -0.892399, 0.239118, 0.369644 - 0.099046, -0.892399, 0.239118, 0.369644 - 0.099046, -0.892399, 0.239118, 0.369644 - 0.099046, -0.892399, 0.239118, 0.369644 - 0.099046, -0.892399, 0.239118, 0.369644 - 0.099046, -0.892399, 0.239118, 0.369644 - 0.099046, -0.892399, 0.239118, 0.369644 - 0.099046, -0.892399, 0.239118, 0.369644 - 0.099046, -0.892399, 0.239118, 0.369644 - 0.099046, -0.892399, 0.239118, 0.369644 - 0.099046, -0.892399, 0.239118, 0.369644 - 0.086697, -0.905849, 0.225854, 0.347723 - 0.086697, -0.905849, 0.225854, 0.347723 - 0.086697, -0.905849, 0.225854, 0.347723 - 0.086697, -0.905849, 0.225854, 0.347723 - 0.086697, -0.905849, 0.225854, 0.347723 - 0.086697, -0.905849, 0.225854, 0.347723 - 0.086697, -0.905849, 0.225854, 0.347723 - 0.086697, -0.905849, 0.225854, 0.347723 - 0.086697, -0.905849, 0.225854, 0.347723 - 0.086697, -0.905849, 0.225854, 0.347723 - 0.086697, -0.905849, 0.225854, 0.347723 - 0.086697, -0.905849, 0.225854, 0.347723 - 0.086697, -0.905849, 0.225854, 0.347723 - 0.086697, -0.905849, 0.225854, 0.347723 - 0.086697, -0.905849, 0.225854, 0.347723 - 0.086697, -0.905849, 0.225854, 0.347723 - 0.086697, -0.905849, 0.225854, 0.347723 - 0.086697, -0.905849, 0.225854, 0.347723 - 0.086697, -0.905849, 0.225854, 0.347723 - 0.086697, -0.905849, 0.225854, 0.347723 - 0.086697, -0.905849, 0.225854, 0.347723 - 0.086697, -0.905849, 0.225854, 0.347723 - 0.086697, -0.905849, 0.225854, 0.347723 - 0.086697, -0.905849, 0.225854, 0.347723 - 0.086697, -0.905849, 0.225854, 0.347723 - 0.075090, -0.918482, 0.212048, 0.325251 - 0.075090, -0.918482, 0.212048, 0.325251 - 0.075090, -0.918482, 0.212048, 0.325251 - 0.075090, -0.918482, 0.212048, 0.325251 - 0.075090, -0.918482, 0.212048, 0.325251 - 0.075090, -0.918482, 0.212048, 0.325251 - 0.075090, -0.918482, 0.212048, 0.325251 - 0.075090, -0.918482, 0.212048, 0.325251 - 0.075090, -0.918482, 0.212048, 0.325251 - 0.075090, -0.918482, 0.212048, 0.325251 - 0.075090, -0.918482, 0.212048, 0.325251 - 0.075090, -0.918482, 0.212048, 0.325251 - 0.075090, -0.918482, 0.212048, 0.325251 - 0.075090, -0.918482, 0.212048, 0.325251 - 0.075090, -0.918482, 0.212048, 0.325251 - 0.075090, -0.918482, 0.212048, 0.325251 - 0.075090, -0.918482, 0.212048, 0.325251 - 0.075090, -0.918482, 0.212048, 0.325251 - 0.075090, -0.918482, 0.212048, 0.325251 - 0.075090, -0.918482, 0.212048, 0.325251 - 0.075090, -0.918482, 0.212048, 0.325251 - 0.075090, -0.918482, 0.212048, 0.325251 - 0.075090, -0.918482, 0.212048, 0.325251 - 0.075090, -0.918482, 0.212048, 0.325251 - 0.075090, -0.918482, 0.212048, 0.325251 - 0.064248, -0.930274, 0.197736, 0.302264 - 0.064248, -0.930274, 0.197736, 0.302264 - 0.064248, -0.930274, 0.197736, 0.302264 - 0.064248, -0.930274, 0.197736, 0.302264 - 0.064248, -0.930274, 0.197736, 0.302264 - 0.064248, -0.930274, 0.197736, 0.302264 - 0.064248, -0.930274, 0.197736, 0.302264 - 0.064248, -0.930274, 0.197736, 0.302264 - 0.064248, -0.930274, 0.197736, 0.302264 - 0.064248, -0.930274, 0.197736, 0.302264 - 0.064248, -0.930274, 0.197736, 0.302264 - 0.064248, -0.930274, 0.197736, 0.302264 - 0.064248, -0.930274, 0.197736, 0.302264 - 0.064248, -0.930274, 0.197736, 0.302264 - 0.064248, -0.930274, 0.197736, 0.302264 - 0.064248, -0.930274, 0.197736, 0.302264 - 0.064248, -0.930274, 0.197736, 0.302264 - 0.064248, -0.930274, 0.197736, 0.302264 - 0.064248, -0.930274, 0.197736, 0.302264 - 0.064248, -0.930274, 0.197736, 0.302264 - 0.064248, -0.930274, 0.197736, 0.302264 - 0.064248, -0.930274, 0.197736, 0.302264 - 0.064248, -0.930274, 0.197736, 0.302264 - 0.064248, -0.930274, 0.197736, 0.302264 - 0.064248, -0.930274, 0.197736, 0.302264 - 0.054193, -0.941204, 0.182951, 0.278797 - 0.054193, -0.941204, 0.182951, 0.278797 - 0.054193, -0.941204, 0.182951, 0.278797 - 0.054193, -0.941204, 0.182951, 0.278797 - 0.054193, -0.941204, 0.182951, 0.278797 - 0.054193, -0.941204, 0.182951, 0.278797 - 0.054193, -0.941204, 0.182951, 0.278797 - 0.054193, -0.941204, 0.182951, 0.278797 - 0.054193, -0.941204, 0.182951, 0.278797 - 0.054193, -0.941204, 0.182951, 0.278797 - 0.054193, -0.941204, 0.182951, 0.278797 - 0.054193, -0.941204, 0.182951, 0.278797 - 0.054193, -0.941204, 0.182951, 0.278797 - 0.054193, -0.941204, 0.182951, 0.278797 - 0.054193, -0.941204, 0.182951, 0.278797 - 0.054193, -0.941204, 0.182951, 0.278797 - 0.054193, -0.941204, 0.182951, 0.278797 - 0.054193, -0.941204, 0.182951, 0.278797 - 0.054193, -0.941204, 0.182951, 0.278797 - 0.054193, -0.941204, 0.182951, 0.278797 - 0.054193, -0.941204, 0.182951, 0.278797 - 0.054193, -0.941204, 0.182951, 0.278797 - 0.054193, -0.941204, 0.182951, 0.278797 - 0.054193, -0.941204, 0.182951, 0.278797 - 0.054193, -0.941204, 0.182951, 0.278797 - 0.044943, -0.951251, 0.167731, 0.254887 - 0.044943, -0.951251, 0.167731, 0.254887 - 0.044943, -0.951251, 0.167731, 0.254887 - 0.044943, -0.951251, 0.167731, 0.254887 - 0.044943, -0.951251, 0.167731, 0.254887 - 0.044943, -0.951251, 0.167731, 0.254887 - 0.044943, -0.951251, 0.167731, 0.254887 - 0.044943, -0.951251, 0.167731, 0.254887 - 0.044943, -0.951251, 0.167731, 0.254887 - 0.044943, -0.951251, 0.167731, 0.254887 - 0.044943, -0.951251, 0.167731, 0.254887 - 0.044943, -0.951251, 0.167731, 0.254887 - 0.044943, -0.951251, 0.167731, 0.254887 - 0.044943, -0.951251, 0.167731, 0.254887 - 0.044943, -0.951251, 0.167731, 0.254887 - 0.044943, -0.951251, 0.167731, 0.254887 - 0.044943, -0.951251, 0.167731, 0.254887 - 0.044943, -0.951251, 0.167731, 0.254887 - 0.044943, -0.951251, 0.167731, 0.254887 - 0.044943, -0.951251, 0.167731, 0.254887 - 0.044943, -0.951251, 0.167731, 0.254887 - 0.044943, -0.951251, 0.167731, 0.254887 - 0.044943, -0.951251, 0.167731, 0.254887 - 0.044943, -0.951251, 0.167731, 0.254887 - 0.044943, -0.951251, 0.167731, 0.254887 - 0.036519, -0.960398, 0.152112, 0.230571 - 0.036519, -0.960398, 0.152112, 0.230571 - 0.036519, -0.960398, 0.152112, 0.230571 - 0.036519, -0.960398, 0.152112, 0.230571 - 0.036519, -0.960398, 0.152112, 0.230571 - 0.036519, -0.960398, 0.152112, 0.230571 - 0.036519, -0.960398, 0.152112, 0.230571 - 0.036519, -0.960398, 0.152112, 0.230571 - 0.036519, -0.960398, 0.152112, 0.230571 - 0.036519, -0.960398, 0.152112, 0.230571 - 0.036519, -0.960398, 0.152112, 0.230571 - 0.036519, -0.960398, 0.152112, 0.230571 - 0.036519, -0.960398, 0.152112, 0.230571 - 0.036519, -0.960398, 0.152112, 0.230571 - 0.036519, -0.960398, 0.152112, 0.230571 - 0.036519, -0.960398, 0.152112, 0.230571 - 0.036519, -0.960398, 0.152112, 0.230571 - 0.036519, -0.960398, 0.152112, 0.230571 - 0.036519, -0.960398, 0.152112, 0.230571 - 0.036519, -0.960398, 0.152112, 0.230571 - 0.036519, -0.960398, 0.152112, 0.230571 - 0.036519, -0.960398, 0.152112, 0.230571 - 0.036519, -0.960398, 0.152112, 0.230571 - 0.036519, -0.960398, 0.152112, 0.230571 - 0.036519, -0.960398, 0.152112, 0.230571 - 0.028936, -0.968628, 0.136132, 0.205888 - 0.028936, -0.968628, 0.136132, 0.205888 - 0.028936, -0.968628, 0.136132, 0.205888 - 0.028936, -0.968628, 0.136132, 0.205888 - 0.028936, -0.968628, 0.136132, 0.205888 - 0.028936, -0.968628, 0.136132, 0.205888 - 0.028936, -0.968628, 0.136132, 0.205888 - 0.028936, -0.968628, 0.136132, 0.205888 - 0.028936, -0.968628, 0.136132, 0.205888 - 0.028936, -0.968628, 0.136132, 0.205888 - 0.028936, -0.968628, 0.136132, 0.205888 - 0.028936, -0.968628, 0.136132, 0.205888 - 0.028936, -0.968628, 0.136132, 0.205888 - 0.028936, -0.968628, 0.136132, 0.205888 - 0.028936, -0.968628, 0.136132, 0.205888 - 0.028936, -0.968628, 0.136132, 0.205888 - 0.028936, -0.968628, 0.136132, 0.205888 - 0.028936, -0.968628, 0.136132, 0.205888 - 0.028936, -0.968628, 0.136132, 0.205888 - 0.028936, -0.968628, 0.136132, 0.205888 - 0.028936, -0.968628, 0.136132, 0.205888 - 0.028936, -0.968628, 0.136132, 0.205888 - 0.028936, -0.968628, 0.136132, 0.205888 - 0.028936, -0.968628, 0.136132, 0.205888 - 0.028936, -0.968628, 0.136132, 0.205888 - 0.022209, -0.975926, 0.119829, 0.180877 - 0.022209, -0.975926, 0.119829, 0.180877 - 0.022209, -0.975926, 0.119829, 0.180877 - 0.022209, -0.975926, 0.119829, 0.180877 - 0.022209, -0.975926, 0.119829, 0.180877 - 0.022209, -0.975926, 0.119829, 0.180877 - 0.022209, -0.975926, 0.119829, 0.180877 - 0.022209, -0.975926, 0.119829, 0.180877 - 0.022209, -0.975926, 0.119829, 0.180877 - 0.022209, -0.975926, 0.119829, 0.180877 - 0.022209, -0.975926, 0.119829, 0.180877 - 0.022209, -0.975926, 0.119829, 0.180877 - 0.022209, -0.975926, 0.119829, 0.180877 - 0.022209, -0.975926, 0.119829, 0.180877 - 0.022209, -0.975926, 0.119829, 0.180877 - 0.022209, -0.975926, 0.119829, 0.180877 - 0.022209, -0.975926, 0.119829, 0.180877 - 0.022209, -0.975926, 0.119829, 0.180877 - 0.022209, -0.975926, 0.119829, 0.180877 - 0.022209, -0.975926, 0.119829, 0.180877 - 0.022209, -0.975926, 0.119829, 0.180877 - 0.022209, -0.975926, 0.119829, 0.180877 - 0.022209, -0.975926, 0.119829, 0.180877 - 0.022209, -0.975926, 0.119829, 0.180877 - 0.022209, -0.975926, 0.119829, 0.180877 - 0.016352, -0.982278, 0.103242, 0.155578 - 0.016352, -0.982278, 0.103242, 0.155578 - 0.016352, -0.982278, 0.103242, 0.155578 - 0.016352, -0.982278, 0.103242, 0.155578 - 0.016352, -0.982278, 0.103242, 0.155578 - 0.016352, -0.982278, 0.103242, 0.155578 - 0.016352, -0.982278, 0.103242, 0.155578 - 0.016352, -0.982278, 0.103242, 0.155578 - 0.016352, -0.982278, 0.103242, 0.155578 - 0.016352, -0.982278, 0.103242, 0.155578 - 0.016352, -0.982278, 0.103242, 0.155578 - 0.016352, -0.982278, 0.103242, 0.155578 - 0.016352, -0.982278, 0.103242, 0.155578 - 0.016352, -0.982278, 0.103242, 0.155578 - 0.016352, -0.982278, 0.103242, 0.155578 - 0.016352, -0.982278, 0.103242, 0.155578 - 0.016352, -0.982278, 0.103242, 0.155578 - 0.016352, -0.982278, 0.103242, 0.155578 - 0.016352, -0.982278, 0.103242, 0.155578 - 0.016352, -0.982278, 0.103242, 0.155578 - 0.016352, -0.982278, 0.103242, 0.155578 - 0.016352, -0.982278, 0.103242, 0.155578 - 0.016352, -0.982278, 0.103242, 0.155578 - 0.016352, -0.982278, 0.103242, 0.155578 - 0.016352, -0.982278, 0.103242, 0.155578 - 0.011376, -0.987672, 0.086410, 0.130030 - 0.011376, -0.987672, 0.086410, 0.130030 - 0.011376, -0.987672, 0.086410, 0.130030 - 0.011376, -0.987672, 0.086410, 0.130030 - 0.011376, -0.987672, 0.086410, 0.130030 - 0.011376, -0.987672, 0.086410, 0.130030 - 0.011376, -0.987672, 0.086410, 0.130030 - 0.011376, -0.987672, 0.086410, 0.130030 - 0.011376, -0.987672, 0.086410, 0.130030 - 0.011376, -0.987672, 0.086410, 0.130030 - 0.011376, -0.987672, 0.086410, 0.130030 - 0.011376, -0.987672, 0.086410, 0.130030 - 0.011376, -0.987672, 0.086410, 0.130030 - 0.011376, -0.987672, 0.086410, 0.130030 - 0.011376, -0.987672, 0.086410, 0.130030 - 0.011376, -0.987672, 0.086410, 0.130030 - 0.011376, -0.987672, 0.086410, 0.130030 - 0.011376, -0.987672, 0.086410, 0.130030 - 0.011376, -0.987672, 0.086410, 0.130030 - 0.011376, -0.987672, 0.086410, 0.130030 - 0.011376, -0.987672, 0.086410, 0.130030 - 0.011376, -0.987672, 0.086410, 0.130030 - 0.011376, -0.987672, 0.086410, 0.130030 - 0.011376, -0.987672, 0.086410, 0.130030 - 0.011376, -0.987672, 0.086410, 0.130030 - 0.007292, -0.992099, 0.069374, 0.104274 - 0.007292, -0.992099, 0.069374, 0.104274 - 0.007292, -0.992099, 0.069374, 0.104274 - 0.007292, -0.992099, 0.069374, 0.104274 - 0.007292, -0.992099, 0.069374, 0.104274 - 0.007292, -0.992099, 0.069374, 0.104274 - 0.007292, -0.992099, 0.069374, 0.104274 - 0.007292, -0.992099, 0.069374, 0.104274 - 0.007292, -0.992099, 0.069374, 0.104274 - 0.007292, -0.992099, 0.069374, 0.104274 - 0.007292, -0.992099, 0.069374, 0.104274 - 0.007292, -0.992099, 0.069374, 0.104274 - 0.007292, -0.992099, 0.069374, 0.104274 - 0.007292, -0.992099, 0.069374, 0.104274 - 0.007292, -0.992099, 0.069374, 0.104274 - 0.007292, -0.992099, 0.069374, 0.104274 - 0.007292, -0.992099, 0.069374, 0.104274 - 0.007292, -0.992099, 0.069374, 0.104274 - 0.007292, -0.992099, 0.069374, 0.104274 - 0.007292, -0.992099, 0.069374, 0.104274 - 0.007292, -0.992099, 0.069374, 0.104274 - 0.007292, -0.992099, 0.069374, 0.104274 - 0.007292, -0.992099, 0.069374, 0.104274 - 0.007292, -0.992099, 0.069374, 0.104274 - 0.007292, -0.992099, 0.069374, 0.104274 - 0.004106, -0.995551, 0.052175, 0.078352 - 0.004106, -0.995551, 0.052175, 0.078352 - 0.004106, -0.995551, 0.052175, 0.078352 - 0.004106, -0.995551, 0.052175, 0.078352 - 0.004106, -0.995551, 0.052175, 0.078352 - 0.004106, -0.995551, 0.052175, 0.078352 - 0.004106, -0.995551, 0.052175, 0.078352 - 0.004106, -0.995551, 0.052175, 0.078352 - 0.004106, -0.995551, 0.052175, 0.078352 - 0.004106, -0.995551, 0.052175, 0.078352 - 0.004106, -0.995551, 0.052175, 0.078352 - 0.004106, -0.995551, 0.052175, 0.078352 - 0.004106, -0.995551, 0.052175, 0.078352 - 0.004106, -0.995551, 0.052175, 0.078352 - 0.004106, -0.995551, 0.052175, 0.078352 - 0.004106, -0.995551, 0.052175, 0.078352 - 0.004106, -0.995551, 0.052175, 0.078352 - 0.004106, -0.995551, 0.052175, 0.078352 - 0.004106, -0.995551, 0.052175, 0.078352 - 0.004106, -0.995551, 0.052175, 0.078352 - 0.004106, -0.995551, 0.052175, 0.078352 - 0.004106, -0.995551, 0.052175, 0.078352 - 0.004106, -0.995551, 0.052175, 0.078352 - 0.004106, -0.995551, 0.052175, 0.078352 - 0.004106, -0.995551, 0.052175, 0.078352 - 0.001826, -0.998021, 0.034852, 0.052304 - 0.001826, -0.998021, 0.034852, 0.052304 - 0.001826, -0.998021, 0.034852, 0.052304 - 0.001826, -0.998021, 0.034852, 0.052304 - 0.001826, -0.998021, 0.034852, 0.052304 - 0.001826, -0.998021, 0.034852, 0.052304 - 0.001826, -0.998021, 0.034852, 0.052304 - 0.001826, -0.998021, 0.034852, 0.052304 - 0.001826, -0.998021, 0.034852, 0.052304 - 0.001826, -0.998021, 0.034852, 0.052304 - 0.001826, -0.998021, 0.034852, 0.052304 - 0.001826, -0.998021, 0.034852, 0.052304 - 0.001826, -0.998021, 0.034852, 0.052304 - 0.001826, -0.998021, 0.034852, 0.052304 - 0.001826, -0.998021, 0.034852, 0.052304 - 0.001826, -0.998021, 0.034852, 0.052304 - 0.001826, -0.998021, 0.034852, 0.052304 - 0.001826, -0.998021, 0.034852, 0.052304 - 0.001826, -0.998021, 0.034852, 0.052304 - 0.001826, -0.998021, 0.034852, 0.052304 - 0.001826, -0.998021, 0.034852, 0.052304 - 0.001826, -0.998021, 0.034852, 0.052304 - 0.001826, -0.998021, 0.034852, 0.052304 - 0.001826, -0.998021, 0.034852, 0.052304 - 0.001826, -0.998021, 0.034852, 0.052304 - 0.000457, -0.999505, 0.017446, 0.026173 - 0.000457, -0.999505, 0.017446, 0.026173 - 0.000457, -0.999505, 0.017446, 0.026173 - 0.000457, -0.999505, 0.017446, 0.026173 - 0.000457, -0.999505, 0.017446, 0.026173 - 0.000457, -0.999505, 0.017446, 0.026173 - 0.000457, -0.999505, 0.017446, 0.026173 - 0.000457, -0.999505, 0.017446, 0.026173 - 0.000457, -0.999505, 0.017446, 0.026173 - 0.000457, -0.999505, 0.017446, 0.026173 - 0.000457, -0.999505, 0.017446, 0.026173 - 0.000457, -0.999505, 0.017446, 0.026173 - 0.000457, -0.999505, 0.017446, 0.026173 - 0.000457, -0.999505, 0.017446, 0.026173 - 0.000457, -0.999505, 0.017446, 0.026173 - 0.000457, -0.999505, 0.017446, 0.026173 - 0.000457, -0.999505, 0.017446, 0.026173 - 0.000457, -0.999505, 0.017446, 0.026173 - 0.000457, -0.999505, 0.017446, 0.026173 - 0.000457, -0.999505, 0.017446, 0.026173 - 0.000457, -0.999505, 0.017446, 0.026173 - 0.000457, -0.999505, 0.017446, 0.026173 - 0.000457, -0.999505, 0.017446, 0.026173 - 0.000457, -0.999505, 0.017446, 0.026173 - 0.000457, -0.999505, 0.017446, 0.026173 - 0.000000, -1.000000, 0.000000, 0.000000 - 0.000000, -1.000000, 0.000000, 0.000000 - 0.000000, -1.000000, 0.000000, 0.000000 - 0.000000, -1.000000, 0.000000, 0.000000 - 0.000000, -1.000000, 0.000000, 0.000000 - 0.000000, -1.000000, 0.000000, 0.000000 - 0.000000, -1.000000, 0.000000, 0.000000 - 0.000000, -1.000000, 0.000000, 0.000000 - 0.000000, -1.000000, 0.000000, 0.000000 - 0.000000, -1.000000, 0.000000, 0.000000 - 0.000000, -1.000000, 0.000000, 0.000000 - 0.000000, -1.000000, 0.000000, 0.000000 - 0.000000, -1.000000, 0.000000, 0.000000 - 0.000000, -1.000000, 0.000000, 0.000000 - 0.000000, -1.000000, 0.000000, 0.000000 - 0.000000, -1.000000, 0.000000, 0.000000 - 0.000000, -1.000000, 0.000000, 0.000000 - 0.000000, -1.000000, 0.000000, 0.000000 - 0.000000, -1.000000, 0.000000, 0.000000 - 0.000000, -1.000000, 0.000000, 0.000000 - 0.000000, -1.000000, 0.000000, 0.000000 - 0.000000, -1.000000, 0.000000, 0.000000 - 0.000000, -1.000000, 0.000000, 0.000000 - 0.000000, -1.000000, 0.000000, 0.000000 - 0.000000, -1.000000, 0.000000, 0.000000 - 0.000457, -0.999505, -0.017446, -0.026173 - 0.000457, -0.999505, -0.017446, -0.026173 - 0.000457, -0.999505, -0.017446, -0.026173 - 0.000457, -0.999505, -0.017446, -0.026173 - 0.000457, -0.999505, -0.017446, -0.026173 - 0.000457, -0.999505, -0.017446, -0.026173 - 0.000457, -0.999505, -0.017446, -0.026173 - 0.000457, -0.999505, -0.017446, -0.026173 - 0.000457, -0.999505, -0.017446, -0.026173 - 0.000457, -0.999505, -0.017446, -0.026173 - 0.000457, -0.999505, -0.017446, -0.026173 - 0.000457, -0.999505, -0.017446, -0.026173 - 0.000457, -0.999505, -0.017446, -0.026173 - 0.000457, -0.999505, -0.017446, -0.026173 - 0.000457, -0.999505, -0.017446, -0.026173 - 0.000457, -0.999505, -0.017446, -0.026173 - 0.000457, -0.999505, -0.017446, -0.026173 - 0.000457, -0.999505, -0.017446, -0.026173 - 0.000457, -0.999505, -0.017446, -0.026173 - 0.000457, -0.999505, -0.017446, -0.026173 - 0.000457, -0.999505, -0.017446, -0.026173 - 0.000457, -0.999505, -0.017446, -0.026173 - 0.000457, -0.999505, -0.017446, -0.026173 - 0.000457, -0.999505, -0.017446, -0.026173 - 0.000457, -0.999505, -0.017446, -0.026173 - 0.001826, -0.998021, -0.034852, -0.052304 - 0.001826, -0.998021, -0.034852, -0.052304 - 0.001826, -0.998021, -0.034852, -0.052304 - 0.001826, -0.998021, -0.034852, -0.052304 - 0.001826, -0.998021, -0.034852, -0.052304 - 0.001826, -0.998021, -0.034852, -0.052304 - 0.001826, -0.998021, -0.034852, -0.052304 - 0.001826, -0.998021, -0.034852, -0.052304 - 0.001826, -0.998021, -0.034852, -0.052304 - 0.001826, -0.998021, -0.034852, -0.052304 - 0.001826, -0.998021, -0.034852, -0.052304 - 0.001826, -0.998021, -0.034852, -0.052304 - 0.001826, -0.998021, -0.034852, -0.052304 - 0.001826, -0.998021, -0.034852, -0.052304 - 0.001826, -0.998021, -0.034852, -0.052304 - 0.001826, -0.998021, -0.034852, -0.052304 - 0.001826, -0.998021, -0.034852, -0.052304 - 0.001826, -0.998021, -0.034852, -0.052304 - 0.001826, -0.998021, -0.034852, -0.052304 - 0.001826, -0.998021, -0.034852, -0.052304 - 0.001826, -0.998021, -0.034852, -0.052304 - 0.001826, -0.998021, -0.034852, -0.052304 - 0.001826, -0.998021, -0.034852, -0.052304 - 0.001826, -0.998021, -0.034852, -0.052304 - 0.001826, -0.998021, -0.034852, -0.052304 - 0.004106, -0.995551, -0.052175, -0.078352 - 0.004106, -0.995551, -0.052175, -0.078352 - 0.004106, -0.995551, -0.052175, -0.078352 - 0.004106, -0.995551, -0.052175, -0.078352 - 0.004106, -0.995551, -0.052175, -0.078352 - 0.004106, -0.995551, -0.052175, -0.078352 - 0.004106, -0.995551, -0.052175, -0.078352 - 0.004106, -0.995551, -0.052175, -0.078352 - 0.004106, -0.995551, -0.052175, -0.078352 - 0.004106, -0.995551, -0.052175, -0.078352 - 0.004106, -0.995551, -0.052175, -0.078352 - 0.004106, -0.995551, -0.052175, -0.078352 - 0.004106, -0.995551, -0.052175, -0.078352 - 0.004106, -0.995551, -0.052175, -0.078352 - 0.004106, -0.995551, -0.052175, -0.078352 - 0.004106, -0.995551, -0.052175, -0.078352 - 0.004106, -0.995551, -0.052175, -0.078352 - 0.004106, -0.995551, -0.052175, -0.078352 - 0.004106, -0.995551, -0.052175, -0.078352 - 0.004106, -0.995551, -0.052175, -0.078352 - 0.004106, -0.995551, -0.052175, -0.078352 - 0.004106, -0.995551, -0.052175, -0.078352 - 0.004106, -0.995551, -0.052175, -0.078352 - 0.004106, -0.995551, -0.052175, -0.078352 - 0.004106, -0.995551, -0.052175, -0.078352 - 0.007292, -0.992099, -0.069374, -0.104274 - 0.007292, -0.992099, -0.069374, -0.104274 - 0.007292, -0.992099, -0.069374, -0.104274 - 0.007292, -0.992099, -0.069374, -0.104274 - 0.007292, -0.992099, -0.069374, -0.104274 - 0.007292, -0.992099, -0.069374, -0.104274 - 0.007292, -0.992099, -0.069374, -0.104274 - 0.007292, -0.992099, -0.069374, -0.104274 - 0.007292, -0.992099, -0.069374, -0.104274 - 0.007292, -0.992099, -0.069374, -0.104274 - 0.007292, -0.992099, -0.069374, -0.104274 - 0.007292, -0.992099, -0.069374, -0.104274 - 0.007292, -0.992099, -0.069374, -0.104274 - 0.007292, -0.992099, -0.069374, -0.104274 - 0.007292, -0.992099, -0.069374, -0.104274 - 0.007292, -0.992099, -0.069374, -0.104274 - 0.007292, -0.992099, -0.069374, -0.104274 - 0.007292, -0.992099, -0.069374, -0.104274 - 0.007292, -0.992099, -0.069374, -0.104274 - 0.007292, -0.992099, -0.069374, -0.104274 - 0.007292, -0.992099, -0.069374, -0.104274 - 0.007292, -0.992099, -0.069374, -0.104274 - 0.007292, -0.992099, -0.069374, -0.104274 - 0.007292, -0.992099, -0.069374, -0.104274 - 0.007292, -0.992099, -0.069374, -0.104274 - 0.011376, -0.987672, -0.086410, -0.130030 - 0.011376, -0.987672, -0.086410, -0.130030 - 0.011376, -0.987672, -0.086410, -0.130030 - 0.011376, -0.987672, -0.086410, -0.130030 - 0.011376, -0.987672, -0.086410, -0.130030 - 0.011376, -0.987672, -0.086410, -0.130030 - 0.011376, -0.987672, -0.086410, -0.130030 - 0.011376, -0.987672, -0.086410, -0.130030 - 0.011376, -0.987672, -0.086410, -0.130030 - 0.011376, -0.987672, -0.086410, -0.130030 - 0.011376, -0.987672, -0.086410, -0.130030 - 0.011376, -0.987672, -0.086410, -0.130030 - 0.011376, -0.987672, -0.086410, -0.130030 - 0.011376, -0.987672, -0.086410, -0.130030 - 0.011376, -0.987672, -0.086410, -0.130030 - 0.011376, -0.987672, -0.086410, -0.130030 - 0.011376, -0.987672, -0.086410, -0.130030 - 0.011376, -0.987672, -0.086410, -0.130030 - 0.011376, -0.987672, -0.086410, -0.130030 - 0.011376, -0.987672, -0.086410, -0.130030 - 0.011376, -0.987672, -0.086410, -0.130030 - 0.011376, -0.987672, -0.086410, -0.130030 - 0.011376, -0.987672, -0.086410, -0.130030 - 0.011376, -0.987672, -0.086410, -0.130030 - 0.011376, -0.987672, -0.086410, -0.130030 - 0.016352, -0.982278, -0.103242, -0.155578 - 0.016352, -0.982278, -0.103242, -0.155578 - 0.016352, -0.982278, -0.103242, -0.155578 - 0.016352, -0.982278, -0.103242, -0.155578 - 0.016352, -0.982278, -0.103242, -0.155578 - 0.016352, -0.982278, -0.103242, -0.155578 - 0.016352, -0.982278, -0.103242, -0.155578 - 0.016352, -0.982278, -0.103242, -0.155578 - 0.016352, -0.982278, -0.103242, -0.155578 - 0.016352, -0.982278, -0.103242, -0.155578 - 0.016352, -0.982278, -0.103242, -0.155578 - 0.016352, -0.982278, -0.103242, -0.155578 - 0.016352, -0.982278, -0.103242, -0.155578 - 0.016352, -0.982278, -0.103242, -0.155578 - 0.016352, -0.982278, -0.103242, -0.155578 - 0.016352, -0.982278, -0.103242, -0.155578 - 0.016352, -0.982278, -0.103242, -0.155578 - 0.016352, -0.982278, -0.103242, -0.155578 - 0.016352, -0.982278, -0.103242, -0.155578 - 0.016352, -0.982278, -0.103242, -0.155578 - 0.016352, -0.982278, -0.103242, -0.155578 - 0.016352, -0.982278, -0.103242, -0.155578 - 0.016352, -0.982278, -0.103242, -0.155578 - 0.016352, -0.982278, -0.103242, -0.155578 - 0.016352, -0.982278, -0.103242, -0.155578 - 0.022209, -0.975926, -0.119829, -0.180877 - 0.022209, -0.975926, -0.119829, -0.180877 - 0.022209, -0.975926, -0.119829, -0.180877 - 0.022209, -0.975926, -0.119829, -0.180877 - 0.022209, -0.975926, -0.119829, -0.180877 - 0.022209, -0.975926, -0.119829, -0.180877 - 0.022209, -0.975926, -0.119829, -0.180877 - 0.022209, -0.975926, -0.119829, -0.180877 - 0.022209, -0.975926, -0.119829, -0.180877 - 0.022209, -0.975926, -0.119829, -0.180877 - 0.022209, -0.975926, -0.119829, -0.180877 - 0.022209, -0.975926, -0.119829, -0.180877 - 0.022209, -0.975926, -0.119829, -0.180877 - 0.022209, -0.975926, -0.119829, -0.180877 - 0.022209, -0.975926, -0.119829, -0.180877 - 0.022209, -0.975926, -0.119829, -0.180877 - 0.022209, -0.975926, -0.119829, -0.180877 - 0.022209, -0.975926, -0.119829, -0.180877 - 0.022209, -0.975926, -0.119829, -0.180877 - 0.022209, -0.975926, -0.119829, -0.180877 - 0.022209, -0.975926, -0.119829, -0.180877 - 0.022209, -0.975926, -0.119829, -0.180877 - 0.022209, -0.975926, -0.119829, -0.180877 - 0.022209, -0.975926, -0.119829, -0.180877 - 0.022209, -0.975926, -0.119829, -0.180877 - 0.028936, -0.968628, -0.136132, -0.205888 - 0.028936, -0.968628, -0.136132, -0.205888 - 0.028936, -0.968628, -0.136132, -0.205888 - 0.028936, -0.968628, -0.136132, -0.205888 - 0.028936, -0.968628, -0.136132, -0.205888 - 0.028936, -0.968628, -0.136132, -0.205888 - 0.028936, -0.968628, -0.136132, -0.205888 - 0.028936, -0.968628, -0.136132, -0.205888 - 0.028936, -0.968628, -0.136132, -0.205888 - 0.028936, -0.968628, -0.136132, -0.205888 - 0.028936, -0.968628, -0.136132, -0.205888 - 0.028936, -0.968628, -0.136132, -0.205888 - 0.028936, -0.968628, -0.136132, -0.205888 - 0.028936, -0.968628, -0.136132, -0.205888 - 0.028936, -0.968628, -0.136132, -0.205888 - 0.028936, -0.968628, -0.136132, -0.205888 - 0.028936, -0.968628, -0.136132, -0.205888 - 0.028936, -0.968628, -0.136132, -0.205888 - 0.028936, -0.968628, -0.136132, -0.205888 - 0.028936, -0.968628, -0.136132, -0.205888 - 0.028936, -0.968628, -0.136132, -0.205888 - 0.028936, -0.968628, -0.136132, -0.205888 - 0.028936, -0.968628, -0.136132, -0.205888 - 0.028936, -0.968628, -0.136132, -0.205888 - 0.028936, -0.968628, -0.136132, -0.205888 - 0.036519, -0.960398, -0.152112, -0.230571 - 0.036519, -0.960398, -0.152112, -0.230571 - 0.036519, -0.960398, -0.152112, -0.230571 - 0.036519, -0.960398, -0.152112, -0.230571 - 0.036519, -0.960398, -0.152112, -0.230571 - 0.036519, -0.960398, -0.152112, -0.230571 - 0.036519, -0.960398, -0.152112, -0.230571 - 0.036519, -0.960398, -0.152112, -0.230571 - 0.036519, -0.960398, -0.152112, -0.230571 - 0.036519, -0.960398, -0.152112, -0.230571 - 0.036519, -0.960398, -0.152112, -0.230571 - 0.036519, -0.960398, -0.152112, -0.230571 - 0.036519, -0.960398, -0.152112, -0.230571 - 0.036519, -0.960398, -0.152112, -0.230571 - 0.036519, -0.960398, -0.152112, -0.230571 - 0.036519, -0.960398, -0.152112, -0.230571 - 0.036519, -0.960398, -0.152112, -0.230571 - 0.036519, -0.960398, -0.152112, -0.230571 - 0.036519, -0.960398, -0.152112, -0.230571 - 0.036519, -0.960398, -0.152112, -0.230571 - 0.036519, -0.960398, -0.152112, -0.230571 - 0.036519, -0.960398, -0.152112, -0.230571 - 0.036519, -0.960398, -0.152112, -0.230571 - 0.036519, -0.960398, -0.152112, -0.230571 - 0.036519, -0.960398, -0.152112, -0.230571 - 0.044943, -0.951251, -0.167731, -0.254887 - 0.044943, -0.951251, -0.167731, -0.254887 - 0.044943, -0.951251, -0.167731, -0.254887 - 0.044943, -0.951251, -0.167731, -0.254887 - 0.044943, -0.951251, -0.167731, -0.254887 - 0.044943, -0.951251, -0.167731, -0.254887 - 0.044943, -0.951251, -0.167731, -0.254887 - 0.044943, -0.951251, -0.167731, -0.254887 - 0.044943, -0.951251, -0.167731, -0.254887 - 0.044943, -0.951251, -0.167731, -0.254887 - 0.044943, -0.951251, -0.167731, -0.254887 - 0.044943, -0.951251, -0.167731, -0.254887 - 0.044943, -0.951251, -0.167731, -0.254887 - 0.044943, -0.951251, -0.167731, -0.254887 - 0.044943, -0.951251, -0.167731, -0.254887 - 0.044943, -0.951251, -0.167731, -0.254887 - 0.044943, -0.951251, -0.167731, -0.254887 - 0.044943, -0.951251, -0.167731, -0.254887 - 0.044943, -0.951251, -0.167731, -0.254887 - 0.044943, -0.951251, -0.167731, -0.254887 - 0.044943, -0.951251, -0.167731, -0.254887 - 0.044943, -0.951251, -0.167731, -0.254887 - 0.044943, -0.951251, -0.167731, -0.254887 - 0.044943, -0.951251, -0.167731, -0.254887 - 0.044943, -0.951251, -0.167731, -0.254887 - 0.054193, -0.941204, -0.182951, -0.278797 - 0.054193, -0.941204, -0.182951, -0.278797 - 0.054193, -0.941204, -0.182951, -0.278797 - 0.054193, -0.941204, -0.182951, -0.278797 - 0.054193, -0.941204, -0.182951, -0.278797 - 0.054193, -0.941204, -0.182951, -0.278797 - 0.054193, -0.941204, -0.182951, -0.278797 - 0.054193, -0.941204, -0.182951, -0.278797 - 0.054193, -0.941204, -0.182951, -0.278797 - 0.054193, -0.941204, -0.182951, -0.278797 - 0.054193, -0.941204, -0.182951, -0.278797 - 0.054193, -0.941204, -0.182951, -0.278797 - 0.054193, -0.941204, -0.182951, -0.278797 - 0.054193, -0.941204, -0.182951, -0.278797 - 0.054193, -0.941204, -0.182951, -0.278797 - 0.054193, -0.941204, -0.182951, -0.278797 - 0.054193, -0.941204, -0.182951, -0.278797 - 0.054193, -0.941204, -0.182951, -0.278797 - 0.054193, -0.941204, -0.182951, -0.278797 - 0.054193, -0.941204, -0.182951, -0.278797 - 0.054193, -0.941204, -0.182951, -0.278797 - 0.054193, -0.941204, -0.182951, -0.278797 - 0.054193, -0.941204, -0.182951, -0.278797 - 0.054193, -0.941204, -0.182951, -0.278797 - 0.054193, -0.941204, -0.182951, -0.278797 - 0.064248, -0.930274, -0.197736, -0.302264 - 0.064248, -0.930274, -0.197736, -0.302264 - 0.064248, -0.930274, -0.197736, -0.302264 - 0.064248, -0.930274, -0.197736, -0.302264 - 0.064248, -0.930274, -0.197736, -0.302264 - 0.064248, -0.930274, -0.197736, -0.302264 - 0.064248, -0.930274, -0.197736, -0.302264 - 0.064248, -0.930274, -0.197736, -0.302264 - 0.064248, -0.930274, -0.197736, -0.302264 - 0.064248, -0.930274, -0.197736, -0.302264 - 0.064248, -0.930274, -0.197736, -0.302264 - 0.064248, -0.930274, -0.197736, -0.302264 - 0.064248, -0.930274, -0.197736, -0.302264 - 0.064248, -0.930274, -0.197736, -0.302264 - 0.064248, -0.930274, -0.197736, -0.302264 - 0.064248, -0.930274, -0.197736, -0.302264 - 0.064248, -0.930274, -0.197736, -0.302264 - 0.064248, -0.930274, -0.197736, -0.302264 - 0.064248, -0.930274, -0.197736, -0.302264 - 0.064248, -0.930274, -0.197736, -0.302264 - 0.064248, -0.930274, -0.197736, -0.302264 - 0.064248, -0.930274, -0.197736, -0.302264 - 0.064248, -0.930274, -0.197736, -0.302264 - 0.064248, -0.930274, -0.197736, -0.302264 - 0.064248, -0.930274, -0.197736, -0.302264 - 0.075090, -0.918482, -0.212048, -0.325251 - 0.075090, -0.918482, -0.212048, -0.325251 - 0.075090, -0.918482, -0.212048, -0.325251 - 0.075090, -0.918482, -0.212048, -0.325251 - 0.075090, -0.918482, -0.212048, -0.325251 - 0.075090, -0.918482, -0.212048, -0.325251 - 0.075090, -0.918482, -0.212048, -0.325251 - 0.075090, -0.918482, -0.212048, -0.325251 - 0.075090, -0.918482, -0.212048, -0.325251 - 0.075090, -0.918482, -0.212048, -0.325251 - 0.075090, -0.918482, -0.212048, -0.325251 - 0.075090, -0.918482, -0.212048, -0.325251 - 0.075090, -0.918482, -0.212048, -0.325251 - 0.075090, -0.918482, -0.212048, -0.325251 - 0.075090, -0.918482, -0.212048, -0.325251 - 0.075090, -0.918482, -0.212048, -0.325251 - 0.075090, -0.918482, -0.212048, -0.325251 - 0.075090, -0.918482, -0.212048, -0.325251 - 0.075090, -0.918482, -0.212048, -0.325251 - 0.075090, -0.918482, -0.212048, -0.325251 - 0.075090, -0.918482, -0.212048, -0.325251 - 0.075090, -0.918482, -0.212048, -0.325251 - 0.075090, -0.918482, -0.212048, -0.325251 - 0.075090, -0.918482, -0.212048, -0.325251 - 0.075090, -0.918482, -0.212048, -0.325251 - 0.086697, -0.905849, -0.225854, -0.347723 - 0.086697, -0.905849, -0.225854, -0.347723 - 0.086697, -0.905849, -0.225854, -0.347723 - 0.086697, -0.905849, -0.225854, -0.347723 - 0.086697, -0.905849, -0.225854, -0.347723 - 0.086697, -0.905849, -0.225854, -0.347723 - 0.086697, -0.905849, -0.225854, -0.347723 - 0.086697, -0.905849, -0.225854, -0.347723 - 0.086697, -0.905849, -0.225854, -0.347723 - 0.086697, -0.905849, -0.225854, -0.347723 - 0.086697, -0.905849, -0.225854, -0.347723 - 0.086697, -0.905849, -0.225854, -0.347723 - 0.086697, -0.905849, -0.225854, -0.347723 - 0.086697, -0.905849, -0.225854, -0.347723 - 0.086697, -0.905849, -0.225854, -0.347723 - 0.086697, -0.905849, -0.225854, -0.347723 - 0.086697, -0.905849, -0.225854, -0.347723 - 0.086697, -0.905849, -0.225854, -0.347723 - 0.086697, -0.905849, -0.225854, -0.347723 - 0.086697, -0.905849, -0.225854, -0.347723 - 0.086697, -0.905849, -0.225854, -0.347723 - 0.086697, -0.905849, -0.225854, -0.347723 - 0.086697, -0.905849, -0.225854, -0.347723 - 0.086697, -0.905849, -0.225854, -0.347723 - 0.086697, -0.905849, -0.225854, -0.347723 - 0.099046, -0.892399, -0.239118, -0.369644 - 0.099046, -0.892399, -0.239118, -0.369644 - 0.099046, -0.892399, -0.239118, -0.369644 - 0.099046, -0.892399, -0.239118, -0.369644 - 0.099046, -0.892399, -0.239118, -0.369644 - 0.099046, -0.892399, -0.239118, -0.369644 - 0.099046, -0.892399, -0.239118, -0.369644 - 0.099046, -0.892399, -0.239118, -0.369644 - 0.099046, -0.892399, -0.239118, -0.369644 - 0.099046, -0.892399, -0.239118, -0.369644 - 0.099046, -0.892399, -0.239118, -0.369644 - 0.099046, -0.892399, -0.239118, -0.369644 - 0.099046, -0.892399, -0.239118, -0.369644 - 0.099046, -0.892399, -0.239118, -0.369644 - 0.099046, -0.892399, -0.239118, -0.369644 - 0.099046, -0.892399, -0.239118, -0.369644 - 0.099046, -0.892399, -0.239118, -0.369644 - 0.099046, -0.892399, -0.239118, -0.369644 - 0.099046, -0.892399, -0.239118, -0.369644 - 0.099046, -0.892399, -0.239118, -0.369644 - 0.099046, -0.892399, -0.239118, -0.369644 - 0.099046, -0.892399, -0.239118, -0.369644 - 0.099046, -0.892399, -0.239118, -0.369644 - 0.099046, -0.892399, -0.239118, -0.369644 - 0.099046, -0.892399, -0.239118, -0.369644 - 0.112112, -0.878156, -0.251807, -0.390980 - 0.112112, -0.878156, -0.251807, -0.390980 - 0.112112, -0.878156, -0.251807, -0.390980 - 0.112112, -0.878156, -0.251807, -0.390980 - 0.112112, -0.878156, -0.251807, -0.390980 - 0.112112, -0.878156, -0.251807, -0.390980 - 0.112112, -0.878156, -0.251807, -0.390980 - 0.112112, -0.878156, -0.251807, -0.390980 - 0.112112, -0.878156, -0.251807, -0.390980 - 0.112112, -0.878156, -0.251807, -0.390980 - 0.112112, -0.878156, -0.251807, -0.390980 - 0.112112, -0.878156, -0.251807, -0.390980 - 0.112112, -0.878156, -0.251807, -0.390980 - 0.112112, -0.878156, -0.251807, -0.390980 - 0.112112, -0.878156, -0.251807, -0.390980 - 0.112112, -0.878156, -0.251807, -0.390980 - 0.112112, -0.878156, -0.251807, -0.390980 - 0.112112, -0.878156, -0.251807, -0.390980 - 0.112112, -0.878156, -0.251807, -0.390980 - 0.112112, -0.878156, -0.251807, -0.390980 - 0.112112, -0.878156, -0.251807, -0.390980 - 0.112112, -0.878156, -0.251807, -0.390980 - 0.112112, -0.878156, -0.251807, -0.390980 - 0.112112, -0.878156, -0.251807, -0.390980 - 0.112112, -0.878156, -0.251807, -0.390980 - 0.125869, -0.863147, -0.263890, -0.411700 - 0.125869, -0.863147, -0.263890, -0.411700 - 0.125869, -0.863147, -0.263890, -0.411700 - 0.125869, -0.863147, -0.263890, -0.411700 - 0.125869, -0.863147, -0.263890, -0.411700 - 0.125869, -0.863147, -0.263890, -0.411700 - 0.125869, -0.863147, -0.263890, -0.411700 - 0.125869, -0.863147, -0.263890, -0.411700 - 0.125869, -0.863147, -0.263890, -0.411700 - 0.125869, -0.863147, -0.263890, -0.411700 - 0.125869, -0.863147, -0.263890, -0.411700 - 0.125869, -0.863147, -0.263890, -0.411700 - 0.125869, -0.863147, -0.263890, -0.411700 - 0.125869, -0.863147, -0.263890, -0.411700 - 0.125869, -0.863147, -0.263890, -0.411700 - 0.125869, -0.863147, -0.263890, -0.411700 - 0.125869, -0.863147, -0.263890, -0.411700 - 0.125869, -0.863147, -0.263890, -0.411700 - 0.125869, -0.863147, -0.263890, -0.411700 - 0.125869, -0.863147, -0.263890, -0.411700 - 0.125869, -0.863147, -0.263890, -0.411700 - 0.125869, -0.863147, -0.263890, -0.411700 - 0.125869, -0.863147, -0.263890, -0.411700 - 0.125869, -0.863147, -0.263890, -0.411700 - 0.125869, -0.863147, -0.263890, -0.411700 - 0.140291, -0.847398, -0.275336, -0.431771 - 0.140291, -0.847398, -0.275336, -0.431771 - 0.140291, -0.847398, -0.275336, -0.431771 - 0.140291, -0.847398, -0.275336, -0.431771 - 0.140291, -0.847398, -0.275336, -0.431771 - 0.140291, -0.847398, -0.275336, -0.431771 - 0.140291, -0.847398, -0.275336, -0.431771 - 0.140291, -0.847398, -0.275336, -0.431771 - 0.140291, -0.847398, -0.275336, -0.431771 - 0.140291, -0.847398, -0.275336, -0.431771 - 0.140291, -0.847398, -0.275336, -0.431771 - 0.140291, -0.847398, -0.275336, -0.431771 - 0.140291, -0.847398, -0.275336, -0.431771 - 0.140291, -0.847398, -0.275336, -0.431771 - 0.140291, -0.847398, -0.275336, -0.431771 - 0.140291, -0.847398, -0.275336, -0.431771 - 0.140291, -0.847398, -0.275336, -0.431771 - 0.140291, -0.847398, -0.275336, -0.431771 - 0.140291, -0.847398, -0.275336, -0.431771 - 0.140291, -0.847398, -0.275336, -0.431771 - 0.140291, -0.847398, -0.275336, -0.431771 - 0.140291, -0.847398, -0.275336, -0.431771 - 0.140291, -0.847398, -0.275336, -0.431771 - 0.140291, -0.847398, -0.275336, -0.431771 - 0.140291, -0.847398, -0.275336, -0.431771 - 0.155348, -0.830938, -0.286115, -0.451162 - 0.155348, -0.830938, -0.286115, -0.451162 - 0.155348, -0.830938, -0.286115, -0.451162 - 0.155348, -0.830938, -0.286115, -0.451162 - 0.155348, -0.830938, -0.286115, -0.451162 - 0.155348, -0.830938, -0.286115, -0.451162 - 0.155348, -0.830938, -0.286115, -0.451162 - 0.155348, -0.830938, -0.286115, -0.451162 - 0.155348, -0.830938, -0.286115, -0.451162 - 0.155348, -0.830938, -0.286115, -0.451162 - 0.155348, -0.830938, -0.286115, -0.451162 - 0.155348, -0.830938, -0.286115, -0.451162 - 0.155348, -0.830938, -0.286115, -0.451162 - 0.155348, -0.830938, -0.286115, -0.451162 - 0.155348, -0.830938, -0.286115, -0.451162 - 0.155348, -0.830938, -0.286115, -0.451162 - 0.155348, -0.830938, -0.286115, -0.451162 - 0.155348, -0.830938, -0.286115, -0.451162 - 0.155348, -0.830938, -0.286115, -0.451162 - 0.155348, -0.830938, -0.286115, -0.451162 - 0.155348, -0.830938, -0.286115, -0.451162 - 0.155348, -0.830938, -0.286115, -0.451162 - 0.155348, -0.830938, -0.286115, -0.451162 - 0.155348, -0.830938, -0.286115, -0.451162 - 0.155348, -0.830938, -0.286115, -0.451162 - 0.171010, -0.813798, -0.296198, -0.469846 - 0.171010, -0.813798, -0.296198, -0.469846 - 0.171010, -0.813798, -0.296198, -0.469846 - 0.171010, -0.813798, -0.296198, -0.469846 - 0.171010, -0.813798, -0.296198, -0.469846 - 0.171010, -0.813798, -0.296198, -0.469846 - 0.171010, -0.813798, -0.296198, -0.469846 - 0.171010, -0.813798, -0.296198, -0.469846 - 0.171010, -0.813798, -0.296198, -0.469846 - 0.171010, -0.813798, -0.296198, -0.469846 - 0.171010, -0.813798, -0.296198, -0.469846 - 0.171010, -0.813798, -0.296198, -0.469846 - 0.171010, -0.813798, -0.296198, -0.469846 - 0.171010, -0.813798, -0.296198, -0.469846 - 0.171010, -0.813798, -0.296198, -0.469846 - 0.171010, -0.813798, -0.296198, -0.469846 - 0.171010, -0.813798, -0.296198, -0.469846 - 0.171010, -0.813798, -0.296198, -0.469846 - 0.171010, -0.813798, -0.296198, -0.469846 - 0.171010, -0.813798, -0.296198, -0.469846 - 0.171010, -0.813798, -0.296198, -0.469846 - 0.171010, -0.813798, -0.296198, -0.469846 - 0.171010, -0.813798, -0.296198, -0.469846 - 0.171010, -0.813798, -0.296198, -0.469846 - 0.171010, -0.813798, -0.296198, -0.469846 - 0.187247, -0.796008, -0.305559, -0.487794 - 0.187247, -0.796008, -0.305559, -0.487794 - 0.187247, -0.796008, -0.305559, -0.487794 - 0.187247, -0.796008, -0.305559, -0.487794 - 0.187247, -0.796008, -0.305559, -0.487794 - 0.187247, -0.796008, -0.305559, -0.487794 - 0.187247, -0.796008, -0.305559, -0.487794 - 0.187247, -0.796008, -0.305559, -0.487794 - 0.187247, -0.796008, -0.305559, -0.487794 - 0.187247, -0.796008, -0.305559, -0.487794 - 0.187247, -0.796008, -0.305559, -0.487794 - 0.187247, -0.796008, -0.305559, -0.487794 - 0.187247, -0.796008, -0.305559, -0.487794 - 0.187247, -0.796008, -0.305559, -0.487794 - 0.187247, -0.796008, -0.305559, -0.487794 - 0.187247, -0.796008, -0.305559, -0.487794 - 0.187247, -0.796008, -0.305559, -0.487794 - 0.187247, -0.796008, -0.305559, -0.487794 - 0.187247, -0.796008, -0.305559, -0.487794 - 0.187247, -0.796008, -0.305559, -0.487794 - 0.187247, -0.796008, -0.305559, -0.487794 - 0.187247, -0.796008, -0.305559, -0.487794 - 0.187247, -0.796008, -0.305559, -0.487794 - 0.187247, -0.796008, -0.305559, -0.487794 - 0.187247, -0.796008, -0.305559, -0.487794 - 0.204025, -0.777602, -0.314172, -0.504981 - 0.204025, -0.777602, -0.314172, -0.504981 - 0.204025, -0.777602, -0.314172, -0.504981 - 0.204025, -0.777602, -0.314172, -0.504981 - 0.204025, -0.777602, -0.314172, -0.504981 - 0.204025, -0.777602, -0.314172, -0.504981 - 0.204025, -0.777602, -0.314172, -0.504981 - 0.204025, -0.777602, -0.314172, -0.504981 - 0.204025, -0.777602, -0.314172, -0.504981 - 0.204025, -0.777602, -0.314172, -0.504981 - 0.204025, -0.777602, -0.314172, -0.504981 - 0.204025, -0.777602, -0.314172, -0.504981 - 0.204025, -0.777602, -0.314172, -0.504981 - 0.204025, -0.777602, -0.314172, -0.504981 - 0.204025, -0.777602, -0.314172, -0.504981 - 0.204025, -0.777602, -0.314172, -0.504981 - 0.204025, -0.777602, -0.314172, -0.504981 - 0.204025, -0.777602, -0.314172, -0.504981 - 0.204025, -0.777602, -0.314172, -0.504981 - 0.204025, -0.777602, -0.314172, -0.504981 - 0.204025, -0.777602, -0.314172, -0.504981 - 0.204025, -0.777602, -0.314172, -0.504981 - 0.204025, -0.777602, -0.314172, -0.504981 - 0.204025, -0.777602, -0.314172, -0.504981 - 0.204025, -0.777602, -0.314172, -0.504981 - 0.221313, -0.758612, -0.322012, -0.521380 - 0.221313, -0.758612, -0.322012, -0.521380 - 0.221313, -0.758612, -0.322012, -0.521380 - 0.221313, -0.758612, -0.322012, -0.521380 - 0.221313, -0.758612, -0.322012, -0.521380 - 0.221313, -0.758612, -0.322012, -0.521380 - 0.221313, -0.758612, -0.322012, -0.521380 - 0.221313, -0.758612, -0.322012, -0.521380 - 0.221313, -0.758612, -0.322012, -0.521380 - 0.221313, -0.758612, -0.322012, -0.521380 - 0.221313, -0.758612, -0.322012, -0.521380 - 0.221313, -0.758612, -0.322012, -0.521380 - 0.221313, -0.758612, -0.322012, -0.521380 - 0.221313, -0.758612, -0.322012, -0.521380 - 0.221313, -0.758612, -0.322012, -0.521380 - 0.221313, -0.758612, -0.322012, -0.521380 - 0.221313, -0.758612, -0.322012, -0.521380 - 0.221313, -0.758612, -0.322012, -0.521380 - 0.221313, -0.758612, -0.322012, -0.521380 - 0.221313, -0.758612, -0.322012, -0.521380 - 0.221313, -0.758612, -0.322012, -0.521380 - 0.221313, -0.758612, -0.322012, -0.521380 - 0.221313, -0.758612, -0.322012, -0.521380 - 0.221313, -0.758612, -0.322012, -0.521380 - 0.221313, -0.758612, -0.322012, -0.521380 - 0.239074, -0.739074, -0.329057, -0.536969 - 0.239074, -0.739074, -0.329057, -0.536969 - 0.239074, -0.739074, -0.329057, -0.536969 - 0.239074, -0.739074, -0.329057, -0.536969 - 0.239074, -0.739074, -0.329057, -0.536969 - 0.239074, -0.739074, -0.329057, -0.536969 - 0.239074, -0.739074, -0.329057, -0.536969 - 0.239074, -0.739074, -0.329057, -0.536969 - 0.239074, -0.739074, -0.329057, -0.536969 - 0.239074, -0.739074, -0.329057, -0.536969 - 0.239074, -0.739074, -0.329057, -0.536969 - 0.239074, -0.739074, -0.329057, -0.536969 - 0.239074, -0.739074, -0.329057, -0.536969 - 0.239074, -0.739074, -0.329057, -0.536969 - 0.239074, -0.739074, -0.329057, -0.536969 - 0.239074, -0.739074, -0.329057, -0.536969 - 0.239074, -0.739074, -0.329057, -0.536969 - 0.239074, -0.739074, -0.329057, -0.536969 - 0.239074, -0.739074, -0.329057, -0.536969 - 0.239074, -0.739074, -0.329057, -0.536969 - 0.239074, -0.739074, -0.329057, -0.536969 - 0.239074, -0.739074, -0.329057, -0.536969 - 0.239074, -0.739074, -0.329057, -0.536969 - 0.239074, -0.739074, -0.329057, -0.536969 - 0.239074, -0.739074, -0.329057, -0.536969 - 0.257274, -0.719022, -0.335286, -0.551725 - 0.257274, -0.719022, -0.335286, -0.551725 - 0.257274, -0.719022, -0.335286, -0.551725 - 0.257274, -0.719022, -0.335286, -0.551725 - 0.257274, -0.719022, -0.335286, -0.551725 - 0.257274, -0.719022, -0.335286, -0.551725 - 0.257274, -0.719022, -0.335286, -0.551725 - 0.257274, -0.719022, -0.335286, -0.551725 - 0.257274, -0.719022, -0.335286, -0.551725 - 0.257274, -0.719022, -0.335286, -0.551725 - 0.257274, -0.719022, -0.335286, -0.551725 - 0.257274, -0.719022, -0.335286, -0.551725 - 0.257274, -0.719022, -0.335286, -0.551725 - 0.257274, -0.719022, -0.335286, -0.551725 - 0.257274, -0.719022, -0.335286, -0.551725 - 0.257274, -0.719022, -0.335286, -0.551725 - 0.257274, -0.719022, -0.335286, -0.551725 - 0.257274, -0.719022, -0.335286, -0.551725 - 0.257274, -0.719022, -0.335286, -0.551725 - 0.257274, -0.719022, -0.335286, -0.551725 - 0.257274, -0.719022, -0.335286, -0.551725 - 0.257274, -0.719022, -0.335286, -0.551725 - 0.257274, -0.719022, -0.335286, -0.551725 - 0.257274, -0.719022, -0.335286, -0.551725 - 0.257274, -0.719022, -0.335286, -0.551725 - 0.275876, -0.698494, -0.340678, -0.565629 - 0.275876, -0.698494, -0.340678, -0.565629 - 0.275876, -0.698494, -0.340678, -0.565629 - 0.275876, -0.698494, -0.340678, -0.565629 - 0.275876, -0.698494, -0.340678, -0.565629 - 0.275876, -0.698494, -0.340678, -0.565629 - 0.275876, -0.698494, -0.340678, -0.565629 - 0.275876, -0.698494, -0.340678, -0.565629 - 0.275876, -0.698494, -0.340678, -0.565629 - 0.275876, -0.698494, -0.340678, -0.565629 - 0.275876, -0.698494, -0.340678, -0.565629 - 0.275876, -0.698494, -0.340678, -0.565629 - 0.275876, -0.698494, -0.340678, -0.565629 - 0.275876, -0.698494, -0.340678, -0.565629 - 0.275876, -0.698494, -0.340678, -0.565629 - 0.275876, -0.698494, -0.340678, -0.565629 - 0.275876, -0.698494, -0.340678, -0.565629 - 0.275876, -0.698494, -0.340678, -0.565629 - 0.275876, -0.698494, -0.340678, -0.565629 - 0.275876, -0.698494, -0.340678, -0.565629 - 0.275876, -0.698494, -0.340678, -0.565629 - 0.275876, -0.698494, -0.340678, -0.565629 - 0.275876, -0.698494, -0.340678, -0.565629 - 0.275876, -0.698494, -0.340678, -0.565629 - 0.275876, -0.698494, -0.340678, -0.565629 - 0.294843, -0.677527, -0.345217, -0.578662 - 0.294843, -0.677527, -0.345217, -0.578662 - 0.294843, -0.677527, -0.345217, -0.578662 - 0.294843, -0.677527, -0.345217, -0.578662 - 0.294843, -0.677527, -0.345217, -0.578662 - 0.294843, -0.677527, -0.345217, -0.578662 - 0.294843, -0.677527, -0.345217, -0.578662 - 0.294843, -0.677527, -0.345217, -0.578662 - 0.294843, -0.677527, -0.345217, -0.578662 - 0.294843, -0.677527, -0.345217, -0.578662 - 0.294843, -0.677527, -0.345217, -0.578662 - 0.294843, -0.677527, -0.345217, -0.578662 - 0.294843, -0.677527, -0.345217, -0.578662 - 0.294843, -0.677527, -0.345217, -0.578662 - 0.294843, -0.677527, -0.345217, -0.578662 - 0.294843, -0.677527, -0.345217, -0.578662 - 0.294843, -0.677527, -0.345217, -0.578662 - 0.294843, -0.677527, -0.345217, -0.578662 - 0.294843, -0.677527, -0.345217, -0.578662 - 0.294843, -0.677527, -0.345217, -0.578662 - 0.294843, -0.677527, -0.345217, -0.578662 - 0.294843, -0.677527, -0.345217, -0.578662 - 0.294843, -0.677527, -0.345217, -0.578662 - 0.294843, -0.677527, -0.345217, -0.578662 - 0.294843, -0.677527, -0.345217, -0.578662 - 0.314138, -0.656158, -0.348885, -0.590807 - 0.314138, -0.656158, -0.348885, -0.590807 - 0.314138, -0.656158, -0.348885, -0.590807 - 0.314138, -0.656158, -0.348885, -0.590807 - 0.314138, -0.656158, -0.348885, -0.590807 - 0.314138, -0.656158, -0.348885, -0.590807 - 0.314138, -0.656158, -0.348885, -0.590807 - 0.314138, -0.656158, -0.348885, -0.590807 - 0.314138, -0.656158, -0.348885, -0.590807 - 0.314138, -0.656158, -0.348885, -0.590807 - 0.314138, -0.656158, -0.348885, -0.590807 - 0.314138, -0.656158, -0.348885, -0.590807 - 0.314138, -0.656158, -0.348885, -0.590807 - 0.314138, -0.656158, -0.348885, -0.590807 - 0.314138, -0.656158, -0.348885, -0.590807 - 0.314138, -0.656158, -0.348885, -0.590807 - 0.314138, -0.656158, -0.348885, -0.590807 - 0.314138, -0.656158, -0.348885, -0.590807 - 0.314138, -0.656158, -0.348885, -0.590807 - 0.314138, -0.656158, -0.348885, -0.590807 - 0.314138, -0.656158, -0.348885, -0.590807 - 0.314138, -0.656158, -0.348885, -0.590807 - 0.314138, -0.656158, -0.348885, -0.590807 - 0.314138, -0.656158, -0.348885, -0.590807 - 0.314138, -0.656158, -0.348885, -0.590807 - 0.333721, -0.634427, -0.351668, -0.602048 - 0.333721, -0.634427, -0.351668, -0.602048 - 0.333721, -0.634427, -0.351668, -0.602048 - 0.333721, -0.634427, -0.351668, -0.602048 - 0.333721, -0.634427, -0.351668, -0.602048 - 0.333721, -0.634427, -0.351668, -0.602048 - 0.333721, -0.634427, -0.351668, -0.602048 - 0.333721, -0.634427, -0.351668, -0.602048 - 0.333721, -0.634427, -0.351668, -0.602048 - 0.333721, -0.634427, -0.351668, -0.602048 - 0.333721, -0.634427, -0.351668, -0.602048 - 0.333721, -0.634427, -0.351668, -0.602048 - 0.333721, -0.634427, -0.351668, -0.602048 - 0.333721, -0.634427, -0.351668, -0.602048 - 0.333721, -0.634427, -0.351668, -0.602048 - 0.333721, -0.634427, -0.351668, -0.602048 - 0.333721, -0.634427, -0.351668, -0.602048 - 0.333721, -0.634427, -0.351668, -0.602048 - 0.333721, -0.634427, -0.351668, -0.602048 - 0.333721, -0.634427, -0.351668, -0.602048 - 0.333721, -0.634427, -0.351668, -0.602048 - 0.333721, -0.634427, -0.351668, -0.602048 - 0.333721, -0.634427, -0.351668, -0.602048 - 0.333721, -0.634427, -0.351668, -0.602048 - 0.333721, -0.634427, -0.351668, -0.602048 - 0.353553, -0.612372, -0.353553, -0.612372 - 0.353553, -0.612372, -0.353553, -0.612372 - 0.353553, -0.612372, -0.353553, -0.612372 - 0.353553, -0.612372, -0.353553, -0.612372 - 0.353553, -0.612372, -0.353553, -0.612372 - 0.353553, -0.612372, -0.353553, -0.612372 - 0.353553, -0.612372, -0.353553, -0.612372 - 0.353553, -0.612372, -0.353553, -0.612372 - 0.353553, -0.612372, -0.353553, -0.612372 - 0.353553, -0.612372, -0.353553, -0.612372 - 0.353553, -0.612372, -0.353553, -0.612372 - 0.353553, -0.612372, -0.353553, -0.612372 - 0.353553, -0.612372, -0.353553, -0.612372 - 0.353553, -0.612372, -0.353553, -0.612372 - 0.353553, -0.612372, -0.353553, -0.612372 - 0.353553, -0.612372, -0.353553, -0.612372 - 0.353553, -0.612372, -0.353553, -0.612372 - 0.353553, -0.612372, -0.353553, -0.612372 - 0.353553, -0.612372, -0.353553, -0.612372 - 0.353553, -0.612372, -0.353553, -0.612372 - 0.353553, -0.612372, -0.353553, -0.612372 - 0.353553, -0.612372, -0.353553, -0.612372 - 0.353553, -0.612372, -0.353553, -0.612372 - 0.353553, -0.612372, -0.353553, -0.612372 - 0.353553, -0.612372, -0.353553, -0.612372 - 0.373595, -0.590035, -0.354529, -0.621767 - 0.373595, -0.590035, -0.354529, -0.621767 - 0.373595, -0.590035, -0.354529, -0.621767 - 0.373595, -0.590035, -0.354529, -0.621767 - 0.373595, -0.590035, -0.354529, -0.621767 - 0.373595, -0.590035, -0.354529, -0.621767 - 0.373595, -0.590035, -0.354529, -0.621767 - 0.373595, -0.590035, -0.354529, -0.621767 - 0.373595, -0.590035, -0.354529, -0.621767 - 0.373595, -0.590035, -0.354529, -0.621767 - 0.373595, -0.590035, -0.354529, -0.621767 - 0.373595, -0.590035, -0.354529, -0.621767 - 0.373595, -0.590035, -0.354529, -0.621767 - 0.373595, -0.590035, -0.354529, -0.621767 - 0.373595, -0.590035, -0.354529, -0.621767 - 0.373595, -0.590035, -0.354529, -0.621767 - 0.373595, -0.590035, -0.354529, -0.621767 - 0.373595, -0.590035, -0.354529, -0.621767 - 0.373595, -0.590035, -0.354529, -0.621767 - 0.373595, -0.590035, -0.354529, -0.621767 - 0.373595, -0.590035, -0.354529, -0.621767 - 0.373595, -0.590035, -0.354529, -0.621767 - 0.373595, -0.590035, -0.354529, -0.621767 - 0.373595, -0.590035, -0.354529, -0.621767 - 0.373595, -0.590035, -0.354529, -0.621767 - 0.393807, -0.567455, -0.354585, -0.630223 - 0.393807, -0.567455, -0.354585, -0.630223 - 0.393807, -0.567455, -0.354585, -0.630223 - 0.393807, -0.567455, -0.354585, -0.630223 - 0.393807, -0.567455, -0.354585, -0.630223 - 0.393807, -0.567455, -0.354585, -0.630223 - 0.393807, -0.567455, -0.354585, -0.630223 - 0.393807, -0.567455, -0.354585, -0.630223 - 0.393807, -0.567455, -0.354585, -0.630223 - 0.393807, -0.567455, -0.354585, -0.630223 - 0.393807, -0.567455, -0.354585, -0.630223 - 0.393807, -0.567455, -0.354585, -0.630223 - 0.393807, -0.567455, -0.354585, -0.630223 - 0.393807, -0.567455, -0.354585, -0.630223 - 0.393807, -0.567455, -0.354585, -0.630223 - 0.393807, -0.567455, -0.354585, -0.630223 - 0.393807, -0.567455, -0.354585, -0.630223 - 0.393807, -0.567455, -0.354585, -0.630223 - 0.393807, -0.567455, -0.354585, -0.630223 - 0.393807, -0.567455, -0.354585, -0.630223 - 0.393807, -0.567455, -0.354585, -0.630223 - 0.393807, -0.567455, -0.354585, -0.630223 - 0.393807, -0.567455, -0.354585, -0.630223 - 0.393807, -0.567455, -0.354585, -0.630223 - 0.393807, -0.567455, -0.354585, -0.630223 - 0.414147, -0.544673, -0.353715, -0.637730 - 0.414147, -0.544673, -0.353715, -0.637730 - 0.414147, -0.544673, -0.353715, -0.637730 - 0.414147, -0.544673, -0.353715, -0.637730 - 0.414147, -0.544673, -0.353715, -0.637730 - 0.414147, -0.544673, -0.353715, -0.637730 - 0.414147, -0.544673, -0.353715, -0.637730 - 0.414147, -0.544673, -0.353715, -0.637730 - 0.414147, -0.544673, -0.353715, -0.637730 - 0.414147, -0.544673, -0.353715, -0.637730 - 0.414147, -0.544673, -0.353715, -0.637730 - 0.414147, -0.544673, -0.353715, -0.637730 - 0.414147, -0.544673, -0.353715, -0.637730 - 0.414147, -0.544673, -0.353715, -0.637730 - 0.414147, -0.544673, -0.353715, -0.637730 - 0.414147, -0.544673, -0.353715, -0.637730 - 0.414147, -0.544673, -0.353715, -0.637730 - 0.414147, -0.544673, -0.353715, -0.637730 - 0.414147, -0.544673, -0.353715, -0.637730 - 0.414147, -0.544673, -0.353715, -0.637730 - 0.414147, -0.544673, -0.353715, -0.637730 - 0.414147, -0.544673, -0.353715, -0.637730 - 0.414147, -0.544673, -0.353715, -0.637730 - 0.414147, -0.544673, -0.353715, -0.637730 - 0.414147, -0.544673, -0.353715, -0.637730 - 0.434575, -0.521730, -0.351911, -0.644283 - 0.434575, -0.521730, -0.351911, -0.644283 - 0.434575, -0.521730, -0.351911, -0.644283 - 0.434575, -0.521730, -0.351911, -0.644283 - 0.434575, -0.521730, -0.351911, -0.644283 - 0.434575, -0.521730, -0.351911, -0.644283 - 0.434575, -0.521730, -0.351911, -0.644283 - 0.434575, -0.521730, -0.351911, -0.644283 - 0.434575, -0.521730, -0.351911, -0.644283 - 0.434575, -0.521730, -0.351911, -0.644283 - 0.434575, -0.521730, -0.351911, -0.644283 - 0.434575, -0.521730, -0.351911, -0.644283 - 0.434575, -0.521730, -0.351911, -0.644283 - 0.434575, -0.521730, -0.351911, -0.644283 - 0.434575, -0.521730, -0.351911, -0.644283 - 0.434575, -0.521730, -0.351911, -0.644283 - 0.434575, -0.521730, -0.351911, -0.644283 - 0.434575, -0.521730, -0.351911, -0.644283 - 0.434575, -0.521730, -0.351911, -0.644283 - 0.434575, -0.521730, -0.351911, -0.644283 - 0.434575, -0.521730, -0.351911, -0.644283 - 0.434575, -0.521730, -0.351911, -0.644283 - 0.434575, -0.521730, -0.351911, -0.644283 - 0.434575, -0.521730, -0.351911, -0.644283 - 0.434575, -0.521730, -0.351911, -0.644283 - 0.455049, -0.498668, -0.349171, -0.649877 - 0.455049, -0.498668, -0.349171, -0.649877 - 0.455049, -0.498668, -0.349171, -0.649877 - 0.455049, -0.498668, -0.349171, -0.649877 - 0.455049, -0.498668, -0.349171, -0.649877 - 0.455049, -0.498668, -0.349171, -0.649877 - 0.455049, -0.498668, -0.349171, -0.649877 - 0.455049, -0.498668, -0.349171, -0.649877 - 0.455049, -0.498668, -0.349171, -0.649877 - 0.455049, -0.498668, -0.349171, -0.649877 - 0.455049, -0.498668, -0.349171, -0.649877 - 0.455049, -0.498668, -0.349171, -0.649877 - 0.455049, -0.498668, -0.349171, -0.649877 - 0.455049, -0.498668, -0.349171, -0.649877 - 0.455049, -0.498668, -0.349171, -0.649877 - 0.455049, -0.498668, -0.349171, -0.649877 - 0.455049, -0.498668, -0.349171, -0.649877 - 0.455049, -0.498668, -0.349171, -0.649877 - 0.455049, -0.498668, -0.349171, -0.649877 - 0.455049, -0.498668, -0.349171, -0.649877 - 0.455049, -0.498668, -0.349171, -0.649877 - 0.455049, -0.498668, -0.349171, -0.649877 - 0.455049, -0.498668, -0.349171, -0.649877 - 0.455049, -0.498668, -0.349171, -0.649877 - 0.455049, -0.498668, -0.349171, -0.649877 - 0.475528, -0.475528, -0.345492, -0.654508 - 0.475528, -0.475528, -0.345492, -0.654508 - 0.475528, -0.475528, -0.345492, -0.654508 - 0.475528, -0.475528, -0.345492, -0.654508 - 0.475528, -0.475528, -0.345492, -0.654508 - 0.475528, -0.475528, -0.345492, -0.654508 - 0.475528, -0.475528, -0.345492, -0.654508 - 0.475528, -0.475528, -0.345492, -0.654508 - 0.475528, -0.475528, -0.345492, -0.654508 - 0.475528, -0.475528, -0.345492, -0.654508 - 0.475528, -0.475528, -0.345492, -0.654508 - 0.475528, -0.475528, -0.345492, -0.654508 - 0.475528, -0.475528, -0.345492, -0.654508 - 0.475528, -0.475528, -0.345492, -0.654508 - 0.475528, -0.475528, -0.345492, -0.654508 - 0.475528, -0.475528, -0.345492, -0.654508 - 0.475528, -0.475528, -0.345492, -0.654508 - 0.475528, -0.475528, -0.345492, -0.654508 - 0.475528, -0.475528, -0.345492, -0.654508 - 0.475528, -0.475528, -0.345492, -0.654508 - 0.475528, -0.475528, -0.345492, -0.654508 - 0.475528, -0.475528, -0.345492, -0.654508 - 0.475528, -0.475528, -0.345492, -0.654508 - 0.475528, -0.475528, -0.345492, -0.654508 - 0.475528, -0.475528, -0.345492, -0.654508 - 0.495972, -0.452352, -0.340872, -0.658176 - 0.495972, -0.452352, -0.340872, -0.658176 - 0.495972, -0.452352, -0.340872, -0.658176 - 0.495972, -0.452352, -0.340872, -0.658176 - 0.495972, -0.452352, -0.340872, -0.658176 - 0.495972, -0.452352, -0.340872, -0.658176 - 0.495972, -0.452352, -0.340872, -0.658176 - 0.495972, -0.452352, -0.340872, -0.658176 - 0.495972, -0.452352, -0.340872, -0.658176 - 0.495972, -0.452352, -0.340872, -0.658176 - 0.495972, -0.452352, -0.340872, -0.658176 - 0.495972, -0.452352, -0.340872, -0.658176 - 0.495972, -0.452352, -0.340872, -0.658176 - 0.495972, -0.452352, -0.340872, -0.658176 - 0.495972, -0.452352, -0.340872, -0.658176 - 0.495972, -0.452352, -0.340872, -0.658176 - 0.495972, -0.452352, -0.340872, -0.658176 - 0.495972, -0.452352, -0.340872, -0.658176 - 0.495972, -0.452352, -0.340872, -0.658176 - 0.495972, -0.452352, -0.340872, -0.658176 - 0.495972, -0.452352, -0.340872, -0.658176 - 0.495972, -0.452352, -0.340872, -0.658176 - 0.495972, -0.452352, -0.340872, -0.658176 - 0.495972, -0.452352, -0.340872, -0.658176 - 0.495972, -0.452352, -0.340872, -0.658176 - 0.516337, -0.429181, -0.335313, -0.660881 - 0.516337, -0.429181, -0.335313, -0.660881 - 0.516337, -0.429181, -0.335313, -0.660881 - 0.516337, -0.429181, -0.335313, -0.660881 - 0.516337, -0.429181, -0.335313, -0.660881 - 0.516337, -0.429181, -0.335313, -0.660881 - 0.516337, -0.429181, -0.335313, -0.660881 - 0.516337, -0.429181, -0.335313, -0.660881 - 0.516337, -0.429181, -0.335313, -0.660881 - 0.516337, -0.429181, -0.335313, -0.660881 - 0.516337, -0.429181, -0.335313, -0.660881 - 0.516337, -0.429181, -0.335313, -0.660881 - 0.516337, -0.429181, -0.335313, -0.660881 - 0.516337, -0.429181, -0.335313, -0.660881 - 0.516337, -0.429181, -0.335313, -0.660881 - 0.516337, -0.429181, -0.335313, -0.660881 - 0.516337, -0.429181, -0.335313, -0.660881 - 0.516337, -0.429181, -0.335313, -0.660881 - 0.516337, -0.429181, -0.335313, -0.660881 - 0.516337, -0.429181, -0.335313, -0.660881 - 0.516337, -0.429181, -0.335313, -0.660881 - 0.516337, -0.429181, -0.335313, -0.660881 - 0.516337, -0.429181, -0.335313, -0.660881 - 0.516337, -0.429181, -0.335313, -0.660881 - 0.516337, -0.429181, -0.335313, -0.660881 - 0.536584, -0.406058, -0.328819, -0.662626 - 0.536584, -0.406058, -0.328819, -0.662626 - 0.536584, -0.406058, -0.328819, -0.662626 - 0.536584, -0.406058, -0.328819, -0.662626 - 0.536584, -0.406058, -0.328819, -0.662626 - 0.536584, -0.406058, -0.328819, -0.662626 - 0.536584, -0.406058, -0.328819, -0.662626 - 0.536584, -0.406058, -0.328819, -0.662626 - 0.536584, -0.406058, -0.328819, -0.662626 - 0.536584, -0.406058, -0.328819, -0.662626 - 0.536584, -0.406058, -0.328819, -0.662626 - 0.536584, -0.406058, -0.328819, -0.662626 - 0.536584, -0.406058, -0.328819, -0.662626 - 0.536584, -0.406058, -0.328819, -0.662626 - 0.536584, -0.406058, -0.328819, -0.662626 - 0.536584, -0.406058, -0.328819, -0.662626 - 0.536584, -0.406058, -0.328819, -0.662626 - 0.536584, -0.406058, -0.328819, -0.662626 - 0.536584, -0.406058, -0.328819, -0.662626 - 0.536584, -0.406058, -0.328819, -0.662626 - 0.536584, -0.406058, -0.328819, -0.662626 - 0.536584, -0.406058, -0.328819, -0.662626 - 0.536584, -0.406058, -0.328819, -0.662626 - 0.536584, -0.406058, -0.328819, -0.662626 - 0.536584, -0.406058, -0.328819, -0.662626 - 0.556670, -0.383022, -0.321394, -0.663414 - 0.556670, -0.383022, -0.321394, -0.663414 - 0.556670, -0.383022, -0.321394, -0.663414 - 0.556670, -0.383022, -0.321394, -0.663414 - 0.556670, -0.383022, -0.321394, -0.663414 - 0.556670, -0.383022, -0.321394, -0.663414 - 0.556670, -0.383022, -0.321394, -0.663414 - 0.556670, -0.383022, -0.321394, -0.663414 - 0.556670, -0.383022, -0.321394, -0.663414 - 0.556670, -0.383022, -0.321394, -0.663414 - 0.556670, -0.383022, -0.321394, -0.663414 - 0.556670, -0.383022, -0.321394, -0.663414 - 0.556670, -0.383022, -0.321394, -0.663414 - 0.556670, -0.383022, -0.321394, -0.663414 - 0.556670, -0.383022, -0.321394, -0.663414 - 0.556670, -0.383022, -0.321394, -0.663414 - 0.556670, -0.383022, -0.321394, -0.663414 - 0.556670, -0.383022, -0.321394, -0.663414 - 0.556670, -0.383022, -0.321394, -0.663414 - 0.556670, -0.383022, -0.321394, -0.663414 - 0.556670, -0.383022, -0.321394, -0.663414 - 0.556670, -0.383022, -0.321394, -0.663414 - 0.556670, -0.383022, -0.321394, -0.663414 - 0.556670, -0.383022, -0.321394, -0.663414 - 0.556670, -0.383022, -0.321394, -0.663414 - 0.576556, -0.360116, -0.313044, -0.663252 - 0.576556, -0.360116, -0.313044, -0.663252 - 0.576556, -0.360116, -0.313044, -0.663252 - 0.576556, -0.360116, -0.313044, -0.663252 - 0.576556, -0.360116, -0.313044, -0.663252 - 0.576556, -0.360116, -0.313044, -0.663252 - 0.576556, -0.360116, -0.313044, -0.663252 - 0.576556, -0.360116, -0.313044, -0.663252 - 0.576556, -0.360116, -0.313044, -0.663252 - 0.576556, -0.360116, -0.313044, -0.663252 - 0.576556, -0.360116, -0.313044, -0.663252 - 0.576556, -0.360116, -0.313044, -0.663252 - 0.576556, -0.360116, -0.313044, -0.663252 - 0.576556, -0.360116, -0.313044, -0.663252 - 0.576556, -0.360116, -0.313044, -0.663252 - 0.576556, -0.360116, -0.313044, -0.663252 - 0.576556, -0.360116, -0.313044, -0.663252 - 0.576556, -0.360116, -0.313044, -0.663252 - 0.576556, -0.360116, -0.313044, -0.663252 - 0.576556, -0.360116, -0.313044, -0.663252 - 0.576556, -0.360116, -0.313044, -0.663252 - 0.576556, -0.360116, -0.313044, -0.663252 - 0.576556, -0.360116, -0.313044, -0.663252 - 0.576556, -0.360116, -0.313044, -0.663252 - 0.576556, -0.360116, -0.313044, -0.663252 - 0.596200, -0.337381, -0.303779, -0.662147 - 0.596200, -0.337381, -0.303779, -0.662147 - 0.596200, -0.337381, -0.303779, -0.662147 - 0.596200, -0.337381, -0.303779, -0.662147 - 0.596200, -0.337381, -0.303779, -0.662147 - 0.596200, -0.337381, -0.303779, -0.662147 - 0.596200, -0.337381, -0.303779, -0.662147 - 0.596200, -0.337381, -0.303779, -0.662147 - 0.596200, -0.337381, -0.303779, -0.662147 - 0.596200, -0.337381, -0.303779, -0.662147 - 0.596200, -0.337381, -0.303779, -0.662147 - 0.596200, -0.337381, -0.303779, -0.662147 - 0.596200, -0.337381, -0.303779, -0.662147 - 0.596200, -0.337381, -0.303779, -0.662147 - 0.596200, -0.337381, -0.303779, -0.662147 - 0.596200, -0.337381, -0.303779, -0.662147 - 0.596200, -0.337381, -0.303779, -0.662147 - 0.596200, -0.337381, -0.303779, -0.662147 - 0.596200, -0.337381, -0.303779, -0.662147 - 0.596200, -0.337381, -0.303779, -0.662147 - 0.596200, -0.337381, -0.303779, -0.662147 - 0.596200, -0.337381, -0.303779, -0.662147 - 0.596200, -0.337381, -0.303779, -0.662147 - 0.596200, -0.337381, -0.303779, -0.662147 - 0.596200, -0.337381, -0.303779, -0.662147 - 0.615562, -0.314856, -0.293608, -0.660109 - 0.615562, -0.314856, -0.293608, -0.660109 - 0.615562, -0.314856, -0.293608, -0.660109 - 0.615562, -0.314856, -0.293608, -0.660109 - 0.615562, -0.314856, -0.293608, -0.660109 - 0.615562, -0.314856, -0.293608, -0.660109 - 0.615562, -0.314856, -0.293608, -0.660109 - 0.615562, -0.314856, -0.293608, -0.660109 - 0.615562, -0.314856, -0.293608, -0.660109 - 0.615562, -0.314856, -0.293608, -0.660109 - 0.615562, -0.314856, -0.293608, -0.660109 - 0.615562, -0.314856, -0.293608, -0.660109 - 0.615562, -0.314856, -0.293608, -0.660109 - 0.615562, -0.314856, -0.293608, -0.660109 - 0.615562, -0.314856, -0.293608, -0.660109 - 0.615562, -0.314856, -0.293608, -0.660109 - 0.615562, -0.314856, -0.293608, -0.660109 - 0.615562, -0.314856, -0.293608, -0.660109 - 0.615562, -0.314856, -0.293608, -0.660109 - 0.615562, -0.314856, -0.293608, -0.660109 - 0.615562, -0.314856, -0.293608, -0.660109 - 0.615562, -0.314856, -0.293608, -0.660109 - 0.615562, -0.314856, -0.293608, -0.660109 - 0.615562, -0.314856, -0.293608, -0.660109 - 0.615562, -0.314856, -0.293608, -0.660109 - 0.634602, -0.292582, -0.282543, -0.657150 - 0.634602, -0.292582, -0.282543, -0.657150 - 0.634602, -0.292582, -0.282543, -0.657150 - 0.634602, -0.292582, -0.282543, -0.657150 - 0.634602, -0.292582, -0.282543, -0.657150 - 0.634602, -0.292582, -0.282543, -0.657150 - 0.634602, -0.292582, -0.282543, -0.657150 - 0.634602, -0.292582, -0.282543, -0.657150 - 0.634602, -0.292582, -0.282543, -0.657150 - 0.634602, -0.292582, -0.282543, -0.657150 - 0.634602, -0.292582, -0.282543, -0.657150 - 0.634602, -0.292582, -0.282543, -0.657150 - 0.634602, -0.292582, -0.282543, -0.657150 - 0.634602, -0.292582, -0.282543, -0.657150 - 0.634602, -0.292582, -0.282543, -0.657150 - 0.634602, -0.292582, -0.282543, -0.657150 - 0.634602, -0.292582, -0.282543, -0.657150 - 0.634602, -0.292582, -0.282543, -0.657150 - 0.634602, -0.292582, -0.282543, -0.657150 - 0.634602, -0.292582, -0.282543, -0.657150 - 0.634602, -0.292582, -0.282543, -0.657150 - 0.634602, -0.292582, -0.282543, -0.657150 - 0.634602, -0.292582, -0.282543, -0.657150 - 0.634602, -0.292582, -0.282543, -0.657150 - 0.634602, -0.292582, -0.282543, -0.657150 - 0.653281, -0.270598, -0.270598, -0.653281 - 0.653281, -0.270598, -0.270598, -0.653281 - 0.653281, -0.270598, -0.270598, -0.653281 - 0.653281, -0.270598, -0.270598, -0.653281 - 0.653281, -0.270598, -0.270598, -0.653281 - 0.653281, -0.270598, -0.270598, -0.653281 - 0.653281, -0.270598, -0.270598, -0.653281 - 0.653281, -0.270598, -0.270598, -0.653281 - 0.653281, -0.270598, -0.270598, -0.653281 - 0.653281, -0.270598, -0.270598, -0.653281 - 0.653281, -0.270598, -0.270598, -0.653281 - 0.653281, -0.270598, -0.270598, -0.653281 - 0.653281, -0.270598, -0.270598, -0.653281 - 0.653281, -0.270598, -0.270598, -0.653281 - 0.653281, -0.270598, -0.270598, -0.653281 - 0.653281, -0.270598, -0.270598, -0.653281 - 0.653281, -0.270598, -0.270598, -0.653281 - 0.653281, -0.270598, -0.270598, -0.653281 - 0.653281, -0.270598, -0.270598, -0.653281 - 0.653281, -0.270598, -0.270598, -0.653281 - 0.653281, -0.270598, -0.270598, -0.653281 - 0.653281, -0.270598, -0.270598, -0.653281 - 0.653281, -0.270598, -0.270598, -0.653281 - 0.653281, -0.270598, -0.270598, -0.653281 - 0.653281, -0.270598, -0.270598, -0.653281 - 0.671562, -0.248943, -0.257788, -0.648519 - 0.671562, -0.248943, -0.257788, -0.648519 - 0.671562, -0.248943, -0.257788, -0.648519 - 0.671562, -0.248943, -0.257788, -0.648519 - 0.671562, -0.248943, -0.257788, -0.648519 - 0.671562, -0.248943, -0.257788, -0.648519 - 0.671562, -0.248943, -0.257788, -0.648519 - 0.671562, -0.248943, -0.257788, -0.648519 - 0.671562, -0.248943, -0.257788, -0.648519 - 0.671562, -0.248943, -0.257788, -0.648519 - 0.671562, -0.248943, -0.257788, -0.648519 - 0.671562, -0.248943, -0.257788, -0.648519 - 0.671562, -0.248943, -0.257788, -0.648519 - 0.671562, -0.248943, -0.257788, -0.648519 - 0.671562, -0.248943, -0.257788, -0.648519 - 0.671562, -0.248943, -0.257788, -0.648519 - 0.671562, -0.248943, -0.257788, -0.648519 - 0.671562, -0.248943, -0.257788, -0.648519 - 0.671562, -0.248943, -0.257788, -0.648519 - 0.671562, -0.248943, -0.257788, -0.648519 - 0.671562, -0.248943, -0.257788, -0.648519 - 0.671562, -0.248943, -0.257788, -0.648519 - 0.671562, -0.248943, -0.257788, -0.648519 - 0.671562, -0.248943, -0.257788, -0.648519 - 0.671562, -0.248943, -0.257788, -0.648519 - 0.689404, -0.227656, -0.244131, -0.642880 - 0.689404, -0.227656, -0.244131, -0.642880 - 0.689404, -0.227656, -0.244131, -0.642880 - 0.689404, -0.227656, -0.244131, -0.642880 - 0.689404, -0.227656, -0.244131, -0.642880 - 0.689404, -0.227656, -0.244131, -0.642880 - 0.689404, -0.227656, -0.244131, -0.642880 - 0.689404, -0.227656, -0.244131, -0.642880 - 0.689404, -0.227656, -0.244131, -0.642880 - 0.689404, -0.227656, -0.244131, -0.642880 - 0.689404, -0.227656, -0.244131, -0.642880 - 0.689404, -0.227656, -0.244131, -0.642880 - 0.689404, -0.227656, -0.244131, -0.642880 - 0.689404, -0.227656, -0.244131, -0.642880 - 0.689404, -0.227656, -0.244131, -0.642880 - 0.689404, -0.227656, -0.244131, -0.642880 - 0.689404, -0.227656, -0.244131, -0.642880 - 0.689404, -0.227656, -0.244131, -0.642880 - 0.689404, -0.227656, -0.244131, -0.642880 - 0.689404, -0.227656, -0.244131, -0.642880 - 0.689404, -0.227656, -0.244131, -0.642880 - 0.689404, -0.227656, -0.244131, -0.642880 - 0.689404, -0.227656, -0.244131, -0.642880 - 0.689404, -0.227656, -0.244131, -0.642880 - 0.689404, -0.227656, -0.244131, -0.642880 - 0.706773, -0.206773, -0.229644, -0.636381 - 0.706773, -0.206773, -0.229644, -0.636381 - 0.706773, -0.206773, -0.229644, -0.636381 - 0.706773, -0.206773, -0.229644, -0.636381 - 0.706773, -0.206773, -0.229644, -0.636381 - 0.706773, -0.206773, -0.229644, -0.636381 - 0.706773, -0.206773, -0.229644, -0.636381 - 0.706773, -0.206773, -0.229644, -0.636381 - 0.706773, -0.206773, -0.229644, -0.636381 - 0.706773, -0.206773, -0.229644, -0.636381 - 0.706773, -0.206773, -0.229644, -0.636381 - 0.706773, -0.206773, -0.229644, -0.636381 - 0.706773, -0.206773, -0.229644, -0.636381 - 0.706773, -0.206773, -0.229644, -0.636381 - 0.706773, -0.206773, -0.229644, -0.636381 - 0.706773, -0.206773, -0.229644, -0.636381 - 0.706773, -0.206773, -0.229644, -0.636381 - 0.706773, -0.206773, -0.229644, -0.636381 - 0.706773, -0.206773, -0.229644, -0.636381 - 0.706773, -0.206773, -0.229644, -0.636381 - 0.706773, -0.206773, -0.229644, -0.636381 - 0.706773, -0.206773, -0.229644, -0.636381 - 0.706773, -0.206773, -0.229644, -0.636381 - 0.706773, -0.206773, -0.229644, -0.636381 - 0.706773, -0.206773, -0.229644, -0.636381 - 0.723630, -0.186331, -0.214349, -0.629042 - 0.723630, -0.186331, -0.214349, -0.629042 - 0.723630, -0.186331, -0.214349, -0.629042 - 0.723630, -0.186331, -0.214349, -0.629042 - 0.723630, -0.186331, -0.214349, -0.629042 - 0.723630, -0.186331, -0.214349, -0.629042 - 0.723630, -0.186331, -0.214349, -0.629042 - 0.723630, -0.186331, -0.214349, -0.629042 - 0.723630, -0.186331, -0.214349, -0.629042 - 0.723630, -0.186331, -0.214349, -0.629042 - 0.723630, -0.186331, -0.214349, -0.629042 - 0.723630, -0.186331, -0.214349, -0.629042 - 0.723630, -0.186331, -0.214349, -0.629042 - 0.723630, -0.186331, -0.214349, -0.629042 - 0.723630, -0.186331, -0.214349, -0.629042 - 0.723630, -0.186331, -0.214349, -0.629042 - 0.723630, -0.186331, -0.214349, -0.629042 - 0.723630, -0.186331, -0.214349, -0.629042 - 0.723630, -0.186331, -0.214349, -0.629042 - 0.723630, -0.186331, -0.214349, -0.629042 - 0.723630, -0.186331, -0.214349, -0.629042 - 0.723630, -0.186331, -0.214349, -0.629042 - 0.723630, -0.186331, -0.214349, -0.629042 - 0.723630, -0.186331, -0.214349, -0.629042 - 0.723630, -0.186331, -0.214349, -0.629042 - 0.739942, -0.166366, -0.198267, -0.620885 - 0.739942, -0.166366, -0.198267, -0.620885 - 0.739942, -0.166366, -0.198267, -0.620885 - 0.739942, -0.166366, -0.198267, -0.620885 - 0.739942, -0.166366, -0.198267, -0.620885 - 0.739942, -0.166366, -0.198267, -0.620885 - 0.739942, -0.166366, -0.198267, -0.620885 - 0.739942, -0.166366, -0.198267, -0.620885 - 0.739942, -0.166366, -0.198267, -0.620885 - 0.739942, -0.166366, -0.198267, -0.620885 - 0.739942, -0.166366, -0.198267, -0.620885 - 0.739942, -0.166366, -0.198267, -0.620885 - 0.739942, -0.166366, -0.198267, -0.620885 - 0.739942, -0.166366, -0.198267, -0.620885 - 0.739942, -0.166366, -0.198267, -0.620885 - 0.739942, -0.166366, -0.198267, -0.620885 - 0.739942, -0.166366, -0.198267, -0.620885 - 0.739942, -0.166366, -0.198267, -0.620885 - 0.739942, -0.166366, -0.198267, -0.620885 - 0.739942, -0.166366, -0.198267, -0.620885 - 0.739942, -0.166366, -0.198267, -0.620885 - 0.739942, -0.166366, -0.198267, -0.620885 - 0.739942, -0.166366, -0.198267, -0.620885 - 0.739942, -0.166366, -0.198267, -0.620885 - 0.739942, -0.166366, -0.198267, -0.620885 - 0.755673, -0.146912, -0.181421, -0.611932 - 0.755673, -0.146912, -0.181421, -0.611932 - 0.755673, -0.146912, -0.181421, -0.611932 - 0.755673, -0.146912, -0.181421, -0.611932 - 0.755673, -0.146912, -0.181421, -0.611932 - 0.755673, -0.146912, -0.181421, -0.611932 - 0.755673, -0.146912, -0.181421, -0.611932 - 0.755673, -0.146912, -0.181421, -0.611932 - 0.755673, -0.146912, -0.181421, -0.611932 - 0.755673, -0.146912, -0.181421, -0.611932 - 0.755673, -0.146912, -0.181421, -0.611932 - 0.755673, -0.146912, -0.181421, -0.611932 - 0.755673, -0.146912, -0.181421, -0.611932 - 0.755673, -0.146912, -0.181421, -0.611932 - 0.755673, -0.146912, -0.181421, -0.611932 - 0.755673, -0.146912, -0.181421, -0.611932 - 0.755673, -0.146912, -0.181421, -0.611932 - 0.755673, -0.146912, -0.181421, -0.611932 - 0.755673, -0.146912, -0.181421, -0.611932 - 0.755673, -0.146912, -0.181421, -0.611932 - 0.755673, -0.146912, -0.181421, -0.611932 - 0.755673, -0.146912, -0.181421, -0.611932 - 0.755673, -0.146912, -0.181421, -0.611932 - 0.755673, -0.146912, -0.181421, -0.611932 - 0.755673, -0.146912, -0.181421, -0.611932 - 0.770791, -0.128003, -0.163837, -0.602208 - 0.770791, -0.128003, -0.163837, -0.602208 - 0.770791, -0.128003, -0.163837, -0.602208 - 0.770791, -0.128003, -0.163837, -0.602208 - 0.770791, -0.128003, -0.163837, -0.602208 - 0.770791, -0.128003, -0.163837, -0.602208 - 0.770791, -0.128003, -0.163837, -0.602208 - 0.770791, -0.128003, -0.163837, -0.602208 - 0.770791, -0.128003, -0.163837, -0.602208 - 0.770791, -0.128003, -0.163837, -0.602208 - 0.770791, -0.128003, -0.163837, -0.602208 - 0.770791, -0.128003, -0.163837, -0.602208 - 0.770791, -0.128003, -0.163837, -0.602208 - 0.770791, -0.128003, -0.163837, -0.602208 - 0.770791, -0.128003, -0.163837, -0.602208 - 0.770791, -0.128003, -0.163837, -0.602208 - 0.770791, -0.128003, -0.163837, -0.602208 - 0.770791, -0.128003, -0.163837, -0.602208 - 0.770791, -0.128003, -0.163837, -0.602208 - 0.770791, -0.128003, -0.163837, -0.602208 - 0.770791, -0.128003, -0.163837, -0.602208 - 0.770791, -0.128003, -0.163837, -0.602208 - 0.770791, -0.128003, -0.163837, -0.602208 - 0.770791, -0.128003, -0.163837, -0.602208 - 0.770791, -0.128003, -0.163837, -0.602208 - 0.785262, -0.109672, -0.145540, -0.591738 - 0.785262, -0.109672, -0.145540, -0.591738 - 0.785262, -0.109672, -0.145540, -0.591738 - 0.785262, -0.109672, -0.145540, -0.591738 - 0.785262, -0.109672, -0.145540, -0.591738 - 0.785262, -0.109672, -0.145540, -0.591738 - 0.785262, -0.109672, -0.145540, -0.591738 - 0.785262, -0.109672, -0.145540, -0.591738 - 0.785262, -0.109672, -0.145540, -0.591738 - 0.785262, -0.109672, -0.145540, -0.591738 - 0.785262, -0.109672, -0.145540, -0.591738 - 0.785262, -0.109672, -0.145540, -0.591738 - 0.785262, -0.109672, -0.145540, -0.591738 - 0.785262, -0.109672, -0.145540, -0.591738 - 0.785262, -0.109672, -0.145540, -0.591738 - 0.785262, -0.109672, -0.145540, -0.591738 - 0.785262, -0.109672, -0.145540, -0.591738 - 0.785262, -0.109672, -0.145540, -0.591738 - 0.785262, -0.109672, -0.145540, -0.591738 - 0.785262, -0.109672, -0.145540, -0.591738 - 0.785262, -0.109672, -0.145540, -0.591738 - 0.785262, -0.109672, -0.145540, -0.591738 - 0.785262, -0.109672, -0.145540, -0.591738 - 0.785262, -0.109672, -0.145540, -0.591738 - 0.785262, -0.109672, -0.145540, -0.591738 - 0.799057, -0.091950, -0.126558, -0.580549 - 0.799057, -0.091950, -0.126558, -0.580549 - 0.799057, -0.091950, -0.126558, -0.580549 - 0.799057, -0.091950, -0.126558, -0.580549 - 0.799057, -0.091950, -0.126558, -0.580549 - 0.799057, -0.091950, -0.126558, -0.580549 - 0.799057, -0.091950, -0.126558, -0.580549 - 0.799057, -0.091950, -0.126558, -0.580549 - 0.799057, -0.091950, -0.126558, -0.580549 - 0.799057, -0.091950, -0.126558, -0.580549 - 0.799057, -0.091950, -0.126558, -0.580549 - 0.799057, -0.091950, -0.126558, -0.580549 - 0.799057, -0.091950, -0.126558, -0.580549 - 0.799057, -0.091950, -0.126558, -0.580549 - 0.799057, -0.091950, -0.126558, -0.580549 - 0.799057, -0.091950, -0.126558, -0.580549 - 0.799057, -0.091950, -0.126558, -0.580549 - 0.799057, -0.091950, -0.126558, -0.580549 - 0.799057, -0.091950, -0.126558, -0.580549 - 0.799057, -0.091950, -0.126558, -0.580549 - 0.799057, -0.091950, -0.126558, -0.580549 - 0.799057, -0.091950, -0.126558, -0.580549 - 0.799057, -0.091950, -0.126558, -0.580549 - 0.799057, -0.091950, -0.126558, -0.580549 - 0.799057, -0.091950, -0.126558, -0.580549 - 0.812144, -0.074867, -0.106921, -0.568669 - 0.812144, -0.074867, -0.106921, -0.568669 - 0.812144, -0.074867, -0.106921, -0.568669 - 0.812144, -0.074867, -0.106921, -0.568669 - 0.812144, -0.074867, -0.106921, -0.568669 - 0.812144, -0.074867, -0.106921, -0.568669 - 0.812144, -0.074867, -0.106921, -0.568669 - 0.812144, -0.074867, -0.106921, -0.568669 - 0.812144, -0.074867, -0.106921, -0.568669 - 0.812144, -0.074867, -0.106921, -0.568669 - 0.812144, -0.074867, -0.106921, -0.568669 - 0.812144, -0.074867, -0.106921, -0.568669 - 0.812144, -0.074867, -0.106921, -0.568669 - 0.812144, -0.074867, -0.106921, -0.568669 - 0.812144, -0.074867, -0.106921, -0.568669 - 0.812144, -0.074867, -0.106921, -0.568669 - 0.812144, -0.074867, -0.106921, -0.568669 - 0.812144, -0.074867, -0.106921, -0.568669 - 0.812144, -0.074867, -0.106921, -0.568669 - 0.812144, -0.074867, -0.106921, -0.568669 - 0.812144, -0.074867, -0.106921, -0.568669 - 0.812144, -0.074867, -0.106921, -0.568669 - 0.812144, -0.074867, -0.106921, -0.568669 - 0.812144, -0.074867, -0.106921, -0.568669 - 0.812144, -0.074867, -0.106921, -0.568669 - 0.824496, -0.058452, -0.086658, -0.556130 - 0.824496, -0.058452, -0.086658, -0.556130 - 0.824496, -0.058452, -0.086658, -0.556130 - 0.824496, -0.058452, -0.086658, -0.556130 - 0.824496, -0.058452, -0.086658, -0.556130 - 0.824496, -0.058452, -0.086658, -0.556130 - 0.824496, -0.058452, -0.086658, -0.556130 - 0.824496, -0.058452, -0.086658, -0.556130 - 0.824496, -0.058452, -0.086658, -0.556130 - 0.824496, -0.058452, -0.086658, -0.556130 - 0.824496, -0.058452, -0.086658, -0.556130 - 0.824496, -0.058452, -0.086658, -0.556130 - 0.824496, -0.058452, -0.086658, -0.556130 - 0.824496, -0.058452, -0.086658, -0.556130 - 0.824496, -0.058452, -0.086658, -0.556130 - 0.824496, -0.058452, -0.086658, -0.556130 - 0.824496, -0.058452, -0.086658, -0.556130 - 0.824496, -0.058452, -0.086658, -0.556130 - 0.824496, -0.058452, -0.086658, -0.556130 - 0.824496, -0.058452, -0.086658, -0.556130 - 0.824496, -0.058452, -0.086658, -0.556130 - 0.824496, -0.058452, -0.086658, -0.556130 - 0.824496, -0.058452, -0.086658, -0.556130 - 0.824496, -0.058452, -0.086658, -0.556130 - 0.824496, -0.058452, -0.086658, -0.556130 - 0.836085, -0.042732, -0.065801, -0.542960 - 0.836085, -0.042732, -0.065801, -0.542960 - 0.836085, -0.042732, -0.065801, -0.542960 - 0.836085, -0.042732, -0.065801, -0.542960 - 0.836085, -0.042732, -0.065801, -0.542960 - 0.836085, -0.042732, -0.065801, -0.542960 - 0.836085, -0.042732, -0.065801, -0.542960 - 0.836085, -0.042732, -0.065801, -0.542960 - 0.836085, -0.042732, -0.065801, -0.542960 - 0.836085, -0.042732, -0.065801, -0.542960 - 0.836085, -0.042732, -0.065801, -0.542960 - 0.836085, -0.042732, -0.065801, -0.542960 - 0.836085, -0.042732, -0.065801, -0.542960 - 0.836085, -0.042732, -0.065801, -0.542960 - 0.836085, -0.042732, -0.065801, -0.542960 - 0.836085, -0.042732, -0.065801, -0.542960 - 0.836085, -0.042732, -0.065801, -0.542960 - 0.836085, -0.042732, -0.065801, -0.542960 - 0.836085, -0.042732, -0.065801, -0.542960 - 0.836085, -0.042732, -0.065801, -0.542960 - 0.836085, -0.042732, -0.065801, -0.542960 - 0.836085, -0.042732, -0.065801, -0.542960 - 0.836085, -0.042732, -0.065801, -0.542960 - 0.836085, -0.042732, -0.065801, -0.542960 - 0.836085, -0.042732, -0.065801, -0.542960 - 0.846886, -0.027734, -0.044383, -0.529193 - 0.846886, -0.027734, -0.044383, -0.529193 - 0.846886, -0.027734, -0.044383, -0.529193 - 0.846886, -0.027734, -0.044383, -0.529193 - 0.846886, -0.027734, -0.044383, -0.529193 - 0.846886, -0.027734, -0.044383, -0.529193 - 0.846886, -0.027734, -0.044383, -0.529193 - 0.846886, -0.027734, -0.044383, -0.529193 - 0.846886, -0.027734, -0.044383, -0.529193 - 0.846886, -0.027734, -0.044383, -0.529193 - 0.846886, -0.027734, -0.044383, -0.529193 - 0.846886, -0.027734, -0.044383, -0.529193 - 0.846886, -0.027734, -0.044383, -0.529193 - 0.846886, -0.027734, -0.044383, -0.529193 - 0.846886, -0.027734, -0.044383, -0.529193 - 0.846886, -0.027734, -0.044383, -0.529193 - 0.846886, -0.027734, -0.044383, -0.529193 - 0.846886, -0.027734, -0.044383, -0.529193 - 0.846886, -0.027734, -0.044383, -0.529193 - 0.846886, -0.027734, -0.044383, -0.529193 - 0.846886, -0.027734, -0.044383, -0.529193 - 0.846886, -0.027734, -0.044383, -0.529193 - 0.846886, -0.027734, -0.044383, -0.529193 - 0.846886, -0.027734, -0.044383, -0.529193 - 0.846886, -0.027734, -0.044383, -0.529193 - 0.856874, -0.013482, -0.022438, -0.514862 - 0.856874, -0.013482, -0.022438, -0.514862 - 0.856874, -0.013482, -0.022438, -0.514862 - 0.856874, -0.013482, -0.022438, -0.514862 - 0.856874, -0.013482, -0.022438, -0.514862 - 0.856874, -0.013482, -0.022438, -0.514862 - 0.856874, -0.013482, -0.022438, -0.514862 - 0.856874, -0.013482, -0.022438, -0.514862 - 0.856874, -0.013482, -0.022438, -0.514862 - 0.856874, -0.013482, -0.022438, -0.514862 - 0.856874, -0.013482, -0.022438, -0.514862 - 0.856874, -0.013482, -0.022438, -0.514862 - 0.856874, -0.013482, -0.022438, -0.514862 - 0.856874, -0.013482, -0.022438, -0.514862 - 0.856874, -0.013482, -0.022438, -0.514862 - 0.856874, -0.013482, -0.022438, -0.514862 - 0.856874, -0.013482, -0.022438, -0.514862 - 0.856874, -0.013482, -0.022438, -0.514862 - 0.856874, -0.013482, -0.022438, -0.514862 - 0.856874, -0.013482, -0.022438, -0.514862 - 0.856874, -0.013482, -0.022438, -0.514862 - 0.856874, -0.013482, -0.022438, -0.514862 - 0.856874, -0.013482, -0.022438, -0.514862 - 0.856874, -0.013482, -0.022438, -0.514862 - 0.856874, -0.013482, -0.022438, -0.514862 - 0.866025, -0.000000, -0.000000, -0.500000 - 0.866025, -0.000000, -0.000000, -0.500000 - 0.866025, -0.000000, -0.000000, -0.500000 - 0.866025, -0.000000, -0.000000, -0.500000 - 0.866025, -0.000000, -0.000000, -0.500000 - 0.866025, -0.000000, -0.000000, -0.500000 - 0.866025, -0.000000, -0.000000, -0.500000 - 0.866025, -0.000000, -0.000000, -0.500000 - 0.866025, -0.000000, -0.000000, -0.500000 - 0.866025, -0.000000, -0.000000, -0.500000 - 0.866025, -0.000000, -0.000000, -0.500000 - 0.866025, -0.000000, -0.000000, -0.500000 - 0.866025, -0.000000, -0.000000, -0.500000 - 0.866025, -0.000000, -0.000000, -0.500000 - 0.866025, -0.000000, -0.000000, -0.500000 - 0.866025, -0.000000, -0.000000, -0.500000 - 0.866025, -0.000000, -0.000000, -0.500000 - 0.866025, -0.000000, -0.000000, -0.500000 - 0.866025, -0.000000, -0.000000, -0.500000 - 0.866025, -0.000000, -0.000000, -0.500000 - 0.866025, -0.000000, -0.000000, -0.500000 - 0.866025, -0.000000, -0.000000, -0.500000 - 0.866025, -0.000000, -0.000000, -0.500000 - 0.866025, -0.000000, -0.000000, -0.500000 - 0.866025, -0.000000, -0.000000, -0.500000 - 0.874320, 0.012691, 0.022895, -0.484643 - 0.874320, 0.012691, 0.022895, -0.484643 - 0.874320, 0.012691, 0.022895, -0.484643 - 0.874320, 0.012691, 0.022895, -0.484643 - 0.874320, 0.012691, 0.022895, -0.484643 - 0.874320, 0.012691, 0.022895, -0.484643 - 0.874320, 0.012691, 0.022895, -0.484643 - 0.874320, 0.012691, 0.022895, -0.484643 - 0.874320, 0.012691, 0.022895, -0.484643 - 0.874320, 0.012691, 0.022895, -0.484643 - 0.874320, 0.012691, 0.022895, -0.484643 - 0.874320, 0.012691, 0.022895, -0.484643 - 0.874320, 0.012691, 0.022895, -0.484643 - 0.874320, 0.012691, 0.022895, -0.484643 - 0.874320, 0.012691, 0.022895, -0.484643 - 0.874320, 0.012691, 0.022895, -0.484643 - 0.874320, 0.012691, 0.022895, -0.484643 - 0.874320, 0.012691, 0.022895, -0.484643 - 0.874320, 0.012691, 0.022895, -0.484643 - 0.874320, 0.012691, 0.022895, -0.484643 - 0.874320, 0.012691, 0.022895, -0.484643 - 0.874320, 0.012691, 0.022895, -0.484643 - 0.874320, 0.012691, 0.022895, -0.484643 - 0.874320, 0.012691, 0.022895, -0.484643 - 0.874320, 0.012691, 0.022895, -0.484643 - 0.881738, 0.024570, 0.046210, -0.468828 - 0.881738, 0.024570, 0.046210, -0.468828 - 0.881738, 0.024570, 0.046210, -0.468828 - 0.881738, 0.024570, 0.046210, -0.468828 - 0.881738, 0.024570, 0.046210, -0.468828 - 0.881738, 0.024570, 0.046210, -0.468828 - 0.881738, 0.024570, 0.046210, -0.468828 - 0.881738, 0.024570, 0.046210, -0.468828 - 0.881738, 0.024570, 0.046210, -0.468828 - 0.881738, 0.024570, 0.046210, -0.468828 - 0.881738, 0.024570, 0.046210, -0.468828 - 0.881738, 0.024570, 0.046210, -0.468828 - 0.881738, 0.024570, 0.046210, -0.468828 - 0.881738, 0.024570, 0.046210, -0.468828 - 0.881738, 0.024570, 0.046210, -0.468828 - 0.881738, 0.024570, 0.046210, -0.468828 - 0.881738, 0.024570, 0.046210, -0.468828 - 0.881738, 0.024570, 0.046210, -0.468828 - 0.881738, 0.024570, 0.046210, -0.468828 - 0.881738, 0.024570, 0.046210, -0.468828 - 0.881738, 0.024570, 0.046210, -0.468828 - 0.881738, 0.024570, 0.046210, -0.468828 - 0.881738, 0.024570, 0.046210, -0.468828 - 0.881738, 0.024570, 0.046210, -0.468828 - 0.881738, 0.024570, 0.046210, -0.468828 - 0.888260, 0.035620, 0.069908, -0.452591 - 0.888260, 0.035620, 0.069908, -0.452591 - 0.888260, 0.035620, 0.069908, -0.452591 - 0.888260, 0.035620, 0.069908, -0.452591 - 0.888260, 0.035620, 0.069908, -0.452591 - 0.888260, 0.035620, 0.069908, -0.452591 - 0.888260, 0.035620, 0.069908, -0.452591 - 0.888260, 0.035620, 0.069908, -0.452591 - 0.888260, 0.035620, 0.069908, -0.452591 - 0.888260, 0.035620, 0.069908, -0.452591 - 0.888260, 0.035620, 0.069908, -0.452591 - 0.888260, 0.035620, 0.069908, -0.452591 - 0.888260, 0.035620, 0.069908, -0.452591 - 0.888260, 0.035620, 0.069908, -0.452591 - 0.888260, 0.035620, 0.069908, -0.452591 - 0.888260, 0.035620, 0.069908, -0.452591 - 0.888260, 0.035620, 0.069908, -0.452591 - 0.888260, 0.035620, 0.069908, -0.452591 - 0.888260, 0.035620, 0.069908, -0.452591 - 0.888260, 0.035620, 0.069908, -0.452591 - 0.888260, 0.035620, 0.069908, -0.452591 - 0.888260, 0.035620, 0.069908, -0.452591 - 0.888260, 0.035620, 0.069908, -0.452591 - 0.888260, 0.035620, 0.069908, -0.452591 - 0.888260, 0.035620, 0.069908, -0.452591 - 0.893870, 0.045822, 0.093950, -0.435970 - 0.893870, 0.045822, 0.093950, -0.435970 - 0.893870, 0.045822, 0.093950, -0.435970 - 0.893870, 0.045822, 0.093950, -0.435970 - 0.893870, 0.045822, 0.093950, -0.435970 - 0.893870, 0.045822, 0.093950, -0.435970 - 0.893870, 0.045822, 0.093950, -0.435970 - 0.893870, 0.045822, 0.093950, -0.435970 - 0.893870, 0.045822, 0.093950, -0.435970 - 0.893870, 0.045822, 0.093950, -0.435970 - 0.893870, 0.045822, 0.093950, -0.435970 - 0.893870, 0.045822, 0.093950, -0.435970 - 0.893870, 0.045822, 0.093950, -0.435970 - 0.893870, 0.045822, 0.093950, -0.435970 - 0.893870, 0.045822, 0.093950, -0.435970 - 0.893870, 0.045822, 0.093950, -0.435970 - 0.893870, 0.045822, 0.093950, -0.435970 - 0.893870, 0.045822, 0.093950, -0.435970 - 0.893870, 0.045822, 0.093950, -0.435970 - 0.893870, 0.045822, 0.093950, -0.435970 - 0.893870, 0.045822, 0.093950, -0.435970 - 0.893870, 0.045822, 0.093950, -0.435970 - 0.893870, 0.045822, 0.093950, -0.435970 - 0.893870, 0.045822, 0.093950, -0.435970 - 0.893870, 0.045822, 0.093950, -0.435970 - 0.898554, 0.055163, 0.118297, -0.419003 - 0.898554, 0.055163, 0.118297, -0.419003 - 0.898554, 0.055163, 0.118297, -0.419003 - 0.898554, 0.055163, 0.118297, -0.419003 - 0.898554, 0.055163, 0.118297, -0.419003 - 0.898554, 0.055163, 0.118297, -0.419003 - 0.898554, 0.055163, 0.118297, -0.419003 - 0.898554, 0.055163, 0.118297, -0.419003 - 0.898554, 0.055163, 0.118297, -0.419003 - 0.898554, 0.055163, 0.118297, -0.419003 - 0.898554, 0.055163, 0.118297, -0.419003 - 0.898554, 0.055163, 0.118297, -0.419003 - 0.898554, 0.055163, 0.118297, -0.419003 - 0.898554, 0.055163, 0.118297, -0.419003 - 0.898554, 0.055163, 0.118297, -0.419003 - 0.898554, 0.055163, 0.118297, -0.419003 - 0.898554, 0.055163, 0.118297, -0.419003 - 0.898554, 0.055163, 0.118297, -0.419003 - 0.898554, 0.055163, 0.118297, -0.419003 - 0.898554, 0.055163, 0.118297, -0.419003 - 0.898554, 0.055163, 0.118297, -0.419003 - 0.898554, 0.055163, 0.118297, -0.419003 - 0.898554, 0.055163, 0.118297, -0.419003 - 0.898554, 0.055163, 0.118297, -0.419003 - 0.898554, 0.055163, 0.118297, -0.419003 - 0.902298, 0.063628, 0.142910, -0.401729 - 0.902298, 0.063628, 0.142910, -0.401729 - 0.902298, 0.063628, 0.142910, -0.401729 - 0.902298, 0.063628, 0.142910, -0.401729 - 0.902298, 0.063628, 0.142910, -0.401729 - 0.902298, 0.063628, 0.142910, -0.401729 - 0.902298, 0.063628, 0.142910, -0.401729 - 0.902298, 0.063628, 0.142910, -0.401729 - 0.902298, 0.063628, 0.142910, -0.401729 - 0.902298, 0.063628, 0.142910, -0.401729 - 0.902298, 0.063628, 0.142910, -0.401729 - 0.902298, 0.063628, 0.142910, -0.401729 - 0.902298, 0.063628, 0.142910, -0.401729 - 0.902298, 0.063628, 0.142910, -0.401729 - 0.902298, 0.063628, 0.142910, -0.401729 - 0.902298, 0.063628, 0.142910, -0.401729 - 0.902298, 0.063628, 0.142910, -0.401729 - 0.902298, 0.063628, 0.142910, -0.401729 - 0.902298, 0.063628, 0.142910, -0.401729 - 0.902298, 0.063628, 0.142910, -0.401729 - 0.902298, 0.063628, 0.142910, -0.401729 - 0.902298, 0.063628, 0.142910, -0.401729 - 0.902298, 0.063628, 0.142910, -0.401729 - 0.902298, 0.063628, 0.142910, -0.401729 - 0.902298, 0.063628, 0.142910, -0.401729 - 0.905091, 0.071205, 0.167749, -0.384188 - 0.905091, 0.071205, 0.167749, -0.384188 - 0.905091, 0.071205, 0.167749, -0.384188 - 0.905091, 0.071205, 0.167749, -0.384188 - 0.905091, 0.071205, 0.167749, -0.384188 - 0.905091, 0.071205, 0.167749, -0.384188 - 0.905091, 0.071205, 0.167749, -0.384188 - 0.905091, 0.071205, 0.167749, -0.384188 - 0.905091, 0.071205, 0.167749, -0.384188 - 0.905091, 0.071205, 0.167749, -0.384188 - 0.905091, 0.071205, 0.167749, -0.384188 - 0.905091, 0.071205, 0.167749, -0.384188 - 0.905091, 0.071205, 0.167749, -0.384188 - 0.905091, 0.071205, 0.167749, -0.384188 - 0.905091, 0.071205, 0.167749, -0.384188 - 0.905091, 0.071205, 0.167749, -0.384188 - 0.905091, 0.071205, 0.167749, -0.384188 - 0.905091, 0.071205, 0.167749, -0.384188 - 0.905091, 0.071205, 0.167749, -0.384188 - 0.905091, 0.071205, 0.167749, -0.384188 - 0.905091, 0.071205, 0.167749, -0.384188 - 0.905091, 0.071205, 0.167749, -0.384188 - 0.905091, 0.071205, 0.167749, -0.384188 - 0.905091, 0.071205, 0.167749, -0.384188 - 0.905091, 0.071205, 0.167749, -0.384188 - 0.906923, 0.077885, 0.192772, -0.366421 - 0.906923, 0.077885, 0.192772, -0.366421 - 0.906923, 0.077885, 0.192772, -0.366421 - 0.906923, 0.077885, 0.192772, -0.366421 - 0.906923, 0.077885, 0.192772, -0.366421 - 0.906923, 0.077885, 0.192772, -0.366421 - 0.906923, 0.077885, 0.192772, -0.366421 - 0.906923, 0.077885, 0.192772, -0.366421 - 0.906923, 0.077885, 0.192772, -0.366421 - 0.906923, 0.077885, 0.192772, -0.366421 - 0.906923, 0.077885, 0.192772, -0.366421 - 0.906923, 0.077885, 0.192772, -0.366421 - 0.906923, 0.077885, 0.192772, -0.366421 - 0.906923, 0.077885, 0.192772, -0.366421 - 0.906923, 0.077885, 0.192772, -0.366421 - 0.906923, 0.077885, 0.192772, -0.366421 - 0.906923, 0.077885, 0.192772, -0.366421 - 0.906923, 0.077885, 0.192772, -0.366421 - 0.906923, 0.077885, 0.192772, -0.366421 - 0.906923, 0.077885, 0.192772, -0.366421 - 0.906923, 0.077885, 0.192772, -0.366421 - 0.906923, 0.077885, 0.192772, -0.366421 - 0.906923, 0.077885, 0.192772, -0.366421 - 0.906923, 0.077885, 0.192772, -0.366421 - 0.906923, 0.077885, 0.192772, -0.366421 - 0.907786, 0.083659, 0.217940, -0.348466 - 0.907786, 0.083659, 0.217940, -0.348466 - 0.907786, 0.083659, 0.217940, -0.348466 - 0.907786, 0.083659, 0.217940, -0.348466 - 0.907786, 0.083659, 0.217940, -0.348466 - 0.907786, 0.083659, 0.217940, -0.348466 - 0.907786, 0.083659, 0.217940, -0.348466 - 0.907786, 0.083659, 0.217940, -0.348466 - 0.907786, 0.083659, 0.217940, -0.348466 - 0.907786, 0.083659, 0.217940, -0.348466 - 0.907786, 0.083659, 0.217940, -0.348466 - 0.907786, 0.083659, 0.217940, -0.348466 - 0.907786, 0.083659, 0.217940, -0.348466 - 0.907786, 0.083659, 0.217940, -0.348466 - 0.907786, 0.083659, 0.217940, -0.348466 - 0.907786, 0.083659, 0.217940, -0.348466 - 0.907786, 0.083659, 0.217940, -0.348466 - 0.907786, 0.083659, 0.217940, -0.348466 - 0.907786, 0.083659, 0.217940, -0.348466 - 0.907786, 0.083659, 0.217940, -0.348466 - 0.907786, 0.083659, 0.217940, -0.348466 - 0.907786, 0.083659, 0.217940, -0.348466 - 0.907786, 0.083659, 0.217940, -0.348466 - 0.907786, 0.083659, 0.217940, -0.348466 - 0.907786, 0.083659, 0.217940, -0.348466 - 0.907673, 0.088521, 0.243210, -0.330366 - 0.907673, 0.088521, 0.243210, -0.330366 - 0.907673, 0.088521, 0.243210, -0.330366 - 0.907673, 0.088521, 0.243210, -0.330366 - 0.907673, 0.088521, 0.243210, -0.330366 - 0.907673, 0.088521, 0.243210, -0.330366 - 0.907673, 0.088521, 0.243210, -0.330366 - 0.907673, 0.088521, 0.243210, -0.330366 - 0.907673, 0.088521, 0.243210, -0.330366 - 0.907673, 0.088521, 0.243210, -0.330366 - 0.907673, 0.088521, 0.243210, -0.330366 - 0.907673, 0.088521, 0.243210, -0.330366 - 0.907673, 0.088521, 0.243210, -0.330366 - 0.907673, 0.088521, 0.243210, -0.330366 - 0.907673, 0.088521, 0.243210, -0.330366 - 0.907673, 0.088521, 0.243210, -0.330366 - 0.907673, 0.088521, 0.243210, -0.330366 - 0.907673, 0.088521, 0.243210, -0.330366 - 0.907673, 0.088521, 0.243210, -0.330366 - 0.907673, 0.088521, 0.243210, -0.330366 - 0.907673, 0.088521, 0.243210, -0.330366 - 0.907673, 0.088521, 0.243210, -0.330366 - 0.907673, 0.088521, 0.243210, -0.330366 - 0.907673, 0.088521, 0.243210, -0.330366 - 0.907673, 0.088521, 0.243210, -0.330366 - 0.906582, 0.092466, 0.268542, -0.312161 - 0.906582, 0.092466, 0.268542, -0.312161 - 0.906582, 0.092466, 0.268542, -0.312161 - 0.906582, 0.092466, 0.268542, -0.312161 - 0.906582, 0.092466, 0.268542, -0.312161 - 0.906582, 0.092466, 0.268542, -0.312161 - 0.906582, 0.092466, 0.268542, -0.312161 - 0.906582, 0.092466, 0.268542, -0.312161 - 0.906582, 0.092466, 0.268542, -0.312161 - 0.906582, 0.092466, 0.268542, -0.312161 - 0.906582, 0.092466, 0.268542, -0.312161 - 0.906582, 0.092466, 0.268542, -0.312161 - 0.906582, 0.092466, 0.268542, -0.312161 - 0.906582, 0.092466, 0.268542, -0.312161 - 0.906582, 0.092466, 0.268542, -0.312161 - 0.906582, 0.092466, 0.268542, -0.312161 - 0.906582, 0.092466, 0.268542, -0.312161 - 0.906582, 0.092466, 0.268542, -0.312161 - 0.906582, 0.092466, 0.268542, -0.312161 - 0.906582, 0.092466, 0.268542, -0.312161 - 0.906582, 0.092466, 0.268542, -0.312161 - 0.906582, 0.092466, 0.268542, -0.312161 - 0.906582, 0.092466, 0.268542, -0.312161 - 0.906582, 0.092466, 0.268542, -0.312161 - 0.906582, 0.092466, 0.268542, -0.312161 - 0.904508, 0.095492, 0.293893, -0.293893 - 0.904508, 0.095492, 0.293893, -0.293893 - 0.904508, 0.095492, 0.293893, -0.293893 - 0.904508, 0.095492, 0.293893, -0.293893 - 0.904508, 0.095492, 0.293893, -0.293893 - 0.904508, 0.095492, 0.293893, -0.293893 - 0.904508, 0.095492, 0.293893, -0.293893 - 0.904508, 0.095492, 0.293893, -0.293893 - 0.904508, 0.095492, 0.293893, -0.293893 - 0.904508, 0.095492, 0.293893, -0.293893 - 0.904508, 0.095492, 0.293893, -0.293893 - 0.904508, 0.095492, 0.293893, -0.293893 - 0.904508, 0.095492, 0.293893, -0.293893 - 0.904508, 0.095492, 0.293893, -0.293893 - 0.904508, 0.095492, 0.293893, -0.293893 - 0.904508, 0.095492, 0.293893, -0.293893 - 0.904508, 0.095492, 0.293893, -0.293893 - 0.904508, 0.095492, 0.293893, -0.293893 - 0.904508, 0.095492, 0.293893, -0.293893 - 0.904508, 0.095492, 0.293893, -0.293893 - 0.904508, 0.095492, 0.293893, -0.293893 - 0.904508, 0.095492, 0.293893, -0.293893 - 0.904508, 0.095492, 0.293893, -0.293893 - 0.904508, 0.095492, 0.293893, -0.293893 - 0.904508, 0.095492, 0.293893, -0.293893 - 0.901453, 0.097596, 0.319221, -0.275602 - 0.901453, 0.097596, 0.319221, -0.275602 - 0.901453, 0.097596, 0.319221, -0.275602 - 0.901453, 0.097596, 0.319221, -0.275602 - 0.901453, 0.097596, 0.319221, -0.275602 - 0.901453, 0.097596, 0.319221, -0.275602 - 0.901453, 0.097596, 0.319221, -0.275602 - 0.901453, 0.097596, 0.319221, -0.275602 - 0.901453, 0.097596, 0.319221, -0.275602 - 0.901453, 0.097596, 0.319221, -0.275602 - 0.901453, 0.097596, 0.319221, -0.275602 - 0.901453, 0.097596, 0.319221, -0.275602 - 0.901453, 0.097596, 0.319221, -0.275602 - 0.901453, 0.097596, 0.319221, -0.275602 - 0.901453, 0.097596, 0.319221, -0.275602 - 0.901453, 0.097596, 0.319221, -0.275602 - 0.901453, 0.097596, 0.319221, -0.275602 - 0.901453, 0.097596, 0.319221, -0.275602 - 0.901453, 0.097596, 0.319221, -0.275602 - 0.901453, 0.097596, 0.319221, -0.275602 - 0.901453, 0.097596, 0.319221, -0.275602 - 0.901453, 0.097596, 0.319221, -0.275602 - 0.901453, 0.097596, 0.319221, -0.275602 - 0.901453, 0.097596, 0.319221, -0.275602 - 0.901453, 0.097596, 0.319221, -0.275602 - 0.897415, 0.098780, 0.344485, -0.257330 - 0.897415, 0.098780, 0.344485, -0.257330 - 0.897415, 0.098780, 0.344485, -0.257330 - 0.897415, 0.098780, 0.344485, -0.257330 - 0.897415, 0.098780, 0.344485, -0.257330 - 0.897415, 0.098780, 0.344485, -0.257330 - 0.897415, 0.098780, 0.344485, -0.257330 - 0.897415, 0.098780, 0.344485, -0.257330 - 0.897415, 0.098780, 0.344485, -0.257330 - 0.897415, 0.098780, 0.344485, -0.257330 - 0.897415, 0.098780, 0.344485, -0.257330 - 0.897415, 0.098780, 0.344485, -0.257330 - 0.897415, 0.098780, 0.344485, -0.257330 - 0.897415, 0.098780, 0.344485, -0.257330 - 0.897415, 0.098780, 0.344485, -0.257330 - 0.897415, 0.098780, 0.344485, -0.257330 - 0.897415, 0.098780, 0.344485, -0.257330 - 0.897415, 0.098780, 0.344485, -0.257330 - 0.897415, 0.098780, 0.344485, -0.257330 - 0.897415, 0.098780, 0.344485, -0.257330 - 0.897415, 0.098780, 0.344485, -0.257330 - 0.897415, 0.098780, 0.344485, -0.257330 - 0.897415, 0.098780, 0.344485, -0.257330 - 0.897415, 0.098780, 0.344485, -0.257330 - 0.897415, 0.098780, 0.344485, -0.257330 diff --git a/scripts/trajectories/const000-Vector3.csv b/scripts/trajectories/const000-Vector3.csv deleted file mode 100644 index f47ae12e5d..0000000000 --- a/scripts/trajectories/const000-Vector3.csv +++ /dev/null @@ -1,4 +0,0 @@ -0.0, 0.0, 0.0, 1.0, 0.0, 0.0 -0.0, 0.0, 0.0, 1.0, 0.0, 0.0 -0.0, 0.0, 0.0, 1.0, 0.0, 0.0 -0.0, 0.0, 0.0, 1.0, 0.0, 0.0 diff --git a/scripts/trajectories/full-circle-4s-Vector3.csv b/scripts/trajectories/full-circle-4s-Vector3.csv deleted file mode 100644 index 38a3505239..0000000000 --- a/scripts/trajectories/full-circle-4s-Vector3.csv +++ /dev/null @@ -1,200 +0,0 @@ -0.0000,0.0000,0.0000,0.9995,-0.0314,0.0000 -0.0000,0.0000,0.0000,0.9980,-0.0628,0.0000 -0.0000,0.0000,0.0000,0.9956,-0.0941,0.0000 -0.0000,0.0000,0.0000,0.9921,-0.1253,0.0000 -0.0000,0.0000,0.0000,0.9877,-0.1564,0.0000 -0.0000,0.0000,0.0000,0.9823,-0.1874,0.0000 -0.0000,0.0000,0.0000,0.9759,-0.2181,0.0000 -0.0000,0.0000,0.0000,0.9686,-0.2487,0.0000 -0.0000,0.0000,0.0000,0.9603,-0.2790,0.0000 -0.0000,0.0000,0.0000,0.9511,-0.3090,0.0000 -0.0000,0.0000,0.0000,0.9409,-0.3387,0.0000 -0.0000,0.0000,0.0000,0.9298,-0.3681,0.0000 -0.0000,0.0000,0.0000,0.9178,-0.3971,0.0000 -0.0000,0.0000,0.0000,0.9048,-0.4258,0.0000 -0.0000,0.0000,0.0000,0.8910,-0.4540,0.0000 -0.0000,0.0000,0.0000,0.8763,-0.4818,0.0000 -0.0000,0.0000,0.0000,0.8607,-0.5090,0.0000 -0.0000,0.0000,0.0000,0.8443,-0.5358,0.0000 -0.0000,0.0000,0.0000,0.8271,-0.5621,0.0000 -0.0000,0.0000,0.0000,0.8090,-0.5878,0.0000 -0.0000,0.0000,0.0000,0.7902,-0.6129,0.0000 -0.0000,0.0000,0.0000,0.7705,-0.6374,0.0000 -0.0000,0.0000,0.0000,0.7501,-0.6613,0.0000 -0.0000,0.0000,0.0000,0.7290,-0.6845,0.0000 -0.0000,0.0000,0.0000,0.7071,-0.7071,0.0000 -0.0000,0.0000,0.0000,0.6845,-0.7290,0.0000 -0.0000,0.0000,0.0000,0.6613,-0.7501,0.0000 -0.0000,0.0000,0.0000,0.6374,-0.7705,0.0000 -0.0000,0.0000,0.0000,0.6129,-0.7902,0.0000 -0.0000,0.0000,0.0000,0.5878,-0.8090,0.0000 -0.0000,0.0000,0.0000,0.5621,-0.8271,0.0000 -0.0000,0.0000,0.0000,0.5358,-0.8443,0.0000 -0.0000,0.0000,0.0000,0.5090,-0.8607,0.0000 -0.0000,0.0000,0.0000,0.4818,-0.8763,0.0000 -0.0000,0.0000,0.0000,0.4540,-0.8910,0.0000 -0.0000,0.0000,0.0000,0.4258,-0.9048,0.0000 -0.0000,0.0000,0.0000,0.3971,-0.9178,0.0000 -0.0000,0.0000,0.0000,0.3681,-0.9298,0.0000 -0.0000,0.0000,0.0000,0.3387,-0.9409,0.0000 -0.0000,0.0000,0.0000,0.3090,-0.9511,0.0000 -0.0000,0.0000,0.0000,0.2790,-0.9603,0.0000 -0.0000,0.0000,0.0000,0.2487,-0.9686,0.0000 -0.0000,0.0000,0.0000,0.2181,-0.9759,0.0000 -0.0000,0.0000,0.0000,0.1874,-0.9823,0.0000 -0.0000,0.0000,0.0000,0.1564,-0.9877,0.0000 -0.0000,0.0000,0.0000,0.1253,-0.9921,0.0000 -0.0000,0.0000,0.0000,0.0941,-0.9956,0.0000 -0.0000,0.0000,0.0000,0.0628,-0.9980,0.0000 -0.0000,0.0000,0.0000,0.0314,-0.9995,0.0000 -0.0000,0.0000,0.0000,-0.0000,-1.0000,0.0000 -0.0000,0.0000,0.0000,-0.0314,-0.9995,0.0000 -0.0000,0.0000,0.0000,-0.0628,-0.9980,0.0000 -0.0000,0.0000,0.0000,-0.0941,-0.9956,0.0000 -0.0000,0.0000,0.0000,-0.1253,-0.9921,0.0000 -0.0000,0.0000,0.0000,-0.1564,-0.9877,0.0000 -0.0000,0.0000,0.0000,-0.1874,-0.9823,0.0000 -0.0000,0.0000,0.0000,-0.2181,-0.9759,0.0000 -0.0000,0.0000,0.0000,-0.2487,-0.9686,0.0000 -0.0000,0.0000,0.0000,-0.2790,-0.9603,0.0000 -0.0000,0.0000,0.0000,-0.3090,-0.9511,0.0000 -0.0000,0.0000,0.0000,-0.3387,-0.9409,0.0000 -0.0000,0.0000,0.0000,-0.3681,-0.9298,0.0000 -0.0000,0.0000,0.0000,-0.3971,-0.9178,0.0000 -0.0000,0.0000,0.0000,-0.4258,-0.9048,0.0000 -0.0000,0.0000,0.0000,-0.4540,-0.8910,0.0000 -0.0000,0.0000,0.0000,-0.4818,-0.8763,0.0000 -0.0000,0.0000,0.0000,-0.5090,-0.8607,0.0000 -0.0000,0.0000,0.0000,-0.5358,-0.8443,0.0000 -0.0000,0.0000,0.0000,-0.5621,-0.8271,0.0000 -0.0000,0.0000,0.0000,-0.5878,-0.8090,0.0000 -0.0000,0.0000,0.0000,-0.6129,-0.7902,0.0000 -0.0000,0.0000,0.0000,-0.6374,-0.7705,0.0000 -0.0000,0.0000,0.0000,-0.6613,-0.7501,0.0000 -0.0000,0.0000,0.0000,-0.6845,-0.7290,0.0000 -0.0000,0.0000,0.0000,-0.7071,-0.7071,0.0000 -0.0000,0.0000,0.0000,-0.7290,-0.6845,0.0000 -0.0000,0.0000,0.0000,-0.7501,-0.6613,0.0000 -0.0000,0.0000,0.0000,-0.7705,-0.6374,0.0000 -0.0000,0.0000,0.0000,-0.7902,-0.6129,0.0000 -0.0000,0.0000,0.0000,-0.8090,-0.5878,0.0000 -0.0000,0.0000,0.0000,-0.8271,-0.5621,0.0000 -0.0000,0.0000,0.0000,-0.8443,-0.5358,0.0000 -0.0000,0.0000,0.0000,-0.8607,-0.5090,0.0000 -0.0000,0.0000,0.0000,-0.8763,-0.4818,0.0000 -0.0000,0.0000,0.0000,-0.8910,-0.4540,0.0000 -0.0000,0.0000,0.0000,-0.9048,-0.4258,0.0000 -0.0000,0.0000,0.0000,-0.9178,-0.3971,0.0000 -0.0000,0.0000,0.0000,-0.9298,-0.3681,0.0000 -0.0000,0.0000,0.0000,-0.9409,-0.3387,0.0000 -0.0000,0.0000,0.0000,-0.9511,-0.3090,0.0000 -0.0000,0.0000,0.0000,-0.9603,-0.2790,0.0000 -0.0000,0.0000,0.0000,-0.9686,-0.2487,0.0000 -0.0000,0.0000,0.0000,-0.9759,-0.2181,0.0000 -0.0000,0.0000,0.0000,-0.9823,-0.1874,0.0000 -0.0000,0.0000,0.0000,-0.9877,-0.1564,0.0000 -0.0000,0.0000,0.0000,-0.9921,-0.1253,0.0000 -0.0000,0.0000,0.0000,-0.9956,-0.0941,0.0000 -0.0000,0.0000,0.0000,-0.9980,-0.0628,0.0000 -0.0000,0.0000,0.0000,-0.9995,-0.0314,0.0000 -0.0000,0.0000,0.0000,-1.0000,0.0000,0.0000 -0.0000,0.0000,0.0000,-0.9995,0.0314,0.0000 -0.0000,0.0000,0.0000,-0.9980,0.0628,0.0000 -0.0000,0.0000,0.0000,-0.9956,0.0941,0.0000 -0.0000,0.0000,0.0000,-0.9921,0.1253,0.0000 -0.0000,0.0000,0.0000,-0.9877,0.1564,0.0000 -0.0000,0.0000,0.0000,-0.9823,0.1874,0.0000 -0.0000,0.0000,0.0000,-0.9759,0.2181,0.0000 -0.0000,0.0000,0.0000,-0.9686,0.2487,0.0000 -0.0000,0.0000,0.0000,-0.9603,0.2790,0.0000 -0.0000,0.0000,0.0000,-0.9511,0.3090,0.0000 -0.0000,0.0000,0.0000,-0.9409,0.3387,0.0000 -0.0000,0.0000,0.0000,-0.9298,0.3681,0.0000 -0.0000,0.0000,0.0000,-0.9178,0.3971,0.0000 -0.0000,0.0000,0.0000,-0.9048,0.4258,0.0000 -0.0000,0.0000,0.0000,-0.8910,0.4540,0.0000 -0.0000,0.0000,0.0000,-0.8763,0.4818,0.0000 -0.0000,0.0000,0.0000,-0.8607,0.5090,0.0000 -0.0000,0.0000,0.0000,-0.8443,0.5358,0.0000 -0.0000,0.0000,0.0000,-0.8271,0.5621,0.0000 -0.0000,0.0000,0.0000,-0.8090,0.5878,0.0000 -0.0000,0.0000,0.0000,-0.7902,0.6129,0.0000 -0.0000,0.0000,0.0000,-0.7705,0.6374,0.0000 -0.0000,0.0000,0.0000,-0.7501,0.6613,0.0000 -0.0000,0.0000,0.0000,-0.7290,0.6845,0.0000 -0.0000,0.0000,0.0000,-0.7071,0.7071,0.0000 -0.0000,0.0000,0.0000,-0.6845,0.7290,0.0000 -0.0000,0.0000,0.0000,-0.6613,0.7501,0.0000 -0.0000,0.0000,0.0000,-0.6374,0.7705,0.0000 -0.0000,0.0000,0.0000,-0.6129,0.7902,0.0000 -0.0000,0.0000,0.0000,-0.5878,0.8090,0.0000 -0.0000,0.0000,0.0000,-0.5621,0.8271,0.0000 -0.0000,0.0000,0.0000,-0.5358,0.8443,0.0000 -0.0000,0.0000,0.0000,-0.5090,0.8607,0.0000 -0.0000,0.0000,0.0000,-0.4818,0.8763,0.0000 -0.0000,0.0000,0.0000,-0.4540,0.8910,0.0000 -0.0000,0.0000,0.0000,-0.4258,0.9048,0.0000 -0.0000,0.0000,0.0000,-0.3971,0.9178,0.0000 -0.0000,0.0000,0.0000,-0.3681,0.9298,0.0000 -0.0000,0.0000,0.0000,-0.3387,0.9409,0.0000 -0.0000,0.0000,0.0000,-0.3090,0.9511,0.0000 -0.0000,0.0000,0.0000,-0.2790,0.9603,0.0000 -0.0000,0.0000,0.0000,-0.2487,0.9686,0.0000 -0.0000,0.0000,0.0000,-0.2181,0.9759,0.0000 -0.0000,0.0000,0.0000,-0.1874,0.9823,0.0000 -0.0000,0.0000,0.0000,-0.1564,0.9877,0.0000 -0.0000,0.0000,0.0000,-0.1253,0.9921,0.0000 -0.0000,0.0000,0.0000,-0.0941,0.9956,0.0000 -0.0000,0.0000,0.0000,-0.0628,0.9980,0.0000 -0.0000,0.0000,0.0000,-0.0314,0.9995,0.0000 -0.0000,0.0000,0.0000,0.0000,1.0000,0.0000 -0.0000,0.0000,0.0000,0.0314,0.9995,0.0000 -0.0000,0.0000,0.0000,0.0628,0.9980,0.0000 -0.0000,0.0000,0.0000,0.0941,0.9956,0.0000 -0.0000,0.0000,0.0000,0.1253,0.9921,0.0000 -0.0000,0.0000,0.0000,0.1564,0.9877,0.0000 -0.0000,0.0000,0.0000,0.1874,0.9823,0.0000 -0.0000,0.0000,0.0000,0.2181,0.9759,0.0000 -0.0000,0.0000,0.0000,0.2487,0.9686,0.0000 -0.0000,0.0000,0.0000,0.2790,0.9603,0.0000 -0.0000,0.0000,0.0000,0.3090,0.9511,0.0000 -0.0000,0.0000,0.0000,0.3387,0.9409,0.0000 -0.0000,0.0000,0.0000,0.3681,0.9298,0.0000 -0.0000,0.0000,0.0000,0.3971,0.9178,0.0000 -0.0000,0.0000,0.0000,0.4258,0.9048,0.0000 -0.0000,0.0000,0.0000,0.4540,0.8910,0.0000 -0.0000,0.0000,0.0000,0.4818,0.8763,0.0000 -0.0000,0.0000,0.0000,0.5090,0.8607,0.0000 -0.0000,0.0000,0.0000,0.5358,0.8443,0.0000 -0.0000,0.0000,0.0000,0.5621,0.8271,0.0000 -0.0000,0.0000,0.0000,0.5878,0.8090,0.0000 -0.0000,0.0000,0.0000,0.6129,0.7902,0.0000 -0.0000,0.0000,0.0000,0.6374,0.7705,0.0000 -0.0000,0.0000,0.0000,0.6613,0.7501,0.0000 -0.0000,0.0000,0.0000,0.6845,0.7290,0.0000 -0.0000,0.0000,0.0000,0.7071,0.7071,0.0000 -0.0000,0.0000,0.0000,0.7290,0.6845,0.0000 -0.0000,0.0000,0.0000,0.7501,0.6613,0.0000 -0.0000,0.0000,0.0000,0.7705,0.6374,0.0000 -0.0000,0.0000,0.0000,0.7902,0.6129,0.0000 -0.0000,0.0000,0.0000,0.8090,0.5878,0.0000 -0.0000,0.0000,0.0000,0.8271,0.5621,0.0000 -0.0000,0.0000,0.0000,0.8443,0.5358,0.0000 -0.0000,0.0000,0.0000,0.8607,0.5090,0.0000 -0.0000,0.0000,0.0000,0.8763,0.4818,0.0000 -0.0000,0.0000,0.0000,0.8910,0.4540,0.0000 -0.0000,0.0000,0.0000,0.9048,0.4258,0.0000 -0.0000,0.0000,0.0000,0.9178,0.3971,0.0000 -0.0000,0.0000,0.0000,0.9298,0.3681,0.0000 -0.0000,0.0000,0.0000,0.9409,0.3387,0.0000 -0.0000,0.0000,0.0000,0.9511,0.3090,0.0000 -0.0000,0.0000,0.0000,0.9603,0.2790,0.0000 -0.0000,0.0000,0.0000,0.9686,0.2487,0.0000 -0.0000,0.0000,0.0000,0.9759,0.2181,0.0000 -0.0000,0.0000,0.0000,0.9823,0.1874,0.0000 -0.0000,0.0000,0.0000,0.9877,0.1564,0.0000 -0.0000,0.0000,0.0000,0.9921,0.1253,0.0000 -0.0000,0.0000,0.0000,0.9956,0.0941,0.0000 -0.0000,0.0000,0.0000,0.9980,0.0628,0.0000 -0.0000,0.0000,0.0000,0.9995,0.0314,0.0000 -0.0000,0.0000,0.0000,1.0000,-0.0000,0.0000 diff --git a/scripts/trajectories/full-circle-4s-ccw-Vector3.csv b/scripts/trajectories/full-circle-4s-ccw-Vector3.csv deleted file mode 100644 index 37b2904ea4..0000000000 --- a/scripts/trajectories/full-circle-4s-ccw-Vector3.csv +++ /dev/null @@ -1,200 +0,0 @@ -0.0000,0.0000,0.0000,0.9995,0.0314,0.0000 -0.0000,0.0000,0.0000,0.9980,0.0628,0.0000 -0.0000,0.0000,0.0000,0.9956,0.0941,0.0000 -0.0000,0.0000,0.0000,0.9921,0.1253,0.0000 -0.0000,0.0000,0.0000,0.9877,0.1564,0.0000 -0.0000,0.0000,0.0000,0.9823,0.1874,0.0000 -0.0000,0.0000,0.0000,0.9759,0.2181,0.0000 -0.0000,0.0000,0.0000,0.9686,0.2487,0.0000 -0.0000,0.0000,0.0000,0.9603,0.2790,0.0000 -0.0000,0.0000,0.0000,0.9511,0.3090,0.0000 -0.0000,0.0000,0.0000,0.9409,0.3387,0.0000 -0.0000,0.0000,0.0000,0.9298,0.3681,0.0000 -0.0000,0.0000,0.0000,0.9178,0.3971,0.0000 -0.0000,0.0000,0.0000,0.9048,0.4258,0.0000 -0.0000,0.0000,0.0000,0.8910,0.4540,0.0000 -0.0000,0.0000,0.0000,0.8763,0.4818,0.0000 -0.0000,0.0000,0.0000,0.8607,0.5090,0.0000 -0.0000,0.0000,0.0000,0.8443,0.5358,0.0000 -0.0000,0.0000,0.0000,0.8271,0.5621,0.0000 -0.0000,0.0000,0.0000,0.8090,0.5878,0.0000 -0.0000,0.0000,0.0000,0.7902,0.6129,0.0000 -0.0000,0.0000,0.0000,0.7705,0.6374,0.0000 -0.0000,0.0000,0.0000,0.7501,0.6613,0.0000 -0.0000,0.0000,0.0000,0.7290,0.6845,0.0000 -0.0000,0.0000,0.0000,0.7071,0.7071,0.0000 -0.0000,0.0000,0.0000,0.6845,0.7290,0.0000 -0.0000,0.0000,0.0000,0.6613,0.7501,0.0000 -0.0000,0.0000,0.0000,0.6374,0.7705,0.0000 -0.0000,0.0000,0.0000,0.6129,0.7902,0.0000 -0.0000,0.0000,0.0000,0.5878,0.8090,0.0000 -0.0000,0.0000,0.0000,0.5621,0.8271,0.0000 -0.0000,0.0000,0.0000,0.5358,0.8443,0.0000 -0.0000,0.0000,0.0000,0.5090,0.8607,0.0000 -0.0000,0.0000,0.0000,0.4818,0.8763,0.0000 -0.0000,0.0000,0.0000,0.4540,0.8910,0.0000 -0.0000,0.0000,0.0000,0.4258,0.9048,0.0000 -0.0000,0.0000,0.0000,0.3971,0.9178,0.0000 -0.0000,0.0000,0.0000,0.3681,0.9298,0.0000 -0.0000,0.0000,0.0000,0.3387,0.9409,0.0000 -0.0000,0.0000,0.0000,0.3090,0.9511,0.0000 -0.0000,0.0000,0.0000,0.2790,0.9603,0.0000 -0.0000,0.0000,0.0000,0.2487,0.9686,0.0000 -0.0000,0.0000,0.0000,0.2181,0.9759,0.0000 -0.0000,0.0000,0.0000,0.1874,0.9823,0.0000 -0.0000,0.0000,0.0000,0.1564,0.9877,0.0000 -0.0000,0.0000,0.0000,0.1253,0.9921,0.0000 -0.0000,0.0000,0.0000,0.0941,0.9956,0.0000 -0.0000,0.0000,0.0000,0.0628,0.9980,0.0000 -0.0000,0.0000,0.0000,0.0314,0.9995,0.0000 -0.0000,0.0000,0.0000,-0.0000,1.0000,0.0000 -0.0000,0.0000,0.0000,-0.0314,0.9995,0.0000 -0.0000,0.0000,0.0000,-0.0628,0.9980,0.0000 -0.0000,0.0000,0.0000,-0.0941,0.9956,0.0000 -0.0000,0.0000,0.0000,-0.1253,0.9921,0.0000 -0.0000,0.0000,0.0000,-0.1564,0.9877,0.0000 -0.0000,0.0000,0.0000,-0.1874,0.9823,0.0000 -0.0000,0.0000,0.0000,-0.2181,0.9759,0.0000 -0.0000,0.0000,0.0000,-0.2487,0.9686,0.0000 -0.0000,0.0000,0.0000,-0.2790,0.9603,0.0000 -0.0000,0.0000,0.0000,-0.3090,0.9511,0.0000 -0.0000,0.0000,0.0000,-0.3387,0.9409,0.0000 -0.0000,0.0000,0.0000,-0.3681,0.9298,0.0000 -0.0000,0.0000,0.0000,-0.3971,0.9178,0.0000 -0.0000,0.0000,0.0000,-0.4258,0.9048,0.0000 -0.0000,0.0000,0.0000,-0.4540,0.8910,0.0000 -0.0000,0.0000,0.0000,-0.4818,0.8763,0.0000 -0.0000,0.0000,0.0000,-0.5090,0.8607,0.0000 -0.0000,0.0000,0.0000,-0.5358,0.8443,0.0000 -0.0000,0.0000,0.0000,-0.5621,0.8271,0.0000 -0.0000,0.0000,0.0000,-0.5878,0.8090,0.0000 -0.0000,0.0000,0.0000,-0.6129,0.7902,0.0000 -0.0000,0.0000,0.0000,-0.6374,0.7705,0.0000 -0.0000,0.0000,0.0000,-0.6613,0.7501,0.0000 -0.0000,0.0000,0.0000,-0.6845,0.7290,0.0000 -0.0000,0.0000,0.0000,-0.7071,0.7071,0.0000 -0.0000,0.0000,0.0000,-0.7290,0.6845,0.0000 -0.0000,0.0000,0.0000,-0.7501,0.6613,0.0000 -0.0000,0.0000,0.0000,-0.7705,0.6374,0.0000 -0.0000,0.0000,0.0000,-0.7902,0.6129,0.0000 -0.0000,0.0000,0.0000,-0.8090,0.5878,0.0000 -0.0000,0.0000,0.0000,-0.8271,0.5621,0.0000 -0.0000,0.0000,0.0000,-0.8443,0.5358,0.0000 -0.0000,0.0000,0.0000,-0.8607,0.5090,0.0000 -0.0000,0.0000,0.0000,-0.8763,0.4818,0.0000 -0.0000,0.0000,0.0000,-0.8910,0.4540,0.0000 -0.0000,0.0000,0.0000,-0.9048,0.4258,0.0000 -0.0000,0.0000,0.0000,-0.9178,0.3971,0.0000 -0.0000,0.0000,0.0000,-0.9298,0.3681,0.0000 -0.0000,0.0000,0.0000,-0.9409,0.3387,0.0000 -0.0000,0.0000,0.0000,-0.9511,0.3090,0.0000 -0.0000,0.0000,0.0000,-0.9603,0.2790,0.0000 -0.0000,0.0000,0.0000,-0.9686,0.2487,0.0000 -0.0000,0.0000,0.0000,-0.9759,0.2181,0.0000 -0.0000,0.0000,0.0000,-0.9823,0.1874,0.0000 -0.0000,0.0000,0.0000,-0.9877,0.1564,0.0000 -0.0000,0.0000,0.0000,-0.9921,0.1253,0.0000 -0.0000,0.0000,0.0000,-0.9956,0.0941,0.0000 -0.0000,0.0000,0.0000,-0.9980,0.0628,0.0000 -0.0000,0.0000,0.0000,-0.9995,0.0314,0.0000 -0.0000,0.0000,0.0000,-1.0000,-0.0000,0.0000 -0.0000,0.0000,0.0000,-0.9995,-0.0314,0.0000 -0.0000,0.0000,0.0000,-0.9980,-0.0628,0.0000 -0.0000,0.0000,0.0000,-0.9956,-0.0941,0.0000 -0.0000,0.0000,0.0000,-0.9921,-0.1253,0.0000 -0.0000,0.0000,0.0000,-0.9877,-0.1564,0.0000 -0.0000,0.0000,0.0000,-0.9823,-0.1874,0.0000 -0.0000,0.0000,0.0000,-0.9759,-0.2181,0.0000 -0.0000,0.0000,0.0000,-0.9686,-0.2487,0.0000 -0.0000,0.0000,0.0000,-0.9603,-0.2790,0.0000 -0.0000,0.0000,0.0000,-0.9511,-0.3090,0.0000 -0.0000,0.0000,0.0000,-0.9409,-0.3387,0.0000 -0.0000,0.0000,0.0000,-0.9298,-0.3681,0.0000 -0.0000,0.0000,0.0000,-0.9178,-0.3971,0.0000 -0.0000,0.0000,0.0000,-0.9048,-0.4258,0.0000 -0.0000,0.0000,0.0000,-0.8910,-0.4540,0.0000 -0.0000,0.0000,0.0000,-0.8763,-0.4818,0.0000 -0.0000,0.0000,0.0000,-0.8607,-0.5090,0.0000 -0.0000,0.0000,0.0000,-0.8443,-0.5358,0.0000 -0.0000,0.0000,0.0000,-0.8271,-0.5621,0.0000 -0.0000,0.0000,0.0000,-0.8090,-0.5878,0.0000 -0.0000,0.0000,0.0000,-0.7902,-0.6129,0.0000 -0.0000,0.0000,0.0000,-0.7705,-0.6374,0.0000 -0.0000,0.0000,0.0000,-0.7501,-0.6613,0.0000 -0.0000,0.0000,0.0000,-0.7290,-0.6845,0.0000 -0.0000,0.0000,0.0000,-0.7071,-0.7071,0.0000 -0.0000,0.0000,0.0000,-0.6845,-0.7290,0.0000 -0.0000,0.0000,0.0000,-0.6613,-0.7501,0.0000 -0.0000,0.0000,0.0000,-0.6374,-0.7705,0.0000 -0.0000,0.0000,0.0000,-0.6129,-0.7902,0.0000 -0.0000,0.0000,0.0000,-0.5878,-0.8090,0.0000 -0.0000,0.0000,0.0000,-0.5621,-0.8271,0.0000 -0.0000,0.0000,0.0000,-0.5358,-0.8443,0.0000 -0.0000,0.0000,0.0000,-0.5090,-0.8607,0.0000 -0.0000,0.0000,0.0000,-0.4818,-0.8763,0.0000 -0.0000,0.0000,0.0000,-0.4540,-0.8910,0.0000 -0.0000,0.0000,0.0000,-0.4258,-0.9048,0.0000 -0.0000,0.0000,0.0000,-0.3971,-0.9178,0.0000 -0.0000,0.0000,0.0000,-0.3681,-0.9298,0.0000 -0.0000,0.0000,0.0000,-0.3387,-0.9409,0.0000 -0.0000,0.0000,0.0000,-0.3090,-0.9511,0.0000 -0.0000,0.0000,0.0000,-0.2790,-0.9603,0.0000 -0.0000,0.0000,0.0000,-0.2487,-0.9686,0.0000 -0.0000,0.0000,0.0000,-0.2181,-0.9759,0.0000 -0.0000,0.0000,0.0000,-0.1874,-0.9823,0.0000 -0.0000,0.0000,0.0000,-0.1564,-0.9877,0.0000 -0.0000,0.0000,0.0000,-0.1253,-0.9921,0.0000 -0.0000,0.0000,0.0000,-0.0941,-0.9956,0.0000 -0.0000,0.0000,0.0000,-0.0628,-0.9980,0.0000 -0.0000,0.0000,0.0000,-0.0314,-0.9995,0.0000 -0.0000,0.0000,0.0000,0.0000,-1.0000,0.0000 -0.0000,0.0000,0.0000,0.0314,-0.9995,0.0000 -0.0000,0.0000,0.0000,0.0628,-0.9980,0.0000 -0.0000,0.0000,0.0000,0.0941,-0.9956,0.0000 -0.0000,0.0000,0.0000,0.1253,-0.9921,0.0000 -0.0000,0.0000,0.0000,0.1564,-0.9877,0.0000 -0.0000,0.0000,0.0000,0.1874,-0.9823,0.0000 -0.0000,0.0000,0.0000,0.2181,-0.9759,0.0000 -0.0000,0.0000,0.0000,0.2487,-0.9686,0.0000 -0.0000,0.0000,0.0000,0.2790,-0.9603,0.0000 -0.0000,0.0000,0.0000,0.3090,-0.9511,0.0000 -0.0000,0.0000,0.0000,0.3387,-0.9409,0.0000 -0.0000,0.0000,0.0000,0.3681,-0.9298,0.0000 -0.0000,0.0000,0.0000,0.3971,-0.9178,0.0000 -0.0000,0.0000,0.0000,0.4258,-0.9048,0.0000 -0.0000,0.0000,0.0000,0.4540,-0.8910,0.0000 -0.0000,0.0000,0.0000,0.4818,-0.8763,0.0000 -0.0000,0.0000,0.0000,0.5090,-0.8607,0.0000 -0.0000,0.0000,0.0000,0.5358,-0.8443,0.0000 -0.0000,0.0000,0.0000,0.5621,-0.8271,0.0000 -0.0000,0.0000,0.0000,0.5878,-0.8090,0.0000 -0.0000,0.0000,0.0000,0.6129,-0.7902,0.0000 -0.0000,0.0000,0.0000,0.6374,-0.7705,0.0000 -0.0000,0.0000,0.0000,0.6613,-0.7501,0.0000 -0.0000,0.0000,0.0000,0.6845,-0.7290,0.0000 -0.0000,0.0000,0.0000,0.7071,-0.7071,0.0000 -0.0000,0.0000,0.0000,0.7290,-0.6845,0.0000 -0.0000,0.0000,0.0000,0.7501,-0.6613,0.0000 -0.0000,0.0000,0.0000,0.7705,-0.6374,0.0000 -0.0000,0.0000,0.0000,0.7902,-0.6129,0.0000 -0.0000,0.0000,0.0000,0.8090,-0.5878,0.0000 -0.0000,0.0000,0.0000,0.8271,-0.5621,0.0000 -0.0000,0.0000,0.0000,0.8443,-0.5358,0.0000 -0.0000,0.0000,0.0000,0.8607,-0.5090,0.0000 -0.0000,0.0000,0.0000,0.8763,-0.4818,0.0000 -0.0000,0.0000,0.0000,0.8910,-0.4540,0.0000 -0.0000,0.0000,0.0000,0.9048,-0.4258,0.0000 -0.0000,0.0000,0.0000,0.9178,-0.3971,0.0000 -0.0000,0.0000,0.0000,0.9298,-0.3681,0.0000 -0.0000,0.0000,0.0000,0.9409,-0.3387,0.0000 -0.0000,0.0000,0.0000,0.9511,-0.3090,0.0000 -0.0000,0.0000,0.0000,0.9603,-0.2790,0.0000 -0.0000,0.0000,0.0000,0.9686,-0.2487,0.0000 -0.0000,0.0000,0.0000,0.9759,-0.2181,0.0000 -0.0000,0.0000,0.0000,0.9823,-0.1874,0.0000 -0.0000,0.0000,0.0000,0.9877,-0.1564,0.0000 -0.0000,0.0000,0.0000,0.9921,-0.1253,0.0000 -0.0000,0.0000,0.0000,0.9956,-0.0941,0.0000 -0.0000,0.0000,0.0000,0.9980,-0.0628,0.0000 -0.0000,0.0000,0.0000,0.9995,-0.0314,0.0000 -0.0000,0.0000,0.0000,1.0000,0.0000,0.0000 diff --git a/scripts/trajectories/full-circle-4s-ccw.csv b/scripts/trajectories/full-circle-4s-ccw.csv deleted file mode 100644 index 13eeae28e1..0000000000 --- a/scripts/trajectories/full-circle-4s-ccw.csv +++ /dev/null @@ -1,800 +0,0 @@ -0.9999,0.0000,0.0000,0.0157 -0.9999,0.0000,0.0000,0.0157 -0.9999,0.0000,0.0000,0.0157 -0.9999,0.0000,0.0000,0.0157 -0.9995,0.0000,0.0000,0.0314 -0.9995,0.0000,0.0000,0.0314 -0.9995,0.0000,0.0000,0.0314 -0.9995,0.0000,0.0000,0.0314 -0.9989,0.0000,0.0000,0.0471 -0.9989,0.0000,0.0000,0.0471 -0.9989,0.0000,0.0000,0.0471 -0.9989,0.0000,0.0000,0.0471 -0.9980,0.0000,0.0000,0.0628 -0.9980,0.0000,0.0000,0.0628 -0.9980,0.0000,0.0000,0.0628 -0.9980,0.0000,0.0000,0.0628 -0.9969,0.0000,0.0000,0.0785 -0.9969,0.0000,0.0000,0.0785 -0.9969,0.0000,0.0000,0.0785 -0.9969,0.0000,0.0000,0.0785 -0.9956,0.0000,0.0000,0.0941 -0.9956,0.0000,0.0000,0.0941 -0.9956,0.0000,0.0000,0.0941 -0.9956,0.0000,0.0000,0.0941 -0.9940,0.0000,0.0000,0.1097 -0.9940,0.0000,0.0000,0.1097 -0.9940,0.0000,0.0000,0.1097 -0.9940,0.0000,0.0000,0.1097 -0.9921,0.0000,0.0000,0.1253 -0.9921,0.0000,0.0000,0.1253 -0.9921,0.0000,0.0000,0.1253 -0.9921,0.0000,0.0000,0.1253 -0.9900,0.0000,0.0000,0.1409 -0.9900,0.0000,0.0000,0.1409 -0.9900,0.0000,0.0000,0.1409 -0.9900,0.0000,0.0000,0.1409 -0.9877,0.0000,0.0000,0.1564 -0.9877,0.0000,0.0000,0.1564 -0.9877,0.0000,0.0000,0.1564 -0.9877,0.0000,0.0000,0.1564 -0.9851,0.0000,0.0000,0.1719 -0.9851,0.0000,0.0000,0.1719 -0.9851,0.0000,0.0000,0.1719 -0.9851,0.0000,0.0000,0.1719 -0.9823,0.0000,0.0000,0.1874 -0.9823,0.0000,0.0000,0.1874 -0.9823,0.0000,0.0000,0.1874 -0.9823,0.0000,0.0000,0.1874 -0.9792,0.0000,0.0000,0.2028 -0.9792,0.0000,0.0000,0.2028 -0.9792,0.0000,0.0000,0.2028 -0.9792,0.0000,0.0000,0.2028 -0.9759,0.0000,0.0000,0.2181 -0.9759,0.0000,0.0000,0.2181 -0.9759,0.0000,0.0000,0.2181 -0.9759,0.0000,0.0000,0.2181 -0.9724,0.0000,0.0000,0.2334 -0.9724,0.0000,0.0000,0.2334 -0.9724,0.0000,0.0000,0.2334 -0.9724,0.0000,0.0000,0.2334 -0.9686,0.0000,0.0000,0.2487 -0.9686,0.0000,0.0000,0.2487 -0.9686,0.0000,0.0000,0.2487 -0.9686,0.0000,0.0000,0.2487 -0.9646,0.0000,0.0000,0.2639 -0.9646,0.0000,0.0000,0.2639 -0.9646,0.0000,0.0000,0.2639 -0.9646,0.0000,0.0000,0.2639 -0.9603,0.0000,0.0000,0.2790 -0.9603,0.0000,0.0000,0.2790 -0.9603,0.0000,0.0000,0.2790 -0.9603,0.0000,0.0000,0.2790 -0.9558,0.0000,0.0000,0.2940 -0.9558,0.0000,0.0000,0.2940 -0.9558,0.0000,0.0000,0.2940 -0.9558,0.0000,0.0000,0.2940 -0.9511,0.0000,0.0000,0.3090 -0.9511,0.0000,0.0000,0.3090 -0.9511,0.0000,0.0000,0.3090 -0.9511,0.0000,0.0000,0.3090 -0.9461,0.0000,0.0000,0.3239 -0.9461,0.0000,0.0000,0.3239 -0.9461,0.0000,0.0000,0.3239 -0.9461,0.0000,0.0000,0.3239 -0.9409,0.0000,0.0000,0.3387 -0.9409,0.0000,0.0000,0.3387 -0.9409,0.0000,0.0000,0.3387 -0.9409,0.0000,0.0000,0.3387 -0.9354,0.0000,0.0000,0.3535 -0.9354,0.0000,0.0000,0.3535 -0.9354,0.0000,0.0000,0.3535 -0.9354,0.0000,0.0000,0.3535 -0.9298,0.0000,0.0000,0.3681 -0.9298,0.0000,0.0000,0.3681 -0.9298,0.0000,0.0000,0.3681 -0.9298,0.0000,0.0000,0.3681 -0.9239,0.0000,0.0000,0.3827 -0.9239,0.0000,0.0000,0.3827 -0.9239,0.0000,0.0000,0.3827 -0.9239,0.0000,0.0000,0.3827 -0.9178,0.0000,0.0000,0.3971 -0.9178,0.0000,0.0000,0.3971 -0.9178,0.0000,0.0000,0.3971 -0.9178,0.0000,0.0000,0.3971 -0.9114,0.0000,0.0000,0.4115 -0.9114,0.0000,0.0000,0.4115 -0.9114,0.0000,0.0000,0.4115 -0.9114,0.0000,0.0000,0.4115 -0.9048,0.0000,0.0000,0.4258 -0.9048,0.0000,0.0000,0.4258 -0.9048,0.0000,0.0000,0.4258 -0.9048,0.0000,0.0000,0.4258 -0.8980,0.0000,0.0000,0.4399 -0.8980,0.0000,0.0000,0.4399 -0.8980,0.0000,0.0000,0.4399 -0.8980,0.0000,0.0000,0.4399 -0.8910,0.0000,0.0000,0.4540 -0.8910,0.0000,0.0000,0.4540 -0.8910,0.0000,0.0000,0.4540 -0.8910,0.0000,0.0000,0.4540 -0.8838,0.0000,0.0000,0.4679 -0.8838,0.0000,0.0000,0.4679 -0.8838,0.0000,0.0000,0.4679 -0.8838,0.0000,0.0000,0.4679 -0.8763,0.0000,0.0000,0.4818 -0.8763,0.0000,0.0000,0.4818 -0.8763,0.0000,0.0000,0.4818 -0.8763,0.0000,0.0000,0.4818 -0.8686,0.0000,0.0000,0.4955 -0.8686,0.0000,0.0000,0.4955 -0.8686,0.0000,0.0000,0.4955 -0.8686,0.0000,0.0000,0.4955 -0.8607,0.0000,0.0000,0.5090 -0.8607,0.0000,0.0000,0.5090 -0.8607,0.0000,0.0000,0.5090 -0.8607,0.0000,0.0000,0.5090 -0.8526,0.0000,0.0000,0.5225 -0.8526,0.0000,0.0000,0.5225 -0.8526,0.0000,0.0000,0.5225 -0.8526,0.0000,0.0000,0.5225 -0.8443,0.0000,0.0000,0.5358 -0.8443,0.0000,0.0000,0.5358 -0.8443,0.0000,0.0000,0.5358 -0.8443,0.0000,0.0000,0.5358 -0.8358,0.0000,0.0000,0.5490 -0.8358,0.0000,0.0000,0.5490 -0.8358,0.0000,0.0000,0.5490 -0.8358,0.0000,0.0000,0.5490 -0.8271,0.0000,0.0000,0.5621 -0.8271,0.0000,0.0000,0.5621 -0.8271,0.0000,0.0000,0.5621 -0.8271,0.0000,0.0000,0.5621 -0.8181,0.0000,0.0000,0.5750 -0.8181,0.0000,0.0000,0.5750 -0.8181,0.0000,0.0000,0.5750 -0.8181,0.0000,0.0000,0.5750 -0.8090,0.0000,0.0000,0.5878 -0.8090,0.0000,0.0000,0.5878 -0.8090,0.0000,0.0000,0.5878 -0.8090,0.0000,0.0000,0.5878 -0.7997,0.0000,0.0000,0.6004 -0.7997,0.0000,0.0000,0.6004 -0.7997,0.0000,0.0000,0.6004 -0.7997,0.0000,0.0000,0.6004 -0.7902,0.0000,0.0000,0.6129 -0.7902,0.0000,0.0000,0.6129 -0.7902,0.0000,0.0000,0.6129 -0.7902,0.0000,0.0000,0.6129 -0.7804,0.0000,0.0000,0.6252 -0.7804,0.0000,0.0000,0.6252 -0.7804,0.0000,0.0000,0.6252 -0.7804,0.0000,0.0000,0.6252 -0.7705,0.0000,0.0000,0.6374 -0.7705,0.0000,0.0000,0.6374 -0.7705,0.0000,0.0000,0.6374 -0.7705,0.0000,0.0000,0.6374 -0.7604,0.0000,0.0000,0.6494 -0.7604,0.0000,0.0000,0.6494 -0.7604,0.0000,0.0000,0.6494 -0.7604,0.0000,0.0000,0.6494 -0.7501,0.0000,0.0000,0.6613 -0.7501,0.0000,0.0000,0.6613 -0.7501,0.0000,0.0000,0.6613 -0.7501,0.0000,0.0000,0.6613 -0.7396,0.0000,0.0000,0.6730 -0.7396,0.0000,0.0000,0.6730 -0.7396,0.0000,0.0000,0.6730 -0.7396,0.0000,0.0000,0.6730 -0.7290,0.0000,0.0000,0.6845 -0.7290,0.0000,0.0000,0.6845 -0.7290,0.0000,0.0000,0.6845 -0.7290,0.0000,0.0000,0.6845 -0.7181,0.0000,0.0000,0.6959 -0.7181,0.0000,0.0000,0.6959 -0.7181,0.0000,0.0000,0.6959 -0.7181,0.0000,0.0000,0.6959 -0.7071,0.0000,0.0000,0.7071 -0.7071,0.0000,0.0000,0.7071 -0.7071,0.0000,0.0000,0.7071 -0.7071,0.0000,0.0000,0.7071 -0.6959,0.0000,0.0000,0.7181 -0.6959,0.0000,0.0000,0.7181 -0.6959,0.0000,0.0000,0.7181 -0.6959,0.0000,0.0000,0.7181 -0.6845,0.0000,0.0000,0.7290 -0.6845,0.0000,0.0000,0.7290 -0.6845,0.0000,0.0000,0.7290 -0.6845,0.0000,0.0000,0.7290 -0.6730,0.0000,0.0000,0.7396 -0.6730,0.0000,0.0000,0.7396 -0.6730,0.0000,0.0000,0.7396 -0.6730,0.0000,0.0000,0.7396 -0.6613,0.0000,0.0000,0.7501 -0.6613,0.0000,0.0000,0.7501 -0.6613,0.0000,0.0000,0.7501 -0.6613,0.0000,0.0000,0.7501 -0.6494,0.0000,0.0000,0.7604 -0.6494,0.0000,0.0000,0.7604 -0.6494,0.0000,0.0000,0.7604 -0.6494,0.0000,0.0000,0.7604 -0.6374,0.0000,0.0000,0.7705 -0.6374,0.0000,0.0000,0.7705 -0.6374,0.0000,0.0000,0.7705 -0.6374,0.0000,0.0000,0.7705 -0.6252,0.0000,0.0000,0.7804 -0.6252,0.0000,0.0000,0.7804 -0.6252,0.0000,0.0000,0.7804 -0.6252,0.0000,0.0000,0.7804 -0.6129,0.0000,0.0000,0.7902 -0.6129,0.0000,0.0000,0.7902 -0.6129,0.0000,0.0000,0.7902 -0.6129,0.0000,0.0000,0.7902 -0.6004,0.0000,0.0000,0.7997 -0.6004,0.0000,0.0000,0.7997 -0.6004,0.0000,0.0000,0.7997 -0.6004,0.0000,0.0000,0.7997 -0.5878,0.0000,0.0000,0.8090 -0.5878,0.0000,0.0000,0.8090 -0.5878,0.0000,0.0000,0.8090 -0.5878,0.0000,0.0000,0.8090 -0.5750,0.0000,0.0000,0.8181 -0.5750,0.0000,0.0000,0.8181 -0.5750,0.0000,0.0000,0.8181 -0.5750,0.0000,0.0000,0.8181 -0.5621,0.0000,0.0000,0.8271 -0.5621,0.0000,0.0000,0.8271 -0.5621,0.0000,0.0000,0.8271 -0.5621,0.0000,0.0000,0.8271 -0.5490,0.0000,0.0000,0.8358 -0.5490,0.0000,0.0000,0.8358 -0.5490,0.0000,0.0000,0.8358 -0.5490,0.0000,0.0000,0.8358 -0.5358,0.0000,0.0000,0.8443 -0.5358,0.0000,0.0000,0.8443 -0.5358,0.0000,0.0000,0.8443 -0.5358,0.0000,0.0000,0.8443 -0.5225,0.0000,0.0000,0.8526 -0.5225,0.0000,0.0000,0.8526 -0.5225,0.0000,0.0000,0.8526 -0.5225,0.0000,0.0000,0.8526 -0.5090,0.0000,0.0000,0.8607 -0.5090,0.0000,0.0000,0.8607 -0.5090,0.0000,0.0000,0.8607 -0.5090,0.0000,0.0000,0.8607 -0.4955,0.0000,0.0000,0.8686 -0.4955,0.0000,0.0000,0.8686 -0.4955,0.0000,0.0000,0.8686 -0.4955,0.0000,0.0000,0.8686 -0.4818,0.0000,0.0000,0.8763 -0.4818,0.0000,0.0000,0.8763 -0.4818,0.0000,0.0000,0.8763 -0.4818,0.0000,0.0000,0.8763 -0.4679,0.0000,0.0000,0.8838 -0.4679,0.0000,0.0000,0.8838 -0.4679,0.0000,0.0000,0.8838 -0.4679,0.0000,0.0000,0.8838 -0.4540,0.0000,0.0000,0.8910 -0.4540,0.0000,0.0000,0.8910 -0.4540,0.0000,0.0000,0.8910 -0.4540,0.0000,0.0000,0.8910 -0.4399,0.0000,0.0000,0.8980 -0.4399,0.0000,0.0000,0.8980 -0.4399,0.0000,0.0000,0.8980 -0.4399,0.0000,0.0000,0.8980 -0.4258,0.0000,0.0000,0.9048 -0.4258,0.0000,0.0000,0.9048 -0.4258,0.0000,0.0000,0.9048 -0.4258,0.0000,0.0000,0.9048 -0.4115,0.0000,0.0000,0.9114 -0.4115,0.0000,0.0000,0.9114 -0.4115,0.0000,0.0000,0.9114 -0.4115,0.0000,0.0000,0.9114 -0.3971,0.0000,0.0000,0.9178 -0.3971,0.0000,0.0000,0.9178 -0.3971,0.0000,0.0000,0.9178 -0.3971,0.0000,0.0000,0.9178 -0.3827,0.0000,0.0000,0.9239 -0.3827,0.0000,0.0000,0.9239 -0.3827,0.0000,0.0000,0.9239 -0.3827,0.0000,0.0000,0.9239 -0.3681,0.0000,0.0000,0.9298 -0.3681,0.0000,0.0000,0.9298 -0.3681,0.0000,0.0000,0.9298 -0.3681,0.0000,0.0000,0.9298 -0.3535,0.0000,0.0000,0.9354 -0.3535,0.0000,0.0000,0.9354 -0.3535,0.0000,0.0000,0.9354 -0.3535,0.0000,0.0000,0.9354 -0.3387,0.0000,0.0000,0.9409 -0.3387,0.0000,0.0000,0.9409 -0.3387,0.0000,0.0000,0.9409 -0.3387,0.0000,0.0000,0.9409 -0.3239,0.0000,0.0000,0.9461 -0.3239,0.0000,0.0000,0.9461 -0.3239,0.0000,0.0000,0.9461 -0.3239,0.0000,0.0000,0.9461 -0.3090,0.0000,0.0000,0.9511 -0.3090,0.0000,0.0000,0.9511 -0.3090,0.0000,0.0000,0.9511 -0.3090,0.0000,0.0000,0.9511 -0.2940,0.0000,0.0000,0.9558 -0.2940,0.0000,0.0000,0.9558 -0.2940,0.0000,0.0000,0.9558 -0.2940,0.0000,0.0000,0.9558 -0.2790,0.0000,0.0000,0.9603 -0.2790,0.0000,0.0000,0.9603 -0.2790,0.0000,0.0000,0.9603 -0.2790,0.0000,0.0000,0.9603 -0.2639,0.0000,0.0000,0.9646 -0.2639,0.0000,0.0000,0.9646 -0.2639,0.0000,0.0000,0.9646 -0.2639,0.0000,0.0000,0.9646 -0.2487,0.0000,0.0000,0.9686 -0.2487,0.0000,0.0000,0.9686 -0.2487,0.0000,0.0000,0.9686 -0.2487,0.0000,0.0000,0.9686 -0.2334,0.0000,0.0000,0.9724 -0.2334,0.0000,0.0000,0.9724 -0.2334,0.0000,0.0000,0.9724 -0.2334,0.0000,0.0000,0.9724 -0.2181,0.0000,0.0000,0.9759 -0.2181,0.0000,0.0000,0.9759 -0.2181,0.0000,0.0000,0.9759 -0.2181,0.0000,0.0000,0.9759 -0.2028,0.0000,0.0000,0.9792 -0.2028,0.0000,0.0000,0.9792 -0.2028,0.0000,0.0000,0.9792 -0.2028,0.0000,0.0000,0.9792 -0.1874,0.0000,0.0000,0.9823 -0.1874,0.0000,0.0000,0.9823 -0.1874,0.0000,0.0000,0.9823 -0.1874,0.0000,0.0000,0.9823 -0.1719,0.0000,0.0000,0.9851 -0.1719,0.0000,0.0000,0.9851 -0.1719,0.0000,0.0000,0.9851 -0.1719,0.0000,0.0000,0.9851 -0.1564,0.0000,0.0000,0.9877 -0.1564,0.0000,0.0000,0.9877 -0.1564,0.0000,0.0000,0.9877 -0.1564,0.0000,0.0000,0.9877 -0.1409,0.0000,0.0000,0.9900 -0.1409,0.0000,0.0000,0.9900 -0.1409,0.0000,0.0000,0.9900 -0.1409,0.0000,0.0000,0.9900 -0.1253,0.0000,0.0000,0.9921 -0.1253,0.0000,0.0000,0.9921 -0.1253,0.0000,0.0000,0.9921 -0.1253,0.0000,0.0000,0.9921 -0.1097,0.0000,0.0000,0.9940 -0.1097,0.0000,0.0000,0.9940 -0.1097,0.0000,0.0000,0.9940 -0.1097,0.0000,0.0000,0.9940 -0.0941,0.0000,0.0000,0.9956 -0.0941,0.0000,0.0000,0.9956 -0.0941,0.0000,0.0000,0.9956 -0.0941,0.0000,0.0000,0.9956 -0.0785,0.0000,0.0000,0.9969 -0.0785,0.0000,0.0000,0.9969 -0.0785,0.0000,0.0000,0.9969 -0.0785,0.0000,0.0000,0.9969 -0.0628,0.0000,0.0000,0.9980 -0.0628,0.0000,0.0000,0.9980 -0.0628,0.0000,0.0000,0.9980 -0.0628,0.0000,0.0000,0.9980 -0.0471,0.0000,0.0000,0.9989 -0.0471,0.0000,0.0000,0.9989 -0.0471,0.0000,0.0000,0.9989 -0.0471,0.0000,0.0000,0.9989 -0.0314,0.0000,0.0000,0.9995 -0.0314,0.0000,0.0000,0.9995 -0.0314,0.0000,0.0000,0.9995 -0.0314,0.0000,0.0000,0.9995 -0.0157,0.0000,0.0000,0.9999 -0.0157,0.0000,0.0000,0.9999 -0.0157,0.0000,0.0000,0.9999 -0.0157,0.0000,0.0000,0.9999 --0.0000,0.0000,0.0000,1.0000 --0.0000,0.0000,0.0000,1.0000 --0.0000,0.0000,0.0000,1.0000 --0.0000,0.0000,0.0000,1.0000 --0.0157,0.0000,0.0000,0.9999 --0.0157,0.0000,0.0000,0.9999 --0.0157,0.0000,0.0000,0.9999 --0.0157,0.0000,0.0000,0.9999 --0.0314,0.0000,0.0000,0.9995 --0.0314,0.0000,0.0000,0.9995 --0.0314,0.0000,0.0000,0.9995 --0.0314,0.0000,0.0000,0.9995 --0.0471,0.0000,0.0000,0.9989 --0.0471,0.0000,0.0000,0.9989 --0.0471,0.0000,0.0000,0.9989 --0.0471,0.0000,0.0000,0.9989 --0.0628,0.0000,0.0000,0.9980 --0.0628,0.0000,0.0000,0.9980 --0.0628,0.0000,0.0000,0.9980 --0.0628,0.0000,0.0000,0.9980 --0.0785,0.0000,0.0000,0.9969 --0.0785,0.0000,0.0000,0.9969 --0.0785,0.0000,0.0000,0.9969 --0.0785,0.0000,0.0000,0.9969 --0.0941,0.0000,0.0000,0.9956 --0.0941,0.0000,0.0000,0.9956 --0.0941,0.0000,0.0000,0.9956 --0.0941,0.0000,0.0000,0.9956 --0.1097,0.0000,0.0000,0.9940 --0.1097,0.0000,0.0000,0.9940 --0.1097,0.0000,0.0000,0.9940 --0.1097,0.0000,0.0000,0.9940 --0.1253,0.0000,0.0000,0.9921 --0.1253,0.0000,0.0000,0.9921 --0.1253,0.0000,0.0000,0.9921 --0.1253,0.0000,0.0000,0.9921 --0.1409,0.0000,0.0000,0.9900 --0.1409,0.0000,0.0000,0.9900 --0.1409,0.0000,0.0000,0.9900 --0.1409,0.0000,0.0000,0.9900 --0.1564,0.0000,0.0000,0.9877 --0.1564,0.0000,0.0000,0.9877 --0.1564,0.0000,0.0000,0.9877 --0.1564,0.0000,0.0000,0.9877 --0.1719,0.0000,0.0000,0.9851 --0.1719,0.0000,0.0000,0.9851 --0.1719,0.0000,0.0000,0.9851 --0.1719,0.0000,0.0000,0.9851 --0.1874,0.0000,0.0000,0.9823 --0.1874,0.0000,0.0000,0.9823 --0.1874,0.0000,0.0000,0.9823 --0.1874,0.0000,0.0000,0.9823 --0.2028,0.0000,0.0000,0.9792 --0.2028,0.0000,0.0000,0.9792 --0.2028,0.0000,0.0000,0.9792 --0.2028,0.0000,0.0000,0.9792 --0.2181,0.0000,0.0000,0.9759 --0.2181,0.0000,0.0000,0.9759 --0.2181,0.0000,0.0000,0.9759 --0.2181,0.0000,0.0000,0.9759 --0.2334,0.0000,0.0000,0.9724 --0.2334,0.0000,0.0000,0.9724 --0.2334,0.0000,0.0000,0.9724 --0.2334,0.0000,0.0000,0.9724 --0.2487,0.0000,0.0000,0.9686 --0.2487,0.0000,0.0000,0.9686 --0.2487,0.0000,0.0000,0.9686 --0.2487,0.0000,0.0000,0.9686 --0.2639,0.0000,0.0000,0.9646 --0.2639,0.0000,0.0000,0.9646 --0.2639,0.0000,0.0000,0.9646 --0.2639,0.0000,0.0000,0.9646 --0.2790,0.0000,0.0000,0.9603 --0.2790,0.0000,0.0000,0.9603 --0.2790,0.0000,0.0000,0.9603 --0.2790,0.0000,0.0000,0.9603 --0.2940,0.0000,0.0000,0.9558 --0.2940,0.0000,0.0000,0.9558 --0.2940,0.0000,0.0000,0.9558 --0.2940,0.0000,0.0000,0.9558 --0.3090,0.0000,0.0000,0.9511 --0.3090,0.0000,0.0000,0.9511 --0.3090,0.0000,0.0000,0.9511 --0.3090,0.0000,0.0000,0.9511 --0.3239,0.0000,0.0000,0.9461 --0.3239,0.0000,0.0000,0.9461 --0.3239,0.0000,0.0000,0.9461 --0.3239,0.0000,0.0000,0.9461 --0.3387,0.0000,0.0000,0.9409 --0.3387,0.0000,0.0000,0.9409 --0.3387,0.0000,0.0000,0.9409 --0.3387,0.0000,0.0000,0.9409 --0.3535,0.0000,0.0000,0.9354 --0.3535,0.0000,0.0000,0.9354 --0.3535,0.0000,0.0000,0.9354 --0.3535,0.0000,0.0000,0.9354 --0.3681,0.0000,0.0000,0.9298 --0.3681,0.0000,0.0000,0.9298 --0.3681,0.0000,0.0000,0.9298 --0.3681,0.0000,0.0000,0.9298 --0.3827,0.0000,0.0000,0.9239 --0.3827,0.0000,0.0000,0.9239 --0.3827,0.0000,0.0000,0.9239 --0.3827,0.0000,0.0000,0.9239 --0.3971,0.0000,0.0000,0.9178 --0.3971,0.0000,0.0000,0.9178 --0.3971,0.0000,0.0000,0.9178 --0.3971,0.0000,0.0000,0.9178 --0.4115,0.0000,0.0000,0.9114 --0.4115,0.0000,0.0000,0.9114 --0.4115,0.0000,0.0000,0.9114 --0.4115,0.0000,0.0000,0.9114 --0.4258,0.0000,0.0000,0.9048 --0.4258,0.0000,0.0000,0.9048 --0.4258,0.0000,0.0000,0.9048 --0.4258,0.0000,0.0000,0.9048 --0.4399,0.0000,0.0000,0.8980 --0.4399,0.0000,0.0000,0.8980 --0.4399,0.0000,0.0000,0.8980 --0.4399,0.0000,0.0000,0.8980 --0.4540,0.0000,0.0000,0.8910 --0.4540,0.0000,0.0000,0.8910 --0.4540,0.0000,0.0000,0.8910 --0.4540,0.0000,0.0000,0.8910 --0.4679,0.0000,0.0000,0.8838 --0.4679,0.0000,0.0000,0.8838 --0.4679,0.0000,0.0000,0.8838 --0.4679,0.0000,0.0000,0.8838 --0.4818,0.0000,0.0000,0.8763 --0.4818,0.0000,0.0000,0.8763 --0.4818,0.0000,0.0000,0.8763 --0.4818,0.0000,0.0000,0.8763 --0.4955,0.0000,0.0000,0.8686 --0.4955,0.0000,0.0000,0.8686 --0.4955,0.0000,0.0000,0.8686 --0.4955,0.0000,0.0000,0.8686 --0.5090,0.0000,0.0000,0.8607 --0.5090,0.0000,0.0000,0.8607 --0.5090,0.0000,0.0000,0.8607 --0.5090,0.0000,0.0000,0.8607 --0.5225,0.0000,0.0000,0.8526 --0.5225,0.0000,0.0000,0.8526 --0.5225,0.0000,0.0000,0.8526 --0.5225,0.0000,0.0000,0.8526 --0.5358,0.0000,0.0000,0.8443 --0.5358,0.0000,0.0000,0.8443 --0.5358,0.0000,0.0000,0.8443 --0.5358,0.0000,0.0000,0.8443 --0.5490,0.0000,0.0000,0.8358 --0.5490,0.0000,0.0000,0.8358 --0.5490,0.0000,0.0000,0.8358 --0.5490,0.0000,0.0000,0.8358 --0.5621,0.0000,0.0000,0.8271 --0.5621,0.0000,0.0000,0.8271 --0.5621,0.0000,0.0000,0.8271 --0.5621,0.0000,0.0000,0.8271 --0.5750,0.0000,0.0000,0.8181 --0.5750,0.0000,0.0000,0.8181 --0.5750,0.0000,0.0000,0.8181 --0.5750,0.0000,0.0000,0.8181 --0.5878,0.0000,0.0000,0.8090 --0.5878,0.0000,0.0000,0.8090 --0.5878,0.0000,0.0000,0.8090 --0.5878,0.0000,0.0000,0.8090 --0.6004,0.0000,0.0000,0.7997 --0.6004,0.0000,0.0000,0.7997 --0.6004,0.0000,0.0000,0.7997 --0.6004,0.0000,0.0000,0.7997 --0.6129,0.0000,0.0000,0.7902 --0.6129,0.0000,0.0000,0.7902 --0.6129,0.0000,0.0000,0.7902 --0.6129,0.0000,0.0000,0.7902 --0.6252,0.0000,0.0000,0.7804 --0.6252,0.0000,0.0000,0.7804 --0.6252,0.0000,0.0000,0.7804 --0.6252,0.0000,0.0000,0.7804 --0.6374,0.0000,0.0000,0.7705 --0.6374,0.0000,0.0000,0.7705 --0.6374,0.0000,0.0000,0.7705 --0.6374,0.0000,0.0000,0.7705 --0.6494,0.0000,0.0000,0.7604 --0.6494,0.0000,0.0000,0.7604 --0.6494,0.0000,0.0000,0.7604 --0.6494,0.0000,0.0000,0.7604 --0.6613,0.0000,0.0000,0.7501 --0.6613,0.0000,0.0000,0.7501 --0.6613,0.0000,0.0000,0.7501 --0.6613,0.0000,0.0000,0.7501 --0.6730,0.0000,0.0000,0.7396 --0.6730,0.0000,0.0000,0.7396 --0.6730,0.0000,0.0000,0.7396 --0.6730,0.0000,0.0000,0.7396 --0.6845,0.0000,0.0000,0.7290 --0.6845,0.0000,0.0000,0.7290 --0.6845,0.0000,0.0000,0.7290 --0.6845,0.0000,0.0000,0.7290 --0.6959,0.0000,0.0000,0.7181 --0.6959,0.0000,0.0000,0.7181 --0.6959,0.0000,0.0000,0.7181 --0.6959,0.0000,0.0000,0.7181 --0.7071,0.0000,0.0000,0.7071 --0.7071,0.0000,0.0000,0.7071 --0.7071,0.0000,0.0000,0.7071 --0.7071,0.0000,0.0000,0.7071 --0.7181,0.0000,0.0000,0.6959 --0.7181,0.0000,0.0000,0.6959 --0.7181,0.0000,0.0000,0.6959 --0.7181,0.0000,0.0000,0.6959 --0.7290,0.0000,0.0000,0.6845 --0.7290,0.0000,0.0000,0.6845 --0.7290,0.0000,0.0000,0.6845 --0.7290,0.0000,0.0000,0.6845 --0.7396,0.0000,0.0000,0.6730 --0.7396,0.0000,0.0000,0.6730 --0.7396,0.0000,0.0000,0.6730 --0.7396,0.0000,0.0000,0.6730 --0.7501,0.0000,0.0000,0.6613 --0.7501,0.0000,0.0000,0.6613 --0.7501,0.0000,0.0000,0.6613 --0.7501,0.0000,0.0000,0.6613 --0.7604,0.0000,0.0000,0.6494 --0.7604,0.0000,0.0000,0.6494 --0.7604,0.0000,0.0000,0.6494 --0.7604,0.0000,0.0000,0.6494 --0.7705,0.0000,0.0000,0.6374 --0.7705,0.0000,0.0000,0.6374 --0.7705,0.0000,0.0000,0.6374 --0.7705,0.0000,0.0000,0.6374 --0.7804,0.0000,0.0000,0.6252 --0.7804,0.0000,0.0000,0.6252 --0.7804,0.0000,0.0000,0.6252 --0.7804,0.0000,0.0000,0.6252 --0.7902,0.0000,0.0000,0.6129 --0.7902,0.0000,0.0000,0.6129 --0.7902,0.0000,0.0000,0.6129 --0.7902,0.0000,0.0000,0.6129 --0.7997,0.0000,0.0000,0.6004 --0.7997,0.0000,0.0000,0.6004 --0.7997,0.0000,0.0000,0.6004 --0.7997,0.0000,0.0000,0.6004 --0.8090,0.0000,0.0000,0.5878 --0.8090,0.0000,0.0000,0.5878 --0.8090,0.0000,0.0000,0.5878 --0.8090,0.0000,0.0000,0.5878 --0.8182,0.0000,0.0000,0.5750 --0.8182,0.0000,0.0000,0.5750 --0.8182,0.0000,0.0000,0.5750 --0.8182,0.0000,0.0000,0.5750 --0.8271,0.0000,0.0000,0.5621 --0.8271,0.0000,0.0000,0.5621 --0.8271,0.0000,0.0000,0.5621 --0.8271,0.0000,0.0000,0.5621 --0.8358,0.0000,0.0000,0.5490 --0.8358,0.0000,0.0000,0.5490 --0.8358,0.0000,0.0000,0.5490 --0.8358,0.0000,0.0000,0.5490 --0.8443,0.0000,0.0000,0.5358 --0.8443,0.0000,0.0000,0.5358 --0.8443,0.0000,0.0000,0.5358 --0.8443,0.0000,0.0000,0.5358 --0.8526,0.0000,0.0000,0.5225 --0.8526,0.0000,0.0000,0.5225 --0.8526,0.0000,0.0000,0.5225 --0.8526,0.0000,0.0000,0.5225 --0.8607,0.0000,0.0000,0.5090 --0.8607,0.0000,0.0000,0.5090 --0.8607,0.0000,0.0000,0.5090 --0.8607,0.0000,0.0000,0.5090 --0.8686,0.0000,0.0000,0.4955 --0.8686,0.0000,0.0000,0.4955 --0.8686,0.0000,0.0000,0.4955 --0.8686,0.0000,0.0000,0.4955 --0.8763,0.0000,0.0000,0.4818 --0.8763,0.0000,0.0000,0.4818 --0.8763,0.0000,0.0000,0.4818 --0.8763,0.0000,0.0000,0.4818 --0.8838,0.0000,0.0000,0.4679 --0.8838,0.0000,0.0000,0.4679 --0.8838,0.0000,0.0000,0.4679 --0.8838,0.0000,0.0000,0.4679 --0.8910,0.0000,0.0000,0.4540 --0.8910,0.0000,0.0000,0.4540 --0.8910,0.0000,0.0000,0.4540 --0.8910,0.0000,0.0000,0.4540 --0.8980,0.0000,0.0000,0.4399 --0.8980,0.0000,0.0000,0.4399 --0.8980,0.0000,0.0000,0.4399 --0.8980,0.0000,0.0000,0.4399 --0.9048,0.0000,0.0000,0.4258 --0.9048,0.0000,0.0000,0.4258 --0.9048,0.0000,0.0000,0.4258 --0.9048,0.0000,0.0000,0.4258 --0.9114,0.0000,0.0000,0.4115 --0.9114,0.0000,0.0000,0.4115 --0.9114,0.0000,0.0000,0.4115 --0.9114,0.0000,0.0000,0.4115 --0.9178,0.0000,0.0000,0.3971 --0.9178,0.0000,0.0000,0.3971 --0.9178,0.0000,0.0000,0.3971 --0.9178,0.0000,0.0000,0.3971 --0.9239,0.0000,0.0000,0.3827 --0.9239,0.0000,0.0000,0.3827 --0.9239,0.0000,0.0000,0.3827 --0.9239,0.0000,0.0000,0.3827 --0.9298,0.0000,0.0000,0.3681 --0.9298,0.0000,0.0000,0.3681 --0.9298,0.0000,0.0000,0.3681 --0.9298,0.0000,0.0000,0.3681 --0.9354,0.0000,0.0000,0.3535 --0.9354,0.0000,0.0000,0.3535 --0.9354,0.0000,0.0000,0.3535 --0.9354,0.0000,0.0000,0.3535 --0.9409,0.0000,0.0000,0.3387 --0.9409,0.0000,0.0000,0.3387 --0.9409,0.0000,0.0000,0.3387 --0.9409,0.0000,0.0000,0.3387 --0.9461,0.0000,0.0000,0.3239 --0.9461,0.0000,0.0000,0.3239 --0.9461,0.0000,0.0000,0.3239 --0.9461,0.0000,0.0000,0.3239 --0.9511,0.0000,0.0000,0.3090 --0.9511,0.0000,0.0000,0.3090 --0.9511,0.0000,0.0000,0.3090 --0.9511,0.0000,0.0000,0.3090 --0.9558,0.0000,0.0000,0.2940 --0.9558,0.0000,0.0000,0.2940 --0.9558,0.0000,0.0000,0.2940 --0.9558,0.0000,0.0000,0.2940 --0.9603,0.0000,0.0000,0.2790 --0.9603,0.0000,0.0000,0.2790 --0.9603,0.0000,0.0000,0.2790 --0.9603,0.0000,0.0000,0.2790 --0.9646,0.0000,0.0000,0.2639 --0.9646,0.0000,0.0000,0.2639 --0.9646,0.0000,0.0000,0.2639 --0.9646,0.0000,0.0000,0.2639 --0.9686,0.0000,0.0000,0.2487 --0.9686,0.0000,0.0000,0.2487 --0.9686,0.0000,0.0000,0.2487 --0.9686,0.0000,0.0000,0.2487 --0.9724,0.0000,0.0000,0.2334 --0.9724,0.0000,0.0000,0.2334 --0.9724,0.0000,0.0000,0.2334 --0.9724,0.0000,0.0000,0.2334 --0.9759,0.0000,0.0000,0.2181 --0.9759,0.0000,0.0000,0.2181 --0.9759,0.0000,0.0000,0.2181 --0.9759,0.0000,0.0000,0.2181 --0.9792,0.0000,0.0000,0.2028 --0.9792,0.0000,0.0000,0.2028 --0.9792,0.0000,0.0000,0.2028 --0.9792,0.0000,0.0000,0.2028 --0.9823,0.0000,0.0000,0.1874 --0.9823,0.0000,0.0000,0.1874 --0.9823,0.0000,0.0000,0.1874 --0.9823,0.0000,0.0000,0.1874 --0.9851,0.0000,0.0000,0.1719 --0.9851,0.0000,0.0000,0.1719 --0.9851,0.0000,0.0000,0.1719 --0.9851,0.0000,0.0000,0.1719 --0.9877,0.0000,0.0000,0.1564 --0.9877,0.0000,0.0000,0.1564 --0.9877,0.0000,0.0000,0.1564 --0.9877,0.0000,0.0000,0.1564 --0.9900,0.0000,0.0000,0.1409 --0.9900,0.0000,0.0000,0.1409 --0.9900,0.0000,0.0000,0.1409 --0.9900,0.0000,0.0000,0.1409 --0.9921,0.0000,0.0000,0.1253 --0.9921,0.0000,0.0000,0.1253 --0.9921,0.0000,0.0000,0.1253 --0.9921,0.0000,0.0000,0.1253 --0.9940,0.0000,0.0000,0.1097 --0.9940,0.0000,0.0000,0.1097 --0.9940,0.0000,0.0000,0.1097 --0.9940,0.0000,0.0000,0.1097 --0.9956,0.0000,0.0000,0.0941 --0.9956,0.0000,0.0000,0.0941 --0.9956,0.0000,0.0000,0.0941 --0.9956,0.0000,0.0000,0.0941 --0.9969,0.0000,0.0000,0.0785 --0.9969,0.0000,0.0000,0.0785 --0.9969,0.0000,0.0000,0.0785 --0.9969,0.0000,0.0000,0.0785 --0.9980,0.0000,0.0000,0.0628 --0.9980,0.0000,0.0000,0.0628 --0.9980,0.0000,0.0000,0.0628 --0.9980,0.0000,0.0000,0.0628 --0.9989,0.0000,0.0000,0.0471 --0.9989,0.0000,0.0000,0.0471 --0.9989,0.0000,0.0000,0.0471 --0.9989,0.0000,0.0000,0.0471 --0.9995,0.0000,0.0000,0.0314 --0.9995,0.0000,0.0000,0.0314 --0.9995,0.0000,0.0000,0.0314 --0.9995,0.0000,0.0000,0.0314 --0.9999,0.0000,0.0000,0.0157 --0.9999,0.0000,0.0000,0.0157 --0.9999,0.0000,0.0000,0.0157 --0.9999,0.0000,0.0000,0.0157 -1.0000,0.0000,0.0000,0.0000 -1.0000,0.0000,0.0000,0.0000 -1.0000,0.0000,0.0000,0.0000 -1.0000,0.0000,0.0000,0.0000 diff --git a/scripts/trajectories/full-circle-4s.csv b/scripts/trajectories/full-circle-4s.csv deleted file mode 100644 index 4174a531b7..0000000000 --- a/scripts/trajectories/full-circle-4s.csv +++ /dev/null @@ -1,800 +0,0 @@ -0.9999,0.0000,0.0000,-0.0157 -0.9999,0.0000,0.0000,-0.0157 -0.9999,0.0000,0.0000,-0.0157 -0.9999,0.0000,0.0000,-0.0157 -0.9995,0.0000,0.0000,-0.0314 -0.9995,0.0000,0.0000,-0.0314 -0.9995,0.0000,0.0000,-0.0314 -0.9995,0.0000,0.0000,-0.0314 -0.9989,0.0000,0.0000,-0.0471 -0.9989,0.0000,0.0000,-0.0471 -0.9989,0.0000,0.0000,-0.0471 -0.9989,0.0000,0.0000,-0.0471 -0.9980,0.0000,0.0000,-0.0628 -0.9980,0.0000,0.0000,-0.0628 -0.9980,0.0000,0.0000,-0.0628 -0.9980,0.0000,0.0000,-0.0628 -0.9969,0.0000,0.0000,-0.0785 -0.9969,0.0000,0.0000,-0.0785 -0.9969,0.0000,0.0000,-0.0785 -0.9969,0.0000,0.0000,-0.0785 -0.9956,0.0000,0.0000,-0.0941 -0.9956,0.0000,0.0000,-0.0941 -0.9956,0.0000,0.0000,-0.0941 -0.9956,0.0000,0.0000,-0.0941 -0.9940,0.0000,0.0000,-0.1097 -0.9940,0.0000,0.0000,-0.1097 -0.9940,0.0000,0.0000,-0.1097 -0.9940,0.0000,0.0000,-0.1097 -0.9921,0.0000,0.0000,-0.1253 -0.9921,0.0000,0.0000,-0.1253 -0.9921,0.0000,0.0000,-0.1253 -0.9921,0.0000,0.0000,-0.1253 -0.9900,0.0000,0.0000,-0.1409 -0.9900,0.0000,0.0000,-0.1409 -0.9900,0.0000,0.0000,-0.1409 -0.9900,0.0000,0.0000,-0.1409 -0.9877,0.0000,0.0000,-0.1564 -0.9877,0.0000,0.0000,-0.1564 -0.9877,0.0000,0.0000,-0.1564 -0.9877,0.0000,0.0000,-0.1564 -0.9851,0.0000,0.0000,-0.1719 -0.9851,0.0000,0.0000,-0.1719 -0.9851,0.0000,0.0000,-0.1719 -0.9851,0.0000,0.0000,-0.1719 -0.9823,0.0000,0.0000,-0.1874 -0.9823,0.0000,0.0000,-0.1874 -0.9823,0.0000,0.0000,-0.1874 -0.9823,0.0000,0.0000,-0.1874 -0.9792,0.0000,0.0000,-0.2028 -0.9792,0.0000,0.0000,-0.2028 -0.9792,0.0000,0.0000,-0.2028 -0.9792,0.0000,0.0000,-0.2028 -0.9759,0.0000,0.0000,-0.2181 -0.9759,0.0000,0.0000,-0.2181 -0.9759,0.0000,0.0000,-0.2181 -0.9759,0.0000,0.0000,-0.2181 -0.9724,0.0000,0.0000,-0.2334 -0.9724,0.0000,0.0000,-0.2334 -0.9724,0.0000,0.0000,-0.2334 -0.9724,0.0000,0.0000,-0.2334 -0.9686,0.0000,0.0000,-0.2487 -0.9686,0.0000,0.0000,-0.2487 -0.9686,0.0000,0.0000,-0.2487 -0.9686,0.0000,0.0000,-0.2487 -0.9646,0.0000,0.0000,-0.2639 -0.9646,0.0000,0.0000,-0.2639 -0.9646,0.0000,0.0000,-0.2639 -0.9646,0.0000,0.0000,-0.2639 -0.9603,0.0000,0.0000,-0.2790 -0.9603,0.0000,0.0000,-0.2790 -0.9603,0.0000,0.0000,-0.2790 -0.9603,0.0000,0.0000,-0.2790 -0.9558,0.0000,0.0000,-0.2940 -0.9558,0.0000,0.0000,-0.2940 -0.9558,0.0000,0.0000,-0.2940 -0.9558,0.0000,0.0000,-0.2940 -0.9511,0.0000,0.0000,-0.3090 -0.9511,0.0000,0.0000,-0.3090 -0.9511,0.0000,0.0000,-0.3090 -0.9511,0.0000,0.0000,-0.3090 -0.9461,0.0000,0.0000,-0.3239 -0.9461,0.0000,0.0000,-0.3239 -0.9461,0.0000,0.0000,-0.3239 -0.9461,0.0000,0.0000,-0.3239 -0.9409,0.0000,0.0000,-0.3387 -0.9409,0.0000,0.0000,-0.3387 -0.9409,0.0000,0.0000,-0.3387 -0.9409,0.0000,0.0000,-0.3387 -0.9354,0.0000,0.0000,-0.3535 -0.9354,0.0000,0.0000,-0.3535 -0.9354,0.0000,0.0000,-0.3535 -0.9354,0.0000,0.0000,-0.3535 -0.9298,0.0000,0.0000,-0.3681 -0.9298,0.0000,0.0000,-0.3681 -0.9298,0.0000,0.0000,-0.3681 -0.9298,0.0000,0.0000,-0.3681 -0.9239,0.0000,0.0000,-0.3827 -0.9239,0.0000,0.0000,-0.3827 -0.9239,0.0000,0.0000,-0.3827 -0.9239,0.0000,0.0000,-0.3827 -0.9178,0.0000,0.0000,-0.3971 -0.9178,0.0000,0.0000,-0.3971 -0.9178,0.0000,0.0000,-0.3971 -0.9178,0.0000,0.0000,-0.3971 -0.9114,0.0000,0.0000,-0.4115 -0.9114,0.0000,0.0000,-0.4115 -0.9114,0.0000,0.0000,-0.4115 -0.9114,0.0000,0.0000,-0.4115 -0.9048,0.0000,0.0000,-0.4258 -0.9048,0.0000,0.0000,-0.4258 -0.9048,0.0000,0.0000,-0.4258 -0.9048,0.0000,0.0000,-0.4258 -0.8980,0.0000,0.0000,-0.4399 -0.8980,0.0000,0.0000,-0.4399 -0.8980,0.0000,0.0000,-0.4399 -0.8980,0.0000,0.0000,-0.4399 -0.8910,0.0000,0.0000,-0.4540 -0.8910,0.0000,0.0000,-0.4540 -0.8910,0.0000,0.0000,-0.4540 -0.8910,0.0000,0.0000,-0.4540 -0.8838,0.0000,0.0000,-0.4679 -0.8838,0.0000,0.0000,-0.4679 -0.8838,0.0000,0.0000,-0.4679 -0.8838,0.0000,0.0000,-0.4679 -0.8763,0.0000,0.0000,-0.4818 -0.8763,0.0000,0.0000,-0.4818 -0.8763,0.0000,0.0000,-0.4818 -0.8763,0.0000,0.0000,-0.4818 -0.8686,0.0000,0.0000,-0.4955 -0.8686,0.0000,0.0000,-0.4955 -0.8686,0.0000,0.0000,-0.4955 -0.8686,0.0000,0.0000,-0.4955 -0.8607,0.0000,0.0000,-0.5090 -0.8607,0.0000,0.0000,-0.5090 -0.8607,0.0000,0.0000,-0.5090 -0.8607,0.0000,0.0000,-0.5090 -0.8526,0.0000,0.0000,-0.5225 -0.8526,0.0000,0.0000,-0.5225 -0.8526,0.0000,0.0000,-0.5225 -0.8526,0.0000,0.0000,-0.5225 -0.8443,0.0000,0.0000,-0.5358 -0.8443,0.0000,0.0000,-0.5358 -0.8443,0.0000,0.0000,-0.5358 -0.8443,0.0000,0.0000,-0.5358 -0.8358,0.0000,0.0000,-0.5490 -0.8358,0.0000,0.0000,-0.5490 -0.8358,0.0000,0.0000,-0.5490 -0.8358,0.0000,0.0000,-0.5490 -0.8271,0.0000,0.0000,-0.5621 -0.8271,0.0000,0.0000,-0.5621 -0.8271,0.0000,0.0000,-0.5621 -0.8271,0.0000,0.0000,-0.5621 -0.8181,0.0000,0.0000,-0.5750 -0.8181,0.0000,0.0000,-0.5750 -0.8181,0.0000,0.0000,-0.5750 -0.8181,0.0000,0.0000,-0.5750 -0.8090,0.0000,0.0000,-0.5878 -0.8090,0.0000,0.0000,-0.5878 -0.8090,0.0000,0.0000,-0.5878 -0.8090,0.0000,0.0000,-0.5878 -0.7997,0.0000,0.0000,-0.6004 -0.7997,0.0000,0.0000,-0.6004 -0.7997,0.0000,0.0000,-0.6004 -0.7997,0.0000,0.0000,-0.6004 -0.7902,0.0000,0.0000,-0.6129 -0.7902,0.0000,0.0000,-0.6129 -0.7902,0.0000,0.0000,-0.6129 -0.7902,0.0000,0.0000,-0.6129 -0.7804,0.0000,0.0000,-0.6252 -0.7804,0.0000,0.0000,-0.6252 -0.7804,0.0000,0.0000,-0.6252 -0.7804,0.0000,0.0000,-0.6252 -0.7705,0.0000,0.0000,-0.6374 -0.7705,0.0000,0.0000,-0.6374 -0.7705,0.0000,0.0000,-0.6374 -0.7705,0.0000,0.0000,-0.6374 -0.7604,0.0000,0.0000,-0.6494 -0.7604,0.0000,0.0000,-0.6494 -0.7604,0.0000,0.0000,-0.6494 -0.7604,0.0000,0.0000,-0.6494 -0.7501,0.0000,0.0000,-0.6613 -0.7501,0.0000,0.0000,-0.6613 -0.7501,0.0000,0.0000,-0.6613 -0.7501,0.0000,0.0000,-0.6613 -0.7396,0.0000,0.0000,-0.6730 -0.7396,0.0000,0.0000,-0.6730 -0.7396,0.0000,0.0000,-0.6730 -0.7396,0.0000,0.0000,-0.6730 -0.7290,0.0000,0.0000,-0.6845 -0.7290,0.0000,0.0000,-0.6845 -0.7290,0.0000,0.0000,-0.6845 -0.7290,0.0000,0.0000,-0.6845 -0.7181,0.0000,0.0000,-0.6959 -0.7181,0.0000,0.0000,-0.6959 -0.7181,0.0000,0.0000,-0.6959 -0.7181,0.0000,0.0000,-0.6959 -0.7071,0.0000,0.0000,-0.7071 -0.7071,0.0000,0.0000,-0.7071 -0.7071,0.0000,0.0000,-0.7071 -0.7071,0.0000,0.0000,-0.7071 -0.6959,0.0000,0.0000,-0.7181 -0.6959,0.0000,0.0000,-0.7181 -0.6959,0.0000,0.0000,-0.7181 -0.6959,0.0000,0.0000,-0.7181 -0.6845,0.0000,0.0000,-0.7290 -0.6845,0.0000,0.0000,-0.7290 -0.6845,0.0000,0.0000,-0.7290 -0.6845,0.0000,0.0000,-0.7290 -0.6730,0.0000,0.0000,-0.7396 -0.6730,0.0000,0.0000,-0.7396 -0.6730,0.0000,0.0000,-0.7396 -0.6730,0.0000,0.0000,-0.7396 -0.6613,0.0000,0.0000,-0.7501 -0.6613,0.0000,0.0000,-0.7501 -0.6613,0.0000,0.0000,-0.7501 -0.6613,0.0000,0.0000,-0.7501 -0.6494,0.0000,0.0000,-0.7604 -0.6494,0.0000,0.0000,-0.7604 -0.6494,0.0000,0.0000,-0.7604 -0.6494,0.0000,0.0000,-0.7604 -0.6374,0.0000,0.0000,-0.7705 -0.6374,0.0000,0.0000,-0.7705 -0.6374,0.0000,0.0000,-0.7705 -0.6374,0.0000,0.0000,-0.7705 -0.6252,0.0000,0.0000,-0.7804 -0.6252,0.0000,0.0000,-0.7804 -0.6252,0.0000,0.0000,-0.7804 -0.6252,0.0000,0.0000,-0.7804 -0.6129,0.0000,0.0000,-0.7902 -0.6129,0.0000,0.0000,-0.7902 -0.6129,0.0000,0.0000,-0.7902 -0.6129,0.0000,0.0000,-0.7902 -0.6004,0.0000,0.0000,-0.7997 -0.6004,0.0000,0.0000,-0.7997 -0.6004,0.0000,0.0000,-0.7997 -0.6004,0.0000,0.0000,-0.7997 -0.5878,0.0000,0.0000,-0.8090 -0.5878,0.0000,0.0000,-0.8090 -0.5878,0.0000,0.0000,-0.8090 -0.5878,0.0000,0.0000,-0.8090 -0.5750,0.0000,0.0000,-0.8181 -0.5750,0.0000,0.0000,-0.8181 -0.5750,0.0000,0.0000,-0.8181 -0.5750,0.0000,0.0000,-0.8181 -0.5621,0.0000,0.0000,-0.8271 -0.5621,0.0000,0.0000,-0.8271 -0.5621,0.0000,0.0000,-0.8271 -0.5621,0.0000,0.0000,-0.8271 -0.5490,0.0000,0.0000,-0.8358 -0.5490,0.0000,0.0000,-0.8358 -0.5490,0.0000,0.0000,-0.8358 -0.5490,0.0000,0.0000,-0.8358 -0.5358,0.0000,0.0000,-0.8443 -0.5358,0.0000,0.0000,-0.8443 -0.5358,0.0000,0.0000,-0.8443 -0.5358,0.0000,0.0000,-0.8443 -0.5225,0.0000,0.0000,-0.8526 -0.5225,0.0000,0.0000,-0.8526 -0.5225,0.0000,0.0000,-0.8526 -0.5225,0.0000,0.0000,-0.8526 -0.5090,0.0000,0.0000,-0.8607 -0.5090,0.0000,0.0000,-0.8607 -0.5090,0.0000,0.0000,-0.8607 -0.5090,0.0000,0.0000,-0.8607 -0.4955,0.0000,0.0000,-0.8686 -0.4955,0.0000,0.0000,-0.8686 -0.4955,0.0000,0.0000,-0.8686 -0.4955,0.0000,0.0000,-0.8686 -0.4818,0.0000,0.0000,-0.8763 -0.4818,0.0000,0.0000,-0.8763 -0.4818,0.0000,0.0000,-0.8763 -0.4818,0.0000,0.0000,-0.8763 -0.4679,0.0000,0.0000,-0.8838 -0.4679,0.0000,0.0000,-0.8838 -0.4679,0.0000,0.0000,-0.8838 -0.4679,0.0000,0.0000,-0.8838 -0.4540,0.0000,0.0000,-0.8910 -0.4540,0.0000,0.0000,-0.8910 -0.4540,0.0000,0.0000,-0.8910 -0.4540,0.0000,0.0000,-0.8910 -0.4399,0.0000,0.0000,-0.8980 -0.4399,0.0000,0.0000,-0.8980 -0.4399,0.0000,0.0000,-0.8980 -0.4399,0.0000,0.0000,-0.8980 -0.4258,0.0000,0.0000,-0.9048 -0.4258,0.0000,0.0000,-0.9048 -0.4258,0.0000,0.0000,-0.9048 -0.4258,0.0000,0.0000,-0.9048 -0.4115,0.0000,0.0000,-0.9114 -0.4115,0.0000,0.0000,-0.9114 -0.4115,0.0000,0.0000,-0.9114 -0.4115,0.0000,0.0000,-0.9114 -0.3971,0.0000,0.0000,-0.9178 -0.3971,0.0000,0.0000,-0.9178 -0.3971,0.0000,0.0000,-0.9178 -0.3971,0.0000,0.0000,-0.9178 -0.3827,0.0000,0.0000,-0.9239 -0.3827,0.0000,0.0000,-0.9239 -0.3827,0.0000,0.0000,-0.9239 -0.3827,0.0000,0.0000,-0.9239 -0.3681,0.0000,0.0000,-0.9298 -0.3681,0.0000,0.0000,-0.9298 -0.3681,0.0000,0.0000,-0.9298 -0.3681,0.0000,0.0000,-0.9298 -0.3535,0.0000,0.0000,-0.9354 -0.3535,0.0000,0.0000,-0.9354 -0.3535,0.0000,0.0000,-0.9354 -0.3535,0.0000,0.0000,-0.9354 -0.3387,0.0000,0.0000,-0.9409 -0.3387,0.0000,0.0000,-0.9409 -0.3387,0.0000,0.0000,-0.9409 -0.3387,0.0000,0.0000,-0.9409 -0.3239,0.0000,0.0000,-0.9461 -0.3239,0.0000,0.0000,-0.9461 -0.3239,0.0000,0.0000,-0.9461 -0.3239,0.0000,0.0000,-0.9461 -0.3090,0.0000,0.0000,-0.9511 -0.3090,0.0000,0.0000,-0.9511 -0.3090,0.0000,0.0000,-0.9511 -0.3090,0.0000,0.0000,-0.9511 -0.2940,0.0000,0.0000,-0.9558 -0.2940,0.0000,0.0000,-0.9558 -0.2940,0.0000,0.0000,-0.9558 -0.2940,0.0000,0.0000,-0.9558 -0.2790,0.0000,0.0000,-0.9603 -0.2790,0.0000,0.0000,-0.9603 -0.2790,0.0000,0.0000,-0.9603 -0.2790,0.0000,0.0000,-0.9603 -0.2639,0.0000,0.0000,-0.9646 -0.2639,0.0000,0.0000,-0.9646 -0.2639,0.0000,0.0000,-0.9646 -0.2639,0.0000,0.0000,-0.9646 -0.2487,0.0000,0.0000,-0.9686 -0.2487,0.0000,0.0000,-0.9686 -0.2487,0.0000,0.0000,-0.9686 -0.2487,0.0000,0.0000,-0.9686 -0.2334,0.0000,0.0000,-0.9724 -0.2334,0.0000,0.0000,-0.9724 -0.2334,0.0000,0.0000,-0.9724 -0.2334,0.0000,0.0000,-0.9724 -0.2181,0.0000,0.0000,-0.9759 -0.2181,0.0000,0.0000,-0.9759 -0.2181,0.0000,0.0000,-0.9759 -0.2181,0.0000,0.0000,-0.9759 -0.2028,0.0000,0.0000,-0.9792 -0.2028,0.0000,0.0000,-0.9792 -0.2028,0.0000,0.0000,-0.9792 -0.2028,0.0000,0.0000,-0.9792 -0.1874,0.0000,0.0000,-0.9823 -0.1874,0.0000,0.0000,-0.9823 -0.1874,0.0000,0.0000,-0.9823 -0.1874,0.0000,0.0000,-0.9823 -0.1719,0.0000,0.0000,-0.9851 -0.1719,0.0000,0.0000,-0.9851 -0.1719,0.0000,0.0000,-0.9851 -0.1719,0.0000,0.0000,-0.9851 -0.1564,0.0000,0.0000,-0.9877 -0.1564,0.0000,0.0000,-0.9877 -0.1564,0.0000,0.0000,-0.9877 -0.1564,0.0000,0.0000,-0.9877 -0.1409,0.0000,0.0000,-0.9900 -0.1409,0.0000,0.0000,-0.9900 -0.1409,0.0000,0.0000,-0.9900 -0.1409,0.0000,0.0000,-0.9900 -0.1253,0.0000,0.0000,-0.9921 -0.1253,0.0000,0.0000,-0.9921 -0.1253,0.0000,0.0000,-0.9921 -0.1253,0.0000,0.0000,-0.9921 -0.1097,0.0000,0.0000,-0.9940 -0.1097,0.0000,0.0000,-0.9940 -0.1097,0.0000,0.0000,-0.9940 -0.1097,0.0000,0.0000,-0.9940 -0.0941,0.0000,0.0000,-0.9956 -0.0941,0.0000,0.0000,-0.9956 -0.0941,0.0000,0.0000,-0.9956 -0.0941,0.0000,0.0000,-0.9956 -0.0785,0.0000,0.0000,-0.9969 -0.0785,0.0000,0.0000,-0.9969 -0.0785,0.0000,0.0000,-0.9969 -0.0785,0.0000,0.0000,-0.9969 -0.0628,0.0000,0.0000,-0.9980 -0.0628,0.0000,0.0000,-0.9980 -0.0628,0.0000,0.0000,-0.9980 -0.0628,0.0000,0.0000,-0.9980 -0.0471,0.0000,0.0000,-0.9989 -0.0471,0.0000,0.0000,-0.9989 -0.0471,0.0000,0.0000,-0.9989 -0.0471,0.0000,0.0000,-0.9989 -0.0314,0.0000,0.0000,-0.9995 -0.0314,0.0000,0.0000,-0.9995 -0.0314,0.0000,0.0000,-0.9995 -0.0314,0.0000,0.0000,-0.9995 -0.0157,0.0000,0.0000,-0.9999 -0.0157,0.0000,0.0000,-0.9999 -0.0157,0.0000,0.0000,-0.9999 -0.0157,0.0000,0.0000,-0.9999 --0.0000,0.0000,0.0000,-1.0000 --0.0000,0.0000,0.0000,-1.0000 --0.0000,0.0000,0.0000,-1.0000 --0.0000,0.0000,0.0000,-1.0000 --0.0157,0.0000,0.0000,-0.9999 --0.0157,0.0000,0.0000,-0.9999 --0.0157,0.0000,0.0000,-0.9999 --0.0157,0.0000,0.0000,-0.9999 --0.0314,0.0000,0.0000,-0.9995 --0.0314,0.0000,0.0000,-0.9995 --0.0314,0.0000,0.0000,-0.9995 --0.0314,0.0000,0.0000,-0.9995 --0.0471,0.0000,0.0000,-0.9989 --0.0471,0.0000,0.0000,-0.9989 --0.0471,0.0000,0.0000,-0.9989 --0.0471,0.0000,0.0000,-0.9989 --0.0628,0.0000,0.0000,-0.9980 --0.0628,0.0000,0.0000,-0.9980 --0.0628,0.0000,0.0000,-0.9980 --0.0628,0.0000,0.0000,-0.9980 --0.0785,0.0000,0.0000,-0.9969 --0.0785,0.0000,0.0000,-0.9969 --0.0785,0.0000,0.0000,-0.9969 --0.0785,0.0000,0.0000,-0.9969 --0.0941,0.0000,0.0000,-0.9956 --0.0941,0.0000,0.0000,-0.9956 --0.0941,0.0000,0.0000,-0.9956 --0.0941,0.0000,0.0000,-0.9956 --0.1097,0.0000,0.0000,-0.9940 --0.1097,0.0000,0.0000,-0.9940 --0.1097,0.0000,0.0000,-0.9940 --0.1097,0.0000,0.0000,-0.9940 --0.1253,0.0000,0.0000,-0.9921 --0.1253,0.0000,0.0000,-0.9921 --0.1253,0.0000,0.0000,-0.9921 --0.1253,0.0000,0.0000,-0.9921 --0.1409,0.0000,0.0000,-0.9900 --0.1409,0.0000,0.0000,-0.9900 --0.1409,0.0000,0.0000,-0.9900 --0.1409,0.0000,0.0000,-0.9900 --0.1564,0.0000,0.0000,-0.9877 --0.1564,0.0000,0.0000,-0.9877 --0.1564,0.0000,0.0000,-0.9877 --0.1564,0.0000,0.0000,-0.9877 --0.1719,0.0000,0.0000,-0.9851 --0.1719,0.0000,0.0000,-0.9851 --0.1719,0.0000,0.0000,-0.9851 --0.1719,0.0000,0.0000,-0.9851 --0.1874,0.0000,0.0000,-0.9823 --0.1874,0.0000,0.0000,-0.9823 --0.1874,0.0000,0.0000,-0.9823 --0.1874,0.0000,0.0000,-0.9823 --0.2028,0.0000,0.0000,-0.9792 --0.2028,0.0000,0.0000,-0.9792 --0.2028,0.0000,0.0000,-0.9792 --0.2028,0.0000,0.0000,-0.9792 --0.2181,0.0000,0.0000,-0.9759 --0.2181,0.0000,0.0000,-0.9759 --0.2181,0.0000,0.0000,-0.9759 --0.2181,0.0000,0.0000,-0.9759 --0.2334,0.0000,0.0000,-0.9724 --0.2334,0.0000,0.0000,-0.9724 --0.2334,0.0000,0.0000,-0.9724 --0.2334,0.0000,0.0000,-0.9724 --0.2487,0.0000,0.0000,-0.9686 --0.2487,0.0000,0.0000,-0.9686 --0.2487,0.0000,0.0000,-0.9686 --0.2487,0.0000,0.0000,-0.9686 --0.2639,0.0000,0.0000,-0.9646 --0.2639,0.0000,0.0000,-0.9646 --0.2639,0.0000,0.0000,-0.9646 --0.2639,0.0000,0.0000,-0.9646 --0.2790,0.0000,0.0000,-0.9603 --0.2790,0.0000,0.0000,-0.9603 --0.2790,0.0000,0.0000,-0.9603 --0.2790,0.0000,0.0000,-0.9603 --0.2940,0.0000,0.0000,-0.9558 --0.2940,0.0000,0.0000,-0.9558 --0.2940,0.0000,0.0000,-0.9558 --0.2940,0.0000,0.0000,-0.9558 --0.3090,0.0000,0.0000,-0.9511 --0.3090,0.0000,0.0000,-0.9511 --0.3090,0.0000,0.0000,-0.9511 --0.3090,0.0000,0.0000,-0.9511 --0.3239,0.0000,0.0000,-0.9461 --0.3239,0.0000,0.0000,-0.9461 --0.3239,0.0000,0.0000,-0.9461 --0.3239,0.0000,0.0000,-0.9461 --0.3387,0.0000,0.0000,-0.9409 --0.3387,0.0000,0.0000,-0.9409 --0.3387,0.0000,0.0000,-0.9409 --0.3387,0.0000,0.0000,-0.9409 --0.3535,0.0000,0.0000,-0.9354 --0.3535,0.0000,0.0000,-0.9354 --0.3535,0.0000,0.0000,-0.9354 --0.3535,0.0000,0.0000,-0.9354 --0.3681,0.0000,0.0000,-0.9298 --0.3681,0.0000,0.0000,-0.9298 --0.3681,0.0000,0.0000,-0.9298 --0.3681,0.0000,0.0000,-0.9298 --0.3827,0.0000,0.0000,-0.9239 --0.3827,0.0000,0.0000,-0.9239 --0.3827,0.0000,0.0000,-0.9239 --0.3827,0.0000,0.0000,-0.9239 --0.3971,0.0000,0.0000,-0.9178 --0.3971,0.0000,0.0000,-0.9178 --0.3971,0.0000,0.0000,-0.9178 --0.3971,0.0000,0.0000,-0.9178 --0.4115,0.0000,0.0000,-0.9114 --0.4115,0.0000,0.0000,-0.9114 --0.4115,0.0000,0.0000,-0.9114 --0.4115,0.0000,0.0000,-0.9114 --0.4258,0.0000,0.0000,-0.9048 --0.4258,0.0000,0.0000,-0.9048 --0.4258,0.0000,0.0000,-0.9048 --0.4258,0.0000,0.0000,-0.9048 --0.4399,0.0000,0.0000,-0.8980 --0.4399,0.0000,0.0000,-0.8980 --0.4399,0.0000,0.0000,-0.8980 --0.4399,0.0000,0.0000,-0.8980 --0.4540,0.0000,0.0000,-0.8910 --0.4540,0.0000,0.0000,-0.8910 --0.4540,0.0000,0.0000,-0.8910 --0.4540,0.0000,0.0000,-0.8910 --0.4679,0.0000,0.0000,-0.8838 --0.4679,0.0000,0.0000,-0.8838 --0.4679,0.0000,0.0000,-0.8838 --0.4679,0.0000,0.0000,-0.8838 --0.4818,0.0000,0.0000,-0.8763 --0.4818,0.0000,0.0000,-0.8763 --0.4818,0.0000,0.0000,-0.8763 --0.4818,0.0000,0.0000,-0.8763 --0.4955,0.0000,0.0000,-0.8686 --0.4955,0.0000,0.0000,-0.8686 --0.4955,0.0000,0.0000,-0.8686 --0.4955,0.0000,0.0000,-0.8686 --0.5090,0.0000,0.0000,-0.8607 --0.5090,0.0000,0.0000,-0.8607 --0.5090,0.0000,0.0000,-0.8607 --0.5090,0.0000,0.0000,-0.8607 --0.5225,0.0000,0.0000,-0.8526 --0.5225,0.0000,0.0000,-0.8526 --0.5225,0.0000,0.0000,-0.8526 --0.5225,0.0000,0.0000,-0.8526 --0.5358,0.0000,0.0000,-0.8443 --0.5358,0.0000,0.0000,-0.8443 --0.5358,0.0000,0.0000,-0.8443 --0.5358,0.0000,0.0000,-0.8443 --0.5490,0.0000,0.0000,-0.8358 --0.5490,0.0000,0.0000,-0.8358 --0.5490,0.0000,0.0000,-0.8358 --0.5490,0.0000,0.0000,-0.8358 --0.5621,0.0000,0.0000,-0.8271 --0.5621,0.0000,0.0000,-0.8271 --0.5621,0.0000,0.0000,-0.8271 --0.5621,0.0000,0.0000,-0.8271 --0.5750,0.0000,0.0000,-0.8181 --0.5750,0.0000,0.0000,-0.8181 --0.5750,0.0000,0.0000,-0.8181 --0.5750,0.0000,0.0000,-0.8181 --0.5878,0.0000,0.0000,-0.8090 --0.5878,0.0000,0.0000,-0.8090 --0.5878,0.0000,0.0000,-0.8090 --0.5878,0.0000,0.0000,-0.8090 --0.6004,0.0000,0.0000,-0.7997 --0.6004,0.0000,0.0000,-0.7997 --0.6004,0.0000,0.0000,-0.7997 --0.6004,0.0000,0.0000,-0.7997 --0.6129,0.0000,0.0000,-0.7902 --0.6129,0.0000,0.0000,-0.7902 --0.6129,0.0000,0.0000,-0.7902 --0.6129,0.0000,0.0000,-0.7902 --0.6252,0.0000,0.0000,-0.7804 --0.6252,0.0000,0.0000,-0.7804 --0.6252,0.0000,0.0000,-0.7804 --0.6252,0.0000,0.0000,-0.7804 --0.6374,0.0000,0.0000,-0.7705 --0.6374,0.0000,0.0000,-0.7705 --0.6374,0.0000,0.0000,-0.7705 --0.6374,0.0000,0.0000,-0.7705 --0.6494,0.0000,0.0000,-0.7604 --0.6494,0.0000,0.0000,-0.7604 --0.6494,0.0000,0.0000,-0.7604 --0.6494,0.0000,0.0000,-0.7604 --0.6613,0.0000,0.0000,-0.7501 --0.6613,0.0000,0.0000,-0.7501 --0.6613,0.0000,0.0000,-0.7501 --0.6613,0.0000,0.0000,-0.7501 --0.6730,0.0000,0.0000,-0.7396 --0.6730,0.0000,0.0000,-0.7396 --0.6730,0.0000,0.0000,-0.7396 --0.6730,0.0000,0.0000,-0.7396 --0.6845,0.0000,0.0000,-0.7290 --0.6845,0.0000,0.0000,-0.7290 --0.6845,0.0000,0.0000,-0.7290 --0.6845,0.0000,0.0000,-0.7290 --0.6959,0.0000,0.0000,-0.7181 --0.6959,0.0000,0.0000,-0.7181 --0.6959,0.0000,0.0000,-0.7181 --0.6959,0.0000,0.0000,-0.7181 --0.7071,0.0000,0.0000,-0.7071 --0.7071,0.0000,0.0000,-0.7071 --0.7071,0.0000,0.0000,-0.7071 --0.7071,0.0000,0.0000,-0.7071 --0.7181,0.0000,0.0000,-0.6959 --0.7181,0.0000,0.0000,-0.6959 --0.7181,0.0000,0.0000,-0.6959 --0.7181,0.0000,0.0000,-0.6959 --0.7290,0.0000,0.0000,-0.6845 --0.7290,0.0000,0.0000,-0.6845 --0.7290,0.0000,0.0000,-0.6845 --0.7290,0.0000,0.0000,-0.6845 --0.7396,0.0000,0.0000,-0.6730 --0.7396,0.0000,0.0000,-0.6730 --0.7396,0.0000,0.0000,-0.6730 --0.7396,0.0000,0.0000,-0.6730 --0.7501,0.0000,0.0000,-0.6613 --0.7501,0.0000,0.0000,-0.6613 --0.7501,0.0000,0.0000,-0.6613 --0.7501,0.0000,0.0000,-0.6613 --0.7604,0.0000,0.0000,-0.6494 --0.7604,0.0000,0.0000,-0.6494 --0.7604,0.0000,0.0000,-0.6494 --0.7604,0.0000,0.0000,-0.6494 --0.7705,0.0000,0.0000,-0.6374 --0.7705,0.0000,0.0000,-0.6374 --0.7705,0.0000,0.0000,-0.6374 --0.7705,0.0000,0.0000,-0.6374 --0.7804,0.0000,0.0000,-0.6252 --0.7804,0.0000,0.0000,-0.6252 --0.7804,0.0000,0.0000,-0.6252 --0.7804,0.0000,0.0000,-0.6252 --0.7902,0.0000,0.0000,-0.6129 --0.7902,0.0000,0.0000,-0.6129 --0.7902,0.0000,0.0000,-0.6129 --0.7902,0.0000,0.0000,-0.6129 --0.7997,0.0000,0.0000,-0.6004 --0.7997,0.0000,0.0000,-0.6004 --0.7997,0.0000,0.0000,-0.6004 --0.7997,0.0000,0.0000,-0.6004 --0.8090,0.0000,0.0000,-0.5878 --0.8090,0.0000,0.0000,-0.5878 --0.8090,0.0000,0.0000,-0.5878 --0.8090,0.0000,0.0000,-0.5878 --0.8182,0.0000,0.0000,-0.5750 --0.8182,0.0000,0.0000,-0.5750 --0.8182,0.0000,0.0000,-0.5750 --0.8182,0.0000,0.0000,-0.5750 --0.8271,0.0000,0.0000,-0.5621 --0.8271,0.0000,0.0000,-0.5621 --0.8271,0.0000,0.0000,-0.5621 --0.8271,0.0000,0.0000,-0.5621 --0.8358,0.0000,0.0000,-0.5490 --0.8358,0.0000,0.0000,-0.5490 --0.8358,0.0000,0.0000,-0.5490 --0.8358,0.0000,0.0000,-0.5490 --0.8443,0.0000,0.0000,-0.5358 --0.8443,0.0000,0.0000,-0.5358 --0.8443,0.0000,0.0000,-0.5358 --0.8443,0.0000,0.0000,-0.5358 --0.8526,0.0000,0.0000,-0.5225 --0.8526,0.0000,0.0000,-0.5225 --0.8526,0.0000,0.0000,-0.5225 --0.8526,0.0000,0.0000,-0.5225 --0.8607,0.0000,0.0000,-0.5090 --0.8607,0.0000,0.0000,-0.5090 --0.8607,0.0000,0.0000,-0.5090 --0.8607,0.0000,0.0000,-0.5090 --0.8686,0.0000,0.0000,-0.4955 --0.8686,0.0000,0.0000,-0.4955 --0.8686,0.0000,0.0000,-0.4955 --0.8686,0.0000,0.0000,-0.4955 --0.8763,0.0000,0.0000,-0.4818 --0.8763,0.0000,0.0000,-0.4818 --0.8763,0.0000,0.0000,-0.4818 --0.8763,0.0000,0.0000,-0.4818 --0.8838,0.0000,0.0000,-0.4679 --0.8838,0.0000,0.0000,-0.4679 --0.8838,0.0000,0.0000,-0.4679 --0.8838,0.0000,0.0000,-0.4679 --0.8910,0.0000,0.0000,-0.4540 --0.8910,0.0000,0.0000,-0.4540 --0.8910,0.0000,0.0000,-0.4540 --0.8910,0.0000,0.0000,-0.4540 --0.8980,0.0000,0.0000,-0.4399 --0.8980,0.0000,0.0000,-0.4399 --0.8980,0.0000,0.0000,-0.4399 --0.8980,0.0000,0.0000,-0.4399 --0.9048,0.0000,0.0000,-0.4258 --0.9048,0.0000,0.0000,-0.4258 --0.9048,0.0000,0.0000,-0.4258 --0.9048,0.0000,0.0000,-0.4258 --0.9114,0.0000,0.0000,-0.4115 --0.9114,0.0000,0.0000,-0.4115 --0.9114,0.0000,0.0000,-0.4115 --0.9114,0.0000,0.0000,-0.4115 --0.9178,0.0000,0.0000,-0.3971 --0.9178,0.0000,0.0000,-0.3971 --0.9178,0.0000,0.0000,-0.3971 --0.9178,0.0000,0.0000,-0.3971 --0.9239,0.0000,0.0000,-0.3827 --0.9239,0.0000,0.0000,-0.3827 --0.9239,0.0000,0.0000,-0.3827 --0.9239,0.0000,0.0000,-0.3827 --0.9298,0.0000,0.0000,-0.3681 --0.9298,0.0000,0.0000,-0.3681 --0.9298,0.0000,0.0000,-0.3681 --0.9298,0.0000,0.0000,-0.3681 --0.9354,0.0000,0.0000,-0.3535 --0.9354,0.0000,0.0000,-0.3535 --0.9354,0.0000,0.0000,-0.3535 --0.9354,0.0000,0.0000,-0.3535 --0.9409,0.0000,0.0000,-0.3387 --0.9409,0.0000,0.0000,-0.3387 --0.9409,0.0000,0.0000,-0.3387 --0.9409,0.0000,0.0000,-0.3387 --0.9461,0.0000,0.0000,-0.3239 --0.9461,0.0000,0.0000,-0.3239 --0.9461,0.0000,0.0000,-0.3239 --0.9461,0.0000,0.0000,-0.3239 --0.9511,0.0000,0.0000,-0.3090 --0.9511,0.0000,0.0000,-0.3090 --0.9511,0.0000,0.0000,-0.3090 --0.9511,0.0000,0.0000,-0.3090 --0.9558,0.0000,0.0000,-0.2940 --0.9558,0.0000,0.0000,-0.2940 --0.9558,0.0000,0.0000,-0.2940 --0.9558,0.0000,0.0000,-0.2940 --0.9603,0.0000,0.0000,-0.2790 --0.9603,0.0000,0.0000,-0.2790 --0.9603,0.0000,0.0000,-0.2790 --0.9603,0.0000,0.0000,-0.2790 --0.9646,0.0000,0.0000,-0.2639 --0.9646,0.0000,0.0000,-0.2639 --0.9646,0.0000,0.0000,-0.2639 --0.9646,0.0000,0.0000,-0.2639 --0.9686,0.0000,0.0000,-0.2487 --0.9686,0.0000,0.0000,-0.2487 --0.9686,0.0000,0.0000,-0.2487 --0.9686,0.0000,0.0000,-0.2487 --0.9724,0.0000,0.0000,-0.2334 --0.9724,0.0000,0.0000,-0.2334 --0.9724,0.0000,0.0000,-0.2334 --0.9724,0.0000,0.0000,-0.2334 --0.9759,0.0000,0.0000,-0.2181 --0.9759,0.0000,0.0000,-0.2181 --0.9759,0.0000,0.0000,-0.2181 --0.9759,0.0000,0.0000,-0.2181 --0.9792,0.0000,0.0000,-0.2028 --0.9792,0.0000,0.0000,-0.2028 --0.9792,0.0000,0.0000,-0.2028 --0.9792,0.0000,0.0000,-0.2028 --0.9823,0.0000,0.0000,-0.1874 --0.9823,0.0000,0.0000,-0.1874 --0.9823,0.0000,0.0000,-0.1874 --0.9823,0.0000,0.0000,-0.1874 --0.9851,0.0000,0.0000,-0.1719 --0.9851,0.0000,0.0000,-0.1719 --0.9851,0.0000,0.0000,-0.1719 --0.9851,0.0000,0.0000,-0.1719 --0.9877,0.0000,0.0000,-0.1564 --0.9877,0.0000,0.0000,-0.1564 --0.9877,0.0000,0.0000,-0.1564 --0.9877,0.0000,0.0000,-0.1564 --0.9900,0.0000,0.0000,-0.1409 --0.9900,0.0000,0.0000,-0.1409 --0.9900,0.0000,0.0000,-0.1409 --0.9900,0.0000,0.0000,-0.1409 --0.9921,0.0000,0.0000,-0.1253 --0.9921,0.0000,0.0000,-0.1253 --0.9921,0.0000,0.0000,-0.1253 --0.9921,0.0000,0.0000,-0.1253 --0.9940,0.0000,0.0000,-0.1097 --0.9940,0.0000,0.0000,-0.1097 --0.9940,0.0000,0.0000,-0.1097 --0.9940,0.0000,0.0000,-0.1097 --0.9956,0.0000,0.0000,-0.0941 --0.9956,0.0000,0.0000,-0.0941 --0.9956,0.0000,0.0000,-0.0941 --0.9956,0.0000,0.0000,-0.0941 --0.9969,0.0000,0.0000,-0.0785 --0.9969,0.0000,0.0000,-0.0785 --0.9969,0.0000,0.0000,-0.0785 --0.9969,0.0000,0.0000,-0.0785 --0.9980,0.0000,0.0000,-0.0628 --0.9980,0.0000,0.0000,-0.0628 --0.9980,0.0000,0.0000,-0.0628 --0.9980,0.0000,0.0000,-0.0628 --0.9989,0.0000,0.0000,-0.0471 --0.9989,0.0000,0.0000,-0.0471 --0.9989,0.0000,0.0000,-0.0471 --0.9989,0.0000,0.0000,-0.0471 --0.9995,0.0000,0.0000,-0.0314 --0.9995,0.0000,0.0000,-0.0314 --0.9995,0.0000,0.0000,-0.0314 --0.9995,0.0000,0.0000,-0.0314 --0.9999,0.0000,0.0000,-0.0157 --0.9999,0.0000,0.0000,-0.0157 --0.9999,0.0000,0.0000,-0.0157 --0.9999,0.0000,0.0000,-0.0157 -1.0000,0.0000,0.0000,-0.0000 -1.0000,0.0000,0.0000,-0.0000 -1.0000,0.0000,0.0000,-0.0000 -1.0000,0.0000,0.0000,-0.0000 diff --git a/scripts/trajectories/full-circle-with-up-and-down-4s-Vector3.csv b/scripts/trajectories/full-circle-with-up-and-down-4s-Vector3.csv deleted file mode 100644 index 8fe2d2fe05..0000000000 --- a/scripts/trajectories/full-circle-with-up-and-down-4s-Vector3.csv +++ /dev/null @@ -1,200 +0,0 @@ -0.0000,0.0000,0.0000,0.7012,-0.0220,-0.7126 -0.0000,0.0000,0.0000,0.7057,-0.0444,-0.7071 -0.0000,0.0000,0.0000,0.7095,-0.0671,-0.7015 -0.0000,0.0000,0.0000,0.7125,-0.0900,-0.6959 -0.0000,0.0000,0.0000,0.7147,-0.1132,-0.6903 -0.0000,0.0000,0.0000,0.7161,-0.1366,-0.6845 -0.0000,0.0000,0.0000,0.7166,-0.1602,-0.6788 -0.0000,0.0000,0.0000,0.7164,-0.1839,-0.6730 -0.0000,0.0000,0.0000,0.7153,-0.2078,-0.6672 -0.0000,0.0000,0.0000,0.7134,-0.2318,-0.6613 -0.0000,0.0000,0.0000,0.7106,-0.2558,-0.6554 -0.0000,0.0000,0.0000,0.7070,-0.2799,-0.6494 -0.0000,0.0000,0.0000,0.7025,-0.3040,-0.6435 -0.0000,0.0000,0.0000,0.6972,-0.3281,-0.6374 -0.0000,0.0000,0.0000,0.6910,-0.3521,-0.6314 -0.0000,0.0000,0.0000,0.6839,-0.3760,-0.6252 -0.0000,0.0000,0.0000,0.6760,-0.3998,-0.6191 -0.0000,0.0000,0.0000,0.6671,-0.4234,-0.6129 -0.0000,0.0000,0.0000,0.6575,-0.4468,-0.6067 -0.0000,0.0000,0.0000,0.6470,-0.4700,-0.6004 -0.0000,0.0000,0.0000,0.6356,-0.4930,-0.5941 -0.0000,0.0000,0.0000,0.6234,-0.5157,-0.5878 -0.0000,0.0000,0.0000,0.6103,-0.5380,-0.5814 -0.0000,0.0000,0.0000,0.5964,-0.5601,-0.5750 -0.0000,0.0000,0.0000,0.5817,-0.5817,-0.5686 -0.0000,0.0000,0.0000,0.5662,-0.6029,-0.5621 -0.0000,0.0000,0.0000,0.5499,-0.6237,-0.5556 -0.0000,0.0000,0.0000,0.5328,-0.6440,-0.5490 -0.0000,0.0000,0.0000,0.5149,-0.6638,-0.5424 -0.0000,0.0000,0.0000,0.4963,-0.6831,-0.5358 -0.0000,0.0000,0.0000,0.4769,-0.7018,-0.5292 -0.0000,0.0000,0.0000,0.4569,-0.7199,-0.5225 -0.0000,0.0000,0.0000,0.4361,-0.7374,-0.5158 -0.0000,0.0000,0.0000,0.4147,-0.7543,-0.5090 -0.0000,0.0000,0.0000,0.3926,-0.7705,-0.5023 -0.0000,0.0000,0.0000,0.3698,-0.7860,-0.4955 -0.0000,0.0000,0.0000,0.3465,-0.8007,-0.4886 -0.0000,0.0000,0.0000,0.3226,-0.8148,-0.4818 -0.0000,0.0000,0.0000,0.2981,-0.8280,-0.4749 -0.0000,0.0000,0.0000,0.2731,-0.8405,-0.4679 -0.0000,0.0000,0.0000,0.2476,-0.8522,-0.4610 -0.0000,0.0000,0.0000,0.2216,-0.8630,-0.4540 -0.0000,0.0000,0.0000,0.1951,-0.8730,-0.4470 -0.0000,0.0000,0.0000,0.1683,-0.8821,-0.4399 -0.0000,0.0000,0.0000,0.1410,-0.8904,-0.4329 -0.0000,0.0000,0.0000,0.1134,-0.8977,-0.4258 -0.0000,0.0000,0.0000,0.0855,-0.9041,-0.4187 -0.0000,0.0000,0.0000,0.0572,-0.9096,-0.4115 -0.0000,0.0000,0.0000,0.0287,-0.9142,-0.4043 -0.0000,0.0000,0.0000,-0.0000,-0.9178,-0.3971 -0.0000,0.0000,0.0000,-0.0289,-0.9204,-0.3899 -0.0000,0.0000,0.0000,-0.0580,-0.9221,-0.3827 -0.0000,0.0000,0.0000,-0.0872,-0.9227,-0.3754 -0.0000,0.0000,0.0000,-0.1165,-0.9224,-0.3681 -0.0000,0.0000,0.0000,-0.1459,-0.9212,-0.3608 -0.0000,0.0000,0.0000,-0.1753,-0.9189,-0.3535 -0.0000,0.0000,0.0000,-0.2047,-0.9156,-0.3461 -0.0000,0.0000,0.0000,-0.2340,-0.9113,-0.3387 -0.0000,0.0000,0.0000,-0.2632,-0.9060,-0.3313 -0.0000,0.0000,0.0000,-0.2924,-0.8998,-0.3239 -0.0000,0.0000,0.0000,-0.3213,-0.8925,-0.3165 -0.0000,0.0000,0.0000,-0.3501,-0.8843,-0.3090 -0.0000,0.0000,0.0000,-0.3787,-0.8750,-0.3015 -0.0000,0.0000,0.0000,-0.4070,-0.8648,-0.2940 -0.0000,0.0000,0.0000,-0.4350,-0.8536,-0.2865 -0.0000,0.0000,0.0000,-0.4626,-0.8415,-0.2790 -0.0000,0.0000,0.0000,-0.4899,-0.8284,-0.2714 -0.0000,0.0000,0.0000,-0.5168,-0.8144,-0.2639 -0.0000,0.0000,0.0000,-0.5433,-0.7995,-0.2563 -0.0000,0.0000,0.0000,-0.5693,-0.7836,-0.2487 -0.0000,0.0000,0.0000,-0.5948,-0.7669,-0.2411 -0.0000,0.0000,0.0000,-0.6198,-0.7492,-0.2334 -0.0000,0.0000,0.0000,-0.6442,-0.7307,-0.2258 -0.0000,0.0000,0.0000,-0.6681,-0.7114,-0.2181 -0.0000,0.0000,0.0000,-0.6913,-0.6913,-0.2105 -0.0000,0.0000,0.0000,-0.7138,-0.6703,-0.2028 -0.0000,0.0000,0.0000,-0.7357,-0.6486,-0.1951 -0.0000,0.0000,0.0000,-0.7569,-0.6261,-0.1874 -0.0000,0.0000,0.0000,-0.7773,-0.6029,-0.1797 -0.0000,0.0000,0.0000,-0.7970,-0.5790,-0.1719 -0.0000,0.0000,0.0000,-0.8159,-0.5545,-0.1642 -0.0000,0.0000,0.0000,-0.8339,-0.5292,-0.1564 -0.0000,0.0000,0.0000,-0.8512,-0.5034,-0.1487 -0.0000,0.0000,0.0000,-0.8676,-0.4769,-0.1409 -0.0000,0.0000,0.0000,-0.8831,-0.4499,-0.1331 -0.0000,0.0000,0.0000,-0.8977,-0.4224,-0.1253 -0.0000,0.0000,0.0000,-0.9114,-0.3944,-0.1175 -0.0000,0.0000,0.0000,-0.9242,-0.3659,-0.1097 -0.0000,0.0000,0.0000,-0.9360,-0.3370,-0.1019 -0.0000,0.0000,0.0000,-0.9468,-0.3076,-0.0941 -0.0000,0.0000,0.0000,-0.9567,-0.2779,-0.0863 -0.0000,0.0000,0.0000,-0.9656,-0.2479,-0.0785 -0.0000,0.0000,0.0000,-0.9735,-0.2176,-0.0706 -0.0000,0.0000,0.0000,-0.9803,-0.1870,-0.0628 -0.0000,0.0000,0.0000,-0.9862,-0.1562,-0.0549 -0.0000,0.0000,0.0000,-0.9910,-0.1252,-0.0471 -0.0000,0.0000,0.0000,-0.9948,-0.0940,-0.0393 -0.0000,0.0000,0.0000,-0.9975,-0.0628,-0.0314 -0.0000,0.0000,0.0000,-0.9992,-0.0314,-0.0236 -0.0000,0.0000,0.0000,-0.9999,0.0000,-0.0157 -0.0000,0.0000,0.0000,-0.9995,0.0314,-0.0079 -0.0000,0.0000,0.0000,-0.9980,0.0628,0.0000 -0.0000,0.0000,0.0000,-0.9955,0.0941,0.0079 -0.0000,0.0000,0.0000,-0.9920,0.1253,0.0157 -0.0000,0.0000,0.0000,-0.9874,0.1564,0.0236 -0.0000,0.0000,0.0000,-0.9818,0.1873,0.0314 -0.0000,0.0000,0.0000,-0.9752,0.2180,0.0393 -0.0000,0.0000,0.0000,-0.9675,0.2484,0.0471 -0.0000,0.0000,0.0000,-0.9588,0.2786,0.0550 -0.0000,0.0000,0.0000,-0.9492,0.3084,0.0628 -0.0000,0.0000,0.0000,-0.9385,0.3379,0.0706 -0.0000,0.0000,0.0000,-0.9269,0.3670,0.0785 -0.0000,0.0000,0.0000,-0.9143,0.3957,0.0863 -0.0000,0.0000,0.0000,-0.9008,0.4239,0.0941 -0.0000,0.0000,0.0000,-0.8864,0.4516,0.1019 -0.0000,0.0000,0.0000,-0.8710,0.4788,0.1097 -0.0000,0.0000,0.0000,-0.8548,0.5055,0.1175 -0.0000,0.0000,0.0000,-0.8377,0.5316,0.1253 -0.0000,0.0000,0.0000,-0.8197,0.5571,0.1331 -0.0000,0.0000,0.0000,-0.8009,0.5819,0.1409 -0.0000,0.0000,0.0000,-0.7814,0.6061,0.1487 -0.0000,0.0000,0.0000,-0.7610,0.6296,0.1564 -0.0000,0.0000,0.0000,-0.7399,0.6523,0.1642 -0.0000,0.0000,0.0000,-0.7181,0.6744,0.1719 -0.0000,0.0000,0.0000,-0.6956,0.6956,0.1797 -0.0000,0.0000,0.0000,-0.6724,0.7161,0.1874 -0.0000,0.0000,0.0000,-0.6486,0.7357,0.1951 -0.0000,0.0000,0.0000,-0.6242,0.7545,0.2028 -0.0000,0.0000,0.0000,-0.5992,0.7725,0.2105 -0.0000,0.0000,0.0000,-0.5736,0.7895,0.2181 -0.0000,0.0000,0.0000,-0.5476,0.8057,0.2258 -0.0000,0.0000,0.0000,-0.5210,0.8210,0.2334 -0.0000,0.0000,0.0000,-0.4940,0.8354,0.2411 -0.0000,0.0000,0.0000,-0.4666,0.8488,0.2487 -0.0000,0.0000,0.0000,-0.4388,0.8612,0.2563 -0.0000,0.0000,0.0000,-0.4107,0.8728,0.2639 -0.0000,0.0000,0.0000,-0.3822,0.8833,0.2714 -0.0000,0.0000,0.0000,-0.3535,0.8929,0.2790 -0.0000,0.0000,0.0000,-0.3245,0.9014,0.2865 -0.0000,0.0000,0.0000,-0.2954,0.9090,0.2940 -0.0000,0.0000,0.0000,-0.2660,0.9156,0.3015 -0.0000,0.0000,0.0000,-0.2365,0.9212,0.3090 -0.0000,0.0000,0.0000,-0.2069,0.9258,0.3165 -0.0000,0.0000,0.0000,-0.1773,0.9293,0.3239 -0.0000,0.0000,0.0000,-0.1476,0.9319,0.3313 -0.0000,0.0000,0.0000,-0.1179,0.9335,0.3387 -0.0000,0.0000,0.0000,-0.0883,0.9340,0.3461 -0.0000,0.0000,0.0000,-0.0587,0.9336,0.3535 -0.0000,0.0000,0.0000,-0.0293,0.9322,0.3608 -0.0000,0.0000,0.0000,0.0000,0.9298,0.3681 -0.0000,0.0000,0.0000,0.0291,0.9264,0.3754 -0.0000,0.0000,0.0000,0.0580,0.9221,0.3827 -0.0000,0.0000,0.0000,0.0867,0.9168,0.3899 -0.0000,0.0000,0.0000,0.1150,0.9105,0.3971 -0.0000,0.0000,0.0000,0.1431,0.9033,0.4043 -0.0000,0.0000,0.0000,0.1708,0.8953,0.4115 -0.0000,0.0000,0.0000,0.1981,0.8863,0.4187 -0.0000,0.0000,0.0000,0.2250,0.8764,0.4258 -0.0000,0.0000,0.0000,0.2515,0.8657,0.4329 -0.0000,0.0000,0.0000,0.2775,0.8541,0.4399 -0.0000,0.0000,0.0000,0.3030,0.8417,0.4470 -0.0000,0.0000,0.0000,0.3280,0.8284,0.4540 -0.0000,0.0000,0.0000,0.3524,0.8144,0.4610 -0.0000,0.0000,0.0000,0.3763,0.7997,0.4679 -0.0000,0.0000,0.0000,0.3995,0.7841,0.4749 -0.0000,0.0000,0.0000,0.4222,0.7679,0.4818 -0.0000,0.0000,0.0000,0.4441,0.7510,0.4886 -0.0000,0.0000,0.0000,0.4654,0.7334,0.4955 -0.0000,0.0000,0.0000,0.4860,0.7152,0.5023 -0.0000,0.0000,0.0000,0.5059,0.6964,0.5090 -0.0000,0.0000,0.0000,0.5251,0.6769,0.5158 -0.0000,0.0000,0.0000,0.5435,0.6570,0.5225 -0.0000,0.0000,0.0000,0.5611,0.6365,0.5292 -0.0000,0.0000,0.0000,0.5780,0.6155,0.5358 -0.0000,0.0000,0.0000,0.5940,0.5940,0.5424 -0.0000,0.0000,0.0000,0.6093,0.5721,0.5490 -0.0000,0.0000,0.0000,0.6237,0.5499,0.5556 -0.0000,0.0000,0.0000,0.6373,0.5272,0.5621 -0.0000,0.0000,0.0000,0.6500,0.5042,0.5686 -0.0000,0.0000,0.0000,0.6619,0.4809,0.5750 -0.0000,0.0000,0.0000,0.6729,0.4573,0.5814 -0.0000,0.0000,0.0000,0.6831,0.4335,0.5878 -0.0000,0.0000,0.0000,0.6924,0.4095,0.5941 -0.0000,0.0000,0.0000,0.7008,0.3852,0.6004 -0.0000,0.0000,0.0000,0.7083,0.3609,0.6067 -0.0000,0.0000,0.0000,0.7150,0.3364,0.6129 -0.0000,0.0000,0.0000,0.7207,0.3119,0.6191 -0.0000,0.0000,0.0000,0.7256,0.2873,0.6252 -0.0000,0.0000,0.0000,0.7296,0.2627,0.6314 -0.0000,0.0000,0.0000,0.7328,0.2381,0.6374 -0.0000,0.0000,0.0000,0.7351,0.2136,0.6435 -0.0000,0.0000,0.0000,0.7365,0.1891,0.6494 -0.0000,0.0000,0.0000,0.7371,0.1648,0.6554 -0.0000,0.0000,0.0000,0.7368,0.1406,0.6613 -0.0000,0.0000,0.0000,0.7357,0.1165,0.6672 -0.0000,0.0000,0.0000,0.7338,0.0927,0.6730 -0.0000,0.0000,0.0000,0.7311,0.0691,0.6788 -0.0000,0.0000,0.0000,0.7275,0.0458,0.6845 -0.0000,0.0000,0.0000,0.7232,0.0227,0.6903 -0.0000,0.0000,0.0000,0.7181,-0.0000,0.6959 diff --git a/scripts/trajectories/full-circle-with-up-and-down-4s-ccw-Vector3.csv b/scripts/trajectories/full-circle-with-up-and-down-4s-ccw-Vector3.csv deleted file mode 100644 index 6310889020..0000000000 --- a/scripts/trajectories/full-circle-with-up-and-down-4s-ccw-Vector3.csv +++ /dev/null @@ -1,200 +0,0 @@ -0.0000,0.0000,0.0000,0.7012,0.0220,0.7126 -0.0000,0.0000,0.0000,0.7057,0.0444,0.7071 -0.0000,0.0000,0.0000,0.7095,0.0671,0.7015 -0.0000,0.0000,0.0000,0.7125,0.0900,0.6959 -0.0000,0.0000,0.0000,0.7147,0.1132,0.6903 -0.0000,0.0000,0.0000,0.7161,0.1366,0.6845 -0.0000,0.0000,0.0000,0.7166,0.1602,0.6788 -0.0000,0.0000,0.0000,0.7164,0.1839,0.6730 -0.0000,0.0000,0.0000,0.7153,0.2078,0.6672 -0.0000,0.0000,0.0000,0.7134,0.2318,0.6613 -0.0000,0.0000,0.0000,0.7106,0.2558,0.6554 -0.0000,0.0000,0.0000,0.7070,0.2799,0.6494 -0.0000,0.0000,0.0000,0.7025,0.3040,0.6435 -0.0000,0.0000,0.0000,0.6972,0.3281,0.6374 -0.0000,0.0000,0.0000,0.6910,0.3521,0.6314 -0.0000,0.0000,0.0000,0.6839,0.3760,0.6252 -0.0000,0.0000,0.0000,0.6760,0.3998,0.6191 -0.0000,0.0000,0.0000,0.6671,0.4234,0.6129 -0.0000,0.0000,0.0000,0.6575,0.4468,0.6067 -0.0000,0.0000,0.0000,0.6470,0.4700,0.6004 -0.0000,0.0000,0.0000,0.6356,0.4930,0.5941 -0.0000,0.0000,0.0000,0.6234,0.5157,0.5878 -0.0000,0.0000,0.0000,0.6103,0.5380,0.5814 -0.0000,0.0000,0.0000,0.5964,0.5601,0.5750 -0.0000,0.0000,0.0000,0.5817,0.5817,0.5686 -0.0000,0.0000,0.0000,0.5662,0.6029,0.5621 -0.0000,0.0000,0.0000,0.5499,0.6237,0.5556 -0.0000,0.0000,0.0000,0.5328,0.6440,0.5490 -0.0000,0.0000,0.0000,0.5149,0.6638,0.5424 -0.0000,0.0000,0.0000,0.4963,0.6831,0.5358 -0.0000,0.0000,0.0000,0.4769,0.7018,0.5292 -0.0000,0.0000,0.0000,0.4569,0.7199,0.5225 -0.0000,0.0000,0.0000,0.4361,0.7374,0.5158 -0.0000,0.0000,0.0000,0.4147,0.7543,0.5090 -0.0000,0.0000,0.0000,0.3926,0.7705,0.5023 -0.0000,0.0000,0.0000,0.3698,0.7860,0.4955 -0.0000,0.0000,0.0000,0.3465,0.8007,0.4886 -0.0000,0.0000,0.0000,0.3226,0.8148,0.4818 -0.0000,0.0000,0.0000,0.2981,0.8280,0.4749 -0.0000,0.0000,0.0000,0.2731,0.8405,0.4679 -0.0000,0.0000,0.0000,0.2476,0.8522,0.4610 -0.0000,0.0000,0.0000,0.2216,0.8630,0.4540 -0.0000,0.0000,0.0000,0.1951,0.8730,0.4470 -0.0000,0.0000,0.0000,0.1683,0.8821,0.4399 -0.0000,0.0000,0.0000,0.1410,0.8904,0.4329 -0.0000,0.0000,0.0000,0.1134,0.8977,0.4258 -0.0000,0.0000,0.0000,0.0855,0.9041,0.4187 -0.0000,0.0000,0.0000,0.0572,0.9096,0.4115 -0.0000,0.0000,0.0000,0.0287,0.9142,0.4043 -0.0000,0.0000,0.0000,-0.0000,0.9178,0.3971 -0.0000,0.0000,0.0000,-0.0289,0.9204,0.3899 -0.0000,0.0000,0.0000,-0.0580,0.9221,0.3827 -0.0000,0.0000,0.0000,-0.0872,0.9227,0.3754 -0.0000,0.0000,0.0000,-0.1165,0.9224,0.3681 -0.0000,0.0000,0.0000,-0.1459,0.9212,0.3608 -0.0000,0.0000,0.0000,-0.1753,0.9189,0.3535 -0.0000,0.0000,0.0000,-0.2047,0.9156,0.3461 -0.0000,0.0000,0.0000,-0.2340,0.9113,0.3387 -0.0000,0.0000,0.0000,-0.2632,0.9060,0.3313 -0.0000,0.0000,0.0000,-0.2924,0.8998,0.3239 -0.0000,0.0000,0.0000,-0.3213,0.8925,0.3165 -0.0000,0.0000,0.0000,-0.3501,0.8843,0.3090 -0.0000,0.0000,0.0000,-0.3787,0.8750,0.3015 -0.0000,0.0000,0.0000,-0.4070,0.8648,0.2940 -0.0000,0.0000,0.0000,-0.4350,0.8536,0.2865 -0.0000,0.0000,0.0000,-0.4626,0.8415,0.2790 -0.0000,0.0000,0.0000,-0.4899,0.8284,0.2714 -0.0000,0.0000,0.0000,-0.5168,0.8144,0.2639 -0.0000,0.0000,0.0000,-0.5433,0.7995,0.2563 -0.0000,0.0000,0.0000,-0.5693,0.7836,0.2487 -0.0000,0.0000,0.0000,-0.5948,0.7669,0.2411 -0.0000,0.0000,0.0000,-0.6198,0.7492,0.2334 -0.0000,0.0000,0.0000,-0.6442,0.7307,0.2258 -0.0000,0.0000,0.0000,-0.6681,0.7114,0.2181 -0.0000,0.0000,0.0000,-0.6913,0.6913,0.2105 -0.0000,0.0000,0.0000,-0.7138,0.6703,0.2028 -0.0000,0.0000,0.0000,-0.7357,0.6486,0.1951 -0.0000,0.0000,0.0000,-0.7569,0.6261,0.1874 -0.0000,0.0000,0.0000,-0.7773,0.6029,0.1797 -0.0000,0.0000,0.0000,-0.7970,0.5790,0.1719 -0.0000,0.0000,0.0000,-0.8159,0.5545,0.1642 -0.0000,0.0000,0.0000,-0.8339,0.5292,0.1564 -0.0000,0.0000,0.0000,-0.8512,0.5034,0.1487 -0.0000,0.0000,0.0000,-0.8676,0.4769,0.1409 -0.0000,0.0000,0.0000,-0.8831,0.4499,0.1331 -0.0000,0.0000,0.0000,-0.8977,0.4224,0.1253 -0.0000,0.0000,0.0000,-0.9114,0.3944,0.1175 -0.0000,0.0000,0.0000,-0.9242,0.3659,0.1097 -0.0000,0.0000,0.0000,-0.9360,0.3370,0.1019 -0.0000,0.0000,0.0000,-0.9468,0.3076,0.0941 -0.0000,0.0000,0.0000,-0.9567,0.2779,0.0863 -0.0000,0.0000,0.0000,-0.9656,0.2479,0.0785 -0.0000,0.0000,0.0000,-0.9735,0.2176,0.0706 -0.0000,0.0000,0.0000,-0.9803,0.1870,0.0628 -0.0000,0.0000,0.0000,-0.9862,0.1562,0.0549 -0.0000,0.0000,0.0000,-0.9910,0.1252,0.0471 -0.0000,0.0000,0.0000,-0.9948,0.0940,0.0393 -0.0000,0.0000,0.0000,-0.9975,0.0628,0.0314 -0.0000,0.0000,0.0000,-0.9992,0.0314,0.0236 -0.0000,0.0000,0.0000,-0.9999,-0.0000,0.0157 -0.0000,0.0000,0.0000,-0.9995,-0.0314,0.0079 -0.0000,0.0000,0.0000,-0.9980,-0.0628,-0.0000 -0.0000,0.0000,0.0000,-0.9955,-0.0941,-0.0079 -0.0000,0.0000,0.0000,-0.9920,-0.1253,-0.0157 -0.0000,0.0000,0.0000,-0.9874,-0.1564,-0.0236 -0.0000,0.0000,0.0000,-0.9818,-0.1873,-0.0314 -0.0000,0.0000,0.0000,-0.9752,-0.2180,-0.0393 -0.0000,0.0000,0.0000,-0.9675,-0.2484,-0.0471 -0.0000,0.0000,0.0000,-0.9588,-0.2786,-0.0550 -0.0000,0.0000,0.0000,-0.9492,-0.3084,-0.0628 -0.0000,0.0000,0.0000,-0.9385,-0.3379,-0.0706 -0.0000,0.0000,0.0000,-0.9269,-0.3670,-0.0785 -0.0000,0.0000,0.0000,-0.9143,-0.3957,-0.0863 -0.0000,0.0000,0.0000,-0.9008,-0.4239,-0.0941 -0.0000,0.0000,0.0000,-0.8864,-0.4516,-0.1019 -0.0000,0.0000,0.0000,-0.8710,-0.4788,-0.1097 -0.0000,0.0000,0.0000,-0.8548,-0.5055,-0.1175 -0.0000,0.0000,0.0000,-0.8377,-0.5316,-0.1253 -0.0000,0.0000,0.0000,-0.8197,-0.5571,-0.1331 -0.0000,0.0000,0.0000,-0.8009,-0.5819,-0.1409 -0.0000,0.0000,0.0000,-0.7814,-0.6061,-0.1487 -0.0000,0.0000,0.0000,-0.7610,-0.6296,-0.1564 -0.0000,0.0000,0.0000,-0.7399,-0.6523,-0.1642 -0.0000,0.0000,0.0000,-0.7181,-0.6744,-0.1719 -0.0000,0.0000,0.0000,-0.6956,-0.6956,-0.1797 -0.0000,0.0000,0.0000,-0.6724,-0.7161,-0.1874 -0.0000,0.0000,0.0000,-0.6486,-0.7357,-0.1951 -0.0000,0.0000,0.0000,-0.6242,-0.7545,-0.2028 -0.0000,0.0000,0.0000,-0.5992,-0.7725,-0.2105 -0.0000,0.0000,0.0000,-0.5736,-0.7895,-0.2181 -0.0000,0.0000,0.0000,-0.5476,-0.8057,-0.2258 -0.0000,0.0000,0.0000,-0.5210,-0.8210,-0.2334 -0.0000,0.0000,0.0000,-0.4940,-0.8354,-0.2411 -0.0000,0.0000,0.0000,-0.4666,-0.8488,-0.2487 -0.0000,0.0000,0.0000,-0.4388,-0.8612,-0.2563 -0.0000,0.0000,0.0000,-0.4107,-0.8728,-0.2639 -0.0000,0.0000,0.0000,-0.3822,-0.8833,-0.2714 -0.0000,0.0000,0.0000,-0.3535,-0.8929,-0.2790 -0.0000,0.0000,0.0000,-0.3245,-0.9014,-0.2865 -0.0000,0.0000,0.0000,-0.2954,-0.9090,-0.2940 -0.0000,0.0000,0.0000,-0.2660,-0.9156,-0.3015 -0.0000,0.0000,0.0000,-0.2365,-0.9212,-0.3090 -0.0000,0.0000,0.0000,-0.2069,-0.9258,-0.3165 -0.0000,0.0000,0.0000,-0.1773,-0.9293,-0.3239 -0.0000,0.0000,0.0000,-0.1476,-0.9319,-0.3313 -0.0000,0.0000,0.0000,-0.1179,-0.9335,-0.3387 -0.0000,0.0000,0.0000,-0.0883,-0.9340,-0.3461 -0.0000,0.0000,0.0000,-0.0587,-0.9336,-0.3535 -0.0000,0.0000,0.0000,-0.0293,-0.9322,-0.3608 -0.0000,0.0000,0.0000,0.0000,-0.9298,-0.3681 -0.0000,0.0000,0.0000,0.0291,-0.9264,-0.3754 -0.0000,0.0000,0.0000,0.0580,-0.9221,-0.3827 -0.0000,0.0000,0.0000,0.0867,-0.9168,-0.3899 -0.0000,0.0000,0.0000,0.1150,-0.9105,-0.3971 -0.0000,0.0000,0.0000,0.1431,-0.9033,-0.4043 -0.0000,0.0000,0.0000,0.1708,-0.8953,-0.4115 -0.0000,0.0000,0.0000,0.1981,-0.8863,-0.4187 -0.0000,0.0000,0.0000,0.2250,-0.8764,-0.4258 -0.0000,0.0000,0.0000,0.2515,-0.8657,-0.4329 -0.0000,0.0000,0.0000,0.2775,-0.8541,-0.4399 -0.0000,0.0000,0.0000,0.3030,-0.8417,-0.4470 -0.0000,0.0000,0.0000,0.3280,-0.8284,-0.4540 -0.0000,0.0000,0.0000,0.3524,-0.8144,-0.4610 -0.0000,0.0000,0.0000,0.3763,-0.7997,-0.4679 -0.0000,0.0000,0.0000,0.3995,-0.7841,-0.4749 -0.0000,0.0000,0.0000,0.4222,-0.7679,-0.4818 -0.0000,0.0000,0.0000,0.4441,-0.7510,-0.4886 -0.0000,0.0000,0.0000,0.4654,-0.7334,-0.4955 -0.0000,0.0000,0.0000,0.4860,-0.7152,-0.5023 -0.0000,0.0000,0.0000,0.5059,-0.6964,-0.5090 -0.0000,0.0000,0.0000,0.5251,-0.6769,-0.5158 -0.0000,0.0000,0.0000,0.5435,-0.6570,-0.5225 -0.0000,0.0000,0.0000,0.5611,-0.6365,-0.5292 -0.0000,0.0000,0.0000,0.5780,-0.6155,-0.5358 -0.0000,0.0000,0.0000,0.5940,-0.5940,-0.5424 -0.0000,0.0000,0.0000,0.6093,-0.5721,-0.5490 -0.0000,0.0000,0.0000,0.6237,-0.5499,-0.5556 -0.0000,0.0000,0.0000,0.6373,-0.5272,-0.5621 -0.0000,0.0000,0.0000,0.6500,-0.5042,-0.5686 -0.0000,0.0000,0.0000,0.6619,-0.4809,-0.5750 -0.0000,0.0000,0.0000,0.6729,-0.4573,-0.5814 -0.0000,0.0000,0.0000,0.6831,-0.4335,-0.5878 -0.0000,0.0000,0.0000,0.6924,-0.4095,-0.5941 -0.0000,0.0000,0.0000,0.7008,-0.3852,-0.6004 -0.0000,0.0000,0.0000,0.7083,-0.3609,-0.6067 -0.0000,0.0000,0.0000,0.7150,-0.3364,-0.6129 -0.0000,0.0000,0.0000,0.7207,-0.3119,-0.6191 -0.0000,0.0000,0.0000,0.7256,-0.2873,-0.6252 -0.0000,0.0000,0.0000,0.7296,-0.2627,-0.6314 -0.0000,0.0000,0.0000,0.7328,-0.2381,-0.6374 -0.0000,0.0000,0.0000,0.7351,-0.2136,-0.6435 -0.0000,0.0000,0.0000,0.7365,-0.1891,-0.6494 -0.0000,0.0000,0.0000,0.7371,-0.1648,-0.6554 -0.0000,0.0000,0.0000,0.7368,-0.1406,-0.6613 -0.0000,0.0000,0.0000,0.7357,-0.1165,-0.6672 -0.0000,0.0000,0.0000,0.7338,-0.0927,-0.6730 -0.0000,0.0000,0.0000,0.7311,-0.0691,-0.6788 -0.0000,0.0000,0.0000,0.7275,-0.0458,-0.6845 -0.0000,0.0000,0.0000,0.7232,-0.0227,-0.6903 -0.0000,0.0000,0.0000,0.7181,0.0000,-0.6959 diff --git a/scripts/trajectories/full-circle-with-up-and-down-4s-ccw.csv b/scripts/trajectories/full-circle-with-up-and-down-4s-ccw.csv deleted file mode 100644 index 1e4a316720..0000000000 --- a/scripts/trajectories/full-circle-with-up-and-down-4s-ccw.csv +++ /dev/null @@ -1,800 +0,0 @@ -0.9223,-0.0000,-0.3863,0.0119 -0.9223,-0.0000,-0.3863,0.0119 -0.9223,-0.0000,-0.3863,0.0119 -0.9223,-0.0000,-0.3863,0.0119 -0.9235,-0.0000,-0.3828,0.0240 -0.9235,-0.0000,-0.3828,0.0240 -0.9235,-0.0000,-0.3828,0.0240 -0.9235,-0.0000,-0.3828,0.0240 -0.9245,-0.0000,-0.3794,0.0363 -0.9245,-0.0000,-0.3794,0.0363 -0.9245,-0.0000,-0.3794,0.0363 -0.9245,-0.0000,-0.3794,0.0363 -0.9253,-0.0000,-0.3760,0.0486 -0.9253,-0.0000,-0.3760,0.0486 -0.9253,-0.0000,-0.3760,0.0486 -0.9253,-0.0000,-0.3760,0.0486 -0.9259,-0.0000,-0.3727,0.0611 -0.9259,-0.0000,-0.3727,0.0611 -0.9259,-0.0000,-0.3727,0.0611 -0.9259,-0.0000,-0.3727,0.0611 -0.9263,-0.0000,-0.3695,0.0737 -0.9263,-0.0000,-0.3695,0.0737 -0.9263,-0.0000,-0.3695,0.0737 -0.9263,-0.0000,-0.3695,0.0737 -0.9265,-0.0000,-0.3663,0.0865 -0.9265,-0.0000,-0.3663,0.0865 -0.9265,-0.0000,-0.3663,0.0865 -0.9265,-0.0000,-0.3663,0.0865 -0.9264,-0.0000,-0.3632,0.0993 -0.9264,-0.0000,-0.3632,0.0993 -0.9264,-0.0000,-0.3632,0.0993 -0.9264,-0.0000,-0.3632,0.0993 -0.9261,-0.0000,-0.3602,0.1122 -0.9261,-0.0000,-0.3602,0.1122 -0.9261,-0.0000,-0.3602,0.1122 -0.9261,-0.0000,-0.3602,0.1122 -0.9256,-0.0000,-0.3572,0.1252 -0.9256,-0.0000,-0.3572,0.1252 -0.9256,-0.0000,-0.3572,0.1252 -0.9256,-0.0000,-0.3572,0.1252 -0.9248,-0.0000,-0.3543,0.1383 -0.9248,-0.0000,-0.3543,0.1383 -0.9248,-0.0000,-0.3543,0.1383 -0.9248,-0.0000,-0.3543,0.1383 -0.9239,-0.0000,-0.3515,0.1515 -0.9239,-0.0000,-0.3515,0.1515 -0.9239,-0.0000,-0.3515,0.1515 -0.9239,-0.0000,-0.3515,0.1515 -0.9226,-0.0000,-0.3487,0.1648 -0.9226,-0.0000,-0.3487,0.1648 -0.9226,-0.0000,-0.3487,0.1648 -0.9226,-0.0000,-0.3487,0.1648 -0.9212,-0.0000,-0.3460,0.1781 -0.9212,-0.0000,-0.3460,0.1781 -0.9212,-0.0000,-0.3460,0.1781 -0.9212,-0.0000,-0.3460,0.1781 -0.9195,-0.0000,-0.3433,0.1914 -0.9195,-0.0000,-0.3433,0.1914 -0.9195,-0.0000,-0.3433,0.1914 -0.9195,-0.0000,-0.3433,0.1914 -0.9176,-0.0000,-0.3407,0.2049 -0.9176,-0.0000,-0.3407,0.2049 -0.9176,-0.0000,-0.3407,0.2049 -0.9176,-0.0000,-0.3407,0.2049 -0.9154,-0.0000,-0.3382,0.2183 -0.9154,-0.0000,-0.3382,0.2183 -0.9154,-0.0000,-0.3382,0.2183 -0.9154,-0.0000,-0.3382,0.2183 -0.9130,-0.0000,-0.3357,0.2319 -0.9130,-0.0000,-0.3357,0.2319 -0.9130,-0.0000,-0.3357,0.2319 -0.9130,-0.0000,-0.3357,0.2319 -0.9104,-0.0000,-0.3332,0.2454 -0.9104,-0.0000,-0.3332,0.2454 -0.9104,-0.0000,-0.3332,0.2454 -0.9104,-0.0000,-0.3332,0.2454 -0.9075,-0.0000,-0.3308,0.2590 -0.9075,-0.0000,-0.3308,0.2590 -0.9075,-0.0000,-0.3308,0.2590 -0.9075,-0.0000,-0.3308,0.2590 -0.9043,-0.0000,-0.3285,0.2726 -0.9043,-0.0000,-0.3285,0.2726 -0.9043,-0.0000,-0.3285,0.2726 -0.9043,-0.0000,-0.3285,0.2726 -0.9009,-0.0000,-0.3262,0.2862 -0.9009,-0.0000,-0.3262,0.2862 -0.9009,-0.0000,-0.3262,0.2862 -0.9009,-0.0000,-0.3262,0.2862 -0.8973,-0.0000,-0.3240,0.2998 -0.8973,-0.0000,-0.3240,0.2998 -0.8973,-0.0000,-0.3240,0.2998 -0.8973,-0.0000,-0.3240,0.2998 -0.8934,-0.0000,-0.3218,0.3134 -0.8934,-0.0000,-0.3218,0.3134 -0.8934,-0.0000,-0.3218,0.3134 -0.8934,-0.0000,-0.3218,0.3134 -0.8893,-0.0000,-0.3197,0.3271 -0.8893,-0.0000,-0.3197,0.3271 -0.8893,-0.0000,-0.3197,0.3271 -0.8893,-0.0000,-0.3197,0.3271 -0.8849,-0.0000,-0.3176,0.3407 -0.8849,-0.0000,-0.3176,0.3407 -0.8849,-0.0000,-0.3176,0.3407 -0.8849,-0.0000,-0.3176,0.3407 -0.8803,-0.0000,-0.3156,0.3543 -0.8803,-0.0000,-0.3156,0.3543 -0.8803,-0.0000,-0.3156,0.3543 -0.8803,-0.0000,-0.3156,0.3543 -0.8754,-0.0000,-0.3136,0.3678 -0.8754,-0.0000,-0.3136,0.3678 -0.8754,-0.0000,-0.3136,0.3678 -0.8754,-0.0000,-0.3136,0.3678 -0.8703,-0.0000,-0.3116,0.3814 -0.8703,-0.0000,-0.3116,0.3814 -0.8703,-0.0000,-0.3116,0.3814 -0.8703,-0.0000,-0.3116,0.3814 -0.8650,-0.0000,-0.3097,0.3949 -0.8650,-0.0000,-0.3097,0.3949 -0.8650,-0.0000,-0.3097,0.3949 -0.8650,-0.0000,-0.3097,0.3949 -0.8593,-0.0000,-0.3079,0.4083 -0.8593,-0.0000,-0.3079,0.4083 -0.8593,-0.0000,-0.3079,0.4083 -0.8593,-0.0000,-0.3079,0.4083 -0.8535,-0.0000,-0.3061,0.4217 -0.8535,-0.0000,-0.3061,0.4217 -0.8535,-0.0000,-0.3061,0.4217 -0.8535,-0.0000,-0.3061,0.4217 -0.8474,-0.0000,-0.3043,0.4351 -0.8474,-0.0000,-0.3043,0.4351 -0.8474,-0.0000,-0.3043,0.4351 -0.8474,-0.0000,-0.3043,0.4351 -0.8410,-0.0000,-0.3026,0.4484 -0.8410,-0.0000,-0.3026,0.4484 -0.8410,-0.0000,-0.3026,0.4484 -0.8410,-0.0000,-0.3026,0.4484 -0.8344,-0.0000,-0.3010,0.4617 -0.8344,-0.0000,-0.3010,0.4617 -0.8344,-0.0000,-0.3010,0.4617 -0.8344,-0.0000,-0.3010,0.4617 -0.8276,-0.0000,-0.2993,0.4748 -0.8276,-0.0000,-0.2993,0.4748 -0.8276,-0.0000,-0.2993,0.4748 -0.8276,-0.0000,-0.2993,0.4748 -0.8205,-0.0000,-0.2978,0.4879 -0.8205,-0.0000,-0.2978,0.4879 -0.8205,-0.0000,-0.2978,0.4879 -0.8205,-0.0000,-0.2978,0.4879 -0.8132,-0.0000,-0.2962,0.5010 -0.8132,-0.0000,-0.2962,0.5010 -0.8132,-0.0000,-0.2962,0.5010 -0.8132,-0.0000,-0.2962,0.5010 -0.8056,-0.0000,-0.2947,0.5139 -0.8056,-0.0000,-0.2947,0.5139 -0.8056,-0.0000,-0.2947,0.5139 -0.8056,-0.0000,-0.2947,0.5139 -0.7978,-0.0000,-0.2932,0.5267 -0.7978,-0.0000,-0.2932,0.5267 -0.7978,-0.0000,-0.2932,0.5267 -0.7978,-0.0000,-0.2932,0.5267 -0.7898,-0.0000,-0.2918,0.5395 -0.7898,-0.0000,-0.2918,0.5395 -0.7898,-0.0000,-0.2918,0.5395 -0.7898,-0.0000,-0.2918,0.5395 -0.7815,-0.0000,-0.2904,0.5521 -0.7815,-0.0000,-0.2904,0.5521 -0.7815,-0.0000,-0.2904,0.5521 -0.7815,-0.0000,-0.2904,0.5521 -0.7730,-0.0000,-0.2891,0.5647 -0.7730,-0.0000,-0.2891,0.5647 -0.7730,-0.0000,-0.2891,0.5647 -0.7730,-0.0000,-0.2891,0.5647 -0.7643,-0.0000,-0.2878,0.5771 -0.7643,-0.0000,-0.2878,0.5771 -0.7643,-0.0000,-0.2878,0.5771 -0.7643,-0.0000,-0.2878,0.5771 -0.7553,-0.0000,-0.2865,0.5894 -0.7553,-0.0000,-0.2865,0.5894 -0.7553,-0.0000,-0.2865,0.5894 -0.7553,-0.0000,-0.2865,0.5894 -0.7461,-0.0000,-0.2853,0.6016 -0.7461,-0.0000,-0.2853,0.6016 -0.7461,-0.0000,-0.2853,0.6016 -0.7461,-0.0000,-0.2853,0.6016 -0.7367,-0.0000,-0.2841,0.6136 -0.7367,-0.0000,-0.2841,0.6136 -0.7367,-0.0000,-0.2841,0.6136 -0.7367,-0.0000,-0.2841,0.6136 -0.7271,-0.0000,-0.2830,0.6255 -0.7271,-0.0000,-0.2830,0.6255 -0.7271,-0.0000,-0.2830,0.6255 -0.7271,-0.0000,-0.2830,0.6255 -0.7172,-0.0000,-0.2819,0.6373 -0.7172,-0.0000,-0.2819,0.6373 -0.7172,-0.0000,-0.2819,0.6373 -0.7172,-0.0000,-0.2819,0.6373 -0.7071,-0.0000,-0.2808,0.6490 -0.7071,-0.0000,-0.2808,0.6490 -0.7071,-0.0000,-0.2808,0.6490 -0.7071,-0.0000,-0.2808,0.6490 -0.6968,-0.0000,-0.2798,0.6604 -0.6968,-0.0000,-0.2798,0.6604 -0.6968,-0.0000,-0.2798,0.6604 -0.6968,-0.0000,-0.2798,0.6604 -0.6863,-0.0000,-0.2788,0.6718 -0.6863,-0.0000,-0.2788,0.6718 -0.6863,-0.0000,-0.2788,0.6718 -0.6863,-0.0000,-0.2788,0.6718 -0.6756,-0.0000,-0.2779,0.6829 -0.6756,-0.0000,-0.2779,0.6829 -0.6756,-0.0000,-0.2779,0.6829 -0.6756,-0.0000,-0.2779,0.6829 -0.6646,-0.0000,-0.2769,0.6940 -0.6646,-0.0000,-0.2769,0.6940 -0.6646,-0.0000,-0.2769,0.6940 -0.6646,-0.0000,-0.2769,0.6940 -0.6535,-0.0000,-0.2761,0.7048 -0.6535,-0.0000,-0.2761,0.7048 -0.6535,-0.0000,-0.2761,0.7048 -0.6535,-0.0000,-0.2761,0.7048 -0.6422,-0.0000,-0.2752,0.7155 -0.6422,-0.0000,-0.2752,0.7155 -0.6422,-0.0000,-0.2752,0.7155 -0.6422,-0.0000,-0.2752,0.7155 -0.6306,-0.0000,-0.2744,0.7260 -0.6306,-0.0000,-0.2744,0.7260 -0.6306,-0.0000,-0.2744,0.7260 -0.6306,-0.0000,-0.2744,0.7260 -0.6189,-0.0000,-0.2737,0.7363 -0.6189,-0.0000,-0.2737,0.7363 -0.6189,-0.0000,-0.2737,0.7363 -0.6189,-0.0000,-0.2737,0.7363 -0.6069,-0.0000,-0.2730,0.7464 -0.6069,-0.0000,-0.2730,0.7464 -0.6069,-0.0000,-0.2730,0.7464 -0.6069,-0.0000,-0.2730,0.7464 -0.5948,-0.0000,-0.2723,0.7563 -0.5948,-0.0000,-0.2723,0.7563 -0.5948,-0.0000,-0.2723,0.7563 -0.5948,-0.0000,-0.2723,0.7563 -0.5825,-0.0000,-0.2716,0.7661 -0.5825,-0.0000,-0.2716,0.7661 -0.5825,-0.0000,-0.2716,0.7661 -0.5825,-0.0000,-0.2716,0.7661 -0.5700,-0.0000,-0.2710,0.7756 -0.5700,-0.0000,-0.2710,0.7756 -0.5700,-0.0000,-0.2710,0.7756 -0.5700,-0.0000,-0.2710,0.7756 -0.5574,-0.0000,-0.2705,0.7850 -0.5574,-0.0000,-0.2705,0.7850 -0.5574,-0.0000,-0.2705,0.7850 -0.5574,-0.0000,-0.2705,0.7850 -0.5445,-0.0000,-0.2700,0.7941 -0.5445,-0.0000,-0.2700,0.7941 -0.5445,-0.0000,-0.2700,0.7941 -0.5445,-0.0000,-0.2700,0.7941 -0.5315,-0.0000,-0.2695,0.8030 -0.5315,-0.0000,-0.2695,0.8030 -0.5315,-0.0000,-0.2695,0.8030 -0.5315,-0.0000,-0.2695,0.8030 -0.5184,-0.0000,-0.2691,0.8117 -0.5184,-0.0000,-0.2691,0.8117 -0.5184,-0.0000,-0.2691,0.8117 -0.5184,-0.0000,-0.2691,0.8117 -0.5050,-0.0000,-0.2687,0.8202 -0.5050,-0.0000,-0.2687,0.8202 -0.5050,-0.0000,-0.2687,0.8202 -0.5050,-0.0000,-0.2687,0.8202 -0.4915,-0.0000,-0.2684,0.8285 -0.4915,-0.0000,-0.2684,0.8285 -0.4915,-0.0000,-0.2684,0.8285 -0.4915,-0.0000,-0.2684,0.8285 -0.4779,-0.0000,-0.2682,0.8365 -0.4779,-0.0000,-0.2682,0.8365 -0.4779,-0.0000,-0.2682,0.8365 -0.4779,-0.0000,-0.2682,0.8365 -0.4640,-0.0000,-0.2680,0.8443 -0.4640,-0.0000,-0.2680,0.8443 -0.4640,-0.0000,-0.2680,0.8443 -0.4640,-0.0000,-0.2680,0.8443 -0.4501,-0.0000,-0.2678,0.8519 -0.4501,-0.0000,-0.2678,0.8519 -0.4501,-0.0000,-0.2678,0.8519 -0.4501,-0.0000,-0.2678,0.8519 -0.4360,-0.0000,-0.2677,0.8592 -0.4360,-0.0000,-0.2677,0.8592 -0.4360,-0.0000,-0.2677,0.8592 -0.4360,-0.0000,-0.2677,0.8592 -0.4218,-0.0000,-0.2677,0.8663 -0.4218,-0.0000,-0.2677,0.8663 -0.4218,-0.0000,-0.2677,0.8663 -0.4218,-0.0000,-0.2677,0.8663 -0.4074,-0.0000,-0.2677,0.8731 -0.4074,-0.0000,-0.2677,0.8731 -0.4074,-0.0000,-0.2677,0.8731 -0.4074,-0.0000,-0.2677,0.8731 -0.3929,-0.0000,-0.2678,0.8797 -0.3929,-0.0000,-0.2678,0.8797 -0.3929,-0.0000,-0.2678,0.8797 -0.3929,-0.0000,-0.2678,0.8797 -0.3783,-0.0000,-0.2680,0.8860 -0.3783,-0.0000,-0.2680,0.8860 -0.3783,-0.0000,-0.2680,0.8860 -0.3783,-0.0000,-0.2680,0.8860 -0.3635,-0.0000,-0.2683,0.8921 -0.3635,-0.0000,-0.2683,0.8921 -0.3635,-0.0000,-0.2683,0.8921 -0.3635,-0.0000,-0.2683,0.8921 -0.3487,-0.0000,-0.2687,0.8979 -0.3487,-0.0000,-0.2687,0.8979 -0.3487,-0.0000,-0.2687,0.8979 -0.3487,-0.0000,-0.2687,0.8979 -0.3337,-0.0000,-0.2692,0.9034 -0.3337,-0.0000,-0.2692,0.9034 -0.3337,-0.0000,-0.2692,0.9034 -0.3337,-0.0000,-0.2692,0.9034 -0.3186,-0.0000,-0.2698,0.9087 -0.3186,-0.0000,-0.2698,0.9087 -0.3186,-0.0000,-0.2698,0.9087 -0.3186,-0.0000,-0.2698,0.9087 -0.3034,-0.0000,-0.2705,0.9136 -0.3034,-0.0000,-0.2705,0.9136 -0.3034,-0.0000,-0.2705,0.9136 -0.3034,-0.0000,-0.2705,0.9136 -0.2882,-0.0000,-0.2714,0.9183 -0.2882,-0.0000,-0.2714,0.9183 -0.2882,-0.0000,-0.2714,0.9183 -0.2882,-0.0000,-0.2714,0.9183 -0.2728,-0.0000,-0.2725,0.9227 -0.2728,-0.0000,-0.2725,0.9227 -0.2728,-0.0000,-0.2725,0.9227 -0.2728,-0.0000,-0.2725,0.9227 -0.2573,-0.0000,-0.2738,0.9267 -0.2573,-0.0000,-0.2738,0.9267 -0.2573,-0.0000,-0.2738,0.9267 -0.2573,-0.0000,-0.2738,0.9267 -0.2418,-0.0000,-0.2753,0.9305 -0.2418,-0.0000,-0.2753,0.9305 -0.2418,-0.0000,-0.2753,0.9305 -0.2418,-0.0000,-0.2753,0.9305 -0.2262,-0.0000,-0.2771,0.9339 -0.2262,-0.0000,-0.2771,0.9339 -0.2262,-0.0000,-0.2771,0.9339 -0.2262,-0.0000,-0.2771,0.9339 -0.2105,-0.0000,-0.2792,0.9369 -0.2105,-0.0000,-0.2792,0.9369 -0.2105,-0.0000,-0.2792,0.9369 -0.2105,-0.0000,-0.2792,0.9369 -0.1947,-0.0000,-0.2818,0.9395 -0.1947,-0.0000,-0.2818,0.9395 -0.1947,-0.0000,-0.2818,0.9395 -0.1947,-0.0000,-0.2818,0.9395 -0.1789,-0.0000,-0.2848,0.9417 -0.1789,-0.0000,-0.2848,0.9417 -0.1789,-0.0000,-0.2848,0.9417 -0.1789,-0.0000,-0.2848,0.9417 -0.1630,-0.0000,-0.2886,0.9435 -0.1630,-0.0000,-0.2886,0.9435 -0.1630,-0.0000,-0.2886,0.9435 -0.1630,-0.0000,-0.2886,0.9435 -0.1471,-0.0000,-0.2933,0.9446 -0.1471,-0.0000,-0.2933,0.9446 -0.1471,-0.0000,-0.2933,0.9446 -0.1471,-0.0000,-0.2933,0.9446 -0.1312,-0.0000,-0.2991,0.9452 -0.1312,-0.0000,-0.2991,0.9452 -0.1312,-0.0000,-0.2991,0.9452 -0.1312,-0.0000,-0.2991,0.9452 -0.1152,-0.0000,-0.3067,0.9448 -0.1152,-0.0000,-0.3067,0.9448 -0.1152,-0.0000,-0.3067,0.9448 -0.1152,-0.0000,-0.3067,0.9448 -0.0991,-0.0000,-0.3167,0.9433 -0.0991,-0.0000,-0.3167,0.9433 -0.0991,-0.0000,-0.3167,0.9433 -0.0991,-0.0000,-0.3167,0.9433 -0.0831,-0.0000,-0.3307,0.9401 -0.0831,-0.0000,-0.3307,0.9401 -0.0831,-0.0000,-0.3307,0.9401 -0.0831,-0.0000,-0.3307,0.9401 -0.0670,-0.0000,-0.3514,0.9338 -0.0670,-0.0000,-0.3514,0.9338 -0.0670,-0.0000,-0.3514,0.9338 -0.0670,-0.0000,-0.3514,0.9338 -0.0510,-0.0000,-0.3848,0.9216 -0.0510,-0.0000,-0.3848,0.9216 -0.0510,-0.0000,-0.3848,0.9216 -0.0510,-0.0000,-0.3848,0.9216 -0.0351,-0.0000,-0.4473,0.8937 -0.0351,-0.0000,-0.4473,0.8937 -0.0351,-0.0000,-0.4473,0.8937 -0.0351,-0.0000,-0.4473,0.8937 -0.0196,-0.0000,-0.6000,0.7997 -0.0196,-0.0000,-0.6000,0.7997 -0.0196,-0.0000,-0.6000,0.7997 -0.0196,-0.0000,-0.6000,0.7997 -0.0079,-0.0000,-1.0000,-0.0001 -0.0079,-0.0000,-1.0000,-0.0001 -0.0079,-0.0000,-1.0000,-0.0001 -0.0079,-0.0000,-1.0000,-0.0001 -0.0162,-0.0000,-0.2425,-0.9700 -0.0162,-0.0000,-0.2425,-0.9700 -0.0162,-0.0000,-0.2425,-0.9700 -0.0162,-0.0000,-0.2425,-0.9700 -0.0314,-0.0000,0.0000,-0.9995 -0.0314,-0.0000,0.0000,-0.9995 -0.0314,-0.0000,0.0000,-0.9995 -0.0314,-0.0000,0.0000,-0.9995 -0.0473,-0.0000,0.0831,-0.9954 -0.0473,-0.0000,0.0831,-0.9954 -0.0473,-0.0000,0.0831,-0.9954 -0.0473,-0.0000,0.0831,-0.9954 -0.0633,-0.0000,0.1241,-0.9902 -0.0633,-0.0000,0.1241,-0.9902 -0.0633,-0.0000,0.1241,-0.9902 -0.0633,-0.0000,0.1241,-0.9902 -0.0793,-0.0000,0.1485,-0.9857 -0.0793,-0.0000,0.1485,-0.9857 -0.0793,-0.0000,0.1485,-0.9857 -0.0793,-0.0000,0.1485,-0.9857 -0.0954,-0.0000,0.1646,-0.9817 -0.0954,-0.0000,0.1646,-0.9817 -0.0954,-0.0000,0.1646,-0.9817 -0.0954,-0.0000,0.1646,-0.9817 -0.1114,-0.0000,0.1762,-0.9780 -0.1114,-0.0000,0.1762,-0.9780 -0.1114,-0.0000,0.1762,-0.9780 -0.1114,-0.0000,0.1762,-0.9780 -0.1275,-0.0000,0.1848,-0.9745 -0.1275,-0.0000,0.1848,-0.9745 -0.1275,-0.0000,0.1848,-0.9745 -0.1275,-0.0000,0.1848,-0.9745 -0.1435,-0.0000,0.1915,-0.9709 -0.1435,-0.0000,0.1915,-0.9709 -0.1435,-0.0000,0.1915,-0.9709 -0.1435,-0.0000,0.1915,-0.9709 -0.1594,-0.0000,0.1970,-0.9674 -0.1594,-0.0000,0.1970,-0.9674 -0.1594,-0.0000,0.1970,-0.9674 -0.1594,-0.0000,0.1970,-0.9674 -0.1753,-0.0000,0.2014,-0.9637 -0.1753,-0.0000,0.2014,-0.9637 -0.1753,-0.0000,0.2014,-0.9637 -0.1753,-0.0000,0.2014,-0.9637 -0.1912,-0.0000,0.2052,-0.9599 -0.1912,-0.0000,0.2052,-0.9599 -0.1912,-0.0000,0.2052,-0.9599 -0.1912,-0.0000,0.2052,-0.9599 -0.2070,-0.0000,0.2085,-0.9559 -0.2070,-0.0000,0.2085,-0.9559 -0.2070,-0.0000,0.2085,-0.9559 -0.2070,-0.0000,0.2085,-0.9559 -0.2227,-0.0000,0.2113,-0.9517 -0.2227,-0.0000,0.2113,-0.9517 -0.2227,-0.0000,0.2113,-0.9517 -0.2227,-0.0000,0.2113,-0.9517 -0.2384,-0.0000,0.2138,-0.9473 -0.2384,-0.0000,0.2138,-0.9473 -0.2384,-0.0000,0.2138,-0.9473 -0.2384,-0.0000,0.2138,-0.9473 -0.2540,-0.0000,0.2161,-0.9428 -0.2540,-0.0000,0.2161,-0.9428 -0.2540,-0.0000,0.2161,-0.9428 -0.2540,-0.0000,0.2161,-0.9428 -0.2695,-0.0000,0.2181,-0.9380 -0.2695,-0.0000,0.2181,-0.9380 -0.2695,-0.0000,0.2181,-0.9380 -0.2695,-0.0000,0.2181,-0.9380 -0.2849,-0.0000,0.2200,-0.9330 -0.2849,-0.0000,0.2200,-0.9330 -0.2849,-0.0000,0.2200,-0.9330 -0.2849,-0.0000,0.2200,-0.9330 -0.3002,-0.0000,0.2217,-0.9277 -0.3002,-0.0000,0.2217,-0.9277 -0.3002,-0.0000,0.2217,-0.9277 -0.3002,-0.0000,0.2217,-0.9277 -0.3155,-0.0000,0.2233,-0.9223 -0.3155,-0.0000,0.2233,-0.9223 -0.3155,-0.0000,0.2233,-0.9223 -0.3155,-0.0000,0.2233,-0.9223 -0.3306,-0.0000,0.2248,-0.9166 -0.3306,-0.0000,0.2248,-0.9166 -0.3306,-0.0000,0.2248,-0.9166 -0.3306,-0.0000,0.2248,-0.9166 -0.3457,-0.0000,0.2263,-0.9107 -0.3457,-0.0000,0.2263,-0.9107 -0.3457,-0.0000,0.2263,-0.9107 -0.3457,-0.0000,0.2263,-0.9107 -0.3606,-0.0000,0.2277,-0.9045 -0.3606,-0.0000,0.2277,-0.9045 -0.3606,-0.0000,0.2277,-0.9045 -0.3606,-0.0000,0.2277,-0.9045 -0.3754,-0.0000,0.2290,-0.8981 -0.3754,-0.0000,0.2290,-0.8981 -0.3754,-0.0000,0.2290,-0.8981 -0.3754,-0.0000,0.2290,-0.8981 -0.3901,-0.0000,0.2303,-0.8915 -0.3901,-0.0000,0.2303,-0.8915 -0.3901,-0.0000,0.2303,-0.8915 -0.3901,-0.0000,0.2303,-0.8915 -0.4047,-0.0000,0.2315,-0.8847 -0.4047,-0.0000,0.2315,-0.8847 -0.4047,-0.0000,0.2315,-0.8847 -0.4047,-0.0000,0.2315,-0.8847 -0.4192,-0.0000,0.2327,-0.8776 -0.4192,-0.0000,0.2327,-0.8776 -0.4192,-0.0000,0.2327,-0.8776 -0.4192,-0.0000,0.2327,-0.8776 -0.4335,-0.0000,0.2339,-0.8703 -0.4335,-0.0000,0.2339,-0.8703 -0.4335,-0.0000,0.2339,-0.8703 -0.4335,-0.0000,0.2339,-0.8703 -0.4477,-0.0000,0.2351,-0.8627 -0.4477,-0.0000,0.2351,-0.8627 -0.4477,-0.0000,0.2351,-0.8627 -0.4477,-0.0000,0.2351,-0.8627 -0.4617,-0.0000,0.2362,-0.8550 -0.4617,-0.0000,0.2362,-0.8550 -0.4617,-0.0000,0.2362,-0.8550 -0.4617,-0.0000,0.2362,-0.8550 -0.4756,-0.0000,0.2374,-0.8470 -0.4756,-0.0000,0.2374,-0.8470 -0.4756,-0.0000,0.2374,-0.8470 -0.4756,-0.0000,0.2374,-0.8470 -0.4894,-0.0000,0.2385,-0.8388 -0.4894,-0.0000,0.2385,-0.8388 -0.4894,-0.0000,0.2385,-0.8388 -0.4894,-0.0000,0.2385,-0.8388 -0.5030,-0.0000,0.2396,-0.8304 -0.5030,-0.0000,0.2396,-0.8304 -0.5030,-0.0000,0.2396,-0.8304 -0.5030,-0.0000,0.2396,-0.8304 -0.5164,-0.0000,0.2408,-0.8218 -0.5164,-0.0000,0.2408,-0.8218 -0.5164,-0.0000,0.2408,-0.8218 -0.5164,-0.0000,0.2408,-0.8218 -0.5297,-0.0000,0.2419,-0.8130 -0.5297,-0.0000,0.2419,-0.8130 -0.5297,-0.0000,0.2419,-0.8130 -0.5297,-0.0000,0.2419,-0.8130 -0.5428,-0.0000,0.2431,-0.8039 -0.5428,-0.0000,0.2431,-0.8039 -0.5428,-0.0000,0.2431,-0.8039 -0.5428,-0.0000,0.2431,-0.8039 -0.5558,-0.0000,0.2442,-0.7947 -0.5558,-0.0000,0.2442,-0.7947 -0.5558,-0.0000,0.2442,-0.7947 -0.5558,-0.0000,0.2442,-0.7947 -0.5685,-0.0000,0.2454,-0.7852 -0.5685,-0.0000,0.2454,-0.7852 -0.5685,-0.0000,0.2454,-0.7852 -0.5685,-0.0000,0.2454,-0.7852 -0.5811,-0.0000,0.2465,-0.7756 -0.5811,-0.0000,0.2465,-0.7756 -0.5811,-0.0000,0.2465,-0.7756 -0.5811,-0.0000,0.2465,-0.7756 -0.5936,-0.0000,0.2477,-0.7657 -0.5936,-0.0000,0.2477,-0.7657 -0.5936,-0.0000,0.2477,-0.7657 -0.5936,-0.0000,0.2477,-0.7657 -0.6058,-0.0000,0.2489,-0.7557 -0.6058,-0.0000,0.2489,-0.7557 -0.6058,-0.0000,0.2489,-0.7557 -0.6058,-0.0000,0.2489,-0.7557 -0.6179,-0.0000,0.2501,-0.7455 -0.6179,-0.0000,0.2501,-0.7455 -0.6179,-0.0000,0.2501,-0.7455 -0.6179,-0.0000,0.2501,-0.7455 -0.6297,-0.0000,0.2513,-0.7351 -0.6297,-0.0000,0.2513,-0.7351 -0.6297,-0.0000,0.2513,-0.7351 -0.6297,-0.0000,0.2513,-0.7351 -0.6414,-0.0000,0.2525,-0.7245 -0.6414,-0.0000,0.2525,-0.7245 -0.6414,-0.0000,0.2525,-0.7245 -0.6414,-0.0000,0.2525,-0.7245 -0.6528,-0.0000,0.2538,-0.7137 -0.6528,-0.0000,0.2538,-0.7137 -0.6528,-0.0000,0.2538,-0.7137 -0.6528,-0.0000,0.2538,-0.7137 -0.6641,-0.0000,0.2550,-0.7028 -0.6641,-0.0000,0.2550,-0.7028 -0.6641,-0.0000,0.2550,-0.7028 -0.6641,-0.0000,0.2550,-0.7028 -0.6752,-0.0000,0.2563,-0.6917 -0.6752,-0.0000,0.2563,-0.6917 -0.6752,-0.0000,0.2563,-0.6917 -0.6752,-0.0000,0.2563,-0.6917 -0.6860,-0.0000,0.2576,-0.6804 -0.6860,-0.0000,0.2576,-0.6804 -0.6860,-0.0000,0.2576,-0.6804 -0.6860,-0.0000,0.2576,-0.6804 -0.6967,-0.0000,0.2590,-0.6690 -0.6967,-0.0000,0.2590,-0.6690 -0.6967,-0.0000,0.2590,-0.6690 -0.6967,-0.0000,0.2590,-0.6690 -0.7071,-0.0000,0.2603,-0.6575 -0.7071,-0.0000,0.2603,-0.6575 -0.7071,-0.0000,0.2603,-0.6575 -0.7071,-0.0000,0.2603,-0.6575 -0.7173,-0.0000,0.2617,-0.6457 -0.7173,-0.0000,0.2617,-0.6457 -0.7173,-0.0000,0.2617,-0.6457 -0.7173,-0.0000,0.2617,-0.6457 -0.7273,-0.0000,0.2631,-0.6339 -0.7273,-0.0000,0.2631,-0.6339 -0.7273,-0.0000,0.2631,-0.6339 -0.7273,-0.0000,0.2631,-0.6339 -0.7371,-0.0000,0.2645,-0.6219 -0.7371,-0.0000,0.2645,-0.6219 -0.7371,-0.0000,0.2645,-0.6219 -0.7371,-0.0000,0.2645,-0.6219 -0.7467,-0.0000,0.2659,-0.6097 -0.7467,-0.0000,0.2659,-0.6097 -0.7467,-0.0000,0.2659,-0.6097 -0.7467,-0.0000,0.2659,-0.6097 -0.7560,-0.0000,0.2674,-0.5974 -0.7560,-0.0000,0.2674,-0.5974 -0.7560,-0.0000,0.2674,-0.5974 -0.7560,-0.0000,0.2674,-0.5974 -0.7651,-0.0000,0.2689,-0.5851 -0.7651,-0.0000,0.2689,-0.5851 -0.7651,-0.0000,0.2689,-0.5851 -0.7651,-0.0000,0.2689,-0.5851 -0.7740,-0.0000,0.2705,-0.5725 -0.7740,-0.0000,0.2705,-0.5725 -0.7740,-0.0000,0.2705,-0.5725 -0.7740,-0.0000,0.2705,-0.5725 -0.7826,-0.0000,0.2720,-0.5599 -0.7826,-0.0000,0.2720,-0.5599 -0.7826,-0.0000,0.2720,-0.5599 -0.7826,-0.0000,0.2720,-0.5599 -0.7910,-0.0000,0.2736,-0.5472 -0.7910,-0.0000,0.2736,-0.5472 -0.7910,-0.0000,0.2736,-0.5472 -0.7910,-0.0000,0.2736,-0.5472 -0.7992,-0.0000,0.2752,-0.5343 -0.7992,-0.0000,0.2752,-0.5343 -0.7992,-0.0000,0.2752,-0.5343 -0.7992,-0.0000,0.2752,-0.5343 -0.8072,-0.0000,0.2769,-0.5214 -0.8072,-0.0000,0.2769,-0.5214 -0.8072,-0.0000,0.2769,-0.5214 -0.8072,-0.0000,0.2769,-0.5214 -0.8149,-0.0000,0.2786,-0.5083 -0.8149,-0.0000,0.2786,-0.5083 -0.8149,-0.0000,0.2786,-0.5083 -0.8149,-0.0000,0.2786,-0.5083 -0.8223,-0.0000,0.2803,-0.4952 -0.8223,-0.0000,0.2803,-0.4952 -0.8223,-0.0000,0.2803,-0.4952 -0.8223,-0.0000,0.2803,-0.4952 -0.8295,-0.0000,0.2820,-0.4820 -0.8295,-0.0000,0.2820,-0.4820 -0.8295,-0.0000,0.2820,-0.4820 -0.8295,-0.0000,0.2820,-0.4820 -0.8365,-0.0000,0.2838,-0.4687 -0.8365,-0.0000,0.2838,-0.4687 -0.8365,-0.0000,0.2838,-0.4687 -0.8365,-0.0000,0.2838,-0.4687 -0.8433,-0.0000,0.2857,-0.4553 -0.8433,-0.0000,0.2857,-0.4553 -0.8433,-0.0000,0.2857,-0.4553 -0.8433,-0.0000,0.2857,-0.4553 -0.8497,-0.0000,0.2875,-0.4419 -0.8497,-0.0000,0.2875,-0.4419 -0.8497,-0.0000,0.2875,-0.4419 -0.8497,-0.0000,0.2875,-0.4419 -0.8560,-0.0000,0.2894,-0.4284 -0.8560,-0.0000,0.2894,-0.4284 -0.8560,-0.0000,0.2894,-0.4284 -0.8560,-0.0000,0.2894,-0.4284 -0.8620,-0.0000,0.2913,-0.4148 -0.8620,-0.0000,0.2913,-0.4148 -0.8620,-0.0000,0.2913,-0.4148 -0.8620,-0.0000,0.2913,-0.4148 -0.8677,-0.0000,0.2933,-0.4012 -0.8677,-0.0000,0.2933,-0.4012 -0.8677,-0.0000,0.2933,-0.4012 -0.8677,-0.0000,0.2933,-0.4012 -0.8732,-0.0000,0.2953,-0.3876 -0.8732,-0.0000,0.2953,-0.3876 -0.8732,-0.0000,0.2953,-0.3876 -0.8732,-0.0000,0.2953,-0.3876 -0.8785,-0.0000,0.2974,-0.3739 -0.8785,-0.0000,0.2974,-0.3739 -0.8785,-0.0000,0.2974,-0.3739 -0.8785,-0.0000,0.2974,-0.3739 -0.8835,-0.0000,0.2995,-0.3602 -0.8835,-0.0000,0.2995,-0.3602 -0.8835,-0.0000,0.2995,-0.3602 -0.8835,-0.0000,0.2995,-0.3602 -0.8883,-0.0000,0.3016,-0.3465 -0.8883,-0.0000,0.3016,-0.3465 -0.8883,-0.0000,0.3016,-0.3465 -0.8883,-0.0000,0.3016,-0.3465 -0.8928,-0.0000,0.3038,-0.3327 -0.8928,-0.0000,0.3038,-0.3327 -0.8928,-0.0000,0.3038,-0.3327 -0.8928,-0.0000,0.3038,-0.3327 -0.8970,-0.0000,0.3060,-0.3189 -0.8970,-0.0000,0.3060,-0.3189 -0.8970,-0.0000,0.3060,-0.3189 -0.8970,-0.0000,0.3060,-0.3189 -0.9010,-0.0000,0.3083,-0.3051 -0.9010,-0.0000,0.3083,-0.3051 -0.9010,-0.0000,0.3083,-0.3051 -0.9010,-0.0000,0.3083,-0.3051 -0.9048,-0.0000,0.3106,-0.2913 -0.9048,-0.0000,0.3106,-0.2913 -0.9048,-0.0000,0.3106,-0.2913 -0.9048,-0.0000,0.3106,-0.2913 -0.9083,-0.0000,0.3130,-0.2776 -0.9083,-0.0000,0.3130,-0.2776 -0.9083,-0.0000,0.3130,-0.2776 -0.9083,-0.0000,0.3130,-0.2776 -0.9116,-0.0000,0.3154,-0.2638 -0.9116,-0.0000,0.3154,-0.2638 -0.9116,-0.0000,0.3154,-0.2638 -0.9116,-0.0000,0.3154,-0.2638 -0.9146,-0.0000,0.3179,-0.2500 -0.9146,-0.0000,0.3179,-0.2500 -0.9146,-0.0000,0.3179,-0.2500 -0.9146,-0.0000,0.3179,-0.2500 -0.9174,-0.0000,0.3204,-0.2363 -0.9174,-0.0000,0.3204,-0.2363 -0.9174,-0.0000,0.3204,-0.2363 -0.9174,-0.0000,0.3204,-0.2363 -0.9199,-0.0000,0.3229,-0.2226 -0.9199,-0.0000,0.3229,-0.2226 -0.9199,-0.0000,0.3229,-0.2226 -0.9199,-0.0000,0.3229,-0.2226 -0.9222,-0.0000,0.3256,-0.2089 -0.9222,-0.0000,0.3256,-0.2089 -0.9222,-0.0000,0.3256,-0.2089 -0.9222,-0.0000,0.3256,-0.2089 -0.9242,-0.0000,0.3282,-0.1952 -0.9242,-0.0000,0.3282,-0.1952 -0.9242,-0.0000,0.3282,-0.1952 -0.9242,-0.0000,0.3282,-0.1952 -0.9260,-0.0000,0.3309,-0.1817 -0.9260,-0.0000,0.3309,-0.1817 -0.9260,-0.0000,0.3309,-0.1817 -0.9260,-0.0000,0.3309,-0.1817 -0.9276,-0.0000,0.3337,-0.1681 -0.9276,-0.0000,0.3337,-0.1681 -0.9276,-0.0000,0.3337,-0.1681 -0.9276,-0.0000,0.3337,-0.1681 -0.9289,-0.0000,0.3366,-0.1546 -0.9289,-0.0000,0.3366,-0.1546 -0.9289,-0.0000,0.3366,-0.1546 -0.9289,-0.0000,0.3366,-0.1546 -0.9300,-0.0000,0.3395,-0.1412 -0.9300,-0.0000,0.3395,-0.1412 -0.9300,-0.0000,0.3395,-0.1412 -0.9300,-0.0000,0.3395,-0.1412 -0.9308,-0.0000,0.3424,-0.1279 -0.9308,-0.0000,0.3424,-0.1279 -0.9308,-0.0000,0.3424,-0.1279 -0.9308,-0.0000,0.3424,-0.1279 -0.9314,-0.0000,0.3454,-0.1146 -0.9314,-0.0000,0.3454,-0.1146 -0.9314,-0.0000,0.3454,-0.1146 -0.9314,-0.0000,0.3454,-0.1146 -0.9318,-0.0000,0.3485,-0.1015 -0.9318,-0.0000,0.3485,-0.1015 -0.9318,-0.0000,0.3485,-0.1015 -0.9318,-0.0000,0.3485,-0.1015 -0.9320,-0.0000,0.3516,-0.0884 -0.9320,-0.0000,0.3516,-0.0884 -0.9320,-0.0000,0.3516,-0.0884 -0.9320,-0.0000,0.3516,-0.0884 -0.9319,-0.0000,0.3548,-0.0754 -0.9319,-0.0000,0.3548,-0.0754 -0.9319,-0.0000,0.3548,-0.0754 -0.9319,-0.0000,0.3548,-0.0754 -0.9316,-0.0000,0.3581,-0.0625 -0.9316,-0.0000,0.3581,-0.0625 -0.9316,-0.0000,0.3581,-0.0625 -0.9316,-0.0000,0.3581,-0.0625 -0.9311,-0.0000,0.3614,-0.0498 -0.9311,-0.0000,0.3614,-0.0498 -0.9311,-0.0000,0.3614,-0.0498 -0.9311,-0.0000,0.3614,-0.0498 -0.9303,-0.0000,0.3648,-0.0371 -0.9303,-0.0000,0.3648,-0.0371 -0.9303,-0.0000,0.3648,-0.0371 -0.9303,-0.0000,0.3648,-0.0371 -0.9294,-0.0000,0.3683,-0.0246 -0.9294,-0.0000,0.3683,-0.0246 -0.9294,-0.0000,0.3683,-0.0246 -0.9294,-0.0000,0.3683,-0.0246 -0.9282,-0.0000,0.3718,-0.0122 -0.9282,-0.0000,0.3718,-0.0122 -0.9282,-0.0000,0.3718,-0.0122 -0.9282,-0.0000,0.3718,-0.0122 -0.9269,0.0000,0.3754,0.0000 -0.9269,0.0000,0.3754,0.0000 -0.9269,0.0000,0.3754,0.0000 -0.9269,0.0000,0.3754,0.0000 diff --git a/scripts/trajectories/full-circle-with-up-and-down-4s-fixed-pos-offset-Vector3.csv b/scripts/trajectories/full-circle-with-up-and-down-4s-fixed-pos-offset-Vector3.csv deleted file mode 100644 index c858131d94..0000000000 --- a/scripts/trajectories/full-circle-with-up-and-down-4s-fixed-pos-offset-Vector3.csv +++ /dev/null @@ -1,200 +0,0 @@ -10.0000,10.0000,10.0000,10.7012,9.9780,9.2874 -10.0000,10.0000,10.0000,10.7057,9.9556,9.2929 -10.0000,10.0000,10.0000,10.7095,9.9329,9.2985 -10.0000,10.0000,10.0000,10.7125,9.9100,9.3041 -10.0000,10.0000,10.0000,10.7147,9.8868,9.3097 -10.0000,10.0000,10.0000,10.7161,9.8634,9.3155 -10.0000,10.0000,10.0000,10.7166,9.8398,9.3212 -10.0000,10.0000,10.0000,10.7164,9.8161,9.3270 -10.0000,10.0000,10.0000,10.7153,9.7922,9.3328 -10.0000,10.0000,10.0000,10.7134,9.7682,9.3387 -10.0000,10.0000,10.0000,10.7106,9.7442,9.3446 -10.0000,10.0000,10.0000,10.7070,9.7201,9.3506 -10.0000,10.0000,10.0000,10.7025,9.6960,9.3565 -10.0000,10.0000,10.0000,10.6972,9.6719,9.3626 -10.0000,10.0000,10.0000,10.6910,9.6479,9.3686 -10.0000,10.0000,10.0000,10.6839,9.6240,9.3748 -10.0000,10.0000,10.0000,10.6760,9.6002,9.3809 -10.0000,10.0000,10.0000,10.6671,9.5766,9.3871 -10.0000,10.0000,10.0000,10.6575,9.5532,9.3933 -10.0000,10.0000,10.0000,10.6470,9.5300,9.3996 -10.0000,10.0000,10.0000,10.6356,9.5070,9.4059 -10.0000,10.0000,10.0000,10.6234,9.4843,9.4122 -10.0000,10.0000,10.0000,10.6103,9.4620,9.4186 -10.0000,10.0000,10.0000,10.5964,9.4399,9.4250 -10.0000,10.0000,10.0000,10.5817,9.4183,9.4314 -10.0000,10.0000,10.0000,10.5662,9.3971,9.4379 -10.0000,10.0000,10.0000,10.5499,9.3763,9.4444 -10.0000,10.0000,10.0000,10.5328,9.3560,9.4510 -10.0000,10.0000,10.0000,10.5149,9.3362,9.4576 -10.0000,10.0000,10.0000,10.4963,9.3169,9.4642 -10.0000,10.0000,10.0000,10.4769,9.2982,9.4708 -10.0000,10.0000,10.0000,10.4569,9.2801,9.4775 -10.0000,10.0000,10.0000,10.4361,9.2626,9.4842 -10.0000,10.0000,10.0000,10.4147,9.2457,9.4910 -10.0000,10.0000,10.0000,10.3926,9.2295,9.4977 -10.0000,10.0000,10.0000,10.3698,9.2140,9.5045 -10.0000,10.0000,10.0000,10.3465,9.1993,9.5114 -10.0000,10.0000,10.0000,10.3226,9.1852,9.5182 -10.0000,10.0000,10.0000,10.2981,9.1720,9.5251 -10.0000,10.0000,10.0000,10.2731,9.1595,9.5321 -10.0000,10.0000,10.0000,10.2476,9.1478,9.5390 -10.0000,10.0000,10.0000,10.2216,9.1370,9.5460 -10.0000,10.0000,10.0000,10.1951,9.1270,9.5530 -10.0000,10.0000,10.0000,10.1683,9.1179,9.5601 -10.0000,10.0000,10.0000,10.1410,9.1096,9.5671 -10.0000,10.0000,10.0000,10.1134,9.1023,9.5742 -10.0000,10.0000,10.0000,10.0855,9.0959,9.5813 -10.0000,10.0000,10.0000,10.0572,9.0904,9.5885 -10.0000,10.0000,10.0000,10.0287,9.0858,9.5957 -10.0000,10.0000,10.0000,10.0000,9.0822,9.6029 -10.0000,10.0000,10.0000,9.9711,9.0796,9.6101 -10.0000,10.0000,10.0000,9.9420,9.0779,9.6173 -10.0000,10.0000,10.0000,9.9128,9.0773,9.6246 -10.0000,10.0000,10.0000,9.8835,9.0776,9.6319 -10.0000,10.0000,10.0000,9.8541,9.0788,9.6392 -10.0000,10.0000,10.0000,9.8247,9.0811,9.6465 -10.0000,10.0000,10.0000,9.7953,9.0844,9.6539 -10.0000,10.0000,10.0000,9.7660,9.0887,9.6613 -10.0000,10.0000,10.0000,9.7368,9.0940,9.6687 -10.0000,10.0000,10.0000,9.7076,9.1002,9.6761 -10.0000,10.0000,10.0000,9.6787,9.1075,9.6835 -10.0000,10.0000,10.0000,9.6499,9.1157,9.6910 -10.0000,10.0000,10.0000,9.6213,9.1250,9.6985 -10.0000,10.0000,10.0000,9.5930,9.1352,9.7060 -10.0000,10.0000,10.0000,9.5650,9.1464,9.7135 -10.0000,10.0000,10.0000,9.5374,9.1585,9.7210 -10.0000,10.0000,10.0000,9.5101,9.1716,9.7286 -10.0000,10.0000,10.0000,9.4832,9.1856,9.7361 -10.0000,10.0000,10.0000,9.4567,9.2005,9.7437 -10.0000,10.0000,10.0000,9.4307,9.2164,9.7513 -10.0000,10.0000,10.0000,9.4052,9.2331,9.7589 -10.0000,10.0000,10.0000,9.3802,9.2508,9.7666 -10.0000,10.0000,10.0000,9.3558,9.2693,9.7742 -10.0000,10.0000,10.0000,9.3319,9.2886,9.7819 -10.0000,10.0000,10.0000,9.3087,9.3087,9.7895 -10.0000,10.0000,10.0000,9.2862,9.3297,9.7972 -10.0000,10.0000,10.0000,9.2643,9.3514,9.8049 -10.0000,10.0000,10.0000,9.2431,9.3739,9.8126 -10.0000,10.0000,10.0000,9.2227,9.3971,9.8203 -10.0000,10.0000,10.0000,9.2030,9.4210,9.8281 -10.0000,10.0000,10.0000,9.1841,9.4455,9.8358 -10.0000,10.0000,10.0000,9.1661,9.4708,9.8436 -10.0000,10.0000,10.0000,9.1488,9.4966,9.8513 -10.0000,10.0000,10.0000,9.1324,9.5231,9.8591 -10.0000,10.0000,10.0000,9.1169,9.5501,9.8669 -10.0000,10.0000,10.0000,9.1023,9.5776,9.8747 -10.0000,10.0000,10.0000,9.0886,9.6056,9.8825 -10.0000,10.0000,10.0000,9.0758,9.6341,9.8903 -10.0000,10.0000,10.0000,9.0640,9.6630,9.8981 -10.0000,10.0000,10.0000,9.0532,9.6924,9.9059 -10.0000,10.0000,10.0000,9.0433,9.7221,9.9137 -10.0000,10.0000,10.0000,9.0344,9.7521,9.9215 -10.0000,10.0000,10.0000,9.0265,9.7824,9.9294 -10.0000,10.0000,10.0000,9.0197,9.8130,9.9372 -10.0000,10.0000,10.0000,9.0138,9.8438,9.9451 -10.0000,10.0000,10.0000,9.0090,9.8748,9.9529 -10.0000,10.0000,10.0000,9.0052,9.9060,9.9607 -10.0000,10.0000,10.0000,9.0025,9.9372,9.9686 -10.0000,10.0000,10.0000,9.0008,9.9686,9.9764 -10.0000,10.0000,10.0000,9.0001,10.0000,9.9843 -10.0000,10.0000,10.0000,9.0005,10.0314,9.9921 -10.0000,10.0000,10.0000,9.0020,10.0628,10.0000 -10.0000,10.0000,10.0000,9.0045,10.0941,10.0079 -10.0000,10.0000,10.0000,9.0080,10.1253,10.0157 -10.0000,10.0000,10.0000,9.0126,10.1564,10.0236 -10.0000,10.0000,10.0000,9.0182,10.1873,10.0314 -10.0000,10.0000,10.0000,9.0248,10.2180,10.0393 -10.0000,10.0000,10.0000,9.0325,10.2484,10.0471 -10.0000,10.0000,10.0000,9.0412,10.2786,10.0550 -10.0000,10.0000,10.0000,9.0508,10.3084,10.0628 -10.0000,10.0000,10.0000,9.0615,10.3379,10.0706 -10.0000,10.0000,10.0000,9.0731,10.3670,10.0785 -10.0000,10.0000,10.0000,9.0857,10.3957,10.0863 -10.0000,10.0000,10.0000,9.0992,10.4239,10.0941 -10.0000,10.0000,10.0000,9.1136,10.4516,10.1019 -10.0000,10.0000,10.0000,9.1290,10.4788,10.1097 -10.0000,10.0000,10.0000,9.1452,10.5055,10.1175 -10.0000,10.0000,10.0000,9.1623,10.5316,10.1253 -10.0000,10.0000,10.0000,9.1803,10.5571,10.1331 -10.0000,10.0000,10.0000,9.1991,10.5819,10.1409 -10.0000,10.0000,10.0000,9.2186,10.6061,10.1487 -10.0000,10.0000,10.0000,9.2390,10.6296,10.1564 -10.0000,10.0000,10.0000,9.2601,10.6523,10.1642 -10.0000,10.0000,10.0000,9.2819,10.6744,10.1719 -10.0000,10.0000,10.0000,9.3044,10.6956,10.1797 -10.0000,10.0000,10.0000,9.3276,10.7161,10.1874 -10.0000,10.0000,10.0000,9.3514,10.7357,10.1951 -10.0000,10.0000,10.0000,9.3758,10.7545,10.2028 -10.0000,10.0000,10.0000,9.4008,10.7725,10.2105 -10.0000,10.0000,10.0000,9.4264,10.7895,10.2181 -10.0000,10.0000,10.0000,9.4524,10.8057,10.2258 -10.0000,10.0000,10.0000,9.4790,10.8210,10.2334 -10.0000,10.0000,10.0000,9.5060,10.8354,10.2411 -10.0000,10.0000,10.0000,9.5334,10.8488,10.2487 -10.0000,10.0000,10.0000,9.5612,10.8612,10.2563 -10.0000,10.0000,10.0000,9.5893,10.8728,10.2639 -10.0000,10.0000,10.0000,9.6178,10.8833,10.2714 -10.0000,10.0000,10.0000,9.6465,10.8929,10.2790 -10.0000,10.0000,10.0000,9.6755,10.9014,10.2865 -10.0000,10.0000,10.0000,9.7046,10.9090,10.2940 -10.0000,10.0000,10.0000,9.7340,10.9156,10.3015 -10.0000,10.0000,10.0000,9.7635,10.9212,10.3090 -10.0000,10.0000,10.0000,9.7931,10.9258,10.3165 -10.0000,10.0000,10.0000,9.8227,10.9293,10.3239 -10.0000,10.0000,10.0000,9.8524,10.9319,10.3313 -10.0000,10.0000,10.0000,9.8821,10.9335,10.3387 -10.0000,10.0000,10.0000,9.9117,10.9340,10.3461 -10.0000,10.0000,10.0000,9.9413,10.9336,10.3535 -10.0000,10.0000,10.0000,9.9707,10.9322,10.3608 -10.0000,10.0000,10.0000,10.0000,10.9298,10.3681 -10.0000,10.0000,10.0000,10.0291,10.9264,10.3754 -10.0000,10.0000,10.0000,10.0580,10.9221,10.3827 -10.0000,10.0000,10.0000,10.0867,10.9168,10.3899 -10.0000,10.0000,10.0000,10.1150,10.9105,10.3971 -10.0000,10.0000,10.0000,10.1431,10.9033,10.4043 -10.0000,10.0000,10.0000,10.1708,10.8953,10.4115 -10.0000,10.0000,10.0000,10.1981,10.8863,10.4187 -10.0000,10.0000,10.0000,10.2250,10.8764,10.4258 -10.0000,10.0000,10.0000,10.2515,10.8657,10.4329 -10.0000,10.0000,10.0000,10.2775,10.8541,10.4399 -10.0000,10.0000,10.0000,10.3030,10.8417,10.4470 -10.0000,10.0000,10.0000,10.3280,10.8284,10.4540 -10.0000,10.0000,10.0000,10.3524,10.8144,10.4610 -10.0000,10.0000,10.0000,10.3763,10.7997,10.4679 -10.0000,10.0000,10.0000,10.3995,10.7841,10.4749 -10.0000,10.0000,10.0000,10.4222,10.7679,10.4818 -10.0000,10.0000,10.0000,10.4441,10.7510,10.4886 -10.0000,10.0000,10.0000,10.4654,10.7334,10.4955 -10.0000,10.0000,10.0000,10.4860,10.7152,10.5023 -10.0000,10.0000,10.0000,10.5059,10.6964,10.5090 -10.0000,10.0000,10.0000,10.5251,10.6769,10.5158 -10.0000,10.0000,10.0000,10.5435,10.6570,10.5225 -10.0000,10.0000,10.0000,10.5611,10.6365,10.5292 -10.0000,10.0000,10.0000,10.5780,10.6155,10.5358 -10.0000,10.0000,10.0000,10.5940,10.5940,10.5424 -10.0000,10.0000,10.0000,10.6093,10.5721,10.5490 -10.0000,10.0000,10.0000,10.6237,10.5499,10.5556 -10.0000,10.0000,10.0000,10.6373,10.5272,10.5621 -10.0000,10.0000,10.0000,10.6500,10.5042,10.5686 -10.0000,10.0000,10.0000,10.6619,10.4809,10.5750 -10.0000,10.0000,10.0000,10.6729,10.4573,10.5814 -10.0000,10.0000,10.0000,10.6831,10.4335,10.5878 -10.0000,10.0000,10.0000,10.6924,10.4095,10.5941 -10.0000,10.0000,10.0000,10.7008,10.3852,10.6004 -10.0000,10.0000,10.0000,10.7083,10.3609,10.6067 -10.0000,10.0000,10.0000,10.7150,10.3364,10.6129 -10.0000,10.0000,10.0000,10.7207,10.3119,10.6191 -10.0000,10.0000,10.0000,10.7256,10.2873,10.6252 -10.0000,10.0000,10.0000,10.7296,10.2627,10.6314 -10.0000,10.0000,10.0000,10.7328,10.2381,10.6374 -10.0000,10.0000,10.0000,10.7351,10.2136,10.6435 -10.0000,10.0000,10.0000,10.7365,10.1891,10.6494 -10.0000,10.0000,10.0000,10.7371,10.1648,10.6554 -10.0000,10.0000,10.0000,10.7368,10.1406,10.6613 -10.0000,10.0000,10.0000,10.7357,10.1165,10.6672 -10.0000,10.0000,10.0000,10.7338,10.0927,10.6730 -10.0000,10.0000,10.0000,10.7311,10.0691,10.6788 -10.0000,10.0000,10.0000,10.7275,10.0458,10.6845 -10.0000,10.0000,10.0000,10.7232,10.0227,10.6903 -10.0000,10.0000,10.0000,10.7181,10.0000,10.6959 diff --git a/scripts/trajectories/full-circle-with-up-and-down-4s.csv b/scripts/trajectories/full-circle-with-up-and-down-4s.csv deleted file mode 100644 index 31692f4673..0000000000 --- a/scripts/trajectories/full-circle-with-up-and-down-4s.csv +++ /dev/null @@ -1,800 +0,0 @@ -0.9223,-0.0000,0.3863,-0.0119 -0.9223,-0.0000,0.3863,-0.0119 -0.9223,-0.0000,0.3863,-0.0119 -0.9223,-0.0000,0.3863,-0.0119 -0.9235,-0.0000,0.3828,-0.0240 -0.9235,-0.0000,0.3828,-0.0240 -0.9235,-0.0000,0.3828,-0.0240 -0.9235,-0.0000,0.3828,-0.0240 -0.9245,-0.0000,0.3794,-0.0363 -0.9245,-0.0000,0.3794,-0.0363 -0.9245,-0.0000,0.3794,-0.0363 -0.9245,-0.0000,0.3794,-0.0363 -0.9253,-0.0000,0.3760,-0.0486 -0.9253,-0.0000,0.3760,-0.0486 -0.9253,-0.0000,0.3760,-0.0486 -0.9253,-0.0000,0.3760,-0.0486 -0.9259,-0.0000,0.3727,-0.0611 -0.9259,-0.0000,0.3727,-0.0611 -0.9259,-0.0000,0.3727,-0.0611 -0.9259,-0.0000,0.3727,-0.0611 -0.9263,-0.0000,0.3695,-0.0737 -0.9263,-0.0000,0.3695,-0.0737 -0.9263,-0.0000,0.3695,-0.0737 -0.9263,-0.0000,0.3695,-0.0737 -0.9265,-0.0000,0.3663,-0.0865 -0.9265,-0.0000,0.3663,-0.0865 -0.9265,-0.0000,0.3663,-0.0865 -0.9265,-0.0000,0.3663,-0.0865 -0.9264,-0.0000,0.3632,-0.0993 -0.9264,-0.0000,0.3632,-0.0993 -0.9264,-0.0000,0.3632,-0.0993 -0.9264,-0.0000,0.3632,-0.0993 -0.9261,-0.0000,0.3602,-0.1122 -0.9261,-0.0000,0.3602,-0.1122 -0.9261,-0.0000,0.3602,-0.1122 -0.9261,-0.0000,0.3602,-0.1122 -0.9256,-0.0000,0.3572,-0.1252 -0.9256,-0.0000,0.3572,-0.1252 -0.9256,-0.0000,0.3572,-0.1252 -0.9256,-0.0000,0.3572,-0.1252 -0.9248,-0.0000,0.3543,-0.1383 -0.9248,-0.0000,0.3543,-0.1383 -0.9248,-0.0000,0.3543,-0.1383 -0.9248,-0.0000,0.3543,-0.1383 -0.9239,-0.0000,0.3515,-0.1515 -0.9239,-0.0000,0.3515,-0.1515 -0.9239,-0.0000,0.3515,-0.1515 -0.9239,-0.0000,0.3515,-0.1515 -0.9226,-0.0000,0.3487,-0.1648 -0.9226,-0.0000,0.3487,-0.1648 -0.9226,-0.0000,0.3487,-0.1648 -0.9226,-0.0000,0.3487,-0.1648 -0.9212,-0.0000,0.3460,-0.1781 -0.9212,-0.0000,0.3460,-0.1781 -0.9212,-0.0000,0.3460,-0.1781 -0.9212,-0.0000,0.3460,-0.1781 -0.9195,-0.0000,0.3433,-0.1914 -0.9195,-0.0000,0.3433,-0.1914 -0.9195,-0.0000,0.3433,-0.1914 -0.9195,-0.0000,0.3433,-0.1914 -0.9176,-0.0000,0.3407,-0.2049 -0.9176,-0.0000,0.3407,-0.2049 -0.9176,-0.0000,0.3407,-0.2049 -0.9176,-0.0000,0.3407,-0.2049 -0.9154,-0.0000,0.3382,-0.2183 -0.9154,-0.0000,0.3382,-0.2183 -0.9154,-0.0000,0.3382,-0.2183 -0.9154,-0.0000,0.3382,-0.2183 -0.9130,-0.0000,0.3357,-0.2319 -0.9130,-0.0000,0.3357,-0.2319 -0.9130,-0.0000,0.3357,-0.2319 -0.9130,-0.0000,0.3357,-0.2319 -0.9104,-0.0000,0.3332,-0.2454 -0.9104,-0.0000,0.3332,-0.2454 -0.9104,-0.0000,0.3332,-0.2454 -0.9104,-0.0000,0.3332,-0.2454 -0.9075,-0.0000,0.3308,-0.2590 -0.9075,-0.0000,0.3308,-0.2590 -0.9075,-0.0000,0.3308,-0.2590 -0.9075,-0.0000,0.3308,-0.2590 -0.9043,-0.0000,0.3285,-0.2726 -0.9043,-0.0000,0.3285,-0.2726 -0.9043,-0.0000,0.3285,-0.2726 -0.9043,-0.0000,0.3285,-0.2726 -0.9009,-0.0000,0.3262,-0.2862 -0.9009,-0.0000,0.3262,-0.2862 -0.9009,-0.0000,0.3262,-0.2862 -0.9009,-0.0000,0.3262,-0.2862 -0.8973,-0.0000,0.3240,-0.2998 -0.8973,-0.0000,0.3240,-0.2998 -0.8973,-0.0000,0.3240,-0.2998 -0.8973,-0.0000,0.3240,-0.2998 -0.8934,-0.0000,0.3218,-0.3134 -0.8934,-0.0000,0.3218,-0.3134 -0.8934,-0.0000,0.3218,-0.3134 -0.8934,-0.0000,0.3218,-0.3134 -0.8893,-0.0000,0.3197,-0.3271 -0.8893,-0.0000,0.3197,-0.3271 -0.8893,-0.0000,0.3197,-0.3271 -0.8893,-0.0000,0.3197,-0.3271 -0.8849,-0.0000,0.3176,-0.3407 -0.8849,-0.0000,0.3176,-0.3407 -0.8849,-0.0000,0.3176,-0.3407 -0.8849,-0.0000,0.3176,-0.3407 -0.8803,-0.0000,0.3156,-0.3543 -0.8803,-0.0000,0.3156,-0.3543 -0.8803,-0.0000,0.3156,-0.3543 -0.8803,-0.0000,0.3156,-0.3543 -0.8754,-0.0000,0.3136,-0.3678 -0.8754,-0.0000,0.3136,-0.3678 -0.8754,-0.0000,0.3136,-0.3678 -0.8754,-0.0000,0.3136,-0.3678 -0.8703,-0.0000,0.3116,-0.3814 -0.8703,-0.0000,0.3116,-0.3814 -0.8703,-0.0000,0.3116,-0.3814 -0.8703,-0.0000,0.3116,-0.3814 -0.8650,-0.0000,0.3097,-0.3949 -0.8650,-0.0000,0.3097,-0.3949 -0.8650,-0.0000,0.3097,-0.3949 -0.8650,-0.0000,0.3097,-0.3949 -0.8593,-0.0000,0.3079,-0.4083 -0.8593,-0.0000,0.3079,-0.4083 -0.8593,-0.0000,0.3079,-0.4083 -0.8593,-0.0000,0.3079,-0.4083 -0.8535,-0.0000,0.3061,-0.4217 -0.8535,-0.0000,0.3061,-0.4217 -0.8535,-0.0000,0.3061,-0.4217 -0.8535,-0.0000,0.3061,-0.4217 -0.8474,-0.0000,0.3043,-0.4351 -0.8474,-0.0000,0.3043,-0.4351 -0.8474,-0.0000,0.3043,-0.4351 -0.8474,-0.0000,0.3043,-0.4351 -0.8410,-0.0000,0.3026,-0.4484 -0.8410,-0.0000,0.3026,-0.4484 -0.8410,-0.0000,0.3026,-0.4484 -0.8410,-0.0000,0.3026,-0.4484 -0.8344,-0.0000,0.3010,-0.4617 -0.8344,-0.0000,0.3010,-0.4617 -0.8344,-0.0000,0.3010,-0.4617 -0.8344,-0.0000,0.3010,-0.4617 -0.8276,-0.0000,0.2993,-0.4748 -0.8276,-0.0000,0.2993,-0.4748 -0.8276,-0.0000,0.2993,-0.4748 -0.8276,-0.0000,0.2993,-0.4748 -0.8205,-0.0000,0.2978,-0.4879 -0.8205,-0.0000,0.2978,-0.4879 -0.8205,-0.0000,0.2978,-0.4879 -0.8205,-0.0000,0.2978,-0.4879 -0.8132,-0.0000,0.2962,-0.5010 -0.8132,-0.0000,0.2962,-0.5010 -0.8132,-0.0000,0.2962,-0.5010 -0.8132,-0.0000,0.2962,-0.5010 -0.8056,-0.0000,0.2947,-0.5139 -0.8056,-0.0000,0.2947,-0.5139 -0.8056,-0.0000,0.2947,-0.5139 -0.8056,-0.0000,0.2947,-0.5139 -0.7978,-0.0000,0.2932,-0.5267 -0.7978,-0.0000,0.2932,-0.5267 -0.7978,-0.0000,0.2932,-0.5267 -0.7978,-0.0000,0.2932,-0.5267 -0.7898,-0.0000,0.2918,-0.5395 -0.7898,-0.0000,0.2918,-0.5395 -0.7898,-0.0000,0.2918,-0.5395 -0.7898,-0.0000,0.2918,-0.5395 -0.7815,-0.0000,0.2904,-0.5521 -0.7815,-0.0000,0.2904,-0.5521 -0.7815,-0.0000,0.2904,-0.5521 -0.7815,-0.0000,0.2904,-0.5521 -0.7730,-0.0000,0.2891,-0.5647 -0.7730,-0.0000,0.2891,-0.5647 -0.7730,-0.0000,0.2891,-0.5647 -0.7730,-0.0000,0.2891,-0.5647 -0.7643,-0.0000,0.2878,-0.5771 -0.7643,-0.0000,0.2878,-0.5771 -0.7643,-0.0000,0.2878,-0.5771 -0.7643,-0.0000,0.2878,-0.5771 -0.7553,-0.0000,0.2865,-0.5894 -0.7553,-0.0000,0.2865,-0.5894 -0.7553,-0.0000,0.2865,-0.5894 -0.7553,-0.0000,0.2865,-0.5894 -0.7461,-0.0000,0.2853,-0.6016 -0.7461,-0.0000,0.2853,-0.6016 -0.7461,-0.0000,0.2853,-0.6016 -0.7461,-0.0000,0.2853,-0.6016 -0.7367,-0.0000,0.2841,-0.6136 -0.7367,-0.0000,0.2841,-0.6136 -0.7367,-0.0000,0.2841,-0.6136 -0.7367,-0.0000,0.2841,-0.6136 -0.7271,-0.0000,0.2830,-0.6255 -0.7271,-0.0000,0.2830,-0.6255 -0.7271,-0.0000,0.2830,-0.6255 -0.7271,-0.0000,0.2830,-0.6255 -0.7172,-0.0000,0.2819,-0.6373 -0.7172,-0.0000,0.2819,-0.6373 -0.7172,-0.0000,0.2819,-0.6373 -0.7172,-0.0000,0.2819,-0.6373 -0.7071,-0.0000,0.2808,-0.6490 -0.7071,-0.0000,0.2808,-0.6490 -0.7071,-0.0000,0.2808,-0.6490 -0.7071,-0.0000,0.2808,-0.6490 -0.6968,-0.0000,0.2798,-0.6604 -0.6968,-0.0000,0.2798,-0.6604 -0.6968,-0.0000,0.2798,-0.6604 -0.6968,-0.0000,0.2798,-0.6604 -0.6863,-0.0000,0.2788,-0.6718 -0.6863,-0.0000,0.2788,-0.6718 -0.6863,-0.0000,0.2788,-0.6718 -0.6863,-0.0000,0.2788,-0.6718 -0.6756,-0.0000,0.2779,-0.6829 -0.6756,-0.0000,0.2779,-0.6829 -0.6756,-0.0000,0.2779,-0.6829 -0.6756,-0.0000,0.2779,-0.6829 -0.6646,-0.0000,0.2769,-0.6940 -0.6646,-0.0000,0.2769,-0.6940 -0.6646,-0.0000,0.2769,-0.6940 -0.6646,-0.0000,0.2769,-0.6940 -0.6535,-0.0000,0.2761,-0.7048 -0.6535,-0.0000,0.2761,-0.7048 -0.6535,-0.0000,0.2761,-0.7048 -0.6535,-0.0000,0.2761,-0.7048 -0.6422,-0.0000,0.2752,-0.7155 -0.6422,-0.0000,0.2752,-0.7155 -0.6422,-0.0000,0.2752,-0.7155 -0.6422,-0.0000,0.2752,-0.7155 -0.6306,-0.0000,0.2744,-0.7260 -0.6306,-0.0000,0.2744,-0.7260 -0.6306,-0.0000,0.2744,-0.7260 -0.6306,-0.0000,0.2744,-0.7260 -0.6189,-0.0000,0.2737,-0.7363 -0.6189,-0.0000,0.2737,-0.7363 -0.6189,-0.0000,0.2737,-0.7363 -0.6189,-0.0000,0.2737,-0.7363 -0.6069,-0.0000,0.2730,-0.7464 -0.6069,-0.0000,0.2730,-0.7464 -0.6069,-0.0000,0.2730,-0.7464 -0.6069,-0.0000,0.2730,-0.7464 -0.5948,-0.0000,0.2723,-0.7563 -0.5948,-0.0000,0.2723,-0.7563 -0.5948,-0.0000,0.2723,-0.7563 -0.5948,-0.0000,0.2723,-0.7563 -0.5825,-0.0000,0.2716,-0.7661 -0.5825,-0.0000,0.2716,-0.7661 -0.5825,-0.0000,0.2716,-0.7661 -0.5825,-0.0000,0.2716,-0.7661 -0.5700,-0.0000,0.2710,-0.7756 -0.5700,-0.0000,0.2710,-0.7756 -0.5700,-0.0000,0.2710,-0.7756 -0.5700,-0.0000,0.2710,-0.7756 -0.5574,-0.0000,0.2705,-0.7850 -0.5574,-0.0000,0.2705,-0.7850 -0.5574,-0.0000,0.2705,-0.7850 -0.5574,-0.0000,0.2705,-0.7850 -0.5445,-0.0000,0.2700,-0.7941 -0.5445,-0.0000,0.2700,-0.7941 -0.5445,-0.0000,0.2700,-0.7941 -0.5445,-0.0000,0.2700,-0.7941 -0.5315,-0.0000,0.2695,-0.8030 -0.5315,-0.0000,0.2695,-0.8030 -0.5315,-0.0000,0.2695,-0.8030 -0.5315,-0.0000,0.2695,-0.8030 -0.5184,-0.0000,0.2691,-0.8117 -0.5184,-0.0000,0.2691,-0.8117 -0.5184,-0.0000,0.2691,-0.8117 -0.5184,-0.0000,0.2691,-0.8117 -0.5050,-0.0000,0.2687,-0.8202 -0.5050,-0.0000,0.2687,-0.8202 -0.5050,-0.0000,0.2687,-0.8202 -0.5050,-0.0000,0.2687,-0.8202 -0.4915,-0.0000,0.2684,-0.8285 -0.4915,-0.0000,0.2684,-0.8285 -0.4915,-0.0000,0.2684,-0.8285 -0.4915,-0.0000,0.2684,-0.8285 -0.4779,-0.0000,0.2682,-0.8365 -0.4779,-0.0000,0.2682,-0.8365 -0.4779,-0.0000,0.2682,-0.8365 -0.4779,-0.0000,0.2682,-0.8365 -0.4640,-0.0000,0.2680,-0.8443 -0.4640,-0.0000,0.2680,-0.8443 -0.4640,-0.0000,0.2680,-0.8443 -0.4640,-0.0000,0.2680,-0.8443 -0.4501,-0.0000,0.2678,-0.8519 -0.4501,-0.0000,0.2678,-0.8519 -0.4501,-0.0000,0.2678,-0.8519 -0.4501,-0.0000,0.2678,-0.8519 -0.4360,-0.0000,0.2677,-0.8592 -0.4360,-0.0000,0.2677,-0.8592 -0.4360,-0.0000,0.2677,-0.8592 -0.4360,-0.0000,0.2677,-0.8592 -0.4218,-0.0000,0.2677,-0.8663 -0.4218,-0.0000,0.2677,-0.8663 -0.4218,-0.0000,0.2677,-0.8663 -0.4218,-0.0000,0.2677,-0.8663 -0.4074,-0.0000,0.2677,-0.8731 -0.4074,-0.0000,0.2677,-0.8731 -0.4074,-0.0000,0.2677,-0.8731 -0.4074,-0.0000,0.2677,-0.8731 -0.3929,-0.0000,0.2678,-0.8797 -0.3929,-0.0000,0.2678,-0.8797 -0.3929,-0.0000,0.2678,-0.8797 -0.3929,-0.0000,0.2678,-0.8797 -0.3783,-0.0000,0.2680,-0.8860 -0.3783,-0.0000,0.2680,-0.8860 -0.3783,-0.0000,0.2680,-0.8860 -0.3783,-0.0000,0.2680,-0.8860 -0.3635,-0.0000,0.2683,-0.8921 -0.3635,-0.0000,0.2683,-0.8921 -0.3635,-0.0000,0.2683,-0.8921 -0.3635,-0.0000,0.2683,-0.8921 -0.3487,-0.0000,0.2687,-0.8979 -0.3487,-0.0000,0.2687,-0.8979 -0.3487,-0.0000,0.2687,-0.8979 -0.3487,-0.0000,0.2687,-0.8979 -0.3337,-0.0000,0.2692,-0.9034 -0.3337,-0.0000,0.2692,-0.9034 -0.3337,-0.0000,0.2692,-0.9034 -0.3337,-0.0000,0.2692,-0.9034 -0.3186,-0.0000,0.2698,-0.9087 -0.3186,-0.0000,0.2698,-0.9087 -0.3186,-0.0000,0.2698,-0.9087 -0.3186,-0.0000,0.2698,-0.9087 -0.3034,-0.0000,0.2705,-0.9136 -0.3034,-0.0000,0.2705,-0.9136 -0.3034,-0.0000,0.2705,-0.9136 -0.3034,-0.0000,0.2705,-0.9136 -0.2882,-0.0000,0.2714,-0.9183 -0.2882,-0.0000,0.2714,-0.9183 -0.2882,-0.0000,0.2714,-0.9183 -0.2882,-0.0000,0.2714,-0.9183 -0.2728,-0.0000,0.2725,-0.9227 -0.2728,-0.0000,0.2725,-0.9227 -0.2728,-0.0000,0.2725,-0.9227 -0.2728,-0.0000,0.2725,-0.9227 -0.2573,-0.0000,0.2738,-0.9267 -0.2573,-0.0000,0.2738,-0.9267 -0.2573,-0.0000,0.2738,-0.9267 -0.2573,-0.0000,0.2738,-0.9267 -0.2418,-0.0000,0.2753,-0.9305 -0.2418,-0.0000,0.2753,-0.9305 -0.2418,-0.0000,0.2753,-0.9305 -0.2418,-0.0000,0.2753,-0.9305 -0.2262,-0.0000,0.2771,-0.9339 -0.2262,-0.0000,0.2771,-0.9339 -0.2262,-0.0000,0.2771,-0.9339 -0.2262,-0.0000,0.2771,-0.9339 -0.2105,-0.0000,0.2792,-0.9369 -0.2105,-0.0000,0.2792,-0.9369 -0.2105,-0.0000,0.2792,-0.9369 -0.2105,-0.0000,0.2792,-0.9369 -0.1947,-0.0000,0.2818,-0.9395 -0.1947,-0.0000,0.2818,-0.9395 -0.1947,-0.0000,0.2818,-0.9395 -0.1947,-0.0000,0.2818,-0.9395 -0.1789,-0.0000,0.2848,-0.9417 -0.1789,-0.0000,0.2848,-0.9417 -0.1789,-0.0000,0.2848,-0.9417 -0.1789,-0.0000,0.2848,-0.9417 -0.1630,-0.0000,0.2886,-0.9435 -0.1630,-0.0000,0.2886,-0.9435 -0.1630,-0.0000,0.2886,-0.9435 -0.1630,-0.0000,0.2886,-0.9435 -0.1471,-0.0000,0.2933,-0.9446 -0.1471,-0.0000,0.2933,-0.9446 -0.1471,-0.0000,0.2933,-0.9446 -0.1471,-0.0000,0.2933,-0.9446 -0.1312,-0.0000,0.2991,-0.9452 -0.1312,-0.0000,0.2991,-0.9452 -0.1312,-0.0000,0.2991,-0.9452 -0.1312,-0.0000,0.2991,-0.9452 -0.1152,-0.0000,0.3067,-0.9448 -0.1152,-0.0000,0.3067,-0.9448 -0.1152,-0.0000,0.3067,-0.9448 -0.1152,-0.0000,0.3067,-0.9448 -0.0991,-0.0000,0.3167,-0.9433 -0.0991,-0.0000,0.3167,-0.9433 -0.0991,-0.0000,0.3167,-0.9433 -0.0991,-0.0000,0.3167,-0.9433 -0.0831,-0.0000,0.3307,-0.9401 -0.0831,-0.0000,0.3307,-0.9401 -0.0831,-0.0000,0.3307,-0.9401 -0.0831,-0.0000,0.3307,-0.9401 -0.0670,-0.0000,0.3514,-0.9338 -0.0670,-0.0000,0.3514,-0.9338 -0.0670,-0.0000,0.3514,-0.9338 -0.0670,-0.0000,0.3514,-0.9338 -0.0510,-0.0000,0.3848,-0.9216 -0.0510,-0.0000,0.3848,-0.9216 -0.0510,-0.0000,0.3848,-0.9216 -0.0510,-0.0000,0.3848,-0.9216 -0.0351,-0.0000,0.4473,-0.8937 -0.0351,-0.0000,0.4473,-0.8937 -0.0351,-0.0000,0.4473,-0.8937 -0.0351,-0.0000,0.4473,-0.8937 -0.0196,-0.0000,0.6000,-0.7997 -0.0196,-0.0000,0.6000,-0.7997 -0.0196,-0.0000,0.6000,-0.7997 -0.0196,-0.0000,0.6000,-0.7997 -0.0079,0.0000,1.0000,0.0001 -0.0079,0.0000,1.0000,0.0001 -0.0079,0.0000,1.0000,0.0001 -0.0079,0.0000,1.0000,0.0001 -0.0162,0.0000,0.2425,0.9700 -0.0162,0.0000,0.2425,0.9700 -0.0162,0.0000,0.2425,0.9700 -0.0162,0.0000,0.2425,0.9700 -0.0314,-0.0000,-0.0000,0.9995 -0.0314,-0.0000,-0.0000,0.9995 -0.0314,-0.0000,-0.0000,0.9995 -0.0314,-0.0000,-0.0000,0.9995 -0.0473,-0.0000,-0.0831,0.9954 -0.0473,-0.0000,-0.0831,0.9954 -0.0473,-0.0000,-0.0831,0.9954 -0.0473,-0.0000,-0.0831,0.9954 -0.0633,-0.0000,-0.1241,0.9902 -0.0633,-0.0000,-0.1241,0.9902 -0.0633,-0.0000,-0.1241,0.9902 -0.0633,-0.0000,-0.1241,0.9902 -0.0793,-0.0000,-0.1485,0.9857 -0.0793,-0.0000,-0.1485,0.9857 -0.0793,-0.0000,-0.1485,0.9857 -0.0793,-0.0000,-0.1485,0.9857 -0.0954,-0.0000,-0.1646,0.9817 -0.0954,-0.0000,-0.1646,0.9817 -0.0954,-0.0000,-0.1646,0.9817 -0.0954,-0.0000,-0.1646,0.9817 -0.1114,-0.0000,-0.1762,0.9780 -0.1114,-0.0000,-0.1762,0.9780 -0.1114,-0.0000,-0.1762,0.9780 -0.1114,-0.0000,-0.1762,0.9780 -0.1275,-0.0000,-0.1848,0.9745 -0.1275,-0.0000,-0.1848,0.9745 -0.1275,-0.0000,-0.1848,0.9745 -0.1275,-0.0000,-0.1848,0.9745 -0.1435,-0.0000,-0.1915,0.9709 -0.1435,-0.0000,-0.1915,0.9709 -0.1435,-0.0000,-0.1915,0.9709 -0.1435,-0.0000,-0.1915,0.9709 -0.1594,-0.0000,-0.1970,0.9674 -0.1594,-0.0000,-0.1970,0.9674 -0.1594,-0.0000,-0.1970,0.9674 -0.1594,-0.0000,-0.1970,0.9674 -0.1753,-0.0000,-0.2014,0.9637 -0.1753,-0.0000,-0.2014,0.9637 -0.1753,-0.0000,-0.2014,0.9637 -0.1753,-0.0000,-0.2014,0.9637 -0.1912,-0.0000,-0.2052,0.9599 -0.1912,-0.0000,-0.2052,0.9599 -0.1912,-0.0000,-0.2052,0.9599 -0.1912,-0.0000,-0.2052,0.9599 -0.2070,-0.0000,-0.2085,0.9559 -0.2070,-0.0000,-0.2085,0.9559 -0.2070,-0.0000,-0.2085,0.9559 -0.2070,-0.0000,-0.2085,0.9559 -0.2227,-0.0000,-0.2113,0.9517 -0.2227,-0.0000,-0.2113,0.9517 -0.2227,-0.0000,-0.2113,0.9517 -0.2227,-0.0000,-0.2113,0.9517 -0.2384,-0.0000,-0.2138,0.9473 -0.2384,-0.0000,-0.2138,0.9473 -0.2384,-0.0000,-0.2138,0.9473 -0.2384,-0.0000,-0.2138,0.9473 -0.2540,-0.0000,-0.2161,0.9428 -0.2540,-0.0000,-0.2161,0.9428 -0.2540,-0.0000,-0.2161,0.9428 -0.2540,-0.0000,-0.2161,0.9428 -0.2695,-0.0000,-0.2181,0.9380 -0.2695,-0.0000,-0.2181,0.9380 -0.2695,-0.0000,-0.2181,0.9380 -0.2695,-0.0000,-0.2181,0.9380 -0.2849,-0.0000,-0.2200,0.9330 -0.2849,-0.0000,-0.2200,0.9330 -0.2849,-0.0000,-0.2200,0.9330 -0.2849,-0.0000,-0.2200,0.9330 -0.3002,-0.0000,-0.2217,0.9277 -0.3002,-0.0000,-0.2217,0.9277 -0.3002,-0.0000,-0.2217,0.9277 -0.3002,-0.0000,-0.2217,0.9277 -0.3155,-0.0000,-0.2233,0.9223 -0.3155,-0.0000,-0.2233,0.9223 -0.3155,-0.0000,-0.2233,0.9223 -0.3155,-0.0000,-0.2233,0.9223 -0.3306,-0.0000,-0.2248,0.9166 -0.3306,-0.0000,-0.2248,0.9166 -0.3306,-0.0000,-0.2248,0.9166 -0.3306,-0.0000,-0.2248,0.9166 -0.3457,-0.0000,-0.2263,0.9107 -0.3457,-0.0000,-0.2263,0.9107 -0.3457,-0.0000,-0.2263,0.9107 -0.3457,-0.0000,-0.2263,0.9107 -0.3606,-0.0000,-0.2277,0.9045 -0.3606,-0.0000,-0.2277,0.9045 -0.3606,-0.0000,-0.2277,0.9045 -0.3606,-0.0000,-0.2277,0.9045 -0.3754,-0.0000,-0.2290,0.8981 -0.3754,-0.0000,-0.2290,0.8981 -0.3754,-0.0000,-0.2290,0.8981 -0.3754,-0.0000,-0.2290,0.8981 -0.3901,-0.0000,-0.2303,0.8915 -0.3901,-0.0000,-0.2303,0.8915 -0.3901,-0.0000,-0.2303,0.8915 -0.3901,-0.0000,-0.2303,0.8915 -0.4047,-0.0000,-0.2315,0.8847 -0.4047,-0.0000,-0.2315,0.8847 -0.4047,-0.0000,-0.2315,0.8847 -0.4047,-0.0000,-0.2315,0.8847 -0.4192,-0.0000,-0.2327,0.8776 -0.4192,-0.0000,-0.2327,0.8776 -0.4192,-0.0000,-0.2327,0.8776 -0.4192,-0.0000,-0.2327,0.8776 -0.4335,-0.0000,-0.2339,0.8703 -0.4335,-0.0000,-0.2339,0.8703 -0.4335,-0.0000,-0.2339,0.8703 -0.4335,-0.0000,-0.2339,0.8703 -0.4477,-0.0000,-0.2351,0.8627 -0.4477,-0.0000,-0.2351,0.8627 -0.4477,-0.0000,-0.2351,0.8627 -0.4477,-0.0000,-0.2351,0.8627 -0.4617,-0.0000,-0.2362,0.8550 -0.4617,-0.0000,-0.2362,0.8550 -0.4617,-0.0000,-0.2362,0.8550 -0.4617,-0.0000,-0.2362,0.8550 -0.4756,-0.0000,-0.2374,0.8470 -0.4756,-0.0000,-0.2374,0.8470 -0.4756,-0.0000,-0.2374,0.8470 -0.4756,-0.0000,-0.2374,0.8470 -0.4894,-0.0000,-0.2385,0.8388 -0.4894,-0.0000,-0.2385,0.8388 -0.4894,-0.0000,-0.2385,0.8388 -0.4894,-0.0000,-0.2385,0.8388 -0.5030,-0.0000,-0.2396,0.8304 -0.5030,-0.0000,-0.2396,0.8304 -0.5030,-0.0000,-0.2396,0.8304 -0.5030,-0.0000,-0.2396,0.8304 -0.5164,-0.0000,-0.2408,0.8218 -0.5164,-0.0000,-0.2408,0.8218 -0.5164,-0.0000,-0.2408,0.8218 -0.5164,-0.0000,-0.2408,0.8218 -0.5297,-0.0000,-0.2419,0.8130 -0.5297,-0.0000,-0.2419,0.8130 -0.5297,-0.0000,-0.2419,0.8130 -0.5297,-0.0000,-0.2419,0.8130 -0.5428,-0.0000,-0.2431,0.8039 -0.5428,-0.0000,-0.2431,0.8039 -0.5428,-0.0000,-0.2431,0.8039 -0.5428,-0.0000,-0.2431,0.8039 -0.5558,-0.0000,-0.2442,0.7947 -0.5558,-0.0000,-0.2442,0.7947 -0.5558,-0.0000,-0.2442,0.7947 -0.5558,-0.0000,-0.2442,0.7947 -0.5685,-0.0000,-0.2454,0.7852 -0.5685,-0.0000,-0.2454,0.7852 -0.5685,-0.0000,-0.2454,0.7852 -0.5685,-0.0000,-0.2454,0.7852 -0.5811,-0.0000,-0.2465,0.7756 -0.5811,-0.0000,-0.2465,0.7756 -0.5811,-0.0000,-0.2465,0.7756 -0.5811,-0.0000,-0.2465,0.7756 -0.5936,-0.0000,-0.2477,0.7657 -0.5936,-0.0000,-0.2477,0.7657 -0.5936,-0.0000,-0.2477,0.7657 -0.5936,-0.0000,-0.2477,0.7657 -0.6058,-0.0000,-0.2489,0.7557 -0.6058,-0.0000,-0.2489,0.7557 -0.6058,-0.0000,-0.2489,0.7557 -0.6058,-0.0000,-0.2489,0.7557 -0.6179,-0.0000,-0.2501,0.7455 -0.6179,-0.0000,-0.2501,0.7455 -0.6179,-0.0000,-0.2501,0.7455 -0.6179,-0.0000,-0.2501,0.7455 -0.6297,-0.0000,-0.2513,0.7351 -0.6297,-0.0000,-0.2513,0.7351 -0.6297,-0.0000,-0.2513,0.7351 -0.6297,-0.0000,-0.2513,0.7351 -0.6414,-0.0000,-0.2525,0.7245 -0.6414,-0.0000,-0.2525,0.7245 -0.6414,-0.0000,-0.2525,0.7245 -0.6414,-0.0000,-0.2525,0.7245 -0.6528,-0.0000,-0.2538,0.7137 -0.6528,-0.0000,-0.2538,0.7137 -0.6528,-0.0000,-0.2538,0.7137 -0.6528,-0.0000,-0.2538,0.7137 -0.6641,-0.0000,-0.2550,0.7028 -0.6641,-0.0000,-0.2550,0.7028 -0.6641,-0.0000,-0.2550,0.7028 -0.6641,-0.0000,-0.2550,0.7028 -0.6752,-0.0000,-0.2563,0.6917 -0.6752,-0.0000,-0.2563,0.6917 -0.6752,-0.0000,-0.2563,0.6917 -0.6752,-0.0000,-0.2563,0.6917 -0.6860,-0.0000,-0.2576,0.6804 -0.6860,-0.0000,-0.2576,0.6804 -0.6860,-0.0000,-0.2576,0.6804 -0.6860,-0.0000,-0.2576,0.6804 -0.6967,-0.0000,-0.2590,0.6690 -0.6967,-0.0000,-0.2590,0.6690 -0.6967,-0.0000,-0.2590,0.6690 -0.6967,-0.0000,-0.2590,0.6690 -0.7071,-0.0000,-0.2603,0.6575 -0.7071,-0.0000,-0.2603,0.6575 -0.7071,-0.0000,-0.2603,0.6575 -0.7071,-0.0000,-0.2603,0.6575 -0.7173,-0.0000,-0.2617,0.6457 -0.7173,-0.0000,-0.2617,0.6457 -0.7173,-0.0000,-0.2617,0.6457 -0.7173,-0.0000,-0.2617,0.6457 -0.7273,-0.0000,-0.2631,0.6339 -0.7273,-0.0000,-0.2631,0.6339 -0.7273,-0.0000,-0.2631,0.6339 -0.7273,-0.0000,-0.2631,0.6339 -0.7371,-0.0000,-0.2645,0.6219 -0.7371,-0.0000,-0.2645,0.6219 -0.7371,-0.0000,-0.2645,0.6219 -0.7371,-0.0000,-0.2645,0.6219 -0.7467,-0.0000,-0.2659,0.6097 -0.7467,-0.0000,-0.2659,0.6097 -0.7467,-0.0000,-0.2659,0.6097 -0.7467,-0.0000,-0.2659,0.6097 -0.7560,-0.0000,-0.2674,0.5974 -0.7560,-0.0000,-0.2674,0.5974 -0.7560,-0.0000,-0.2674,0.5974 -0.7560,-0.0000,-0.2674,0.5974 -0.7651,-0.0000,-0.2689,0.5851 -0.7651,-0.0000,-0.2689,0.5851 -0.7651,-0.0000,-0.2689,0.5851 -0.7651,-0.0000,-0.2689,0.5851 -0.7740,-0.0000,-0.2705,0.5725 -0.7740,-0.0000,-0.2705,0.5725 -0.7740,-0.0000,-0.2705,0.5725 -0.7740,-0.0000,-0.2705,0.5725 -0.7826,-0.0000,-0.2720,0.5599 -0.7826,-0.0000,-0.2720,0.5599 -0.7826,-0.0000,-0.2720,0.5599 -0.7826,-0.0000,-0.2720,0.5599 -0.7910,-0.0000,-0.2736,0.5472 -0.7910,-0.0000,-0.2736,0.5472 -0.7910,-0.0000,-0.2736,0.5472 -0.7910,-0.0000,-0.2736,0.5472 -0.7992,-0.0000,-0.2752,0.5343 -0.7992,-0.0000,-0.2752,0.5343 -0.7992,-0.0000,-0.2752,0.5343 -0.7992,-0.0000,-0.2752,0.5343 -0.8072,-0.0000,-0.2769,0.5214 -0.8072,-0.0000,-0.2769,0.5214 -0.8072,-0.0000,-0.2769,0.5214 -0.8072,-0.0000,-0.2769,0.5214 -0.8149,-0.0000,-0.2786,0.5083 -0.8149,-0.0000,-0.2786,0.5083 -0.8149,-0.0000,-0.2786,0.5083 -0.8149,-0.0000,-0.2786,0.5083 -0.8223,-0.0000,-0.2803,0.4952 -0.8223,-0.0000,-0.2803,0.4952 -0.8223,-0.0000,-0.2803,0.4952 -0.8223,-0.0000,-0.2803,0.4952 -0.8295,-0.0000,-0.2820,0.4820 -0.8295,-0.0000,-0.2820,0.4820 -0.8295,-0.0000,-0.2820,0.4820 -0.8295,-0.0000,-0.2820,0.4820 -0.8365,-0.0000,-0.2838,0.4687 -0.8365,-0.0000,-0.2838,0.4687 -0.8365,-0.0000,-0.2838,0.4687 -0.8365,-0.0000,-0.2838,0.4687 -0.8433,-0.0000,-0.2857,0.4553 -0.8433,-0.0000,-0.2857,0.4553 -0.8433,-0.0000,-0.2857,0.4553 -0.8433,-0.0000,-0.2857,0.4553 -0.8497,-0.0000,-0.2875,0.4419 -0.8497,-0.0000,-0.2875,0.4419 -0.8497,-0.0000,-0.2875,0.4419 -0.8497,-0.0000,-0.2875,0.4419 -0.8560,-0.0000,-0.2894,0.4284 -0.8560,-0.0000,-0.2894,0.4284 -0.8560,-0.0000,-0.2894,0.4284 -0.8560,-0.0000,-0.2894,0.4284 -0.8620,-0.0000,-0.2913,0.4148 -0.8620,-0.0000,-0.2913,0.4148 -0.8620,-0.0000,-0.2913,0.4148 -0.8620,-0.0000,-0.2913,0.4148 -0.8677,-0.0000,-0.2933,0.4012 -0.8677,-0.0000,-0.2933,0.4012 -0.8677,-0.0000,-0.2933,0.4012 -0.8677,-0.0000,-0.2933,0.4012 -0.8732,-0.0000,-0.2953,0.3876 -0.8732,-0.0000,-0.2953,0.3876 -0.8732,-0.0000,-0.2953,0.3876 -0.8732,-0.0000,-0.2953,0.3876 -0.8785,-0.0000,-0.2974,0.3739 -0.8785,-0.0000,-0.2974,0.3739 -0.8785,-0.0000,-0.2974,0.3739 -0.8785,-0.0000,-0.2974,0.3739 -0.8835,-0.0000,-0.2995,0.3602 -0.8835,-0.0000,-0.2995,0.3602 -0.8835,-0.0000,-0.2995,0.3602 -0.8835,-0.0000,-0.2995,0.3602 -0.8883,-0.0000,-0.3016,0.3465 -0.8883,-0.0000,-0.3016,0.3465 -0.8883,-0.0000,-0.3016,0.3465 -0.8883,-0.0000,-0.3016,0.3465 -0.8928,-0.0000,-0.3038,0.3327 -0.8928,-0.0000,-0.3038,0.3327 -0.8928,-0.0000,-0.3038,0.3327 -0.8928,-0.0000,-0.3038,0.3327 -0.8970,-0.0000,-0.3060,0.3189 -0.8970,-0.0000,-0.3060,0.3189 -0.8970,-0.0000,-0.3060,0.3189 -0.8970,-0.0000,-0.3060,0.3189 -0.9010,-0.0000,-0.3083,0.3051 -0.9010,-0.0000,-0.3083,0.3051 -0.9010,-0.0000,-0.3083,0.3051 -0.9010,-0.0000,-0.3083,0.3051 -0.9048,-0.0000,-0.3106,0.2913 -0.9048,-0.0000,-0.3106,0.2913 -0.9048,-0.0000,-0.3106,0.2913 -0.9048,-0.0000,-0.3106,0.2913 -0.9083,-0.0000,-0.3130,0.2776 -0.9083,-0.0000,-0.3130,0.2776 -0.9083,-0.0000,-0.3130,0.2776 -0.9083,-0.0000,-0.3130,0.2776 -0.9116,-0.0000,-0.3154,0.2638 -0.9116,-0.0000,-0.3154,0.2638 -0.9116,-0.0000,-0.3154,0.2638 -0.9116,-0.0000,-0.3154,0.2638 -0.9146,-0.0000,-0.3179,0.2500 -0.9146,-0.0000,-0.3179,0.2500 -0.9146,-0.0000,-0.3179,0.2500 -0.9146,-0.0000,-0.3179,0.2500 -0.9174,-0.0000,-0.3204,0.2363 -0.9174,-0.0000,-0.3204,0.2363 -0.9174,-0.0000,-0.3204,0.2363 -0.9174,-0.0000,-0.3204,0.2363 -0.9199,-0.0000,-0.3229,0.2226 -0.9199,-0.0000,-0.3229,0.2226 -0.9199,-0.0000,-0.3229,0.2226 -0.9199,-0.0000,-0.3229,0.2226 -0.9222,-0.0000,-0.3256,0.2089 -0.9222,-0.0000,-0.3256,0.2089 -0.9222,-0.0000,-0.3256,0.2089 -0.9222,-0.0000,-0.3256,0.2089 -0.9242,-0.0000,-0.3282,0.1952 -0.9242,-0.0000,-0.3282,0.1952 -0.9242,-0.0000,-0.3282,0.1952 -0.9242,-0.0000,-0.3282,0.1952 -0.9260,-0.0000,-0.3309,0.1817 -0.9260,-0.0000,-0.3309,0.1817 -0.9260,-0.0000,-0.3309,0.1817 -0.9260,-0.0000,-0.3309,0.1817 -0.9276,-0.0000,-0.3337,0.1681 -0.9276,-0.0000,-0.3337,0.1681 -0.9276,-0.0000,-0.3337,0.1681 -0.9276,-0.0000,-0.3337,0.1681 -0.9289,-0.0000,-0.3366,0.1546 -0.9289,-0.0000,-0.3366,0.1546 -0.9289,-0.0000,-0.3366,0.1546 -0.9289,-0.0000,-0.3366,0.1546 -0.9300,-0.0000,-0.3395,0.1412 -0.9300,-0.0000,-0.3395,0.1412 -0.9300,-0.0000,-0.3395,0.1412 -0.9300,-0.0000,-0.3395,0.1412 -0.9308,-0.0000,-0.3424,0.1279 -0.9308,-0.0000,-0.3424,0.1279 -0.9308,-0.0000,-0.3424,0.1279 -0.9308,-0.0000,-0.3424,0.1279 -0.9314,-0.0000,-0.3454,0.1146 -0.9314,-0.0000,-0.3454,0.1146 -0.9314,-0.0000,-0.3454,0.1146 -0.9314,-0.0000,-0.3454,0.1146 -0.9318,-0.0000,-0.3485,0.1015 -0.9318,-0.0000,-0.3485,0.1015 -0.9318,-0.0000,-0.3485,0.1015 -0.9318,-0.0000,-0.3485,0.1015 -0.9320,-0.0000,-0.3516,0.0884 -0.9320,-0.0000,-0.3516,0.0884 -0.9320,-0.0000,-0.3516,0.0884 -0.9320,-0.0000,-0.3516,0.0884 -0.9319,-0.0000,-0.3548,0.0754 -0.9319,-0.0000,-0.3548,0.0754 -0.9319,-0.0000,-0.3548,0.0754 -0.9319,-0.0000,-0.3548,0.0754 -0.9316,-0.0000,-0.3581,0.0625 -0.9316,-0.0000,-0.3581,0.0625 -0.9316,-0.0000,-0.3581,0.0625 -0.9316,-0.0000,-0.3581,0.0625 -0.9311,-0.0000,-0.3614,0.0498 -0.9311,-0.0000,-0.3614,0.0498 -0.9311,-0.0000,-0.3614,0.0498 -0.9311,-0.0000,-0.3614,0.0498 -0.9303,-0.0000,-0.3648,0.0371 -0.9303,-0.0000,-0.3648,0.0371 -0.9303,-0.0000,-0.3648,0.0371 -0.9303,-0.0000,-0.3648,0.0371 -0.9294,-0.0000,-0.3683,0.0246 -0.9294,-0.0000,-0.3683,0.0246 -0.9294,-0.0000,-0.3683,0.0246 -0.9294,-0.0000,-0.3683,0.0246 -0.9282,-0.0000,-0.3718,0.0122 -0.9282,-0.0000,-0.3718,0.0122 -0.9282,-0.0000,-0.3718,0.0122 -0.9282,-0.0000,-0.3718,0.0122 -0.9269,-0.0000,-0.3754,-0.0000 -0.9269,-0.0000,-0.3754,-0.0000 -0.9269,-0.0000,-0.3754,-0.0000 -0.9269,-0.0000,-0.3754,-0.0000 diff --git a/tests/renderer/test_renderer.py b/tests/renderer/test_renderer.py index 690f495c7f..866d2eee2c 100644 --- a/tests/renderer/test_renderer.py +++ b/tests/renderer/test_renderer.py @@ -26,10 +26,12 @@ the United Nations Convention on Contracts on the International Sales of Goods. """ + import pytest from .utils import * + """ Ambisonics """ @@ -56,156 +58,6 @@ def test_ambisonics_binaural_headrotation(test_info, in_fmt, out_fmt, trj_file): ) -# Test compares rendering with just a trajectory file against rendering with a trajectory file + a zero ref rotation. -# These should be binary equivalent. -@pytest.mark.parametrize("trj_file", HR_TRAJECTORIES_TO_TEST) -@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI) -def test_ambisonics_binaural_headrotation_refrotzero(test_info, in_fmt, out_fmt, trj_file): - compare_renderer_args( - test_info, - in_fmt, - out_fmt, - ref_kwargs={ - "name_extension": "refrotzero", - "trj_file": HR_TRAJECTORY_DIR.joinpath(f"{trj_file}.csv") - }, - cut_kwargs={ - "trj_file": HR_TRAJECTORY_DIR.joinpath(f"{trj_file}.csv"), - "refrot_file": HR_TRAJECTORY_DIR.joinpath("const000.csv") - } - ) - - -# Second test compares rendering with no head rotation against rendering with equal ref and head rotation. -# These should also be binary equivalent. -# Note that reference rotation is supplied per 4 subframes; head rotation per subframe. -@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI) -def test_ambisonics_binaural_headrotation_refrotequal(test_info, in_fmt, out_fmt): - compare_renderer_args( - test_info, - in_fmt, - out_fmt, - ref_kwargs={ - "name_extension": "refrotequal", - }, - cut_kwargs={ - "trj_file": HR_TRAJECTORY_DIR.joinpath("azi_plus_2-ele_plus_2-every-100-frames.csv"), - "refrot_file": HR_TRAJECTORY_DIR.joinpath("azi_plus_2-ele_plus_2-every-25-rows.csv") - } - ) - -# This test compares rendering with: -# ref: head rotation trajectory file (OTR=NONE) -# cut: identical head rotation trajectory file as ref but in addition a constant -# reference vector in the looking direction of the coordinate system (OTR=REF_VEC) -@pytest.mark.parametrize("trj_file", HR_TRAJECTORIES_TO_TEST) -@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI) -def test_ambisonics_binaural_headrotation_refveczero(test_info, in_fmt, out_fmt, trj_file): - compare_renderer_args( - test_info, - in_fmt, - out_fmt, - ref_kwargs={ - "name_extension": "refveczero", - "trj_file": HR_TRAJECTORY_DIR.joinpath(f"{trj_file}.csv") - }, - cut_kwargs={ - "trj_file": HR_TRAJECTORY_DIR.joinpath(f"{trj_file}.csv"), - "refvec_file": HR_TRAJECTORY_DIR.joinpath("const000-Vector3.csv") - } - ) - -# This test compares rendering with: -# ref: no head rotation (OTR=NONE) -# cut: rendering with head rotation and a ref vector which moves in the -# looking-direction of the head rotation and therefore compensates it (OTR=REF_VEC) -@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI) -def test_ambisonics_binaural_headrotation_refvecequal(test_info, in_fmt, out_fmt): - compare_renderer_args( - test_info, - in_fmt, - out_fmt, - ref_kwargs={ - "name_extension": "refvecequal", - }, - cut_kwargs={ - "trj_file": HR_TRAJECTORY_DIR.joinpath("full-circle-with-up-and-down-4s.csv"), - "refvec_file": HR_TRAJECTORY_DIR.joinpath("full-circle-with-up-and-down-4s-Vector3.csv") - } - ) - -# This test compares rendering with: -# ref: a head rotation trajectory with elevation (OTR=NONE) -# cut: a static head rotation and a reference position trajectory which moves -# in a way that produces the same acoustic output as the ref head rot trajectory (OTR=REF_VEC) -@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI) -def test_ambisonics_binaural_headrotation_refvec_rotating(test_info, in_fmt, out_fmt): - compare_renderer_args( - test_info, - in_fmt, - out_fmt, - ref_kwargs={ - "name_extension": "refvec_rotating", - "trj_file": HR_TRAJECTORY_DIR.joinpath("full-circle-with-up-and-down-4s.csv"), - }, - cut_kwargs={ - "trj_file": HR_TRAJECTORY_DIR.joinpath("const000.csv"), - "refvec_file": HR_TRAJECTORY_DIR.joinpath("full-circle-with-up-and-down-4s-ccw-Vector3.csv") - } - ) - -# This test compares rendering with: -# ref: a head rotation trajectory with elevation (OTR=NONE) -# cut: a static head rotation and a reference position trajectory which moves -# in a way that produces the same acoustic output as the ref head rot trajectory (OTR=REF_VEC) -# which also contains a fixed position offset between listener and reference position (which -# gets compensated in the REF_VEV OTR modes) -@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI) -def test_ambisonics_binaural_headrotation_refvec_rotating_fixed_pos_offset(test_info, in_fmt, out_fmt): - compare_renderer_args( - test_info, - in_fmt, - out_fmt, - ref_kwargs={ - "name_extension": "refvec_rotating", - "trj_file": HR_TRAJECTORY_DIR.joinpath("full-circle-with-up-and-down-4s-ccw.csv"), - }, - cut_kwargs={ - "trj_file": HR_TRAJECTORY_DIR.joinpath("const000.csv"), - "refvec_file": HR_TRAJECTORY_DIR.joinpath("full-circle-with-up-and-down-4s-fixed-pos-offset-Vector3.csv") - } - ) - -# This test compares rendering with: -# ref: a reference position trajectory with elevation and REF_VEC_LEV OTR mode (OTR=REF_VEC_LEV) -# cut: a reference position trajectory without the elevation and REF_VEC OTR mode (OTR=REF_VEC) -# Since the only difference between REF_VEC_LEV and REF_VEC is that *LEV ignores -# the height difference in positions, the output must be binary equivalent. -@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI) -def test_ambisonics_binaural_headrotation_refveclev_vs_refvec(test_info, in_fmt, out_fmt): - compare_renderer_args( - test_info, - in_fmt, - out_fmt, - ref_kwargs={ - "name_extension": "refveclevel", - "trj_file": HR_TRAJECTORY_DIR.joinpath("const000.csv"), - "refveclev_file": HR_TRAJECTORY_DIR.joinpath("full-circle-with-up-and-down-4s-Vector3.csv"), - }, - cut_kwargs={ - "trj_file": HR_TRAJECTORY_DIR.joinpath("const000.csv"), - "refvec_file": HR_TRAJECTORY_DIR.joinpath("full-circle-4s-Vector3.csv") - } - ) - - """ Multichannel """ @@ -244,30 +96,6 @@ def test_multichannel_binaural_headrotation(test_info, in_fmt, out_fmt, trj_file trj_file=HR_TRAJECTORY_DIR.joinpath(f"{trj_file}.csv"), ) -# This test compares rendering with: -# ref: a head rotation trajectory with elevation (OTR=NONE) -# cut: a static head rotation and a reference position trajectory which moves -# in a way that produces the same acoustic output as the ref head rot trajectory (OTR=REF_VEC) -@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_MC) -def test_multichannel_binaural_headrotation_refvec_rotating(test_info, in_fmt, out_fmt): - if in_fmt in ["MONO", "STEREO"]: - pytest.skip("MONO or STEREO to Binaural rendering unsupported") - - compare_renderer_args( - test_info, - in_fmt, - out_fmt, - ref_kwargs={ - "name_extension": "refvec_rotating", - "trj_file": HR_TRAJECTORY_DIR.joinpath("full-circle-with-up-and-down-4s.csv"), - }, - cut_kwargs={ - "trj_file": HR_TRAJECTORY_DIR.joinpath("const000.csv"), - "refvec_file": HR_TRAJECTORY_DIR.joinpath("full-circle-with-up-and-down-4s-ccw-Vector3.csv") - } - ) - """ ISM """ @@ -316,33 +144,6 @@ def test_ism_binaural_headrotation(test_info, in_fmt, out_fmt, trj_file): in_meta_files=in_meta_files, ) -# This test compares rendering with: -# ref: a head rotation trajectory with elevation (OTR=NONE) -# cut: a static head rotation and a reference position trajectory which moves -# in a way that produces the same acoustic output as the ref head rot trajectory (OTR=REF_VEC) -@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_ISM) -def test_ism_binaural_headrotation_refvec_rotating(test_info, in_fmt, out_fmt): - try: - in_meta_files = FORMAT_TO_METADATA_FILES[in_fmt] - except: - in_meta_files = None - - compare_renderer_args( - test_info, - in_fmt, - out_fmt, - ref_kwargs={ - "name_extension": "refvec_rotating", - "trj_file": HR_TRAJECTORY_DIR.joinpath("full-circle-with-up-and-down-4s.csv"), - "in_meta_files": in_meta_files - }, - cut_kwargs={ - "trj_file": HR_TRAJECTORY_DIR.joinpath("const000.csv"), - "refvec_file": HR_TRAJECTORY_DIR.joinpath("full-circle-with-up-and-down-4s-ccw-Vector3.csv"), - "in_meta_files": in_meta_files - } - ) """ MASA """ diff --git a/tests/renderer/utils.py b/tests/renderer/utils.py index 7a98dff300..143c33b066 100644 --- a/tests/renderer/utils.py +++ b/tests/renderer/utils.py @@ -31,11 +31,12 @@ import subprocess as sp import sys from pathlib import Path from tempfile import TemporaryDirectory -from typing import Optional, Tuple, Dict +from typing import Optional, Tuple import numpy as np import pytest + from .compare_audio import compare_audio_arrays from .constants import * @@ -105,10 +106,6 @@ def run_renderer( metadata_input: Optional[str] = None, in_meta_files: Optional[list] = None, trj_file: Optional[str] = None, - name_extension: Optional[str] = None, - refrot_file: Optional[str] = None, - refvec_file: Optional[str] = None, - refveclev_file: Optional[str] = None, output_path_base: str = OUTPUT_PATH_CUT, binary_suffix: str = "", is_comparetest: Optional[bool] = False, @@ -119,23 +116,6 @@ def run_renderer( else: trj_name = "" - if refrot_file is not None: - refrot_name = f"_{refrot_file.stem}" - else: - refrot_name = "" - - if refvec_file is not None: - refvec_name = f"_{refvec_file.stem}" - else: - refvec_name = "" - - if refveclev_file is not None: - refveclev_name = f"_{refveclev_file.stem}" - else: - refveclev_name = "" - - - if not isinstance(out_fmt, str): out_name = f"{out_fmt.stem}" else: @@ -156,7 +136,7 @@ def run_renderer( in_file = FORMAT_TO_FILE[in_fmt] in_name = in_fmt - out_file = str(output_path_base.joinpath(f"{in_name}_to_{out_name}{trj_name}{refrot_name}{refvec_name}{refveclev_name}{name_extension}.wav")) + out_file = str(output_path_base.joinpath(f"{in_name}_to_{out_name}{trj_name}.wav")) cmd = RENDERER_CMD[:] cmd[2] = str(in_file) @@ -172,18 +152,6 @@ def run_renderer( if trj_file is not None: cmd.extend(["-tf", str(trj_file)]) - if refrot_file is not None: - cmd.extend(["-rf", str(refrot_file)]) - cmd.extend(["-otr", "ref"]) - - if refvec_file is not None: - cmd.extend(["-rvf", str(refvec_file)]) - cmd.extend(["-otr", "ref_vec"]) - - if refveclev_file is not None: - cmd.extend(["-rvf", str(refveclev_file)]) - cmd.extend(["-otr", "ref_vec_lev"]) - run_cmd(cmd) return pyaudio3dtools.audiofile.readfile(out_file) @@ -254,8 +222,3 @@ def compare_renderer_vs_pyscripts(test_info, in_fmt, out_fmt, **kwargs): ref, ref_fs = run_pyscripts(in_fmt, out_fmt, **kwargs) cut, cut_fs = run_renderer(in_fmt, out_fmt, **kwargs) check_BE(test_info, ref, ref_fs, cut, cut_fs) - -def compare_renderer_args(test_info, in_fmt, out_fmt, ref_kwargs: Dict, cut_kwargs: Dict): - ref, ref_fs = run_renderer(in_fmt, out_fmt, **ref_kwargs) - cut, cut_fs = run_renderer(in_fmt, out_fmt, **cut_kwargs) - check_BE(test_info, ref, ref_fs, cut, cut_fs) \ No newline at end of file -- GitLab From faffb8dc51d707c4dc2c30f051183724937a584a Mon Sep 17 00:00:00 2001 From: malenov Date: Tue, 28 Mar 2023 18:02:02 +0200 Subject: [PATCH 031/331] remove unused function --- lib_com/bitstream.c | 58 --------------------------------------------- 1 file changed, 58 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index d0d7f442c6..c28c04112b 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -269,64 +269,6 @@ ivas_error ind_list_realloc( return IVAS_ERR_OK; } -/*-------------------------------------------------------------------* - * ind_list_metadata_realloc() - * - * Re-allocate list of metadata indices if the IVAS total bitrate has changed - *-------------------------------------------------------------------*/ - -// ivas_error ind_list_metadata_realloc( -// BSTR_ENC_HANDLE hMetaData, /* i/o: encoder bitstream handle */ -// const IVAS_FORMAT ivas_format, /* i : IVAS format */ -// const int32_t ivas_total_brate /* i : IVAS total bitrate */ -//) -//{ -// int16_t i, max_num_indices_metadata; -// INDICE_HANDLE new_ind_list_metadata; -// -// if ( hMetaData != NULL && hMetaData->ind_list != NULL ) -// { -// /* get the maximum allowed number of indices in the list */ -// max_num_indices_metadata = get_max_num_indices_metadata( ivas_format, ivas_total_brate ); -// -// /* check, if the maximum number of allowed indices has changed */ -// if ( max_num_indices_metadata != hMetaData->max_num_indices ) -// { -// /* allocate new buffer of metadata indices */ -// if ( ( new_ind_list_metadata = (INDICE_HANDLE) malloc( max_num_indices_metadata * sizeof( Indice ) ) ) == NULL ) -// { -// return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of metadata indices!\n" ) ); -// } -// -// /* move indices from the old list to the new list */ -// i = 0; -// while ( hMetaData->ind_list[i].nb_bits > 0 ) -// { -// new_ind_list_metadata[i].id = hMetaData->ind_list[i].id; -// new_ind_list_metadata[i].value = hMetaData->ind_list[i].value; -// new_ind_list_metadata[i].nb_bits = hMetaData->ind_list[i].nb_bits; -// i++; -// } -// -// /* reset nb_bits of all other indices to -1 */ -// for ( ; i < max_num_indices_metadata; i++ ) -// { -// new_ind_list_metadata[i].nb_bits = -1; -// } -// -// /* free the old list */ -// free( hMetaData->ind_list ); -// -// /* set pointer to the new list */ -// hMetaData->ind_list = new_ind_list_metadata; -// -// /* set the new maximum for the allowed number of indices */ -// hMetaData->max_num_indices = max_num_indices_metadata; -// } -// } -// -// return IVAS_ERR_OK; -// } /*-----------------------------------------------------------------------* * get_max_num_indices() -- GitLab From 880f9a200c92f59677f36fa08d8c3fa142c7cc9c Mon Sep 17 00:00:00 2001 From: Vladimir Malenovsky Date: Tue, 28 Mar 2023 18:13:55 +0200 Subject: [PATCH 032/331] Update to main --- .gitignore | 12 + .gitlab-ci.yml | 43 + Workspace_msvc/lib_com.vcxproj | 2 +- Workspace_msvc/lib_com.vcxproj.filters | 6 +- Workspace_msvc/lib_util.vcxproj | 2 + apps/decoder.c | 302 +- apps/encoder.c | 51 +- apps/renderer.c | 329 +- lib_com/bitstream.c | 552 +-- lib_com/cldfb.c | 17 +- lib_com/cnst.h | 2 - lib_com/common_api_types.h | 27 + lib_com/ivas_cnst.h | 83 +- lib_com/ivas_cov_smooth.c | 49 +- lib_com/ivas_error.h | 29 +- lib_com/ivas_fb_mixer.c | 38 +- lib_com/{ivas_ism_config.c => ivas_ism_com.c} | 198 +- lib_com/ivas_masa_com.c | 26 + lib_com/ivas_mc_param_com.c | 1 - lib_com/ivas_prot.h | 294 +- lib_com/ivas_rom_com.h | 1 + lib_com/ivas_stat_com.h | 32 +- lib_com/ivas_transient_det.c | 29 - lib_com/options.h | 41 +- lib_com/prot.h | 69 +- lib_dec/acelp_core_dec.c | 20 +- lib_dec/fd_cng_dec.c | 72 +- lib_dec/init_dec.c | 9 +- lib_dec/ivas_agc_dec.c | 24 +- lib_dec/ivas_binRenderer_internal.c | 9 - lib_dec/ivas_core_dec.c | 17 +- lib_dec/ivas_corecoder_dec_reconfig.c | 3 - lib_dec/ivas_dec.c | 48 +- lib_dec/ivas_decision_matrix_dec.c | 4 +- lib_dec/ivas_dirac_dec.c | 21 +- lib_dec/ivas_dirac_output_synthesis_cov.c | 1 - lib_dec/ivas_init_dec.c | 261 +- lib_dec/ivas_ism_dec.c | 118 +- lib_dec/ivas_ism_dtx_dec.c | 143 +- lib_dec/ivas_ism_metadata_dec.c | 722 +++- lib_dec/ivas_ism_param_dec.c | 175 +- lib_dec/ivas_ism_renderer.c | 12 +- lib_dec/ivas_lfe_dec.c | 20 +- lib_dec/ivas_masa_dec.c | 27 +- lib_dec/ivas_mc_param_dec.c | 4 +- lib_dec/ivas_mcmasa_dec.c | 5 +- lib_dec/ivas_mct_dec.c | 92 +- lib_dec/ivas_objectRenderer_internal.c | 22 +- lib_dec/ivas_sba_dec.c | 175 +- lib_dec/ivas_sba_rendering_internal.c | 4 +- lib_dec/ivas_sce_dec.c | 25 +- lib_dec/ivas_spar_decoder.c | 127 +- lib_dec/ivas_spar_md_dec.c | 8 +- lib_dec/ivas_stat_dec.h | 30 +- lib_dec/ivas_tcx_core_dec.c | 16 +- lib_dec/lib_dec.c | 125 +- lib_dec/lib_dec.h | 36 +- lib_dec/stat_dec.h | 7 +- lib_enc/acelp_core_enc.c | 4 - lib_enc/acelp_core_switch_enc.c | 17 - lib_enc/amr_wb_enc.c | 7 +- lib_enc/bw_detect.c | 51 + lib_enc/cng_enc.c | 8 - lib_enc/dtx.c | 8 +- lib_enc/enc_ppp.c | 8 +- lib_enc/eval_pit_contr.c | 8 - lib_enc/fd_cng_enc.c | 20 +- lib_enc/igf_enc.c | 82 - lib_enc/init_enc.c | 55 +- lib_enc/ivas_agc_enc.c | 24 +- lib_enc/ivas_core_enc.c | 27 +- lib_enc/ivas_core_pre_proc_front.c | 18 +- lib_enc/ivas_corecoder_enc_reconfig.c | 228 +- lib_enc/ivas_cpe_enc.c | 41 +- lib_enc/ivas_decision_matrix_enc.c | 4 +- lib_enc/ivas_dirac_enc.c | 25 +- lib_enc/ivas_enc.c | 5 +- lib_enc/ivas_enc_cov_handler.c | 27 +- lib_enc/ivas_init_enc.c | 167 +- lib_enc/ivas_ism_dtx_enc.c | 234 +- lib_enc/ivas_ism_enc.c | 197 +- lib_enc/ivas_ism_metadata_enc.c | 754 ++++- lib_enc/ivas_ism_param_enc.c | 135 +- lib_enc/ivas_lfe_enc.c | 53 +- lib_enc/ivas_masa_enc.c | 55 +- lib_enc/ivas_mc_param_enc.c | 30 +- lib_enc/ivas_mcmasa_enc.c | 80 +- lib_enc/ivas_mct_enc.c | 96 +- lib_enc/ivas_mdct_core_enc.c | 17 + lib_enc/ivas_qmetadata_enc.c | 91 +- lib_enc/ivas_sba_enc.c | 112 +- lib_enc/ivas_sce_enc.c | 44 +- lib_enc/ivas_spar_encoder.c | 146 +- lib_enc/ivas_spar_md_enc.c | 53 +- lib_enc/ivas_stat_enc.h | 14 +- lib_enc/ivas_stereo_dmx_evs.c | 16 +- lib_enc/ivas_stereo_mdct_core_enc.c | 21 +- lib_enc/ivas_tcx_core_enc.c | 4 - lib_enc/lib_enc.c | 104 +- lib_enc/lib_enc.h | 7 +- lib_enc/pre_proc.c | 7 +- lib_enc/rst_enc.c | 4 - lib_enc/stat_enc.h | 20 +- lib_enc/tcx_utils_enc.c | 16 - lib_rend/ivas_crend.c | 1432 +------- lib_rend/ivas_dirac_dec_binaural_functions.c | 17 +- lib_rend/ivas_hrtf.c | 36 - lib_rend/ivas_objectRenderer.c | 281 +- lib_rend/ivas_objectRenderer_hrFilt.c | 11 + lib_rend/ivas_objectRenderer_sfx.c | 12 +- lib_rend/ivas_objectRenderer_sources.c | 15 + lib_rend/ivas_objectRenderer_vec.c | 17 +- lib_rend/ivas_orient_trk.c | 620 +++- lib_rend/ivas_prot_rend.h | 167 +- lib_rend/ivas_render_config.c | 7 + lib_rend/ivas_reverb.c | 177 +- lib_rend/ivas_rom_TdBinauralRenderer.c | 3 + lib_rend/ivas_rom_binauralRenderer.c | 4 + lib_rend/ivas_rom_binaural_crend_head.c | 2 + lib_rend/ivas_rom_rend.c | 2 +- lib_rend/ivas_rotation.c | 156 +- lib_rend/ivas_stat_rend.h | 86 +- lib_rend/lib_rend.c | 848 +++-- lib_rend/lib_rend.h | 35 + lib_util/audio_file_reader.c | 46 +- lib_util/audio_file_reader.h | 10 - lib_util/audio_file_writer.c | 4 + lib_util/head_rotation_file_reader.c | 92 +- lib_util/head_rotation_file_reader.h | 18 +- lib_util/ism_file_reader.c | 47 +- lib_util/ism_file_writer.c | 19 +- lib_util/ism_file_writer.h | 2 +- lib_util/ls_custom_file_reader.c | 6 +- lib_util/ls_custom_file_reader.h | 6 +- lib_util/masa_file_writer.c | 2 + lib_util/render_config_reader.c | 9 + lib_util/vector3_pair_file_reader.c | 166 + .../vector3_pair_file_reader.h | 130 +- scripts/IvasBuildAndRun.py | 1 - scripts/config/self_test.prm | 198 +- scripts/pyivastest/IvasModeAnalyzer.py | 5 +- scripts/pyivastest/IvasScriptsCommon.py | 3 - scripts/pyivastest/IvasSvnBuilder.py | 2 - scripts/testv/stv16c.wav | 4 +- scripts/testv/stv16n.wav | 4 +- scripts/testv/stv1ISM48s.wav | 4 +- scripts/testv/stv1MASA1TC48c.wav | 4 +- scripts/testv/stv1MASA1TC48n.wav | 4 +- scripts/testv/stv1MASA2TC48c.wav | 4 +- scripts/testv/stv1MASA2TC48n.wav | 2 +- scripts/testv/stv2ISM48s.wav | 4 +- scripts/testv/stv2MASA1TC48c.wav | 4 +- scripts/testv/stv2MASA2TC48c.wav | 4 +- scripts/testv/stv2OA32c.wav | 4 +- scripts/testv/stv2OA48c.wav | 4 +- scripts/testv/stv32c.wav | 4 +- scripts/testv/stv32n.wav | 4 +- scripts/testv/stv3ISM48s.wav | 4 +- scripts/testv/stv3OA32c.wav | 4 +- scripts/testv/stv3OA48c.wav | 4 +- scripts/testv/stv48c.wav | 4 +- scripts/testv/stv48n.wav | 4 +- scripts/testv/stv4ISM48n.wav | 2 +- scripts/testv/stv4ISM48s.wav | 4 +- scripts/testv/stv512MC48c.wav | 4 +- scripts/testv/stv514MC48c.wav | 4 +- scripts/testv/stv51MC48c.wav | 4 +- scripts/testv/stv714MC48c.wav | 4 +- scripts/testv/stv71MC48c.wav | 4 +- scripts/testv/stv8c.wav | 4 +- scripts/testv/stv8n.wav | 4 +- scripts/testv/stvFOA16c.wav | 4 +- scripts/testv/stvFOA32c.wav | 4 +- scripts/testv/stvFOA48c.wav | 4 +- scripts/testv/stvST16c.wav | 4 +- scripts/testv/stvST16n.wav | 4 +- scripts/testv/stvST32c.wav | 4 +- scripts/testv/stvST32n.wav | 4 +- scripts/testv/stvST48c.wav | 4 +- scripts/testv/stvST48n.wav | 4 +- ...s_2-ele_plus_2-every-100-frames-Euler.csv} | 0 ...zi_plus_2-ele_plus_2-every-100-frames.csv} | 0 .../azi_plus_2-ele_plus_2-every-25-rows.csv | 3000 +++++++++++++++++ scripts/trajectories/const000-Vector3.csv | 4 + .../trajectories/full-circle-4s-Vector3.csv | 200 ++ .../full-circle-4s-ccw-Vector3.csv | 200 ++ scripts/trajectories/full-circle-4s-ccw.csv | 800 +++++ scripts/trajectories/full-circle-4s.csv | 800 +++++ ...ull-circle-with-up-and-down-4s-Vector3.csv | 200 ++ ...circle-with-up-and-down-4s-ccw-Vector3.csv | 200 ++ .../full-circle-with-up-and-down-4s-ccw.csv | 800 +++++ ...p-and-down-4s-fixed-pos-offset-Vector3.csv | 200 ++ .../full-circle-with-up-and-down-4s.csv | 800 +++++ tests/renderer/test_renderer.py | 203 +- tests/renderer/utils.py | 43 +- 195 files changed, 14055 insertions(+), 5994 deletions(-) rename lib_com/{ivas_ism_config.c => ivas_ism_com.c} (73%) create mode 100644 lib_util/vector3_pair_file_reader.c rename lib_debug/segsnr.c => lib_util/vector3_pair_file_reader.h (52%) rename scripts/trajectories/{azi+2-ele+2-every-100-frames-Euler.csv => azi_plus_2-ele_plus_2-every-100-frames-Euler.csv} (100%) rename scripts/trajectories/{azi+2-ele+2-every-100-frames.csv => azi_plus_2-ele_plus_2-every-100-frames.csv} (100%) create mode 100644 scripts/trajectories/azi_plus_2-ele_plus_2-every-25-rows.csv create mode 100644 scripts/trajectories/const000-Vector3.csv create mode 100644 scripts/trajectories/full-circle-4s-Vector3.csv create mode 100644 scripts/trajectories/full-circle-4s-ccw-Vector3.csv create mode 100644 scripts/trajectories/full-circle-4s-ccw.csv create mode 100644 scripts/trajectories/full-circle-4s.csv create mode 100644 scripts/trajectories/full-circle-with-up-and-down-4s-Vector3.csv create mode 100644 scripts/trajectories/full-circle-with-up-and-down-4s-ccw-Vector3.csv create mode 100644 scripts/trajectories/full-circle-with-up-and-down-4s-ccw.csv create mode 100644 scripts/trajectories/full-circle-with-up-and-down-4s-fixed-pos-offset-Vector3.csv create mode 100644 scripts/trajectories/full-circle-with-up-and-down-4s.csv diff --git a/.gitignore b/.gitignore index c87c691a4a..52512506d7 100644 --- a/.gitignore +++ b/.gitignore @@ -72,3 +72,15 @@ Externals/ # coan output files that are created when cleaning out switches coan_out_* +/COMPLEXITY +/res +/tv +/wmops +/Workspace_msvc/renderer.args.json +/Workspace_msvc/encoder.args.json +/Workspace_msvc/decoder.args.json +/scripts/mem_analysis_enc_VBR_5k9.csv +/scripts/mem_analysis_enc_STEREO_sw.png +/scripts/mem_analysis_enc_STEREO_sw.csv +/scripts/mem_analysis_enc_STEREO_16k4_DTX.csv +*.pwv diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6d00b37f0a..082cf40cab 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -49,6 +49,13 @@ stages: echo "Commit time was $CI_COMMIT_TIMESTAMP" date | xargs echo "System time is" +.print-common-info-windows: &print-common-info-windows + - | + echo "Printing common information for build job." + echo "Current job is run on commit $CI_COMMIT_SHA" + echo "Commit time was $CI_COMMIT_TIMESTAMP" + ("echo 'System time is'", "Get-Date -Format 'dddd dd/MM/yyyy HH:mm K'") | Invoke-Expression + .get-previous-merge-commit-sha: &get-previous-merge-commit-sha - previous_merge_commit=$(git --no-pager log --merges HEAD~1 -n 1 --pretty=format:%H) @@ -156,6 +163,11 @@ stages: tags: - ivas-linux +.build-job-windows: + stage: build + timeout: "4 minutes" + tags: + - ivas-windows # template for test jobs on linux that need the TESTV_DIR .test-job-linux-needs-testv-dir: @@ -172,6 +184,12 @@ stages: exit_codes: - 123 +.build-job-windows-with-check-for-warnings: + extends: .build-job-windows + stage: build + allow_failure: + exit_codes: + - 123 # --------------------------------------------------------------- @@ -262,6 +280,31 @@ build-codec-sanitizers-linux: - *print-common-info - bash ci/build_codec_sanitizers_linux.sh +build-codec-windows-cmake: + extends: + - .build-job-windows-with-check-for-warnings + - .rules-basis + script: + - *print-common-info-windows + - $winoutdata = $null + - cmake -G "Visual Studio 15 2017" . -Bbuild + - cmake --build build -j | tee -variable winoutdata + - $winoutdata | Out-File $BUILD_OUTPUT -Encoding Utf8 + - ("& python ci/check_for_warnings.py '$BUILD_OUTPUT'") | Invoke-Expression + - ("exit $LASTEXITCODE") | Invoke-Expression + +build-codec-windows-msbuild: + extends: + - .build-job-windows-with-check-for-warnings + - .rules-basis + script: + - *print-common-info-windows + - $winoutdata = $null + - MSBuild.exe .\Workspace_msvc\Workspace_msvc.sln /property:Configuration=Debug | tee -variable winoutdata + - $winoutdata | Out-File $BUILD_OUTPUT -Encoding Utf8 + - ("& python ci/check_for_warnings.py '$BUILD_OUTPUT'") | Invoke-Expression + - ("exit $LASTEXITCODE") | Invoke-Expression + # --------------------------------------------------------------- # Test jobs for merge requests # --------------------------------------------------------------- diff --git a/Workspace_msvc/lib_com.vcxproj b/Workspace_msvc/lib_com.vcxproj index d55896b03c..23aa2ae3f0 100644 --- a/Workspace_msvc/lib_com.vcxproj +++ b/Workspace_msvc/lib_com.vcxproj @@ -244,9 +244,9 @@ + - diff --git a/Workspace_msvc/lib_com.vcxproj.filters b/Workspace_msvc/lib_com.vcxproj.filters index baa1700361..7b6854e718 100644 --- a/Workspace_msvc/lib_com.vcxproj.filters +++ b/Workspace_msvc/lib_com.vcxproj.filters @@ -379,9 +379,6 @@ common_evs_c - - common_ivas_c - common_ivas_c @@ -466,6 +463,9 @@ common_ivas_c + + common_ivas_c + diff --git a/Workspace_msvc/lib_util.vcxproj b/Workspace_msvc/lib_util.vcxproj index 32bebc7536..5b5e5f30cc 100644 --- a/Workspace_msvc/lib_util.vcxproj +++ b/Workspace_msvc/lib_util.vcxproj @@ -146,6 +146,7 @@ + @@ -167,6 +168,7 @@ + diff --git a/apps/decoder.c b/apps/decoder.c index af9a847aab..2b7268854a 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -42,6 +42,9 @@ #include "ls_custom_file_reader.h" #include "hrtf_file_reader.h" #include "head_rotation_file_reader.h" +#ifdef OTR_REFERENCE_VECTOR_TRACKING +#include "vector3_pair_file_reader.h" +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ #include "jbm_file_writer.h" #include "evs_rtp_payload.h" #ifdef DEBUGGING @@ -69,9 +72,18 @@ static #define MAX_NUM_OUTPUT_CHANNELS 16 #define MAX_OUTPUT_PCM_BUFFER_SIZE ( MAX_NUM_OUTPUT_CHANNELS * MAX_FRAME_SIZE ) +#ifdef FIX_I109_ORIENTATION_TRACKING +#define IVAS_PUBLIC_ORIENT_TRK_NONE ( 0 ) +#define IVAS_PUBLIC_ORIENT_TRK_REF ( 1 ) +#define IVAS_PUBLIC_ORIENT_TRK_AVG ( 2 ) +#ifdef OTR_REFERENCE_VECTOR_TRACKING +#define IVAS_PUBLIC_ORIENT_TRK_REF_VEC ( 3 ) +#define IVAS_PUBLIC_ORIENT_TRK_REF_VEC_LEV ( 4 ) +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ +#else #define IVAS_PUBLIC_ORIENT_TRK_REF 0 #define IVAS_PUBLIC_ORIENT_TRK_AVG 1 - +#endif typedef struct { @@ -85,6 +97,14 @@ typedef struct bool voipMode; bool enableHeadRotation; char *headrotTrajFileName; +#ifdef FIX_I109_ORIENTATION_TRACKING + bool enableReferenceRotation; + char *refrotTrajFileName; +#endif +#ifdef OTR_REFERENCE_VECTOR_TRACKING + bool enableReferenceVectorTracking; + char *referenceVectorTrajFileName; +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ #ifdef SUPPORT_JBM_TRACEFILE char *jbmTraceFilename; #endif @@ -104,9 +124,6 @@ typedef struct char *renderConfigFilename; #ifdef DEBUGGING -#ifndef REMOVE_FORCE_SUBFRAME_BIN - bool forceSubframeBinauralization; -#endif IVAS_DEC_FORCED_REND_MODE forcedRendMode; #ifdef DEBUG_FOA_AGC FILE *agcBitstream; /* temporary */ @@ -123,7 +140,15 @@ typedef struct static bool parseCmdlIVAS_dec( int16_t argc, char **argv, DecArguments *arg ); static void usage_dec( void ); +#ifdef FIX_I109_ORIENTATION_TRACKING +#ifdef OTR_REFERENCE_VECTOR_TRACKING +static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, HeadRotFileReader *headRotReader, HeadRotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); +#else /* OTR_REFERENCE_VECTOR_TRACKING */ +static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, HeadRotFileReader *headRotReader, HeadRotFileReader *refRotReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); +#endif +#else static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, HeadRotFileReader *headRotReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); +#endif static ivas_error decodeVoIP( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HANDLE hIvasDec ); #ifdef DEBUGGING static ivas_error printBitstreamInfoVoip( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HANDLE hIvasDec ); @@ -149,6 +174,12 @@ int main( LsCustomFileReader *hLsCustomReader = NULL; hrtfFileReader *hrtfReader = NULL; HeadRotFileReader *headRotReader = NULL; +#ifdef FIX_I109_ORIENTATION_TRACKING + HeadRotFileReader *refRotReader = NULL; +#endif +#ifdef OTR_REFERENCE_VECTOR_TRACKING + Vector3PairFileReader *referenceVectorReader = NULL; +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ ivas_error error = IVAS_ERR_UNKNOWN; int16_t pcmBuf[MAX_OUTPUT_PCM_BUFFER_SIZE]; RenderConfigReader *renderConfigReader = NULL; @@ -222,7 +253,6 @@ int main( if ( arg.hrtfReaderEnabled ) { -#ifdef FIX_351_HRTF_COMMAND /* sanity check */ if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM ) { @@ -230,13 +260,10 @@ int main( fprintf( stderr, "\nError: HRTF binary file cannot be used in this output configuration.\n\n" ); goto cleanup; } -#endif if ( ( error = hrtfFileReader_open( arg.hrtfFileName, &hrtfReader ) ) != IVAS_ERR_OK ) { -#ifdef FIX_351_HRTF_COMMAND arg.hrtfReaderEnabled = false; -#endif fprintf( stderr, "\nError: Can't open HRTF binary file %s \n\n", arg.hrtfFileName ); goto cleanup; } @@ -248,14 +275,12 @@ int main( if ( arg.enableHeadRotation ) { -#ifdef FIX_351_HRTF_COMMAND /* sanity check */ if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM ) { fprintf( stderr, "\nError: Head-rotation file file cannot be used in this output configuration.\n\n" ); goto cleanup; } -#endif if ( ( error = HeadRotationFileReader_open( arg.headrotTrajFileName, &headRotReader ) ) != IVAS_ERR_OK ) { @@ -264,6 +289,33 @@ int main( } } +#ifdef FIX_I109_ORIENTATION_TRACKING + /*------------------------------------------------------------------------------------------* + * Open reference rotation file + *------------------------------------------------------------------------------------------*/ + if ( arg.enableReferenceRotation ) + { + if ( ( error = HeadRotationFileReader_open( arg.refrotTrajFileName, &refRotReader ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: Can't open reference rotation file %s \n\n", arg.refrotTrajFileName ); + goto cleanup; + } + } +#endif +#ifdef OTR_REFERENCE_VECTOR_TRACKING + /*------------------------------------------------------------------------------------------* + * Open reference vector trajectory file + *------------------------------------------------------------------------------------------*/ + if ( arg.enableReferenceVectorTracking ) + { + if ( ( error = Vector3PairFileReader_open( arg.referenceVectorTrajFileName, &referenceVectorReader ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: Can't open reference vector trajectory file %s \n\n", arg.referenceVectorTrajFileName ); + goto cleanup; + } + } +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ + /*------------------------------------------------------------------------------------------* * Open custom loudspeaker layout file *------------------------------------------------------------------------------------------*/ @@ -283,14 +335,12 @@ int main( if ( arg.renderConfigEnabled ) { -#ifdef FIX_351_HRTF_COMMAND /* sanity check */ if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM ) { fprintf( stderr, "\nError: Renderer configuration file cannot be used in this output configuration.\n\n" ); goto cleanup; } -#endif if ( ( error = RenderConfigReader_open( arg.renderConfigFilename, &renderConfigReader ) ) != IVAS_ERR_OK ) { @@ -303,23 +353,7 @@ int main( * Configure the decoder *------------------------------------------------------------------------------------------*/ -#ifdef REMOVE_FORCE_SUBFRAME_BIN if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.renderConfigEnabled ) ) != IVAS_ERR_OK ) -#else -#ifdef DEBUGGING -#ifdef FIX_351_HRTF_COMMAND - if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.renderConfigEnabled, arg.forceSubframeBinauralization ) ) != IVAS_ERR_OK ) -#else - if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.forceSubframeBinauralization ) ) != IVAS_ERR_OK ) -#endif -#else -#ifdef FIX_351_HRTF_COMMAND - if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.renderConfigEnabled ) ) != IVAS_ERR_OK ) -#else - if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation ) ) != IVAS_ERR_OK ) -#endif -#endif -#endif { fprintf( stderr, "\nConfigure failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; @@ -425,9 +459,17 @@ int main( IVAS_RENDER_CONFIG_DATA renderConfig; /* sanity check */ +#ifdef TD5 + if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL ) +#else if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM ) +#endif { +#ifdef TD5 + fprintf( stderr, "\nExternal Renderer Config is supported only for BINAURAL and BINAURAL_ROOM. Exiting. \n\n" ); +#else fprintf( stderr, "\nExternal Renderer Config is supported only when BINAURAL_ROOM is used as output. Exiting. \n\n" ); +#endif goto cleanup; } @@ -530,7 +572,15 @@ int main( } else { +#ifdef FIX_I109_ORIENTATION_TRACKING +#ifdef OTR_REFERENCE_VECTOR_TRACKING + error = decodeG192( arg, hBsReader, headRotReader, refRotReader, referenceVectorReader, hIvasDec, pcmBuf ); +#else + error = decodeG192( arg, hBsReader, headRotReader, refRotReader, hIvasDec, pcmBuf ); +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ +#else error = decodeG192( arg, hBsReader, headRotReader, hIvasDec, pcmBuf ); +#endif } if ( error == IVAS_ERR_OK || error == IVAS_ERR_END_OF_FILE ) @@ -586,7 +636,12 @@ cleanup: CustomLsReader_close( &hLsCustomReader ); hrtfFileReader_close( &hrtfReader ); HeadRotationFileReader_close( &headRotReader ); - +#ifdef FIX_I109_ORIENTATION_TRACKING + HeadRotationFileReader_close( &refRotReader ); +#endif +#ifdef OTR_REFERENCE_VECTOR_TRACKING + Vector3PairFileReader_close( &referenceVectorReader ); +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ RenderConfigReader_close( &renderConfigReader ); if ( BS_Reader_Close( &hBsReader ) != IVAS_ERR_OK ) @@ -710,9 +765,6 @@ static bool parseCmdlIVAS_dec( float ftmp; arg->forcedRendMode = IVAS_DEC_FORCE_REND_UNFORCED; -#ifndef REMOVE_FORCE_SUBFRAME_BIN - arg->forceSubframeBinauralization = false; -#endif #ifdef DEBUG_FOA_AGC arg->agcBitstream = NULL; #endif @@ -726,7 +778,17 @@ static bool parseCmdlIVAS_dec( arg->enableHeadRotation = false; arg->headrotTrajFileName = NULL; +#ifdef FIX_I109_ORIENTATION_TRACKING + arg->orientation_tracking = IVAS_PUBLIC_ORIENT_TRK_NONE; + arg->enableReferenceRotation = false; + arg->headrotTrajFileName = NULL; +#ifdef OTR_REFERENCE_VECTOR_TRACKING + arg->enableReferenceVectorTracking = false; + arg->referenceVectorTrajFileName = NULL; +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ +#else arg->orientation_tracking = IVAS_PUBLIC_ORIENT_TRK_REF; +#endif #ifdef SUPPORT_JBM_TRACEFILE arg->jbmTraceFilename = NULL; @@ -864,13 +926,6 @@ static bool parseCmdlIVAS_dec( i++; } } -#ifndef REMOVE_FORCE_SUBFRAME_BIN - else if ( strcmp( argv_to_upper, "-FORCE_SUBFRAME_BIN" ) == 0 ) /* Force binauralization to subframe (5 ms) resolution */ - { - arg->forceSubframeBinauralization = true; - i++; - } -#endif #ifdef DEBUG_MODE_INFO #ifdef DEBUG_MODE_INFO_TWEAK /*-----------------------------------------------------------------* @@ -908,18 +963,27 @@ static bool parseCmdlIVAS_dec( } else if ( strcmp( argv_to_upper, "-OTR" ) == 0 ) { +#ifndef FIX_I109_ORIENTATION_TRACKING if ( strlen( argv[i + 1] ) > 3 ) { fprintf( stderr, "Error: Invalid orientation tracking type %s \n\n", argv[i + 1] ); usage_dec(); return false; } +#endif strncpy( argv_to_upper, argv[i + 1], sizeof( argv_to_upper ) - 1 ); argv_to_upper[sizeof( argv_to_upper ) - 1] = '\0'; to_upper( argv_to_upper ); - if ( strcmp( argv_to_upper, "REF" ) == 0 ) +#ifdef FIX_I109_ORIENTATION_TRACKING + if ( strcmp( argv_to_upper, "NONE" ) == 0 ) + { + arg->orientation_tracking = IVAS_PUBLIC_ORIENT_TRK_NONE; + } + else +#endif + if ( strcmp( argv_to_upper, "REF" ) == 0 ) { arg->orientation_tracking = IVAS_PUBLIC_ORIENT_TRK_REF; } @@ -927,6 +991,16 @@ static bool parseCmdlIVAS_dec( { arg->orientation_tracking = IVAS_PUBLIC_ORIENT_TRK_AVG; } +#ifdef OTR_REFERENCE_VECTOR_TRACKING + else if ( strcmp( argv_to_upper, "REF_VEC" ) == 0 ) + { + arg->orientation_tracking = IVAS_PUBLIC_ORIENT_TRK_REF_VEC; + } + else if ( strcmp( argv_to_upper, "REF_VEC_LEV" ) == 0 ) + { + arg->orientation_tracking = IVAS_PUBLIC_ORIENT_TRK_REF_VEC_LEV; + } +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ else { fprintf( stderr, "Error: Invalid orientation tracking type %s \n\n", argv[i + 1] ); @@ -935,6 +1009,40 @@ static bool parseCmdlIVAS_dec( } i += 2; } +#ifdef FIX_I109_ORIENTATION_TRACKING + else if ( strcmp( argv_to_upper, "-RF" ) == 0 ) + { + arg->enableReferenceRotation = true; + i++; + + if ( argc - i <= 4 || argv[i][0] == '-' ) + { + fprintf( stderr, "Error: Reference rotation file name not specified!\n\n" ); + usage_dec(); + return false; + } + + arg->refrotTrajFileName = argv[i]; + i++; + } +#endif +#ifdef OTR_REFERENCE_VECTOR_TRACKING + else if ( strcmp( argv_to_upper, "-RVF" ) == 0 ) + { + arg->enableReferenceVectorTracking = true; + i++; + + if ( argc - i <= 4 || argv[i][0] == '-' ) + { + fprintf( stderr, "Error: reference vector trajectory file name not specified!\n\n" ); + usage_dec(); + return false; + } + + arg->referenceVectorTrajFileName = argv[i]; + i++; + } +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ else if ( strcmp( argv_to_upper, "-RENDER_CONFIG" ) == 0 ) { arg->renderConfigEnabled = true; @@ -1120,10 +1228,6 @@ static void usage_dec( void ) fprintf( stdout, "-T File : Head rotation specified by external trajectory File\n" ); fprintf( stdout, "-hrtf File : HRTF filter File used in BINAURAL output configuration\n" ); #ifdef DEBUGGING -#ifndef REMOVE_FORCE_SUBFRAME_BIN - fprintf( stdout, "-force_subframe_bin : Forces parametric binauralizer code to use 5 ms time resolution even when\n" ); - fprintf( stdout, " output time resolution is larger.\n" ); -#endif fprintf( stdout, "-FEC X : Insert frame erasures, X = 0-10 is the percentage\n" ); fprintf( stdout, " of erased frames, or X may be the name of binary file or \n" ); fprintf( stdout, " file with G192 headers indicating GOOD FRAME or BAD FRAME\n" ); @@ -1131,7 +1235,17 @@ static void usage_dec( void ) fprintf( stdout, " default is OFF, if this option is not used\n" ); fprintf( stdout, "-force R : Force specific binaural rendering mode, R = (TDREND, CLDFBREND),\n" ); #endif +#ifdef FIX_I109_ORIENTATION_TRACKING + fprintf( stdout, "-otr tracking_type : head orientation tracking type: 'none', 'ref' or 'avg' (only for binaural rendering)\n" ); + fprintf( stdout, "-rf File : Reference rotation specified by external trajectory file\n" ); + fprintf( stdout, " works only in combination with -otr ref mode\n" ); +#else fprintf( stdout, "-otr tracking_type : head orientation tracking type: 'ref' or 'avg' (only for binaural rendering)\n" ); +#endif +#ifdef OTR_REFERENCE_VECTOR_TRACKING + fprintf( stdout, "-rvf File : Reference vector specified by external trajectory file\n" ); + fprintf( stdout, " works only in combination with -otr ref_vec and ref_vec_lev modes\n" ); +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ fprintf( stdout, "-render_config file : Renderer configuration file\n" ); fprintf( stdout, "-no_diegetic_pan : panning mono no dietic sound to stereo -1<= pan <=1,\n" ); fprintf( stdout, " left or l or 1->left, right or r or -1->right, center or c or 0->middle\n" ); @@ -1181,6 +1295,22 @@ static ivas_error initOnFirstGoodFrame( ivas_error error = IVAS_ERR_UNKNOWN; /* Now delay, number of output channels and frame size are known */ +#ifdef FIX_371_DELAY_REPORT + if ( ( error = IVAS_DEC_GetDelay( hIvasDec, pFullDelayNumSamples, delayTimeScale ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nUnable to get delay of decoder: %s\n", ivas_error_to_string( error ) ); + return error; + } + + if ( !arg.delayCompensationEnabled ) + { +#ifdef BINAURALIZATION_DELAY_REPORT + pFullDelayNumSamples[0] = 0; +#else + *pFullDelayNumSamples = 0; +#endif + } +#else if ( arg.delayCompensationEnabled ) { if ( ( error = IVAS_DEC_GetDelay( hIvasDec, pFullDelayNumSamples, delayTimeScale ) ) != IVAS_ERR_OK ) @@ -1197,6 +1327,7 @@ static ivas_error initOnFirstGoodFrame( *pFullDelayNumSamples = 0; #endif } +#endif #ifdef BINAURALIZATION_DELAY_REPORT *pRemainingDelayNumSamples = pFullDelayNumSamples[0]; #else @@ -1348,6 +1479,12 @@ static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, HeadRotFileReader *headRotReader, +#ifdef FIX_I109_ORIENTATION_TRACKING + HeadRotFileReader *refRotReader, +#ifdef OTR_REFERENCE_VECTOR_TRACKING + Vector3PairFileReader *referenceVectorReader, +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ +#endif IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ) @@ -1375,6 +1512,9 @@ static ivas_error decodeG192( ivas_error error = IVAS_ERR_UNKNOWN; uint16_t numObj = 0; IVAS_DEC_BS_FORMAT bsFormat = IVAS_DEC_BS_UNKOWN; +#ifdef TD5 + IVAS_POSITION Pos[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; +#endif IsmFileWriter *ismWriters[IVAS_MAX_NUM_OBJECTS]; for ( i = 0; i < IVAS_MAX_NUM_OBJECTS; ++i ) @@ -1444,24 +1584,86 @@ static ivas_error decodeG192( goto cleanup; } +#ifdef FIX_I109_ORIENTATION_TRACKING +#ifdef OTR_REFERENCE_VECTOR_TRACKING + /* reference vector */ + if ( arg.enableReferenceVectorTracking ) + { + IVAS_VECTOR3 listenerPosition, referencePosition; + if ( ( error = Vector3PairFileReader_read( referenceVectorReader, &listenerPosition, &referencePosition ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading listener and reference positions from %s\n", IVAS_DEC_GetErrorMessage( error ), Vector3PairFileReader_getFilePath( referenceVectorReader ) ); + goto cleanup; + } + + if ( ( error = IVAS_DEC_FeedRefVectorData( hIvasDec, listenerPosition, referencePosition ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedRefVectorData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ + /* Reference rotation */ + if ( arg.enableReferenceRotation ) + { + IVAS_QUATERNION quaternion; +#ifdef TD5 + if ( ( error = HeadRotationFileReading( refRotReader, &quaternion, NULL ) ) != IVAS_ERR_OK ) +#else + if ( ( error = HeadRotationFileReading( refRotReader, &quaternion ) ) != IVAS_ERR_OK ) +#endif + { + fprintf( stderr, "\nError %s while reading reference rotation from %s\n", IVAS_DEC_GetErrorMessage( error ), HeadRotationFileReader_getFilePath( refRotReader ) ); + goto cleanup; + } + + if ( ( error = IVAS_DEC_FeedRefRotData( hIvasDec, quaternion ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedRefRotData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } +#endif /* Head-tracking input simulation */ if ( arg.enableHeadRotation ) { IVAS_QUATERNION Quaternions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; +#ifdef FIX_I109_ORIENTATION_TRACKING + for ( i = 0; i < IVAS_MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { +#ifdef TD5 + if ( ( error = HeadRotationFileReading( headRotReader, &Quaternions[i], &Pos[i] ) ) != IVAS_ERR_OK ) +#else + if ( ( error = HeadRotationFileReading( headRotReader, &Quaternions[i] ) ) != IVAS_ERR_OK ) +#endif + { + fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), HeadRotationFileReader_getFilePath( headRotReader ) ); + goto cleanup; + } + } +#else +#ifdef TD5 + if ( ( error = HeadRotationFileReading( headRotReader, Quaternions, Pos ) ) != IVAS_ERR_OK ) +#else if ( ( error = HeadRotationFileReading( headRotReader, Quaternions, frame ) ) != IVAS_ERR_OK ) +#endif { fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), HeadRotationFileReader_getFilePath( headRotReader ) ); goto cleanup; } +#endif +#ifdef TD5 + if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternions, Pos ) ) != IVAS_ERR_OK ) +#else if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternions ) ) != IVAS_ERR_OK ) +#endif { fprintf( stderr, "\nIVAS_DEC_FeedHeadTrackData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } } - /* Run decoder for one frame (get rendered output) */ if ( ( error = IVAS_DEC_GetSamples( hIvasDec, pcmBuf, &nOutSamples ) ) != IVAS_ERR_OK ) { @@ -1529,7 +1731,7 @@ static ivas_error decodeG192( } } - /* Write ISm metadata to external file(s) */ + /* Write ISM metadata to external file(s) */ if ( decodedGoodFrame && arg.outputFormat == IVAS_DEC_OUTPUT_EXT ) { if ( bsFormat == IVAS_DEC_BS_OBJ ) @@ -1628,7 +1830,11 @@ static ivas_error decodeG192( if ( delayNumSamples_orig[2] > 0 ) { printf( "HRIR/BRIR delay: %4.2f ms (%3u samples at timescale %5u)\n", 1000.f * delayNumSamples_orig[2] / (float) delayTimeScale, delayNumSamples_orig[2], delayTimeScale ); +#ifdef FIX_371_DELAY_REPORT + printf( "Total delay: %4.2f ms (%3u samples at timescale %5u)\n", 1000.f * ( delayNumSamples_orig[1] + delayNumSamples_orig[2] ) / (float) delayTimeScale, delayNumSamples_orig[1] + delayNumSamples_orig[2], delayTimeScale ); +#else printf( "Total delay: %4.2f ms (%3u samples at timescale %5u)\n", 1000.f * delayNumSamples_orig[0] / (float) delayTimeScale, delayNumSamples_orig[0], delayTimeScale ); +#endif } #else fprintf( stdout, "\nDecoder delay: %-5u [samples] - Timescale: %5u\n", delayNumSamples_orig, delayTimeScale ); @@ -2129,7 +2335,11 @@ static ivas_error decodeVoIP( if ( delayNumSamples_orig[2] > 0 ) { printf( "HRIR/BRIR delay: %4.2f ms (%3u samples at timescale %5u)\n", 1000.f * delayNumSamples_orig[2] / (float) delayTimeScale, delayNumSamples_orig[2], delayTimeScale ); +#ifdef FIX_371_DELAY_REPORT + printf( "Total delay: %4.2f ms (%3u samples at timescale %5u)\n", 1000.f * ( delayNumSamples_orig[1] + delayNumSamples_orig[2] ) / (float) delayTimeScale, delayNumSamples_orig[1] + delayNumSamples_orig[2], delayTimeScale ); +#else printf( "Total delay: %4.2f ms (%3u samples at timescale %5u)\n", 1000.f * delayNumSamples_orig[0] / (float) delayTimeScale, delayNumSamples_orig[0], delayTimeScale ); +#endif } #else printf( "\nDecoder delay: %5u [samples] - Timescale: %5u\n", delayNumSamples_orig, delayTimeScale ); diff --git a/apps/encoder.c b/apps/encoder.c index a1c9674ee8..ff6f461838 100644 --- a/apps/encoder.c +++ b/apps/encoder.c @@ -126,6 +126,9 @@ typedef struct #endif #endif bool pca; +#ifdef TD5 + bool ism_extended_metadata; +#endif } EncArguments; @@ -213,23 +216,6 @@ int main( goto cleanup; } -#ifndef FIX_94_VERIFY_WAV_NUM_CHANNELS - /*------------------------------------------------------------------------------------------* - * Open input audio file - *------------------------------------------------------------------------------------------*/ - int32_t inFileSampleRate = 0; - if ( AudioFileReader_open( &audioReader, arg.inputWavFilename, &inFileSampleRate ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nCan't open %s\n\n", arg.inputWavFilename ); - goto cleanup; - } - if ( inFileSampleRate != 0 && /* inFileSampleRate will remain zero if input file is raw PCM */ - inFileSampleRate != arg.inputFs ) - { - fprintf( stderr, "Sampling rate mismatch: %d Hz requested, but %d Hz found in file %s\n", arg.inputFs, inFileSampleRate, arg.inputWavFilename ); - goto cleanup; - } -#endif /*------------------------------------------------------------------------------------------* * Open output bitstream file @@ -395,7 +381,11 @@ int main( } break; case IVAS_ENC_INPUT_ISM: +#ifdef TD5 + if ( ( error = IVAS_ENC_ConfigureForObjects( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig, arg.inputFormatConfig.ism.numObjects, arg.ism_extended_metadata ) ) != IVAS_ERR_OK ) +#else if ( ( error = IVAS_ENC_ConfigureForObjects( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig, arg.inputFormatConfig.ism.numObjects ) ) != IVAS_ERR_OK ) +#endif { fprintf( stderr, "\nIVAS_ENC_ConfigureForObjects failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); goto cleanup; @@ -452,7 +442,6 @@ int main( goto cleanup; } -#ifdef FIX_94_VERIFY_WAV_NUM_CHANNELS /*------------------------------------------------------------------------------------------* * Open input audio file *------------------------------------------------------------------------------------------*/ @@ -511,7 +500,6 @@ int main( fprintf( stderr, "\nError: %s\n", ivas_error_to_string( error ) ); goto cleanup; } -#endif /*------------------------------------------------------------------------------------------* * Open input metadata files @@ -613,7 +601,6 @@ int main( fprintf( stdout, "\n\n-- Start the encoder (quiet mode) --\n\n" ); } - #ifdef WMOPS reset_stack(); reset_wmops(); @@ -630,7 +617,6 @@ int main( while ( 1 ) { - /* Read the input data */ if ( ( error = AudioFileReader_read( audioReader, pcmBuf, pcmBufSize, &numSamplesRead ) ) != IVAS_ERR_OK ) { @@ -720,7 +706,7 @@ int main( } #endif - /* Read ISm input metadata */ + /* Read ISM input metadata */ for ( i = 0; i < numIsmInputs; ++i ) { if ( ismReaders[i] == NULL ) @@ -897,6 +883,9 @@ static void initArgStruct( EncArguments *arg ) arg->caConfig = IVAS_ENC_GetDefaultChannelAwareConfig(); arg->ca_config_file = NULL; arg->mimeOutput = false; +#ifdef TD5 + arg->ism_extended_metadata = false; +#endif #ifdef DEBUGGING arg->forcedMode = IVAS_ENC_FORCE_UNFORCED; @@ -1284,6 +1273,13 @@ static bool parseCmdlIVAS_enc( if ( i < argc - 4 ) { +#ifdef TD5 + if ( argv[i][0] == '+' ) + { + argv[i]++; + arg->ism_extended_metadata = true; + } +#endif if ( !is_digits_only( argv[i] ) ) { fprintf( stderr, "Error: Number of ISM channels must be an integer number!\n\n" ); @@ -1642,7 +1638,6 @@ static void usage_enc( void ) fprintf( stdout, " *VBR mode (average bitrate),\n" ); fprintf( stdout, " for AMR-WB IO modes R = (6600, 8850, 12650, 14250, 15850, 18250,\n" ); fprintf( stdout, " 19850, 23050, 23850) \n" ); -#ifdef ISM_HIGHEST_BITRATE fprintf( stdout, " for IVAS stereo R = (13200, 16400, 24400, 32000, 48000, 64000, 80000, \n" ); fprintf( stdout, " 96000, 128000, 160000, 192000, 256000) \n" ); fprintf( stdout, " for IVAS ISM R = 13200 for 1 ISM, 16400 for 1 ISM and 2 ISM, \n" ); @@ -1650,10 +1645,6 @@ static void usage_enc( void ) fprintf( stdout, " for 2 ISM, 3 ISM and 4 ISM also 160000, 192000, 256000) \n" ); fprintf( stdout, " for 3 ISM and 4 ISM also 384000 \n" ); fprintf( stdout, " for 4 ISM also 512000 \n" ); -#else - fprintf( stdout, " for IVAS stereo & ISm R =(13200, 16400, 24400, 32000, 48000, 64000, 80000, \n" ); - fprintf( stdout, " 96000, 128000, 160000, 192000, 256000) \n" ); -#endif fprintf( stdout, " for IVAS SBA, MASA, MC R=(13200, 16400, 24400, 32000, 48000, 64000, 80000, \n" ); fprintf( stdout, " 96000, 128000, 160000, 192000, 256000, 384000, 512000) \n" ); fprintf( stdout, " Alternatively, R can be a bitrate switching file which consists of R values\n" ); @@ -1669,8 +1660,14 @@ static void usage_enc( void ) fprintf( stdout, "EVS mono is default, for IVAS choose one of the following: -stereo, -ism, -sba, -masa, -mc\n" ); fprintf( stdout, "-stereo [Mode] : Stereo format, default is unified stereo \n" ); fprintf( stdout, " optional for Mode: 1: DFT Stereo, 2: TD Stereo, 3: MDCT Stereo\n" ); +#ifdef TD5 + fprintf( stdout, "-ism (+)Ch Files : ISM format \n" ); + fprintf( stdout, " where Ch specifies the number of ISMs (1-4)\n" ); + fprintf( stdout, " where positive (+) means extended metadata format is used (including orientation and radius) \n" ); +#else fprintf( stdout, "-ism Channels Files : ISM format \n" ); fprintf( stdout, " where Channels specifies the number of ISMs (1-4)\n" ); +#endif fprintf( stdout, " and Files specify input files containing metadata, one file per object\n" ); fprintf( stdout, " (use NULL for no input metadata)\n" ); fprintf( stdout, "-sba +/-Order : Scene Based Audio input format (Ambisonics ACN/SN3D),\n" ); diff --git a/apps/renderer.c b/apps/renderer.c index e7088a4316..5e8ca98e9c 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -42,6 +42,9 @@ #include "cmdl_tools.h" #include "cmdln_parser.h" #include "head_rotation_file_reader.h" +#ifdef OTR_REFERENCE_VECTOR_TRACKING +#include "vector3_pair_file_reader.h" +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ #include "hrtf_file_reader.h" #include "ism_file_reader.h" #include "ls_custom_file_reader.h" @@ -130,6 +133,12 @@ typedef struct char inMetadataFilePaths[RENDERER_MAX_ISM_INPUTS][RENDERER_MAX_CLI_ARG_LENGTH]; int16_t numInMetadataFiles; char headRotationFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; +#ifdef FIX_I109_ORIENTATION_TRACKING +#ifdef OTR_REFERENCE_VECTOR_TRACKING + char referenceVectorFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ + char referenceRotationFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; +#endif char customHrtfFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; char renderConfigFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; int8_t orientationTracking; @@ -154,6 +163,7 @@ typedef enum CmdLnOptionId_outputFormat, CmdLnOptionId_sampleRate, CmdLnOptionId_trajFile, + CmdLnOptionId_refRotFile, CmdLnOptionId_customHrtfFile, CmdLnOptionId_renderConfigFile, CmdLnOptionId_noDiegeticPan, @@ -165,6 +175,9 @@ typedef enum CmdLnOptionId_inputMetadata, CmdLnOptionId_listFormats, CmdLnOptionId_inputGain, +#ifdef OTR_REFERENCE_VECTOR_TRACKING + CmdLnOptionId_referenceVectorFile, +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ } CmdLnOptionId; static const CmdLnParser_Option cliOptions[] = { @@ -210,6 +223,12 @@ static const CmdLnParser_Option cliOptions[] = { .matchShort = "tf", .description = "Head rotation trajectory file for simulation of head tracking (only for BINAURAL and BINAURAL_ROOM outputs)", }, + { + .id = CmdLnOptionId_refRotFile, + .match = "reference_rotation_file", + .matchShort = "rf", + .description = "Reference rotation trajectory file for simulation of head tracking (only for BINAURAL and BINAURAL_ROOM outputs)", + }, { .id = CmdLnOptionId_customHrtfFile, .match = "custom_hrtf", @@ -232,7 +251,15 @@ static const CmdLnParser_Option cliOptions[] = { .id = CmdLnOptionId_orientationTracking, .match = "tracking_type", .matchShort = "otr", - .description = "Head orientation tracking type: 'ref' or 'avg' (only for BINAURAL and BINAURAL_ROOM) (todo: check implementation)", +#ifdef FIX_I109_ORIENTATION_TRACKING +#ifdef OTR_REFERENCE_VECTOR_TRACKING + .description = "Head orientation tracking type: 'none', 'ref', 'avg' or `ref_vec` or `ref_vec_lev` (only for BINAURAL and BINAURAL_ROOM)", +#else + .description = "Head orientation tracking type: 'none', 'ref' or 'avg' (only for BINAURAL and BINAURAL_ROOM)", +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ +#else + .description = "Head orientation tracking type: 'ref' or 'avg' (only for BINAURAL and BINAURAL_ROOM)", +#endif }, { .id = CmdlnOptionId_lfePosition, @@ -268,6 +295,14 @@ static const CmdLnParser_Option cliOptions[] = { .matchShort = "l", .description = "List supported audio formats", }, +#ifdef OTR_REFERENCE_VECTOR_TRACKING + { + .id = CmdLnOptionId_referenceVectorFile, + .match = "reference_vector_file", + .matchShort = "rvf", + .description = "Reference vector trajectory file for simulation of head tracking (only for BINAURAL and BINAURAL_ROOM outputs)", + }, +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ }; @@ -494,6 +529,12 @@ int main( { IVAS_REND_HANDLE hIvasRend; HeadRotFileReader *headRotReader = NULL; +#ifdef FIX_I109_ORIENTATION_TRACKING +#ifdef OTR_REFERENCE_VECTOR_TRACKING + Vector3PairFileReader *referenceVectorReader = NULL; +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ + HeadRotFileReader *referenceRotReader = NULL; +#endif hrtfFileReader *hrtfFileReader = NULL; IsmPositionProvider *positionProvider; RenderConfigReader *renderConfigReader = NULL; @@ -517,6 +558,9 @@ int main( int32_t delayTimeScale = 0; int16_t i, numChannels; ivas_error error = IVAS_ERR_OK; +#ifdef TD5 + IVAS_POSITION Pos[RENDERER_HEAD_POSITIONS_PER_FRAME]; +#endif #ifdef WMOPS reset_wmops(); @@ -535,22 +579,68 @@ int main( convert_backslash( args.inputFilePath ); convert_backslash( args.outputFilePath ); +#ifndef FIX_I109_ORIENTATION_TRACKING + /* disable 'refrotequal' test cases */ + if ( strstr( args.headRotationFilePath, "azi_plus_2-ele_plus_2-every-100-frames.csv" ) != NULL ) + { + memset( args.headRotationFilePath, '\0', sizeof( args.headRotationFilePath ) ); + } +#endif convert_backslash( args.headRotationFilePath ); +#ifdef FIX_I109_ORIENTATION_TRACKING +#ifdef OTR_REFERENCE_VECTOR_TRACKING + convert_backslash( args.referenceVectorFilePath ); +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ + convert_backslash( args.referenceRotationFilePath ); +#endif convert_backslash( args.inLfePanningMatrixFile ); if ( !isEmptyString( args.headRotationFilePath ) ) { - HeadRotationFileReader_open( args.headRotationFilePath, &headRotReader ); + if ( HeadRotationFileReader_open( args.headRotationFilePath, &headRotReader ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error opening file: %s\n", args.headRotationFilePath ); + exit( -1 ); + } + } + +#ifdef FIX_I109_ORIENTATION_TRACKING + if ( !isEmptyString( args.referenceRotationFilePath ) ) + { + if ( HeadRotationFileReader_open( args.referenceRotationFilePath, &referenceRotReader ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error opening file: %s\n", args.referenceRotationFilePath ); + exit( -1 ); + } + } +#ifdef OTR_REFERENCE_VECTOR_TRACKING + if ( !isEmptyString( args.referenceVectorFilePath ) ) + { + if ( Vector3PairFileReader_open( args.referenceVectorFilePath, &referenceVectorReader ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error opening file: %s\n", args.referenceVectorFilePath ); + exit( -1 ); + } } +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ +#endif if ( !isEmptyString( args.customHrtfFilePath ) ) { - hrtfFileReader_open( args.customHrtfFilePath, &hrtfFileReader ); + if ( hrtfFileReader_open( args.customHrtfFilePath, &hrtfFileReader ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error opening file: %s\n", args.customHrtfFilePath ); + exit( -1 ); + } } if ( !isEmptyString( args.renderConfigFilePath ) ) { - RenderConfigReader_open( args.renderConfigFilePath, &renderConfigReader ); + if ( RenderConfigReader_open( args.renderConfigFilePath, &renderConfigReader ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error opening file: %s\n", args.renderConfigFilePath ); + exit( -1 ); + } } /* Initialize main input files, i.e. audio and metadata */ @@ -565,7 +655,6 @@ int main( setupWithSingleFormatInput( args, audioFilePath, positionProvider, masaReaders ); } -#ifdef FIX_94_VERIFY_WAV_NUM_CHANNELS if ( AudioFileReader_open( &audioReader, audioFilePath ) != IVAS_ERR_OK ) { fprintf( stderr, "Error opening file: %s\n", audioFilePath ); @@ -609,28 +698,6 @@ int main( fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); exit( -1 ); } -#else - int32_t inFileSampleRate = 0; - if ( AudioFileReader_open( &audioReader, audioFilePath, &inFileSampleRate ) != IVAS_ERR_OK ) - { - fprintf( stderr, "Error opening file: %s\n", audioFilePath ); - exit( -1 ); - } - if ( args.sampleRate == 0 && inFileSampleRate == 0 ) - { - fprintf( stderr, "Sampling rate must be specified on command line when using raw PCM input\n" ); - exit( -1 ); - } - if ( args.sampleRate != 0 && inFileSampleRate != 0 && args.sampleRate != inFileSampleRate ) - { - fprintf( stderr, "Sampling rate mismatch: %d Hz requested, but %d Hz found in file %s\n", args.sampleRate, inFileSampleRate, args.inputFilePath ); - exit( -1 ); - } - if ( args.sampleRate == 0 ) - { - args.sampleRate = inFileSampleRate; - } -#endif const int16_t frameSize_smpls = (int16_t) ( 20 * args.sampleRate / 1000 ); IVAS_REND_InputId mcIds[RENDERER_MAX_MC_INPUTS] = { 0 }; @@ -645,8 +712,13 @@ int main( } /* === Configure === */ +#ifdef TD5 + if ( ( error = IVAS_REND_InitConfig( hIvasRend, ( args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) || ( args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL ) ) ) != IVAS_ERR_OK ) +#else if ( ( error = IVAS_REND_InitConfig( hIvasRend, strlen( args.renderConfigFilePath ) != 0 ) ) != IVAS_ERR_OK ) +#endif { + fprintf( stderr, "Error in Renderer Config Init\n" ); exit( -1 ); } @@ -655,9 +727,17 @@ int main( IVAS_RENDER_CONFIG_DATA renderConfig; /* sanity check */ +#ifdef TD5 + if ( ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) && ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL ) ) +#else if ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) +#endif { +#ifdef TD5 + fprintf( stderr, "\nExternal Renderer Config is supported only when BINAURAL or BINAURAL_ROOM is used as output. Exiting. \n" ); +#else fprintf( stderr, "\nExternal Renderer Config is supported only when BINAURAL_ROOM is used as output. Exiting. \n" ); +#endif exit( -1 ); } @@ -680,6 +760,13 @@ int main( } } +#ifdef FIX_I109_ORIENTATION_TRACKING + if ( ( error = IVAS_REND_SetOrientationTrackingMode( hIvasRend, args.orientationTracking ) ) != IVAS_ERR_OK ) + { + return error; + } +#endif + /* Set up output custom layout configuration */ if ( args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) { @@ -798,12 +885,7 @@ int main( const int16_t totalNumInChannels = getTotalNumInChannels( hIvasRend, mcIds, ismIds, sbaIds, masaIds ); -#ifdef FIX_94_VERIFY_WAV_NUM_CHANNELS if ( inFileNumChannels != 0 /* inFileNumChannels is 0 with raw PCM input */ && totalNumInChannels != inFileNumChannels ) -#else - if ( AudioFileReader_getNumChannels( audioReader ) != 0 /* If input file is raw PCM, audio reader has no info about number of channels */ - && totalNumInChannels != AudioFileReader_getNumChannels( audioReader ) ) -#endif { fprintf( stderr, "Number of channels in input file does not match selected configuration\n" ); exit( -1 ); @@ -884,16 +966,91 @@ int main( ObjectPositionBuffer mtdBuffer; IsmPositionProvider_getNextFrame( positionProvider, &mtdBuffer ); +#ifdef FIX_I109_ORIENTATION_TRACKING +#ifdef OTR_REFERENCE_VECTOR_TRACKING + if ( referenceVectorReader != NULL ) + { + IVAS_VECTOR3 listenerPos, refPos; + if ( ( error = Vector3PairFileReader_read( referenceVectorReader, &listenerPos, &refPos ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + if ( ( error = IVAS_REND_SetReferenceVector( hIvasRend, listenerPos, refPos ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ + /* Read from reference rotation trajectory file if specified */ + if ( referenceRotReader != NULL ) + { + IVAS_QUATERNION quaternion; +#ifdef TD5 + if ( ( error = HeadRotationFileReading( referenceRotReader, &quaternion, NULL ) ) != IVAS_ERR_OK ) +#else + if ( HeadRotationFileReading( referenceRotReader, &quaternion ) != IVAS_ERR_OK ) +#endif + { + fprintf( stderr, "Error in Head Rotation File Reading: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + + if ( ( error = IVAS_REND_SetReferenceRotation( hIvasRend, quaternion ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error setting Reference Rotation: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } +#endif + /* Read from head rotation trajectory file if specified */ if ( headRotReader != NULL ) { IVAS_QUATERNION quatBuffer[RENDERER_HEAD_POSITIONS_PER_FRAME]; + +#ifdef FIX_I109_ORIENTATION_TRACKING + for ( i = 0; i < RENDERER_HEAD_POSITIONS_PER_FRAME; i++ ) + { +#ifdef TD5 + if ( ( error = HeadRotationFileReading( headRotReader, &quatBuffer[i], &Pos[i] ) ) != IVAS_ERR_OK ) +#else + if ( HeadRotationFileReading( headRotReader, &quatBuffer[i] ) != IVAS_ERR_OK ) +#endif + { + fprintf( stderr, "Error in Head Rotation File Reading: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } +#else +#ifdef TD5 + HeadRotationFileReading( headRotReader, quatBuffer, Pos ); +#else HeadRotationFileReading( headRotReader, quatBuffer, frame ); - IVAS_REND_SetHeadRotation( hIvasRend, quatBuffer ); +#endif +#endif +#ifdef TD5 + if ( ( error = IVAS_REND_SetHeadRotation( hIvasRend, quatBuffer, Pos ) ) != IVAS_ERR_OK ) +#else + if ( IVAS_REND_SetHeadRotation( hIvasRend, quatBuffer ) != IVAS_ERR_OK ) +#endif + { + fprintf( stderr, "Error setting Head Rotation: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } } else { - IVAS_REND_SetHeadRotation( hIvasRend, NULL ); +#ifdef TD5 + if ( ( ( error = IVAS_REND_SetHeadRotation( hIvasRend, NULL, NULL ) ) != IVAS_ERR_OK ) && ( IVAS_REND_SetHeadRotation( hIvasRend, NULL, NULL ) != IVAS_ERR_INVALID_OUTPUT_FORMAT ) ) // VE: TBC +#else + if ( ( IVAS_REND_SetHeadRotation( hIvasRend, NULL ) != IVAS_ERR_OK ) && ( IVAS_REND_SetHeadRotation( hIvasRend, NULL ) != IVAS_ERR_INVALID_OUTPUT_FORMAT ) ) +#endif + { + fprintf( stderr, "Error setting Head Rotation: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } } for ( i = 0; i < args.inConfig.numMultiChannelBuses; ++i ) @@ -973,7 +1130,11 @@ int main( } } - IVAS_REND_GetSamples( hIvasRend, outBuffer ); + if ( IVAS_REND_GetSamples( hIvasRend, outBuffer ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error in getting samples\n" ); + exit( -1 ); + } int16_t num_out_channels; num_out_channels = outBuffer.config.numChannels; @@ -1065,6 +1226,12 @@ int main( AudioFileReader_close( &audioReader ); AudioFileWriter_close( &audioWriter ); HeadRotationFileReader_close( &headRotReader ); +#ifdef FIX_I109_ORIENTATION_TRACKING +#ifdef OTR_REFERENCE_VECTOR_TRACKING + Vector3PairFileReader_close( &referenceVectorReader ); +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ + HeadRotationFileReader_close( &referenceRotReader ); +#endif hrtfFileReader_close( &hrtfFileReader ); IVAS_REND_Close( &hIvasRend ); IsmPositionProvider_close( positionProvider ); @@ -1290,7 +1457,15 @@ static bool parseOrientationTracking( to_upper( value ); +#ifdef FIX_I109_ORIENTATION_TRACKING + if ( strcmp( value, "NONE" ) == 0 ) + { + *tracking_type = IVAS_ORIENT_TRK_NONE; + } + else if ( strcmp( value, "REF" ) == 0 ) +#else if ( strcmp( value, "REF" ) == 0 ) +#endif { *tracking_type = IVAS_ORIENT_TRK_REF; } @@ -1298,6 +1473,18 @@ static bool parseOrientationTracking( { *tracking_type = IVAS_ORIENT_TRK_AVG; } +#ifdef FIX_I109_ORIENTATION_TRACKING +#ifdef OTR_REFERENCE_VECTOR_TRACKING + else if ( strcmp( value, "REF_VEC" ) == 0 ) + { + *tracking_type = IVAS_ORIENT_TRK_REF_VEC; + } + else if ( strcmp( value, "REF_VEC_LEV" ) == 0 ) + { + *tracking_type = IVAS_ORIENT_TRK_REF_VEC_LEV; + } +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ +#endif else { fprintf( stderr, "Error: Invalid orientation tracking type %s \n\n", value ); @@ -1515,10 +1702,20 @@ static CmdlnArgs defaultArgs( args.numInMetadataFiles = 0; clearString( args.headRotationFilePath ); +#ifdef FIX_I109_ORIENTATION_TRACKING +#ifdef OTR_REFERENCE_VECTOR_TRACKING + clearString( args.referenceVectorFilePath ); +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ + clearString( args.referenceRotationFilePath ); +#endif clearString( args.customHrtfFilePath ); clearString( args.renderConfigFilePath ); +#ifdef FIX_I109_ORIENTATION_TRACKING + args.orientationTracking = IVAS_ORIENT_TRK_NONE; +#else args.orientationTracking = IVAS_ORIENT_TRK_REF; +#endif args.noDiegeticPan = 0.0f; args.delayCompensationEnabled = true; @@ -1593,6 +1790,18 @@ static void parseOption( assert( numOptionValues == 1 ); strncpy( args->headRotationFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); break; +#ifdef FIX_I109_ORIENTATION_TRACKING +#ifdef OTR_REFERENCE_VECTOR_TRACKING + case CmdLnOptionId_referenceVectorFile: + assert( numOptionValues == 1 ); + strncpy( args->referenceVectorFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); + break; +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ + case CmdLnOptionId_refRotFile: + assert( numOptionValues == 1 ); + strncpy( args->referenceRotationFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); + break; +#endif case CmdLnOptionId_customHrtfFile: assert( numOptionValues == 1 ); strncpy( args->customHrtfFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); @@ -1709,12 +1918,17 @@ void getMetadataFromFileReader( if ( ( error = IsmFileReader_readNextFrame( ismReader, &ismMetadata ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "\nError (%s) while reading ism metadata from: %s\n\n", ivas_error_to_string( error ), IsmFileReader_getFilePath( ismReader ) ); + fprintf( stderr, "\nError (%s) while reading ISM metadata from: %s\n\n", ivas_error_to_string( error ), IsmFileReader_getFilePath( ismReader ) ); exit( -1 ); } objectMetadataBuffer->positions[objIdx].azimuth = ismMetadata.azimuth; objectMetadataBuffer->positions[objIdx].elevation = ismMetadata.elevation; +#ifdef TD5 + objectMetadataBuffer->positions[objIdx].radius = ismMetadata.radius; + objectMetadataBuffer->positions[objIdx].yaw = ismMetadata.yaw; + objectMetadataBuffer->positions[objIdx].pitch = ismMetadata.pitch; +#endif return; } @@ -1769,6 +1983,11 @@ static void IsmPositionProvider_getNextFrame( { objectMetadataBuffer->positions[objIdx].azimuth = 0.0f; objectMetadataBuffer->positions[objIdx].elevation = 0.0f; +#ifdef TD5 + objectMetadataBuffer->positions[objIdx].radius = 1.0f; + objectMetadataBuffer->positions[objIdx].yaw = 0.0f; + objectMetadataBuffer->positions[objIdx].pitch = 0.0f; +#endif } /* Wrap azimuth to lie within (-180, 180] range */ @@ -1783,6 +2002,20 @@ static void IsmPositionProvider_getNextFrame( /* Clamp elevation to lie within [-90, 90] range (can't be wrapped easily) */ objectMetadataBuffer->positions[objIdx].elevation = min( max( objectMetadataBuffer->positions[objIdx].elevation, -90 ), 90 ); +#ifdef TD5 + /* Wrap yaw to lie within (-180, 180] range */ + while ( objectMetadataBuffer->positions[objIdx].yaw < 0.0f ) + { + objectMetadataBuffer->positions[objIdx].yaw += 360.0f; + } + while ( objectMetadataBuffer->positions[objIdx].yaw >= 360.0f ) + { + objectMetadataBuffer->positions[objIdx].yaw -= 360.0f; + } + + /* Clamp pitch to lie within [-90, 90] range (can't be wrapped easily) */ + objectMetadataBuffer->positions[objIdx].pitch = min( max( objectMetadataBuffer->positions[objIdx].pitch, -90 ), 90 ); +#endif } ++positionProvider->frameCounter; @@ -2017,6 +2250,28 @@ static void parseObjectPosition( uint16_t *positionDuration ) { char *endptr; +#ifdef TD5 + int16_t read_values; + float meta_prm[7] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f }; + + readNextMetadataChunk( line, "," ); + *positionDuration = (uint16_t) strtol( line, &endptr, 10 ); + readNextMetadataChunk( line, "\n" ); + + read_values = (int16_t) sscanf( line, "%f,%f,%f,%f,%f,%f,%f", &meta_prm[0], &meta_prm[1], &meta_prm[2], &meta_prm[3], &meta_prm[4], &meta_prm[5], &meta_prm[6] ); + + if ( read_values < 2 ) + { + fprintf( stderr, "Error reading metadata\n" ); + exit( -1 ); + } + + position->azimuth = meta_prm[0]; + position->elevation = meta_prm[1]; + position->radius = meta_prm[2]; + position->yaw = meta_prm[5]; + position->pitch = meta_prm[6]; +#else readNextMetadataChunk( line, "," ); *positionDuration = (uint16_t) strtol( line, &endptr, 10 ); @@ -2043,7 +2298,7 @@ static void parseObjectPosition( fprintf( stderr, "Error reading metadata\n" ); exit( -1 ); } - +#endif return; } diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index c28c04112b..e5f72590a6 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -62,11 +62,6 @@ FILE *FEC_pattern = NULL; /* FEC pattern file (for simulation of FEC) */ #endif -#ifdef IND_LIST_DYN -#define STEP_MAX_NUM_INDICES 20 /* increase the maximum number of allowed indices in the list by this amount */ -#endif - -#ifndef IND_LIST_DYN /*-------------------------------------------------------------------* * pack_bit() * @@ -120,7 +115,6 @@ static Word16 unpack_bit( return bit; } -#endif /*-------------------------------------------------------------------* * rate2AMRWB_IOmode() @@ -220,238 +214,6 @@ Word16 rate2EVSmode( return rate2AMRWB_IOmode( brate ); } -#ifdef IND_LIST_DYN -/*-------------------------------------------------------------------* - * ind_list_realloc() - * - * Re-allocate the list of indices as the maximum number of allowed indices has changed - *-------------------------------------------------------------------*/ - -ivas_error ind_list_realloc( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - int16_t max_num_indices /* i : new maximum number of allowed indices in the list */ -) -{ - int16_t i; - INDICE_HANDLE new_ind_list; - - /* allocate new buffer of indices */ - if ( ( new_ind_list = (INDICE_HANDLE) malloc( max_num_indices * sizeof( Indice ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); - } - - /* move indices from the old list to the new list */ - i = 0; - while ( hBstr->ind_list[i].nb_bits > 0 ) - { - new_ind_list[i].id = hBstr->ind_list[i].id; - new_ind_list[i].value = hBstr->ind_list[i].value; - new_ind_list[i].nb_bits = hBstr->ind_list[i].nb_bits; - i++; - } - - /* reset nb_bits of all other indices to -1 */ - for ( ; i < max_num_indices; i++ ) - { - new_ind_list[i].nb_bits = -1; - } - - /* free the old list */ - free( hBstr->ind_list ); - - /* set pointer to the new list */ - hBstr->ind_list = new_ind_list; - - /* set the new maximum for the allowed number of indices */ - hBstr->max_num_indices = max_num_indices; - - return IVAS_ERR_OK; -} - - -/*-----------------------------------------------------------------------* - * get_max_num_indices() - * - * Set the maximum allowed number of indices in the list - *-----------------------------------------------------------------------*/ - -int16_t get_max_num_indices( /* o : maximum number of indices */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const int32_t total_brate /* i : total bitrate */ -) -{ - /* set the maximum required number of indices */ - if ( ivas_format == MONO_FORMAT ) - { - if ( total_brate < IVAS_24k4 ) - { - return 450; - } - else - { - return 450; - } - } - else if ( ivas_format == STEREO_FORMAT ) - { - if ( total_brate < IVAS_24k4 ) - { - return 250; - } - else if ( total_brate < IVAS_128k ) - { - return 450; - } - else - { - return 550; - } - } - else if ( ivas_format == ISM_FORMAT ) - { - if ( total_brate < IVAS_24k4 ) - { - return 250; - } - else if ( total_brate < IVAS_128k ) - { - return 450; - } - else - { - return 700; - } - } - else if ( ivas_format == SBA_FORMAT ) - { - if ( total_brate < IVAS_24k4 ) - { - return 250; - } - else if ( total_brate < IVAS_128k ) - { - return 450; - } - else - { - return 700; - } - } - else if ( ivas_format == MASA_FORMAT ) - { - if ( total_brate < IVAS_24k4 ) - { - return 250; - } - else if ( total_brate < IVAS_160k ) - { - return 450; - } - else - { - return 700; - } - } - else if ( ivas_format == MC_FORMAT ) - { - if ( total_brate < IVAS_24k4 ) - { - return 450; - } - else - { - return 1050; - } - } - - return 1050; -} - -#ifdef IND_LIST_DYN -/*-----------------------------------------------------------------------* - * set_max_set_max_num_indices_metadatanum_indices() - * - * Set the maximum allowed number of metadata indices in the list - *-----------------------------------------------------------------------*/ - -int16_t get_max_num_indices_metadata( /* o : maximum number of indices */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const int32_t ivas_total_brate /* i : IVAS total bitrate */ -) -{ - /* set the maximum required number of metadata indices */ - if ( ivas_format == MONO_FORMAT ) - { - return 0; - } - else if ( ivas_format == STEREO_FORMAT ) - { - return 80; - } - else if ( ivas_format == ISM_FORMAT ) - { - return 60; - } - else if ( ivas_format == SBA_FORMAT ) - { - if ( ivas_total_brate < IVAS_24k4 ) - { - return 80; - } - else if ( ivas_total_brate < IVAS_48k ) - { - return 670; - } - else - { - return 1060; - } - } - else if ( ivas_format == MASA_FORMAT ) - { - if ( ivas_total_brate < IVAS_32k ) - { - return 90; - } - else if ( ivas_total_brate < IVAS_48k ) - { - return 130; - } - else if ( ivas_total_brate < IVAS_192k ) - { - return 330; - } - else if ( ivas_total_brate < IVAS_384k ) - { - return 1000; - } - else - { - return 1950; - } - } - else if ( ivas_format == MC_FORMAT ) - { - if ( ivas_total_brate == IVAS_32k || ivas_total_brate == IVAS_48k || ivas_total_brate == IVAS_64k ) - { - return 300; - } - if ( ivas_total_brate == IVAS_80k || ivas_total_brate == IVAS_96k ) - { - return 170; - } - else - { - return 90; - } - } - - return 1050; -} -#endif -#endif - /*-------------------------------------------------------------------* * push_indice() * @@ -475,9 +237,6 @@ ivas_error push_indice( ) { int16_t i; -#ifdef IND_LIST_DYN - int16_t j; -#endif ivas_error error; error = IVAS_ERR_OK; @@ -504,48 +263,12 @@ ivas_error push_indice( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Indice ID = %d with value %d is trying to allocate %d bits which exceeds 16 bits (frame %d) !\n", id, value, nb_bits, frame ); } -#ifndef IND_LIST_DYN if ( id >= MAX_NUM_INDICES ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Indice ID = %d exceeds the total number of indices: %d (frame %d) !\n", id, MAX_NUM_INDICES, frame ); } #endif -#endif -#ifdef IND_LIST_DYN - /* check, if the maximum number of indices has been reached and re-allocate the buffer */ - /* the re-allocation can be avoided by increasing the limits in get_max_num_indices() and get_max_num_indices_metadata() */ - if ( hBstr->nb_ind_tot >= hBstr->max_num_indices ) - { -#ifdef DEBUGGING - DEBUG_LINE( 1 ) - printf( "Warning: Maximum number of indices %d has been exceeded (frame %d)! Increase the limits in get_max_num_indices() or get_max_num_indices_metadata().\n", hBstr->max_num_indices, frame ); -#endif - - /* reallocate the buffer of indices with increased limit */ - ind_list_realloc( hBstr, hBstr->nb_ind_tot + STEP_MAX_NUM_INDICES ); - } -#endif - -#ifdef IND_LIST_DYN - /* find the location in the list of indices */ - i = hBstr->nb_ind_tot; - while ( i > 0 && id < hBstr->ind_list[i - 1].id ) - { - i--; - } - - /* shift indices, if the new id is to be written somewhere inside the list */ - if ( i < hBstr->nb_ind_tot ) - { - for ( j = hBstr->nb_ind_tot; j > i; j-- ) - { - hBstr->ind_list[j].id = hBstr->ind_list[j - 1].id; - hBstr->ind_list[j].nb_bits = hBstr->ind_list[j - 1].nb_bits; - hBstr->ind_list[j].value = hBstr->ind_list[j - 1].value; - } - } -#else if ( hBstr->last_ind == id ) { /* indice with the same name as the previous one */ @@ -560,31 +283,21 @@ ivas_error push_indice( i++; } } -#endif -#ifndef IND_LIST_DYN #ifdef DEBUGGING if ( hBstr->ind_list[i].nb_bits > 0 ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Indice ID = %d with value %d is trying to re-write an existing indice (frame %d) !\n", id, value, frame ); } -#endif #endif /* store the new indice in the list */ -#ifdef IND_LIST_DYN - hBstr->ind_list[i].id = id; -#endif hBstr->ind_list[i].value = value; hBstr->ind_list[i].nb_bits = nb_bits; /* updates */ -#ifdef IND_LIST_DYN - hBstr->nb_ind_tot++; -#else hBstr->next_ind = i + 1; hBstr->last_ind = id; -#endif hBstr->nb_bits_tot += nb_bits; return error; @@ -611,9 +324,6 @@ ivas_error push_next_indice( #endif ) { -#ifdef IND_LIST_DYN - int16_t prev_id; -#endif ivas_error error; error = IVAS_ERR_OK; @@ -632,7 +342,6 @@ ivas_error push_next_indice( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Indice with value %d is trying to allocate %d bits which exceeds 16 bits !\n", value, nb_bits ); } -#ifndef IND_LIST_DYN if ( hBstr->next_ind >= MAX_NUM_INDICES ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Total number of indices exceeded: %d !\n", MAX_NUM_INDICES ); @@ -643,54 +352,16 @@ ivas_error push_next_indice( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Indice with value %d is trying to re-write an existing indice (frame %d) !\n", value, frame ); } #endif -#endif - -#ifdef IND_LIST_DYN - /* check, if the maximum number of indices has been reached and re-allocate the buffer */ - /* the re-allocation can be avoided by increasing the limits in get_max_num_indices() and get_max_num_indices_metadata() */ - if ( hBstr->nb_ind_tot >= hBstr->max_num_indices ) - { -#ifdef DEBUGGING - DEBUG_LINE( 1 ) - printf( "Warning: Maximum number of indices %d has been exceeded (frame %d)! Increase the limits in get_max_num_indices() or get_max_num_indices_metadata().\n", hBstr->max_num_indices, frame ); -#endif - - /* reallocate the buffer of indices with increased limit */ - ind_list_realloc( hBstr, hBstr->nb_ind_tot + STEP_MAX_NUM_INDICES ); - } -#endif - - -#ifdef IND_LIST_DYN - /* get the id of the previous indice -> it will be re-used */ - if ( hBstr->nb_ind_tot > 0 ) - { - prev_id = hBstr->ind_list[hBstr->nb_ind_tot - 1].id; - } - else - { - prev_id = 0; - } -#endif /* store the values in the list */ -#ifdef IND_LIST_DYN - hBstr->ind_list[hBstr->nb_ind_tot].id = prev_id; - hBstr->ind_list[hBstr->nb_ind_tot].value = value; - hBstr->ind_list[hBstr->nb_ind_tot].nb_bits = nb_bits; -#else hBstr->ind_list[hBstr->next_ind].value = value; hBstr->ind_list[hBstr->next_ind].nb_bits = nb_bits; -#endif - - /* updates */ -#ifdef IND_LIST_DYN - hBstr->nb_ind_tot++; -#else hBstr->next_ind++; -#endif + + /* update the total number of bits already written */ hBstr->nb_bits_tot += nb_bits; + return error; } @@ -718,28 +389,10 @@ void push_next_bits( uint16_t code; int16_t i, nb_bits_m15; Indice *ptr; -#ifdef IND_LIST_DYN - int16_t prev_id; -#endif #ifdef DEBUG_BS_READ_WRITE printf( "%s: %d: %d\n", func, line, nb_bits ); #endif - -#ifdef IND_LIST_DYN - ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; - - /* get the id of the previous indice -> will be re-used here as well */ - if ( hBstr->nb_ind_tot > 0 ) - { - prev_id = hBstr->ind_list[hBstr->nb_ind_tot - 1].id; - } - else - { - prev_id = 0; - } -#else ptr = &hBstr->ind_list[hBstr->next_ind]; -#endif nb_bits_m15 = nb_bits - 15; for ( i = 0; i < nb_bits_m15; i += 16 ) @@ -751,29 +404,8 @@ void push_next_bits( printf( "code: %d\n", code ); #endif ptr->nb_bits = 16; -#ifdef IND_LIST_DYN - ptr->id = prev_id; - hBstr->nb_ind_tot++; -#endif - -#ifdef IND_LIST_DYN - /* check, if the maximum number of indices has been reached and re-allocate the buffer */ - /* the re-allocation can be avoided by increasing the limits in get_max_num_indices() and get_max_num_indices_metadata() */ - if ( hBstr->nb_ind_tot >= hBstr->max_num_indices ) - { -#ifdef DEBUGGING - DEBUG_LINE( 1 ) - printf( "Warning: Maximum number of indices %d has been exceeded (frame %d)! Increase the limits in get_max_num_indices() or get_max_num_indices_metadata().\n", hBstr->max_num_indices, frame ); -#endif - - /* reallocate the buffer of indices with increased limit */ - ind_list_realloc( hBstr, hBstr->nb_ind_tot + STEP_MAX_NUM_INDICES ); - } -#endif - ++ptr; } - for ( ; i < nb_bits; ++i ) { ptr->value = bits[i]; @@ -781,118 +413,15 @@ void push_next_bits( printf( "value: %d\n", ptr->value ); #endif ptr->nb_bits = 1; -#ifdef IND_LIST_DYN - ptr->id = prev_id; - hBstr->nb_ind_tot++; -#endif - -#ifdef IND_LIST_DYN - /* check, if the maximum number of indices has been reached and re-allocate the buffer */ - /* the re-allocation can be avoided by increasing the limits in get_max_num_indices() and get_max_num_indices_metadata() */ - if ( hBstr->nb_ind_tot >= hBstr->max_num_indices ) - { -#ifdef DEBUGGING - DEBUG_LINE( 1 ) - printf( "Warning: Maximum number of indices %d has been exceeded (frame %d)! Increase the limits in get_max_num_indices() or get_max_num_indices_metadata().\n", hBstr->max_num_indices, frame ); -#endif - - /* reallocate the buffer of indices with increased limit */ - ind_list_realloc( hBstr, hBstr->nb_ind_tot + STEP_MAX_NUM_INDICES ); - } -#endif - ++ptr; } - -#ifndef IND_LIST_DYN hBstr->next_ind = (int16_t) ( ptr - hBstr->ind_list ); -#endif hBstr->nb_bits_tot = hBstr->nb_bits_tot + nb_bits; return; } -#ifdef IND_LIST_DYN -/*-------------------------------------------------------------------* - * find_indice() - * - * Find indice based on its id - *-------------------------------------------------------------------*/ - -/*! r: result: index of the indice in the list, -1 if not found */ -int16_t find_indice( - BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ - int16_t id, /* i : ID of the indice */ - uint16_t *value, /* o : value of the quantized indice */ - int16_t *nb_bits /* o : number of bits used to quantize the indice */ -) -{ - int16_t i; - - for ( i = 0; i < hBstr->nb_ind_tot; i++ ) - { - if ( hBstr->ind_list[i].id == id && hBstr->ind_list[i].nb_bits > 0 ) - { - *value = hBstr->ind_list[i].value; - *nb_bits = hBstr->ind_list[i].nb_bits; - return i; - } - } - - return -1; -} - -/*-------------------------------------------------------------------* - * delete_indice() - * - * Delete indice based on its id (note, that nb_ind_tot and nb_bits_tot are updated) - *-------------------------------------------------------------------*/ - -/*! r: number of deleted indices */ -uint16_t delete_indice( - BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ - int16_t id /* i : ID of the indice */ -) -{ - int16_t i, j; - - j = 0; - for ( i = 0; i < hBstr->nb_ind_tot; i++ ) - { - if ( hBstr->ind_list[i].id == id ) - { - hBstr->nb_bits_tot -= hBstr->ind_list[i].nb_bits; - continue; - } - - if ( j < i ) - { - /* shift the indice left */ - hBstr->ind_list[j].id = hBstr->ind_list[i].id; - hBstr->ind_list[j].value = hBstr->ind_list[i].value; - hBstr->ind_list[j].nb_bits = hBstr->ind_list[i].nb_bits; - } - - j++; - } - - hBstr->nb_ind_tot = j; -#ifndef IND_LIST_DYN - hBstr->next_ind = j; -#endif - - for ( ; j < i; j++ ) - { - /* reset the shifted indices at the end of the list */ - hBstr->ind_list[j].nb_bits = -1; - } - - return i - j; -} -#endif - - /*-------------------------------------------------------------------* * get_next_indice() * @@ -1109,14 +638,8 @@ void reset_indices_enc( int16_t i; hBstr->nb_bits_tot = 0; -#ifdef IND_LIST_DYN - hBstr->nb_ind_tot = 0; -#else hBstr->next_ind = 0; -#endif -#ifndef IND_LIST_DYN hBstr->last_ind = -1; -#endif for ( i = 0; i < max_num_indices; i++ ) { @@ -1147,11 +670,7 @@ void reset_indices_dec( *-------------------------------------------------------------------*/ static int16_t write_indices_to_stream( -#ifdef IND_LIST_DYN - Indice *ind_list, -#else Indice *ind_list_metadata, -#endif uint16_t **pt_stream, const int16_t inc, const int16_t num_indices ) @@ -1165,13 +684,8 @@ static int16_t write_indices_to_stream( for ( i = 0; i < num_indices; i++ ) { -#ifdef IND_LIST_DYN - value = ind_list[i].value; - nb_bits = ind_list[i].nb_bits; -#else value = ind_list_metadata[i].value; nb_bits = ind_list_metadata[i].nb_bits; -#endif if ( nb_bits > 0 ) { @@ -1203,10 +717,6 @@ static int16_t write_indices_to_stream( { /* fprintf( stderr, "Warning: %s: nb_bits == 0!\n", __func__ ); */ } - else - { - /* fprintf( stderr, "Warning: %s: nb_bits == %d!\n", __func__, nb_bits ); */ - } #endif } #ifdef ENABLE_BITRATE_VERIFICATION @@ -1235,10 +745,6 @@ static ivas_error write_indices_element( uint16_t *pt_stream_backup; uint16_t *pt_stream_end; int16_t nb_bits_tot_metadata; -#ifdef IND_LIST_DYN - int16_t nb_ind_tot_metadata; -#endif - Indice *ind_list_metadata; int16_t n, n_channels; #ifdef ENABLE_BITRATE_VERIFICATION @@ -1249,9 +755,6 @@ static ivas_error write_indices_element( error = IVAS_ERR_OK; ind_list_metadata = NULL; -#ifdef IND_LIST_DYN - nb_ind_tot_metadata = 0; -#endif if ( st_ivas->hEncoderConfig->ivas_format == MONO_FORMAT ) { @@ -1269,9 +772,6 @@ static ivas_error write_indices_element( { nb_bits_tot_metadata = st_ivas->hSCE[element_id]->hMetaData->nb_bits_tot; ind_list_metadata = st_ivas->hSCE[element_id]->hMetaData->ind_list; -#ifdef IND_LIST_DYN - nb_ind_tot_metadata = st_ivas->hSCE[element_id]->hMetaData->nb_ind_tot; -#endif } } else if ( !is_SCE && st_ivas->hCPE[element_id] != NULL ) @@ -1282,9 +782,6 @@ static ivas_error write_indices_element( { nb_bits_tot_metadata = st_ivas->hCPE[element_id]->hMetaData->nb_bits_tot; ind_list_metadata = st_ivas->hCPE[element_id]->hMetaData->ind_list; -#ifdef IND_LIST_DYN - nb_ind_tot_metadata = st_ivas->hCPE[element_id]->hMetaData->nb_ind_tot; -#endif } } #ifdef DEBUGGING @@ -1325,13 +822,7 @@ static ivas_error write_indices_element( #ifdef ENABLE_BITRATE_VERIFICATION total_nb_bits = #endif - write_indices_to_stream( ind_list_metadata, &pt_stream_loc, -1, -#ifdef IND_LIST_DYN - nb_ind_tot_metadata -#else - MAX_BITS_METADATA -#endif - ); + write_indices_to_stream( ind_list_metadata, &pt_stream_loc, -1, MAX_BITS_METADATA ); #ifdef ENABLE_BITRATE_VERIFICATION if ( total_nb_bits != nb_bits_tot_metadata ) @@ -1351,13 +842,7 @@ static ivas_error write_indices_element( #ifdef ENABLE_BITRATE_VERIFICATION total_nb_bits = #endif - write_indices_to_stream( sts[n]->hBstr->ind_list, &pt_stream_loc, 1, -#ifdef IND_LIST_DYN - sts[n]->hBstr->nb_ind_tot -#else - MAX_NUM_INDICES -#endif - ); + write_indices_to_stream( sts[n]->hBstr->ind_list, &pt_stream_loc, 1, MAX_NUM_INDICES ); #ifdef ENABLE_BITRATE_VERIFICATION if ( total_nb_bits != sts[n]->hBstr->nb_bits_tot ) @@ -1380,41 +865,21 @@ static ivas_error write_indices_element( { if ( st_ivas->hSCE[element_id]->hMetaData != NULL ) { -#ifdef IND_LIST_DYN - reset_indices_enc( st_ivas->hSCE[element_id]->hMetaData, st_ivas->hSCE[element_id]->hMetaData->max_num_indices ); -#else reset_indices_enc( st_ivas->hSCE[element_id]->hMetaData, MAX_BITS_METADATA ); -#endif } - reset_indices_enc( sts[0]->hBstr, -#ifdef IND_LIST_DYN - sts[0]->hBstr->max_num_indices -#else - MAX_NUM_INDICES -#endif - ); + reset_indices_enc( sts[0]->hBstr, MAX_NUM_INDICES ); } else { if ( st_ivas->hCPE[element_id]->hMetaData != NULL ) { -#ifdef IND_LIST_DYN - reset_indices_enc( st_ivas->hCPE[element_id]->hMetaData, st_ivas->hCPE[element_id]->hMetaData->max_num_indices ); -#else reset_indices_enc( st_ivas->hCPE[element_id]->hMetaData, MAX_BITS_METADATA ); -#endif } for ( n = 0; n < n_channels; n++ ) { - reset_indices_enc( sts[n]->hBstr, -#ifdef IND_LIST_DYN - sts[n]->hBstr->max_num_indices -#else - MAX_NUM_INDICES -#endif - ); + reset_indices_enc( sts[n]->hBstr, MAX_NUM_INDICES ); } } @@ -1510,7 +975,7 @@ ivas_error write_indices_ivas( return error; } -#ifndef IND_LIST_DYN + /*-------------------------------------------------------------------* * indices_to_serial_generic() * @@ -1560,7 +1025,6 @@ void indices_to_serial_generic( return; } -#endif /*---------------------------------------------------------------------* * convertSerialToBytestream( ) diff --git a/lib_com/cldfb.c b/lib_com/cldfb.c index 931fbc723b..1490703aee 100644 --- a/lib_com/cldfb.c +++ b/lib_com/cldfb.c @@ -883,16 +883,19 @@ void deleteCldfb( { HANDLE_CLDFB_FILTER_BANK hs = *h_cldfb; - if ( hs ) + if ( h_cldfb == NULL || *h_cldfb == NULL ) { - if ( hs->cldfb_state ) - { - free( hs->cldfb_state ); - } - free( hs ); - *h_cldfb = NULL; + return; } + if ( hs->cldfb_state ) + { + free( hs->cldfb_state ); + } + + free( hs ); + *h_cldfb = NULL; + return; } diff --git a/lib_com/cnst.h b/lib_com/cnst.h index 4f03276837..db1dc3d898 100644 --- a/lib_com/cnst.h +++ b/lib_com/cnst.h @@ -449,9 +449,7 @@ enum IND_STEREO_2ND_CODER_T, IND_UNUSED, -#ifndef IND_LIST_DYN MAX_NUM_INDICES = IND_UNUSED + 772 /* Total 2640 in line with MAX_BITS_METADATA */ -#endif }; /*----------------------------------------------------------------------------------* diff --git a/lib_com/common_api_types.h b/lib_com/common_api_types.h index 8c1e1837f5..0ca4d6b461 100644 --- a/lib_com/common_api_types.h +++ b/lib_com/common_api_types.h @@ -78,6 +78,10 @@ typedef struct _IVAS_ISM_METADATA float radius; float spread; float gainFactor; +#ifdef TD5 + float yaw; + float pitch; +#endif } IVAS_ISM_METADATA; typedef struct @@ -86,6 +90,21 @@ typedef struct } IVAS_QUATERNION; +#ifdef OTR_REFERENCE_VECTOR_TRACKING +typedef struct +{ + float x, y, z; +} IVAS_VECTOR3; +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ + +#ifdef TD5 +typedef struct +{ + float x, y, z; + +} IVAS_POSITION; +#endif + typedef struct ivas_masa_metadata_frame_struct *IVAS_MASA_METADATA_HANDLE; #ifdef FIX_350_MASA_DELAY_COMP typedef struct ivas_masa_decoder_ext_out_meta_struct *MASA_DECODER_EXT_OUT_META_HANDLE; @@ -111,6 +130,11 @@ typedef struct { float azimuth; float elevation; +#ifdef TD5 + float radius; + float yaw; + float pitch; +#endif } IVAS_REND_AudioObjectPosition; typedef struct _IVAS_ROOM_ACOUSTICS_CONFIG @@ -132,6 +156,9 @@ typedef struct _IVAS_RENDER_CONFIG IVAS_RENDER_TYPE_OVERRIDE renderer_type_override; #endif IVAS_ROOM_ACOUSTICS_CONFIG_DATA room_acoustics; +#ifdef TD5 + float directivity[3]; +#endif } IVAS_RENDER_CONFIG_DATA, *IVAS_RENDER_CONFIG_HANDLE; typedef struct _IVAS_LS_CUSTOM_LAYOUT diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 94558bf90d..3f48b0b43e 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -176,13 +176,8 @@ typedef enum #define MAX_CPE ( MAX_TRANSPORT_CHANNELS / CPE_CHANNELS ) /* max. number of CPEs */ #define MAX_BITS_METADATA 2640 /* max. bit-budget of metadata, one channel */ /* IVAS_fmToDo: to be confirmed for final value once mature */ -#ifndef IND_LIST_DYN #define MAX_NUM_METADATA max( 2, MAX_NUM_OBJECTS ) /* number of max. metadata (now only 2 for DirAC) */ -#endif -#ifdef IND_LIST_DYN -#define MAX_NUM_IND_TEMP_LIST 10 /* maximum number of indices in the temporary list */ -#endif #define IVAS_ENC_DELAY_NS ACELP_LOOK_NS #define IVAS_DEC_DELAY_NS 3250000L /* 3.25 ms: IVAS decoder delay (without renderer delay) */ @@ -298,7 +293,7 @@ typedef enum /*----------------------------------------------------------------------------------* - * ISm Constants + * ISM Constants *----------------------------------------------------------------------------------*/ #define ISM_NB_BITS_METADATA_NOMINAL ( ( SCE_CORE_16k_LOW_LIMIT - ACELP_16k_LOW_LIMIT ) / FRAMES_PER_SEC ) /* nominal number of metadata bits - used for configuration of Core-Coder modules */ @@ -325,6 +320,14 @@ typedef enum #define ISM_Q_STEP 2.5f #define ISM_Q_STEP_BORDER 5.0f +#ifdef TD5 +#define ISM_RADIUS_NBITS 6 +#define ISM_RADIUS_MIN 0.0f +#define ISM_RADIUS_DELTA 0.25f /* Max radius = (2^ISM_RADIUS_NBITS-1)*0.25 = 15.75 */ +#define ISM_EXTENDED_METADATA_BRATE IVAS_64k +#define ISM_EXTENDED_METADATA_BITS 1 +#endif + /* Parametric ISM */ #define MAX_PARAM_ISM_NBANDS 11 #define MAX_PARAM_ISM_NBANDS_WB 9 @@ -338,12 +341,27 @@ typedef enum #define PARAM_ISM_MAX_CHAN 16 #define PARAM_ISM_HYS_BUF_SIZE 10 -#ifdef PARAM_ISM_DTX_CNG +/* ISM DTX */ +#ifdef DISCRETE_ISM_DTX_CNG +#define ISM_DTX_COH_SCA_BITS 4 +#else #define PARAM_ISM_DTX_COH_SCA_BITS 4 +#endif +#ifdef DISCRETE_ISM_DTX_CNG +#define ISM_DTX_AZI_BITS_HIGH 8 +#define ISM_DTX_ELE_BITS_HIGH 7 +#define ISM_Q_STEP_HIGH (ISM_Q_STEP / 2) +#define ISM_Q_STEP_BORDER_HIGH (ISM_Q_STEP_BORDER / 2) +#define ISM_DTX_AZI_BITS_LOW 6 +#define ISM_DTX_ELE_BITS_LOW 5 +#define ISM_Q_STEP_LOW (ISM_Q_STEP * 2) +#define ISM_Q_STEP_BORDER_LOW (ISM_Q_STEP_BORDER * 2) +#else #define PARAM_ISM_DTX_AZI_BITS 5 #define PARAM_ISM_DTX_ELE_BITS 4 #endif + typedef enum { ISM_MODE_NONE, @@ -352,28 +370,36 @@ typedef enum } ISM_MODE; -/* ISm metadata bitstream */ +/* ISM metadata bitstream */ enum { IND_ISM_NUM_OBJECTS, +#ifdef TD5 + IND_ISM_EXTENDED_FLAG = IND_ISM_NUM_OBJECTS + MAX_NUM_OBJECTS, + IND_ISM_METADATA_FLAG = IND_ISM_EXTENDED_FLAG + MAX_NUM_OBJECTS, /* EN2VE: Is this not supposed to be in the loop part below, since it is one per ISM? */ +#else IND_ISM_METADATA_FLAG = IND_ISM_NUM_OBJECTS + MAX_NUM_OBJECTS, +#endif IND_ISM_VAD_FLAG = IND_ISM_METADATA_FLAG + MAX_NUM_OBJECTS, -#ifdef PARAM_ISM_DTX_CNG +#ifdef DISCRETE_ISM_DTX_CNG + IND_ISM_NOISY_SPEECH_FLAG = IND_ISM_VAD_FLAG + MAX_NUM_OBJECTS, + IND_ISM_SCE_ID_DTX, +#else IND_ISM_SCE_ID_DTX = IND_ISM_VAD_FLAG + MAX_NUM_OBJECTS, IND_ISM_NOISY_SPEECH_FLAG, - IND_ISM_DTX_COH_SCA, #endif + IND_ISM_DTX_COH_SCA, /* ------------- loop for objects -------------- */ -#ifdef PARAM_ISM_DTX_CNG TAG_ISM_LOOP_START = IND_ISM_DTX_COH_SCA + MAX_NUM_OBJECTS, -#else - TAG_ISM_LOOP_START = IND_ISM_VAD_FLAG + MAX_NUM_OBJECTS, - #endif IND_ISM_AZIMUTH_DIFF_FLAG = TAG_ISM_LOOP_START, IND_ISM_AZIMUTH = TAG_ISM_LOOP_START, IND_ISM_ELEVATION_DIFF_FLAG = TAG_ISM_LOOP_START, IND_ISM_ELEVATION = TAG_ISM_LOOP_START, +#ifdef TD5 + IND_ISM_RADIUS_DIFF_FLAG = TAG_ISM_LOOP_START, + IND_ISM_RADIUS = TAG_ISM_LOOP_START, +#endif TAG_ISM_LOOP_END = TAG_ISM_LOOP_START + 100, /* IVAS_fmToDo: to be reviewed once the final metadata are defined */ /* --------- end of loop for objects ----------- */ @@ -938,6 +964,9 @@ typedef enum #ifdef FIX_350_MASA_DELAY_COMP #define DELAY_MASA_PARAM_DEC_SFR 2 /* Delay to be compensation for MASA parameters in the decoder (subframes) */ +#ifdef FIX_373_MASA_DELAY_COMP_MSAN +#define SPH_IDX_FRONT ( MASA_NO_POINTS_EQUATOR / 2 ) /* Spherical index corresponding to front direction for setting as default value */ +#endif #endif #define DIRAC_SLOT_NS 1250000L /* time duration of a time slot, 1.25ms (==DELAY_RENERER_NS/MAX_PARAM_SPATIAL_SUBFRAMES) */ @@ -1479,15 +1508,35 @@ typedef enum *----------------------------------------------------------------------------------*/ /* Orientation tracking types */ +#ifdef FIX_I109_ORIENTATION_TRACKING +#define IVAS_ORIENT_TRK_NONE 0 +#define IVAS_ORIENT_TRK_REF 1 +#define IVAS_ORIENT_TRK_AVG 2 +#ifdef OTR_REFERENCE_VECTOR_TRACKING +#define IVAS_ORIENT_TRK_REF_VEC 3 +#define IVAS_ORIENT_TRK_REF_VEC_LEV 4 +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ +#else #define IVAS_ORIENT_TRK_REF 0 #define IVAS_ORIENT_TRK_AVG 1 +#endif typedef enum { - OTR_TRACKING_NONE = IVAS_ORIENT_TRK_REF-1, /* track orientation relative to external reference orientation (default: yaw=pitch=roll=0) */ // VE: not really used in IVAS (only in unit-test) - OTR_TRACKING_REF_ORIENT = IVAS_ORIENT_TRK_REF, /* track orientation relative to external reference orientation (default: yaw=pitch=roll=0) */ +#ifdef FIX_I109_ORIENTATION_TRACKING + OTR_TRACKING_NONE = IVAS_ORIENT_TRK_NONE, +#else + OTR_TRACKING_NONE = IVAS_ORIENT_TRK_REF-1, +#endif + OTR_TRACKING_REF_ORIENT = IVAS_ORIENT_TRK_REF, /* track orientation relative to external reference orientation (default: no rotation) */ OTR_TRACKING_AVG_ORIENT = IVAS_ORIENT_TRK_AVG /* track orientation relative to average orientation */ - +#ifdef FIX_I109_ORIENTATION_TRACKING +#ifdef OTR_REFERENCE_VECTOR_TRACKING + , + OTR_TRACKING_REF_VEC = IVAS_ORIENT_TRK_REF_VEC, /* track orientation relative to external reference vector */ + OTR_TRACKING_REF_VEC_LEV = IVAS_ORIENT_TRK_REF_VEC_LEV /* track orientation relative to level component of external reference vector */ +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ +#endif } OTR_TRACKING_T; diff --git a/lib_com/ivas_cov_smooth.c b/lib_com/ivas_cov_smooth.c index 57f74fb70e..35ce6b8546 100644 --- a/lib_com/ivas_cov_smooth.c +++ b/lib_com/ivas_cov_smooth.c @@ -39,9 +39,7 @@ #include "wmc_auto.h" #include "prot.h" -#ifdef SMOOTH_WITH_TRANS_DET #define BAND_SMOOTH_REST_START_IDX ( 2 ) -#endif /*-----------------------------------------------------------------------------------------* * Function ivas_set_up_cov_smoothing() * @@ -52,19 +50,14 @@ static void ivas_set_up_cov_smoothing( ivas_cov_smooth_state_t *hCovState, ivas_filterbank_t *pFb, const float max_update_rate, - const int16_t min_pool_size -#ifdef COV_SMOOTH_TUNING - , + const int16_t min_pool_size, const int16_t nchan_inp /* i : number of input channels */ -#endif ) { int16_t j, k; -#ifdef COV_SMOOTH_TUNING if ( nchan_inp <= FOA_CHANNELS ) { -#endif for ( j = 0; j < pFb->filterbank_num_bands; j++ ) { float update_factor; @@ -82,8 +75,6 @@ static void ivas_set_up_cov_smoothing( hCovState->pSmoothing_factor[j] = max_update_rate; } } - -#ifdef COV_SMOOTH_TUNING } else { @@ -107,7 +98,6 @@ static void ivas_set_up_cov_smoothing( } } } -#endif hCovState->prior_bank_idx = -1; return; @@ -152,12 +142,8 @@ ivas_error ivas_spar_covar_smooth_enc_open( } } - ivas_set_up_cov_smoothing( hCovState, pFb, cov_smooth_cfg->max_update_rate, cov_smooth_cfg->min_pool_size -#ifdef COV_SMOOTH_TUNING - , - nchan_inp -#endif - ); + ivas_set_up_cov_smoothing( hCovState, pFb, cov_smooth_cfg->max_update_rate, cov_smooth_cfg->min_pool_size, + nchan_inp ); *hCovState_out = hCovState; @@ -218,25 +204,17 @@ static void ivas_compute_smooth_cov( const int16_t start_band, const int16_t end_band, const int16_t num_ch, -#ifdef SMOOTH_WITH_TRANS_DET - const int16_t transient_det[2] -#else - const int16_t transient_det -#endif -) + const int16_t transient_det[2] ) { int16_t i, j, k; int16_t prev_idx = hCovState->prior_bank_idx; float factor = 0; -#ifdef SMOOTH_WITH_TRANS_DET int16_t sm_b; int16_t non_sm_b_idx; sm_b = BAND_SMOOTH_REST_START_IDX; -#endif assert( end_band <= pFb->filterbank_num_bands ); -#ifdef SMOOTH_WITH_TRANS_DET if ( prev_idx == -1 || transient_det[1] == 1 ) { for ( i = 0; i < num_ch; i++ ) @@ -277,18 +255,6 @@ static void ivas_compute_smooth_cov( } } } -#else - if ( prev_idx == -1 || transient_det == 1 ) - { - for ( i = 0; i < num_ch; i++ ) - { - for ( k = start_band; k < end_band; k++ ) - { - pCov_buf[i][i][k] += ( hCovState->pSmoothing_factor[k] * fac ); - } - } - } -#endif else if ( prev_idx == 0 ) { for ( i = 0; i < num_ch; i++ ) @@ -329,12 +295,7 @@ void ivas_cov_smooth_process( const int16_t start_band, const int16_t end_band, const int16_t num_ch, -#ifdef SMOOTH_WITH_TRANS_DET - const int16_t transient_det[2] -#else - const int16_t transient_det -#endif -) + const int16_t transient_det[2] ) { int16_t i, j; int16_t num_bands = end_band - start_band; diff --git a/lib_com/ivas_error.h b/lib_com/ivas_error.h index 735086a7c1..9438ad44a1 100644 --- a/lib_com/ivas_error.h +++ b/lib_com/ivas_error.h @@ -86,6 +86,7 @@ typedef enum IVAS_ERR_ISM_FILE_READER_INVALID_METADATA_FORMAT, IVAS_ERR_ISM_INVALID_METADATA_VALUE, IVAS_ERR_INVALID_MASA_FORMAT_METADATA_FILE, + IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED, #ifdef DEBUGGING IVAS_ERR_INVALID_FORCE_MODE, #ifdef DEBUG_AGC_ENCODER_CMD_OPTION @@ -120,10 +121,8 @@ typedef enum IVAS_ERR_BITSTREAM_WRITER_INVALID_FORMAT, IVAS_ERR_BITSTREAM_READER_INVALID_DATA, IVAS_ERR_BITSTREAM_READER_INVALID_FORMAT, -#ifdef FIX_94_VERIFY_WAV_NUM_CHANNELS IVAS_ERR_NO_FILE_OPEN, IVAS_ERR_SAMPLING_RATE_UNKNOWN, -#endif /*----------------------------------------* * renderer (lib_rend only) * @@ -145,18 +144,7 @@ typedef enum static inline const char *ivas_error_to_string( ivas_error error_code ) { - /* For error categories that are likely to still have many changes to - * specific error codes, return one string per category */ - if ( ( error_code & 0xF000 ) == 0x1000 ) - { - return "API error"; - } - if ( ( error_code & 0xF000 ) == 0x2000 ) - { - return "data error"; - } - - /* For categories that are unlikely to change, use more specific strings */ + /* Try to match to a specific string */ switch ( error_code ) { case IVAS_ERR_OK: @@ -179,6 +167,8 @@ static inline const char *ivas_error_to_string( ivas_error error_code ) return "Wrong number of channels"; case IVAS_ERR_INVALID_BUFFER_SIZE: return "Invalid buffer size"; + case IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED: + return "Unsupported input/output config pair"; case IVAS_ERR_FAILED_FILE_OPEN: return "File open error"; case IVAS_ERR_FAILED_FILE_WRITE: @@ -193,6 +183,17 @@ static inline const char *ivas_error_to_string( ivas_error error_code ) break; } + /* For error categories that are likely to still have many changes to + * specific error codes, return one string per category */ + if ( ( error_code & 0xF000 ) == 0x1000 ) + { + return "API error"; + } + if ( ( error_code & 0xF000 ) == 0x2000 ) + { + return "data error"; + } + return "Unknown error"; } diff --git a/lib_com/ivas_fb_mixer.c b/lib_com/ivas_fb_mixer.c index c3389288de..3e0d68049a 100644 --- a/lib_com/ivas_fb_mixer.c +++ b/lib_com/ivas_fb_mixer.c @@ -174,11 +174,8 @@ ivas_error ivas_fb_set_cfg( ivas_error ivas_FB_mixer_open( IVAS_FB_MIXER_HANDLE *hFbMixer_out, /* i/o: FB mixer handle */ const int32_t sampling_rate, /* i : sampling rate */ - IVAS_FB_CFG *fb_cfg /* i : FB config. handle */ -#ifdef SBA_BR_SWITCHING_CLEAN_UP - , - const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ -#endif + IVAS_FB_CFG *fb_cfg, /* i : FB config. handle */ + const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ ) { IVAS_FB_MIXER_HANDLE hFbMixer; @@ -190,12 +187,10 @@ ivas_error ivas_FB_mixer_open( frame_len = (int16_t) ( sampling_rate / FRAMES_PER_SEC ); -#ifdef SBA_BR_SWITCHING_CLEAN_UP hFbMixer = *hFbMixer_out; if ( !spar_reconfig_flag ) { -#endif if ( ( hFbMixer = (IVAS_FB_MIXER_HANDLE) malloc( sizeof( IVAS_FB_MIXER_DATA ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FB mixer encoder" ); @@ -212,9 +207,7 @@ ivas_error ivas_FB_mixer_open( { hFbMixer->pFb = NULL; } -#ifdef SBA_BR_SWITCHING_CLEAN_UP } -#endif if ( fb_cfg->active_w_mixing == -1 ) { @@ -289,10 +282,8 @@ ivas_error ivas_FB_mixer_open( } } -#ifdef SBA_BR_SWITCHING_CLEAN_UP if ( !spar_reconfig_flag ) { -#endif if ( fb_cfg->num_out_chans > 0 ) { const int16_t *pActive_bins_per_band, *pActive_bins_per_band_abs, *pStart_offset, *pStart_offset_abs; @@ -341,25 +332,19 @@ ivas_error ivas_FB_mixer_open( /* ignore all the deeper filter bank stuff for now */ hFbMixer->num_diff_bands = 0; } -#ifdef SBA_BR_SWITCHING_CLEAN_UP } -#endif hFbMixer->fb_cfg = fb_cfg; -#ifdef SBA_BR_SWITCHING_CLEAN_UP set_s( hFbMixer->first_frame, 1, hFbMixer->fb_cfg->num_out_chans ); set_s( hFbMixer->first_frame + hFbMixer->fb_cfg->num_out_chans, 0, IVAS_SPAR_MAX_CH - hFbMixer->fb_cfg->num_out_chans ); if ( !spar_reconfig_flag ) { -#endif if ( ( error = ivas_filterbank_setup( hFbMixer, sampling_rate ) ) != IVAS_ERR_OK ) { return error; } -#ifdef SBA_BR_SWITCHING_CLEAN_UP } -#endif *hFbMixer_out = hFbMixer; @@ -375,11 +360,8 @@ ivas_error ivas_FB_mixer_open( void ivas_FB_mixer_close( IVAS_FB_MIXER_HANDLE *hFbMixer_in, /* i/o: FB mixer handle */ - const int32_t sampling_rate /* i : sampling rate in Hz */ -#ifdef SBA_BR_SWITCHING_CLEAN_UP - , - const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ -#endif + const int32_t sampling_rate, /* i : sampling rate in Hz */ + const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ ) { IVAS_FB_MIXER_HANDLE hFbMixer; @@ -439,10 +421,8 @@ void ivas_FB_mixer_close( hFbMixer->prior_mixer[0][0] = NULL; } -#ifdef SBA_BR_SWITCHING_CLEAN_UP if ( !spar_reconfig_flag ) { -#endif if ( fb_cfg->num_out_chans > 0 ) { num_bands = hFbMixer->pFb->filterbank_num_bands; @@ -476,9 +456,7 @@ void ivas_FB_mixer_close( free( hFbMixer->pFb ); hFbMixer->pFb = NULL; } -#ifdef SBA_BR_SWITCHING_CLEAN_UP } -#endif if ( hFbMixer->fb_cfg != NULL ) { @@ -486,15 +464,11 @@ void ivas_FB_mixer_close( hFbMixer->fb_cfg = NULL; } -#ifdef SBA_BR_SWITCHING_CLEAN_UP if ( !spar_reconfig_flag ) { -#endif free( hFbMixer ); hFbMixer = NULL; -#ifdef SBA_BR_SWITCHING_CLEAN_UP } -#endif } return; @@ -1074,10 +1048,6 @@ static ivas_error ivas_filterbank_setup( IVAS_FB_CFG *pCfg = hFbMixer->fb_cfg; error = IVAS_ERR_OK; -#ifndef SBA_BR_SWITCHING_CLEAN_UP - set_s( hFbMixer->first_frame, 1, pCfg->num_out_chans ); - set_s( hFbMixer->first_frame + pCfg->num_out_chans, 0, IVAS_SPAR_MAX_CH - pCfg->num_out_chans ); -#endif if ( pCfg->num_out_chans > 0 ) { diff --git a/lib_com/ivas_ism_config.c b/lib_com/ivas_ism_com.c similarity index 73% rename from lib_com/ivas_ism_config.c rename to lib_com/ivas_ism_com.c index b22d82a9da..cdcb3a9b1c 100644 --- a/lib_com/ivas_ism_config.c +++ b/lib_com/ivas_ism_com.c @@ -37,6 +37,7 @@ #include "rom_com.h" #include "prot.h" #include "ivas_prot.h" +#include "ivas_stat_com.h" #include "ivas_rom_com.h" #ifdef DEBUGGING #include "debug.h" @@ -50,7 +51,7 @@ #define FRMS_PER_SECOND ( 1000000000 / FRAME_SIZE_NS ) -#define BRATE_ISM_INACTIVE 2450 /* CoreCoder bitrate in ISm inactive frames */ +#define BRATE_ISM_INACTIVE 2450 /* CoreCoder bitrate in ISM inactive frames */ #define BITS_ISM_INACTIVE ( BRATE_ISM_INACTIVE / FRMS_PER_SECOND ) #define BETA_ISM_LOW_IMP 0.6f @@ -87,15 +88,15 @@ static void bitbudget_to_brate( *-------------------------------------------------------------------*/ ivas_error ivas_ism_config( - const int32_t ism_total_brate, /* i : ISms total bitrate */ - const int16_t nchan_transport, /* i : number of transport channels */ - const int16_t num_obj, /* i : number of objects */ - ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ - const int16_t localVAD[MAX_NUM_OBJECTS], /* i : local VAD flag */ - const int16_t ism_imp[], /* i : ISM importance flags */ - int32_t element_brate[], /* o : element bitrate per object */ - int32_t total_brate[], /* o : total bitrate per object */ - int16_t nb_bits_metadata[] /* i/o: number of metadata bits */ + const int32_t ism_total_brate, /* i : ISM total bitrate */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int16_t nchan_ism, /* i : number of objects */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + const int16_t localVAD[MAX_NUM_OBJECTS], /* i : local VAD flag */ + const int16_t ism_imp[], /* i : ISM importance flags */ + int32_t element_brate[], /* o : element bitrate per object */ + int32_t total_brate[], /* o : total bitrate per object */ + int16_t nb_bits_metadata[] /* i/o: number of metadata bits */ ) { int16_t ch; @@ -128,10 +129,16 @@ ivas_error ivas_ism_config( bits_element[n_ISms - 1] += bits_ism % n_ISms; bitbudget_to_brate( bits_element, element_brate, n_ISms ); - /* count ISm common signaling bits */ + /* count ISM common signaling bits */ if ( hIsmMeta != NULL ) { - nb_bits_metadata[0] += n_ISms * ISM_METADATA_FLAG_BITS + num_obj; +#ifdef TD5 + if ( ism_total_brate >= ISM_EXTENDED_METADATA_BRATE ) + { + nb_bits_metadata[0] += ISM_EXTENDED_METADATA_BITS; + } +#endif + nb_bits_metadata[0] += n_ISms * ISM_METADATA_FLAG_BITS + nchan_ism; for ( ch = 0; ch < n_ISms; ch++ ) { @@ -289,7 +296,7 @@ ivas_error ivas_ism_config( #ifdef DEBUGGING if ( bits_CoreCoder[ch] == SID_2k40 / FRAMES_PER_SEC ) { - printf( "\nWarning: ISm bitbudget equal to SID!\n" ); + printf( "\nWarning: ISM bitbudget equal to SID!\n" ); } #endif break; @@ -308,7 +315,7 @@ ivas_error ivas_ism_config( tmpL = sum_l( total_brate, n_ISms ) + bits_side * FRMS_PER_SECOND; if ( sum_l( element_brate, n_ISms ) != tmpL ) { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "\nError: Mismatch in ISm bit-budget distribution. Exiting!\n" ); + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "\nError: Mismatch in ISM bit-budget distribution. Exiting!\n" ); } } #endif @@ -320,7 +327,7 @@ ivas_error ivas_ism_config( /*-------------------------------------------------------------------* * ivas_ism_reset_metadata() * - * Reset ISm metadata parameters + * Reset ISM metadata parameters *-------------------------------------------------------------------*/ void ivas_ism_reset_metadata( @@ -329,15 +336,22 @@ void ivas_ism_reset_metadata( { hIsmMeta->azimuth = 0.0f; hIsmMeta->elevation = 0.0f; +#ifdef TD5 + hIsmMeta->yaw = 0.0f; + hIsmMeta->pitch = 0.0f; + hIsmMeta->radius = 1.0f; +#endif return; } + /*-------------------------------------------------------------------* * ivas_ism_reset_metadata_API() * - * Reset ISm metadata parameters + * Reset ISM metadata parameters *-------------------------------------------------------------------*/ + void ivas_ism_reset_metadata_API( ISM_METADATA_HANDLE hIsmMeta /* i/o: ISM metadata handle */ ) @@ -348,6 +362,7 @@ void ivas_ism_reset_metadata_API( return; } + /*-------------------------------------------------------------------* * ism_quant_meta() * @@ -356,10 +371,12 @@ void ivas_ism_reset_metadata_API( /*! r: index of the winning codeword */ int16_t ism_quant_meta( - const float val, /* i : scalar value to quantize */ - float *valQ, /* o : quantized value */ - const float borders[], /* i : level borders */ - const int16_t cbsize /* i : codebook size */ + const float val, /* i : scalar value to quantize */ + float *valQ, /* o : quantized value */ + const float borders[], /* i : level borders */ + const float q_step, /* i : quantization step */ + const float q_step_border, /* i : quantization step at the border */ + const int16_t cbsize /* i : codebook size */ ) { int16_t idx, idx_start; @@ -369,19 +386,19 @@ int16_t ism_quant_meta( { qlow = borders[0]; idx_start = 0; - step = ISM_Q_STEP_BORDER; + step = q_step_border; } else if ( val <= borders[2] ) { qlow = borders[1]; - idx_start = (int16_t) ( ( borders[1] - borders[0] ) / ISM_Q_STEP_BORDER ); - step = ISM_Q_STEP; + idx_start = (int16_t) ( ( borders[1] - borders[0] ) / q_step_border ); + step = q_step; } else { qlow = borders[2]; - idx_start = (int16_t) ( cbsize - 1 - ( borders[3] - borders[2] ) / ISM_Q_STEP_BORDER ); - step = ISM_Q_STEP_BORDER; + idx_start = (int16_t) ( cbsize - 1 - ( borders[3] - borders[2] ) / q_step_border ); + step = q_step_border; } idx = idx_start + (int16_t) max( 0.f, min( cbsize - 1, ( ( val - qlow ) / step + 0.5f ) ) ); @@ -399,31 +416,33 @@ int16_t ism_quant_meta( /*! r: dequantized value */ float ism_dequant_meta( - const int16_t idx, /* i : quantizer index */ - const float borders[], /* i : level borders */ - const int16_t cbsize /* i : codebook size */ + const int16_t idx, /* i : quantizer index */ + const float borders[], /* i : level borders */ + const float q_step, /* i : quantization step */ + const float q_step_border, /* i : quantization step at the border */ + const int16_t cbsize /* i : codebook size */ ) { int16_t idx_start; float qlow, step, valQ; - if ( idx <= ( borders[1] - borders[0] ) / ISM_Q_STEP_BORDER ) + if ( idx <= ( borders[1] - borders[0] ) / q_step_border ) { qlow = borders[0]; idx_start = 0; - step = ISM_Q_STEP_BORDER; + step = q_step_border; } - else if ( idx <= cbsize - 1 - ( borders[3] - borders[2] ) / ISM_Q_STEP_BORDER ) + else if ( idx <= cbsize - 1 - ( borders[3] - borders[2] ) / q_step_border ) { qlow = borders[1]; - idx_start = (int16_t) ( ( borders[1] - borders[0] ) / ISM_Q_STEP_BORDER ); - step = ISM_Q_STEP; + idx_start = (int16_t) ( ( borders[1] - borders[0] ) / q_step_border ); + step = q_step; } else { qlow = borders[2]; - idx_start = (int16_t) ( cbsize - 1 - ( borders[3] - borders[2] ) / ISM_Q_STEP_BORDER ); - step = ISM_Q_STEP_BORDER; + idx_start = (int16_t) ( cbsize - 1 - ( borders[3] - borders[2] ) / q_step_border ); + step = q_step_border; } valQ = ( idx - idx_start ) * step + qlow; @@ -440,12 +459,22 @@ float ism_dequant_meta( void ivas_param_ism_config( PARAM_ISM_CONFIG_HANDLE hParamIsm /* i/o: IVAS Param ISM Config Structure */ +#ifdef NCHAN_ISM_PARAMETER + , + const int16_t nchan_obj /* i : number of ISM channels */ +#endif ) { +#ifdef NCHAN_ISM_PARAMETER + int16_t i; + + hParamIsm->nbands = MAX_PARAM_ISM_NBANDS; +#else int16_t i, num_obj; hParamIsm->nbands = MAX_PARAM_ISM_NBANDS; num_obj = hParamIsm->num_obj; +#endif for ( i = 0; i < hParamIsm->nbands; i++ ) { @@ -453,7 +482,11 @@ void ivas_param_ism_config( } /* for elevation zero compute the max azi quantization indices */ +#ifdef NCHAN_ISM_PARAMETER + for ( i = 0; i < nchan_obj; i++ ) +#else for ( i = 0; i < num_obj; i++ ) +#endif { hParamIsm->last_az_diff[i] = 0; hParamIsm->last_az_sgn[i] = 1; @@ -490,3 +523,98 @@ ISM_MODE ivas_ism_mode_select( return ism_mode; } + + +/*--------------------------------------------------------------- + * ivas_ism_metadata_close() + * + * Deallocate ISM metadata handles + * ---------------------------------------------------------------*/ + +void ivas_ism_metadata_close( + ISM_METADATA_HANDLE hIsmMetaData[] /* i/o : object metadata handles */ +) +{ + int16_t n; + + if ( hIsmMetaData == NULL || hIsmMetaData == NULL ) + { + return; + } + + for ( n = 0; n < MAX_NUM_OBJECTS; n++ ) + { + if ( hIsmMetaData[n] != NULL ) + { + free( hIsmMetaData[n] ); + hIsmMetaData[n] = NULL; + } + } + + return; +} + + +#ifdef DISCRETE_ISM_DTX_CNG +/*-------------------------------------------------------------------* + * update_last_metadata() + * + * Store last metadata values + *-------------------------------------------------------------------*/ + +void update_last_metadata( + const int16_t nchan_ism, /* i : number of objects */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + const int16_t updt_flag[] /* i : last metadata update flag */ +) +{ + int16_t ch; + + for ( ch = 0; ch < nchan_ism; ch++ ) + { + if ( updt_flag[ch] == 1 ) + { + hIsmMeta[ch]->last_azimuth = hIsmMeta[ch]->azimuth; + hIsmMeta[ch]->last_elevation = hIsmMeta[ch]->elevation; + } + } + + return; +} + + +/*----------------------------------------------------------------* + * ivas_get_ism_sid_quan_bitbudget() + * + * Set quantization bits based on the number of coded objects + *----------------------------------------------------------------*/ + +void ivas_get_ism_sid_quan_bitbudget( + const int16_t nchan_ism, /* i : number of objects */ + int16_t *nBits_azimuth, /* o : number of Q bits for azimuth */ + int16_t *nBits_elevation, /* o : number of Q bits for elevation */ + float *q_step, /* o : quantization step */ + float *q_step_border, /* o : quantization step at the border */ + int16_t *nBits_coh, /* o : number of Q bits for coherence */ + int16_t *nBits_sce_id /* o : number of Q bits for sce_id_dtx */ +) +{ + *nBits_azimuth = ISM_DTX_AZI_BITS_HIGH; + *nBits_elevation = ISM_DTX_ELE_BITS_HIGH; + *q_step = ISM_Q_STEP_HIGH; + *q_step_border = ISM_Q_STEP_BORDER_HIGH; + *nBits_coh = ISM_DTX_COH_SCA_BITS; + *nBits_sce_id = 1; + + if ( nchan_ism >= 3 ) + { + *nBits_azimuth = ISM_DTX_AZI_BITS_LOW; + *nBits_elevation = ISM_DTX_ELE_BITS_LOW; + *q_step = ISM_Q_STEP_LOW; + *q_step_border = ISM_Q_STEP_BORDER_LOW; + *nBits_sce_id = 2; + } + + return; +} +#endif diff --git a/lib_com/ivas_masa_com.c b/lib_com/ivas_masa_com.c index 86f7676378..bd0336ad43 100644 --- a/lib_com/ivas_masa_com.c +++ b/lib_com/ivas_masa_com.c @@ -314,6 +314,10 @@ void masa_sample_rate_band_correction( int16_t *band_mapping, /* i/o: Band mapping used and modified */ IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: QMetadata structure for modification */ const int32_t sampling_rate /* i : Sampling rate */ +#ifdef FIX_373_MASA_DELAY_COMP_MSAN + , + MASA_DECODER_EXT_OUT_META_HANDLE hExtOutMeta /* i/o: MASA decoder metadata ext out buffer */ +#endif ) { uint8_t band, sf; @@ -386,6 +390,28 @@ void masa_sample_rate_band_correction( hQMetaData->twoDirBands[band] = 0; } } +#ifdef FIX_373_MASA_DELAY_COMP_MSAN + if ( hExtOutMeta != NULL ) + { + /* in decoder, zero the EXT out MASA meta buffer */ + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + for ( band = config->numCodingBands; band < MASA_FREQUENCY_BANDS; band++ ) + { + hExtOutMeta->directionIndex[0][sf][band] = SPH_IDX_FRONT; + hExtOutMeta->directToTotalRatio[0][sf][band] = 0u; + hExtOutMeta->spreadCoherence[0][sf][band] = 0u; + + hExtOutMeta->directionIndex[1][sf][band] = SPH_IDX_FRONT; + hExtOutMeta->directToTotalRatio[1][sf][band] = 0u; + hExtOutMeta->spreadCoherence[1][sf][band] = 0u; + + hExtOutMeta->surroundCoherence[sf][band] = 0u; + hExtOutMeta->diffuseToTotalRatio[sf][band] = UINT8_MAX; + } + } + } +#endif return; } diff --git a/lib_com/ivas_mc_param_com.c b/lib_com/ivas_mc_param_com.c index c6cfe0ed8f..acf7a8eae2 100644 --- a/lib_com/ivas_mc_param_com.c +++ b/lib_com/ivas_mc_param_com.c @@ -141,7 +141,6 @@ void ivas_param_mc_metadata_open( ivas_param_mc_default_icc_map( hMetadataPMC->icc_mapping_conf, hMetadataPMC->icc_mapping[i] ); } - /* init remaining flags and indices */ hMetadataPMC->param_frame_idx = 0; hMetadataPMC->flag_use_adaptive_icc_map = 0; diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index dbec066552..e8597bbf3c 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -124,7 +124,7 @@ void destroy_cpe_enc( ); void ivas_mct_enc_close( - MCT_ENC_HANDLE hMCT /* i/o: MCT encoder structure */ + MCT_ENC_HANDLE *hMCT /* i/o: MCT encoder structure */ ); ivas_error ivas_corecoder_enc_reconfig( @@ -202,12 +202,7 @@ ivas_error pre_proc_front_ivas( const int16_t front_vad_flag, /* i : front-VAD flag to overwrite VAD decision */ const int16_t force_front_vad, /* i : flag to force VAD decision */ const int16_t front_vad_dtx_flag, /* i : front-VAD DTX flag to overwrite VAD decision*/ -#ifdef LOW_RATE_TRANS_CORE_CODER const int32_t ivas_total_brate /* i : IVAS total bitrate */ -#else - const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - const int16_t ivas_format /* i : IVAS format */ -#endif ); ivas_error pre_proc_ivas( @@ -267,13 +262,9 @@ void ivas_initialize_handles_enc( ); ivas_error ivas_init_encoder( - Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ -#ifndef IND_LIST_DYN - ,Indice ind_list[][MAX_NUM_INDICES] /* i : indices list */ -#endif -#ifndef IND_LIST_DYN - ,Indice ind_list_metadata[][MAX_BITS_METADATA] /* i : indices list metadata */ -#endif + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + Indice ind_list[][MAX_NUM_INDICES], /* i : indices list */ + Indice ind_list_metadata[][MAX_BITS_METADATA] /* i : indices list metadata */ ); void destroy_core_enc( @@ -298,7 +289,7 @@ ivas_error stereo_dmx_evs_init_encoder( ); void stereo_dmx_evs_close_encoder( - STEREO_DMX_EVS_ENC_HANDLE hStereoDmxEVS /* i/o: Stereo downmix for EVS encoder handle */ + STEREO_DMX_EVS_ENC_HANDLE *hStereoDmxEVS /* i/o: Stereo downmix for EVS encoder handle */ ); ivas_error ivas_dec( @@ -508,11 +499,10 @@ void stereo_tcx_core_dec( const int16_t last_element_mode, /* i : last element mode */ const int16_t flag_sec_CNA, /* i : CNA flag for secondary channel */ STEREO_CNG_DEC_HANDLE hStereoCng, /* i : Stereo CNG handle */ - const int16_t nchan_out /* i : number of output channels */ -#ifdef PARAM_ISM_DTX_CNG - , - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const ISM_MODE ism_mode /* i : ISM mode (only needed if format is ISM) */ + const int16_t nchan_out, /* i : number of output channels */ + const IVAS_FORMAT ivas_format /* i : IVAS format */ +#ifndef DISCRETE_ISM_DTX_CNG + ,const ISM_MODE ism_mode /* i : ISM mode (only needed if format is ISM) */ #endif ); @@ -751,13 +741,13 @@ void dtx_read_padding_bits( /*----------------------------------------------------------------------------------* - * ISm prototypes + * ISM prototypes *----------------------------------------------------------------------------------*/ ivas_error ivas_ism_config( - const int32_t ism_total_brate, /* i : ISms total bitrate */ - const int16_t num_trans_ch, /* i : number of trans channels */ - const int16_t num_obj, /* i : number of objects */ + const int32_t ism_total_brate, /* i : ISM total bitrate */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int16_t nchan_ism, /* i : number of objects */ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ const int16_t localVAD[MAX_NUM_OBJECTS], /* i : local VAD flag */ const int16_t ism_imp[], /* i : ISM importance flags */ @@ -779,6 +769,8 @@ int16_t ism_quant_meta( const float val, /* i : scalar value to quantize */ float *valQ, /* o : quantized value */ const float borders[], /* i : level borders */ + const float q_step, /* i : quantization step */ + const float q_step_border, /* i : quantization step at the border */ const int16_t cbsize /* i : codebook size */ ); @@ -786,13 +778,22 @@ int16_t ism_quant_meta( float ism_dequant_meta( const int16_t idx, /* i : quantizer index */ const float borders[], /* i : level borders */ + const float q_step, /* i : quantization step */ + const float q_step_border, /* i : quantization step at the border */ const int16_t cbsize /* i : codebook size */ ); ivas_error ivas_set_ism_metadata( ISM_METADATA_HANDLE hIsmMeta, /* o : ISM metadata handle */ const float azimuth, /* i : azimuth value */ +#ifdef TD5 + const float elevation, /* i : elevation value */ + const float radius_meta, /* i : radius */ + const float yaw, /* i : yaw */ + const float pitch /* i : pitch */ +#else const float elevation /* i : elevation value */ +#endif ); ivas_error ivas_ism_metadata_enc_create( @@ -815,7 +816,10 @@ ivas_error ivas_ism_enc( ); ivas_error ivas_ism_metadata_enc( - const int32_t ism_total_brate, /* i : ISms total bitrate */ + const int32_t ism_total_brate, /* i : ISM total bitrate */ +#ifdef NCHAN_ISM_PARAMETER + const int16_t nchan_ism, /* i : number of ISM channels */ +#endif const int16_t nchan_transport, /* i : number of transport channels */ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ SCE_ENC_HANDLE hSCE[], /* i/o: SCE encoder handles */ @@ -823,17 +827,28 @@ ivas_error ivas_ism_metadata_enc( int16_t nb_bits_metadata[], /* o : number of metadata bits */ const int16_t localVAD[], /* i : VAD flag */ const int16_t ism_mode, /* i : ISM mode */ +#ifdef TD5 + const PARAM_ISM_CONFIG_HANDLE hParamIsm, /* i : Param ISM Config Handle */ + const int16_t ism_extended_metadata_flag /* i : Extended metadata flag */ +#else const PARAM_ISM_CONFIG_HANDLE hParamIsm /* i : Param ISM Config Handle */ +#endif ); ivas_error ivas_ism_metadata_dec( - const int32_t ism_total_brate, /* i : ISms total bitrate */ + const int32_t ism_total_brate, /* i : ISM total bitrate */ +#ifdef NCHAN_ISM_PARAMETER + const int16_t nchan_ism, /* i : number of ISM channels */ +#endif int16_t *nchan_transport, /* o : number of transport channels */ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ SCE_DEC_HANDLE hSCE[], /* i/o: SCE decoder handles */ const int16_t bfi, /* i : bfi flag */ int16_t nb_bits_metadata[], /* o : number of metadata bits */ ISM_MODE ism_mode, /* i : ISM mode */ +#ifdef DISCRETE_ISM_DTX_CNG + ISM_DTX_DATA_DEC hISMDTX, /* i/o: ISM DTX structure */ +#endif const PARAM_ISM_CONFIG_HANDLE hParamIsm /* i : Param ISM Config Handle */ ); @@ -859,10 +874,14 @@ void ivas_param_ism_enc( ); void ivas_param_ism_enc_close( - DIRAC_ENC_HANDLE hDirAC, /* i/o: encoder DirAC handle */ + DIRAC_ENC_HANDLE *hDirAC, /* i/o: encoder DirAC handle */ const int32_t input_Fs /* i : input sampling_rate */ ); +void ivas_ism_metadata_close( + ISM_METADATA_HANDLE hIsmMetaData[] /* i/o : object metadata handles */ +); + void ivas_param_ism_stereo_dmx( Encoder_Struct *st_ivas, /* i : IVAS encoder structure */ float data[MAX_NUM_OBJECTS][L_FRAME48k], /* i/o: input signal/stereo dmx */ @@ -871,6 +890,10 @@ void ivas_param_ism_stereo_dmx( void ivas_param_ism_config( PARAM_ISM_CONFIG_HANDLE hParamIsm /* i/o: IVAS Param ISM Config Structure */ +#ifdef NCHAN_ISM_PARAMETER + , + const int16_t nchan_ism /* i : number of ISM channels */ +#endif ); ivas_error ivas_ism_enc_config( @@ -878,8 +901,14 @@ ivas_error ivas_ism_enc_config( ); ivas_error ivas_ism_dec_config( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const int16_t num_obj /* i : number of objects in the bitstream */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +#ifdef DISCRETE_ISM_DTX_CNG + , + const ISM_MODE last_ism_mode /* i/o: last ISM mode */ +#endif +#ifndef NCHAN_ISM_PARAMETER + ,const int16_t num_obj /* i : number of objects in the bitstream */ +#endif ); ivas_error ivas_param_ism_dec_open( @@ -887,7 +916,7 @@ ivas_error ivas_param_ism_dec_open( ); void ivas_param_ism_dec_close( - DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ + DIRAC_DEC_HANDLE *hDirAC, /* i/o: decoder DirAC handle */ const AUDIO_CONFIG output_config /* i : output audio configuration */ ); @@ -901,56 +930,121 @@ void ivas_param_ism_params_to_masa_param_mapping( ); -#ifdef PARAM_ISM_DTX_CNG /*----------------------------------------------------------------------------------* * ISM DTX prototypes *----------------------------------------------------------------------------------*/ ivas_error ivas_ism_dtx_open( - Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +); + +#ifdef DISCRETE_ISM_DTX_CNG +/*! r: indication of DTX frame */ +int16_t ivas_ism_dtx_enc( + ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ + SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t nchan_ism, /* i : number of objects */ + const int16_t nchan_transport, /* i : number of transport channels */ + int16_t vad_flag[MAX_NUM_OBJECTS], /* i : VAD flag */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + int16_t md_diff_flag[], /* o : metadata differential flag */ + int16_t *sid_flag /* o : indication of SID frame */ ); +#else +/*! r: indication of DTX frame */ +int16_t ivas_ism_dtx_enc( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + int16_t *sid_flag /* o : indication of SID frame */ +); +#endif ivas_error ivas_ism_dtx_dec( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - int16_t *nb_bits_metadata /* o : number of metadata bits */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + int16_t *nb_bits_metadata /* o : number of metadata bits */ ); +#ifdef DISCRETE_ISM_DTX_CNG +void ivas_ism_metadata_sid_enc( + ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ + const int16_t flag_noisy_speech, /* i : noisy speech flag */ + const int16_t nchan_ism, /* i : number of objects */ + const int16_t nchan_transport, /* i : number of transport channels */ + const ISM_MODE ism_mode, /* i : ISM mode */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + const int16_t sid_flag, /* i : indication of SID frame */ + const int16_t md_diff_flag[], /* i : metadata differental flag */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + int16_t nb_bits_metadata[] /* o : number of metadata bits */ +); +#else void ivas_param_ism_metadata_dtx_enc( - BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ - ISM_METADATA_HANDLE hIsmMeta[], /* i : ISM metadata handles */ - ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ - PARAM_ISM_CONFIG_HANDLE hParamIsm /* i : Param ISM Enc Handle */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + ISM_METADATA_HANDLE hIsmMeta[], /* i : ISM metadata handles */ + ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ + PARAM_ISM_CONFIG_HANDLE hParamIsm /* i : Param ISM Enc Handle */ +#ifdef NCHAN_ISM_PARAMETER + ,const int16_t nchan_ism /* i : number of ISM channels */ +#endif ); +#endif +#ifdef DISCRETE_ISM_DTX_CNG +void ivas_ism_metadata_sid_dec( + SCE_DEC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */ + const int32_t ism_total_brate, /* i : ISms total bitrate */ + const int16_t bfi, /* i : bfi flag */ + const int16_t nchan_ism, /* i : number of objects */ + const int16_t nchan_transport, /* i : number of transport channels */ + const ISM_MODE ism_mode, /* i : ISM mode */ + int16_t *flag_noisy_speech, /* o : noisy speech flag */ + int16_t *sce_id_dtx, /* o : SCE DTX ID */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + int16_t nb_bits_metadata[] /* o : number of metadata bits */ +); +#else void ivas_param_ism_metadata_dtx_dec( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); +#endif void ivas_ism_get_sce_id_dtx( - ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ - SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */ - const int16_t nchan_transport, /* i : number of transport channels */ - const int16_t input_frame /* i : input frame length per channel */ + ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ + SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int16_t input_frame /* i : input frame length per channel */ ); -void ivas_param_ism_compute_noisy_speech_flag( - Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +void ivas_param_ism_compute_noisy_speech_flag( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ); -/*! r: indication of DTX frame */ -int16_t ivas_ism_dtx_enc( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - int16_t *sid_flag /* o : indication of SID frame */ +void ivas_ism_coh_estim_dtx_enc( + ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ + SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int16_t input_frame /* i : input frame length */ ); -void ivas_ism_coh_estim_dtx_enc( - ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ - SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */ - const int16_t nchan_transport, /* i : number of transport channels */ - const int16_t input_frame /* i : input frame length */ +#ifdef DISCRETE_ISM_DTX_CNG +void update_last_metadata( + const int16_t nchan_ism, /* i : number of objects */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + const int16_t updt_flag[] /* i : last metadata update flag */ +); + +void ivas_get_ism_sid_quan_bitbudget( + const int16_t nchan_ism, /* i : number of objects */ + int16_t *nBits_azimuth, /* o : number of Q bits for azimuth */ + int16_t *nBits_elevation, /* o : number of Q bits for elevation */ + float *q_step, /* o : quantization step */ + float *q_step_border, /* o : quantization step at the border */ + int16_t *nBits_coh, /* o : number of Q bits for coherence */ + int16_t *nBits_sce_id /* o : number of Q bits for sce_id_dtx */ ); #endif + /*----------------------------------------------------------------------------------* * DFT Stereo prototypes *----------------------------------------------------------------------------------*/ @@ -1292,9 +1386,9 @@ int16_t adapt_GR_rpg1_ief( /*! r: number of bits written */ int16_t write_GR1( BSTR_ENC_HANDLE hBstr, /* i/o: Encoder bitstream handle */ - const int16_t ind, /* i : bitstream index */ - const int16_t *in, /* i : input vector */ - const int16_t len /* i : vector length */ + const int16_t ind, /* i : bitstream index */ + const int16_t *in, /* i : input vector */ + const int16_t len /* i : vector length */ ); /*! r: number of bits written */ @@ -1998,9 +2092,6 @@ void InternalTCXDecoder( void stereo_mdct_core_enc( CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ -#ifdef IND_LIST_DYN - const int16_t ivas_format, /* i : IVAS format */ -#endif float new_samples[CPE_CHANNELS][L_INP], /* i : new samples */ float old_wsp[CPE_CHANNELS][L_WSP], /* i : 12.8kHz weighted speech (for LTP */ float pitch_buf[CPE_CHANNELS][NB_SUBFR16k] /* o : floating pitch for each subframe */ @@ -2717,7 +2808,9 @@ void ivas_mct_core_enc( CPE_ENC_HANDLE hCPE[MCT_MAX_BLOCKS], /* i/o: CPE encoder structures */ const int16_t nChannels, /* i : number of channels to be coded */ const int32_t ivas_total_brate, /* i : IVAS total bitrate */ +#ifndef DISABLE_BWD_MCT const int16_t switch_bw, /* i : flag bandwidth switch occurance */ +#endif const int16_t lfe_bits, /* i : bits spent for LFE */ const int16_t sba_order /* i : Ambisonic (SBA) order */ ); @@ -2844,7 +2937,7 @@ void ivas_mct_dec_mct( void apply_MCT_dec( MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ Decoder_State **sts, /* i/o: decoder state structure */ - float *x[MCT_MAX_CHANNELS][NB_DIV] /* i/o: decoded and dequan. spect. input to MCT */ + float *x[MCT_MAX_CHANNELS][NB_DIV] /* i/o: decoded and dequan. spect. input to MCT */ ); void mctStereoIGF_dec( @@ -2944,9 +3037,7 @@ void ivas_qmetadata_close( void restore_metadata_buffer( BSTR_ENC_HANDLE hMetaData, const int16_t next_ind_start, -#ifndef IND_LIST_DYN const int16_t last_ind_start, -#endif const int16_t bit_pos_start ); @@ -3250,7 +3341,7 @@ ivas_error ivas_dirac_enc_reconfigure( ); void ivas_dirac_enc_close( - DIRAC_ENC_HANDLE hDirAC, /* i/o: encoder DirAC handle */ + DIRAC_ENC_HANDLE *hDirAC, /* i/o: encoder DirAC handle */ const int32_t input_Fs /* i : input sampling_rate */ ); @@ -3302,7 +3393,7 @@ ivas_error ivas_dirac_dec_config( ); void ivas_dirac_dec_close( - DIRAC_DEC_HANDLE hDirAC /* i/o: decoder DirAC handle */ + DIRAC_DEC_HANDLE *hDirAC /* i/o: decoder DirAC handle */ ); void ivas_dirac_dec_read_BS( @@ -3530,7 +3621,7 @@ ivas_error ivas_param_mc_enc_reconfig( ); void ivas_param_mc_enc_close( - PARAM_MC_ENC_HANDLE hParamMC, /* i/o: Parametric MC encoder handle */ + PARAM_MC_ENC_HANDLE *hParamMC, /* i/o: Parametric MC encoder handle */ const int32_t input_Fs /* i : input sampling rate */ ); @@ -3760,18 +3851,14 @@ void FdCngDecodeDiracMDCTStereoSID( ivas_error ivas_spar_enc_open( Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ -#ifdef SBA_BR_SWITCHING_CLEAN_UP ,const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ -#endif ); void ivas_spar_enc_close( - SPAR_ENC_HANDLE hSpar, /* i/o: SPAR encoder handle */ + SPAR_ENC_HANDLE *hSpar, /* i/o: SPAR encoder handle */ const int32_t input_Fs, /* i : input sampling rate */ - const int16_t nchan_inp /* i : number of input channels */ -#ifdef SBA_BR_SWITCHING_CLEAN_UP - ,const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ -#endif + const int16_t nchan_inp, /* i : number of input channels */ + const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ ); ivas_error ivas_spar_enc( @@ -3783,20 +3870,14 @@ ivas_error ivas_spar_enc( ); ivas_error ivas_spar_dec_open( - Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ -#ifdef SBA_BR_SWITCHING_CLEAN_UP - , + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ -#endif ); void ivas_spar_dec_close( - SPAR_DEC_HANDLE hSpar, /* i/o: SPAR decoder handle */ - const int32_t output_Fs /* i : output sampling rate */ -#ifdef SBA_BR_SWITCHING_CLEAN_UP - , + SPAR_DEC_HANDLE *hSpar, /* i/o: SPAR decoder handle */ + const int32_t output_Fs, /* i : output sampling rate */ const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ -#endif ); ivas_error ivas_spar_dec( @@ -4166,11 +4247,7 @@ void ivas_enc_cov_handler_process( const int16_t end_band, const int16_t nchan_inp, const int16_t dtx_vad, -#ifdef SMOOTH_WITH_TRANS_DET const int16_t transient_det[2] -#else - const int16_t transient_det -#endif ); ivas_error ivas_spar_covar_smooth_enc_open( @@ -4192,37 +4269,25 @@ void ivas_cov_smooth_process( const int16_t start_band, const int16_t end_band, const int16_t num_ch, -#ifdef SMOOTH_WITH_TRANS_DET const int16_t transient_det[2] -#else - const int16_t transient_det -#endif ); /* Transient detector module */ -ivas_error ivas_transient_det_open( +ivas_error ivas_transient_det_open( ivas_trans_det_state_t **hTranDet, /* i/o: Transient detector handle */ const int32_t sampling_rate /* i : sampling rate */ ); -void ivas_transient_det_close( +void ivas_transient_det_close( ivas_trans_det_state_t **hTranDet /* i/o: Transient detector handle */ ); -#ifdef SMOOTH_WITH_TRANS_DET void ivas_transient_det_process( ivas_trans_det_state_t *hTranDet, /* i/o: SPAR TD handle */ float *pIn_pcm, /* i : input audio channels */ - const int16_t frame_len, /* i : frame length in samples */ + const int16_t frame_len, /* i : frame length in samples */ int16_t transient_det[2] /* o : transient det outputs */ ); -#else -int16_t ivas_transient_det_process( - ivas_trans_det_state_t *hTranDet, /* i/o: Transient detector handle */ - float *pIn_pcm, /* i : input audio channels */ - const int16_t frame_len /* i : frame length in samples */ -); -#endif void ivas_td_decorr_get_ducking_gains( ivas_trans_det_state_t *hTranDet, /* i/o: Transient detector handle */ @@ -4233,14 +4298,14 @@ void ivas_td_decorr_get_ducking_gains( const int16_t tdet_flag ); -ivas_error ivas_td_decorr_dec_open( +ivas_error ivas_td_decorr_dec_open( ivas_td_decorr_state_t **hTdDecorr, /* i/o: TD decorrelator handle */ const int32_t output_Fs, /* i : output sampling rate */ const int16_t nchan_internal, /* i : number of internal channels */ const int16_t ducking_flag /* i : ducking flag */ ); -void ivas_td_decorr_dec_close( +void ivas_td_decorr_dec_close( ivas_td_decorr_state_t **hTdDecorr /* i/o: TD decorrelator handle */ ); @@ -4459,7 +4524,7 @@ ivas_error ivas_masa_dec_open( ); void ivas_masa_dec_close( - MASA_DECODER_HANDLE hMasa /* i/o: MASA metadata structure */ + MASA_DECODER_HANDLE *hMasa /* i/o: MASA metadata structure */ ); ivas_error ivas_masa_decode( @@ -4477,7 +4542,7 @@ ivas_error ivas_masa_enc_open( ); void ivas_masa_enc_close( - MASA_ENCODER_HANDLE hMasa /* i/o: MASA metadata structure */ + MASA_ENCODER_HANDLE *hMasa /* i/o: MASA metadata structure */ #ifndef FIX_350_MASA_DELAY_COMP , const int16_t nchan_transport, /* i : Number of transport channels */ @@ -4564,6 +4629,9 @@ void masa_sample_rate_band_correction( int16_t *band_mapping, /* i/o: Band mapping used and modified */ IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: QMetadata structure for modification */ const int32_t sampling_rate /* i : sampling rate */ +#ifdef FIX_373_MASA_DELAY_COMP_MSAN + , MASA_DECODER_EXT_OUT_META_HANDLE hExtOutMeta /* i/o: MASA decoder metadata ext out buffer */ +#endif ); void invdct4_transform( @@ -4661,7 +4729,7 @@ void ivas_ism2sba( float buffer_td[][L_FRAME48k], /* i/o: TD signal buffers */ ISM_RENDERER_HANDLE hIsmRendererData, /* i/o: renderer data */ const ISM_METADATA_HANDLE hIsmMetaData[], /* i : object metadata */ - const int16_t num_objects, /* i : number of objects */ + const int16_t nchan_ism, /* i : number of objects */ const int16_t output_frame, /* i : output frame length per channel */ const int16_t sba_order /* i : SBA order */ ); @@ -4765,7 +4833,7 @@ ivas_error ivas_mcmasa_enc_open( ); void ivas_mcmasa_enc_close( - MCMASA_ENC_HANDLE hMcMasa, /* i/o: encoder McMASA handle */ + MCMASA_ENC_HANDLE *hMcMasa, /* i/o: encoder McMASA handle */ const int32_t input_Fs /* i : input sampling rate */ ); @@ -4888,7 +4956,7 @@ ivas_error ivas_create_lfe_enc( ); void ivas_lfe_enc_close( - LFE_ENC_HANDLE hLFE /* i/o: LFE encoder handle */ + LFE_ENC_HANDLE *hLFE /* i/o: LFE encoder handle */ ); void ivas_lfe_enc( @@ -4905,7 +4973,7 @@ ivas_error ivas_create_lfe_dec( ); void ivas_lfe_dec_close( - LFE_DEC_HANDLE hLFE /* i/o: LFE encoder handle */ + LFE_DEC_HANDLE *hLFE /* i/o: LFE encoder handle */ ); void ivas_lfe_dec( @@ -4980,20 +5048,14 @@ ivas_error ivas_fb_set_cfg( ivas_error ivas_FB_mixer_open( IVAS_FB_MIXER_HANDLE *hFbMixer, /* i/o: FB mixer handle */ const int32_t sampling_rate, /* i : sampling rate */ - IVAS_FB_CFG *fb_cfg /* i : FB config. handle */ -#ifdef SBA_BR_SWITCHING_CLEAN_UP - , + IVAS_FB_CFG *fb_cfg, /* i : FB config. handle */ const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ -#endif ); void ivas_FB_mixer_close( IVAS_FB_MIXER_HANDLE *hFbMixer, /* i/o: FB mixer handle */ - const int32_t sampling_rate /* i : sampling rate in Hz */ -#ifdef SBA_BR_SWITCHING_CLEAN_UP - , + const int32_t sampling_rate, /* i : sampling rate in Hz */ const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ -#endif ); void ivas_fb_mixer_pcm_ingest( diff --git a/lib_com/ivas_rom_com.h b/lib_com/ivas_rom_com.h index 0fea291b30..a095c9e4b4 100644 --- a/lib_com/ivas_rom_com.h +++ b/lib_com/ivas_rom_com.h @@ -318,6 +318,7 @@ extern const float McMASA_LFEGain_vectors[64]; extern const float ism_azimuth_borders[4]; extern const float ism_elevation_borders[4]; + /*----------------------------------------------------------------------------------* * Param ISM ROM tables *----------------------------------------------------------------------------------*/ diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index 8231588551..b445ac6f04 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -41,9 +41,20 @@ /*----------------------------------------------------------------------------------* - * Declaration of ISm common (encoder & decoder) structure + * Declaration of ISM common (encoder & decoder) structure *----------------------------------------------------------------------------------*/ +#ifdef TD5 +typedef struct +{ + int16_t last_azimuth_idx; /* last frame index of coded azimuth */ + int16_t azimuth_diff_cnt; /* FEC counter of consecutive differentially azimuth coded frames */ + int16_t last_elevation_idx; /* last frame index of coded elevation */ + int16_t elevation_diff_cnt; /* FEC counter of consecutive differentially elevation coded frames */ + +} ISM_METADATA_ANGLE, *ISM_METADATA_ANGLE_HANDLE; +#endif + /* ISM metadata handle (storage for one frame of read ISM metadata) */ typedef struct { @@ -52,11 +63,26 @@ typedef struct float azimuth; /* azimuth value read from the input metadata file */ float elevation; /* azimuth value read from the input metadata file */ - +#ifdef TD5 + float radius; + float yaw; /* azimuth orientation value read from the input metadata file */ + float pitch; /* elevation orientation value read from the input metadata file */ + ISM_METADATA_ANGLE angle[2]; /* Angle structs for [0] azimuth/elevation and [1] yaw/pitch */ + int16_t last_radius_idx; /* last frame index of coded radius */ + int16_t radius_diff_cnt; /* FEC counter of consecutive differentially radius coded frames */ +#else int16_t last_azimuth_idx; /* last frame index of coded azimuth */ int16_t azimuth_diff_cnt; /* FEC counter of consecutive differentially azimuth coded frames */ int16_t last_elevation_idx; /* last frame index of coded elevation */ int16_t elevation_diff_cnt; /* FEC counter of consecutive differentially elevation coded frames */ +#endif + +#ifdef DISCRETE_ISM_DTX_CNG + float last_azimuth; /* MD smoothing in DTX- last Q azimuth value */ + float last_elevation; /* MD smoothing in DTX - last Q elevation value */ + float last_true_azimuth; /* MD smoothing in DTX- last true Q azimuth value */ + float last_true_elevation; /* MD smoothing in DTX- last true Q elevation value */ +#endif } ISM_METADATA_FRAME, *ISM_METADATA_HANDLE; @@ -130,7 +156,9 @@ typedef struct ivas_param_ism_data_structure int16_t nbands; int16_t nblocks[MAX_PARAM_ISM_NBANDS]; int16_t band_grouping[MAX_PARAM_ISM_NBANDS + 1]; +#ifndef NCHAN_ISM_PARAMETER int16_t num_obj; +#endif int16_t azi_index[MAX_NUM_OBJECTS]; int16_t ele_index[MAX_NUM_OBJECTS]; diff --git a/lib_com/ivas_transient_det.c b/lib_com/ivas_transient_det.c index e2f2dfb766..1e8f53c7ca 100644 --- a/lib_com/ivas_transient_det.c +++ b/lib_com/ivas_transient_det.c @@ -211,43 +211,17 @@ void ivas_transient_det_close( * * Transient detection process call *-----------------------------------------------------------------------------------------*/ -#ifdef SMOOTH_WITH_TRANS_DET void ivas_transient_det_process( ivas_trans_det_state_t *hTranDet, /* i/o: SPAR TD handle */ float *pIn_pcm, /* i : input audio channels */ const int16_t frame_len, /* i : frame length in samples */ int16_t transient_det[2] /* o: transient det outputs */ ) -#else -int16_t ivas_transient_det_process( - ivas_trans_det_state_t *hTranDet, /* i/o: SPAR TD handle */ - float *pIn_pcm, /* i : input audio channels */ - const int16_t frame_len /* i : frame length in samples */ -) -#endif { -#ifdef SMOOTH_WITH_TRANS_DET float in_duck_gain[L_FRAME48k]; int16_t num_sf, sf, sf_samp, idx; -#else - int16_t trans; -#endif float mem = hTranDet->in_duck_gain; -#ifndef SMOOTH_WITH_TRANS_DET - ivas_td_decorr_get_ducking_gains( hTranDet, pIn_pcm, NULL, NULL, frame_len, IVAS_TDET_ONLY ); - - if ( mem - hTranDet->in_duck_gain > IVAS_TDET_PARM_TRANS_THR ) - { - trans = 1; - } - else - { - trans = 0; - } - - return trans; -#else ivas_td_decorr_get_ducking_gains( hTranDet, pIn_pcm, in_duck_gain, NULL, frame_len, IVAS_TDET_ONLY ); transient_det[0] = 0; @@ -270,7 +244,6 @@ int16_t ivas_transient_det_process( } return; -#endif } @@ -344,9 +317,7 @@ void ivas_td_decorr_get_ducking_gains( for ( i = 0; i < frame_len; i++ ) { in_duck_gain = ivas_calc_duck_gain( in_duck_gain, in_duck_coeff, e_slow[i], e_fast[i], duck_mult_fac ); -#ifdef SMOOTH_WITH_TRANS_DET pIn_duck_gains[i] = in_duck_gain; -#endif } hTranDet->in_duck_gain = in_duck_gain; } diff --git a/lib_com/options.h b/lib_com/options.h index 1c21751bfc..c054a9b5a7 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -132,7 +132,7 @@ /* ################# Start DEVELOPMENT switches ######################## */ #define BASOP_NOGLOB /* Disable global symbols in BASOPs, Overflow/Carry in BASOPs disabled, additional BASOPs in case of Overflow */ -#define IND_LIST_DYN /* VA: Issue 18: Dynamic allocation of ind_list[] and ind_list_metadata[] based on # of transport channels */ +#define BITSTREAM_INDICES_MEMORY /* Don't count memory for bitstream Indice at the encoder - it is a temporary solution for development only */ #define LSF_RE_USE_SECONDARY_CHANNEL /* TD stereo Secondary channel LSF Q improvement */ #ifdef LSF_RE_USE_SECONDARY_CHANNEL @@ -141,33 +141,28 @@ #define DISABLE_ADAP_RES_COD_TMP /* temporary fix for IVAS-403, disables adaptive residual coding */ /*#define ITD_WINNER_GAIN_MODIFY */ /* ITD optimization - WORK IN PROGRESS */ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ -#define SBA_BR_SWITCHING_CLEAN_UP /*Issue 114: Clean up changes for the SBA reconfiguation functions*/ -#define LOW_RATE_TRANS_CORE_CODER /* Eri: Activate low-rate-encoding-of-transients contribution for core coder, affects MC, MASA and SBA */ -#define FIX_197_CREND_INTERFACE -#define FIX_329_ENABLE_TD_RENDERER_REVERB_MC /* Eri: Enable reverb for TD renderer for 5.1 and 7.1 with headtracking enabled for IVAS_dec */ -#define FIX_330_ENABLE_TD_RENDERER_REVERB_REND /* Eri: Enable reverb for TD renderer for ISM, 5.1 and 7.1 with headtracking enabled for IVAS_rend */ - -#define FIX_347_DTX_CRASH /* FhG: Fix crash that can happen with DTX */ -#define DISABLE_RES_CHANNELS_MCT /* decode only W and residual for Y when outputting to stereo */ -#define FIX_107_5MS_SUBFRAME_RENDERING -#define REMOVE_FORCE_SUBFRAME_BIN /* Issue 355: remove obsolete "-force_subframe_bin" command-line option. */ - -#define PARAM_ISM_DTX_CNG /* FhG: contribution 9 - DTX-CNG for ParamISM */ - -#define FIX_331_SBA_HBR_HOA_FIXES /* DLB: issue 331 - fix addressing low frequency stuttering with HOA inputs at high bitrates */ -#ifdef FIX_331_SBA_HBR_HOA_FIXES -#define COV_SMOOTH_TUNING -#define SBA_HPF_TUNING_ENC +#define FIX_I109_ORIENTATION_TRACKING /* Issue 109: Harmonize head and orientation tracking */ /*#define SBA_HPF_TUNING_DEC*/ -#define SMOOTH_WITH_TRANS_DET -#endif #define BINAURALIZATION_DELAY_REPORT /* VA: Issue 255 - Changes the way the decoder delay is reported */ -#define FIX_351_HRTF_COMMAND /* VA: Issue 354 - improve "-hrtf" command-line option */ -#define FIX_94_VERIFY_WAV_NUM_CHANNELS /* FhG: Issue 94 - Check if number of channels in input wav file matches encoder/renderer configuration */ -#define ISM_HIGHEST_BITRATE /* VA: Issue 284: Update highest bitrate limit in ISM format */ #define TUNE_360_OBJECT_WITH_NOISE /* VA: issue 360: consider objects being speech+noise for active speech coding */ #define FIX_350_MASA_DELAY_COMP /* Nokia: Issue 350: MASA audio/meta delay compensation */ +#define FIX_372_LIB_REND_VALIDATE_IO /* FhG: Issue 372: IVAS_rend segfaults with unsupported I/O configs - add validation checks of I/O config */ +#define FIX_376_SBA_ROTATE /*DLB: Fix for issue 376*/ +#define TD5 /* Eri: Contribution 17: Extended metadata for 6 DoF rendering in TD renderer */ +#define TD5_FIX_INVALID_MEMORY_ACCESS /* FhG: Resolves segfault in case IVAS_REND_InitConfig gets initialized with rendererConfigEnabled:=false && ISM are being rendered */ +#define FIX_371_DELAY_REPORT /* Issue 371: div. by zero with -no_delay_cmp */ +#define FIX_373_MASA_DELAY_COMP_MSAN /* Nokia: Issue 373: MASA audio/meta delay compensation. MSAN bugfix */ + +#ifdef FIX_I109_ORIENTATION_TRACKING +#define OTR_REFERENCE_VECTOR_TRACKING /* FhG: enables the reference position orientation tracking mode */ +#endif + +#define FIX_380_BFI_PARAMISM /* VA: issue 380 - fix metadata recovery in ParamISM BFI */ +#define FIX_MDCT_BASED_BWD /* FhG: fixes for BWD for issues with reaction to transients for MDCT-stereo and MCT */ +#define DISCRETE_ISM_DTX_CNG /* FhG/VA: contribution 15 - DTX/CNG for (discrete) ISM */ +#define NCHAN_ISM_PARAMETER /* VA: make 'nchan_ism' parameter part of st_ivas/hEncoderConfig */ + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_com/prot.h b/lib_com/prot.h index 5ffb9d0946..c8f69fe832 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -515,36 +515,6 @@ void push_next_bits( #endif ); -#ifdef IND_LIST_DYN -int16_t get_max_num_indices( /* o : maximum number of indices */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const int32_t total_brate /* i : total bitrate */ -); - -int16_t get_max_num_indices_metadata( /* o : maximum number of indices */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const int32_t ivas_total_brate /* i : IVAS total bitrate */ -); - -ivas_error ind_list_realloc( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - int16_t max_num_indices /* i : new maximum number of allowed indices in the list */ -); - -int16_t find_indice( /* o : index of the indice in the list, -1 if not found */ - BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ - int16_t id, /* i : ID of the indice */ - uint16_t *value, /* o : value of the quantized indice */ - int16_t *nb_bits /* o : number of bits used to quantize the indice */ -); - -uint16_t delete_indice( /* o : number of deleted indices */ - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - int16_t id /* i : ID of the indice */ -); -#endif - - /*! r: value of the indice */ #ifdef DEBUG_BS_READ_WRITE #define get_next_indice( ... ) get_next_indice_( __VA_ARGS__, __LINE__, __func__ ) @@ -642,14 +612,13 @@ Decoder_State **reset_elements( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); -#ifndef IND_LIST_DYN + void indices_to_serial_generic( const Indice *ind_list, /* i : indices list */ const Word16 num_indices, /* i : number of indices to write */ UWord8 *pFrame, /* o : byte array with bit packet and byte aligned coded speech data */ Word16 *pFrame_size /* o : size of the binary encoded access unit [bits] */ ); -#endif void convertSerialToBytestream( const uint16_t *const serial, /* i : input serial bitstream with values 0 and 1 */ @@ -2255,25 +2224,19 @@ void read_next_force( ); #endif ivas_error init_encoder( - Encoder_State *st, /* i/o: state structure */ -#ifdef IND_LIST_DYN - ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : encoder configuration handle */ -#endif - const int16_t idchan, /* i : channel ID */ - const int16_t var_SID_rate_flag, /* i : flag for variable SID update rate */ + Encoder_State *st, /* i/o: state structure */ + const int16_t idchan, /* i : channel ID */ + const int16_t var_SID_rate_flag, /* i : flag for variable SID update rate */ const int16_t interval_SID, /* i : interval for SID update */ - const int16_t vad_only_flag /* i : flag to indicate front-VAD structure */ -#ifdef PARAM_ISM_DTX_CNG - , - const ISM_MODE ism_mode /* i : ISM mode */ -#endif + const int16_t vad_only_flag, /* i : flag to indicate front-VAD structure */ + const ISM_MODE ism_mode /* i : ISM mode */ ); void LPDmem_enc_init( LPD_state_HANDLE hLPDmem /* i/o: LP memories */ ); -void destroy_encoder( +void destroy_cldfb_encoder( Encoder_State *st /* i/o: state structure */ ); ivas_error evs_enc( @@ -3864,8 +3827,13 @@ void bw_detect( const float signal_in[], /* i : input signal */ float *spectrum, /* i : MDCT spectrum */ const float *enerBuffer /* i : energy buffer */ +#ifdef FIX_MDCT_BASED_BWD + , + const int16_t mct_on /* i : flag MCT mode */ +#endif ); + void set_bw( const int16_t element_mode, /* i : element mode */ const int32_t element_brate, /* i : element bitrate */ @@ -5157,7 +5125,7 @@ ivas_error init_decoder( const MC_MODE mc_mode /* i : MC mode */ ); -void destroy_decoder( +void destroy_cldfb_decoder( Decoder_State *st /* o : Decoder static variables structure */ ); @@ -8555,13 +8523,10 @@ void generate_comfort_noise_dec( ); void generate_comfort_noise_dec_hf( - float **bufferReal, /* o : Real part of input bands */ - float **bufferImag, /* o : Imaginary part of input bands */ - HANDLE_FD_CNG_COM hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */ -#ifdef PARAM_ISM_DTX_CNG - , - const int16_t cng_flag /*i : CNG Flag */ -#endif + float **bufferReal, /* o : Real part of input bands */ + float **bufferImag, /* o : Imaginary part of input bands */ + HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ + const int16_t cng_flag /* i : CNG Flag */ ); void generate_masking_noise( diff --git a/lib_dec/acelp_core_dec.c b/lib_dec/acelp_core_dec.c index 571311ed12..eb53379d66 100644 --- a/lib_dec/acelp_core_dec.c +++ b/lib_dec/acelp_core_dec.c @@ -512,11 +512,7 @@ ivas_error acelp_core_dec( } else { -#ifdef PARAM_ISM_DTX_CNG if ( st->core_brate == SID_2k40 && st->element_mode != IVAS_CPE_MDCT && st->read_sid_info ) -#else - if ( st->core_brate == SID_2k40 && st->element_mode != IVAS_CPE_MDCT ) -#endif { FdCng_decodeSID( st ); *sid_bw = 0; @@ -532,9 +528,8 @@ ivas_error acelp_core_dec( } ApplyFdCng( syn, NULL, realBuffer, imagBuffer, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); } -#ifdef PARAM_ISM_DTX_CNG if ( !st->read_sid_info ) - // if (!st->read_sid_info && st->cng_paramISM_flag) /* read_sid_info can only be 0 in ParamISM mode */ + // if (!st->read_sid_info && st->cng_ism_flag) /* read_sid_info can only be 0 in ParamISM mode */ { float noise_lvl_highest; @@ -544,7 +539,6 @@ ivas_error acelp_core_dec( st->hFdCngDec->hFdCngCom->cngNoiseLevel[b] = noise_lvl_highest; } } -#endif generate_comfort_noise_dec( NULL, NULL, st, nchan_out ); @@ -1131,11 +1125,7 @@ ivas_error acelp_core_dec( st->lp_noise = st->hFdCngDec->lp_noise; } -#ifdef PARAM_ISM_DTX_CNG - if ( st->element_mode != IVAS_CPE_TD && !st->cng_paramISM_flag ) -#else - if ( st->element_mode != IVAS_CPE_TD ) -#endif + if ( st->element_mode != IVAS_CPE_TD && !st->cng_ism_flag ) { /*Noise estimate*/ ApplyFdCng( syn, NULL, realBuffer, imagBuffer, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); @@ -1311,11 +1301,7 @@ ivas_error acelp_core_dec( /*WB/SWB-FD_CNG*/ if ( ( st->core_brate == FRAME_NO_DATA || st->core_brate == SID_2k40 ) && ( st->cng_type == FD_CNG ) && ( st->hFdCngDec->hFdCngCom->numCoreBands < st->cldfbSyn->no_channels ) ) { -#ifdef PARAM_ISM_DTX_CNG - generate_comfort_noise_dec_hf( realBuffer, imagBuffer, st->hFdCngDec->hFdCngCom, st->cng_paramISM_flag ); -#else - generate_comfort_noise_dec_hf( realBuffer, imagBuffer, st->hFdCngDec->hFdCngCom ); -#endif + generate_comfort_noise_dec_hf( realBuffer, imagBuffer, st->hFdCngDec->hFdCngCom, st->cng_ism_flag ); if ( st->hFdCngDec->hFdCngCom->regularStopBand < st->cldfbSyn->no_channels ) { diff --git a/lib_dec/fd_cng_dec.c b/lib_dec/fd_cng_dec.c index 515188369c..ab9465a93a 100644 --- a/lib_dec/fd_cng_dec.c +++ b/lib_dec/fd_cng_dec.c @@ -420,6 +420,7 @@ void ApplyFdCng( hFdCngCom->sid_frame_counter = 0; /* set noise estimation inactive during concealment, as no update with noise generated by concealment should be performed. */ /* set noise estimation inactive when we have bit errors, as no update with noise generated by corrupt frame (biterror) should be performed. */ +#ifndef DISCRETE_ISM_DTX_CNG if ( concealWholeFrame == 0 && ( timeDomainInput == NULL || ( *timeDomainInput( -FLT_MAX ) && @@ -429,6 +430,17 @@ void ApplyFdCng( !( st->cng_type == LP_CNG && hFdCngDec->flag_dtx_mode ) && ( is_music == 0 ) ) || ( st->element_mode == IVAS_CPE_TD ) ) && ( !st->BER_detect ) ) +#else + if ( concealWholeFrame == 0 && + ( timeDomainInput == NULL || + ( *timeDomainInput( -FLT_MAX ) && + *( timeDomainInput + hFdCngCom->frameSize - 1 ) < FLT_MAX && + *( timeDomainInput + hFdCngCom->frameSize - 1 ) > ( -FLT_MAX ) ) ) && + ( ( ( ( st->element_mode != IVAS_CPE_TD && st->element_mode != IVAS_CPE_DFT && hFdCngDec->flag_dtx_mode ) || !st->VAD || ( st->ini_frame < 100 && st->is_ism_format ) ) && + !( st->cng_type == LP_CNG && hFdCngDec->flag_dtx_mode ) && ( is_music == 0 ) ) || + ( st->element_mode == IVAS_CPE_TD ) ) && + ( !st->BER_detect ) ) +#endif { /* Perform noise estimation at the decoder */ perform_noise_estimation_dec( timeDomainInput, powerSpectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); @@ -1091,11 +1103,7 @@ void generate_comfort_noise_dec( c2 = (float) sqrt( 1 - hFdCngCom->coherence ); seed2 = &( hFdCngCom->seed2 ); -#ifdef PARAM_ISM_DTX_CNG - if ( ( st->element_mode == IVAS_CPE_MDCT && st->idchan == 1 ) || ( st->element_mode == IVAS_SCE && st->cng_paramISM_flag ) ) -#else - if ( st->element_mode == IVAS_CPE_MDCT && st->idchan == 1 ) -#endif + if ( ( st->element_mode == IVAS_CPE_MDCT && st->idchan == 1 ) || ( st->element_mode == IVAS_SCE && st->cng_ism_flag ) ) { seed2 = &( hFdCngCom->seed3 ); } @@ -1105,11 +1113,7 @@ void generate_comfort_noise_dec( if ( hFdCngCom->startBand == 0 ) { -#ifdef PARAM_ISM_DTX_CNG - if ( st->element_mode == IVAS_CPE_MDCT || ( st->element_mode == IVAS_SCE && st->cng_paramISM_flag ) ) -#else - if ( st->element_mode == IVAS_CPE_MDCT ) -#endif + if ( st->element_mode == IVAS_CPE_MDCT || ( st->element_mode == IVAS_SCE && st->cng_ism_flag ) ) { rand_gauss( &tmp1, seed ); rand_gauss( &tmp2, seed2 ); @@ -1134,11 +1138,7 @@ void generate_comfort_noise_dec( for ( ; ptr_level < cngNoiseLevel + hFdCngCom->stopFFTbin - hFdCngCom->startBand; ptr_level++ ) { /* Real part in FFT bins */ -#ifdef PARAM_ISM_DTX_CNG - if ( st->element_mode == IVAS_CPE_MDCT || ( st->element_mode == IVAS_SCE && st->cng_paramISM_flag ) ) -#else - if ( st->element_mode == IVAS_CPE_MDCT ) -#endif + if ( st->element_mode == IVAS_CPE_MDCT || ( st->element_mode == IVAS_SCE && st->cng_ism_flag ) ) { rand_gauss( &tmp1, seed ); rand_gauss( &tmp2, seed2 ); @@ -1152,11 +1152,7 @@ void generate_comfort_noise_dec( ptr_r += 2; /* Imaginary part in FFT bins */ -#ifdef PARAM_ISM_DTX_CNG - if ( st->element_mode == IVAS_CPE_MDCT || ( st->element_mode == IVAS_SCE && st->cng_paramISM_flag ) ) -#else - if ( st->element_mode == IVAS_CPE_MDCT ) -#endif + if ( st->element_mode == IVAS_CPE_MDCT || ( st->element_mode == IVAS_SCE && st->cng_ism_flag ) ) { rand_gauss( &tmp1, seed ); rand_gauss( &tmp2, seed2 ); @@ -1234,11 +1230,7 @@ void generate_comfort_noise_dec( for ( i = 0; i < hFdCngCom->numSlots; i++ ) { /* Real part in CLDFB band */ -#ifdef PARAM_ISM_DTX_CNG - if ( st->element_mode == IVAS_CPE_MDCT || ( st->element_mode == IVAS_SCE && st->cng_paramISM_flag ) ) -#else - if ( st->element_mode == IVAS_CPE_MDCT ) -#endif + if ( st->element_mode == IVAS_CPE_MDCT || ( st->element_mode == IVAS_SCE && st->cng_ism_flag ) ) { rand_gauss( &tmp1, seed ); rand_gauss( &tmp2, seed2 ); @@ -1251,11 +1243,7 @@ void generate_comfort_noise_dec( bufferReal[i][j] *= (float) sqrt( ( scaleCldfb * *ptr_level ) * 0.5f ); /* Imaginary part in CLDFB band */ -#ifdef PARAM_ISM_DTX_CNG - if ( st->element_mode == IVAS_CPE_MDCT || ( st->element_mode == IVAS_SCE && st->cng_paramISM_flag ) ) -#else - if ( st->element_mode == IVAS_CPE_MDCT ) -#endif + if ( st->element_mode == IVAS_CPE_MDCT || ( st->element_mode == IVAS_SCE && st->cng_ism_flag ) ) { rand_gauss( &tmp1, seed ); rand_gauss( &tmp2, seed2 ); @@ -1352,13 +1340,10 @@ void generate_comfort_noise_dec( *-------------------------------------------------------------------*/ void generate_comfort_noise_dec_hf( - float **bufferReal, /* o : Real part of input bands */ - float **bufferImag, /* o : Imaginary part of input bands */ - HANDLE_FD_CNG_COM hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */ -#ifdef PARAM_ISM_DTX_CNG - , - const int16_t cng_coh_flag /* i : CNG Flag for coherence handling */ -#endif + float **bufferReal, /* o : Real part of input bands */ + float **bufferImag, /* o : Imaginary part of input bands */ + HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ + const int16_t cng_coh_flag /* i : CNG Flag for coherence handling */ ) { int16_t i, j; @@ -1367,7 +1352,6 @@ void generate_comfort_noise_dec_hf( int16_t *seed = &( hFdCngCom->seed ); float scale = CLDFB_SCALING / hFdCngCom->scalingFactor; -#ifdef PARAM_ISM_DTX_CNG int16_t *seed2 = &( hFdCngCom->seed ); float tmp1, tmp2, c1 = 0.f, c2 = 0.f; @@ -1375,10 +1359,9 @@ void generate_comfort_noise_dec_hf( { seed2 = &( hFdCngCom->seed3 ); - c1 = (float) sqrt( hFdCngCom->coherence ); + c1 = (float) sqrt( hFdCngCom->coherence ); // VE!!!!! all occurences of "(float) sqrt()" should be replaced by "sqrtf()" c2 = (float) sqrt( 1 - hFdCngCom->coherence ); } -#endif ptr_level = hFdCngCom->cngNoiseLevel + hFdCngCom->stopFFTbin - hFdCngCom->startBand; /* @@ -1391,7 +1374,6 @@ void generate_comfort_noise_dec_hf( { for ( i = 0; i < hFdCngCom->numSlots; i++ ) { -#ifdef PARAM_ISM_DTX_CNG if ( cng_coh_flag ) { /* Real part in CLDFB band */ @@ -1415,14 +1397,6 @@ void generate_comfort_noise_dec_hf( rand_gauss( &bufferImag[i][j], seed ); bufferImag[i][j] *= (float) sqrt( ( scale * *ptr_level ) * 0.5f ); } -#else - /* Real part in CLDFB band */ - rand_gauss( &bufferReal[i][j], seed ); - bufferReal[i][j] *= (float) sqrt( ( scale * *ptr_level ) * 0.5f ); - /* Imaginary part in CLDFB band */ - rand_gauss( &bufferImag[i][j], seed ); - bufferImag[i][j] *= (float) sqrt( ( scale * *ptr_level ) * 0.5f ); -#endif } ptr_level++; } diff --git a/lib_dec/init_dec.c b/lib_dec/init_dec.c index 402fdc78f5..34ee7a3cec 100644 --- a/lib_dec/init_dec.c +++ b/lib_dec/init_dec.c @@ -738,9 +738,10 @@ ivas_error init_decoder( st->tdm_LRTD_flag = 0; st->cna_dirac_flag = 0; st->cng_sba_flag = 0; -#ifdef PARAM_ISM_DTX_CNG - st->cng_paramISM_flag = 0; + st->cng_ism_flag = 0; st->read_sid_info = 1; /* by default read the sid info from bitstream */ +#ifdef DISCRETE_ISM_DTX_CNG + st->is_ism_format = 0; #endif @@ -772,12 +773,12 @@ void reset_preecho_dec( /*----------------------------------------------------------------------* - * destroy_decoder() + * destroy_cldfb_decoder() * * Free memory which was allocated in init_decoder() *----------------------------------------------------------------------*/ -void destroy_decoder( +void destroy_cldfb_decoder( Decoder_State *st /* o : Decoder static variables structure */ ) { diff --git a/lib_dec/ivas_agc_dec.c b/lib_dec/ivas_agc_dec.c index 1397ce1111..72ae68a57b 100644 --- a/lib_dec/ivas_agc_dec.c +++ b/lib_dec/ivas_agc_dec.c @@ -142,22 +142,24 @@ void ivas_spar_agc_dec_close( { ivas_agc_dec_state_t *hAgc; + if ( hAgcDec == NULL || *hAgcDec == NULL ) + { + return; + } + hAgc = *hAgcDec; - if ( hAgc != NULL ) - { - free( hAgc->agc_com.winFunc ); - hAgc->agc_com.winFunc = NULL; + free( hAgc->agc_com.winFunc ); + hAgc->agc_com.winFunc = NULL; - free( hAgc->gain_state ); - hAgc->gain_state = NULL; + free( hAgc->gain_state ); + hAgc->gain_state = NULL; - free( hAgc->gain_data ); - hAgc->gain_data = NULL; + free( hAgc->gain_data ); + hAgc->gain_data = NULL; - free( hAgc ); - *hAgcDec = NULL; - } + free( *hAgcDec ); + *hAgcDec = NULL; return; } diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 9fcb85ac0c..2db5602519 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -866,8 +866,6 @@ void ivas_binaural_add_LFE( if ( render_lfe ) { -#ifdef FIX_197_CREND_INTERFACE -#ifdef FIX_329_ENABLE_TD_RENDERER_REVERB_MC if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) { gain = GAIN_LFE; @@ -876,12 +874,6 @@ void ivas_binaural_add_LFE( { gain = ( ( st_ivas->hCrendWrapper != NULL ) && ( st_ivas->hCrendWrapper->hHrtfCrend != NULL ) ) ? st_ivas->hCrendWrapper->hHrtfCrend->gain_lfe : GAIN_LFE; } -#else - gain = ( ( st_ivas->hCrendWrapper != NULL ) && ( st_ivas->hCrendWrapper->hHrtfCrend != NULL ) ) ? st_ivas->hCrendWrapper->hHrtfCrend->gain_lfe : GAIN_LFE; -#endif -#else - gain = st_ivas->hHrtf != NULL ? st_ivas->hHrtf->gain_lfe : GAIN_LFE; -#endif for ( idx_lfe = 0; idx_lfe < st_ivas->hIntSetup.num_lfe; idx_lfe++ ) { v_multc( output_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], gain, output_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], output_frame ); @@ -1012,7 +1004,6 @@ void ivas_binRenderer( if ( hHeadTrackData->shd_rot_max_order == -1 ) { QuatToRotMat( hHeadTrackData->Quaternions[hHeadTrackData->num_quaternions++], hHeadTrackData->Rmat ); - rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hHeadTrackData->Rmat, hBinRenderer->hInputSetup->nchan_out_woLFE, 3 ); } else if ( hHeadTrackData->shd_rot_max_order > 0 ) diff --git a/lib_dec/ivas_core_dec.c b/lib_dec/ivas_core_dec.c index 49429e0381..0811f9957a 100755 --- a/lib_dec/ivas_core_dec.c +++ b/lib_dec/ivas_core_dec.c @@ -240,11 +240,7 @@ ivas_error ivas_core_dec( hCPE->hStereoCng->flag_cna_fade = 0; } -#ifdef FIX_347_DTX_CRASH if ( sba_dirac_stereo_flag && hSCE && sts[0]->total_brate <= SID_2k40 && sts[0]->cng_type == FD_CNG ) -#else - if ( sba_dirac_stereo_flag && sts[0]->total_brate <= SID_2k40 && sts[0]->cng_type == FD_CNG ) -#endif { save_hb_synth = hSCE->save_hb_synth; } @@ -345,11 +341,12 @@ ivas_error ivas_core_dec( if ( ( st->core == TCX_20_CORE || st->core == TCX_10_CORE ) && st->element_mode != IVAS_CPE_MDCT ) { /* TCX decoder */ -#ifdef PARAM_ISM_DTX_CNG - stereo_tcx_core_dec( st, frameMode[n], output[n], synth[n], pitch_buf[n], sba_dirac_stereo_flag, hStereoTD, last_element_mode, flag_sec_CNA, hCPE == NULL ? NULL : hCPE->hStereoCng, nchan_out, st_ivas == NULL ? 0 : st_ivas->ivas_format, st_ivas == NULL ? 0 : st_ivas->ism_mode ); -#else - stereo_tcx_core_dec( st, frameMode[n], output[n], synth[n], pitch_buf[n], sba_dirac_stereo_flag, hStereoTD, last_element_mode, flag_sec_CNA, hCPE == NULL ? NULL : hCPE->hStereoCng, nchan_out ); + stereo_tcx_core_dec( st, frameMode[n], output[n], synth[n], pitch_buf[n], sba_dirac_stereo_flag, hStereoTD, last_element_mode, flag_sec_CNA, hCPE == NULL ? NULL : hCPE->hStereoCng, nchan_out, st_ivas == NULL ? 0 : st_ivas->ivas_format +#ifndef DISCRETE_ISM_DTX_CNG + , + st_ivas == NULL ? 0 : st_ivas->ism_mode #endif + ); } if ( st->core == HQ_CORE ) @@ -461,11 +458,7 @@ ivas_error ivas_core_dec( /* for FD-CNG we need the delay compensation in the synth, so do this afterwards */ -#ifdef FIX_347_DTX_CRASH if ( sba_dirac_stereo_flag && hSCE && st->core_brate == SID_2k40 && st->cng_type == FD_CNG ) -#else - if ( sba_dirac_stereo_flag && st->core_brate == SID_2k40 && st->cng_type == FD_CNG ) -#endif { mvr2r( synth[n], hSCE->save_synth, output_frame ); } diff --git a/lib_dec/ivas_corecoder_dec_reconfig.c b/lib_dec/ivas_corecoder_dec_reconfig.c index 492339d6d6..a066164da4 100644 --- a/lib_dec/ivas_corecoder_dec_reconfig.c +++ b/lib_dec/ivas_corecoder_dec_reconfig.c @@ -453,7 +453,6 @@ ivas_error ivas_cldfb_dec_reconfig( if ( st_ivas->ivas_format == SBA_FORMAT && nchan_transport_old == 1 && numCldfbAnalyses_old == 2 && st_ivas->nchan_transport > 1 ) { deleteCldfb( &( st_ivas->cldfbAnaDec[1] ) ); - st_ivas->cldfbAnaDec[1] = NULL; numCldfbAnalyses_old--; } @@ -473,7 +472,6 @@ ivas_error ivas_cldfb_dec_reconfig( for ( i = numCldfbAnalyses; i < numCldfbAnalyses_old; i++ ) { deleteCldfb( &( st_ivas->cldfbAnaDec[i] ) ); - st_ivas->cldfbAnaDec[i] = NULL; } } else if ( numCldfbAnalyses_old < numCldfbAnalyses ) @@ -495,7 +493,6 @@ ivas_error ivas_cldfb_dec_reconfig( for ( i = numCldfbSyntheses; i < numCldfbSyntheses_old; i++ ) { deleteCldfb( &( st_ivas->cldfbSynDec[i] ) ); - st_ivas->cldfbSynDec[i] = NULL; } } else if ( numCldfbSyntheses_old < numCldfbSyntheses ) diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index ca4666ae76..0983aee6cb 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -140,7 +140,6 @@ ivas_error ivas_dec( else if ( st_ivas->ivas_format == ISM_FORMAT ) { /* Metadata decoding and configuration */ -#ifdef PARAM_ISM_DTX_CNG if ( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) { if ( ( error = ivas_ism_dtx_dec( st_ivas, nb_bits_metadata ) ) != IVAS_ERR_OK ) @@ -148,15 +147,44 @@ ivas_error ivas_dec( return error; } } - else -#endif - if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + else if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { + // VE: call ivas_ism_metadata_dec() with 'st_ivas' - TBD +#ifdef DISCRETE_ISM_DTX_CNG +#ifdef NCHAN_ISM_PARAMETER + if ( ( error = ivas_ism_metadata_dec( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, st_ivas->hDirAC->hParamIsm ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_ism_metadata_dec( ivas_total_brate, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, st_ivas->hDirAC->hParamIsm ) ) != IVAS_ERR_OK ) +#endif + { + return error; + } +#else +#ifdef NCHAN_ISM_PARAMETER + ivas_ism_metadata_dec( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hDirAC->hParamIsm ); +#else ivas_ism_metadata_dec( ivas_total_brate, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hDirAC->hParamIsm ); +#endif +#endif } else /* ISM_MODE_DISC */ { +#ifdef DISCRETE_ISM_DTX_CNG +#ifdef NCHAN_ISM_PARAMETER + if ( ( error = ivas_ism_metadata_dec( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, NULL ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_ism_metadata_dec( ivas_total_brate, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, NULL ) ) != IVAS_ERR_OK ) +#endif + { + return error; + } +#else +#ifdef NCHAN_ISM_PARAMETER + ivas_ism_metadata_dec( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, NULL ); +#else ivas_ism_metadata_dec( ivas_total_brate, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, NULL ); +#endif +#endif } for ( n = 0; n < st_ivas->nchan_transport; n++ ) @@ -209,7 +237,11 @@ ivas_error ivas_dec( else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) { /* Convert to Ambisonics; used also for ISM->HOA3->binaural rendering */ +#ifdef NCHAN_ISM_PARAMETER + ivas_ism2sba( output, st_ivas->hIsmRendererData, st_ivas->hIsmMetaData, st_ivas->nchan_ism, output_frame, st_ivas->hIntSetup.ambisonics_order ); +#else ivas_ism2sba( output, st_ivas->hIsmRendererData, st_ivas->hIsmMetaData, st_ivas->nchan_transport, output_frame, st_ivas->hIntSetup.ambisonics_order ); +#endif } /* Binaural rendering */ @@ -222,14 +254,10 @@ ivas_error ivas_dec( } else if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { -#ifdef FIX_197_CREND_INTERFACE if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, NULL, NULL, NULL, NULL, output, output_Fs ) ) != IVAS_ERR_OK ) { return error; } -#else - ivas_crend_process( st_ivas, output ); -#endif ivas_binaural_add_LFE( st_ivas, output_frame, output ); } #ifdef DEBUGGING @@ -433,14 +461,10 @@ ivas_error ivas_dec( /* Rendering */ if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { -#ifdef FIX_197_CREND_INTERFACE if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hHeadTrackData, &st_ivas->hIntSetup, st_ivas->hEFAPdata, output, output_Fs ) ) != IVAS_ERR_OK ) { return error; } -#else - ivas_crend_process( st_ivas, output ); -#endif ivas_binaural_add_LFE( st_ivas, output_frame, output ); } diff --git a/lib_dec/ivas_decision_matrix_dec.c b/lib_dec/ivas_decision_matrix_dec.c index 2a99953d23..e5be65ae24 100644 --- a/lib_dec/ivas_decision_matrix_dec.c +++ b/lib_dec/ivas_decision_matrix_dec.c @@ -134,7 +134,7 @@ void ivas_decision_matrix_dec( } else if ( st->element_mode == IVAS_SCE && st->low_rate_mode ) { - /* ISm Low-rate mode -> always WB, ACELP core, IC coder_type */ + /* ISM Low-rate mode -> always WB, ACELP core, IC coder_type */ st->core = ACELP_CORE; } else if ( st->element_mode == IVAS_CPE_MDCT ) @@ -167,7 +167,7 @@ void ivas_decision_matrix_dec( { if ( st->element_mode == IVAS_SCE && st->low_rate_mode ) { - /* ISm Low-rate mode */ + /* ISM Low-rate mode */ st->bwidth = WB; st->coder_type = INACTIVE; *sharpFlag = 0; diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 649cd43b5c..4d3d1adb3c 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -593,10 +593,11 @@ ivas_error ivas_dirac_dec_config( if ( hDirAC->panningConf == DIRAC_PANNING_VBAP ) { - if ( flag_config == DIRAC_RECONFIGURE && st_ivas->hVBAPdata ) + if ( flag_config == DIRAC_RECONFIGURE && st_ivas->hVBAPdata != NULL ) { vbap_free_data( &( st_ivas->hVBAPdata ) ); } + if ( ( error = vbap_init_data( &( st_ivas->hVBAPdata ), ls_azimuth, ls_elevation, nchan_out_woLFE ) ) != IVAS_ERR_OK ) { return error; @@ -604,13 +605,13 @@ ivas_error ivas_dirac_dec_config( } else if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_MONO ) { - if ( flag_config == DIRAC_RECONFIGURE && st_ivas->hVBAPdata ) + if ( flag_config == DIRAC_RECONFIGURE && st_ivas->hVBAPdata != NULL ) { vbap_free_data( &( st_ivas->hVBAPdata ) ); } hDirAC->hoa_decoder = NULL; } - else if ( flag_config == DIRAC_RECONFIGURE && st_ivas->hVBAPdata ) + else if ( flag_config == DIRAC_RECONFIGURE && st_ivas->hVBAPdata != NULL ) { vbap_free_data( &( st_ivas->hVBAPdata ) ); } @@ -1002,10 +1003,18 @@ ivas_error ivas_dirac_dec_config( *------------------------------------------------------------------------*/ void ivas_dirac_dec_close( - DIRAC_DEC_HANDLE hDirAC /* i/o: decoder DirAC handle */ + DIRAC_DEC_HANDLE *hDirAC_out /* i/o: decoder DirAC handle */ ) { int16_t i, j; + DIRAC_DEC_HANDLE hDirAC; + + if ( hDirAC_out == NULL || *hDirAC_out == NULL ) + { + return; + } + + hDirAC = *hDirAC_out; /* Config & CLDFB */ if ( hDirAC->hConfig != NULL ) @@ -1225,7 +1234,8 @@ void ivas_dirac_dec_close( ivas_dirac_free_mem( &( hDirAC->stack_mem ) ); - free( hDirAC ); + free( *hDirAC_out ); + *hDirAC_out = NULL; return; } @@ -2096,6 +2106,7 @@ void ivas_dirac_dec( float *reference_power, *reference_power_smooth; float *onset_filter, *onset_filter_subframe, *p_onset_filter = NULL; uint16_t coherence_flag; + push_wmops( "ivas_dirac_dec" ); /* Initialize aux buffers */ diff --git a/lib_dec/ivas_dirac_output_synthesis_cov.c b/lib_dec/ivas_dirac_output_synthesis_cov.c index 6a79d4563a..a2fc9ee821 100644 --- a/lib_dec/ivas_dirac_output_synthesis_cov.c +++ b/lib_dec/ivas_dirac_output_synthesis_cov.c @@ -190,7 +190,6 @@ void ivas_dirac_dec_output_synthesis_cov_close( DIRAC_OUTPUT_SYNTHESIS_COV_STATE *h_dirac_output_synthesis_state /* i/o: handle for the covariance synthesis state */ ) { - int16_t idx; /*-----------------------------------------------------------------* diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 25813f34b2..bc0a69ae56 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -66,7 +66,7 @@ ivas_error ivas_dec_setup( ) { int16_t k, idx, num_bits_read; - int16_t num_obj, element_mode_flag; + int16_t nchan_ism, element_mode_flag; Decoder_State *st; int32_t ivas_total_brate; ivas_error error; @@ -102,15 +102,34 @@ ivas_error ivas_dec_setup( { /* read the number of objects */ st_ivas->nchan_transport = 1; - num_obj = 1; + nchan_ism = 1; k = (int16_t) ( ( ivas_total_brate / FRAMES_PER_SEC ) - 1 ); - while ( st_ivas->bit_stream[k] && num_obj < MAX_NUM_OBJECTS ) + while ( st_ivas->bit_stream[k] && nchan_ism < MAX_NUM_OBJECTS ) { - num_obj++; + nchan_ism++; k--; } - ivas_ism_dec_config( st_ivas, num_obj ); +#ifdef NCHAN_ISM_PARAMETER + st_ivas->nchan_ism = nchan_ism; +#endif + +#ifdef DISCRETE_ISM_DTX_CNG +#ifdef NCHAN_ISM_PARAMETER + if ( ( error = ivas_ism_dec_config( st_ivas, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_ism_dec_config( st_ivas, st_ivas->ism_mode, nchan_ism ) ) != IVAS_ERR_OK ) +#endif + { + return error; + } +#else +#ifdef NCHAN_ISM_PARAMETER + ivas_ism_dec_config( st_ivas ); +#else + ivas_ism_dec_config( st_ivas, nchan_ism ); +#endif +#endif } else if ( st_ivas->ivas_format == SBA_FORMAT ) { @@ -223,6 +242,11 @@ ivas_error ivas_dec_setup( case SID_MDCT_STEREO: st_ivas->element_mode_init = IVAS_CPE_MDCT; break; +#ifdef DISCRETE_ISM_DTX_CNG + case SID_ISM: + st_ivas->element_mode_init = IVAS_SCE; + break; +#endif case SID_MASA_1TC: st_ivas->element_mode_init = IVAS_SCE; st_ivas->nchan_transport = 1; @@ -402,19 +426,26 @@ static ivas_error ivas_read_format( break; case SID_ISM: st_ivas->ivas_format = ISM_FORMAT; -#ifdef PARAM_ISM_DTX_CNG - +#ifndef DISCRETE_ISM_DTX_CNG if ( st_ivas->ism_mode == ISM_MODE_DISC ) { - ivas_ism_dec_config( st_ivas, 1 ); /* currently DTX supported for 1 ISM when ISM Mode is DISC_ISM */ + ivas_ism_dec_config( st_ivas +#ifndef NCHAN_ISM_PARAMETER + , + 1 +#endif + ); /* currently DTX supported for 1 ISM when ISM Mode is DISC_ISM */ } if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { - ivas_ism_dec_config( st_ivas, st_ivas->nSCE ); /* for Param-ISM, we need to generate 2 TCs */ + ivas_ism_dec_config( st_ivas +#ifndef NCHAN_ISM_PARAMETER + , + st_ivas->nSCE +#endif + ); /* for Param-ISM, we need to generate 2 TCs */ } -#else - ivas_ism_dec_config( st_ivas, 1 ); /* currently DTX supported for 1ISM only */ #endif break; case SID_MULTICHANNEL: @@ -756,6 +787,57 @@ ivas_error ivas_init_decoder( } } +#ifdef FIX_I109_ORIENTATION_TRACKING + /*-----------------------------------------------------------------* + * Set head/orientation tracking + *-----------------------------------------------------------------*/ + + if ( st_ivas->hDecoderConfig->Opt_Headrotation ) + { + if ( st_ivas->hDecoderConfig->orientation_tracking == IVAS_ORIENT_TRK_NONE ) + { + if ( ( error = ivas_orient_trk_SetTrackingType( st_ivas->hHeadTrackData->OrientationTracker, OTR_TRACKING_NONE ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->hDecoderConfig->orientation_tracking == IVAS_ORIENT_TRK_AVG ) + { + if ( ( error = ivas_orient_trk_SetTrackingType( st_ivas->hHeadTrackData->OrientationTracker, OTR_TRACKING_AVG_ORIENT ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->hDecoderConfig->orientation_tracking == IVAS_ORIENT_TRK_REF ) + { + if ( ( error = ivas_orient_trk_SetTrackingType( st_ivas->hHeadTrackData->OrientationTracker, OTR_TRACKING_REF_ORIENT ) ) != IVAS_ERR_OK ) + { + return error; + } + } +#ifdef OTR_REFERENCE_VECTOR_TRACKING + else if ( st_ivas->hDecoderConfig->orientation_tracking == IVAS_ORIENT_TRK_REF_VEC ) + { + if ( ( error = ivas_orient_trk_SetTrackingType( st_ivas->hHeadTrackData->OrientationTracker, OTR_TRACKING_REF_VEC ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->hDecoderConfig->orientation_tracking == IVAS_ORIENT_TRK_REF_VEC_LEV ) + { + if ( ( error = ivas_orient_trk_SetTrackingType( st_ivas->hHeadTrackData->OrientationTracker, OTR_TRACKING_REF_VEC_LEV ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + return IVAS_ERR_WRONG_MODE; + } +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ + } +#endif + /*-----------------------------------------------------------------* * Allocate and initialize SCE/CPE and other handles *-----------------------------------------------------------------*/ @@ -813,8 +895,8 @@ ivas_error ivas_init_decoder( if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { - st_ivas->nchan_transport = 2; - st_ivas->nSCE = 2; + st_ivas->nchan_transport = MAX_PARAM_ISM_WAVE; + st_ivas->nSCE = MAX_PARAM_ISM_WAVE; if ( ( error = ivas_param_ism_dec_open( st_ivas ) ) != IVAS_ERR_OK ) { @@ -835,14 +917,16 @@ ivas_error ivas_init_decoder( } reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); + +#ifdef DISCRETE_ISM_DTX_CNG + st_ivas->hSCE[sce_id]->hCoreCoder[0]->is_ism_format = 1; +#endif } -#ifdef PARAM_ISM_DTX_CNG if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { st_ivas->hSCE[1]->hCoreCoder[0]->hFdCngDec->hFdCngCom->seed3 = st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->seed2; } -#endif } else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) { @@ -863,11 +947,7 @@ ivas_error ivas_init_decoder( { if ( st_ivas->sba_mode == SBA_MODE_SPAR ) { -#ifdef SBA_BR_SWITCHING_CLEAN_UP if ( ( error = ivas_spar_dec_open( st_ivas, 0 ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_spar_dec_open( st_ivas ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -1226,29 +1306,10 @@ ivas_error ivas_init_decoder( if ( st_ivas->hRenderConfig->roomAcoustics.late_reverb_on ) { -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND if ( ( error = ivas_reverb_open( &st_ivas->hReverb, st_ivas->hDecoderConfig->output_config, NULL, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) { return error; } -#else -#ifdef FIX_197_CREND_INTERFACE -#ifdef FIX_329_ENABLE_TD_RENDERER_REVERB_MC - if ( ( error = ivas_rend_initCrendWrapper( &st_ivas->hCrendWrapper ) ) != IVAS_ERR_OK ) -#else - if ( ( st_ivas->hCrendWrapper = (CREND_WRAPPER_HANDLE) malloc( sizeof( CREND_WRAPPER ) ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend Wrapper\n" ); - } - if ( ( st_ivas->hCrendWrapper->hCrend = (CREND_HANDLE) malloc( sizeof( CREND_DATA ) ) ) == NULL ) -#endif -#else - if ( ( st_ivas->hCrend = (CREND_HANDLE) malloc( sizeof( CREND_DATA ) ) ) == NULL ) -#endif - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend\n" ); - } -#endif } } else if ( st_ivas->renderer_type == RENDERER_MC ) @@ -1267,7 +1328,6 @@ ivas_error ivas_init_decoder( } else if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { -#ifdef FIX_197_CREND_INTERFACE if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM && st_ivas->ivas_format == MC_FORMAT && st_ivas->hDecoderConfig->Opt_Headrotation ) { if ( ( error = efap_init_data( &( st_ivas->hEFAPdata ), st_ivas->hIntSetup.ls_azimuth, st_ivas->hIntSetup.ls_elevation, st_ivas->hIntSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) @@ -1276,19 +1336,18 @@ ivas_error ivas_init_decoder( } } +#ifdef FIX_I109_ORIENTATION_TRACKING + if ( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, + st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->Opt_Headrotation, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) +#endif { return error; } st_ivas->binaural_latency_ns = st_ivas->hCrendWrapper->binaural_latency_ns; -#else - if ( ivas_crend_open( st_ivas ) != IVAS_ERR_OK ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "ivas_crend_open failed" ); - } -#endif } if ( st_ivas->ivas_format == ISM_FORMAT && @@ -1400,7 +1459,7 @@ void destroy_core_dec( DEC_CORE_HANDLE hCoreCoder /* i/o: core decoder structure */ ) { - destroy_decoder( hCoreCoder ); + destroy_cldfb_decoder( hCoreCoder ); if ( hCoreCoder->hGSCDec != NULL ) { @@ -1594,15 +1653,8 @@ void ivas_initialize_handles_dec( st_ivas->hIsmRendererData = NULL; st_ivas->hBinRendererTd = NULL; st_ivas->hMonoDmxRenderer = NULL; -#ifdef FIX_197_CREND_INTERFACE st_ivas->hCrendWrapper = NULL; -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND st_ivas->hReverb = NULL; -#endif -#else - st_ivas->hCrend = NULL; - st_ivas->hHrtf = NULL; -#endif st_ivas->hSetOfHRTF = NULL; st_ivas->hHrtfFastConv = NULL; st_ivas->hHrtfParambin = NULL; @@ -1627,7 +1679,7 @@ void ivas_destroy_dec( Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ ) { - int16_t i, n; + int16_t i; /* CLDFB handles */ for ( i = 0; i < MAX_INTERN_CHANNELS; i++ ) @@ -1635,7 +1687,6 @@ void ivas_destroy_dec( if ( st_ivas->cldfbAnaDec[i] != NULL ) { deleteCldfb( &( st_ivas->cldfbAnaDec[i] ) ); - st_ivas->cldfbAnaDec[i] = NULL; } } @@ -1644,7 +1695,6 @@ void ivas_destroy_dec( if ( st_ivas->cldfbSynDec[i] != NULL ) { deleteCldfb( &( st_ivas->cldfbSynDec[i] ) ); - st_ivas->cldfbSynDec[i] = NULL; } } @@ -1674,13 +1724,6 @@ void ivas_destroy_dec( } } - /* LFE handle */ - if ( st_ivas->hLFE != NULL ) - { - ivas_lfe_dec_close( st_ivas->hLFE ); - st_ivas->hLFE = NULL; - } - /* HP20 filter handles */ if ( st_ivas->mem_hp20_out != NULL ) { @@ -1694,16 +1737,9 @@ void ivas_destroy_dec( } /* ISM metadata handles */ - for ( n = 0; n < MAX_NUM_OBJECTS; n++ ) - { - if ( st_ivas->hIsmMetaData[n] != NULL ) - { - free( st_ivas->hIsmMetaData[n] ); - st_ivas->hIsmMetaData[n] = NULL; - } - } + ivas_ism_metadata_close( st_ivas->hIsmMetaData ); - /* ISm renderer handle */ + /* ISM renderer handle */ if ( st_ivas->hIsmRendererData != NULL ) { free( st_ivas->hIsmRendererData ); @@ -1711,30 +1747,18 @@ void ivas_destroy_dec( } /* DirAC handle */ - if ( st_ivas->hDirAC != NULL ) + if ( st_ivas->ivas_format == ISM_FORMAT ) { - if ( st_ivas->ivas_format == ISM_FORMAT ) - { - ivas_param_ism_dec_close( st_ivas->hDirAC, st_ivas->hDecoderConfig->output_config ); - } - else - { - ivas_dirac_dec_close( st_ivas->hDirAC ); - } - st_ivas->hDirAC = NULL; + ivas_param_ism_dec_close( &( st_ivas->hDirAC ), st_ivas->hDecoderConfig->output_config ); } - - /* Spar handle */ - if ( st_ivas->hSpar != NULL ) + else { -#ifdef SBA_BR_SWITCHING_CLEAN_UP - ivas_spar_dec_close( st_ivas->hSpar, st_ivas->hDecoderConfig->output_Fs, 0 ); -#else - ivas_spar_dec_close( st_ivas->hSpar, st_ivas->hDecoderConfig->output_Fs ); -#endif - st_ivas->hSpar = NULL; + ivas_dirac_dec_close( &( st_ivas->hDirAC ) ); } + /* SPAR handle */ + ivas_spar_dec_close( &( st_ivas->hSpar ), st_ivas->hDecoderConfig->output_Fs, 0 ); + /* HOA decoder matrix */ if ( st_ivas->hoa_dec_mtx != NULL ) { @@ -1742,12 +1766,18 @@ void ivas_destroy_dec( st_ivas->hoa_dec_mtx = NULL; } + /* MASA decoder structure */ + ivas_masa_dec_close( &( st_ivas->hMasa ) ); + /* Qmetadata handle */ ivas_qmetadata_close( &st_ivas->hQMetaData ); /* MCT handle */ ivas_mct_dec_close( &st_ivas->hMCT ); + /* LFE handle */ + ivas_lfe_dec_close( &( st_ivas->hLFE ) ); + /* Parametric MC handle */ ivas_param_mc_dec_close( &st_ivas->hParamMC ); @@ -1764,15 +1794,10 @@ void ivas_destroy_dec( ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); /* Crend handle */ -#ifdef FIX_197_CREND_INTERFACE ivas_rend_closeCrend( &( st_ivas->hCrendWrapper ) ); -#else - ivas_crend_close( st_ivas ); -#endif -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND + /* Reverb handle */ ivas_reverb_close( &st_ivas->hReverb ); -#endif /* LS config converter handle */ ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion ); @@ -1784,13 +1809,6 @@ void ivas_destroy_dec( st_ivas->hLsSetupCustom = NULL; } - /* MASA decoder structure */ - if ( st_ivas->hMasa != NULL ) - { - ivas_masa_dec_close( st_ivas->hMasa ); - st_ivas->hMasa = NULL; - } - /* Downmix structure */ if ( st_ivas->hMonoDmxRenderer != NULL ) { @@ -1799,11 +1817,15 @@ void ivas_destroy_dec( } /* Head track data handle */ +#ifdef FIX_I109_ORIENTATION_TRACKING + ivas_headTrack_close( &st_ivas->hHeadTrackData ); +#else if ( st_ivas->hHeadTrackData != NULL ) { free( st_ivas->hHeadTrackData ); st_ivas->hHeadTrackData = NULL; } +#endif /* Time Domain binaural renderer handle */ if ( st_ivas->hBinRendererTd != NULL ) @@ -1818,22 +1840,13 @@ void ivas_destroy_dec( } /* CRend binaural renderer handle */ - if ( st_ivas->hSetOfHRTF != NULL ) - { - ivas_HRTF_CRend_binary_close( &st_ivas->hSetOfHRTF ); - } + ivas_HRTF_CRend_binary_close( &st_ivas->hSetOfHRTF ); /* Fastconv HRTF filters */ - if ( st_ivas->hHrtfFastConv != NULL ) - { - ivas_HRTF_fastconv_binary_close( &st_ivas->hHrtfFastConv ); - } + ivas_HRTF_fastconv_binary_close( &st_ivas->hHrtfFastConv ); /* Parametric binauralizer HRTF filters */ - if ( st_ivas->hHrtfParambin != NULL ) - { - ivas_HRTF_parambin_binary_close( &st_ivas->hHrtfParambin ); - } + ivas_HRTF_parambin_binary_close( &st_ivas->hHrtfParambin ); /* Config. Renderer */ ivas_render_config_close( &( st_ivas->hRenderConfig ) ); @@ -2064,7 +2077,7 @@ static ivas_error doSanityChecks_IVAS( /* Verify ISM output configuration */ if ( output_config == AUDIO_CONFIG_INVALID ) { - return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for ISm" ); + return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for ISM" ); } } else if ( st_ivas->ivas_format == SBA_FORMAT ) @@ -2100,20 +2113,6 @@ static ivas_error doSanityChecks_IVAS( } #ifdef DEBUGGING -#ifndef REMOVE_FORCE_SUBFRAME_BIN - if ( st_ivas->hDecoderConfig->forceSubframeBinauralization ) - { - /* Note about resolution of Binaural Renderers: * - * - Parametric Binaural Renderer: 20 ms by default, can be forced to subframe (5 ms) resolution * - * - FastConv Binaural Renderer: 5 ms by default * - * - TD objects Binaural Renderer: 20 ms by default */ - - if ( !( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) || !( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MC_FORMAT || st_ivas->ivas_format == ISM_FORMAT ) ) - { - return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Wrong set-up: Forced subframe resolution parametric binauralization activated for non-binaural output." ); - } - } -#endif if ( ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) && ( ( st_ivas->ivas_format != MC_FORMAT && st_ivas->ivas_format != ISM_FORMAT ) || output_config != AUDIO_CONFIG_BINAURAL || ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_PARAM ) || ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode != MC_MODE_MCT ) ) ) { return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration: Time Domain object renderer not supported in this configuration" ); diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index 0bda9f5ae0..5e0b475e3e 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -49,8 +49,11 @@ static ivas_error ivas_ism_bitrate_switching( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const int16_t nchan_transport_old, /* i : last number of transport channels */ - const ISM_MODE last_ism_mode, /* i : last ISM mode */ - const int16_t num_obj /* i : number of objects in the bitstream */ + const ISM_MODE last_ism_mode /* i : last ISM mode */ +#ifndef NCHAN_ISM_PARAMETER + , + const int16_t num_obj /* i : number of objects in the bitstream */ +#endif ) { ivas_error error; @@ -62,7 +65,11 @@ static ivas_error ivas_ism_bitrate_switching( nCPE_old = st_ivas->nCPE; nSCE_old = st_ivas->nSCE; +#ifdef NCHAN_ISM_PARAMETER + if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->nchan_ism, NULL, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, num_obj, NULL, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -113,11 +120,7 @@ static ivas_error ivas_ism_bitrate_switching( if ( st_ivas->ism_mode == ISM_MODE_DISC && last_ism_mode == ISM_MODE_PARAM ) { /* Deallocate the ParamISM struct */ - if ( st_ivas->hDirAC != NULL ) - { - ivas_param_ism_dec_close( st_ivas->hDirAC, st_ivas->hDecoderConfig->output_config ); - st_ivas->hDirAC = NULL; - } + ivas_param_ism_dec_close( &( st_ivas->hDirAC ), st_ivas->hDecoderConfig->output_config ); if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL ) { @@ -151,12 +154,13 @@ static ivas_error ivas_ism_bitrate_switching( ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); /* Open Crend Binaural renderer */ -#ifdef FIX_197_CREND_INTERFACE if ( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hRenderConfig, +#ifndef FIX_I109_ORIENTATION_TRACKING st_ivas->hDecoderConfig->Opt_Headrotation, +#endif st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) { @@ -164,9 +168,6 @@ static ivas_error ivas_ism_bitrate_switching( } st_ivas->binaural_latency_ns = st_ivas->hCrendWrapper->binaural_latency_ns; -#else - ivas_crend_open( st_ivas ); -#endif } } @@ -227,16 +228,7 @@ static ivas_error ivas_ism_bitrate_switching( } /* close the crend binaural renderer */ -#ifdef FIX_197_CREND_INTERFACE ivas_rend_closeCrend( &( st_ivas->hCrendWrapper ) ); -#else - ivas_crend_close( st_ivas ); - - if ( st_ivas->hHrtf != NULL ) - { - st_ivas->hHrtf = NULL; - } -#endif } } @@ -251,14 +243,22 @@ static ivas_error ivas_ism_bitrate_switching( * - reconfigure the ISM format decoder *-------------------------------------------------------------------------*/ -/*! r : ISM format mode */ ivas_error ivas_ism_dec_config( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const int16_t num_obj /* i : number of objects in the bitstream */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +#ifdef DISCRETE_ISM_DTX_CNG + , + const ISM_MODE last_ism_mode /* i/o: last ISM mode */ +#endif +#ifndef NCHAN_ISM_PARAMETER + , + const int16_t num_obj /* i : number of objects in the bitstream */ +#endif ) { int32_t ivas_total_brate; +#ifndef DISCRETE_ISM_DTX_CNG ISM_MODE last_ism_mode; +#endif ivas_error error; int16_t nchan_transport_old; @@ -266,11 +266,17 @@ ivas_error ivas_ism_dec_config( ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; +#ifndef DISCRETE_ISM_DTX_CNG /* store last frame ISM mode */ last_ism_mode = st_ivas->ism_mode; +#endif /* Assumes that num of input objects are constant */ +#ifdef NCHAN_ISM_PARAMETER + nchan_transport_old = st_ivas->nchan_ism; +#else nchan_transport_old = num_obj; +#endif if ( last_ism_mode == ISM_MODE_PARAM ) { @@ -280,45 +286,103 @@ ivas_error ivas_ism_dec_config( if ( !st_ivas->bfi && ivas_total_brate != IVAS_SID_5k2 && ivas_total_brate != FRAME_NO_DATA ) { /* select ISM format mode */ +#ifdef NCHAN_ISM_PARAMETER + st_ivas->ism_mode = ivas_ism_mode_select( st_ivas->nchan_ism, ivas_total_brate ); + + st_ivas->nchan_transport = st_ivas->nchan_ism; +#else st_ivas->ism_mode = ivas_ism_mode_select( num_obj, ivas_total_brate ); st_ivas->nchan_transport = num_obj; +#endif if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { - st_ivas->nchan_transport = 2; + st_ivas->nchan_transport = MAX_PARAM_ISM_WAVE; if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL ) { +#ifdef NCHAN_ISM_PARAMETER + st_ivas->hDecoderConfig->nchan_out = st_ivas->nchan_ism; +#else st_ivas->hDecoderConfig->nchan_out = num_obj; +#endif } } if ( st_ivas->ini_active_frame != 0 ) { /* ISM bit-rate switching */ +#ifndef DISCRETE_ISM_DTX_CNG if ( st_ivas->hDecoderConfig->last_ivas_total_brate != IVAS_SID_5k2 && st_ivas->hDecoderConfig->last_ivas_total_brate != FRAME_NO_DATA ) +#endif { if ( ( st_ivas->ism_mode != last_ism_mode ) || ( st_ivas->hDecoderConfig->ivas_total_brate != st_ivas->hDecoderConfig->last_ivas_total_brate ) ) { - ivas_ism_bitrate_switching( st_ivas, nchan_transport_old, last_ism_mode, num_obj ); +#ifdef NCHAN_ISM_PARAMETER + if ( ( error = ivas_ism_bitrate_switching( st_ivas, nchan_transport_old, last_ism_mode ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_ism_bitrate_switching( st_ivas, nchan_transport_old, last_ism_mode, num_obj ) ) != IVAS_ERR_OK ) +#endif + { + return error; + } } } } } else if ( !st_ivas->bfi && ivas_total_brate == IVAS_SID_5k2 ) { -#ifdef PARAM_ISM_DTX_CNG +#ifdef DISCRETE_ISM_DTX_CNG +#ifdef NCHAN_ISM_PARAMETER + st_ivas->nchan_transport = st_ivas->nchan_ism; +#else + st_ivas->nchan_transport = num_obj; +#endif + if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + st_ivas->nchan_transport = MAX_PARAM_ISM_WAVE; + if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL ) + { +#ifdef NCHAN_ISM_PARAMETER + st_ivas->hDecoderConfig->nchan_out = st_ivas->nchan_ism; +#else + st_ivas->hDecoderConfig->nchan_out = num_obj; +#endif + } + } + + /* ISM mode switching */ + if ( st_ivas->ism_mode != last_ism_mode ) + { +#ifdef NCHAN_ISM_PARAMETER + if ( ( error = ivas_ism_bitrate_switching( st_ivas, nchan_transport_old, last_ism_mode ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_ism_bitrate_switching( st_ivas, nchan_transport_old, last_ism_mode, num_obj ) ) != IVAS_ERR_OK ) +#endif + { + return error; + } + } +#else if ( last_ism_mode == ISM_MODE_PARAM ) { nchan_transport_old = MAX_PARAM_ISM_WAVE; } else -#endif { +#ifdef NCHAN_ISM_PARAMETER + st_ivas->nchan_transport = st_ivas->nchan_ism; +#else st_ivas->nchan_transport = num_obj; +#endif } +#endif } +#ifdef NCHAN_ISM_PARAMETER + switch ( st_ivas->nchan_ism ) +#else switch ( num_obj ) +#endif { case 1: st_ivas->transport_config = AUDIO_CONFIG_ISM1; diff --git a/lib_dec/ivas_ism_dtx_dec.c b/lib_dec/ivas_ism_dtx_dec.c index bd15569f9e..ef52c082b7 100644 --- a/lib_dec/ivas_ism_dtx_dec.c +++ b/lib_dec/ivas_ism_dtx_dec.c @@ -40,7 +40,6 @@ #include "wmc_auto.h" -#ifdef PARAM_ISM_DTX_CNG /*-------------------------------------------------------------------* * ivas_ism_preprocessing() * @@ -52,19 +51,24 @@ static void ivas_ism_preprocessing( const int16_t sce_id /* i : SCE # identifier */ ) { +#ifndef DISCRETE_ISM_DTX_CNG int32_t ivas_total_brate; - SCE_DEC_HANDLE hSCE; +#endif Decoder_State *st; - hSCE = st_ivas->hSCE[sce_id]; - st = hSCE->hCoreCoder[0]; + st = st_ivas->hSCE[sce_id]->hCoreCoder[0]; +#ifndef DISCRETE_ISM_DTX_CNG ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; if ( ( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) ) +#endif { - /* reset the bitstream to atleast read the cng type and bandwidth for non transmitted SCE */ + /* reset the bitstream to at least read the cng type and bandwidth for non transmitted SCE */ st->bit_stream = st_ivas->hSCE[0]->hCoreCoder[0]->bit_stream; +#ifdef DISCRETE_ISM_DTX_CNG + st->next_bit_pos = 0; /* note: needed in paramISM -> discISM switching */ +#endif if ( sce_id == st_ivas->hISMDTX.sce_id_dtx ) { @@ -75,12 +79,14 @@ static void ivas_ism_preprocessing( st->read_sid_info = 0; /* do not read the sid info from bitstream but use the estimated noise */ } - st->cng_paramISM_flag = 1; + st->cng_ism_flag = 1; } +#ifndef DISCRETE_ISM_DTX_CNG else { - st->cng_paramISM_flag = 0; + st->cng_ism_flag = 0; } +#endif return; } @@ -97,77 +103,168 @@ ivas_error ivas_ism_dtx_dec( int16_t *nb_bits_metadata /* o : number of metadata bits */ ) { - int16_t ch, pos, num_obj, num_obj_prev; + int16_t ch, pos, nchan_ism, nchan_ism_prev; int32_t ivas_total_brate; +#ifdef DISCRETE_ISM_DTX_CNG + int16_t md_diff_flag[MAX_NUM_OBJECTS]; + int16_t idx, flag_noisy_speech, sce_id_dtx; + ISM_MODE last_ism_mode, ism_mode_bstr; + ivas_error error; +#endif ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; +#ifndef DISCRETE_ISM_DTX_CNG if ( st_ivas->nchan_transport == 1 ) { nb_bits_metadata[0] = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC; return IVAS_ERR_OK; } +#endif +#ifdef NCHAN_ISM_PARAMETER + nchan_ism_prev = st_ivas->nchan_ism; +#else if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { - num_obj_prev = st_ivas->hDirAC->hParamIsm->num_obj; + nchan_ism_prev = st_ivas->hDirAC->hParamIsm->num_obj; } else /* ism_mode == ISM_MODE_DISC */ { - num_obj_prev = st_ivas->nchan_transport; + nchan_ism_prev = st_ivas->nchan_transport; } +#endif - /* read number of objects */ if ( !st_ivas->bfi && ivas_total_brate == IVAS_SID_5k2 ) { - num_obj = 1; + /* read number of objects */ + nchan_ism = 1; pos = (int16_t) ( ( ivas_total_brate / FRAMES_PER_SEC ) - 1 - SID_FORMAT_NBITS ); - while ( get_indice( st_ivas->hSCE[0]->hCoreCoder[0], pos, 1 ) == 1 && num_obj < MAX_NUM_OBJECTS ) + while ( get_indice( st_ivas->hSCE[0]->hCoreCoder[0], pos, 1 ) == 1 && nchan_ism < MAX_NUM_OBJECTS ) { - ( num_obj )++; + ( nchan_ism )++; pos--; } +#ifdef NCHAN_ISM_PARAMETER + st_ivas->nchan_ism = nchan_ism; +#endif +#ifdef DISCRETE_ISM_DTX_CNG + pos--; +#endif - if ( num_obj != num_obj_prev ) + if ( nchan_ism != nchan_ism_prev ) { /* IVAS_fmToDo: more work needed when the number of transported objects is not constant */ return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "wrong number of objects signalled!" ); } - ivas_ism_dec_config( st_ivas, num_obj ); +#ifdef DISCRETE_ISM_DTX_CNG + last_ism_mode = st_ivas->ism_mode; + + /* read ism_mode */ + if ( nchan_ism > 2 ) + { + pos -= nchan_ism; /* SID metadata flags */ + + idx = get_indice( st_ivas->hSCE[0]->hCoreCoder[0], pos, 1 ); + ism_mode_bstr = (ISM_MODE) ( idx + 1 ); + st_ivas->ism_mode = ism_mode_bstr; + } + +#ifdef NCHAN_ISM_PARAMETER + if ( ( error = ivas_ism_dec_config( st_ivas, last_ism_mode ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_ism_dec_config( st_ivas, last_ism_mode, nchan_ism ) ) != IVAS_ERR_OK ) +#endif + { + return error; + } +#else +#ifdef NCHAN_ISM_PARAMETER + ivas_ism_dec_config( st_ivas ); +#else + ivas_ism_dec_config( st_ivas, nchan_ism ); +#endif if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { - st_ivas->hDirAC->hParamIsm->num_obj = num_obj; +#ifdef NCHAN_ISM_PARAMETER + st_ivas->nchan_transport = 2; +#else + st_ivas->hDirAC->hParamIsm->num_obj = nchan_ism; +#endif } else /* ism_mode == ISM_MODE_DISC */ { - st_ivas->nchan_transport = num_obj; + st_ivas->nchan_transport = nchan_ism; } +#endif } else { - num_obj = num_obj_prev; + nchan_ism = nchan_ism_prev; } /* Metadata decoding and dequantization */ +#ifdef DISCRETE_ISM_DTX_CNG + ivas_ism_metadata_sid_dec( st_ivas->hSCE, ivas_total_brate, st_ivas->bfi, nchan_ism, st_ivas->nchan_transport, st_ivas->ism_mode, + &flag_noisy_speech, &sce_id_dtx, st_ivas->hIsmMetaData, nb_bits_metadata ); + + if ( ivas_total_brate == IVAS_SID_5k2 && !st_ivas->bfi ) + { + if ( st_ivas->hDirAC != NULL ) + { + st_ivas->hDirAC->hParamIsm->flag_noisy_speech = flag_noisy_speech; + } + + st_ivas->hISMDTX.sce_id_dtx = sce_id_dtx; + } +#else ivas_param_ism_metadata_dtx_dec( st_ivas ); +#endif + +#ifdef DISCRETE_ISM_DTX_CNG + set_s( md_diff_flag, 1, nchan_ism ); - for ( ch = 0; ch < st_ivas->nchan_transport; ch++ ) + if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { - nb_bits_metadata[ch] = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC; + for ( ch = 0; ch < nchan_ism; ch++ ) + { + st_ivas->hDirAC->azimuth_values[ch] = st_ivas->hIsmMetaData[ch]->azimuth; + st_ivas->hDirAC->elevation_values[ch] = st_ivas->hIsmMetaData[ch]->elevation; + } } + update_last_metadata( nchan_ism, st_ivas->hIsmMetaData, md_diff_flag ); + + st_ivas->hISMDTX.ism_dtx_hangover_cnt = 0; +#endif + + if ( ivas_total_brate == IVAS_SID_5k2 && !st_ivas->bfi ) + { + for ( ch = 0; ch < st_ivas->nchan_transport; ch++ ) + { +#ifdef DISCRETE_ISM_DTX_CNG + nb_bits_metadata[ch] = nb_bits_metadata[sce_id_dtx]; +#else + nb_bits_metadata[ch] = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC; +#endif + } + } + +#ifdef DISCRETE_ISM_DTX_CNG + if ( !st_ivas->bfi ) +#else if ( st_ivas->ism_mode == ISM_MODE_PARAM ) +#endif { for ( ch = 0; ch < st_ivas->nchan_transport; ch++ ) { - ivas_ism_preprocessing( st_ivas, ch ); + ivas_ism_preprocessing( st_ivas, ch ); // VE: after the acceptance of switches, replace the function call by its content } } return IVAS_ERR_OK; } -#endif diff --git a/lib_dec/ivas_ism_metadata_dec.c b/lib_dec/ivas_ism_metadata_dec.c index 53c1e9d2e9..99f94fa536 100644 --- a/lib_dec/ivas_ism_metadata_dec.c +++ b/lib_dec/ivas_ism_metadata_dec.c @@ -37,47 +37,165 @@ #include "ivas_rom_com.h" #include "prot.h" #include "ivas_stat_enc.h" +#ifdef DISCRETE_ISM_DTX_CNG +#include +#endif #ifdef DEBUGGING #include "debug.h" #endif #include "wmc_auto.h" +#ifdef TD5 +/*-----------------------------------------------------------------------* + * Local functions + *-----------------------------------------------------------------------*/ + +static void decode_angle_indices( DEC_CORE_HANDLE st0, ISM_METADATA_ANGLE_HANDLE angle, int16_t *flag_abs_azimuth ); + +static int16_t decode_radius( DEC_CORE_HANDLE st0, int16_t *last_radius_idx, int16_t *flag_abs_radius ); +#endif + +#ifdef DISCRETE_ISM_DTX_CNG +/*-------------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------------*/ + +#define IVAS_ISM_DTX_HO_MAX 5 + +#define CNG_MD_MAX_DIFF_AZIMUTH 5 +#define CNG_MD_MAX_DIFF_ELEVATION 5 + + +/*-------------------------------------------------------------------* + * ism_metadata_smooth() + * + * Smooth the metadata evolution + *-------------------------------------------------------------------*/ + +static void ism_metadata_smooth( + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + const int32_t ism_total_brate, /* i : ISms total bitrate */ + const int16_t nchan_ism /* i : number of objects */ +) +{ + ISM_METADATA_HANDLE hIsmMetaData; + int16_t ch; + float diff; + + for ( ch = 0; ch < nchan_ism; ch++ ) + { + hIsmMetaData = hIsmMeta[ch]; + + /* smooth azimuth */ + diff = hIsmMetaData->last_true_azimuth - hIsmMetaData->last_azimuth; + + if ( diff > ISM_AZIMUTH_MAX ) + { + diff -= ( ISM_AZIMUTH_MAX - ISM_AZIMUTH_MIN ); + hIsmMetaData->last_azimuth += ( ISM_AZIMUTH_MAX - ISM_AZIMUTH_MIN ); + } + else if ( diff < ISM_AZIMUTH_MIN ) + { + diff += ( ISM_AZIMUTH_MAX - ISM_AZIMUTH_MIN ); + } + + if ( ism_total_brate > IVAS_SID_5k2 && fabsf( diff ) > IVAS_ISM_DTX_HO_MAX * CNG_MD_MAX_DIFF_AZIMUTH ) + { + /* skip the smoothing */ + } + else if ( fabsf( diff ) > CNG_MD_MAX_DIFF_AZIMUTH ) + { + hIsmMetaData->azimuth = hIsmMetaData->last_azimuth + sign( diff ) * CNG_MD_MAX_DIFF_AZIMUTH; + } + else if ( diff != 0 ) + { + hIsmMetaData->azimuth = hIsmMetaData->last_true_azimuth; + } + + if ( hIsmMetaData->azimuth > ISM_AZIMUTH_MAX ) + { + hIsmMetaData->azimuth -= ( ISM_AZIMUTH_MAX - ISM_AZIMUTH_MIN ); + } + + /* smooth elevation */ + diff = hIsmMetaData->last_true_elevation - hIsmMetaData->last_elevation; + + if ( ism_total_brate > IVAS_SID_5k2 && diff > IVAS_ISM_DTX_HO_MAX * CNG_MD_MAX_DIFF_ELEVATION ) + { + /* skip the smoothing */ + } + else if ( fabsf( diff ) > CNG_MD_MAX_DIFF_ELEVATION ) + { + hIsmMetaData->elevation = hIsmMetaData->last_elevation + sign( diff ) * CNG_MD_MAX_DIFF_ELEVATION; + } + } + + return; +} +#endif + + /*-------------------------------------------------------------------------* * ivas_ism_metadata_dec() * - * decode and dequantize ISm metadata + * decode and dequantize ISM metadata *-------------------------------------------------------------------------*/ ivas_error ivas_ism_metadata_dec( - const int32_t ism_total_brate, /* i : ISms total bitrate */ - int16_t *nchan_transport, /* o : number of transport channels */ - ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ - SCE_DEC_HANDLE hSCE[], /* i/o: SCE decoder handles */ - const int16_t bfi, /* i : bfi flag */ - int16_t nb_bits_metadata[], /* o : number of metadata bits */ - ISM_MODE ism_mode, /* i : ISM mode */ + const int32_t ism_total_brate, /* i : ISM total bitrate */ +#ifdef NCHAN_ISM_PARAMETER + const int16_t nchan_ism, /* i : number of ISM channels */ +#endif + int16_t *nchan_transport, /* o : number of transport channels */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + SCE_DEC_HANDLE hSCE[], /* i/o: SCE decoder handles */ + const int16_t bfi, /* i : bfi flag */ + int16_t nb_bits_metadata[], /* o : number of metadata bits */ + ISM_MODE ism_mode, /* i : ISM mode */ +#ifdef DISCRETE_ISM_DTX_CNG + ISM_DTX_DATA_DEC hISMDTX, /* i/o: ISM DTX structure */ +#endif const PARAM_ISM_CONFIG_HANDLE hParamIsm /* i : Param ISM Config Handle */ ) { +#ifdef TD5 + int16_t ch, nb_bits_start = 0, last_bit_pos; + int16_t idx_radius; +#else int16_t ch, nb_bits_start = 0, last_bit_pos, sgn, diff; +#endif int32_t element_brate[MAX_NUM_OBJECTS], total_brate[MAX_NUM_OBJECTS]; DEC_CORE_HANDLE st0; +#ifdef TD5 + int16_t ism_extended_metadata_flag; + int16_t flag_abs_radius; + int16_t flag_abs_orientation; + int16_t idx_azimuth, flag_abs_azimuth; + int16_t idx_elevation; +#else int16_t idx_azimuth, nbits_diff_azimuth, flag_abs_azimuth; int16_t idx_elevation, nbits_diff_elevation; +#endif int16_t next_bit_pos_orig; uint16_t i, bstr_meta[MAX_BITS_METADATA], *bstr_orig; ISM_METADATA_HANDLE hIsmMetaData; int16_t nchan_transport_prev, ism_metadata_flag_global; int16_t localVAD[MAX_NUM_OBJECTS]; int16_t ism_imp[MAX_NUM_OBJECTS]; - int16_t num_obj = 0, nbands, nblocks; +#ifdef NCHAN_ISM_PARAMETER + int16_t nbands, nblocks; +#else + int16_t nchan_ism = 0, nbands, nblocks; +#endif +#ifdef DISCRETE_ISM_DTX_CNG + int16_t md_diff_flag[MAX_NUM_OBJECTS]; +#endif ivas_error error; - error = IVAS_ERR_OK; - push_wmops( "ism_meta_dec" ); +#ifndef DISCRETE_ISM_DTX_CNG if ( ism_total_brate == IVAS_SID_5k2 || ism_total_brate == FRAME_NO_DATA ) { /* no metadata decoding in CNG */ @@ -98,8 +216,9 @@ ivas_error ivas_ism_metadata_dec( #endif pop_wmops(); - return error; + return IVAS_ERR_OK; } +#endif /* initialization */ st0 = hSCE[0]->hCoreCoder[0]; @@ -110,6 +229,9 @@ ivas_error ivas_ism_metadata_dec( bstr_orig = st0->bit_stream; next_bit_pos_orig = st0->next_bit_pos; st0->next_bit_pos = 0; +#ifdef TD5 + ism_extended_metadata_flag = 0; +#endif /* reverse the bitstream for easier reading of indices */ for ( i = 0; i < min( MAX_BITS_METADATA, last_bit_pos ); i++ ) @@ -122,25 +244,34 @@ ivas_error ivas_ism_metadata_dec( if ( !bfi ) { /*----------------------------------------------------------------* - * Read ISm common signaling + * Read ISM common signaling *----------------------------------------------------------------*/ +#ifdef NCHAN_ISM_PARAMETER + /* number of objects was read in ivas_dec_setup() */ + st0->next_bit_pos += nchan_ism; +#else /* read number of objects */ - num_obj = 1; - while ( get_next_indice( st0, 1 ) == 1 && num_obj < MAX_NUM_OBJECTS ) + nchan_ism = 1; + while ( get_next_indice( st0, 1 ) == 1 && nchan_ism < MAX_NUM_OBJECTS ) { - ( num_obj )++; + ( nchan_ism )++; } +#endif - ism_mode = ivas_ism_mode_select( num_obj, ism_total_brate ); + ism_mode = ivas_ism_mode_select( nchan_ism, ism_total_brate ); if ( ism_mode == ISM_MODE_PARAM ) { - hParamIsm->num_obj = num_obj; +#ifdef NCHAN_ISM_PARAMETER + *nchan_transport = MAX_PARAM_ISM_WAVE; +#else + hParamIsm->num_obj = nchan_ism; +#endif } else if ( ism_mode == ISM_MODE_DISC ) { - *nchan_transport = num_obj; + *nchan_transport = nchan_ism; } if ( *nchan_transport != nchan_transport_prev ) @@ -149,7 +280,15 @@ ivas_error ivas_ism_metadata_dec( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "wrong number of objects signalled!" ); } - /* Read ISm present flags (one per object) */ +#ifdef TD5 + /* read extended metadata presence flag */ + if ( ism_total_brate >= ISM_EXTENDED_METADATA_BRATE ) + { + ism_extended_metadata_flag = get_next_indice( st0, ISM_EXTENDED_METADATA_BITS ); + } +#endif + + /* Read ISM present flags (one per object) */ for ( ch = 0; ch < *nchan_transport; ch++ ) { ism_imp[ch] = get_next_indice( st0, ISM_METADATA_FLAG_BITS ); @@ -166,7 +305,7 @@ ivas_error ivas_ism_metadata_dec( ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag; } - for ( ; ch < num_obj; ch++ ) + for ( ; ch < nchan_ism; ch++ ) { hIsmMeta[ch]->ism_metadata_flag = 1; ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag; @@ -199,7 +338,7 @@ ivas_error ivas_ism_metadata_dec( nb_bits_start = st0->next_bit_pos; } - for ( ch = 0; ch < num_obj; ch++ ) + for ( ch = 0; ch < nchan_ism; ch++ ) { hIsmMetaData = hIsmMeta[ch]; if ( ism_mode == ISM_MODE_DISC ) @@ -208,9 +347,48 @@ ivas_error ivas_ism_metadata_dec( } flag_abs_azimuth = 0; +#ifdef TD5 + flag_abs_orientation = 0; + flag_abs_radius = 0; +#endif if ( hIsmMeta[ch]->ism_metadata_flag ) { +#ifdef TD5 + decode_angle_indices( st0, &( hIsmMetaData->angle[0] ), &flag_abs_azimuth ); + idx_azimuth = hIsmMetaData->angle[0].last_azimuth_idx; + idx_elevation = hIsmMetaData->angle[0].last_elevation_idx; + + /* Azimuth/Elevation dequantization */ + if ( ism_mode == ISM_MODE_PARAM ) + { + hParamIsm->azi_index[ch] = idx_azimuth; + hParamIsm->ele_index[ch] = idx_elevation; + } + else /* ISM_MODE_DISC */ + { + hIsmMetaData->azimuth = ism_dequant_meta( idx_azimuth, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); + hIsmMetaData->elevation = ism_dequant_meta( idx_elevation, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); + + /* radius/raw/pitch dequantization */ + if ( ism_extended_metadata_flag ) + { + decode_angle_indices( st0, &( hIsmMetaData->angle[1] ), &flag_abs_orientation ); + idx_azimuth = hIsmMetaData->angle[1].last_azimuth_idx; + idx_elevation = hIsmMetaData->angle[1].last_elevation_idx; + + hIsmMetaData->yaw = ism_dequant_meta( idx_azimuth, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); + hIsmMetaData->pitch = ism_dequant_meta( idx_elevation, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); + + idx_radius = decode_radius( st0, &hIsmMetaData->last_radius_idx, &flag_abs_radius ); + hIsmMetaData->radius = usdequant( idx_radius, ISM_RADIUS_MIN, ISM_RADIUS_DELTA ); + } + else + { + hIsmMetaData->radius = 1.0f; + } + } +#else /*----------------------------------------------------------------* * Azimuth decoding and dequantization *----------------------------------------------------------------*/ @@ -287,7 +465,7 @@ ivas_error ivas_ism_metadata_dec( } else /* ISM_MODE_DISC */ { - hIsmMetaData->azimuth = ism_dequant_meta( idx_azimuth, ism_azimuth_borders, 1 << ISM_AZIMUTH_NBITS ); + hIsmMetaData->azimuth = ism_dequant_meta( idx_azimuth, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); } /*----------------------------------------------------------------* @@ -349,7 +527,7 @@ ivas_error ivas_ism_metadata_dec( } else /* ISM_MODE_DISC */ { - hIsmMetaData->elevation = ism_dequant_meta( idx_elevation, ism_elevation_borders, 1 << ISM_ELEVATION_NBITS ); + hIsmMetaData->elevation = ism_dequant_meta( idx_elevation, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); } /*----------------------------------------------------------------* @@ -359,6 +537,12 @@ ivas_error ivas_ism_metadata_dec( /* updates */ hIsmMetaData->last_azimuth_idx = idx_azimuth; hIsmMetaData->last_elevation_idx = idx_elevation; +#endif +#ifdef DISCRETE_ISM_DTX_CNG + /* save for smoothing metadata evolution */ + hIsmMetaData->last_true_azimuth = hIsmMetaData->azimuth; + hIsmMetaData->last_true_elevation = hIsmMetaData->elevation; +#endif } /* save number of metadata bits read */ @@ -421,12 +605,27 @@ ivas_error ivas_ism_metadata_dec( } else /* BFI */ { +#ifdef FIX_380_BFI_PARAMISM +#ifndef NCHAN_ISM_PARAMETER + /* "nchan_ism", "hIsmMeta->azimuth" and "hIsmMeta->elevation" are recycled from the last frame */ + if ( ism_mode == ISM_MODE_PARAM ) + { + nchan_ism = hParamIsm->num_obj; + } + else if ( ism_mode == ISM_MODE_DISC ) + { + nchan_ism = *nchan_transport; + } +#endif + for ( ch = 0; ch < nchan_ism; ch++ ) +#else /* "*nISms", "hIsmMeta->azimuth" and "hIsmMeta->elevation" are recycled from the last frame */ for ( ch = 0; ch < *nchan_transport; ch++ ) { hIsmMeta[ch]->ism_metadata_flag = hIsmMeta[ch]->last_ism_metadata_flag; } - for ( ; ch < num_obj; ch++ ) + for ( ; ch < nchan_ism; ch++ ) +#endif { hIsmMeta[ch]->last_ism_metadata_flag = hIsmMeta[ch]->ism_metadata_flag; } @@ -435,27 +634,45 @@ ivas_error ivas_ism_metadata_dec( if ( ism_mode == ISM_MODE_PARAM ) { - for ( ch = 0; ch < num_obj; ch++ ) + for ( ch = 0; ch < nchan_ism; ch++ ) { +#ifdef FIX_380_BFI_PARAMISM + hParamIsm->azi_index[ch] = hParamIsm->azi_index[ch] + hParamIsm->last_az_sgn[ch] * hParamIsm->last_az_diff[ch]; + hParamIsm->ele_index[ch] = hParamIsm->ele_index[ch] + hParamIsm->last_el_sgn[ch] * hParamIsm->last_el_diff[ch]; +#else hParamIsm->azi_index[ch] = hParamIsm->azi_index[ch] + hParamIsm->last_az_sgn[ch] * hParamIsm->last_az_diff[ch]; /*hParamIsm->azi_index[ch] = hParamIsm->azi_index[ch] % hParamIsm->az_alpha[ch];*/ hParamIsm->azi_index[ch] = hParamIsm->azi_index[ch]; hParamIsm->ele_index[ch] = hParamIsm->ele_index[ch] + hParamIsm->last_el_sgn[ch] * hParamIsm->last_el_diff[ch]; /*hParamIsm->ele_index[ch] = hParamIsm->ele_index[ch] % hParamIsm->ele_alpha;*/ hParamIsm->ele_index[ch] = hParamIsm->ele_index[ch]; +#endif +#ifdef TD5 + hIsmMeta[ch]->angle[0].last_azimuth_idx = hParamIsm->azi_index[ch]; + hIsmMeta[ch]->angle[0].last_elevation_idx = hParamIsm->ele_index[ch]; +#else hIsmMeta[ch]->last_azimuth_idx = hParamIsm->azi_index[ch]; hIsmMeta[ch]->last_elevation_idx = hParamIsm->ele_index[ch]; +#endif } } } +#ifdef DISCRETE_ISM_DTX_CNG + if ( hISMDTX.ism_dtx_hangover_cnt < IVAS_ISM_DTX_HO_MAX ) + { + ism_metadata_smooth( hIsmMeta, ism_total_brate, nchan_ism ); + hISMDTX.ism_dtx_hangover_cnt += 1; + } +#endif + /*----------------------------------------------------------------* * Configuration and decision about bitrates per channel *----------------------------------------------------------------*/ if ( !bfi ) { - if ( ( error = ivas_ism_config( ism_total_brate, *nchan_transport, num_obj, hIsmMeta, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_ism_config( ism_total_brate, *nchan_transport, nchan_ism, hIsmMeta, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) { return error; } @@ -477,7 +694,7 @@ ivas_error ivas_ism_metadata_dec( hSCE[ch]->hCoreCoder[0]->total_brate = total_brate[ch]; } - for ( ; ch < num_obj; ch++ ) + for ( ; ch < nchan_ism; ch++ ) { hIsmMeta[ch]->last_ism_metadata_flag = hIsmMeta[ch]->ism_metadata_flag; } @@ -486,32 +703,43 @@ ivas_error ivas_ism_metadata_dec( { for ( ch = 0; ch < *nchan_transport; ch++ ) { - hSCE[ch]->element_brate = hSCE[ch]->last_element_brate; hSCE[ch]->hCoreCoder[0]->total_brate = hSCE[ch]->hCoreCoder[0]->last_total_brate; } } + /*----------------------------------------------------------------* + * Set bitsream pointers + *----------------------------------------------------------------*/ + /* set the bitstream pointer to its original position */ st0->bit_stream = bstr_orig; st0->next_bit_pos = next_bit_pos_orig; - /* set bitstream pointers for each ISm */ + /* set bitstream pointers for each ISM */ for ( ch = 1; ch < *nchan_transport; ch++ ) { hSCE[ch]->hCoreCoder[0]->bit_stream = hSCE[ch - 1]->hCoreCoder[0]->bit_stream + ( hSCE[ch - 1]->hCoreCoder[0]->total_brate / FRAMES_PER_SEC ); } -#ifdef PARAM_ISM_DTX_CNG +#ifdef DISCRETE_ISM_DTX_CNG + /*----------------------------------------------------------------* + * Updates + *----------------------------------------------------------------*/ + + set_s( md_diff_flag, 1, nchan_ism ); + + update_last_metadata( nchan_ism, hIsmMeta, md_diff_flag ); +#endif + for ( ch = 0; ch < *nchan_transport; ch++ ) { - hSCE[ch]->hCoreCoder[0]->cng_paramISM_flag = 0; + hSCE[ch]->hCoreCoder[0]->cng_ism_flag = 0; } -#endif pop_wmops(); - return error; + return IVAS_ERR_OK; } @@ -530,17 +758,30 @@ ivas_error ivas_ism_metadata_dec_create( int16_t ch; ivas_error error; - /* allocate ISm metadata handles */ + /* allocate ISM metadata handles */ for ( ch = 0; ch < MAX_NUM_OBJECTS; ch++ ) { if ( ( st_ivas->hIsmMetaData[ch] = (ISM_METADATA_HANDLE) malloc( sizeof( ISM_METADATA_FRAME ) ) ) == NULL ) { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ISm MetaData\n" ) ); + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ISM MetaData\n" ) ); } st_ivas->hIsmMetaData[ch]->last_ism_metadata_flag = 0; +#ifdef TD5 + st_ivas->hIsmMetaData[ch]->angle[0].last_azimuth_idx = 0; + st_ivas->hIsmMetaData[ch]->angle[0].last_elevation_idx = 1 << ( ISM_ELEVATION_NBITS - 1 ); + st_ivas->hIsmMetaData[ch]->angle[1].last_azimuth_idx = 0; + st_ivas->hIsmMetaData[ch]->angle[1].last_elevation_idx = 1 << ( ISM_ELEVATION_NBITS - 1 ); + st_ivas->hIsmMetaData[ch]->last_radius_idx = 8; /* Init to radius 1.0 */ +#else st_ivas->hIsmMetaData[ch]->last_azimuth_idx = 0; st_ivas->hIsmMetaData[ch]->last_elevation_idx = 1 << ( ISM_ELEVATION_NBITS - 1 ); +#endif + +#ifdef DISCRETE_ISM_DTX_CNG + st_ivas->hIsmMetaData[ch]->last_true_azimuth = 0; + st_ivas->hIsmMetaData[ch]->last_true_elevation = 0; +#endif ivas_ism_reset_metadata( st_ivas->hIsmMetaData[ch] ); } @@ -550,5 +791,414 @@ ivas_error ivas_ism_metadata_dec_create( return error; } +#ifdef DISCRETE_ISM_DTX_CNG + st_ivas->hISMDTX.ism_dtx_hangover_cnt = IVAS_ISM_DTX_HO_MAX; +#endif + return IVAS_ERR_OK; } + + +#ifdef TD5 +/*------------------------------------------------------------------------- + * decode_angle_indices() + * + * Decoding of an angle + *-------------------------------------------------------------------------*/ + +static void decode_angle_indices( + DEC_CORE_HANDLE st0, /* i/o: bitstream handle */ + ISM_METADATA_ANGLE_HANDLE angle, /* i/o: angle handle */ + int16_t *flag_abs_azimuth /* o : Azimuth encoding mode */ +) +{ + int16_t idx_azimuth, nbits_diff_azimuth, diff, sgn; + int16_t idx_elevation, nbits_diff_elevation; + + /*----------------------------------------------------------------* + * Azimuth decoding and dequantization + *----------------------------------------------------------------*/ + + /* Decode azimuth index */ + if ( get_next_indice( st0, 1 ) == 1 ) /* azimuth_abs_flag */ + { + idx_azimuth = get_next_indice( st0, ISM_AZIMUTH_NBITS ); + *flag_abs_azimuth = 1; + } + else + { + diff = 0; + sgn = 1; + + if ( get_next_indice( st0, 1 ) == 0 ) + { + nbits_diff_azimuth = 1; + } + else + { + nbits_diff_azimuth = 1; + + if ( get_next_indice( st0, 1 ) == 1 ) /* negative sign */ + { + sgn = -1; + } + + nbits_diff_azimuth++; + + /* read until the stop bit */ + while ( ( nbits_diff_azimuth < ISM_AZIMUTH_NBITS - 1 ) && ( get_next_indice( st0, 1 ) == 1 ) ) + { + diff++; + nbits_diff_azimuth++; + } + + if ( nbits_diff_azimuth < ISM_AZIMUTH_NBITS - 1 ) + { + /* count stop bit */ + nbits_diff_azimuth++; + } + } + idx_azimuth = angle->last_azimuth_idx + sgn * diff; + } + + /* azimuth is on a circle - check for diff coding for -180° -> 180° and vice versa changes */ + if ( idx_azimuth > ( 1 << ISM_AZIMUTH_NBITS ) - 1 ) + { + idx_azimuth -= ( 1 << ISM_AZIMUTH_NBITS ) - 1; /* +180° -> -180° */ + } + else if ( idx_azimuth < 0 ) + { + idx_azimuth += ( 1 << ISM_AZIMUTH_NBITS ) - 1; /* -180° -> +180° */ + } + + /* +180° == -180° */ + if ( idx_azimuth == ( 1 << ISM_AZIMUTH_NBITS ) - 1 ) + { + idx_azimuth = 0; + } + + /* sanity check in case of FER or BER */ + if ( idx_azimuth < 0 || idx_azimuth > ( 1 << ISM_AZIMUTH_NBITS ) - 1 ) + { + idx_azimuth = angle->last_azimuth_idx; + } + + /*----------------------------------------------------------------* + * Elevation decoding and dequantization + *----------------------------------------------------------------*/ + + /* Decode elevation index */ + if ( *flag_abs_azimuth == 0 && get_next_indice( st0, 1 ) == 1 ) /* elevation_abs_flag */ + { + idx_elevation = get_next_indice( st0, ISM_ELEVATION_NBITS ); + } + else + { + diff = 0; + sgn = 1; + + if ( get_next_indice( st0, 1 ) == 0 ) + { + nbits_diff_elevation = 1; + } + else + { + nbits_diff_elevation = 1; + + if ( get_next_indice( st0, 1 ) == 1 ) /* negative sign */ + { + sgn = -1; + } + + nbits_diff_elevation++; + + /* read until the stop bit */ + while ( ( nbits_diff_elevation < ISM_ELEVATION_NBITS ) && ( get_next_indice( st0, 1 ) == 1 ) ) + { + diff++; + nbits_diff_elevation++; + } + + if ( nbits_diff_elevation < ISM_ELEVATION_NBITS ) + { + /* count stop bit */ + nbits_diff_elevation++; + } + } + + idx_elevation = angle->last_elevation_idx + sgn * diff; + } + + /* sanity check in case of FER or BER */ + if ( idx_elevation < 0 || idx_elevation > ( 1 << ISM_ELEVATION_NBITS ) - 1 ) + { + idx_elevation = angle->last_elevation_idx; + } + + /*----------------------------------------------------------------* + * Final updates + *----------------------------------------------------------------*/ + + angle->last_azimuth_idx = idx_azimuth; + angle->last_elevation_idx = idx_elevation; + + return; +} + + +/*------------------------------------------------------------------------- + * decode_radius() + * + * Radius decoding and dequantization + *-------------------------------------------------------------------------*/ + +static int16_t decode_radius( + DEC_CORE_HANDLE st0, /* i/o: bitstream handle */ + int16_t *last_radius_idx, /* i/o: last radius index */ + int16_t *flag_abs_radius /* o : Radius encoding mode */ +) +{ + int16_t idx_radius, nbits_diff_radius, diff, sgn; + + /* Decode radius index */ + if ( get_next_indice( st0, 1 ) == 1 ) /* elevation_abs_flag */ + { + *flag_abs_radius = 1; + idx_radius = get_next_indice( st0, ISM_RADIUS_NBITS ); + } + else + { + diff = 0; + sgn = 1; + + if ( get_next_indice( st0, 1 ) == 0 ) + { + nbits_diff_radius = 1; + } + else + { + nbits_diff_radius = 1; + + if ( get_next_indice( st0, 1 ) == 1 ) /* negative sign */ + { + sgn = -1; + } + + nbits_diff_radius++; + + /* read until the stop bit */ + while ( ( nbits_diff_radius < ISM_RADIUS_NBITS ) && ( get_next_indice( st0, 1 ) == 1 ) ) + { + diff++; + nbits_diff_radius++; + } + + if ( nbits_diff_radius < ISM_RADIUS_NBITS ) + { + /* count stop bit */ + nbits_diff_radius++; + } + } + idx_radius = *last_radius_idx + sgn * diff; + } + + /* sanity check in case of FER or BER */ + if ( idx_radius < 0 || idx_radius > ( 1 << ISM_RADIUS_NBITS ) - 1 ) + { + idx_radius = *last_radius_idx; + } + + /* Final updates */ + *last_radius_idx = idx_radius; + + return idx_radius; +} +#endif + + +#ifdef DISCRETE_ISM_DTX_CNG +/*-------------------------------------------------------------------* + * ivas_ism_metadata_sid_dec() + * + * Decode ISM metadata in SID frame + *-------------------------------------------------------------------*/ + +void ivas_ism_metadata_sid_dec( + SCE_DEC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */ + const int32_t ism_total_brate, /* i : ISms total bitrate */ + const int16_t bfi, /* i : bfi flag */ + const int16_t nchan_ism, /* i : number of objects */ + const int16_t nchan_transport, /* i : number of transport channels*/ + const ISM_MODE ism_mode, /* i : ISM mode */ + int16_t *flag_noisy_speech, /* o : noisy speech flag */ + int16_t *sce_id_dtx, /* o : SCE DTX ID */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + int16_t nb_bits_metadata[] /* o : number of metadata bits */ +) +{ + int16_t i, ch, last_bit_pos; + float q_step, q_step_border; + int16_t idx, idx_azimuth, idx_elevation; + int16_t nBits_azimuth, nBits_elevation, nBits_coh, nBits_sce_id; + int16_t md_diff_flag[MAX_NUM_OBJECTS]; + ISM_MODE ism_mode_bstr; + DEC_CORE_HANDLE st0; + ISM_METADATA_HANDLE hIsmMetaData; + int16_t next_bit_pos_orig; + uint16_t bstr_meta[IVAS_SID_5k2 / FRAMES_PER_SEC], *bstr_orig; + + if ( ism_total_brate == FRAME_NO_DATA ) + { + ism_metadata_smooth( hIsmMeta, ism_total_brate, nchan_ism ); + + return; + } + + /* initialization */ + st0 = hSCE[0]->hCoreCoder[0]; + + last_bit_pos = (int16_t) ( ( ism_total_brate / FRAMES_PER_SEC ) - 1 - SID_FORMAT_NBITS ); + bstr_orig = st0->bit_stream; + next_bit_pos_orig = st0->next_bit_pos; + st0->next_bit_pos = 0; + + /* reverse the bitstream for easier reading of indices */ + for ( i = 0; i < min( MAX_BITS_METADATA, last_bit_pos ); i++ ) + { + bstr_meta[i] = st0->bit_stream[last_bit_pos - i]; + } + st0->bit_stream = bstr_meta; + st0->total_brate = ism_total_brate; /* needed for BER detection in get_next_indice() */ + + if ( !bfi ) + { + /*----------------------------------------------------------------* + * ISm common signaling + *----------------------------------------------------------------*/ + + /* number of objects was already read in ivas_ism_get_dtx_dec() */ + /* update the position in the bitstream */ + st0->next_bit_pos += nchan_ism; + + /* read SID metadata flag( one per object ) */ + for ( ch = 0; ch < nchan_ism; ch++ ) + { + md_diff_flag[ch] = get_next_indice( st0, 1 ); + } + + /*----------------------------------------------------------------* + * Set quantization bits based on the number of coded objects + *----------------------------------------------------------------*/ + + ivas_get_ism_sid_quan_bitbudget( nchan_ism, &nBits_azimuth, &nBits_elevation, &q_step, &q_step_border, &nBits_coh, &nBits_sce_id ); + + /*----------------------------------------------------------------* + * Spatial parameters, loop over TCs - 1 + *----------------------------------------------------------------*/ + + *flag_noisy_speech = 0; + *sce_id_dtx = 0; + + /* write ISM mode flag to explicitly signal number of spatial parameters */ + if ( nchan_ism > 2 ) + { + idx = get_next_indice( st0, 1 ); + ism_mode_bstr = (ISM_MODE) ( idx + 1 ); + /* note: ISM mode was already read and used for configuration in in ivas_ism_dtx_dec() */ + + if ( ism_mode_bstr == ISM_MODE_PARAM ) + { + /* read noisy speech flag */ + *flag_noisy_speech = get_next_indice( st0, 1 ); + nBits_sce_id = 1; + } + } + + if ( nchan_transport > 1 ) + { + /* read sce id */ + *sce_id_dtx = get_next_indice( st0, nBits_sce_id ); + + /* decode the coherence */ + for ( ch = 0; ch < nchan_transport; ch++ ) + { + if ( ch == *sce_id_dtx ) + { + hSCE[ch]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence = 1.0f; + continue; + } + + idx = get_next_indice( st0, nBits_coh ); + hSCE[ch]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence = (float) ( idx ) / (float) ( ( 1 << nBits_coh ) - 1 ); + } + } + else + { + *sce_id_dtx = 0; + } + + if ( ism_mode == ISM_MODE_PARAM ) + { + hSCE[*sce_id_dtx]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence = hSCE[!*sce_id_dtx]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence; + } + + /*----------------------------------------------------------------* + * Metadata decoding and dequantization, loop over all objects + *----------------------------------------------------------------*/ + + for ( ch = 0; ch < nchan_ism; ch++ ) + { + hIsmMetaData = hIsmMeta[ch]; + + if ( md_diff_flag[ch] == 1 ) + { + /* Azimuth decoding */ + idx_azimuth = get_next_indice( st0, nBits_azimuth ); + hIsmMetaData->azimuth = ism_dequant_meta( idx_azimuth, ism_azimuth_borders, q_step, q_step_border, 1 << nBits_azimuth ); + + /* Elevation decoding */ + idx_elevation = get_next_indice( st0, nBits_elevation ); + hIsmMetaData->elevation = ism_dequant_meta( idx_elevation, ism_elevation_borders, q_step, q_step_border, 1 << nBits_elevation ); + + /* update last indexes to correspond to active frames coding */ + if ( nBits_azimuth > ISM_AZIMUTH_NBITS ) + { +#ifdef TD5 + hIsmMetaData->angle[0].last_azimuth_idx = idx_azimuth >> ( nBits_azimuth - ISM_AZIMUTH_NBITS ); + hIsmMetaData->angle[0].last_elevation_idx = idx_elevation >> ( nBits_elevation - ISM_ELEVATION_NBITS ); +#else + hIsmMetaData->last_azimuth_idx = idx_azimuth >> ( nBits_azimuth - ISM_AZIMUTH_NBITS ); + hIsmMetaData->last_elevation_idx = idx_elevation >> ( nBits_elevation - ISM_ELEVATION_NBITS ); +#endif + } + else + { +#ifdef TD5 + hIsmMetaData->angle[0].last_azimuth_idx = idx_azimuth << ( ISM_AZIMUTH_NBITS - nBits_azimuth ); + hIsmMetaData->angle[0].last_elevation_idx = idx_elevation << ( ISM_ELEVATION_NBITS - nBits_elevation ); +#else + hIsmMetaData->last_azimuth_idx = idx_azimuth << ( ISM_AZIMUTH_NBITS - nBits_azimuth ); + hIsmMetaData->last_elevation_idx = idx_elevation << ( ISM_ELEVATION_NBITS - nBits_elevation ); +#endif + } + + /* save for smoothing metadata evolution */ + hIsmMetaData->last_true_azimuth = hIsmMetaData->azimuth; + hIsmMetaData->last_true_elevation = hIsmMetaData->elevation; + } + } + + /* take into account padding bits as metadata bits to keep later bitrate checks valid */ + nb_bits_metadata[*sce_id_dtx] = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC; + + /* set the bitstream pointer to its original position */ + st0->bit_stream = bstr_orig; + st0->next_bit_pos = next_bit_pos_orig; + } + + /* smooth the metadata evolution */ + ism_metadata_smooth( hIsmMeta, ism_total_brate, nchan_ism ); + + return; +} +#endif diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index 81a4744726..f66323d8a4 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -51,6 +51,10 @@ static void ivas_param_ism_dec_dequant_DOA( DIRAC_DEC_HANDLE hDirAC /* i/o: decoder DirAC handle */ +#ifdef NCHAN_ISM_PARAMETER + , + const int16_t nchan_ism /* i : number of ISM channels */ +#endif ) { int16_t i; @@ -58,13 +62,21 @@ static void ivas_param_ism_dec_dequant_DOA( hParamIsm = hDirAC->hParamIsm; +#ifdef NCHAN_ISM_PARAMETER + assert( nchan_ism <= MAX_NUM_OBJECTS ); +#else assert( hParamIsm->num_obj <= MAX_NUM_OBJECTS ); +#endif /* Get the azimuth and elevation values */ +#ifdef NCHAN_ISM_PARAMETER + for ( i = 0; i < nchan_ism; i++ ) +#else for ( i = 0; i < hParamIsm->num_obj; i++ ) +#endif { - hDirAC->azimuth_values[i] = ism_dequant_meta( hParamIsm->azi_index[i], ism_azimuth_borders, 1 << ISM_AZIMUTH_NBITS ); - hDirAC->elevation_values[i] = ism_dequant_meta( hParamIsm->ele_index[i], ism_elevation_borders, 1 << ISM_ELEVATION_NBITS ); + hDirAC->azimuth_values[i] = ism_dequant_meta( hParamIsm->azi_index[i], ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); + hDirAC->elevation_values[i] = ism_dequant_meta( hParamIsm->ele_index[i], ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); } return; @@ -157,10 +169,11 @@ static void ivas_ism_get_proto_matrix( static void ivas_param_ism_compute_mixing_matrix( - DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ -#ifdef PARAM_ISM_DTX_CNG - ISM_DTX_DATA_DEC hISMDTX, /* i : ISM DTX handle */ +#ifdef NCHAN_ISM_PARAMETER + const int16_t nchan_ism, /* i : number of ISM channels */ #endif + DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ + ISM_DTX_DATA_DEC hISMDTX, /* i : ISM DTX handle */ float Cldfb_RealBuffer_in[PARAM_ISM_MAX_DMX][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float Cldfb_ImagBuffer_in[PARAM_ISM_MAX_DMX][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float direct_response[MAX_NUM_OBJECTS][PARAM_ISM_MAX_CHAN], @@ -185,16 +198,20 @@ static void ivas_param_ism_compute_mixing_matrix( proto_matrix = hDirAC->hParamIsmRendering->proto_matrix; +#ifdef NCHAN_ISM_PARAMETER + assert( ( nchan_ism == 3 ) || ( nchan_ism == 4 ) ); +#else assert( ( hDirAC->hParamIsm->num_obj == 3 ) || ( hDirAC->hParamIsm->num_obj == 4 ) ); +#endif assert( nchan_transport == 2 ); -#ifdef PARAM_ISM_DTX_CNG if ( hDirAC->hParamIsm->flag_noisy_speech || hISMDTX.dtx_flag ) -#else - if ( hDirAC->hParamIsm->flag_noisy_speech ) -#endif { +#ifdef NCHAN_ISM_PARAMETER + num_wave = nchan_ism; +#else num_wave = hDirAC->hParamIsm->num_obj; +#endif } else { @@ -214,11 +231,7 @@ static void ivas_param_ism_compute_mixing_matrix( { set_zero( cy_diag_tmp[w], nchan_out_woLFE ); -#ifdef PARAM_ISM_DTX_CNG if ( hDirAC->hParamIsm->flag_noisy_speech || hISMDTX.dtx_flag ) -#else - if ( hDirAC->hParamIsm->flag_noisy_speech ) -#endif { dir_res_ptr = direct_response[w]; } @@ -257,13 +270,13 @@ static void ivas_param_ism_compute_mixing_matrix( set_zero( cy_diag, nchan_out_woLFE ); for ( w = 0; w < num_wave; w++ ) { -#ifdef PARAM_ISM_DTX_CNG if ( hDirAC->hParamIsm->flag_noisy_speech || hISMDTX.dtx_flag ) -#else - if ( hDirAC->hParamIsm->flag_noisy_speech ) -#endif { +#ifdef NCHAN_ISM_PARAMETER + direct_power[w] = ( 1.0f / nchan_ism ) * ref_power; +#else direct_power[w] = ( 1.0f / hDirAC->hParamIsm->num_obj ) * ref_power; +#endif } else { @@ -409,7 +422,9 @@ ivas_error ivas_param_ism_dec_open( IVAS_OUTPUT_SETUP hOutSetup; AUDIO_CONFIG output_config; int32_t output_Fs; +#ifndef NCHAN_ISM_PARAMETER int16_t nchan_out; +#endif ivas_error error; error = IVAS_ERR_OK; @@ -438,6 +453,10 @@ ivas_error ivas_param_ism_dec_open( output_Fs = st_ivas->hDecoderConfig->output_Fs; output_config = st_ivas->hDecoderConfig->output_config; +#ifdef NCHAN_ISM_PARAMETER + + ivas_param_ism_config( hDirAC->hParamIsm, st_ivas->nchan_ism ); +#else nchan_out = st_ivas->hDecoderConfig->nchan_out; if ( output_config == AUDIO_CONFIG_EXTERNAL ) @@ -449,6 +468,7 @@ ivas_error ivas_param_ism_dec_open( hDirAC->hParamIsm->num_obj = MAX_NUM_OBJECTS; } ivas_param_ism_config( hDirAC->hParamIsm ); +#endif /*-----------------------------------------------------------------* * set input parameters @@ -480,7 +500,11 @@ ivas_error ivas_param_ism_dec_open( if ( output_config == AUDIO_CONFIG_EXTERNAL ) { /* nchan_out is essential for memory initialization for CLDFB Synthesis */ +#ifdef NCHAN_ISM_PARAMETER + st_ivas->hIntSetup.nchan_out_woLFE = st_ivas->nchan_ism; +#else st_ivas->hIntSetup.nchan_out_woLFE = hDirAC->hParamIsm->num_obj; +#endif st_ivas->hIntSetup.is_loudspeaker_setup = 1; } @@ -619,9 +643,7 @@ ivas_error ivas_param_ism_dec_open( } } -#ifdef PARAM_ISM_DTX_CNG st_ivas->hISMDTX.dtx_flag = 0; -#endif st_ivas->hDirAC = hDirAC; @@ -637,11 +659,19 @@ ivas_error ivas_param_ism_dec_open( *-------------------------------------------------------------------------*/ void ivas_param_ism_dec_close( - DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ - AUDIO_CONFIG output_config /* i : output audio configuration */ + DIRAC_DEC_HANDLE *hDirAC_out, /* i/o: decoder DirAC handle */ + AUDIO_CONFIG output_config /* i : output audio configuration */ ) { int16_t i; + DIRAC_DEC_HANDLE hDirAC; + + if ( hDirAC_out == NULL || *hDirAC_out == NULL ) + { + return; + } + + hDirAC = *hDirAC_out; /* Config & CLDFB */ if ( hDirAC->hParamIsm != NULL ) @@ -798,7 +828,8 @@ void ivas_param_ism_dec_close( hDirAC->hParamIsmRendering = NULL; } - free( hDirAC ); + free( *hDirAC_out ); + *hDirAC_out = NULL; return; } @@ -817,9 +848,7 @@ void ivas_param_ism_dec( { int16_t ch, nchan_transport, nchan_out, nchan_out_woLFE, i; int16_t subframe_idx, slot_idx, index_slot, bin_idx; -#ifdef PARAM_ISM_DTX_CNG int32_t ivas_total_brate; -#endif /* CLDFB Input Buffers */ float Cldfb_RealBuffer_in[PARAM_ISM_MAX_DMX][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; @@ -846,7 +875,11 @@ void ivas_param_ism_dec( nchan_transport = st_ivas->nchan_transport; if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL ) { +#ifdef NCHAN_ISM_PARAMETER + nchan_out = st_ivas->nchan_ism; +#else nchan_out = st_ivas->hDirAC->hParamIsm->num_obj; +#endif nchan_out_woLFE = nchan_out; st_ivas->hDecoderConfig->nchan_out = nchan_out; } @@ -856,9 +889,7 @@ void ivas_param_ism_dec( nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; } -#ifdef PARAM_ISM_DTX_CNG ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; -#endif hSetup = st_ivas->hIntSetup; @@ -866,10 +897,13 @@ void ivas_param_ism_dec( /* Frame-level Processing */ /* De-quantization */ -#ifdef PARAM_ISM_DTX_CNG if ( !( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) ) { +#ifdef NCHAN_ISM_PARAMETER + ivas_param_ism_dec_dequant_DOA( hDirAC, st_ivas->nchan_ism ); +#else ivas_param_ism_dec_dequant_DOA( hDirAC ); +#endif ivas_param_ism_dec_dequant_powrat( hDirAC ); st_ivas->hISMDTX.dtx_flag = 0; } @@ -877,15 +911,15 @@ void ivas_param_ism_dec( { st_ivas->hISMDTX.dtx_flag = 1; } -#else - ivas_param_ism_dec_dequant_DOA( hDirAC ); - ivas_param_ism_dec_dequant_powrat( hDirAC ); -#endif /* obtain the direct response using EFAP */ if ( !( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL ) ) { +#ifdef NCHAN_ISM_PARAMETER + for ( i = 0; i < st_ivas->nchan_ism; i++ ) +#else for ( i = 0; i < hDirAC->hParamIsm->num_obj; i++ ) +#endif { efap_determine_gains( st_ivas->hEFAPdata, direct_response[i], hDirAC->azimuth_values[i], hDirAC->elevation_values[i], EFAP_MODE_EFAP ); } @@ -894,7 +928,11 @@ void ivas_param_ism_dec( { int16_t j; +#ifdef NCHAN_ISM_PARAMETER + for ( i = 0; i < st_ivas->nchan_ism; i++ ) +#else for ( i = 0; i < hDirAC->hParamIsm->num_obj; i++ ) +#endif { for ( j = 0; j < nchan_out_woLFE; j++ ) { @@ -943,10 +981,10 @@ void ivas_param_ism_dec( } /* Compute mixing matrix */ -#ifdef PARAM_ISM_DTX_CNG - ivas_param_ism_compute_mixing_matrix( hDirAC, st_ivas->hISMDTX, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, direct_response, nchan_transport, nchan_out_woLFE, 0, CLDFB_NO_COL_MAX, mixing_matrix ); +#ifdef NCHAN_ISM_PARAMETER + ivas_param_ism_compute_mixing_matrix( st_ivas->nchan_ism, hDirAC, st_ivas->hISMDTX, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, direct_response, nchan_transport, nchan_out_woLFE, 0, CLDFB_NO_COL_MAX, mixing_matrix ); #else - ivas_param_ism_compute_mixing_matrix( hDirAC, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, direct_response, nchan_transport, nchan_out_woLFE, 0, CLDFB_NO_COL_MAX, mixing_matrix ); + ivas_param_ism_compute_mixing_matrix( hDirAC, st_ivas->hISMDTX, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, direct_response, nchan_transport, nchan_out_woLFE, 0, CLDFB_NO_COL_MAX, mixing_matrix ); #endif /* subframe loop for synthesis*/ @@ -1016,7 +1054,11 @@ void ivas_param_ism_dec( ivas_param_ism_update_mixing_matrix( hDirAC, mixing_matrix, nchan_transport, nchan_out_woLFE ); /* store MetaData parameters */ +#ifdef NCHAN_ISM_PARAMETER + for ( ch = 0; ch < st_ivas->nchan_ism; ch++ ) +#else for ( ch = 0; ch < hDirAC->hParamIsm->num_obj; ch++ ) +#endif { if ( st_ivas->hDirAC->azimuth_values[ch] > 180.0f ) { @@ -1053,19 +1095,20 @@ void ivas_param_ism_params_to_masa_param_mapping( int16_t azimuth[2]; int16_t elevation[2]; float power_ratio[2]; -#ifdef PARAM_ISM_DTX_CNG int32_t ivas_total_brate; -#endif hDirAC = st_ivas->hDirAC; nBins = hDirAC->num_freq_bands; -#ifdef PARAM_ISM_DTX_CNG ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; if ( !( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) ) { +#ifdef NCHAN_ISM_PARAMETER + ivas_param_ism_dec_dequant_DOA( hDirAC, st_ivas->nchan_ism ); +#else ivas_param_ism_dec_dequant_DOA( hDirAC ); +#endif ivas_param_ism_dec_dequant_powrat( hDirAC ); st_ivas->hISMDTX.dtx_flag = 0; } @@ -1073,14 +1116,13 @@ void ivas_param_ism_params_to_masa_param_mapping( { st_ivas->hISMDTX.dtx_flag = 1; } -#else - ivas_param_ism_dec_dequant_DOA( hDirAC ); - ivas_param_ism_dec_dequant_powrat( hDirAC ); -#endif +#ifdef NCHAN_ISM_PARAMETER + if ( st_ivas->nchan_ism > 1 ) +#else if ( hDirAC->hParamIsm->num_obj > 1 ) +#endif { -#ifdef PARAM_ISM_DTX_CNG if ( st_ivas->hISMDTX.dtx_flag ) { float energy_ratio; @@ -1142,44 +1184,6 @@ void ivas_param_ism_params_to_masa_param_mapping( } } } -#else - hDirAC->numSimultaneousDirections = 2; - for ( band_idx = 0; band_idx < hDirAC->hParamIsm->nbands; band_idx++ ) - { - brange[0] = hDirAC->hParamIsm->band_grouping[band_idx]; - brange[1] = hDirAC->hParamIsm->band_grouping[band_idx + 1]; - - azimuth[0] = (int16_t) roundf( hDirAC->azimuth_values[hDirAC->hParamIsm->obj_indices[band_idx][0][0]] ); - elevation[0] = (int16_t) roundf( hDirAC->elevation_values[hDirAC->hParamIsm->obj_indices[band_idx][0][0]] ); - power_ratio[0] = hDirAC->power_ratios[band_idx][0][0]; - - azimuth[1] = (int16_t) roundf( hDirAC->azimuth_values[hDirAC->hParamIsm->obj_indices[band_idx][0][1]] ); - elevation[1] = (int16_t) roundf( hDirAC->elevation_values[hDirAC->hParamIsm->obj_indices[band_idx][0][1]] ); - power_ratio[1] = hDirAC->power_ratios[band_idx][0][1]; - - for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) - { - for ( bin_idx = brange[0]; bin_idx < brange[1]; bin_idx++ ) - { - hDirAC->azimuth[sf_idx][bin_idx] = azimuth[0]; - hDirAC->elevation[sf_idx][bin_idx] = elevation[0]; - hDirAC->energy_ratio1[sf_idx][bin_idx] = power_ratio[0]; - hDirAC->azimuth2[sf_idx][bin_idx] = azimuth[1]; - hDirAC->elevation2[sf_idx][bin_idx] = elevation[1]; - hDirAC->energy_ratio2[sf_idx][bin_idx] = power_ratio[1]; - } - } - } - for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) - { - for ( bin_idx = 0; bin_idx < nBins; bin_idx++ ) - { - hDirAC->spreadCoherence[sf_idx][bin_idx] = 0.0f; - hDirAC->spreadCoherence2[sf_idx][bin_idx] = 0.0f; - hDirAC->surroundingCoherence[sf_idx][bin_idx] = 0.0; - } - } -#endif } else { @@ -1202,8 +1206,7 @@ void ivas_param_ism_params_to_masa_param_mapping( return; } - -#ifdef PARAM_ISM_DTX_CNG +#ifndef DISCRETE_ISM_DTX_CNG static void ivas_param_ism_dec_dequantize_DOA_dtx( int16_t azi_bits, int16_t ele_bits, @@ -1301,7 +1304,11 @@ void ivas_param_ism_metadata_dtx_dec( /* number of objects was already read in ivas_ism_get_dtx_dec() */ /* update the position in the bitstream */ +#ifdef NCHAN_ISM_PARAMETER + st0->next_bit_pos += st_ivas->nchan_ism; +#else st0->next_bit_pos += hParamIsm->num_obj; +#endif /* read sce id */ st_ivas->hISMDTX.sce_id_dtx = get_next_indice( st0, 1 ); @@ -1315,7 +1322,11 @@ void ivas_param_ism_metadata_dtx_dec( st_ivas->hSCE[1]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence = st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence; /* get the DOA'S */ +#ifdef NCHAN_ISM_PARAMETER + for ( i = 0; i < st_ivas->nchan_ism; i++ ) +#else for ( i = 0; i < hParamIsm->num_obj; i++ ) +#endif { /* read from bitstream and dequantize */ azi_idx = get_next_indice( st0, PARAM_ISM_DTX_AZI_BITS ); diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index a965a0ffed..a5bdcc4100 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -107,11 +107,15 @@ void ivas_ism_render( float tmp_output_f[MAX_OUTPUT_CHANNELS][L_FRAME48k]; float gains[MAX_NUM_OBJECTS][MAX_OUTPUT_CHANNELS]; float g1, g2; - int16_t num_objects, nchan_out_woLFE, lfe_index; + int16_t nchan_ism, nchan_out_woLFE, lfe_index; int16_t azimuth, elevation; float Rmat[3][3]; - num_objects = st_ivas->nchan_transport; +#ifdef NCHAN_ISM_PARAMETER + nchan_ism = st_ivas->nchan_ism; +#else + nchan_ism = st_ivas->nchan_transport; +#endif nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; lfe_index = 0; @@ -121,7 +125,7 @@ void ivas_ism_render( set_f( tmp_output_f[j], 0.0f, output_frame ); } - for ( i = 0; i < num_objects; i++ ) + for ( i = 0; i < nchan_ism; i++ ) { mvr2r( output_f[i], input_f[i], output_frame ); } @@ -137,7 +141,7 @@ void ivas_ism_render( QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[st_ivas->hHeadTrackData->num_quaternions++], Rmat ); } - for ( i = 0; i < num_objects; i++ ) + for ( i = 0; i < nchan_ism; i++ ) { if ( st_ivas->intern_config == AUDIO_CONFIG_STEREO ) { diff --git a/lib_dec/ivas_lfe_dec.c b/lib_dec/ivas_lfe_dec.c index 55a68d892b..5c250286ee 100644 --- a/lib_dec/ivas_lfe_dec.c +++ b/lib_dec/ivas_lfe_dec.c @@ -477,19 +477,25 @@ ivas_error ivas_create_lfe_dec( *-------------------------------------------------------------------------*/ void ivas_lfe_dec_close( - LFE_DEC_HANDLE hLFE /* i/o: LFE decoder handle */ + LFE_DEC_HANDLE *hLFE /* i/o: LFE decoder handle */ ) { - free( hLFE->pWindow_state ); - hLFE->pWindow_state = NULL; + if ( hLFE == NULL || *hLFE == NULL ) + { + return; + } - if ( hLFE->lfe_delay_buf != NULL ) + free( ( *hLFE )->pWindow_state ); + ( *hLFE )->pWindow_state = NULL; + + if ( ( *hLFE )->lfe_delay_buf != NULL ) { - free( hLFE->lfe_delay_buf ); - hLFE->lfe_delay_buf = NULL; + free( ( *hLFE )->lfe_delay_buf ); + ( *hLFE )->lfe_delay_buf = NULL; } - free( hLFE ); + free( ( *hLFE ) ); + ( *hLFE ) = NULL; return; } diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index b8b7b74ffc..5b0223a9be 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -392,9 +392,18 @@ ivas_error ivas_masa_dec_open( *-----------------------------------------------------------------------*/ void ivas_masa_dec_close( - MASA_DECODER_HANDLE hMasa /* i/o: MASA metadata structure */ + MASA_DECODER_HANDLE *hMasa_out /* i/o: MASA metadata structure */ ) { + MASA_DECODER_HANDLE hMasa; + + if ( hMasa_out == NULL || *hMasa_out == NULL ) + { + return; + } + + hMasa = *hMasa_out; + /* Free spherical grid memory if in use */ if ( hMasa->data.sph_grid16 != NULL ) { @@ -436,8 +445,8 @@ void ivas_masa_dec_close( hMasa->hMasaLfeSynth = NULL; } - free( hMasa ); - hMasa = NULL; + free( *hMasa_out ); + *hMasa_out = NULL; return; } @@ -492,7 +501,19 @@ static ivas_error ivas_masa_dec_config( ivas_set_qmetadata_maxbit_req( st_ivas->hQMetaData, st_ivas->ivas_format ); +#ifdef FIX_373_MASA_DELAY_COMP_MSAN + if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL ) + { + /* need to apply the sampling rate correction also for the EXT output MASA meta buffer */ + masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, st_ivas->hDecoderConfig->output_Fs, hMasa->data.extOutMeta ); + } + else + { + masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, st_ivas->hDecoderConfig->output_Fs, NULL ); + } +#else masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, st_ivas->hDecoderConfig->output_Fs ); +#endif return error; } diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index 6bfddc78e6..a6637ed1f2 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -1124,8 +1124,8 @@ void ivas_param_mc_dec_close( hParamMC->hoa_encoder = NULL; } - free( hParamMC ); - hParamMC = NULL; + free( *hParamMC_out ); + *hParamMC_out = NULL; return; } diff --git a/lib_dec/ivas_mcmasa_dec.c b/lib_dec/ivas_mcmasa_dec.c index f6d159083b..3ef12f3094 100644 --- a/lib_dec/ivas_mcmasa_dec.c +++ b/lib_dec/ivas_mcmasa_dec.c @@ -58,10 +58,7 @@ ivas_error ivas_mcmasa_dec_reconfig( ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; /* close the old MASA instance */ - if ( st_ivas->hMasa != NULL ) - { - ivas_masa_dec_close( st_ivas->hMasa ); - } + ivas_masa_dec_close( &( st_ivas->hMasa ) ); /* get new McMASA settings */ ivas_mcmasa_setNumTransportChannels( &( st_ivas->nchan_transport ), &( st_ivas->element_mode_init ), ivas_total_brate ); diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index 332455974c..553cdf2a1b 100644 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -166,7 +166,6 @@ ivas_error ivas_mct_dec( /* MCT core decoder */ ivas_mct_core_dec( hMCT, st_ivas->hCPE, nCPE, output ); -#ifdef DISABLE_RES_CHANNELS_MCT /* for sba to stereo output disable any further processing for TCs > 2 as it is not needed*/ if ( st_ivas->sba_dirac_stereo_flag ) { @@ -178,7 +177,6 @@ ivas_error ivas_mct_dec( } } } -#endif /* MCT reconstruction and CoreCoder updates */ for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) @@ -730,24 +728,14 @@ static ivas_error ivas_mc_dec_reconfig( if ( st_ivas->hParamMC != NULL ) { ivas_param_mc_dec_close( &st_ivas->hParamMC ); - st_ivas->hParamMC = NULL; /* remove ls conversion if it was allocated by ParamMC */ ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion ); } /* De-allocate McMasa-related handles */ - if ( st_ivas->hMasa != NULL ) - { - ivas_masa_dec_close( st_ivas->hMasa ); - st_ivas->hMasa = NULL; - } - - if ( st_ivas->hQMetaData != NULL ) - { - ivas_qmetadata_close( &st_ivas->hQMetaData ); - st_ivas->hQMetaData = NULL; - } + ivas_masa_dec_close( &( st_ivas->hMasa ) ); + ivas_qmetadata_close( &st_ivas->hQMetaData ); /* init LS conversion if the renderer type asks for it */ if ( st_ivas->renderer_type == RENDERER_MC && st_ivas->hLsSetUpConversion == NULL ) @@ -783,32 +771,18 @@ static ivas_error ivas_mc_dec_reconfig( } /* De-allocate McMasa-related handles */ - if ( st_ivas->hMasa != NULL ) - { - ivas_masa_dec_close( st_ivas->hMasa ); - st_ivas->hMasa = NULL; - } - - if ( st_ivas->hQMetaData != NULL ) - { - ivas_qmetadata_close( &st_ivas->hQMetaData ); - st_ivas->hQMetaData = NULL; - } + ivas_masa_dec_close( &( st_ivas->hMasa ) ); + ivas_qmetadata_close( &st_ivas->hQMetaData ); if ( last_mc_mode == MC_MODE_MCT ) { if ( st_ivas->hMCT != NULL && st_ivas->nchan_transport <= CPE_CHANNELS ) { ivas_mct_dec_close( &st_ivas->hMCT ); - st_ivas->hMCT = NULL; } /* LFE handle */ - if ( st_ivas->hLFE != NULL ) - { - ivas_lfe_dec_close( st_ivas->hLFE ); - st_ivas->hLFE = NULL; - } + ivas_lfe_dec_close( &( st_ivas->hLFE ) ); } } else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) @@ -842,18 +816,10 @@ static ivas_error ivas_mc_dec_reconfig( if ( last_mc_mode == MC_MODE_MCT ) { - if ( st_ivas->hMCT != NULL ) - { - ivas_mct_dec_close( &st_ivas->hMCT ); - st_ivas->hMCT = NULL; - } + ivas_mct_dec_close( &st_ivas->hMCT ); /* LFE handle */ - if ( st_ivas->hLFE != NULL ) - { - ivas_lfe_dec_close( st_ivas->hLFE ); - st_ivas->hLFE = NULL; - } + ivas_lfe_dec_close( &( st_ivas->hLFE ) ); } } @@ -1048,10 +1014,9 @@ static ivas_error ivas_mc_dec_reconfig( } } } - else if ( ( st_ivas->renderer_type == RENDERER_DISABLE ) && ( st_ivas->hDirAC != NULL ) ) + else if ( st_ivas->renderer_type == RENDERER_DISABLE && st_ivas->hDirAC != NULL ) { - ivas_dirac_dec_close( st_ivas->hDirAC ); - st_ivas->hDirAC = NULL; + ivas_dirac_dec_close( &( st_ivas->hDirAC ) ); } } @@ -1070,17 +1035,9 @@ static ivas_error ivas_mc_dec_reconfig( ivas_binRenderer_close( &st_ivas->hBinRenderer ); } -#ifdef FIX_197_CREND_INTERFACE if ( ( st_ivas->hCrendWrapper != NULL ) && ( st_ivas->hCrendWrapper->hCrend != NULL ) && ( st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV && st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM && ( st_ivas->renderer_type != RENDERER_BINAURAL_OBJECTS_TD || st_ivas->hRenderConfig->roomAcoustics.late_reverb_on == 0 ) ) ) -#else - if ( st_ivas->hCrend != NULL && ( st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV && st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM && ( st_ivas->renderer_type != RENDERER_BINAURAL_OBJECTS_TD || st_ivas->hRenderConfig->roomAcoustics.late_reverb_on == 0 ) ) ) -#endif { -#ifdef FIX_197_CREND_INTERFACE ivas_rend_closeCrend( &( st_ivas->hCrendWrapper ) ); -#else - ivas_crend_close( st_ivas ); -#endif } if ( st_ivas->hBinRendererTd != NULL && ( st_ivas->renderer_type != RENDERER_BINAURAL_OBJECTS_TD ) ) @@ -1136,43 +1093,29 @@ static ivas_error ivas_mc_dec_reconfig( return error; } -#ifdef FIX_197_CREND_INTERFACE if ( st_ivas->hRenderConfig->roomAcoustics.late_reverb_on ) { -#ifdef FIX_329_ENABLE_TD_RENDERER_REVERB_MC if ( ( error = ivas_rend_initCrendWrapper( &st_ivas->hCrendWrapper ) ) != IVAS_ERR_OK ) -#else - if ( ( st_ivas->hCrendWrapper = (CREND_WRAPPER_HANDLE) malloc( sizeof( CREND_WRAPPER ) ) ) == NULL ) -#endif { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend Wrapper\n" ); } -#ifdef FIX_329_ENABLE_TD_RENDERER_REVERB_MC st_ivas->hCrendWrapper->hCrend = NULL; st_ivas->hCrendWrapper->hHrtfCrend = NULL; -#endif if ( ( st_ivas->hCrendWrapper->hCrend = (CREND_HANDLE) malloc( sizeof( CREND_DATA ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend\n" ); } } -#else - if ( st_ivas->hCrend == NULL && st_ivas->hRenderConfig->roomAcoustics.late_reverb_on ) - { - if ( ( st_ivas->hCrend = (CREND_HANDLE) malloc( sizeof( CREND_DATA ) ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend\n" ); - } - } -#endif } -#ifdef FIX_197_CREND_INTERFACE else if ( st_ivas->hCrendWrapper == NULL && ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) { if ( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, - st_ivas->hRenderConfig, st_ivas->hDecoderConfig->Opt_Headrotation, + st_ivas->hRenderConfig, +#ifndef FIX_I109_ORIENTATION_TRACKING + st_ivas->hDecoderConfig->Opt_Headrotation, +#endif st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) { @@ -1180,15 +1123,6 @@ static ivas_error ivas_mc_dec_reconfig( } st_ivas->binaural_latency_ns = st_ivas->hCrendWrapper->binaural_latency_ns; } -#else - else if ( st_ivas->hCrend == NULL && ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) - { - if ( ivas_crend_open( st_ivas ) != IVAS_ERR_OK ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "ivas_crend_open failed" ); - } - } -#endif } /* mono/stereo */ else if ( output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index 8780b4ea98..d06a2b8f5b 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -53,8 +53,13 @@ ivas_error ivas_td_binaural_open( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ) { +#ifdef TD5 + return ivas_td_binaural_open_unwrap( &st_ivas->hHrtfTD, st_ivas->hDecoderConfig->output_Fs, st_ivas->nchan_transport, st_ivas->ivas_format, + st_ivas->transport_config, st_ivas->hRenderConfig->directivity, st_ivas->hTransSetup, &st_ivas->hBinRendererTd, &st_ivas->binaural_latency_ns ); +#else return ivas_td_binaural_open_unwrap( &st_ivas->hHrtfTD, st_ivas->hDecoderConfig->output_Fs, st_ivas->nchan_transport, st_ivas->ivas_format, st_ivas->transport_config, st_ivas->hTransSetup, &st_ivas->hBinRendererTd, &st_ivas->binaural_latency_ns ); +#endif } @@ -72,20 +77,13 @@ ivas_error ivas_td_binaural_renderer( ) { return ivas_td_binaural_renderer_unwrap( -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND st_ivas->hReverb, -#else - st_ivas->hRenderConfig, st_ivas->ini_frame, -#ifdef FIX_197_CREND_INTERFACE - st_ivas->hCrendWrapper, -#else - st_ivas->hCrend, -#endif -#endif st_ivas->transport_config, -#ifndef FIX_330_ENABLE_TD_RENDERER_REVERB_REND - st_ivas->hDecoderConfig->output_Fs, -#endif st_ivas->hBinRendererTd, st_ivas->nchan_transport, LFE_CHANNEL, st_ivas->ivas_format, +#ifdef TD5 + st_ivas->hIsmMetaData, st_ivas->hDecoderConfig->Opt_Headrotation, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Quaternions : NULL, + ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Pos : NULL, output, output_frame ); +#else st_ivas->hIsmMetaData, st_ivas->hDecoderConfig->Opt_Headrotation, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Quaternions : NULL, output, output_frame ); +#endif } diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 525e775eb9..745ea1b9ba 100644 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -47,7 +47,7 @@ #include "wmc_auto.h" /*-------------------------------------------------------------------* - * ivas_sba_dec_decoder() + * ivas_sba_dec_reconfigure() * * Reconfigure IVAS SBA decoder *-------------------------------------------------------------------*/ @@ -65,9 +65,7 @@ ivas_error ivas_sba_dec_reconfigure( RENDERER_TYPE old_renderer_type; DECODER_CONFIG_HANDLE hDecoderConfig; ivas_error error; -#ifdef SBA_BR_SWITCHING_CLEAN_UP int16_t band_grouping[IVAS_MAX_NUM_BANDS + 1]; -#endif error = IVAS_ERR_OK; @@ -112,12 +110,7 @@ ivas_error ivas_sba_dec_reconfigure( if ( st_ivas->sba_mode != SBA_MODE_SPAR ) { -#ifndef SBA_BR_SWITCHING_CLEAN_UP - ivas_spar_dec_close( st_ivas->hSpar, hDecoderConfig->output_Fs ); -#else - ivas_spar_dec_close( st_ivas->hSpar, hDecoderConfig->output_Fs, 0 ); -#endif - st_ivas->hSpar = NULL; + ivas_spar_dec_close( &( st_ivas->hSpar ), hDecoderConfig->output_Fs, 0 ); if ( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, st_ivas->sba_mode, -1 ) ) != IVAS_ERR_OK ) { @@ -128,78 +121,11 @@ ivas_error ivas_sba_dec_reconfigure( } else { -#ifdef SBA_BR_SWITCHING_CLEAN_UP int16_t sba_order_internal; -#else - int16_t i, sba_order_internal, nchan_internal; - DIRAC_DEC_HANDLE hDirAC = st_ivas->hDirAC; -#endif SPAR_DEC_HANDLE hSpar = st_ivas->hSpar; sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); -#ifndef SBA_BR_SWITCHING_CLEAN_UP - nchan_internal = ivas_sba_get_nchan_metadata( sba_order_internal ); - if ( hSpar != NULL && nchan_transport_old != ivas_get_sba_num_TCs( ivas_total_brate, sba_order_internal ) ) - { - // VE: dirty patch -> reconfiguration of SPAR modules should be used instead !! - IVAS_FB_CFG *fb_cfg; - int16_t active_w_mixing; - - /* MD handle */ - ivas_spar_md_dec_close( &hSpar->hMdDec ); - - if ( ( error = ivas_spar_md_dec_open( &hSpar->hMdDec, st_ivas->hDecoderConfig, nchan_internal, sba_order_internal, st_ivas->sid_format ) ) != IVAS_ERR_OK ) - { - return error; - } - hSpar->hMdDec->td_decorr_flag = 1; - hSpar->hMdDec->table_idx = -1; - - /* TD decorr. */ - ivas_td_decorr_dec_close( &hSpar->hTdDecorr ); - - if ( ( error = ivas_td_decorr_dec_open( &hSpar->hTdDecorr, hDecoderConfig->output_Fs, nchan_internal, 1 ) ) != IVAS_ERR_OK ) - { - return error; - } - - /* FB mixer handle */ - ivas_FB_mixer_close( &hSpar->hFbMixer, hDecoderConfig->output_Fs ); - - /* set FB config. */ - active_w_mixing = -1; - if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_SPAR, nchan_internal, nchan_internal, active_w_mixing, hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) - { - return error; - } - fb_cfg->pcm_offset = NS2SA( hDecoderConfig->output_Fs, DELAY_FB_1_NS + IVAS_ENC_DELAY_NS + IVAS_DEC_DELAY_NS ); - fb_cfg->remix_order = remix_order_set[hSpar->hMdDec->spar_md_cfg.remix_unmix_order]; - - /* FB mixer handle */ - if ( ( error = ivas_FB_mixer_open( &hSpar->hFbMixer, hDecoderConfig->output_Fs, fb_cfg ) ) != IVAS_ERR_OK ) - { - return error; - } - - /* mixer_mat intitialization */ - for ( i = 0; i < nchan_internal; i++ ) - { - for ( int16_t j = 0; j < nchan_internal; j++ ) - { - for ( int16_t b = 0; b < IVAS_MAX_NUM_BANDS; b++ ) - { - hSpar->hMdDec->mixer_mat[i][j][b] = 0.0f; - for ( int16_t i_ts = 0; i_ts < ( MAX_PARAM_SPATIAL_SUBFRAMES + 1 ); i_ts++ ) - { - hSpar->hMdDec->mixer_mat_prev[i_ts][i][j][b] = 0.0f; - } - } - } - } - hSpar->i_subframe = 0; - } -#else if ( hSpar != NULL ) { if ( ( hSpar->hPCA != NULL ) && ( ( hDecoderConfig->ivas_total_brate != PCA_BRATE ) || ( sba_order_internal != 1 ) ) ) @@ -211,13 +137,14 @@ ivas_error ivas_sba_dec_reconfigure( if ( nchan_transport_old != ivas_get_sba_num_TCs( ivas_total_brate, sba_order_internal ) ) { - ivas_spar_dec_close( st_ivas->hSpar, hDecoderConfig->output_Fs, 1 ); + ivas_spar_dec_close( &( st_ivas->hSpar ), hDecoderConfig->output_Fs, 1 ); if ( ( error = ivas_spar_dec_open( st_ivas, 1 ) ) != IVAS_ERR_OK ) { return error; } } + ivas_spar_config( ivas_total_brate, sba_order_internal, &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &hSpar->core_nominal_brate, st_ivas->sid_format ); } else @@ -230,61 +157,6 @@ ivas_error ivas_sba_dec_reconfigure( hSpar = st_ivas->hSpar; st_ivas->sba_dirac_stereo_flag = 0; -#endif -#ifndef SBA_BR_SWITCHING_CLEAN_UP - /* PCA handle */ - if ( hSpar != NULL ) - { - if ( hDecoderConfig->ivas_total_brate == PCA_BRATE && sba_order_internal == 1 ) - { - if ( ( hSpar->hPCA = (PCA_DEC_STATE *) malloc( sizeof( PCA_DEC_STATE ) ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for PCA decoder" ); - } - - ivas_pca_dec_init( hSpar->hPCA ); - } - else if ( hSpar->hPCA != NULL ) - { - free( st_ivas->hSpar->hPCA ); - hSpar->hPCA = NULL; - } - } - - if ( hSpar == NULL && st_ivas->sba_mode == SBA_MODE_SPAR ) - { - if ( ( error = ivas_spar_dec_open( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - - hSpar = st_ivas->hSpar; - } - st_ivas->sba_dirac_stereo_flag = 0; - - sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); - ivas_spar_config( ivas_total_brate, sba_order_internal, &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &hSpar->core_nominal_brate, st_ivas->sid_format ); - - if ( hDirAC == NULL && st_ivas->sba_mode == SBA_MODE_DIRAC ) - { - if ( ( error = ivas_dirac_dec_open( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - - hDirAC = st_ivas->hDirAC; - } - - if ( hDirAC != NULL && sba_mode_old == st_ivas->sba_mode ) - { - ivas_dirac_dec_config( st_ivas, DIRAC_RECONFIGURE_MODE ); - } - - if ( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, st_ivas->sba_mode, IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif } if ( st_ivas->nchan_transport == 1 ) @@ -351,7 +223,6 @@ ivas_error ivas_sba_dec_reconfigure( ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); } -#ifdef SBA_BR_SWITCHING_CLEAN_UP if ( ( ( st_ivas->renderer_type != RENDERER_DISABLE ) && ( st_ivas->renderer_type != RENDERER_SBA_LINEAR_DEC ) ) || ( sba_mode_old != st_ivas->sba_mode ) || ( ( st_ivas->sba_mode == SBA_MODE_SPAR ) && ( ( hDecoderConfig->output_config != AUDIO_CONFIG_FOA ) && ( st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_STEREO ) && ( st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_MONO ) ) ) ) { DIRAC_CONFIG_FLAG flag_config; @@ -382,51 +253,19 @@ ivas_error ivas_sba_dec_reconfigure( if ( ( ( hDecoderConfig->output_config == AUDIO_CONFIG_FOA ) || ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) || ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO ) ) && ( ( sba_mode_old != st_ivas->sba_mode ) && ( st_ivas->sba_mode == SBA_MODE_SPAR ) ) ) { - if ( st_ivas->hDirAC != NULL ) - { - ivas_dirac_dec_close( st_ivas->hDirAC ); - st_ivas->hDirAC = NULL; - } + ivas_dirac_dec_close( &( st_ivas->hDirAC ) ); st_ivas->hSpar->enc_param_start_band = min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (int16_t) ( st_ivas->hDecoderConfig->output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ), st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); } -#else - if ( ( ( st_ivas->renderer_type != RENDERER_DISABLE ) && ( st_ivas->renderer_type != RENDERER_SBA_LINEAR_DEC ) ) || ( sba_mode_old != st_ivas->sba_mode ) ) - { - DIRAC_CONFIG_FLAG flag_config; - - flag_config = DIRAC_OPEN; - if ( st_ivas->hDirAC != NULL ) - { - flag_config = DIRAC_RECONFIGURE; - if ( sba_mode_old != st_ivas->sba_mode && st_ivas->sba_mode != SBA_MODE_SPAR ) - { - flag_config = DIRAC_RECONFIGURE_MODE; - } - } - - if ( ( error = ivas_dirac_dec_config( st_ivas, flag_config ) ) != IVAS_ERR_OK ) - { - return error; - } - } -#endif else if ( st_ivas->renderer_type == RENDERER_DISABLE || ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC && st_ivas->sba_mode != SBA_MODE_SPAR ) ) { - if ( st_ivas->hDirAC != NULL ) - { - ivas_dirac_dec_close( st_ivas->hDirAC ); - st_ivas->hDirAC = NULL; - } + ivas_dirac_dec_close( &( st_ivas->hDirAC ) ); - if ( st_ivas->hVBAPdata != NULL ) - { - vbap_free_data( &( st_ivas->hVBAPdata ) ); - } + vbap_free_data( &( st_ivas->hVBAPdata ) ); } if ( st_ivas->hDirAC != NULL && st_ivas->sba_mode == SBA_MODE_SPAR ) diff --git a/lib_dec/ivas_sba_rendering_internal.c b/lib_dec/ivas_sba_rendering_internal.c index bd799f9d5f..a80986b39e 100644 --- a/lib_dec/ivas_sba_rendering_internal.c +++ b/lib_dec/ivas_sba_rendering_internal.c @@ -282,7 +282,7 @@ void ivas_ism2sba( float buffer_td[][L_FRAME48k], /* i/o: TD signal buffers */ ISM_RENDERER_HANDLE hIsmRendererData, /* i/o: renderer data */ const ISM_METADATA_HANDLE hIsmMetaData[], /* i : object metadata */ - const int16_t num_objects, /* i : number of objects */ + const int16_t nchan_ism, /* i : number of objects */ const int16_t output_frame, /* i : output frame length per channel */ const int16_t sba_order /* i : Ambisonic (SBA) order */ ) @@ -304,7 +304,7 @@ void ivas_ism2sba( set_zero( buffer_tmp[j], output_frame ); } - for ( i = 0; i < num_objects; i++ ) + for ( i = 0; i < nchan_ism; i++ ) { // TODO tmu review when #215 is resolved azimuth = (int16_t) floorf( hIsmMetaData[i]->azimuth + 0.5f ); diff --git a/lib_dec/ivas_sce_dec.c b/lib_dec/ivas_sce_dec.c index ac948a59c4..5c06b4b49d 100644 --- a/lib_dec/ivas_sce_dec.c +++ b/lib_dec/ivas_sce_dec.c @@ -77,12 +77,14 @@ ivas_error ivas_sce_dec( ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; last_ivas_total_brate = st_ivas->hDecoderConfig->last_ivas_total_brate; -#ifdef PARAM_ISM_DTX_CNG +#ifdef DISCRETE_ISM_DTX_CNG + if ( st_ivas->ivas_format == ISM_FORMAT ) +#else if ( st_ivas->ism_mode == ISM_MODE_PARAM ) +#endif { - st->cng_type = FD_CNG; /* TODO: move to init if possible */ + st->cng_type = FD_CNG; } -#endif /*------------------------------------------------------------------* * Read audio bandwidth info @@ -98,18 +100,21 @@ ivas_error ivas_sce_dec( { st->total_brate = ivas_total_brate; } +#ifdef DISCRETE_ISM_DTX_CNG + else if ( !st_ivas->bfi && st_ivas->ivas_format != ISM_FORMAT && last_ivas_total_brate <= IVAS_SID_5k2 ) + { + st->total_brate = hSCE->element_brate - nb_bits_metadata * FRAMES_PER_SEC; + } +#else else if ( !st_ivas->bfi && ( last_ivas_total_brate <= SID_2k40 || last_ivas_total_brate == IVAS_SID_5k2 ) ) { -#ifdef PARAM_ISM_DTX_CNG /* check if this is indeed needed? */ if ( st_ivas->ivas_format != ISM_FORMAT ) { st->total_brate = hSCE->element_brate - nb_bits_metadata * FRAMES_PER_SEC; } -#else - st->total_brate = hSCE->element_brate - nb_bits_metadata * FRAMES_PER_SEC; -#endif } +#endif /* read the bandwidth */ if ( st_ivas->bfi || st->total_brate <= SID_2k40 ) @@ -120,7 +125,7 @@ ivas_error ivas_sce_dec( { if ( st->low_rate_mode ) { - /* ISm Low-rate mode -> always WB */ + /* ISM Low-rate mode -> always WB */ st->bwidth = WB; } else if ( hSCE->element_brate < MIN_BRATE_SWB_SCE ) @@ -229,11 +234,7 @@ ivas_error ivas_sce_dec( * Decoder *----------------------------------------------------------------*/ -#ifdef PARAM_ISM_DTX_CNG if ( ( error = ivas_core_dec( st_ivas, hSCE, NULL, NULL, 1, output, outputHB, NULL, st_ivas->sba_dirac_stereo_flag ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_core_dec( NULL, hSCE, NULL, NULL, 1, output, outputHB, NULL, st_ivas->sba_dirac_stereo_flag ) ) != IVAS_ERR_OK ) -#endif { return error; } diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 7515300681..01e4db2ed4 100644 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -61,11 +61,8 @@ static void ivas_spar_dec_MD( Decoder_Struct *st_ivas, Decoder_State *st0 ); *------------------------------------------------------------------------*/ ivas_error ivas_spar_dec_open( - Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ -#ifdef SBA_BR_SWITCHING_CLEAN_UP - , + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ -#endif ) { SPAR_DEC_HANDLE hSpar; @@ -78,20 +75,16 @@ ivas_error ivas_spar_dec_open( error = IVAS_ERR_OK; sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); num_channels_internal = ivas_sba_get_nchan_metadata( sba_order_internal ); -#ifdef SBA_BR_SWITCHING_CLEAN_UP hSpar = st_ivas->hSpar; if ( !spar_reconfig_flag ) { -#endif /* SPAR decoder handle */ if ( ( hSpar = (SPAR_DEC_HANDLE) malloc( sizeof( SPAR_DEC_DATA ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR decoder" ); } -#ifdef SBA_BR_SWITCHING_CLEAN_UP } -#endif output_Fs = st_ivas->hDecoderConfig->output_Fs; @@ -119,11 +112,7 @@ ivas_error ivas_spar_dec_open( fb_cfg->remix_order = remix_order_set[hSpar->hMdDec->spar_md_cfg.remix_unmix_order]; /* FB mixer handle */ -#ifdef SBA_BR_SWITCHING_CLEAN_UP if ( ( error = ivas_FB_mixer_open( &hSpar->hFbMixer, output_Fs, fb_cfg, spar_reconfig_flag ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_FB_mixer_open( &hSpar->hFbMixer, output_Fs, fb_cfg ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -197,48 +186,39 @@ ivas_error ivas_spar_dec_open( *------------------------------------------------------------------------*/ void ivas_spar_dec_close( - SPAR_DEC_HANDLE hSpar, /* i/o: SPAR decoder handle */ - const int32_t output_Fs /* i : output sampling rate */ -#ifdef SBA_BR_SWITCHING_CLEAN_UP - , + SPAR_DEC_HANDLE *hSpar, /* i/o: SPAR decoder handle */ + const int32_t output_Fs, /* i : output sampling rate */ const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ -#endif ) { - if ( hSpar != NULL ) + if ( *hSpar == NULL || hSpar == NULL ) { - /* MD handle */ - ivas_spar_md_dec_close( &hSpar->hMdDec ); + return; + } - /* TD decorrelator handle */ - ivas_td_decorr_dec_close( &hSpar->hTdDecorr ); + /* MD handle */ + ivas_spar_md_dec_close( &( *hSpar )->hMdDec ); - /* FB mixer handle */ -#ifdef SBA_BR_SWITCHING_CLEAN_UP - ivas_FB_mixer_close( &hSpar->hFbMixer, output_Fs, spar_reconfig_flag ); -#else - ivas_FB_mixer_close( &hSpar->hFbMixer, output_Fs ); -#endif + /* TD decorrelator handle */ + ivas_td_decorr_dec_close( &( *hSpar )->hTdDecorr ); - /* AGC */ - ivas_spar_agc_dec_close( &hSpar->hAgcDec ); + /* FB mixer handle */ + ivas_FB_mixer_close( &( *hSpar )->hFbMixer, output_Fs, spar_reconfig_flag ); - /* PCA */ - if ( hSpar->hPCA != NULL ) - { - free( hSpar->hPCA ); - hSpar->hPCA = NULL; - } + /* AGC */ + ivas_spar_agc_dec_close( &( *hSpar )->hAgcDec ); -#ifdef SBA_BR_SWITCHING_CLEAN_UP - if ( !spar_reconfig_flag ) - { -#endif - free( hSpar ); - hSpar = NULL; -#ifdef SBA_BR_SWITCHING_CLEAN_UP - } -#endif + /* PCA */ + if ( ( *hSpar )->hPCA != NULL ) + { + free( ( *hSpar )->hPCA ); + ( *hSpar )->hPCA = NULL; + } + + if ( !spar_reconfig_flag ) + { + free( ( *hSpar ) ); + ( *hSpar ) = NULL; } return; @@ -826,57 +806,38 @@ void ivas_spar_get_parameters( weight = ivas_spar_get_cldfb_slot_gain( hSpar, hDecoderConfig, ts, &ts0, &ts1, &weight_20ms ); -#ifdef COV_SMOOTH_TUNING split_band = SPAR_DIRAC_SPLIT_START_BAND; -#else - split_band = hSpar->hMdDec->spar_md.num_bands; -#endif for ( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) { for ( out_ch = 0; out_ch < num_ch_out; out_ch++ ) { -#ifndef COV_SMOOTH_TUNING - for ( in_ch = 0; in_ch < num_ch_in; in_ch++ ) + if ( split_band < IVAS_MAX_NUM_BANDS + /* 20ms cross-fade for Transport channels in all frequency bands */ + && ( 0 == ivas_is_res_channel( out_ch, hSpar->hMdDec->spar_md_cfg.nchan_transport ) ) /* sub-frame processing for missing channels in all frequency bands*/ + ) { -#endif - if ( split_band < IVAS_MAX_NUM_BANDS - /* 20ms cross-fade for Transport channels in all frequency bands */ - && ( 0 == ivas_is_res_channel( out_ch, hSpar->hMdDec->spar_md_cfg.nchan_transport ) ) /* sub-frame processing for missing channels in all frequency bands*/ - ) + for ( in_ch = 0; in_ch < num_ch_in; in_ch++ ) { -#ifdef COV_SMOOTH_TUNING - for ( in_ch = 0; in_ch < num_ch_in; in_ch++ ) + if ( hSpar->i_subframe > 3 ) { -#endif - if ( hSpar->i_subframe > 3 ) - { - par_mat[out_ch][in_ch][spar_band] = ( 1.0f - weight ) * hSpar->hMdDec->mixer_mat_prev[ts0][out_ch][in_ch][spar_band] + - weight * hSpar->hMdDec->mixer_mat_prev[ts1][out_ch][in_ch][spar_band]; - } - else - { - par_mat[out_ch][in_ch][spar_band] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][spar_band]; - } -#ifdef COV_SMOOTH_TUNING + par_mat[out_ch][in_ch][spar_band] = ( 1.0f - weight ) * hSpar->hMdDec->mixer_mat_prev[ts0][out_ch][in_ch][spar_band] + + weight * hSpar->hMdDec->mixer_mat_prev[ts1][out_ch][in_ch][spar_band]; } -#endif - } - else - { -#ifdef COV_SMOOTH_TUNING - for ( in_ch = 0; in_ch < num_ch_in; in_ch++ ) + else { -#endif - /* 20ms Transport channel reconstruction with matching encoder/decoder processing */ - int16_t prev_idx = SPAR_DIRAC_SPLIT_START_BAND < IVAS_MAX_NUM_BANDS ? 1 : 0; /* if SPAR_DIRAC_SPLIT_START_BAND == IVAS_MAX_NUM_BANDS, then the sub-frame mixer_mat delay line is not active */ - par_mat[out_ch][in_ch][spar_band] = ( 1.0f - weight_20ms ) * hSpar->hMdDec->mixer_mat_prev[prev_idx][out_ch][in_ch][spar_band] + weight_20ms * hSpar->hMdDec->mixer_mat[out_ch][in_ch][spar_band]; -#ifdef COV_SMOOTH_TUNING + par_mat[out_ch][in_ch][spar_band] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][spar_band]; } -#endif } -#ifndef COV_SMOOTH_TUNING } -#endif + else + { + for ( in_ch = 0; in_ch < num_ch_in; in_ch++ ) + { + /* 20ms Transport channel reconstruction with matching encoder/decoder processing */ + int16_t prev_idx = SPAR_DIRAC_SPLIT_START_BAND < IVAS_MAX_NUM_BANDS ? 1 : 0; /* if SPAR_DIRAC_SPLIT_START_BAND == IVAS_MAX_NUM_BANDS, then the sub-frame mixer_mat delay line is not active */ + par_mat[out_ch][in_ch][spar_band] = ( 1.0f - weight_20ms ) * hSpar->hMdDec->mixer_mat_prev[prev_idx][out_ch][in_ch][spar_band] + weight_20ms * hSpar->hMdDec->mixer_mat[out_ch][in_ch][spar_band]; + } + } } } diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index ff6f858d31..3b47d6500e 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -305,6 +305,7 @@ static void ivas_spar_md_dec_matrix_close( free( hMdDecoder->spar_md.band_coeffs ); hMdDecoder->spar_md.band_coeffs = NULL; } + if ( hMdDecoder->mixer_mat != NULL ) { for ( i = 0; i < num_channels; i++ ) @@ -418,11 +419,8 @@ void ivas_spar_md_dec_close( ivas_spar_md_dec_matrix_close( hMdDecoder, num_channels ); - if ( *hMdDec != NULL ) - { - free( *hMdDec ); - *hMdDec = NULL; - } + free( *hMdDec ); + *hMdDec = NULL; return; } diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 4157438f80..ab95c31b5e 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -382,7 +382,6 @@ typedef struct stereo_icbwe_dec_data_structure } STEREO_ICBWE_DEC_DATA, *STEREO_ICBWE_DEC_HANDLE; -#ifdef PARAM_ISM_DTX_CNG /*----------------------------------------------------------------------------------* * ISM DTX structure *----------------------------------------------------------------------------------*/ @@ -392,9 +391,12 @@ typedef struct int16_t dtx_flag; int16_t sce_id_dtx; -} ISM_DTX_DATA_DEC; +#ifdef DISCRETE_ISM_DTX_CNG + int16_t ism_dtx_hangover_cnt; /* hangover counter for ISM DTX decoder */ #endif +} ISM_DTX_DATA_DEC; + /*----------------------------------------------------------------------------------* * DirAC decoder structure *----------------------------------------------------------------------------------*/ @@ -807,6 +809,7 @@ typedef struct ivas_spar_md_dec_state_t int16_t table_idx; int16_t dtx_vad; int16_t spar_hoa_md_flag; + } ivas_spar_md_dec_state_t; @@ -1052,7 +1055,7 @@ typedef struct ivas_binaural_rendering_struct /* Convolution module structure */ BINRENDERER_CONV_MODULE_HANDLE hBinRenConvModule; - /* Variables related to reverb module */ + /* Variables related to reverberator module */ float earlyPartEneCorrection[CLDFB_NO_CHANNELS_MAX]; REVERB_STRUCT_HANDLE hReverb; @@ -1145,18 +1148,13 @@ typedef struct decoder_config_structure int16_t Opt_LsCustom; /* indicates whether loudspeaker custom setup is used */ int16_t Opt_HRTF_binary; /* indicates whether HRTF binary file is used */ int16_t Opt_Headrotation; /* indicates whether head-rotation is used */ -#ifdef FIX_351_HRTF_COMMAND - int16_t Opt_RendConfigCustom; /* indicates whether Renderer configuration custom setup is used */ -#endif - int16_t orientation_tracking; /* indicates orientation tracking type */ + int16_t Opt_RendConfigCustom; /* indicates whether Renderer configuration custom setup is used */ + int16_t orientation_tracking; /* indicates orientation tracking type */ float no_diegetic_pan; int16_t Opt_AMR_WB; /* flag indicating AMR-WB IO mode */ /* temp. development parameters */ #ifdef DEBUGGING -#ifndef REMOVE_FORCE_SUBFRAME_BIN - int16_t forceSubframeBinauralization; /* Flag for forcing Parametric binauralizer to subframe mode */ -#endif int16_t force_rend; /* forced TD/CLDFB binaural renderer (for ISM and MC) */ #endif @@ -1206,9 +1204,7 @@ typedef struct Decoder_Struct /* multichannel modules */ ISM_METADATA_HANDLE hIsmMetaData[MAX_NUM_OBJECTS]; /* ISM metadata handles (storage for one frame of read ISM metadata) */ -#ifdef PARAM_ISM_DTX_CNG ISM_DTX_DATA_DEC hISMDTX; /* ISM DTX structure */ -#endif ISM_RENDERER_HANDLE hIsmRendererData; /* ISM renderer handle */ DIRAC_DEC_HANDLE hDirAC; /* DirAC handle */ SPAR_DEC_HANDLE hSpar; /* SPAR handle */ @@ -1219,6 +1215,9 @@ typedef struct Decoder_Struct LFE_DEC_HANDLE hLFE; /* LFE handle */ ISM_MODE ism_mode; /* ISM format mode */ +#ifdef NCHAN_ISM_PARAMETER + int16_t nchan_ism; /* number of ISM channels */ +#endif SBA_MODE sba_mode; /* SBA format mode */ MC_MODE mc_mode; /* MC format mode */ int16_t sba_order; /* Ambisonic (SBA) order */ @@ -1238,15 +1237,8 @@ typedef struct Decoder_Struct EFAP_HANDLE hEFAPdata; /* EFAP structure */ VBAP_HANDLE hVBAPdata; /* VBAP structure */ MONO_DOWNMIX_RENDERER_HANDLE hMonoDmxRenderer; /* Mono downmix structure */ -#ifdef FIX_197_CREND_INTERFACE CREND_WRAPPER_HANDLE hCrendWrapper; -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND REVERB_HANDLE hReverb; /* Reverb handle */ -#endif -#else - CREND_HANDLE hCrend; /* Convolution mixer renderer structure */ - HRTFS_HANDLE hHrtf; /* HRTFs handle */ -#endif HRTFS_CREND_HANDLE hSetOfHRTF; /* Set of HRTFs handle (CRend) */ HRTFS_FASTCONV_HANDLE hHrtfFastConv; /* FASTCONV HRTF tables for binaural rendering */ HRTFS_PARAMBIN_HANDLE hHrtfParambin; /* HRTF tables for parametric binauralizer */ diff --git a/lib_dec/ivas_tcx_core_dec.c b/lib_dec/ivas_tcx_core_dec.c index 378ddec9aa..56059bd29d 100644 --- a/lib_dec/ivas_tcx_core_dec.c +++ b/lib_dec/ivas_tcx_core_dec.c @@ -160,11 +160,11 @@ void stereo_tcx_core_dec( const int16_t last_element_mode, /* i : last element mode */ const int16_t flag_sec_CNA, /* i : CNA flag for secondary channel */ STEREO_CNG_DEC_HANDLE hStereoCng, /* i : Stereo CNG handle */ - const int16_t nchan_out /* i : number of output channels */ -#ifdef PARAM_ISM_DTX_CNG + const int16_t nchan_out, /* i : number of output channels */ + const IVAS_FORMAT ivas_format /* i : IVAS format */ +#ifndef DISCRETE_ISM_DTX_CNG , - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const ISM_MODE ism_mode /* i : ISM mode (only needed if format is ISM) */ + const ISM_MODE ism_mode /* i : ISM mode (only needed if format is ISM)*/ #endif ) { @@ -729,8 +729,11 @@ void stereo_tcx_core_dec( if ( st->element_mode != IVAS_CPE_TD ) { -#ifdef PARAM_ISM_DTX_CNG +#ifndef DISCRETE_ISM_DTX_CNG if ( ivas_format == ISM_FORMAT && ism_mode == ISM_MODE_PARAM ) +#else + if ( ivas_format == ISM_FORMAT ) +#endif { float buffer[L_FRAME16k]; lerp( signal_outFB, buffer, st->L_frame, hTcxDec->L_frameTCX ); @@ -740,9 +743,6 @@ void stereo_tcx_core_dec( { ApplyFdCng( signal_out, NULL, NULL, NULL, st, st->bfi, 0 ); } -#else - ApplyFdCng( signal_out, NULL, NULL, NULL, st, st->bfi, 0 ); -#endif } /* Generate additional comfort noise to mask potential coding artefacts */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 95f7dca8a7..61c9494e30 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -223,14 +223,7 @@ static void init_decoder_config( hDecoderConfig->Opt_LsCustom = 0; hDecoderConfig->Opt_HRTF_binary = 0; hDecoderConfig->Opt_Headrotation = 0; -#ifdef FIX_351_HRTF_COMMAND hDecoderConfig->Opt_RendConfigCustom = 0; -#endif -#ifndef REMOVE_FORCE_SUBFRAME_BIN -#ifdef DEBUGGING - hDecoderConfig->forceSubframeBinauralization = 0; -#endif -#endif hDecoderConfig->orientation_tracking = orientation_tracking; hDecoderConfig->no_diegetic_pan = no_diegetic_pan; @@ -394,17 +387,8 @@ ivas_error IVAS_DEC_Configure( const IVAS_DEC_AUDIO_CONFIG outputFormat, /* i : output format */ const int16_t customLsOutputEnabled, /* i : enable custom loudspeaker setup handle */ const int16_t hrtfReaderEnabled, /* i : enable HRTF binary file input */ - const int16_t enableHeadRotation /* i : enable head rotation for binaural output */ -#ifdef FIX_351_HRTF_COMMAND - , - const int16_t renderConfigEnabled /* i : enable Renderer config. file for binaural output */ -#endif -#ifndef REMOVE_FORCE_SUBFRAME_BIN -#ifdef DEBUGGING - , - const int16_t forceSubframeBinauralization /* i : enable subframe binauralization */ -#endif -#endif + const int16_t enableHeadRotation, /* i : enable head rotation for binaural output */ + const int16_t renderConfigEnabled /* i : enable Renderer config. file for binaural output */ ) { Decoder_Struct *st_ivas; @@ -450,17 +434,10 @@ ivas_error IVAS_DEC_Configure( hDecoderConfig->nchan_out = audioCfg2channels( hDecoderConfig->output_config ); } -#ifndef REMOVE_FORCE_SUBFRAME_BIN -#ifdef DEBUGGING - hDecoderConfig->forceSubframeBinauralization = forceSubframeBinauralization; -#endif -#endif hDecoderConfig->Opt_LsCustom = customLsOutputEnabled; hDecoderConfig->Opt_Headrotation = enableHeadRotation; hDecoderConfig->Opt_HRTF_binary = hrtfReaderEnabled; -#ifdef FIX_351_HRTF_COMMAND hDecoderConfig->Opt_RendConfigCustom = renderConfigEnabled; -#endif /* Set decoder parameters to initial values */ if ( ( error = ivas_init_decoder_front( st_ivas ) ) != IVAS_ERR_OK ) @@ -856,7 +833,13 @@ ivas_error IVAS_DEC_GetObjectMetadata( { metadata->azimuth = hIsmMeta->azimuth; metadata->elevation = hIsmMeta->elevation; +#ifdef TD5 + metadata->radius = hIsmMeta->radius; + metadata->yaw = hIsmMeta->yaw; + metadata->pitch = hIsmMeta->pitch; +#else metadata->radius = 0.f; +#endif metadata->spread = 0.f; metadata->gainFactor = 1.f; } @@ -906,14 +889,23 @@ ivas_error IVAS_DEC_GetMasaMetadata( *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_FeedHeadTrackData( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - IVAS_QUATERNION *orientation /* i : head-tracking data */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ +#ifdef TD5 + IVAS_QUATERNION *orientation, /* i : head-tracking data, listener orientation */ + IVAS_POSITION *Pos /* i : listener position */ +#else + IVAS_QUATERNION *orientation /* i : head-tracking data, listener orientation */ +#endif ) { HEAD_TRACK_DATA_HANDLE hHeadTrackData; int16_t i; +#ifdef FIX_I109_ORIENTATION_TRACKING + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL || orientation == NULL ) +#else if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) +#endif { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } @@ -928,10 +920,25 @@ ivas_error IVAS_DEC_FeedHeadTrackData( /* Move head-tracking data to the decoder handle */ for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) { +#ifdef FIX_I109_ORIENTATION_TRACKING + /* check for Euler angle signaling */ + if ( orientation[i].w == -3.0f ) + { + Euler2Quat( deg2rad( orientation[i].x ), deg2rad( orientation[i].y ), deg2rad( orientation[i].z ), &orientation[i] ); + } + + ivas_orient_trk_Process( hHeadTrackData->OrientationTracker, orientation[i], FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES, &hHeadTrackData->Quaternions[i] ); +#else hHeadTrackData->Quaternions[i].w = orientation[i].w; hHeadTrackData->Quaternions[i].x = orientation[i].x; hHeadTrackData->Quaternions[i].y = orientation[i].y; hHeadTrackData->Quaternions[i].z = orientation[i].z; +#endif +#ifdef TD5 + hHeadTrackData->Pos[i].x = Pos[i].x; + hHeadTrackData->Pos[i].y = Pos[i].y; + hHeadTrackData->Pos[i].z = Pos[i].z; +#endif } hIvasDec->st_ivas->hHeadTrackData->num_quaternions = 0; @@ -939,6 +946,62 @@ ivas_error IVAS_DEC_FeedHeadTrackData( return IVAS_ERR_OK; } +#ifdef FIX_I109_ORIENTATION_TRACKING +/*---------------------------------------------------------------------* + * IVAS_DEC_FeedRefRotData( ) + * + * Feed the decoder with the reference rotation + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_FeedRefRotData( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_QUATERNION rotation /* i : reference rotation data */ +) +{ + ivas_orient_trk_state_t *pOtr; + + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hIvasDec->st_ivas->hHeadTrackData == NULL || hIvasDec->st_ivas->hHeadTrackData->OrientationTracker == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + pOtr = hIvasDec->st_ivas->hHeadTrackData->OrientationTracker; + + pOtr->refRot.w = rotation.w; + pOtr->refRot.x = rotation.x; + pOtr->refRot.z = rotation.z; + pOtr->refRot.y = rotation.y; + + return IVAS_ERR_OK; +} + +#ifdef OTR_REFERENCE_VECTOR_TRACKING +/*---------------------------------------------------------------------* + * IVAS_DEC_FeedRefVectorData( ) + * + * Feed the decoder with a reference vector spanning from listenerPos + * to refPos. Only available in OTR_TRACKING_REF_POS and + * OTR_TRACKING_REF_POS_LEV modes. + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_FeedRefVectorData( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const IVAS_VECTOR3 listenerPos, /* i : Listener position */ + const IVAS_VECTOR3 refPos /* i : Reference position */ +) +{ + ivas_orient_trk_state_t *pOtr; + + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hIvasDec->st_ivas->hHeadTrackData == NULL || hIvasDec->st_ivas->hHeadTrackData->OrientationTracker == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + pOtr = hIvasDec->st_ivas->hHeadTrackData->OrientationTracker; + return ivas_orient_trk_SetReferenceVector( pOtr, listenerPos, refPos ); +} +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ +#endif /*---------------------------------------------------------------------* * IVAS_DEC_FeedCustomLsData( ) @@ -1122,6 +1185,9 @@ ivas_error IVAS_DEC_GetRenderConfig( mvr2r( hRCin->roomAcoustics.pFc_input, hRCout->room_acoustics.pFc_input, CLDFB_NO_CHANNELS_MAX ); mvr2r( hRCin->roomAcoustics.pAcoustic_rt60, hRCout->room_acoustics.pAcoustic_rt60, CLDFB_NO_CHANNELS_MAX ); mvr2r( hRCin->roomAcoustics.pAcoustic_dsr, hRCout->room_acoustics.pAcoustic_dsr, CLDFB_NO_CHANNELS_MAX ); +#ifdef TD5 + mvr2r( hRCin->directivity, hRCout->directivity, 3 ); +#endif return IVAS_ERR_OK; } @@ -1166,6 +1232,9 @@ ivas_error IVAS_DEC_FeedRenderConfig( mvr2r( renderConfig.room_acoustics.pFc_input, hRenderConfig->roomAcoustics.pFc_input, CLDFB_NO_CHANNELS_MAX ); mvr2r( renderConfig.room_acoustics.pAcoustic_rt60, hRenderConfig->roomAcoustics.pAcoustic_rt60, CLDFB_NO_CHANNELS_MAX ); mvr2r( renderConfig.room_acoustics.pAcoustic_dsr, hRenderConfig->roomAcoustics.pAcoustic_dsr, CLDFB_NO_CHANNELS_MAX ); +#ifdef TD5 + mvr2r( renderConfig.directivity, hRenderConfig->directivity, 3 ); +#endif return IVAS_ERR_OK; } @@ -1940,7 +2009,6 @@ static ivas_error printConfigInfo_dec( get_channel_config( st_ivas->hDecoderConfig->output_config, &config_str[0] ); fprintf( stdout, "Output configuration: %s\n", config_str ); -#ifdef FIX_351_HRTF_COMMAND if ( st_ivas->hDecoderConfig->Opt_HRTF_binary ) { fprintf( stdout, "HRIR/BRIR file: ON\n" ); @@ -1950,7 +2018,6 @@ static ivas_error printConfigInfo_dec( { fprintf( stdout, "Renderer config. file: ON\n" ); } -#endif if ( st_ivas->hDecoderConfig->Opt_Headrotation ) { diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index 36dab5c1f9..a717e0002e 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -129,17 +129,8 @@ ivas_error IVAS_DEC_Configure( const IVAS_DEC_AUDIO_CONFIG outputFormat, /* i : output format */ const int16_t customLsOutputEnabled, /* i : enable custom loudspeaker setup handle */ const int16_t hrtfReaderEnabled, /* i : enable HRTF binary file input */ - const int16_t enableHeadRotation /* i : enable head rotation for binaural output */ -#ifdef FIX_351_HRTF_COMMAND - ,const int16_t renderConfigEnabled /* i : enable Renderer config. file for binaural output */ -#endif - -#ifndef REMOVE_FORCE_SUBFRAME_BIN -#ifdef DEBUGGING - , - const int16_t forceSubframeBinauralization /* i : enable subframe binauralization */ -#endif -#endif + const int16_t enableHeadRotation, /* i : enable head rotation for binaural output */ + const int16_t renderConfigEnabled /* i : enable Renderer config. file for binaural output */ ); void IVAS_DEC_Close( @@ -185,9 +176,30 @@ ivas_error IVAS_DEC_GetMasaMetadata( /*! r: error code */ ivas_error IVAS_DEC_FeedHeadTrackData( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ +#ifdef TD5 + IVAS_QUATERNION *orientation, /* i : head-tracking data */ + IVAS_POSITION *Pos /* i : listener position */ +#else IVAS_QUATERNION *orientation /* i : head-tracking data */ +#endif ); +#ifdef FIX_I109_ORIENTATION_TRACKING +/*! r: error code */ +ivas_error IVAS_DEC_FeedRefRotData( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_QUATERNION rotation /* i : reference rotation data */ +); +#ifdef OTR_REFERENCE_VECTOR_TRACKING +/*! r: error code */ +ivas_error IVAS_DEC_FeedRefVectorData( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const IVAS_VECTOR3 listenerPos, /* i : Listener position */ + const IVAS_VECTOR3 refPos /* i : Reference position */ +); +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ +#endif + /*! r: error code */ ivas_error IVAS_DEC_VoIP_FeedFrame( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ @@ -202,7 +214,7 @@ ivas_error IVAS_DEC_VoIP_FeedFrame( /*! r: error code */ ivas_error IVAS_DEC_VoIP_GetSamples( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - uint16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ + uint16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ int16_t *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */ const uint32_t systemTimestamp_ms /* i : current system timestamp */ #ifdef SUPPORT_JBM_TRACEFILE diff --git a/lib_dec/stat_dec.h b/lib_dec/stat_dec.h index 0950b529f6..1a82d45587 100644 --- a/lib_dec/stat_dec.h +++ b/lib_dec/stat_dec.h @@ -1345,9 +1345,10 @@ typedef struct Decoder_State /* MCT Channel mode indication: LFE, ignore channel? */ MCT_CHAN_MODE mct_chan_mode; -#ifdef PARAM_ISM_DTX_CNG - int16_t cng_paramISM_flag; /* CNG in Param-ISM flag */ - int16_t read_sid_info; /* For ParamISM, use the transmitted noise */ + int16_t cng_ism_flag; /* CNG in Param-ISM flag */ + int16_t read_sid_info; /* For ParamISM, use the transmitted noise */ +#ifdef DISCRETE_ISM_DTX_CNG + int16_t is_ism_format; /* Indication whether the codec operates in ISM format */ #endif } Decoder_State, *DEC_CORE_HANDLE; diff --git a/lib_enc/acelp_core_enc.c b/lib_enc/acelp_core_enc.c index 272d36fb9c..48cdb5c536 100644 --- a/lib_enc/acelp_core_enc.c +++ b/lib_enc/acelp_core_enc.c @@ -314,17 +314,13 @@ ivas_error acelp_core_enc( if ( st->core_brate == SID_2k40 ) { -#ifdef PARAM_ISM_DTX_CNG if ( st->hTdCngEnc != NULL ) { -#endif tmpF = cng_energy( st->element_mode, st->bwidth, st->hDtxEnc->CNG_mode, st->hTdCngEnc->CNG_att, exc, st->L_frame ); i = (int16_t) ( ( tmpF + 2.0f ) * STEP_SID ); i = min( max( i, 0 ), 127 ); st->hTdCngEnc->old_enr_index = i; -#ifdef PARAM_ISM_DTX_CNG } -#endif } } diff --git a/lib_enc/acelp_core_switch_enc.c b/lib_enc/acelp_core_switch_enc.c index 1a3488d92d..291c2128a1 100644 --- a/lib_enc/acelp_core_switch_enc.c +++ b/lib_enc/acelp_core_switch_enc.c @@ -73,10 +73,6 @@ void acelp_core_switch_enc( const float *inp; int32_t cbrate; float Aq[2 * ( M + 1 )]; -#ifdef IND_LIST_DYN - uint16_t value; - int16_t nb_bits; -#endif BSTR_ENC_HANDLE hBstr = st->hBstr; /* initializations */ @@ -163,25 +159,12 @@ void acelp_core_switch_enc( * Manipulate ACELP subframe indices (move them to their proper place) *----------------------------------------------------------------*/ -#ifdef IND_LIST_DYN - i = find_indice( hBstr, TAG_ACELP_SUBFR_LOOP_START, &value, &nb_bits ); -#ifdef DEBUGGING - assert( i >= 0 && "Internal error in ACELP core switching - unable to find ACELP subframe indices!" ); -#endif - while ( hBstr->ind_list[i].id == TAG_ACELP_SUBFR_LOOP_START ) - { - push_indice( hBstr, IND_CORE_SWITCHING_CELP_SUBFRAME, hBstr->ind_list[i].value, hBstr->ind_list[i].nb_bits ); - i++; - } - delete_indice( hBstr, TAG_ACELP_SUBFR_LOOP_START ); -#else for ( i = 0; i < 20; i++ ) { hBstr->ind_list[IND_CORE_SWITCHING_CELP_SUBFRAME + i].value = hBstr->ind_list[TAG_ACELP_SUBFR_LOOP_START + i].value; hBstr->ind_list[IND_CORE_SWITCHING_CELP_SUBFRAME + i].nb_bits = hBstr->ind_list[TAG_ACELP_SUBFR_LOOP_START + i].nb_bits; hBstr->ind_list[TAG_ACELP_SUBFR_LOOP_START + i].nb_bits = -1; } -#endif /*----------------------------------------------------------------* * BWE encoding diff --git a/lib_enc/amr_wb_enc.c b/lib_enc/amr_wb_enc.c index 80520d4c38..88b3faa5d6 100644 --- a/lib_enc/amr_wb_enc.c +++ b/lib_enc/amr_wb_enc.c @@ -342,7 +342,12 @@ void amr_wb_enc( * WB, SWB and FB bandwidth detector *----------------------------------------------------------------*/ - bw_detect( st, st->input, NULL, NULL ); + bw_detect( st, st->input, NULL, NULL +#ifdef FIX_MDCT_BASED_BWD + , + 0 +#endif + ); /* in AMR_WB IO, limit the maximum band-width to WB */ if ( st->bwidth > WB ) diff --git a/lib_enc/bw_detect.c b/lib_enc/bw_detect.c index 5f46910c57..8ca63d28f2 100644 --- a/lib_enc/bw_detect.c +++ b/lib_enc/bw_detect.c @@ -57,6 +57,9 @@ #define BWD_COUNT_MAX 100 #define BWD_COUNT_WIDER_BW 10 +#ifdef FIX_MDCT_BASED_BWD +#define BWD_COUNT_WIDER_BW_MDCT 0 +#endif #define CLDFB_ENER_OFFSET 1.6f @@ -71,6 +74,10 @@ void bw_detect( const float signal_in[], /* i : input signal */ float *spectrum, /* i : MDCT spectrum */ const float *enerBuffer /* i : energy buffer */ +#ifdef FIX_MDCT_BASED_BWD + , + const int16_t mct_on /* i : flag MCT mode */ +#endif ) { int16_t i, j, k, bw_max, bin_width, n_bins; @@ -80,6 +87,15 @@ void bw_detect( const float *pt, *pt1; float max_NB, max_WB, max_SWB, max_FB, mean_NB, mean_WB, mean_SWB, mean_FB; int16_t cldfb_bin_width = 4; +#ifdef FIX_MDCT_BASED_BWD + int16_t bwd_count_wider_bw, l_frame; + + bwd_count_wider_bw = BWD_COUNT_WIDER_BW; + if ( st->element_mode == IVAS_CPE_MDCT && ( st->element_brate > IVAS_64k || mct_on ) ) + { + bwd_count_wider_bw = BWD_COUNT_WIDER_BW_MDCT; + } +#endif if ( st->input_Fs > 8000 ) { @@ -173,8 +189,19 @@ void bw_detect( } else { +#ifndef FIX_MDCT_BASED_BWD bin_width *= (int16_t) ( ( st->input_Fs / FRAMES_PER_SEC ) / BWD_TOTAL_WIDTH ); mvr2r( spectrum, spect, (int16_t) ( st->input_Fs / FRAMES_PER_SEC ) ); +#else + l_frame = (int16_t) ( st->input_Fs / FRAMES_PER_SEC ); + if ( st->core == TCX_10_CORE ) + { + l_frame /= 2; + } + + bin_width *= ( l_frame / BWD_TOTAL_WIDTH ); + mvr2r( spectrum, spect, l_frame ); +#endif } /*---------------------------------------------------------------------* * compute energy per spectral bins @@ -392,17 +419,29 @@ void bw_detect( /* switching to a higher BW */ if ( st->last_input_bwidth == NB ) { +#ifdef FIX_MDCT_BASED_BWD + if ( st->count_WB > bwd_count_wider_bw ) +#else if ( st->count_WB > BWD_COUNT_WIDER_BW ) +#endif { st->input_bwidth = WB; st->count_WB = BWD_COUNT_MAX; +#ifdef FIX_MDCT_BASED_BWD + if ( st->count_SWB > bwd_count_wider_bw ) +#else if ( st->count_SWB > BWD_COUNT_WIDER_BW ) +#endif { st->input_bwidth = SWB; st->count_SWB = BWD_COUNT_MAX; +#ifdef FIX_MDCT_BASED_BWD + if ( st->count_FB > bwd_count_wider_bw ) +#else if ( st->count_FB > BWD_COUNT_WIDER_BW ) +#endif { st->input_bwidth = FB; st->count_FB = BWD_COUNT_MAX; @@ -413,12 +452,20 @@ void bw_detect( if ( st->last_input_bwidth == WB && st->input_Fs > 16000 ) { +#ifdef FIX_MDCT_BASED_BWD + if ( st->count_SWB > bwd_count_wider_bw ) +#else if ( st->count_SWB > BWD_COUNT_WIDER_BW ) +#endif { st->input_bwidth = SWB; st->count_SWB = BWD_COUNT_MAX; +#ifdef FIX_MDCT_BASED_BWD + if ( st->count_FB > bwd_count_wider_bw ) +#else if ( st->count_FB > BWD_COUNT_WIDER_BW ) +#endif { st->input_bwidth = FB; st->count_FB = BWD_COUNT_MAX; @@ -428,7 +475,11 @@ void bw_detect( if ( st->last_input_bwidth == SWB && st->input_Fs > 32000 ) { +#ifdef FIX_MDCT_BASED_BWD + if ( st->count_FB > bwd_count_wider_bw ) +#else if ( st->count_FB > BWD_COUNT_WIDER_BW ) +#endif { st->input_bwidth = FB; st->count_FB = BWD_COUNT_MAX; diff --git a/lib_enc/cng_enc.c b/lib_enc/cng_enc.c index 0f17b82923..04d9e41166 100644 --- a/lib_enc/cng_enc.c +++ b/lib_enc/cng_enc.c @@ -885,12 +885,8 @@ void swb_CNG_enc( else if ( st->element_mode == IVAS_CPE_DFT && st->core_brate == SID_2k40 ) { /* LF-boost not used in DFT-stereo, instead the bandwidth is transmitted */ -#ifdef IND_LIST_DYN - delete_indice( st->hBstr, IND_CNG_ENV1 ); -#else st->hBstr->nb_bits_tot = st->hBstr->nb_bits_tot - st->hBstr->ind_list[IND_CNG_ENV1].nb_bits; st->hBstr->ind_list[IND_CNG_ENV1].nb_bits = -1; -#endif push_indice( st->hBstr, IND_BWIDTH, st->bwidth, 2 ); push_indice( st->hBstr, IND_UNUSED, 0, 4 ); push_indice( st->hBstr, IND_SID_BW, 1, 1 ); @@ -966,12 +962,8 @@ static void shb_CNG_encod( push_indice( hBstr, IND_SHB_CNG_GAIN, idx_ener, 4 ); push_indice( hBstr, IND_SID_BW, 1, 1 ); -#ifdef IND_LIST_DYN - delete_indice( hBstr, IND_CNG_ENV1 ); -#else hBstr->nb_bits_tot = hBstr->nb_bits_tot - hBstr->ind_list[IND_CNG_ENV1].nb_bits; hBstr->ind_list[IND_CNG_ENV1].nb_bits = -1; -#endif if ( st->element_mode == IVAS_CPE_DFT ) { push_indice( st->hBstr, IND_BWIDTH, st->bwidth, 2 ); diff --git a/lib_enc/dtx.c b/lib_enc/dtx.c index 652c28f139..c99a8faf28 100644 --- a/lib_enc/dtx.c +++ b/lib_enc/dtx.c @@ -259,13 +259,7 @@ void dtx( /* reset the bitstream (IVAS format signaling was already written) */ if ( st->element_mode != IVAS_CPE_MDCT && st->hBstr != NULL ) { - reset_indices_enc( st->hBstr, -#ifdef IND_LIST_DYN - st->hBstr->max_num_indices -#else - MAX_NUM_INDICES -#endif - ); + reset_indices_enc( st->hBstr, MAX_NUM_INDICES ); } } diff --git a/lib_enc/enc_ppp.c b/lib_enc/enc_ppp.c index a70d37a4dc..823d6cf3cd 100644 --- a/lib_enc/enc_ppp.c +++ b/lib_enc/enc_ppp.c @@ -169,13 +169,7 @@ ivas_error encod_ppp( } /* delete previous indices */ - reset_indices_enc( hBstr, -#ifdef IND_LIST_DYN - hBstr->max_num_indices -#else - MAX_NUM_INDICES -#endif - ); + reset_indices_enc( hBstr, MAX_NUM_INDICES ); /* signaling matrix (writing of signaling bits) */ signaling_enc( st ); diff --git a/lib_enc/eval_pit_contr.c b/lib_enc/eval_pit_contr.c index 76bf54b025..5dd3101772 100644 --- a/lib_enc/eval_pit_contr.c +++ b/lib_enc/eval_pit_contr.c @@ -326,26 +326,18 @@ int16_t Pit_exc_contribution_len( /* pitch contribution useless - delete all previously written indices belonging to pitch contribution */ for ( i = TAG_ACELP_SUBFR_LOOP_START; i < TAG_ACELP_SUBFR_LOOP_END; i++ ) { -#ifdef IND_LIST_DYN - delete_indice( hBstr, i ); -#else if ( hBstr->ind_list[i].nb_bits != -1 ) { hBstr->nb_bits_tot -= hBstr->ind_list[i].nb_bits; hBstr->ind_list[i].nb_bits = -1; } -#endif } -#ifdef IND_LIST_DYN - delete_indice( hBstr, IND_ES_PRED ); -#else if ( hBstr->ind_list[IND_ES_PRED].nb_bits != -1 ) { hBstr->nb_bits_tot -= hBstr->ind_list[IND_ES_PRED].nb_bits; hBstr->ind_list[IND_ES_PRED].nb_bits = -1; } -#endif } if ( st->core_brate < CFREQ_BITRATE ) diff --git a/lib_enc/fd_cng_enc.c b/lib_enc/fd_cng_enc.c index e0341e00c3..e43b65d56a 100644 --- a/lib_enc/fd_cng_enc.c +++ b/lib_enc/fd_cng_enc.c @@ -708,18 +708,14 @@ void generate_comfort_noise_enc( /* Perform STFT synthesis */ SynthesisSTFT( fftBuffer, timeDomainOutput, hFdCngCom->olapBufferSynth, hFdCngCom->olapWinSyn, tcx_transition, hFdCngCom, -1, -1 ); -#ifdef PARAM_ISM_DTX_CNG if ( st->hTdCngEnc != NULL ) { -#endif /* update CNG excitation energy for LP_CNG */ /* calculate the residual signal energy */ enr = cng_energy( st->element_mode, st->bwidth, st->hDtxEnc->CNG_mode, st->hTdCngEnc->CNG_att, hFdCngCom->exc_cng, hFdCngCom->frameSize ); st->hTdCngEnc->lp_ener = (float) ( 0.8f * st->hTdCngEnc->lp_ener + 0.2f * pow( 2.0f, enr ) ); -#ifdef PARAM_ISM_DTX_CNG } -#endif /* Overlap-add when previous frame is active */ if ( st->last_core_brate > SID_2k40 && st->codec_mode == MODE2 ) @@ -899,20 +895,8 @@ void stereoFdCngCoherence( else if ( sts[0]->core_brate <= SID_2k40 && sts[1]->core_brate <= SID_2k40 ) { /* case: no VAD for both channels -> INACTIVE FRAME */ - reset_indices_enc( sts[0]->hBstr, -#ifdef IND_LIST_DYN - sts[0]->hBstr->max_num_indices -#else - MAX_NUM_INDICES -#endif - ); - reset_indices_enc( sts[1]->hBstr, -#ifdef IND_LIST_DYN - sts[1]->hBstr->max_num_indices -#else - MAX_NUM_INDICES -#endif - ); + reset_indices_enc( sts[0]->hBstr, MAX_NUM_INDICES ); + reset_indices_enc( sts[1]->hBstr, MAX_NUM_INDICES ); /* synchronize SID sending for variable SID rate */ if ( sts[0]->core_brate != sts[1]->core_brate ) diff --git a/lib_enc/igf_enc.c b/lib_enc/igf_enc.c index 677bc1639e..9c68e3fcc7 100644 --- a/lib_enc/igf_enc.c +++ b/lib_enc/igf_enc.c @@ -1707,41 +1707,6 @@ void IGFEncSetMode( return; } -#ifdef IND_LIST_DYN - -/*-------------------------------------------------------------------* - * pack_bit() - * - * insert a bit into packed octet - *-------------------------------------------------------------------*/ - -static void pack_bit( - const int16_t bit, /* i : bit to be packed */ - uint8_t **pt, /* i/o: pointer to octet array into which bit will be placed */ - uint8_t *omask /* i/o: output mask to indicate where in the octet the bit is to be written */ -) -{ - if ( *omask == 0x80 ) - { - **pt = 0; - } - - if ( bit != 0 ) - { - **pt = **pt | *omask; - } - - *omask >>= 1; - if ( *omask == 0 ) - { - *omask = 0x80; - ( *pt )++; - } - - return; -} - -#endif /*-------------------------------------------------------------------* * IGFEncConcatenateBitstream() @@ -1757,56 +1722,10 @@ void IGFEncConcatenateBitstream( { int16_t i; IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; -#ifdef IND_LIST_DYN - Indice *ind_list; - uint8_t *pFrame; /* byte array with bit packet and byte aligned coded speech data */ - int16_t *pFrame_size; /* number of bits in the binary encoded access unit [bits] */ - int16_t k, nb_bits_written; - int32_t imask; - uint8_t omask; -#endif hPrivateData = &hIGFEnc->igfData; -#ifndef IND_LIST_DYN hBstr->next_ind -= bsBits; -#endif - -#ifdef IND_LIST_DYN - ind_list = &hBstr->ind_list[hBstr->nb_ind_tot - bsBits]; /* here, we assume that each bit has been written as a single indice */ - pFrame = hPrivateData->igfBitstream; - pFrame_size = &hPrivateData->igfBitstreamBits; - nb_bits_written = 0; - - omask = ( 0x80 >> ( *pFrame_size & 0x7 ) ); - pFrame += *pFrame_size >> 3; - - /* bitstream packing (conversion of individual indices into a serial stream) */ - for ( i = 0; i < bsBits; i++ ) - { - if ( ind_list[i].nb_bits > 0 ) - { - /* mask from MSB to LSB */ - imask = 1 << ( ind_list[i].nb_bits - 1 ); - /* write bit by bit */ - for ( k = 0; k < ind_list[i].nb_bits; k++ ) - { - pack_bit( ind_list[i].value & imask, &pFrame, &omask ); - imask >>= 1; - } - nb_bits_written += ind_list[i].nb_bits; - - /* delete the indice */ - ind_list[i].nb_bits = -1; - } - } - - *pFrame_size += nb_bits_written; - - /* update list of indices */ - hBstr->nb_ind_tot -= bsBits; - hBstr->nb_bits_tot -= nb_bits_written; -#else indices_to_serial_generic( &hBstr->ind_list[hBstr->next_ind], bsBits, hPrivateData->igfBitstream, &hPrivateData->igfBitstreamBits ); /* make sure there are no leftovers from the temporary bitstream writing */ @@ -1816,7 +1735,6 @@ void IGFEncConcatenateBitstream( } hBstr->nb_bits_tot -= hIGFEnc->infoTotalBitsPerFrameWritten; -#endif return; } diff --git a/lib_enc/init_enc.c b/lib_enc/init_enc.c index a2a168262d..16b1cf0c29 100644 --- a/lib_enc/init_enc.c +++ b/lib_enc/init_enc.c @@ -54,18 +54,12 @@ *-----------------------------------------------------------------------*/ ivas_error init_encoder( - Encoder_State *st, /* i/o: state structure */ -#ifdef IND_LIST_DYN - ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : encoder configuration handle */ -#endif + Encoder_State *st, /* i/o: state structure */ const int16_t idchan, /* i : channel ID */ const int16_t var_SID_rate_flag, /* i : flag for variable SID update rate */ const int16_t interval_SID, /* i : interval for SID update */ - const int16_t vad_only_flag /* i : flag to indicate front-VAD structure */ -#ifdef PARAM_ISM_DTX_CNG - , - const ISM_MODE ism_mode /* i : ISM mode */ -#endif + const int16_t vad_only_flag, /* i : flag to indicate front-VAD structure */ + const ISM_MODE ism_mode /* i : ISM mode */ ) { int16_t i; @@ -118,19 +112,6 @@ ivas_error init_encoder( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Bitstream structure\n" ) ); } - -#ifdef IND_LIST_DYN - /* set the maximum allowed number of indices in the list */ - st->hBstr->max_num_indices = get_max_num_indices( hEncoderConfig->ivas_format, st->total_brate ); - - /* allocate buffer of indices */ - if ( ( st->hBstr->ind_list = (INDICE_HANDLE) malloc( st->hBstr->max_num_indices * sizeof( Indice ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); - } - - reset_indices_enc( st->hBstr, st->hBstr->max_num_indices ); -#endif } else { @@ -482,10 +463,10 @@ ivas_error init_encoder( * LP-CNG *-----------------------------------------------------------------*/ -#ifdef PARAM_ISM_DTX_CNG - if ( ( ( idchan == 0 && st->Opt_DTX_ON && st->element_mode != IVAS_CPE_MDCT ) || st->element_mode == EVS_MONO ) && !( ism_mode == ISM_MODE_PARAM ) ) +#ifdef DISCRETE_ISM_DTX_CNG + if ( ( ( idchan == 0 && st->Opt_DTX_ON && st->element_mode != IVAS_CPE_MDCT ) || st->element_mode == EVS_MONO ) && !( ism_mode == ISM_MODE_PARAM || ism_mode == ISM_MODE_DISC ) ) #else - if ( ( ( idchan == 0 && st->Opt_DTX_ON && st->element_mode != IVAS_CPE_MDCT ) || st->element_mode == EVS_MONO ) ) + if ( ( ( idchan == 0 && st->Opt_DTX_ON && st->element_mode != IVAS_CPE_MDCT ) || st->element_mode == EVS_MONO ) && !( ism_mode == ISM_MODE_PARAM ) ) #endif { if ( ( st->hTdCngEnc = (TD_CNG_ENC_HANDLE) malloc( sizeof( TD_CNG_ENC_DATA ) ) ) == NULL ) @@ -885,32 +866,22 @@ void LPDmem_enc_init( return; } + + /*-----------------------------------------------------------------------* - * destroy_encoder() + * destroy_cldfb_encoder() * * Free memory which was allocated in init_encoder() *-----------------------------------------------------------------------*/ -void destroy_encoder( +void destroy_cldfb_encoder( Encoder_State *st /* i/o: Encoder static variables structure */ ) { - if ( st->cldfbSynTd != NULL ) - { - deleteCldfb( &st->cldfbSynTd ); - } - - if ( st->cldfbAnaEnc != NULL ) - { - deleteCldfb( &st->cldfbAnaEnc ); - } - - if ( st->hFdCngEnc != NULL ) - { - deleteFdCngEnc( &st->hFdCngEnc ); - } + deleteCldfb( &st->cldfbSynTd ); + deleteCldfb( &st->cldfbAnaEnc ); - /* Close Core */ + deleteFdCngEnc( &st->hFdCngEnc ); return; } diff --git a/lib_enc/ivas_agc_enc.c b/lib_enc/ivas_agc_enc.c index f98c22b97e..83dbdad1e1 100644 --- a/lib_enc/ivas_agc_enc.c +++ b/lib_enc/ivas_agc_enc.c @@ -195,22 +195,24 @@ void ivas_spar_agc_enc_close( { ivas_agc_enc_state_t *hAgc; + if ( hAgcEnc == NULL || *hAgcEnc == NULL ) + { + return; + } + hAgc = *hAgcEnc; - if ( hAgc != NULL ) - { - free( hAgc->agc_com.winFunc ); - hAgc->agc_com.winFunc = NULL; + free( hAgc->agc_com.winFunc ); + hAgc->agc_com.winFunc = NULL; - free( hAgc->gain_state ); - hAgc->gain_state = NULL; + free( hAgc->gain_state ); + hAgc->gain_state = NULL; - free( hAgc->gain_data ); - hAgc->gain_data = NULL; + free( hAgc->gain_data ); + hAgc->gain_data = NULL; - free( hAgc ); - hAgc = NULL; - } + free( *hAgcEnc ); + *hAgcEnc = NULL; return; } diff --git a/lib_enc/ivas_core_enc.c b/lib_enc/ivas_core_enc.c index d4e5e6c686..002e499f4b 100644 --- a/lib_enc/ivas_core_enc.c +++ b/lib_enc/ivas_core_enc.c @@ -103,9 +103,6 @@ ivas_error ivas_core_enc( int16_t last_element_mode, tdm_Pitch_reuse_flag; int32_t element_brate, last_element_brate, input_Fs; ivas_error error; -#ifdef IND_LIST_DYN - int16_t max_num_indices; -#endif push_wmops( "ivas_core_enc" ); @@ -198,22 +195,6 @@ ivas_error ivas_core_enc( { st = sts[n]; -#ifdef IND_LIST_DYN - /*---------------------------------------------------------------------* - * Re-allocate the list of indices, if needed - *---------------------------------------------------------------------*/ - - /* get the maximum allowed number of indices in the list */ - max_num_indices = get_max_num_indices( ivas_format, st->total_brate ); - - /* check, if the maximum number of allowed indices has changed */ - if ( max_num_indices != st->hBstr->max_num_indices ) - { - /* re-allocate the list of indices */ - ind_list_realloc( st->hBstr, max_num_indices ); - } -#endif - /*---------------------------------------------------------------------* * Write signaling info into the bitstream *---------------------------------------------------------------------*/ @@ -282,11 +263,7 @@ ivas_error ivas_core_enc( } else { - stereo_mdct_core_enc( hCPE, -#ifdef IND_LIST_DYN - ivas_format, -#endif - old_inp_16k, old_wsp, pitch_buf ); + stereo_mdct_core_enc( hCPE, old_inp_16k, old_wsp, pitch_buf ); } } else if ( sts[0]->core_brate == SID_2k40 && sts[1]->core_brate == SID_2k40 ) @@ -471,6 +448,8 @@ ivas_error ivas_core_enc( dbgwrite( &st->sp_aud_decision1, sizeof( int16_t ), 1, input_frame, fname( debug_dir, "sp_aud_decision1", n, id, ENC ) ); dbgwrite( &st->sp_aud_decision2, sizeof( int16_t ), 1, input_frame, fname( debug_dir, "sp_aud_decision2", n, id, ENC ) ); + dbgwrite( &st->lp_noise, sizeof( float ), 1, input_frame, fname( debug_dir, "lp_noise", n, id, ENC ) ); + #if ( defined DEBUG_MODE_ACELP ) || ( defined DEBUG_MODE_TCX ) if ( st->coder_type == INACTIVE || st->coder_type == UNVOICED ) { diff --git a/lib_enc/ivas_core_pre_proc_front.c b/lib_enc/ivas_core_pre_proc_front.c index 000fbab33e..85eba72f00 100644 --- a/lib_enc/ivas_core_pre_proc_front.c +++ b/lib_enc/ivas_core_pre_proc_front.c @@ -107,12 +107,7 @@ ivas_error pre_proc_front_ivas( const int16_t front_vad_flag, /* i : front-VAD flag to overwrite VAD decision */ const int16_t force_front_vad, /* i : flag to force VAD decision */ const int16_t front_vad_dtx_flag, /* i : front-VAD DTX flag to overwrite VAD decision*/ -#ifdef LOW_RATE_TRANS_CORE_CODER - const int32_t ivas_total_brate /* i : IVAS total bitrate - for setting the DTX */ -#else - const int32_t ivas_total_brate, /* i : IVAS total bitrate - for setting the DTX */ - const int16_t ivas_format /* i : IVAS format */ -#endif + const int32_t ivas_total_brate /* i : IVAS total bitrate - for setting the DTX */ ) { @@ -491,7 +486,12 @@ ivas_error pre_proc_front_ivas( if ( st->idchan == 0 && element_mode != IVAS_CPE_MDCT ) { - bw_detect( st, st->input, NULL, enerBuffer ); + bw_detect( st, st->input, NULL, enerBuffer +#ifdef FIX_MDCT_BASED_BWD + , + 0 +#endif + ); } if ( element_mode != IVAS_CPE_MDCT ) /* in MDCT stereo, set_bw_stereo() is used instead */ @@ -811,11 +811,7 @@ ivas_error pre_proc_front_ivas( } } /* Switch to ACELP for non-harmonic transient signals */ -#ifdef LOW_RATE_TRANS_CORE_CODER else if ( ( ( element_mode >= IVAS_CPE_DFT && element_brate <= IVAS_16k4 ) || ( element_mode == IVAS_SCE && element_brate < SCE_SMC_THR ) ) && ( loc_harm[0] != 1 ) && smc_dec == MUSIC ) -#else - else if ( ( ( ivas_format == STEREO_FORMAT && element_brate <= IVAS_16k4 ) || ( ivas_format == ISM_FORMAT && element_brate < SCE_SMC_THR ) ) && ( loc_harm[0] != 1 ) && smc_dec == MUSIC ) -#endif { if ( element_mode == IVAS_SCE ) { diff --git a/lib_enc/ivas_corecoder_enc_reconfig.c b/lib_enc/ivas_corecoder_enc_reconfig.c index 18d7f06e0e..e9d6968f1b 100644 --- a/lib_enc/ivas_corecoder_enc_reconfig.c +++ b/lib_enc/ivas_corecoder_enc_reconfig.c @@ -41,6 +41,7 @@ #endif #include "wmc_auto.h" + /*-------------------------------------------------------------------* * ivas_corecoder_enc_reconfig() * @@ -60,23 +61,9 @@ ivas_error ivas_corecoder_enc_reconfig( int16_t n, sce_id, cpe_id; int16_t len_inp_memory, n_CoreCoder_existing, nSCE_existing, nCPE_existing; float input_buff[MCT_MAX_BLOCKS][L_FRAME48k + NS2SA( 48000, IVAS_FB_ENC_DELAY_NS )]; - BSTR_ENC_HANDLE hBstr; -#ifndef IND_LIST_DYN - Indice *ind_list; -#endif -#ifndef IND_LIST_DYN - Indice *ind_list_metadata; - BSTR_ENC_HANDLE hMetaData; -#endif -#ifdef IND_LIST_DYN - int16_t i, nb_bits, max_num_indices_metadata; - Indice temp_ind_list[MAX_NUM_IND_TEMP_LIST]; -#endif - int16_t nb_bits_tot; -#ifndef IND_LIST_DYN - int16_t last_ind; - int16_t next_ind; -#endif + BSTR_ENC_HANDLE hBstr, hMetaData; + Indice *ind_list, *ind_list_metadata; + int16_t nb_bits_tot, next_ind, last_ind; ENCODER_CONFIG_HANDLE hEncoderConfig; ivas_error error; @@ -104,20 +91,6 @@ ivas_error ivas_corecoder_enc_reconfig( copy_encoder_config( st_ivas, st_ivas->hSCE[sce_id]->hCoreCoder[0], 0 ); st_ivas->hSCE[sce_id]->element_brate = brate_SCE; st_ivas->hSCE[sce_id]->hCoreCoder[0]->total_brate = st_ivas->hSCE[sce_id]->element_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ -#ifdef IND_LIST_DYN - if ( st_ivas->hSCE[sce_id]->hMetaData != NULL ) - { - /* get the maximum allowed number of indices in the list */ - max_num_indices_metadata = get_max_num_indices_metadata( hEncoderConfig->ivas_format, hEncoderConfig->ivas_total_brate ); - - /* check, if the maximum number of allowed indices has changed */ - if ( max_num_indices_metadata != st_ivas->hSCE[sce_id]->hMetaData->max_num_indices ) - { - /* re-allocate the list of metadata indices */ - ind_list_realloc( st_ivas->hSCE[sce_id]->hMetaData, max_num_indices_metadata ); - } - } -#endif } for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) @@ -131,20 +104,6 @@ ivas_error ivas_corecoder_enc_reconfig( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->total_brate = st_ivas->hCPE[cpe_id]->element_brate / ( st_ivas->nCPE > 1 ? 1 : CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ } -#ifdef IND_LIST_DYN - if ( st_ivas->hCPE[cpe_id]->hMetaData != NULL ) - { - /* get the maximum allowed number of indices in the list */ - max_num_indices_metadata = get_max_num_indices_metadata( hEncoderConfig->ivas_format, hEncoderConfig->ivas_total_brate ); - - /* check, if the maximum number of allowed indices has changed */ - if ( max_num_indices_metadata != st_ivas->hCPE[cpe_id]->hMetaData->max_num_indices ) - { - /* re-allocate the list of metadata indices */ - ind_list_realloc( st_ivas->hCPE[cpe_id]->hMetaData, max_num_indices_metadata ); - } - } -#endif } if ( st_ivas->nCPE > 1 ) @@ -174,29 +133,21 @@ ivas_error ivas_corecoder_enc_reconfig( } /* something in transport changes */ -#ifndef IND_LIST_DYN ind_list = NULL; ind_list_metadata = NULL; -#endif hBstr = NULL; -#ifndef IND_LIST_DYN hMetaData = NULL; -#endif /* get the index list pointers */ if ( nSCE_old ) { hBstr = st_ivas->hSCE[0]->hCoreCoder[0]->hBstr; -#ifndef IND_LIST_DYN hMetaData = st_ivas->hSCE[0]->hMetaData; -#endif } else if ( nCPE_old ) { hBstr = st_ivas->hCPE[0]->hCoreCoder[0]->hBstr; -#ifndef IND_LIST_DYN hMetaData = st_ivas->hCPE[nCPE_old - 1]->hMetaData; -#endif } #ifdef DEBUGGING else @@ -206,41 +157,11 @@ ivas_error ivas_corecoder_enc_reconfig( #endif /* save bitstream information */ - nb_bits_tot = hBstr->nb_bits_tot; -#ifndef IND_LIST_DYN ind_list = hBstr->ind_list; /* pointer to the beginning of the global list */ + nb_bits_tot = hBstr->nb_bits_tot; next_ind = hBstr->next_ind; last_ind = hBstr->last_ind; -#endif -#ifdef IND_LIST_DYN - i = 0; - nb_bits = 0; - while ( nb_bits < nb_bits_tot && i < MAX_NUM_IND_TEMP_LIST ) - { - if ( hBstr->ind_list[i].nb_bits > 0 ) - { - temp_ind_list[i].id = hBstr->ind_list[i].id; - temp_ind_list[i].value = hBstr->ind_list[i].value; - temp_ind_list[i].nb_bits = hBstr->ind_list[i].nb_bits; - } - - nb_bits += temp_ind_list[i].nb_bits; - i++; - } - - for ( ; i < MAX_NUM_IND_TEMP_LIST; i++ ) - { - /* reset nb_bits of all other indices to -1 */ - temp_ind_list[i].nb_bits = -1; - } - -#ifdef DEBUGGING - assert( ( nb_bits == nb_bits_tot ) && "Error saving bitstream information during core-coder reconfiguration!\n" ); -#endif -#endif -#ifndef IND_LIST_DYN ind_list_metadata = hMetaData->ind_list; /* pointer to the beginning of the global list */ -#endif if ( hEncoderConfig->ivas_format == MC_FORMAT && last_mc_mode == MC_MODE_MCMASA && st_ivas->mc_mode == MC_MODE_MCMASA ) { @@ -300,8 +221,7 @@ ivas_error ivas_corecoder_enc_reconfig( if ( st_ivas->nCPE <= 1 && st_ivas->hMCT != NULL ) { - ivas_mct_enc_close( st_ivas->hMCT ); - st_ivas->hMCT = NULL; + ivas_mct_enc_close( &( st_ivas->hMCT ) ); } /* special case, if we have MCT now and had a single CPE before, remove the MDCT Stereo handles */ @@ -336,56 +256,23 @@ ivas_error ivas_corecoder_enc_reconfig( mvr2r( input_buff[sce_id], st_ivas->hSCE[sce_id]->hCoreCoder[0]->input_buff, len_inp_memory ); } -#ifndef IND_LIST_DYN - /* allocate buffer of indices */ + /* prepare bitstream buffers */ st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list + sce_id * MAX_NUM_INDICES; -#endif /* only reset indices if it is not the first index list, this already contains the IVAS format bits */ if ( sce_id > 0 ) { - reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, -#ifdef IND_LIST_DYN - st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->max_num_indices -#else - MAX_NUM_INDICES -#endif - ); + reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); } else { - st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->nb_bits_tot = nb_bits_tot; -#ifndef IND_LIST_DYN st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->last_ind = last_ind; + st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->nb_bits_tot = nb_bits_tot; st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->next_ind = next_ind; -#endif -#ifdef IND_LIST_DYN - /* re-fill the buffer of indices with already written indices */ - i = 0; - nb_bits = 0; - while ( nb_bits < nb_bits_tot && i < MAX_NUM_IND_TEMP_LIST ) - { - if ( temp_ind_list[i].nb_bits > 0 ) - { - st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list[i].id = temp_ind_list[i].id; - st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list[i].value = temp_ind_list[i].value; - st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; - } - - nb_bits += temp_ind_list[i].nb_bits; - i++; - } - st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->nb_ind_tot = i; -#ifdef DEBUGGING - assert( ( nb_bits == nb_bits_tot ) && "Error restoring bitstream information during core-coder reconfiguration!\n" ); -#endif -#endif } -#ifndef IND_LIST_DYN st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata + sce_id * MAX_BITS_METADATA; reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA ); -#endif } } @@ -397,52 +284,22 @@ ivas_error ivas_corecoder_enc_reconfig( { st_ivas->hCPE[cpe_id]->element_brate = brate_CPE; - /* allocate buffer of indices */ + /* prepare bitstream buffers */ for ( n = 0; n < CPE_CHANNELS; n++ ) { copy_encoder_config( st_ivas, st_ivas->hCPE[cpe_id]->hCoreCoder[n], 0 ); st_ivas->hCPE[cpe_id]->hCoreCoder[n]->total_brate = st_ivas->hCPE[cpe_id]->element_brate / ( st_ivas->nCPE > 1 ? 1 : CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ -#ifndef IND_LIST_DYN st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list + ( cpe_id * CPE_CHANNELS + n + st_ivas->nSCE ) * MAX_NUM_INDICES; -#endif if ( cpe_id * CPE_CHANNELS + n > 0 || ( st_ivas->mc_mode == MC_MODE_MCMASA && st_ivas->nSCE > 0 ) ) { - reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, -#ifdef IND_LIST_DYN - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->max_num_indices -#else - MAX_NUM_INDICES -#endif - ); + reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); } else { - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_bits_tot = nb_bits_tot; -#ifndef IND_LIST_DYN st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->last_ind = last_ind; + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_bits_tot = nb_bits_tot; st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->next_ind = next_ind; -#endif -#ifdef IND_LIST_DYN - i = 0; - nb_bits = 0; - while ( nb_bits < nb_bits_tot && i < MAX_NUM_IND_TEMP_LIST ) - { - if ( temp_ind_list[i].nb_bits > 0 ) - { - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list[i].id = temp_ind_list[i].id; - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list[i].value = temp_ind_list[i].value; - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; - } - - nb_bits += temp_ind_list[i].nb_bits; - i++; - } - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_ind_tot = i; -#ifdef DEBUGGING - assert( ( nb_bits == nb_bits_tot ) && "Error restoring bitstream information during core-coder reconfiguration!\n" ); -#endif -#endif } } } @@ -468,49 +325,19 @@ ivas_error ivas_corecoder_enc_reconfig( } } + /* prepare bitstream buffers */ for ( n = 0; n < CPE_CHANNELS; n++ ) { -#ifndef IND_LIST_DYN st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list + ( cpe_id * CPE_CHANNELS + n + st_ivas->nSCE ) * MAX_NUM_INDICES; -#endif - /* only reset indices if it is not the first index list, this already contains the IVAS format bits */ if ( cpe_id * CPE_CHANNELS + n > 0 || ( st_ivas->mc_mode == MC_MODE_MCMASA && st_ivas->nSCE > 0 ) ) { - reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, -#ifdef IND_LIST_DYN - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->max_num_indices -#else - MAX_NUM_INDICES -#endif - ); + reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); } else { - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_bits_tot = nb_bits_tot; -#ifndef IND_LIST_DYN st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->last_ind = last_ind; + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_bits_tot = nb_bits_tot; st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->next_ind = next_ind; -#endif -#ifdef IND_LIST_DYN - i = 0; - nb_bits = 0; - while ( nb_bits < nb_bits_tot && i < MAX_NUM_IND_TEMP_LIST ) - { - if ( temp_ind_list[i].nb_bits > 0 ) - { - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list[i].id = temp_ind_list[i].id; - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list[i].value = temp_ind_list[i].value; - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; - } - - nb_bits += temp_ind_list[i].nb_bits; - i++; - } - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_ind_tot = i; -#ifdef DEBUGGING - assert( ( nb_bits == nb_bits_tot ) && "Error restoring bitstream information during core-coder reconfiguration!\n" ); -#endif -#endif } if ( hEncoderConfig->Opt_DTX_ON ) @@ -545,6 +372,7 @@ ivas_error ivas_corecoder_enc_reconfig( for ( n = 0; n < CPE_CHANNELS; n++ ) { st_ivas->hCPE[0]->hCoreCoder[n]->total_brate = st_ivas->hCPE[0]->element_brate; + st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal = (int16_t) ( st_ivas->hCPE[0]->element_brate / FRAMES_PER_SEC ); st_ivas->hCPE[0]->hCoreCoder[n]->igf = getIgfPresent( st_ivas->hCPE[0]->hCoreCoder[n]->element_mode, st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal * FRAMES_PER_SEC, @@ -576,7 +404,7 @@ ivas_error ivas_corecoder_enc_reconfig( } } - /* alllocate buffer for metadata indices */ + /* metadata handling for CPEs */ if ( st_ivas->nCPE > 0 ) { if ( st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData == NULL ) @@ -585,36 +413,15 @@ ivas_error ivas_corecoder_enc_reconfig( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MetaData structure\n" ) ); } - -#ifdef IND_LIST_DYN - /* set the maximum allowed number of metadata indices in the list */ - st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->max_num_indices = get_max_num_indices_metadata( hEncoderConfig->ivas_total_brate, hEncoderConfig->ivas_format ); - - /* allocate buffer of metadata indices */ - if ( ( st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->ind_list = (INDICE_HANDLE) malloc( st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->max_num_indices * sizeof( Indice ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); - } -#endif } -#ifdef IND_LIST_DYN - reset_indices_enc( st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData, st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->max_num_indices ); -#else st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->ind_list = ind_list_metadata + st_ivas->nSCE * MAX_NUM_INDICES; reset_indices_enc( st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData, MAX_BITS_METADATA ); -#endif for ( cpe_id = 0; cpe_id < st_ivas->nCPE - 1; cpe_id++ ) { if ( st_ivas->hCPE[cpe_id]->hMetaData != NULL ) { -#ifdef IND_LIST_DYN - if ( st_ivas->hCPE[cpe_id]->hMetaData->ind_list != NULL ) - { - free( st_ivas->hCPE[cpe_id]->hMetaData->ind_list ); - } -#endif free( st_ivas->hCPE[cpe_id]->hMetaData ); st_ivas->hCPE[cpe_id]->hMetaData = NULL; } @@ -633,6 +440,7 @@ ivas_error ivas_corecoder_enc_reconfig( for ( n = 0; n < CPE_CHANNELS; n++ ) { st_ivas->hCPE[0]->hCoreCoder[n]->total_brate = st_ivas->hCPE[0]->element_brate; + st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal = (int16_t) ( st_ivas->hCPE[0]->element_brate / FRAMES_PER_SEC ); st_ivas->hCPE[0]->hCoreCoder[n]->igf = getIgfPresent( st_ivas->hCPE[0]->hCoreCoder[n]->element_mode, st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal * FRAMES_PER_SEC, diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index 054804372b..f9b787ac56 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -429,19 +429,11 @@ ivas_error ivas_cpe_enc( for ( n = 0; n < n_CoreChannels; n++ ) { -#ifdef LOW_RATE_TRANS_CORE_CODER error = pre_proc_front_ivas( NULL, hCPE, hCPE->element_brate, nb_bits_metadata, input_frame, n, old_inp_12k8[n], old_inp_16k[n], &ener[n], &relE[n], A[n], Aw[n], epsP[n], lsp_new[n], lsp_mid[n], &vad_hover_flag[n], &attack_flag[n], realBuffer[n], imagBuffer[n], old_wsp[n], pitch_fr[n], voicing_fr[n], &loc_harm[n], &cor_map_sum[n], &vad_flag_dtx[n], enerBuffer[n], fft_buff[n], A[0], lsp_new[0], currFlatness[n], tdm_ratio_idx, fr_bands, Etot_LR, lf_E, localVAD_HE_SAD, band_energies_LR, 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_flag : 0, 0, 0, ivas_total_brate ); -#else - error = pre_proc_front_ivas( NULL, hCPE, hCPE->element_brate, nb_bits_metadata, input_frame, n, old_inp_12k8[n], old_inp_16k[n], - &ener[n], &relE[n], A[n], Aw[n], epsP[n], lsp_new[n], lsp_mid[n], - &vad_hover_flag[n], &attack_flag[n], realBuffer[n], imagBuffer[n], old_wsp[n], pitch_fr[n], voicing_fr[n], &loc_harm[n], &cor_map_sum[n], &vad_flag_dtx[n], enerBuffer[n], - fft_buff[n], A[0], lsp_new[0], currFlatness[n], tdm_ratio_idx, fr_bands, Etot_LR, lf_E, localVAD_HE_SAD, band_energies_LR, 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_flag : 0, 0, 0, - ivas_total_brate, st_ivas->hEncoderConfig->ivas_format ); -#endif if ( error != IVAS_ERR_OK ) { return error; @@ -819,19 +811,6 @@ ivas_error create_cpe_enc( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MetaData structure\n" ) ); } - -#ifdef IND_LIST_DYN - /* set the maximum allowed number of indices in the list */ - hCPE->hMetaData->max_num_indices = get_max_num_indices_metadata( hEncoderConfig->ivas_format, hEncoderConfig->ivas_total_brate ); - - /* allocate buffer of metadata indices */ - if ( ( hCPE->hMetaData->ind_list = (INDICE_HANDLE) malloc( hCPE->hMetaData->max_num_indices * sizeof( Indice ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); - } - - reset_indices_enc( hCPE->hMetaData, hCPE->hMetaData->max_num_indices ); -#endif } /*-----------------------------------------------------------------* @@ -853,19 +832,7 @@ ivas_error create_cpe_enc( st->mct_chan_mode = MCT_CHAN_MODE_LFE; } -#ifdef PARAM_ISM_DTX_CNG - if ( ( error = init_encoder( st, -#ifdef IND_LIST_DYN - hEncoderConfig, -#endif - n, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 0, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) -#else - if ( ( error = init_encoder( st, -#ifdef IND_LIST_DYN - hEncoderConfig, -#endif - n, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 0 ) ) != IVAS_ERR_OK ) -#endif + if ( ( error = init_encoder( st, n, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 0, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) { return error; } @@ -1037,12 +1004,6 @@ void destroy_cpe_enc( if ( hCPE->hMetaData != NULL ) { -#ifdef IND_LIST_DYN - if ( hCPE->hMetaData->ind_list != NULL ) - { - free( hCPE->hMetaData->ind_list ); - } -#endif free( hCPE->hMetaData ); hCPE->hMetaData = NULL; } diff --git a/lib_enc/ivas_decision_matrix_enc.c b/lib_enc/ivas_decision_matrix_enc.c index 7b4685251f..b894932958 100644 --- a/lib_enc/ivas_decision_matrix_enc.c +++ b/lib_enc/ivas_decision_matrix_enc.c @@ -114,7 +114,7 @@ void ivas_decision_matrix_enc( if ( st->element_mode == IVAS_SCE && st->low_rate_mode ) { - /* ISm low-rate mode */ + /* ISM low-rate mode */ st->core = ACELP_CORE; st->coder_type = INACTIVE; } @@ -391,7 +391,7 @@ void ivas_signaling_enc( } else if ( st->element_mode == IVAS_SCE && st->low_rate_mode ) { - /* ISm Low-rate mode -> do nothing -> always WB, ACELP core, IC coder_type */ + /* ISM Low-rate mode -> do nothing -> always WB, ACELP core, IC coder_type */ } else if ( ( st->element_mode == IVAS_CPE_MDCT && st->idchan == 1 ) || st->core_brate <= SID_2k40 ) { diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index a143ff37d2..43bc94fb04 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -104,11 +104,7 @@ ivas_error ivas_dirac_enc_open( return error; } /* Allocate and initialize FB mixer handle */ -#ifdef SBA_BR_SWITCHING_CLEAN_UP if ( ( error = ivas_FB_mixer_open( &( hDirAC->hFbMixer ), input_Fs, fb_cfg, 0 ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_FB_mixer_open( &( hDirAC->hFbMixer ), input_Fs, fb_cfg ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -249,23 +245,27 @@ ivas_error ivas_dirac_enc_reconfigure( /*------------------------------------------------------------------------- * ivas_dirac_enc_close() * - * Close DirAC + * Close DirAC encoder handle *------------------------------------------------------------------------*/ void ivas_dirac_enc_close( - DIRAC_ENC_HANDLE hDirAC, /* i/o: encoder DirAC handle */ - const int32_t input_Fs /* i : input sampling rate */ + DIRAC_ENC_HANDLE *hDirAC_out, /* i/o: encoder DirAC handle */ + const int32_t input_Fs /* i : input sampling rate */ ) { int16_t i, j; + DIRAC_ENC_HANDLE hDirAC; + + if ( hDirAC_out == NULL || *hDirAC_out == NULL ) + { + return; + } + + hDirAC = *hDirAC_out; if ( hDirAC->hFbMixer != NULL ) { -#ifdef SBA_BR_SWITCHING_CLEAN_UP ivas_FB_mixer_close( &hDirAC->hFbMixer, input_Fs, 0 ); -#else - ivas_FB_mixer_close( &hDirAC->hFbMixer, input_Fs ); -#endif } for ( i = 0; i < DIRAC_MAX_ANA_CHANS; i++ ) @@ -311,7 +311,8 @@ void ivas_dirac_enc_close( hDirAC->hConfig = NULL; } - free( hDirAC ); + free( *hDirAC_out ); + *hDirAC_out = NULL; return; } diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index 0500a8e775..1e4ba82207 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -132,14 +132,11 @@ ivas_error ivas_enc( /* bypass EVS coding in float precision, emulating EVS encoder/decoder delay */ for ( i = 0; i < n; i++ ) { -#ifdef SBA_HPF_TUNING_ENC if ( ( ivas_format == SBA_FORMAT ) && ( st_ivas->sba_mode == SBA_MODE_SPAR ) ) { hp20( data_f[HOA_keep_ind[i]], input_frame, st_ivas->mem_hp20_in[i], input_Fs ); } - else -#endif - if ( !( ivas_format == MC_FORMAT && i == LFE_CHANNEL ) ) /*TODO: is the HPF needed for LFE channel? */ + else if ( !( ivas_format == MC_FORMAT && i == LFE_CHANNEL ) ) /*TODO: is the HPF needed for LFE channel? */ { hp20( data_f[i], input_frame, st_ivas->mem_hp20_in[i], input_Fs ); } diff --git a/lib_enc/ivas_enc_cov_handler.c b/lib_enc/ivas_enc_cov_handler.c index b70c05e962..e117cfc5a5 100644 --- a/lib_enc/ivas_enc_cov_handler.c +++ b/lib_enc/ivas_enc_cov_handler.c @@ -117,17 +117,19 @@ void ivas_spar_covar_enc_close( { ivas_enc_cov_handler_state_t *hCovState; + if ( hCovEnc == NULL || *hCovEnc == NULL ) + { + return; + } + hCovState = *hCovEnc; - if ( hCovState != NULL ) - { - ivas_spar_covar_smooth_enc_close( &hCovState->pCov_state, nchan_inp ); + ivas_spar_covar_smooth_enc_close( &hCovState->pCov_state, nchan_inp ); - ivas_spar_covar_smooth_enc_close( &hCovState->pCov_dtx_state, nchan_inp ); + ivas_spar_covar_smooth_enc_close( &hCovState->pCov_dtx_state, nchan_inp ); - free( hCovState ); - hCovState = NULL; - } + free( *hCovEnc ); + *hCovEnc = NULL; return; } @@ -150,12 +152,7 @@ void ivas_enc_cov_handler_process( const int16_t end_band, const int16_t num_ch, const int16_t dtx_vad, -#ifdef SMOOTH_WITH_TRANS_DET - const int16_t transient_det[2] -#else - const int16_t transient_det -#endif -) + const int16_t transient_det[2] ) { int16_t i, j; int16_t dtx_cov_flag; @@ -218,11 +215,7 @@ void ivas_enc_cov_handler_process( } else { -#ifdef SMOOTH_WITH_TRANS_DET if ( ( transient_det[0] == 0 ) && ( transient_det[1] == 0 ) ) -#else - if ( transient_det == 0 ) -#endif { ivas_cov_smooth_process( hCovEnc->pCov_dtx_state, cov_dtx_real, pFb, start_band, end_band, num_ch, transient_det ); hCovEnc->prior_dtx_present = 1; diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index 9af3c7e8a8..dfaa321605 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -184,11 +184,7 @@ int16_t getNumChanAnalysis( n = st_ivas->nSCE + CPE_CHANNELS * st_ivas->nCPE; if ( st_ivas->hEncoderConfig->ivas_format == SBA_FORMAT ) { -#ifdef SBA_HPF_TUNING_ENC n = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order ); -#else - n = DIRAC_MAX_ANA_CHANS; -#endif } else if ( st_ivas->hEncoderConfig->ivas_format == MC_FORMAT && ( st_ivas->mc_mode == MC_MODE_PARAMMC || st_ivas->mc_mode == MC_MODE_MCMASA ) ) { @@ -270,16 +266,14 @@ void ivas_initialize_handles_enc( st_ivas->mem_hp20_in = NULL; - /* ISm metadata handles */ + /* ISM metadata handles */ for ( i = 0; i < MAX_NUM_OBJECTS; i++ ) { st_ivas->hIsmMetaData[i] = NULL; } -#ifdef PARAM_ISM_DTX_CNG /* ISM DTX handle */ st_ivas->hISMDTX = NULL; -#endif /* Q Metadata handle */ st_ivas->hQMetaData = NULL; @@ -319,15 +313,9 @@ void ivas_initialize_handles_enc( *-------------------------------------------------------------------*/ ivas_error ivas_init_encoder( - Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ -#ifndef IND_LIST_DYN - , - Indice ind_list[][MAX_NUM_INDICES] /* o : bitstream indices */ -#endif -#ifndef IND_LIST_DYN - , + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + Indice ind_list[][MAX_NUM_INDICES], /* o : bitstream indices */ Indice ind_list_metadata[][MAX_BITS_METADATA] /* o : bitstream indices metadata */ -#endif ) { int16_t i, n; @@ -373,10 +361,9 @@ ivas_error ivas_init_encoder( return error; } -#ifndef IND_LIST_DYN + /* prepare bitstream buffers */ st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); -#endif /* prepare stereo downmix for EVS */ if ( hEncoderConfig->stereo_dmx_evs == 1 ) @@ -399,20 +386,16 @@ ivas_error ivas_init_encoder( return error; } -#ifndef IND_LIST_DYN - /* allocate buffer of indices */ + /* prepare bitstream buffers */ for ( n = 0; n < CPE_CHANNELS; n++ ) { st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[n]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); } -#endif -#ifndef IND_LIST_DYN /* MetaData for DFT stereo */ st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[0]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA ); -#endif } else if ( ivas_format == ISM_FORMAT ) { @@ -432,16 +415,12 @@ ivas_error ivas_init_encoder( return error; } - /* MetaData for ISMs */ -#ifndef IND_LIST_DYN + /* prepare bitstream buffers */ st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); -#endif -#ifndef IND_LIST_DYN st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA ); -#endif } if ( st_ivas->ism_mode == ISM_MODE_PARAM ) @@ -452,15 +431,17 @@ ivas_error ivas_init_encoder( } } -#ifdef PARAM_ISM_DTX_CNG +#ifdef DISCRETE_ISM_DTX_CNG + if ( st_ivas->hEncoderConfig->Opt_DTX_ON ) +#else if ( st_ivas->hEncoderConfig->Opt_DTX_ON && st_ivas->ism_mode == ISM_MODE_PARAM ) +#endif { if ( ( error = ivas_ism_dtx_open( st_ivas ) ) != IVAS_ERR_OK ) { return error; } } -#endif } else if ( ivas_format == SBA_FORMAT || ivas_format == MASA_FORMAT ) { @@ -477,11 +458,7 @@ ivas_error ivas_init_encoder( if ( st_ivas->sba_mode == SBA_MODE_SPAR ) { -#ifdef SBA_BR_SWITCHING_CLEAN_UP if ( ( error = ivas_spar_enc_open( st_ivas, 0 ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_spar_enc_open( st_ivas ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -508,16 +485,12 @@ ivas_error ivas_init_encoder( return error; } - /* MetaData for SBA */ -#ifndef IND_LIST_DYN + /* prepare bitstream buffers */ st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); -#endif -#ifndef IND_LIST_DYN st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA ); -#endif if ( st_ivas->sba_mode == SBA_MODE_SPAR && st_ivas->hEncoderConfig->Opt_DTX_ON ) { @@ -532,12 +505,11 @@ ivas_error ivas_init_encoder( return error; } + /* prepare bitstream buffers */ for ( n = 0; n < CPE_CHANNELS; n++ ) { -#ifndef IND_LIST_DYN st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[cpe_id * CPE_CHANNELS + n]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); -#endif if ( hEncoderConfig->Opt_DTX_ON ) { @@ -545,14 +517,12 @@ ivas_error ivas_init_encoder( } } -#ifndef IND_LIST_DYN /* Metadata only initialized for the last CPE index */ if ( cpe_id == st_ivas->nCPE - 1 ) { st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[st_ivas->nSCE]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA ); } -#endif } if ( st_ivas->nCPE > 1 ) @@ -581,8 +551,6 @@ ivas_error ivas_init_encoder( return error; } -#ifndef IND_LIST_DYN - /* allocate buffer of indices */ for ( n = 0; n < CPE_CHANNELS; n++ ) { /* we need the correct bitstream also for the LFE channel since it might become a proper coded channel when @@ -590,16 +558,13 @@ ivas_error ivas_init_encoder( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[cpe_id * CPE_CHANNELS + n]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); } -#endif -#ifndef IND_LIST_DYN /* Metadata only initialized for the last CPE index*/ if ( cpe_id == st_ivas->nCPE - 1 ) { st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[st_ivas->nSCE]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA ); } -#endif } if ( ( error = create_mct_enc( st_ivas ) ) != IVAS_ERR_OK ) @@ -628,23 +593,19 @@ ivas_error ivas_init_encoder( return error; } -#ifndef IND_LIST_DYN - /* allocate buffer of indices */ + /* prepare bitstream buffers */ for ( n = 0; n < CPE_CHANNELS; n++ ) { st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[cpe_id * CPE_CHANNELS + n]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); } -#endif -#ifndef IND_LIST_DYN /* Metadata only initialized for the last CPE index*/ if ( cpe_id == st_ivas->nCPE - 1 ) { st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[st_ivas->nSCE]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA ); } -#endif } if ( st_ivas->nCPE > 1 ) @@ -685,15 +646,12 @@ ivas_error ivas_init_encoder( return error; } -#ifndef IND_LIST_DYN - /* allocate buffer of indices */ + /* prepare bitstream buffers */ st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); -#endif -#ifndef IND_LIST_DYN + st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA ); -#endif } for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) @@ -705,23 +663,19 @@ ivas_error ivas_init_encoder( return error; } -#ifndef IND_LIST_DYN - /* allocate buffer of indices */ + /* prepare bitstream buffers */ for ( n = 0; n < CPE_CHANNELS; n++ ) { st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[cpe_id * CPE_CHANNELS + n + st_ivas->nSCE]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); } -#endif -#ifndef IND_LIST_DYN /* Metadata only initialized for the last CPE index*/ if ( cpe_id == st_ivas->nCPE - 1 ) { st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[st_ivas->nSCE]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA ); } -#endif } } } @@ -775,7 +729,7 @@ void destroy_core_enc( ENC_CORE_HANDLE hCoreCoder /* i/o: core encoder structure */ ) { - destroy_encoder( hCoreCoder ); + destroy_cldfb_encoder( hCoreCoder ); if ( hCoreCoder->hSignalBuf != NULL ) { @@ -785,14 +739,6 @@ void destroy_core_enc( if ( hCoreCoder->hBstr != NULL ) { -#ifdef IND_LIST_DYN - /* deallocate buffer of indices */ - if ( hCoreCoder->hBstr->ind_list != NULL ) - { - free( hCoreCoder->hBstr->ind_list ); - } -#endif - free( hCoreCoder->hBstr ); hCoreCoder->hBstr = NULL; } @@ -974,97 +920,52 @@ void ivas_destroy_enc( } /* ISM metadata handles */ - for ( n = 0; n < MAX_NUM_OBJECTS; n++ ) - { - if ( st_ivas->hIsmMetaData[n] != NULL ) - { - free( st_ivas->hIsmMetaData[n] ); - st_ivas->hIsmMetaData[n] = NULL; - } - } + ivas_ism_metadata_close( st_ivas->hIsmMetaData ); -#ifdef PARAM_ISM_DTX_CNG /* ISM DTX Handle */ if ( st_ivas->hISMDTX != NULL ) { free( st_ivas->hISMDTX ); st_ivas->hISMDTX = NULL; } -#endif /* Q Metadata handle */ ivas_qmetadata_close( &( st_ivas->hQMetaData ) ); /* DirAC handle */ - if ( st_ivas->hDirAC != NULL ) + if ( ivas_format == ISM_FORMAT ) { - if ( ivas_format == ISM_FORMAT ) - { - ivas_param_ism_enc_close( st_ivas->hDirAC, st_ivas->hEncoderConfig->input_Fs ); - } - else - { - ivas_dirac_enc_close( st_ivas->hDirAC, st_ivas->hEncoderConfig->input_Fs ); - } - st_ivas->hDirAC = NULL; + ivas_param_ism_enc_close( &( st_ivas->hDirAC ), st_ivas->hEncoderConfig->input_Fs ); } - - /* SPAR handle */ - if ( st_ivas->hSpar != NULL ) + else { -#ifdef SBA_BR_SWITCHING_CLEAN_UP - ivas_spar_enc_close( st_ivas->hSpar, st_ivas->hEncoderConfig->input_Fs, nchan_inp, 0 ); -#else - ivas_spar_enc_close( st_ivas->hSpar, st_ivas->hEncoderConfig->input_Fs, nchan_inp ); -#endif - st_ivas->hSpar = NULL; + ivas_dirac_enc_close( &( st_ivas->hDirAC ), st_ivas->hEncoderConfig->input_Fs ); } + /* SPAR handle */ + ivas_spar_enc_close( &( st_ivas->hSpar ), st_ivas->hEncoderConfig->input_Fs, nchan_inp, 0 ); + /* MASA handle */ - if ( st_ivas->hMasa != NULL ) - { #ifdef FIX_350_MASA_DELAY_COMP - ivas_masa_enc_close( st_ivas->hMasa ); + ivas_masa_enc_close( &( st_ivas->hMasa ) ); #else - ivas_masa_enc_close( st_ivas->hMasa, st_ivas->nchan_transport, ivas_format ); + ivas_masa_enc_close( &( st_ivas->hMasa ), st_ivas->nchan_transport, ivas_format ); #endif - st_ivas->hMasa = NULL; - } /* MCT handle */ - if ( st_ivas->hMCT != NULL ) - { - ivas_mct_enc_close( st_ivas->hMCT ); - st_ivas->hMCT = NULL; - } + ivas_mct_enc_close( &( st_ivas->hMCT ) ); + + /* LFE handle */ + ivas_lfe_enc_close( &( st_ivas->hLFE ) ); /* Parametric MC handle */ - if ( st_ivas->hParamMC != NULL ) - { - ivas_param_mc_enc_close( st_ivas->hParamMC, st_ivas->hEncoderConfig->input_Fs ); - st_ivas->hParamMC = NULL; - } + ivas_param_mc_enc_close( &( st_ivas->hParamMC ), st_ivas->hEncoderConfig->input_Fs ); /* Multi-channel MASA handle */ - if ( st_ivas->hMcMasa != NULL ) - { - ivas_mcmasa_enc_close( st_ivas->hMcMasa, st_ivas->hEncoderConfig->input_Fs ); - st_ivas->hMcMasa = NULL; - } + ivas_mcmasa_enc_close( &( st_ivas->hMcMasa ), st_ivas->hEncoderConfig->input_Fs ); /* Stereo downmix for EVS encoder handle */ - if ( st_ivas->hStereoDmxEVS != NULL ) - { - stereo_dmx_evs_close_encoder( st_ivas->hStereoDmxEVS ); - st_ivas->hStereoDmxEVS = NULL; - } - - /* LFE handle */ - if ( st_ivas->hLFE != NULL ) - { - ivas_lfe_enc_close( st_ivas->hLFE ); - st_ivas->hLFE = NULL; - } + stereo_dmx_evs_close_encoder( &( st_ivas->hStereoDmxEVS ) ); /* Encoder configuration handle */ if ( st_ivas->hEncoderConfig != NULL ) diff --git a/lib_enc/ivas_ism_dtx_enc.c b/lib_enc/ivas_ism_dtx_enc.c index bc8134f365..3839a42a9d 100644 --- a/lib_enc/ivas_ism_dtx_enc.c +++ b/lib_enc/ivas_ism_dtx_enc.c @@ -41,7 +41,16 @@ #endif #include "wmc_auto.h" -#ifdef PARAM_ISM_DTX_CNG + +#ifdef DISCRETE_ISM_DTX_CNG +/*-----------------------------------------------------------------------* + * Local constants + *-----------------------------------------------------------------------*/ + +#define MD_MAX_DIFF_AZIMUTH 10 +#define MD_MAX_DIFF_ELEVATION 10 +#endif + /*-------------------------------------------------------------------* * ivas_ism_dtx_open() @@ -67,8 +76,11 @@ ivas_error ivas_ism_dtx_open( hISMDTX->dtx_flag = 0; hISMDTX->sce_id_dtx = 0; - +#ifdef DISCRETE_ISM_DTX_CNG + hISMDTX->cnt_SID_ISM = -1; +#else set_s( hISMDTX->dtx_speech_buffer_enc, 0, PARAM_ISM_HYS_BUF_SIZE ); +#endif for ( i = 0; i < MAX_NUM_OBJECTS; i++ ) { @@ -83,6 +95,209 @@ ivas_error ivas_ism_dtx_open( } +#ifdef DISCRETE_ISM_DTX_CNG +/*-------------------------------------------------------------------* + * ivas_ism_get_dtx_enc() + * + * Analysis and decision about DTX in ISM format + *-------------------------------------------------------------------*/ + +/*! r: indication of DTX frame */ +int16_t ivas_ism_dtx_enc( + ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ + SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t nchan_ism, /* i : number of objects */ + const int16_t nchan_transport, /* i : number of transport channels */ + int16_t vad_flag[MAX_NUM_OBJECTS], /* i : VAD flag */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + int16_t md_diff_flag[], /* o : metadata differential flag */ + int16_t *sid_flag /* o : indication of SID frame */ +) +{ + int16_t ch, dtx_flag; + int16_t nBits, nBits_MD_max; + int16_t nBits_azimuth, nBits_elevation, nBits_coh, nBits_sce_id; + float lp_noise[MAX_NUM_OBJECTS], lp_noise_variation, lp_noise_mean; + float lp_noise_max; + float tmp1, tmp2; + + /* initialization */ + for ( ch = 0; ch < nchan_transport; ch++ ) + { + hSCE[ch]->hCoreCoder[0]->low_rate_mode = 0; + } + + /*------------------------------------------------------------------* + * compute global ISM DTX flag + *-----------------------------------------------------------------*/ + + /* compute global ISM based on localVAD */ + dtx_flag = 1; + for ( ch = 0; ch < nchan_transport; ch++ ) + { + dtx_flag &= !vad_flag[ch]; + } + + /* compute global ISM based on long-term background noise */ + /* one of the channels is active -> no DTX */ + for ( ch = 0; ch < nchan_transport; ch++ ) + { + lp_noise[ch] = hSCE[ch]->hCoreCoder[0]->lp_noise; + } + + lp_noise_variation = var( lp_noise, nchan_transport ); + lp_noise_mean = mean( lp_noise, nchan_transport ); + + if ( lp_noise_mean > 50 || ( lp_noise_mean > 25 && lp_noise_variation > 32 ) ) + { + dtx_flag = 0; + } + + + /* default DTX is applied at lower bitrates; otherwise DTX is applied only in silence */ + maximum( lp_noise, nchan_transport, &lp_noise_max ); + + if ( !( ( nchan_ism == 1 && ivas_total_brate <= IVAS_24k4 ) || + ( nchan_ism == 2 && ivas_total_brate <= IVAS_48k ) || + ( nchan_ism == 3 && ivas_total_brate <= IVAS_80k ) || + ( nchan_ism == 4 && ivas_total_brate <= IVAS_96k ) || + lp_noise_max < 15 ) ) + { + dtx_flag = 0; + } + + /*------------------------------------------------------------------* + * Reset the bitstream + *-----------------------------------------------------------------*/ + + if ( dtx_flag ) + { + /* reset the bitstream (IVAS format signaling was already written) */ + reset_indices_enc( hSCE[0]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); + } + + /*------------------------------------------------------------------* + * decide about SID metadata to be sent or not (per object) + * estimate the MD bit-budget consumption + *-----------------------------------------------------------------*/ + + if ( dtx_flag ) + { + ivas_get_ism_sid_quan_bitbudget( nchan_ism, &nBits_azimuth, &nBits_elevation, &tmp1, &tmp2, &nBits_coh, &nBits_sce_id ); + + nBits = 0; + for ( ch = 0; ch < nchan_ism; ch++ ) + { + /* check difference between current and last metadata */ + md_diff_flag[ch] = 0; + if ( fabsf( hIsmMeta[ch]->azimuth - hIsmMeta[ch]->last_azimuth ) > MD_MAX_DIFF_AZIMUTH ) + { + md_diff_flag[ch] = 1; + } + + if ( fabsf( hIsmMeta[ch]->elevation - hIsmMeta[ch]->last_elevation ) > MD_MAX_DIFF_ELEVATION ) + { + md_diff_flag[ch] = 1; + } + + /* estimate SID metadata bit-budget */ + nBits++; /* number of objects */ + nBits++; /* SID metadata flag */ + if ( md_diff_flag[ch] == 1 ) + { + nBits += nBits_azimuth; + nBits += nBits_elevation; + } + } + + /* calculate maximum available MD bit-budget */ + nBits_MD_max = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC; + nBits_MD_max -= SID_FORMAT_NBITS; + if ( nchan_transport > 1 ) + { + nBits_MD_max -= nBits_sce_id; + } + + for ( ch = 0; ch < nchan_transport - 1; ch++ ) + { + nBits_MD_max -= nBits_coh; /* coherence */ + } + + if ( nchan_ism > 3 ) + { + nBits_MD_max--; /* ism_mode flag */ + } + + /* too many metadata bits -> switch to active coding */ + if ( nBits > nBits_MD_max ) + { + dtx_flag = 0; + } + } + + /*------------------------------------------------------------------* + * set core_brate for all channels + * get 'sid_flag' value + *-----------------------------------------------------------------*/ + + *sid_flag = 0; + + if ( !dtx_flag ) + { + /* at least one of the channels is active -> no DTX */ + for ( ch = 0; ch < nchan_transport; ch++ ) + { + hSCE[ch]->hCoreCoder[0]->core_brate = -1; + set_bw( IVAS_SCE, hSCE[ch]->element_brate, hSCE[ch]->hCoreCoder[0], MODE1 ); + } + + hISMDTX->cnt_SID_ISM = -1; + + /* IVAS format signaling was erased in dtx() */ + if ( hSCE[0]->hCoreCoder[0]->hBstr->nb_bits_tot == 0 ) + { + /* replicate ivas_write_format() */ + push_indice( hSCE[0]->hCoreCoder[0]->hBstr, IND_IVAS_FORMAT, 2 /* == ISM format */, IVAS_FORMAT_SIGNALING_NBITS ); + } + } + else /* ism_dtx_flag == 1 */ + { + for ( ch = 0; ch < nchan_transport; ch++ ) + { + hSCE[ch]->hCoreCoder[0]->cng_type = FD_CNG; + } + + /* * update the global SID counter */ + hISMDTX->cnt_SID_ISM++; + if ( hISMDTX->cnt_SID_ISM >= hSCE[0]->hCoreCoder[0]->hDtxEnc->max_SID ) + { + /* adaptive SID update interval */ + hSCE[0]->hCoreCoder[0]->hDtxEnc->max_SID = hSCE[0]->hCoreCoder[0]->hDtxEnc->interval_SID; + hISMDTX->cnt_SID_ISM = 0; + } + + /* encode SID in one channel only */ + for ( ch = 0; ch < nchan_transport; ch++ ) + { + hSCE[ch]->hCoreCoder[0]->core_brate = FRAME_NO_DATA; + } + + if ( hISMDTX->cnt_SID_ISM == 0 ) + { + hSCE[hISMDTX->sce_id_dtx]->hCoreCoder[0]->core_brate = SID_2k40; + *sid_flag = 1; + } + } + + if ( dtx_flag == 1 && *sid_flag == 0 ) + { + set_s( md_diff_flag, 0, nchan_transport ); + } + + return dtx_flag; +} +#else /*-------------------------------------------------------------------* * ivas_ism_dtx_enc() * @@ -170,13 +385,7 @@ int16_t ivas_ism_dtx_enc( if ( ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == -1 ) && ( st_ivas->hSCE[0]->hCoreCoder[0]->last_core_brate == SID_2k40 || st_ivas->hSCE[0]->hCoreCoder[0]->last_core_brate == FRAME_NO_DATA ) ) { st_ivas->hSCE[0]->hCoreCoder[0]->core_brate = st_ivas->hSCE[0]->hCoreCoder[0]->last_core_brate; - reset_indices_enc( st_ivas->hSCE[0]->hCoreCoder[0]->hBstr, -#ifdef IND_LIST_DYN - st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->max_num_indices -#else - MAX_NUM_INDICES -#endif - ); + reset_indices_enc( st_ivas->hSCE[0]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); } st_ivas->hSCE[1]->hCoreCoder[0]->core_brate = st_ivas->hSCE[0]->hCoreCoder[0]->core_brate; @@ -223,7 +432,7 @@ int16_t ivas_ism_dtx_enc( return dtx_flag; } - +#endif /*-------------------------------------------------------------------* * ivas_ism_get_sce_id_dtx() @@ -295,7 +504,11 @@ void ivas_ism_coh_estim_dtx_enc( { Encoder_State *st, *st_id0; int16_t sce_id, i; +#ifdef DISCRETE_ISM_DTX_CNG + float acorr_ene[MAX_NUM_OBJECTS], xcorr_ene; +#else float acorr_ene[PARAM_ISM_MAX_DMX], xcorr_ene; +#endif if ( nchan_transport == 1 ) { @@ -339,4 +552,3 @@ void ivas_ism_coh_estim_dtx_enc( return; } -#endif diff --git a/lib_enc/ivas_ism_enc.c b/lib_enc/ivas_ism_enc.c index 85b8e0c4aa..25ce78ff2e 100644 --- a/lib_enc/ivas_ism_enc.c +++ b/lib_enc/ivas_ism_enc.c @@ -85,9 +85,16 @@ ivas_error ivas_ism_enc( float Etot_LR[1]; /* total energy; correlation shift */ float lf_E[1][2 * VOIC_BINS]; /* per bin spectrum energy in lf */ int16_t localVAD_HE_SAD[1]; /* local HE VAD */ +#ifdef DISCRETE_ISM_DTX_CNG + int16_t nchan_ism, dtx_flag, sid_flag, flag_noisy_speech; + int16_t md_diff_flag[MAX_NUM_OBJECTS]; +#else +#ifdef NCHAN_ISM_PARAMETER + int16_t nchan_ism, dtx_flag, sid_flag; +#else + int16_t dtx_flag, sid_flag, flag_noisy_speech; +#endif int16_t i, nBits; -#ifdef PARAM_ISM_DTX_CNG - int16_t dtx_flag, sid_flag; #endif ivas_error error; @@ -99,10 +106,27 @@ ivas_error ivas_ism_enc( error = IVAS_ERR_OK; -#ifdef PARAM_ISM_DTX_CNG dtx_flag = 0; sid_flag = 0; +#if ( !defined NCHAN_ISM_PARAMETER || defined DISCRETE_ISM_DTX_CNG ) + flag_noisy_speech = 0; +#endif + +#ifdef NCHAN_ISM_PARAMETER + nchan_ism = st_ivas->hEncoderConfig->nchan_ism; +#else +#ifdef DISCRETE_ISM_DTX_CNG + if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + nchan_ism = st_ivas->hDirAC->hParamIsm->num_obj; + } + else /* ism_mode == ISM_MODE_DISC */ + { + nchan_ism = st_ivas->nchan_transport; + } +#endif #endif + set_s( md_diff_flag, 1, nchan_ism ); /*------------------------------------------------------------------* * Preprocesing @@ -158,39 +182,47 @@ ivas_error ivas_ism_enc( * Front Pre-processing *----------------------------------------------------------------*/ -#ifdef LOW_RATE_TRANS_CORE_CODER error = pre_proc_front_ivas( hSCE, NULL, hSCE->element_brate, nb_bits_metadata[sce_id], input_frame, 0, old_inp_12k8[sce_id][0], old_inp_16k[sce_id][0], &ener[sce_id][0], &relE[sce_id][0], A[sce_id][0], Aw[sce_id][0], epsP[sce_id][0], lsp_new[sce_id][0], lsp_mid[sce_id][0], &vad_hover_flag[sce_id][0], &attack_flag[sce_id][0], realBuffer[sce_id][0], imagBuffer[sce_id][0], old_wsp[sce_id][0], pitch_fr[sce_id][0], voicing_fr[sce_id][0], &loc_harm[sce_id][0], &cor_map_sum[sce_id][0], &vad_flag_dtx[sce_id][0], enerBuffer[sce_id][0], fft_buff[sce_id][0], A[sce_id][0], lsp_new[sce_id][0], currFlatness[0], 0, fr_bands, Etot_LR, lf_E, localVAD_HE_SAD, NULL, 0, 0, 0, 0, st_ivas->hEncoderConfig->ivas_total_brate ); -#else - error = pre_proc_front_ivas( hSCE, NULL, hSCE->element_brate, nb_bits_metadata[sce_id], input_frame, 0, old_inp_12k8[sce_id][0], old_inp_16k[sce_id][0], - &ener[sce_id][0], &relE[sce_id][0], A[sce_id][0], Aw[sce_id][0], epsP[sce_id][0], lsp_new[sce_id][0], lsp_mid[sce_id][0], - &vad_hover_flag[sce_id][0], &attack_flag[sce_id][0], realBuffer[sce_id][0], imagBuffer[sce_id][0], old_wsp[sce_id][0], pitch_fr[sce_id][0], voicing_fr[sce_id][0], &loc_harm[sce_id][0], &cor_map_sum[sce_id][0], &vad_flag_dtx[sce_id][0], enerBuffer[sce_id][0], - fft_buff[sce_id][0], A[sce_id][0], lsp_new[sce_id][0], currFlatness[0], 0, fr_bands, Etot_LR, lf_E, localVAD_HE_SAD, NULL, 0, 0, 0, 0, - st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->hEncoderConfig->ivas_format ); -#endif if ( error != IVAS_ERR_OK ) { return error; } - vad_flag[sce_id] = st->vad_flag; +#ifdef DISCRETE_ISM_DTX_CNG + if ( st_ivas->hEncoderConfig->Opt_DTX_ON ) + { + vad_flag[sce_id] = vad_flag_dtx[sce_id][0]; + } + else +#endif + { + vad_flag[sce_id] = st->vad_flag; + } } -#ifdef PARAM_ISM_DTX_CNG /*------------------------------------------------------------------* * DTX analysis *-----------------------------------------------------------------*/ +#ifdef DISCRETE_ISM_DTX_CNG + if ( st_ivas->hEncoderConfig->Opt_DTX_ON ) +#else if ( st_ivas->hEncoderConfig->Opt_DTX_ON && st_ivas->ism_mode == ISM_MODE_PARAM ) +#endif { /* compute the dominant sce_id using long term energy */ ivas_ism_get_sce_id_dtx( st_ivas->hISMDTX, st_ivas->hSCE, st_ivas->nchan_transport, input_frame ); /* analysis and decision about DTX */ +#ifdef DISCRETE_ISM_DTX_CNG + dtx_flag = ivas_ism_dtx_enc( st_ivas->hISMDTX, st_ivas->hSCE, st_ivas->hEncoderConfig->ivas_total_brate, nchan_ism, st_ivas->nchan_transport, vad_flag, st_ivas->hIsmMetaData, md_diff_flag, &sid_flag ); +#else dtx_flag = ivas_ism_dtx_enc( st_ivas, &sid_flag ); +#endif if ( sid_flag ) { @@ -199,85 +231,96 @@ ivas_error ivas_ism_enc( } #ifdef DEBUG_MODE_PARAM_ISM - dbgwrite( &( st_ivas->hISMDTX->flag_noisy_speech ), sizeof( int16_t ), 1, 1, "./res/ParamISM_noisy_speech_flag_enc.dat" ); + if ( st_ivas->hDirAC != NULL ) + dbgwrite( &( st_ivas->hDirAC->hParamIsm->flag_noisy_speech ), sizeof( int16_t ), 1, 1, "./res/ParamISM_noisy_speech_flag_enc.dat" ); dbgwrite( &( st_ivas->hISMDTX->dtx_flag ), sizeof( int16_t ), 1, 1, "./res/ParamISM_DTX_CNG_flag_enc.dat" ); + dbgwrite( &( st_ivas->hISMDTX->sce_id_dtx ), sizeof( int16_t ), 1, input_frame, "./res/sce_id_dtx" ); + dbgwrite( &( dtx_flag ), sizeof( int16_t ), 1, input_frame, "./res/dtx_flag" ); #endif } -#endif /*------------------------------------------------------------------* * Analysis of objects, configuration and decision about bitrates per channel * Metadata quantization and encoding *-----------------------------------------------------------------*/ -#ifdef PARAM_ISM_DTX_CNG if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { ivas_param_ism_compute_noisy_speech_flag( st_ivas ); +#ifdef DISCRETE_ISM_DTX_CNG + flag_noisy_speech = st_ivas->hDirAC->hParamIsm->flag_noisy_speech; +#endif } if ( dtx_flag ) { +#ifdef DISCRETE_ISM_DTX_CNG + ivas_ism_metadata_sid_enc( st_ivas->hISMDTX, flag_noisy_speech, nchan_ism, st_ivas->nchan_transport, st_ivas->ism_mode, st_ivas->hIsmMetaData, sid_flag, md_diff_flag, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata ); +#else if ( sid_flag ) { +#ifdef NCHAN_ISM_PARAMETER + ivas_param_ism_metadata_dtx_enc( st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, st_ivas->hIsmMetaData, st_ivas->hISMDTX, st_ivas->hDirAC->hParamIsm, nchan_ism ); +#else ivas_param_ism_metadata_dtx_enc( st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, st_ivas->hIsmMetaData, st_ivas->hISMDTX, st_ivas->hDirAC->hParamIsm ); +#endif } - } - else #endif - if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + } + else if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { -#ifndef PARAM_ISM_DTX_CNG - /* Move the Noisy speech buffer */ - for ( i = 0; i < ( PARAM_ISM_HYS_BUF_SIZE - 1 ); i++ ) - { - st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i] = st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i + 1]; - } - - /* For the current frame, make a decision based on some core-coder flags */ - if ( st_ivas->hSCE[0]->hCoreCoder[0]->flag_noisy_speech_snr && st_ivas->hSCE[1]->hCoreCoder[0]->flag_noisy_speech_snr ) - { - if ( st_ivas->hSCE[0]->hCoreCoder[0]->vad_flag || st_ivas->hSCE[1]->hCoreCoder[0]->vad_flag ) - { - st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i] = 0; - } - else - { - st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i] = 1; - } - } - else - { - st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i] = 0; - } - - /* Do a decision based on hysterisis */ - st_ivas->hDirAC->hParamIsm->flag_noisy_speech = 1; - for ( i = 0; i < PARAM_ISM_HYS_BUF_SIZE; i++ ) - { - st_ivas->hDirAC->hParamIsm->flag_noisy_speech = st_ivas->hDirAC->hParamIsm->flag_noisy_speech && st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i]; - } + // VE: call ivas_ism_metadata_enc() with 'st_ivas' - TBD +#ifdef TD5 + ivas_ism_metadata_enc( st_ivas->hEncoderConfig->ivas_total_brate, +#ifdef NCHAN_ISM_PARAMETER + nchan_ism, +#endif + st_ivas->nchan_transport, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata, vad_flag, st_ivas->ism_mode, st_ivas->hDirAC->hParamIsm, st_ivas->hEncoderConfig->ism_extended_metadata_flag ); +#else + ivas_ism_metadata_enc( st_ivas->hEncoderConfig->ivas_total_brate, +#ifdef NCHAN_ISM_PARAMETER + nchan_ism, +#endif + st_ivas->nchan_transport, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata, vad_flag, st_ivas->ism_mode, st_ivas->hDirAC->hParamIsm ); #endif - ivas_ism_metadata_enc( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata, vad_flag, st_ivas->ism_mode, st_ivas->hDirAC->hParamIsm ); } else /* ISM_MODE_DISC */ { - ivas_ism_metadata_enc( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata, vad_flag, st_ivas->ism_mode, NULL ); +#ifdef TD5 + ivas_ism_metadata_enc( st_ivas->hEncoderConfig->ivas_total_brate, +#ifdef NCHAN_ISM_PARAMETER + nchan_ism, +#endif + st_ivas->nchan_transport, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata, vad_flag, st_ivas->ism_mode, NULL, st_ivas->hEncoderConfig->ism_extended_metadata_flag ); +#else + ivas_ism_metadata_enc( st_ivas->hEncoderConfig->ivas_total_brate, +#ifdef NCHAN_ISM_PARAMETER + nchan_ism, +#endif + st_ivas->nchan_transport, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata, vad_flag, st_ivas->ism_mode, NULL ); +#endif } +#ifdef DISCRETE_ISM_DTX_CNG + update_last_metadata( nchan_ism, st_ivas->hIsmMetaData, md_diff_flag ); +#endif + /*----------------------------------------------------------------* * Write IVAS format signaling in SID frames *----------------------------------------------------------------*/ st = st_ivas->hSCE[0]->hCoreCoder[0]; +#ifdef DISCRETE_ISM_DTX_CNG + if ( sid_flag ) +#else if ( st->core_brate == SID_2k40 ) +#endif { ivas_write_format_sid( st_ivas->hEncoderConfig->ivas_format, IVAS_SCE, st->hBstr ); -#ifdef PARAM_ISM_DTX_CNG +#ifndef DISCRETE_ISM_DTX_CNG if ( st_ivas->ism_mode != ISM_MODE_PARAM ) -#endif { /* write unused bits */ nBits = ( IVAS_SID_5k2 - SID_2k40 ) / 50 - SID_FORMAT_NBITS; @@ -288,6 +331,7 @@ ivas_error ivas_ism_enc( nBits -= i; } } +#endif } /*------------------------------------------------------------------* @@ -329,9 +373,7 @@ ivas_error ivas_ism_enc( * Encoder *----------------------------------------------------------------*/ -#ifdef PARAM_ISM_DTX_CNG if ( !dtx_flag || ( dtx_flag && sce_id == st_ivas->hISMDTX->sce_id_dtx ) ) -#endif { if ( ( error = ivas_core_enc( hSCE, NULL, NULL, 1, old_inp_12k8[sce_id], old_inp_16k[sce_id], ener[sce_id], A[sce_id], Aw[sce_id], epsP[sce_id], lsp_new[sce_id], lsp_mid[sce_id], vad_hover_flag[sce_id], attack_flag[sce_id], realBuffer[sce_id], imagBuffer[sce_id], old_wsp[sce_id], loc_harm[sce_id], cor_map_sum[sce_id], vad_flag_dtx[sce_id], enerBuffer[sce_id], fft_buff[sce_id], 0, ISM_FORMAT, 0 ) ) != IVAS_ERR_OK ) { @@ -350,7 +392,6 @@ ivas_error ivas_ism_enc( st->hTranDet->transientDetector.prev_bIsAttackPresent = st->hTranDet->transientDetector.bIsAttackPresent; } -#ifdef PARAM_ISM_DTX_CNG if ( dtx_flag ) { for ( sce_id = 0; sce_id < st_ivas->nchan_transport; sce_id++ ) @@ -359,11 +400,47 @@ ivas_error ivas_ism_enc( { st_ivas->hSCE[sce_id]->hCoreCoder[0]->last_core = st_ivas->hSCE[st_ivas->hISMDTX->sce_id_dtx]->hCoreCoder[0]->last_core; st_ivas->hSCE[sce_id]->hCoreCoder[0]->last_core_brate = st_ivas->hSCE[st_ivas->hISMDTX->sce_id_dtx]->hCoreCoder[0]->core_brate; + st_ivas->hSCE[sce_id]->hCoreCoder[0]->last_L_frame = st_ivas->hSCE[st_ivas->hISMDTX->sce_id_dtx]->hCoreCoder[0]->last_L_frame; } } } -#endif +#ifdef DISCRETE_ISM_DTX_CNG +#ifdef DEBUG_MODE_INFO + if ( dtx_flag ) + { + float tmpF; + int16_t id, n; + + n = 0; + for ( sce_id = 0; sce_id < st_ivas->nchan_transport; sce_id++ ) + { + if ( sce_id != st_ivas->hISMDTX->sce_id_dtx ) + { + st = st_ivas->hSCE[sce_id]->hCoreCoder[0]; + id = st->id_element; + + dbgwrite( &st->core, sizeof( int16_t ), 1, input_frame, fname( debug_dir, "core", n, id, ENC ) ); + dbgwrite( &st->extl, sizeof( int16_t ), 1, input_frame, fname( debug_dir, "extl", n, id, ENC ) ); + dbgwrite( &st->bwidth, sizeof( int16_t ), 1, input_frame, fname( debug_dir, "bwidth", n, id, ENC ) ); + tmpF = st->total_brate / 1000.0f; + dbgwrite( &tmpF, sizeof( float ), 1, input_frame, fname( debug_dir, "total_brate", n, id, ENC ) ); + tmpF = st->core_brate / 1000.0f; + dbgwrite( &tmpF, sizeof( float ), 1, input_frame, fname( debug_dir, "core_brate", n, id, ENC ) ); + tmpF = st->extl_brate / 1000.0f; + dbgwrite( &tmpF, sizeof( float ), 1, input_frame, fname( debug_dir, "extl_brate", n, id, ENC ) ); + + dbgwrite( &st->coder_type, sizeof( int16_t ), 1, input_frame, fname( debug_dir, "coder_type", n, id, ENC ) ); + dbgwrite( &st->coder_type_raw, sizeof( int16_t ), 1, input_frame, fname( debug_dir, "coder_type_raw", n, id, ENC ) ); + dbgwrite( &st->vad_flag, sizeof( int16_t ), 1, input_frame, fname( debug_dir, "vad_flag", n, id, ENC ) ); + dbgwrite( &st->localVAD, sizeof( int16_t ), 1, input_frame, fname( debug_dir, "localVAD", n, id, ENC ) ); + + dbgwrite( &st->lp_noise, sizeof( float ), 1, input_frame, fname( debug_dir, "lp_noise", n, id, ENC ) ); + } + } + } +#endif +#endif pop_wmops(); return error; @@ -377,7 +454,6 @@ ivas_error ivas_ism_enc( * - reconfigure the ISM format encoder *-------------------------------------------------------------------------*/ -/*! r : ISM format mode */ ivas_error ivas_ism_enc_config( Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ) @@ -403,7 +479,7 @@ ivas_error ivas_ism_enc_config( /* Reset and Initialize */ if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { - st_ivas->nchan_transport = 2; + st_ivas->nchan_transport = MAX_PARAM_ISM_WAVE; } else { @@ -437,8 +513,7 @@ ivas_error ivas_ism_enc_config( if ( st_ivas->ism_mode == ISM_MODE_DISC && last_ism_mode == ISM_MODE_PARAM ) { /* Deallocate the memory used by ParamISM when switch to Discrete ISM */ - ivas_param_ism_enc_close( st_ivas->hDirAC, st_ivas->hEncoderConfig->input_Fs ); - st_ivas->hDirAC = NULL; + ivas_param_ism_enc_close( &( st_ivas->hDirAC ), st_ivas->hEncoderConfig->input_Fs ); } } diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index 41e0f8ac78..1540e35ce4 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -49,16 +49,34 @@ * Local constants *-----------------------------------------------------------------------*/ +#ifdef TD5 +#define ISM_NUM_PARAM 5 /* number of coded metadata parameters */ +#else #define ISM_NUM_PARAM 2 /* number of coded metadata parameters */ +#endif #define ISM_MAX_AZIMUTH_DIFF_IDX ( ISM_AZIMUTH_NBITS - 1 /*zero*/ - 1 /*sign*/ ) #define ISM_MAX_ELEVATION_DIFF_IDX ( ISM_ELEVATION_NBITS - 1 /*zero*/ - 1 /*sign*/ ) +#ifdef TD5 +#define ISM_MAX_RADIUS_DIFF_IDX ( ISM_RADIUS_NBITS - 1 /*zero*/ - 1 /*sign*/ ) +#endif #define ISM_FEC_MAX 10 #define INTER_OBJECT_PARAM_CHECK ( ( ISM_FEC_MAX / 2 ) - 2 ) /* note: constant must be less than (ISM_FEC_MAX / number of coded parameters) */ +#ifdef TD5 +/*-----------------------------------------------------------------------* + * Local function declarations + *-----------------------------------------------------------------------*/ + +static void encode_angle_indices( BSTR_ENC_HANDLE hBstr, ISM_METADATA_ANGLE_HANDLE angle, const int16_t last_ism_metadata_flag, const int16_t ini_frame, const int16_t idx_azimuth_abs, const int16_t idx_elevation_abs, int16_t *flag_abs_azimuth, int16_t *flag_abs_elevation ); + +static void encode_radius( BSTR_ENC_HANDLE hBstr, int16_t *last_radius_idx, int16_t *radius_diff_cnt, const int16_t last_ism_metadata_flag, const int16_t idx_radius_abs, int16_t *flag_abs_radius ); + +#endif + /*-------------------------------------------------------------------------* * ivas_set_ism_metadata() * @@ -68,7 +86,14 @@ ivas_error ivas_set_ism_metadata( ISM_METADATA_HANDLE hIsmMeta, /* o : ISM metadata handle */ const float azimuth, /* i : azimuth value */ - const float elevation /* i : elevation value */ +#ifdef TD5 + const float elevation, /* i : elevation */ + const float radius_meta, /* i : radius */ + const float yaw, /* i : yaw */ + const float pitch /* i : pitch */ +#else + const float elevation /* i : elevation value */ +#endif ) { if ( hIsmMeta == NULL ) @@ -81,6 +106,11 @@ ivas_error ivas_set_ism_metadata( /* save read metadata parameters to the internal codec structure */ hIsmMeta->azimuth = azimuth; hIsmMeta->elevation = elevation; +#ifdef TD5 + hIsmMeta->radius = radius_meta; + hIsmMeta->yaw = yaw; + hIsmMeta->pitch = pitch; +#endif return IVAS_ERR_OK; } @@ -89,7 +119,7 @@ ivas_error ivas_set_ism_metadata( /*-------------------------------------------------------------------------* * rate_ism_importance() * - * Rate importance of particular ISm streams + * Rate importance of particular ISM streams *-------------------------------------------------------------------------*/ static void rate_ism_importance( @@ -146,64 +176,96 @@ static void rate_ism_importance( *-------------------------------------------------------------------------*/ ivas_error ivas_ism_metadata_enc( - const int32_t ism_total_brate, /* i : ISms total bitrate */ - const int16_t nchan_transport, /* i : number of transport channels */ - ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ - SCE_ENC_HANDLE hSCE[], /* i/o: SCE encoder handles */ - BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ - int16_t nb_bits_metadata[], /* o : number of metadata bits */ - const int16_t localVAD[], /* i : VAD flag */ - const int16_t ism_mode, /* i : ISM mode */ + const int32_t ism_total_brate, /* i : ISM total bitrate */ +#ifdef NCHAN_ISM_PARAMETER + const int16_t nchan_ism, /* i : number of ISM channels */ +#endif + const int16_t nchan_transport, /* i : number of transport channels */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + SCE_ENC_HANDLE hSCE[], /* i/o: SCE encoder handles */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + int16_t nb_bits_metadata[], /* o : number of metadata bits */ + const int16_t localVAD[], /* i : VAD flag */ + const int16_t ism_mode, /* i : ISM mode */ +#ifdef TD5 + const PARAM_ISM_CONFIG_HANDLE hParamIsm, /* i : Param ISM Enc Handle */ + const int16_t ism_extended_metadata_flag /* i : Extended metadata flag */ +#else const PARAM_ISM_CONFIG_HANDLE hParamIsm /* i : Param ISM Enc Handle */ +#endif ) { +#ifdef TD5 +#ifdef TUNE_360_OBJECT_WITH_NOISE + int16_t i, ch, nb_bits_start = 0; +#else + int16_t i, ch, nb_bits_start = 0, diff; +#endif + int16_t idx_azimuth_abs = 0, flag_abs_azimuth[MAX_NUM_OBJECTS]; + int16_t idx_elevation_abs = 0, flag_abs_elevation[MAX_NUM_OBJECTS]; + int16_t flag_abs_azimuth_orientation[MAX_NUM_OBJECTS]; + int16_t idx_radius_abs = 0, flag_abs_radius[MAX_NUM_OBJECTS]; +#else int16_t i, ch, nb_bits_start = 0, diff; int16_t idx_azimuth, idx_azimuth_abs = 0, flag_abs_azimuth[MAX_NUM_OBJECTS], nbits_diff_azimuth; int16_t idx_elevation, idx_elevation_abs = 0, flag_abs_elevation[MAX_NUM_OBJECTS], nbits_diff_elevation; +#endif float valQ; ISM_METADATA_HANDLE hIsmMetaData; int32_t element_brate[MAX_NUM_OBJECTS], total_brate[MAX_NUM_OBJECTS]; int16_t ism_metadata_flag_global; int16_t ism_imp[MAX_NUM_OBJECTS]; - int16_t num_obj, nbands, nblocks; +#ifdef NCHAN_ISM_PARAMETER + int16_t nbands, nblocks; +#else + int16_t nchan_ism, nbands, nblocks; +#endif ivas_error error; error = IVAS_ERR_OK; push_wmops( "ism_meta_enc" ); +#ifndef NCHAN_ISM_PARAMETER if ( ism_mode == ISM_MODE_PARAM ) { - num_obj = hParamIsm->num_obj; + nchan_ism = hParamIsm->num_obj; } else if ( ism_mode == ISM_MODE_DISC ) { - num_obj = nchan_transport; + nchan_ism = nchan_transport; } else { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: incorrect ISM mode" ); } +#endif - if ( num_obj == 1 && ( hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 || hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA ) && ism_mode == ISM_MODE_DISC ) +#ifndef DISCRETE_ISM_DTX_CNG + if ( nchan_ism == 1 && ( hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 || hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA ) && ism_mode == ISM_MODE_DISC ) { /* no metadata encoding in CNG */ pop_wmops(); return error; } +#endif /* initialization */ ism_metadata_flag_global = 0; set_s( nb_bits_metadata, 0, nchan_transport ); - set_s( flag_abs_azimuth, 0, num_obj ); - set_s( flag_abs_elevation, 0, num_obj ); + set_s( flag_abs_azimuth, 0, nchan_ism ); + set_s( flag_abs_elevation, 0, nchan_ism ); +#ifdef TD5 + set_s( flag_abs_azimuth_orientation, 0, nchan_ism ); + set_s( flag_abs_radius, 0, nchan_ism ); +#endif /*----------------------------------------------------------------* * Set Metadata presence / importance flag *----------------------------------------------------------------*/ - for ( ch = 0; ch < num_obj; ch++ ) + for ( ch = 0; ch < nchan_ism; ch++ ) { if ( ism_mode == ISM_MODE_PARAM ) { @@ -211,6 +273,39 @@ ivas_error ivas_ism_metadata_enc( } else if ( ism_mode == ISM_MODE_DISC ) { +#ifdef TD5 +#ifdef TUNE_360_OBJECT_WITH_NOISE +#ifdef DISCRETE_ISM_DTX_CNG + hIsmMeta[ch]->ism_metadata_flag = localVAD[ch] || hSCE[ch]->hCoreCoder[0]->lp_noise > 10; +#else + /* In case of low level noise for low bitrate inactive frames, do not sent metadata */ + if ( localVAD[ch] == 0 && !( hSCE[ch]->hCoreCoder[0]->tcxonly ) && ( hSCE[ch]->hCoreCoder[0]->lp_noise <= 10 ) ) + { + hIsmMeta[ch]->ism_metadata_flag = 0; + } +#endif +#else + if ( hIsmMeta[ch]->ism_metadata_flag ) + { + /* at highest bitrates (with TCX core only) metadata are sent also for inactive frames */ + if ( localVAD[ch] == 0 && !( hSCE[ch]->hCoreCoder[0]->tcxonly ) ) + { + /* send metadata even in inactive segments when noise is audible and metadata are changing */ + diff = (int16_t) fabsf( hIsmMeta[ch]->azimuth - ism_dequant_meta( hIsmMeta[ch]->angle[0].last_azimuth_idx, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ) ); + diff = max( diff, (int16_t) fabsf( hIsmMeta[ch]->elevation - ism_dequant_meta( hIsmMeta[ch]->angle[0].last_elevation_idx, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ) ) ); + if ( ism_total_brate >= ISM_EXTENDED_METADATA_BRATE && ism_extended_metadata_flag ) + { + diff = max( diff, (int16_t) fabsf( hIsmMeta[ch]->yaw - ism_dequant_meta( hIsmMeta[ch]->angle[1].last_azimuth_idx, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ) ) ); + diff = max( diff, (int16_t) fabsf( hIsmMeta[ch]->pitch - ism_dequant_meta( hIsmMeta[ch]->angle[1].last_elevation_idx, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ) ) ); + } + if ( !( hSCE[ch]->hCoreCoder[0]->lp_noise > 15 && diff >= 10 ) ) + { + hIsmMeta[ch]->ism_metadata_flag = 0; + } + } + } +#endif +#else #ifdef TUNE_360_OBJECT_WITH_NOISE hIsmMeta[ch]->ism_metadata_flag = localVAD[ch] || hSCE[ch]->hCoreCoder[0]->lp_noise > 10; #else @@ -219,8 +314,8 @@ ivas_error ivas_ism_metadata_enc( if ( hIsmMeta[ch]->ism_metadata_flag == 0 ) { /* send metadata even in inactive segments when noise is audible and metadata are changing */ - diff = (int16_t) fabsf( hIsmMeta[ch]->azimuth - ism_dequant_meta( hIsmMeta[ch]->last_azimuth_idx, ism_azimuth_borders, 1 << ISM_AZIMUTH_NBITS ) ); - diff = max( diff, (int16_t) fabsf( hIsmMeta[ch]->elevation - ism_dequant_meta( hIsmMeta[ch]->last_elevation_idx, ism_elevation_borders, 1 << ISM_ELEVATION_NBITS ) ) ); + diff = (int16_t) fabsf( hIsmMeta[ch]->azimuth - ism_dequant_meta( hIsmMeta[ch]->last_azimuth_idx, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ) ); + diff = max( diff, (int16_t) fabsf( hIsmMeta[ch]->elevation - ism_dequant_meta( hIsmMeta[ch]->last_elevation_idx, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ) ) ); if ( hSCE[ch]->hCoreCoder[0]->lp_noise > 15 && diff >= 10 ) { @@ -234,24 +329,25 @@ ivas_error ivas_ism_metadata_enc( /* at highest bitrates (with TCX core only) metadata are sent in every frame */ hIsmMeta[ch]->ism_metadata_flag = 1; } +#endif } } /*----------------------------------------------------------------* - * Rate importance of particular ISm streams + * Rate importance of particular ISM streams *----------------------------------------------------------------*/ rate_ism_importance( nchan_transport, hIsmMeta, hSCE, ism_imp ); #ifndef TUNE_360_OBJECT_WITH_NOISE /* relax the importance decision in "stereo" coding for noisy audio */ - if ( ism_mode == ISM_MODE_DISC && num_obj == 2 ) + if ( ism_mode == ISM_MODE_DISC && nchan_ism == 2 ) { float diff_F; if ( hIsmMeta[0]->ism_metadata_flag ^ hIsmMeta[1]->ism_metadata_flag ) { - for ( ch = 0; ch < num_obj; ch++ ) + for ( ch = 0; ch < nchan_ism; ch++ ) { diff_F = hSCE[ch]->hCoreCoder[0]->lp_speech - hSCE[ch]->hCoreCoder[0]->lp_noise; @@ -264,24 +360,33 @@ ivas_error ivas_ism_metadata_enc( } } #endif + /*----------------------------------------------------------------* - * Write ISm common signaling + * Write ISM common signaling *----------------------------------------------------------------*/ /* write number of objects - unary coding */ - for ( ch = 1; ch < num_obj; ch++ ) + for ( ch = 1; ch < nchan_ism; ch++ ) { push_indice( hBstr, IND_ISM_NUM_OBJECTS, 1, 1 ); } push_indice( hBstr, IND_ISM_NUM_OBJECTS, 0, 1 ); - /* write ISm metadata flag (one per object) */ +#ifdef TD5 + /* write extended metadata presence flag */ + if ( ism_total_brate >= ISM_EXTENDED_METADATA_BRATE ) + { + push_indice( hBstr, IND_ISM_EXTENDED_FLAG, ism_extended_metadata_flag, ISM_EXTENDED_METADATA_BITS ); + } +#endif + + /* write ISM metadata flag (one per object) */ for ( ch = 0; ch < nchan_transport; ch++ ) { push_indice( hBstr, IND_ISM_METADATA_FLAG, ism_imp[ch], ISM_METADATA_FLAG_BITS ); } - for ( ch = 0; ch < num_obj; ch++ ) + for ( ch = 0; ch < nchan_ism; ch++ ) { ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag; } @@ -313,7 +418,7 @@ ivas_error ivas_ism_metadata_enc( nb_bits_start = hBstr->nb_bits_tot; } - for ( ch = 0; ch < num_obj; ch++ ) + for ( ch = 0; ch < nchan_ism; ch++ ) { hIsmMetaData = hIsmMeta[ch]; if ( ism_mode == ISM_MODE_DISC ) @@ -323,6 +428,43 @@ ivas_error ivas_ism_metadata_enc( if ( hIsmMeta[ch]->ism_metadata_flag ) { +#ifdef TD5 + /*----------------------------------------------------------------* + * Quantize and encode azimuth and elevation + *----------------------------------------------------------------*/ + + if ( ism_mode == ISM_MODE_DISC ) + { + idx_azimuth_abs = ism_quant_meta( hIsmMetaData->azimuth, &valQ, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); + idx_elevation_abs = ism_quant_meta( hIsmMetaData->elevation, &valQ, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); + } + else /* ISM_MODE_PARAM */ + { + idx_azimuth_abs = hParamIsm->azi_index[ch]; + idx_elevation_abs = hParamIsm->ele_index[ch]; + } + + encode_angle_indices( hBstr, &( hIsmMetaData->angle[0] ), hIsmMetaData->last_ism_metadata_flag, hSCE[0]->hCoreCoder[0]->ini_frame, idx_azimuth_abs, idx_elevation_abs, &flag_abs_azimuth[ch], &flag_abs_elevation[ch] ); + + /*----------------------------------------------------------------* + * Quantize and encode radius, yaw, and pitch + *----------------------------------------------------------------*/ + + if ( ism_mode == ISM_MODE_DISC && ism_extended_metadata_flag ) + { + idx_azimuth_abs = ism_quant_meta( hIsmMetaData->yaw, &valQ, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); + idx_elevation_abs = ism_quant_meta( hIsmMetaData->pitch, &valQ, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); + idx_radius_abs = usquant( hIsmMetaData->radius, &valQ, ISM_RADIUS_MIN, ISM_RADIUS_DELTA, 1 << ISM_RADIUS_NBITS ); + encode_angle_indices( hBstr, &( hIsmMetaData->angle[1] ), hIsmMetaData->last_ism_metadata_flag, hSCE[0]->hCoreCoder[0]->ini_frame, idx_azimuth_abs, idx_elevation_abs, &flag_abs_azimuth_orientation[ch], &flag_abs_elevation[ch] ); + encode_radius( hBstr, &hIsmMetaData->last_radius_idx, &hIsmMetaData->radius_diff_cnt, hIsmMetaData->last_ism_metadata_flag, idx_radius_abs, &flag_abs_radius[ch] ); + } + + /* save number of metadata bits written */ + if ( ism_mode == ISM_MODE_DISC ) + { + nb_bits_metadata[ch] = hBstr->nb_bits_tot - nb_bits_start; + } +#else /*----------------------------------------------------------------* * Azimuth quantization and encoding *----------------------------------------------------------------*/ @@ -330,7 +472,7 @@ ivas_error ivas_ism_metadata_enc( /* Azimuth quantization (quantize azimuth to the AZIMUTH_NBITS-bit index */ if ( ism_mode == ISM_MODE_DISC ) { - idx_azimuth_abs = ism_quant_meta( hIsmMetaData->azimuth, &valQ, ism_azimuth_borders, 1 << ISM_AZIMUTH_NBITS ); + idx_azimuth_abs = ism_quant_meta( hIsmMetaData->azimuth, &valQ, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); } else if ( ism_mode == ISM_MODE_PARAM ) { @@ -436,7 +578,7 @@ ivas_error ivas_ism_metadata_enc( /* Elevation quantization (quantize azimuth to the ELEVATION_NBITS-bit index */ if ( ism_mode == ISM_MODE_DISC ) { - idx_elevation_abs = ism_quant_meta( hIsmMetaData->elevation, &valQ, ism_elevation_borders, 1 << ISM_ELEVATION_NBITS ); + idx_elevation_abs = ism_quant_meta( hIsmMetaData->elevation, &valQ, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); } else /* ISM_MODE_PARAM */ { @@ -567,6 +709,7 @@ ivas_error ivas_ism_metadata_enc( { nb_bits_metadata[ch] = hBstr->nb_bits_tot - nb_bits_start; } +#endif } } @@ -576,12 +719,16 @@ ivas_error ivas_ism_metadata_enc( *----------------------------------------------------------------*/ i = 0; - while ( i == 0 || i < num_obj / INTER_OBJECT_PARAM_CHECK ) + while ( i == 0 || i < nchan_ism / INTER_OBJECT_PARAM_CHECK ) { int16_t num, abs_num, abs_first, abs_next, pos_zero; +#ifdef TD5 + int16_t abs_matrice[INTER_OBJECT_PARAM_CHECK * ISM_NUM_PARAM]; +#else int16_t abs_matrice[INTER_OBJECT_PARAM_CHECK * 2]; +#endif - num = min( INTER_OBJECT_PARAM_CHECK, num_obj - i * INTER_OBJECT_PARAM_CHECK ); + num = min( INTER_OBJECT_PARAM_CHECK, nchan_ism - i * INTER_OBJECT_PARAM_CHECK ); i++; set_s( abs_matrice, 0, INTER_OBJECT_PARAM_CHECK * ISM_NUM_PARAM ); @@ -627,12 +774,20 @@ ivas_error ivas_ism_metadata_enc( if ( abs_next % ISM_NUM_PARAM == 0 ) { +#ifdef TD5 + hIsmMeta[ch]->angle[0].azimuth_diff_cnt = abs_num - 1; +#else hIsmMeta[ch]->azimuth_diff_cnt = abs_num - 1; +#endif } if ( abs_next % ISM_NUM_PARAM == 1 ) { +#ifdef TD5 + hIsmMeta[ch]->angle[0].elevation_diff_cnt = abs_num - 1; +#else hIsmMeta[ch]->elevation_diff_cnt = abs_num - 1; +#endif /*hIsmMeta[ch]->elevation_diff_cnt = min( hIsmMeta[ch]->elevation_diff_cnt, ISM_FEC_MAX );*/ } @@ -695,12 +850,12 @@ ivas_error ivas_ism_metadata_enc( * Configuration and decision about bitrates per channel *----------------------------------------------------------------*/ - if ( ( error = ivas_ism_config( ism_total_brate, nchan_transport, num_obj, hIsmMeta, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_ism_config( ism_total_brate, nchan_transport, nchan_ism, hIsmMeta, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) { return error; } - for ( ch = 0; ch < num_obj; ch++ ) + for ( ch = 0; ch < nchan_ism; ch++ ) { hIsmMeta[ch]->last_ism_metadata_flag = hIsmMeta[ch]->ism_metadata_flag; } @@ -722,11 +877,7 @@ ivas_error ivas_ism_metadata_enc( /* write metadata only in active frames */ if ( hSCE[0]->hCoreCoder[0]->core_brate > SID_2k40 ) { -#ifdef IND_LIST_DYN - reset_indices_enc( hSCE[ch]->hMetaData, hSCE[ch]->hMetaData->max_num_indices ); -#else reset_indices_enc( hSCE[ch]->hMetaData, MAX_BITS_METADATA ); -#endif } } @@ -735,6 +886,7 @@ ivas_error ivas_ism_metadata_enc( return error; } + /*------------------------------------------------------------------------- * ivas_ism_metadata_enc_create() * @@ -752,7 +904,7 @@ ivas_error ivas_ism_metadata_enc_create( if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { - nchan_transport = 2; + nchan_transport = MAX_PARAM_ISM_WAVE; } else { @@ -763,21 +915,39 @@ ivas_error ivas_ism_metadata_enc_create( st_ivas->nSCE = nchan_transport; st_ivas->nCPE = 0; - /* allocate ISm metadata handles */ + /* allocate ISM metadata handles */ for ( ch = 0; ch < n_ISms; ch++ ) { if ( ( st_ivas->hIsmMetaData[ch] = (ISM_METADATA_HANDLE) malloc( sizeof( ISM_METADATA_FRAME ) ) ) == NULL ) { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ISm MetaData\n" ) ); + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ISM MetaData\n" ) ); } +#ifdef TD5 + st_ivas->hIsmMetaData[ch]->angle[0].last_azimuth_idx = 0; + st_ivas->hIsmMetaData[ch]->angle[0].azimuth_diff_cnt = ISM_FEC_MAX; + st_ivas->hIsmMetaData[ch]->angle[0].last_elevation_idx = 0; + st_ivas->hIsmMetaData[ch]->angle[0].elevation_diff_cnt = ISM_FEC_MAX - 1; + st_ivas->hIsmMetaData[ch]->last_radius_idx = 0; + st_ivas->hIsmMetaData[ch]->radius_diff_cnt = ISM_FEC_MAX - 2; + st_ivas->hIsmMetaData[ch]->angle[1].last_azimuth_idx = 0; + st_ivas->hIsmMetaData[ch]->angle[1].azimuth_diff_cnt = ISM_FEC_MAX - 2; + st_ivas->hIsmMetaData[ch]->angle[1].last_elevation_idx = 0; + st_ivas->hIsmMetaData[ch]->angle[1].elevation_diff_cnt = ISM_FEC_MAX - 2; +#else st_ivas->hIsmMetaData[ch]->last_azimuth_idx = 0; st_ivas->hIsmMetaData[ch]->azimuth_diff_cnt = ISM_FEC_MAX; st_ivas->hIsmMetaData[ch]->last_elevation_idx = 0; st_ivas->hIsmMetaData[ch]->elevation_diff_cnt = ISM_FEC_MAX - 1; +#endif st_ivas->hIsmMetaData[ch]->last_ism_metadata_flag = 0; ivas_ism_reset_metadata( st_ivas->hIsmMetaData[ch] ); + +#ifdef DISCRETE_ISM_DTX_CNG + st_ivas->hIsmMetaData[ch]->last_azimuth = 0.0f; + st_ivas->hIsmMetaData[ch]->last_elevation = 0.0f; +#endif } if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, n_ISms, NULL, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) @@ -787,3 +957,507 @@ ivas_error ivas_ism_metadata_enc_create( return IVAS_ERR_OK; } + + +#ifdef TD5 +/*------------------------------------------------------------------------- + * encode_radius() + * + * Radius index encoding + *-------------------------------------------------------------------------*/ + +static void encode_radius( + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + int16_t *last_radius_idx, /* i/o: last radius index */ + int16_t *radius_diff_cnt, /* i/o: radius diff coding counter */ + const int16_t last_ism_metadata_flag, /* last frame ism_metadata_flag */ + const int16_t idx_radius_abs, /* i : Azimuth index */ + int16_t *flag_abs_radius /* o : Radius encoding mode */ +) +{ + int16_t idx_radius, nbits_diff_radius, diff; + + idx_radius = idx_radius_abs; + nbits_diff_radius = 0; + *flag_abs_radius = 0; /* differential coding by default */ + + if ( *radius_diff_cnt == ISM_FEC_MAX /* make differential encoding in ISM_FEC_MAX consecutive frames at maximum (in order to control the decoding in FEC) */ + || last_ism_metadata_flag == 0 /* If last frame had no metadata coded, do not use differential coding */ + ) + { + *flag_abs_radius = 1; + } + + diff = idx_radius_abs - *last_radius_idx; + + /* try differential coding */ + if ( *flag_abs_radius == 0 ) + { + if ( diff == 0 ) + { + idx_radius = 0; + nbits_diff_radius = 1; + } + else if ( ABSVAL( diff ) <= ISM_MAX_RADIUS_DIFF_IDX ) + { + idx_radius = 1 << 1; + nbits_diff_radius = 1; + + if ( diff < 0 ) + { + idx_radius += 1; /* negative sign */ + diff *= -1; + } + else + { + idx_radius += 0; /* positive sign */ + } + + idx_radius = idx_radius << diff; + nbits_diff_radius++; + + /* unary coding of "diff */ + idx_radius += ( ( 1 << diff ) - 1 ); + nbits_diff_radius += diff; + + if ( nbits_diff_radius < ISM_RADIUS_NBITS ) + { + /* add stop bit */ + idx_radius = idx_radius << 1; + nbits_diff_radius++; + } + } + else + { + *flag_abs_radius = 1; + } + } + + /* update counter */ + if ( *flag_abs_radius == 0 ) + { + ( *radius_diff_cnt )++; + *radius_diff_cnt = min( *radius_diff_cnt, ISM_FEC_MAX ); + } + else + { + *radius_diff_cnt = 0; + } + + /* Write radius */ + push_indice( hBstr, IND_ISM_RADIUS_DIFF_FLAG, *flag_abs_radius, 1 ); + + if ( *flag_abs_radius ) + { + push_indice( hBstr, IND_ISM_RADIUS, idx_radius, ISM_RADIUS_NBITS ); + } + else + { + push_indice( hBstr, IND_ISM_RADIUS, idx_radius, nbits_diff_radius ); + } + + /* Updates */ + *last_radius_idx = idx_radius_abs; + + return; +} + + +/*----------------------------------------------------------------* + * encode_angle_indices() + * + * Encoding of an angle + *----------------------------------------------------------------*/ + +static void encode_angle_indices( + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + ISM_METADATA_ANGLE_HANDLE angle, /* i/o: angle handle */ + const int16_t last_ism_metadata_flag, /* i : last frame ism_metadata_flag */ + const int16_t ini_frame, /* i : initialization frames counter */ + const int16_t idx_azimuth_abs, /* i : Azimuth index */ + const int16_t idx_elevation_abs, /* i : Elevation index */ + int16_t *flag_abs_azimuth, /* o : Azimuth encoding mode */ + int16_t *flag_abs_elevation /* o : Elevation encoding mode */ +) +{ + int16_t idx_azimuth, nbits_diff_azimuth, diff; + int16_t idx_elevation, nbits_diff_elevation; + + /*----------------------------------------------------------------* + * Azimuth index encoding + *----------------------------------------------------------------*/ + + idx_azimuth = idx_azimuth_abs; + + nbits_diff_azimuth = 0; + + *flag_abs_azimuth = 0; /* differential coding by default */ + if ( angle->azimuth_diff_cnt == ISM_FEC_MAX /* make differential encoding in ISM_FEC_MAX consecutive frames at maximum (in order to control the decoding in FEC) */ + || last_ism_metadata_flag == 0 /* If last frame had no metadata coded, do not use differential coding */ + ) + { + *flag_abs_azimuth = 1; + } + + /* try differential coding */ + if ( *flag_abs_azimuth == 0 ) + { + diff = idx_azimuth_abs - angle->last_azimuth_idx; + + /* azimuth is on a circle - check for diff coding for -180° -> 180° and vice versa changes */ + if ( abs( diff ) > ( ( 1 << ISM_AZIMUTH_NBITS ) - 1 ) - ISM_MAX_AZIMUTH_DIFF_IDX ) + { + if ( diff > 0 ) + { + diff -= ( 1 << ISM_AZIMUTH_NBITS ) - 1; + } + else + { + diff += ( 1 << ISM_AZIMUTH_NBITS ) - 1; + } + } + + if ( diff == 0 ) + { + idx_azimuth = 0; + nbits_diff_azimuth = 1; + } + else if ( ABSVAL( diff ) < ISM_MAX_AZIMUTH_DIFF_IDX ) /* when diff bits >= abs bits, prefer abs */ + { + idx_azimuth = 1 << 1; + nbits_diff_azimuth = 1; + + if ( diff < 0 ) + { + idx_azimuth += 1; /* negative sign */ + diff *= -1; + } + else + { + idx_azimuth += 0; /* positive sign */ + } + + idx_azimuth = idx_azimuth << diff; + nbits_diff_azimuth++; + + /* unary coding of "diff */ + idx_azimuth += ( ( 1 << diff ) - 1 ); + nbits_diff_azimuth += diff; + + if ( nbits_diff_azimuth < ISM_AZIMUTH_NBITS - 1 ) + { + /* add stop bit - only for codewords shorter than ISM_AZIMUTH_NBITS */ + idx_azimuth = idx_azimuth << 1; + nbits_diff_azimuth++; + } + } + else + { + *flag_abs_azimuth = 1; + } + } + + /* update counter */ + if ( *flag_abs_azimuth == 0 ) + { + angle->azimuth_diff_cnt++; + angle->elevation_diff_cnt = min( angle->elevation_diff_cnt, ISM_FEC_MAX ); + } + else + { + angle->azimuth_diff_cnt = 0; + } + + /* Write azimuth */ + push_indice( hBstr, IND_ISM_AZIMUTH_DIFF_FLAG, *flag_abs_azimuth, 1 ); + + if ( *flag_abs_azimuth ) + { + push_indice( hBstr, IND_ISM_AZIMUTH, idx_azimuth, ISM_AZIMUTH_NBITS ); + } + else + { + push_indice( hBstr, IND_ISM_AZIMUTH, idx_azimuth, nbits_diff_azimuth ); + } + + /*----------------------------------------------------------------* + * Elevation index encoding + *----------------------------------------------------------------*/ + + idx_elevation = idx_elevation_abs; + nbits_diff_elevation = 0; + *flag_abs_elevation = 0; /* differential coding by default */ + if ( angle->elevation_diff_cnt == ISM_FEC_MAX /* make differential encoding in ISM_FEC_MAX consecutive frames at maximum (in order to control the decoding in FEC) */ + || last_ism_metadata_flag == 0 /* If last frame had no metadata coded, do not use differential coding */ + ) + { + *flag_abs_elevation = 1; + } + + /* note: elevation is coded starting from the second frame only (it is meaningless in the init_frame) */ + if ( ini_frame == 0 ) + { + *flag_abs_elevation = 1; + angle->last_elevation_idx = idx_elevation_abs; + } + + diff = idx_elevation_abs - angle->last_elevation_idx; + + /* avoid absolute coding of elevation if absolute coding was already used for azimuth */ + if ( *flag_abs_azimuth == 1 ) + { + int16_t diff_orig = diff; + + *flag_abs_elevation = 0; + + + if ( diff >= 0 ) + { + diff = min( diff, ISM_MAX_ELEVATION_DIFF_IDX ); + } + else + { + diff = -1 * min( -diff, ISM_MAX_ELEVATION_DIFF_IDX ); + } + + if ( last_ism_metadata_flag == 0 || abs( diff_orig - diff ) > ISM_MAX_ELEVATION_DIFF_IDX ) + { + angle->elevation_diff_cnt = ISM_FEC_MAX - 1; + } + } + + /* try differential coding */ + if ( *flag_abs_elevation == 0 ) + { + if ( diff == 0 ) + { + idx_elevation = 0; + nbits_diff_elevation = 1; + } + else if ( ABSVAL( diff ) <= ISM_MAX_ELEVATION_DIFF_IDX ) + { + idx_elevation = 1 << 1; + nbits_diff_elevation = 1; + + if ( diff < 0 ) + { + idx_elevation += 1; /* negative sign */ + diff *= -1; + } + else + { + idx_elevation += 0; /* positive sign */ + } + + idx_elevation = idx_elevation << diff; + nbits_diff_elevation++; + + /* unary coding of "diff */ + idx_elevation += ( ( 1 << diff ) - 1 ); + nbits_diff_elevation += diff; + + if ( nbits_diff_elevation < ISM_ELEVATION_NBITS ) + { + /* add stop bit */ + idx_elevation = idx_elevation << 1; + nbits_diff_elevation++; + } + } + else + { + *flag_abs_elevation = 1; + } + } + + /* update counter */ + if ( *flag_abs_elevation == 0 ) + { + angle->elevation_diff_cnt++; + angle->elevation_diff_cnt = min( angle->elevation_diff_cnt, ISM_FEC_MAX ); + } + else + { + angle->elevation_diff_cnt = 0; + } + + /* Write elevation */ + if ( *flag_abs_azimuth == 0 ) /* do not write "flag_abs_elevation" if "flag_abs_azimuth == 1" */ + { + push_indice( hBstr, IND_ISM_ELEVATION_DIFF_FLAG, *flag_abs_elevation, 1 ); + } + + if ( *flag_abs_elevation ) + { + push_indice( hBstr, IND_ISM_ELEVATION, idx_elevation, ISM_ELEVATION_NBITS ); + } + else + { + push_indice( hBstr, IND_ISM_ELEVATION, idx_elevation, nbits_diff_elevation ); + } + + /*----------------------------------------------------------------* + * Updates + *----------------------------------------------------------------*/ + + angle->last_azimuth_idx = idx_azimuth_abs; + angle->last_elevation_idx = idx_elevation_abs; + + return; +} +#endif + + +#ifdef DISCRETE_ISM_DTX_CNG +/*-------------------------------------------------------------------* + * ivas_ism_metadata_sid_enc() + * + * Quantize and encode ISM metadata in SID frame + *-------------------------------------------------------------------*/ + +void ivas_ism_metadata_sid_enc( + ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ + const int16_t flag_noisy_speech, /* i : noisy speech flag */ + const int16_t nchan_ism, /* i : number of objects */ + const int16_t nchan_transport, /* i : number of transport channels */ + const ISM_MODE ism_mode, /* i : ISM mode */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + const int16_t sid_flag, /* i : indication of SID frame */ + const int16_t md_diff_flag[], /* i : metadata differental flag */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + int16_t nb_bits_metadata[] /* o : number of metadata bits */ +) +{ + int16_t i, ch, nBits, nBits_start, nBits_unused; + float q_step, q_step_border; + int16_t idx, idx_azimuth, idx_elevation; + int16_t nBits_azimuth, nBits_elevation, nBits_coh, nBits_sce_id; + float valQ; + ISM_METADATA_HANDLE hIsmMetaData; + + if ( sid_flag ) + { + nBits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC; + nBits -= SID_FORMAT_NBITS; + nBits_start = hBstr->nb_bits_tot; + + /*----------------------------------------------------------------* + * Write ISm common signaling + *----------------------------------------------------------------*/ + + /* write number of objects - unary coding */ + for ( ch = 1; ch < nchan_ism; ch++ ) + { + push_indice( hBstr, IND_ISM_NUM_OBJECTS, 1, 1 ); + } + push_indice( hBstr, IND_ISM_NUM_OBJECTS, 0, 1 ); + + /* write SID metadata flag (one per object) */ + for ( ch = 0; ch < nchan_ism; ch++ ) + { + push_indice( hBstr, IND_ISM_METADATA_FLAG, md_diff_flag[ch], 1 ); + } + + /*----------------------------------------------------------------* + * Set quantization bits based on the number of coded objects + *----------------------------------------------------------------*/ + + ivas_get_ism_sid_quan_bitbudget( nchan_ism, &nBits_azimuth, &nBits_elevation, &q_step, &q_step_border, &nBits_coh, &nBits_sce_id ); + + /*----------------------------------------------------------------* + * Spatial parameters, loop over TCs - 1 + *----------------------------------------------------------------*/ + + /* write ISM mode flag to explicitly signal number of spatial parameters */ + if ( nchan_ism > 2 ) + { + if ( ism_mode == ISM_MODE_DISC ) + { + push_indice( hBstr, IND_ISM_VAD_FLAG, 0, 1 ); + } + else + { + push_indice( hBstr, IND_ISM_VAD_FLAG, 1, 1 ); + } + + if ( ism_mode == ISM_MODE_PARAM ) + { + /* write noisy speech flag */ + push_indice( hBstr, IND_ISM_NOISY_SPEECH_FLAG, flag_noisy_speech, 1 ); + nBits_sce_id = 1; + } + } + + if ( nchan_transport > 1 ) + { + /* write sce id */ + push_indice( hBstr, IND_ISM_SCE_ID_DTX, hISMDTX->sce_id_dtx, nBits_sce_id ); + + /* quantize and write coherence */ + for ( ch = 0; ch < nchan_transport; ch++ ) + { + if ( ch == hISMDTX->sce_id_dtx ) + { + continue; + } + + idx = (int16_t) ( hISMDTX->coh[ch] * ( ( 1 << nBits_coh ) - 1 ) + 0.5f ); + assert( ( idx >= 0 ) && ( idx <= ( ( 1 << nBits_coh ) - 1 ) ) ); + push_indice( hBstr, IND_ISM_DTX_COH_SCA, idx, nBits_coh ); + } + } + + /*----------------------------------------------------------------* + * Metadata quantization and coding, loop over all objects + *----------------------------------------------------------------*/ + + for ( ch = 0; ch < nchan_ism; ch++ ) + { + if ( md_diff_flag[ch] == 1 ) + { + hIsmMetaData = hIsmMeta[ch]; + + idx_azimuth = ism_quant_meta( hIsmMetaData->azimuth, &valQ, ism_azimuth_borders, q_step, q_step_border, 1 << nBits_azimuth ); + idx_elevation = ism_quant_meta( hIsmMetaData->elevation, &valQ, ism_elevation_borders, q_step, q_step_border, 1 << nBits_elevation ); + + push_indice( hBstr, IND_ISM_AZIMUTH, idx_azimuth, nBits_azimuth ); + push_indice( hBstr, IND_ISM_ELEVATION, idx_elevation, nBits_elevation ); + + /* update last indexes to correspond to active frames coding */ + if ( nBits_azimuth > ISM_AZIMUTH_NBITS ) + { +#ifdef TD5 + hIsmMetaData->angle[0].last_azimuth_idx = idx_azimuth >> ( nBits_azimuth - ISM_AZIMUTH_NBITS ); + hIsmMetaData->angle[0].last_elevation_idx = idx_elevation >> ( nBits_elevation - ISM_ELEVATION_NBITS ); +#else + hIsmMetaData->last_azimuth_idx = idx_azimuth >> ( nBits_azimuth - ISM_AZIMUTH_NBITS ); + hIsmMetaData->last_elevation_idx = idx_elevation >> ( nBits_elevation - ISM_ELEVATION_NBITS ); +#endif + } + else + { +#ifdef TD5 + hIsmMetaData->angle[0].last_azimuth_idx = idx_azimuth << ( ISM_AZIMUTH_NBITS - nBits_azimuth ); + hIsmMetaData->angle[0].last_elevation_idx = idx_elevation << ( ISM_ELEVATION_NBITS - nBits_elevation ); +#else + hIsmMetaData->last_azimuth_idx = idx_azimuth << ( ISM_AZIMUTH_NBITS - nBits_azimuth ); + hIsmMetaData->last_elevation_idx = idx_elevation << ( ISM_ELEVATION_NBITS - nBits_elevation ); +#endif + } + } + } + + /* Write unused (padding) bits */ + nBits_unused = nBits - hBstr->nb_bits_tot; + while ( nBits_unused > 0 ) + { + i = min( nBits_unused, 16 ); + push_indice( hBstr, IND_UNUSED, 0, i ); + nBits_unused -= i; + } + + nb_bits_metadata[0] = hBstr->nb_bits_tot - nBits_start; + } + + return; +} +#endif diff --git a/lib_enc/ivas_ism_param_enc.c b/lib_enc/ivas_ism_param_enc.c index ef66df5a90..63c1fcea81 100644 --- a/lib_enc/ivas_ism_param_enc.c +++ b/lib_enc/ivas_ism_param_enc.c @@ -47,16 +47,27 @@ static void ivas_param_ism_compute_obj_parameters( +#ifdef NCHAN_ISM_PARAMETER + const int16_t nchan_ism, /* i : number of ISM channels */ +#endif float reference_power_obj[MAX_NUM_OBJECTS][PARAM_ISM_MDFT_NO_SLOTS][DIRAC_NO_FB_BANDS_MAX], /* i : Reference power */ PARAM_ISM_CONFIG_HANDLE hParamIsm /* i/o: Param ISM Enc Handle */ ) { +#ifdef NCHAN_ISM_PARAMETER + int16_t i, b, m, br, mr; +#else int16_t i, b, m, br, mr, num_obj; +#endif int16_t brange_start, brange_end, mrange_start, mrange_end, time_merge_fac; float power_ratios_m[MAX_PARAM_ISM_NBANDS][MAX_PARAM_ISM_NBLOCKS]; +#ifdef NCHAN_ISM_PARAMETER + assert( nchan_ism == 3 || nchan_ism == 4 ); +#else num_obj = hParamIsm->num_obj; assert( num_obj == 3 || num_obj == 4 ); +#endif for ( b = 0; b < hParamIsm->nbands; b++ ) { @@ -81,7 +92,11 @@ static void ivas_param_ism_compute_obj_parameters( /* for each object, sum up reference power within current T/F tile */ +#ifdef NCHAN_ISM_PARAMETER + for ( i = 0; i < nchan_ism; i++ ) +#else for ( i = 0; i < num_obj; i++ ) +#endif { for ( mr = mrange_start; mr < mrange_end; mr++ ) { @@ -103,7 +118,12 @@ static void ivas_param_ism_compute_obj_parameters( index_1 = 1; index_2 = 0; } - for ( i = 2; i < num_obj; i++ ) + +#ifdef NCHAN_ISM_PARAMETER + for ( i = MAX_PARAM_ISM_WAVE; i < nchan_ism; i++ ) +#else + for ( i = MAX_PARAM_ISM_WAVE; i < num_obj; i++ ) +#endif { if ( ref_power_local[i] > ref_power_local[index_1] ) { @@ -149,23 +169,36 @@ static void ivas_param_ism_compute_obj_parameters( static void ivas_param_ism_enc_quantize_DOA( +#ifdef NCHAN_ISM_PARAMETER + const int16_t nchan_ism, /* i : number of ISM channels */ +#endif ISM_METADATA_HANDLE hIsmMetaData[MAX_NUM_OBJECTS], /* i : ISM metadata */ PARAM_ISM_CONFIG_HANDLE hParamIsm /* i/o: Param ISM encoder handle */ ) { +#ifdef NCHAN_ISM_PARAMETER + int16_t i, azi_idx, ele_idx; +#else int16_t i, azi_idx, ele_idx, num_obj; +#endif float valQ; +#ifndef NCHAN_ISM_PARAMETER num_obj = hParamIsm->num_obj; +#endif /* Loop over objects */ +#ifdef NCHAN_ISM_PARAMETER + for ( i = 0; i < nchan_ism; i++ ) +#else for ( i = 0; i < num_obj; i++ ) +#endif { /* Quantize the elevation and obtain quantized elevation value and index */ - ele_idx = ism_quant_meta( hIsmMetaData[i]->elevation, &valQ, ism_elevation_borders, 1 << ISM_ELEVATION_NBITS ); + ele_idx = ism_quant_meta( hIsmMetaData[i]->elevation, &valQ, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); /* Obtain the index of quantized azimuth values */ - azi_idx = ism_quant_meta( hIsmMetaData[i]->azimuth, &valQ, ism_azimuth_borders, 1 << ISM_AZIMUTH_NBITS ); + azi_idx = ism_quant_meta( hIsmMetaData[i]->azimuth, &valQ, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); /*Replace azimuth with quantized values */ hIsmMetaData[i]->azimuth = valQ; @@ -191,7 +224,11 @@ void ivas_param_ism_stereo_dmx( const int16_t input_frame /* i : Length of input frame */ ) { +#ifdef NCHAN_ISM_PARAMETER + int16_t i, j; +#else int16_t i, j, num_obj; +#endif float alpha, azi_shift, tmp, tmp_1; float cardioid_left[MAX_NUM_OBJECTS], cardioid_right[MAX_NUM_OBJECTS]; float stereo_dmx[2][L_FRAME48k]; @@ -202,14 +239,20 @@ void ivas_param_ism_stereo_dmx( /*Initialization*/ alpha = 0.5; azi_shift = 0; +#ifndef NCHAN_ISM_PARAMETER num_obj = st_ivas->hDirAC->hParamIsm->num_obj; +#endif /* Set the stereo dmx to zero */ set_zero( stereo_dmx[0], L_FRAME48k ); set_zero( stereo_dmx[1], L_FRAME48k ); /* Loop over all objects */ +#ifdef NCHAN_ISM_PARAMETER + for ( i = 0; i < st_ivas->hEncoderConfig->nchan_ism; i++ ) +#else for ( i = 0; i < num_obj; i++ ) +#endif { hIsmMetaData = st_ivas->hIsmMetaData[i]; @@ -271,8 +314,10 @@ ivas_error ivas_param_ism_enc_open( input_Fs = st_ivas->hEncoderConfig->input_Fs; +#ifndef NCHAN_ISM_PARAMETER /* Assign the number of objects */ hDirAC->hParamIsm->num_obj = st_ivas->hEncoderConfig->nchan_inp; +#endif /* set FB config. */ if ( ( error = ivas_fb_set_cfg( &fb_cfg, ISM_FORMAT, SBA_MODE_NONE, st_ivas->hEncoderConfig->nchan_inp, 0, 0, input_Fs ) ) != IVAS_ERR_OK ) @@ -281,16 +326,16 @@ ivas_error ivas_param_ism_enc_open( } /* Allocate and initialize FB mixer handle */ -#ifdef SBA_BR_SWITCHING_CLEAN_UP if ( ( error = ivas_FB_mixer_open( &( hDirAC->hFbMixer ), input_Fs, fb_cfg, 0 ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_FB_mixer_open( &( hDirAC->hFbMixer ), input_Fs, fb_cfg ) ) != IVAS_ERR_OK ) -#endif { return error; } +#ifdef NCHAN_ISM_PARAMETER + ivas_param_ism_config( hDirAC->hParamIsm, st_ivas->hEncoderConfig->nchan_inp ); +#else ivas_param_ism_config( hDirAC->hParamIsm ); +#endif /* Assign memories for Band and Block grouping */ hDirAC->hParamIsm->nbands = MAX_PARAM_ISM_NBANDS; @@ -316,27 +361,29 @@ ivas_error ivas_param_ism_enc_open( /*-------------------------------------------------------------------------* * ivas_param_ism_enc_close() * - * Close Param ISM handle + * Close Param ISM encoder handle *-------------------------------------------------------------------------*/ void ivas_param_ism_enc_close( - DIRAC_ENC_HANDLE hDirAC, /* i/o: encoder DirAC handle */ - const int32_t input_Fs /* i : input sampling_rate */ + DIRAC_ENC_HANDLE *hDirAC, /* i/o: encoder DirAC handle */ + const int32_t input_Fs /* i : input sampling_rate */ ) { -#ifdef SBA_BR_SWITCHING_CLEAN_UP - ivas_FB_mixer_close( &hDirAC->hFbMixer, input_Fs, 0 ); -#else - ivas_FB_mixer_close( &hDirAC->hFbMixer, input_Fs ); -#endif + if ( hDirAC == NULL || *hDirAC == NULL ) + { + return; + } - if ( hDirAC->hParamIsm != NULL ) + ivas_FB_mixer_close( &( *hDirAC )->hFbMixer, input_Fs, 0 ); + + if ( ( *hDirAC )->hParamIsm != NULL ) { - free( hDirAC->hParamIsm ); - hDirAC->hParamIsm = NULL; + free( ( *hDirAC )->hParamIsm ); + ( *hDirAC )->hParamIsm = NULL; } - free( hDirAC ); + free( ( *hDirAC ) ); + ( *hDirAC ) = NULL; return; } @@ -355,6 +402,9 @@ void ivas_param_ism_enc( ) { int16_t i, j, ts, l_ts; +#ifdef NCHAN_ISM_PARAMETER + int16_t nchan_ism; +#endif int16_t num_time_slots; float *pcm_in[MAX_NUM_OBJECTS]; float fb_RealBuffer[MAX_NUM_OBJECTS][DIRAC_NO_FB_BANDS_MAX]; @@ -365,6 +415,9 @@ void ivas_param_ism_enc( DIRAC_ENC_HANDLE hDirAC; PARAM_ISM_CONFIG_HANDLE hParamIsm; +#ifdef NCHAN_ISM_PARAMETER + nchan_ism = st_ivas->hEncoderConfig->nchan_ism; +#endif hDirAC = st_ivas->hDirAC; hParamIsm = hDirAC->hParamIsm; @@ -373,7 +426,11 @@ void ivas_param_ism_enc( l_ts = input_frame / PARAM_ISM_MDFT_NO_SLOTS; num_time_slots = PARAM_ISM_MDFT_NO_SLOTS; +#ifdef NCHAN_ISM_PARAMETER + for ( i = 0; i < nchan_ism; i++ ) +#else for ( i = 0; i < hParamIsm->num_obj; i++ ) +#endif { pcm_in[i] = &data[i][0]; @@ -382,12 +439,18 @@ void ivas_param_ism_enc( p_fb_RealBuffer[i] = &fb_RealBuffer[i][0]; p_fb_ImagBuffer[i] = &fb_ImagBuffer[i][0]; } + for ( ts = 0; ts < num_time_slots; ts++ ) { ivas_fb_mixer_get_windowed_fr( hDirAC->hFbMixer, pcm_in, p_fb_RealBuffer, p_fb_ImagBuffer, l_ts, l_ts ); + ivas_fb_mixer_update_prior_input( hDirAC->hFbMixer, pcm_in, l_ts ); +#ifdef NCHAN_ISM_PARAMETER + for ( i = 0; i < nchan_ism; i++ ) +#else for ( i = 0; i < hParamIsm->num_obj; i++ ) +#endif { pcm_in[i] += l_ts; for ( j = 0; j < DIRAC_NO_FB_BANDS_MAX; j++ ) @@ -396,18 +459,27 @@ void ivas_param_ism_enc( } } } + /* Quantize DOAs */ +#ifdef NCHAN_ISM_PARAMETER + ivas_param_ism_enc_quantize_DOA( nchan_ism, st_ivas->hIsmMetaData, hParamIsm ); +#else ivas_param_ism_enc_quantize_DOA( st_ivas->hIsmMetaData, hParamIsm ); +#endif /* Compute object indices and power ratios */ +#ifdef NCHAN_ISM_PARAMETER + ivas_param_ism_compute_obj_parameters( nchan_ism, reference_power_obj, hParamIsm ); +#else ivas_param_ism_compute_obj_parameters( reference_power_obj, hParamIsm ); +#endif pop_wmops(); return; } -#ifdef PARAM_ISM_DTX_CNG +#ifndef DISCRETE_ISM_DTX_CNG static void ivas_param_ism_enc_quantize_DOA_dtx( float azimuth, float elevation, @@ -474,10 +546,14 @@ static void ivas_param_ism_enc_quantize_DOA_dtx( *-------------------------------------------------------------------------*/ void ivas_param_ism_metadata_dtx_enc( - BSTR_ENC_HANDLE hBstr, /* i/o : bitstream handle */ - ISM_METADATA_HANDLE hIsmMeta[], /* i : ISM metadata handles */ - ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ - PARAM_ISM_CONFIG_HANDLE hParamIsm /* i : Param ISM Enc Handle */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + ISM_METADATA_HANDLE hIsmMeta[], /* i : ISM metadata handles */ + ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ + PARAM_ISM_CONFIG_HANDLE hParamIsm /* i : Param ISM Enc Handle */ +#ifdef NCHAN_ISM_PARAMETER + , + const int16_t nchan_ism /* i : number of ISM channels */ +#endif ) { int16_t i, nBits, nBits_unused; @@ -489,7 +565,11 @@ void ivas_param_ism_metadata_dtx_enc( /* Transmit the metadata */ /* write number of objects - unary coding */ +#ifdef NCHAN_ISM_PARAMETER + for ( i = 0; i < nchan_ism; i++ ) +#else for ( i = 1; i < hParamIsm->num_obj; i++ ) +#endif { push_indice( hBstr, IND_ISM_NUM_OBJECTS, 1, 1 ); } @@ -506,7 +586,11 @@ void ivas_param_ism_metadata_dtx_enc( assert( ( coh_idx >= 0 ) && ( coh_idx <= ( ( 1 << PARAM_ISM_DTX_COH_SCA_BITS ) - 1 ) ) ); push_indice( hBstr, IND_ISM_DTX_COH_SCA, coh_idx, PARAM_ISM_DTX_COH_SCA_BITS ); +#ifdef NCHAN_ISM_PARAMETER + for ( i = 0; i < nchan_ism; i++ ) +#else for ( i = 0; i < hParamIsm->num_obj; i++ ) +#endif { ivas_param_ism_enc_quantize_DOA_dtx( hIsmMeta[i]->azimuth, hIsmMeta[i]->elevation, PARAM_ISM_DTX_AZI_BITS, PARAM_ISM_DTX_ELE_BITS, &azi_idx, &ele_idx ); push_indice( hBstr, IND_ISM_AZIMUTH, azi_idx, PARAM_ISM_DTX_AZI_BITS ); @@ -532,7 +616,7 @@ void ivas_param_ism_metadata_dtx_enc( return; } - +#endif /*-------------------------------------------------------------------* * ivas_param_ism_compute_noisy_speech_flag() @@ -580,4 +664,3 @@ void ivas_param_ism_compute_noisy_speech_flag( return; } -#endif diff --git a/lib_enc/ivas_lfe_enc.c b/lib_enc/ivas_lfe_enc.c index fe2e0d3c02..a14424774f 100644 --- a/lib_enc/ivas_lfe_enc.c +++ b/lib_enc/ivas_lfe_enc.c @@ -98,11 +98,7 @@ static void ivas_lfe_enc_quant( BSTR_ENC_HANDLE hBstr ) { int16_t bits_written; -#ifdef IND_LIST_DYN - int16_t nb_ind_tot; -#else int16_t next_ind_pos; -#endif uint16_t quant_strategy, write_bit; int16_t num_quant_strategies; int16_t shift_bits; @@ -121,11 +117,7 @@ static void ivas_lfe_enc_quant( num_quant_strategies = IVAS_MAX_NUM_QUANT_STRATS; shift_bits = IVAS_LFE_SHIFT_BITS; bits_written = hBstr->nb_bits_tot; -#ifdef IND_LIST_DYN - nb_ind_tot = hBstr->nb_ind_tot; -#else next_ind_pos = hBstr->next_ind; -#endif for ( quant_strategy = 0; quant_strategy < num_quant_strategies; quant_strategy++ ) @@ -251,11 +243,7 @@ static void ivas_lfe_enc_quant( } bits_written_arith_enc = hBstr->nb_bits_tot; -#ifdef IND_LIST_DYN - next_ind_pos_arith_enc = hBstr->nb_ind_tot; -#else next_ind_pos_arith_enc = hBstr->next_ind; -#endif push_next_indice( hBstr, coding_strategy, 1 ); base2_num_bits_tot = hBstr->nb_bits_tot - bits_written; @@ -271,24 +259,13 @@ static void ivas_lfe_enc_quant( { if ( quant_strategy == ( num_quant_strategies - 1 ) || ( ( target_bits + IVAS_LFE_ID_BITS ) >= base2_num_bits_tot ) ) { -#ifdef IND_LIST_DYN - /* reset bits buffer and code the indices with base 2 coding */ - for ( j = hBstr->nb_ind_tot - 1; j >= next_ind_pos_arith_enc; j-- ) - { - hBstr->ind_list[j].nb_bits = -1; - } - hBstr->nb_ind_tot = next_ind_pos_arith_enc; -#else /* reset bits buffer and code the indices with base 2 coding */ for ( j = hBstr->next_ind - 1; j >= next_ind_pos_arith_enc; j-- ) { hBstr->ind_list[j].nb_bits = -1; } -#endif hBstr->nb_bits_tot = bits_written_arith_enc; -#ifndef IND_LIST_DYN hBstr->next_ind = next_ind_pos_arith_enc; -#endif coding_strategy = 1; push_next_indice( hBstr, coding_strategy, 1 ); @@ -321,21 +298,13 @@ static void ivas_lfe_enc_quant( if ( quant_strategy < ( num_quant_strategies - 1 ) ) { /* reset all indices that were already written - TODO: maybe better store them temporarily first and write at the very end? */ -#ifdef IND_LIST_DYN - for ( j = hBstr->nb_ind_tot - 1; j >= nb_ind_tot; j-- ) -#else for ( j = hBstr->next_ind - 1; j >= next_ind_pos; j-- ) -#endif { hBstr->ind_list[j].nb_bits = -1; } hBstr->nb_bits_tot = bits_written; -#ifdef IND_LIST_DYN - hBstr->nb_ind_tot = nb_ind_tot; -#else hBstr->next_ind = next_ind_pos; -#endif } } } @@ -491,21 +460,27 @@ ivas_error ivas_create_lfe_enc( *-------------------------------------------------------------------------*/ void ivas_lfe_enc_close( - LFE_ENC_HANDLE hLFE /* i/o: LFE encoder handle */ + LFE_ENC_HANDLE *hLFE /* i/o: LFE encoder handle */ ) { - if ( hLFE->old_wtda_audio != NULL ) + if ( hLFE == NULL || *hLFE == NULL ) + { + return; + } + + if ( ( *hLFE )->old_wtda_audio != NULL ) { - free( hLFE->old_wtda_audio ); - hLFE->old_wtda_audio = NULL; + free( ( *hLFE )->old_wtda_audio ); + ( *hLFE )->old_wtda_audio = NULL; } - if ( hLFE->pWindow_state ) + if ( ( *hLFE )->pWindow_state ) { - free( hLFE->pWindow_state ); - hLFE->pWindow_state = NULL; + free( ( *hLFE )->pWindow_state ); + ( *hLFE )->pWindow_state = NULL; } - free( hLFE ); + free( ( *hLFE ) ); + ( *hLFE ) = NULL; return; } diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index eb685cd0bc..337753925c 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -149,7 +149,7 @@ ivas_error ivas_masa_enc_open( *-----------------------------------------------------------------------*/ void ivas_masa_enc_close( - MASA_ENCODER_HANDLE hMasa /* i/o: MASA metadata structure */ + MASA_ENCODER_HANDLE *hMasa /* i/o: MASA metadata structure */ #ifndef FIX_350_MASA_DELAY_COMP , const int16_t nchan_transport, /* i : Number of transport channels */ @@ -159,9 +159,14 @@ void ivas_masa_enc_close( { int16_t i; - for ( i = 0; i < hMasa->data.num_Cldfb_instances; i++ ) + if ( hMasa == NULL || *hMasa == NULL ) + { + return; + } + + for ( i = 0; i < ( *hMasa )->data.num_Cldfb_instances; i++ ) { - deleteCldfb( &( hMasa->data.cldfbAnaEnc[i] ) ); + deleteCldfb( &( ( *hMasa )->data.cldfbAnaEnc[i] ) ); } #ifndef FIX_350_MASA_DELAY_COMP @@ -169,13 +174,14 @@ void ivas_masa_enc_close( { for ( i = 0; i < nchan_transport; i++ ) { - free( hMasa->data.delay_buffer[i] ); - hMasa->data.delay_buffer[i] = NULL; + free( ( *hMasa )->data.delay_buffer[i] ); + ( *hMasa )->data.delay_buffer[i] = NULL; } } #endif - free( hMasa ); + free( ( *hMasa ) ); + ( *hMasa ) = NULL; return; } @@ -589,7 +595,11 @@ ivas_error ivas_masa_enc_config( ivas_set_qmetadata_maxbit_req( hQMetaData, ivas_format ); +#ifdef FIX_373_MASA_DELAY_COMP_MSAN + masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, hQMetaData, st_ivas->hEncoderConfig->input_Fs, NULL ); +#else masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, hQMetaData, st_ivas->hEncoderConfig->input_Fs ); +#endif /* Transmit stereo signals using a mono downmix at lowest bitrates */ if ( ivas_format == MASA_FORMAT && st_ivas->nCPE == 1 && st_ivas->hCPE[0]->hStereoDft != NULL && st_ivas->hCPE[0]->hStereoDft->hConfig != NULL ) @@ -1698,9 +1708,6 @@ void ivas_masa_enc_reconfigure( int16_t n, tmp; int16_t sce_id, cpe_id; int32_t ivas_total_brate; -#ifdef IND_LIST_DYN - int16_t max_num_indices_metadata; -#endif ivas_total_brate = st_ivas->hEncoderConfig->ivas_total_brate; @@ -1711,21 +1718,6 @@ void ivas_masa_enc_reconfigure( copy_encoder_config( st_ivas, st_ivas->hSCE[sce_id]->hCoreCoder[0], 0 ); st_ivas->hSCE[sce_id]->element_brate = ivas_total_brate / st_ivas->nchan_transport; st_ivas->hSCE[sce_id]->hCoreCoder[0]->total_brate = st_ivas->hSCE[sce_id]->element_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ - -#ifdef IND_LIST_DYN - if ( st_ivas->hSCE[sce_id]->hMetaData != NULL ) - { - /* get the maximum allowed number of indices in the list */ - max_num_indices_metadata = get_max_num_indices_metadata( st_ivas->hEncoderConfig->ivas_format, st_ivas->hEncoderConfig->ivas_total_brate ); - - /* check, if the maximum number of allowed indices has changed */ - if ( max_num_indices_metadata != st_ivas->hSCE[sce_id]->hMetaData->max_num_indices ) - { - /* re-allocate the list of metadata indices */ - ind_list_realloc( st_ivas->hSCE[sce_id]->hMetaData, max_num_indices_metadata ); - } - } -#endif } for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) @@ -1737,21 +1729,6 @@ void ivas_masa_enc_reconfigure( { copy_encoder_config( st_ivas, st_ivas->hCPE[cpe_id]->hCoreCoder[n], 0 ); st_ivas->hCPE[cpe_id]->hCoreCoder[n]->total_brate = st_ivas->hCPE[cpe_id]->element_brate / ( st_ivas->nCPE > 1 ? 1 : CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ - -#ifdef IND_LIST_DYN - if ( st_ivas->hCPE[cpe_id]->hMetaData != NULL ) - { - /* get the maximum allowed number of indices in the list */ - max_num_indices_metadata = get_max_num_indices_metadata( st_ivas->hEncoderConfig->ivas_format, st_ivas->hEncoderConfig->ivas_total_brate ); - - /* check, if the maximum number of allowed indices has changed */ - if ( max_num_indices_metadata != st_ivas->hCPE[cpe_id]->hMetaData->max_num_indices ) - { - /* re-allocate the list of metadata indices */ - ind_list_realloc( st_ivas->hCPE[cpe_id]->hMetaData, max_num_indices_metadata ); - } - } -#endif } if ( ivas_total_brate < MASA_STEREO_MIN_BITRATE ) diff --git a/lib_enc/ivas_mc_param_enc.c b/lib_enc/ivas_mc_param_enc.c index 9b1241f234..db9945d0ce 100644 --- a/lib_enc/ivas_mc_param_enc.c +++ b/lib_enc/ivas_mc_param_enc.c @@ -146,11 +146,7 @@ ivas_error ivas_param_mc_enc_open( } /* Allocate and initialize FB mixer handle */ -#ifdef SBA_BR_SWITCHING_CLEAN_UP if ( ( error = ivas_FB_mixer_open( &( hParamMC->hFbMixer ), input_Fs, fb_cfg, 0 ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_FB_mixer_open( &( hParamMC->hFbMixer ), input_Fs, fb_cfg ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -364,18 +360,20 @@ ivas_error ivas_param_mc_enc_reconfig( *------------------------------------------------------------------------*/ void ivas_param_mc_enc_close( - PARAM_MC_ENC_HANDLE hParamMC, /* i/o: Parametric MC encoder handle */ + PARAM_MC_ENC_HANDLE *hParamMC, /* i/o: Parametric MC encoder handle */ const int32_t sampling_rate ) { - ivas_param_mc_metadata_close( &hParamMC->hMetadataPMC ); + if ( hParamMC == NULL || *hParamMC == NULL ) + { + return; + } -#ifdef SBA_BR_SWITCHING_CLEAN_UP - ivas_FB_mixer_close( &hParamMC->hFbMixer, sampling_rate, 0 ); -#else - ivas_FB_mixer_close( &hParamMC->hFbMixer, sampling_rate ); -#endif + ivas_param_mc_metadata_close( &( *hParamMC )->hMetadataPMC ); + + ivas_FB_mixer_close( &( *hParamMC )->hFbMixer, sampling_rate, 0 ); - free( hParamMC ); + free( ( *hParamMC ) ); + ( *hParamMC ) = NULL; return; } @@ -388,10 +386,10 @@ void ivas_param_mc_enc_close( *------------------------------------------------------------------------*/ void ivas_param_mc_enc( - Encoder_Struct *st_ivas, /* i/o: IVAS Encoder handle */ - BSTR_ENC_HANDLE hMetaData, /* i/o: IVAS Metadata bitstream handle */ - float data_f[][L_FRAME48k], /* i/o: input: CICP6, CICP12, CICP14, CICP16 or CICP19 MC data */ - const int16_t input_frame /* i : input frame length */ + Encoder_Struct *st_ivas, /* i/o: IVAS Encoder handle */ + BSTR_ENC_HANDLE hMetaData, /* i/o: IVAS Metadata bitstream handle */ + float data_f[][L_FRAME48k], /* i/o: input: CICP6, CICP12, CICP14, CICP16 or CICP19 MC data */ + const int16_t input_frame /* i : input frame length */ ) { int16_t k; diff --git a/lib_enc/ivas_mcmasa_enc.c b/lib_enc/ivas_mcmasa_enc.c index 153bc3ecad..866e4e176c 100644 --- a/lib_enc/ivas_mcmasa_enc.c +++ b/lib_enc/ivas_mcmasa_enc.c @@ -194,11 +194,7 @@ ivas_error ivas_mcmasa_enc_open( } /* Allocate and initialize FB mixer handle */ -#ifdef SBA_BR_SWITCHING_CLEAN_UP if ( ( error = ivas_FB_mixer_open( &( hMcMasa->hFbMixer ), input_Fs, fb_cfg, 0 ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_FB_mixer_open( &( hMcMasa->hFbMixer ), input_Fs, fb_cfg ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -228,11 +224,7 @@ ivas_error ivas_mcmasa_enc_open( return error; } -#ifdef SBA_BR_SWITCHING_CLEAN_UP if ( ( error = ivas_FB_mixer_open( &( hMcMasa->hFbMixerLfe ), input_Fs, fb_cfgLfe, 0 ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_FB_mixer_open( &( hMcMasa->hFbMixerLfe ), input_Fs, fb_cfgLfe ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -459,11 +451,11 @@ ivas_error ivas_mcmasa_enc_reconfig( /* brute-force solution: close McMASA and re-instantiate with new settings */ #ifdef FIX_350_MASA_DELAY_COMP - ivas_masa_enc_close( st_ivas->hMasa ); + ivas_masa_enc_close( &( st_ivas->hMasa ) ); #else - ivas_masa_enc_close( st_ivas->hMasa, st_ivas->nchan_transport, st_ivas->hEncoderConfig->ivas_format ); + ivas_masa_enc_close( &( st_ivas->hMasa ), st_ivas->nchan_transport, st_ivas->hEncoderConfig->ivas_format ); #endif - ivas_mcmasa_enc_close( st_ivas->hMcMasa, st_ivas->hEncoderConfig->input_Fs ); + ivas_mcmasa_enc_close( &( st_ivas->hMcMasa ), st_ivas->hEncoderConfig->input_Fs ); /* Determine if to separate some channels from the analysis */ ivas_mcmasa_setNumTransportChannels( &( st_ivas->nchan_transport ), &( st_ivas->hEncoderConfig->element_mode_init ), ivas_total_brate ); @@ -491,36 +483,33 @@ ivas_error ivas_mcmasa_enc_reconfig( *--------------------------------------------------------------------------*/ void ivas_mcmasa_enc_close( - MCMASA_ENC_HANDLE hMcMasa, /* i/o: encoder McMASA handle */ - const int32_t input_Fs /* i : input sampling rate */ + MCMASA_ENC_HANDLE *hMcMasa, /* i/o: encoder McMASA handle */ + const int32_t input_Fs /* i : input sampling rate */ ) { int16_t i, j; - if ( hMcMasa->separateChannelEnabled ) + if ( hMcMasa == NULL || *hMcMasa == NULL ) { - free( hMcMasa->delay_buffer_lfe[0] ); - free( hMcMasa->delay_buffer_lfe[1] ); + return; + } + + if ( ( *hMcMasa )->separateChannelEnabled ) + { + free( ( *hMcMasa )->delay_buffer_lfe[0] ); + free( ( *hMcMasa )->delay_buffer_lfe[1] ); for ( i = 0; i < 2; i++ ) { - free( hMcMasa->lfeAnaRingBuffer[i] ); + free( ( *hMcMasa )->lfeAnaRingBuffer[i] ); } } -#ifdef SBA_BR_SWITCHING_CLEAN_UP - ivas_FB_mixer_close( &hMcMasa->hFbMixer, input_Fs, 0 ); -#else - ivas_FB_mixer_close( &hMcMasa->hFbMixer, input_Fs ); -#endif + ivas_FB_mixer_close( &( *hMcMasa )->hFbMixer, input_Fs, 0 ); - if ( !hMcMasa->separateChannelEnabled ) + if ( !( *hMcMasa )->separateChannelEnabled ) { -#ifdef SBA_BR_SWITCHING_CLEAN_UP - ivas_FB_mixer_close( &hMcMasa->hFbMixerLfe, input_Fs, 0 ); -#else - ivas_FB_mixer_close( &hMcMasa->hFbMixerLfe, input_Fs ); -#endif + ivas_FB_mixer_close( &( *hMcMasa )->hFbMixerLfe, input_Fs, 0 ); } /* intensity 3-dim */ @@ -528,35 +517,36 @@ void ivas_mcmasa_enc_close( { for ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) { - free( hMcMasa->direction_vector_m[i][j] ); - hMcMasa->direction_vector_m[i][j] = NULL; + free( ( *hMcMasa )->direction_vector_m[i][j] ); + ( *hMcMasa )->direction_vector_m[i][j] = NULL; } - for ( j = 0; j < hMcMasa->no_col_avg_diff; j++ ) + for ( j = 0; j < ( *hMcMasa )->no_col_avg_diff; j++ ) { - free( hMcMasa->buffer_intensity_real[i][j] ); - hMcMasa->buffer_intensity_real[i][j] = NULL; + free( ( *hMcMasa )->buffer_intensity_real[i][j] ); + ( *hMcMasa )->buffer_intensity_real[i][j] = NULL; } - free( hMcMasa->buffer_intensity_real[i] ); - hMcMasa->buffer_intensity_real[i] = NULL; + free( ( *hMcMasa )->buffer_intensity_real[i] ); + ( *hMcMasa )->buffer_intensity_real[i] = NULL; - free( hMcMasa->direction_vector_m[i] ); - hMcMasa->direction_vector_m[i] = NULL; + free( ( *hMcMasa )->direction_vector_m[i] ); + ( *hMcMasa )->direction_vector_m[i] = NULL; } - for ( j = 0; j < hMcMasa->no_col_avg_diff; j++ ) + for ( j = 0; j < ( *hMcMasa )->no_col_avg_diff; j++ ) { - free( hMcMasa->buffer_intensity_real_vert[j] ); - hMcMasa->buffer_intensity_real_vert[j] = NULL; + free( ( *hMcMasa )->buffer_intensity_real_vert[j] ); + ( *hMcMasa )->buffer_intensity_real_vert[j] = NULL; } - free( hMcMasa->buffer_intensity_real_vert ); - hMcMasa->buffer_intensity_real_vert = NULL; + free( ( *hMcMasa )->buffer_intensity_real_vert ); + ( *hMcMasa )->buffer_intensity_real_vert = NULL; - free( hMcMasa->buffer_energy ); - hMcMasa->buffer_energy = NULL; + free( ( *hMcMasa )->buffer_energy ); + ( *hMcMasa )->buffer_energy = NULL; - free( hMcMasa ); + free( ( *hMcMasa ) ); + ( *hMcMasa ) = NULL; return; } diff --git a/lib_enc/ivas_mct_enc.c b/lib_enc/ivas_mct_enc.c index 707e74e329..b66a2c5733 100644 --- a/lib_enc/ivas_mct_enc.c +++ b/lib_enc/ivas_mct_enc.c @@ -173,8 +173,7 @@ ivas_error ivas_mct_enc( } /* joint MCT encoding */ - ivas_mct_core_enc( ivas_format, hMCT, st_ivas->hCPE, hMCT->nchan_out_woLFE + hMCT->num_lfe, ivas_total_brate, switch_bw, - ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT ) ? (int16_t) st_ivas->hLFE->lfe_bits : 0, st_ivas->hEncoderConfig->sba_order ); + ivas_mct_core_enc( ivas_format, hMCT, st_ivas->hCPE, hMCT->nchan_out_woLFE + hMCT->num_lfe, ivas_total_brate, switch_bw, ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT ) ? (int16_t) st_ivas->hLFE->lfe_bits : 0, st_ivas->hEncoderConfig->sba_order ); /* Spectrum quantization and coding */ for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) @@ -499,29 +498,35 @@ ivas_error mct_enc_reconfigure( *-------------------------------------------------------------------------*/ void ivas_mct_enc_close( - MCT_ENC_HANDLE hMCT /* i/o: MCT encoder structure */ + MCT_ENC_HANDLE *hMCT /* i/o: MCT encoder structure */ ) { int16_t n, maxBlocks; - maxBlocks = hMCT->nchan_out_woLFE / 2; + if ( hMCT == NULL || *hMCT == NULL ) + { + return; + } + + maxBlocks = ( *hMCT )->nchan_out_woLFE / 2; for ( n = 0; n < maxBlocks; n++ ) { - if ( hMCT->hBlockData[n] != NULL ) + if ( ( *hMCT )->hBlockData[n] != NULL ) { - if ( hMCT->hBlockData[n]->hStereoMdct != NULL ) + if ( ( *hMCT )->hBlockData[n]->hStereoMdct != NULL ) { - free( hMCT->hBlockData[n]->hStereoMdct ); - hMCT->hBlockData[n]->hStereoMdct = NULL; + free( ( *hMCT )->hBlockData[n]->hStereoMdct ); + ( *hMCT )->hBlockData[n]->hStereoMdct = NULL; } - free( hMCT->hBlockData[n] ); - hMCT->hBlockData[n] = NULL; + free( ( *hMCT )->hBlockData[n] ); + ( *hMCT )->hBlockData[n] = NULL; } } - free( hMCT ); + free( ( *hMCT ) ); + ( *hMCT ) = NULL; return; } @@ -608,34 +613,18 @@ static ivas_error ivas_mc_enc_reconfig( } /*De-allocate handles for other MC modes*/ - if ( st_ivas->hParamMC != NULL ) - { - ivas_param_mc_enc_close( st_ivas->hParamMC, st_ivas->hEncoderConfig->input_Fs ); - st_ivas->hParamMC = NULL; - } + ivas_param_mc_enc_close( &( st_ivas->hParamMC ), st_ivas->hEncoderConfig->input_Fs ); /* De-allocate McMasa-related handles */ - if ( st_ivas->hMcMasa != NULL ) - { - ivas_mcmasa_enc_close( st_ivas->hMcMasa, st_ivas->hEncoderConfig->input_Fs ); - st_ivas->hMcMasa = NULL; - } + ivas_mcmasa_enc_close( &( st_ivas->hMcMasa ), st_ivas->hEncoderConfig->input_Fs ); - if ( st_ivas->hMasa != NULL ) - { #ifdef FIX_350_MASA_DELAY_COMP - ivas_masa_enc_close( st_ivas->hMasa ); + ivas_masa_enc_close( &( st_ivas->hMasa ) ); #else - ivas_masa_enc_close( st_ivas->hMasa, nchan_transport_old, MC_FORMAT ); + ivas_masa_enc_close( &( st_ivas->hMasa ), nchan_transport_old, MC_FORMAT ); #endif - st_ivas->hMasa = NULL; - } - if ( st_ivas->hQMetaData != NULL ) - { - ivas_qmetadata_close( &st_ivas->hQMetaData ); - st_ivas->hQMetaData = NULL; - } + ivas_qmetadata_close( &st_ivas->hQMetaData ); } } else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) @@ -656,39 +645,30 @@ static ivas_error ivas_mc_enc_reconfig( } /* De-allocate McMasa-related handles */ - if ( st_ivas->hMcMasa != NULL ) - { - ivas_mcmasa_enc_close( st_ivas->hMcMasa, st_ivas->hEncoderConfig->input_Fs ); - st_ivas->hMcMasa = NULL; - } + ivas_mcmasa_enc_close( &( st_ivas->hMcMasa ), st_ivas->hEncoderConfig->input_Fs ); + if ( st_ivas->hMasa != NULL ) { #ifdef FIX_350_MASA_DELAY_COMP - ivas_masa_enc_close( st_ivas->hMasa ); + ivas_masa_enc_close( &( st_ivas->hMasa ) ); #else - ivas_masa_enc_close( st_ivas->hMasa, nchan_transport_old, MC_FORMAT ); + ivas_masa_enc_close( &( st_ivas->hMasa ), nchan_transport_old, MC_FORMAT ); #endif st_ivas->hMasa = NULL; } - if ( st_ivas->hQMetaData != NULL ) - { - ivas_qmetadata_close( &st_ivas->hQMetaData ); - st_ivas->hQMetaData = NULL; - } + ivas_qmetadata_close( &st_ivas->hQMetaData ); /* De-allocate MCT handle if last mode was MCT */ - if ( last_mc_mode == MC_MODE_MCT && st_ivas->hMCT != NULL && st_ivas->nchan_transport <= CPE_CHANNELS ) + if ( last_mc_mode == MC_MODE_MCT && st_ivas->nchan_transport <= CPE_CHANNELS ) { - ivas_mct_enc_close( st_ivas->hMCT ); - st_ivas->hMCT = NULL; + ivas_mct_enc_close( &( st_ivas->hMCT ) ); } if ( last_mc_mode == MC_MODE_MCT && st_ivas->hLFE != NULL ) { /* LFE handle */ - ivas_lfe_enc_close( st_ivas->hLFE ); - st_ivas->hLFE = NULL; + ivas_lfe_enc_close( &( st_ivas->hLFE ) ); } } else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) @@ -721,26 +701,14 @@ static ivas_error ivas_mc_enc_reconfig( } } - if ( st_ivas->hParamMC != NULL ) - { - ivas_param_mc_enc_close( st_ivas->hParamMC, st_ivas->hEncoderConfig->input_Fs ); - st_ivas->hParamMC = NULL; - } + ivas_param_mc_enc_close( &( st_ivas->hParamMC ), st_ivas->hEncoderConfig->input_Fs ); if ( last_mc_mode == MC_MODE_MCT ) { /* LFE handle */ - if ( st_ivas->hLFE != NULL ) - { - ivas_lfe_enc_close( st_ivas->hLFE ); - st_ivas->hLFE = NULL; - } + ivas_lfe_enc_close( &( st_ivas->hLFE ) ); - if ( st_ivas->hMCT != NULL ) - { - ivas_mct_enc_close( st_ivas->hMCT ); - st_ivas->hMCT = NULL; - } + ivas_mct_enc_close( &( st_ivas->hMCT ) ); } } diff --git a/lib_enc/ivas_mdct_core_enc.c b/lib_enc/ivas_mdct_core_enc.c index 626dcf2631..ef9264d5df 100644 --- a/lib_enc/ivas_mdct_core_enc.c +++ b/lib_enc/ivas_mdct_core_enc.c @@ -686,6 +686,7 @@ void ivas_mdct_core_whitening_enc( core_signal_analysis_high_bitrate( new_samples[ch] + L_INP_MEM, T_op[ch], NULL, NULL, st, mdst_spectrum[ch], tnsSize[ch], tnsBits[ch], param_core[ch], <pBits[ch], windowedSignal[ch], st->L_frame, st->hTcxEnc->L_frameTCX, hCPE->last_element_mode, 0 ); /* BWD in MDCT domain */ +#ifndef FIX_MDCT_BASED_BWD if ( st->hTcxEnc->transform_type[0] == TCX_20 && st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP ) { if ( st->mct_chan_mode != MCT_CHAN_MODE_LFE ) @@ -693,6 +694,22 @@ void ivas_mdct_core_whitening_enc( bw_detect( st, NULL, st->hTcxEnc->spectrum[0], NULL ); } } +#else + if ( st->mct_chan_mode != MCT_CHAN_MODE_LFE && st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP ) + { + nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + + for ( n = 0; n < nSubframes; n++ ) + { + bw_detect( st, NULL, st->hTcxEnc->spectrum[n], NULL, mct_on ); + + if ( nSubframes == NB_DIV && n == 0 ) + { + st->last_input_bwidth = st->input_bwidth; + } + } + } +#endif if ( st->last_core == ACELP_CORE ) /* reset past kernel info */ { diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index 97bc34a9cb..ac4f83a657 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -130,10 +130,7 @@ ivas_error ivas_qmetadata_enc_encode( ) { int16_t i, bit_pos_start, bit_pos_start_coh; - int16_t next_ind_start; -#ifndef IND_LIST_DYN - int16_t last_ind_start; -#endif + int16_t next_ind_start, last_ind_start; uint16_t diffuseness_index_max_ec_frame; uint16_t diffuseness_index_max_ec_frame_pre[QMETADATA_MAX_NO_DIRECTIONS]; int16_t bits_dir_raw_pre[QMETADATA_MAX_NO_DIRECTIONS]; @@ -406,12 +403,8 @@ ivas_error ivas_qmetadata_enc_encode( /* Save state of metadata bitstream buffer after writing energy ratios, number of dirs and save space for coherence*/ bit_pos_start = hMetaData->nb_bits_tot; -#ifdef IND_LIST_DYN - next_ind_start = hMetaData->nb_ind_tot; -#else next_ind_start = hMetaData->next_ind; last_ind_start = hMetaData->last_ind; -#endif /* Encode quantized directions with EC frame-wise*/ if ( total_bits_1dir + bits_surround_coh <= hQMetaData->qmetadata_max_bit_req ) @@ -420,11 +413,7 @@ ivas_error ivas_qmetadata_enc_encode( bits_signaling[d]++; } -#ifdef IND_LIST_DYN - next_ind_raw_flag = hMetaData->nb_ind_tot; -#else next_ind_raw_flag = hMetaData->next_ind; -#endif push_next_indice( hMetaData, 0, 1 ); /* Raw coding flag*/ bits_dir_bands[0] = ivas_qmetadata_raw_encode_dir( NULL, q_direction, q_direction->cfg.nbands, q_direction->cfg.start_band ); @@ -456,11 +445,7 @@ ivas_error ivas_qmetadata_enc_encode( /* Encode quantized directions with EC band-wise */ if ( ( total_bits_1dir + bits_surround_coh <= hQMetaData->qmetadata_max_bit_req ) && ( bits_dir[d] + bits_diff[d] + bits_coherence[d] + bits_signaling[d] > total_bits_1dir ) && q_direction->cfg.nblocks > 1 ) { - restore_metadata_buffer( hMetaData, next_ind_start, -#ifndef IND_LIST_DYN - last_ind_start, -#endif - bit_pos_start ); + restore_metadata_buffer( hMetaData, next_ind_start, last_ind_start, bit_pos_start ); /* Write signaling */ push_next_indice( hMetaData, 1, 1 ); /*Write 1 bit to signal no EC frame-wise (EC1)*/ @@ -468,11 +453,7 @@ ivas_error ivas_qmetadata_enc_encode( bits_signaling[d] = 3; /* Write raw flags */ -#ifdef IND_LIST_DYN - next_ind_raw_flag = hMetaData->nb_ind_tot; -#else next_ind_raw_flag = hMetaData->next_ind; -#endif for ( i = start_band; i < nbands; i++ ) { push_next_indice( hMetaData, 0, 1 ); /* Raw coding flag*/ @@ -541,11 +522,7 @@ ivas_error ivas_qmetadata_enc_encode( /*Bit budget exceeded, bit reduction strategy?*/ extra_bits = 0; - restore_metadata_buffer( hMetaData, next_ind_start, -#ifndef IND_LIST_DYN - last_ind_start, -#endif - bit_pos_start ); + restore_metadata_buffer( hMetaData, next_ind_start, last_ind_start, bit_pos_start ); push_next_indice( hMetaData, 1, 1 ); /*Write 1 bit to signal no EC frame-wise (EC1)*/ if ( nblocks > 1 ) @@ -931,19 +908,15 @@ void ivas_qmetadata_enc_sid_encode( void reset_metadata_spatial( const IVAS_FORMAT ivas_format, /* i : IVAS format */ - BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ + BSTR_ENC_HANDLE hMetaData, /* i/o: Metadata bitstream handle */ const int32_t element_brate, /* i : element bitrate */ int32_t *total_brate, /* o : total bitrate */ const int32_t core_brate, /* i : core bitrate */ - const int16_t nb_bits_metadata, /* i : number of metadata bits */ + const int16_t nb_bits_metadata, /* i : number of meatdata bits */ const SBA_MODE sba_mode /* i : SBA mode */ ) { int16_t i, next_ind_sid, last_ind_sid; -#ifdef IND_LIST_DYN - int16_t j; -#endif - int16_t metadata_sid_bits; if ( core_brate == SID_2k40 || core_brate == FRAME_NO_DATA ) @@ -952,9 +925,7 @@ void reset_metadata_spatial( { if ( sba_mode == SBA_MODE_SPAR ) { -#ifdef DEBUGGING assert( hMetaData->ind_list[0].nb_bits == 1 ); -#endif hMetaData->ind_list[0].value = 1; metadata_sid_bits = (int16_t) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; while ( hMetaData->nb_bits_tot < metadata_sid_bits ) @@ -965,22 +936,15 @@ void reset_metadata_spatial( else { /* Reset metadata and keep only SID metadata*/ -#ifdef IND_LIST_DYN - last_ind_sid = hMetaData->nb_ind_tot; - next_ind_sid = hMetaData->nb_ind_tot; -#else last_ind_sid = hMetaData->next_ind; next_ind_sid = hMetaData->next_ind; -#endif while ( hMetaData->nb_bits_tot > nb_bits_metadata ) { next_ind_sid--; hMetaData->nb_bits_tot -= hMetaData->ind_list[next_ind_sid].nb_bits; } -#ifndef IND_LIST_DYN hMetaData->next_ind = 0; -#endif hMetaData->nb_bits_tot = 0; for ( i = 0; i < next_ind_sid; i++ ) @@ -988,17 +952,6 @@ void reset_metadata_spatial( hMetaData->ind_list[i].nb_bits = -1; } -#ifdef IND_LIST_DYN - for ( j = 0, i = next_ind_sid; i < last_ind_sid; i++, j++ ) - { - hMetaData->ind_list[j].value = hMetaData->ind_list[i].value; - hMetaData->ind_list[j].nb_bits = hMetaData->ind_list[i].nb_bits; - hMetaData->nb_bits_tot += hMetaData->ind_list[j].nb_bits; - hMetaData->ind_list[i].nb_bits = -1; - } - - hMetaData->nb_ind_tot = j; -#else for ( i = next_ind_sid; i < last_ind_sid; i++ ) { hMetaData->ind_list[hMetaData->next_ind].value = hMetaData->ind_list[i].value; @@ -1007,20 +960,13 @@ void reset_metadata_spatial( hMetaData->next_ind++; hMetaData->ind_list[i].nb_bits = -1; } - hMetaData->last_ind = hMetaData->next_ind; -#endif -#ifdef DEBUGGING assert( ( hMetaData->nb_bits_tot == ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS ) && "Problem of SID metadata in SCE" ); -#endif } } else { /*Reset metadata*/ -#ifdef IND_LIST_DYN - reset_indices_enc( hMetaData, hMetaData->max_num_indices ); -#else for ( i = 0; i < hMetaData->next_ind; i++ ) { hMetaData->ind_list[i].nb_bits = -1; @@ -1028,7 +974,6 @@ void reset_metadata_spatial( hMetaData->nb_bits_tot = 0; hMetaData->next_ind = 0; hMetaData->last_ind = 0; -#endif } *total_brate = element_brate; @@ -1038,22 +983,12 @@ void reset_metadata_spatial( /* Reset SID metadata bits*/ while ( hMetaData->nb_bits_tot > nb_bits_metadata ) { -#ifdef IND_LIST_DYN - hMetaData->nb_ind_tot--; - hMetaData->nb_bits_tot -= hMetaData->ind_list[hMetaData->nb_ind_tot].nb_bits; - hMetaData->ind_list[hMetaData->nb_ind_tot].nb_bits = -1; -#else hMetaData->next_ind--; hMetaData->nb_bits_tot -= hMetaData->ind_list[hMetaData->next_ind].nb_bits; hMetaData->ind_list[hMetaData->next_ind].nb_bits = -1; -#endif } -#ifdef DEBUGGING assert( hMetaData->nb_bits_tot == nb_bits_metadata && "Problem in metadata for SCE" ); -#endif -#ifndef IND_LIST_DYN hMetaData->last_ind = hMetaData->next_ind; -#endif } return; @@ -1559,34 +1494,24 @@ static int16_t ivas_qmetadata_entropy_encode_df_ratio( /*------------------------------------------------------------------------- * restore_metadata_buffer() * - * Restore metadata buffer + * Reset metadata buffer *------------------------------------------------------------------------*/ void restore_metadata_buffer( BSTR_ENC_HANDLE hMetaData, const int16_t next_ind_start, -#ifndef IND_LIST_DYN const int16_t last_ind_start, -#endif const int16_t bit_pos_start ) { int16_t i; -#ifdef IND_LIST_DYN - for ( i = next_ind_start; i <= hMetaData->nb_ind_tot; i++ ) -#else for ( i = next_ind_start; i <= hMetaData->next_ind; i++ ) -#endif { hMetaData->ind_list[i].nb_bits = -1; } hMetaData->nb_bits_tot = bit_pos_start; -#ifdef IND_LIST_DYN - hMetaData->nb_ind_tot = next_ind_start; -#else hMetaData->next_ind = next_ind_start; hMetaData->last_ind = last_ind_start; -#endif return; } @@ -4776,11 +4701,7 @@ static int16_t ivas_qmetadata_quantize_coherence( else { /* write dummy data now and save the position */ -#ifdef IND_LIST_DYN - *indice_coherence = hMetaData->nb_ind_tot; -#else *indice_coherence = hMetaData->next_ind; -#endif k = nbits; while ( k > 0 ) { diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index e878d74183..d3aab0a6e8 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -120,14 +120,10 @@ ivas_error ivas_sba_enc_reconfigure( DIRAC_ENC_HANDLE hDirAC = st_ivas->hDirAC; SPAR_ENC_HANDLE hSpar; SBA_MODE sba_mode_old; -#ifdef SBA_HPF_TUNING_ENC int16_t analysis_order_old; -#endif -#ifdef SBA_BR_SWITCHING_CLEAN_UP int16_t spar_reconfig_flag; spar_reconfig_flag = 0; -#endif nchan_transport_old = st_ivas->nchan_transport; nCPE_old = st_ivas->nCPE; nSCE_old = st_ivas->nSCE; @@ -136,7 +132,6 @@ ivas_error ivas_sba_enc_reconfigure( st_ivas->sba_analysis_order = ivas_sba_get_analysis_order( ivas_total_brate, hEncoderConfig->sba_order ); st_ivas->sba_mode = ivas_sba_mode_select( ivas_total_brate ); -#ifdef SBA_HPF_TUNING_ENC analysis_order_old = ivas_sba_get_analysis_order( hEncoderConfig->last_ivas_total_brate, hEncoderConfig->sba_order ); if ( analysis_order_old != st_ivas->sba_analysis_order ) @@ -204,17 +199,12 @@ ivas_error ivas_sba_enc_reconfigure( old_mem_hp20_in = NULL; } } -#endif if ( st_ivas->sba_mode == SBA_MODE_SPAR ) { if ( st_ivas->hSpar == NULL ) { -#ifdef SBA_BR_SWITCHING_CLEAN_UP if ( ( error = ivas_spar_enc_open( st_ivas, spar_reconfig_flag ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_spar_enc_open( st_ivas ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -223,7 +213,6 @@ ivas_error ivas_sba_enc_reconfigure( ivas_spar_config( ivas_total_brate, min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ), &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->hSpar->core_nominal_brate, -1 ); -#ifdef SBA_BR_SWITCHING_CLEAN_UP for ( n = 0; n < DIRAC_MAX_ANA_CHANS; n++ ) { if ( hDirAC->sba_synchro_buffer[n] != NULL ) @@ -233,17 +222,10 @@ ivas_error ivas_sba_enc_reconfigure( } } hDirAC->num_samples_synchro_delay = 0; -#endif } else { -#ifdef SBA_BR_SWITCHING_CLEAN_UP - ivas_spar_enc_close( st_ivas->hSpar, hEncoderConfig->input_Fs, hEncoderConfig->nchan_inp, spar_reconfig_flag ); - -#else - ivas_spar_enc_close( st_ivas->hSpar, hEncoderConfig->input_Fs, hEncoderConfig->nchan_inp ); -#endif - st_ivas->hSpar = NULL; + ivas_spar_enc_close( &( st_ivas->hSpar ), hEncoderConfig->input_Fs, hEncoderConfig->nchan_inp, spar_reconfig_flag ); } hSpar = st_ivas->hSpar; @@ -264,68 +246,19 @@ ivas_error ivas_sba_enc_reconfigure( { if ( hDirAC->hFbMixer != NULL ) { -#ifndef SBA_BR_SWITCHING_CLEAN_UP - ivas_FB_mixer_close( &( hDirAC->hFbMixer ), hEncoderConfig->input_Fs ); -#else ivas_FB_mixer_close( &( hDirAC->hFbMixer ), hEncoderConfig->input_Fs, 0 ); -#endif hDirAC->hFbMixer = NULL; } if ( sba_mode_old == SBA_MODE_SPAR ) { -#ifndef SBA_BR_SWITCHING_CLEAN_UP - IVAS_FB_CFG *fb_cfg; - int16_t nchan_internal, sba_order_internal; - int16_t table_idx, active_w_mixing; - - sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); - nchan_internal = ivas_sba_get_nchan_metadata( sba_order_internal ); - - /* Covar. State handle */ - ivas_spar_covar_enc_close( &hSpar->hCovEnc, hSpar->hFbMixer->fb_cfg->num_in_chans ); - - /* MD handle */ - ivas_spar_md_enc_close( &hSpar->hMdEnc ); - - if ( ( error = ivas_spar_md_enc_open( &( hSpar->hMdEnc ), hEncoderConfig, sba_order_internal ) ) != IVAS_ERR_OK ) - { - return error; - } - - /*Initialization*/ - hSpar->hMdEnc->table_idx = -1; - - /* FB mixer handle */ - ivas_FB_mixer_close( &hSpar->hFbMixer, hEncoderConfig->input_Fs ); - - table_idx = ivas_get_spar_table_idx( ivas_total_brate, sba_order_internal, SPAR_CONFIG_BW, NULL, NULL ); - active_w_mixing = ivas_spar_br_table_consts[table_idx].active_w; - if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_SPAR, nchan_internal, st_ivas->nchan_transport, active_w_mixing, hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) - { - return error; - } - fb_cfg->remix_order = remix_order_set[hSpar->hMdEnc->spar_md_cfg.remix_unmix_order]; - - if ( ( error = ivas_FB_mixer_open( &( hSpar->hFbMixer ), hEncoderConfig->input_Fs, fb_cfg ) ) != IVAS_ERR_OK ) - { - return error; - } - - /* Covar. State handle */ - if ( ( error = ivas_spar_covar_enc_open( &( hSpar->hCovEnc ), hSpar->hFbMixer->pFb, hEncoderConfig->input_Fs, nchan_internal ) ) != IVAS_ERR_OK ) - { - return error; - } -#else spar_reconfig_flag = 1; - ivas_spar_enc_close( st_ivas->hSpar, hEncoderConfig->input_Fs, hEncoderConfig->nchan_inp, spar_reconfig_flag ); + ivas_spar_enc_close( &( st_ivas->hSpar ), hEncoderConfig->input_Fs, hEncoderConfig->nchan_inp, spar_reconfig_flag ); if ( ( error = ivas_spar_enc_open( st_ivas, spar_reconfig_flag ) ) != IVAS_ERR_OK ) { return error; } -#endif } } else @@ -340,11 +273,7 @@ ivas_error ivas_sba_enc_reconfigure( } /* Allocate and initialize FB mixer handle */ -#ifdef SBA_BR_SWITCHING_CLEAN_UP if ( ( error = ivas_FB_mixer_open( &( hDirAC->hFbMixer ), hEncoderConfig->input_Fs, fb_cfg, 0 ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_FB_mixer_open( &( hDirAC->hFbMixer ), hEncoderConfig->input_Fs, fb_cfg ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -368,43 +297,6 @@ ivas_error ivas_sba_enc_reconfigure( } } } -#ifndef SBA_BR_SWITCHING_CLEAN_UP - /* initialize delay for SPAR/DirAC delay synchronization */ - if ( ( st_ivas->sba_mode == SBA_MODE_DIRAC ) && ( ( sba_mode_old != st_ivas->sba_mode ) || ( nchan_transport_old != st_ivas->nchan_transport ) ) ) - { - if ( hDirAC->num_samples_synchro_delay == 0 ) - { - hDirAC->num_samples_synchro_delay = NS2SA( hEncoderConfig->input_Fs, IVAS_FB_ENC_DELAY_NS ); - - for ( n = 0; n < DIRAC_MAX_ANA_CHANS; n++ ) - { - if ( ( hDirAC->sba_synchro_buffer[n] = (float *) malloc( hDirAC->num_samples_synchro_delay * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hDirAC synchro buffer\n" ) ); - } - set_zero( hDirAC->sba_synchro_buffer[n], hDirAC->num_samples_synchro_delay ); - } - for ( ; n < DIRAC_MAX_ANA_CHANS; n++ ) - { - hDirAC->sba_synchro_buffer[n] = NULL; - } - } - } - else - { - for ( n = 0; n < DIRAC_MAX_ANA_CHANS; n++ ) - { - if ( hDirAC->sba_synchro_buffer[n] != NULL ) - { - free( hDirAC->sba_synchro_buffer[n] ); - hDirAC->sba_synchro_buffer[n] = NULL; - } - } - hDirAC->num_samples_synchro_delay = 0; - } - - -#endif } if ( ( error = ivas_dirac_enc_reconfigure( st_ivas ) ) != IVAS_ERR_OK ) diff --git a/lib_enc/ivas_sce_enc.c b/lib_enc/ivas_sce_enc.c index 03cc8d9028..c8577a85ba 100644 --- a/lib_enc/ivas_sce_enc.c +++ b/lib_enc/ivas_sce_enc.c @@ -180,21 +180,12 @@ ivas_error ivas_sce_enc( * Front Pre-processing *----------------------------------------------------------------*/ -#ifdef LOW_RATE_TRANS_CORE_CODER error = pre_proc_front_ivas( hSCE, NULL, hSCE->element_brate, nb_bits_metadata, input_frame, 0, old_inp_12k8[0], old_inp_16k[0], &ener[0], &relE[0], A[0], Aw[0], epsP[0], lsp_new[0], lsp_mid[0], &vad_hover_flag[0], &attack_flag[0], realBuffer[0], imagBuffer[0], old_wsp[0], pitch_fr[0], voicing_fr[0], &loc_harm[0], &cor_map_sum[0], &vad_flag_dtx[0], enerBuffer[0], fft_buff[0], A[0], lsp_new[0], currFlatness[0], 0, fr_bands, Etot_LR, lf_E, localVAD_HE_SAD, NULL, flag_16k_smc, st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_flag : 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->force_front_vad : 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_dtx_flag : 0, st_ivas->hEncoderConfig->ivas_total_brate ); -#else - error = pre_proc_front_ivas( hSCE, NULL, hSCE->element_brate, nb_bits_metadata, input_frame, 0, old_inp_12k8[0], old_inp_16k[0], - &ener[0], &relE[0], A[0], Aw[0], epsP[0], lsp_new[0], lsp_mid[0], - &vad_hover_flag[0], &attack_flag[0], realBuffer[0], imagBuffer[0], old_wsp[0], pitch_fr[0], voicing_fr[0], &loc_harm[0], &cor_map_sum[0], &vad_flag_dtx[0], enerBuffer[0], - fft_buff[0], A[0], lsp_new[0], currFlatness[0], 0, fr_bands, Etot_LR, lf_E, localVAD_HE_SAD, NULL, flag_16k_smc, - st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_flag : 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->force_front_vad : 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_dtx_flag : 0, - st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->hEncoderConfig->ivas_format ); -#endif if ( error != IVAS_ERR_OK ) { return error; @@ -260,10 +251,8 @@ ivas_error ivas_sce_enc( hSCE->last_element_brate = hSCE->element_brate; -#ifdef LOW_RATE_TRANS_CORE_CODER /* Store previous attack detection flag */ st->hTranDet->transientDetector.prev_bIsAttackPresent = st->hTranDet->transientDetector.bIsAttackPresent; -#endif #ifdef DEBUG_MODE_INFO { @@ -323,19 +312,6 @@ ivas_error create_sce_enc( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MetaData structure\n" ) ); } - -#ifdef IND_LIST_DYN - /* set the maximum allowed number of indices in the list */ - hSCE->hMetaData->max_num_indices = get_max_num_indices_metadata( st_ivas->hEncoderConfig->ivas_format, st_ivas->hEncoderConfig->ivas_total_brate ); - - /* allocate buffer of metadata indices */ - if ( ( hSCE->hMetaData->ind_list = (INDICE_HANDLE) malloc( hSCE->hMetaData->max_num_indices * sizeof( Indice ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); - } - - reset_indices_enc( hSCE->hMetaData, hSCE->hMetaData->max_num_indices ); -#endif } else { @@ -356,19 +332,7 @@ ivas_error create_sce_enc( st->total_brate = hSCE->element_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ st->mct_chan_mode = MCT_CHAN_MODE_REGULAR; -#ifdef PARAM_ISM_DTX_CNG - if ( ( error = init_encoder( st, -#ifdef IND_LIST_DYN - st_ivas->hEncoderConfig, -#endif - 0, st_ivas->hEncoderConfig->var_SID_rate_flag, st_ivas->hEncoderConfig->interval_SID, 0, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) -#else - if ( ( error = init_encoder( st, -#ifdef IND_LIST_DYN - st_ivas->hEncoderConfig, -#endif - 0, st_ivas->hEncoderConfig->var_SID_rate_flag, st_ivas->hEncoderConfig->interval_SID, 0 ) ) != IVAS_ERR_OK ) -#endif + if ( ( error = init_encoder( st, 0, st_ivas->hEncoderConfig->var_SID_rate_flag, st_ivas->hEncoderConfig->interval_SID, 0, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) { return error; } @@ -403,12 +367,6 @@ void destroy_sce_enc( if ( hSCE->hMetaData != NULL ) { -#ifdef IND_LIST_DYN - if ( hSCE->hMetaData->ind_list != NULL ) - { - free( hSCE->hMetaData->ind_list ); - } -#endif free( hSCE->hMetaData ); hSCE->hMetaData = NULL; } diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 43058148d4..c659979d2b 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -58,11 +58,8 @@ static ivas_error ivas_spar_enc_process( Encoder_Struct *st_ivas, const ENCODER_ *------------------------------------------------------------------------*/ ivas_error ivas_spar_enc_open( - Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ -#ifdef SBA_BR_SWITCHING_CLEAN_UP - , + Encoder_Struct *st_ivas, /* i/o: IVAS encoder handle */ const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ -#endif ) { SPAR_ENC_HANDLE hSpar; @@ -75,20 +72,16 @@ ivas_error ivas_spar_enc_open( hEncoderConfig = st_ivas->hEncoderConfig; error = IVAS_ERR_OK; -#ifdef SBA_BR_SWITCHING_CLEAN_UP hSpar = st_ivas->hSpar; if ( !spar_reconfig_flag ) { -#endif /* SPAR encoder handle */ if ( ( hSpar = (SPAR_ENC_HANDLE) malloc( sizeof( SPAR_ENC_DATA ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR encoder" ); } -#ifdef SBA_BR_SWITCHING_CLEAN_UP } -#endif input_Fs = hEncoderConfig->input_Fs; sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); @@ -113,12 +106,8 @@ ivas_error ivas_spar_enc_open( ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_SPAR, nchan_inp, nchan_transport, active_w_mixing, input_Fs ); fb_cfg->remix_order = remix_order_set[hSpar->hMdEnc->spar_md_cfg.remix_unmix_order]; -/* FB mixer handle */ -#ifdef SBA_BR_SWITCHING_CLEAN_UP + /* FB mixer handle */ if ( ( error = ivas_FB_mixer_open( &( hSpar->hFbMixer ), input_Fs, fb_cfg, spar_reconfig_flag ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_FB_mixer_open( &( hSpar->hFbMixer ), input_Fs, fb_cfg ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -129,18 +118,14 @@ ivas_error ivas_spar_enc_open( return error; } -#ifdef SBA_BR_SWITCHING_CLEAN_UP if ( !spar_reconfig_flag ) { -#endif /* Transient Detector handle */ if ( ( error = ivas_transient_det_open( &( hSpar->hTranDet ), input_Fs ) ) != IVAS_ERR_OK ) { return error; } -#ifdef SBA_BR_SWITCHING_CLEAN_UP } -#endif /* initialization */ hSpar->hMdEnc->table_idx = -1; @@ -194,10 +179,8 @@ ivas_error ivas_spar_enc_open( * Allocate and initialize Front-VAD handle *-----------------------------------------------------------------*/ -#ifdef SBA_BR_SWITCHING_CLEAN_UP if ( !spar_reconfig_flag ) { -#endif hSpar->front_vad_flag = 0; hSpar->front_vad_dtx_flag = 0; hSpar->force_front_vad = 0; @@ -219,19 +202,7 @@ ivas_error ivas_spar_enc_open( hSpar->hCoreCoderVAD->total_brate = hEncoderConfig->ivas_total_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ hSpar->hCoreCoderVAD->mct_chan_mode = MCT_CHAN_MODE_IGNORE; -#ifdef PARAM_ISM_DTX_CNG - if ( ( error = init_encoder( hSpar->hCoreCoderVAD, -#ifdef IND_LIST_DYN - hEncoderConfig, -#endif - 0, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 1, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) -#else - if ( ( error = init_encoder( hSpar->hCoreCoderVAD, -#ifdef IND_LIST_DYN - hEncoderConfig, -#endif - 0, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 1 ) ) != IVAS_ERR_OK ) -#endif + if ( ( error = init_encoder( hSpar->hCoreCoderVAD, 0, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 1, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) { return error; } @@ -241,9 +212,7 @@ ivas_error ivas_spar_enc_open( hSpar->hCoreCoderVAD = NULL; hSpar->hFrontVad = NULL; } -#ifdef SBA_BR_SWITCHING_CLEAN_UP } -#endif /*-----------------------------------------------------------------* * Final assignment @@ -262,82 +231,67 @@ ivas_error ivas_spar_enc_open( *------------------------------------------------------------------------*/ void ivas_spar_enc_close( - SPAR_ENC_HANDLE hSpar, /* i/o: SPAR encoder handle */ - const int32_t input_Fs, /* i : input sampling rate */ - const int16_t nchan_inp /* i : number of input channels */ -#ifdef SBA_BR_SWITCHING_CLEAN_UP - , + SPAR_ENC_HANDLE *hSpar, /* i/o: SPAR encoder handle */ + const int32_t input_Fs, /* i : input sampling rate */ + const int16_t nchan_inp, /* i : number of input channels */ const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ -#endif ) { int16_t num_chans; - if ( hSpar != NULL ) + if ( hSpar == NULL || *hSpar == NULL ) { -#ifdef SBA_BR_SWITCHING_CLEAN_UP - if ( !spar_reconfig_flag ) - { -#endif - /* core-coder-VAD handle */ - if ( hSpar->hCoreCoderVAD != NULL ) - { - destroy_core_enc( hSpar->hCoreCoderVAD ); - hSpar->hCoreCoderVAD = NULL; - } + return; + } - /* front-VAD handle */ - if ( hSpar->hFrontVad != NULL ) - { - front_vad_destroy( &hSpar->hFrontVad ); - hSpar->hFrontVad = NULL; - } -#ifdef SBA_BR_SWITCHING_CLEAN_UP + if ( !spar_reconfig_flag ) + { + /* core-coder-VAD handle */ + if ( ( *hSpar )->hCoreCoderVAD != NULL ) + { + destroy_core_enc( ( *hSpar )->hCoreCoderVAD ); + ( *hSpar )->hCoreCoderVAD = NULL; } -#endif - num_chans = hSpar->hFbMixer->fb_cfg->num_in_chans; - assert( num_chans <= nchan_inp ); + /* front-VAD handle */ + if ( ( *hSpar )->hFrontVad != NULL ) + { + front_vad_destroy( &( *hSpar )->hFrontVad ); + ( *hSpar )->hFrontVad = NULL; + } + } - /* MD handle */ - ivas_spar_md_enc_close( &hSpar->hMdEnc ); + num_chans = ( *hSpar )->hFbMixer->fb_cfg->num_in_chans; + assert( num_chans <= nchan_inp ); - /* Covar. State handle */ - ivas_spar_covar_enc_close( &hSpar->hCovEnc, num_chans ); + /* MD handle */ + ivas_spar_md_enc_close( &( *hSpar )->hMdEnc ); - /* FB mixer handle */ -#ifdef SBA_BR_SWITCHING_CLEAN_UP - ivas_FB_mixer_close( &hSpar->hFbMixer, input_Fs, spar_reconfig_flag ); -#else - ivas_FB_mixer_close( &hSpar->hFbMixer, input_Fs ); + /* Covar. State handle */ + ivas_spar_covar_enc_close( &( *hSpar )->hCovEnc, num_chans ); - /* Trans Det handle */ - ivas_transient_det_close( &hSpar->hTranDet ); -#endif + /* FB mixer handle */ + ivas_FB_mixer_close( &( *hSpar )->hFbMixer, input_Fs, spar_reconfig_flag ); - /* AGC */ - ivas_spar_agc_enc_close( &hSpar->hAgcEnc ); + /* AGC */ + ivas_spar_agc_enc_close( &( *hSpar )->hAgcEnc ); - /* PCA */ - if ( hSpar->hPCA != NULL ) - { - free( hSpar->hPCA ); - hSpar->hPCA = NULL; - } + /* PCA */ + if ( ( *hSpar )->hPCA != NULL ) + { + free( ( *hSpar )->hPCA ); + ( *hSpar )->hPCA = NULL; + } -#ifdef SBA_BR_SWITCHING_CLEAN_UP - if ( !spar_reconfig_flag ) - { - /* Trans Det handle */ - ivas_transient_det_close( &hSpar->hTranDet ); -#endif - free( hSpar ); - hSpar = NULL; -#ifdef SBA_BR_SWITCHING_CLEAN_UP - } -#endif + if ( !spar_reconfig_flag ) + { + /* Trans Det handle */ + ivas_transient_det_close( &( *hSpar )->hTranDet ); + free( ( *hSpar ) ); + ( *hSpar ) = NULL; } + return; } @@ -438,11 +392,7 @@ static ivas_error ivas_spar_enc_process( float pcm_tmp[IVAS_SPAR_MAX_CH][L_FRAME48k * 2]; float *p_pcm_tmp[IVAS_SPAR_MAX_CH]; int16_t i, j, b, i_ts, input_frame, dtx_vad; -#ifdef SMOOTH_WITH_TRANS_DET int16_t transient_det[2]; -#else - int16_t transient_det; -#endif int32_t ivas_total_brate, input_Fs; float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; float *cov_dtx_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; @@ -485,15 +435,11 @@ static ivas_error ivas_spar_enc_process( * Transient detector *-----------------------------------------------------------------------------------------*/ -#ifdef SMOOTH_WITH_TRANS_DET ivas_transient_det_process( hSpar->hTranDet, data_f[0], input_frame, transient_det ); if ( sba_order == 1 ) { transient_det[1] = transient_det[0]; } -#else - transient_det = ivas_transient_det_process( hSpar->hTranDet, data_f[0], input_frame ); -#endif /* store previous input samples for W in local buffer */ assert( num_del_samples <= IVAS_FB_1MS_48K_SAMP ); diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index 6b2492ebb4..645f690ac0 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -225,6 +225,11 @@ void ivas_spar_md_enc_close( int16_t num_channels, i, j; ivas_spar_md_enc_state_t *hMdEnc; + if ( hMdEnc_in == NULL || *hMdEnc_in == NULL ) + { + return; + } + hMdEnc = *hMdEnc_in; num_channels = hMdEnc->num_umx_ch; @@ -250,7 +255,6 @@ void ivas_spar_md_enc_close( { for ( i = 0; i < num_channels; i++ ) { - for ( j = 0; j < num_channels; j++ ) { free( hMdEnc->cov_real[i][j] ); @@ -264,7 +268,6 @@ void ivas_spar_md_enc_close( { for ( i = 0; i < num_channels; i++ ) { - for ( j = 0; j < num_channels; j++ ) { free( hMdEnc->cov_dtx_real[i][j] ); @@ -288,11 +291,8 @@ void ivas_spar_md_enc_close( free( hMdEnc->mixer_mat_local ); } - if ( hMdEnc != NULL ) - { - free( hMdEnc ); - hMdEnc = NULL; - } + free( *hMdEnc_in ); + *hMdEnc_in = NULL; return; } @@ -510,29 +510,17 @@ static void write_metadata_buffer( BSTR_ENC_HANDLE hMetaData_tmp, BSTR_ENC_HANDLE hMetaData, const int16_t bit_pos_start, - const int16_t next_ind_start -#ifndef IND_LIST_DYN - , - const int16_t last_ind_start -#endif -) + const int16_t next_ind_start, + const int16_t last_ind_start ) { int16_t i; if ( hMetaData->nb_bits_tot > 0 ) { - restore_metadata_buffer( hMetaData, next_ind_start, -#ifndef IND_LIST_DYN - last_ind_start, -#endif - bit_pos_start ); + restore_metadata_buffer( hMetaData, next_ind_start, last_ind_start, bit_pos_start ); } -#ifdef IND_LIST_DYN - for ( i = 0; i < hMetaData_tmp->nb_ind_tot; i++ ) -#else for ( i = 0; i < hMetaData_tmp->next_ind; i++ ) -#endif { push_next_indice( hMetaData, hMetaData_tmp->ind_list[i].value, hMetaData_tmp->ind_list[i].nb_bits ); } @@ -568,10 +556,7 @@ ivas_error ivas_spar_md_enc_process( int16_t nB, bands_bw, packed_ok = 0; ivas_strats_t cs[MAX_CODING_STRATS]; int16_t code_strat; - int16_t bit_pos_start, next_ind_start; -#ifndef IND_LIST_DYN - int16_t last_ind_start; -#endif + int16_t bit_pos_start, next_ind_start, last_ind_start; BSTR_ENC_DATA hMetaData_tmp; Indice ind_list_tmp[MAX_BITS_METADATA]; // IVAS_fmToDo: size to be optimized float Wscale[IVAS_MAX_NUM_BANDS]; @@ -624,12 +609,8 @@ ivas_error ivas_spar_md_enc_process( /* Save state of metadata bitstream buffer */ bit_pos_start = hMetaData->nb_bits_tot; -#ifdef IND_LIST_DYN - next_ind_start = hMetaData->nb_ind_tot; -#else next_ind_start = hMetaData->next_ind; last_ind_start = hMetaData->last_ind; -#endif dmx_switch = 0; @@ -890,23 +871,13 @@ ivas_error ivas_spar_md_enc_process( strat = cs[i]; if ( strat != NO_STRAT ) { -#ifdef IND_LIST_DYN - hMetaData_tmp.max_num_indices = MAX_BITS_METADATA; - reset_indices_enc( &hMetaData_tmp, hMetaData_tmp.max_num_indices ); -#else reset_indices_enc( &hMetaData_tmp, MAX_BITS_METADATA ); -#endif ivas_write_spar_md_bitstream( hMdEnc, num_bands, bands_bw, &hMetaData_tmp, hEncoderConfig->ivas_total_brate, strat, qsi, planarCP ); if ( hMetaData->nb_bits_tot == bit_pos_start || hMetaData_tmp.nb_bits_tot < ( hMetaData->nb_bits_tot - bit_pos_start ) ) { - write_metadata_buffer( &hMetaData_tmp, hMetaData, bit_pos_start, next_ind_start -#ifndef IND_LIST_DYN - , - last_ind_start -#endif - ); + write_metadata_buffer( &hMetaData_tmp, hMetaData, bit_pos_start, next_ind_start, last_ind_start ); code_strat = strat; } if ( hMetaData->nb_bits_tot - bit_pos_start + ( ( ( hEncoderConfig->ivas_total_brate == IVAS_256k ) && ( sba_order == SBA_FOA_ORDER ) ) ? 1 : 0 ) <= hMdEnc->spar_md_cfg.tgt_bits_per_blk ) diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index e450990254..a56f6423d3 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -550,7 +550,6 @@ typedef struct ivas_stereo_classifier_data_structure } STEREO_CLASSIF_DATA, *STEREO_CLASSIF_HANDLE; -#ifdef PARAM_ISM_DTX_CNG /*----------------------------------------------------------------------------------* * ISM DTX structure *----------------------------------------------------------------------------------*/ @@ -560,13 +559,16 @@ typedef struct int16_t dtx_flag; int16_t sce_id_dtx; +#ifdef DISCRETE_ISM_DTX_CNG + int16_t cnt_SID_ISM; +#else int16_t dtx_speech_buffer_enc[PARAM_ISM_HYS_BUF_SIZE]; +#endif float long_term_energy_stereo_dmx_enc[MAX_NUM_OBJECTS][PARAM_ISM_HYS_BUF_SIZE]; float coh[MAX_NUM_OBJECTS]; } ISM_DTX_DATA, *ISM_DTX_HANDLE; -#endif /*----------------------------------------------------------------------------------* * Front-VAD structure @@ -1012,9 +1014,15 @@ typedef struct encoder_config_structure int16_t element_mode_init; /* element mode used at initialization */ int16_t stereo_dmx_evs; /* flag to indicate that stereo downmix for EVS encoder */ +#ifdef NCHAN_ISM_PARAMETER + int16_t nchan_ism; /* number of ISM channels */ +#endif int16_t sba_order; /* Ambisonic (SBA) order */ int16_t sba_planar; /* Ambisonic (SBA) planar flag */ MC_LS_SETUP mc_input_setup; /* multichannel input ls setup */ +#ifdef TD5 + int16_t ism_extended_metadata_flag; /* flag indicating extended metadata encoding, including radius and orientation (yaw, pitch) in ISM format */ +#endif int16_t Opt_AMR_WB; /* flag indicating AMR-WB IO mode */ @@ -1071,9 +1079,7 @@ typedef struct /* multichannel modules */ ISM_METADATA_HANDLE hIsmMetaData[MAX_NUM_OBJECTS]; /* ISM metadata handles (storage for one frame of read ISM metadata) */ -#ifdef PARAM_ISM_DTX_CNG ISM_DTX_HANDLE hISMDTX; /* ISM DTX handle */ -#endif DIRAC_ENC_HANDLE hDirAC; /* DirAC data handle */ SPAR_ENC_HANDLE hSpar; /* SPAR encoder handle */ MASA_ENCODER_HANDLE hMasa; /* MASA encoder data and configuration */ diff --git a/lib_enc/ivas_stereo_dmx_evs.c b/lib_enc/ivas_stereo_dmx_evs.c index 052970fa70..a5c0fe147f 100644 --- a/lib_enc/ivas_stereo_dmx_evs.c +++ b/lib_enc/ivas_stereo_dmx_evs.c @@ -946,16 +946,22 @@ ivas_error stereo_dmx_evs_init_encoder( *-------------------------------------------------------------------*/ void stereo_dmx_evs_close_encoder( - STEREO_DMX_EVS_ENC_HANDLE hStereoDmxEVS /* i/o: Stereo downmix for EVS encoder handle */ + STEREO_DMX_EVS_ENC_HANDLE *hStereoDmxEVS /* i/o: Stereo downmix for EVS encoder handle */ ) { - if ( hStereoDmxEVS->hPOC != NULL ) + if ( hStereoDmxEVS == NULL || *hStereoDmxEVS == NULL ) { - free( hStereoDmxEVS->hPOC ); - hStereoDmxEVS->hPOC = NULL; + return; } - free( hStereoDmxEVS ); + if ( ( *hStereoDmxEVS )->hPOC != NULL ) + { + free( ( *hStereoDmxEVS )->hPOC ); + ( *hStereoDmxEVS )->hPOC = NULL; + } + + free( ( *hStereoDmxEVS ) ); + ( *hStereoDmxEVS ) = NULL; return; } diff --git a/lib_enc/ivas_stereo_mdct_core_enc.c b/lib_enc/ivas_stereo_mdct_core_enc.c index 047db979e2..9500da4fb9 100644 --- a/lib_enc/ivas_stereo_mdct_core_enc.c +++ b/lib_enc/ivas_stereo_mdct_core_enc.c @@ -116,10 +116,7 @@ static void sync_tcx_mode( *-------------------------------------------------------------------*/ void stereo_mdct_core_enc( - CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ -#ifdef IND_LIST_DYN - const int16_t ivas_format, /* i : IVAS format */ -#endif + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ float new_samples[CPE_CHANNELS][L_INP], /* i : new samples */ float old_wsp[CPE_CHANNELS][L_WSP], /* i : 12.8kHz weighted speech (for LTP */ float pitch_buf[CPE_CHANNELS][NB_SUBFR16k] /* o : floating pitch for each subframe */ @@ -148,9 +145,6 @@ void stereo_mdct_core_enc( int16_t p_param[CPE_CHANNELS][2]; int16_t stereo_bits; int16_t meta_bits, signal_bits; -#ifdef IND_LIST_DYN - int16_t max_num_indices; -#endif push_wmops( "stereo_mdct_core_enc" ); @@ -185,19 +179,6 @@ void stereo_mdct_core_enc( { st = sts[ch]; SetTCXModeInfo( st, st->hTranDet, &st->hTcxCfg->tcx_curr_overlap_mode ); - -#ifdef IND_LIST_DYN - /* re-allocate list of indices, if needed (note that st->total_brate is modified later in this function) */ - /* get the maximum allowed number of indices in the list */ - max_num_indices = get_max_num_indices( ivas_format, st->total_brate ); - - /* check, if the maximum number of allowed indices has changed */ - if ( max_num_indices != st->hBstr->max_num_indices ) - { - /* re-allocate the list of indices */ - ind_list_realloc( st->hBstr, max_num_indices ); - } -#endif } /* adaptively sync tcx modes*/ diff --git a/lib_enc/ivas_tcx_core_enc.c b/lib_enc/ivas_tcx_core_enc.c index 3971c6740e..40a97cc33e 100644 --- a/lib_enc/ivas_tcx_core_enc.c +++ b/lib_enc/ivas_tcx_core_enc.c @@ -457,11 +457,7 @@ void stereo_tcx_core_enc( mvr2r( lsp_q, st->lsp_old, M ); } -#ifdef PARAM_ISM_DTX_CNG if ( st->Opt_DTX_ON && !st->tcxonly && st->hTdCngEnc != NULL ) -#else - if ( st->Opt_DTX_ON && !st->tcxonly ) -#endif { /* update CNG parameters in active frames */ if ( st->bwidth == NB && st->enableTcxLpc && st->core != ACELP_CORE ) diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 1b771a041c..50052cda3c 100755 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -48,12 +48,8 @@ struct IVAS_ENC { Encoder_Struct *st_ivas; -#ifndef IND_LIST_DYN - Indice ind_list[MAX_NUM_DATA][MAX_NUM_INDICES]; /* list of indices */ -#endif -#ifndef IND_LIST_DYN + Indice ind_list[MAX_NUM_DATA][MAX_NUM_INDICES]; /* list of indices */ Indice ind_list_metadata[MAX_NUM_METADATA][MAX_BITS_METADATA]; /* list of indices for metadata */ -#endif ENC_CORE_HANDLE hCoreCoder; bool isConfigured; #ifdef DEBUGGING @@ -103,9 +99,7 @@ ivas_error IVAS_ENC_Open( ) { Encoder_Struct *st_ivas; -#ifndef IND_LIST_DYN int16_t i, j; -#endif if ( phIvasEnc == NULL ) { @@ -116,7 +110,13 @@ ivas_error IVAS_ENC_Open( * Allocate and initialize IVAS application encoder handle *-----------------------------------------------------------------*/ +#ifdef BITSTREAM_INDICES_MEMORY +#define WMC_TOOL_SKIP + if ( ( *phIvasEnc = (IVAS_ENC_HANDLE) malloc( sizeof( struct IVAS_ENC ) ) ) == NULL ) +#undef WMC_TOOL_SKIP +#else if ( ( *phIvasEnc = (IVAS_ENC_HANDLE) malloc( sizeof( struct IVAS_ENC ) ) ) == NULL ) +#endif { return IVAS_ERR_FAILED_ALLOC; } @@ -134,7 +134,6 @@ ivas_error IVAS_ENC_Open( * Initialize indices *-----------------------------------------------------------------*/ -#ifndef IND_LIST_DYN for ( i = 0; i < MAX_NUM_DATA; ++i ) { for ( j = 0; j < MAX_NUM_INDICES; ++j ) @@ -143,9 +142,7 @@ ivas_error IVAS_ENC_Open( ( *phIvasEnc )->ind_list[i][j].value = 0; } } -#endif -#ifndef IND_LIST_DYN for ( i = 0; i < MAX_NUM_METADATA; ++i ) { for ( j = 0; j < MAX_BITS_METADATA; ++j ) @@ -154,7 +151,6 @@ ivas_error IVAS_ENC_Open( ( *phIvasEnc )->ind_list_metadata[i][j].value = 0; } } -#endif /*-----------------------------------------------------------------* * Allocate IVAS-codec encoder state @@ -224,7 +220,13 @@ void IVAS_ENC_Close( ( *phIvasEnc )->st_ivas = NULL; +#ifdef BITSTREAM_INDICES_MEMORY +#define WMC_TOOL_SKIP free( *phIvasEnc ); +#undef WMC_TOOL_SKIP +#else + free( *phIvasEnc ); +#endif *phIvasEnc = NULL; phIvasEnc = NULL; @@ -364,7 +366,12 @@ ivas_error IVAS_ENC_ConfigureForObjects( const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */ const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */ const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ - const uint16_t numObjects /* i : number of objects to be encoded */ +#ifdef TD5 + const uint16_t numObjects, /* i : number of objects to be encoded */ + const bool ism_extended_metadata /* i : Extended metadata used (true/false), where extended metadata includes radius and orientation */ +#else + const uint16_t numObjects /* i : number of objects to be encoded */ +#endif ) { Encoder_Struct *st_ivas; @@ -384,7 +391,12 @@ ivas_error IVAS_ENC_ConfigureForObjects( st_ivas->hEncoderConfig->ivas_format = ISM_FORMAT; st_ivas->hEncoderConfig->element_mode_init = IVAS_SCE; st_ivas->hEncoderConfig->nchan_inp = numObjects; - +#ifdef NCHAN_ISM_PARAMETER + st_ivas->hEncoderConfig->nchan_ism = numObjects; +#endif +#ifdef TD5 + st_ivas->hEncoderConfig->ism_extended_metadata_flag = ism_extended_metadata; +#endif hIvasEnc->maxBandwidthUser = max_bwidth_user; error = configureEncoder( hIvasEnc, inputFs, bitrate, maxBandwidth, dtxConfig, IVAS_ENC_GetDefaultChannelAwareConfig() ); @@ -424,7 +436,12 @@ ivas_error IVAS_ENC_FeedObjectMetadata( return IVAS_ERR_INDEX_OUT_OF_BOUNDS; } +#ifdef TD5 + error = ivas_set_ism_metadata( hIvasEnc->st_ivas->hIsmMetaData[ismIndex], metadata.azimuth, metadata.elevation, metadata.radius, metadata.yaw, metadata.pitch ); +#else error = ivas_set_ism_metadata( hIvasEnc->st_ivas->hIsmMetaData[ismIndex], metadata.azimuth, metadata.elevation ); +#endif + if ( error != IVAS_ERR_OK ) { return error; @@ -871,22 +888,16 @@ static ivas_error configureEncoder( return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "8kHz input sampling rate is not supported in IVAS." ); } -#ifdef PARAM_ISM_DTX_CNG if ( hEncoderConfig->Opt_DTX_ON && hEncoderConfig->ivas_format != MONO_FORMAT && - ( ( hEncoderConfig->ivas_format == ISM_FORMAT && hEncoderConfig->nchan_inp == 2 ) || // ToDo: see Issue 113 - ( hEncoderConfig->ivas_format == ISM_FORMAT && hEncoderConfig->nchan_inp > 2 && hEncoderConfig->ivas_total_brate != IVAS_24k4 && hEncoderConfig->ivas_total_brate != IVAS_32k ) || // ParamISM - ( hEncoderConfig->ivas_format == MASA_FORMAT && hEncoderConfig->ivas_total_brate > IVAS_128k ) || // ToDo: remove the bitrate limitation - ( hEncoderConfig->ivas_format == SBA_FORMAT && ivas_get_sba_num_TCs( hEncoderConfig->ivas_total_brate, 1 ) > 2 ) || // ToDo: support for 3+ TCs to be done - hEncoderConfig->ivas_format == MC_FORMAT // ToDo: TBD - ) ) -#else - if ( hEncoderConfig->Opt_DTX_ON && hEncoderConfig->ivas_format != MONO_FORMAT && - ( ( hEncoderConfig->ivas_format == ISM_FORMAT && hEncoderConfig->nchan_inp > 1 ) || // ToDo: see Issue 113 - ( hEncoderConfig->ivas_format == MASA_FORMAT && hEncoderConfig->ivas_total_brate > IVAS_128k ) || // ToDo: remove the bitrate limitation - ( hEncoderConfig->ivas_format == SBA_FORMAT && ivas_get_sba_num_TCs( hEncoderConfig->ivas_total_brate, 1 ) > 2 ) || // ToDo: support for 3+ TCs to be done - hEncoderConfig->ivas_format == MC_FORMAT // ToDo: TBD - ) ) + ( +#ifndef DISCRETE_ISM_DTX_CNG + ( hEncoderConfig->ivas_format == ISM_FORMAT && hEncoderConfig->nchan_inp == 2 ) || // ToDo: see Issue 113 + ( hEncoderConfig->ivas_format == ISM_FORMAT && hEncoderConfig->nchan_inp > 2 && hEncoderConfig->ivas_total_brate != IVAS_24k4 && hEncoderConfig->ivas_total_brate != IVAS_32k ) || // ParamISM #endif + ( hEncoderConfig->ivas_format == MASA_FORMAT && hEncoderConfig->ivas_total_brate > IVAS_128k ) || // ToDo: remove the bitrate limitation + ( hEncoderConfig->ivas_format == SBA_FORMAT && ivas_get_sba_num_TCs( hEncoderConfig->ivas_total_brate, 1 ) > 2 ) || // ToDo: support for 3+ TCs to be done + hEncoderConfig->ivas_format == MC_FORMAT // ToDo: TBD + ) ) { return IVAS_ERROR( IVAS_ERR_DTX_NOT_SUPPORTED, "DTX is not supported in this IVAS format and element mode." ); } @@ -912,21 +923,12 @@ static ivas_error configureEncoder( * Finalize initialization *-----------------------------------------------------------------*/ - if ( ( error = ivas_init_encoder( st_ivas -#ifndef IND_LIST_DYN - , - hIvasEnc->ind_list -#endif -#ifndef IND_LIST_DYN - , - hIvasEnc->ind_list_metadata -#endif - ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_init_encoder( st_ivas, hIvasEnc->ind_list, hIvasEnc->ind_list_metadata ) ) != IVAS_ERR_OK ) { return error; } -#ifdef PARAM_ISM_DTX_CNG +#ifndef DISCRETE_ISM_DTX_CNG if ( hEncoderConfig->Opt_DTX_ON && ( hEncoderConfig->ivas_format == ISM_FORMAT ) && !( st_ivas->ism_mode == ISM_MODE_DISC && hEncoderConfig->nchan_inp == 1 ) && !( st_ivas->ism_mode == ISM_MODE_PARAM && ( hEncoderConfig->nchan_inp == 3 || hEncoderConfig->nchan_inp == 4 ) ) ) { return IVAS_ERROR( IVAS_ERR_UNKNOWN, "DTX is not supported in this IVAS format and element mode." ); @@ -1001,7 +1003,6 @@ static int16_t getInputBufferSize( return (int16_t) ( st_ivas->hEncoderConfig->input_Fs * st_ivas->hEncoderConfig->nchan_inp / FRAMES_PER_SEC ); } -#ifdef FIX_94_VERIFY_WAV_NUM_CHANNELS /*---------------------------------------------------------------------* * IVAS_ENC_GetNumInChannels() * @@ -1026,7 +1027,6 @@ ivas_error IVAS_ENC_GetNumInChannels( return IVAS_ERR_OK; } -#endif /*---------------------------------------------------------------------* @@ -1545,11 +1545,11 @@ static ivas_error printConfigInfo_enc( { if ( hEncoderConfig->ivas_total_brate <= ACELP_32k && hEncoderConfig->nchan_inp > 2 ) { - fprintf( stdout, "IVAS format: Param-ISm (%i streams)\n", hEncoderConfig->nchan_inp ); + fprintf( stdout, "IVAS format: Param-ISM (%i streams)\n", hEncoderConfig->nchan_inp ); } else { - fprintf( stdout, "IVAS format: ISm (%i streams)\n", hEncoderConfig->nchan_inp ); + fprintf( stdout, "IVAS format: ISM (%i streams)\n", hEncoderConfig->nchan_inp ); } } else if ( hEncoderConfig->ivas_format == SBA_FORMAT ) @@ -1992,7 +1992,6 @@ static ivas_error sanitizeBandwidth( static ivas_error sanitizeBitrateISM( const ENCODER_CONFIG_HANDLE hEncoderConfig ) { -#ifdef ISM_HIGHEST_BITRATE if ( hEncoderConfig->ivas_total_brate > IVAS_128k && hEncoderConfig->nchan_inp == 1 ) { return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too high bitrate for 1 ISM specified in IVAS: %d", hEncoderConfig->ivas_total_brate ); @@ -2007,12 +2006,6 @@ static ivas_error sanitizeBitrateISM( { return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too high bitrate for 3 ISM specified in IVAS: %d", hEncoderConfig->ivas_total_brate ); } -#else - if ( hEncoderConfig->ivas_total_brate > IVAS_256k ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too high bitrate for ISm specified in IVAS: %d", hEncoderConfig->ivas_total_brate ); - } -#endif if ( hEncoderConfig->ivas_total_brate < IVAS_16k4 && hEncoderConfig->nchan_inp == 2 ) { @@ -2029,6 +2022,13 @@ static ivas_error sanitizeBitrateISM( return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too low bitrate for 4 ISM specified in IVAS: %d", hEncoderConfig->ivas_total_brate ); } +#ifdef TD5 + if ( hEncoderConfig->ivas_total_brate < ISM_EXTENDED_METADATA_BRATE && hEncoderConfig->ism_extended_metadata_flag == 1 ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too low bitrate for extended metadata format specified in IVAS: %d", hEncoderConfig->ivas_total_brate ); + } +#endif + return IVAS_ERR_OK; } @@ -2284,8 +2284,14 @@ static void init_encoder_config( hEncoderConfig->var_SID_rate_flag = 1; hEncoderConfig->mc_input_setup = MC_LS_SETUP_INVALID; hEncoderConfig->stereo_dmx_evs = 0; +#ifdef NCHAN_ISM_PARAMETER + hEncoderConfig->nchan_ism = 0; +#endif hEncoderConfig->sba_order = 0; hEncoderConfig->sba_planar = 0; +#ifdef TD5 + hEncoderConfig->ism_extended_metadata_flag = 0; +#endif #ifdef DEBUGGING hEncoderConfig->stereo_mode_cmdl = 0; hEncoderConfig->force = -1; diff --git a/lib_enc/lib_enc.h b/lib_enc/lib_enc.h index 7430822642..37fd4b4dee 100644 --- a/lib_enc/lib_enc.h +++ b/lib_enc/lib_enc.h @@ -180,7 +180,12 @@ ivas_error IVAS_ENC_ConfigureForObjects( const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */ const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */ const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ +#ifdef TD5 + const uint16_t numObjects, /* i : number of objects to be encoded */ + const bool ism_extended_metadata /* i : Extended metadata used (true/false), where extended metadata includes radius and orientation */ +#else const uint16_t numObjects /* i : number of objects to be encoded */ +#endif ); /*! r: error code */ @@ -298,13 +303,11 @@ ivas_error IVAS_ENC_GetDelay( int16_t *delay /* o : encoder delay */ ); -#ifdef FIX_94_VERIFY_WAV_NUM_CHANNELS /*! r: encoder error code */ ivas_error IVAS_ENC_GetNumInChannels( const IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ int16_t *numInChannels /* o : total number of samples expected in the input buffer for current encoder configuration */ ); -#endif /*! r: encoder error code */ ivas_error IVAS_ENC_GetInputBufferSize( diff --git a/lib_enc/pre_proc.c b/lib_enc/pre_proc.c index 300cb79787..bbeba48a16 100644 --- a/lib_enc/pre_proc.c +++ b/lib_enc/pre_proc.c @@ -219,7 +219,12 @@ void pre_proc( * NB/WB/SWB/FB bandwidth detector *----------------------------------------------------------------*/ - bw_detect( st, st->input, NULL, enerBuffer ); + bw_detect( st, st->input, NULL, enerBuffer +#ifdef FIX_MDCT_BASED_BWD + , + 0 +#endif + ); /*----------------------------------------------------------------* * Noise energy down-ward update and total noise energy estimation diff --git a/lib_enc/rst_enc.c b/lib_enc/rst_enc.c index 2f19c41665..3a20418759 100644 --- a/lib_enc/rst_enc.c +++ b/lib_enc/rst_enc.c @@ -84,15 +84,11 @@ void CNG_reset_enc( set_f( voice_factors, 1.0, NB_SUBFR16k ); -#ifdef PARAM_ISM_DTX_CNG if ( st->hTdCngEnc != NULL ) { -#endif /* Reset active frame counter */ st->hTdCngEnc->act_cnt2 = 0; -#ifdef PARAM_ISM_DTX_CNG } -#endif /* deactivate bass post-filter */ st->bpf_off = 1; diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index c37ed76dc7..ec7fb594d1 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -51,20 +51,11 @@ * Indice *------------------------------------------------------------------------------------------*/ -#ifdef IND_LIST_DYN -typedef struct -{ - int16_t id; /* id of the indice */ - uint16_t value; /* value of the quantized indice */ - int16_t nb_bits; /* number of bits used for the quantization of the indice */ -} Indice, *INDICE_HANDLE; -#else typedef struct { uint16_t value; /* value of the quantized indice */ int16_t nb_bits; /* number of bits used for the quantization of the indice */ } Indice; -#endif /*----------------------------------------------------------------------------------* * Bitstream structure @@ -72,16 +63,11 @@ typedef struct typedef struct bitstream_enc_data_structure { -#ifdef IND_LIST_DYN - int16_t nb_ind_tot; /* total number of indices already written */ -#endif int16_t nb_bits_tot; /* total number of bits already written */ Indice *ind_list; /* list of indices */ -#ifndef IND_LIST_DYN - int16_t next_ind; /* pointer to the next empty slot in the list of indices */ - int16_t last_ind; /* last written indice */ -#endif - int16_t max_num_indices; /* maximum number of indices in the list */ + int16_t next_ind; /* pointer to the next empty slot in the list of indices */ + int16_t last_ind; /* last written indice */ + } BSTR_ENC_DATA, *BSTR_ENC_HANDLE; /*----------------------------------------------------------------------------------* diff --git a/lib_enc/tcx_utils_enc.c b/lib_enc/tcx_utils_enc.c index 2dd5340992..ba709f0158 100644 --- a/lib_enc/tcx_utils_enc.c +++ b/lib_enc/tcx_utils_enc.c @@ -1486,19 +1486,11 @@ void ProcessIGF( } else { -#ifdef IND_LIST_DYN - pBsStart = hBstr->nb_ind_tot; -#else pBsStart = hBstr->next_ind; -#endif IGFEncWriteBitstream( hIGFEnc, hBstr, &hIGFEnc->infoTotalBitsPerFrameWritten, igfGridIdx, isIndepFlag ); -#ifdef IND_LIST_DYN - bsBits = hBstr->nb_ind_tot - pBsStart; -#else bsBits = hBstr->next_ind - pBsStart; -#endif IGFEncConcatenateBitstream( hIGFEnc, bsBits, hBstr ); } @@ -1578,19 +1570,11 @@ void ProcessStereoIGF( else { hBstr = sts[ch]->hBstr; -#ifdef IND_LIST_DYN - pBsStart = hBstr->nb_ind_tot; -#else pBsStart = hBstr->next_ind; -#endif IGFEncWriteBitstream( hIGFEnc[ch], hBstr, &hIGFEnc[ch]->infoTotalBitsPerFrameWritten, igfGridIdx, isIndepFlag ); -#ifdef IND_LIST_DYN - bsBits = hBstr->nb_ind_tot - pBsStart; -#else bsBits = hBstr->next_ind - pBsStart; -#endif IGFEncConcatenateBitstream( hIGFEnc[ch], bsBits, hBstr ); } } diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index caf9a562d5..c4941b610c 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -147,1225 +147,6 @@ static ivas_error ivas_hrtf_close( return IVAS_ERR_OK; } - -#ifndef FIX_197_CREND_INTERFACE -/*------------------------------------------------------------------------- - * ivas_crend_init_from_rom() - * - * Allocate and initialize crend renderer handle - *------------------------------------------------------------------------*/ - -ivas_error ivas_crend_init_from_rom( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -) -{ - int16_t i, j, tmp; - int32_t output_Fs; - AUDIO_CONFIG intern_config; - HRTFS_HANDLE hHrtf; - -#ifdef FIX_197_CREND_INTERFACE - hHrtf = st_ivas->hCrendWrapper->hHrtfCrend; -#else - hHrtf = st_ivas->hHrtf; -#endif - - output_Fs = st_ivas->hDecoderConfig->output_Fs; - - intern_config = st_ivas->intern_config; - - if ( intern_config == AUDIO_CONFIG_BINAURAL || intern_config == AUDIO_CONFIG_BINAURAL_ROOM ) - { - return IVAS_ERR_INTERNAL_FATAL; - } - - if ( hHrtf == NULL ) - { - if ( ivas_hrtf_open( &hHrtf ) != IVAS_ERR_OK ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for HRTF handle" ); - } - } - - hHrtf->max_num_ir = audioCfg2channels( intern_config ); - - if ( hHrtf->max_num_ir <= 0 ) - { - return IVAS_ERR_INTERNAL_FATAL; - } - - /* Do all error checks up front so that the nested if later is easier */ - if ( st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV && st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Encountered unsupported renderer type" ); - } - - if ( intern_config != AUDIO_CONFIG_5_1 && intern_config != AUDIO_CONFIG_5_1_2 && intern_config != AUDIO_CONFIG_5_1_4 && - intern_config != AUDIO_CONFIG_7_1 && intern_config != AUDIO_CONFIG_7_1_4 && - intern_config != AUDIO_CONFIG_FOA && intern_config != AUDIO_CONFIG_HOA2 && intern_config != AUDIO_CONFIG_HOA3 ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Encountered unsupported transport config in Crend" ); - } - - if ( ( ( st_ivas->hRenderConfig != NULL ) && !st_ivas->hRenderConfig->roomAcoustics.use_brir ) || ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV ) ) - { - if ( intern_config == AUDIO_CONFIG_5_1 || intern_config == AUDIO_CONFIG_5_1_2 || intern_config == AUDIO_CONFIG_5_1_4 || - intern_config == AUDIO_CONFIG_7_1 || intern_config == AUDIO_CONFIG_7_1_4 ) - { - hHrtf->max_num_ir -= 1; /* subtract LFE */ - hHrtf->gain_lfe = GAIN_LFE; - - if ( output_Fs == 48000 ) - { - hHrtf->latency_s = CRendBin_Combined_HRIR_latency_s; - - hHrtf->max_num_iterations = CRendBin_Combined_HRIR_max_num_iterations_48kHz; - hHrtf->index_frequency_max_diffuse = CRendBin_Combined_HRIR_index_frequency_max_diffuse_48kHz; - - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_HRIR_num_iterations_diffuse_48kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_HRIR_coeff_diffuse_re_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_HRIR_coeff_diffuse_im_48kHz[j]; - } - } - else if ( output_Fs == 32000 ) - { - hHrtf->latency_s = CRendBin_Combined_HRIR_latency_s; - - hHrtf->max_num_iterations = CRendBin_Combined_HRIR_max_num_iterations_32kHz; - hHrtf->index_frequency_max_diffuse = CRendBin_Combined_HRIR_index_frequency_max_diffuse_32kHz; - - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_HRIR_num_iterations_diffuse_32kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_HRIR_coeff_diffuse_re_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_HRIR_coeff_diffuse_im_32kHz[j]; - } - } - else if ( output_Fs == 16000 ) - { - hHrtf->latency_s = CRendBin_Combined_HRIR_latency_s; - - hHrtf->max_num_iterations = CRendBin_Combined_HRIR_max_num_iterations_16kHz; - hHrtf->index_frequency_max_diffuse = CRendBin_Combined_HRIR_index_frequency_max_diffuse_16kHz; - - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_HRIR_num_iterations_diffuse_16kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz[j]; - } - } - else - { - return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" ); - } - - for ( i = 0; i < hHrtf->max_num_ir; i++ ) - { - if ( intern_config == AUDIO_CONFIG_5_1 ) - { - tmp = channelIndex_CICP6[i]; - } - else if ( intern_config == AUDIO_CONFIG_7_1 ) - { - tmp = channelIndex_CICP12[i]; - } - else if ( intern_config == AUDIO_CONFIG_5_1_2 ) - { - tmp = channelIndex_CICP14[i]; - } - else if ( intern_config == AUDIO_CONFIG_5_1_4 ) - { - tmp = channelIndex_CICP16[i]; - } - else if ( intern_config == AUDIO_CONFIG_7_1_4 ) - { - tmp = channelIndex_CICP19[i]; - } - else - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: Channel configuration not specified!\n\n" ); - } - - if ( output_Fs == 48000 ) - { - hHrtf->inv_diffuse_weight[i] = CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz[tmp]; - - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations[i][j] = CRendBin_Combined_HRIR_num_iterations_48kHz[tmp][j]; - hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_HRIR_pIndex_frequency_max_48kHz[tmp][j]; - hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_HRIR_coeff_re_48kHz[tmp][j]; - hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_HRIR_coeff_im_48kHz[tmp][j]; - } - } - else if ( output_Fs == 32000 ) - { - hHrtf->inv_diffuse_weight[i] = CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz[tmp]; - - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations[i][j] = CRendBin_Combined_HRIR_num_iterations_32kHz[tmp][j]; - hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_HRIR_pIndex_frequency_max_32kHz[tmp][j]; - hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_HRIR_coeff_re_32kHz[tmp][j]; - hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_HRIR_coeff_im_32kHz[tmp][j]; - } - } - else if ( output_Fs == 16000 ) - { - hHrtf->inv_diffuse_weight[i] = CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz[tmp]; - - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations[i][j] = CRendBin_Combined_HRIR_num_iterations_16kHz[tmp][j]; - hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_HRIR_pIndex_frequency_max_16kHz[tmp][j]; - hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_HRIR_coeff_re_16kHz[tmp][j]; - hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_HRIR_coeff_im_16kHz[tmp][j]; - } - } - else - { - return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" ); - } - } - } - else if ( intern_config == AUDIO_CONFIG_FOA || intern_config == AUDIO_CONFIG_HOA2 || intern_config == AUDIO_CONFIG_HOA3 ) - { - if ( output_Fs == 48000 ) - { - hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s; - - hHrtf->max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_48kHz; - hHrtf->index_frequency_max_diffuse = CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz; - - for ( i = 0; i < hHrtf->max_num_ir; i++ ) - { - hHrtf->inv_diffuse_weight[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz[i]; - - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_48kHz[i][j]; - hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[i][j]; - hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_48kHz[i][j]; - hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_48kHz[i][j]; - } - } - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[j]; - } - } - else if ( output_Fs == 32000 ) - { - hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s; - - hHrtf->max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_32kHz; - hHrtf->index_frequency_max_diffuse = CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz; - - for ( i = 0; i < hHrtf->max_num_ir; i++ ) - { - hHrtf->inv_diffuse_weight[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz[i]; - - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_32kHz[i][j]; - hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[i][j]; - hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_32kHz[i][j]; - hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_32kHz[i][j]; - } - } - - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[j]; - } - } - else if ( output_Fs == 16000 ) - { - hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s; - - hHrtf->max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_16kHz; - hHrtf->index_frequency_max_diffuse = CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz; - - for ( i = 0; i < hHrtf->max_num_ir; i++ ) - { - hHrtf->inv_diffuse_weight[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[i]; - - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_16kHz[i][j]; - hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[i][j]; - hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_16kHz[i][j]; - hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_16kHz[i][j]; - } - } - - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[j]; - } - } - else - { - return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" ); - } - } - } - else if ( ( ( st_ivas->hRenderConfig != NULL ) && st_ivas->hRenderConfig->roomAcoustics.use_brir ) || ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) - { - if ( intern_config == AUDIO_CONFIG_5_1 || intern_config == AUDIO_CONFIG_5_1_2 || intern_config == AUDIO_CONFIG_5_1_4 || - intern_config == AUDIO_CONFIG_7_1 || intern_config == AUDIO_CONFIG_7_1_4 ) - { - hHrtf->max_num_ir -= 1; /* subtract LFE */ - hHrtf->gain_lfe = GAIN_LFE; - - if ( output_Fs == 48000 ) - { - hHrtf->latency_s = CRendBin_Combined_BRIR_latency_s; - - hHrtf->max_num_iterations = CRendBin_Combined_BRIR_max_num_iterations_48kHz; - hHrtf->index_frequency_max_diffuse = CRendBin_Combined_BRIR_index_frequency_max_diffuse_48kHz; - - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_BRIR_num_iterations_diffuse_48kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_BRIR_coeff_diffuse_re_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_BRIR_coeff_diffuse_im_48kHz[j]; - } - } - else if ( output_Fs == 32000 ) - { - hHrtf->latency_s = CRendBin_Combined_BRIR_latency_s; - - hHrtf->max_num_iterations = CRendBin_Combined_BRIR_max_num_iterations_32kHz; - hHrtf->index_frequency_max_diffuse = CRendBin_Combined_BRIR_index_frequency_max_diffuse_32kHz; - - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_BRIR_num_iterations_diffuse_32kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_BRIR_coeff_diffuse_re_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_BRIR_coeff_diffuse_im_32kHz[j]; - } - } - else if ( output_Fs == 16000 ) - { - hHrtf->latency_s = CRendBin_Combined_BRIR_latency_s; - - hHrtf->max_num_iterations = CRendBin_Combined_BRIR_max_num_iterations_16kHz; - hHrtf->index_frequency_max_diffuse = CRendBin_Combined_BRIR_index_frequency_max_diffuse_16kHz; - - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_BRIR_num_iterations_diffuse_16kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_BRIR_coeff_diffuse_re_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz[j]; - } - } - else - { - return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" ); - } - - for ( i = 0; i < hHrtf->max_num_ir; i++ ) - { - if ( intern_config == AUDIO_CONFIG_5_1 ) - { - tmp = channelIndex_CICP6[i]; - } - else if ( intern_config == AUDIO_CONFIG_7_1 ) - { - tmp = channelIndex_CICP12[i]; - } - else if ( intern_config == AUDIO_CONFIG_5_1_2 ) - { - tmp = channelIndex_CICP14[i]; - } - else if ( intern_config == AUDIO_CONFIG_5_1_4 ) - { - tmp = channelIndex_CICP16[i]; - } - else if ( intern_config == AUDIO_CONFIG_7_1_4 ) - { - tmp = channelIndex_CICP19[i]; - } - else - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: Channel configuration not specified!\n\n" ); - } - - if ( output_Fs == 48000 ) - { - hHrtf->inv_diffuse_weight[i] = CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz[tmp]; - - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_48kHz[tmp][j]; - hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz[tmp][j]; - hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_BRIR_coeff_re_48kHz[tmp][j]; - hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_BRIR_coeff_im_48kHz[tmp][j]; - } - } - else if ( output_Fs == 32000 ) - { - hHrtf->inv_diffuse_weight[i] = CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz[tmp]; - - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_32kHz[tmp][j]; - hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz[tmp][j]; - hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_BRIR_coeff_re_32kHz[tmp][j]; - hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_BRIR_coeff_im_32kHz[tmp][j]; - } - } - else if ( output_Fs == 16000 ) - { - hHrtf->inv_diffuse_weight[i] = CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz[tmp]; - - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_16kHz[tmp][j]; - hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz[tmp][j]; - hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_BRIR_coeff_re_16kHz[tmp][j]; - hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_BRIR_coeff_im_16kHz[tmp][j]; - } - } - else - { - return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" ); - } - } - } - else if ( intern_config == AUDIO_CONFIG_FOA || intern_config == AUDIO_CONFIG_HOA2 || intern_config == AUDIO_CONFIG_HOA3 ) - { - if ( output_Fs == 48000 ) - { - hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s; - - hHrtf->max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_48kHz; - hHrtf->index_frequency_max_diffuse = CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz; - - for ( i = 0; i < hHrtf->max_num_ir; i++ ) - { - hHrtf->inv_diffuse_weight[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz[i]; - - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_48kHz[i][j]; - hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[i][j]; - hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_48kHz[i][j]; - hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_48kHz[i][j]; - } - } - - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[j]; - } - } - else if ( output_Fs == 32000 ) - { - hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s; - - hHrtf->max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_32kHz; - hHrtf->index_frequency_max_diffuse = CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz; - - for ( i = 0; i < hHrtf->max_num_ir; i++ ) - { - hHrtf->inv_diffuse_weight[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz[i]; - - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_32kHz[i][j]; - hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[i][j]; - hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_32kHz[i][j]; - hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_32kHz[i][j]; - } - } - - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[j]; - } - } - else if ( output_Fs == 16000 ) - { - hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s; - - hHrtf->max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_16kHz; - hHrtf->index_frequency_max_diffuse = CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz; - - for ( i = 0; i < hHrtf->max_num_ir; i++ ) - { - hHrtf->inv_diffuse_weight[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[i]; - - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_16kHz[i][j]; - hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[i][j]; - hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_16kHz[i][j]; - hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_16kHz[i][j]; - } - } - - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[j]; - } - } - else - { - return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" ); - } - } - else - { - return IVAS_ERROR( IVAS_ERR_INTERNAL, "Unsupported intern_config type in Crend" ); - } - } - else - { - return IVAS_ERROR( IVAS_ERR_INTERNAL, "Unsupported renderer type in Crend" ); - } - -#ifdef FIX_197_CREND_INTERFACE - st_ivas->hCrendWrapper->hHrtfCrend = hHrtf; -#else - st_ivas->hHrtf = hHrtf; -#endif - - return IVAS_ERR_OK; -} -#endif - -#ifndef FIX_197_CREND_INTERFACE -/*------------------------------------------------------------------------- - * ivas_crend_init_from_hrtf_handle() - * - * Allocate and initialize Crend HRTF handle from external file - *------------------------------------------------------------------------*/ - -ivas_error ivas_crend_init_from_hrtf_handle( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - HRTFS_HANDLE hrtf ) -{ - int16_t i, j, as_lfe_filter; - const int16_t *hchannelIndex = NULL; - AUDIO_CONFIG transport_config; - - if ( st_ivas == NULL ) - { - return IVAS_ERR_INTERNAL; - } - - if ( hrtf == NULL ) - { - return IVAS_ERR_INVALID_HRTF; - } - - if ( st_ivas->hHrtf != NULL ) - { - ivas_hrtf_close( &st_ivas->hHrtf ); - } - - if ( ivas_hrtf_open( &( st_ivas->hHrtf ) ) != IVAS_ERR_OK ) - { - return IVAS_ERR_INTERNAL; - } - - if ( st_ivas->hHrtf != NULL ) - { - st_ivas->hHrtf->latency_s = hrtf->latency_s; - // st_ivas->hHrtf->max_num_ir->max_ir_len = hrtf->max_ir_len; - st_ivas->hHrtf->max_num_iterations = hrtf->max_num_iterations; - st_ivas->hHrtf->gain_lfe = hrtf->gain_lfe; - // st_ivas->hHrtf->crend_hr_gain_foa_to_bin = hrtf->crend_hr_gain_foa_to_bin; - st_ivas->hHrtf->max_num_ir = 0; - st_ivas->hIntSetup.nchan_out_woLFE = 0; - st_ivas->hIntSetup.num_lfe = 0; - st_ivas->hIntSetup.nchan_out_woLFE = 0; - - transport_config = st_ivas->intern_config == AUDIO_CONFIG_INVALID ? st_ivas->transport_config : st_ivas->intern_config; - - switch ( transport_config ) - { - case AUDIO_CONFIG_5_1: - st_ivas->hHrtf->max_num_ir = 5; - st_ivas->hHrtf->gain_lfe = GAIN_LFE; - st_ivas->hIntSetup.nchan_out_woLFE = st_ivas->hHrtf->max_num_ir; - st_ivas->hIntSetup.num_lfe = 1; - hchannelIndex = (const int16_t *) &channelIndex_CICP6; - break; - case AUDIO_CONFIG_7_1: - st_ivas->hHrtf->max_num_ir = 7; - st_ivas->hHrtf->gain_lfe = GAIN_LFE; - st_ivas->hIntSetup.nchan_out_woLFE = st_ivas->hHrtf->max_num_ir; - st_ivas->hIntSetup.num_lfe = 1; - hchannelIndex = (const int16_t *) &channelIndex_CICP12; - break; - case AUDIO_CONFIG_5_1_2: - st_ivas->hHrtf->max_num_ir = 7; - st_ivas->hHrtf->gain_lfe = GAIN_LFE; - st_ivas->hIntSetup.nchan_out_woLFE = st_ivas->hHrtf->max_num_ir; - st_ivas->hIntSetup.num_lfe = 1; - hchannelIndex = (const int16_t *) &channelIndex_CICP14; - break; - case AUDIO_CONFIG_5_1_4: - st_ivas->hHrtf->max_num_ir = 9; - st_ivas->hHrtf->gain_lfe = GAIN_LFE; - st_ivas->hIntSetup.nchan_out_woLFE = st_ivas->hHrtf->max_num_ir; - st_ivas->hIntSetup.num_lfe = 1; - hchannelIndex = (const int16_t *) &channelIndex_CICP16; - break; - case AUDIO_CONFIG_7_1_4: - st_ivas->hHrtf->max_num_ir = 11; - st_ivas->hHrtf->gain_lfe = GAIN_LFE; - st_ivas->hIntSetup.nchan_out_woLFE = st_ivas->hHrtf->max_num_ir; - st_ivas->hIntSetup.num_lfe = 1; - hchannelIndex = (const int16_t *) &channelIndex_CICP19; - break; - case AUDIO_CONFIG_FOA: - st_ivas->hIntSetup.ambisonics_order = 1; - st_ivas->hHrtf->max_num_ir = 4; - break; - case AUDIO_CONFIG_HOA2: - st_ivas->hIntSetup.ambisonics_order = 2; - st_ivas->hHrtf->max_num_ir = 9; - break; - case AUDIO_CONFIG_HOA3: - st_ivas->hIntSetup.ambisonics_order = 3; - st_ivas->hHrtf->max_num_ir = 16; - break; - default: - break; - } - - as_lfe_filter = 0; - if ( ( st_ivas->hHrtf->max_num_ir != hrtf->max_num_ir ) && ( st_ivas->hHrtf->max_num_ir + 1 == hrtf->max_num_ir ) ) - { - as_lfe_filter = 1; - hchannelIndex = NULL; - } - - if ( st_ivas->hHrtf->max_num_ir == 0 ) - { - return IVAS_ERR_INTERNAL; - } - - for ( i = 0; i < st_ivas->hHrtf->max_num_ir; i++ ) - { - int16_t tmp = i; - if ( hchannelIndex != NULL ) - { - tmp = hchannelIndex[i]; - } - if ( as_lfe_filter ) - { - if ( tmp > 2 ) - { - tmp++; - } - } - - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - st_ivas->hHrtf->pOut_to_bin_re[i][j] = hrtf->pOut_to_bin_re[tmp][j]; - st_ivas->hHrtf->pOut_to_bin_im[i][j] = hrtf->pOut_to_bin_im[tmp][j]; - st_ivas->hHrtf->num_iterations[i][j] = hrtf->num_iterations[tmp][j]; - st_ivas->hHrtf->pIndex_frequency_max[i][j] = hrtf->pIndex_frequency_max[tmp][j]; - } - st_ivas->hHrtf->inv_diffuse_weight[i] = hrtf->inv_diffuse_weight[tmp]; - } - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - st_ivas->hHrtf->pOut_to_bin_diffuse_re[j] = hrtf->pOut_to_bin_diffuse_re[j]; - st_ivas->hHrtf->pOut_to_bin_diffuse_im[j] = hrtf->pOut_to_bin_diffuse_im[j]; - st_ivas->hHrtf->num_iterations_diffuse[j] = hrtf->num_iterations_diffuse[j]; - st_ivas->hHrtf->pIndex_frequency_max_diffuse[j] = hrtf->pIndex_frequency_max_diffuse[j]; - } - st_ivas->hHrtf->index_frequency_max_diffuse = hrtf->index_frequency_max_diffuse; - } - return IVAS_ERR_OK; -} - -/*------------------------------------------------------------------------- - * ivas_crend_init_from_setofhrtf() - * - * Allocate and initialize crend renderer handle - *------------------------------------------------------------------------*/ - -ivas_error ivas_crend_init_from_setofhrtf( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -) -{ - ivas_error error; - AUDIO_CONFIG transport_config; - - transport_config = st_ivas->intern_config == AUDIO_CONFIG_INVALID ? st_ivas->transport_config : st_ivas->intern_config; - switch ( transport_config ) - { - case AUDIO_CONFIG_5_1: - case AUDIO_CONFIG_5_1_2: - case AUDIO_CONFIG_5_1_4: - case AUDIO_CONFIG_7_1: - case AUDIO_CONFIG_7_1_4: - if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) - { - if ( ( error = ivas_crend_init_from_hrtf_handle( st_ivas, st_ivas->hSetOfHRTF->hHRTF_brir_combined ) ) != IVAS_ERR_OK ) - { - return error; - } - } - else - { - if ( ( error = ivas_crend_init_from_hrtf_handle( st_ivas, st_ivas->hSetOfHRTF->hHRTF_hrir_combined ) ) != IVAS_ERR_OK ) - { - return error; - } - } - break; - case AUDIO_CONFIG_FOA: - case AUDIO_CONFIG_HOA2: - case AUDIO_CONFIG_HOA3: - if ( ( error = ivas_crend_init_from_hrtf_handle( st_ivas, st_ivas->hSetOfHRTF->hHRTF_hrir_hoa3 ) ) != IVAS_ERR_OK ) - { - return error; - } - break; - default: - return IVAS_ERR_INTERNAL; - } - - return IVAS_ERR_OK; -} - -#endif - -#ifndef FIX_197_CREND_INTERFACE -/*------------------------------------------------------------------------- - * ivas_crend_open() - * - * Allocate and initialize Crend renderer handle - *------------------------------------------------------------------------*/ - -ivas_error ivas_crend_open( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -) -{ - int16_t i, subframe_length; - int16_t max_total_ir_len; - HRTFS_HANDLE hHrtf; - CREND_HANDLE hCrend; - ivas_error error; - - error = IVAS_ERR_OK; - subframe_length = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ) / MAX_PARAM_SPATIAL_SUBFRAMES; - - if ( ( st_ivas->hHrtf == NULL ) && ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) - { - if ( st_ivas->hSetOfHRTF != NULL ) - { - if ( ( error = ivas_crend_init_from_setofhrtf( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - } - else - { - if ( ( error = ivas_crend_init_from_rom( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - } - } - - if ( ( hCrend = (CREND_HANDLE) malloc( sizeof( CREND_DATA ) ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for renderer handle" ); - } - - hCrend->lfe_delay_line = NULL; - - for ( i = 0; i < MAX_INTERN_CHANNELS; i++ ) - { - hCrend->freq_buffer_re[i] = NULL; - hCrend->freq_buffer_im[i] = NULL; - } - - for ( i = 0; i < BINAURAL_CHANNELS; i++ ) - { - hCrend->prev_out_buffer[i] = NULL; - } - - hCrend->freq_buffer_re_diffuse = NULL; - hCrend->freq_buffer_im_diffuse = NULL; - hCrend->hReverb = NULL; - hCrend->delay_line_rw_index = 0; - hCrend->diffuse_delay_line_rw_index = 0; - hCrend->hTrack = NULL; - hCrend->m_fYaw = 0; - hCrend->m_fPitch = 0; - hCrend->m_fRoll = 0; - - hHrtf = st_ivas->hHrtf; - - if ( ( hHrtf != NULL ) && ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) - { - max_total_ir_len = hHrtf->max_num_iterations * subframe_length; - - for ( i = 0; i < hHrtf->max_num_ir; i++ ) - { - if ( ( hCrend->freq_buffer_re[i] = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); - } - set_f( hCrend->freq_buffer_re[i], 0, max_total_ir_len ); - - if ( ( hCrend->freq_buffer_im[i] = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); - } - set_f( hCrend->freq_buffer_im[i], 0, max_total_ir_len ); - } - - for ( i = 0; i < BINAURAL_CHANNELS; i++ ) - { - if ( ( hCrend->prev_out_buffer[i] = (float *) malloc( sizeof( float ) * subframe_length ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); - } - set_f( hCrend->prev_out_buffer[i], 0, subframe_length ); - } - - max_total_ir_len = hHrtf->num_iterations_diffuse[0] * subframe_length; - - if ( max_total_ir_len > 0 ) - { - if ( ( hCrend->freq_buffer_re_diffuse = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); - } - set_f( hCrend->freq_buffer_re_diffuse, 0, max_total_ir_len ); - - if ( ( hCrend->freq_buffer_im_diffuse = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); - } - set_f( hCrend->freq_buffer_im_diffuse, 0, max_total_ir_len ); - } - else - { - hCrend->freq_buffer_re_diffuse = NULL; - hCrend->freq_buffer_im_diffuse = NULL; - } - - max_total_ir_len = (int16_t) ( hHrtf->latency_s * st_ivas->hDecoderConfig->output_Fs + 0.5f ) + subframe_length; - if ( max_total_ir_len > 0 ) - { - if ( ( hCrend->lfe_delay_line = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); - } - set_f( hCrend->lfe_delay_line, 0, max_total_ir_len ); - } - else - { - hCrend->lfe_delay_line = NULL; - } - - if ( st_ivas->hDecoderConfig->Opt_Headrotation ) - { - if ( ( hCrend->hTrack = (ivas_orient_trk_state_t *) malloc( sizeof( ivas_orient_trk_state_t ) ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Orientation tracking" ); - } - - ivas_orient_trk_Init( hCrend->hTrack ); - } - else - { - hCrend->hTrack = NULL; - } - - if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM && st_ivas->ivas_format == MC_FORMAT && st_ivas->hDecoderConfig->Opt_Headrotation ) - { - if ( ( error = efap_init_data( &( st_ivas->hEFAPdata ), st_ivas->hIntSetup.ls_azimuth, st_ivas->hIntSetup.ls_elevation, st_ivas->hIntSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - if ( ( ( st_ivas->hRenderConfig != NULL ) && st_ivas->hRenderConfig->roomAcoustics.late_reverb_on ) ) - { - if ( ( error = ivas_reverb_open( &( hCrend->hReverb ), st_ivas->intern_config, hHrtf, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) - { - return error; - } - } - else - { - hCrend->hReverb = NULL; - } - - st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtf->latency_s * 1000000000.f ); - } - - st_ivas->hCrend = hCrend; - - return error; -} -#endif - -#ifndef FIX_197_CREND_INTERFACE - -/*------------------------------------------------------------------------- - * ivas_crend_close() - * - * Deallocate Crend renderer handle - *------------------------------------------------------------------------*/ - -ivas_error ivas_crend_close( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -) -{ - int16_t i; - - if ( st_ivas->hHrtf != NULL ) - { - ivas_hrtf_close( &st_ivas->hHrtf ); - } - - if ( st_ivas->hCrend != NULL ) - { - if ( st_ivas->renderer_type != RENDERER_BINAURAL_OBJECTS_TD ) - { - for ( i = 0; i < MAX_INTERN_CHANNELS; i++ ) - { - if ( st_ivas->hCrend->freq_buffer_re[i] != NULL ) - { - free( st_ivas->hCrend->freq_buffer_re[i] ); - st_ivas->hCrend->freq_buffer_re[i] = NULL; - } - if ( st_ivas->hCrend->freq_buffer_im[i] != NULL ) - { - free( st_ivas->hCrend->freq_buffer_im[i] ); - st_ivas->hCrend->freq_buffer_im[i] = NULL; - } - } - - for ( i = 0; i < BINAURAL_CHANNELS; i++ ) - { - if ( st_ivas->hCrend->prev_out_buffer[i] != NULL ) - { - free( st_ivas->hCrend->prev_out_buffer[i] ); - st_ivas->hCrend->prev_out_buffer[i] = NULL; - } - } - - if ( st_ivas->hCrend->lfe_delay_line != NULL ) - { - free( st_ivas->hCrend->lfe_delay_line ); - st_ivas->hCrend->lfe_delay_line = NULL; - } - - if ( st_ivas->hCrend->freq_buffer_re_diffuse != NULL ) - { - free( st_ivas->hCrend->freq_buffer_re_diffuse ); - st_ivas->hCrend->freq_buffer_re_diffuse = NULL; - } - - if ( st_ivas->hCrend->freq_buffer_im_diffuse != NULL ) - { - free( st_ivas->hCrend->freq_buffer_im_diffuse ); - st_ivas->hCrend->freq_buffer_im_diffuse = NULL; - } - - if ( st_ivas->hCrend->hTrack != NULL ) - { - free( st_ivas->hCrend->hTrack ); - st_ivas->hCrend->hTrack = NULL; - } - } - - ivas_reverb_close( &st_ivas->hCrend->hReverb ); - - free( st_ivas->hCrend ); - st_ivas->hCrend = NULL; - } - - return IVAS_ERR_OK; -} -#endif - -#ifndef FIX_197_CREND_INTERFACE - -/*-----------------------------------------------------------------------------------------* - * Function ivas_crend_convolver() - * - * Convolver block - *-----------------------------------------------------------------------------------------*/ - -static ivas_error ivas_crend_convolver( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - float pcm_in[][L_FRAME48k], - float pcm_out[][L_FRAME48k], - const int16_t i_ts ) -{ - float *pIn; - float *pFreq_buf_re; - float *pFreq_buf_im; - float *pFreq_filt_re; - float *pFreq_filt_im; - int16_t i, j, k, m, nchan_out, subframe_length, nchan_intern, idx_in; - float pOut[L_FRAME48k * 2]; - float tmp_out_re[L_FRAME48k], tmp_out_im[L_FRAME48k]; - int16_t offset, offset_in, offset_diffuse; - int32_t output_Fs; - - nchan_intern = audioCfg2channels( st_ivas->intern_config ); - nchan_out = st_ivas->hDecoderConfig->nchan_out; - output_Fs = st_ivas->hDecoderConfig->output_Fs; - subframe_length = (int16_t) ( output_Fs / FRAMES_PER_SEC ) / MAX_PARAM_SPATIAL_SUBFRAMES; - - offset = st_ivas->hCrend->delay_line_rw_index * subframe_length; /* subframe_length * ( st_ivas->hHrtf->max_num_iterations - 1 ); */ - offset_diffuse = st_ivas->hCrend->diffuse_delay_line_rw_index * subframe_length; /* subframe_length *( st_ivas->hHrtf->num_iterations_diffuse[0] - 1 ); */ - - if ( st_ivas->hHrtf->num_iterations_diffuse[0] > 0 ) - { - set_zero( &st_ivas->hCrend->freq_buffer_re_diffuse[offset_diffuse], subframe_length ); - set_zero( &st_ivas->hCrend->freq_buffer_im_diffuse[offset_diffuse], subframe_length ); - } - - i = 0; - for ( idx_in = 0; idx_in < nchan_intern; idx_in++ ) - { - pIn = &pcm_in[idx_in][i_ts * subframe_length]; - if ( st_ivas->hIntSetup.index_lfe[0] != idx_in ) - { - if ( st_ivas->hHrtf->num_iterations_diffuse[0] > 0 ) - { - pFreq_buf_re = &st_ivas->hCrend->freq_buffer_re_diffuse[offset_diffuse]; - pFreq_buf_im = &st_ivas->hCrend->freq_buffer_im_diffuse[offset_diffuse]; - pFreq_filt_re = &st_ivas->hCrend->freq_buffer_re[i][offset]; - pFreq_filt_im = &st_ivas->hCrend->freq_buffer_im[i][offset]; - - for ( k = 0; k < st_ivas->hHrtf->index_frequency_max_diffuse; k++ ) - { - pFreq_buf_re[k] += pFreq_filt_re[k] * st_ivas->hHrtf->inv_diffuse_weight[i]; - pFreq_buf_im[k] += pFreq_filt_im[k] * st_ivas->hHrtf->inv_diffuse_weight[i]; - } - } - - pFreq_buf_re = &st_ivas->hCrend->freq_buffer_re[i][offset]; - pFreq_buf_im = &st_ivas->hCrend->freq_buffer_im[i][offset]; - - ivas_mdft( pIn, pFreq_buf_re, pFreq_buf_im, subframe_length, subframe_length ); - i++; - } - } - - for ( j = 0; j < nchan_out; j++ ) - { - set_zero( tmp_out_re, subframe_length ); - set_zero( tmp_out_im, subframe_length ); - - i = 0; - for ( idx_in = 0; idx_in < nchan_intern; idx_in++ ) - { - if ( idx_in != st_ivas->hIntSetup.index_lfe[0] ) - { - offset = 0; - for ( m = 0; m < st_ivas->hHrtf->num_iterations[i][j]; m++ ) - { - offset_in = ( st_ivas->hCrend->delay_line_rw_index + st_ivas->hHrtf->max_num_iterations - st_ivas->hHrtf->num_iterations[i][j] + m + 1 ); - offset_in = offset_in % ( st_ivas->hHrtf->max_num_iterations ); - offset_in = offset_in * subframe_length; - pFreq_buf_re = &st_ivas->hCrend->freq_buffer_re[i][offset_in]; - pFreq_buf_im = &st_ivas->hCrend->freq_buffer_im[i][offset_in]; - pFreq_filt_re = &st_ivas->hHrtf->pOut_to_bin_re[i][j][offset]; - pFreq_filt_im = &st_ivas->hHrtf->pOut_to_bin_im[i][j][offset]; - - for ( k = 0; k < st_ivas->hHrtf->pIndex_frequency_max[i][j][m]; k++ ) - { - tmp_out_re[k] += pFreq_buf_re[k] * pFreq_filt_re[k] - pFreq_buf_im[k] * pFreq_filt_im[k]; - tmp_out_im[k] += pFreq_buf_re[k] * pFreq_filt_im[k] + pFreq_buf_im[k] * pFreq_filt_re[k]; - } - offset = offset + k; - } - i++; - } - } - - offset = 0; - for ( m = 0; m < st_ivas->hHrtf->num_iterations_diffuse[j]; m++ ) - { - offset_diffuse = ( st_ivas->hCrend->diffuse_delay_line_rw_index + m + 1 ); - offset_diffuse = offset_diffuse % st_ivas->hHrtf->num_iterations_diffuse[0]; - offset_diffuse = offset_diffuse * subframe_length; - pFreq_buf_re = &st_ivas->hCrend->freq_buffer_re_diffuse[offset_diffuse]; - pFreq_buf_im = &st_ivas->hCrend->freq_buffer_im_diffuse[offset_diffuse]; - pFreq_filt_re = &st_ivas->hHrtf->pOut_to_bin_diffuse_re[j][offset]; - pFreq_filt_im = &st_ivas->hHrtf->pOut_to_bin_diffuse_im[j][offset]; - - for ( k = 0; k < st_ivas->hHrtf->pIndex_frequency_max_diffuse[j][m]; k++ ) - { - tmp_out_re[k] += pFreq_buf_re[k] * pFreq_filt_re[k] - pFreq_buf_im[k] * pFreq_filt_im[k]; - tmp_out_im[k] += pFreq_buf_re[k] * pFreq_filt_im[k] + pFreq_buf_im[k] * pFreq_filt_re[k]; - } - offset = offset + k; - } - - ivas_imdft( tmp_out_re, tmp_out_im, pOut, subframe_length ); - - pFreq_buf_re = &pcm_out[j][i_ts * subframe_length]; - for ( k = 0; k < subframe_length; k++ ) - { - pFreq_buf_re[k] = pOut[k] + st_ivas->hCrend->prev_out_buffer[j][k]; - st_ivas->hCrend->prev_out_buffer[j][k] = pOut[k + subframe_length]; - } - } - - st_ivas->hCrend->delay_line_rw_index++; - st_ivas->hCrend->delay_line_rw_index = st_ivas->hCrend->delay_line_rw_index % ( st_ivas->hHrtf->max_num_iterations ); - if ( st_ivas->hHrtf->num_iterations_diffuse[0] > 0 ) - { - st_ivas->hCrend->diffuse_delay_line_rw_index++; - st_ivas->hCrend->diffuse_delay_line_rw_index = st_ivas->hCrend->diffuse_delay_line_rw_index % ( st_ivas->hHrtf->num_iterations_diffuse[0] ); - } - - return IVAS_ERR_OK; -} -#endif - -#ifndef FIX_197_CREND_INTERFACE - -/*-----------------------------------------------------------------------------------------* - * Function ivas_crend_process() - * - * Process call for IVAS Crend renderer - *-----------------------------------------------------------------------------------------*/ - -ivas_error ivas_crend_process( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - float output[][L_FRAME48k] /* i/o: input/output audio channels */ -) -{ - int16_t i, nchan_out, output_frame; - int16_t subframe_len, subframe_idx; - float pcm_tmp[BINAURAL_CHANNELS][L_FRAME48k]; - AUDIO_CONFIG intern_config; - ivas_error error; - - push_wmops( "ivas_crend_process" ); - - intern_config = st_ivas->intern_config; - nchan_out = st_ivas->hDecoderConfig->nchan_out; - output_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); - subframe_len = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES; - - for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) - { - if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData && st_ivas->hHeadTrackData->num_quaternions >= 0 ) - { - /* Orientation tracking */ - if ( st_ivas->hCrend->hTrack != NULL ) - { - if ( st_ivas->hDecoderConfig->orientation_tracking == IVAS_ORIENT_TRK_AVG ) - { - ivas_orient_trk_SetTrackingType( st_ivas->hCrend->hTrack, OTR_TRACKING_AVG_ORIENT ); - } - else - { - ivas_orient_trk_SetTrackingType( st_ivas->hCrend->hTrack, OTR_TRACKING_REF_ORIENT ); - } - - /* get current subframe quaternion and convert to euler angles */ - Quat2Euler( st_ivas->hHeadTrackData->Quaternions[subframe_idx], &( st_ivas->hCrend->m_fYaw ), &( st_ivas->hCrend->m_fPitch ), &( st_ivas->hCrend->m_fRoll ) ); - ivas_orient_trk_SetAbsoluteOrientation( st_ivas->hCrend->hTrack, st_ivas->hCrend->m_fYaw, st_ivas->hCrend->m_fPitch, st_ivas->hCrend->m_fRoll ); - ivas_orient_trk_Process( st_ivas->hCrend->hTrack ); - ivas_orient_trk_GetTrackedOrientation( st_ivas->hCrend->hTrack, &( st_ivas->hCrend->m_fYaw ), &( st_ivas->hCrend->m_fPitch ), &( st_ivas->hCrend->m_fRoll ) ); - } - - /* Rotation in SHD for: - MC with elevation (5_1_2 / 5_1_4 / 7_1_4) -> BINAURAL - SBA SPAR -> BINAURAL or BINAURAL_ROOM - */ - if ( intern_config == AUDIO_CONFIG_FOA || intern_config == AUDIO_CONFIG_HOA2 || intern_config == AUDIO_CONFIG_HOA3 ) - { - rotateFrame_shd( st_ivas->hHeadTrackData, output, subframe_len, st_ivas->hIntSetup, subframe_idx ); - } - /* Rotation in SD for MC -> BINAURAL_ROOM */ - else if ( st_ivas->ivas_format != ISM_FORMAT && st_ivas->hIntSetup.is_loudspeaker_setup ) - { - rotateFrame_sd( st_ivas->hHeadTrackData, output, subframe_len, st_ivas->hIntSetup, st_ivas->hEFAPdata, subframe_idx ); - } - } - - if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) - { - if ( ( intern_config == AUDIO_CONFIG_FOA ) || ( intern_config == AUDIO_CONFIG_HOA2 ) || ( intern_config == AUDIO_CONFIG_HOA3 ) || - ( intern_config == AUDIO_CONFIG_5_1 ) || ( intern_config == AUDIO_CONFIG_7_1 ) || - ( intern_config == AUDIO_CONFIG_5_1_2 ) || ( intern_config == AUDIO_CONFIG_5_1_4 ) || ( intern_config == AUDIO_CONFIG_7_1_4 ) ) - { - ivas_crend_convolver( st_ivas, output, pcm_tmp, subframe_idx ); - - if ( st_ivas->hCrend->hReverb != NULL ) - { - if ( ( error = ivas_reverb_process( st_ivas->hCrend->hReverb, intern_config, 1, output, pcm_tmp, subframe_idx ) ) != IVAS_ERR_OK ) - { - return error; - } - } - } - else - { - return IVAS_ERR_INVALID_INPUT_FORMAT; - } - } - else - { - return IVAS_ERR_INTERNAL_FATAL; - } - } - - /* move to output */ - for ( i = 0; i < nchan_out; i++ ) - { - mvr2r( pcm_tmp[i], output[i], output_frame ); - } - - pop_wmops(); - - return IVAS_ERR_OK; -} -#endif - - /*------------------------------------------------------------------------- * initCrend_from_rom() * @@ -1416,17 +197,10 @@ static ivas_error ivas_rend_initCrend( /* set BRIR flag */ use_brir = false; -#ifdef FIX_197_CREND_INTERFACE if ( ( ( hRendCfg != NULL ) && hRendCfg->roomAcoustics.use_brir ) || ( ( hRendCfg == NULL ) && ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) ) ) { use_brir = true; } -#else - if ( ( hRendCfg != NULL && hRendCfg->roomAcoustics.use_brir ) || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) - { - use_brir = true; - } -#endif if ( ( error = getAudioConfigNumChannels( inConfig, &nchan_in ) ) != IVAS_ERR_OK ) @@ -1893,8 +667,6 @@ static ivas_error ivas_rend_initCrend( return IVAS_ERR_OK; } -#ifdef FIX_197_CREND_INTERFACE -#ifdef FIX_329_ENABLE_TD_RENDERER_REVERB_MC /*------------------------------------------------------------------------- * ivas_rend_initCrendWrapper() * @@ -1950,8 +722,6 @@ ivas_error ivas_rend_initCrendWrapper( return IVAS_ERR_OK; } -#endif -#endif /*------------------------------------------------------------------------- * ivas_rend_openCrend() * @@ -1959,15 +729,11 @@ ivas_error ivas_rend_initCrendWrapper( *------------------------------------------------------------------------*/ ivas_error ivas_rend_openCrend( -#ifdef FIX_197_CREND_INTERFACE CREND_WRAPPER_HANDLE *pCrend, -#else - CREND_WRAPPER *pCrend, -#endif const AUDIO_CONFIG inConfig, const AUDIO_CONFIG outConfig, RENDER_CONFIG_DATA *hRendCfg, -#ifdef FIX_197_CREND_INTERFACE +#ifndef FIX_I109_ORIENTATION_TRACKING int16_t Opt_Headrotation, #endif HRTFS_CREND_HANDLE hSetOfHRTF, @@ -1981,35 +747,14 @@ ivas_error ivas_rend_openCrend( ivas_error error; error = IVAS_ERR_OK; -#ifdef FIX_197_CREND_INTERFACE -#ifdef FIX_329_ENABLE_TD_RENDERER_REVERB_MC if ( ( error = ivas_rend_initCrendWrapper( pCrend ) ) != IVAS_ERR_OK ) { return error; } hCrend = ( *pCrend )->hCrend; -#else - if ( pCrend == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend Wrapper\n" ); - } - - if ( *pCrend == NULL ) - { - if ( ( *pCrend = (CREND_WRAPPER_HANDLE) malloc( sizeof( CREND_WRAPPER ) ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend Wrapper\n" ); - } - ( *pCrend )->binaural_latency_ns = 0; - ( *pCrend )->hCrend = NULL; - ( *pCrend )->hHrtfCrend = NULL; - } -#endif -#endif subframe_length = (int16_t) ( output_Fs / FRAMES_PER_SEC ) / MAX_PARAM_SPATIAL_SUBFRAMES; -#ifdef FIX_197_CREND_INTERFACE if ( ( *pCrend )->hHrtfCrend == NULL ) { if ( ( error = ivas_rend_initCrend( *pCrend, inConfig, outConfig, hRendCfg, hSetOfHRTF, output_Fs ) ) != IVAS_ERR_OK ) @@ -2017,53 +762,8 @@ ivas_error ivas_rend_openCrend( return error; } } -#else - if ( pCrend->hHrtfCrend == NULL ) - { - if ( ( error = ivas_rend_initCrend( pCrend, inConfig, outConfig, hRendCfg, hSetOfHRTF, output_Fs ) ) != IVAS_ERR_OK ) - { - return error; - } - } -#endif - -#ifndef FIX_329_ENABLE_TD_RENDERER_REVERB_MC - - if ( ( hCrend = (CREND_HANDLE) malloc( sizeof( CREND_DATA ) ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for renderer handle" ); - } - - hCrend->lfe_delay_line = NULL; - - for ( i = 0; i < MAX_INTERN_CHANNELS; i++ ) - { - hCrend->freq_buffer_re[i] = NULL; - hCrend->freq_buffer_im[i] = NULL; - } - - for ( i = 0; i < BINAURAL_CHANNELS; i++ ) - { - hCrend->prev_out_buffer[i] = NULL; - } - - hCrend->freq_buffer_re_diffuse = NULL; - hCrend->freq_buffer_im_diffuse = NULL; - hCrend->hReverb = NULL; - hCrend->delay_line_rw_index = 0; - hCrend->diffuse_delay_line_rw_index = 0; - hCrend->hTrack = NULL; - hCrend->m_fYaw = 0; - hCrend->m_fPitch = 0; - hCrend->m_fRoll = 0; -#endif - -#ifdef FIX_197_CREND_INTERFACE hHrtf = ( *pCrend )->hHrtfCrend; -#else - hHrtf = pCrend->hHrtfCrend; -#endif if ( hHrtf != NULL ) { @@ -2128,35 +828,10 @@ ivas_error ivas_rend_openCrend( { hCrend->lfe_delay_line = NULL; } -#ifdef FIX_197_CREND_INTERFACE - if ( Opt_Headrotation ) -#else - if ( false ) /* TODO tmu : check renderer headrotation flag */ -#endif - { - if ( ( hCrend->hTrack = (ivas_orient_trk_state_t *) malloc( sizeof( ivas_orient_trk_state_t ) ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Orientation tracking" ); - } - - ivas_orient_trk_Init( hCrend->hTrack ); - } - else - { - hCrend->hTrack = NULL; - } if ( ( hRendCfg != NULL ) && ( hRendCfg->roomAcoustics.late_reverb_on ) ) { - if ( ( error = ivas_reverb_open( &( hCrend->hReverb ), - inConfig, -#ifdef FIX_197_CREND_INTERFACE - ( *pCrend )->hHrtfCrend, -#else - pCrend->hHrtfCrend, -#endif - hRendCfg, - output_Fs ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_reverb_open( &( hCrend->hReverb ), inConfig, ( *pCrend )->hHrtfCrend, hRendCfg, output_Fs ) ) != IVAS_ERR_OK ) { return error; } @@ -2166,45 +841,27 @@ ivas_error ivas_rend_openCrend( hCrend->hReverb = NULL; } -#ifdef FIX_197_CREND_INTERFACE ( *pCrend )->binaural_latency_ns = (int32_t) ( ( *pCrend )->hHrtfCrend->latency_s * 1000000000.f ); -#else - pCrend->binaural_latency_ns = (int32_t) ( pCrend->hHrtfCrend->latency_s * 1000000000.f ); -#endif } -#ifdef FIX_197_CREND_INTERFACE ( *pCrend )->hCrend = hCrend; -#else - pCrend->hCrend = hCrend; -#endif return IVAS_ERR_OK; } + /*------------------------------------------------------------------------- * ivas_crend_close() * * Deallocate Crend renderer handle *------------------------------------------------------------------------*/ -#ifdef FIX_197_CREND_INTERFACE void ivas_rend_closeCrend( CREND_WRAPPER_HANDLE *pCrend ) -#else -ivas_error ivas_rend_closeCrend( - CREND_WRAPPER *pCrend ) -#endif { int16_t i; -#ifdef FIX_197_CREND_INTERFACE - if ( pCrend == NULL ) - { - return; - } - - if ( *pCrend == NULL ) + if ( pCrend == NULL || *pCrend == NULL ) { return; } @@ -2270,72 +927,11 @@ ivas_error ivas_rend_closeCrend( free( *pCrend ); *pCrend = NULL; } - return; -#else - if ( pCrend->hHrtfCrend != NULL ) - { - ivas_hrtf_close( &pCrend->hHrtfCrend ); - } - - if ( pCrend->hCrend != NULL ) - { - - for ( i = 0; i < MAX_INTERN_CHANNELS; i++ ) - { - if ( pCrend->hCrend->freq_buffer_re[i] != NULL ) - { - free( pCrend->hCrend->freq_buffer_re[i] ); - pCrend->hCrend->freq_buffer_re[i] = NULL; - } - if ( pCrend->hCrend->freq_buffer_im[i] != NULL ) - { - free( pCrend->hCrend->freq_buffer_im[i] ); - pCrend->hCrend->freq_buffer_im[i] = NULL; - } - } - - for ( i = 0; i < BINAURAL_CHANNELS; i++ ) - { - if ( pCrend->hCrend->prev_out_buffer[i] != NULL ) - { - free( pCrend->hCrend->prev_out_buffer[i] ); - pCrend->hCrend->prev_out_buffer[i] = NULL; - } - } - - if ( pCrend->hCrend->lfe_delay_line != NULL ) - { - free( pCrend->hCrend->lfe_delay_line ); - pCrend->hCrend->lfe_delay_line = NULL; - } - - if ( pCrend->hCrend->freq_buffer_re_diffuse != NULL ) - { - free( pCrend->hCrend->freq_buffer_re_diffuse ); - pCrend->hCrend->freq_buffer_re_diffuse = NULL; - } - - if ( pCrend->hCrend->freq_buffer_im_diffuse != NULL ) - { - free( pCrend->hCrend->freq_buffer_im_diffuse ); - pCrend->hCrend->freq_buffer_im_diffuse = NULL; - } - - if ( pCrend->hCrend->hTrack != NULL ) - { - free( pCrend->hCrend->hTrack ); - pCrend->hCrend->hTrack = NULL; - } - ivas_reverb_close( &pCrend->hCrend->hReverb ); - - free( pCrend->hCrend ); - pCrend->hCrend = NULL; - } - return IVAS_ERR_OK; -#endif + return; } + /*-----------------------------------------------------------------------------------------* * Function ivas_crend_convolver() * @@ -2508,20 +1104,14 @@ ivas_error ivas_rend_crendProcess( const CREND_WRAPPER *pCrend, const AUDIO_CONFIG inConfig, const AUDIO_CONFIG outConfig, -#ifdef FIX_197_CREND_INTERFACE DECODER_CONFIG_HANDLE hDecoderConfig, HEAD_TRACK_DATA_HANDLE hHeadTrackData, IVAS_OUTPUT_SETUP_HANDLE hIntSetup, EFAP_HANDLE hEFAPdata, -#endif float output[][L_FRAME48k], /* i/o: input/output audio channels */ const int32_t output_Fs ) { -#ifdef FIX_197_CREND_INTERFACE int16_t i, subframe_idx, output_frame, subframe_len; -#else - int16_t i, subframe_idx, output_frame; -#endif int16_t nchan_out; float pcm_tmp[BINAURAL_CHANNELS][L_FRAME48k]; AUDIO_CONFIG in_config; @@ -2535,11 +1125,7 @@ ivas_error ivas_rend_crendProcess( inRendConfig = getRendAudioConfigFromIvasAudioConfig( inConfig ); outRendConfig = getRendAudioConfigFromIvasAudioConfig( outConfig ); -#ifdef FIX_197_CREND_INTERFACE in_config = getIvasAudioConfigFromRendAudioConfig( inRendConfig ); -#else - in_config = rendAudioConfigToIvasAudioConfig( inRendConfig ); -#endif inConfigType = getAudioConfigType( inRendConfig ); @@ -2549,15 +1135,13 @@ ivas_error ivas_rend_crendProcess( } output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC ); -#ifdef FIX_197_CREND_INTERFACE subframe_len = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES; -#endif for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) { -#ifdef FIX_197_CREND_INTERFACE if ( hDecoderConfig && hDecoderConfig->Opt_Headrotation && hHeadTrackData && hHeadTrackData->num_quaternions >= 0 ) { /* Orientation tracking */ +#ifndef FIX_I109_ORIENTATION_TRACKING if ( pCrend->hCrend->hTrack != NULL ) { if ( hDecoderConfig->orientation_tracking == IVAS_ORIENT_TRK_AVG ) @@ -2580,6 +1164,7 @@ ivas_error ivas_rend_crendProcess( ivas_orient_trk_GetTrackedOrientation( pCrend->hCrend->hTrack, &( pCrend->hCrend->m_fYaw ), &( pCrend->hCrend->m_fPitch ), &( pCrend->hCrend->m_fRoll ) ); } +#endif /* Rotation in SHD for: MC with elevation (5_1_2 / 5_1_4 / 7_1_4) -> BINAURAL @@ -2595,7 +1180,6 @@ ivas_error ivas_rend_crendProcess( rotateFrame_sd( hHeadTrackData, output, subframe_len, *hIntSetup, hEFAPdata, subframe_idx ); } } -#endif if ( ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) || ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) ) { diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 020dd27cfa..58de4819e8 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -139,22 +139,7 @@ ivas_error ivas_dirac_dec_init_binaural_data( set_zero( hBinaural->ChCrossImOutPrev, nBins ); hBinaural->renderStereoOutputInsteadOfBinaural = 0; -#ifdef FIX_107_5MS_SUBFRAME_RENDERING hBinaural->useSubframeMode = 1; -#else - if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR ) /* Use subframe-mode with SPAR, since the metadata is not in sync on a frame level */ - { - hBinaural->useSubframeMode = 1; - } - else - { -#ifdef DEBUGGING - hBinaural->useSubframeMode = st_ivas->hDecoderConfig->forceSubframeBinauralization; -#else - hBinaural->useSubframeMode = 0; /* Default to 20 ms mode. */ -#endif - } -#endif hBinaural->useTdDecorr = 0; if ( st_ivas->ivas_format == SBA_FORMAT ) @@ -299,7 +284,7 @@ void ivas_dirac_dec_close_binaural_data( DIRAC_DEC_BIN_HANDLE *hBinaural /* i/o: decoder DirAC binaural data handle */ ) { - if ( *hBinaural == NULL ) + if ( hBinaural == NULL || *hBinaural == NULL ) { return; } diff --git a/lib_rend/ivas_hrtf.c b/lib_rend/ivas_hrtf.c index b53c636932..2b1f16d025 100644 --- a/lib_rend/ivas_hrtf.c +++ b/lib_rend/ivas_hrtf.c @@ -116,7 +116,6 @@ void ivas_HRTF_CRend_binary_close( return; } - free( *hSetOfHRTF ); *hSetOfHRTF = NULL; @@ -202,38 +201,3 @@ void ivas_HRTF_parambin_binary_close( return; } - - -/*-----------------------------------------------------------------------* - * ivas_headTrack_open() - * - * Allocate and initialize Head-Tracking handle - *-----------------------------------------------------------------------*/ - -ivas_error ivas_headTrack_open( - HEAD_TRACK_DATA_HANDLE *hHeadTrackData /* o : head track handle */ -) -{ - int16_t i; - - /* Allocate Head-Tracking handle */ - if ( ( *hHeadTrackData = (HEAD_TRACK_DATA_HANDLE) malloc( sizeof( HEAD_TRACK_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for head-tracking memory\n" ) ); - } - - /* Initialization */ - ( *hHeadTrackData )->num_quaternions = 0; - ( *hHeadTrackData )->lrSwitchInterpVal = 0.0f; - ( *hHeadTrackData )->lrSwitchedCurrent = 0; - ( *hHeadTrackData )->lrSwitchedNext = 0; - - /* Initialise Rmat_prev to I, Rmat will be computed later */ - for ( i = 0; i < 3; i++ ) - { - set_zero( ( *hHeadTrackData )->Rmat_prev[i], 3 ); - ( *hHeadTrackData )->Rmat_prev[i][i] = 1.0f; - } - - return IVAS_ERR_OK; -} diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index a8be0b5ba3..67f73fab30 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -30,6 +30,7 @@ *******************************************************************************************************/ +#include "ivas_stat_rend.h" #include #include "options.h" #include "prot.h" @@ -47,6 +48,9 @@ *---------------------------------------------------------------------*/ static void TDREND_Clear_Update_flags( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd ); +#ifdef TD5 +static void angles_to_vec( const float radius, const float azimuth, const float elevation, float *vec ); +#endif /*---------------------------------------------------------------------* * ivas_td_binaural_open_unwrap() @@ -55,11 +59,14 @@ static void TDREND_Clear_Update_flags( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRe *---------------------------------------------------------------------*/ ivas_error ivas_td_binaural_open_unwrap( - TDREND_HRFILT_FiltSet_t **hHrtfTD, /* i/o: HR filter model (from file or NULL) */ - const int32_t output_Fs, /* i : Output sampling rate */ - const int16_t nchan_transport, /* i : Number of channels */ - const IVAS_FORMAT ivas_format, /* i : IVAS format (ISM/MC) */ - const AUDIO_CONFIG transport_config, /* i : Transport configuration */ + TDREND_HRFILT_FiltSet_t **hHrtfTD, /* i/o: HR filter model (from file or NULL) */ + const int32_t output_Fs, /* i : Output sampling rate */ + const int16_t nchan_transport, /* i : Number of channels */ + const IVAS_FORMAT ivas_format, /* i : IVAS format (ISM/MC) */ + const AUDIO_CONFIG transport_config, /* i : Transport configuration */ +#ifdef TD5 + const float *directivity, /* i : Directivity pattern (used for ISM) */ +#endif const IVAS_OUTPUT_SETUP hTransSetup, /* i : Loudspeaker layout */ BINAURAL_TD_OBJECT_RENDERER_HANDLE *hBinRendererTd, /* o : TD renderer handle */ int32_t *binaural_latency_ns /* i : Binauralization delay */ @@ -168,9 +175,13 @@ ivas_error ivas_td_binaural_open_unwrap( for ( nS = 0; nS < nchan_rend; nS++ ) { /* Set source positions according to loudspeaker layout */ +#ifdef TD5 + angles_to_vec( 1.0f, ls_azimuth[nS], ls_elevation[nS], Pos ); +#else Pos[0] = cosf( ls_elevation[nS] * PI_OVER_180 ) * cosf( ls_azimuth[nS] * PI_OVER_180 ); Pos[1] = cosf( ls_elevation[nS] * PI_OVER_180 ) * sinf( ls_azimuth[nS] * PI_OVER_180 ); Pos[2] = sinf( ls_elevation[nS] * PI_OVER_180 ); +#endif Dir[0] = 1.0f; Dir[1] = 0.0f; Dir[2] = 0.0f; @@ -186,6 +197,35 @@ ivas_error ivas_td_binaural_open_unwrap( TDREND_MIX_SRC_SetDirAtten( pBinRendTd, nS, DirAtten_p ); } } +#ifdef TD5 + if ( ivas_format == ISM_FORMAT ) + { + DirAtten_p = pBinRendTd->DirAtten_p; +#ifdef TD5_FIX_INVALID_MEMORY_ACCESS + if ( NULL == directivity ) + { + DirAtten_p->ConeInnerAngle = 360.0f; /* Front cone */ + DirAtten_p->ConeOuterAngle = 360.0f; /* Back cone */ + DirAtten_p->ConeOuterGain = 1.0f; /* Back attenuation */ + } + else + { + DirAtten_p->ConeInnerAngle = directivity[0]; + DirAtten_p->ConeOuterAngle = directivity[1]; + DirAtten_p->ConeOuterGain = directivity[2]; + } +#else + DirAtten_p->ConeInnerAngle = directivity[0]; + DirAtten_p->ConeOuterAngle = directivity[1]; + DirAtten_p->ConeOuterGain = directivity[2]; +#endif + + for ( nS = 0; nS < nchan_rend; nS++ ) + { + TDREND_MIX_SRC_SetDirAtten( pBinRendTd, nS, DirAtten_p ); + } + } +#endif *hBinRendererTd = pBinRendTd; *binaural_latency_ns = (int32_t) ( ( *hBinRendererTd )->HrFiltSet_p->latency_s * 1000000000.f ); @@ -227,30 +267,20 @@ void ivas_td_binaural_close( *---------------------------------------------------------------------*/ ivas_error ivas_td_binaural_renderer_unwrap( -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND - REVERB_HANDLE hReverb, /* i : reverb handle */ -#else - RENDER_CONFIG_DATA *hRenderConfig, /* i : Renderer configuration */ - const int16_t ini_frame, /* i : Initialization frame counter */ -#ifdef FIX_197_CREND_INTERFACE - CREND_WRAPPER_HANDLE hCrendWrapper, /* i : Crend wrapper handle */ -#else - CREND_HANDLE hCrend, /* i : Crend handle */ -#endif -#endif - AUDIO_CONFIG transport_config, /* i : Transport configuration */ -#ifndef FIX_330_ENABLE_TD_RENDERER_REVERB_REND - const int32_t output_Fs, /* i : Output sampling rate */ -#endif + const REVERB_HANDLE hReverb, /* i : Reverberator handle */ + const AUDIO_CONFIG transport_config, /* i : Transport configuration */ BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD binaural object renderer handle */ - const int16_t nchan_transport, /* i : Transport channels (ISms) */ + const int16_t num_src, /* i : number of sources to render */ const int16_t lfe_idx, /* i : LFE channel index */ - IVAS_FORMAT ivas_format, /* i : IVAS format */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ ISM_METADATA_HANDLE *hIsmMetaData, /* i : ISM metadata handle */ const int16_t Opt_Headrotation, /* i : Head rotation flag */ const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ - float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ - const int16_t output_frame /* i : output frame length */ +#ifdef TD5 + const IVAS_POSITION *Pos, /* i : Listener position data per subframe */ +#endif + float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ + const int16_t output_frame /* i : output frame length */ ) { int16_t subframe_length; @@ -259,68 +289,25 @@ ivas_error ivas_td_binaural_renderer_unwrap( ivas_error error; subframe_length = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES; -#ifndef FIX_330_ENABLE_TD_RENDERER_REVERB_REND - if ( hRenderConfig != NULL ) - { - - if ( hRenderConfig->roomAcoustics.late_reverb_on && ( ini_frame == 0 ) ) - { - ivas_reverb_open( -#ifdef FIX_197_CREND_INTERFACE - &hCrendWrapper->hCrend->hReverb, -#else - &hCrend->hReverb, -#endif - transport_config, - NULL, - hRenderConfig, - output_Fs ); - } - } -#endif /* Update object position(s) */ - TDREND_Update_object_positions( hBinRendererTd, nchan_transport, lfe_idx, ivas_format, hIsmMetaData, output ); + TDREND_Update_object_positions( hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, output ); for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) { /* Update the listener's location/orientation */ - TDREND_Update_listener_orientation( hBinRendererTd, Opt_Headrotation, ( Quaternions != NULL ) ? &Quaternions[subframe_idx] : NULL ); - -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND - if ( ( hReverb != NULL ) && ( hReverb->pConfig.roomAcoustics.late_reverb_on ) ) +#ifdef TD5 + TDREND_Update_listener_orientation( hBinRendererTd, Opt_Headrotation, ( Quaternions != NULL ) ? &Quaternions[subframe_idx] : NULL, ( Pos != NULL ) ? &Pos[subframe_idx] : NULL ); #else - if ( ( hRenderConfig != NULL ) && ( hRenderConfig->roomAcoustics.late_reverb_on ) ) + TDREND_Update_listener_orientation( hBinRendererTd, Opt_Headrotation, ( Quaternions != NULL ) ? &Quaternions[subframe_idx] : NULL ); #endif + + if ( hReverb != NULL && hReverb->pConfig.roomAcoustics.late_reverb_on ) { - if ( ( error = ivas_reverb_process( -#ifdef FIX_197_CREND_INTERFACE -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND - hReverb, -#else - hCrendWrapper->hCrend->hReverb, -#endif -#else - hCrend->hReverb, -#endif - transport_config, 0, output, reverb_signal, subframe_idx ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_reverb_process( hReverb, transport_config, 0, output, reverb_signal, subframe_idx ) ) != IVAS_ERR_OK ) { return error; } - -#ifndef FIX_330_ENABLE_TD_RENDERER_REVERB_REND - ivas_reverb_process( -#ifdef FIX_197_CREND_INTERFACE - hCrendWrapper->hCrend->hReverb, -#else - hCrend->hReverb, -#endif - transport_config, - 0, - output, - reverb_signal, - subframe_idx ); -#endif } /* Render subframe */ @@ -331,24 +318,12 @@ ivas_error ivas_td_binaural_renderer_unwrap( } -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND - if ( ( hReverb != NULL ) && ( hReverb->pConfig.roomAcoustics.late_reverb_on ) ) + if ( hReverb != NULL && hReverb->pConfig.roomAcoustics.late_reverb_on ) { /* add reverb to rendered signals */ v_add( reverb_signal[0], output[0], output[0], output_frame ); v_add( reverb_signal[1], output[1], output[1], output_frame ); } -#else - if ( hRenderConfig != NULL ) /* Renderer Configuration not enabled in TD standalone renderer */ - { - if ( hRenderConfig->roomAcoustics.late_reverb_on ) - { - /* add reverb to rendered signals */ - v_add( reverb_signal[0], output[0], output[0], output_frame ); - v_add( reverb_signal[1], output[1], output[1], output_frame ); - } - } -#endif return IVAS_ERR_OK; } @@ -362,7 +337,7 @@ ivas_error ivas_td_binaural_renderer_unwrap( ivas_error TDREND_GetMix( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ - float output[][L_FRAME48k], /* i/o: ISm object synth / rendered output in 0,1 */ + float output[][L_FRAME48k], /* i/o: ISM object synth / rendered output in 0,1 */ const int16_t subframe_length, /* i/o: subframe length */ const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ ) @@ -451,7 +426,7 @@ static void TDREND_Clear_Update_flags( void TDREND_Update_object_positions( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o : TD Renderer handle */ - const int16_t numSources, /* i : Number of sources to render */ + const int16_t num_src, /* i : number of sources to render */ const int16_t lfe_idx, /* i : Input LFE index */ const IVAS_FORMAT in_format, /* i : Format of input sources */ const ISM_METADATA_HANDLE *hIsmMetaData, /* i : Input metadata for ISM objects */ @@ -468,7 +443,7 @@ void TDREND_Update_object_positions( /* For each source, write the frame data to the source object*/ c_indx = 0; - for ( nS = 0; nS < numSources; nS++ ) + for ( nS = 0; nS < num_src; nS++ ) { if ( !( in_format == MC_FORMAT && nS == lfe_idx ) ) /* Skip LFE for MC */ { @@ -482,6 +457,10 @@ void TDREND_Update_object_positions( /* Update the source positions */ /* Source position and direction */ +#ifdef TD5 + angles_to_vec( hIsmMetaData[nS]->radius, hIsmMetaData[nS]->azimuth, hIsmMetaData[nS]->elevation, Pos ); + angles_to_vec( 1.0f, hIsmMetaData[nS]->yaw, hIsmMetaData[nS]->pitch, Dir ); +#else Pos[0] = cosf( hIsmMetaData[nS]->elevation * PI_OVER_180 ) * cosf( hIsmMetaData[nS]->azimuth * PI_OVER_180 ); Pos[1] = cosf( hIsmMetaData[nS]->elevation * PI_OVER_180 ) * sinf( hIsmMetaData[nS]->azimuth * PI_OVER_180 ); Pos[2] = sinf( hIsmMetaData[nS]->elevation * PI_OVER_180 ); @@ -489,6 +468,7 @@ void TDREND_Update_object_positions( Dir[1] = 0.0f; Dir[2] = 0.0f; +#endif /* Source directivity info */ DirAtten_p->ConeInnerAngle = 360.0f; DirAtten_p->ConeOuterAngle = 360.0f; @@ -515,19 +495,29 @@ void TDREND_Update_object_positions( void TDREND_Update_listener_orientation( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD Renderer handle */ const int16_t headRotEnabled, /* i : Headrotation flag */ - const IVAS_QUATERNION *headPosition /* i : Head Position */ +#ifdef TD5 + const IVAS_QUATERNION *headPosition, /* i : Listener orientation */ + const IVAS_POSITION *Pos /* i : Listener Position */ +#else + const IVAS_QUATERNION *headPosition /* i : Head Position */ +#endif ) { +#ifndef TD5 float Pos[3]; +#endif float FrontVec[3]; float UpVec[3]; float Rmat[3][3]; - +#ifdef TD5 + float Pos_p[3]; +#else /* Update the listener's location/orientation */ /* Listener at the origin */ Pos[0] = 0.0f; Pos[1] = 0.0f; Pos[2] = 0.0f; +#endif if ( headRotEnabled ) { @@ -541,6 +531,12 @@ void TDREND_Update_listener_orientation( UpVec[0] = Rmat[2][0]; UpVec[1] = Rmat[2][1]; UpVec[2] = Rmat[2][2]; +#ifdef TD5 + /* Input position */ + Pos_p[0] = ( *Pos ).x; + Pos_p[1] = ( *Pos ).y; + Pos_p[2] = ( *Pos ).z; +#endif } else { @@ -552,10 +548,20 @@ void TDREND_Update_listener_orientation( UpVec[0] = 0.0f; UpVec[1] = 0.0f; UpVec[2] = 1.0f; +#ifdef TD5 + /* Listener at the origin */ + Pos_p[0] = 0.0f; + Pos_p[1] = 0.0f; + Pos_p[2] = 0.0f; +#endif } /* Set the listener position and orientation:*/ +#ifdef TD5 + TDREND_MIX_LIST_SetPos( hBinRendererTd, Pos_p ); +#else TDREND_MIX_LIST_SetPos( hBinRendererTd, Pos ); +#endif TDREND_MIX_LIST_SetOrient( hBinRendererTd, FrontVec, UpVec ); return; @@ -571,6 +577,9 @@ void TDREND_Update_listener_orientation( ivas_error ivas_td_binaural_open_ext( TDREND_WRAPPER *pTDRend, IVAS_REND_AudioConfig inConfig, +#ifdef TD5 + RENDER_CONFIG_DATA *hRendCfg, /* i : Renderer configuration */ +#endif LSSETUP_CUSTOM_STRUCT *customLsInput, const int32_t outFs ) { @@ -579,6 +588,9 @@ ivas_error ivas_td_binaural_open_ext( IVAS_FORMAT ivas_format; IVAS_OUTPUT_SETUP hTransSetup; ivas_error error; +#ifdef TD5_FIX_INVALID_MEMORY_ACCESS + float *directivity = NULL; +#endif if ( inConfig != IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) { @@ -592,16 +604,25 @@ ivas_error ivas_td_binaural_open_ext( nchan_transport = customLsInput->num_spk; } -#ifdef FIX_197_CREND_INTERFACE transport_config = getIvasAudioConfigFromRendAudioConfig( inConfig ); -#else - transport_config = rendAudioConfigToIvasAudioConfig( inConfig ); -#endif ivas_format = ( getAudioConfigType( inConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ? MC_FORMAT : ISM_FORMAT; hTransSetup.ls_azimuth = customLsInput->ls_azimuth; hTransSetup.ls_elevation = customLsInput->ls_elevation; +#ifdef TD5 +#ifdef TD5_FIX_INVALID_MEMORY_ACCESS + if ( NULL != hRendCfg ) + { + directivity = hRendCfg->directivity; + } + + return ivas_td_binaural_open_unwrap( &pTDRend->hHrtfTD, outFs, nchan_transport, ivas_format, transport_config, directivity, hTransSetup, &pTDRend->hBinRendererTd, &pTDRend->binaural_latency_ns ); +#else + return ivas_td_binaural_open_unwrap( &pTDRend->hHrtfTD, outFs, nchan_transport, ivas_format, transport_config, hRendCfg->directivity, hTransSetup, &pTDRend->hBinRendererTd, &pTDRend->binaural_latency_ns ); +#endif +#else return ivas_td_binaural_open_unwrap( &pTDRend->hHrtfTD, outFs, nchan_transport, ivas_format, transport_config, hTransSetup, &pTDRend->hBinRendererTd, &pTDRend->binaural_latency_ns ); +#endif } @@ -618,28 +639,19 @@ ivas_error ivas_td_binaural_renderer_ext( const LSSETUP_CUSTOM_STRUCT *customLsInput, /* i : Input custom loudspeaker layout */ const IVAS_REND_HeadRotData *headRotData, /* i : Input head positions */ const IVAS_REND_AudioObjectPosition *currentPos, /* i : Object position */ -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND - const REVERB_HANDLE reverb, /* i : reverb handle */ -#endif - const int16_t output_frame, /* i : output frame length */ - float output[][L_FRAME48k] /* i/o: SCE channels / Binaural synthesis */ + const REVERB_HANDLE hReverb, /* i : Reverberator handle */ + const int16_t output_frame, /* i : output frame length */ + float output[][L_FRAME48k] /* i/o: SCE channels / Binaural synthesis */ ) { ISM_METADATA_FRAME hIsmMetaDataFrame; ISM_METADATA_HANDLE hIsmMetaData[1]; int16_t lfe_idx; int16_t num_src; -#ifndef FIX_330_ENABLE_TD_RENDERER_REVERB_REND - /* TODO tmu : pass down renderer config struct */ - // float reverb_signal[BINAURAL_CHANNELS][L_FRAME48k]; -#endif IVAS_FORMAT ivas_format; IVAS_REND_AudioConfigType inConfigType; AUDIO_CONFIG transport_config; ivas_error error; -#ifndef FIX_330_ENABLE_TD_RENDERER_REVERB_REND - int32_t output_Fs; -#endif push_wmops( "ivas_td_binaural_renderer_ext" ); @@ -650,9 +662,7 @@ ivas_error ivas_td_binaural_renderer_ext( if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) { ivas_format = MC_FORMAT; -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND transport_config = getIvasAudioConfigFromRendAudioConfig( inConfig ); -#endif if ( inConfig != IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) { if ( ( error = getAudioConfigNumChannels( inConfig, &num_src ) ) != IVAS_ERR_OK ) @@ -670,38 +680,51 @@ ivas_error ivas_td_binaural_renderer_ext( { ivas_format = ISM_FORMAT; num_src = 1; -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND transport_config = AUDIO_CONFIG_ISM1; -#endif hIsmMetaData[0] = &hIsmMetaDataFrame; hIsmMetaData[0]->azimuth = currentPos->azimuth; hIsmMetaData[0]->elevation = currentPos->elevation; +#ifdef TD5 + hIsmMetaData[0]->yaw = currentPos->yaw; + hIsmMetaData[0]->pitch = currentPos->pitch; + hIsmMetaData[0]->radius = currentPos->radius; +#endif } -#ifndef FIX_330_ENABLE_TD_RENDERER_REVERB_REND -#ifdef FIX_197_CREND_INTERFACE - transport_config = getIvasAudioConfigFromRendAudioConfig( inConfig ); + if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, + ( headRotData != NULL ) ? headRotData->headPositions : NULL, +#ifdef TD5 + ( headRotData != NULL ) ? headRotData->Pos : NULL, output, output_frame ) ) != IVAS_ERR_OK ) #else - transport_config = rendAudioConfigToIvasAudioConfig( inConfig ); -#endif - output_Fs = output_frame * 50; + output, output_frame ) ) != IVAS_ERR_OK ) #endif -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND - if ( ( error = ivas_td_binaural_renderer_unwrap( reverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, - ( headRotData != NULL ) ? headRotData->headPositions : NULL, output, output_frame ) ) != IVAS_ERR_OK ) - { - return error; - } -#else - if ( ( error = error = ivas_td_binaural_renderer_unwrap( NULL, 1, NULL, transport_config, output_Fs, pTDRend->hBinRendererTd, num_src, lfe_idx, - ivas_format, hIsmMetaData, headRotData->headRotEnabled, ( headRotData != NULL ) ? headRotData->headPositions : NULL, - output, output_frame ) ) != IVAS_ERR_OK ) { return error; } -#endif pop_wmops(); return IVAS_ERR_OK; } + +#ifdef TD5 +/*---------------------------------------------------------------------* + * angles_to_vec() + * + * Convert azimuth and elevation angles to position/orientation vector + *---------------------------------------------------------------------*/ + +static void angles_to_vec( + const float radius, /* i : radius */ + const float azimuth, /* i : Azimuth angle */ + const float elevation, /* i : Elevation angle */ + float *vec /* o : Pos/Dir vector */ +) +{ + vec[0] = radius * cosf( elevation * PI_OVER_180 ) * cosf( azimuth * PI_OVER_180 ); + vec[1] = radius * cosf( elevation * PI_OVER_180 ) * sinf( azimuth * PI_OVER_180 ); + vec[2] = radius * sinf( elevation * PI_OVER_180 ); + + return; +} +#endif diff --git a/lib_rend/ivas_objectRenderer_hrFilt.c b/lib_rend/ivas_objectRenderer_hrFilt.c index 0220b48145..d28abdba30 100644 --- a/lib_rend/ivas_objectRenderer_hrFilt.c +++ b/lib_rend/ivas_objectRenderer_hrFilt.c @@ -69,10 +69,21 @@ ivas_error TDREND_REND_RenderSourceHRFilt( { float LeftOutputFrame[L_SPATIAL_SUBFR_48k]; float RightOutputFrame[L_SPATIAL_SUBFR_48k]; +#ifdef TD5 + float Gain; + + Gain = ( *Src_p->SrcRend_p->DirGain_p ) * ( *Src_p->SrcRend_p->DistGain_p ); +#endif TDREND_Apply_ITD( Src_p->InputFrame_p, LeftOutputFrame, RightOutputFrame, &Src_p->previtd, Src_p->itd, Src_p->mem_itd, subframe_length ); +#ifdef TD5 + TDREND_firfilt( LeftOutputFrame, Src_p->hrf_left_prev, hrf_left_delta, intp_count, Src_p->mem_hrf_left, subframe_length, Src_p->filterlength, Gain ); + TDREND_firfilt( RightOutputFrame, Src_p->hrf_right_prev, hrf_right_delta, intp_count, Src_p->mem_hrf_right, subframe_length, Src_p->filterlength, Gain ); +#else TDREND_firfilt( LeftOutputFrame, Src_p->hrf_left_prev, hrf_left_delta, intp_count, Src_p->mem_hrf_left, subframe_length, Src_p->filterlength ); TDREND_firfilt( RightOutputFrame, Src_p->hrf_right_prev, hrf_right_delta, intp_count, Src_p->mem_hrf_right, subframe_length, Src_p->filterlength ); +#endif + /* Copy to accumulative output frame */ v_add( LeftOutputFrame, output_buf[0], output_buf[0], subframe_length ); v_add( RightOutputFrame, output_buf[1], output_buf[1], subframe_length ); diff --git a/lib_rend/ivas_objectRenderer_sfx.c b/lib_rend/ivas_objectRenderer_sfx.c index 005025827b..72493b0501 100644 --- a/lib_rend/ivas_objectRenderer_sfx.c +++ b/lib_rend/ivas_objectRenderer_sfx.c @@ -182,6 +182,7 @@ static void sincResample( const float *p_sinc_forward; const float *p_sinc_backward; + /* Compute fractional time step */ t_step = (float) ( length_in ) / (float) ( length_out ); t_frac = 0; @@ -234,7 +235,12 @@ void TDREND_firfilt( const int16_t intp_count, /* i : interpolation count */ float *mem, /* i/o: filter memory */ const int16_t subframe_length, /* i : Length of signal */ - const int16_t filterlength /* i : Filter length */ +#ifdef TD5 + const int16_t filterlength, /* i : Filter length */ + const float Gain /* i : Gain */ +#else + const int16_t filterlength /* i : Filter length */ +#endif ) { float buffer[SFX_SPAT_BIN_MAX_FILTER_LENGTH - 1 + L_SUBFRAME5MS_48k]; @@ -260,7 +266,11 @@ void TDREND_firfilt( { tmp += ( *p_filter++ ) * ( *p_tmp-- ); } +#ifdef TD5 + signal[i] = tmp * Gain; +#else signal[i] = tmp; +#endif if ( i < intp_count ) { diff --git a/lib_rend/ivas_objectRenderer_sources.c b/lib_rend/ivas_objectRenderer_sources.c index d524228812..2a13efc24c 100644 --- a/lib_rend/ivas_objectRenderer_sources.c +++ b/lib_rend/ivas_objectRenderer_sources.c @@ -266,6 +266,9 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams( TDREND_MIX_Listener_t *Listener_p; TDREND_HRFILT_FiltSet_t *HrFiltSet_p; float ListRelPos[3], ListRelDist; +#ifdef TD5 + float ListRelPosAbs[3]; /* Relative position, ignoring orientation of listener */ +#endif float Azim, Elev; float hrf_left[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; float hrf_right[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; @@ -287,14 +290,22 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams( break; case TDREND_POSTYPE_ABSOLUTE: /* Absolute position */ +#ifdef TD5 + TDREND_SPATIAL_VecMapToNewCoordSystem( SrcSpatial_p->Pos_p, Listener_p->Pos, Listener_p->Front, Listener_p->Up, Listener_p->Right, ListRelPos, ListRelPosAbs ); +#else TDREND_SPATIAL_VecMapToNewCoordSystem( SrcSpatial_p->Pos_p, Listener_p->Pos, Listener_p->Front, Listener_p->Up, Listener_p->Right, ListRelPos ); +#endif break; default: /* Illegal position type */ #ifdef DEBUGGING printf( "Warning! TDREND_SRC_REND_UpdateFiltersFromSpatialParams: Invalid position type. Assuming absolute position!\n" ); #endif /* Assume absolute position */ +#ifdef TD5 + TDREND_SPATIAL_VecMapToNewCoordSystem( SrcSpatial_p->Pos_p, Listener_p->Pos, Listener_p->Front, Listener_p->Up, Listener_p->Right, ListRelPos, ListRelPosAbs ); +#else TDREND_SPATIAL_VecMapToNewCoordSystem( SrcSpatial_p->Pos_p, Listener_p->Pos, Listener_p->Front, Listener_p->Up, Listener_p->Right, ListRelPos ); +#endif break; } @@ -320,7 +331,11 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams( *SrcRend_p->DirGain_p = 1.0f; if ( SrcSpatial_p->DirAttenEnabled ) { +#ifdef TD5 + *SrcRend_p->DirGain_p = TDREND_SRC_SPATIAL_GetDirGain( &SrcSpatial_p->DirAtten, SrcSpatial_p->Front_p, ListRelPosAbs ); +#else *SrcRend_p->DirGain_p = TDREND_SRC_SPATIAL_GetDirGain( &SrcSpatial_p->DirAtten, SrcSpatial_p->Front_p, ListRelPos ); +#endif } /* Distance gain */ diff --git a/lib_rend/ivas_objectRenderer_vec.c b/lib_rend/ivas_objectRenderer_vec.c index c3a780c725..f17d769821 100644 --- a/lib_rend/ivas_objectRenderer_vec.c +++ b/lib_rend/ivas_objectRenderer_vec.c @@ -111,9 +111,22 @@ void TDREND_SPATIAL_VecMapToNewCoordSystem( const float *DirVec_p, /* i : Direction vector */ const float *UpVec_p, /* i : Up vector */ const float *RightVec_p, /* i : Right vector */ - float *MappedVec_p /* o : Transformed vector */ +#ifdef TD5 + float *MappedVec_p, /* o : Transformed vector */ + float *LisRelPosAbs /* o : Transformed vector ignoring orientation */ +#else + float *MappedVec_p /* o : Transformed vector */ +#endif ) { +#ifdef TD5 + v_sub( Vec_p, TranslVec_p, LisRelPosAbs, 3 ); + /* Evalute the relative Vec in the coordinates of the Orientation vectors, */ + /* which form an orthonormal basis */ + MappedVec_p[0] = dotp( LisRelPosAbs, DirVec_p, 3 ); + MappedVec_p[1] = dotp( LisRelPosAbs, RightVec_p, 3 ); + MappedVec_p[2] = dotp( LisRelPosAbs, UpVec_p, 3 ); +#else float RelVec[3]; /* Evaluate Vec relative to the new origin given by TranslVec */ @@ -124,7 +137,7 @@ void TDREND_SPATIAL_VecMapToNewCoordSystem( MappedVec_p[0] = dotp( RelVec, DirVec_p, 3 ); MappedVec_p[1] = dotp( RelVec, RightVec_p, 3 ); MappedVec_p[2] = dotp( RelVec, UpVec_p, 3 ); - +#endif return; } diff --git a/lib_rend/ivas_orient_trk.c b/lib_rend/ivas_orient_trk.c index 4eec8ecd56..af71cbf543 100644 --- a/lib_rend/ivas_orient_trk.c +++ b/lib_rend/ivas_orient_trk.c @@ -30,6 +30,7 @@ *******************************************************************************************************/ +#include "common_api_types.h" #include #include "options.h" #include "ivas_prot.h" @@ -49,15 +50,332 @@ #define MAX_TRACKED_ANGLE_AVG_ORIENT PI_OVER_2 #define MAX_TRACKED_ANGLE_REF_ORIENT EVS_PI - -/* TODO relate to frame rate - assumed here 50Hz, i.e. 20ms frame length */ -#define OTR_UPDATE_RATE ( 50.0f ) /* rate of the Process() calls [Hz]; 1x per IVAS frame */ +#define OTR_UPDATE_RATE (float) FRAMES_PER_SEC /* rate of the Process() calls [Hz]; 1x per IVAS frame */ /*------------------------------------------------------------------------------------------* * Local functions *------------------------------------------------------------------------------------------*/ +#ifdef FIX_I109_ORIENTATION_TRACKING +/*------------------------------------------------------------------------------------------* + * IdentityQuaternion() + * + * + *------------------------------------------------------------------------------------------*/ + +static IVAS_QUATERNION IdentityQuaternion( + void ) +{ + IVAS_QUATERNION q; + + q.w = 1.0f; + q.x = q.y = q.z = 0.0f; + + return q; +} + + +/*------------------------------------------------------------------------------------------* + * QuaternionProduct() + * + * Quaternion product + *------------------------------------------------------------------------------------------*/ + +static void QuaternionProduct( + const IVAS_QUATERNION q1, + const IVAS_QUATERNION q2, + IVAS_QUATERNION *const r ) +{ + IVAS_QUATERNION tmp; + tmp.w = q1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z; + tmp.x = q1.w * q2.x + q1.x * q2.w + q1.y * q2.z - q1.z * q2.y; + tmp.y = q1.w * q2.y - q1.x * q2.z + q1.y * q2.w + q1.z * q2.x; + tmp.z = q1.w * q2.z + q1.x * q2.y - q1.y * q2.x + q1.z * q2.w; + + *r = tmp; + + return; +} + +/*------------------------------------------------------------------------------------------* + * QuaternionDotProduct() + * + * Quaternion dot product + *------------------------------------------------------------------------------------------*/ + +static float QuaternionDotProduct( + const IVAS_QUATERNION q1, + const IVAS_QUATERNION q2 ) +{ + return q1.x * q2.x + q1.y * q2.y + q1.z * q2.z + q1.w * q2.w; +} + + +/*------------------------------------------------------------------------------------------* + * QuaternionDivision() + * + * Divides a quaternion by a scalar + *------------------------------------------------------------------------------------------*/ + +static void QuaternionDivision( + const IVAS_QUATERNION q, + const float d, + IVAS_QUATERNION *const r ) +{ + r->w = q.w / d; + r->x = q.x / d; + r->y = q.y / d; + r->z = q.z / d; + + return; +} + + +/*------------------------------------------------------------------------------------------* + * QuaternionNormalize() + * + * Normalizes a quaternion + *------------------------------------------------------------------------------------------*/ + +static void QuaternionNormalize( + const IVAS_QUATERNION q, + IVAS_QUATERNION *const r ) +{ + QuaternionDivision( q, sqrtf( QuaternionDotProduct( q, q ) ), r ); + + return; +} + + +/*------------------------------------------------------------------------------------------* + * QuaternionSlerp() + * + * Computes a spherical linear interpolation between two quaternions + *------------------------------------------------------------------------------------------*/ + +static void QuaternionSlerp( + const IVAS_QUATERNION q1, + const IVAS_QUATERNION q2, + const float t, + IVAS_QUATERNION *const r ) +{ + float angle, denom, s, s2; + + s = QuaternionDotProduct( q1, q2 ); + + if ( fabsf( s ) >= 1.0f ) + { + *r = q2; + return; + } + + angle = acosf( s ); + denom = sinf( angle ); + + s = sinf( ( 1 - t ) * angle ); + s2 = sinf( t * angle ); + r->x = ( q1.x * s + q2.x * s2 ) / denom; + r->y = ( q1.y * s + q2.y * s2 ) / denom; + r->z = ( q1.z * s + q2.z * s2 ) / denom; + r->w = ( q1.w * s + q2.w * s2 ) / denom; + + QuaternionNormalize( *r, r ); + + return; +} + + +/*------------------------------------------------------------------------------------------* + * QuaternionConjugate() + * + * Computes a quaternion conjugate + *------------------------------------------------------------------------------------------*/ + +static void QuaternionConjugate( + const IVAS_QUATERNION q, + IVAS_QUATERNION *const r ) +{ + r->w = q.w; + r->x = -q.x; + r->y = -q.y; + r->z = -q.z; + + return; +} + + +/*------------------------------------------------------------------------------------------* + * QuaternionAngle() + * + * Computes an angle between two quaternions + *------------------------------------------------------------------------------------------*/ + +static float QuaternionAngle( + const IVAS_QUATERNION q1, + const IVAS_QUATERNION q2 ) +{ + IVAS_QUATERNION q12; + float angle; + + QuaternionConjugate( q1, &q12 ); + QuaternionProduct( q12, q2, &q12 ); + angle = 2.0f * atan2f( sqrtf( q12.x * q12.x + q12.y * q12.y + q12.z * q12.z ), q12.w ); + + return angle; +} + + +/*------------------------------------------------------------------------------------------* + * QuaternionInverse() + * + * Computes an inverse quaternion + *------------------------------------------------------------------------------------------*/ + +static void QuaternionInverse( + const IVAS_QUATERNION q, + IVAS_QUATERNION *const r ) +{ + float dot_product; + + dot_product = QuaternionDotProduct( q, q ); + QuaternionConjugate( q, r ); + QuaternionDivision( *r, dot_product, r ); + + return; +} + + +#ifdef OTR_REFERENCE_VECTOR_TRACKING +/*------------------------------------------------------------------------------------------* + * VectorSubtract() + * + * Computes the difference of two vectors + *------------------------------------------------------------------------------------------*/ + +static IVAS_VECTOR3 VectorSubtract( + const IVAS_VECTOR3 p1, + const IVAS_VECTOR3 p2 ) +{ + IVAS_VECTOR3 result; + + result.x = p1.x - p2.x; + result.y = p1.y - p2.y; + result.z = p1.z - p2.z; + + return result; +} + + +/*------------------------------------------------------------------------------------------* + * VectorCrossProduct() + * + * Computes the cross product of two vectors + *------------------------------------------------------------------------------------------*/ + +static IVAS_VECTOR3 VectorCrossProduct( + const IVAS_VECTOR3 p1, + const IVAS_VECTOR3 p2 ) +{ + IVAS_VECTOR3 result; + result.x = p1.y * p2.z - p1.z * p2.y; + result.y = p1.z * p2.x - p1.x * p2.z; + result.z = p1.x * p2.y - p1.y * p2.x; + + return result; +} + + +/*------------------------------------------------------------------------------------------* + * VectorDotProduct( + * + * Computes the dot product of two vectors + *------------------------------------------------------------------------------------------*/ + +static float VectorDotProduct( + const IVAS_VECTOR3 p1, + const IVAS_VECTOR3 p2 ) +{ + return p1.x * p2.x + p1.y * p2.y + p1.z * p2.z; +} + + +/*------------------------------------------------------------------------------------------* + * VectorLength() + * + * Computes the length of a vector + *------------------------------------------------------------------------------------------*/ + +static float VectorLength( + const IVAS_VECTOR3 p ) +{ + return sqrtf( p.x * p.x + p.y * p.y + p.z * p.z ); +} + + +/*------------------------------------------------------------------------------------------* + * VectorNormalize() + * + * Normalizes a vector + *------------------------------------------------------------------------------------------*/ + +static IVAS_VECTOR3 VectorNormalize( + const IVAS_VECTOR3 p ) +{ + IVAS_VECTOR3 result; + + const float length = VectorLength( p ); + + result.x = p.x / length; + result.y = p.y / length; + result.z = p.z / length; + + return result; +} + + +/*------------------------------------------------------------------------------------------* + * VectorRotationToQuaternion() + * + * Computes a quaternion representing the rotation from vector p1 to vector p2 + *------------------------------------------------------------------------------------------*/ + +static void VectorRotationToQuaternion( + const IVAS_VECTOR3 p1, + const IVAS_VECTOR3 p2, + IVAS_QUATERNION *const r ) +{ + float dot_product; + IVAS_VECTOR3 cross_product, p1_normalized, p2_normalized; + + p1_normalized = VectorNormalize( p1 ); + p2_normalized = VectorNormalize( p2 ); + cross_product = VectorCrossProduct( p1_normalized, p2_normalized ); + dot_product = VectorDotProduct( p1_normalized, p2_normalized ); + + if ( dot_product < -0.999999 ) + { + /* happens when the p1 vector is parallel to p2, but direction is flipped */ + r->w = 0.0f; + r->x = 0.0f; + r->y = 0.0f; + r->z = 1.0f; + } + else + { + /* all regular cases */ + r->x = cross_product.x; + r->y = cross_product.y; + r->z = cross_product.z; + r->w = 1.0f + dot_product; + } + + QuaternionNormalize( *r, r ); + + return; +} +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ +#else static float ClipAngle( const float angle, const float min_angle, @@ -95,6 +413,7 @@ static float ClipAngle( return result; } +#endif /*-------------------------------------------------------------------* * ivas_orient_trk_Init() @@ -102,11 +421,27 @@ static float ClipAngle( * *-------------------------------------------------------------------*/ +#ifdef FIX_I109_ORIENTATION_TRACKING +ivas_error ivas_orient_trk_Init( +#else void ivas_orient_trk_Init( - ivas_orient_trk_state_t *pOTR ) +#endif + ivas_orient_trk_state_t *pOTR ) /* i/o : orientation tracker handle */ { +#ifdef FIX_I109_ORIENTATION_TRACKING + IVAS_QUATERNION identity; + + if ( pOTR == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + identity.w = 1.0f; + identity.x = identity.y = identity.z = 0.0f; +#else /* Track relative to a reference orientation */ pOTR->trackingType = OTR_TRACKING_REF_ORIENT; +#endif /* configuration parameters */ pOTR->centerAdaptationRate = 1.0f / 30.0f; @@ -116,6 +451,19 @@ void ivas_orient_trk_Init( /* initial adaptivity filter coefficient, will be auto-adapted */ pOTR->alpha = sinf( PI2 * pOTR->offCenterAdaptationRate / OTR_UPDATE_RATE ); /* start adaptation at off-center rate = fastest rate */ +#ifdef FIX_I109_ORIENTATION_TRACKING +#ifdef OTR_REFERENCE_VECTOR_TRACKING + pOTR->trkRot = identity; +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ + pOTR->absAvgRot = identity; + /* Use frontal and horiontal orientation as reference orientation, unless/until overridden */ + pOTR->refRot = identity; + + /* set safe default tracking mode */ + pOTR->trackingType = OTR_TRACKING_NONE; + + return IVAS_ERR_OK; +#else pOTR->absYaw = 0.0f; pOTR->absPitch = 0.0f; pOTR->absRoll = 0.0f; @@ -135,6 +483,7 @@ void ivas_orient_trk_Init( pOTR->trkRoll = 0.0f; return; +#endif } @@ -144,16 +493,178 @@ void ivas_orient_trk_Init( * *-------------------------------------------------------------------*/ +#ifdef FIX_I109_ORIENTATION_TRACKING +ivas_error ivas_orient_trk_SetTrackingType( + ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ + const OTR_TRACKING_T trackingType /* i/o: orientation tracking type */ +) +{ + if ( pOTR == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + pOTR->trackingType = trackingType; + + return IVAS_ERR_OK; +} +#else void ivas_orient_trk_SetTrackingType( - ivas_orient_trk_state_t *pOTR, - const OTR_TRACKING_T trackingType ) + ivas_orient_trk_state_t *pOTR, /* i/o : orientation tracker handle */ + const OTR_TRACKING_T trackingType ) /* i/o : orientation tracking type */ { pOTR->trackingType = trackingType; +} +#endif - return; +#ifdef FIX_I109_ORIENTATION_TRACKING +/*-------------------------------------------------------------------* + * ivas_orient_trk_SetReferenceRotation() + * + * + *-------------------------------------------------------------------*/ + +ivas_error ivas_orient_trk_SetReferenceRotation( + ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ + const IVAS_QUATERNION refRot /* i : reference rotation */ +) +{ + if ( pOTR == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + /* check for Euler angle signaling */ + if ( refRot.w == -3.0f ) + { + Euler2Quat( deg2rad( refRot.x ), deg2rad( refRot.y ), deg2rad( refRot.z ), &pOTR->refRot ); + } + else + { + pOTR->refRot = refRot; + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ivas_orient_trk_GetMainOrientation() + * + * + *-------------------------------------------------------------------*/ + +ivas_error ivas_orient_trk_GetMainOrientation( + ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ + IVAS_QUATERNION *pOrientation /* i/o: average/reference orientation */ +) +{ + if ( pOTR == NULL || pOrientation == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + switch ( pOTR->trackingType ) + { + case OTR_TRACKING_NONE: + *pOrientation = IdentityQuaternion(); + break; +#ifdef OTR_REFERENCE_VECTOR_TRACKING + case OTR_TRACKING_REF_VEC: + case OTR_TRACKING_REF_VEC_LEV: +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ + case OTR_TRACKING_REF_ORIENT: + *pOrientation = pOTR->refRot; + break; + case OTR_TRACKING_AVG_ORIENT: + *pOrientation = pOTR->absAvgRot; + break; + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ivas_orient_trk_GetTrackedRotation() + * + * + *-------------------------------------------------------------------*/ + +ivas_error ivas_orient_trk_GetTrackedRotation( + ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ + IVAS_QUATERNION *pRotation /* i/o: processed rotation */ +) +{ + if ( pOTR == NULL || pRotation == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + *pRotation = pOTR->trkRot; + + return IVAS_ERR_OK; } +#ifdef OTR_REFERENCE_VECTOR_TRACKING +/*-------------------------------------------------------------------* + * ivas_orient_trk_SetReferenceVector() + * + * + *-------------------------------------------------------------------*/ + +ivas_error ivas_orient_trk_SetReferenceVector( + ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ + const IVAS_VECTOR3 listenerPos, /* i : Listener position */ + const IVAS_VECTOR3 refPos /* i : Reference position */ +) +{ + IVAS_VECTOR3 acousticFrontVector, ivasForwardVector; + IVAS_VECTOR3 listenerPosLevel, refPosLevel; + float acousticFrontVectorLength; + + if ( pOTR == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + switch ( pOTR->trackingType ) + { + case OTR_TRACKING_NONE: + case OTR_TRACKING_REF_ORIENT: + case OTR_TRACKING_AVG_ORIENT: + case OTR_TRACKING_REF_VEC: + acousticFrontVector = VectorSubtract( listenerPos, refPos ); + break; + case OTR_TRACKING_REF_VEC_LEV: + /* ignore the height difference between listener position and reference position */ + listenerPosLevel.z = refPosLevel.z = listenerPos.z; + listenerPosLevel.x = listenerPos.x; + listenerPosLevel.y = listenerPos.y; + refPosLevel.x = refPos.x; + refPosLevel.y = refPos.y; + acousticFrontVector = VectorSubtract( listenerPosLevel, refPosLevel ); + break; + default: + return IVAS_ERR_WRONG_PARAMS; + } + + acousticFrontVectorLength = VectorLength( acousticFrontVector ); + + /* if the length is zero, the user has entered insensible listener and reference positions */ + if ( acousticFrontVectorLength < 0.0001f ) + { + return IVAS_ERR_WRONG_PARAMS; + } + + ivasForwardVector.x = -1.0f; + ivasForwardVector.y = 0.0f; + ivasForwardVector.z = 0.0f; + VectorRotationToQuaternion( ivasForwardVector, acousticFrontVector, &pOTR->refRot ); + + return IVAS_ERR_OK; +} +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ +#else /*-------------------------------------------------------------------* * ivas_orient_trk_SetAbsoluteOrientation() * @@ -173,6 +684,7 @@ void ivas_orient_trk_SetAbsoluteOrientation( return; } +#endif /*-------------------------------------------------------------------* @@ -181,6 +693,99 @@ void ivas_orient_trk_SetAbsoluteOrientation( * *-------------------------------------------------------------------*/ +#ifdef FIX_I109_ORIENTATION_TRACKING +ivas_error ivas_orient_trk_Process( + ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ + IVAS_QUATERNION absRot, /* i : absolute head rotation */ + float updateRate, /* i : rotation update rate [Hz] */ + IVAS_QUATERNION *pTrkRot /* o : tracked rotation */ +) +{ + float normalizedOrientation; + float relativeOrientationRate; + float rateRange; + float cutoffFrequency; + float alpha = pOTR->alpha; + float ang; + ivas_error result; + + if ( pOTR == NULL || pTrkRot == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + result = IVAS_ERR_OK; + + switch ( pOTR->trackingType ) + { + case OTR_TRACKING_NONE: + pOTR->trkRot = absRot; + break; +#ifdef OTR_REFERENCE_VECTOR_TRACKING + case OTR_TRACKING_REF_VEC: + case OTR_TRACKING_REF_VEC_LEV: +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ + case OTR_TRACKING_REF_ORIENT: + /* Reset average orientation */ + pOTR->absAvgRot = absRot; + + /* Reset adaptation filter - start adaptation at center rate */ + pOTR->alpha = sinf( 2.0f * EVS_PI * pOTR->centerAdaptationRate / updateRate ); + + /* Compute relative orientation = (absolute orientation) - (reference orientation) */ + QuaternionInverse( pOTR->refRot, &pOTR->trkRot ); + QuaternionProduct( pOTR->trkRot, absRot, &pOTR->trkRot ); + break; + + case OTR_TRACKING_AVG_ORIENT: + /* Compute average (low-pass filtered) absolute orientation */ + QuaternionSlerp( pOTR->absAvgRot, absRot, alpha, &pOTR->absAvgRot ); + + /* Compute relative orientation = (absolute orientation) - (average absolute orientation) */ + QuaternionInverse( pOTR->absAvgRot, &pOTR->trkRot ); + QuaternionProduct( pOTR->trkRot, absRot, &pOTR->trkRot ); + + /* Adapt LPF constant based on orientation excursion relative to current mean: + - low cutoff (slow adaptation) for small excursions (around center) + - high cutoff (fast adaptation) for large excursions (off-center) + */ + ang = QuaternionAngle( absRot, pOTR->trkRot ); + normalizedOrientation = ang * ang; + + relativeOrientationRate = sqrtf( normalizedOrientation ) / pOTR->adaptationAngle; + /* 'if' assumed to perform comparison to 0 */ + if ( relativeOrientationRate > 1.0f ) + { + relativeOrientationRate = 1.0f; + } + + /* Compute range of the adaptation rate between center = lower rate and off-center = higher rate */ + rateRange = pOTR->offCenterAdaptationRate - pOTR->centerAdaptationRate; + /* 'if' assumed to perform comparison to 0 */ + if ( rateRange < 0.0f ) + { + rateRange = 0.0f; + } + + /* Compute adaptivity cutoff frequency: interpolate between minimum (center) and maximum (off-center) values */ + cutoffFrequency = pOTR->centerAdaptationRate + ( relativeOrientationRate * rateRange ); + + /* Compute filter coefficient corresponding to desired cutoff frequency */ + pOTR->alpha = sinf( 2.0f * EVS_PI * cutoffFrequency / updateRate ); + break; + default: + result = IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Non-supported orientation tracking adaptation type" ); + break; + } + + if ( result == IVAS_ERR_OK ) + { + *pTrkRot = pOTR->trkRot; + } + + return result; +} +#else ivas_error ivas_orient_trk_Process( ivas_orient_trk_state_t *pOTR ) { @@ -314,3 +919,4 @@ void ivas_orient_trk_GetTrackedOrientation( return; } +#endif diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 9e92e45d57..4c79280a86 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -54,11 +54,7 @@ ivas_error getAudioConfigNumChannels( int16_t *numChannels ); -#ifdef FIX_197_CREND_INTERFACE AUDIO_CONFIG getIvasAudioConfigFromRendAudioConfig( -#else -AUDIO_CONFIG rendAudioConfigToIvasAudioConfig( -#endif IVAS_REND_AudioConfig rendConfig ); IVAS_REND_AudioConfig getRendAudioConfigFromIvasAudioConfig( @@ -216,28 +212,18 @@ void ivas_HRTF_CRend_binary_close( *----------------------------------------------------------------------------------*/ ivas_error ivas_td_binaural_renderer_unwrap( -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND - REVERB_HANDLE hReverb, /* i : reverb handle */ -#else - RENDER_CONFIG_DATA *hRenderConfig, /* i : Renderer configuration */ - const int16_t ini_frame, /* i : Initialization frame counter */ -#ifdef FIX_197_CREND_INTERFACE - CREND_WRAPPER_HANDLE hCrendWrapper, /* i : Crend wrapper handle */ -#else - CREND_HANDLE hCrend, /* i : Crend handle */ -#endif -#endif - AUDIO_CONFIG transport_config, /* i : Transport configuration */ -#ifndef FIX_330_ENABLE_TD_RENDERER_REVERB_REND - const int32_t output_Fs, /* i : Output sampling rate */ -#endif + const REVERB_HANDLE hReverb, /* i : Reverberator handle */ + const AUDIO_CONFIG transport_config, /* i : Transport configuration */ BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD binaural object renderer handle */ - const int16_t nchan_transport, /* i : Transport channels (ISms) */ + const int16_t num_src, /* i : number of sources to render */ const int16_t lfe_idx, /* i : LFE channel index */ - IVAS_FORMAT ivas_format, /* i : IVAS format */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ ISM_METADATA_HANDLE *hIsmMetaData, /* i : ISM metadata handle */ const int16_t Opt_Headrotation, /* i : Head rotation flag */ const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ +#ifdef TD5 + const IVAS_POSITION *Pos, /* i : Listener position data per subframe */ +#endif float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ const int16_t output_frame /* i : output frame length */ ); @@ -248,9 +234,7 @@ ivas_error ivas_td_binaural_renderer_ext( const LSSETUP_CUSTOM_STRUCT *customLsInput, /* i : Input custom loudspeaker layout */ const IVAS_REND_HeadRotData *headRotData, /* i : Input head positions */ const IVAS_REND_AudioObjectPosition *currentPos, /* i : Object position */ -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND - const REVERB_HANDLE reverb, /* i : reverb handle */ -#endif + const REVERB_HANDLE hReverb, /* i : Reverberator handle */ const int16_t output_frame, /* i : output frame length */ float output[][L_FRAME48k] /* i/o: SCE channels / Binaural synthesis */ ); @@ -261,6 +245,9 @@ ivas_error ivas_td_binaural_open_unwrap( const int16_t nchan_transport, /* i : Number of channels */ const IVAS_FORMAT ivas_format, /* i : IVAS format (ISM/MC) */ const AUDIO_CONFIG transport_config, /* i : Transport configuration */ +#ifdef TD5 + const float *directivity, /* i : Directivity pattern (used for ISM) */ +#endif const IVAS_OUTPUT_SETUP hTransSetup, /* i : Loudspeaker layout */ BINAURAL_TD_OBJECT_RENDERER_HANDLE *hBinRendererTd, /* o : TD renderer handle */ int32_t *binaural_latency_ns /* i : Binauralization delay */ @@ -269,6 +256,9 @@ ivas_error ivas_td_binaural_open_unwrap( ivas_error ivas_td_binaural_open_ext( TDREND_WRAPPER *pTDRend, const IVAS_REND_AudioConfig inConfig, +#ifdef TD5 + RENDER_CONFIG_DATA *hRendCfg, /* i : Renderer configuration */ +#endif LSSETUP_CUSTOM_STRUCT *customLsInput, const int32_t output_Fs ); @@ -280,7 +270,7 @@ void ivas_td_binaural_close( ivas_error TDREND_GetMix( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ - float output[][L_FRAME48k], /* i/o: ISm object synth / rendered output in 0,1 */ + float output[][L_FRAME48k], /* i/o: ISM object synth / rendered output in 0,1 */ const int16_t subframe_length, /* i/o: subframe length */ const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ ); @@ -288,12 +278,17 @@ ivas_error TDREND_GetMix( void TDREND_Update_listener_orientation( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD Renderer handle */ const int16_t headRotEnabled, /* i : Headrotation flag */ +#ifdef TD5 + const IVAS_QUATERNION *headPosition, /* i : Listener orientation */ + const IVAS_POSITION *Pos /* i : Listener Position */ +#else const IVAS_QUATERNION *headPosition /* i : Head Position */ +#endif ); void TDREND_Update_object_positions( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o : TD Renderer handle */ - const int16_t numSources, /* i : Number of sources to render */ + const int16_t num_src, /* i : number of sources to render */ const int16_t lfe_idx, /* i : Input LFE index */ const IVAS_FORMAT in_format, /* i : Format of input sources */ const ISM_METADATA_HANDLE *hIsmMetaData, /* i : Input metadata for ISM objects */ @@ -409,7 +404,12 @@ void TDREND_SPATIAL_VecMapToNewCoordSystem( const float *DirVec_p, /* i : Direction vector */ const float *UpVec_p, /* i : Up vector */ const float *RightVec_p, /* i : Right vector */ +#ifdef TD5 + float *MappedVec_p, /* o : Transformed vector */ + float *LisRelPosAbs /* o : Transformed vector ignoring orientation */ +#else float *MappedVec_p /* o : Transformed vector */ +#endif ); /*! r: Flag if the orientation has been updated */ @@ -475,7 +475,12 @@ void TDREND_firfilt( const int16_t intp_count, /* i : interpolation count */ float *mem, /* i/o: filter memory */ const int16_t subframe_length, /* i : Length of signal */ +#ifdef TD5 + const int16_t filterlength, /* i : Filter length */ + const float Gain /* i : Gain */ +#else const int16_t filterlength /* i : Filter length */ +#endif ); @@ -484,59 +489,35 @@ void TDREND_firfilt( *----------------------------------------------------------------------------------*/ ivas_error ivas_rend_openCrend( -#ifdef FIX_197_CREND_INTERFACE CREND_WRAPPER_HANDLE *pCrend, -#else - CREND_WRAPPER *pCrend, -#endif const AUDIO_CONFIG inConfig, const AUDIO_CONFIG outConfig, RENDER_CONFIG_DATA *hRendCfg, -#ifdef FIX_197_CREND_INTERFACE +#ifndef FIX_I109_ORIENTATION_TRACKING int16_t Opt_Headrotation, #endif HRTFS_CREND_HANDLE hSetOfHRTF, const int32_t output_Fs ); -#ifdef FIX_197_CREND_INTERFACE void ivas_rend_closeCrend( CREND_WRAPPER_HANDLE *pCrend ); -#else -ivas_error ivas_rend_closeCrend( - CREND_WRAPPER *pCrend ); -#endif -#ifdef FIX_329_ENABLE_TD_RENDERER_REVERB_MC ivas_error ivas_rend_initCrendWrapper( CREND_WRAPPER_HANDLE *pCrend ); -#endif ivas_error ivas_rend_crendProcess( const CREND_WRAPPER *pCrend, const AUDIO_CONFIG inConfig, const AUDIO_CONFIG outConfig, -#ifdef FIX_197_CREND_INTERFACE DECODER_CONFIG_HANDLE hDecoderConfig, HEAD_TRACK_DATA_HANDLE hHeadTrackData, IVAS_OUTPUT_SETUP_HANDLE hIntSetup, EFAP_HANDLE hEFAPdata, -#endif float output[][L_FRAME48k], /* i/o: input/output audio channels */ const int32_t output_Fs ); -#ifndef FIX_197_CREND_INTERFACE - -ivas_error ivas_crend_init_from_setofhrtf( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -); - -ivas_error ivas_crend_init_from_hrtf_handle( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - HRTFS_HANDLE hrtf); - -#endif @@ -600,12 +581,12 @@ void ivas_reverb_close( ); ivas_error ivas_reverb_process( - REVERB_HANDLE hReverb, /* i/o: reverb state */ + const REVERB_HANDLE hReverb, /* i : Reverberator handle */ const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */ const int16_t mix_signals, /* i : add reverb to output signal */ float pcm_in[][L_FRAME48k], /* i : the PCM audio to apply reverb on */ float pcm_out[][L_FRAME48k], /* o : the PCM audio with reverb applied */ - const int16_t i_ts + const int16_t i_ts /* i : subframe index */ ); void ivas_rev_delay_line_init( @@ -790,12 +771,29 @@ ivas_error ivas_headTrack_open( HEAD_TRACK_DATA_HANDLE *hHeadTrackData /* o : head track handle */ ); +#ifdef FIX_I109_ORIENTATION_TRACKING +void ivas_headTrack_close( + HEAD_TRACK_DATA_HANDLE *hHeadTrackData /* i/o: head track handle */ +); + +void Euler2Quat( + const float yaw, /* i : yaw (x) */ + const float pitch, /* i : pitch (y) */ + const float roll, /* i : roll (z) */ + IVAS_QUATERNION *quat /* o : quaternion describing the rotation */ +); + +float deg2rad( float degrees ); + +#else void Quat2Euler( - const IVAS_QUATERNION quat, /* i : quaternion describing the rotation */ - float *yaw, /* o : yaw */ - float *pitch, /* o : pitch */ - float *roll /* o : roll */ + const IVAS_QUATERNION quat, /* i : quaternion describing the rotation */ + float *yaw, /* o : yaw (z) */ + float *pitch, /* o : pitch (y) */ + float *roll /* o : roll (x) */ ); +#endif + void QuatToRotMat( const IVAS_QUATERNION quat, /* i : quaternion describing the rotation */ @@ -874,15 +872,57 @@ ivas_error ivas_render_config_init_from_rom( * Orientation tracking *----------------------------------------------------------------------------------*/ -void ivas_orient_trk_Init( - ivas_orient_trk_state_t *pOTR +#ifdef FIX_I109_ORIENTATION_TRACKING +ivas_error ivas_orient_trk_Init( +#else +void ivas_orient_trk_Init( +#endif + ivas_orient_trk_state_t *pOTR /* i/o: orientation tracker handle */ ); -void ivas_orient_trk_SetTrackingType( - ivas_orient_trk_state_t *pOTR, - const OTR_TRACKING_T trackingType +#ifdef FIX_I109_ORIENTATION_TRACKING +ivas_error ivas_orient_trk_SetTrackingType( +#else +void ivas_orient_trk_SetTrackingType( +#endif + ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ + const OTR_TRACKING_T trackingType /* i : orientation tracking type */ ); +#ifdef FIX_I109_ORIENTATION_TRACKING +ivas_error ivas_orient_trk_SetReferenceRotation( + ivas_orient_trk_state_t *pOTR, /* i/o: orientatoin trakcer handle */ + const IVAS_QUATERNION refRot /* i : reference rotation */ +); + +#ifdef OTR_REFERENCE_VECTOR_TRACKING +ivas_error ivas_orient_trk_SetReferenceVector( + ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ + const IVAS_VECTOR3 listenerPos, /* i : Listener position */ + const IVAS_VECTOR3 refPos /* i : Reference position */ +); +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ + +ivas_error ivas_orient_trk_GetMainOrientation( + ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ + IVAS_QUATERNION *pOrientation /* i/o: average/reference orientation */ +); + +ivas_error ivas_orient_trk_GetTrackedRotation( + ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ + IVAS_QUATERNION *pRotation /* i/o: processed rotation */ +); +#endif + +#ifdef FIX_I109_ORIENTATION_TRACKING +ivas_error ivas_orient_trk_Process( + ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ + IVAS_QUATERNION absRot, /* i : absolute head rotation */ + float updateRate, /* i : rotation update rate [Hz] */ + IVAS_QUATERNION *pTrkRot /* o : tracked rotation */ +); + +#else void ivas_orient_trk_SetAbsoluteOrientation( ivas_orient_trk_state_t *pOTR, const float yaw, @@ -891,7 +931,7 @@ void ivas_orient_trk_SetAbsoluteOrientation( ); ivas_error ivas_orient_trk_Process( - ivas_orient_trk_state_t *pOTR + ivas_orient_trk_state_t *pOTR ); void ivas_orient_trk_GetTrackedOrientation( @@ -900,6 +940,7 @@ void ivas_orient_trk_GetTrackedOrientation( float *pitch, float *roll ); +#endif /* clang-format on */ #endif /* IVAS_PROT_REND_H */ diff --git a/lib_rend/ivas_render_config.c b/lib_rend/ivas_render_config.c index ccee4ffe72..2fdbeff0eb 100644 --- a/lib_rend/ivas_render_config.c +++ b/lib_rend/ivas_render_config.c @@ -103,6 +103,7 @@ ivas_error ivas_render_config_init_from_rom( const int16_t room_flag_on /* i : room effect on/off flag */ ) { + if ( hRenderConfig == NULL || *hRenderConfig == NULL ) { return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "Unexpected null pointer while attempting to fill renderer configuration from ROM" ); @@ -125,5 +126,11 @@ ivas_error ivas_render_config_init_from_rom( mvr2r( ivas_reverb_default_RT60, ( *hRenderConfig )->roomAcoustics.pAcoustic_rt60, IVAS_REVERB_DEFAULT_N_BANDS ); mvr2r( ivas_reverb_default_DSR, ( *hRenderConfig )->roomAcoustics.pAcoustic_dsr, IVAS_REVERB_DEFAULT_N_BANDS ); +#ifdef TD5 + ( *hRenderConfig )->directivity[0] = 360.0f; /* Front cone */ + ( *hRenderConfig )->directivity[1] = 360.0f; /* Back cone */ + ( *hRenderConfig )->directivity[2] = 1.0f; /* Back attenuation */ +#endif + return IVAS_ERR_OK; } diff --git a/lib_rend/ivas_reverb.c b/lib_rend/ivas_reverb.c index 3911c36601..7dc05cff09 100644 --- a/lib_rend/ivas_reverb.c +++ b/lib_rend/ivas_reverb.c @@ -675,34 +675,34 @@ static ivas_error calc_jot_t60_coeffs( *-----------------------------------------------------------------------------------------*/ static ivas_error initialize_reverb_filters( - REVERB_HANDLE pState ) + REVERB_HANDLE hReverb ) { ivas_error error; error = IVAS_ERR_OK; /* init correlation and coloration filters */ - if ( ( error = ivas_reverb_t2f_f2t_init( &pState->fft_filter_ols, pState->fft_size, pState->fft_subblock_size ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_reverb_t2f_f2t_init( &hReverb->fft_filter_ols, hReverb->fft_size, hReverb->fft_subblock_size ) ) != IVAS_ERR_OK ) { return error; } - if ( ( error = ivas_reverb_fft_filter_init( &pState->fft_filter_correl_0, pState->fft_size ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_reverb_fft_filter_init( &hReverb->fft_filter_correl_0, hReverb->fft_size ) ) != IVAS_ERR_OK ) { return error; } - if ( ( error = ivas_reverb_fft_filter_init( &pState->fft_filter_correl_1, pState->fft_size ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_reverb_fft_filter_init( &hReverb->fft_filter_correl_1, hReverb->fft_size ) ) != IVAS_ERR_OK ) { return error; } - if ( ( error = ivas_reverb_fft_filter_init( &pState->fft_filter_color_0, pState->fft_size ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_reverb_fft_filter_init( &hReverb->fft_filter_color_0, hReverb->fft_size ) ) != IVAS_ERR_OK ) { return error; } - if ( ( error = ivas_reverb_fft_filter_init( &pState->fft_filter_color_1, pState->fft_size ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_reverb_fft_filter_init( &hReverb->fft_filter_color_1, hReverb->fft_size ) ) != IVAS_ERR_OK ) { return error; } @@ -718,13 +718,13 @@ static ivas_error initialize_reverb_filters( *-----------------------------------------------------------------------------------------*/ static ivas_error set_t60_filter( - REVERB_HANDLE pState, + REVERB_HANDLE hReverb, const uint16_t branch, const uint16_t nr_taps, const float coefA[], const float coefB[] ) { - if ( branch >= pState->nr_of_branches ) + if ( branch >= hReverb->nr_of_branches ) { return IVAS_ERR_INTERNAL; } @@ -734,7 +734,7 @@ static ivas_error set_t60_filter( return IVAS_ERR_INTERNAL; } - ivas_reverb_iir_filt_set( &( pState->t60[branch] ), nr_taps, coefA, coefB ); + ivas_reverb_iir_filt_set( &( hReverb->t60[branch] ), nr_taps, coefA, coefB ); return IVAS_ERR_OK; } @@ -747,16 +747,16 @@ static ivas_error set_t60_filter( *-----------------------------------------------------------------------------------------*/ static ivas_error set_feedback_delay( - REVERB_HANDLE pState, + REVERB_HANDLE hReverb, const uint16_t branch, const int16_t fb_delay ) { - if ( branch >= pState->nr_of_branches ) + if ( branch >= hReverb->nr_of_branches ) { return IVAS_ERR_INTERNAL; } - pState->delay_line[branch].Delay = fb_delay; + hReverb->delay_line[branch].Delay = fb_delay; return IVAS_ERR_OK; } @@ -769,19 +769,19 @@ static ivas_error set_feedback_delay( *-----------------------------------------------------------------------------------------*/ static ivas_error set_feedback_gain( - REVERB_HANDLE pState, + REVERB_HANDLE hReverb, const uint16_t branch, const float *pGain ) { uint16_t gain_idx; - if ( branch >= pState->nr_of_branches ) + if ( branch >= hReverb->nr_of_branches ) { return IVAS_ERR_INTERNAL; } - for ( gain_idx = 0; gain_idx < pState->nr_of_branches; gain_idx++ ) + for ( gain_idx = 0; gain_idx < hReverb->nr_of_branches; gain_idx++ ) { - pState->gain_matrix[branch][gain_idx] = pGain[gain_idx]; + hReverb->gain_matrix[branch][gain_idx] = pGain[gain_idx]; } return IVAS_ERR_OK; @@ -795,7 +795,7 @@ static ivas_error set_feedback_gain( *-----------------------------------------------------------------------------------------*/ static ivas_error set_correl_fft_filter( - REVERB_HANDLE pState, + REVERB_HANDLE hReverb, const uint16_t channel, rv_fftwf_type_complex *pSpectrum ) { @@ -806,11 +806,11 @@ static ivas_error set_correl_fft_filter( if ( channel == 0 ) { - ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR( pSpectrum, pState->fft_filter_correl_0.fft_spectrum, pState->fft_filter_correl_0.fft_size ); + ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR( pSpectrum, hReverb->fft_filter_correl_0.fft_spectrum, hReverb->fft_filter_correl_0.fft_size ); } else { - ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR( pSpectrum, pState->fft_filter_correl_1.fft_spectrum, pState->fft_filter_correl_1.fft_size ); + ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR( pSpectrum, hReverb->fft_filter_correl_1.fft_spectrum, hReverb->fft_filter_correl_1.fft_size ); } return IVAS_ERR_OK; @@ -824,7 +824,7 @@ static ivas_error set_correl_fft_filter( *-----------------------------------------------------------------------------------------*/ static ivas_error set_color_fft_filter( - REVERB_HANDLE pState, + REVERB_HANDLE hReverb, const uint16_t channel, rv_fftwf_type_complex *pSpectrum ) { @@ -835,11 +835,11 @@ static ivas_error set_color_fft_filter( if ( channel == 0 ) { - ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR( pSpectrum, pState->fft_filter_color_0.fft_spectrum, pState->fft_filter_color_0.fft_size ); + ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR( pSpectrum, hReverb->fft_filter_color_0.fft_spectrum, hReverb->fft_filter_color_0.fft_size ); } else { - ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR( pSpectrum, pState->fft_filter_color_1.fft_spectrum, pState->fft_filter_color_1.fft_size ); + ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR( pSpectrum, hReverb->fft_filter_color_1.fft_spectrum, hReverb->fft_filter_color_1.fft_size ); } return IVAS_ERR_OK; @@ -853,7 +853,7 @@ static ivas_error set_color_fft_filter( *-----------------------------------------------------------------------------------------*/ static ivas_error set_mixer_level( - REVERB_HANDLE pState, + REVERB_HANDLE hReverb, const uint16_t channel, const float level[] ) { @@ -863,9 +863,9 @@ static ivas_error set_mixer_level( return IVAS_ERR_INTERNAL; } - for ( branch_idx = 0; branch_idx < pState->nr_of_branches; branch_idx++ ) + for ( branch_idx = 0; branch_idx < hReverb->nr_of_branches; branch_idx++ ) { - pState->mixer[channel][branch_idx] = level[branch_idx]; + hReverb->mixer[channel][branch_idx] = level[branch_idx]; } return IVAS_ERR_OK; @@ -879,7 +879,7 @@ static ivas_error set_mixer_level( *-----------------------------------------------------------------------------------------*/ static void clear_buffers( - REVERB_HANDLE pState ) + REVERB_HANDLE hReverb ) { int16_t branch_idx; ivas_rev_iir_filter_t *iirFilter; @@ -887,15 +887,15 @@ static void clear_buffers( for ( branch_idx = 0; branch_idx < IVAS_REV_MAX_NR_BRANCHES; branch_idx++ ) { - delay_line = &( pState->delay_line[branch_idx] ); + delay_line = &( hReverb->delay_line[branch_idx] ); set_f( delay_line->pBuffer, 0, delay_line->MaxDelay ); delay_line->BufferPos = 0; - iirFilter = &( pState->t60[branch_idx] ); + iirFilter = &( hReverb->t60[branch_idx] ); set_f( iirFilter->pBuffer, 0, iirFilter->MaxTaps ); } - ivas_reverb_t2f_f2t_ClearHistory( &pState->fft_filter_ols ); + ivas_reverb_t2f_f2t_ClearHistory( &hReverb->fft_filter_ols ); return; } @@ -908,31 +908,31 @@ static void clear_buffers( *-----------------------------------------------------------------------------------------*/ static void set_fft_and_datablock_sizes( - REVERB_HANDLE pState, + REVERB_HANDLE hReverb, const int16_t subframe_len ) { - pState->full_block_size = subframe_len; + hReverb->full_block_size = subframe_len; if ( subframe_len == L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES ) { - pState->fft_size = IVAS_REVERB_FFT_SIZE_48K; - pState->num_fft_subblocks = IVAS_REVERB_FFT_N_SUBBLOCKS_48K; + hReverb->fft_size = IVAS_REVERB_FFT_SIZE_48K; + hReverb->num_fft_subblocks = IVAS_REVERB_FFT_N_SUBBLOCKS_48K; } else if ( subframe_len == L_FRAME32k / MAX_PARAM_SPATIAL_SUBFRAMES ) { - pState->fft_size = IVAS_REVERB_FFT_SIZE_32K; - pState->num_fft_subblocks = IVAS_REVERB_FFT_N_SUBBLOCKS_32K; + hReverb->fft_size = IVAS_REVERB_FFT_SIZE_32K; + hReverb->num_fft_subblocks = IVAS_REVERB_FFT_N_SUBBLOCKS_32K; } else if ( subframe_len == L_FRAME16k / MAX_PARAM_SPATIAL_SUBFRAMES ) { - pState->fft_size = IVAS_REVERB_FFT_SIZE_16K; - pState->num_fft_subblocks = IVAS_REVERB_FFT_N_SUBBLOCKS_16K; + hReverb->fft_size = IVAS_REVERB_FFT_SIZE_16K; + hReverb->num_fft_subblocks = IVAS_REVERB_FFT_N_SUBBLOCKS_16K; } else { assert( 0 ); /* unsupported block size */ } - pState->fft_subblock_size = subframe_len / pState->num_fft_subblocks; + hReverb->fft_subblock_size = subframe_len / hReverb->num_fft_subblocks; return; } @@ -1030,7 +1030,7 @@ static void set_reverb_acoustic_data( *-----------------------------------------------------------------------------------------*/ static ivas_error setup_FDN_branches( - REVERB_HANDLE pState, + REVERB_HANDLE hReverb, ivas_reverb_params_t *pParams ) { int16_t nr_coefs, branch_idx, channel_idx; @@ -1041,12 +1041,12 @@ static ivas_error setup_FDN_branches( /* initialize feedback branches */ for ( branch_idx = 0; branch_idx < IVAS_REV_MAX_NR_BRANCHES; branch_idx++ ) { - ivas_rev_delay_line_init( &( pState->delay_line[branch_idx] ), pState->loop_delay_buffer[branch_idx], init_loop_delay[branch_idx], pParams->pLoop_delays[branch_idx] ); - ivas_reverb_iir_filt_init( &( pState->t60[branch_idx] ), IVAS_REV_MAX_IIR_FILTER_LENGTH ); - pState->mixer[0][branch_idx] = 0.0f; - pState->mixer[1][branch_idx] = 0.0f; + ivas_rev_delay_line_init( &( hReverb->delay_line[branch_idx] ), hReverb->loop_delay_buffer[branch_idx], init_loop_delay[branch_idx], pParams->pLoop_delays[branch_idx] ); + ivas_reverb_iir_filt_init( &( hReverb->t60[branch_idx] ), IVAS_REV_MAX_IIR_FILTER_LENGTH ); + hReverb->mixer[0][branch_idx] = 0.0f; + hReverb->mixer[1][branch_idx] = 0.0f; } - clear_buffers( pState ); + clear_buffers( hReverb ); nr_coefs = pParams->t60_filter_order + 1; if ( IVAS_REV_MAX_IIR_FILTER_LENGTH < nr_coefs ) @@ -1060,17 +1060,17 @@ static ivas_error setup_FDN_branches( pCoef_a = &pParams->pT60_filter_coeff[2 * nr_coefs * branch_idx + nr_coefs]; pCoef_b = &pParams->pT60_filter_coeff[2 * nr_coefs * branch_idx]; - if ( ( error = set_t60_filter( pState, branch_idx, nr_coefs, pCoef_a, pCoef_b ) ) != IVAS_ERR_OK ) + if ( ( error = set_t60_filter( hReverb, branch_idx, nr_coefs, pCoef_a, pCoef_b ) ) != IVAS_ERR_OK ) { return error; } - if ( ( error = set_feedback_delay( pState, branch_idx, pParams->pLoop_delays[branch_idx] ) ) != IVAS_ERR_OK ) + if ( ( error = set_feedback_delay( hReverb, branch_idx, pParams->pLoop_delays[branch_idx] ) ) != IVAS_ERR_OK ) { return error; } - if ( ( error = set_feedback_gain( pState, branch_idx, &( pParams->pLoop_feedback_matrix[branch_idx * pParams->nr_loops] ) ) ) != IVAS_ERR_OK ) + if ( ( error = set_feedback_gain( hReverb, branch_idx, &( pParams->pLoop_feedback_matrix[branch_idx * pParams->nr_loops] ) ) ) != IVAS_ERR_OK ) { return error; } @@ -1079,7 +1079,7 @@ static ivas_error setup_FDN_branches( for ( channel_idx = 0; channel_idx < pParams->nr_outputs; channel_idx++ ) { - if ( ( error = set_mixer_level( pState, channel_idx, &( pParams->pLoop_extract_matrix[channel_idx * pParams->nr_loops] ) ) ) != IVAS_ERR_OK ) + if ( ( error = set_mixer_level( hReverb, channel_idx, &( pParams->pLoop_extract_matrix[channel_idx * pParams->nr_loops] ) ) ) != IVAS_ERR_OK ) { return error; } @@ -1175,7 +1175,6 @@ ivas_error ivas_reverb_open( /* set up reverb acoustic data on the basis of HRTF data and renderer config */ set_reverb_acoustic_data( ¶ms, input_audio_config, hHrtf, &hRenderConfig->roomAcoustics, subframe_len, nr_fc_input, nr_fc_fft_filter ); -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND /* set reverb acoustic configuration based on renderer config */ #ifdef DEBUGGING pState->pConfig.renderer_type_override = hRenderConfig->renderer_type_override; @@ -1184,7 +1183,6 @@ ivas_error ivas_reverb_open( pState->pConfig.roomAcoustics.use_brir = hRenderConfig->roomAcoustics.use_brir; pState->pConfig.roomAcoustics.late_reverb_on = hRenderConfig->roomAcoustics.late_reverb_on; pState->pConfig.roomAcoustics.nBands = hRenderConfig->roomAcoustics.nBands; -#endif /* set up input downmix */ pState->dmx_gain = calc_dmx_gain(); @@ -1312,27 +1310,27 @@ void ivas_reverb_close( *-----------------------------------------------------------------------------------------*/ static void post_fft_filter( - REVERB_HANDLE pState, + REVERB_HANDLE hReverb, float *p0, float *p1, float *pBuffer_0, float *pBuffer_1 ) { - if ( pState->do_corr_filter ) + if ( hReverb->do_corr_filter ) { - ivas_reverb_t2f_f2t_in( &pState->fft_filter_ols, p0, p1, pBuffer_0, pBuffer_1 ); - ivas_reverb_fft_filter_ComplexMul( &pState->fft_filter_correl_0, pBuffer_0 ); - ivas_reverb_fft_filter_ComplexMul( &pState->fft_filter_correl_1, pBuffer_1 ); - ivas_reverb_fft_filter_CrossMix( pBuffer_0, pBuffer_1, pState->fft_filter_correl_0.fft_size ); + ivas_reverb_t2f_f2t_in( &hReverb->fft_filter_ols, p0, p1, pBuffer_0, pBuffer_1 ); + ivas_reverb_fft_filter_ComplexMul( &hReverb->fft_filter_correl_0, pBuffer_0 ); + ivas_reverb_fft_filter_ComplexMul( &hReverb->fft_filter_correl_1, pBuffer_1 ); + ivas_reverb_fft_filter_CrossMix( pBuffer_0, pBuffer_1, hReverb->fft_filter_correl_0.fft_size ); } else { - ivas_reverb_t2f_f2t_in( &pState->fft_filter_ols, p0, p1, pBuffer_0, pBuffer_1 ); + ivas_reverb_t2f_f2t_in( &hReverb->fft_filter_ols, p0, p1, pBuffer_0, pBuffer_1 ); } - ivas_reverb_fft_filter_ComplexMul( &pState->fft_filter_color_0, pBuffer_0 ); - ivas_reverb_fft_filter_ComplexMul( &pState->fft_filter_color_1, pBuffer_1 ); - ivas_reverb_t2f_f2t_out( &pState->fft_filter_ols, pBuffer_0, pBuffer_1, p0, p1 ); + ivas_reverb_fft_filter_ComplexMul( &hReverb->fft_filter_color_0, pBuffer_0 ); + ivas_reverb_fft_filter_ComplexMul( &hReverb->fft_filter_color_1, pBuffer_1 ); + ivas_reverb_t2f_f2t_out( &hReverb->fft_filter_ols, pBuffer_0, pBuffer_1, p0, p1 ); return; } @@ -1345,14 +1343,14 @@ static void post_fft_filter( *-----------------------------------------------------------------------------------------*/ static void reverb_block( - REVERB_HANDLE pState, + REVERB_HANDLE hReverb, float *pInput, float *pOut0, float *pOut1 ) { - uint16_t nr_branches = pState->nr_of_branches; - uint16_t bsize = pState->full_block_size; + uint16_t nr_branches = hReverb->nr_of_branches; + uint16_t bsize = hReverb->full_block_size; uint16_t inner_bsize = INNER_BLK_SIZE; uint16_t i, j, k, ns, branch_idx, blk_idx, start_sample_idx; @@ -1384,12 +1382,12 @@ static void reverb_block( for ( i = 0; i < nr_branches; i++ ) { float *pOutput_i = &ppOutput[i][0]; - float mixer_0_i = pState->mixer[0][i]; - float mixer_1_i = pState->mixer[1][i]; + float mixer_0_i = hReverb->mixer[0][i]; + float mixer_1_i = hReverb->mixer[1][i]; /* output and feedback are same, get sample from delay line ... */ - ivas_rev_delay_line_get_sample_blk( &( pState->delay_line[i] ), inner_bsize, pTemp ); - ivas_reverb_iir_filt_2taps_feed_blk( &( pState->t60[i] ), inner_bsize, pTemp, ppOutput[i] ); + ivas_rev_delay_line_get_sample_blk( &( hReverb->delay_line[i] ), inner_bsize, pTemp ); + ivas_reverb_iir_filt_2taps_feed_blk( &( hReverb->t60[i] ), inner_bsize, pTemp, ppOutput[i] ); for ( ns = 0; ns < inner_bsize; ns++ ) { pO0[ns] += pOutput_i[ns] * mixer_0_i; /* mixer ch 0 */ @@ -1408,7 +1406,7 @@ static void reverb_block( for ( j = 0; j < nr_branches; j++ ) { - float gain_matrix_j_i = pState->gain_matrix[j][i]; + float gain_matrix_j_i = hReverb->gain_matrix[j][i]; float *pOutput = &ppOutput[j][0]; for ( ns = 0; ns < inner_bsize; ns++ ) { @@ -1416,15 +1414,15 @@ static void reverb_block( } } - ivas_rev_delay_line_feed_sample_blk( &( pState->delay_line[i] ), inner_bsize, pFeedback_input ); + ivas_rev_delay_line_feed_sample_blk( &( hReverb->delay_line[i] ), inner_bsize, pFeedback_input ); } } /* Applying FFT filter to each sub-frame */ - for ( blk_idx = 0; blk_idx < pState->num_fft_subblocks; blk_idx++ ) + for ( blk_idx = 0; blk_idx < hReverb->num_fft_subblocks; blk_idx++ ) { - start_sample_idx = blk_idx * pState->fft_subblock_size; - post_fft_filter( pState, pOut0 + start_sample_idx, pOut1 + start_sample_idx, pFFT_buf[0], pFFT_buf[1] ); + start_sample_idx = blk_idx * hReverb->fft_subblock_size; + post_fft_filter( hReverb, pOut0 + start_sample_idx, pOut1 + start_sample_idx, pFFT_buf[0], pFFT_buf[1] ); } return; @@ -1438,14 +1436,14 @@ static void reverb_block( *-----------------------------------------------------------------------------------------*/ static ivas_error downmix_input_block( - REVERB_HANDLE pState, + const REVERB_HANDLE hReverb, float pcm_in[][L_FRAME48k], const AUDIO_CONFIG input_audio_config, float *pPcm_out, const int16_t input_offset ) { int16_t i, s, nchan_transport; - float dmx_gain = pState->dmx_gain; + float dmx_gain = hReverb->dmx_gain; switch ( input_audio_config ) { @@ -1461,7 +1459,7 @@ static ivas_error downmix_input_block( case AUDIO_CONFIG_ISM4: { nchan_transport = audioCfg2channels( input_audio_config ); - for ( s = 0; s < pState->full_block_size; s++ ) + for ( s = 0; s < hReverb->full_block_size; s++ ) { float temp = pcm_in[0][input_offset + s]; for ( i = 1; i < nchan_transport; i++ ) @@ -1477,7 +1475,7 @@ static ivas_error downmix_input_block( case AUDIO_CONFIG_HOA2: case AUDIO_CONFIG_HOA3: { - for ( s = 0; s < pState->full_block_size; s++ ) + for ( s = 0; s < hReverb->full_block_size; s++ ) { pPcm_out[s] = dmx_gain * pcm_in[0][input_offset + s]; } @@ -1499,35 +1497,35 @@ static ivas_error downmix_input_block( *-----------------------------------------------------------------------------------------*/ static void predelay_block( - REVERB_HANDLE pState, + const REVERB_HANDLE hReverb, float *pInput, float *pOutput ) { uint16_t i, idx, n_samples, blk_size; - uint16_t max_blk_size = (uint16_t) pState->predelay_line.Delay; + uint16_t max_blk_size = (uint16_t) hReverb->predelay_line.Delay; if ( max_blk_size < 2 ) { if ( max_blk_size == 0 ) /* zero-length delay line: just copy the data from input to output */ { - for ( i = 0; i < pState->full_block_size; i++ ) + for ( i = 0; i < hReverb->full_block_size; i++ ) { pOutput[i] = pInput[i]; } } else /* 1-sample length delay line: feed the data sample-by-sample */ { - for ( i = 0; i < pState->full_block_size; i++ ) + for ( i = 0; i < hReverb->full_block_size; i++ ) { - pOutput[i] = ivas_rev_delay_line_get_sample( &( pState->predelay_line ) ); - ivas_rev_delay_line_feed_sample( &( pState->predelay_line ), pInput[i] ); + pOutput[i] = ivas_rev_delay_line_get_sample( &( hReverb->predelay_line ) ); + ivas_rev_delay_line_feed_sample( &( hReverb->predelay_line ), pInput[i] ); } } } else /* multiple-sample length delay line: use block processing */ { idx = 0; - n_samples = pState->full_block_size; + n_samples = hReverb->full_block_size; while ( n_samples > 0 ) { blk_size = n_samples; @@ -1535,8 +1533,8 @@ static void predelay_block( { blk_size = max_blk_size; } - ivas_rev_delay_line_get_sample_blk( &( pState->predelay_line ), blk_size, &pOutput[idx] ); - ivas_rev_delay_line_feed_sample_blk( &( pState->predelay_line ), blk_size, &pInput[idx] ); + ivas_rev_delay_line_get_sample_blk( &( hReverb->predelay_line ), blk_size, &pOutput[idx] ); + ivas_rev_delay_line_feed_sample_blk( &( hReverb->predelay_line ), blk_size, &pInput[idx] ); idx += blk_size; n_samples -= blk_size; } @@ -1553,7 +1551,7 @@ static void predelay_block( *-----------------------------------------------------------------------------------------*/ static void mix_output_block( - REVERB_HANDLE pState, + const REVERB_HANDLE hReverb, const float *pInL, const float *pInR, float *pOutL, @@ -1561,7 +1559,7 @@ static void mix_output_block( { uint16_t i; - for ( i = 0; i < pState->full_block_size; i++ ) + for ( i = 0; i < hReverb->full_block_size; i++ ) { pOutL[i] += pInL[i]; pOutR[i] += pInR[i]; @@ -1578,12 +1576,13 @@ static void mix_output_block( *-----------------------------------------------------------------------------------------*/ ivas_error ivas_reverb_process( - REVERB_HANDLE hReverb, /* i/o: reverb state */ + const REVERB_HANDLE hReverb, /* i : Reverberator handle */ const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */ const int16_t mix_signals, /* i : add reverb to output signal */ float pcm_in[][L_FRAME48k], /* i : the PCM audio to apply reverb on */ float pcm_out[][L_FRAME48k], /* o : the PCM audio with reverb applied */ - const int16_t i_ts ) + const int16_t i_ts /* i : subframe index */ +) { float tmp0[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES], tmp1[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES], tmp2[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; ivas_error error; diff --git a/lib_rend/ivas_rom_TdBinauralRenderer.c b/lib_rend/ivas_rom_TdBinauralRenderer.c index 70daa6dff9..4b56fb4883 100644 --- a/lib_rend/ivas_rom_TdBinauralRenderer.c +++ b/lib_rend/ivas_rom_TdBinauralRenderer.c @@ -41,6 +41,7 @@ #include "ivas_cnst.h" #include "wmc_auto.h" +#define WMC_TOOL_SKIP /*------------------------------------------------------------------------- * TD Binaural rendering related ROM tables @@ -12456,4 +12457,6 @@ const uint32_t orange53_rom_ITD_elevBsShape[28] = { 0x3ebda12f,0x3f12f685,0x3f2aaaab, }; +#undef WMC_TOOL_SKIP + /* clang-format on */ diff --git a/lib_rend/ivas_rom_binauralRenderer.c b/lib_rend/ivas_rom_binauralRenderer.c index 763777ad28..9708bac83a 100644 --- a/lib_rend/ivas_rom_binauralRenderer.c +++ b/lib_rend/ivas_rom_binauralRenderer.c @@ -41,6 +41,8 @@ /* clang-format off */ +#define WMC_TOOL_SKIP + /*------------------------------------------------------------------------- * Binaural rendering related ROM tables *------------------------------------------------------------------------*/ @@ -44077,4 +44079,6 @@ const float parametricEarlyPartEneCorrection[CLDFB_NO_CHANNELS_MAX] = 0.016350f, 0.042709f, 0.077337f, 0.066238f, 0.042046f, 0.020017f, 0.007896f, 0.002947f, 0.000932f, 0.000152f }; +#undef WMC_TOOL_SKIP + /* clang-format on */ diff --git a/lib_rend/ivas_rom_binaural_crend_head.c b/lib_rend/ivas_rom_binaural_crend_head.c index a57d780378..56a9a9ef53 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.c +++ b/lib_rend/ivas_rom_binaural_crend_head.c @@ -47,6 +47,7 @@ #include "cnst.h" #include "ivas_cnst.h" +#define WMC_TOOL_SKIP /********************** CRendBin_Combined_HRIR **********************/ #ifdef FIX_BINAURAL_DELAY_PRECISION @@ -6923,3 +6924,4 @@ const float CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS][252 0.050578f, 0.012222f, 0.020049f, -0.020057f, -0.032135f, -0.002553f, -0.037541f, -0.023567f, -0.008392f, -0.012215f, 0.001644f, -0.001142f, 0.000540f, 0.001404f, -0.027979f, -0.022362f, -0.012091f, -0.022963f, 0.009075f, 0.010977f, -0.007069f, -0.000183f, -0.022228f, -0.001348f, 0.006548f, -0.003034f} }; +#undef WMC_TOOL_SKIP diff --git a/lib_rend/ivas_rom_rend.c b/lib_rend/ivas_rom_rend.c index 0dfdaf0d28..dd8ca99d80 100644 --- a/lib_rend/ivas_rom_rend.c +++ b/lib_rend/ivas_rom_rend.c @@ -104,7 +104,7 @@ const float diffuseFieldCoherenceDifferenceZ[BINAURAL_COHERENCE_DIFFERENCE_BINS] /*----------------------------------------------------------------------------------* - * TD ISm binaural renderer ROM tables + * TD ISM binaural renderer ROM tables *----------------------------------------------------------------------------------*/ const int16_t HRTF_MODEL_N_CPTS_VAR[HRTF_MODEL_N_SECTIONS] = diff --git a/lib_rend/ivas_rotation.c b/lib_rend/ivas_rotation.c index 2622d02308..2a45c6d61a 100644 --- a/lib_rend/ivas_rotation.c +++ b/lib_rend/ivas_rotation.c @@ -30,6 +30,7 @@ *******************************************************************************************************/ +#include "ivas_cnst.h" #include #include #include "options.h" @@ -43,6 +44,83 @@ #include "wmc_auto.h" +/*-----------------------------------------------------------------------* + * ivas_headTrack_open() + * + * Allocate and initialize Head-Tracking handle + *-----------------------------------------------------------------------*/ + +ivas_error ivas_headTrack_open( + HEAD_TRACK_DATA_HANDLE *hHeadTrackData /* o : head track handle */ +) +{ + int16_t i; + ivas_error error; + + /* Allocate Head-Tracking handle */ + if ( ( *hHeadTrackData = (HEAD_TRACK_DATA_HANDLE) malloc( sizeof( HEAD_TRACK_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for head-tracking memory\n" ) ); + } + + /* Initialization */ + ( *hHeadTrackData )->num_quaternions = 0; + ( *hHeadTrackData )->lrSwitchInterpVal = 0.0f; + ( *hHeadTrackData )->lrSwitchedCurrent = 0; + ( *hHeadTrackData )->lrSwitchedNext = 0; +#ifdef FIX_I109_ORIENTATION_TRACKING + if ( ( ( *hHeadTrackData )->OrientationTracker = (ivas_orient_trk_state_t *) malloc( sizeof( ivas_orient_trk_state_t ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Orientation tracking" ); + } + + if ( ( error = ivas_orient_trk_Init( ( *hHeadTrackData )->OrientationTracker ) ) != IVAS_ERR_OK ) + { + return error; + } +#endif + + /* Initialise Rmat_prev to I, Rmat will be computed later */ + for ( i = 0; i < 3; i++ ) + { + set_zero( ( *hHeadTrackData )->Rmat_prev[i], 3 ); + ( *hHeadTrackData )->Rmat_prev[i][i] = 1.0f; + } + + return IVAS_ERR_OK; +} + + +#ifdef FIX_I109_ORIENTATION_TRACKING +/*-----------------------------------------------------------------------* + * ivas_headTrack_close() + * + * Deallocate Head-Tracking handle + *-----------------------------------------------------------------------*/ + +void ivas_headTrack_close( + HEAD_TRACK_DATA_HANDLE *hHeadTrackData /* i/o: head track handle */ +) +{ + if ( hHeadTrackData == NULL || *hHeadTrackData == NULL ) + { + return; + } + + if ( ( *hHeadTrackData )->OrientationTracker != NULL ) + { + free( ( *hHeadTrackData )->OrientationTracker ); + ( *hHeadTrackData )->OrientationTracker = NULL; + } + + free( ( *hHeadTrackData ) ); + *hHeadTrackData = NULL; + + return; +} +#endif + + /*---------------------------------------------------------------------------------- * QuatToRotMat() * @@ -54,7 +132,21 @@ void QuatToRotMat( float Rmat[3][3] /* o : real-space rotation matrix for this rotation */ ) { +#ifdef FIX_I109_ORIENTATION_TRACKING + Rmat[0][0] = quat.w * quat.w + quat.x * quat.x - quat.y * quat.y - quat.z * quat.z; + Rmat[0][1] = 2.0f * ( quat.x * quat.y - quat.w * quat.z ); + Rmat[0][2] = 2.0f * ( quat.x * quat.z + quat.w * quat.y ); + + Rmat[1][0] = 2.0f * ( quat.x * quat.y + quat.w * quat.z ); + Rmat[1][1] = quat.w * quat.w - quat.x * quat.x + quat.y * quat.y - quat.z * quat.z; + Rmat[1][2] = 2.0f * ( quat.y * quat.z - quat.w * quat.x ); + + Rmat[2][0] = 2.0f * ( quat.x * quat.z - quat.w * quat.y ); + Rmat[2][1] = 2.0f * ( quat.y * quat.z + quat.w * quat.x ); + Rmat[2][2] = quat.w * quat.w - quat.x * quat.x - quat.y * quat.y + quat.z * quat.z; +#else float s1, s2, s3, c1, c2, c3; + #ifdef DEBUGGING /* PrintQuat( quat ); */ #endif @@ -63,7 +155,11 @@ void QuatToRotMat( * Euler angles instead of quaternions. In this case, all the w values must * be set to -3.0 in the trajectory file to signal switching to Euler angles. * The x,y, and z components of the quaternion are then interpreted as +#ifdef FIX_I109_ORIENTATION_TRACKING * yaw-pitch-roll. +#else // see below: "Euler angles in R_X(roll)*R_Y(pitch)*R_Z(yaw) convention" + * roll-pitch-yaw. +#endif */ if ( quat.w != -3.0 ) { @@ -108,21 +204,23 @@ void QuatToRotMat( Rmat[2][1] = c3 * s1 + c1 * s2 * s3; Rmat[2][2] = c1 * c2; } +#endif return; } +#ifndef FIX_I109_ORIENTATION_TRACKING /*------------------------------------------------------------------------- * Quat2Euler() * - * Quaternion handling: calculate corresponding Euler angles + * Quaternion handling: calculate corresponding Euler angles in radians *------------------------------------------------------------------------*/ void Quat2Euler( const IVAS_QUATERNION quat, /* i : quaternion describing the rotation */ - float *yaw, /* o : yaw */ - float *pitch, /* o : pitch */ - float *roll /* o : roll */ + float *yaw, /* o : yaw (z) */ + float *pitch, /* o : pitch (y) */ + float *roll /* o : roll (x) */ ) { if ( quat.w != -3.0 ) @@ -146,7 +244,57 @@ void Quat2Euler( return; } +#endif + +#ifdef FIX_I109_ORIENTATION_TRACKING +/*------------------------------------------------------------------------- + * Euler2Quat() + * + * Calculate corresponding Quaternion from Euler angles in radians + *------------------------------------------------------------------------*/ +void Euler2Quat( + const float yaw, /* i : yaw (x) */ + const float pitch, /* i : pitch (y) */ + const float roll, /* i : roll (z) */ + IVAS_QUATERNION *quat /* o : quaternion describing the rotation */ +) +{ + float cr = cosf( roll * 0.5f ); + float sr = sinf( roll * 0.5f ); + float cp = cosf( pitch * 0.5f ); + float sp = sinf( -pitch * 0.5f ); + float cy = cosf( yaw * 0.5f ); + float sy = sinf( yaw * 0.5f ); + + quat->w = cr * cp * cy - sr * sp * sy; + quat->x = sr * cp * cy + cr * sp * sy; + quat->y = cr * sp * cy - sr * cp * sy; + quat->z = cr * cp * sy + sr * sp * cy; + + return; +} + +/*------------------------------------------------------------------------- + * deg2rad() + * + * Converts degrees to normalized radians + *------------------------------------------------------------------------*/ +float deg2rad( + float degrees ) +{ + while ( degrees >= 180.0f ) + { + degrees = degrees - 360.0f; + } + while ( degrees <= -180.0f ) + { + degrees = degrees + 360.0f; + } + + return PI_OVER_180 * degrees; +} +#endif /*------------------------------------------------------------------------- * rotateAziEle() diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 586a43c4f8..13c6084b2d 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -221,39 +221,25 @@ typedef struct EFAP } EFAP, *EFAP_HANDLE; - /*----------------------------------------------------------------------------------* - * Head rotation data structure + * Orientation tracking structure *----------------------------------------------------------------------------------*/ -typedef struct -{ - int8_t headRotEnabled; - IVAS_QUATERNION headPositions[RENDERER_HEAD_POSITIONS_PER_FRAME]; - float crossfade[L_FRAME48k / RENDERER_HEAD_POSITIONS_PER_FRAME]; - -} IVAS_REND_HeadRotData; - -typedef struct ivas_binaural_head_track_struct +#ifdef FIX_I109_ORIENTATION_TRACKING +typedef struct ivas_orient_trk_state_t { - int16_t num_quaternions; - IVAS_QUATERNION Quaternions[MAX_PARAM_SPATIAL_SUBFRAMES]; - float Rmat[3][3]; - float Rmat_prev[3][3]; - - uint8_t lrSwitchedNext; - uint8_t lrSwitchedCurrent; - float lrSwitchInterpVal; - - int16_t shd_rot_max_order; - -} HEAD_TRACK_DATA, *HEAD_TRACK_DATA_HANDLE; - + OTR_TRACKING_T trackingType; + float centerAdaptationRate; + float offCenterAdaptationRate; + float adaptationAngle; -/*----------------------------------------------------------------------------------* - * Orientation tracking structure - *----------------------------------------------------------------------------------*/ + float alpha; + IVAS_QUATERNION absAvgRot; /* average absolute orientation */ + IVAS_QUATERNION refRot; /* reference orientation */ + IVAS_QUATERNION trkRot; /* tracked rotation */ +} ivas_orient_trk_state_t; +#else typedef struct ivas_orient_trk_state_t { OTR_TRACKING_T trackingType; @@ -280,11 +266,52 @@ typedef struct ivas_orient_trk_state_t float trkRoll; } ivas_orient_trk_state_t; +#endif + +/*----------------------------------------------------------------------------------* + * Head rotation data structure + *----------------------------------------------------------------------------------*/ + +typedef struct +{ + int8_t headRotEnabled; + IVAS_QUATERNION headPositions[RENDERER_HEAD_POSITIONS_PER_FRAME]; +#ifdef TD5 + IVAS_POSITION Pos[RENDERER_HEAD_POSITIONS_PER_FRAME]; +#endif + float crossfade[L_FRAME48k / RENDERER_HEAD_POSITIONS_PER_FRAME]; +#ifdef FIX_I109_ORIENTATION_TRACKING + ivas_orient_trk_state_t *hOrientationTracker; +#endif + +} IVAS_REND_HeadRotData; + +typedef struct ivas_binaural_head_track_struct +{ + int16_t num_quaternions; + IVAS_QUATERNION Quaternions[MAX_PARAM_SPATIAL_SUBFRAMES]; +#ifdef TD5 + IVAS_POSITION Pos[MAX_PARAM_SPATIAL_SUBFRAMES]; +#endif + float Rmat[3][3]; + float Rmat_prev[3][3]; + uint8_t lrSwitchedNext; + uint8_t lrSwitchedCurrent; + float lrSwitchInterpVal; + + int16_t shd_rot_max_order; +#ifdef FIX_I109_ORIENTATION_TRACKING + ivas_orient_trk_state_t *OrientationTracker; +#endif + +} HEAD_TRACK_DATA, *HEAD_TRACK_DATA_HANDLE; /*----------------------------------------------------------------------------------* * Reverberator structure *----------------------------------------------------------------------------------*/ +/* Reverberator structures */ + typedef struct ivas_roomAcoustics_t { @@ -306,6 +333,9 @@ typedef struct ivas_render_config_t ivas_renderTypeOverride renderer_type_override; #endif ivas_roomAcoustics_t roomAcoustics; +#ifdef TD5 + float directivity[3]; +#endif } RENDER_CONFIG_DATA, *RENDER_CONFIG_HANDLE; @@ -389,7 +419,7 @@ typedef struct ivas_reverb_state_t /*----------------------------------------------------------------------------------* - * TD ISm Object Renderer structure + * TD ISM Object Renderer structure *----------------------------------------------------------------------------------*/ typedef struct diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 574396ce0e..1dc1c1f956 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -30,12 +30,6 @@ *******************************************************************************************************/ -#include -#include -#include -#include -#include -#include #include "options.h" #include "lib_rend.h" #include "prot.h" @@ -121,14 +115,8 @@ typedef struct IVAS_REND_AudioObjectPosition currentPos; IVAS_REND_AudioObjectPosition previousPos; TDREND_WRAPPER tdRendWrapper; -#ifdef FIX_197_CREND_INTERFACE CREND_WRAPPER_HANDLE crendWrapper; -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND - REVERB_HANDLE reverb; -#endif -#else - CREND_WRAPPER crendWrapper; -#endif + REVERB_HANDLE hReverb; rotation_matrix rot_mat_prev; } input_ism; @@ -153,14 +141,8 @@ typedef struct LSSETUP_CUSTOM_STRUCT customLsInput; EFAP_WRAPPER efapInWrapper; TDREND_WRAPPER tdRendWrapper; -#ifdef FIX_197_CREND_INTERFACE CREND_WRAPPER_HANDLE crendWrapper; -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND - REVERB_HANDLE reverb; -#endif -#else - CREND_WRAPPER crendWrapper; -#endif + REVERB_HANDLE hReverb; rotation_gains rot_gains_prev; lfe_routing lfeRouting; } input_mc; @@ -169,11 +151,7 @@ typedef struct { input_base base; pan_matrix hoaDecMtx; -#ifdef FIX_197_CREND_INTERFACE CREND_WRAPPER_HANDLE crendWrapper; -#else - CREND_WRAPPER crendWrapper; -#endif rotation_gains rot_gains_prev; } input_sba; @@ -335,11 +313,7 @@ static int32_t limitRendererOutput( * *-------------------------------------------------------------------*/ -#ifdef FIX_197_CREND_INTERFACE AUDIO_CONFIG getIvasAudioConfigFromRendAudioConfig( -#else -AUDIO_CONFIG rendAudioConfigToIvasAudioConfig( -#endif IVAS_REND_AudioConfig rendConfig ) { switch ( rendConfig ) @@ -927,11 +901,16 @@ static ivas_error getEfapGains( return IVAS_ERR_OK; } +#ifdef FIX_I109_ORIENTATION_TRACKING +static ivas_error initHeadRotation( +#else static void initHeadRotation( +#endif IVAS_REND_HANDLE hIvasRend ) { int16_t i, crossfade_len; float tmp; + ivas_error error; /* Head rotation is enabled by default */ hIvasRend->headRotData.headRotEnabled = 1; @@ -950,8 +929,35 @@ static void initHeadRotation( hIvasRend->headRotData.headPositions[i] = quaternionInit(); } +#ifdef FIX_I109_ORIENTATION_TRACKING + if ( ( hIvasRend->headRotData.hOrientationTracker = (ivas_orient_trk_state_t *) malloc( sizeof( ivas_orient_trk_state_t ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Orientation tracking" ); + } + + if ( ( error = ivas_orient_trk_Init( hIvasRend->headRotData.hOrientationTracker ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +#else + return; +#endif +} + +#ifdef FIX_I109_ORIENTATION_TRACKING +static void closeHeadRotation( + IVAS_REND_HANDLE hIvasRend ) +{ + if ( ( hIvasRend != NULL ) && ( hIvasRend->headRotData.hOrientationTracker != NULL ) ) + { + free( hIvasRend->headRotData.hOrientationTracker ); + } + return; } +#endif static void initRotMatrix( rotation_matrix rot_mat ) @@ -1011,6 +1017,11 @@ static IVAS_REND_AudioObjectPosition defaultObjectPosition( pos.azimuth = 0.0f; pos.elevation = 0.0f; +#ifdef TD5 + pos.radius = 1.0f; + pos.yaw = 0.0f; + pos.pitch = 0.0f; +#endif return pos; } @@ -1056,6 +1067,21 @@ static CREND_WRAPPER defaultCrendWrapper( return w; } +static bool isIoConfigPairSupported( + IVAS_REND_AudioConfig inConfig, + IVAS_REND_AudioConfig outConfig ) +{ + /* Rendering mono or stereo to binaural is not supported */ + if ( ( inConfig == IVAS_REND_AUDIO_CONFIG_MONO || inConfig == IVAS_REND_AUDIO_CONFIG_STEREO ) && + getAudioConfigType( outConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) + { + return false; + } + + /* If not returned so far, config pair is supported */ + return true; +} + static ivas_error setRendInputActiveIsm( void *input, const IVAS_REND_AudioConfig inConfig, @@ -1071,64 +1097,61 @@ static ivas_error setRendInputActiveIsm( rendCtx = inputIsm->base.ctx; outConfig = *rendCtx.pOutConfig; + if ( !isIoConfigPairSupported( inConfig, outConfig ) ) + { + return IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED; + } + initRendInputBase( &inputIsm->base, inConfig, id, rendCtx ); inputIsm->currentPos = defaultObjectPosition(); inputIsm->previousPos = defaultObjectPosition(); -#ifdef FIX_197_CREND_INTERFACE inputIsm->crendWrapper = NULL; -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND - inputIsm->reverb = NULL; -#endif -#else - inputIsm->crendWrapper = defaultCrendWrapper(); -#endif + inputIsm->hReverb = NULL; inputIsm->tdRendWrapper = defaultTdRendWrapper(); initRotMatrix( inputIsm->rot_mat_prev ); error = IVAS_ERR_OK; if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL ) { +#ifdef TD5 + if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) +#endif { return error; } } else if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) { -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND if ( hRendCfg != NULL && hRendCfg->roomAcoustics.use_brir == 0 && hRendCfg->roomAcoustics.late_reverb_on ) { +#ifdef TD5 + if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) +#endif { return error; } - if ( ( error = ivas_reverb_open( &( inputIsm->reverb ), getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, hRendCfg, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_reverb_open( &( inputIsm->hReverb ), getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, hRendCfg, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) { return error; } } else { -#endif - if ( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, AUDIO_CONFIG_7_1_4, -#ifdef FIX_197_CREND_INTERFACE - getIvasAudioConfigFromRendAudioConfig( outConfig ), -#else - rendAudioConfigToIvasAudioConfig( outConfig ), -#endif - hRendCfg, -#ifdef FIX_197_CREND_INTERFACE + if ( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, AUDIO_CONFIG_7_1_4, getIvasAudioConfigFromRendAudioConfig( outConfig ), hRendCfg, +#ifndef FIX_I109_ORIENTATION_TRACKING 0, #endif NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) { return error; } -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND } -#endif } return IVAS_ERR_OK; @@ -1144,21 +1167,10 @@ static void clearInputIsm( initRendInputBase( &inputIsm->base, IVAS_REND_AUDIO_CONFIG_UNKNOWN, 0, rendCtx ); /* Free input's internal handles */ -#ifdef FIX_197_CREND_INTERFACE - if ( inputIsm->crendWrapper != NULL ) -#else - if ( inputIsm->crendWrapper.hCrend != NULL ) -#endif - { - ivas_rend_closeCrend( &inputIsm->crendWrapper ); - } -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND - if ( inputIsm->reverb != NULL ) - { - ivas_reverb_close( &inputIsm->reverb ); - } -#endif + ivas_rend_closeCrend( &inputIsm->crendWrapper ); + + ivas_reverb_close( &inputIsm->hReverb ); if ( inputIsm->tdRendWrapper.hBinRendererTd != NULL ) { @@ -1216,6 +1228,8 @@ static void fillIdentityPanMatrix( { panMatrix[i][i] = 1.0f; } + + return; } static ivas_error initMcPanGainsWithIdentMatrix( @@ -1233,20 +1247,14 @@ static ivas_error initMcPanGainsWithConversionMapping( AUDIO_CONFIG ivasConfigIn, ivasConfigOut; int16_t i; -#ifdef FIX_197_CREND_INTERFACE ivasConfigIn = getIvasAudioConfigFromRendAudioConfig( inputMc->base.inConfig ); ivasConfigOut = getIvasAudioConfigFromRendAudioConfig( outConfig ); -#else - ivasConfigIn = rendAudioConfigToIvasAudioConfig( inputMc->base.inConfig ); - ivasConfigOut = rendAudioConfigToIvasAudioConfig( outConfig ); -#endif /* Find conversion mapping for current I/O config pair. * Stay with default panning matrix if conversion_matrix is NULL */ for ( i = 0; i < LS_SETUP_CONVERSION_NUM_MAPPINGS; ++i ) { - if ( ls_conversion_mapping[i].input_config == ivasConfigIn && - ls_conversion_mapping[i].output_config == ivasConfigOut ) + if ( ls_conversion_mapping[i].input_config == ivasConfigIn && ls_conversion_mapping[i].output_config == ivasConfigOut ) { /* Mapping found with valid matrix - copy */ if ( ls_conversion_mapping[i].conversion_matrix != NULL ) @@ -1802,21 +1810,9 @@ static ivas_error initMcBinauralRendering( inputMc->tdRendWrapper.hHrtfTD = NULL; } -#ifdef FIX_197_CREND_INTERFACE - if ( inputMc->crendWrapper != NULL ) -#else - if ( inputMc->crendWrapper.hCrend != NULL ) -#endif - { - ivas_rend_closeCrend( &inputMc->crendWrapper ); - } + ivas_rend_closeCrend( &inputMc->crendWrapper ); -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND - if ( inputMc->reverb != NULL ) - { - ivas_reverb_close( &inputMc->reverb ); - } -#endif + ivas_reverb_close( &inputMc->hReverb ); if ( inputMc->efapInWrapper.hEfap != NULL ) { @@ -1843,32 +1839,27 @@ static ivas_error initMcBinauralRendering( // if ( initTDRend ) { +#ifdef TD5 + if ( ( error = ivas_td_binaural_open_ext( &inputMc->tdRendWrapper, inConfig, hRendCfg, &inputMc->customLsInput, outSampleRate ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_td_binaural_open_ext( &inputMc->tdRendWrapper, inConfig, &inputMc->customLsInput, outSampleRate ) ) != IVAS_ERR_OK ) +#endif { return error; } -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND if ( hRendCfg != NULL && hRendCfg->roomAcoustics.use_brir == 0 && hRendCfg->roomAcoustics.late_reverb_on ) { - if ( ( error = ivas_reverb_open( &( inputMc->reverb ), getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, hRendCfg, outSampleRate ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_reverb_open( &( inputMc->hReverb ), getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, hRendCfg, outSampleRate ) ) != IVAS_ERR_OK ) { return error; } } -#endif } { - if ( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, -#ifdef FIX_197_CREND_INTERFACE - ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) ? AUDIO_CONFIG_7_1_4 : getIvasAudioConfigFromRendAudioConfig( inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), -#else - ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) ? AUDIO_CONFIG_7_1_4 : rendAudioConfigToIvasAudioConfig( inConfig ), - rendAudioConfigToIvasAudioConfig( outConfig ), -#endif - hRendCfg, -#ifdef FIX_197_CREND_INTERFACE + if ( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) ? AUDIO_CONFIG_7_1_4 : getIvasAudioConfigFromRendAudioConfig( inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), hRendCfg, +#ifndef FIX_I109_ORIENTATION_TRACKING 0, #endif NULL, outSampleRate ) ) != IVAS_ERR_OK ) @@ -1895,7 +1886,7 @@ static lfe_routing defaultLfeRouting( const IVAS_REND_AudioConfig outConfig, const LSSETUP_CUSTOM_STRUCT customLsOut ) { - int32_t i; + int16_t i; lfe_routing routing; /* Set all output gains to zero, then route each input LFE consecutively to the next available output LFE. */ @@ -1962,18 +1953,17 @@ static ivas_error setRendInputActiveMc( rendCtx = inputMc->base.ctx; outConfig = *rendCtx.pOutConfig; + if ( !isIoConfigPairSupported( inConfig, outConfig ) ) + { + return IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED; + } + initRendInputBase( &inputMc->base, inConfig, id, rendCtx ); setZeroPanMatrix( inputMc->panGains ); inputMc->customLsInput = defaultCustomLs(); inputMc->tdRendWrapper = defaultTdRendWrapper(); -#ifdef FIX_197_CREND_INTERFACE inputMc->crendWrapper = NULL; -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND - inputMc->reverb = NULL; -#endif -#else - inputMc->crendWrapper = defaultCrendWrapper(); -#endif + inputMc->hReverb = NULL; initRotGains( inputMc->rot_gains_prev ); inputMc->lfeRouting = defaultLfeRouting( inConfig, inputMc->customLsInput, outConfig, *inputMc->base.ctx.pCustomLsOut ); @@ -2008,21 +1998,9 @@ static void clearInputMc( efap_free_data( &inputMc->efapInWrapper.hEfap ); } -#ifdef FIX_197_CREND_INTERFACE - if ( inputMc->crendWrapper != NULL ) -#else - if ( inputMc->crendWrapper.hCrend != NULL ) -#endif - { - ivas_rend_closeCrend( &inputMc->crendWrapper ); - } + ivas_rend_closeCrend( &inputMc->crendWrapper ); -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND - if ( inputMc->reverb != NULL ) - { - ivas_reverb_close( &inputMc->reverb ); - } -#endif + ivas_reverb_close( &inputMc->hReverb ); if ( inputMc->tdRendWrapper.hBinRendererTd != NULL ) { @@ -2060,11 +2038,7 @@ static ivas_error initSbaPanGainsForMcOut( case IVAS_REND_AUDIO_CONFIG_MONO: hOutSetup.ls_azimuth = ls_azimuth_CICP1; hOutSetup.ls_elevation = ls_elevation_CICP1; -#ifdef FIX_197_CREND_INTERFACE ivas_output_init( &hOutSetup, getIvasAudioConfigFromRendAudioConfig( outConfig ) ); -#else - ivas_output_init( &hOutSetup, rendAudioConfigToIvasAudioConfig( outConfig ) ); -#endif break; case IVAS_REND_AUDIO_CONFIG_STEREO: case IVAS_REND_AUDIO_CONFIG_5_1: @@ -2072,11 +2046,7 @@ static ivas_error initSbaPanGainsForMcOut( case IVAS_REND_AUDIO_CONFIG_5_1_2: case IVAS_REND_AUDIO_CONFIG_5_1_4: case IVAS_REND_AUDIO_CONFIG_7_1_4: -#ifdef FIX_197_CREND_INTERFACE ivas_output_init( &hOutSetup, getIvasAudioConfigFromRendAudioConfig( outConfig ) ); -#else - ivas_output_init( &hOutSetup, rendAudioConfigToIvasAudioConfig( outConfig ) ); -#endif break; case IVAS_REND_AUDIO_CONFIG_LS_CUSTOM: ivas_ls_custom_setup( &hOutSetup, outSetupCustom ); @@ -2157,15 +2127,10 @@ static ivas_error updateSbaPanGains( { case IVAS_REND_AUDIO_CONFIG_BINAURAL: error = ivas_rend_openCrend( &inputSba->crendWrapper, -#ifdef FIX_197_CREND_INTERFACE getIvasAudioConfigFromRendAudioConfig( inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), -#else - rendAudioConfigToIvasAudioConfig( inConfig ), - rendAudioConfigToIvasAudioConfig( outConfig ), -#endif hRendCfg, -#ifdef FIX_197_CREND_INTERFACE +#ifndef FIX_I109_ORIENTATION_TRACKING 0, #endif NULL, @@ -2179,13 +2144,9 @@ static ivas_error updateSbaPanGains( error = ivas_rend_openCrend( &inputSba->crendWrapper, AUDIO_CONFIG_7_1_4, -#ifdef FIX_197_CREND_INTERFACE getIvasAudioConfigFromRendAudioConfig( outConfig ), -#else - rendAudioConfigToIvasAudioConfig( outConfig ), -#endif hRendCfg, -#ifdef FIX_197_CREND_INTERFACE +#ifndef FIX_I109_ORIENTATION_TRACKING 0, #endif NULL, @@ -2222,13 +2183,14 @@ static ivas_error setRendInputActiveSba( rendCtx = inputSba->base.ctx; outConfig = *rendCtx.pOutConfig; + if ( !isIoConfigPairSupported( inConfig, outConfig ) ) + { + return IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED; + } + initRendInputBase( &inputSba->base, inConfig, id, rendCtx ); setZeroPanMatrix( inputSba->hoaDecMtx ); -#ifdef FIX_197_CREND_INTERFACE inputSba->crendWrapper = NULL; -#else - inputSba->crendWrapper = defaultCrendWrapper(); -#endif initRotGains( inputSba->rot_gains_prev ); if ( ( error = updateSbaPanGains( inputSba, outConfig, hRendCfg ) ) != IVAS_ERR_OK ) @@ -2249,14 +2211,7 @@ static void clearInputSba( initRendInputBase( &inputSba->base, IVAS_REND_AUDIO_CONFIG_UNKNOWN, 0, rendCtx ); /* Free input's internal handles */ -#ifdef FIX_197_CREND_INTERFACE - if ( inputSba->crendWrapper != NULL ) -#else - if ( inputSba->crendWrapper.hCrend != NULL ) -#endif - { - ivas_rend_closeCrend( &inputSba->crendWrapper ); - } + ivas_rend_closeCrend( &inputSba->crendWrapper ); return; } @@ -2273,11 +2228,7 @@ static ivas_error initMasaDummyDecForMcOut( DecoderDummy *decDummy; decDummy = inputMasa->decDummy; -#ifdef FIX_197_CREND_INTERFACE output_config = getIvasAudioConfigFromRendAudioConfig( outConfig ); -#else - output_config = rendAudioConfigToIvasAudioConfig( outConfig ); -#endif decDummy->hDecoderConfig->output_config = output_config; decDummy->hDecoderConfig->ivas_total_brate = IVAS_512k; /* Todo Nokia: This is preventing initialization of 2TC as 1TC, should be fixed properly in ivas_dirac_dec_config() */ @@ -2314,9 +2265,6 @@ static ivas_error initMasaDummyDecForMcOut( { return error; } -#ifndef FIX_107_5MS_SUBFRAME_RENDERING - decDummy->hDiracDecBin->useSubframeMode = 0; /* Todo Nokia: This will disappear in later work but needs to be this now. */ -#endif } numCldfbAnalyses = decDummy->nchan_transport; @@ -2362,11 +2310,7 @@ static ivas_error initMasaDummyDecForSbaOut( decDummy = inputMasa->decDummy; -#ifdef FIX_197_CREND_INTERFACE output_config = getIvasAudioConfigFromRendAudioConfig( outConfig ); -#else - output_config = rendAudioConfigToIvasAudioConfig( outConfig ); -#endif decDummy->hDecoderConfig->output_config = output_config; decDummy->hDecoderConfig->ivas_total_brate = IVAS_512k; /* Todo Nokia: This is preventing initialization of 2TC as 1TC, should be fixed properly in ivas_dirac_dec_config() */ @@ -2433,11 +2377,7 @@ static ivas_error initMasaDummyDecForBinauralOut( decDummy = inputMasa->decDummy; -#ifdef FIX_197_CREND_INTERFACE output_config = getIvasAudioConfigFromRendAudioConfig( outConfig ); -#else - output_config = rendAudioConfigToIvasAudioConfig( outConfig ); -#endif decDummy->hDecoderConfig->output_config = output_config; output_config = decDummy->hDecoderConfig->output_config; @@ -2457,11 +2397,6 @@ static ivas_error initMasaDummyDecForBinauralOut( } decDummy->ivas_format = MASA_FORMAT; decDummy->transport_config = AUDIO_CONFIG_INVALID; -#ifndef REMOVE_FORCE_SUBFRAME_BIN -#ifdef DEBUGGING - decDummy->hDecoderConfig->forceSubframeBinauralization = 0; -#endif -#endif if ( ( error = ivas_dirac_dec_open( decDummy ) ) != IVAS_ERR_OK ) { @@ -2478,9 +2413,6 @@ static ivas_error initMasaDummyDecForBinauralOut( return error; } -#ifndef FIX_107_5MS_SUBFRAME_RENDERING - decDummy->hDiracDecBin->useSubframeMode = 0; /* Todo Nokia: This will disappear in later work but needs to be this now. */ -#endif for ( i = 0; i < BINAURAL_CHANNELS; i++ ) { @@ -2546,17 +2478,12 @@ static DecoderDummy *initDecoderDummy( decDummy = malloc( sizeof( DecoderDummy ) ); decDummy->hDecoderConfig = malloc( sizeof( DECODER_CONFIG ) ); decDummy->hDecoderConfig->output_Fs = sampleRate; - decDummy->hDecoderConfig->nchan_out = (int16_t) numOutChannels; + decDummy->hDecoderConfig->nchan_out = numOutChannels; decDummy->hDecoderConfig->Opt_Headrotation = 0; decDummy->hBinRenderer = NULL; decDummy->hEFAPdata = NULL; -#ifdef FIX_197_CREND_INTERFACE decDummy->hCrendWrapper = NULL; -#else - decDummy->hHrtf = NULL; - decDummy->hCrend = NULL; -#endif decDummy->hHrtfTD = NULL; decDummy->hSpar = NULL; decDummy->hoa_dec_mtx = NULL; @@ -2564,11 +2491,7 @@ static DecoderDummy *initDecoderDummy( decDummy->hMasa = NULL; decDummy->hDiracDecBin = NULL; decDummy->hQMetaData = NULL; -#ifdef FIX_197_CREND_INTERFACE decDummy->hDecoderConfig->output_config = getIvasAudioConfigFromRendAudioConfig( outConfig ); -#else - decDummy->hDecoderConfig->output_config = rendAudioConfigToIvasAudioConfig( outConfig ); -#endif decDummy->nchan_transport = numTransChannels; if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) @@ -2585,6 +2508,10 @@ static DecoderDummy *initDecoderDummy( decDummy->hHeadTrackData->lrSwitchInterpVal = 0.0f; decDummy->hHeadTrackData->lrSwitchedCurrent = 0; decDummy->hHeadTrackData->lrSwitchedNext = 0; +#ifdef FIX_I109_ORIENTATION_TRACKING + decDummy->hHeadTrackData->OrientationTracker = (ivas_orient_trk_state_t *) malloc( sizeof( ivas_orient_trk_state_t ) ); + ivas_orient_trk_Init( decDummy->hHeadTrackData->OrientationTracker ); +#endif } else { @@ -2624,13 +2551,18 @@ static ivas_error setRendInputActiveMasa( outConfig = *rendCtx.pOutConfig; (void) hRendCfg; /* Suppress warning */ + if ( !isIoConfigPairSupported( inConfig, outConfig ) ) + { + return IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED; + } + initRendInputBase( &inputMasa->base, inConfig, id, rendCtx ); if ( ( error = getAudioConfigNumChannels( inConfig, &numInChannels ) ) != IVAS_ERR_OK ) { return error; } - inputMasa->decDummy = initDecoderDummy( *rendCtx.pOutSampleRate, (int16_t) numInChannels, outConfig, 0 ); + inputMasa->decDummy = initDecoderDummy( *rendCtx.pOutSampleRate, numInChannels, outConfig, 0 ); inputMasa->metadataHasBeenFed = false; if ( ( error = updateMasaDummyDec( inputMasa, outConfig ) ) != IVAS_ERR_OK ) @@ -2657,8 +2589,15 @@ static void freeDecoderDummy( { free( pDecDummy->hDecoderConfig ); } + if ( pDecDummy->hHeadTrackData != NULL ) { +#ifdef FIX_I109_ORIENTATION_TRACKING + if ( pDecDummy->hHeadTrackData->OrientationTracker != NULL ) + { + free( pDecDummy->hHeadTrackData->OrientationTracker ); + } +#endif free( pDecDummy->hHeadTrackData ); } ivas_render_config_close( &pDecDummy->hRenderConfig ); @@ -2669,7 +2608,6 @@ static void freeDecoderDummy( if ( pDecDummy->cldfbAnaDec[i] != NULL ) { deleteCldfb( &( pDecDummy->cldfbAnaDec[i] ) ); - pDecDummy->cldfbAnaDec[i] = NULL; } } @@ -2678,16 +2616,11 @@ static void freeDecoderDummy( if ( pDecDummy->cldfbSynDec[i] != NULL ) { deleteCldfb( &( pDecDummy->cldfbSynDec[i] ) ); - pDecDummy->cldfbSynDec[i] = NULL; } } /* DirAC handle */ - if ( pDecDummy->hDirAC != NULL ) - { - ivas_dirac_dec_close( pDecDummy->hDirAC ); - pDecDummy->hDirAC = NULL; - } + ivas_dirac_dec_close( &( pDecDummy->hDirAC ) ); /* Qmetadata handle */ ivas_qmetadata_close( &pDecDummy->hQMetaData ); @@ -2734,10 +2667,7 @@ ivas_error IVAS_REND_Open( ivas_error error; int16_t numOutChannels; - /*-----------------------------------------------------------------* - * Validate function arguments - *-----------------------------------------------------------------*/ - + /* Validate function arguments */ if ( phIvasRend == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -2782,7 +2712,14 @@ ivas_error IVAS_REND_Open( } /* Initialize headrotation data */ +#ifdef FIX_I109_ORIENTATION_TRACKING + if ( ( error = initHeadRotation( hIvasRend ) ) != IVAS_ERR_OK ) + { + return error; + } +#else initHeadRotation( hIvasRend ); +#endif /* Initialize EFAP */ if ( ( error = initEfap( &hIvasRend->efapOutWrapper, outConfig, &hIvasRend->customLsOut ) ) != IVAS_ERR_OK ) @@ -2794,14 +2731,8 @@ ivas_error IVAS_REND_Open( for ( i = 0; i < RENDERER_MAX_ISM_INPUTS; ++i ) { initRendInputBase( &hIvasRend->inputsIsm[i].base, IVAS_REND_AUDIO_CONFIG_UNKNOWN, 0, getRendCtx( hIvasRend ) ); -#ifdef FIX_197_CREND_INTERFACE hIvasRend->inputsIsm[i].crendWrapper = NULL; -#else - hIvasRend->inputsIsm[i].crendWrapper.hCrend = NULL; -#endif -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND - hIvasRend->inputsIsm[i].reverb = NULL; -#endif + hIvasRend->inputsIsm[i].hReverb = NULL; hIvasRend->inputsIsm[i].tdRendWrapper.hBinRendererTd = NULL; } @@ -2809,25 +2740,15 @@ ivas_error IVAS_REND_Open( { initRendInputBase( &hIvasRend->inputsMc[i].base, IVAS_REND_AUDIO_CONFIG_UNKNOWN, 0, getRendCtx( hIvasRend ) ); hIvasRend->inputsMc[i].efapInWrapper.hEfap = NULL; -#ifdef FIX_197_CREND_INTERFACE hIvasRend->inputsMc[i].crendWrapper = NULL; -#else - hIvasRend->inputsMc[i].crendWrapper.hCrend = NULL; -#endif -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND - hIvasRend->inputsMc[i].reverb = NULL; -#endif + hIvasRend->inputsMc[i].hReverb = NULL; hIvasRend->inputsMc[i].tdRendWrapper.hBinRendererTd = NULL; } for ( i = 0; i < RENDERER_MAX_SBA_INPUTS; ++i ) { initRendInputBase( &hIvasRend->inputsSba[i].base, IVAS_REND_AUDIO_CONFIG_UNKNOWN, 0, getRendCtx( hIvasRend ) ); -#ifdef FIX_197_CREND_INTERFACE hIvasRend->inputsSba[i].crendWrapper = NULL; -#else - hIvasRend->inputsSba[i].crendWrapper.hCrend = NULL; -#endif } for ( i = 0; i < RENDERER_MAX_MASA_INPUTS; ++i ) @@ -2905,10 +2826,7 @@ ivas_error IVAS_REND_ConfigureCustomOutputLoudspeakerLayout( input_mc *inputMc; input_sba *inputSba; - /*-----------------------------------------------------------------* - * Validate function arguments - *-----------------------------------------------------------------*/ - + /* Validate function arguments */ if ( hIvasRend == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -2990,10 +2908,7 @@ ivas_error IVAS_REND_NumOutChannels( { ivas_error error; - /*-----------------------------------------------------------------* - * Validate function arguments - *-----------------------------------------------------------------*/ - + /* Validate function arguments */ if ( hIvasRend == NULL || numOutChannels == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -3216,10 +3131,7 @@ ivas_error IVAS_REND_AddInput( ivas_error ( *activateInput )( void *, IVAS_REND_AudioConfig, IVAS_REND_InputId, RENDER_CONFIG_DATA * ); int32_t inputIndex; - /*-----------------------------------------------------------------* - * Validate function arguments - *-----------------------------------------------------------------*/ - + /* Validate function arguments */ if ( hIvasRend == NULL || inputId == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -3288,10 +3200,7 @@ ivas_error IVAS_REND_ConfigureCustomInputLoudspeakerLayout( input_mc *inputMc; ivas_error error; - /*-----------------------------------------------------------------* - * Validate function arguments - *-----------------------------------------------------------------*/ - + /* Validate function arguments */ if ( hIvasRend == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -3357,10 +3266,7 @@ ivas_error IVAS_REND_SetInputGain( input_base *inputBase; ivas_error error; - /*-----------------------------------------------------------------* - * Validate function arguments - *-----------------------------------------------------------------*/ - + /* Validate function arguments */ if ( hIvasRend == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -3394,10 +3300,7 @@ ivas_error IVAS_REND_SetInputLfeMtx( input_mc *pInputMc; ivas_error error; - /*-----------------------------------------------------------------* - * Validate function arguments - *-----------------------------------------------------------------*/ - + /* Validate function arguments */ if ( hIvasRend == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -3448,10 +3351,7 @@ ivas_error IVAS_REND_SetInputLfePos( input_mc *pInputMc; ivas_error error; - /*-----------------------------------------------------------------* - * Validate function arguments - *-----------------------------------------------------------------*/ - + /* Validate function arguments */ if ( hIvasRend == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -3497,10 +3397,7 @@ ivas_error IVAS_REND_RemoveInput( ivas_error error; input_base *inputBase; - /*-----------------------------------------------------------------* - * Validate function arguments - *-----------------------------------------------------------------*/ - + /* Validate function arguments */ if ( hIvasRend == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -3548,10 +3445,7 @@ ivas_error IVAS_REND_GetInputNumChannels( ivas_error error; const input_base *pInput; - /*-----------------------------------------------------------------* - * Validate function arguments - *-----------------------------------------------------------------*/ - + /* Validate function arguments */ if ( hIvasRend == NULL || numChannels == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -3590,10 +3484,7 @@ ivas_error IVAS_REND_GetDelay( int32_t latency_ns; int32_t max_latency_ns; - /*-----------------------------------------------------------------* - * Validate function arguments - *-----------------------------------------------------------------*/ - + /* Validate function arguments */ if ( hIvasRend == NULL || nSamples == NULL || timeScale == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -3608,13 +3499,8 @@ ivas_error IVAS_REND_GetDelay( { if ( hIvasRend->inputsIsm[i].base.inConfig != IVAS_REND_AUDIO_CONFIG_UNKNOWN ) { -#ifdef FIX_197_CREND_INTERFACE latency_ns = max( ( hIvasRend->inputsIsm[i].crendWrapper != NULL ) ? hIvasRend->inputsIsm[i].crendWrapper->binaural_latency_ns : 0, hIvasRend->inputsIsm[i].tdRendWrapper.binaural_latency_ns ); -#else - latency_ns = max( hIvasRend->inputsIsm[i].crendWrapper.binaural_latency_ns, - hIvasRend->inputsIsm[i].tdRendWrapper.binaural_latency_ns ); -#endif max_latency_ns = max( max_latency_ns, latency_ns ); } } @@ -3623,13 +3509,8 @@ ivas_error IVAS_REND_GetDelay( { if ( hIvasRend->inputsMc[i].base.inConfig != IVAS_REND_AUDIO_CONFIG_UNKNOWN ) { -#ifdef FIX_197_CREND_INTERFACE latency_ns = max( ( hIvasRend->inputsMc[i].crendWrapper != NULL ) ? hIvasRend->inputsMc[i].crendWrapper->binaural_latency_ns : 0, hIvasRend->inputsMc[i].tdRendWrapper.binaural_latency_ns ); -#else - latency_ns = max( hIvasRend->inputsMc[i].crendWrapper.binaural_latency_ns, - hIvasRend->inputsMc[i].tdRendWrapper.binaural_latency_ns ); -#endif max_latency_ns = max( max_latency_ns, latency_ns ); } } @@ -3638,11 +3519,7 @@ ivas_error IVAS_REND_GetDelay( { if ( hIvasRend->inputsSba[i].base.inConfig != IVAS_REND_AUDIO_CONFIG_UNKNOWN ) { -#ifdef FIX_197_CREND_INTERFACE latency_ns = ( hIvasRend->inputsSba[i].crendWrapper != NULL ) ? hIvasRend->inputsSba[i].crendWrapper->binaural_latency_ns : 0; -#else - latency_ns = hIvasRend->inputsSba[i].crendWrapper.binaural_latency_ns; -#endif max_latency_ns = max( max_latency_ns, latency_ns ); } } @@ -3678,10 +3555,7 @@ ivas_error IVAS_REND_FeedInputAudio( input_base *inputBase; int16_t numInputChannels; - /*-----------------------------------------------------------------* - * Validate function arguments - *-----------------------------------------------------------------*/ - + /* Validate function arguments */ if ( hIvasRend == NULL || inputAudio.data == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -3745,10 +3619,7 @@ ivas_error IVAS_REND_FeedInputObjectMetadata( input_ism *inputIsm; ivas_error error; - /*-----------------------------------------------------------------* - * Validate function arguments - *-----------------------------------------------------------------*/ - + /* Validate function arguments */ if ( hIvasRend == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -3789,10 +3660,7 @@ ivas_error IVAS_REND_FeedInputMasaMetadata( input_base *inputBase; input_masa *inputMasa; - /*-----------------------------------------------------------------* - * Validate function arguments - *-----------------------------------------------------------------*/ - + /* Validate function arguments */ if ( hIvasRend == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -3839,7 +3707,6 @@ ivas_error IVAS_REND_InitConfig( hIvasRend->rendererConfigEnabled = 0; } -#ifdef FIX_197_CREND_INTERFACE if ( rendererConfigEnabled ) { if ( ( error = ivas_render_config_open( &( hIvasRend->hRendererConfig ) ) ) != IVAS_ERR_OK ) @@ -3847,26 +3714,15 @@ ivas_error IVAS_REND_InitConfig( return error; } - if ( ivas_render_config_init_from_rom( &hIvasRend->hRendererConfig, hIvasRend->rendererConfigEnabled ) != IVAS_ERR_OK ) + if ( ( error = ivas_render_config_init_from_rom( &hIvasRend->hRendererConfig, hIvasRend->rendererConfigEnabled ) ) != IVAS_ERR_OK ) { - return IVAS_ERR_INTERNAL_FATAL; + return error; } } else { hIvasRend->hRendererConfig = NULL; } -#else - if ( ( error = ivas_render_config_open( &( hIvasRend->hRendererConfig ) ) ) != IVAS_ERR_OK ) - { - return error; - } - - if ( ivas_render_config_init_from_rom( &hIvasRend->hRendererConfig, hIvasRend->rendererConfigEnabled ) != IVAS_ERR_OK ) - { - return IVAS_ERR_INTERNAL_FATAL; - } -#endif return IVAS_ERR_OK; } @@ -3939,6 +3795,9 @@ int16_t IVAS_REND_FeedRenderConfig( } hRenderConfig = hIvasRend->hRendererConfig; +#ifdef TD5 + mvr2r( renderConfig.directivity, hRenderConfig->directivity, 3 ); +#endif #ifdef DEBUGGING hRenderConfig->renderer_type_override = RENDER_TYPE_OVERRIDE_NONE; if ( renderConfig.renderer_type_override == IVAS_RENDER_TYPE_OVERRIDE_FASTCONV ) @@ -3971,16 +3830,21 @@ int16_t IVAS_REND_FeedRenderConfig( *-------------------------------------------------------------------*/ ivas_error IVAS_REND_SetHeadRotation( - IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ +#ifdef TD5 + const IVAS_QUATERNION headRot[RENDERER_HEAD_POSITIONS_PER_FRAME], /* i : head orientations for next rendering call */ + const IVAS_POSITION Pos[RENDERER_HEAD_POSITIONS_PER_FRAME] /* i : listener positions for next rendering call */ +#else const IVAS_QUATERNION headRot[RENDERER_HEAD_POSITIONS_PER_FRAME] /* i : head positions for next rendering call */ +#endif ) { int16_t i; +#ifdef FIX_I109_ORIENTATION_TRACKING + IVAS_QUATERNION rotQuat; +#endif - /*-----------------------------------------------------------------* - * Validate function arguments - *-----------------------------------------------------------------*/ - + /* Validate function arguments */ if ( hIvasRend == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -3989,7 +3853,7 @@ ivas_error IVAS_REND_SetHeadRotation( if ( getAudioConfigType( hIvasRend->outputConfig ) != IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) { /* Head rotation can be set only with binaural output */ - return IVAS_ERR_METADATA_NOT_EXPECTED; + return IVAS_ERR_INVALID_OUTPUT_FORMAT; } if ( headRot == NULL ) @@ -4001,7 +3865,24 @@ ivas_error IVAS_REND_SetHeadRotation( hIvasRend->headRotData.headRotEnabled = 1; for ( i = 0; i < RENDERER_HEAD_POSITIONS_PER_FRAME; ++i ) { +#ifdef FIX_I109_ORIENTATION_TRACKING + /* check for Euler angle signaling */ + if ( headRot[i].w == -3.0f ) + { + Euler2Quat( deg2rad( headRot[i].x ), deg2rad( headRot[i].y ), deg2rad( headRot[i].z ), &rotQuat ); + } + else + { + rotQuat = headRot[i]; + } + + ivas_orient_trk_Process( hIvasRend->headRotData.hOrientationTracker, rotQuat, FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES, &hIvasRend->headRotData.headPositions[i] ); +#else hIvasRend->headRotData.headPositions[i] = headRot[i]; +#endif +#ifdef TD5 + hIvasRend->headRotData.Pos[i] = Pos[i]; +#endif } } @@ -4009,6 +3890,164 @@ ivas_error IVAS_REND_SetHeadRotation( } +#ifdef FIX_I109_ORIENTATION_TRACKING +/*-------------------------------------------------------------------* + * IVAS_REND_SetOrientationTrackingMode() + * + * + *-------------------------------------------------------------------*/ + +ivas_error IVAS_REND_SetOrientationTrackingMode( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const uint8_t otrMode /* i : Orientation tracking mode */ +) +{ + OTR_TRACKING_T mode; + ivas_error error; + + if ( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + switch ( otrMode ) + { + case IVAS_ORIENT_TRK_AVG: + mode = OTR_TRACKING_AVG_ORIENT; + break; + case IVAS_ORIENT_TRK_REF: + mode = OTR_TRACKING_REF_ORIENT; + break; +#ifdef OTR_REFERENCE_VECTOR_TRACKING + case IVAS_ORIENT_TRK_REF_VEC: + mode = OTR_TRACKING_REF_VEC; + break; + case IVAS_ORIENT_TRK_REF_VEC_LEV: + mode = OTR_TRACKING_REF_VEC_LEV; + break; +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ + case IVAS_ORIENT_TRK_NONE: + default: + mode = OTR_TRACKING_NONE; + break; + } + + if ( ( error = ivas_orient_trk_SetTrackingType( hIvasRend->headRotData.hOrientationTracker, mode ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * IVAS_REND_SetReferenceRotation() + * + * + *-------------------------------------------------------------------*/ + +ivas_error IVAS_REND_SetReferenceRotation( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_QUATERNION refRot /* i : Reference rotation */ +) +{ + ivas_error error; + + /* Validate function arguments */ + if ( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( ( error = ivas_orient_trk_SetReferenceRotation( hIvasRend->headRotData.hOrientationTracker, refRot ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * IVAS_REND_GetMainOrientation() + * + * + *-------------------------------------------------------------------*/ + +ivas_error IVAS_REND_GetMainOrientation( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_QUATERNION *pOrientation /* i/o: Quaternion pointer for main orientation */ +) +{ + ivas_error error; + + if ( hIvasRend == NULL || pOrientation == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( ( error = ivas_orient_trk_GetMainOrientation( hIvasRend->headRotData.hOrientationTracker, pOrientation ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * IVAS_REND_GetTrackedRotation() + * + * + *-------------------------------------------------------------------*/ + +ivas_error IVAS_REND_GetTrackedRotation( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_QUATERNION *pRotation /* i/o: Quaternion pointer processed rotation */ +) +{ + ivas_error error; + + if ( hIvasRend == NULL || pRotation == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( ( error = ivas_orient_trk_GetTrackedRotation( hIvasRend->headRotData.hOrientationTracker, pRotation ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} + + +#ifdef OTR_REFERENCE_VECTOR_TRACKING +/*---------------------------------------------------------------------* + * IVAS_REND_SetReferenceVector( ) + * + * Sets a reference vector spanning from listenerPos to refPos. Only + * available in OTR_TRACKING_REF_VEC and OTR_TRACKING_REF_VEC_LEV modes. + *---------------------------------------------------------------------*/ + +ivas_error IVAS_REND_SetReferenceVector( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_VECTOR3 listenerPos, /* i : Listener position */ + const IVAS_VECTOR3 refPos /* i : Reference position */ +) +{ + if ( hIvasRend == NULL || hIvasRend->headRotData.hOrientationTracker == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + return ivas_orient_trk_SetReferenceVector( hIvasRend->headRotData.hOrientationTracker, listenerPos, refPos ); +} +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ +#endif + + /*-------------------------------------------------------------------* * Local functions *-------------------------------------------------------------------*/ @@ -4145,7 +4184,7 @@ static ivas_error rotateFrameMc( /* initialize gains to passthrough */ for ( ch_in = 0; ch_in < nchan; ch_in++ ) { - set_zero( gains[ch_in], (int16_t) nchan ); + set_zero( gains[ch_in], nchan ); gains[ch_in][ch_in] = 1.f; } @@ -4284,7 +4323,18 @@ static ivas_error rotateFrameSba( ( 1 - headRotData->crossfade[i] ) * gains_prev[n][m] * ( *readPtr ); } } +#ifdef FIX_376_SBA_ROTATE + /* write back the result */ + for ( n = m1; n < m2; n++ ) + { + writePtr = getSmplPtr( outAudio, n, subframe_idx * subframe_len + i ); + ( *writePtr ) = tmpRot[n - m1]; + } + m1 = m2; + m2 += 2 * ( l + 1 ) + 1; +#endif } +#ifndef FIX_376_SBA_ROTATE /* write back the result */ for ( n = m1; n < m2; n++ ) { @@ -4293,6 +4343,7 @@ static ivas_error rotateFrameSba( } m1 = m2; m2 += 2 * ( l + 1 ) + 1; +#endif } /*unoptimized code for reference (full matrix multiplication)*/ @@ -4339,9 +4390,7 @@ static ivas_error renderIsmToBinaural( NULL, ismInput->base.ctx.pHeadRotData, &ismInput->currentPos, -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND - ismInput->reverb, -#endif + ismInput->hReverb, outAudio.config.numSamplesPerChannel, tmpTDRendBuffer ) ) != IVAS_ERR_OK ) { @@ -4364,11 +4413,7 @@ static ivas_error renderIsmToBinauralRoom( int16_t subframe_idx, subframe_len; int16_t tmp; rotation_matrix Rmat; -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND float tmpRendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; -#else - float tmpCrendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; -#endif IVAS_QUATERNION quat; ivas_error error; pan_vector currentPanGains; @@ -4382,8 +4427,7 @@ static ivas_error renderIsmToBinauralRoom( headRotData = ismInput->base.ctx.pHeadRotData; rotatedPos = defaultObjectPosition(); -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND - if ( ismInput->reverb != NULL && ismInput->reverb->pConfig.roomAcoustics.use_brir == 0 && ismInput->reverb->pConfig.roomAcoustics.late_reverb_on == 1 && headRotData->headRotEnabled ) + if ( ismInput->hReverb != NULL && ismInput->hReverb->pConfig.roomAcoustics.use_brir == 0 && ismInput->hReverb->pConfig.roomAcoustics.late_reverb_on == 1 && headRotData->headRotEnabled ) { copyBufferTo2dArray( ismInput->base.inputBuffer, tmpRendBuffer ); @@ -4393,21 +4437,16 @@ static ivas_error renderIsmToBinauralRoom( NULL, ismInput->base.ctx.pHeadRotData, &ismInput->currentPos, -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND - ismInput->reverb, -#endif + ismInput->hReverb, outAudio.config.numSamplesPerChannel, tmpRendBuffer ) ) != IVAS_ERR_OK ) { return error; } -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND accumulate2dArrayToBuffer( tmpRendBuffer, &outAudio ); -#endif } else { -#endif if ( headRotData->headRotEnabled ) { @@ -4479,43 +4518,18 @@ static ivas_error renderIsmToBinauralRoom( renderBufferChannelLerp( ismInput->base.inputBuffer, 0, currentPanGains, previousPanGains, tmpMcBuffer ); -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND copyBufferTo2dArray( tmpMcBuffer, tmpRendBuffer ); -#else - copyBufferTo2dArray( tmpMcBuffer, tmpCrendBuffer ); -#endif - - if ( ( error = ivas_rend_crendProcess( -#ifdef FIX_197_CREND_INTERFACE - ismInput->crendWrapper, -#else - &ismInput->crendWrapper, -#endif - AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, -#ifdef FIX_197_CREND_INTERFACE - NULL, NULL, NULL, NULL, -#endif -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND - tmpRendBuffer, -#else - tmpCrendBuffer, -#endif - *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, + NULL, NULL, NULL, NULL, tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) { return error; } -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND accumulate2dArrayToBuffer( tmpRendBuffer, &outAudio ); -#else - accumulate2dArrayToBuffer( tmpCrendBuffer, &outAudio ); -#endif free( tmpMcBuffer.data ); -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND } -#endif pop_wmops(); return IVAS_ERR_OK; @@ -4594,6 +4608,7 @@ static ivas_error renderIsmToSba( { return error; } + if ( ( error = getAmbisonicsOrder( outConfig, &ambiOrderOut ) ) != IVAS_ERR_OK ) { return error; @@ -4648,7 +4663,6 @@ static ivas_error renderInputIsm( /* Apply input gain to new audio */ v_multc( inAudio.data, ismInput->base.gain, inAudio.data, inAudio.config.numSamplesPerChannel * inAudio.config.numChannels ); - switch ( getAudioConfigType( outConfig ) ) { case IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED: @@ -4772,21 +4786,12 @@ static ivas_error renderMcToBinaural( headRotEnabled = mcInput->base.ctx.pHeadRotData->headRotEnabled; inConfig = mcInput->base.inConfig; - if ( ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) || - ( headRotEnabled && ( inConfig == IVAS_REND_AUDIO_CONFIG_5_1 || inConfig == IVAS_REND_AUDIO_CONFIG_7_1 ) ) ) + if ( ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) || ( headRotEnabled && ( inConfig == IVAS_REND_AUDIO_CONFIG_5_1 || inConfig == IVAS_REND_AUDIO_CONFIG_7_1 ) ) ) { copyBufferTo2dArray( mcInput->base.inputBuffer, tmpRendBuffer ); - if ( ( error = ivas_td_binaural_renderer_ext( &mcInput->tdRendWrapper, - mcInput->base.inConfig, - &mcInput->customLsInput, - mcInput->base.ctx.pHeadRotData, - NULL, -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND - mcInput->reverb, -#endif - mcInput->base.inputBuffer.config.numSamplesPerChannel, - tmpRendBuffer ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_td_binaural_renderer_ext( &mcInput->tdRendWrapper, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, NULL, + mcInput->hReverb, mcInput->base.inputBuffer.config.numSamplesPerChannel, tmpRendBuffer ) ) != IVAS_ERR_OK ) { return error; } @@ -4800,13 +4805,8 @@ static ivas_error renderMcToBinaural( tmpRotBuffer.data = malloc( tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels * sizeof( float ) ); set_zero( tmpRotBuffer.data, tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels ); - if ( ( error = rotateFrameMc( mcInput->base.inputBuffer, - mcInput->base.inConfig, - mcInput->customLsInput, - mcInput->base.ctx.pHeadRotData, - mcInput->rot_gains_prev, - mcInput->efapInWrapper.hEfap, - tmpRotBuffer ) ) != IVAS_ERR_OK ) + if ( ( error = rotateFrameMc( mcInput->base.inputBuffer, mcInput->base.inConfig, mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, + mcInput->rot_gains_prev, mcInput->efapInWrapper.hEfap, tmpRotBuffer ) ) != IVAS_ERR_OK ) { return error; } @@ -4820,16 +4820,8 @@ static ivas_error renderMcToBinaural( } /* call CREND */ - if ( ( error = ivas_rend_crendProcess( -#ifdef FIX_197_CREND_INTERFACE - mcInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( mcInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), - NULL, NULL, NULL, NULL, -#else - &mcInput->crendWrapper, - rendAudioConfigToIvasAudioConfig( mcInput->base.inConfig ), - rendAudioConfigToIvasAudioConfig( outConfig ), -#endif - tmpRendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( mcInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), + NULL, NULL, NULL, NULL, tmpRendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) { return error; } @@ -4853,105 +4845,59 @@ static ivas_error renderMcToBinauralRoom( const IVAS_REND_AudioConfig outConfig, IVAS_REND_AudioBuffer outAudio ) { -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND int8_t headRotEnabled; float tmpRendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; IVAS_REND_AudioConfig inConfig; -#else - float tmpCrendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; -#endif ivas_error error; IVAS_REND_AudioBuffer tmpRotBuffer; push_wmops( "renderMcToBinauralRoom" ); -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND headRotEnabled = mcInput->base.ctx.pHeadRotData->headRotEnabled; inConfig = mcInput->base.inConfig; - if ( ( mcInput->reverb != NULL && mcInput->reverb->pConfig.roomAcoustics.use_brir == 0 && mcInput->reverb->pConfig.roomAcoustics.late_reverb_on == 1 ) && ( ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) || ( headRotEnabled && ( inConfig == IVAS_REND_AUDIO_CONFIG_5_1 || inConfig == IVAS_REND_AUDIO_CONFIG_7_1 ) ) ) ) + if ( ( mcInput->hReverb != NULL && mcInput->hReverb->pConfig.roomAcoustics.use_brir == 0 && mcInput->hReverb->pConfig.roomAcoustics.late_reverb_on == 1 ) && ( ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) || ( headRotEnabled && ( inConfig == IVAS_REND_AUDIO_CONFIG_5_1 || inConfig == IVAS_REND_AUDIO_CONFIG_7_1 ) ) ) ) { copyBufferTo2dArray( mcInput->base.inputBuffer, tmpRendBuffer ); - if ( ( error = ivas_td_binaural_renderer_ext( &mcInput->tdRendWrapper, - mcInput->base.inConfig, - &mcInput->customLsInput, - mcInput->base.ctx.pHeadRotData, - NULL, - mcInput->reverb, - mcInput->base.inputBuffer.config.numSamplesPerChannel, - tmpRendBuffer ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_td_binaural_renderer_ext( &mcInput->tdRendWrapper, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, + NULL, mcInput->hReverb, mcInput->base.inputBuffer.config.numSamplesPerChannel, tmpRendBuffer ) ) != IVAS_ERR_OK ) { return error; } } else { - /* apply rotation */ if ( headRotEnabled ) -#else - /* apply rotation */ - if ( mcInput->base.ctx.pHeadRotData->headRotEnabled ) -#endif { tmpRotBuffer = mcInput->base.inputBuffer; tmpRotBuffer.data = malloc( tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels * sizeof( float ) ); set_zero( tmpRotBuffer.data, tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels ); - if ( ( error = rotateFrameMc( mcInput->base.inputBuffer, - mcInput->base.inConfig, - mcInput->customLsInput, - mcInput->base.ctx.pHeadRotData, - mcInput->rot_gains_prev, - mcInput->efapInWrapper.hEfap, - tmpRotBuffer ) ) != IVAS_ERR_OK ) + if ( ( error = rotateFrameMc( mcInput->base.inputBuffer, mcInput->base.inConfig, mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, + mcInput->rot_gains_prev, mcInput->efapInWrapper.hEfap, tmpRotBuffer ) ) != IVAS_ERR_OK ) { return error; } -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND copyBufferTo2dArray( tmpRotBuffer, tmpRendBuffer ); -#else - copyBufferTo2dArray( tmpRotBuffer, tmpCrendBuffer ); -#endif free( tmpRotBuffer.data ); } else { -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND copyBufferTo2dArray( mcInput->base.inputBuffer, tmpRendBuffer ); -#else - copyBufferTo2dArray( mcInput->base.inputBuffer, tmpCrendBuffer ); -#endif } /* call CREND */ - if ( ( error = ivas_rend_crendProcess( -#ifdef FIX_197_CREND_INTERFACE - mcInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( mcInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), - NULL, NULL, NULL, NULL, -#else - &mcInput->crendWrapper, - rendAudioConfigToIvasAudioConfig( mcInput->base.inConfig ), - rendAudioConfigToIvasAudioConfig( outConfig ), -#endif -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND - tmpRendBuffer, -#else - tmpCrendBuffer, -#endif - *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( mcInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), + NULL, NULL, NULL, NULL, tmpRendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) { return error; } -#ifdef FIX_330_ENABLE_TD_RENDERER_REVERB_REND } - accumulate2dArrayToBuffer( tmpRendBuffer, &outAudio ); -#else - accumulate2dArrayToBuffer( tmpCrendBuffer, &outAudio ); -#endif + accumulate2dArrayToBuffer( tmpRendBuffer, &outAudio ); /* TODO tmu : needs delay compensation */ if ( ( error = renderLfeToBinaural( mcInput, outAudio ) ) != IVAS_ERR_OK ) @@ -5005,7 +4951,7 @@ static ivas_error renderMcCustomLsToBinauralRoom( return error; } - tmpMcBuffer.config.numChannels = (int16_t) tmp; + tmpMcBuffer.config.numChannels = tmp; tmpMcBuffer.data = malloc( tmpMcBuffer.config.numSamplesPerChannel * tmpMcBuffer.config.numChannels * sizeof( float ) ); set_zero( tmpMcBuffer.data, tmpMcBuffer.config.numSamplesPerChannel * tmpMcBuffer.config.numChannels ); @@ -5017,15 +4963,8 @@ static ivas_error renderMcCustomLsToBinauralRoom( copyBufferTo2dArray( tmpMcBuffer, tmpCrendBuffer ); /* call CREND */ - if ( ( error = ivas_rend_crendProcess( -#ifdef FIX_197_CREND_INTERFACE - mcInput->crendWrapper, AUDIO_CONFIG_7_1_4, getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, NULL, NULL, NULL, -#else - &mcInput->crendWrapper, - AUDIO_CONFIG_7_1_4, - rendAudioConfigToIvasAudioConfig( outConfig ), -#endif - tmpCrendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, AUDIO_CONFIG_7_1_4, getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, NULL, NULL, NULL, + tmpCrendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) { return error; } @@ -5253,15 +5192,8 @@ static ivas_error renderSbaToBinaural( } /* call CREND */ - if ( ( error = ivas_rend_crendProcess( -#ifdef FIX_197_CREND_INTERFACE - sbaInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( sbaInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, NULL, NULL, NULL, -#else - &sbaInput->crendWrapper, - rendAudioConfigToIvasAudioConfig( sbaInput->base.inConfig ), - rendAudioConfigToIvasAudioConfig( outConfig ), -#endif - tmpCrendBuffer, *sbaInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_rend_crendProcess( sbaInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( sbaInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), + NULL, NULL, NULL, NULL, tmpCrendBuffer, *sbaInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) { return error; } @@ -5316,7 +5248,7 @@ static ivas_error renderSbaToBinauralRoom( return error; } - tmpMcBuffer.config.numChannels = (int16_t) tmp; + tmpMcBuffer.config.numChannels = tmp; tmpMcBuffer.data = malloc( tmpMcBuffer.config.numSamplesPerChannel * tmpMcBuffer.config.numChannels * sizeof( float ) ); set_zero( tmpMcBuffer.data, tmpMcBuffer.config.numChannels * tmpMcBuffer.config.numSamplesPerChannel ); @@ -5329,16 +5261,8 @@ static ivas_error renderSbaToBinauralRoom( copyBufferTo2dArray( tmpMcBuffer, tmpCrendBuffer ); /* call CREND */ - if ( ( error = ivas_rend_crendProcess( -#ifdef FIX_197_CREND_INTERFACE - sbaInput->crendWrapper, AUDIO_CONFIG_7_1_4, getIvasAudioConfigFromRendAudioConfig( outConfig ), - NULL, NULL, NULL, NULL, -#else - &sbaInput->crendWrapper, - AUDIO_CONFIG_7_1_4, - rendAudioConfigToIvasAudioConfig( outConfig ), -#endif - tmpCrendBuffer, *sbaInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_rend_crendProcess( sbaInput->crendWrapper, AUDIO_CONFIG_7_1_4, getIvasAudioConfigFromRendAudioConfig( outConfig ), + NULL, NULL, NULL, NULL, tmpCrendBuffer, *sbaInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) { return error; } @@ -5586,7 +5510,7 @@ static ivas_error renderActiveInputsMasa( IVAS_REND_HANDLE hIvasRend, IVAS_REND_AudioBuffer outAudio ) { - int32_t i; + int16_t i; input_masa *pCurrentInput; ivas_error error; @@ -5622,10 +5546,7 @@ ivas_error IVAS_REND_GetSamples( ivas_error error; int16_t numOutChannels; - /*-----------------------------------------------------------------* - * Validate function arguments - *-----------------------------------------------------------------*/ - + /* Validate function arguments */ if ( hIvasRend == NULL || outAudio.data == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -5703,10 +5624,7 @@ void IVAS_REND_Close( uint16_t i; IVAS_REND_HANDLE hIvasRend; - /*-----------------------------------------------------------------* - * Validate function arguments - *-----------------------------------------------------------------*/ - + /* Validate function arguments */ if ( phIvasRend == NULL || *phIvasRend == NULL ) { return; @@ -5741,6 +5659,10 @@ void IVAS_REND_Close( ivas_limiter_close( &hIvasRend->hLimiter ); +#ifdef FIX_I109_ORIENTATION_TRACKING + closeHeadRotation( hIvasRend ); +#endif + free( hIvasRend ); *phIvasRend = NULL; diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index 6db5fd91dc..b313bea5c1 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -244,8 +244,43 @@ int16_t IVAS_REND_FeedRenderConfig( ivas_error IVAS_REND_SetHeadRotation( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ +#ifdef TD5 + const IVAS_QUATERNION headRot[RENDERER_HEAD_POSITIONS_PER_FRAME], /* i : head orientations for next rendering call */ + const IVAS_POSITION Pos[RENDERER_HEAD_POSITIONS_PER_FRAME] /* i : listener positions for next rendering call */ +#else const IVAS_QUATERNION headRot[RENDERER_HEAD_POSITIONS_PER_FRAME] /* i : head positions for next rendering call */ +#endif +); + +#ifdef FIX_I109_ORIENTATION_TRACKING +ivas_error IVAS_REND_SetOrientationTrackingMode( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const uint8_t otrMode /* i : Orientation tracking mode */ +); + +ivas_error IVAS_REND_SetReferenceRotation( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_QUATERNION refRot /* i : Reference rotation */ +); + +ivas_error IVAS_REND_GetMainOrientation( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_QUATERNION *pOrientation /* i/o: Quaternion pointer for main orientation */ +); + +ivas_error IVAS_REND_GetTrackedRotation( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_QUATERNION *pRotation /* i/o: Quaternion pointer for processed rotation */ +); + +#ifdef OTR_REFERENCE_VECTOR_TRACKING +ivas_error IVAS_REND_SetReferenceVector( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_VECTOR3 listenerPos, /* i : Listener position */ + const IVAS_VECTOR3 refPos /* i : Reference position */ ); +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ +#endif /* FIX_I109_ORIENTATION_TRACKING */ ivas_error IVAS_REND_GetSamples( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ diff --git a/lib_util/audio_file_reader.c b/lib_util/audio_file_reader.c index c7feefd7b7..4f6bd0c34d 100644 --- a/lib_util/audio_file_reader.c +++ b/lib_util/audio_file_reader.c @@ -40,9 +40,7 @@ struct AudioFileReader { FILE *rawFile; WAVEFILEIN *wavFile; -#ifdef FIX_94_VERIFY_WAV_NUM_CHANNELS uint32_t samplingRate; -#endif int16_t numChannels; }; @@ -57,26 +55,12 @@ static int8_t AudioFileReader_open_raw( static int8_t AudioFileReader_open_wav( AudioFileReader *self, - const char *fileName -#ifndef FIX_94_VERIFY_WAV_NUM_CHANNELS - , - int32_t *sampleRate -#endif -) + const char *fileName ) { -#ifdef FIX_94_VERIFY_WAV_NUM_CHANNELS uint32_t samplesInFile; -#else - uint32_t sampleRate_, samplesInFile; -#endif int16_t bps; -#ifdef FIX_94_VERIFY_WAV_NUM_CHANNELS self->wavFile = OpenWav( fileName, &self->samplingRate, &self->numChannels, &samplesInFile, &bps ); -#else - self->wavFile = OpenWav( fileName, &sampleRate_, &self->numChannels, &samplesInFile, &bps ); - *sampleRate = sampleRate_; -#endif if ( !self->wavFile ) { @@ -92,10 +76,6 @@ static int8_t AudioFileReader_open_wav( ivas_error AudioFileReader_open( AudioFileReader **audioReader, /* o : AudioFileReader handle */ const char *fileName /* i : path to wav/raw pcm file */ -#ifndef FIX_94_VERIFY_WAV_NUM_CHANNELS - , - int32_t *sampleRate /* o : sample rate of wav file, unused with pcm */ -#endif ) { AudioFileReader *self; @@ -118,19 +98,12 @@ ivas_error AudioFileReader_open( return IVAS_ERR_FAILED_FILE_OPEN; } self = calloc( sizeof( AudioFileReader ), 1 ); -#ifdef FIX_94_VERIFY_WAV_NUM_CHANNELS self->samplingRate = 0; -#endif self->numChannels = 0; if ( fileNameLen > wavSuffixLen && strncmp( fileName + fileNameLen - wavSuffixLen, wavSuffix, wavSuffixLen ) == 0 ) { - retCode = AudioFileReader_open_wav( self, fileName -#ifndef FIX_94_VERIFY_WAV_NUM_CHANNELS - , - sampleRate -#endif - ); + retCode = AudioFileReader_open_wav( self, fileName ); } else { @@ -206,7 +179,6 @@ ivas_error AudioFileReader_read( return error; } -#ifdef FIX_94_VERIFY_WAV_NUM_CHANNELS ivas_error AudioFileReader_getSamplingRate( AudioFileReader *self, int32_t *samplingRate ) @@ -257,17 +229,3 @@ ivas_error AudioFileReader_getNumChannels( return IVAS_ERR_OK; } -#else -/*! r: number of channels of the opened file */ -int16_t AudioFileReader_getNumChannels( - AudioFileReader *self /* i/o: AudioFileReader handle */ -) -{ - if ( self != NULL ) - { - return self->numChannels; - } - - return 0; -} -#endif diff --git a/lib_util/audio_file_reader.h b/lib_util/audio_file_reader.h index a944c85dc1..0fd4da5ac7 100644 --- a/lib_util/audio_file_reader.h +++ b/lib_util/audio_file_reader.h @@ -43,9 +43,6 @@ typedef struct AudioFileReader AudioFileReader; ivas_error AudioFileReader_open( AudioFileReader **audioReader, /* o : AudioFileReader handle */ const char *fileName /* i : path to wav/raw pcm file */ -#ifndef FIX_94_VERIFY_WAV_NUM_CHANNELS - ,int32_t *sampleRate /* o : sample rate of wav file, unused with pcm */ -#endif ); ivas_error AudioFileReader_read( @@ -55,7 +52,6 @@ ivas_error AudioFileReader_read( int16_t *numSamplesRead /* i : number of samples actualy read */ ); -#ifdef FIX_94_VERIFY_WAV_NUM_CHANNELS /*! r: ivas error - in particular, IVAS_ERR_SAMPLING_RATE_UNKNOWN if the opened file has no sampling rate metadata */ ivas_error AudioFileReader_getSamplingRate( AudioFileReader *self, /* i/o: AudioFileReader handle */ @@ -67,12 +63,6 @@ ivas_error AudioFileReader_getNumChannels( AudioFileReader *self, /* i/o: AudioFileReader handle */ int16_t * numChannels /* o : number fo channels in opened audio file */ ); -#else -/*! r: number of channels of the opened file */ -int16_t AudioFileReader_getNumChannels( - AudioFileReader *self /* i/o: AudioFileReader handle */ -); -#endif void AudioFileReader_close( AudioFileReader **selfPtr /* i/o: pointer to AudioFileReader handle */ diff --git a/lib_util/audio_file_writer.c b/lib_util/audio_file_writer.c index d6cbb1810e..b27a8ceca6 100644 --- a/lib_util/audio_file_writer.c +++ b/lib_util/audio_file_writer.c @@ -98,7 +98,11 @@ ivas_error AudioFileWriter_open( int8_t retCode; +#ifdef FIX_I109_ORIENTATION_TRACKING + if ( ( fileNameLen > wavSuffixLen ) && ( strncmp( fileName + fileNameLen - wavSuffixLen, wavSuffix, wavSuffixLen ) == 0 ) ) +#else if ( fileNameLen > wavSuffixLen && strncmp( fileName + fileNameLen - wavSuffixLen, wavSuffix, wavSuffixLen ) == 0 ) +#endif { retCode = AudioFileWriter_open_wav( self, fileName, sampleRate, numChannels ); } diff --git a/lib_util/head_rotation_file_reader.c b/lib_util/head_rotation_file_reader.c index 533c14a651..500fdd2b7a 100644 --- a/lib_util/head_rotation_file_reader.c +++ b/lib_util/head_rotation_file_reader.c @@ -91,39 +91,125 @@ ivas_error HeadRotationFileReader_open( * Read values from the trajectory file *-----------------------------------------------------------------------*/ +#ifdef FIX_I109_ORIENTATION_TRACKING ivas_error HeadRotationFileReading( HeadRotFileReader *headRotReader, /* i/o: HeadRotFileReader handle */ - IVAS_QUATERNION *Quaternions, /* o : head-tracking data */ - const int32_t frame_dec /* i : decoded frame number */ +#ifdef TD5 + IVAS_QUATERNION *pQuaternion, /* o : head-tracking data */ + IVAS_POSITION *pPos /* o : listener position */ +#else + IVAS_QUATERNION *pQuaternion /* o : head-tracking data */ +#endif +) +{ + float w, x, y, z; +#ifdef TD5 + float posx, posy, posz; + int32_t read_values; + + posx = 0.0f; + posy = 0.0f; + posz = 0.0f; +#endif + +#ifdef TD5 + read_values = fscanf( headRotReader->trajFile, "%f,%f,%f,%f,%f,%f,%f", &w, &x, &y, &z, &posx, &posy, &posz ); + if ( ( read_values != 4 ) && ( read_values != 7 ) ) /* Allow either orientation (4) or orientation+position (4+3) */ +#else + if ( 4 != fscanf( headRotReader->trajFile, "%f,%f,%f,%f", &w, &x, &y, &z ) ) +#endif + { + if ( feof( headRotReader->trajFile ) ) + { + rewind( headRotReader->trajFile ); + headRotReader->fileRewind = true; +#ifdef TD5 + return HeadRotationFileReading( headRotReader, pQuaternion, pPos ); +#else + return HeadRotationFileReading( headRotReader, pQuaternion ); +#endif + } + return IVAS_ERR_FAILED_FILE_PARSE; + } + + ( headRotReader->frameCounter )++; + + pQuaternion->w = w; + pQuaternion->x = x; + pQuaternion->y = y; + pQuaternion->z = z; +#ifdef TD5 + if ( pPos != NULL ) + { + pPos->x = posx; + pPos->y = posy; + pPos->z = posz; + } +#endif + + return IVAS_ERR_OK; +} + +#else +ivas_error HeadRotationFileReading( + HeadRotFileReader *headRotReader, /* i/o: HeadRotFileReader handle */ + IVAS_QUATERNION *Quaternions, /* o : head-tracking data, listener orientation */ +#ifdef TD5 + IVAS_POSITION *Pos /* o : listener position */ +#else + const int32_t frame_dec /* i : decoded frame number */ +#endif ) { uint16_t i; float w, x, y, z; +#ifdef TD5 + float posx, posy, posz; + int32_t read_values; + + posx = 0.0f; + posy = 0.0f; + posz = 0.0f; +#endif for ( i = 0; i < IVAS_MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) { +#ifdef TD5 + read_values = fscanf( headRotReader->trajFile, "%f,%f,%f,%f,%f,%f,%f", &w, &x, &y, &z, &posx, &posy, &posz ); + if ( ( read_values != 4 ) && ( read_values != 7 ) ) /* Allow either orientation (4) or orientation+position (4+3) */ +#else if ( 4 != fscanf( headRotReader->trajFile, "%f,%f,%f,%f", &w, &x, &y, &z ) ) +#endif { if ( feof( headRotReader->trajFile ) ) { rewind( headRotReader->trajFile ); headRotReader->fileRewind = true; +#ifdef TD5 + return HeadRotationFileReading( headRotReader, Quaternions, Pos ); +#else return HeadRotationFileReading( headRotReader, Quaternions, frame_dec ); +#endif } return IVAS_ERR_FAILED_FILE_PARSE; } - ( headRotReader->frameCounter )++; Quaternions[i].w = w; Quaternions[i].x = x; Quaternions[i].y = y; Quaternions[i].z = z; +#ifdef TD5 + Pos[i].x = posx; + Pos[i].y = posy; + Pos[i].z = posz; +#endif } return IVAS_ERR_OK; } +#endif /*-----------------------------------------------------------------------* diff --git a/lib_util/head_rotation_file_reader.h b/lib_util/head_rotation_file_reader.h index e70281401a..d735423e2c 100644 --- a/lib_util/head_rotation_file_reader.h +++ b/lib_util/head_rotation_file_reader.h @@ -57,11 +57,27 @@ ivas_error HeadRotationFileReader_open( * Read values from the trajectory file *-----------------------------------------------------------------------*/ +#ifdef FIX_I109_ORIENTATION_TRACKING +ivas_error HeadRotationFileReading( + HeadRotFileReader *headRotReader, /* i/o: HeadRotFileReader handle */ +#ifdef TD5 + IVAS_QUATERNION *pQuaternion, /* o : head-tracking data */ + IVAS_POSITION *pPos /* o : listener position */ +#else + IVAS_QUATERNION *pQuaternion /* o : head-tracking data */ +#endif +); +#else ivas_error HeadRotationFileReading( HeadRotFileReader *headRotReader, /* i/o: HeadRotFileReader handle */ IVAS_QUATERNION *Quaternions, /* o : head-tracking data */ - const int32_t frame_dec /* i : decoded frame number */ +#ifdef TD5 + IVAS_POSITION *Pos /* o : listener position */ +#else + const int32_t frame_dec /* i : decoded frame number */ +#endif ); +#endif /*-----------------------------------------------------------------------* * HeadRotationFileReader_close() diff --git a/lib_util/ism_file_reader.c b/lib_util/ism_file_reader.c index 77912f5c58..d60a7c1984 100644 --- a/lib_util/ism_file_reader.c +++ b/lib_util/ism_file_reader.c @@ -36,8 +36,13 @@ #include -#define META_LINE_LENGTH 200 /* max number of characters at one line of metadata input/output file */ -#define NUM_ISM_METADATA_PER_LINE 5 /* Number of ISM metadata per line in a metadata file */ +#define META_LINE_LENGTH 200 /* max number of characters at one line of metadata input/output file */ +#ifdef TD5 +#define NUM_ISM_METADATA_PER_LINE 7 /* Number of ISM metadata per line in a metadata file */ +#define NUM_MIN_ISM_METADATA 2 /* Minimum number of metadata parameters (azimuth and elevation) */ +#else +#define NUM_ISM_METADATA_PER_LINE 5 /* Number of ISM metadata per line in a metadata file */ +#endif struct IsmFileReader @@ -54,7 +59,7 @@ struct IsmFileReader *---------------------------------------------------------------------*/ IsmFileReader *IsmFileReader_open( - const char *filePath /* i : path to ism metadata file */ + const char *filePath /* i : path to ISM metadata file */ ) { IsmFileReader *self; @@ -90,15 +95,26 @@ IsmFileReader *IsmFileReader_open( /*! r: error code */ ivas_error IsmFileReader_readNextFrame( IsmFileReader *self, /* i/o: IsmFileReader handle */ - IVAS_ISM_METADATA *ismMetadata /* o ISM : metadata read from the opened file */ + IVAS_ISM_METADATA *ismMetadata /* o : ISM metadata read from the opened file */ ) { char char_buff[META_LINE_LENGTH]; float meta_prm[NUM_ISM_METADATA_PER_LINE]; +#ifdef TD5 + const float meta_prm_default[NUM_ISM_METADATA_PER_LINE] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f }; +#endif char *char_ptr; int16_t i; FILE *file; +#ifdef TD5 + /* Set default metadata parameters */ + for ( i = 0; i < NUM_ISM_METADATA_PER_LINE; i++ ) + { + meta_prm[i] = meta_prm_default[i]; + } +#endif + if ( ismMetadata == NULL || self->file == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -127,24 +143,34 @@ ivas_error IsmFileReader_readNextFrame( meta_prm[i++] = (float) atof( char_ptr ); } - +#ifdef TD5 + /* Check if minimum number of metadata values were read. Additional values are ignored. */ + if ( i < NUM_MIN_ISM_METADATA ) +#else if ( i != NUM_ISM_METADATA_PER_LINE ) +#endif { /* Not enough values provided in one line */ return IVAS_ERR_ISM_FILE_READER_INVALID_METADATA_FORMAT; } +#ifndef TD5 if ( char_ptr != NULL ) { /* Too many values provided in one line */ return IVAS_ERR_ISM_FILE_READER_INVALID_METADATA_FORMAT; } +#endif ismMetadata->azimuth = meta_prm[0]; ismMetadata->elevation = meta_prm[1]; ismMetadata->radius = meta_prm[2]; ismMetadata->spread = meta_prm[3]; ismMetadata->gainFactor = meta_prm[4]; +#ifdef TD5 + ismMetadata->yaw = meta_prm[5]; + ismMetadata->pitch = meta_prm[6]; +#endif /* verify whether the read metadata values are in an expected range */ if ( ismMetadata->azimuth > 180 || ismMetadata->azimuth < -180 ) @@ -171,6 +197,17 @@ ivas_error IsmFileReader_readNextFrame( { return IVAS_ERR_ISM_INVALID_METADATA_VALUE; } +#ifdef TD5 + if ( ismMetadata->yaw > 180 || ismMetadata->yaw < -180 ) + { + return IVAS_ERR_ISM_INVALID_METADATA_VALUE; + } + + if ( ismMetadata->pitch > 90 || ismMetadata->pitch < -90 ) + { + return IVAS_ERR_ISM_INVALID_METADATA_VALUE; + } +#endif return IVAS_ERR_OK; } diff --git a/lib_util/ism_file_writer.c b/lib_util/ism_file_writer.c index c4dffe38b0..870cf33586 100644 --- a/lib_util/ism_file_writer.c +++ b/lib_util/ism_file_writer.c @@ -35,8 +35,10 @@ #include -#define META_LINE_LENGTH 200 /* max number of characters at one line of metadata input/output file */ -#define NUM_ISM_METADATA_PER_LINE 5 /* Number of ISM metadata per line in a metadata file */ +#define META_LINE_LENGTH 200 /* max number of characters at one line of metadata input/output file */ +#ifndef TD5 +#define NUM_ISM_METADATA_PER_LINE 5 /* Number of ISM metadata per line in a metadata file */ +#endif struct IsmFileWriter @@ -54,7 +56,7 @@ struct IsmFileWriter /*! r: error code */ ivas_error IsmFileWriter_open( const char *filePathWav, /* i : path to output file */ - const int16_t obj_num, /* i : ISm number */ + const int16_t obj_num, /* i : number of ISM channels */ IsmFileWriter **ismWriter /* o : IsmFileWriter handle */ ) { @@ -115,7 +117,18 @@ ivas_error IsmFileWriter_writeFrame( file = ismWriter->file; /* IVAS_fmToDo: work in progress; currently position_azimuth, position_elevation, position_radius, spread, gain_factor */ +#ifdef FIX_293_EXT_RENDERER_CLI +#ifdef TD5 + sprintf( char_buff, "%+07.2f,%+06.2f,%05.2f,%06.2f,%04.2f,%+07.2f,%+06.2f\n", ismMetadata.azimuth, ismMetadata.elevation, ismMetadata.radius, ismMetadata.spread, ismMetadata.gainFactor, ismMetadata.yaw, ismMetadata.pitch ); +#else + sprintf( char_buff, "%+07.2f,%+06.2f,%05.2f,%06.2f,%04.2f\n", ismMetadata.azimuth, ismMetadata.elevation, ismMetadata.radius, ismMetadata.spread, ismMetadata.gainFactor ); +#endif +#endif +#ifdef TD5 + snprintf( char_buff, sizeof( char_buff ), "%+07.2f,%+06.2f,%05.2f,%06.2f,%04.2f,%+07.2f,%+06.2f\n", ismMetadata.azimuth, ismMetadata.elevation, ismMetadata.radius, ismMetadata.spread, ismMetadata.gainFactor, ismMetadata.yaw, ismMetadata.pitch ); +#else snprintf( char_buff, sizeof( char_buff ), "%+07.2f,%+06.2f,%05.2f,%06.2f,%04.2f\n", ismMetadata.azimuth, ismMetadata.elevation, ismMetadata.radius, ismMetadata.spread, ismMetadata.gainFactor ); +#endif if ( file ) { diff --git a/lib_util/ism_file_writer.h b/lib_util/ism_file_writer.h index 24b4c58bd4..d9f731e87e 100644 --- a/lib_util/ism_file_writer.h +++ b/lib_util/ism_file_writer.h @@ -43,7 +43,7 @@ typedef struct IsmFileWriter IsmFileWriter; /*! r: error code */ ivas_error IsmFileWriter_open( const char *filePathWav, /* i : path to output file */ - const int16_t obj_num, /* i : ISm number */ + const int16_t obj_num, /* i : number of ISM channels */ IsmFileWriter **ismWriter /* o : IsmFileReader handle */ ); diff --git a/lib_util/ls_custom_file_reader.c b/lib_util/ls_custom_file_reader.c index f73022e849..9b39fab486 100644 --- a/lib_util/ls_custom_file_reader.c +++ b/lib_util/ls_custom_file_reader.c @@ -52,7 +52,7 @@ struct LsCustomFileReader ivas_error CustomLsReader_open( const char *LsFilePath, /* i : LS custom layout file name */ - LsCustomFileReader **hLsCustomReader /* o : HeadRotFileReader handle */ + LsCustomFileReader **hLsCustomReader /* o : LsCustomFileReader handle */ ) { LsCustomFileReader *self; @@ -89,7 +89,7 @@ ivas_error CustomLsReader_open( *-----------------------------------------------------------------------*/ void CustomLsReader_close( - LsCustomFileReader **hLsCustomReader /* i/o: HeadRotFileReader handle */ + LsCustomFileReader **hLsCustomReader /* i/o: LsCustomFileReader handle */ ) { if ( hLsCustomReader == NULL || *hLsCustomReader == NULL ) @@ -228,7 +228,7 @@ static void CustomLoudspeakerLayout_print_info( *-------------------------------------------------------------------------*/ LS_CUSTOM_FILEREADER_ERROR CustomLsFileReading( - LsCustomFileReader *hLsCustomReader, /* i/o: HeadRotFileReader handle */ + LsCustomFileReader *hLsCustomReader, /* i/o: LsCustomFileReader handle */ IVAS_CUSTOM_LS_DATA *hLsCustomData /* o : Custom loudspeaker setup data */ ) { diff --git a/lib_util/ls_custom_file_reader.h b/lib_util/ls_custom_file_reader.h index 70c854aa9c..df7fe6bde7 100644 --- a/lib_util/ls_custom_file_reader.h +++ b/lib_util/ls_custom_file_reader.h @@ -64,7 +64,7 @@ typedef enum _LS_CUSTOM_FILEREADER_ERROR ivas_error CustomLsReader_open( const char *LsFilePath, /* i : LS custom layout file name */ - LsCustomFileReader **hLsCustomReader /* o : HeadRotFileReader handle */ + LsCustomFileReader **hLsCustomReader /* o : LsCustomFileReader handle */ ); /*-----------------------------------------------------------------------* @@ -74,7 +74,7 @@ ivas_error CustomLsReader_open( *-----------------------------------------------------------------------*/ void CustomLsReader_close( - LsCustomFileReader **hLsCustomReader /* i/o: HeadRotFileReader handle */ + LsCustomFileReader **hLsCustomReader /* i/o: LsCustomFileReader handle */ ); /*-------------------------------------------------------------------------* @@ -84,7 +84,7 @@ void CustomLsReader_close( *-------------------------------------------------------------------------*/ LS_CUSTOM_FILEREADER_ERROR CustomLsFileReading( - LsCustomFileReader *hLsCustomReader, /* i/o: HeadRotFileReader handle */ + LsCustomFileReader *hLsCustomReader, /* i/o: LsCustomFileReader handle */ IVAS_CUSTOM_LS_DATA *hLsCustomData /* o : Custom loudspeaker setup data */ ); diff --git a/lib_util/masa_file_writer.c b/lib_util/masa_file_writer.c index 5667968ece..74429f9185 100644 --- a/lib_util/masa_file_writer.c +++ b/lib_util/masa_file_writer.c @@ -67,8 +67,10 @@ struct MasaFileWriter *-----------------------------------------------------------------------*/ #ifndef FIX_350_MASA_DELAY_COMP +#ifndef FIX_373_MASA_DELAY_COMP_MSAN #define SPH_IDX_FRONT ( MASA_NO_POINTS_EQUATOR / 2 ) /* Spherical index corresponding to front direction for setting as default value */ #endif +#endif /*-----------------------------------------------------------------------* * Local functions diff --git a/lib_util/render_config_reader.c b/lib_util/render_config_reader.c index 9fe7f019eb..907d148a6e 100644 --- a/lib_util/render_config_reader.c +++ b/lib_util/render_config_reader.c @@ -522,6 +522,15 @@ ivas_error RenderConfigReader_read( errorHandler( pValue, ERROR_VALUE_INVALID ); } } +#ifdef TD5 + else if ( strcmp( item, "DIRECTIVITY" ) == 0 ) + { + if ( read_vector( pValue, 3, hRenderConfig->directivity ) ) + { + errorHandler( item, ERROR_VALUE_INVALID ); + } + } +#endif #ifdef DEBUGGING else { diff --git a/lib_util/vector3_pair_file_reader.c b/lib_util/vector3_pair_file_reader.c new file mode 100644 index 0000000000..1b8a95bc88 --- /dev/null +++ b/lib_util/vector3_pair_file_reader.c @@ -0,0 +1,166 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "vector3_pair_file_reader.h" +#include +#include +#include +#include +#include "prot.h" +#include "options.h" /* only included to get access to the feature-defines */ + +#ifdef OTR_REFERENCE_VECTOR_TRACKING + +struct Vector3PairFileReader +{ + FILE *trajFile; + char *file_path; +}; + +/*-----------------------------------------------------------------------* + * Vector3PairFileReader_open() + * + * Allocate and initialize reader + *-----------------------------------------------------------------------*/ + +ivas_error Vector3PairFileReader_open( + const char *trajFilePath, /* i : trajectory file name */ + Vector3PairFileReader **vector3PairReader /* o : Vector3PairFileReader handle */ +) +{ + Vector3PairFileReader *self; + FILE *trajFile; + + /* Open trajectory file */ + if ( strlen( trajFilePath ) < 1 ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + trajFile = fopen( trajFilePath, "r" ); + + if ( !trajFile ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + self = calloc( sizeof( Vector3PairFileReader ), 1 ); + self->trajFile = trajFile; + self->file_path = calloc( sizeof( char ), strlen( trajFilePath ) + 1 ); + strcpy( self->file_path, trajFilePath ); + + *vector3PairReader = self; + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------* + * Vector3PairFileReader_read() + * + * Read one line of values from the trajectory file + *-----------------------------------------------------------------------*/ + +ivas_error Vector3PairFileReader_read( + Vector3PairFileReader *vector3PairReader, /* i/o: Vector3PairFileReader handle */ + IVAS_VECTOR3 *pFirst, /* o : first x,y,z position in the line */ + IVAS_VECTOR3 *pSecond /* o : second x,y,z position in the line */ +) +{ + float x1, y1, z1, x2, y2, z2; + + if ( vector3PairReader == NULL || pFirst == NULL || pSecond == NULL ) + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + + if ( 6 != fscanf( vector3PairReader->trajFile, "%f,%f,%f,%f,%f,%f", &x1, &y1, &z1, &x2, &y2, &z2 ) ) + { + if ( feof( vector3PairReader->trajFile ) ) + { + rewind( vector3PairReader->trajFile ); + return Vector3PairFileReader_read( vector3PairReader, pFirst, pSecond ); + } + return IVAS_ERR_FAILED_FILE_PARSE; + } + + pFirst->x = x1; + pFirst->y = y1; + pFirst->z = z1; + pSecond->x = x2; + pSecond->y = y2; + pSecond->z = z2; + + return IVAS_ERR_OK; +} + +/*-----------------------------------------------------------------------* + * Vector3PairFileReader_close() + * + * Deallocates memory for the Head-Tracking reader + *-----------------------------------------------------------------------*/ + +void Vector3PairFileReader_close( + Vector3PairFileReader **reader /* i/o: Vector3PairFileReader handle */ +) +{ + if ( reader == NULL || *reader == NULL ) + { + return; + } + + fclose( ( *reader )->trajFile ); + free( ( *reader )->file_path ); + free( *reader ); + *reader = NULL; + + return; +} + + +/*-----------------------------------------------------------------------* + * Vector3PairFileReader_getFilePath() + * + * + *-----------------------------------------------------------------------*/ + +const char *Vector3PairFileReader_getFilePath( + Vector3PairFileReader *reader /* i/o: Vector3PairFileReader handle */ +) +{ + if ( reader == NULL ) + { + return NULL; + } + + return reader->file_path; +} + +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ diff --git a/lib_debug/segsnr.c b/lib_util/vector3_pair_file_reader.h similarity index 52% rename from lib_debug/segsnr.c rename to lib_util/vector3_pair_file_reader.h index 5e5cee48b0..a2fd706fc2 100644 --- a/lib_debug/segsnr.c +++ b/lib_util/vector3_pair_file_reader.h @@ -30,76 +30,60 @@ *******************************************************************************************************/ -#include -#ifdef DEBUGGING -#include "debug.h" -#endif -#include "wmc_auto.h" -#include -#include "options.h" -#include "prot.h" - -#define WMC_TOOL_SKIP - -#ifdef OUTPUT_SNR -/*_____________________________________________________________________ - | | - | FUNCTION NAME segsnr | - | Computes the segmential signal-to-noise ratio between the | - | signal x and its estimate xe of length n samples. The segment | - | length is nseg samples. | - | - | INPUT - | x[0:n-1] Signal of n samples. - | xe[0:n-1] Estimated signal of n samples. - | n Signal length. - | nseg Segment length, must be a submultiple of n. - | - | RETURN VALUE - | snr Segmential signal to noise ratio in dB. - |_____________________________________________________________________| -*/ - -float segsnr( float x[], float xe[], int16_t n, int16_t nseg ) -{ - float snr = 0.0f; - float signal, noise, error, fac; - int16_t i, j; - LOOP( 1 ); - for ( i = 0; i < n; i += nseg ) - { - signal = 1e-6f; - MOVE( 2 ); - noise = 1e-6f; - LOOP( 1 ); - for ( j = 0; j < nseg; j++ ) - { - signal += ( *x ) * ( *x ); - MAC( 1 ); - error = *x++ - *xe++; - ADD( 1 ); - noise += error * error; - MAC( 1 ); - } - snr += (float) log10( signal / noise ); - TRANS( 1 ); - DIV( 1 ); - ADD( 1 ); - } - fac = ( (float) ( 10 * nseg ) ) / (float) n; - DIV( 1 ); - MULT( 1 ); - snr = fac * snr; - MULT( 1 ); - ADD( 1 ); - BRANCH( 1 ); - if ( snr < -99.0f ) - { - snr = -99.0f; - MOVE( 1 ); - } - return ( snr ); -} -#endif - -#undef WMC_TOOL_SKIP +#ifndef IVAS_V3PAIR_FILE_READER_H +#define IVAS_V3PAIR_FILE_READER_H + +#include "common_api_types.h" +#include "ivas_error.h" +#include "options.h" /* only included to get access to the feature-defines */ + +#ifdef OTR_REFERENCE_VECTOR_TRACKING + +typedef struct Vector3PairFileReader Vector3PairFileReader; + +/*-----------------------------------------------------------------------* + * Vector3PairFileReader_open() + * + * Allocate and initialize Head-Tracking handle + *-----------------------------------------------------------------------*/ + +ivas_error Vector3PairFileReader_open( + const char *trajFilePath, /* i : trajectory file name */ + Vector3PairFileReader **vector3PairReader /* o : Vector3PairFileReader handle */ +); + +/*-----------------------------------------------------------------------* + * Vector3PairFileReader_read() + * + * Read one line of values from the trajectory file + *-----------------------------------------------------------------------*/ + +ivas_error Vector3PairFileReader_read( + Vector3PairFileReader *vector3PairReader, /* i/o: Vector3PairFileReader handle */ + IVAS_VECTOR3 *pFirst, /* o : first x,y,z position in the line */ + IVAS_VECTOR3 *pSecond /* o : second x,y,z position in the line */ +); + +/*-----------------------------------------------------------------------* + * Vector3PairFileReader_close() + * + * Deallocates memory for the handle + *-----------------------------------------------------------------------*/ + +void Vector3PairFileReader_close( + Vector3PairFileReader **vector3PairReader /* i/o: Vector3PairFileReader handle */ +); + +/*-----------------------------------------------------------------------* + * Vector3PairFileReader_getFilePath() + * + * + *-----------------------------------------------------------------------*/ + +const char *Vector3PairFileReader_getFilePath( + Vector3PairFileReader *vector3PairReader /* i/o: Vector3PairFileReader handle */ +); + +#endif /* OTR_REFERENCE_VECTOR_TRACKING */ + +#endif /* IVAS_V3PAIR_FILE_READER_H */ diff --git a/scripts/IvasBuildAndRun.py b/scripts/IvasBuildAndRun.py index 77c0e3ad60..554c216b18 100755 --- a/scripts/IvasBuildAndRun.py +++ b/scripts/IvasBuildAndRun.py @@ -32,7 +32,6 @@ import os.path import sys -import pdb from pyivastest.IvasSvnBuilder import * from pyivastest import IvasScriptsCommon diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index 223ac0352c..f26fba423a 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -161,19 +161,19 @@ ../IVAS_dec STEREO 48 bit testv/stvST48c.wav_stereo_32000_48-48_bandwidth_sw.tst // stereo at 32 kbps, 48kHz in, 32kHz out, random FEC at 6% -../IVAS_cod -stereo -max_band FB 32000 48 testv/stvST48c.wav bit +../IVAS_cod -stereo 32000 48 testv/stvST48c.wav bit ../IVAS_dec -fec testv/FEC_6pct.bin STEREO 32 bit testv/stvST48c.wav_stereo_32000_48-32_FEC5.tst // stereo at 32 kbps, 48kHz in, 48kHz out, DTX on, random FEC at 5% -../IVAS_cod -stereo -dtx -max_band FB 32000 48 testv/stvST48n.wav bit +../IVAS_cod -stereo -dtx 32000 48 testv/stvST48n.wav bit ../IVAS_dec -fec 5 STEREO 48 bit testv/stvST48n.wav_stereo_32000_48-48_DTX_FEC5.tst // stereo at 32 kbps, 48kHz in, 48kHz out, DTX on, MONO out, random FEC at 5% -../IVAS_cod -stereo -dtx -max_band FB 32000 48 testv/stvST48n.wav bit +../IVAS_cod -stereo -dtx 32000 48 testv/stvST48n.wav bit ../IVAS_dec -fec 5 MONO 48 bit testv/stvST48n.wav_stereo_32000_48-48_DTX_MONO_FEC5.tst // stereo at 32 kbps, 48kHz in, 16kHz out, DTX on, MONO out, random FEC at 5% -../IVAS_cod -stereo -dtx -max_band FB 32000 48 testv/stvST48n.wav bit +../IVAS_cod -stereo -dtx 32000 48 testv/stvST48n.wav bit ../IVAS_dec -fec 5 MONO 16 bit testv/stvST48n.wav_stereo_32000_48-16_DTX_MONO_FEC5.tst // stereo at 48 kbps, 16kHz in, 16kHz out @@ -250,153 +250,175 @@ -// 1 ISm with metadata at 13.2 kbps, 48 kHz in, 48 kHz out, MONO out +// 1 ISM with metadata at 13.2 kbps, 48 kHz in, 48 kHz out, MONO out ../IVAS_cod -ism 1 testv/stvISM1.csv 13200 48 testv/stv1ISM48s.wav bit ../IVAS_dec MONO 48 bit testv/stv1ISM48s.wav_13200_48-48_MONO.tst -// 1 ISm with metadata at 13.2 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL out, random FEC at 5% +// 1 ISM with metadata at 13.2 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL out, random FEC at 5% ../IVAS_cod -dtx -ism 1 testv/stvISM1.csv 13200 48 testv/stv48n.wav bit ../IVAS_dec -fec 5 BINAURAL 48 bit testv/stv48n.wav_13200_48-48_DTX_FEC5_BINAURAL.tst -// 2 ISm with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, STEREO out +// 2 ISM with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, STEREO out ../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 16400 48 testv/stv2ISM48s.wav bit ../IVAS_dec STEREO 48 bit testv/stv2ISM48s.wav_16400_48-48_STEREO.tst -// 3 ISm with metadata at 24.4 kbps, 48 kHz in, 48 kHz out, 7_1 out +// 2 ISM with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, BINAURAL out +../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 16400 48 testv/stv2ISM48s.wav bit +../IVAS_dec BINAURAL 48 bit testv/stv2ISM48s.wav_16400_48-48_binaural.tst + +// 1 ISM with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out +../IVAS_cod -ism 1 testv/stvISM1.csv 16400 48 testv/stv1ISM48s.wav bit +../IVAS_dec BINAURAL_ROOM 48 bit testv/stv1ISM48s.wav_16400_48-48_binaural_room.tst + +// 3 ISM with metadata at 24.4 kbps, 48 kHz in, 48 kHz out, 7_1 out ../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 24400 48 testv/stv3ISM48s.wav bit ../IVAS_dec 7_1 48 bit testv/stv3ISM48s.wav_24400_48-48_7_1.tst -// 3 ISm with metadata at 24.4 kbps, 48 kHz in, 48 kHz out, MONO out, random FEC at 5% +// 3 ISM with metadata at 24.4 kbps, 48 kHz in, 48 kHz out, MONO out, random FEC at 5% ../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 24400 48 testv/stv3ISM48s.wav bit ../IVAS_dec -fec 5 MONO 48 bit testv/stv3ISM48s.wav_24400_48-48_MONO_FEC5.tst -// 1 ISm with metadata at 32 kbps, 32 kHz in, 32 kHz out, DTX on, MONO out +// 3 ISM with metadata at 24.4 kbps, 48 kHz in, 48 kHz out, BINAURAL out +../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 24400 48 testv/stv3ISM48s.wav bit +../IVAS_dec BINAURAL 48 bit testv/stv3ISM48s.wav_24400_48-48_binaural.tst + +// 1 ISM with metadata at 32 kbps, 32 kHz in, 32 kHz out, DTX on, MONO out ../IVAS_cod -dtx -ism 1 testv/stvISM1.csv 32000 32 testv/stv32n.wav bit ../IVAS_dec MONO 32 bit testv/stv32n.wav_32000_32-32_DTX_MONO.tst -// 4 ISm with metadata at 32 kbps, 48 kHz in, 48 kHz out, FOA out +// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, FOA out ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48s.wav bit ../IVAS_dec FOA 48 bit testv/stv4ISM48s.wav_32000_48-48_FOA.tst -// 4 ISm with metadata at 32 kbps, 48 kHz in, 48 kHz out, STEREO out +// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, STEREO out ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48s.wav bit ../IVAS_dec STEREO 48 bit testv/stv4ISM48s.wav_32000_48-48_STEREO.tst -// 3 ISm with metadata at 48 kbps, 48 kHz in, 48 kHz out, MONO out -../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 48000 48 testv/stv3ISM48s.wav bit -../IVAS_dec MONO 48 bit testv/stv43ISM48s_48000_48-48_MONO.tst - -// 2 ISm with metadata at 64 kbps, 48 kHz in, 32 kHz out, 5_1 out -../IVAS_cod -max_band FB -ism 2 testv/stvISM1.csv testv/stvISM2.csv 64000 48 testv/stv2ISM48s.wav bit -../IVAS_dec 5_1 32 bit testv/stv2ISM48s.wav_64000_48-32_5_1.tst - -// 4 ISm with metadata at 80 kbps, 48 kHz in, 48 kHz out, HOA2 out -../IVAS_cod -max_band FB -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 80000 48 testv/stv4ISM48s.wav bit -../IVAS_dec HOA2 48 bit testv/stv4ISM48s.wav_80000_48-48_HOA2.tst - -// 4 ISm with metadata at 96 kbps, 48 kHz in, 48 kHz out, Custom LS setup out -../IVAS_cod -max_band FB -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 96000 48 testv/stv4ISM48s.wav bit -../IVAS_dec testv/ls_setup_16ch_8+4+4.txt 48 bit testv/stv4ISM48s.wav_96000_48-48_MC_custom_setup.tst - -// 3 ISm with metadata at 128 kbps, 48 kHz in, 32 kHz out, HOA3 out, random FEC at 5% -../IVAS_cod -max_band FB -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 128000 48 testv/stv3ISM48s.wav bit -../IVAS_dec -fec 5 HOA3 32 bit testv/stv3ISM48s.wav_128000_48-32_HOA3_FEC5.tst - -// 4 ISm with metadata at 160 kbps, 48 kHz in, 48 kHz out, STEREO out -../IVAS_cod -max_band FB -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 160000 48 testv/stv4ISM48s.wav bit -../IVAS_dec STEREO 48 bit testv/stv4ISM48s.wav_160000_48-48_STEREO.tst - -// 2 ISm with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, BINAURAL out -../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 16400 48 testv/stv2ISM48s.wav bit -../IVAS_dec BINAURAL 48 bit testv/stv2ISM48s.wav_16400_48-48_binaural.tst - -// 3 ISm with metadata at 24.4 kbps, 48 kHz in, 48 kHz out, BINAURAL out -../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 24400 48 testv/stv3ISM48s.wav bit -../IVAS_dec BINAURAL 48 bit testv/stv3ISM48s.wav_24400_48-48_binaural.tst - -// 2 ISm with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL out, random FEC at 5% -../IVAS_cod -ism 2 testv/stvISM3.csv testv/stvISM4.csv 48000 48 testv/stv2ISM48s.wav bit -../IVAS_dec -fec 5 BINAURAL 48 bit testv/stv2ISM48s.wav_48000_48-48_binaural_FEC5.tst - -// 4 ISm with metadata at 32 kbps, 48 kHz in, 48 kHz out, BINAURAL out +// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, BINAURAL out ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48s.wav bit ../IVAS_dec BINAURAL 48 bit testv/stv4ISM48s.wav_32000_48-48_binaural.tst -// 1 ISm with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out -../IVAS_cod -ism 1 testv/stvISM1.csv 16400 48 testv/stv1ISM48s.wav bit -../IVAS_dec BINAURAL_ROOM 48 bit testv/stv1ISM48s.wav_16400_48-48_binaural_room.tst +// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL out +../IVAS_cod -dtx -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48n.wav bit +../IVAS_dec BINAURAL 48 bit testv/stv4ISM48n.wav_32000_48-48_DTX_BINAURAL.tst + +// 2 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, DTX on, HOA2 out +../IVAS_cod -dtx -ism 2 testv/stvISM1.csv testv/stvISM2.csv 32000 48 testv/stvST48c.wav bit +../IVAS_dec HOA2 48 bit testv/stv2ST48c.wav_32000_48-48_DTX_HOA2.tst + -// 2 ISm with metadata at 32 kbps, 48 kHz in, 48 kHz out, EXTERNAL out +// 2 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, EXTERNAL out ../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 32000 48 testv/stv2ISM48s.wav bit ../IVAS_dec EXT 48 bit testv/stv2ISM48s.wav_32000_48-48_external.tst -// 2 ISm with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out +// 2 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out ../IVAS_cod -ism 2 testv/stvISM3.csv testv/stvISM4.csv 64000 48 testv/stv2ISM48s.wav bit ../IVAS_dec BINAURAL_ROOM 48 bit testv/stv2ISM48s.wav_64000_48-48_binaural_room.tst -// 4 ISm with metadata at 32 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out, random FEC at 5% +// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out, random FEC at 5% ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48s.wav bit ../IVAS_dec -fec 5 BINAURAL_ROOM 48 bit testv/stv4ISM48s.wav_32000_48-48_binaural_room_FEC5.tst -// 4 ISm with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out -../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 64000 48 testv/stv4ISM48s.wav bit -../IVAS_dec BINAURAL_ROOM 48 bit testv/stv4ISM48s.wav_64000_48-48_binaural_room.tst +// 3 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, MONO out +../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 48000 48 testv/stv3ISM48s.wav bit +../IVAS_dec MONO 48 bit testv/stv43ISM48s_48000_48-48_MONO.tst + +// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL out +../IVAS_cod -dtx -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48n.wav bit +../IVAS_dec BINAURAL 48 bit testv/stv4ISM48n.wav_32000_48-48_DTX_BINAURAL.tst + +// 4 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL ROOM out, random FEC at 5% +../IVAS_cod -dtx -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 48000 48 testv/stv4ISM48n.wav bit +../IVAS_dec -fec 5 BINAURAL_ROOM 48 bit testv/stv4ISM48n.wav_48000_48-48_DTX_TD_binaural_room_FEC5.tst + +// 2 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL out, random FEC at 5% +../IVAS_cod -ism 2 testv/stvISM3.csv testv/stvISM4.csv 48000 48 testv/stv2ISM48s.wav bit +../IVAS_dec -fec 5 BINAURAL 48 bit testv/stv2ISM48s.wav_48000_48-48_binaural_FEC5.tst -// 1 ISm with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out, head rotation, random FEC at 5% +// 1 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out, head rotation, random FEC at 5% ../IVAS_cod -ism 1 testv/stvISM1.csv 48000 48 testv/stv1ISM48s.wav bit ../IVAS_dec -fec 5 -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM 48 bit testv/stv1ISM48s.wav_64000_48-48_binaural_room_HR.tst -// 1 ISm with metadata at 96 kbps, 48 kHz in, 16 kHz out, TD BINAURAL out (Model from file) -../IVAS_cod -ism 1 testv/stvISM1.csv 96000 48 testv/stv1ISM48s.wav bit -../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL 16 bit testv/stv2ISM48s.wav_96000_48-16_TD_binaural.tst +// 2 ISM with metadata at 64 kbps, 48 kHz in, 32 kHz out, 5_1 out +../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 64000 48 testv/stv2ISM48s.wav bit +../IVAS_dec 5_1 32 bit testv/stv2ISM48s.wav_64000_48-32_5_1.tst -// 2 ISm with metadata at 160 kbps, 48 kHz in, 32 kHz out, TD BINAURAL out -../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 160000 48 testv/stv2ISM48s.wav bit -../IVAS_dec BINAURAL 32 bit testv/stv2ISM48s.wav_160000_48-32_TD_binaural.tst +// 4 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out +../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 64000 48 testv/stv4ISM48s.wav bit +../IVAS_dec BINAURAL_ROOM 48 bit testv/stv4ISM48s.wav_64000_48-48_binaural_room.tst -// 3 ISm with metadata at 192 kbps, 48 kHz in, 48 kHz out, TD BINAURAL out (Model from file) -../IVAS_cod -ism 3 testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 192000 48 testv/stv3ISM48s.wav bit -../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL 48 bit testv/stv3ISM48s.wav_192000_48-48_TD_binaural.tst +// 2 ISM with metadata at 80 kbps, 48 kHz in, 48 kHz out, DTX on, stereo out +../IVAS_cod -dtx -ism 2 testv/stvISM1.csv testv/stvISM2.csv 80000 48 testv/stvST48c.wav bit +../IVAS_dec STEREO 48 bit testv/stv2ST48c.wav_80000_48-48_DTX_STEREO.tst -// 4 ISm with metadata at 256 kbps, 48 kHz in, 48 kHz out, TD BINAURAL out -../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit -../IVAS_dec BINAURAL 48 bit testv/stv4ISM48s.wav_256000_48-48_TD_binaural.tst +// 4 ISM with metadata at 80 kbps, 48 kHz in, 48 kHz out, HOA2 out +../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 80000 48 testv/stv4ISM48s.wav bit +../IVAS_dec HOA2 48 bit testv/stv4ISM48s.wav_80000_48-48_HOA2.tst -// 1 ISm with metadata at 80 kbps, 48 kHz in, 16 kHz out, TD BINAURAL out (Model from file), head rotation, random FEC at 5% +// 1 ISM with metadata at 80 kbps, 48 kHz in, 16 kHz out, BINAURAL out (Model from file), head rotation, random FEC at 5% ../IVAS_cod -ism 1 testv/stvISM1.csv 80000 48 testv/stv1ISM48s.wav bit -../IVAS_dec -fec 5 -t testv/headrot_case00_3000_q.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL 16 bit testv/stv2ISM48s.wav_80000_48-16_TDHR_FEC5.tst +../IVAS_dec -fec 5 -t testv/headrot_case00_3000_q.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL 16 bit testv/stv2ISM48s.wav_80000_48-16_binaural_file_TDHR_FEC5.tst -// 2 ISm with metadata at 128 kbps, 48 kHz in, 32 kHz out, TD BINAURAL out (Model from file), head rotation +// 4 ISM with metadata at 96 kbps, 48 kHz in, 48 kHz out, Custom LS setup out +../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 96000 48 testv/stv4ISM48s.wav bit +../IVAS_dec testv/ls_setup_16ch_8+4+4.txt 48 bit testv/stv4ISM48s.wav_96000_48-48_MC_custom_setup.tst + +// 1 ISM with metadata at 96 kbps, 48 kHz in, 16 kHz out, BINAURAL out (Model from file) +../IVAS_cod -ism 1 testv/stvISM1.csv 96000 48 testv/stv1ISM48s.wav bit +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL 16 bit testv/stv2ISM48s.wav_96000_48-16_binaural.tst + +// 3 ISM with metadata at 128 kbps, 48 kHz in, 32 kHz out, HOA3 out, random FEC at 5% +../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 128000 48 testv/stv3ISM48s.wav bit +../IVAS_dec -fec 5 HOA3 32 bit testv/stv3ISM48s.wav_128000_48-32_HOA3_FEC5.tst + + +// 2 ISM with metadata at 128 kbps, 48 kHz in, 32 kHz out, BINAURAL out (Model from file), head rotation ../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 128000 48 testv/stv2ISM48s.wav bit -../IVAS_dec -t testv/headrot_case01_3000_q.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin BINAURAL 32 bit testv/stv2ISM48s.wav_128000_48-32_TDHR.tst +../IVAS_dec -t testv/headrot_case01_3000_q.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin BINAURAL 32 bit testv/stv2ISM48s.wav_128000_48-32_binaural_file_TDHR.tst + +// 4 ISM with metadata at 160 kbps, 48 kHz in, 48 kHz out, STEREO out +../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 160000 48 testv/stv4ISM48s.wav bit +../IVAS_dec STEREO 48 bit testv/stv4ISM48s.wav_160000_48-48_STEREO.tst -// 3 ISm with metadata at 192 kbps, 48 kHz in, 48 kHz out, TD BINAURAL out, head rotation, random FEC at 5% +// 2 ISM with metadata at 160 kbps, 48 kHz in, 32 kHz out, BINAURAL out +../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 160000 48 testv/stv2ISM48s.wav bit +../IVAS_dec BINAURAL 32 bit testv/stv2ISM48s.wav_160000_48-32_binaural.tst + +// 3 ISM with metadata at 192 kbps, 48 kHz in, 48 kHz out, BINAURAL out (Model from file) +../IVAS_cod -ism 3 testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 192000 48 testv/stv3ISM48s.wav bit +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL 48 bit testv/stv3ISM48s.wav_192000_48-48_binaural)file.tst + +// 3 ISM with metadata at 192 kbps, 48 kHz in, 48 kHz out, BINAURAL out, head rotation, random FEC at 5% ../IVAS_cod -ism 3 testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 192000 48 testv/stv3ISM48s.wav bit -../IVAS_dec -fec 5 -t testv/headrot_case02_3000_q.csv BINAURAL 48 bit testv/stv3ISM48s.wav_192000_48-48_TDHR_FEC5.tst +../IVAS_dec -fec 5 -t testv/headrot_case02_3000_q.csv BINAURAL 48 bit testv/stv3ISM48s.wav_192000_48-48_binaural_file_TDHR_FEC5.tst -// 4 ISm with metadata at 256 kbps, 48 kHz in, 48 kHz out, TD BINAURAL out, head rotation +// 4 ISM with metadata at 256 kbps, 48 kHz in, 48 kHz out, BINAURAL out ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit -../IVAS_dec -t testv/headrot_case03_3000_q.csv BINAURAL 48 bit testv/stv4ISM48s.wav_256000_48-48_TDHR.tst +../IVAS_dec BINAURAL 48 bit testv/stv4ISM48s.wav_256000_48-48_binaural.tst -// 3 ISm with metadata at 384 kbps, 48 kHz in, 32 kHz out, 7_1_4 out +// 4 ISM with metadata at 256 kbps, 48 kHz in, 48 kHz out, BINAURAL out, head rotation +../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit +../IVAS_dec -t testv/headrot_case03_3000_q.csv BINAURAL 48 bit testv/stv4ISM48s.wav_256000_48-48_binaural_file_TDHR.tst + +// 3 ISM with metadata at 384 kbps, 48 kHz in, 32 kHz out, 7_1_4 out ../IVAS_cod -ism 3 testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 384000 48 testv/stv3ISM48s.wav bit ../IVAS_dec 7_1_4 32 bit testv/stv3ISM48s.wav_384000_48-32_7_1_4.tst -// 4 ISm with metadata at 512 kbps, 48 kHz in, 48 kHz out, 5_1 +// 4 ISM with metadata at 512 kbps, 48 kHz in, 48 kHz out, 5_1 ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 512000 48 testv/stv4ISM48s.wav bit ../IVAS_dec 5_1 48 bit testv/stv4ISM48s.wav_512000_48-48_5_1.tst -// 1 ISm with metadata bitrate switching from 13.2 kbps to 128 kbps, 32 kHz in, 32 kHz out, mono out, DTX on +// 1 ISM with metadata bitrate switching from 13.2 kbps to 128 kbps, 32 kHz in, 32 kHz out, mono out, DTX on ../IVAS_cod -dtx -ism 1 testv/stvISM1.csv ../scripts/switchPaths/sw_13k2_to_128k_10fr.bin 32 testv/stv32c.wav bit ../IVAS_dec MONO 32 bit testv/stv32c.wav_brate_sw_32-32_mono_dtx.tst -// 4 ISm with metadata bitrate switching from 24.4 kbps to 256 kbps, 48 kHz in, 48 kHz out, BINAURAL out +// 4 ISM with metadata bitrate switching from 24.4 kbps to 256 kbps, 48 kHz in, 48 kHz out, BINAURAL out ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stv4ISM48s.wav bit -../IVAS_dec BINAURAL 48 bit testv/stv4ISM48s.wav_brate_sw_48-48_BINAURAL.tst +../IVAS_dec BINAURAL 48 bit testv/stv4ISM48s.wav_brate_sw_48-48_binaural.tst -// 4 ISm with metadata at 256 kbps, 48 kHz in, 48 kHz out, DTX on, TD BINAURAL out -../IVAS_cod -dtx -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48n.wav bit -../IVAS_dec BINAURAL 48 bit testv/stv4ISM48n.wav_256000_48-48_DTX_TD_binaural.tst +// 4 ISm with and without metadata bitrate switching from 24.4 kbps to 256 kbps, 48 kHz in, 48 kHz out, DTX on, HOA3 out +../IVAS_cod -dtx -ism 4 testv/stvISM1.csv NULL NULL testv/stvISM4.csv ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stv4ISM48s.wav bit +../IVAS_dec HOA3 48 bit testv/stv4ISM48s.wav_brate_sw_48-48_DTX_hoa3.tst @@ -493,7 +515,7 @@ ../IVAS_dec -fec 5 FOA 32 bit testv/stvFOA32c.wav_SBA_64000_32-32_DTX_FOA.tst // SBA at 64 kbps, 48kHz in, 48kHz out, 5_1_4 out -../IVAS_cod -max_band FB -sba 1 64000 48 testv/stvFOA48c.wav bit +../IVAS_cod -sba 1 64000 48 testv/stvFOA48c.wav bit ../IVAS_dec 5_1_4 48 bit testv/stvFOA48c.wav_SBA_64000_48-48_5_1_4.tst // SBA at 64 kbps, 48kHz in, 48kHz out, 7_1_4 out diff --git a/scripts/pyivastest/IvasModeAnalyzer.py b/scripts/pyivastest/IvasModeAnalyzer.py index 3562837e34..fed4f29ecd 100644 --- a/scripts/pyivastest/IvasModeAnalyzer.py +++ b/scripts/pyivastest/IvasModeAnalyzer.py @@ -36,7 +36,6 @@ import operator from copy import deepcopy import logging import functools -import pdb from pyivastest.IvasModeCollector import IvasModeCollector from pyivastest.constants import LOG_FILE_EXT @@ -45,7 +44,7 @@ from pyivastest.IvasBaseClass import IvasBaseClass INSTRUMENTED_RESULTS = { "WMOPS": { - "keyword": " total", + "keyword": "total", "number_format": "{:.5g}", "position": 2, "max_or_add": "add", @@ -939,8 +938,6 @@ class IvasModeAnalyzer(IvasModeCollector): """ - # pdb.set_trace() - if not os.path.exists(os.path.dirname(csv_file_name)): os.makedirs(os.path.dirname(csv_file_name)) diff --git a/scripts/pyivastest/IvasScriptsCommon.py b/scripts/pyivastest/IvasScriptsCommon.py index dcbd08c146..3df9994170 100644 --- a/scripts/pyivastest/IvasScriptsCommon.py +++ b/scripts/pyivastest/IvasScriptsCommon.py @@ -39,7 +39,6 @@ from pyivastest.IvasBaseClass import * import pyivastest.constants as constants import logging import platform -import pdb # make sure we have colored output using shell escapes correctly on windows if platform.system() == "Windows": # Only if we are running on Windows @@ -304,8 +303,6 @@ class IvasScriptArgParser(argparse.ArgumentParser): args["loglevel"] = args["loglevel"].upper() # do some sanity checks here - # pdb.set_trace() - # check if config file exists if ( "config" in args.keys() diff --git a/scripts/pyivastest/IvasSvnBuilder.py b/scripts/pyivastest/IvasSvnBuilder.py index edcea1bb18..0d7cc9c847 100644 --- a/scripts/pyivastest/IvasSvnBuilder.py +++ b/scripts/pyivastest/IvasSvnBuilder.py @@ -42,7 +42,6 @@ import logging from getpass import getpass import urllib.parse from multiprocessing import cpu_count -import pdb from pyivastest.IvasModeRunner import * from pyivastest.IvasModeAnalyzer import * @@ -1111,7 +1110,6 @@ class IvasBuilderAndRunner(IvasBaseClass): self.build_and_run_dict[cfg_name]["runner"].dir_name = run_dir self.build_and_run_dict[cfg_name]["analyzer"].dir = run_dir self.build_and_run_dict[cfg_name]["runner"].run() - if self.build_and_run_dict[cfg_name]["analyzer"].get_errors: failed_modes = self.build_and_run_dict[cfg_name]["runner"].failed_modes self.build_and_run_dict[cfg_name]["analyzer"].get_errors(failed_modes) diff --git a/scripts/testv/stv16c.wav b/scripts/testv/stv16c.wav index 6923cea4ed..d107fe711d 100644 --- a/scripts/testv/stv16c.wav +++ b/scripts/testv/stv16c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:787f5198da219f4a449b2269d9f2a7c592abdbc9554a991b8b9656d53aac1884 -size 640108 +oid sha256:61f9eca5dafeb46a6aa29c82a8252ebb4ffd4e7a7255f5a4653d8335e685872e +size 640046 diff --git a/scripts/testv/stv16n.wav b/scripts/testv/stv16n.wav index dd94fc0e63..9a9c8798e5 100644 --- a/scripts/testv/stv16n.wav +++ b/scripts/testv/stv16n.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:831f2439e3d728595e3583fea053a5f7130e5f09b69832e686b76a69d93bbcee -size 620908 +oid sha256:7d0ac0846c3046d91843b390fbef3a0180dac92b7d53e4079b3541d43b8af188 +size 620846 diff --git a/scripts/testv/stv1ISM48s.wav b/scripts/testv/stv1ISM48s.wav index ddcd5d3324..da05075565 100644 --- a/scripts/testv/stv1ISM48s.wav +++ b/scripts/testv/stv1ISM48s.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c6914081054030a4a99ab3556f86ecd817b477a132df8d837a8b11568debd49e -size 2880106 +oid sha256:dfd1f55af3964c73b423efe64c7400c02ea3c5f289bf347b019350fe3165bcf3 +size 2880044 diff --git a/scripts/testv/stv1MASA1TC48c.wav b/scripts/testv/stv1MASA1TC48c.wav index 60c2de7967..263f109000 100644 --- a/scripts/testv/stv1MASA1TC48c.wav +++ b/scripts/testv/stv1MASA1TC48c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e9d4810b9aeee2f374c77ab3a0377c478e49e52d9e81b9ec2a01ddd0e8a0f8d4 -size 288106 +oid sha256:2409df48bf501463db0e468aeeee11e5aa866f0adf91ef714a7c6fc506235aa1 +size 288044 diff --git a/scripts/testv/stv1MASA1TC48n.wav b/scripts/testv/stv1MASA1TC48n.wav index 541ded9f6d..1b0012d886 100644 --- a/scripts/testv/stv1MASA1TC48n.wav +++ b/scripts/testv/stv1MASA1TC48n.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c0a85059ba982f249e77391188a0d030acf6853fe326ab5ade480239ce80f07f -size 1927786 +oid sha256:81065ed959b13b8c2a4bb1a05ef14095f523912bc3007fdd172cce87a8398046 +size 1927724 diff --git a/scripts/testv/stv1MASA2TC48c.wav b/scripts/testv/stv1MASA2TC48c.wav index aefec77efe..982e69fb20 100644 --- a/scripts/testv/stv1MASA2TC48c.wav +++ b/scripts/testv/stv1MASA2TC48c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ab7437cdf41e56338c93f5e593118a112a48bae5138be2cdd301eff5da59bb06 -size 1152106 +oid sha256:1bd8440cbf857f9376d053f780572213964c32a267f325948f3a3a02805dc998 +size 1152044 diff --git a/scripts/testv/stv1MASA2TC48n.wav b/scripts/testv/stv1MASA2TC48n.wav index d5e9d955b2..f25eb24353 100644 --- a/scripts/testv/stv1MASA2TC48n.wav +++ b/scripts/testv/stv1MASA2TC48n.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8f745778ed4fa70a704f530049022827696fc4e0dd3389a4076a8658ed514926 +oid sha256:97f1a7a43012ce166b929df59bd756f5d96433ea00ce0a1005380368c01619a0 size 3855404 diff --git a/scripts/testv/stv2ISM48s.wav b/scripts/testv/stv2ISM48s.wav index a945db6b00..02de53114d 100644 --- a/scripts/testv/stv2ISM48s.wav +++ b/scripts/testv/stv2ISM48s.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:777052eddbd7cb2ddcf4539a064368efcb6c5155e08ce42fa7a508d98dd5f8c5 -size 5760106 +oid sha256:e042a1a219fcd4f8a82d1d200071139b76c749d97a7b627774431ba961486b2c +size 5760044 diff --git a/scripts/testv/stv2MASA1TC48c.wav b/scripts/testv/stv2MASA1TC48c.wav index 43096765fd..afe705b0b1 100644 --- a/scripts/testv/stv2MASA1TC48c.wav +++ b/scripts/testv/stv2MASA1TC48c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ccf03f372e4836c9d5ef71d75cf92a00642a13f77464e7c0fcf5f46c961a7f8d -size 576106 +oid sha256:0d500a55bcc63dda1fd93329bcef272a21eb49731ceb0a60e546ef02e07cdd9b +size 576044 diff --git a/scripts/testv/stv2MASA2TC48c.wav b/scripts/testv/stv2MASA2TC48c.wav index 0f72267ea0..e159c4f9ae 100644 --- a/scripts/testv/stv2MASA2TC48c.wav +++ b/scripts/testv/stv2MASA2TC48c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a5a0379965053087ef1ce4775c85384e8c06aaa8161f12888f5e5c06d8612c1f -size 576106 +oid sha256:60a713ed1b97cf94b16849806951ef83d8f41c8ee455b267ec0a292c695cbbc1 +size 576044 diff --git a/scripts/testv/stv2OA32c.wav b/scripts/testv/stv2OA32c.wav index 071c4866e0..86d288de72 100644 --- a/scripts/testv/stv2OA32c.wav +++ b/scripts/testv/stv2OA32c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d608b108d8e38750d78f1691ed92cac2e92f48a86a4488a3dab9a893cfa6ecf2 -size 11520436 +oid sha256:1824c3afe43861b2ed1e4ff94591932f34bb1885d96796e282d3839906e50aed +size 11520350 diff --git a/scripts/testv/stv2OA48c.wav b/scripts/testv/stv2OA48c.wav index 6ba780a84a..24bb1f0872 100644 --- a/scripts/testv/stv2OA48c.wav +++ b/scripts/testv/stv2OA48c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ef0935e08a571a9e88f2257e64c45394633252766a0fb91da582eabf5537a49e -size 17280580 +oid sha256:f573744bd97ad3dcb8e86c39d1770725a34f3c43c37c62c26d670a7f722a880e +size 17280494 diff --git a/scripts/testv/stv32c.wav b/scripts/testv/stv32c.wav index 1267f189de..640532cc12 100644 --- a/scripts/testv/stv32c.wav +++ b/scripts/testv/stv32c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9babeb07a95e9e23068a9c15eea1996a7c366e6000cf8347ce70661631e04ec4 -size 1389700 +oid sha256:00089d67aa513a9f6b2f73526e94d5c32437c6944ec6467072dc27ccaa1f5080 +size 1389542 diff --git a/scripts/testv/stv32n.wav b/scripts/testv/stv32n.wav index 888bbe819c..6a23d99d6e 100644 --- a/scripts/testv/stv32n.wav +++ b/scripts/testv/stv32n.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:acbf022e8fbaafb811c14f75f78ec503ef8a1529ce4b04eabbb00c5066635592 -size 1241706 +oid sha256:1a92be333a359a77ec70324815d71282398dede88e59ac19a31f8d18913c0505 +size 1241644 diff --git a/scripts/testv/stv3ISM48s.wav b/scripts/testv/stv3ISM48s.wav index 12f31ee40a..c52500f610 100644 --- a/scripts/testv/stv3ISM48s.wav +++ b/scripts/testv/stv3ISM48s.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ac91a0d2d1584c52799d7fb52eaa2741df9c6927f94f9d5293dd214938f18a50 -size 8640130 +oid sha256:2a29dfd720edab2367f86c394d4abc9f641596d50697539be70cdfe178d2a28d +size 8640044 diff --git a/scripts/testv/stv3OA32c.wav b/scripts/testv/stv3OA32c.wav index 88c473707d..07cda52674 100644 --- a/scripts/testv/stv3OA32c.wav +++ b/scripts/testv/stv3OA32c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7376200d96aafc156cd4f9907e0b727e1e04921bfcbdb580ac8ff58fea4a60d6 -size 20480674 +oid sha256:bdd1fd31b318bef4439a35baf2252c8edabb826198c75d705095b68dfa288fb0 +size 20480588 diff --git a/scripts/testv/stv3OA48c.wav b/scripts/testv/stv3OA48c.wav index 39a208555f..960d9e2019 100644 --- a/scripts/testv/stv3OA48c.wav +++ b/scripts/testv/stv3OA48c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3d1bf1ccd3a2d59b8fd768df58c49f9abd2b090664745256eec7d23aa0ea8c70 -size 30720930 +oid sha256:7ce54b1708a76f34eeedc40b01e806cb92d32b0813e8ac23bfceaaa8d25262e6 +size 30720844 diff --git a/scripts/testv/stv48c.wav b/scripts/testv/stv48c.wav index d6df0e8fe2..1be5a1dc3c 100644 --- a/scripts/testv/stv48c.wav +++ b/scripts/testv/stv48c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2a2553784fc796c20b2f7d12e159661e9a480438b0ca71bfaf613757c841a1bb -size 1920106 +oid sha256:59f39e02d601b453170cde1e49d50e58b58ff5154ba54c75fc5d79f4964d1e48 +size 1920044 diff --git a/scripts/testv/stv48n.wav b/scripts/testv/stv48n.wav index 040040fadc..2d79cee520 100644 --- a/scripts/testv/stv48n.wav +++ b/scripts/testv/stv48n.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:621ec6a05e4e5064bd2f5699129e81335ac64f257e3dee293b0245ac1adcdb6b -size 1862506 +oid sha256:3c774e6fe4e22274ef72552901c4b4870d56d825fa67e8e3e59a30cc0a44dbfa +size 1862444 diff --git a/scripts/testv/stv4ISM48n.wav b/scripts/testv/stv4ISM48n.wav index 5294260a0f..0ca6e5f3f5 100644 --- a/scripts/testv/stv4ISM48n.wav +++ b/scripts/testv/stv4ISM48n.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b48c4030982641afcaa0c61182f35d6648e2bea4a952d9430f710989e4e4646c +oid sha256:74697fcb6241db1bed87121244c09a3499ea4024cdf15d279feafbedbca6123a size 7680044 diff --git a/scripts/testv/stv4ISM48s.wav b/scripts/testv/stv4ISM48s.wav index faffedc961..de034819ea 100644 --- a/scripts/testv/stv4ISM48s.wav +++ b/scripts/testv/stv4ISM48s.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:361001b64a7ff11a22267df08ccd261728b9a455c2c4860f84f99ce2dc6dd485 -size 11520130 +oid sha256:70433aebd892f38df31f12f10e71caaa1e794c64abb7d3e75fe895676e63609e +size 11520044 diff --git a/scripts/testv/stv512MC48c.wav b/scripts/testv/stv512MC48c.wav index a0c66dc86c..e21644a5d9 100644 --- a/scripts/testv/stv512MC48c.wav +++ b/scripts/testv/stv512MC48c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0f2bcf911eda4dc1069e113d82f2e72b0849db5fb28ebdd619a59971f16fc909 -size 2304130 +oid sha256:3be0c6dccbf26f8755200683bba42553eb36feed297110e289afcec32e0c8459 +size 2304044 diff --git a/scripts/testv/stv514MC48c.wav b/scripts/testv/stv514MC48c.wav index 22d0c6e0ab..113cd6219a 100644 --- a/scripts/testv/stv514MC48c.wav +++ b/scripts/testv/stv514MC48c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6ca93376cae09017177a1a49e2d7d006f5bf61c4c94b9e466dedee6e03a45efb -size 2880130 +oid sha256:d2097dd80fa69f239689b06a62a44eb592bf2fe699e549347ae4567c1b690170 +size 2880044 diff --git a/scripts/testv/stv51MC48c.wav b/scripts/testv/stv51MC48c.wav index 7c98cc83d3..e5f4bae7d4 100644 --- a/scripts/testv/stv51MC48c.wav +++ b/scripts/testv/stv51MC48c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:377961aefebcea8dd87e5a63af8c17f6b0db588f328cee9ae6db5be95e23cd05 -size 11520130 +oid sha256:daccececb4336a7f2492185767d108dbc5594a7d6e2841d861f43ef44437a377 +size 11520044 diff --git a/scripts/testv/stv714MC48c.wav b/scripts/testv/stv714MC48c.wav index 53c36268d0..cabcb790b0 100644 --- a/scripts/testv/stv714MC48c.wav +++ b/scripts/testv/stv714MC48c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6fa104a2015be912ea80d015ddb0a42774edea137bc9427954767efcae5e0b1c -size 3456130 +oid sha256:da62e19b166089efae2f22e68d76b82d3295d15785a4967465a04bc1c75b0462 +size 3456044 diff --git a/scripts/testv/stv71MC48c.wav b/scripts/testv/stv71MC48c.wav index 2a0b012ab0..72b3337e59 100644 --- a/scripts/testv/stv71MC48c.wav +++ b/scripts/testv/stv71MC48c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d0ac38ddb16b2ce9cbca27965c5aedaf1af857a6fdce340bc01322794311e92d -size 2304130 +oid sha256:3fb15d0c109c41d5e629b2e15a47be72ca8d209919ac39f79a7947e9cd2e5e02 +size 2304044 diff --git a/scripts/testv/stv8c.wav b/scripts/testv/stv8c.wav index 0ee4ea2b7a..5f3b0ed4d9 100644 --- a/scripts/testv/stv8c.wav +++ b/scripts/testv/stv8c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8659d17c088387b59f3a02e698c5dd32746f541493d68be1883a217f4d1b08cf -size 320108 +oid sha256:722081dcfaaee1c04254b0bde8436c73748a44f6760067907194a1ba24b199d7 +size 320046 diff --git a/scripts/testv/stv8n.wav b/scripts/testv/stv8n.wav index 66e042366e..2b35ec4dba 100644 --- a/scripts/testv/stv8n.wav +++ b/scripts/testv/stv8n.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d872103d81dcdf846105cdacdb33fc02cbae02104e2c77ff5ff6d985f409b81f -size 310508 +oid sha256:223e9f5353c49163803abedf97d557436d025f445fe9de4508c9559ca15b330b +size 310446 diff --git a/scripts/testv/stvFOA16c.wav b/scripts/testv/stvFOA16c.wav index 996ada1bcd..cb67e8b371 100644 --- a/scripts/testv/stvFOA16c.wav +++ b/scripts/testv/stvFOA16c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:30a766e574f03b20403b873443b837497a685c0c5ac28c5ac51c95ef226385fa -size 2560202 +oid sha256:6725a5d2647516071033f83f385dc7dfe4ff6719d493b1b682ec0274c1347e93 +size 2560116 diff --git a/scripts/testv/stvFOA32c.wav b/scripts/testv/stvFOA32c.wav index 3a681bfa80..661a97a3dc 100644 --- a/scripts/testv/stvFOA32c.wav +++ b/scripts/testv/stvFOA32c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:47176066fc373347564bc28ff56d8d9d52745ab7dd631ce4e051f81dff6908e5 -size 5120266 +oid sha256:273308e57de4c5f3ef2eeed164b0a9f34ba86ab05ca533ee5ee8a76528c01abe +size 5120180 diff --git a/scripts/testv/stvFOA48c.wav b/scripts/testv/stvFOA48c.wav index ade8e3343d..7ece23b084 100644 --- a/scripts/testv/stvFOA48c.wav +++ b/scripts/testv/stvFOA48c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9c5da22f3ab1bd9681fff74a77f8ff543f1565f93a5c573125db8820c267376f -size 7680330 +oid sha256:45a1dd6c4fe6802e98821657337b453d5dab2fe32089c675637b9d23cfe74c8d +size 7680244 diff --git a/scripts/testv/stvST16c.wav b/scripts/testv/stvST16c.wav index e46f2e6f5d..3fb9ec0b3b 100644 --- a/scripts/testv/stvST16c.wav +++ b/scripts/testv/stvST16c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:350c8b0d4c11d2e994158be287c07fda1eef6fd6f92aaf769a7f8529c88f16d0 -size 1280110 +oid sha256:11a2f5887fe2407df03128634188d8aef6d3f76b52db14a1f834dbb98b7dd52e +size 1280048 diff --git a/scripts/testv/stvST16n.wav b/scripts/testv/stvST16n.wav index 63afe4f14b..74c80dca93 100644 --- a/scripts/testv/stvST16n.wav +++ b/scripts/testv/stvST16n.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:40d28848ee6fc8442738662e5cda78473fb099314aab49440afcfd68286d280d -size 1241710 +oid sha256:60a8cfa5abf4e052840fea0054fec5331465149747fd7bc7eadab18b62d864f1 +size 1241648 diff --git a/scripts/testv/stvST32c.wav b/scripts/testv/stvST32c.wav index 876c0e558b..68a4a1fa33 100644 --- a/scripts/testv/stvST32c.wav +++ b/scripts/testv/stvST32c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:12737393e0bbcdb7b6d9d6dbef79984feac3ff5313daa97a6a8793d3e26099ba -size 2560106 +oid sha256:1182294e7c3ba44e854219698e6a3c209e24345ab2e5e4296fce38029324f374 +size 2560044 diff --git a/scripts/testv/stvST32n.wav b/scripts/testv/stvST32n.wav index 6d77c6892d..7da590907d 100644 --- a/scripts/testv/stvST32n.wav +++ b/scripts/testv/stvST32n.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3642b2bce81ea794457655886f56bca58fb0b1431ed7ac52f1a27f8388c75eb4 -size 2483306 +oid sha256:a6edbfd26681fa42f377891761ad79f97029a3380bc644e47bff1803c7904ff9 +size 2483244 diff --git a/scripts/testv/stvST48c.wav b/scripts/testv/stvST48c.wav index 250770d61f..df554e6521 100644 --- a/scripts/testv/stvST48c.wav +++ b/scripts/testv/stvST48c.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cc028e71c94b43068dcc2c7557277ad1989ee20e7a6d8dd6fd30d70d384d56b3 -size 3840106 +oid sha256:40929eb3eb266ed78c16daa2a9c987745fe8e005a577f2dd81264ffda845c118 +size 3840044 diff --git a/scripts/testv/stvST48n.wav b/scripts/testv/stvST48n.wav index 8dd24e4ca0..cb2d8c4fc3 100644 --- a/scripts/testv/stvST48n.wav +++ b/scripts/testv/stvST48n.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ac4262d08b5e45e8ce8da4456740d1e7224aa25b0e3e3088381cb91436cec31f -size 3724906 +oid sha256:6074a3a3b88c7868f62c9bcf7df56e4a8fd25ffed059886846220efc4fbc0992 +size 3724844 diff --git a/scripts/trajectories/azi+2-ele+2-every-100-frames-Euler.csv b/scripts/trajectories/azi_plus_2-ele_plus_2-every-100-frames-Euler.csv similarity index 100% rename from scripts/trajectories/azi+2-ele+2-every-100-frames-Euler.csv rename to scripts/trajectories/azi_plus_2-ele_plus_2-every-100-frames-Euler.csv diff --git a/scripts/trajectories/azi+2-ele+2-every-100-frames.csv b/scripts/trajectories/azi_plus_2-ele_plus_2-every-100-frames.csv similarity index 100% rename from scripts/trajectories/azi+2-ele+2-every-100-frames.csv rename to scripts/trajectories/azi_plus_2-ele_plus_2-every-100-frames.csv diff --git a/scripts/trajectories/azi_plus_2-ele_plus_2-every-25-rows.csv b/scripts/trajectories/azi_plus_2-ele_plus_2-every-25-rows.csv new file mode 100644 index 0000000000..4d8eb8d47b --- /dev/null +++ b/scripts/trajectories/azi_plus_2-ele_plus_2-every-25-rows.csv @@ -0,0 +1,3000 @@ + 0.653281, -0.270598, 0.270598, 0.653281 + 0.653281, -0.270598, 0.270598, 0.653281 + 0.653281, -0.270598, 0.270598, 0.653281 + 0.653281, -0.270598, 0.270598, 0.653281 + 0.653281, -0.270598, 0.270598, 0.653281 + 0.653281, -0.270598, 0.270598, 0.653281 + 0.653281, -0.270598, 0.270598, 0.653281 + 0.653281, -0.270598, 0.270598, 0.653281 + 0.653281, -0.270598, 0.270598, 0.653281 + 0.653281, -0.270598, 0.270598, 0.653281 + 0.653281, -0.270598, 0.270598, 0.653281 + 0.653281, -0.270598, 0.270598, 0.653281 + 0.653281, -0.270598, 0.270598, 0.653281 + 0.653281, -0.270598, 0.270598, 0.653281 + 0.653281, -0.270598, 0.270598, 0.653281 + 0.653281, -0.270598, 0.270598, 0.653281 + 0.653281, -0.270598, 0.270598, 0.653281 + 0.653281, -0.270598, 0.270598, 0.653281 + 0.653281, -0.270598, 0.270598, 0.653281 + 0.653281, -0.270598, 0.270598, 0.653281 + 0.653281, -0.270598, 0.270598, 0.653281 + 0.653281, -0.270598, 0.270598, 0.653281 + 0.653281, -0.270598, 0.270598, 0.653281 + 0.653281, -0.270598, 0.270598, 0.653281 + 0.653281, -0.270598, 0.270598, 0.653281 + 0.634602, -0.292582, 0.282543, 0.657150 + 0.634602, -0.292582, 0.282543, 0.657150 + 0.634602, -0.292582, 0.282543, 0.657150 + 0.634602, -0.292582, 0.282543, 0.657150 + 0.634602, -0.292582, 0.282543, 0.657150 + 0.634602, -0.292582, 0.282543, 0.657150 + 0.634602, -0.292582, 0.282543, 0.657150 + 0.634602, -0.292582, 0.282543, 0.657150 + 0.634602, -0.292582, 0.282543, 0.657150 + 0.634602, -0.292582, 0.282543, 0.657150 + 0.634602, -0.292582, 0.282543, 0.657150 + 0.634602, -0.292582, 0.282543, 0.657150 + 0.634602, -0.292582, 0.282543, 0.657150 + 0.634602, -0.292582, 0.282543, 0.657150 + 0.634602, -0.292582, 0.282543, 0.657150 + 0.634602, -0.292582, 0.282543, 0.657150 + 0.634602, -0.292582, 0.282543, 0.657150 + 0.634602, -0.292582, 0.282543, 0.657150 + 0.634602, -0.292582, 0.282543, 0.657150 + 0.634602, -0.292582, 0.282543, 0.657150 + 0.634602, -0.292582, 0.282543, 0.657150 + 0.634602, -0.292582, 0.282543, 0.657150 + 0.634602, -0.292582, 0.282543, 0.657150 + 0.634602, -0.292582, 0.282543, 0.657150 + 0.634602, -0.292582, 0.282543, 0.657150 + 0.615562, -0.314856, 0.293608, 0.660109 + 0.615562, -0.314856, 0.293608, 0.660109 + 0.615562, -0.314856, 0.293608, 0.660109 + 0.615562, -0.314856, 0.293608, 0.660109 + 0.615562, -0.314856, 0.293608, 0.660109 + 0.615562, -0.314856, 0.293608, 0.660109 + 0.615562, -0.314856, 0.293608, 0.660109 + 0.615562, -0.314856, 0.293608, 0.660109 + 0.615562, -0.314856, 0.293608, 0.660109 + 0.615562, -0.314856, 0.293608, 0.660109 + 0.615562, -0.314856, 0.293608, 0.660109 + 0.615562, -0.314856, 0.293608, 0.660109 + 0.615562, -0.314856, 0.293608, 0.660109 + 0.615562, -0.314856, 0.293608, 0.660109 + 0.615562, -0.314856, 0.293608, 0.660109 + 0.615562, -0.314856, 0.293608, 0.660109 + 0.615562, -0.314856, 0.293608, 0.660109 + 0.615562, -0.314856, 0.293608, 0.660109 + 0.615562, -0.314856, 0.293608, 0.660109 + 0.615562, -0.314856, 0.293608, 0.660109 + 0.615562, -0.314856, 0.293608, 0.660109 + 0.615562, -0.314856, 0.293608, 0.660109 + 0.615562, -0.314856, 0.293608, 0.660109 + 0.615562, -0.314856, 0.293608, 0.660109 + 0.615562, -0.314856, 0.293608, 0.660109 + 0.596200, -0.337381, 0.303779, 0.662147 + 0.596200, -0.337381, 0.303779, 0.662147 + 0.596200, -0.337381, 0.303779, 0.662147 + 0.596200, -0.337381, 0.303779, 0.662147 + 0.596200, -0.337381, 0.303779, 0.662147 + 0.596200, -0.337381, 0.303779, 0.662147 + 0.596200, -0.337381, 0.303779, 0.662147 + 0.596200, -0.337381, 0.303779, 0.662147 + 0.596200, -0.337381, 0.303779, 0.662147 + 0.596200, -0.337381, 0.303779, 0.662147 + 0.596200, -0.337381, 0.303779, 0.662147 + 0.596200, -0.337381, 0.303779, 0.662147 + 0.596200, -0.337381, 0.303779, 0.662147 + 0.596200, -0.337381, 0.303779, 0.662147 + 0.596200, -0.337381, 0.303779, 0.662147 + 0.596200, -0.337381, 0.303779, 0.662147 + 0.596200, -0.337381, 0.303779, 0.662147 + 0.596200, -0.337381, 0.303779, 0.662147 + 0.596200, -0.337381, 0.303779, 0.662147 + 0.596200, -0.337381, 0.303779, 0.662147 + 0.596200, -0.337381, 0.303779, 0.662147 + 0.596200, -0.337381, 0.303779, 0.662147 + 0.596200, -0.337381, 0.303779, 0.662147 + 0.596200, -0.337381, 0.303779, 0.662147 + 0.596200, -0.337381, 0.303779, 0.662147 + 0.576556, -0.360116, 0.313044, 0.663252 + 0.576556, -0.360116, 0.313044, 0.663252 + 0.576556, -0.360116, 0.313044, 0.663252 + 0.576556, -0.360116, 0.313044, 0.663252 + 0.576556, -0.360116, 0.313044, 0.663252 + 0.576556, -0.360116, 0.313044, 0.663252 + 0.576556, -0.360116, 0.313044, 0.663252 + 0.576556, -0.360116, 0.313044, 0.663252 + 0.576556, -0.360116, 0.313044, 0.663252 + 0.576556, -0.360116, 0.313044, 0.663252 + 0.576556, -0.360116, 0.313044, 0.663252 + 0.576556, -0.360116, 0.313044, 0.663252 + 0.576556, -0.360116, 0.313044, 0.663252 + 0.576556, -0.360116, 0.313044, 0.663252 + 0.576556, -0.360116, 0.313044, 0.663252 + 0.576556, -0.360116, 0.313044, 0.663252 + 0.576556, -0.360116, 0.313044, 0.663252 + 0.576556, -0.360116, 0.313044, 0.663252 + 0.576556, -0.360116, 0.313044, 0.663252 + 0.576556, -0.360116, 0.313044, 0.663252 + 0.576556, -0.360116, 0.313044, 0.663252 + 0.576556, -0.360116, 0.313044, 0.663252 + 0.576556, -0.360116, 0.313044, 0.663252 + 0.576556, -0.360116, 0.313044, 0.663252 + 0.576556, -0.360116, 0.313044, 0.663252 + 0.556670, -0.383022, 0.321394, 0.663414 + 0.556670, -0.383022, 0.321394, 0.663414 + 0.556670, -0.383022, 0.321394, 0.663414 + 0.556670, -0.383022, 0.321394, 0.663414 + 0.556670, -0.383022, 0.321394, 0.663414 + 0.556670, -0.383022, 0.321394, 0.663414 + 0.556670, -0.383022, 0.321394, 0.663414 + 0.556670, -0.383022, 0.321394, 0.663414 + 0.556670, -0.383022, 0.321394, 0.663414 + 0.556670, -0.383022, 0.321394, 0.663414 + 0.556670, -0.383022, 0.321394, 0.663414 + 0.556670, -0.383022, 0.321394, 0.663414 + 0.556670, -0.383022, 0.321394, 0.663414 + 0.556670, -0.383022, 0.321394, 0.663414 + 0.556670, -0.383022, 0.321394, 0.663414 + 0.556670, -0.383022, 0.321394, 0.663414 + 0.556670, -0.383022, 0.321394, 0.663414 + 0.556670, -0.383022, 0.321394, 0.663414 + 0.556670, -0.383022, 0.321394, 0.663414 + 0.556670, -0.383022, 0.321394, 0.663414 + 0.556670, -0.383022, 0.321394, 0.663414 + 0.556670, -0.383022, 0.321394, 0.663414 + 0.556670, -0.383022, 0.321394, 0.663414 + 0.556670, -0.383022, 0.321394, 0.663414 + 0.556670, -0.383022, 0.321394, 0.663414 + 0.536584, -0.406058, 0.328819, 0.662626 + 0.536584, -0.406058, 0.328819, 0.662626 + 0.536584, -0.406058, 0.328819, 0.662626 + 0.536584, -0.406058, 0.328819, 0.662626 + 0.536584, -0.406058, 0.328819, 0.662626 + 0.536584, -0.406058, 0.328819, 0.662626 + 0.536584, -0.406058, 0.328819, 0.662626 + 0.536584, -0.406058, 0.328819, 0.662626 + 0.536584, -0.406058, 0.328819, 0.662626 + 0.536584, -0.406058, 0.328819, 0.662626 + 0.536584, -0.406058, 0.328819, 0.662626 + 0.536584, -0.406058, 0.328819, 0.662626 + 0.536584, -0.406058, 0.328819, 0.662626 + 0.536584, -0.406058, 0.328819, 0.662626 + 0.536584, -0.406058, 0.328819, 0.662626 + 0.536584, -0.406058, 0.328819, 0.662626 + 0.536584, -0.406058, 0.328819, 0.662626 + 0.536584, -0.406058, 0.328819, 0.662626 + 0.536584, -0.406058, 0.328819, 0.662626 + 0.536584, -0.406058, 0.328819, 0.662626 + 0.536584, -0.406058, 0.328819, 0.662626 + 0.536584, -0.406058, 0.328819, 0.662626 + 0.536584, -0.406058, 0.328819, 0.662626 + 0.536584, -0.406058, 0.328819, 0.662626 + 0.536584, -0.406058, 0.328819, 0.662626 + 0.516337, -0.429181, 0.335313, 0.660881 + 0.516337, -0.429181, 0.335313, 0.660881 + 0.516337, -0.429181, 0.335313, 0.660881 + 0.516337, -0.429181, 0.335313, 0.660881 + 0.516337, -0.429181, 0.335313, 0.660881 + 0.516337, -0.429181, 0.335313, 0.660881 + 0.516337, -0.429181, 0.335313, 0.660881 + 0.516337, -0.429181, 0.335313, 0.660881 + 0.516337, -0.429181, 0.335313, 0.660881 + 0.516337, -0.429181, 0.335313, 0.660881 + 0.516337, -0.429181, 0.335313, 0.660881 + 0.516337, -0.429181, 0.335313, 0.660881 + 0.516337, -0.429181, 0.335313, 0.660881 + 0.516337, -0.429181, 0.335313, 0.660881 + 0.516337, -0.429181, 0.335313, 0.660881 + 0.516337, -0.429181, 0.335313, 0.660881 + 0.516337, -0.429181, 0.335313, 0.660881 + 0.516337, -0.429181, 0.335313, 0.660881 + 0.516337, -0.429181, 0.335313, 0.660881 + 0.516337, -0.429181, 0.335313, 0.660881 + 0.516337, -0.429181, 0.335313, 0.660881 + 0.516337, -0.429181, 0.335313, 0.660881 + 0.516337, -0.429181, 0.335313, 0.660881 + 0.516337, -0.429181, 0.335313, 0.660881 + 0.516337, -0.429181, 0.335313, 0.660881 + 0.495972, -0.452352, 0.340872, 0.658176 + 0.495972, -0.452352, 0.340872, 0.658176 + 0.495972, -0.452352, 0.340872, 0.658176 + 0.495972, -0.452352, 0.340872, 0.658176 + 0.495972, -0.452352, 0.340872, 0.658176 + 0.495972, -0.452352, 0.340872, 0.658176 + 0.495972, -0.452352, 0.340872, 0.658176 + 0.495972, -0.452352, 0.340872, 0.658176 + 0.495972, -0.452352, 0.340872, 0.658176 + 0.495972, -0.452352, 0.340872, 0.658176 + 0.495972, -0.452352, 0.340872, 0.658176 + 0.495972, -0.452352, 0.340872, 0.658176 + 0.495972, -0.452352, 0.340872, 0.658176 + 0.495972, -0.452352, 0.340872, 0.658176 + 0.495972, -0.452352, 0.340872, 0.658176 + 0.495972, -0.452352, 0.340872, 0.658176 + 0.495972, -0.452352, 0.340872, 0.658176 + 0.495972, -0.452352, 0.340872, 0.658176 + 0.495972, -0.452352, 0.340872, 0.658176 + 0.495972, -0.452352, 0.340872, 0.658176 + 0.495972, -0.452352, 0.340872, 0.658176 + 0.495972, -0.452352, 0.340872, 0.658176 + 0.495972, -0.452352, 0.340872, 0.658176 + 0.495972, -0.452352, 0.340872, 0.658176 + 0.495972, -0.452352, 0.340872, 0.658176 + 0.475528, -0.475528, 0.345492, 0.654508 + 0.475528, -0.475528, 0.345492, 0.654508 + 0.475528, -0.475528, 0.345492, 0.654508 + 0.475528, -0.475528, 0.345492, 0.654508 + 0.475528, -0.475528, 0.345492, 0.654508 + 0.475528, -0.475528, 0.345492, 0.654508 + 0.475528, -0.475528, 0.345492, 0.654508 + 0.475528, -0.475528, 0.345492, 0.654508 + 0.475528, -0.475528, 0.345492, 0.654508 + 0.475528, -0.475528, 0.345492, 0.654508 + 0.475528, -0.475528, 0.345492, 0.654508 + 0.475528, -0.475528, 0.345492, 0.654508 + 0.475528, -0.475528, 0.345492, 0.654508 + 0.475528, -0.475528, 0.345492, 0.654508 + 0.475528, -0.475528, 0.345492, 0.654508 + 0.475528, -0.475528, 0.345492, 0.654508 + 0.475528, -0.475528, 0.345492, 0.654508 + 0.475528, -0.475528, 0.345492, 0.654508 + 0.475528, -0.475528, 0.345492, 0.654508 + 0.475528, -0.475528, 0.345492, 0.654508 + 0.475528, -0.475528, 0.345492, 0.654508 + 0.475528, -0.475528, 0.345492, 0.654508 + 0.475528, -0.475528, 0.345492, 0.654508 + 0.475528, -0.475528, 0.345492, 0.654508 + 0.475528, -0.475528, 0.345492, 0.654508 + 0.455049, -0.498668, 0.349171, 0.649877 + 0.455049, -0.498668, 0.349171, 0.649877 + 0.455049, -0.498668, 0.349171, 0.649877 + 0.455049, -0.498668, 0.349171, 0.649877 + 0.455049, -0.498668, 0.349171, 0.649877 + 0.455049, -0.498668, 0.349171, 0.649877 + 0.455049, -0.498668, 0.349171, 0.649877 + 0.455049, -0.498668, 0.349171, 0.649877 + 0.455049, -0.498668, 0.349171, 0.649877 + 0.455049, -0.498668, 0.349171, 0.649877 + 0.455049, -0.498668, 0.349171, 0.649877 + 0.455049, -0.498668, 0.349171, 0.649877 + 0.455049, -0.498668, 0.349171, 0.649877 + 0.455049, -0.498668, 0.349171, 0.649877 + 0.455049, -0.498668, 0.349171, 0.649877 + 0.455049, -0.498668, 0.349171, 0.649877 + 0.455049, -0.498668, 0.349171, 0.649877 + 0.455049, -0.498668, 0.349171, 0.649877 + 0.455049, -0.498668, 0.349171, 0.649877 + 0.455049, -0.498668, 0.349171, 0.649877 + 0.455049, -0.498668, 0.349171, 0.649877 + 0.455049, -0.498668, 0.349171, 0.649877 + 0.455049, -0.498668, 0.349171, 0.649877 + 0.455049, -0.498668, 0.349171, 0.649877 + 0.455049, -0.498668, 0.349171, 0.649877 + 0.434575, -0.521730, 0.351911, 0.644283 + 0.434575, -0.521730, 0.351911, 0.644283 + 0.434575, -0.521730, 0.351911, 0.644283 + 0.434575, -0.521730, 0.351911, 0.644283 + 0.434575, -0.521730, 0.351911, 0.644283 + 0.434575, -0.521730, 0.351911, 0.644283 + 0.434575, -0.521730, 0.351911, 0.644283 + 0.434575, -0.521730, 0.351911, 0.644283 + 0.434575, -0.521730, 0.351911, 0.644283 + 0.434575, -0.521730, 0.351911, 0.644283 + 0.434575, -0.521730, 0.351911, 0.644283 + 0.434575, -0.521730, 0.351911, 0.644283 + 0.434575, -0.521730, 0.351911, 0.644283 + 0.434575, -0.521730, 0.351911, 0.644283 + 0.434575, -0.521730, 0.351911, 0.644283 + 0.434575, -0.521730, 0.351911, 0.644283 + 0.434575, -0.521730, 0.351911, 0.644283 + 0.434575, -0.521730, 0.351911, 0.644283 + 0.434575, -0.521730, 0.351911, 0.644283 + 0.434575, -0.521730, 0.351911, 0.644283 + 0.434575, -0.521730, 0.351911, 0.644283 + 0.434575, -0.521730, 0.351911, 0.644283 + 0.434575, -0.521730, 0.351911, 0.644283 + 0.434575, -0.521730, 0.351911, 0.644283 + 0.434575, -0.521730, 0.351911, 0.644283 + 0.414147, -0.544673, 0.353715, 0.637730 + 0.414147, -0.544673, 0.353715, 0.637730 + 0.414147, -0.544673, 0.353715, 0.637730 + 0.414147, -0.544673, 0.353715, 0.637730 + 0.414147, -0.544673, 0.353715, 0.637730 + 0.414147, -0.544673, 0.353715, 0.637730 + 0.414147, -0.544673, 0.353715, 0.637730 + 0.414147, -0.544673, 0.353715, 0.637730 + 0.414147, -0.544673, 0.353715, 0.637730 + 0.414147, -0.544673, 0.353715, 0.637730 + 0.414147, -0.544673, 0.353715, 0.637730 + 0.414147, -0.544673, 0.353715, 0.637730 + 0.414147, -0.544673, 0.353715, 0.637730 + 0.414147, -0.544673, 0.353715, 0.637730 + 0.414147, -0.544673, 0.353715, 0.637730 + 0.414147, -0.544673, 0.353715, 0.637730 + 0.414147, -0.544673, 0.353715, 0.637730 + 0.414147, -0.544673, 0.353715, 0.637730 + 0.414147, -0.544673, 0.353715, 0.637730 + 0.414147, -0.544673, 0.353715, 0.637730 + 0.414147, -0.544673, 0.353715, 0.637730 + 0.414147, -0.544673, 0.353715, 0.637730 + 0.414147, -0.544673, 0.353715, 0.637730 + 0.414147, -0.544673, 0.353715, 0.637730 + 0.414147, -0.544673, 0.353715, 0.637730 + 0.393807, -0.567455, 0.354585, 0.630223 + 0.393807, -0.567455, 0.354585, 0.630223 + 0.393807, -0.567455, 0.354585, 0.630223 + 0.393807, -0.567455, 0.354585, 0.630223 + 0.393807, -0.567455, 0.354585, 0.630223 + 0.393807, -0.567455, 0.354585, 0.630223 + 0.393807, -0.567455, 0.354585, 0.630223 + 0.393807, -0.567455, 0.354585, 0.630223 + 0.393807, -0.567455, 0.354585, 0.630223 + 0.393807, -0.567455, 0.354585, 0.630223 + 0.393807, -0.567455, 0.354585, 0.630223 + 0.393807, -0.567455, 0.354585, 0.630223 + 0.393807, -0.567455, 0.354585, 0.630223 + 0.393807, -0.567455, 0.354585, 0.630223 + 0.393807, -0.567455, 0.354585, 0.630223 + 0.393807, -0.567455, 0.354585, 0.630223 + 0.393807, -0.567455, 0.354585, 0.630223 + 0.393807, -0.567455, 0.354585, 0.630223 + 0.393807, -0.567455, 0.354585, 0.630223 + 0.393807, -0.567455, 0.354585, 0.630223 + 0.393807, -0.567455, 0.354585, 0.630223 + 0.393807, -0.567455, 0.354585, 0.630223 + 0.393807, -0.567455, 0.354585, 0.630223 + 0.393807, -0.567455, 0.354585, 0.630223 + 0.393807, -0.567455, 0.354585, 0.630223 + 0.373595, -0.590035, 0.354529, 0.621767 + 0.373595, -0.590035, 0.354529, 0.621767 + 0.373595, -0.590035, 0.354529, 0.621767 + 0.373595, -0.590035, 0.354529, 0.621767 + 0.373595, -0.590035, 0.354529, 0.621767 + 0.373595, -0.590035, 0.354529, 0.621767 + 0.373595, -0.590035, 0.354529, 0.621767 + 0.373595, -0.590035, 0.354529, 0.621767 + 0.373595, -0.590035, 0.354529, 0.621767 + 0.373595, -0.590035, 0.354529, 0.621767 + 0.373595, -0.590035, 0.354529, 0.621767 + 0.373595, -0.590035, 0.354529, 0.621767 + 0.373595, -0.590035, 0.354529, 0.621767 + 0.373595, -0.590035, 0.354529, 0.621767 + 0.373595, -0.590035, 0.354529, 0.621767 + 0.373595, -0.590035, 0.354529, 0.621767 + 0.373595, -0.590035, 0.354529, 0.621767 + 0.373595, -0.590035, 0.354529, 0.621767 + 0.373595, -0.590035, 0.354529, 0.621767 + 0.373595, -0.590035, 0.354529, 0.621767 + 0.373595, -0.590035, 0.354529, 0.621767 + 0.373595, -0.590035, 0.354529, 0.621767 + 0.373595, -0.590035, 0.354529, 0.621767 + 0.373595, -0.590035, 0.354529, 0.621767 + 0.373595, -0.590035, 0.354529, 0.621767 + 0.353553, -0.612372, 0.353553, 0.612372 + 0.353553, -0.612372, 0.353553, 0.612372 + 0.353553, -0.612372, 0.353553, 0.612372 + 0.353553, -0.612372, 0.353553, 0.612372 + 0.353553, -0.612372, 0.353553, 0.612372 + 0.353553, -0.612372, 0.353553, 0.612372 + 0.353553, -0.612372, 0.353553, 0.612372 + 0.353553, -0.612372, 0.353553, 0.612372 + 0.353553, -0.612372, 0.353553, 0.612372 + 0.353553, -0.612372, 0.353553, 0.612372 + 0.353553, -0.612372, 0.353553, 0.612372 + 0.353553, -0.612372, 0.353553, 0.612372 + 0.353553, -0.612372, 0.353553, 0.612372 + 0.353553, -0.612372, 0.353553, 0.612372 + 0.353553, -0.612372, 0.353553, 0.612372 + 0.353553, -0.612372, 0.353553, 0.612372 + 0.353553, -0.612372, 0.353553, 0.612372 + 0.353553, -0.612372, 0.353553, 0.612372 + 0.353553, -0.612372, 0.353553, 0.612372 + 0.353553, -0.612372, 0.353553, 0.612372 + 0.353553, -0.612372, 0.353553, 0.612372 + 0.353553, -0.612372, 0.353553, 0.612372 + 0.353553, -0.612372, 0.353553, 0.612372 + 0.353553, -0.612372, 0.353553, 0.612372 + 0.353553, -0.612372, 0.353553, 0.612372 + 0.333721, -0.634427, 0.351668, 0.602048 + 0.333721, -0.634427, 0.351668, 0.602048 + 0.333721, -0.634427, 0.351668, 0.602048 + 0.333721, -0.634427, 0.351668, 0.602048 + 0.333721, -0.634427, 0.351668, 0.602048 + 0.333721, -0.634427, 0.351668, 0.602048 + 0.333721, -0.634427, 0.351668, 0.602048 + 0.333721, -0.634427, 0.351668, 0.602048 + 0.333721, -0.634427, 0.351668, 0.602048 + 0.333721, -0.634427, 0.351668, 0.602048 + 0.333721, -0.634427, 0.351668, 0.602048 + 0.333721, -0.634427, 0.351668, 0.602048 + 0.333721, -0.634427, 0.351668, 0.602048 + 0.333721, -0.634427, 0.351668, 0.602048 + 0.333721, -0.634427, 0.351668, 0.602048 + 0.333721, -0.634427, 0.351668, 0.602048 + 0.333721, -0.634427, 0.351668, 0.602048 + 0.333721, -0.634427, 0.351668, 0.602048 + 0.333721, -0.634427, 0.351668, 0.602048 + 0.333721, -0.634427, 0.351668, 0.602048 + 0.333721, -0.634427, 0.351668, 0.602048 + 0.333721, -0.634427, 0.351668, 0.602048 + 0.333721, -0.634427, 0.351668, 0.602048 + 0.333721, -0.634427, 0.351668, 0.602048 + 0.333721, -0.634427, 0.351668, 0.602048 + 0.314138, -0.656158, 0.348885, 0.590807 + 0.314138, -0.656158, 0.348885, 0.590807 + 0.314138, -0.656158, 0.348885, 0.590807 + 0.314138, -0.656158, 0.348885, 0.590807 + 0.314138, -0.656158, 0.348885, 0.590807 + 0.314138, -0.656158, 0.348885, 0.590807 + 0.314138, -0.656158, 0.348885, 0.590807 + 0.314138, -0.656158, 0.348885, 0.590807 + 0.314138, -0.656158, 0.348885, 0.590807 + 0.314138, -0.656158, 0.348885, 0.590807 + 0.314138, -0.656158, 0.348885, 0.590807 + 0.314138, -0.656158, 0.348885, 0.590807 + 0.314138, -0.656158, 0.348885, 0.590807 + 0.314138, -0.656158, 0.348885, 0.590807 + 0.314138, -0.656158, 0.348885, 0.590807 + 0.314138, -0.656158, 0.348885, 0.590807 + 0.314138, -0.656158, 0.348885, 0.590807 + 0.314138, -0.656158, 0.348885, 0.590807 + 0.314138, -0.656158, 0.348885, 0.590807 + 0.314138, -0.656158, 0.348885, 0.590807 + 0.314138, -0.656158, 0.348885, 0.590807 + 0.314138, -0.656158, 0.348885, 0.590807 + 0.314138, -0.656158, 0.348885, 0.590807 + 0.314138, -0.656158, 0.348885, 0.590807 + 0.314138, -0.656158, 0.348885, 0.590807 + 0.294843, -0.677527, 0.345217, 0.578662 + 0.294843, -0.677527, 0.345217, 0.578662 + 0.294843, -0.677527, 0.345217, 0.578662 + 0.294843, -0.677527, 0.345217, 0.578662 + 0.294843, -0.677527, 0.345217, 0.578662 + 0.294843, -0.677527, 0.345217, 0.578662 + 0.294843, -0.677527, 0.345217, 0.578662 + 0.294843, -0.677527, 0.345217, 0.578662 + 0.294843, -0.677527, 0.345217, 0.578662 + 0.294843, -0.677527, 0.345217, 0.578662 + 0.294843, -0.677527, 0.345217, 0.578662 + 0.294843, -0.677527, 0.345217, 0.578662 + 0.294843, -0.677527, 0.345217, 0.578662 + 0.294843, -0.677527, 0.345217, 0.578662 + 0.294843, -0.677527, 0.345217, 0.578662 + 0.294843, -0.677527, 0.345217, 0.578662 + 0.294843, -0.677527, 0.345217, 0.578662 + 0.294843, -0.677527, 0.345217, 0.578662 + 0.294843, -0.677527, 0.345217, 0.578662 + 0.294843, -0.677527, 0.345217, 0.578662 + 0.294843, -0.677527, 0.345217, 0.578662 + 0.294843, -0.677527, 0.345217, 0.578662 + 0.294843, -0.677527, 0.345217, 0.578662 + 0.294843, -0.677527, 0.345217, 0.578662 + 0.294843, -0.677527, 0.345217, 0.578662 + 0.275876, -0.698494, 0.340678, 0.565629 + 0.275876, -0.698494, 0.340678, 0.565629 + 0.275876, -0.698494, 0.340678, 0.565629 + 0.275876, -0.698494, 0.340678, 0.565629 + 0.275876, -0.698494, 0.340678, 0.565629 + 0.275876, -0.698494, 0.340678, 0.565629 + 0.275876, -0.698494, 0.340678, 0.565629 + 0.275876, -0.698494, 0.340678, 0.565629 + 0.275876, -0.698494, 0.340678, 0.565629 + 0.275876, -0.698494, 0.340678, 0.565629 + 0.275876, -0.698494, 0.340678, 0.565629 + 0.275876, -0.698494, 0.340678, 0.565629 + 0.275876, -0.698494, 0.340678, 0.565629 + 0.275876, -0.698494, 0.340678, 0.565629 + 0.275876, -0.698494, 0.340678, 0.565629 + 0.275876, -0.698494, 0.340678, 0.565629 + 0.275876, -0.698494, 0.340678, 0.565629 + 0.275876, -0.698494, 0.340678, 0.565629 + 0.275876, -0.698494, 0.340678, 0.565629 + 0.275876, -0.698494, 0.340678, 0.565629 + 0.275876, -0.698494, 0.340678, 0.565629 + 0.275876, -0.698494, 0.340678, 0.565629 + 0.275876, -0.698494, 0.340678, 0.565629 + 0.275876, -0.698494, 0.340678, 0.565629 + 0.275876, -0.698494, 0.340678, 0.565629 + 0.257274, -0.719022, 0.335286, 0.551725 + 0.257274, -0.719022, 0.335286, 0.551725 + 0.257274, -0.719022, 0.335286, 0.551725 + 0.257274, -0.719022, 0.335286, 0.551725 + 0.257274, -0.719022, 0.335286, 0.551725 + 0.257274, -0.719022, 0.335286, 0.551725 + 0.257274, -0.719022, 0.335286, 0.551725 + 0.257274, -0.719022, 0.335286, 0.551725 + 0.257274, -0.719022, 0.335286, 0.551725 + 0.257274, -0.719022, 0.335286, 0.551725 + 0.257274, -0.719022, 0.335286, 0.551725 + 0.257274, -0.719022, 0.335286, 0.551725 + 0.257274, -0.719022, 0.335286, 0.551725 + 0.257274, -0.719022, 0.335286, 0.551725 + 0.257274, -0.719022, 0.335286, 0.551725 + 0.257274, -0.719022, 0.335286, 0.551725 + 0.257274, -0.719022, 0.335286, 0.551725 + 0.257274, -0.719022, 0.335286, 0.551725 + 0.257274, -0.719022, 0.335286, 0.551725 + 0.257274, -0.719022, 0.335286, 0.551725 + 0.257274, -0.719022, 0.335286, 0.551725 + 0.257274, -0.719022, 0.335286, 0.551725 + 0.257274, -0.719022, 0.335286, 0.551725 + 0.257274, -0.719022, 0.335286, 0.551725 + 0.257274, -0.719022, 0.335286, 0.551725 + 0.239074, -0.739074, 0.329057, 0.536969 + 0.239074, -0.739074, 0.329057, 0.536969 + 0.239074, -0.739074, 0.329057, 0.536969 + 0.239074, -0.739074, 0.329057, 0.536969 + 0.239074, -0.739074, 0.329057, 0.536969 + 0.239074, -0.739074, 0.329057, 0.536969 + 0.239074, -0.739074, 0.329057, 0.536969 + 0.239074, -0.739074, 0.329057, 0.536969 + 0.239074, -0.739074, 0.329057, 0.536969 + 0.239074, -0.739074, 0.329057, 0.536969 + 0.239074, -0.739074, 0.329057, 0.536969 + 0.239074, -0.739074, 0.329057, 0.536969 + 0.239074, -0.739074, 0.329057, 0.536969 + 0.239074, -0.739074, 0.329057, 0.536969 + 0.239074, -0.739074, 0.329057, 0.536969 + 0.239074, -0.739074, 0.329057, 0.536969 + 0.239074, -0.739074, 0.329057, 0.536969 + 0.239074, -0.739074, 0.329057, 0.536969 + 0.239074, -0.739074, 0.329057, 0.536969 + 0.239074, -0.739074, 0.329057, 0.536969 + 0.239074, -0.739074, 0.329057, 0.536969 + 0.239074, -0.739074, 0.329057, 0.536969 + 0.239074, -0.739074, 0.329057, 0.536969 + 0.239074, -0.739074, 0.329057, 0.536969 + 0.239074, -0.739074, 0.329057, 0.536969 + 0.221313, -0.758612, 0.322012, 0.521380 + 0.221313, -0.758612, 0.322012, 0.521380 + 0.221313, -0.758612, 0.322012, 0.521380 + 0.221313, -0.758612, 0.322012, 0.521380 + 0.221313, -0.758612, 0.322012, 0.521380 + 0.221313, -0.758612, 0.322012, 0.521380 + 0.221313, -0.758612, 0.322012, 0.521380 + 0.221313, -0.758612, 0.322012, 0.521380 + 0.221313, -0.758612, 0.322012, 0.521380 + 0.221313, -0.758612, 0.322012, 0.521380 + 0.221313, -0.758612, 0.322012, 0.521380 + 0.221313, -0.758612, 0.322012, 0.521380 + 0.221313, -0.758612, 0.322012, 0.521380 + 0.221313, -0.758612, 0.322012, 0.521380 + 0.221313, -0.758612, 0.322012, 0.521380 + 0.221313, -0.758612, 0.322012, 0.521380 + 0.221313, -0.758612, 0.322012, 0.521380 + 0.221313, -0.758612, 0.322012, 0.521380 + 0.221313, -0.758612, 0.322012, 0.521380 + 0.221313, -0.758612, 0.322012, 0.521380 + 0.221313, -0.758612, 0.322012, 0.521380 + 0.221313, -0.758612, 0.322012, 0.521380 + 0.221313, -0.758612, 0.322012, 0.521380 + 0.221313, -0.758612, 0.322012, 0.521380 + 0.221313, -0.758612, 0.322012, 0.521380 + 0.204025, -0.777602, 0.314172, 0.504981 + 0.204025, -0.777602, 0.314172, 0.504981 + 0.204025, -0.777602, 0.314172, 0.504981 + 0.204025, -0.777602, 0.314172, 0.504981 + 0.204025, -0.777602, 0.314172, 0.504981 + 0.204025, -0.777602, 0.314172, 0.504981 + 0.204025, -0.777602, 0.314172, 0.504981 + 0.204025, -0.777602, 0.314172, 0.504981 + 0.204025, -0.777602, 0.314172, 0.504981 + 0.204025, -0.777602, 0.314172, 0.504981 + 0.204025, -0.777602, 0.314172, 0.504981 + 0.204025, -0.777602, 0.314172, 0.504981 + 0.204025, -0.777602, 0.314172, 0.504981 + 0.204025, -0.777602, 0.314172, 0.504981 + 0.204025, -0.777602, 0.314172, 0.504981 + 0.204025, -0.777602, 0.314172, 0.504981 + 0.204025, -0.777602, 0.314172, 0.504981 + 0.204025, -0.777602, 0.314172, 0.504981 + 0.204025, -0.777602, 0.314172, 0.504981 + 0.204025, -0.777602, 0.314172, 0.504981 + 0.204025, -0.777602, 0.314172, 0.504981 + 0.204025, -0.777602, 0.314172, 0.504981 + 0.204025, -0.777602, 0.314172, 0.504981 + 0.204025, -0.777602, 0.314172, 0.504981 + 0.204025, -0.777602, 0.314172, 0.504981 + 0.187247, -0.796008, 0.305559, 0.487794 + 0.187247, -0.796008, 0.305559, 0.487794 + 0.187247, -0.796008, 0.305559, 0.487794 + 0.187247, -0.796008, 0.305559, 0.487794 + 0.187247, -0.796008, 0.305559, 0.487794 + 0.187247, -0.796008, 0.305559, 0.487794 + 0.187247, -0.796008, 0.305559, 0.487794 + 0.187247, -0.796008, 0.305559, 0.487794 + 0.187247, -0.796008, 0.305559, 0.487794 + 0.187247, -0.796008, 0.305559, 0.487794 + 0.187247, -0.796008, 0.305559, 0.487794 + 0.187247, -0.796008, 0.305559, 0.487794 + 0.187247, -0.796008, 0.305559, 0.487794 + 0.187247, -0.796008, 0.305559, 0.487794 + 0.187247, -0.796008, 0.305559, 0.487794 + 0.187247, -0.796008, 0.305559, 0.487794 + 0.187247, -0.796008, 0.305559, 0.487794 + 0.187247, -0.796008, 0.305559, 0.487794 + 0.187247, -0.796008, 0.305559, 0.487794 + 0.187247, -0.796008, 0.305559, 0.487794 + 0.187247, -0.796008, 0.305559, 0.487794 + 0.187247, -0.796008, 0.305559, 0.487794 + 0.187247, -0.796008, 0.305559, 0.487794 + 0.187247, -0.796008, 0.305559, 0.487794 + 0.187247, -0.796008, 0.305559, 0.487794 + 0.171010, -0.813798, 0.296198, 0.469846 + 0.171010, -0.813798, 0.296198, 0.469846 + 0.171010, -0.813798, 0.296198, 0.469846 + 0.171010, -0.813798, 0.296198, 0.469846 + 0.171010, -0.813798, 0.296198, 0.469846 + 0.171010, -0.813798, 0.296198, 0.469846 + 0.171010, -0.813798, 0.296198, 0.469846 + 0.171010, -0.813798, 0.296198, 0.469846 + 0.171010, -0.813798, 0.296198, 0.469846 + 0.171010, -0.813798, 0.296198, 0.469846 + 0.171010, -0.813798, 0.296198, 0.469846 + 0.171010, -0.813798, 0.296198, 0.469846 + 0.171010, -0.813798, 0.296198, 0.469846 + 0.171010, -0.813798, 0.296198, 0.469846 + 0.171010, -0.813798, 0.296198, 0.469846 + 0.171010, -0.813798, 0.296198, 0.469846 + 0.171010, -0.813798, 0.296198, 0.469846 + 0.171010, -0.813798, 0.296198, 0.469846 + 0.171010, -0.813798, 0.296198, 0.469846 + 0.171010, -0.813798, 0.296198, 0.469846 + 0.171010, -0.813798, 0.296198, 0.469846 + 0.171010, -0.813798, 0.296198, 0.469846 + 0.171010, -0.813798, 0.296198, 0.469846 + 0.171010, -0.813798, 0.296198, 0.469846 + 0.171010, -0.813798, 0.296198, 0.469846 + 0.155348, -0.830938, 0.286115, 0.451162 + 0.155348, -0.830938, 0.286115, 0.451162 + 0.155348, -0.830938, 0.286115, 0.451162 + 0.155348, -0.830938, 0.286115, 0.451162 + 0.155348, -0.830938, 0.286115, 0.451162 + 0.155348, -0.830938, 0.286115, 0.451162 + 0.155348, -0.830938, 0.286115, 0.451162 + 0.155348, -0.830938, 0.286115, 0.451162 + 0.155348, -0.830938, 0.286115, 0.451162 + 0.155348, -0.830938, 0.286115, 0.451162 + 0.155348, -0.830938, 0.286115, 0.451162 + 0.155348, -0.830938, 0.286115, 0.451162 + 0.155348, -0.830938, 0.286115, 0.451162 + 0.155348, -0.830938, 0.286115, 0.451162 + 0.155348, -0.830938, 0.286115, 0.451162 + 0.155348, -0.830938, 0.286115, 0.451162 + 0.155348, -0.830938, 0.286115, 0.451162 + 0.155348, -0.830938, 0.286115, 0.451162 + 0.155348, -0.830938, 0.286115, 0.451162 + 0.155348, -0.830938, 0.286115, 0.451162 + 0.155348, -0.830938, 0.286115, 0.451162 + 0.155348, -0.830938, 0.286115, 0.451162 + 0.155348, -0.830938, 0.286115, 0.451162 + 0.155348, -0.830938, 0.286115, 0.451162 + 0.155348, -0.830938, 0.286115, 0.451162 + 0.140291, -0.847398, 0.275336, 0.431771 + 0.140291, -0.847398, 0.275336, 0.431771 + 0.140291, -0.847398, 0.275336, 0.431771 + 0.140291, -0.847398, 0.275336, 0.431771 + 0.140291, -0.847398, 0.275336, 0.431771 + 0.140291, -0.847398, 0.275336, 0.431771 + 0.140291, -0.847398, 0.275336, 0.431771 + 0.140291, -0.847398, 0.275336, 0.431771 + 0.140291, -0.847398, 0.275336, 0.431771 + 0.140291, -0.847398, 0.275336, 0.431771 + 0.140291, -0.847398, 0.275336, 0.431771 + 0.140291, -0.847398, 0.275336, 0.431771 + 0.140291, -0.847398, 0.275336, 0.431771 + 0.140291, -0.847398, 0.275336, 0.431771 + 0.140291, -0.847398, 0.275336, 0.431771 + 0.140291, -0.847398, 0.275336, 0.431771 + 0.140291, -0.847398, 0.275336, 0.431771 + 0.140291, -0.847398, 0.275336, 0.431771 + 0.140291, -0.847398, 0.275336, 0.431771 + 0.140291, -0.847398, 0.275336, 0.431771 + 0.140291, -0.847398, 0.275336, 0.431771 + 0.140291, -0.847398, 0.275336, 0.431771 + 0.140291, -0.847398, 0.275336, 0.431771 + 0.140291, -0.847398, 0.275336, 0.431771 + 0.140291, -0.847398, 0.275336, 0.431771 + 0.125869, -0.863147, 0.263890, 0.411700 + 0.125869, -0.863147, 0.263890, 0.411700 + 0.125869, -0.863147, 0.263890, 0.411700 + 0.125869, -0.863147, 0.263890, 0.411700 + 0.125869, -0.863147, 0.263890, 0.411700 + 0.125869, -0.863147, 0.263890, 0.411700 + 0.125869, -0.863147, 0.263890, 0.411700 + 0.125869, -0.863147, 0.263890, 0.411700 + 0.125869, -0.863147, 0.263890, 0.411700 + 0.125869, -0.863147, 0.263890, 0.411700 + 0.125869, -0.863147, 0.263890, 0.411700 + 0.125869, -0.863147, 0.263890, 0.411700 + 0.125869, -0.863147, 0.263890, 0.411700 + 0.125869, -0.863147, 0.263890, 0.411700 + 0.125869, -0.863147, 0.263890, 0.411700 + 0.125869, -0.863147, 0.263890, 0.411700 + 0.125869, -0.863147, 0.263890, 0.411700 + 0.125869, -0.863147, 0.263890, 0.411700 + 0.125869, -0.863147, 0.263890, 0.411700 + 0.125869, -0.863147, 0.263890, 0.411700 + 0.125869, -0.863147, 0.263890, 0.411700 + 0.125869, -0.863147, 0.263890, 0.411700 + 0.125869, -0.863147, 0.263890, 0.411700 + 0.125869, -0.863147, 0.263890, 0.411700 + 0.125869, -0.863147, 0.263890, 0.411700 + 0.112112, -0.878156, 0.251807, 0.390980 + 0.112112, -0.878156, 0.251807, 0.390980 + 0.112112, -0.878156, 0.251807, 0.390980 + 0.112112, -0.878156, 0.251807, 0.390980 + 0.112112, -0.878156, 0.251807, 0.390980 + 0.112112, -0.878156, 0.251807, 0.390980 + 0.112112, -0.878156, 0.251807, 0.390980 + 0.112112, -0.878156, 0.251807, 0.390980 + 0.112112, -0.878156, 0.251807, 0.390980 + 0.112112, -0.878156, 0.251807, 0.390980 + 0.112112, -0.878156, 0.251807, 0.390980 + 0.112112, -0.878156, 0.251807, 0.390980 + 0.112112, -0.878156, 0.251807, 0.390980 + 0.112112, -0.878156, 0.251807, 0.390980 + 0.112112, -0.878156, 0.251807, 0.390980 + 0.112112, -0.878156, 0.251807, 0.390980 + 0.112112, -0.878156, 0.251807, 0.390980 + 0.112112, -0.878156, 0.251807, 0.390980 + 0.112112, -0.878156, 0.251807, 0.390980 + 0.112112, -0.878156, 0.251807, 0.390980 + 0.112112, -0.878156, 0.251807, 0.390980 + 0.112112, -0.878156, 0.251807, 0.390980 + 0.112112, -0.878156, 0.251807, 0.390980 + 0.112112, -0.878156, 0.251807, 0.390980 + 0.112112, -0.878156, 0.251807, 0.390980 + 0.099046, -0.892399, 0.239118, 0.369644 + 0.099046, -0.892399, 0.239118, 0.369644 + 0.099046, -0.892399, 0.239118, 0.369644 + 0.099046, -0.892399, 0.239118, 0.369644 + 0.099046, -0.892399, 0.239118, 0.369644 + 0.099046, -0.892399, 0.239118, 0.369644 + 0.099046, -0.892399, 0.239118, 0.369644 + 0.099046, -0.892399, 0.239118, 0.369644 + 0.099046, -0.892399, 0.239118, 0.369644 + 0.099046, -0.892399, 0.239118, 0.369644 + 0.099046, -0.892399, 0.239118, 0.369644 + 0.099046, -0.892399, 0.239118, 0.369644 + 0.099046, -0.892399, 0.239118, 0.369644 + 0.099046, -0.892399, 0.239118, 0.369644 + 0.099046, -0.892399, 0.239118, 0.369644 + 0.099046, -0.892399, 0.239118, 0.369644 + 0.099046, -0.892399, 0.239118, 0.369644 + 0.099046, -0.892399, 0.239118, 0.369644 + 0.099046, -0.892399, 0.239118, 0.369644 + 0.099046, -0.892399, 0.239118, 0.369644 + 0.099046, -0.892399, 0.239118, 0.369644 + 0.099046, -0.892399, 0.239118, 0.369644 + 0.099046, -0.892399, 0.239118, 0.369644 + 0.099046, -0.892399, 0.239118, 0.369644 + 0.099046, -0.892399, 0.239118, 0.369644 + 0.086697, -0.905849, 0.225854, 0.347723 + 0.086697, -0.905849, 0.225854, 0.347723 + 0.086697, -0.905849, 0.225854, 0.347723 + 0.086697, -0.905849, 0.225854, 0.347723 + 0.086697, -0.905849, 0.225854, 0.347723 + 0.086697, -0.905849, 0.225854, 0.347723 + 0.086697, -0.905849, 0.225854, 0.347723 + 0.086697, -0.905849, 0.225854, 0.347723 + 0.086697, -0.905849, 0.225854, 0.347723 + 0.086697, -0.905849, 0.225854, 0.347723 + 0.086697, -0.905849, 0.225854, 0.347723 + 0.086697, -0.905849, 0.225854, 0.347723 + 0.086697, -0.905849, 0.225854, 0.347723 + 0.086697, -0.905849, 0.225854, 0.347723 + 0.086697, -0.905849, 0.225854, 0.347723 + 0.086697, -0.905849, 0.225854, 0.347723 + 0.086697, -0.905849, 0.225854, 0.347723 + 0.086697, -0.905849, 0.225854, 0.347723 + 0.086697, -0.905849, 0.225854, 0.347723 + 0.086697, -0.905849, 0.225854, 0.347723 + 0.086697, -0.905849, 0.225854, 0.347723 + 0.086697, -0.905849, 0.225854, 0.347723 + 0.086697, -0.905849, 0.225854, 0.347723 + 0.086697, -0.905849, 0.225854, 0.347723 + 0.086697, -0.905849, 0.225854, 0.347723 + 0.075090, -0.918482, 0.212048, 0.325251 + 0.075090, -0.918482, 0.212048, 0.325251 + 0.075090, -0.918482, 0.212048, 0.325251 + 0.075090, -0.918482, 0.212048, 0.325251 + 0.075090, -0.918482, 0.212048, 0.325251 + 0.075090, -0.918482, 0.212048, 0.325251 + 0.075090, -0.918482, 0.212048, 0.325251 + 0.075090, -0.918482, 0.212048, 0.325251 + 0.075090, -0.918482, 0.212048, 0.325251 + 0.075090, -0.918482, 0.212048, 0.325251 + 0.075090, -0.918482, 0.212048, 0.325251 + 0.075090, -0.918482, 0.212048, 0.325251 + 0.075090, -0.918482, 0.212048, 0.325251 + 0.075090, -0.918482, 0.212048, 0.325251 + 0.075090, -0.918482, 0.212048, 0.325251 + 0.075090, -0.918482, 0.212048, 0.325251 + 0.075090, -0.918482, 0.212048, 0.325251 + 0.075090, -0.918482, 0.212048, 0.325251 + 0.075090, -0.918482, 0.212048, 0.325251 + 0.075090, -0.918482, 0.212048, 0.325251 + 0.075090, -0.918482, 0.212048, 0.325251 + 0.075090, -0.918482, 0.212048, 0.325251 + 0.075090, -0.918482, 0.212048, 0.325251 + 0.075090, -0.918482, 0.212048, 0.325251 + 0.075090, -0.918482, 0.212048, 0.325251 + 0.064248, -0.930274, 0.197736, 0.302264 + 0.064248, -0.930274, 0.197736, 0.302264 + 0.064248, -0.930274, 0.197736, 0.302264 + 0.064248, -0.930274, 0.197736, 0.302264 + 0.064248, -0.930274, 0.197736, 0.302264 + 0.064248, -0.930274, 0.197736, 0.302264 + 0.064248, -0.930274, 0.197736, 0.302264 + 0.064248, -0.930274, 0.197736, 0.302264 + 0.064248, -0.930274, 0.197736, 0.302264 + 0.064248, -0.930274, 0.197736, 0.302264 + 0.064248, -0.930274, 0.197736, 0.302264 + 0.064248, -0.930274, 0.197736, 0.302264 + 0.064248, -0.930274, 0.197736, 0.302264 + 0.064248, -0.930274, 0.197736, 0.302264 + 0.064248, -0.930274, 0.197736, 0.302264 + 0.064248, -0.930274, 0.197736, 0.302264 + 0.064248, -0.930274, 0.197736, 0.302264 + 0.064248, -0.930274, 0.197736, 0.302264 + 0.064248, -0.930274, 0.197736, 0.302264 + 0.064248, -0.930274, 0.197736, 0.302264 + 0.064248, -0.930274, 0.197736, 0.302264 + 0.064248, -0.930274, 0.197736, 0.302264 + 0.064248, -0.930274, 0.197736, 0.302264 + 0.064248, -0.930274, 0.197736, 0.302264 + 0.064248, -0.930274, 0.197736, 0.302264 + 0.054193, -0.941204, 0.182951, 0.278797 + 0.054193, -0.941204, 0.182951, 0.278797 + 0.054193, -0.941204, 0.182951, 0.278797 + 0.054193, -0.941204, 0.182951, 0.278797 + 0.054193, -0.941204, 0.182951, 0.278797 + 0.054193, -0.941204, 0.182951, 0.278797 + 0.054193, -0.941204, 0.182951, 0.278797 + 0.054193, -0.941204, 0.182951, 0.278797 + 0.054193, -0.941204, 0.182951, 0.278797 + 0.054193, -0.941204, 0.182951, 0.278797 + 0.054193, -0.941204, 0.182951, 0.278797 + 0.054193, -0.941204, 0.182951, 0.278797 + 0.054193, -0.941204, 0.182951, 0.278797 + 0.054193, -0.941204, 0.182951, 0.278797 + 0.054193, -0.941204, 0.182951, 0.278797 + 0.054193, -0.941204, 0.182951, 0.278797 + 0.054193, -0.941204, 0.182951, 0.278797 + 0.054193, -0.941204, 0.182951, 0.278797 + 0.054193, -0.941204, 0.182951, 0.278797 + 0.054193, -0.941204, 0.182951, 0.278797 + 0.054193, -0.941204, 0.182951, 0.278797 + 0.054193, -0.941204, 0.182951, 0.278797 + 0.054193, -0.941204, 0.182951, 0.278797 + 0.054193, -0.941204, 0.182951, 0.278797 + 0.054193, -0.941204, 0.182951, 0.278797 + 0.044943, -0.951251, 0.167731, 0.254887 + 0.044943, -0.951251, 0.167731, 0.254887 + 0.044943, -0.951251, 0.167731, 0.254887 + 0.044943, -0.951251, 0.167731, 0.254887 + 0.044943, -0.951251, 0.167731, 0.254887 + 0.044943, -0.951251, 0.167731, 0.254887 + 0.044943, -0.951251, 0.167731, 0.254887 + 0.044943, -0.951251, 0.167731, 0.254887 + 0.044943, -0.951251, 0.167731, 0.254887 + 0.044943, -0.951251, 0.167731, 0.254887 + 0.044943, -0.951251, 0.167731, 0.254887 + 0.044943, -0.951251, 0.167731, 0.254887 + 0.044943, -0.951251, 0.167731, 0.254887 + 0.044943, -0.951251, 0.167731, 0.254887 + 0.044943, -0.951251, 0.167731, 0.254887 + 0.044943, -0.951251, 0.167731, 0.254887 + 0.044943, -0.951251, 0.167731, 0.254887 + 0.044943, -0.951251, 0.167731, 0.254887 + 0.044943, -0.951251, 0.167731, 0.254887 + 0.044943, -0.951251, 0.167731, 0.254887 + 0.044943, -0.951251, 0.167731, 0.254887 + 0.044943, -0.951251, 0.167731, 0.254887 + 0.044943, -0.951251, 0.167731, 0.254887 + 0.044943, -0.951251, 0.167731, 0.254887 + 0.044943, -0.951251, 0.167731, 0.254887 + 0.036519, -0.960398, 0.152112, 0.230571 + 0.036519, -0.960398, 0.152112, 0.230571 + 0.036519, -0.960398, 0.152112, 0.230571 + 0.036519, -0.960398, 0.152112, 0.230571 + 0.036519, -0.960398, 0.152112, 0.230571 + 0.036519, -0.960398, 0.152112, 0.230571 + 0.036519, -0.960398, 0.152112, 0.230571 + 0.036519, -0.960398, 0.152112, 0.230571 + 0.036519, -0.960398, 0.152112, 0.230571 + 0.036519, -0.960398, 0.152112, 0.230571 + 0.036519, -0.960398, 0.152112, 0.230571 + 0.036519, -0.960398, 0.152112, 0.230571 + 0.036519, -0.960398, 0.152112, 0.230571 + 0.036519, -0.960398, 0.152112, 0.230571 + 0.036519, -0.960398, 0.152112, 0.230571 + 0.036519, -0.960398, 0.152112, 0.230571 + 0.036519, -0.960398, 0.152112, 0.230571 + 0.036519, -0.960398, 0.152112, 0.230571 + 0.036519, -0.960398, 0.152112, 0.230571 + 0.036519, -0.960398, 0.152112, 0.230571 + 0.036519, -0.960398, 0.152112, 0.230571 + 0.036519, -0.960398, 0.152112, 0.230571 + 0.036519, -0.960398, 0.152112, 0.230571 + 0.036519, -0.960398, 0.152112, 0.230571 + 0.036519, -0.960398, 0.152112, 0.230571 + 0.028936, -0.968628, 0.136132, 0.205888 + 0.028936, -0.968628, 0.136132, 0.205888 + 0.028936, -0.968628, 0.136132, 0.205888 + 0.028936, -0.968628, 0.136132, 0.205888 + 0.028936, -0.968628, 0.136132, 0.205888 + 0.028936, -0.968628, 0.136132, 0.205888 + 0.028936, -0.968628, 0.136132, 0.205888 + 0.028936, -0.968628, 0.136132, 0.205888 + 0.028936, -0.968628, 0.136132, 0.205888 + 0.028936, -0.968628, 0.136132, 0.205888 + 0.028936, -0.968628, 0.136132, 0.205888 + 0.028936, -0.968628, 0.136132, 0.205888 + 0.028936, -0.968628, 0.136132, 0.205888 + 0.028936, -0.968628, 0.136132, 0.205888 + 0.028936, -0.968628, 0.136132, 0.205888 + 0.028936, -0.968628, 0.136132, 0.205888 + 0.028936, -0.968628, 0.136132, 0.205888 + 0.028936, -0.968628, 0.136132, 0.205888 + 0.028936, -0.968628, 0.136132, 0.205888 + 0.028936, -0.968628, 0.136132, 0.205888 + 0.028936, -0.968628, 0.136132, 0.205888 + 0.028936, -0.968628, 0.136132, 0.205888 + 0.028936, -0.968628, 0.136132, 0.205888 + 0.028936, -0.968628, 0.136132, 0.205888 + 0.028936, -0.968628, 0.136132, 0.205888 + 0.022209, -0.975926, 0.119829, 0.180877 + 0.022209, -0.975926, 0.119829, 0.180877 + 0.022209, -0.975926, 0.119829, 0.180877 + 0.022209, -0.975926, 0.119829, 0.180877 + 0.022209, -0.975926, 0.119829, 0.180877 + 0.022209, -0.975926, 0.119829, 0.180877 + 0.022209, -0.975926, 0.119829, 0.180877 + 0.022209, -0.975926, 0.119829, 0.180877 + 0.022209, -0.975926, 0.119829, 0.180877 + 0.022209, -0.975926, 0.119829, 0.180877 + 0.022209, -0.975926, 0.119829, 0.180877 + 0.022209, -0.975926, 0.119829, 0.180877 + 0.022209, -0.975926, 0.119829, 0.180877 + 0.022209, -0.975926, 0.119829, 0.180877 + 0.022209, -0.975926, 0.119829, 0.180877 + 0.022209, -0.975926, 0.119829, 0.180877 + 0.022209, -0.975926, 0.119829, 0.180877 + 0.022209, -0.975926, 0.119829, 0.180877 + 0.022209, -0.975926, 0.119829, 0.180877 + 0.022209, -0.975926, 0.119829, 0.180877 + 0.022209, -0.975926, 0.119829, 0.180877 + 0.022209, -0.975926, 0.119829, 0.180877 + 0.022209, -0.975926, 0.119829, 0.180877 + 0.022209, -0.975926, 0.119829, 0.180877 + 0.022209, -0.975926, 0.119829, 0.180877 + 0.016352, -0.982278, 0.103242, 0.155578 + 0.016352, -0.982278, 0.103242, 0.155578 + 0.016352, -0.982278, 0.103242, 0.155578 + 0.016352, -0.982278, 0.103242, 0.155578 + 0.016352, -0.982278, 0.103242, 0.155578 + 0.016352, -0.982278, 0.103242, 0.155578 + 0.016352, -0.982278, 0.103242, 0.155578 + 0.016352, -0.982278, 0.103242, 0.155578 + 0.016352, -0.982278, 0.103242, 0.155578 + 0.016352, -0.982278, 0.103242, 0.155578 + 0.016352, -0.982278, 0.103242, 0.155578 + 0.016352, -0.982278, 0.103242, 0.155578 + 0.016352, -0.982278, 0.103242, 0.155578 + 0.016352, -0.982278, 0.103242, 0.155578 + 0.016352, -0.982278, 0.103242, 0.155578 + 0.016352, -0.982278, 0.103242, 0.155578 + 0.016352, -0.982278, 0.103242, 0.155578 + 0.016352, -0.982278, 0.103242, 0.155578 + 0.016352, -0.982278, 0.103242, 0.155578 + 0.016352, -0.982278, 0.103242, 0.155578 + 0.016352, -0.982278, 0.103242, 0.155578 + 0.016352, -0.982278, 0.103242, 0.155578 + 0.016352, -0.982278, 0.103242, 0.155578 + 0.016352, -0.982278, 0.103242, 0.155578 + 0.016352, -0.982278, 0.103242, 0.155578 + 0.011376, -0.987672, 0.086410, 0.130030 + 0.011376, -0.987672, 0.086410, 0.130030 + 0.011376, -0.987672, 0.086410, 0.130030 + 0.011376, -0.987672, 0.086410, 0.130030 + 0.011376, -0.987672, 0.086410, 0.130030 + 0.011376, -0.987672, 0.086410, 0.130030 + 0.011376, -0.987672, 0.086410, 0.130030 + 0.011376, -0.987672, 0.086410, 0.130030 + 0.011376, -0.987672, 0.086410, 0.130030 + 0.011376, -0.987672, 0.086410, 0.130030 + 0.011376, -0.987672, 0.086410, 0.130030 + 0.011376, -0.987672, 0.086410, 0.130030 + 0.011376, -0.987672, 0.086410, 0.130030 + 0.011376, -0.987672, 0.086410, 0.130030 + 0.011376, -0.987672, 0.086410, 0.130030 + 0.011376, -0.987672, 0.086410, 0.130030 + 0.011376, -0.987672, 0.086410, 0.130030 + 0.011376, -0.987672, 0.086410, 0.130030 + 0.011376, -0.987672, 0.086410, 0.130030 + 0.011376, -0.987672, 0.086410, 0.130030 + 0.011376, -0.987672, 0.086410, 0.130030 + 0.011376, -0.987672, 0.086410, 0.130030 + 0.011376, -0.987672, 0.086410, 0.130030 + 0.011376, -0.987672, 0.086410, 0.130030 + 0.011376, -0.987672, 0.086410, 0.130030 + 0.007292, -0.992099, 0.069374, 0.104274 + 0.007292, -0.992099, 0.069374, 0.104274 + 0.007292, -0.992099, 0.069374, 0.104274 + 0.007292, -0.992099, 0.069374, 0.104274 + 0.007292, -0.992099, 0.069374, 0.104274 + 0.007292, -0.992099, 0.069374, 0.104274 + 0.007292, -0.992099, 0.069374, 0.104274 + 0.007292, -0.992099, 0.069374, 0.104274 + 0.007292, -0.992099, 0.069374, 0.104274 + 0.007292, -0.992099, 0.069374, 0.104274 + 0.007292, -0.992099, 0.069374, 0.104274 + 0.007292, -0.992099, 0.069374, 0.104274 + 0.007292, -0.992099, 0.069374, 0.104274 + 0.007292, -0.992099, 0.069374, 0.104274 + 0.007292, -0.992099, 0.069374, 0.104274 + 0.007292, -0.992099, 0.069374, 0.104274 + 0.007292, -0.992099, 0.069374, 0.104274 + 0.007292, -0.992099, 0.069374, 0.104274 + 0.007292, -0.992099, 0.069374, 0.104274 + 0.007292, -0.992099, 0.069374, 0.104274 + 0.007292, -0.992099, 0.069374, 0.104274 + 0.007292, -0.992099, 0.069374, 0.104274 + 0.007292, -0.992099, 0.069374, 0.104274 + 0.007292, -0.992099, 0.069374, 0.104274 + 0.007292, -0.992099, 0.069374, 0.104274 + 0.004106, -0.995551, 0.052175, 0.078352 + 0.004106, -0.995551, 0.052175, 0.078352 + 0.004106, -0.995551, 0.052175, 0.078352 + 0.004106, -0.995551, 0.052175, 0.078352 + 0.004106, -0.995551, 0.052175, 0.078352 + 0.004106, -0.995551, 0.052175, 0.078352 + 0.004106, -0.995551, 0.052175, 0.078352 + 0.004106, -0.995551, 0.052175, 0.078352 + 0.004106, -0.995551, 0.052175, 0.078352 + 0.004106, -0.995551, 0.052175, 0.078352 + 0.004106, -0.995551, 0.052175, 0.078352 + 0.004106, -0.995551, 0.052175, 0.078352 + 0.004106, -0.995551, 0.052175, 0.078352 + 0.004106, -0.995551, 0.052175, 0.078352 + 0.004106, -0.995551, 0.052175, 0.078352 + 0.004106, -0.995551, 0.052175, 0.078352 + 0.004106, -0.995551, 0.052175, 0.078352 + 0.004106, -0.995551, 0.052175, 0.078352 + 0.004106, -0.995551, 0.052175, 0.078352 + 0.004106, -0.995551, 0.052175, 0.078352 + 0.004106, -0.995551, 0.052175, 0.078352 + 0.004106, -0.995551, 0.052175, 0.078352 + 0.004106, -0.995551, 0.052175, 0.078352 + 0.004106, -0.995551, 0.052175, 0.078352 + 0.004106, -0.995551, 0.052175, 0.078352 + 0.001826, -0.998021, 0.034852, 0.052304 + 0.001826, -0.998021, 0.034852, 0.052304 + 0.001826, -0.998021, 0.034852, 0.052304 + 0.001826, -0.998021, 0.034852, 0.052304 + 0.001826, -0.998021, 0.034852, 0.052304 + 0.001826, -0.998021, 0.034852, 0.052304 + 0.001826, -0.998021, 0.034852, 0.052304 + 0.001826, -0.998021, 0.034852, 0.052304 + 0.001826, -0.998021, 0.034852, 0.052304 + 0.001826, -0.998021, 0.034852, 0.052304 + 0.001826, -0.998021, 0.034852, 0.052304 + 0.001826, -0.998021, 0.034852, 0.052304 + 0.001826, -0.998021, 0.034852, 0.052304 + 0.001826, -0.998021, 0.034852, 0.052304 + 0.001826, -0.998021, 0.034852, 0.052304 + 0.001826, -0.998021, 0.034852, 0.052304 + 0.001826, -0.998021, 0.034852, 0.052304 + 0.001826, -0.998021, 0.034852, 0.052304 + 0.001826, -0.998021, 0.034852, 0.052304 + 0.001826, -0.998021, 0.034852, 0.052304 + 0.001826, -0.998021, 0.034852, 0.052304 + 0.001826, -0.998021, 0.034852, 0.052304 + 0.001826, -0.998021, 0.034852, 0.052304 + 0.001826, -0.998021, 0.034852, 0.052304 + 0.001826, -0.998021, 0.034852, 0.052304 + 0.000457, -0.999505, 0.017446, 0.026173 + 0.000457, -0.999505, 0.017446, 0.026173 + 0.000457, -0.999505, 0.017446, 0.026173 + 0.000457, -0.999505, 0.017446, 0.026173 + 0.000457, -0.999505, 0.017446, 0.026173 + 0.000457, -0.999505, 0.017446, 0.026173 + 0.000457, -0.999505, 0.017446, 0.026173 + 0.000457, -0.999505, 0.017446, 0.026173 + 0.000457, -0.999505, 0.017446, 0.026173 + 0.000457, -0.999505, 0.017446, 0.026173 + 0.000457, -0.999505, 0.017446, 0.026173 + 0.000457, -0.999505, 0.017446, 0.026173 + 0.000457, -0.999505, 0.017446, 0.026173 + 0.000457, -0.999505, 0.017446, 0.026173 + 0.000457, -0.999505, 0.017446, 0.026173 + 0.000457, -0.999505, 0.017446, 0.026173 + 0.000457, -0.999505, 0.017446, 0.026173 + 0.000457, -0.999505, 0.017446, 0.026173 + 0.000457, -0.999505, 0.017446, 0.026173 + 0.000457, -0.999505, 0.017446, 0.026173 + 0.000457, -0.999505, 0.017446, 0.026173 + 0.000457, -0.999505, 0.017446, 0.026173 + 0.000457, -0.999505, 0.017446, 0.026173 + 0.000457, -0.999505, 0.017446, 0.026173 + 0.000457, -0.999505, 0.017446, 0.026173 + 0.000000, -1.000000, 0.000000, 0.000000 + 0.000000, -1.000000, 0.000000, 0.000000 + 0.000000, -1.000000, 0.000000, 0.000000 + 0.000000, -1.000000, 0.000000, 0.000000 + 0.000000, -1.000000, 0.000000, 0.000000 + 0.000000, -1.000000, 0.000000, 0.000000 + 0.000000, -1.000000, 0.000000, 0.000000 + 0.000000, -1.000000, 0.000000, 0.000000 + 0.000000, -1.000000, 0.000000, 0.000000 + 0.000000, -1.000000, 0.000000, 0.000000 + 0.000000, -1.000000, 0.000000, 0.000000 + 0.000000, -1.000000, 0.000000, 0.000000 + 0.000000, -1.000000, 0.000000, 0.000000 + 0.000000, -1.000000, 0.000000, 0.000000 + 0.000000, -1.000000, 0.000000, 0.000000 + 0.000000, -1.000000, 0.000000, 0.000000 + 0.000000, -1.000000, 0.000000, 0.000000 + 0.000000, -1.000000, 0.000000, 0.000000 + 0.000000, -1.000000, 0.000000, 0.000000 + 0.000000, -1.000000, 0.000000, 0.000000 + 0.000000, -1.000000, 0.000000, 0.000000 + 0.000000, -1.000000, 0.000000, 0.000000 + 0.000000, -1.000000, 0.000000, 0.000000 + 0.000000, -1.000000, 0.000000, 0.000000 + 0.000000, -1.000000, 0.000000, 0.000000 + 0.000457, -0.999505, -0.017446, -0.026173 + 0.000457, -0.999505, -0.017446, -0.026173 + 0.000457, -0.999505, -0.017446, -0.026173 + 0.000457, -0.999505, -0.017446, -0.026173 + 0.000457, -0.999505, -0.017446, -0.026173 + 0.000457, -0.999505, -0.017446, -0.026173 + 0.000457, -0.999505, -0.017446, -0.026173 + 0.000457, -0.999505, -0.017446, -0.026173 + 0.000457, -0.999505, -0.017446, -0.026173 + 0.000457, -0.999505, -0.017446, -0.026173 + 0.000457, -0.999505, -0.017446, -0.026173 + 0.000457, -0.999505, -0.017446, -0.026173 + 0.000457, -0.999505, -0.017446, -0.026173 + 0.000457, -0.999505, -0.017446, -0.026173 + 0.000457, -0.999505, -0.017446, -0.026173 + 0.000457, -0.999505, -0.017446, -0.026173 + 0.000457, -0.999505, -0.017446, -0.026173 + 0.000457, -0.999505, -0.017446, -0.026173 + 0.000457, -0.999505, -0.017446, -0.026173 + 0.000457, -0.999505, -0.017446, -0.026173 + 0.000457, -0.999505, -0.017446, -0.026173 + 0.000457, -0.999505, -0.017446, -0.026173 + 0.000457, -0.999505, -0.017446, -0.026173 + 0.000457, -0.999505, -0.017446, -0.026173 + 0.000457, -0.999505, -0.017446, -0.026173 + 0.001826, -0.998021, -0.034852, -0.052304 + 0.001826, -0.998021, -0.034852, -0.052304 + 0.001826, -0.998021, -0.034852, -0.052304 + 0.001826, -0.998021, -0.034852, -0.052304 + 0.001826, -0.998021, -0.034852, -0.052304 + 0.001826, -0.998021, -0.034852, -0.052304 + 0.001826, -0.998021, -0.034852, -0.052304 + 0.001826, -0.998021, -0.034852, -0.052304 + 0.001826, -0.998021, -0.034852, -0.052304 + 0.001826, -0.998021, -0.034852, -0.052304 + 0.001826, -0.998021, -0.034852, -0.052304 + 0.001826, -0.998021, -0.034852, -0.052304 + 0.001826, -0.998021, -0.034852, -0.052304 + 0.001826, -0.998021, -0.034852, -0.052304 + 0.001826, -0.998021, -0.034852, -0.052304 + 0.001826, -0.998021, -0.034852, -0.052304 + 0.001826, -0.998021, -0.034852, -0.052304 + 0.001826, -0.998021, -0.034852, -0.052304 + 0.001826, -0.998021, -0.034852, -0.052304 + 0.001826, -0.998021, -0.034852, -0.052304 + 0.001826, -0.998021, -0.034852, -0.052304 + 0.001826, -0.998021, -0.034852, -0.052304 + 0.001826, -0.998021, -0.034852, -0.052304 + 0.001826, -0.998021, -0.034852, -0.052304 + 0.001826, -0.998021, -0.034852, -0.052304 + 0.004106, -0.995551, -0.052175, -0.078352 + 0.004106, -0.995551, -0.052175, -0.078352 + 0.004106, -0.995551, -0.052175, -0.078352 + 0.004106, -0.995551, -0.052175, -0.078352 + 0.004106, -0.995551, -0.052175, -0.078352 + 0.004106, -0.995551, -0.052175, -0.078352 + 0.004106, -0.995551, -0.052175, -0.078352 + 0.004106, -0.995551, -0.052175, -0.078352 + 0.004106, -0.995551, -0.052175, -0.078352 + 0.004106, -0.995551, -0.052175, -0.078352 + 0.004106, -0.995551, -0.052175, -0.078352 + 0.004106, -0.995551, -0.052175, -0.078352 + 0.004106, -0.995551, -0.052175, -0.078352 + 0.004106, -0.995551, -0.052175, -0.078352 + 0.004106, -0.995551, -0.052175, -0.078352 + 0.004106, -0.995551, -0.052175, -0.078352 + 0.004106, -0.995551, -0.052175, -0.078352 + 0.004106, -0.995551, -0.052175, -0.078352 + 0.004106, -0.995551, -0.052175, -0.078352 + 0.004106, -0.995551, -0.052175, -0.078352 + 0.004106, -0.995551, -0.052175, -0.078352 + 0.004106, -0.995551, -0.052175, -0.078352 + 0.004106, -0.995551, -0.052175, -0.078352 + 0.004106, -0.995551, -0.052175, -0.078352 + 0.004106, -0.995551, -0.052175, -0.078352 + 0.007292, -0.992099, -0.069374, -0.104274 + 0.007292, -0.992099, -0.069374, -0.104274 + 0.007292, -0.992099, -0.069374, -0.104274 + 0.007292, -0.992099, -0.069374, -0.104274 + 0.007292, -0.992099, -0.069374, -0.104274 + 0.007292, -0.992099, -0.069374, -0.104274 + 0.007292, -0.992099, -0.069374, -0.104274 + 0.007292, -0.992099, -0.069374, -0.104274 + 0.007292, -0.992099, -0.069374, -0.104274 + 0.007292, -0.992099, -0.069374, -0.104274 + 0.007292, -0.992099, -0.069374, -0.104274 + 0.007292, -0.992099, -0.069374, -0.104274 + 0.007292, -0.992099, -0.069374, -0.104274 + 0.007292, -0.992099, -0.069374, -0.104274 + 0.007292, -0.992099, -0.069374, -0.104274 + 0.007292, -0.992099, -0.069374, -0.104274 + 0.007292, -0.992099, -0.069374, -0.104274 + 0.007292, -0.992099, -0.069374, -0.104274 + 0.007292, -0.992099, -0.069374, -0.104274 + 0.007292, -0.992099, -0.069374, -0.104274 + 0.007292, -0.992099, -0.069374, -0.104274 + 0.007292, -0.992099, -0.069374, -0.104274 + 0.007292, -0.992099, -0.069374, -0.104274 + 0.007292, -0.992099, -0.069374, -0.104274 + 0.007292, -0.992099, -0.069374, -0.104274 + 0.011376, -0.987672, -0.086410, -0.130030 + 0.011376, -0.987672, -0.086410, -0.130030 + 0.011376, -0.987672, -0.086410, -0.130030 + 0.011376, -0.987672, -0.086410, -0.130030 + 0.011376, -0.987672, -0.086410, -0.130030 + 0.011376, -0.987672, -0.086410, -0.130030 + 0.011376, -0.987672, -0.086410, -0.130030 + 0.011376, -0.987672, -0.086410, -0.130030 + 0.011376, -0.987672, -0.086410, -0.130030 + 0.011376, -0.987672, -0.086410, -0.130030 + 0.011376, -0.987672, -0.086410, -0.130030 + 0.011376, -0.987672, -0.086410, -0.130030 + 0.011376, -0.987672, -0.086410, -0.130030 + 0.011376, -0.987672, -0.086410, -0.130030 + 0.011376, -0.987672, -0.086410, -0.130030 + 0.011376, -0.987672, -0.086410, -0.130030 + 0.011376, -0.987672, -0.086410, -0.130030 + 0.011376, -0.987672, -0.086410, -0.130030 + 0.011376, -0.987672, -0.086410, -0.130030 + 0.011376, -0.987672, -0.086410, -0.130030 + 0.011376, -0.987672, -0.086410, -0.130030 + 0.011376, -0.987672, -0.086410, -0.130030 + 0.011376, -0.987672, -0.086410, -0.130030 + 0.011376, -0.987672, -0.086410, -0.130030 + 0.011376, -0.987672, -0.086410, -0.130030 + 0.016352, -0.982278, -0.103242, -0.155578 + 0.016352, -0.982278, -0.103242, -0.155578 + 0.016352, -0.982278, -0.103242, -0.155578 + 0.016352, -0.982278, -0.103242, -0.155578 + 0.016352, -0.982278, -0.103242, -0.155578 + 0.016352, -0.982278, -0.103242, -0.155578 + 0.016352, -0.982278, -0.103242, -0.155578 + 0.016352, -0.982278, -0.103242, -0.155578 + 0.016352, -0.982278, -0.103242, -0.155578 + 0.016352, -0.982278, -0.103242, -0.155578 + 0.016352, -0.982278, -0.103242, -0.155578 + 0.016352, -0.982278, -0.103242, -0.155578 + 0.016352, -0.982278, -0.103242, -0.155578 + 0.016352, -0.982278, -0.103242, -0.155578 + 0.016352, -0.982278, -0.103242, -0.155578 + 0.016352, -0.982278, -0.103242, -0.155578 + 0.016352, -0.982278, -0.103242, -0.155578 + 0.016352, -0.982278, -0.103242, -0.155578 + 0.016352, -0.982278, -0.103242, -0.155578 + 0.016352, -0.982278, -0.103242, -0.155578 + 0.016352, -0.982278, -0.103242, -0.155578 + 0.016352, -0.982278, -0.103242, -0.155578 + 0.016352, -0.982278, -0.103242, -0.155578 + 0.016352, -0.982278, -0.103242, -0.155578 + 0.016352, -0.982278, -0.103242, -0.155578 + 0.022209, -0.975926, -0.119829, -0.180877 + 0.022209, -0.975926, -0.119829, -0.180877 + 0.022209, -0.975926, -0.119829, -0.180877 + 0.022209, -0.975926, -0.119829, -0.180877 + 0.022209, -0.975926, -0.119829, -0.180877 + 0.022209, -0.975926, -0.119829, -0.180877 + 0.022209, -0.975926, -0.119829, -0.180877 + 0.022209, -0.975926, -0.119829, -0.180877 + 0.022209, -0.975926, -0.119829, -0.180877 + 0.022209, -0.975926, -0.119829, -0.180877 + 0.022209, -0.975926, -0.119829, -0.180877 + 0.022209, -0.975926, -0.119829, -0.180877 + 0.022209, -0.975926, -0.119829, -0.180877 + 0.022209, -0.975926, -0.119829, -0.180877 + 0.022209, -0.975926, -0.119829, -0.180877 + 0.022209, -0.975926, -0.119829, -0.180877 + 0.022209, -0.975926, -0.119829, -0.180877 + 0.022209, -0.975926, -0.119829, -0.180877 + 0.022209, -0.975926, -0.119829, -0.180877 + 0.022209, -0.975926, -0.119829, -0.180877 + 0.022209, -0.975926, -0.119829, -0.180877 + 0.022209, -0.975926, -0.119829, -0.180877 + 0.022209, -0.975926, -0.119829, -0.180877 + 0.022209, -0.975926, -0.119829, -0.180877 + 0.022209, -0.975926, -0.119829, -0.180877 + 0.028936, -0.968628, -0.136132, -0.205888 + 0.028936, -0.968628, -0.136132, -0.205888 + 0.028936, -0.968628, -0.136132, -0.205888 + 0.028936, -0.968628, -0.136132, -0.205888 + 0.028936, -0.968628, -0.136132, -0.205888 + 0.028936, -0.968628, -0.136132, -0.205888 + 0.028936, -0.968628, -0.136132, -0.205888 + 0.028936, -0.968628, -0.136132, -0.205888 + 0.028936, -0.968628, -0.136132, -0.205888 + 0.028936, -0.968628, -0.136132, -0.205888 + 0.028936, -0.968628, -0.136132, -0.205888 + 0.028936, -0.968628, -0.136132, -0.205888 + 0.028936, -0.968628, -0.136132, -0.205888 + 0.028936, -0.968628, -0.136132, -0.205888 + 0.028936, -0.968628, -0.136132, -0.205888 + 0.028936, -0.968628, -0.136132, -0.205888 + 0.028936, -0.968628, -0.136132, -0.205888 + 0.028936, -0.968628, -0.136132, -0.205888 + 0.028936, -0.968628, -0.136132, -0.205888 + 0.028936, -0.968628, -0.136132, -0.205888 + 0.028936, -0.968628, -0.136132, -0.205888 + 0.028936, -0.968628, -0.136132, -0.205888 + 0.028936, -0.968628, -0.136132, -0.205888 + 0.028936, -0.968628, -0.136132, -0.205888 + 0.028936, -0.968628, -0.136132, -0.205888 + 0.036519, -0.960398, -0.152112, -0.230571 + 0.036519, -0.960398, -0.152112, -0.230571 + 0.036519, -0.960398, -0.152112, -0.230571 + 0.036519, -0.960398, -0.152112, -0.230571 + 0.036519, -0.960398, -0.152112, -0.230571 + 0.036519, -0.960398, -0.152112, -0.230571 + 0.036519, -0.960398, -0.152112, -0.230571 + 0.036519, -0.960398, -0.152112, -0.230571 + 0.036519, -0.960398, -0.152112, -0.230571 + 0.036519, -0.960398, -0.152112, -0.230571 + 0.036519, -0.960398, -0.152112, -0.230571 + 0.036519, -0.960398, -0.152112, -0.230571 + 0.036519, -0.960398, -0.152112, -0.230571 + 0.036519, -0.960398, -0.152112, -0.230571 + 0.036519, -0.960398, -0.152112, -0.230571 + 0.036519, -0.960398, -0.152112, -0.230571 + 0.036519, -0.960398, -0.152112, -0.230571 + 0.036519, -0.960398, -0.152112, -0.230571 + 0.036519, -0.960398, -0.152112, -0.230571 + 0.036519, -0.960398, -0.152112, -0.230571 + 0.036519, -0.960398, -0.152112, -0.230571 + 0.036519, -0.960398, -0.152112, -0.230571 + 0.036519, -0.960398, -0.152112, -0.230571 + 0.036519, -0.960398, -0.152112, -0.230571 + 0.036519, -0.960398, -0.152112, -0.230571 + 0.044943, -0.951251, -0.167731, -0.254887 + 0.044943, -0.951251, -0.167731, -0.254887 + 0.044943, -0.951251, -0.167731, -0.254887 + 0.044943, -0.951251, -0.167731, -0.254887 + 0.044943, -0.951251, -0.167731, -0.254887 + 0.044943, -0.951251, -0.167731, -0.254887 + 0.044943, -0.951251, -0.167731, -0.254887 + 0.044943, -0.951251, -0.167731, -0.254887 + 0.044943, -0.951251, -0.167731, -0.254887 + 0.044943, -0.951251, -0.167731, -0.254887 + 0.044943, -0.951251, -0.167731, -0.254887 + 0.044943, -0.951251, -0.167731, -0.254887 + 0.044943, -0.951251, -0.167731, -0.254887 + 0.044943, -0.951251, -0.167731, -0.254887 + 0.044943, -0.951251, -0.167731, -0.254887 + 0.044943, -0.951251, -0.167731, -0.254887 + 0.044943, -0.951251, -0.167731, -0.254887 + 0.044943, -0.951251, -0.167731, -0.254887 + 0.044943, -0.951251, -0.167731, -0.254887 + 0.044943, -0.951251, -0.167731, -0.254887 + 0.044943, -0.951251, -0.167731, -0.254887 + 0.044943, -0.951251, -0.167731, -0.254887 + 0.044943, -0.951251, -0.167731, -0.254887 + 0.044943, -0.951251, -0.167731, -0.254887 + 0.044943, -0.951251, -0.167731, -0.254887 + 0.054193, -0.941204, -0.182951, -0.278797 + 0.054193, -0.941204, -0.182951, -0.278797 + 0.054193, -0.941204, -0.182951, -0.278797 + 0.054193, -0.941204, -0.182951, -0.278797 + 0.054193, -0.941204, -0.182951, -0.278797 + 0.054193, -0.941204, -0.182951, -0.278797 + 0.054193, -0.941204, -0.182951, -0.278797 + 0.054193, -0.941204, -0.182951, -0.278797 + 0.054193, -0.941204, -0.182951, -0.278797 + 0.054193, -0.941204, -0.182951, -0.278797 + 0.054193, -0.941204, -0.182951, -0.278797 + 0.054193, -0.941204, -0.182951, -0.278797 + 0.054193, -0.941204, -0.182951, -0.278797 + 0.054193, -0.941204, -0.182951, -0.278797 + 0.054193, -0.941204, -0.182951, -0.278797 + 0.054193, -0.941204, -0.182951, -0.278797 + 0.054193, -0.941204, -0.182951, -0.278797 + 0.054193, -0.941204, -0.182951, -0.278797 + 0.054193, -0.941204, -0.182951, -0.278797 + 0.054193, -0.941204, -0.182951, -0.278797 + 0.054193, -0.941204, -0.182951, -0.278797 + 0.054193, -0.941204, -0.182951, -0.278797 + 0.054193, -0.941204, -0.182951, -0.278797 + 0.054193, -0.941204, -0.182951, -0.278797 + 0.054193, -0.941204, -0.182951, -0.278797 + 0.064248, -0.930274, -0.197736, -0.302264 + 0.064248, -0.930274, -0.197736, -0.302264 + 0.064248, -0.930274, -0.197736, -0.302264 + 0.064248, -0.930274, -0.197736, -0.302264 + 0.064248, -0.930274, -0.197736, -0.302264 + 0.064248, -0.930274, -0.197736, -0.302264 + 0.064248, -0.930274, -0.197736, -0.302264 + 0.064248, -0.930274, -0.197736, -0.302264 + 0.064248, -0.930274, -0.197736, -0.302264 + 0.064248, -0.930274, -0.197736, -0.302264 + 0.064248, -0.930274, -0.197736, -0.302264 + 0.064248, -0.930274, -0.197736, -0.302264 + 0.064248, -0.930274, -0.197736, -0.302264 + 0.064248, -0.930274, -0.197736, -0.302264 + 0.064248, -0.930274, -0.197736, -0.302264 + 0.064248, -0.930274, -0.197736, -0.302264 + 0.064248, -0.930274, -0.197736, -0.302264 + 0.064248, -0.930274, -0.197736, -0.302264 + 0.064248, -0.930274, -0.197736, -0.302264 + 0.064248, -0.930274, -0.197736, -0.302264 + 0.064248, -0.930274, -0.197736, -0.302264 + 0.064248, -0.930274, -0.197736, -0.302264 + 0.064248, -0.930274, -0.197736, -0.302264 + 0.064248, -0.930274, -0.197736, -0.302264 + 0.064248, -0.930274, -0.197736, -0.302264 + 0.075090, -0.918482, -0.212048, -0.325251 + 0.075090, -0.918482, -0.212048, -0.325251 + 0.075090, -0.918482, -0.212048, -0.325251 + 0.075090, -0.918482, -0.212048, -0.325251 + 0.075090, -0.918482, -0.212048, -0.325251 + 0.075090, -0.918482, -0.212048, -0.325251 + 0.075090, -0.918482, -0.212048, -0.325251 + 0.075090, -0.918482, -0.212048, -0.325251 + 0.075090, -0.918482, -0.212048, -0.325251 + 0.075090, -0.918482, -0.212048, -0.325251 + 0.075090, -0.918482, -0.212048, -0.325251 + 0.075090, -0.918482, -0.212048, -0.325251 + 0.075090, -0.918482, -0.212048, -0.325251 + 0.075090, -0.918482, -0.212048, -0.325251 + 0.075090, -0.918482, -0.212048, -0.325251 + 0.075090, -0.918482, -0.212048, -0.325251 + 0.075090, -0.918482, -0.212048, -0.325251 + 0.075090, -0.918482, -0.212048, -0.325251 + 0.075090, -0.918482, -0.212048, -0.325251 + 0.075090, -0.918482, -0.212048, -0.325251 + 0.075090, -0.918482, -0.212048, -0.325251 + 0.075090, -0.918482, -0.212048, -0.325251 + 0.075090, -0.918482, -0.212048, -0.325251 + 0.075090, -0.918482, -0.212048, -0.325251 + 0.075090, -0.918482, -0.212048, -0.325251 + 0.086697, -0.905849, -0.225854, -0.347723 + 0.086697, -0.905849, -0.225854, -0.347723 + 0.086697, -0.905849, -0.225854, -0.347723 + 0.086697, -0.905849, -0.225854, -0.347723 + 0.086697, -0.905849, -0.225854, -0.347723 + 0.086697, -0.905849, -0.225854, -0.347723 + 0.086697, -0.905849, -0.225854, -0.347723 + 0.086697, -0.905849, -0.225854, -0.347723 + 0.086697, -0.905849, -0.225854, -0.347723 + 0.086697, -0.905849, -0.225854, -0.347723 + 0.086697, -0.905849, -0.225854, -0.347723 + 0.086697, -0.905849, -0.225854, -0.347723 + 0.086697, -0.905849, -0.225854, -0.347723 + 0.086697, -0.905849, -0.225854, -0.347723 + 0.086697, -0.905849, -0.225854, -0.347723 + 0.086697, -0.905849, -0.225854, -0.347723 + 0.086697, -0.905849, -0.225854, -0.347723 + 0.086697, -0.905849, -0.225854, -0.347723 + 0.086697, -0.905849, -0.225854, -0.347723 + 0.086697, -0.905849, -0.225854, -0.347723 + 0.086697, -0.905849, -0.225854, -0.347723 + 0.086697, -0.905849, -0.225854, -0.347723 + 0.086697, -0.905849, -0.225854, -0.347723 + 0.086697, -0.905849, -0.225854, -0.347723 + 0.086697, -0.905849, -0.225854, -0.347723 + 0.099046, -0.892399, -0.239118, -0.369644 + 0.099046, -0.892399, -0.239118, -0.369644 + 0.099046, -0.892399, -0.239118, -0.369644 + 0.099046, -0.892399, -0.239118, -0.369644 + 0.099046, -0.892399, -0.239118, -0.369644 + 0.099046, -0.892399, -0.239118, -0.369644 + 0.099046, -0.892399, -0.239118, -0.369644 + 0.099046, -0.892399, -0.239118, -0.369644 + 0.099046, -0.892399, -0.239118, -0.369644 + 0.099046, -0.892399, -0.239118, -0.369644 + 0.099046, -0.892399, -0.239118, -0.369644 + 0.099046, -0.892399, -0.239118, -0.369644 + 0.099046, -0.892399, -0.239118, -0.369644 + 0.099046, -0.892399, -0.239118, -0.369644 + 0.099046, -0.892399, -0.239118, -0.369644 + 0.099046, -0.892399, -0.239118, -0.369644 + 0.099046, -0.892399, -0.239118, -0.369644 + 0.099046, -0.892399, -0.239118, -0.369644 + 0.099046, -0.892399, -0.239118, -0.369644 + 0.099046, -0.892399, -0.239118, -0.369644 + 0.099046, -0.892399, -0.239118, -0.369644 + 0.099046, -0.892399, -0.239118, -0.369644 + 0.099046, -0.892399, -0.239118, -0.369644 + 0.099046, -0.892399, -0.239118, -0.369644 + 0.099046, -0.892399, -0.239118, -0.369644 + 0.112112, -0.878156, -0.251807, -0.390980 + 0.112112, -0.878156, -0.251807, -0.390980 + 0.112112, -0.878156, -0.251807, -0.390980 + 0.112112, -0.878156, -0.251807, -0.390980 + 0.112112, -0.878156, -0.251807, -0.390980 + 0.112112, -0.878156, -0.251807, -0.390980 + 0.112112, -0.878156, -0.251807, -0.390980 + 0.112112, -0.878156, -0.251807, -0.390980 + 0.112112, -0.878156, -0.251807, -0.390980 + 0.112112, -0.878156, -0.251807, -0.390980 + 0.112112, -0.878156, -0.251807, -0.390980 + 0.112112, -0.878156, -0.251807, -0.390980 + 0.112112, -0.878156, -0.251807, -0.390980 + 0.112112, -0.878156, -0.251807, -0.390980 + 0.112112, -0.878156, -0.251807, -0.390980 + 0.112112, -0.878156, -0.251807, -0.390980 + 0.112112, -0.878156, -0.251807, -0.390980 + 0.112112, -0.878156, -0.251807, -0.390980 + 0.112112, -0.878156, -0.251807, -0.390980 + 0.112112, -0.878156, -0.251807, -0.390980 + 0.112112, -0.878156, -0.251807, -0.390980 + 0.112112, -0.878156, -0.251807, -0.390980 + 0.112112, -0.878156, -0.251807, -0.390980 + 0.112112, -0.878156, -0.251807, -0.390980 + 0.112112, -0.878156, -0.251807, -0.390980 + 0.125869, -0.863147, -0.263890, -0.411700 + 0.125869, -0.863147, -0.263890, -0.411700 + 0.125869, -0.863147, -0.263890, -0.411700 + 0.125869, -0.863147, -0.263890, -0.411700 + 0.125869, -0.863147, -0.263890, -0.411700 + 0.125869, -0.863147, -0.263890, -0.411700 + 0.125869, -0.863147, -0.263890, -0.411700 + 0.125869, -0.863147, -0.263890, -0.411700 + 0.125869, -0.863147, -0.263890, -0.411700 + 0.125869, -0.863147, -0.263890, -0.411700 + 0.125869, -0.863147, -0.263890, -0.411700 + 0.125869, -0.863147, -0.263890, -0.411700 + 0.125869, -0.863147, -0.263890, -0.411700 + 0.125869, -0.863147, -0.263890, -0.411700 + 0.125869, -0.863147, -0.263890, -0.411700 + 0.125869, -0.863147, -0.263890, -0.411700 + 0.125869, -0.863147, -0.263890, -0.411700 + 0.125869, -0.863147, -0.263890, -0.411700 + 0.125869, -0.863147, -0.263890, -0.411700 + 0.125869, -0.863147, -0.263890, -0.411700 + 0.125869, -0.863147, -0.263890, -0.411700 + 0.125869, -0.863147, -0.263890, -0.411700 + 0.125869, -0.863147, -0.263890, -0.411700 + 0.125869, -0.863147, -0.263890, -0.411700 + 0.125869, -0.863147, -0.263890, -0.411700 + 0.140291, -0.847398, -0.275336, -0.431771 + 0.140291, -0.847398, -0.275336, -0.431771 + 0.140291, -0.847398, -0.275336, -0.431771 + 0.140291, -0.847398, -0.275336, -0.431771 + 0.140291, -0.847398, -0.275336, -0.431771 + 0.140291, -0.847398, -0.275336, -0.431771 + 0.140291, -0.847398, -0.275336, -0.431771 + 0.140291, -0.847398, -0.275336, -0.431771 + 0.140291, -0.847398, -0.275336, -0.431771 + 0.140291, -0.847398, -0.275336, -0.431771 + 0.140291, -0.847398, -0.275336, -0.431771 + 0.140291, -0.847398, -0.275336, -0.431771 + 0.140291, -0.847398, -0.275336, -0.431771 + 0.140291, -0.847398, -0.275336, -0.431771 + 0.140291, -0.847398, -0.275336, -0.431771 + 0.140291, -0.847398, -0.275336, -0.431771 + 0.140291, -0.847398, -0.275336, -0.431771 + 0.140291, -0.847398, -0.275336, -0.431771 + 0.140291, -0.847398, -0.275336, -0.431771 + 0.140291, -0.847398, -0.275336, -0.431771 + 0.140291, -0.847398, -0.275336, -0.431771 + 0.140291, -0.847398, -0.275336, -0.431771 + 0.140291, -0.847398, -0.275336, -0.431771 + 0.140291, -0.847398, -0.275336, -0.431771 + 0.140291, -0.847398, -0.275336, -0.431771 + 0.155348, -0.830938, -0.286115, -0.451162 + 0.155348, -0.830938, -0.286115, -0.451162 + 0.155348, -0.830938, -0.286115, -0.451162 + 0.155348, -0.830938, -0.286115, -0.451162 + 0.155348, -0.830938, -0.286115, -0.451162 + 0.155348, -0.830938, -0.286115, -0.451162 + 0.155348, -0.830938, -0.286115, -0.451162 + 0.155348, -0.830938, -0.286115, -0.451162 + 0.155348, -0.830938, -0.286115, -0.451162 + 0.155348, -0.830938, -0.286115, -0.451162 + 0.155348, -0.830938, -0.286115, -0.451162 + 0.155348, -0.830938, -0.286115, -0.451162 + 0.155348, -0.830938, -0.286115, -0.451162 + 0.155348, -0.830938, -0.286115, -0.451162 + 0.155348, -0.830938, -0.286115, -0.451162 + 0.155348, -0.830938, -0.286115, -0.451162 + 0.155348, -0.830938, -0.286115, -0.451162 + 0.155348, -0.830938, -0.286115, -0.451162 + 0.155348, -0.830938, -0.286115, -0.451162 + 0.155348, -0.830938, -0.286115, -0.451162 + 0.155348, -0.830938, -0.286115, -0.451162 + 0.155348, -0.830938, -0.286115, -0.451162 + 0.155348, -0.830938, -0.286115, -0.451162 + 0.155348, -0.830938, -0.286115, -0.451162 + 0.155348, -0.830938, -0.286115, -0.451162 + 0.171010, -0.813798, -0.296198, -0.469846 + 0.171010, -0.813798, -0.296198, -0.469846 + 0.171010, -0.813798, -0.296198, -0.469846 + 0.171010, -0.813798, -0.296198, -0.469846 + 0.171010, -0.813798, -0.296198, -0.469846 + 0.171010, -0.813798, -0.296198, -0.469846 + 0.171010, -0.813798, -0.296198, -0.469846 + 0.171010, -0.813798, -0.296198, -0.469846 + 0.171010, -0.813798, -0.296198, -0.469846 + 0.171010, -0.813798, -0.296198, -0.469846 + 0.171010, -0.813798, -0.296198, -0.469846 + 0.171010, -0.813798, -0.296198, -0.469846 + 0.171010, -0.813798, -0.296198, -0.469846 + 0.171010, -0.813798, -0.296198, -0.469846 + 0.171010, -0.813798, -0.296198, -0.469846 + 0.171010, -0.813798, -0.296198, -0.469846 + 0.171010, -0.813798, -0.296198, -0.469846 + 0.171010, -0.813798, -0.296198, -0.469846 + 0.171010, -0.813798, -0.296198, -0.469846 + 0.171010, -0.813798, -0.296198, -0.469846 + 0.171010, -0.813798, -0.296198, -0.469846 + 0.171010, -0.813798, -0.296198, -0.469846 + 0.171010, -0.813798, -0.296198, -0.469846 + 0.171010, -0.813798, -0.296198, -0.469846 + 0.171010, -0.813798, -0.296198, -0.469846 + 0.187247, -0.796008, -0.305559, -0.487794 + 0.187247, -0.796008, -0.305559, -0.487794 + 0.187247, -0.796008, -0.305559, -0.487794 + 0.187247, -0.796008, -0.305559, -0.487794 + 0.187247, -0.796008, -0.305559, -0.487794 + 0.187247, -0.796008, -0.305559, -0.487794 + 0.187247, -0.796008, -0.305559, -0.487794 + 0.187247, -0.796008, -0.305559, -0.487794 + 0.187247, -0.796008, -0.305559, -0.487794 + 0.187247, -0.796008, -0.305559, -0.487794 + 0.187247, -0.796008, -0.305559, -0.487794 + 0.187247, -0.796008, -0.305559, -0.487794 + 0.187247, -0.796008, -0.305559, -0.487794 + 0.187247, -0.796008, -0.305559, -0.487794 + 0.187247, -0.796008, -0.305559, -0.487794 + 0.187247, -0.796008, -0.305559, -0.487794 + 0.187247, -0.796008, -0.305559, -0.487794 + 0.187247, -0.796008, -0.305559, -0.487794 + 0.187247, -0.796008, -0.305559, -0.487794 + 0.187247, -0.796008, -0.305559, -0.487794 + 0.187247, -0.796008, -0.305559, -0.487794 + 0.187247, -0.796008, -0.305559, -0.487794 + 0.187247, -0.796008, -0.305559, -0.487794 + 0.187247, -0.796008, -0.305559, -0.487794 + 0.187247, -0.796008, -0.305559, -0.487794 + 0.204025, -0.777602, -0.314172, -0.504981 + 0.204025, -0.777602, -0.314172, -0.504981 + 0.204025, -0.777602, -0.314172, -0.504981 + 0.204025, -0.777602, -0.314172, -0.504981 + 0.204025, -0.777602, -0.314172, -0.504981 + 0.204025, -0.777602, -0.314172, -0.504981 + 0.204025, -0.777602, -0.314172, -0.504981 + 0.204025, -0.777602, -0.314172, -0.504981 + 0.204025, -0.777602, -0.314172, -0.504981 + 0.204025, -0.777602, -0.314172, -0.504981 + 0.204025, -0.777602, -0.314172, -0.504981 + 0.204025, -0.777602, -0.314172, -0.504981 + 0.204025, -0.777602, -0.314172, -0.504981 + 0.204025, -0.777602, -0.314172, -0.504981 + 0.204025, -0.777602, -0.314172, -0.504981 + 0.204025, -0.777602, -0.314172, -0.504981 + 0.204025, -0.777602, -0.314172, -0.504981 + 0.204025, -0.777602, -0.314172, -0.504981 + 0.204025, -0.777602, -0.314172, -0.504981 + 0.204025, -0.777602, -0.314172, -0.504981 + 0.204025, -0.777602, -0.314172, -0.504981 + 0.204025, -0.777602, -0.314172, -0.504981 + 0.204025, -0.777602, -0.314172, -0.504981 + 0.204025, -0.777602, -0.314172, -0.504981 + 0.204025, -0.777602, -0.314172, -0.504981 + 0.221313, -0.758612, -0.322012, -0.521380 + 0.221313, -0.758612, -0.322012, -0.521380 + 0.221313, -0.758612, -0.322012, -0.521380 + 0.221313, -0.758612, -0.322012, -0.521380 + 0.221313, -0.758612, -0.322012, -0.521380 + 0.221313, -0.758612, -0.322012, -0.521380 + 0.221313, -0.758612, -0.322012, -0.521380 + 0.221313, -0.758612, -0.322012, -0.521380 + 0.221313, -0.758612, -0.322012, -0.521380 + 0.221313, -0.758612, -0.322012, -0.521380 + 0.221313, -0.758612, -0.322012, -0.521380 + 0.221313, -0.758612, -0.322012, -0.521380 + 0.221313, -0.758612, -0.322012, -0.521380 + 0.221313, -0.758612, -0.322012, -0.521380 + 0.221313, -0.758612, -0.322012, -0.521380 + 0.221313, -0.758612, -0.322012, -0.521380 + 0.221313, -0.758612, -0.322012, -0.521380 + 0.221313, -0.758612, -0.322012, -0.521380 + 0.221313, -0.758612, -0.322012, -0.521380 + 0.221313, -0.758612, -0.322012, -0.521380 + 0.221313, -0.758612, -0.322012, -0.521380 + 0.221313, -0.758612, -0.322012, -0.521380 + 0.221313, -0.758612, -0.322012, -0.521380 + 0.221313, -0.758612, -0.322012, -0.521380 + 0.221313, -0.758612, -0.322012, -0.521380 + 0.239074, -0.739074, -0.329057, -0.536969 + 0.239074, -0.739074, -0.329057, -0.536969 + 0.239074, -0.739074, -0.329057, -0.536969 + 0.239074, -0.739074, -0.329057, -0.536969 + 0.239074, -0.739074, -0.329057, -0.536969 + 0.239074, -0.739074, -0.329057, -0.536969 + 0.239074, -0.739074, -0.329057, -0.536969 + 0.239074, -0.739074, -0.329057, -0.536969 + 0.239074, -0.739074, -0.329057, -0.536969 + 0.239074, -0.739074, -0.329057, -0.536969 + 0.239074, -0.739074, -0.329057, -0.536969 + 0.239074, -0.739074, -0.329057, -0.536969 + 0.239074, -0.739074, -0.329057, -0.536969 + 0.239074, -0.739074, -0.329057, -0.536969 + 0.239074, -0.739074, -0.329057, -0.536969 + 0.239074, -0.739074, -0.329057, -0.536969 + 0.239074, -0.739074, -0.329057, -0.536969 + 0.239074, -0.739074, -0.329057, -0.536969 + 0.239074, -0.739074, -0.329057, -0.536969 + 0.239074, -0.739074, -0.329057, -0.536969 + 0.239074, -0.739074, -0.329057, -0.536969 + 0.239074, -0.739074, -0.329057, -0.536969 + 0.239074, -0.739074, -0.329057, -0.536969 + 0.239074, -0.739074, -0.329057, -0.536969 + 0.239074, -0.739074, -0.329057, -0.536969 + 0.257274, -0.719022, -0.335286, -0.551725 + 0.257274, -0.719022, -0.335286, -0.551725 + 0.257274, -0.719022, -0.335286, -0.551725 + 0.257274, -0.719022, -0.335286, -0.551725 + 0.257274, -0.719022, -0.335286, -0.551725 + 0.257274, -0.719022, -0.335286, -0.551725 + 0.257274, -0.719022, -0.335286, -0.551725 + 0.257274, -0.719022, -0.335286, -0.551725 + 0.257274, -0.719022, -0.335286, -0.551725 + 0.257274, -0.719022, -0.335286, -0.551725 + 0.257274, -0.719022, -0.335286, -0.551725 + 0.257274, -0.719022, -0.335286, -0.551725 + 0.257274, -0.719022, -0.335286, -0.551725 + 0.257274, -0.719022, -0.335286, -0.551725 + 0.257274, -0.719022, -0.335286, -0.551725 + 0.257274, -0.719022, -0.335286, -0.551725 + 0.257274, -0.719022, -0.335286, -0.551725 + 0.257274, -0.719022, -0.335286, -0.551725 + 0.257274, -0.719022, -0.335286, -0.551725 + 0.257274, -0.719022, -0.335286, -0.551725 + 0.257274, -0.719022, -0.335286, -0.551725 + 0.257274, -0.719022, -0.335286, -0.551725 + 0.257274, -0.719022, -0.335286, -0.551725 + 0.257274, -0.719022, -0.335286, -0.551725 + 0.257274, -0.719022, -0.335286, -0.551725 + 0.275876, -0.698494, -0.340678, -0.565629 + 0.275876, -0.698494, -0.340678, -0.565629 + 0.275876, -0.698494, -0.340678, -0.565629 + 0.275876, -0.698494, -0.340678, -0.565629 + 0.275876, -0.698494, -0.340678, -0.565629 + 0.275876, -0.698494, -0.340678, -0.565629 + 0.275876, -0.698494, -0.340678, -0.565629 + 0.275876, -0.698494, -0.340678, -0.565629 + 0.275876, -0.698494, -0.340678, -0.565629 + 0.275876, -0.698494, -0.340678, -0.565629 + 0.275876, -0.698494, -0.340678, -0.565629 + 0.275876, -0.698494, -0.340678, -0.565629 + 0.275876, -0.698494, -0.340678, -0.565629 + 0.275876, -0.698494, -0.340678, -0.565629 + 0.275876, -0.698494, -0.340678, -0.565629 + 0.275876, -0.698494, -0.340678, -0.565629 + 0.275876, -0.698494, -0.340678, -0.565629 + 0.275876, -0.698494, -0.340678, -0.565629 + 0.275876, -0.698494, -0.340678, -0.565629 + 0.275876, -0.698494, -0.340678, -0.565629 + 0.275876, -0.698494, -0.340678, -0.565629 + 0.275876, -0.698494, -0.340678, -0.565629 + 0.275876, -0.698494, -0.340678, -0.565629 + 0.275876, -0.698494, -0.340678, -0.565629 + 0.275876, -0.698494, -0.340678, -0.565629 + 0.294843, -0.677527, -0.345217, -0.578662 + 0.294843, -0.677527, -0.345217, -0.578662 + 0.294843, -0.677527, -0.345217, -0.578662 + 0.294843, -0.677527, -0.345217, -0.578662 + 0.294843, -0.677527, -0.345217, -0.578662 + 0.294843, -0.677527, -0.345217, -0.578662 + 0.294843, -0.677527, -0.345217, -0.578662 + 0.294843, -0.677527, -0.345217, -0.578662 + 0.294843, -0.677527, -0.345217, -0.578662 + 0.294843, -0.677527, -0.345217, -0.578662 + 0.294843, -0.677527, -0.345217, -0.578662 + 0.294843, -0.677527, -0.345217, -0.578662 + 0.294843, -0.677527, -0.345217, -0.578662 + 0.294843, -0.677527, -0.345217, -0.578662 + 0.294843, -0.677527, -0.345217, -0.578662 + 0.294843, -0.677527, -0.345217, -0.578662 + 0.294843, -0.677527, -0.345217, -0.578662 + 0.294843, -0.677527, -0.345217, -0.578662 + 0.294843, -0.677527, -0.345217, -0.578662 + 0.294843, -0.677527, -0.345217, -0.578662 + 0.294843, -0.677527, -0.345217, -0.578662 + 0.294843, -0.677527, -0.345217, -0.578662 + 0.294843, -0.677527, -0.345217, -0.578662 + 0.294843, -0.677527, -0.345217, -0.578662 + 0.294843, -0.677527, -0.345217, -0.578662 + 0.314138, -0.656158, -0.348885, -0.590807 + 0.314138, -0.656158, -0.348885, -0.590807 + 0.314138, -0.656158, -0.348885, -0.590807 + 0.314138, -0.656158, -0.348885, -0.590807 + 0.314138, -0.656158, -0.348885, -0.590807 + 0.314138, -0.656158, -0.348885, -0.590807 + 0.314138, -0.656158, -0.348885, -0.590807 + 0.314138, -0.656158, -0.348885, -0.590807 + 0.314138, -0.656158, -0.348885, -0.590807 + 0.314138, -0.656158, -0.348885, -0.590807 + 0.314138, -0.656158, -0.348885, -0.590807 + 0.314138, -0.656158, -0.348885, -0.590807 + 0.314138, -0.656158, -0.348885, -0.590807 + 0.314138, -0.656158, -0.348885, -0.590807 + 0.314138, -0.656158, -0.348885, -0.590807 + 0.314138, -0.656158, -0.348885, -0.590807 + 0.314138, -0.656158, -0.348885, -0.590807 + 0.314138, -0.656158, -0.348885, -0.590807 + 0.314138, -0.656158, -0.348885, -0.590807 + 0.314138, -0.656158, -0.348885, -0.590807 + 0.314138, -0.656158, -0.348885, -0.590807 + 0.314138, -0.656158, -0.348885, -0.590807 + 0.314138, -0.656158, -0.348885, -0.590807 + 0.314138, -0.656158, -0.348885, -0.590807 + 0.314138, -0.656158, -0.348885, -0.590807 + 0.333721, -0.634427, -0.351668, -0.602048 + 0.333721, -0.634427, -0.351668, -0.602048 + 0.333721, -0.634427, -0.351668, -0.602048 + 0.333721, -0.634427, -0.351668, -0.602048 + 0.333721, -0.634427, -0.351668, -0.602048 + 0.333721, -0.634427, -0.351668, -0.602048 + 0.333721, -0.634427, -0.351668, -0.602048 + 0.333721, -0.634427, -0.351668, -0.602048 + 0.333721, -0.634427, -0.351668, -0.602048 + 0.333721, -0.634427, -0.351668, -0.602048 + 0.333721, -0.634427, -0.351668, -0.602048 + 0.333721, -0.634427, -0.351668, -0.602048 + 0.333721, -0.634427, -0.351668, -0.602048 + 0.333721, -0.634427, -0.351668, -0.602048 + 0.333721, -0.634427, -0.351668, -0.602048 + 0.333721, -0.634427, -0.351668, -0.602048 + 0.333721, -0.634427, -0.351668, -0.602048 + 0.333721, -0.634427, -0.351668, -0.602048 + 0.333721, -0.634427, -0.351668, -0.602048 + 0.333721, -0.634427, -0.351668, -0.602048 + 0.333721, -0.634427, -0.351668, -0.602048 + 0.333721, -0.634427, -0.351668, -0.602048 + 0.333721, -0.634427, -0.351668, -0.602048 + 0.333721, -0.634427, -0.351668, -0.602048 + 0.333721, -0.634427, -0.351668, -0.602048 + 0.353553, -0.612372, -0.353553, -0.612372 + 0.353553, -0.612372, -0.353553, -0.612372 + 0.353553, -0.612372, -0.353553, -0.612372 + 0.353553, -0.612372, -0.353553, -0.612372 + 0.353553, -0.612372, -0.353553, -0.612372 + 0.353553, -0.612372, -0.353553, -0.612372 + 0.353553, -0.612372, -0.353553, -0.612372 + 0.353553, -0.612372, -0.353553, -0.612372 + 0.353553, -0.612372, -0.353553, -0.612372 + 0.353553, -0.612372, -0.353553, -0.612372 + 0.353553, -0.612372, -0.353553, -0.612372 + 0.353553, -0.612372, -0.353553, -0.612372 + 0.353553, -0.612372, -0.353553, -0.612372 + 0.353553, -0.612372, -0.353553, -0.612372 + 0.353553, -0.612372, -0.353553, -0.612372 + 0.353553, -0.612372, -0.353553, -0.612372 + 0.353553, -0.612372, -0.353553, -0.612372 + 0.353553, -0.612372, -0.353553, -0.612372 + 0.353553, -0.612372, -0.353553, -0.612372 + 0.353553, -0.612372, -0.353553, -0.612372 + 0.353553, -0.612372, -0.353553, -0.612372 + 0.353553, -0.612372, -0.353553, -0.612372 + 0.353553, -0.612372, -0.353553, -0.612372 + 0.353553, -0.612372, -0.353553, -0.612372 + 0.353553, -0.612372, -0.353553, -0.612372 + 0.373595, -0.590035, -0.354529, -0.621767 + 0.373595, -0.590035, -0.354529, -0.621767 + 0.373595, -0.590035, -0.354529, -0.621767 + 0.373595, -0.590035, -0.354529, -0.621767 + 0.373595, -0.590035, -0.354529, -0.621767 + 0.373595, -0.590035, -0.354529, -0.621767 + 0.373595, -0.590035, -0.354529, -0.621767 + 0.373595, -0.590035, -0.354529, -0.621767 + 0.373595, -0.590035, -0.354529, -0.621767 + 0.373595, -0.590035, -0.354529, -0.621767 + 0.373595, -0.590035, -0.354529, -0.621767 + 0.373595, -0.590035, -0.354529, -0.621767 + 0.373595, -0.590035, -0.354529, -0.621767 + 0.373595, -0.590035, -0.354529, -0.621767 + 0.373595, -0.590035, -0.354529, -0.621767 + 0.373595, -0.590035, -0.354529, -0.621767 + 0.373595, -0.590035, -0.354529, -0.621767 + 0.373595, -0.590035, -0.354529, -0.621767 + 0.373595, -0.590035, -0.354529, -0.621767 + 0.373595, -0.590035, -0.354529, -0.621767 + 0.373595, -0.590035, -0.354529, -0.621767 + 0.373595, -0.590035, -0.354529, -0.621767 + 0.373595, -0.590035, -0.354529, -0.621767 + 0.373595, -0.590035, -0.354529, -0.621767 + 0.373595, -0.590035, -0.354529, -0.621767 + 0.393807, -0.567455, -0.354585, -0.630223 + 0.393807, -0.567455, -0.354585, -0.630223 + 0.393807, -0.567455, -0.354585, -0.630223 + 0.393807, -0.567455, -0.354585, -0.630223 + 0.393807, -0.567455, -0.354585, -0.630223 + 0.393807, -0.567455, -0.354585, -0.630223 + 0.393807, -0.567455, -0.354585, -0.630223 + 0.393807, -0.567455, -0.354585, -0.630223 + 0.393807, -0.567455, -0.354585, -0.630223 + 0.393807, -0.567455, -0.354585, -0.630223 + 0.393807, -0.567455, -0.354585, -0.630223 + 0.393807, -0.567455, -0.354585, -0.630223 + 0.393807, -0.567455, -0.354585, -0.630223 + 0.393807, -0.567455, -0.354585, -0.630223 + 0.393807, -0.567455, -0.354585, -0.630223 + 0.393807, -0.567455, -0.354585, -0.630223 + 0.393807, -0.567455, -0.354585, -0.630223 + 0.393807, -0.567455, -0.354585, -0.630223 + 0.393807, -0.567455, -0.354585, -0.630223 + 0.393807, -0.567455, -0.354585, -0.630223 + 0.393807, -0.567455, -0.354585, -0.630223 + 0.393807, -0.567455, -0.354585, -0.630223 + 0.393807, -0.567455, -0.354585, -0.630223 + 0.393807, -0.567455, -0.354585, -0.630223 + 0.393807, -0.567455, -0.354585, -0.630223 + 0.414147, -0.544673, -0.353715, -0.637730 + 0.414147, -0.544673, -0.353715, -0.637730 + 0.414147, -0.544673, -0.353715, -0.637730 + 0.414147, -0.544673, -0.353715, -0.637730 + 0.414147, -0.544673, -0.353715, -0.637730 + 0.414147, -0.544673, -0.353715, -0.637730 + 0.414147, -0.544673, -0.353715, -0.637730 + 0.414147, -0.544673, -0.353715, -0.637730 + 0.414147, -0.544673, -0.353715, -0.637730 + 0.414147, -0.544673, -0.353715, -0.637730 + 0.414147, -0.544673, -0.353715, -0.637730 + 0.414147, -0.544673, -0.353715, -0.637730 + 0.414147, -0.544673, -0.353715, -0.637730 + 0.414147, -0.544673, -0.353715, -0.637730 + 0.414147, -0.544673, -0.353715, -0.637730 + 0.414147, -0.544673, -0.353715, -0.637730 + 0.414147, -0.544673, -0.353715, -0.637730 + 0.414147, -0.544673, -0.353715, -0.637730 + 0.414147, -0.544673, -0.353715, -0.637730 + 0.414147, -0.544673, -0.353715, -0.637730 + 0.414147, -0.544673, -0.353715, -0.637730 + 0.414147, -0.544673, -0.353715, -0.637730 + 0.414147, -0.544673, -0.353715, -0.637730 + 0.414147, -0.544673, -0.353715, -0.637730 + 0.414147, -0.544673, -0.353715, -0.637730 + 0.434575, -0.521730, -0.351911, -0.644283 + 0.434575, -0.521730, -0.351911, -0.644283 + 0.434575, -0.521730, -0.351911, -0.644283 + 0.434575, -0.521730, -0.351911, -0.644283 + 0.434575, -0.521730, -0.351911, -0.644283 + 0.434575, -0.521730, -0.351911, -0.644283 + 0.434575, -0.521730, -0.351911, -0.644283 + 0.434575, -0.521730, -0.351911, -0.644283 + 0.434575, -0.521730, -0.351911, -0.644283 + 0.434575, -0.521730, -0.351911, -0.644283 + 0.434575, -0.521730, -0.351911, -0.644283 + 0.434575, -0.521730, -0.351911, -0.644283 + 0.434575, -0.521730, -0.351911, -0.644283 + 0.434575, -0.521730, -0.351911, -0.644283 + 0.434575, -0.521730, -0.351911, -0.644283 + 0.434575, -0.521730, -0.351911, -0.644283 + 0.434575, -0.521730, -0.351911, -0.644283 + 0.434575, -0.521730, -0.351911, -0.644283 + 0.434575, -0.521730, -0.351911, -0.644283 + 0.434575, -0.521730, -0.351911, -0.644283 + 0.434575, -0.521730, -0.351911, -0.644283 + 0.434575, -0.521730, -0.351911, -0.644283 + 0.434575, -0.521730, -0.351911, -0.644283 + 0.434575, -0.521730, -0.351911, -0.644283 + 0.434575, -0.521730, -0.351911, -0.644283 + 0.455049, -0.498668, -0.349171, -0.649877 + 0.455049, -0.498668, -0.349171, -0.649877 + 0.455049, -0.498668, -0.349171, -0.649877 + 0.455049, -0.498668, -0.349171, -0.649877 + 0.455049, -0.498668, -0.349171, -0.649877 + 0.455049, -0.498668, -0.349171, -0.649877 + 0.455049, -0.498668, -0.349171, -0.649877 + 0.455049, -0.498668, -0.349171, -0.649877 + 0.455049, -0.498668, -0.349171, -0.649877 + 0.455049, -0.498668, -0.349171, -0.649877 + 0.455049, -0.498668, -0.349171, -0.649877 + 0.455049, -0.498668, -0.349171, -0.649877 + 0.455049, -0.498668, -0.349171, -0.649877 + 0.455049, -0.498668, -0.349171, -0.649877 + 0.455049, -0.498668, -0.349171, -0.649877 + 0.455049, -0.498668, -0.349171, -0.649877 + 0.455049, -0.498668, -0.349171, -0.649877 + 0.455049, -0.498668, -0.349171, -0.649877 + 0.455049, -0.498668, -0.349171, -0.649877 + 0.455049, -0.498668, -0.349171, -0.649877 + 0.455049, -0.498668, -0.349171, -0.649877 + 0.455049, -0.498668, -0.349171, -0.649877 + 0.455049, -0.498668, -0.349171, -0.649877 + 0.455049, -0.498668, -0.349171, -0.649877 + 0.455049, -0.498668, -0.349171, -0.649877 + 0.475528, -0.475528, -0.345492, -0.654508 + 0.475528, -0.475528, -0.345492, -0.654508 + 0.475528, -0.475528, -0.345492, -0.654508 + 0.475528, -0.475528, -0.345492, -0.654508 + 0.475528, -0.475528, -0.345492, -0.654508 + 0.475528, -0.475528, -0.345492, -0.654508 + 0.475528, -0.475528, -0.345492, -0.654508 + 0.475528, -0.475528, -0.345492, -0.654508 + 0.475528, -0.475528, -0.345492, -0.654508 + 0.475528, -0.475528, -0.345492, -0.654508 + 0.475528, -0.475528, -0.345492, -0.654508 + 0.475528, -0.475528, -0.345492, -0.654508 + 0.475528, -0.475528, -0.345492, -0.654508 + 0.475528, -0.475528, -0.345492, -0.654508 + 0.475528, -0.475528, -0.345492, -0.654508 + 0.475528, -0.475528, -0.345492, -0.654508 + 0.475528, -0.475528, -0.345492, -0.654508 + 0.475528, -0.475528, -0.345492, -0.654508 + 0.475528, -0.475528, -0.345492, -0.654508 + 0.475528, -0.475528, -0.345492, -0.654508 + 0.475528, -0.475528, -0.345492, -0.654508 + 0.475528, -0.475528, -0.345492, -0.654508 + 0.475528, -0.475528, -0.345492, -0.654508 + 0.475528, -0.475528, -0.345492, -0.654508 + 0.475528, -0.475528, -0.345492, -0.654508 + 0.495972, -0.452352, -0.340872, -0.658176 + 0.495972, -0.452352, -0.340872, -0.658176 + 0.495972, -0.452352, -0.340872, -0.658176 + 0.495972, -0.452352, -0.340872, -0.658176 + 0.495972, -0.452352, -0.340872, -0.658176 + 0.495972, -0.452352, -0.340872, -0.658176 + 0.495972, -0.452352, -0.340872, -0.658176 + 0.495972, -0.452352, -0.340872, -0.658176 + 0.495972, -0.452352, -0.340872, -0.658176 + 0.495972, -0.452352, -0.340872, -0.658176 + 0.495972, -0.452352, -0.340872, -0.658176 + 0.495972, -0.452352, -0.340872, -0.658176 + 0.495972, -0.452352, -0.340872, -0.658176 + 0.495972, -0.452352, -0.340872, -0.658176 + 0.495972, -0.452352, -0.340872, -0.658176 + 0.495972, -0.452352, -0.340872, -0.658176 + 0.495972, -0.452352, -0.340872, -0.658176 + 0.495972, -0.452352, -0.340872, -0.658176 + 0.495972, -0.452352, -0.340872, -0.658176 + 0.495972, -0.452352, -0.340872, -0.658176 + 0.495972, -0.452352, -0.340872, -0.658176 + 0.495972, -0.452352, -0.340872, -0.658176 + 0.495972, -0.452352, -0.340872, -0.658176 + 0.495972, -0.452352, -0.340872, -0.658176 + 0.495972, -0.452352, -0.340872, -0.658176 + 0.516337, -0.429181, -0.335313, -0.660881 + 0.516337, -0.429181, -0.335313, -0.660881 + 0.516337, -0.429181, -0.335313, -0.660881 + 0.516337, -0.429181, -0.335313, -0.660881 + 0.516337, -0.429181, -0.335313, -0.660881 + 0.516337, -0.429181, -0.335313, -0.660881 + 0.516337, -0.429181, -0.335313, -0.660881 + 0.516337, -0.429181, -0.335313, -0.660881 + 0.516337, -0.429181, -0.335313, -0.660881 + 0.516337, -0.429181, -0.335313, -0.660881 + 0.516337, -0.429181, -0.335313, -0.660881 + 0.516337, -0.429181, -0.335313, -0.660881 + 0.516337, -0.429181, -0.335313, -0.660881 + 0.516337, -0.429181, -0.335313, -0.660881 + 0.516337, -0.429181, -0.335313, -0.660881 + 0.516337, -0.429181, -0.335313, -0.660881 + 0.516337, -0.429181, -0.335313, -0.660881 + 0.516337, -0.429181, -0.335313, -0.660881 + 0.516337, -0.429181, -0.335313, -0.660881 + 0.516337, -0.429181, -0.335313, -0.660881 + 0.516337, -0.429181, -0.335313, -0.660881 + 0.516337, -0.429181, -0.335313, -0.660881 + 0.516337, -0.429181, -0.335313, -0.660881 + 0.516337, -0.429181, -0.335313, -0.660881 + 0.516337, -0.429181, -0.335313, -0.660881 + 0.536584, -0.406058, -0.328819, -0.662626 + 0.536584, -0.406058, -0.328819, -0.662626 + 0.536584, -0.406058, -0.328819, -0.662626 + 0.536584, -0.406058, -0.328819, -0.662626 + 0.536584, -0.406058, -0.328819, -0.662626 + 0.536584, -0.406058, -0.328819, -0.662626 + 0.536584, -0.406058, -0.328819, -0.662626 + 0.536584, -0.406058, -0.328819, -0.662626 + 0.536584, -0.406058, -0.328819, -0.662626 + 0.536584, -0.406058, -0.328819, -0.662626 + 0.536584, -0.406058, -0.328819, -0.662626 + 0.536584, -0.406058, -0.328819, -0.662626 + 0.536584, -0.406058, -0.328819, -0.662626 + 0.536584, -0.406058, -0.328819, -0.662626 + 0.536584, -0.406058, -0.328819, -0.662626 + 0.536584, -0.406058, -0.328819, -0.662626 + 0.536584, -0.406058, -0.328819, -0.662626 + 0.536584, -0.406058, -0.328819, -0.662626 + 0.536584, -0.406058, -0.328819, -0.662626 + 0.536584, -0.406058, -0.328819, -0.662626 + 0.536584, -0.406058, -0.328819, -0.662626 + 0.536584, -0.406058, -0.328819, -0.662626 + 0.536584, -0.406058, -0.328819, -0.662626 + 0.536584, -0.406058, -0.328819, -0.662626 + 0.536584, -0.406058, -0.328819, -0.662626 + 0.556670, -0.383022, -0.321394, -0.663414 + 0.556670, -0.383022, -0.321394, -0.663414 + 0.556670, -0.383022, -0.321394, -0.663414 + 0.556670, -0.383022, -0.321394, -0.663414 + 0.556670, -0.383022, -0.321394, -0.663414 + 0.556670, -0.383022, -0.321394, -0.663414 + 0.556670, -0.383022, -0.321394, -0.663414 + 0.556670, -0.383022, -0.321394, -0.663414 + 0.556670, -0.383022, -0.321394, -0.663414 + 0.556670, -0.383022, -0.321394, -0.663414 + 0.556670, -0.383022, -0.321394, -0.663414 + 0.556670, -0.383022, -0.321394, -0.663414 + 0.556670, -0.383022, -0.321394, -0.663414 + 0.556670, -0.383022, -0.321394, -0.663414 + 0.556670, -0.383022, -0.321394, -0.663414 + 0.556670, -0.383022, -0.321394, -0.663414 + 0.556670, -0.383022, -0.321394, -0.663414 + 0.556670, -0.383022, -0.321394, -0.663414 + 0.556670, -0.383022, -0.321394, -0.663414 + 0.556670, -0.383022, -0.321394, -0.663414 + 0.556670, -0.383022, -0.321394, -0.663414 + 0.556670, -0.383022, -0.321394, -0.663414 + 0.556670, -0.383022, -0.321394, -0.663414 + 0.556670, -0.383022, -0.321394, -0.663414 + 0.556670, -0.383022, -0.321394, -0.663414 + 0.576556, -0.360116, -0.313044, -0.663252 + 0.576556, -0.360116, -0.313044, -0.663252 + 0.576556, -0.360116, -0.313044, -0.663252 + 0.576556, -0.360116, -0.313044, -0.663252 + 0.576556, -0.360116, -0.313044, -0.663252 + 0.576556, -0.360116, -0.313044, -0.663252 + 0.576556, -0.360116, -0.313044, -0.663252 + 0.576556, -0.360116, -0.313044, -0.663252 + 0.576556, -0.360116, -0.313044, -0.663252 + 0.576556, -0.360116, -0.313044, -0.663252 + 0.576556, -0.360116, -0.313044, -0.663252 + 0.576556, -0.360116, -0.313044, -0.663252 + 0.576556, -0.360116, -0.313044, -0.663252 + 0.576556, -0.360116, -0.313044, -0.663252 + 0.576556, -0.360116, -0.313044, -0.663252 + 0.576556, -0.360116, -0.313044, -0.663252 + 0.576556, -0.360116, -0.313044, -0.663252 + 0.576556, -0.360116, -0.313044, -0.663252 + 0.576556, -0.360116, -0.313044, -0.663252 + 0.576556, -0.360116, -0.313044, -0.663252 + 0.576556, -0.360116, -0.313044, -0.663252 + 0.576556, -0.360116, -0.313044, -0.663252 + 0.576556, -0.360116, -0.313044, -0.663252 + 0.576556, -0.360116, -0.313044, -0.663252 + 0.576556, -0.360116, -0.313044, -0.663252 + 0.596200, -0.337381, -0.303779, -0.662147 + 0.596200, -0.337381, -0.303779, -0.662147 + 0.596200, -0.337381, -0.303779, -0.662147 + 0.596200, -0.337381, -0.303779, -0.662147 + 0.596200, -0.337381, -0.303779, -0.662147 + 0.596200, -0.337381, -0.303779, -0.662147 + 0.596200, -0.337381, -0.303779, -0.662147 + 0.596200, -0.337381, -0.303779, -0.662147 + 0.596200, -0.337381, -0.303779, -0.662147 + 0.596200, -0.337381, -0.303779, -0.662147 + 0.596200, -0.337381, -0.303779, -0.662147 + 0.596200, -0.337381, -0.303779, -0.662147 + 0.596200, -0.337381, -0.303779, -0.662147 + 0.596200, -0.337381, -0.303779, -0.662147 + 0.596200, -0.337381, -0.303779, -0.662147 + 0.596200, -0.337381, -0.303779, -0.662147 + 0.596200, -0.337381, -0.303779, -0.662147 + 0.596200, -0.337381, -0.303779, -0.662147 + 0.596200, -0.337381, -0.303779, -0.662147 + 0.596200, -0.337381, -0.303779, -0.662147 + 0.596200, -0.337381, -0.303779, -0.662147 + 0.596200, -0.337381, -0.303779, -0.662147 + 0.596200, -0.337381, -0.303779, -0.662147 + 0.596200, -0.337381, -0.303779, -0.662147 + 0.596200, -0.337381, -0.303779, -0.662147 + 0.615562, -0.314856, -0.293608, -0.660109 + 0.615562, -0.314856, -0.293608, -0.660109 + 0.615562, -0.314856, -0.293608, -0.660109 + 0.615562, -0.314856, -0.293608, -0.660109 + 0.615562, -0.314856, -0.293608, -0.660109 + 0.615562, -0.314856, -0.293608, -0.660109 + 0.615562, -0.314856, -0.293608, -0.660109 + 0.615562, -0.314856, -0.293608, -0.660109 + 0.615562, -0.314856, -0.293608, -0.660109 + 0.615562, -0.314856, -0.293608, -0.660109 + 0.615562, -0.314856, -0.293608, -0.660109 + 0.615562, -0.314856, -0.293608, -0.660109 + 0.615562, -0.314856, -0.293608, -0.660109 + 0.615562, -0.314856, -0.293608, -0.660109 + 0.615562, -0.314856, -0.293608, -0.660109 + 0.615562, -0.314856, -0.293608, -0.660109 + 0.615562, -0.314856, -0.293608, -0.660109 + 0.615562, -0.314856, -0.293608, -0.660109 + 0.615562, -0.314856, -0.293608, -0.660109 + 0.615562, -0.314856, -0.293608, -0.660109 + 0.615562, -0.314856, -0.293608, -0.660109 + 0.615562, -0.314856, -0.293608, -0.660109 + 0.615562, -0.314856, -0.293608, -0.660109 + 0.615562, -0.314856, -0.293608, -0.660109 + 0.615562, -0.314856, -0.293608, -0.660109 + 0.634602, -0.292582, -0.282543, -0.657150 + 0.634602, -0.292582, -0.282543, -0.657150 + 0.634602, -0.292582, -0.282543, -0.657150 + 0.634602, -0.292582, -0.282543, -0.657150 + 0.634602, -0.292582, -0.282543, -0.657150 + 0.634602, -0.292582, -0.282543, -0.657150 + 0.634602, -0.292582, -0.282543, -0.657150 + 0.634602, -0.292582, -0.282543, -0.657150 + 0.634602, -0.292582, -0.282543, -0.657150 + 0.634602, -0.292582, -0.282543, -0.657150 + 0.634602, -0.292582, -0.282543, -0.657150 + 0.634602, -0.292582, -0.282543, -0.657150 + 0.634602, -0.292582, -0.282543, -0.657150 + 0.634602, -0.292582, -0.282543, -0.657150 + 0.634602, -0.292582, -0.282543, -0.657150 + 0.634602, -0.292582, -0.282543, -0.657150 + 0.634602, -0.292582, -0.282543, -0.657150 + 0.634602, -0.292582, -0.282543, -0.657150 + 0.634602, -0.292582, -0.282543, -0.657150 + 0.634602, -0.292582, -0.282543, -0.657150 + 0.634602, -0.292582, -0.282543, -0.657150 + 0.634602, -0.292582, -0.282543, -0.657150 + 0.634602, -0.292582, -0.282543, -0.657150 + 0.634602, -0.292582, -0.282543, -0.657150 + 0.634602, -0.292582, -0.282543, -0.657150 + 0.653281, -0.270598, -0.270598, -0.653281 + 0.653281, -0.270598, -0.270598, -0.653281 + 0.653281, -0.270598, -0.270598, -0.653281 + 0.653281, -0.270598, -0.270598, -0.653281 + 0.653281, -0.270598, -0.270598, -0.653281 + 0.653281, -0.270598, -0.270598, -0.653281 + 0.653281, -0.270598, -0.270598, -0.653281 + 0.653281, -0.270598, -0.270598, -0.653281 + 0.653281, -0.270598, -0.270598, -0.653281 + 0.653281, -0.270598, -0.270598, -0.653281 + 0.653281, -0.270598, -0.270598, -0.653281 + 0.653281, -0.270598, -0.270598, -0.653281 + 0.653281, -0.270598, -0.270598, -0.653281 + 0.653281, -0.270598, -0.270598, -0.653281 + 0.653281, -0.270598, -0.270598, -0.653281 + 0.653281, -0.270598, -0.270598, -0.653281 + 0.653281, -0.270598, -0.270598, -0.653281 + 0.653281, -0.270598, -0.270598, -0.653281 + 0.653281, -0.270598, -0.270598, -0.653281 + 0.653281, -0.270598, -0.270598, -0.653281 + 0.653281, -0.270598, -0.270598, -0.653281 + 0.653281, -0.270598, -0.270598, -0.653281 + 0.653281, -0.270598, -0.270598, -0.653281 + 0.653281, -0.270598, -0.270598, -0.653281 + 0.653281, -0.270598, -0.270598, -0.653281 + 0.671562, -0.248943, -0.257788, -0.648519 + 0.671562, -0.248943, -0.257788, -0.648519 + 0.671562, -0.248943, -0.257788, -0.648519 + 0.671562, -0.248943, -0.257788, -0.648519 + 0.671562, -0.248943, -0.257788, -0.648519 + 0.671562, -0.248943, -0.257788, -0.648519 + 0.671562, -0.248943, -0.257788, -0.648519 + 0.671562, -0.248943, -0.257788, -0.648519 + 0.671562, -0.248943, -0.257788, -0.648519 + 0.671562, -0.248943, -0.257788, -0.648519 + 0.671562, -0.248943, -0.257788, -0.648519 + 0.671562, -0.248943, -0.257788, -0.648519 + 0.671562, -0.248943, -0.257788, -0.648519 + 0.671562, -0.248943, -0.257788, -0.648519 + 0.671562, -0.248943, -0.257788, -0.648519 + 0.671562, -0.248943, -0.257788, -0.648519 + 0.671562, -0.248943, -0.257788, -0.648519 + 0.671562, -0.248943, -0.257788, -0.648519 + 0.671562, -0.248943, -0.257788, -0.648519 + 0.671562, -0.248943, -0.257788, -0.648519 + 0.671562, -0.248943, -0.257788, -0.648519 + 0.671562, -0.248943, -0.257788, -0.648519 + 0.671562, -0.248943, -0.257788, -0.648519 + 0.671562, -0.248943, -0.257788, -0.648519 + 0.671562, -0.248943, -0.257788, -0.648519 + 0.689404, -0.227656, -0.244131, -0.642880 + 0.689404, -0.227656, -0.244131, -0.642880 + 0.689404, -0.227656, -0.244131, -0.642880 + 0.689404, -0.227656, -0.244131, -0.642880 + 0.689404, -0.227656, -0.244131, -0.642880 + 0.689404, -0.227656, -0.244131, -0.642880 + 0.689404, -0.227656, -0.244131, -0.642880 + 0.689404, -0.227656, -0.244131, -0.642880 + 0.689404, -0.227656, -0.244131, -0.642880 + 0.689404, -0.227656, -0.244131, -0.642880 + 0.689404, -0.227656, -0.244131, -0.642880 + 0.689404, -0.227656, -0.244131, -0.642880 + 0.689404, -0.227656, -0.244131, -0.642880 + 0.689404, -0.227656, -0.244131, -0.642880 + 0.689404, -0.227656, -0.244131, -0.642880 + 0.689404, -0.227656, -0.244131, -0.642880 + 0.689404, -0.227656, -0.244131, -0.642880 + 0.689404, -0.227656, -0.244131, -0.642880 + 0.689404, -0.227656, -0.244131, -0.642880 + 0.689404, -0.227656, -0.244131, -0.642880 + 0.689404, -0.227656, -0.244131, -0.642880 + 0.689404, -0.227656, -0.244131, -0.642880 + 0.689404, -0.227656, -0.244131, -0.642880 + 0.689404, -0.227656, -0.244131, -0.642880 + 0.689404, -0.227656, -0.244131, -0.642880 + 0.706773, -0.206773, -0.229644, -0.636381 + 0.706773, -0.206773, -0.229644, -0.636381 + 0.706773, -0.206773, -0.229644, -0.636381 + 0.706773, -0.206773, -0.229644, -0.636381 + 0.706773, -0.206773, -0.229644, -0.636381 + 0.706773, -0.206773, -0.229644, -0.636381 + 0.706773, -0.206773, -0.229644, -0.636381 + 0.706773, -0.206773, -0.229644, -0.636381 + 0.706773, -0.206773, -0.229644, -0.636381 + 0.706773, -0.206773, -0.229644, -0.636381 + 0.706773, -0.206773, -0.229644, -0.636381 + 0.706773, -0.206773, -0.229644, -0.636381 + 0.706773, -0.206773, -0.229644, -0.636381 + 0.706773, -0.206773, -0.229644, -0.636381 + 0.706773, -0.206773, -0.229644, -0.636381 + 0.706773, -0.206773, -0.229644, -0.636381 + 0.706773, -0.206773, -0.229644, -0.636381 + 0.706773, -0.206773, -0.229644, -0.636381 + 0.706773, -0.206773, -0.229644, -0.636381 + 0.706773, -0.206773, -0.229644, -0.636381 + 0.706773, -0.206773, -0.229644, -0.636381 + 0.706773, -0.206773, -0.229644, -0.636381 + 0.706773, -0.206773, -0.229644, -0.636381 + 0.706773, -0.206773, -0.229644, -0.636381 + 0.706773, -0.206773, -0.229644, -0.636381 + 0.723630, -0.186331, -0.214349, -0.629042 + 0.723630, -0.186331, -0.214349, -0.629042 + 0.723630, -0.186331, -0.214349, -0.629042 + 0.723630, -0.186331, -0.214349, -0.629042 + 0.723630, -0.186331, -0.214349, -0.629042 + 0.723630, -0.186331, -0.214349, -0.629042 + 0.723630, -0.186331, -0.214349, -0.629042 + 0.723630, -0.186331, -0.214349, -0.629042 + 0.723630, -0.186331, -0.214349, -0.629042 + 0.723630, -0.186331, -0.214349, -0.629042 + 0.723630, -0.186331, -0.214349, -0.629042 + 0.723630, -0.186331, -0.214349, -0.629042 + 0.723630, -0.186331, -0.214349, -0.629042 + 0.723630, -0.186331, -0.214349, -0.629042 + 0.723630, -0.186331, -0.214349, -0.629042 + 0.723630, -0.186331, -0.214349, -0.629042 + 0.723630, -0.186331, -0.214349, -0.629042 + 0.723630, -0.186331, -0.214349, -0.629042 + 0.723630, -0.186331, -0.214349, -0.629042 + 0.723630, -0.186331, -0.214349, -0.629042 + 0.723630, -0.186331, -0.214349, -0.629042 + 0.723630, -0.186331, -0.214349, -0.629042 + 0.723630, -0.186331, -0.214349, -0.629042 + 0.723630, -0.186331, -0.214349, -0.629042 + 0.723630, -0.186331, -0.214349, -0.629042 + 0.739942, -0.166366, -0.198267, -0.620885 + 0.739942, -0.166366, -0.198267, -0.620885 + 0.739942, -0.166366, -0.198267, -0.620885 + 0.739942, -0.166366, -0.198267, -0.620885 + 0.739942, -0.166366, -0.198267, -0.620885 + 0.739942, -0.166366, -0.198267, -0.620885 + 0.739942, -0.166366, -0.198267, -0.620885 + 0.739942, -0.166366, -0.198267, -0.620885 + 0.739942, -0.166366, -0.198267, -0.620885 + 0.739942, -0.166366, -0.198267, -0.620885 + 0.739942, -0.166366, -0.198267, -0.620885 + 0.739942, -0.166366, -0.198267, -0.620885 + 0.739942, -0.166366, -0.198267, -0.620885 + 0.739942, -0.166366, -0.198267, -0.620885 + 0.739942, -0.166366, -0.198267, -0.620885 + 0.739942, -0.166366, -0.198267, -0.620885 + 0.739942, -0.166366, -0.198267, -0.620885 + 0.739942, -0.166366, -0.198267, -0.620885 + 0.739942, -0.166366, -0.198267, -0.620885 + 0.739942, -0.166366, -0.198267, -0.620885 + 0.739942, -0.166366, -0.198267, -0.620885 + 0.739942, -0.166366, -0.198267, -0.620885 + 0.739942, -0.166366, -0.198267, -0.620885 + 0.739942, -0.166366, -0.198267, -0.620885 + 0.739942, -0.166366, -0.198267, -0.620885 + 0.755673, -0.146912, -0.181421, -0.611932 + 0.755673, -0.146912, -0.181421, -0.611932 + 0.755673, -0.146912, -0.181421, -0.611932 + 0.755673, -0.146912, -0.181421, -0.611932 + 0.755673, -0.146912, -0.181421, -0.611932 + 0.755673, -0.146912, -0.181421, -0.611932 + 0.755673, -0.146912, -0.181421, -0.611932 + 0.755673, -0.146912, -0.181421, -0.611932 + 0.755673, -0.146912, -0.181421, -0.611932 + 0.755673, -0.146912, -0.181421, -0.611932 + 0.755673, -0.146912, -0.181421, -0.611932 + 0.755673, -0.146912, -0.181421, -0.611932 + 0.755673, -0.146912, -0.181421, -0.611932 + 0.755673, -0.146912, -0.181421, -0.611932 + 0.755673, -0.146912, -0.181421, -0.611932 + 0.755673, -0.146912, -0.181421, -0.611932 + 0.755673, -0.146912, -0.181421, -0.611932 + 0.755673, -0.146912, -0.181421, -0.611932 + 0.755673, -0.146912, -0.181421, -0.611932 + 0.755673, -0.146912, -0.181421, -0.611932 + 0.755673, -0.146912, -0.181421, -0.611932 + 0.755673, -0.146912, -0.181421, -0.611932 + 0.755673, -0.146912, -0.181421, -0.611932 + 0.755673, -0.146912, -0.181421, -0.611932 + 0.755673, -0.146912, -0.181421, -0.611932 + 0.770791, -0.128003, -0.163837, -0.602208 + 0.770791, -0.128003, -0.163837, -0.602208 + 0.770791, -0.128003, -0.163837, -0.602208 + 0.770791, -0.128003, -0.163837, -0.602208 + 0.770791, -0.128003, -0.163837, -0.602208 + 0.770791, -0.128003, -0.163837, -0.602208 + 0.770791, -0.128003, -0.163837, -0.602208 + 0.770791, -0.128003, -0.163837, -0.602208 + 0.770791, -0.128003, -0.163837, -0.602208 + 0.770791, -0.128003, -0.163837, -0.602208 + 0.770791, -0.128003, -0.163837, -0.602208 + 0.770791, -0.128003, -0.163837, -0.602208 + 0.770791, -0.128003, -0.163837, -0.602208 + 0.770791, -0.128003, -0.163837, -0.602208 + 0.770791, -0.128003, -0.163837, -0.602208 + 0.770791, -0.128003, -0.163837, -0.602208 + 0.770791, -0.128003, -0.163837, -0.602208 + 0.770791, -0.128003, -0.163837, -0.602208 + 0.770791, -0.128003, -0.163837, -0.602208 + 0.770791, -0.128003, -0.163837, -0.602208 + 0.770791, -0.128003, -0.163837, -0.602208 + 0.770791, -0.128003, -0.163837, -0.602208 + 0.770791, -0.128003, -0.163837, -0.602208 + 0.770791, -0.128003, -0.163837, -0.602208 + 0.770791, -0.128003, -0.163837, -0.602208 + 0.785262, -0.109672, -0.145540, -0.591738 + 0.785262, -0.109672, -0.145540, -0.591738 + 0.785262, -0.109672, -0.145540, -0.591738 + 0.785262, -0.109672, -0.145540, -0.591738 + 0.785262, -0.109672, -0.145540, -0.591738 + 0.785262, -0.109672, -0.145540, -0.591738 + 0.785262, -0.109672, -0.145540, -0.591738 + 0.785262, -0.109672, -0.145540, -0.591738 + 0.785262, -0.109672, -0.145540, -0.591738 + 0.785262, -0.109672, -0.145540, -0.591738 + 0.785262, -0.109672, -0.145540, -0.591738 + 0.785262, -0.109672, -0.145540, -0.591738 + 0.785262, -0.109672, -0.145540, -0.591738 + 0.785262, -0.109672, -0.145540, -0.591738 + 0.785262, -0.109672, -0.145540, -0.591738 + 0.785262, -0.109672, -0.145540, -0.591738 + 0.785262, -0.109672, -0.145540, -0.591738 + 0.785262, -0.109672, -0.145540, -0.591738 + 0.785262, -0.109672, -0.145540, -0.591738 + 0.785262, -0.109672, -0.145540, -0.591738 + 0.785262, -0.109672, -0.145540, -0.591738 + 0.785262, -0.109672, -0.145540, -0.591738 + 0.785262, -0.109672, -0.145540, -0.591738 + 0.785262, -0.109672, -0.145540, -0.591738 + 0.785262, -0.109672, -0.145540, -0.591738 + 0.799057, -0.091950, -0.126558, -0.580549 + 0.799057, -0.091950, -0.126558, -0.580549 + 0.799057, -0.091950, -0.126558, -0.580549 + 0.799057, -0.091950, -0.126558, -0.580549 + 0.799057, -0.091950, -0.126558, -0.580549 + 0.799057, -0.091950, -0.126558, -0.580549 + 0.799057, -0.091950, -0.126558, -0.580549 + 0.799057, -0.091950, -0.126558, -0.580549 + 0.799057, -0.091950, -0.126558, -0.580549 + 0.799057, -0.091950, -0.126558, -0.580549 + 0.799057, -0.091950, -0.126558, -0.580549 + 0.799057, -0.091950, -0.126558, -0.580549 + 0.799057, -0.091950, -0.126558, -0.580549 + 0.799057, -0.091950, -0.126558, -0.580549 + 0.799057, -0.091950, -0.126558, -0.580549 + 0.799057, -0.091950, -0.126558, -0.580549 + 0.799057, -0.091950, -0.126558, -0.580549 + 0.799057, -0.091950, -0.126558, -0.580549 + 0.799057, -0.091950, -0.126558, -0.580549 + 0.799057, -0.091950, -0.126558, -0.580549 + 0.799057, -0.091950, -0.126558, -0.580549 + 0.799057, -0.091950, -0.126558, -0.580549 + 0.799057, -0.091950, -0.126558, -0.580549 + 0.799057, -0.091950, -0.126558, -0.580549 + 0.799057, -0.091950, -0.126558, -0.580549 + 0.812144, -0.074867, -0.106921, -0.568669 + 0.812144, -0.074867, -0.106921, -0.568669 + 0.812144, -0.074867, -0.106921, -0.568669 + 0.812144, -0.074867, -0.106921, -0.568669 + 0.812144, -0.074867, -0.106921, -0.568669 + 0.812144, -0.074867, -0.106921, -0.568669 + 0.812144, -0.074867, -0.106921, -0.568669 + 0.812144, -0.074867, -0.106921, -0.568669 + 0.812144, -0.074867, -0.106921, -0.568669 + 0.812144, -0.074867, -0.106921, -0.568669 + 0.812144, -0.074867, -0.106921, -0.568669 + 0.812144, -0.074867, -0.106921, -0.568669 + 0.812144, -0.074867, -0.106921, -0.568669 + 0.812144, -0.074867, -0.106921, -0.568669 + 0.812144, -0.074867, -0.106921, -0.568669 + 0.812144, -0.074867, -0.106921, -0.568669 + 0.812144, -0.074867, -0.106921, -0.568669 + 0.812144, -0.074867, -0.106921, -0.568669 + 0.812144, -0.074867, -0.106921, -0.568669 + 0.812144, -0.074867, -0.106921, -0.568669 + 0.812144, -0.074867, -0.106921, -0.568669 + 0.812144, -0.074867, -0.106921, -0.568669 + 0.812144, -0.074867, -0.106921, -0.568669 + 0.812144, -0.074867, -0.106921, -0.568669 + 0.812144, -0.074867, -0.106921, -0.568669 + 0.824496, -0.058452, -0.086658, -0.556130 + 0.824496, -0.058452, -0.086658, -0.556130 + 0.824496, -0.058452, -0.086658, -0.556130 + 0.824496, -0.058452, -0.086658, -0.556130 + 0.824496, -0.058452, -0.086658, -0.556130 + 0.824496, -0.058452, -0.086658, -0.556130 + 0.824496, -0.058452, -0.086658, -0.556130 + 0.824496, -0.058452, -0.086658, -0.556130 + 0.824496, -0.058452, -0.086658, -0.556130 + 0.824496, -0.058452, -0.086658, -0.556130 + 0.824496, -0.058452, -0.086658, -0.556130 + 0.824496, -0.058452, -0.086658, -0.556130 + 0.824496, -0.058452, -0.086658, -0.556130 + 0.824496, -0.058452, -0.086658, -0.556130 + 0.824496, -0.058452, -0.086658, -0.556130 + 0.824496, -0.058452, -0.086658, -0.556130 + 0.824496, -0.058452, -0.086658, -0.556130 + 0.824496, -0.058452, -0.086658, -0.556130 + 0.824496, -0.058452, -0.086658, -0.556130 + 0.824496, -0.058452, -0.086658, -0.556130 + 0.824496, -0.058452, -0.086658, -0.556130 + 0.824496, -0.058452, -0.086658, -0.556130 + 0.824496, -0.058452, -0.086658, -0.556130 + 0.824496, -0.058452, -0.086658, -0.556130 + 0.824496, -0.058452, -0.086658, -0.556130 + 0.836085, -0.042732, -0.065801, -0.542960 + 0.836085, -0.042732, -0.065801, -0.542960 + 0.836085, -0.042732, -0.065801, -0.542960 + 0.836085, -0.042732, -0.065801, -0.542960 + 0.836085, -0.042732, -0.065801, -0.542960 + 0.836085, -0.042732, -0.065801, -0.542960 + 0.836085, -0.042732, -0.065801, -0.542960 + 0.836085, -0.042732, -0.065801, -0.542960 + 0.836085, -0.042732, -0.065801, -0.542960 + 0.836085, -0.042732, -0.065801, -0.542960 + 0.836085, -0.042732, -0.065801, -0.542960 + 0.836085, -0.042732, -0.065801, -0.542960 + 0.836085, -0.042732, -0.065801, -0.542960 + 0.836085, -0.042732, -0.065801, -0.542960 + 0.836085, -0.042732, -0.065801, -0.542960 + 0.836085, -0.042732, -0.065801, -0.542960 + 0.836085, -0.042732, -0.065801, -0.542960 + 0.836085, -0.042732, -0.065801, -0.542960 + 0.836085, -0.042732, -0.065801, -0.542960 + 0.836085, -0.042732, -0.065801, -0.542960 + 0.836085, -0.042732, -0.065801, -0.542960 + 0.836085, -0.042732, -0.065801, -0.542960 + 0.836085, -0.042732, -0.065801, -0.542960 + 0.836085, -0.042732, -0.065801, -0.542960 + 0.836085, -0.042732, -0.065801, -0.542960 + 0.846886, -0.027734, -0.044383, -0.529193 + 0.846886, -0.027734, -0.044383, -0.529193 + 0.846886, -0.027734, -0.044383, -0.529193 + 0.846886, -0.027734, -0.044383, -0.529193 + 0.846886, -0.027734, -0.044383, -0.529193 + 0.846886, -0.027734, -0.044383, -0.529193 + 0.846886, -0.027734, -0.044383, -0.529193 + 0.846886, -0.027734, -0.044383, -0.529193 + 0.846886, -0.027734, -0.044383, -0.529193 + 0.846886, -0.027734, -0.044383, -0.529193 + 0.846886, -0.027734, -0.044383, -0.529193 + 0.846886, -0.027734, -0.044383, -0.529193 + 0.846886, -0.027734, -0.044383, -0.529193 + 0.846886, -0.027734, -0.044383, -0.529193 + 0.846886, -0.027734, -0.044383, -0.529193 + 0.846886, -0.027734, -0.044383, -0.529193 + 0.846886, -0.027734, -0.044383, -0.529193 + 0.846886, -0.027734, -0.044383, -0.529193 + 0.846886, -0.027734, -0.044383, -0.529193 + 0.846886, -0.027734, -0.044383, -0.529193 + 0.846886, -0.027734, -0.044383, -0.529193 + 0.846886, -0.027734, -0.044383, -0.529193 + 0.846886, -0.027734, -0.044383, -0.529193 + 0.846886, -0.027734, -0.044383, -0.529193 + 0.846886, -0.027734, -0.044383, -0.529193 + 0.856874, -0.013482, -0.022438, -0.514862 + 0.856874, -0.013482, -0.022438, -0.514862 + 0.856874, -0.013482, -0.022438, -0.514862 + 0.856874, -0.013482, -0.022438, -0.514862 + 0.856874, -0.013482, -0.022438, -0.514862 + 0.856874, -0.013482, -0.022438, -0.514862 + 0.856874, -0.013482, -0.022438, -0.514862 + 0.856874, -0.013482, -0.022438, -0.514862 + 0.856874, -0.013482, -0.022438, -0.514862 + 0.856874, -0.013482, -0.022438, -0.514862 + 0.856874, -0.013482, -0.022438, -0.514862 + 0.856874, -0.013482, -0.022438, -0.514862 + 0.856874, -0.013482, -0.022438, -0.514862 + 0.856874, -0.013482, -0.022438, -0.514862 + 0.856874, -0.013482, -0.022438, -0.514862 + 0.856874, -0.013482, -0.022438, -0.514862 + 0.856874, -0.013482, -0.022438, -0.514862 + 0.856874, -0.013482, -0.022438, -0.514862 + 0.856874, -0.013482, -0.022438, -0.514862 + 0.856874, -0.013482, -0.022438, -0.514862 + 0.856874, -0.013482, -0.022438, -0.514862 + 0.856874, -0.013482, -0.022438, -0.514862 + 0.856874, -0.013482, -0.022438, -0.514862 + 0.856874, -0.013482, -0.022438, -0.514862 + 0.856874, -0.013482, -0.022438, -0.514862 + 0.866025, -0.000000, -0.000000, -0.500000 + 0.866025, -0.000000, -0.000000, -0.500000 + 0.866025, -0.000000, -0.000000, -0.500000 + 0.866025, -0.000000, -0.000000, -0.500000 + 0.866025, -0.000000, -0.000000, -0.500000 + 0.866025, -0.000000, -0.000000, -0.500000 + 0.866025, -0.000000, -0.000000, -0.500000 + 0.866025, -0.000000, -0.000000, -0.500000 + 0.866025, -0.000000, -0.000000, -0.500000 + 0.866025, -0.000000, -0.000000, -0.500000 + 0.866025, -0.000000, -0.000000, -0.500000 + 0.866025, -0.000000, -0.000000, -0.500000 + 0.866025, -0.000000, -0.000000, -0.500000 + 0.866025, -0.000000, -0.000000, -0.500000 + 0.866025, -0.000000, -0.000000, -0.500000 + 0.866025, -0.000000, -0.000000, -0.500000 + 0.866025, -0.000000, -0.000000, -0.500000 + 0.866025, -0.000000, -0.000000, -0.500000 + 0.866025, -0.000000, -0.000000, -0.500000 + 0.866025, -0.000000, -0.000000, -0.500000 + 0.866025, -0.000000, -0.000000, -0.500000 + 0.866025, -0.000000, -0.000000, -0.500000 + 0.866025, -0.000000, -0.000000, -0.500000 + 0.866025, -0.000000, -0.000000, -0.500000 + 0.866025, -0.000000, -0.000000, -0.500000 + 0.874320, 0.012691, 0.022895, -0.484643 + 0.874320, 0.012691, 0.022895, -0.484643 + 0.874320, 0.012691, 0.022895, -0.484643 + 0.874320, 0.012691, 0.022895, -0.484643 + 0.874320, 0.012691, 0.022895, -0.484643 + 0.874320, 0.012691, 0.022895, -0.484643 + 0.874320, 0.012691, 0.022895, -0.484643 + 0.874320, 0.012691, 0.022895, -0.484643 + 0.874320, 0.012691, 0.022895, -0.484643 + 0.874320, 0.012691, 0.022895, -0.484643 + 0.874320, 0.012691, 0.022895, -0.484643 + 0.874320, 0.012691, 0.022895, -0.484643 + 0.874320, 0.012691, 0.022895, -0.484643 + 0.874320, 0.012691, 0.022895, -0.484643 + 0.874320, 0.012691, 0.022895, -0.484643 + 0.874320, 0.012691, 0.022895, -0.484643 + 0.874320, 0.012691, 0.022895, -0.484643 + 0.874320, 0.012691, 0.022895, -0.484643 + 0.874320, 0.012691, 0.022895, -0.484643 + 0.874320, 0.012691, 0.022895, -0.484643 + 0.874320, 0.012691, 0.022895, -0.484643 + 0.874320, 0.012691, 0.022895, -0.484643 + 0.874320, 0.012691, 0.022895, -0.484643 + 0.874320, 0.012691, 0.022895, -0.484643 + 0.874320, 0.012691, 0.022895, -0.484643 + 0.881738, 0.024570, 0.046210, -0.468828 + 0.881738, 0.024570, 0.046210, -0.468828 + 0.881738, 0.024570, 0.046210, -0.468828 + 0.881738, 0.024570, 0.046210, -0.468828 + 0.881738, 0.024570, 0.046210, -0.468828 + 0.881738, 0.024570, 0.046210, -0.468828 + 0.881738, 0.024570, 0.046210, -0.468828 + 0.881738, 0.024570, 0.046210, -0.468828 + 0.881738, 0.024570, 0.046210, -0.468828 + 0.881738, 0.024570, 0.046210, -0.468828 + 0.881738, 0.024570, 0.046210, -0.468828 + 0.881738, 0.024570, 0.046210, -0.468828 + 0.881738, 0.024570, 0.046210, -0.468828 + 0.881738, 0.024570, 0.046210, -0.468828 + 0.881738, 0.024570, 0.046210, -0.468828 + 0.881738, 0.024570, 0.046210, -0.468828 + 0.881738, 0.024570, 0.046210, -0.468828 + 0.881738, 0.024570, 0.046210, -0.468828 + 0.881738, 0.024570, 0.046210, -0.468828 + 0.881738, 0.024570, 0.046210, -0.468828 + 0.881738, 0.024570, 0.046210, -0.468828 + 0.881738, 0.024570, 0.046210, -0.468828 + 0.881738, 0.024570, 0.046210, -0.468828 + 0.881738, 0.024570, 0.046210, -0.468828 + 0.881738, 0.024570, 0.046210, -0.468828 + 0.888260, 0.035620, 0.069908, -0.452591 + 0.888260, 0.035620, 0.069908, -0.452591 + 0.888260, 0.035620, 0.069908, -0.452591 + 0.888260, 0.035620, 0.069908, -0.452591 + 0.888260, 0.035620, 0.069908, -0.452591 + 0.888260, 0.035620, 0.069908, -0.452591 + 0.888260, 0.035620, 0.069908, -0.452591 + 0.888260, 0.035620, 0.069908, -0.452591 + 0.888260, 0.035620, 0.069908, -0.452591 + 0.888260, 0.035620, 0.069908, -0.452591 + 0.888260, 0.035620, 0.069908, -0.452591 + 0.888260, 0.035620, 0.069908, -0.452591 + 0.888260, 0.035620, 0.069908, -0.452591 + 0.888260, 0.035620, 0.069908, -0.452591 + 0.888260, 0.035620, 0.069908, -0.452591 + 0.888260, 0.035620, 0.069908, -0.452591 + 0.888260, 0.035620, 0.069908, -0.452591 + 0.888260, 0.035620, 0.069908, -0.452591 + 0.888260, 0.035620, 0.069908, -0.452591 + 0.888260, 0.035620, 0.069908, -0.452591 + 0.888260, 0.035620, 0.069908, -0.452591 + 0.888260, 0.035620, 0.069908, -0.452591 + 0.888260, 0.035620, 0.069908, -0.452591 + 0.888260, 0.035620, 0.069908, -0.452591 + 0.888260, 0.035620, 0.069908, -0.452591 + 0.893870, 0.045822, 0.093950, -0.435970 + 0.893870, 0.045822, 0.093950, -0.435970 + 0.893870, 0.045822, 0.093950, -0.435970 + 0.893870, 0.045822, 0.093950, -0.435970 + 0.893870, 0.045822, 0.093950, -0.435970 + 0.893870, 0.045822, 0.093950, -0.435970 + 0.893870, 0.045822, 0.093950, -0.435970 + 0.893870, 0.045822, 0.093950, -0.435970 + 0.893870, 0.045822, 0.093950, -0.435970 + 0.893870, 0.045822, 0.093950, -0.435970 + 0.893870, 0.045822, 0.093950, -0.435970 + 0.893870, 0.045822, 0.093950, -0.435970 + 0.893870, 0.045822, 0.093950, -0.435970 + 0.893870, 0.045822, 0.093950, -0.435970 + 0.893870, 0.045822, 0.093950, -0.435970 + 0.893870, 0.045822, 0.093950, -0.435970 + 0.893870, 0.045822, 0.093950, -0.435970 + 0.893870, 0.045822, 0.093950, -0.435970 + 0.893870, 0.045822, 0.093950, -0.435970 + 0.893870, 0.045822, 0.093950, -0.435970 + 0.893870, 0.045822, 0.093950, -0.435970 + 0.893870, 0.045822, 0.093950, -0.435970 + 0.893870, 0.045822, 0.093950, -0.435970 + 0.893870, 0.045822, 0.093950, -0.435970 + 0.893870, 0.045822, 0.093950, -0.435970 + 0.898554, 0.055163, 0.118297, -0.419003 + 0.898554, 0.055163, 0.118297, -0.419003 + 0.898554, 0.055163, 0.118297, -0.419003 + 0.898554, 0.055163, 0.118297, -0.419003 + 0.898554, 0.055163, 0.118297, -0.419003 + 0.898554, 0.055163, 0.118297, -0.419003 + 0.898554, 0.055163, 0.118297, -0.419003 + 0.898554, 0.055163, 0.118297, -0.419003 + 0.898554, 0.055163, 0.118297, -0.419003 + 0.898554, 0.055163, 0.118297, -0.419003 + 0.898554, 0.055163, 0.118297, -0.419003 + 0.898554, 0.055163, 0.118297, -0.419003 + 0.898554, 0.055163, 0.118297, -0.419003 + 0.898554, 0.055163, 0.118297, -0.419003 + 0.898554, 0.055163, 0.118297, -0.419003 + 0.898554, 0.055163, 0.118297, -0.419003 + 0.898554, 0.055163, 0.118297, -0.419003 + 0.898554, 0.055163, 0.118297, -0.419003 + 0.898554, 0.055163, 0.118297, -0.419003 + 0.898554, 0.055163, 0.118297, -0.419003 + 0.898554, 0.055163, 0.118297, -0.419003 + 0.898554, 0.055163, 0.118297, -0.419003 + 0.898554, 0.055163, 0.118297, -0.419003 + 0.898554, 0.055163, 0.118297, -0.419003 + 0.898554, 0.055163, 0.118297, -0.419003 + 0.902298, 0.063628, 0.142910, -0.401729 + 0.902298, 0.063628, 0.142910, -0.401729 + 0.902298, 0.063628, 0.142910, -0.401729 + 0.902298, 0.063628, 0.142910, -0.401729 + 0.902298, 0.063628, 0.142910, -0.401729 + 0.902298, 0.063628, 0.142910, -0.401729 + 0.902298, 0.063628, 0.142910, -0.401729 + 0.902298, 0.063628, 0.142910, -0.401729 + 0.902298, 0.063628, 0.142910, -0.401729 + 0.902298, 0.063628, 0.142910, -0.401729 + 0.902298, 0.063628, 0.142910, -0.401729 + 0.902298, 0.063628, 0.142910, -0.401729 + 0.902298, 0.063628, 0.142910, -0.401729 + 0.902298, 0.063628, 0.142910, -0.401729 + 0.902298, 0.063628, 0.142910, -0.401729 + 0.902298, 0.063628, 0.142910, -0.401729 + 0.902298, 0.063628, 0.142910, -0.401729 + 0.902298, 0.063628, 0.142910, -0.401729 + 0.902298, 0.063628, 0.142910, -0.401729 + 0.902298, 0.063628, 0.142910, -0.401729 + 0.902298, 0.063628, 0.142910, -0.401729 + 0.902298, 0.063628, 0.142910, -0.401729 + 0.902298, 0.063628, 0.142910, -0.401729 + 0.902298, 0.063628, 0.142910, -0.401729 + 0.902298, 0.063628, 0.142910, -0.401729 + 0.905091, 0.071205, 0.167749, -0.384188 + 0.905091, 0.071205, 0.167749, -0.384188 + 0.905091, 0.071205, 0.167749, -0.384188 + 0.905091, 0.071205, 0.167749, -0.384188 + 0.905091, 0.071205, 0.167749, -0.384188 + 0.905091, 0.071205, 0.167749, -0.384188 + 0.905091, 0.071205, 0.167749, -0.384188 + 0.905091, 0.071205, 0.167749, -0.384188 + 0.905091, 0.071205, 0.167749, -0.384188 + 0.905091, 0.071205, 0.167749, -0.384188 + 0.905091, 0.071205, 0.167749, -0.384188 + 0.905091, 0.071205, 0.167749, -0.384188 + 0.905091, 0.071205, 0.167749, -0.384188 + 0.905091, 0.071205, 0.167749, -0.384188 + 0.905091, 0.071205, 0.167749, -0.384188 + 0.905091, 0.071205, 0.167749, -0.384188 + 0.905091, 0.071205, 0.167749, -0.384188 + 0.905091, 0.071205, 0.167749, -0.384188 + 0.905091, 0.071205, 0.167749, -0.384188 + 0.905091, 0.071205, 0.167749, -0.384188 + 0.905091, 0.071205, 0.167749, -0.384188 + 0.905091, 0.071205, 0.167749, -0.384188 + 0.905091, 0.071205, 0.167749, -0.384188 + 0.905091, 0.071205, 0.167749, -0.384188 + 0.905091, 0.071205, 0.167749, -0.384188 + 0.906923, 0.077885, 0.192772, -0.366421 + 0.906923, 0.077885, 0.192772, -0.366421 + 0.906923, 0.077885, 0.192772, -0.366421 + 0.906923, 0.077885, 0.192772, -0.366421 + 0.906923, 0.077885, 0.192772, -0.366421 + 0.906923, 0.077885, 0.192772, -0.366421 + 0.906923, 0.077885, 0.192772, -0.366421 + 0.906923, 0.077885, 0.192772, -0.366421 + 0.906923, 0.077885, 0.192772, -0.366421 + 0.906923, 0.077885, 0.192772, -0.366421 + 0.906923, 0.077885, 0.192772, -0.366421 + 0.906923, 0.077885, 0.192772, -0.366421 + 0.906923, 0.077885, 0.192772, -0.366421 + 0.906923, 0.077885, 0.192772, -0.366421 + 0.906923, 0.077885, 0.192772, -0.366421 + 0.906923, 0.077885, 0.192772, -0.366421 + 0.906923, 0.077885, 0.192772, -0.366421 + 0.906923, 0.077885, 0.192772, -0.366421 + 0.906923, 0.077885, 0.192772, -0.366421 + 0.906923, 0.077885, 0.192772, -0.366421 + 0.906923, 0.077885, 0.192772, -0.366421 + 0.906923, 0.077885, 0.192772, -0.366421 + 0.906923, 0.077885, 0.192772, -0.366421 + 0.906923, 0.077885, 0.192772, -0.366421 + 0.906923, 0.077885, 0.192772, -0.366421 + 0.907786, 0.083659, 0.217940, -0.348466 + 0.907786, 0.083659, 0.217940, -0.348466 + 0.907786, 0.083659, 0.217940, -0.348466 + 0.907786, 0.083659, 0.217940, -0.348466 + 0.907786, 0.083659, 0.217940, -0.348466 + 0.907786, 0.083659, 0.217940, -0.348466 + 0.907786, 0.083659, 0.217940, -0.348466 + 0.907786, 0.083659, 0.217940, -0.348466 + 0.907786, 0.083659, 0.217940, -0.348466 + 0.907786, 0.083659, 0.217940, -0.348466 + 0.907786, 0.083659, 0.217940, -0.348466 + 0.907786, 0.083659, 0.217940, -0.348466 + 0.907786, 0.083659, 0.217940, -0.348466 + 0.907786, 0.083659, 0.217940, -0.348466 + 0.907786, 0.083659, 0.217940, -0.348466 + 0.907786, 0.083659, 0.217940, -0.348466 + 0.907786, 0.083659, 0.217940, -0.348466 + 0.907786, 0.083659, 0.217940, -0.348466 + 0.907786, 0.083659, 0.217940, -0.348466 + 0.907786, 0.083659, 0.217940, -0.348466 + 0.907786, 0.083659, 0.217940, -0.348466 + 0.907786, 0.083659, 0.217940, -0.348466 + 0.907786, 0.083659, 0.217940, -0.348466 + 0.907786, 0.083659, 0.217940, -0.348466 + 0.907786, 0.083659, 0.217940, -0.348466 + 0.907673, 0.088521, 0.243210, -0.330366 + 0.907673, 0.088521, 0.243210, -0.330366 + 0.907673, 0.088521, 0.243210, -0.330366 + 0.907673, 0.088521, 0.243210, -0.330366 + 0.907673, 0.088521, 0.243210, -0.330366 + 0.907673, 0.088521, 0.243210, -0.330366 + 0.907673, 0.088521, 0.243210, -0.330366 + 0.907673, 0.088521, 0.243210, -0.330366 + 0.907673, 0.088521, 0.243210, -0.330366 + 0.907673, 0.088521, 0.243210, -0.330366 + 0.907673, 0.088521, 0.243210, -0.330366 + 0.907673, 0.088521, 0.243210, -0.330366 + 0.907673, 0.088521, 0.243210, -0.330366 + 0.907673, 0.088521, 0.243210, -0.330366 + 0.907673, 0.088521, 0.243210, -0.330366 + 0.907673, 0.088521, 0.243210, -0.330366 + 0.907673, 0.088521, 0.243210, -0.330366 + 0.907673, 0.088521, 0.243210, -0.330366 + 0.907673, 0.088521, 0.243210, -0.330366 + 0.907673, 0.088521, 0.243210, -0.330366 + 0.907673, 0.088521, 0.243210, -0.330366 + 0.907673, 0.088521, 0.243210, -0.330366 + 0.907673, 0.088521, 0.243210, -0.330366 + 0.907673, 0.088521, 0.243210, -0.330366 + 0.907673, 0.088521, 0.243210, -0.330366 + 0.906582, 0.092466, 0.268542, -0.312161 + 0.906582, 0.092466, 0.268542, -0.312161 + 0.906582, 0.092466, 0.268542, -0.312161 + 0.906582, 0.092466, 0.268542, -0.312161 + 0.906582, 0.092466, 0.268542, -0.312161 + 0.906582, 0.092466, 0.268542, -0.312161 + 0.906582, 0.092466, 0.268542, -0.312161 + 0.906582, 0.092466, 0.268542, -0.312161 + 0.906582, 0.092466, 0.268542, -0.312161 + 0.906582, 0.092466, 0.268542, -0.312161 + 0.906582, 0.092466, 0.268542, -0.312161 + 0.906582, 0.092466, 0.268542, -0.312161 + 0.906582, 0.092466, 0.268542, -0.312161 + 0.906582, 0.092466, 0.268542, -0.312161 + 0.906582, 0.092466, 0.268542, -0.312161 + 0.906582, 0.092466, 0.268542, -0.312161 + 0.906582, 0.092466, 0.268542, -0.312161 + 0.906582, 0.092466, 0.268542, -0.312161 + 0.906582, 0.092466, 0.268542, -0.312161 + 0.906582, 0.092466, 0.268542, -0.312161 + 0.906582, 0.092466, 0.268542, -0.312161 + 0.906582, 0.092466, 0.268542, -0.312161 + 0.906582, 0.092466, 0.268542, -0.312161 + 0.906582, 0.092466, 0.268542, -0.312161 + 0.906582, 0.092466, 0.268542, -0.312161 + 0.904508, 0.095492, 0.293893, -0.293893 + 0.904508, 0.095492, 0.293893, -0.293893 + 0.904508, 0.095492, 0.293893, -0.293893 + 0.904508, 0.095492, 0.293893, -0.293893 + 0.904508, 0.095492, 0.293893, -0.293893 + 0.904508, 0.095492, 0.293893, -0.293893 + 0.904508, 0.095492, 0.293893, -0.293893 + 0.904508, 0.095492, 0.293893, -0.293893 + 0.904508, 0.095492, 0.293893, -0.293893 + 0.904508, 0.095492, 0.293893, -0.293893 + 0.904508, 0.095492, 0.293893, -0.293893 + 0.904508, 0.095492, 0.293893, -0.293893 + 0.904508, 0.095492, 0.293893, -0.293893 + 0.904508, 0.095492, 0.293893, -0.293893 + 0.904508, 0.095492, 0.293893, -0.293893 + 0.904508, 0.095492, 0.293893, -0.293893 + 0.904508, 0.095492, 0.293893, -0.293893 + 0.904508, 0.095492, 0.293893, -0.293893 + 0.904508, 0.095492, 0.293893, -0.293893 + 0.904508, 0.095492, 0.293893, -0.293893 + 0.904508, 0.095492, 0.293893, -0.293893 + 0.904508, 0.095492, 0.293893, -0.293893 + 0.904508, 0.095492, 0.293893, -0.293893 + 0.904508, 0.095492, 0.293893, -0.293893 + 0.904508, 0.095492, 0.293893, -0.293893 + 0.901453, 0.097596, 0.319221, -0.275602 + 0.901453, 0.097596, 0.319221, -0.275602 + 0.901453, 0.097596, 0.319221, -0.275602 + 0.901453, 0.097596, 0.319221, -0.275602 + 0.901453, 0.097596, 0.319221, -0.275602 + 0.901453, 0.097596, 0.319221, -0.275602 + 0.901453, 0.097596, 0.319221, -0.275602 + 0.901453, 0.097596, 0.319221, -0.275602 + 0.901453, 0.097596, 0.319221, -0.275602 + 0.901453, 0.097596, 0.319221, -0.275602 + 0.901453, 0.097596, 0.319221, -0.275602 + 0.901453, 0.097596, 0.319221, -0.275602 + 0.901453, 0.097596, 0.319221, -0.275602 + 0.901453, 0.097596, 0.319221, -0.275602 + 0.901453, 0.097596, 0.319221, -0.275602 + 0.901453, 0.097596, 0.319221, -0.275602 + 0.901453, 0.097596, 0.319221, -0.275602 + 0.901453, 0.097596, 0.319221, -0.275602 + 0.901453, 0.097596, 0.319221, -0.275602 + 0.901453, 0.097596, 0.319221, -0.275602 + 0.901453, 0.097596, 0.319221, -0.275602 + 0.901453, 0.097596, 0.319221, -0.275602 + 0.901453, 0.097596, 0.319221, -0.275602 + 0.901453, 0.097596, 0.319221, -0.275602 + 0.901453, 0.097596, 0.319221, -0.275602 + 0.897415, 0.098780, 0.344485, -0.257330 + 0.897415, 0.098780, 0.344485, -0.257330 + 0.897415, 0.098780, 0.344485, -0.257330 + 0.897415, 0.098780, 0.344485, -0.257330 + 0.897415, 0.098780, 0.344485, -0.257330 + 0.897415, 0.098780, 0.344485, -0.257330 + 0.897415, 0.098780, 0.344485, -0.257330 + 0.897415, 0.098780, 0.344485, -0.257330 + 0.897415, 0.098780, 0.344485, -0.257330 + 0.897415, 0.098780, 0.344485, -0.257330 + 0.897415, 0.098780, 0.344485, -0.257330 + 0.897415, 0.098780, 0.344485, -0.257330 + 0.897415, 0.098780, 0.344485, -0.257330 + 0.897415, 0.098780, 0.344485, -0.257330 + 0.897415, 0.098780, 0.344485, -0.257330 + 0.897415, 0.098780, 0.344485, -0.257330 + 0.897415, 0.098780, 0.344485, -0.257330 + 0.897415, 0.098780, 0.344485, -0.257330 + 0.897415, 0.098780, 0.344485, -0.257330 + 0.897415, 0.098780, 0.344485, -0.257330 + 0.897415, 0.098780, 0.344485, -0.257330 + 0.897415, 0.098780, 0.344485, -0.257330 + 0.897415, 0.098780, 0.344485, -0.257330 + 0.897415, 0.098780, 0.344485, -0.257330 + 0.897415, 0.098780, 0.344485, -0.257330 diff --git a/scripts/trajectories/const000-Vector3.csv b/scripts/trajectories/const000-Vector3.csv new file mode 100644 index 0000000000..f47ae12e5d --- /dev/null +++ b/scripts/trajectories/const000-Vector3.csv @@ -0,0 +1,4 @@ +0.0, 0.0, 0.0, 1.0, 0.0, 0.0 +0.0, 0.0, 0.0, 1.0, 0.0, 0.0 +0.0, 0.0, 0.0, 1.0, 0.0, 0.0 +0.0, 0.0, 0.0, 1.0, 0.0, 0.0 diff --git a/scripts/trajectories/full-circle-4s-Vector3.csv b/scripts/trajectories/full-circle-4s-Vector3.csv new file mode 100644 index 0000000000..38a3505239 --- /dev/null +++ b/scripts/trajectories/full-circle-4s-Vector3.csv @@ -0,0 +1,200 @@ +0.0000,0.0000,0.0000,0.9995,-0.0314,0.0000 +0.0000,0.0000,0.0000,0.9980,-0.0628,0.0000 +0.0000,0.0000,0.0000,0.9956,-0.0941,0.0000 +0.0000,0.0000,0.0000,0.9921,-0.1253,0.0000 +0.0000,0.0000,0.0000,0.9877,-0.1564,0.0000 +0.0000,0.0000,0.0000,0.9823,-0.1874,0.0000 +0.0000,0.0000,0.0000,0.9759,-0.2181,0.0000 +0.0000,0.0000,0.0000,0.9686,-0.2487,0.0000 +0.0000,0.0000,0.0000,0.9603,-0.2790,0.0000 +0.0000,0.0000,0.0000,0.9511,-0.3090,0.0000 +0.0000,0.0000,0.0000,0.9409,-0.3387,0.0000 +0.0000,0.0000,0.0000,0.9298,-0.3681,0.0000 +0.0000,0.0000,0.0000,0.9178,-0.3971,0.0000 +0.0000,0.0000,0.0000,0.9048,-0.4258,0.0000 +0.0000,0.0000,0.0000,0.8910,-0.4540,0.0000 +0.0000,0.0000,0.0000,0.8763,-0.4818,0.0000 +0.0000,0.0000,0.0000,0.8607,-0.5090,0.0000 +0.0000,0.0000,0.0000,0.8443,-0.5358,0.0000 +0.0000,0.0000,0.0000,0.8271,-0.5621,0.0000 +0.0000,0.0000,0.0000,0.8090,-0.5878,0.0000 +0.0000,0.0000,0.0000,0.7902,-0.6129,0.0000 +0.0000,0.0000,0.0000,0.7705,-0.6374,0.0000 +0.0000,0.0000,0.0000,0.7501,-0.6613,0.0000 +0.0000,0.0000,0.0000,0.7290,-0.6845,0.0000 +0.0000,0.0000,0.0000,0.7071,-0.7071,0.0000 +0.0000,0.0000,0.0000,0.6845,-0.7290,0.0000 +0.0000,0.0000,0.0000,0.6613,-0.7501,0.0000 +0.0000,0.0000,0.0000,0.6374,-0.7705,0.0000 +0.0000,0.0000,0.0000,0.6129,-0.7902,0.0000 +0.0000,0.0000,0.0000,0.5878,-0.8090,0.0000 +0.0000,0.0000,0.0000,0.5621,-0.8271,0.0000 +0.0000,0.0000,0.0000,0.5358,-0.8443,0.0000 +0.0000,0.0000,0.0000,0.5090,-0.8607,0.0000 +0.0000,0.0000,0.0000,0.4818,-0.8763,0.0000 +0.0000,0.0000,0.0000,0.4540,-0.8910,0.0000 +0.0000,0.0000,0.0000,0.4258,-0.9048,0.0000 +0.0000,0.0000,0.0000,0.3971,-0.9178,0.0000 +0.0000,0.0000,0.0000,0.3681,-0.9298,0.0000 +0.0000,0.0000,0.0000,0.3387,-0.9409,0.0000 +0.0000,0.0000,0.0000,0.3090,-0.9511,0.0000 +0.0000,0.0000,0.0000,0.2790,-0.9603,0.0000 +0.0000,0.0000,0.0000,0.2487,-0.9686,0.0000 +0.0000,0.0000,0.0000,0.2181,-0.9759,0.0000 +0.0000,0.0000,0.0000,0.1874,-0.9823,0.0000 +0.0000,0.0000,0.0000,0.1564,-0.9877,0.0000 +0.0000,0.0000,0.0000,0.1253,-0.9921,0.0000 +0.0000,0.0000,0.0000,0.0941,-0.9956,0.0000 +0.0000,0.0000,0.0000,0.0628,-0.9980,0.0000 +0.0000,0.0000,0.0000,0.0314,-0.9995,0.0000 +0.0000,0.0000,0.0000,-0.0000,-1.0000,0.0000 +0.0000,0.0000,0.0000,-0.0314,-0.9995,0.0000 +0.0000,0.0000,0.0000,-0.0628,-0.9980,0.0000 +0.0000,0.0000,0.0000,-0.0941,-0.9956,0.0000 +0.0000,0.0000,0.0000,-0.1253,-0.9921,0.0000 +0.0000,0.0000,0.0000,-0.1564,-0.9877,0.0000 +0.0000,0.0000,0.0000,-0.1874,-0.9823,0.0000 +0.0000,0.0000,0.0000,-0.2181,-0.9759,0.0000 +0.0000,0.0000,0.0000,-0.2487,-0.9686,0.0000 +0.0000,0.0000,0.0000,-0.2790,-0.9603,0.0000 +0.0000,0.0000,0.0000,-0.3090,-0.9511,0.0000 +0.0000,0.0000,0.0000,-0.3387,-0.9409,0.0000 +0.0000,0.0000,0.0000,-0.3681,-0.9298,0.0000 +0.0000,0.0000,0.0000,-0.3971,-0.9178,0.0000 +0.0000,0.0000,0.0000,-0.4258,-0.9048,0.0000 +0.0000,0.0000,0.0000,-0.4540,-0.8910,0.0000 +0.0000,0.0000,0.0000,-0.4818,-0.8763,0.0000 +0.0000,0.0000,0.0000,-0.5090,-0.8607,0.0000 +0.0000,0.0000,0.0000,-0.5358,-0.8443,0.0000 +0.0000,0.0000,0.0000,-0.5621,-0.8271,0.0000 +0.0000,0.0000,0.0000,-0.5878,-0.8090,0.0000 +0.0000,0.0000,0.0000,-0.6129,-0.7902,0.0000 +0.0000,0.0000,0.0000,-0.6374,-0.7705,0.0000 +0.0000,0.0000,0.0000,-0.6613,-0.7501,0.0000 +0.0000,0.0000,0.0000,-0.6845,-0.7290,0.0000 +0.0000,0.0000,0.0000,-0.7071,-0.7071,0.0000 +0.0000,0.0000,0.0000,-0.7290,-0.6845,0.0000 +0.0000,0.0000,0.0000,-0.7501,-0.6613,0.0000 +0.0000,0.0000,0.0000,-0.7705,-0.6374,0.0000 +0.0000,0.0000,0.0000,-0.7902,-0.6129,0.0000 +0.0000,0.0000,0.0000,-0.8090,-0.5878,0.0000 +0.0000,0.0000,0.0000,-0.8271,-0.5621,0.0000 +0.0000,0.0000,0.0000,-0.8443,-0.5358,0.0000 +0.0000,0.0000,0.0000,-0.8607,-0.5090,0.0000 +0.0000,0.0000,0.0000,-0.8763,-0.4818,0.0000 +0.0000,0.0000,0.0000,-0.8910,-0.4540,0.0000 +0.0000,0.0000,0.0000,-0.9048,-0.4258,0.0000 +0.0000,0.0000,0.0000,-0.9178,-0.3971,0.0000 +0.0000,0.0000,0.0000,-0.9298,-0.3681,0.0000 +0.0000,0.0000,0.0000,-0.9409,-0.3387,0.0000 +0.0000,0.0000,0.0000,-0.9511,-0.3090,0.0000 +0.0000,0.0000,0.0000,-0.9603,-0.2790,0.0000 +0.0000,0.0000,0.0000,-0.9686,-0.2487,0.0000 +0.0000,0.0000,0.0000,-0.9759,-0.2181,0.0000 +0.0000,0.0000,0.0000,-0.9823,-0.1874,0.0000 +0.0000,0.0000,0.0000,-0.9877,-0.1564,0.0000 +0.0000,0.0000,0.0000,-0.9921,-0.1253,0.0000 +0.0000,0.0000,0.0000,-0.9956,-0.0941,0.0000 +0.0000,0.0000,0.0000,-0.9980,-0.0628,0.0000 +0.0000,0.0000,0.0000,-0.9995,-0.0314,0.0000 +0.0000,0.0000,0.0000,-1.0000,0.0000,0.0000 +0.0000,0.0000,0.0000,-0.9995,0.0314,0.0000 +0.0000,0.0000,0.0000,-0.9980,0.0628,0.0000 +0.0000,0.0000,0.0000,-0.9956,0.0941,0.0000 +0.0000,0.0000,0.0000,-0.9921,0.1253,0.0000 +0.0000,0.0000,0.0000,-0.9877,0.1564,0.0000 +0.0000,0.0000,0.0000,-0.9823,0.1874,0.0000 +0.0000,0.0000,0.0000,-0.9759,0.2181,0.0000 +0.0000,0.0000,0.0000,-0.9686,0.2487,0.0000 +0.0000,0.0000,0.0000,-0.9603,0.2790,0.0000 +0.0000,0.0000,0.0000,-0.9511,0.3090,0.0000 +0.0000,0.0000,0.0000,-0.9409,0.3387,0.0000 +0.0000,0.0000,0.0000,-0.9298,0.3681,0.0000 +0.0000,0.0000,0.0000,-0.9178,0.3971,0.0000 +0.0000,0.0000,0.0000,-0.9048,0.4258,0.0000 +0.0000,0.0000,0.0000,-0.8910,0.4540,0.0000 +0.0000,0.0000,0.0000,-0.8763,0.4818,0.0000 +0.0000,0.0000,0.0000,-0.8607,0.5090,0.0000 +0.0000,0.0000,0.0000,-0.8443,0.5358,0.0000 +0.0000,0.0000,0.0000,-0.8271,0.5621,0.0000 +0.0000,0.0000,0.0000,-0.8090,0.5878,0.0000 +0.0000,0.0000,0.0000,-0.7902,0.6129,0.0000 +0.0000,0.0000,0.0000,-0.7705,0.6374,0.0000 +0.0000,0.0000,0.0000,-0.7501,0.6613,0.0000 +0.0000,0.0000,0.0000,-0.7290,0.6845,0.0000 +0.0000,0.0000,0.0000,-0.7071,0.7071,0.0000 +0.0000,0.0000,0.0000,-0.6845,0.7290,0.0000 +0.0000,0.0000,0.0000,-0.6613,0.7501,0.0000 +0.0000,0.0000,0.0000,-0.6374,0.7705,0.0000 +0.0000,0.0000,0.0000,-0.6129,0.7902,0.0000 +0.0000,0.0000,0.0000,-0.5878,0.8090,0.0000 +0.0000,0.0000,0.0000,-0.5621,0.8271,0.0000 +0.0000,0.0000,0.0000,-0.5358,0.8443,0.0000 +0.0000,0.0000,0.0000,-0.5090,0.8607,0.0000 +0.0000,0.0000,0.0000,-0.4818,0.8763,0.0000 +0.0000,0.0000,0.0000,-0.4540,0.8910,0.0000 +0.0000,0.0000,0.0000,-0.4258,0.9048,0.0000 +0.0000,0.0000,0.0000,-0.3971,0.9178,0.0000 +0.0000,0.0000,0.0000,-0.3681,0.9298,0.0000 +0.0000,0.0000,0.0000,-0.3387,0.9409,0.0000 +0.0000,0.0000,0.0000,-0.3090,0.9511,0.0000 +0.0000,0.0000,0.0000,-0.2790,0.9603,0.0000 +0.0000,0.0000,0.0000,-0.2487,0.9686,0.0000 +0.0000,0.0000,0.0000,-0.2181,0.9759,0.0000 +0.0000,0.0000,0.0000,-0.1874,0.9823,0.0000 +0.0000,0.0000,0.0000,-0.1564,0.9877,0.0000 +0.0000,0.0000,0.0000,-0.1253,0.9921,0.0000 +0.0000,0.0000,0.0000,-0.0941,0.9956,0.0000 +0.0000,0.0000,0.0000,-0.0628,0.9980,0.0000 +0.0000,0.0000,0.0000,-0.0314,0.9995,0.0000 +0.0000,0.0000,0.0000,0.0000,1.0000,0.0000 +0.0000,0.0000,0.0000,0.0314,0.9995,0.0000 +0.0000,0.0000,0.0000,0.0628,0.9980,0.0000 +0.0000,0.0000,0.0000,0.0941,0.9956,0.0000 +0.0000,0.0000,0.0000,0.1253,0.9921,0.0000 +0.0000,0.0000,0.0000,0.1564,0.9877,0.0000 +0.0000,0.0000,0.0000,0.1874,0.9823,0.0000 +0.0000,0.0000,0.0000,0.2181,0.9759,0.0000 +0.0000,0.0000,0.0000,0.2487,0.9686,0.0000 +0.0000,0.0000,0.0000,0.2790,0.9603,0.0000 +0.0000,0.0000,0.0000,0.3090,0.9511,0.0000 +0.0000,0.0000,0.0000,0.3387,0.9409,0.0000 +0.0000,0.0000,0.0000,0.3681,0.9298,0.0000 +0.0000,0.0000,0.0000,0.3971,0.9178,0.0000 +0.0000,0.0000,0.0000,0.4258,0.9048,0.0000 +0.0000,0.0000,0.0000,0.4540,0.8910,0.0000 +0.0000,0.0000,0.0000,0.4818,0.8763,0.0000 +0.0000,0.0000,0.0000,0.5090,0.8607,0.0000 +0.0000,0.0000,0.0000,0.5358,0.8443,0.0000 +0.0000,0.0000,0.0000,0.5621,0.8271,0.0000 +0.0000,0.0000,0.0000,0.5878,0.8090,0.0000 +0.0000,0.0000,0.0000,0.6129,0.7902,0.0000 +0.0000,0.0000,0.0000,0.6374,0.7705,0.0000 +0.0000,0.0000,0.0000,0.6613,0.7501,0.0000 +0.0000,0.0000,0.0000,0.6845,0.7290,0.0000 +0.0000,0.0000,0.0000,0.7071,0.7071,0.0000 +0.0000,0.0000,0.0000,0.7290,0.6845,0.0000 +0.0000,0.0000,0.0000,0.7501,0.6613,0.0000 +0.0000,0.0000,0.0000,0.7705,0.6374,0.0000 +0.0000,0.0000,0.0000,0.7902,0.6129,0.0000 +0.0000,0.0000,0.0000,0.8090,0.5878,0.0000 +0.0000,0.0000,0.0000,0.8271,0.5621,0.0000 +0.0000,0.0000,0.0000,0.8443,0.5358,0.0000 +0.0000,0.0000,0.0000,0.8607,0.5090,0.0000 +0.0000,0.0000,0.0000,0.8763,0.4818,0.0000 +0.0000,0.0000,0.0000,0.8910,0.4540,0.0000 +0.0000,0.0000,0.0000,0.9048,0.4258,0.0000 +0.0000,0.0000,0.0000,0.9178,0.3971,0.0000 +0.0000,0.0000,0.0000,0.9298,0.3681,0.0000 +0.0000,0.0000,0.0000,0.9409,0.3387,0.0000 +0.0000,0.0000,0.0000,0.9511,0.3090,0.0000 +0.0000,0.0000,0.0000,0.9603,0.2790,0.0000 +0.0000,0.0000,0.0000,0.9686,0.2487,0.0000 +0.0000,0.0000,0.0000,0.9759,0.2181,0.0000 +0.0000,0.0000,0.0000,0.9823,0.1874,0.0000 +0.0000,0.0000,0.0000,0.9877,0.1564,0.0000 +0.0000,0.0000,0.0000,0.9921,0.1253,0.0000 +0.0000,0.0000,0.0000,0.9956,0.0941,0.0000 +0.0000,0.0000,0.0000,0.9980,0.0628,0.0000 +0.0000,0.0000,0.0000,0.9995,0.0314,0.0000 +0.0000,0.0000,0.0000,1.0000,-0.0000,0.0000 diff --git a/scripts/trajectories/full-circle-4s-ccw-Vector3.csv b/scripts/trajectories/full-circle-4s-ccw-Vector3.csv new file mode 100644 index 0000000000..37b2904ea4 --- /dev/null +++ b/scripts/trajectories/full-circle-4s-ccw-Vector3.csv @@ -0,0 +1,200 @@ +0.0000,0.0000,0.0000,0.9995,0.0314,0.0000 +0.0000,0.0000,0.0000,0.9980,0.0628,0.0000 +0.0000,0.0000,0.0000,0.9956,0.0941,0.0000 +0.0000,0.0000,0.0000,0.9921,0.1253,0.0000 +0.0000,0.0000,0.0000,0.9877,0.1564,0.0000 +0.0000,0.0000,0.0000,0.9823,0.1874,0.0000 +0.0000,0.0000,0.0000,0.9759,0.2181,0.0000 +0.0000,0.0000,0.0000,0.9686,0.2487,0.0000 +0.0000,0.0000,0.0000,0.9603,0.2790,0.0000 +0.0000,0.0000,0.0000,0.9511,0.3090,0.0000 +0.0000,0.0000,0.0000,0.9409,0.3387,0.0000 +0.0000,0.0000,0.0000,0.9298,0.3681,0.0000 +0.0000,0.0000,0.0000,0.9178,0.3971,0.0000 +0.0000,0.0000,0.0000,0.9048,0.4258,0.0000 +0.0000,0.0000,0.0000,0.8910,0.4540,0.0000 +0.0000,0.0000,0.0000,0.8763,0.4818,0.0000 +0.0000,0.0000,0.0000,0.8607,0.5090,0.0000 +0.0000,0.0000,0.0000,0.8443,0.5358,0.0000 +0.0000,0.0000,0.0000,0.8271,0.5621,0.0000 +0.0000,0.0000,0.0000,0.8090,0.5878,0.0000 +0.0000,0.0000,0.0000,0.7902,0.6129,0.0000 +0.0000,0.0000,0.0000,0.7705,0.6374,0.0000 +0.0000,0.0000,0.0000,0.7501,0.6613,0.0000 +0.0000,0.0000,0.0000,0.7290,0.6845,0.0000 +0.0000,0.0000,0.0000,0.7071,0.7071,0.0000 +0.0000,0.0000,0.0000,0.6845,0.7290,0.0000 +0.0000,0.0000,0.0000,0.6613,0.7501,0.0000 +0.0000,0.0000,0.0000,0.6374,0.7705,0.0000 +0.0000,0.0000,0.0000,0.6129,0.7902,0.0000 +0.0000,0.0000,0.0000,0.5878,0.8090,0.0000 +0.0000,0.0000,0.0000,0.5621,0.8271,0.0000 +0.0000,0.0000,0.0000,0.5358,0.8443,0.0000 +0.0000,0.0000,0.0000,0.5090,0.8607,0.0000 +0.0000,0.0000,0.0000,0.4818,0.8763,0.0000 +0.0000,0.0000,0.0000,0.4540,0.8910,0.0000 +0.0000,0.0000,0.0000,0.4258,0.9048,0.0000 +0.0000,0.0000,0.0000,0.3971,0.9178,0.0000 +0.0000,0.0000,0.0000,0.3681,0.9298,0.0000 +0.0000,0.0000,0.0000,0.3387,0.9409,0.0000 +0.0000,0.0000,0.0000,0.3090,0.9511,0.0000 +0.0000,0.0000,0.0000,0.2790,0.9603,0.0000 +0.0000,0.0000,0.0000,0.2487,0.9686,0.0000 +0.0000,0.0000,0.0000,0.2181,0.9759,0.0000 +0.0000,0.0000,0.0000,0.1874,0.9823,0.0000 +0.0000,0.0000,0.0000,0.1564,0.9877,0.0000 +0.0000,0.0000,0.0000,0.1253,0.9921,0.0000 +0.0000,0.0000,0.0000,0.0941,0.9956,0.0000 +0.0000,0.0000,0.0000,0.0628,0.9980,0.0000 +0.0000,0.0000,0.0000,0.0314,0.9995,0.0000 +0.0000,0.0000,0.0000,-0.0000,1.0000,0.0000 +0.0000,0.0000,0.0000,-0.0314,0.9995,0.0000 +0.0000,0.0000,0.0000,-0.0628,0.9980,0.0000 +0.0000,0.0000,0.0000,-0.0941,0.9956,0.0000 +0.0000,0.0000,0.0000,-0.1253,0.9921,0.0000 +0.0000,0.0000,0.0000,-0.1564,0.9877,0.0000 +0.0000,0.0000,0.0000,-0.1874,0.9823,0.0000 +0.0000,0.0000,0.0000,-0.2181,0.9759,0.0000 +0.0000,0.0000,0.0000,-0.2487,0.9686,0.0000 +0.0000,0.0000,0.0000,-0.2790,0.9603,0.0000 +0.0000,0.0000,0.0000,-0.3090,0.9511,0.0000 +0.0000,0.0000,0.0000,-0.3387,0.9409,0.0000 +0.0000,0.0000,0.0000,-0.3681,0.9298,0.0000 +0.0000,0.0000,0.0000,-0.3971,0.9178,0.0000 +0.0000,0.0000,0.0000,-0.4258,0.9048,0.0000 +0.0000,0.0000,0.0000,-0.4540,0.8910,0.0000 +0.0000,0.0000,0.0000,-0.4818,0.8763,0.0000 +0.0000,0.0000,0.0000,-0.5090,0.8607,0.0000 +0.0000,0.0000,0.0000,-0.5358,0.8443,0.0000 +0.0000,0.0000,0.0000,-0.5621,0.8271,0.0000 +0.0000,0.0000,0.0000,-0.5878,0.8090,0.0000 +0.0000,0.0000,0.0000,-0.6129,0.7902,0.0000 +0.0000,0.0000,0.0000,-0.6374,0.7705,0.0000 +0.0000,0.0000,0.0000,-0.6613,0.7501,0.0000 +0.0000,0.0000,0.0000,-0.6845,0.7290,0.0000 +0.0000,0.0000,0.0000,-0.7071,0.7071,0.0000 +0.0000,0.0000,0.0000,-0.7290,0.6845,0.0000 +0.0000,0.0000,0.0000,-0.7501,0.6613,0.0000 +0.0000,0.0000,0.0000,-0.7705,0.6374,0.0000 +0.0000,0.0000,0.0000,-0.7902,0.6129,0.0000 +0.0000,0.0000,0.0000,-0.8090,0.5878,0.0000 +0.0000,0.0000,0.0000,-0.8271,0.5621,0.0000 +0.0000,0.0000,0.0000,-0.8443,0.5358,0.0000 +0.0000,0.0000,0.0000,-0.8607,0.5090,0.0000 +0.0000,0.0000,0.0000,-0.8763,0.4818,0.0000 +0.0000,0.0000,0.0000,-0.8910,0.4540,0.0000 +0.0000,0.0000,0.0000,-0.9048,0.4258,0.0000 +0.0000,0.0000,0.0000,-0.9178,0.3971,0.0000 +0.0000,0.0000,0.0000,-0.9298,0.3681,0.0000 +0.0000,0.0000,0.0000,-0.9409,0.3387,0.0000 +0.0000,0.0000,0.0000,-0.9511,0.3090,0.0000 +0.0000,0.0000,0.0000,-0.9603,0.2790,0.0000 +0.0000,0.0000,0.0000,-0.9686,0.2487,0.0000 +0.0000,0.0000,0.0000,-0.9759,0.2181,0.0000 +0.0000,0.0000,0.0000,-0.9823,0.1874,0.0000 +0.0000,0.0000,0.0000,-0.9877,0.1564,0.0000 +0.0000,0.0000,0.0000,-0.9921,0.1253,0.0000 +0.0000,0.0000,0.0000,-0.9956,0.0941,0.0000 +0.0000,0.0000,0.0000,-0.9980,0.0628,0.0000 +0.0000,0.0000,0.0000,-0.9995,0.0314,0.0000 +0.0000,0.0000,0.0000,-1.0000,-0.0000,0.0000 +0.0000,0.0000,0.0000,-0.9995,-0.0314,0.0000 +0.0000,0.0000,0.0000,-0.9980,-0.0628,0.0000 +0.0000,0.0000,0.0000,-0.9956,-0.0941,0.0000 +0.0000,0.0000,0.0000,-0.9921,-0.1253,0.0000 +0.0000,0.0000,0.0000,-0.9877,-0.1564,0.0000 +0.0000,0.0000,0.0000,-0.9823,-0.1874,0.0000 +0.0000,0.0000,0.0000,-0.9759,-0.2181,0.0000 +0.0000,0.0000,0.0000,-0.9686,-0.2487,0.0000 +0.0000,0.0000,0.0000,-0.9603,-0.2790,0.0000 +0.0000,0.0000,0.0000,-0.9511,-0.3090,0.0000 +0.0000,0.0000,0.0000,-0.9409,-0.3387,0.0000 +0.0000,0.0000,0.0000,-0.9298,-0.3681,0.0000 +0.0000,0.0000,0.0000,-0.9178,-0.3971,0.0000 +0.0000,0.0000,0.0000,-0.9048,-0.4258,0.0000 +0.0000,0.0000,0.0000,-0.8910,-0.4540,0.0000 +0.0000,0.0000,0.0000,-0.8763,-0.4818,0.0000 +0.0000,0.0000,0.0000,-0.8607,-0.5090,0.0000 +0.0000,0.0000,0.0000,-0.8443,-0.5358,0.0000 +0.0000,0.0000,0.0000,-0.8271,-0.5621,0.0000 +0.0000,0.0000,0.0000,-0.8090,-0.5878,0.0000 +0.0000,0.0000,0.0000,-0.7902,-0.6129,0.0000 +0.0000,0.0000,0.0000,-0.7705,-0.6374,0.0000 +0.0000,0.0000,0.0000,-0.7501,-0.6613,0.0000 +0.0000,0.0000,0.0000,-0.7290,-0.6845,0.0000 +0.0000,0.0000,0.0000,-0.7071,-0.7071,0.0000 +0.0000,0.0000,0.0000,-0.6845,-0.7290,0.0000 +0.0000,0.0000,0.0000,-0.6613,-0.7501,0.0000 +0.0000,0.0000,0.0000,-0.6374,-0.7705,0.0000 +0.0000,0.0000,0.0000,-0.6129,-0.7902,0.0000 +0.0000,0.0000,0.0000,-0.5878,-0.8090,0.0000 +0.0000,0.0000,0.0000,-0.5621,-0.8271,0.0000 +0.0000,0.0000,0.0000,-0.5358,-0.8443,0.0000 +0.0000,0.0000,0.0000,-0.5090,-0.8607,0.0000 +0.0000,0.0000,0.0000,-0.4818,-0.8763,0.0000 +0.0000,0.0000,0.0000,-0.4540,-0.8910,0.0000 +0.0000,0.0000,0.0000,-0.4258,-0.9048,0.0000 +0.0000,0.0000,0.0000,-0.3971,-0.9178,0.0000 +0.0000,0.0000,0.0000,-0.3681,-0.9298,0.0000 +0.0000,0.0000,0.0000,-0.3387,-0.9409,0.0000 +0.0000,0.0000,0.0000,-0.3090,-0.9511,0.0000 +0.0000,0.0000,0.0000,-0.2790,-0.9603,0.0000 +0.0000,0.0000,0.0000,-0.2487,-0.9686,0.0000 +0.0000,0.0000,0.0000,-0.2181,-0.9759,0.0000 +0.0000,0.0000,0.0000,-0.1874,-0.9823,0.0000 +0.0000,0.0000,0.0000,-0.1564,-0.9877,0.0000 +0.0000,0.0000,0.0000,-0.1253,-0.9921,0.0000 +0.0000,0.0000,0.0000,-0.0941,-0.9956,0.0000 +0.0000,0.0000,0.0000,-0.0628,-0.9980,0.0000 +0.0000,0.0000,0.0000,-0.0314,-0.9995,0.0000 +0.0000,0.0000,0.0000,0.0000,-1.0000,0.0000 +0.0000,0.0000,0.0000,0.0314,-0.9995,0.0000 +0.0000,0.0000,0.0000,0.0628,-0.9980,0.0000 +0.0000,0.0000,0.0000,0.0941,-0.9956,0.0000 +0.0000,0.0000,0.0000,0.1253,-0.9921,0.0000 +0.0000,0.0000,0.0000,0.1564,-0.9877,0.0000 +0.0000,0.0000,0.0000,0.1874,-0.9823,0.0000 +0.0000,0.0000,0.0000,0.2181,-0.9759,0.0000 +0.0000,0.0000,0.0000,0.2487,-0.9686,0.0000 +0.0000,0.0000,0.0000,0.2790,-0.9603,0.0000 +0.0000,0.0000,0.0000,0.3090,-0.9511,0.0000 +0.0000,0.0000,0.0000,0.3387,-0.9409,0.0000 +0.0000,0.0000,0.0000,0.3681,-0.9298,0.0000 +0.0000,0.0000,0.0000,0.3971,-0.9178,0.0000 +0.0000,0.0000,0.0000,0.4258,-0.9048,0.0000 +0.0000,0.0000,0.0000,0.4540,-0.8910,0.0000 +0.0000,0.0000,0.0000,0.4818,-0.8763,0.0000 +0.0000,0.0000,0.0000,0.5090,-0.8607,0.0000 +0.0000,0.0000,0.0000,0.5358,-0.8443,0.0000 +0.0000,0.0000,0.0000,0.5621,-0.8271,0.0000 +0.0000,0.0000,0.0000,0.5878,-0.8090,0.0000 +0.0000,0.0000,0.0000,0.6129,-0.7902,0.0000 +0.0000,0.0000,0.0000,0.6374,-0.7705,0.0000 +0.0000,0.0000,0.0000,0.6613,-0.7501,0.0000 +0.0000,0.0000,0.0000,0.6845,-0.7290,0.0000 +0.0000,0.0000,0.0000,0.7071,-0.7071,0.0000 +0.0000,0.0000,0.0000,0.7290,-0.6845,0.0000 +0.0000,0.0000,0.0000,0.7501,-0.6613,0.0000 +0.0000,0.0000,0.0000,0.7705,-0.6374,0.0000 +0.0000,0.0000,0.0000,0.7902,-0.6129,0.0000 +0.0000,0.0000,0.0000,0.8090,-0.5878,0.0000 +0.0000,0.0000,0.0000,0.8271,-0.5621,0.0000 +0.0000,0.0000,0.0000,0.8443,-0.5358,0.0000 +0.0000,0.0000,0.0000,0.8607,-0.5090,0.0000 +0.0000,0.0000,0.0000,0.8763,-0.4818,0.0000 +0.0000,0.0000,0.0000,0.8910,-0.4540,0.0000 +0.0000,0.0000,0.0000,0.9048,-0.4258,0.0000 +0.0000,0.0000,0.0000,0.9178,-0.3971,0.0000 +0.0000,0.0000,0.0000,0.9298,-0.3681,0.0000 +0.0000,0.0000,0.0000,0.9409,-0.3387,0.0000 +0.0000,0.0000,0.0000,0.9511,-0.3090,0.0000 +0.0000,0.0000,0.0000,0.9603,-0.2790,0.0000 +0.0000,0.0000,0.0000,0.9686,-0.2487,0.0000 +0.0000,0.0000,0.0000,0.9759,-0.2181,0.0000 +0.0000,0.0000,0.0000,0.9823,-0.1874,0.0000 +0.0000,0.0000,0.0000,0.9877,-0.1564,0.0000 +0.0000,0.0000,0.0000,0.9921,-0.1253,0.0000 +0.0000,0.0000,0.0000,0.9956,-0.0941,0.0000 +0.0000,0.0000,0.0000,0.9980,-0.0628,0.0000 +0.0000,0.0000,0.0000,0.9995,-0.0314,0.0000 +0.0000,0.0000,0.0000,1.0000,0.0000,0.0000 diff --git a/scripts/trajectories/full-circle-4s-ccw.csv b/scripts/trajectories/full-circle-4s-ccw.csv new file mode 100644 index 0000000000..13eeae28e1 --- /dev/null +++ b/scripts/trajectories/full-circle-4s-ccw.csv @@ -0,0 +1,800 @@ +0.9999,0.0000,0.0000,0.0157 +0.9999,0.0000,0.0000,0.0157 +0.9999,0.0000,0.0000,0.0157 +0.9999,0.0000,0.0000,0.0157 +0.9995,0.0000,0.0000,0.0314 +0.9995,0.0000,0.0000,0.0314 +0.9995,0.0000,0.0000,0.0314 +0.9995,0.0000,0.0000,0.0314 +0.9989,0.0000,0.0000,0.0471 +0.9989,0.0000,0.0000,0.0471 +0.9989,0.0000,0.0000,0.0471 +0.9989,0.0000,0.0000,0.0471 +0.9980,0.0000,0.0000,0.0628 +0.9980,0.0000,0.0000,0.0628 +0.9980,0.0000,0.0000,0.0628 +0.9980,0.0000,0.0000,0.0628 +0.9969,0.0000,0.0000,0.0785 +0.9969,0.0000,0.0000,0.0785 +0.9969,0.0000,0.0000,0.0785 +0.9969,0.0000,0.0000,0.0785 +0.9956,0.0000,0.0000,0.0941 +0.9956,0.0000,0.0000,0.0941 +0.9956,0.0000,0.0000,0.0941 +0.9956,0.0000,0.0000,0.0941 +0.9940,0.0000,0.0000,0.1097 +0.9940,0.0000,0.0000,0.1097 +0.9940,0.0000,0.0000,0.1097 +0.9940,0.0000,0.0000,0.1097 +0.9921,0.0000,0.0000,0.1253 +0.9921,0.0000,0.0000,0.1253 +0.9921,0.0000,0.0000,0.1253 +0.9921,0.0000,0.0000,0.1253 +0.9900,0.0000,0.0000,0.1409 +0.9900,0.0000,0.0000,0.1409 +0.9900,0.0000,0.0000,0.1409 +0.9900,0.0000,0.0000,0.1409 +0.9877,0.0000,0.0000,0.1564 +0.9877,0.0000,0.0000,0.1564 +0.9877,0.0000,0.0000,0.1564 +0.9877,0.0000,0.0000,0.1564 +0.9851,0.0000,0.0000,0.1719 +0.9851,0.0000,0.0000,0.1719 +0.9851,0.0000,0.0000,0.1719 +0.9851,0.0000,0.0000,0.1719 +0.9823,0.0000,0.0000,0.1874 +0.9823,0.0000,0.0000,0.1874 +0.9823,0.0000,0.0000,0.1874 +0.9823,0.0000,0.0000,0.1874 +0.9792,0.0000,0.0000,0.2028 +0.9792,0.0000,0.0000,0.2028 +0.9792,0.0000,0.0000,0.2028 +0.9792,0.0000,0.0000,0.2028 +0.9759,0.0000,0.0000,0.2181 +0.9759,0.0000,0.0000,0.2181 +0.9759,0.0000,0.0000,0.2181 +0.9759,0.0000,0.0000,0.2181 +0.9724,0.0000,0.0000,0.2334 +0.9724,0.0000,0.0000,0.2334 +0.9724,0.0000,0.0000,0.2334 +0.9724,0.0000,0.0000,0.2334 +0.9686,0.0000,0.0000,0.2487 +0.9686,0.0000,0.0000,0.2487 +0.9686,0.0000,0.0000,0.2487 +0.9686,0.0000,0.0000,0.2487 +0.9646,0.0000,0.0000,0.2639 +0.9646,0.0000,0.0000,0.2639 +0.9646,0.0000,0.0000,0.2639 +0.9646,0.0000,0.0000,0.2639 +0.9603,0.0000,0.0000,0.2790 +0.9603,0.0000,0.0000,0.2790 +0.9603,0.0000,0.0000,0.2790 +0.9603,0.0000,0.0000,0.2790 +0.9558,0.0000,0.0000,0.2940 +0.9558,0.0000,0.0000,0.2940 +0.9558,0.0000,0.0000,0.2940 +0.9558,0.0000,0.0000,0.2940 +0.9511,0.0000,0.0000,0.3090 +0.9511,0.0000,0.0000,0.3090 +0.9511,0.0000,0.0000,0.3090 +0.9511,0.0000,0.0000,0.3090 +0.9461,0.0000,0.0000,0.3239 +0.9461,0.0000,0.0000,0.3239 +0.9461,0.0000,0.0000,0.3239 +0.9461,0.0000,0.0000,0.3239 +0.9409,0.0000,0.0000,0.3387 +0.9409,0.0000,0.0000,0.3387 +0.9409,0.0000,0.0000,0.3387 +0.9409,0.0000,0.0000,0.3387 +0.9354,0.0000,0.0000,0.3535 +0.9354,0.0000,0.0000,0.3535 +0.9354,0.0000,0.0000,0.3535 +0.9354,0.0000,0.0000,0.3535 +0.9298,0.0000,0.0000,0.3681 +0.9298,0.0000,0.0000,0.3681 +0.9298,0.0000,0.0000,0.3681 +0.9298,0.0000,0.0000,0.3681 +0.9239,0.0000,0.0000,0.3827 +0.9239,0.0000,0.0000,0.3827 +0.9239,0.0000,0.0000,0.3827 +0.9239,0.0000,0.0000,0.3827 +0.9178,0.0000,0.0000,0.3971 +0.9178,0.0000,0.0000,0.3971 +0.9178,0.0000,0.0000,0.3971 +0.9178,0.0000,0.0000,0.3971 +0.9114,0.0000,0.0000,0.4115 +0.9114,0.0000,0.0000,0.4115 +0.9114,0.0000,0.0000,0.4115 +0.9114,0.0000,0.0000,0.4115 +0.9048,0.0000,0.0000,0.4258 +0.9048,0.0000,0.0000,0.4258 +0.9048,0.0000,0.0000,0.4258 +0.9048,0.0000,0.0000,0.4258 +0.8980,0.0000,0.0000,0.4399 +0.8980,0.0000,0.0000,0.4399 +0.8980,0.0000,0.0000,0.4399 +0.8980,0.0000,0.0000,0.4399 +0.8910,0.0000,0.0000,0.4540 +0.8910,0.0000,0.0000,0.4540 +0.8910,0.0000,0.0000,0.4540 +0.8910,0.0000,0.0000,0.4540 +0.8838,0.0000,0.0000,0.4679 +0.8838,0.0000,0.0000,0.4679 +0.8838,0.0000,0.0000,0.4679 +0.8838,0.0000,0.0000,0.4679 +0.8763,0.0000,0.0000,0.4818 +0.8763,0.0000,0.0000,0.4818 +0.8763,0.0000,0.0000,0.4818 +0.8763,0.0000,0.0000,0.4818 +0.8686,0.0000,0.0000,0.4955 +0.8686,0.0000,0.0000,0.4955 +0.8686,0.0000,0.0000,0.4955 +0.8686,0.0000,0.0000,0.4955 +0.8607,0.0000,0.0000,0.5090 +0.8607,0.0000,0.0000,0.5090 +0.8607,0.0000,0.0000,0.5090 +0.8607,0.0000,0.0000,0.5090 +0.8526,0.0000,0.0000,0.5225 +0.8526,0.0000,0.0000,0.5225 +0.8526,0.0000,0.0000,0.5225 +0.8526,0.0000,0.0000,0.5225 +0.8443,0.0000,0.0000,0.5358 +0.8443,0.0000,0.0000,0.5358 +0.8443,0.0000,0.0000,0.5358 +0.8443,0.0000,0.0000,0.5358 +0.8358,0.0000,0.0000,0.5490 +0.8358,0.0000,0.0000,0.5490 +0.8358,0.0000,0.0000,0.5490 +0.8358,0.0000,0.0000,0.5490 +0.8271,0.0000,0.0000,0.5621 +0.8271,0.0000,0.0000,0.5621 +0.8271,0.0000,0.0000,0.5621 +0.8271,0.0000,0.0000,0.5621 +0.8181,0.0000,0.0000,0.5750 +0.8181,0.0000,0.0000,0.5750 +0.8181,0.0000,0.0000,0.5750 +0.8181,0.0000,0.0000,0.5750 +0.8090,0.0000,0.0000,0.5878 +0.8090,0.0000,0.0000,0.5878 +0.8090,0.0000,0.0000,0.5878 +0.8090,0.0000,0.0000,0.5878 +0.7997,0.0000,0.0000,0.6004 +0.7997,0.0000,0.0000,0.6004 +0.7997,0.0000,0.0000,0.6004 +0.7997,0.0000,0.0000,0.6004 +0.7902,0.0000,0.0000,0.6129 +0.7902,0.0000,0.0000,0.6129 +0.7902,0.0000,0.0000,0.6129 +0.7902,0.0000,0.0000,0.6129 +0.7804,0.0000,0.0000,0.6252 +0.7804,0.0000,0.0000,0.6252 +0.7804,0.0000,0.0000,0.6252 +0.7804,0.0000,0.0000,0.6252 +0.7705,0.0000,0.0000,0.6374 +0.7705,0.0000,0.0000,0.6374 +0.7705,0.0000,0.0000,0.6374 +0.7705,0.0000,0.0000,0.6374 +0.7604,0.0000,0.0000,0.6494 +0.7604,0.0000,0.0000,0.6494 +0.7604,0.0000,0.0000,0.6494 +0.7604,0.0000,0.0000,0.6494 +0.7501,0.0000,0.0000,0.6613 +0.7501,0.0000,0.0000,0.6613 +0.7501,0.0000,0.0000,0.6613 +0.7501,0.0000,0.0000,0.6613 +0.7396,0.0000,0.0000,0.6730 +0.7396,0.0000,0.0000,0.6730 +0.7396,0.0000,0.0000,0.6730 +0.7396,0.0000,0.0000,0.6730 +0.7290,0.0000,0.0000,0.6845 +0.7290,0.0000,0.0000,0.6845 +0.7290,0.0000,0.0000,0.6845 +0.7290,0.0000,0.0000,0.6845 +0.7181,0.0000,0.0000,0.6959 +0.7181,0.0000,0.0000,0.6959 +0.7181,0.0000,0.0000,0.6959 +0.7181,0.0000,0.0000,0.6959 +0.7071,0.0000,0.0000,0.7071 +0.7071,0.0000,0.0000,0.7071 +0.7071,0.0000,0.0000,0.7071 +0.7071,0.0000,0.0000,0.7071 +0.6959,0.0000,0.0000,0.7181 +0.6959,0.0000,0.0000,0.7181 +0.6959,0.0000,0.0000,0.7181 +0.6959,0.0000,0.0000,0.7181 +0.6845,0.0000,0.0000,0.7290 +0.6845,0.0000,0.0000,0.7290 +0.6845,0.0000,0.0000,0.7290 +0.6845,0.0000,0.0000,0.7290 +0.6730,0.0000,0.0000,0.7396 +0.6730,0.0000,0.0000,0.7396 +0.6730,0.0000,0.0000,0.7396 +0.6730,0.0000,0.0000,0.7396 +0.6613,0.0000,0.0000,0.7501 +0.6613,0.0000,0.0000,0.7501 +0.6613,0.0000,0.0000,0.7501 +0.6613,0.0000,0.0000,0.7501 +0.6494,0.0000,0.0000,0.7604 +0.6494,0.0000,0.0000,0.7604 +0.6494,0.0000,0.0000,0.7604 +0.6494,0.0000,0.0000,0.7604 +0.6374,0.0000,0.0000,0.7705 +0.6374,0.0000,0.0000,0.7705 +0.6374,0.0000,0.0000,0.7705 +0.6374,0.0000,0.0000,0.7705 +0.6252,0.0000,0.0000,0.7804 +0.6252,0.0000,0.0000,0.7804 +0.6252,0.0000,0.0000,0.7804 +0.6252,0.0000,0.0000,0.7804 +0.6129,0.0000,0.0000,0.7902 +0.6129,0.0000,0.0000,0.7902 +0.6129,0.0000,0.0000,0.7902 +0.6129,0.0000,0.0000,0.7902 +0.6004,0.0000,0.0000,0.7997 +0.6004,0.0000,0.0000,0.7997 +0.6004,0.0000,0.0000,0.7997 +0.6004,0.0000,0.0000,0.7997 +0.5878,0.0000,0.0000,0.8090 +0.5878,0.0000,0.0000,0.8090 +0.5878,0.0000,0.0000,0.8090 +0.5878,0.0000,0.0000,0.8090 +0.5750,0.0000,0.0000,0.8181 +0.5750,0.0000,0.0000,0.8181 +0.5750,0.0000,0.0000,0.8181 +0.5750,0.0000,0.0000,0.8181 +0.5621,0.0000,0.0000,0.8271 +0.5621,0.0000,0.0000,0.8271 +0.5621,0.0000,0.0000,0.8271 +0.5621,0.0000,0.0000,0.8271 +0.5490,0.0000,0.0000,0.8358 +0.5490,0.0000,0.0000,0.8358 +0.5490,0.0000,0.0000,0.8358 +0.5490,0.0000,0.0000,0.8358 +0.5358,0.0000,0.0000,0.8443 +0.5358,0.0000,0.0000,0.8443 +0.5358,0.0000,0.0000,0.8443 +0.5358,0.0000,0.0000,0.8443 +0.5225,0.0000,0.0000,0.8526 +0.5225,0.0000,0.0000,0.8526 +0.5225,0.0000,0.0000,0.8526 +0.5225,0.0000,0.0000,0.8526 +0.5090,0.0000,0.0000,0.8607 +0.5090,0.0000,0.0000,0.8607 +0.5090,0.0000,0.0000,0.8607 +0.5090,0.0000,0.0000,0.8607 +0.4955,0.0000,0.0000,0.8686 +0.4955,0.0000,0.0000,0.8686 +0.4955,0.0000,0.0000,0.8686 +0.4955,0.0000,0.0000,0.8686 +0.4818,0.0000,0.0000,0.8763 +0.4818,0.0000,0.0000,0.8763 +0.4818,0.0000,0.0000,0.8763 +0.4818,0.0000,0.0000,0.8763 +0.4679,0.0000,0.0000,0.8838 +0.4679,0.0000,0.0000,0.8838 +0.4679,0.0000,0.0000,0.8838 +0.4679,0.0000,0.0000,0.8838 +0.4540,0.0000,0.0000,0.8910 +0.4540,0.0000,0.0000,0.8910 +0.4540,0.0000,0.0000,0.8910 +0.4540,0.0000,0.0000,0.8910 +0.4399,0.0000,0.0000,0.8980 +0.4399,0.0000,0.0000,0.8980 +0.4399,0.0000,0.0000,0.8980 +0.4399,0.0000,0.0000,0.8980 +0.4258,0.0000,0.0000,0.9048 +0.4258,0.0000,0.0000,0.9048 +0.4258,0.0000,0.0000,0.9048 +0.4258,0.0000,0.0000,0.9048 +0.4115,0.0000,0.0000,0.9114 +0.4115,0.0000,0.0000,0.9114 +0.4115,0.0000,0.0000,0.9114 +0.4115,0.0000,0.0000,0.9114 +0.3971,0.0000,0.0000,0.9178 +0.3971,0.0000,0.0000,0.9178 +0.3971,0.0000,0.0000,0.9178 +0.3971,0.0000,0.0000,0.9178 +0.3827,0.0000,0.0000,0.9239 +0.3827,0.0000,0.0000,0.9239 +0.3827,0.0000,0.0000,0.9239 +0.3827,0.0000,0.0000,0.9239 +0.3681,0.0000,0.0000,0.9298 +0.3681,0.0000,0.0000,0.9298 +0.3681,0.0000,0.0000,0.9298 +0.3681,0.0000,0.0000,0.9298 +0.3535,0.0000,0.0000,0.9354 +0.3535,0.0000,0.0000,0.9354 +0.3535,0.0000,0.0000,0.9354 +0.3535,0.0000,0.0000,0.9354 +0.3387,0.0000,0.0000,0.9409 +0.3387,0.0000,0.0000,0.9409 +0.3387,0.0000,0.0000,0.9409 +0.3387,0.0000,0.0000,0.9409 +0.3239,0.0000,0.0000,0.9461 +0.3239,0.0000,0.0000,0.9461 +0.3239,0.0000,0.0000,0.9461 +0.3239,0.0000,0.0000,0.9461 +0.3090,0.0000,0.0000,0.9511 +0.3090,0.0000,0.0000,0.9511 +0.3090,0.0000,0.0000,0.9511 +0.3090,0.0000,0.0000,0.9511 +0.2940,0.0000,0.0000,0.9558 +0.2940,0.0000,0.0000,0.9558 +0.2940,0.0000,0.0000,0.9558 +0.2940,0.0000,0.0000,0.9558 +0.2790,0.0000,0.0000,0.9603 +0.2790,0.0000,0.0000,0.9603 +0.2790,0.0000,0.0000,0.9603 +0.2790,0.0000,0.0000,0.9603 +0.2639,0.0000,0.0000,0.9646 +0.2639,0.0000,0.0000,0.9646 +0.2639,0.0000,0.0000,0.9646 +0.2639,0.0000,0.0000,0.9646 +0.2487,0.0000,0.0000,0.9686 +0.2487,0.0000,0.0000,0.9686 +0.2487,0.0000,0.0000,0.9686 +0.2487,0.0000,0.0000,0.9686 +0.2334,0.0000,0.0000,0.9724 +0.2334,0.0000,0.0000,0.9724 +0.2334,0.0000,0.0000,0.9724 +0.2334,0.0000,0.0000,0.9724 +0.2181,0.0000,0.0000,0.9759 +0.2181,0.0000,0.0000,0.9759 +0.2181,0.0000,0.0000,0.9759 +0.2181,0.0000,0.0000,0.9759 +0.2028,0.0000,0.0000,0.9792 +0.2028,0.0000,0.0000,0.9792 +0.2028,0.0000,0.0000,0.9792 +0.2028,0.0000,0.0000,0.9792 +0.1874,0.0000,0.0000,0.9823 +0.1874,0.0000,0.0000,0.9823 +0.1874,0.0000,0.0000,0.9823 +0.1874,0.0000,0.0000,0.9823 +0.1719,0.0000,0.0000,0.9851 +0.1719,0.0000,0.0000,0.9851 +0.1719,0.0000,0.0000,0.9851 +0.1719,0.0000,0.0000,0.9851 +0.1564,0.0000,0.0000,0.9877 +0.1564,0.0000,0.0000,0.9877 +0.1564,0.0000,0.0000,0.9877 +0.1564,0.0000,0.0000,0.9877 +0.1409,0.0000,0.0000,0.9900 +0.1409,0.0000,0.0000,0.9900 +0.1409,0.0000,0.0000,0.9900 +0.1409,0.0000,0.0000,0.9900 +0.1253,0.0000,0.0000,0.9921 +0.1253,0.0000,0.0000,0.9921 +0.1253,0.0000,0.0000,0.9921 +0.1253,0.0000,0.0000,0.9921 +0.1097,0.0000,0.0000,0.9940 +0.1097,0.0000,0.0000,0.9940 +0.1097,0.0000,0.0000,0.9940 +0.1097,0.0000,0.0000,0.9940 +0.0941,0.0000,0.0000,0.9956 +0.0941,0.0000,0.0000,0.9956 +0.0941,0.0000,0.0000,0.9956 +0.0941,0.0000,0.0000,0.9956 +0.0785,0.0000,0.0000,0.9969 +0.0785,0.0000,0.0000,0.9969 +0.0785,0.0000,0.0000,0.9969 +0.0785,0.0000,0.0000,0.9969 +0.0628,0.0000,0.0000,0.9980 +0.0628,0.0000,0.0000,0.9980 +0.0628,0.0000,0.0000,0.9980 +0.0628,0.0000,0.0000,0.9980 +0.0471,0.0000,0.0000,0.9989 +0.0471,0.0000,0.0000,0.9989 +0.0471,0.0000,0.0000,0.9989 +0.0471,0.0000,0.0000,0.9989 +0.0314,0.0000,0.0000,0.9995 +0.0314,0.0000,0.0000,0.9995 +0.0314,0.0000,0.0000,0.9995 +0.0314,0.0000,0.0000,0.9995 +0.0157,0.0000,0.0000,0.9999 +0.0157,0.0000,0.0000,0.9999 +0.0157,0.0000,0.0000,0.9999 +0.0157,0.0000,0.0000,0.9999 +-0.0000,0.0000,0.0000,1.0000 +-0.0000,0.0000,0.0000,1.0000 +-0.0000,0.0000,0.0000,1.0000 +-0.0000,0.0000,0.0000,1.0000 +-0.0157,0.0000,0.0000,0.9999 +-0.0157,0.0000,0.0000,0.9999 +-0.0157,0.0000,0.0000,0.9999 +-0.0157,0.0000,0.0000,0.9999 +-0.0314,0.0000,0.0000,0.9995 +-0.0314,0.0000,0.0000,0.9995 +-0.0314,0.0000,0.0000,0.9995 +-0.0314,0.0000,0.0000,0.9995 +-0.0471,0.0000,0.0000,0.9989 +-0.0471,0.0000,0.0000,0.9989 +-0.0471,0.0000,0.0000,0.9989 +-0.0471,0.0000,0.0000,0.9989 +-0.0628,0.0000,0.0000,0.9980 +-0.0628,0.0000,0.0000,0.9980 +-0.0628,0.0000,0.0000,0.9980 +-0.0628,0.0000,0.0000,0.9980 +-0.0785,0.0000,0.0000,0.9969 +-0.0785,0.0000,0.0000,0.9969 +-0.0785,0.0000,0.0000,0.9969 +-0.0785,0.0000,0.0000,0.9969 +-0.0941,0.0000,0.0000,0.9956 +-0.0941,0.0000,0.0000,0.9956 +-0.0941,0.0000,0.0000,0.9956 +-0.0941,0.0000,0.0000,0.9956 +-0.1097,0.0000,0.0000,0.9940 +-0.1097,0.0000,0.0000,0.9940 +-0.1097,0.0000,0.0000,0.9940 +-0.1097,0.0000,0.0000,0.9940 +-0.1253,0.0000,0.0000,0.9921 +-0.1253,0.0000,0.0000,0.9921 +-0.1253,0.0000,0.0000,0.9921 +-0.1253,0.0000,0.0000,0.9921 +-0.1409,0.0000,0.0000,0.9900 +-0.1409,0.0000,0.0000,0.9900 +-0.1409,0.0000,0.0000,0.9900 +-0.1409,0.0000,0.0000,0.9900 +-0.1564,0.0000,0.0000,0.9877 +-0.1564,0.0000,0.0000,0.9877 +-0.1564,0.0000,0.0000,0.9877 +-0.1564,0.0000,0.0000,0.9877 +-0.1719,0.0000,0.0000,0.9851 +-0.1719,0.0000,0.0000,0.9851 +-0.1719,0.0000,0.0000,0.9851 +-0.1719,0.0000,0.0000,0.9851 +-0.1874,0.0000,0.0000,0.9823 +-0.1874,0.0000,0.0000,0.9823 +-0.1874,0.0000,0.0000,0.9823 +-0.1874,0.0000,0.0000,0.9823 +-0.2028,0.0000,0.0000,0.9792 +-0.2028,0.0000,0.0000,0.9792 +-0.2028,0.0000,0.0000,0.9792 +-0.2028,0.0000,0.0000,0.9792 +-0.2181,0.0000,0.0000,0.9759 +-0.2181,0.0000,0.0000,0.9759 +-0.2181,0.0000,0.0000,0.9759 +-0.2181,0.0000,0.0000,0.9759 +-0.2334,0.0000,0.0000,0.9724 +-0.2334,0.0000,0.0000,0.9724 +-0.2334,0.0000,0.0000,0.9724 +-0.2334,0.0000,0.0000,0.9724 +-0.2487,0.0000,0.0000,0.9686 +-0.2487,0.0000,0.0000,0.9686 +-0.2487,0.0000,0.0000,0.9686 +-0.2487,0.0000,0.0000,0.9686 +-0.2639,0.0000,0.0000,0.9646 +-0.2639,0.0000,0.0000,0.9646 +-0.2639,0.0000,0.0000,0.9646 +-0.2639,0.0000,0.0000,0.9646 +-0.2790,0.0000,0.0000,0.9603 +-0.2790,0.0000,0.0000,0.9603 +-0.2790,0.0000,0.0000,0.9603 +-0.2790,0.0000,0.0000,0.9603 +-0.2940,0.0000,0.0000,0.9558 +-0.2940,0.0000,0.0000,0.9558 +-0.2940,0.0000,0.0000,0.9558 +-0.2940,0.0000,0.0000,0.9558 +-0.3090,0.0000,0.0000,0.9511 +-0.3090,0.0000,0.0000,0.9511 +-0.3090,0.0000,0.0000,0.9511 +-0.3090,0.0000,0.0000,0.9511 +-0.3239,0.0000,0.0000,0.9461 +-0.3239,0.0000,0.0000,0.9461 +-0.3239,0.0000,0.0000,0.9461 +-0.3239,0.0000,0.0000,0.9461 +-0.3387,0.0000,0.0000,0.9409 +-0.3387,0.0000,0.0000,0.9409 +-0.3387,0.0000,0.0000,0.9409 +-0.3387,0.0000,0.0000,0.9409 +-0.3535,0.0000,0.0000,0.9354 +-0.3535,0.0000,0.0000,0.9354 +-0.3535,0.0000,0.0000,0.9354 +-0.3535,0.0000,0.0000,0.9354 +-0.3681,0.0000,0.0000,0.9298 +-0.3681,0.0000,0.0000,0.9298 +-0.3681,0.0000,0.0000,0.9298 +-0.3681,0.0000,0.0000,0.9298 +-0.3827,0.0000,0.0000,0.9239 +-0.3827,0.0000,0.0000,0.9239 +-0.3827,0.0000,0.0000,0.9239 +-0.3827,0.0000,0.0000,0.9239 +-0.3971,0.0000,0.0000,0.9178 +-0.3971,0.0000,0.0000,0.9178 +-0.3971,0.0000,0.0000,0.9178 +-0.3971,0.0000,0.0000,0.9178 +-0.4115,0.0000,0.0000,0.9114 +-0.4115,0.0000,0.0000,0.9114 +-0.4115,0.0000,0.0000,0.9114 +-0.4115,0.0000,0.0000,0.9114 +-0.4258,0.0000,0.0000,0.9048 +-0.4258,0.0000,0.0000,0.9048 +-0.4258,0.0000,0.0000,0.9048 +-0.4258,0.0000,0.0000,0.9048 +-0.4399,0.0000,0.0000,0.8980 +-0.4399,0.0000,0.0000,0.8980 +-0.4399,0.0000,0.0000,0.8980 +-0.4399,0.0000,0.0000,0.8980 +-0.4540,0.0000,0.0000,0.8910 +-0.4540,0.0000,0.0000,0.8910 +-0.4540,0.0000,0.0000,0.8910 +-0.4540,0.0000,0.0000,0.8910 +-0.4679,0.0000,0.0000,0.8838 +-0.4679,0.0000,0.0000,0.8838 +-0.4679,0.0000,0.0000,0.8838 +-0.4679,0.0000,0.0000,0.8838 +-0.4818,0.0000,0.0000,0.8763 +-0.4818,0.0000,0.0000,0.8763 +-0.4818,0.0000,0.0000,0.8763 +-0.4818,0.0000,0.0000,0.8763 +-0.4955,0.0000,0.0000,0.8686 +-0.4955,0.0000,0.0000,0.8686 +-0.4955,0.0000,0.0000,0.8686 +-0.4955,0.0000,0.0000,0.8686 +-0.5090,0.0000,0.0000,0.8607 +-0.5090,0.0000,0.0000,0.8607 +-0.5090,0.0000,0.0000,0.8607 +-0.5090,0.0000,0.0000,0.8607 +-0.5225,0.0000,0.0000,0.8526 +-0.5225,0.0000,0.0000,0.8526 +-0.5225,0.0000,0.0000,0.8526 +-0.5225,0.0000,0.0000,0.8526 +-0.5358,0.0000,0.0000,0.8443 +-0.5358,0.0000,0.0000,0.8443 +-0.5358,0.0000,0.0000,0.8443 +-0.5358,0.0000,0.0000,0.8443 +-0.5490,0.0000,0.0000,0.8358 +-0.5490,0.0000,0.0000,0.8358 +-0.5490,0.0000,0.0000,0.8358 +-0.5490,0.0000,0.0000,0.8358 +-0.5621,0.0000,0.0000,0.8271 +-0.5621,0.0000,0.0000,0.8271 +-0.5621,0.0000,0.0000,0.8271 +-0.5621,0.0000,0.0000,0.8271 +-0.5750,0.0000,0.0000,0.8181 +-0.5750,0.0000,0.0000,0.8181 +-0.5750,0.0000,0.0000,0.8181 +-0.5750,0.0000,0.0000,0.8181 +-0.5878,0.0000,0.0000,0.8090 +-0.5878,0.0000,0.0000,0.8090 +-0.5878,0.0000,0.0000,0.8090 +-0.5878,0.0000,0.0000,0.8090 +-0.6004,0.0000,0.0000,0.7997 +-0.6004,0.0000,0.0000,0.7997 +-0.6004,0.0000,0.0000,0.7997 +-0.6004,0.0000,0.0000,0.7997 +-0.6129,0.0000,0.0000,0.7902 +-0.6129,0.0000,0.0000,0.7902 +-0.6129,0.0000,0.0000,0.7902 +-0.6129,0.0000,0.0000,0.7902 +-0.6252,0.0000,0.0000,0.7804 +-0.6252,0.0000,0.0000,0.7804 +-0.6252,0.0000,0.0000,0.7804 +-0.6252,0.0000,0.0000,0.7804 +-0.6374,0.0000,0.0000,0.7705 +-0.6374,0.0000,0.0000,0.7705 +-0.6374,0.0000,0.0000,0.7705 +-0.6374,0.0000,0.0000,0.7705 +-0.6494,0.0000,0.0000,0.7604 +-0.6494,0.0000,0.0000,0.7604 +-0.6494,0.0000,0.0000,0.7604 +-0.6494,0.0000,0.0000,0.7604 +-0.6613,0.0000,0.0000,0.7501 +-0.6613,0.0000,0.0000,0.7501 +-0.6613,0.0000,0.0000,0.7501 +-0.6613,0.0000,0.0000,0.7501 +-0.6730,0.0000,0.0000,0.7396 +-0.6730,0.0000,0.0000,0.7396 +-0.6730,0.0000,0.0000,0.7396 +-0.6730,0.0000,0.0000,0.7396 +-0.6845,0.0000,0.0000,0.7290 +-0.6845,0.0000,0.0000,0.7290 +-0.6845,0.0000,0.0000,0.7290 +-0.6845,0.0000,0.0000,0.7290 +-0.6959,0.0000,0.0000,0.7181 +-0.6959,0.0000,0.0000,0.7181 +-0.6959,0.0000,0.0000,0.7181 +-0.6959,0.0000,0.0000,0.7181 +-0.7071,0.0000,0.0000,0.7071 +-0.7071,0.0000,0.0000,0.7071 +-0.7071,0.0000,0.0000,0.7071 +-0.7071,0.0000,0.0000,0.7071 +-0.7181,0.0000,0.0000,0.6959 +-0.7181,0.0000,0.0000,0.6959 +-0.7181,0.0000,0.0000,0.6959 +-0.7181,0.0000,0.0000,0.6959 +-0.7290,0.0000,0.0000,0.6845 +-0.7290,0.0000,0.0000,0.6845 +-0.7290,0.0000,0.0000,0.6845 +-0.7290,0.0000,0.0000,0.6845 +-0.7396,0.0000,0.0000,0.6730 +-0.7396,0.0000,0.0000,0.6730 +-0.7396,0.0000,0.0000,0.6730 +-0.7396,0.0000,0.0000,0.6730 +-0.7501,0.0000,0.0000,0.6613 +-0.7501,0.0000,0.0000,0.6613 +-0.7501,0.0000,0.0000,0.6613 +-0.7501,0.0000,0.0000,0.6613 +-0.7604,0.0000,0.0000,0.6494 +-0.7604,0.0000,0.0000,0.6494 +-0.7604,0.0000,0.0000,0.6494 +-0.7604,0.0000,0.0000,0.6494 +-0.7705,0.0000,0.0000,0.6374 +-0.7705,0.0000,0.0000,0.6374 +-0.7705,0.0000,0.0000,0.6374 +-0.7705,0.0000,0.0000,0.6374 +-0.7804,0.0000,0.0000,0.6252 +-0.7804,0.0000,0.0000,0.6252 +-0.7804,0.0000,0.0000,0.6252 +-0.7804,0.0000,0.0000,0.6252 +-0.7902,0.0000,0.0000,0.6129 +-0.7902,0.0000,0.0000,0.6129 +-0.7902,0.0000,0.0000,0.6129 +-0.7902,0.0000,0.0000,0.6129 +-0.7997,0.0000,0.0000,0.6004 +-0.7997,0.0000,0.0000,0.6004 +-0.7997,0.0000,0.0000,0.6004 +-0.7997,0.0000,0.0000,0.6004 +-0.8090,0.0000,0.0000,0.5878 +-0.8090,0.0000,0.0000,0.5878 +-0.8090,0.0000,0.0000,0.5878 +-0.8090,0.0000,0.0000,0.5878 +-0.8182,0.0000,0.0000,0.5750 +-0.8182,0.0000,0.0000,0.5750 +-0.8182,0.0000,0.0000,0.5750 +-0.8182,0.0000,0.0000,0.5750 +-0.8271,0.0000,0.0000,0.5621 +-0.8271,0.0000,0.0000,0.5621 +-0.8271,0.0000,0.0000,0.5621 +-0.8271,0.0000,0.0000,0.5621 +-0.8358,0.0000,0.0000,0.5490 +-0.8358,0.0000,0.0000,0.5490 +-0.8358,0.0000,0.0000,0.5490 +-0.8358,0.0000,0.0000,0.5490 +-0.8443,0.0000,0.0000,0.5358 +-0.8443,0.0000,0.0000,0.5358 +-0.8443,0.0000,0.0000,0.5358 +-0.8443,0.0000,0.0000,0.5358 +-0.8526,0.0000,0.0000,0.5225 +-0.8526,0.0000,0.0000,0.5225 +-0.8526,0.0000,0.0000,0.5225 +-0.8526,0.0000,0.0000,0.5225 +-0.8607,0.0000,0.0000,0.5090 +-0.8607,0.0000,0.0000,0.5090 +-0.8607,0.0000,0.0000,0.5090 +-0.8607,0.0000,0.0000,0.5090 +-0.8686,0.0000,0.0000,0.4955 +-0.8686,0.0000,0.0000,0.4955 +-0.8686,0.0000,0.0000,0.4955 +-0.8686,0.0000,0.0000,0.4955 +-0.8763,0.0000,0.0000,0.4818 +-0.8763,0.0000,0.0000,0.4818 +-0.8763,0.0000,0.0000,0.4818 +-0.8763,0.0000,0.0000,0.4818 +-0.8838,0.0000,0.0000,0.4679 +-0.8838,0.0000,0.0000,0.4679 +-0.8838,0.0000,0.0000,0.4679 +-0.8838,0.0000,0.0000,0.4679 +-0.8910,0.0000,0.0000,0.4540 +-0.8910,0.0000,0.0000,0.4540 +-0.8910,0.0000,0.0000,0.4540 +-0.8910,0.0000,0.0000,0.4540 +-0.8980,0.0000,0.0000,0.4399 +-0.8980,0.0000,0.0000,0.4399 +-0.8980,0.0000,0.0000,0.4399 +-0.8980,0.0000,0.0000,0.4399 +-0.9048,0.0000,0.0000,0.4258 +-0.9048,0.0000,0.0000,0.4258 +-0.9048,0.0000,0.0000,0.4258 +-0.9048,0.0000,0.0000,0.4258 +-0.9114,0.0000,0.0000,0.4115 +-0.9114,0.0000,0.0000,0.4115 +-0.9114,0.0000,0.0000,0.4115 +-0.9114,0.0000,0.0000,0.4115 +-0.9178,0.0000,0.0000,0.3971 +-0.9178,0.0000,0.0000,0.3971 +-0.9178,0.0000,0.0000,0.3971 +-0.9178,0.0000,0.0000,0.3971 +-0.9239,0.0000,0.0000,0.3827 +-0.9239,0.0000,0.0000,0.3827 +-0.9239,0.0000,0.0000,0.3827 +-0.9239,0.0000,0.0000,0.3827 +-0.9298,0.0000,0.0000,0.3681 +-0.9298,0.0000,0.0000,0.3681 +-0.9298,0.0000,0.0000,0.3681 +-0.9298,0.0000,0.0000,0.3681 +-0.9354,0.0000,0.0000,0.3535 +-0.9354,0.0000,0.0000,0.3535 +-0.9354,0.0000,0.0000,0.3535 +-0.9354,0.0000,0.0000,0.3535 +-0.9409,0.0000,0.0000,0.3387 +-0.9409,0.0000,0.0000,0.3387 +-0.9409,0.0000,0.0000,0.3387 +-0.9409,0.0000,0.0000,0.3387 +-0.9461,0.0000,0.0000,0.3239 +-0.9461,0.0000,0.0000,0.3239 +-0.9461,0.0000,0.0000,0.3239 +-0.9461,0.0000,0.0000,0.3239 +-0.9511,0.0000,0.0000,0.3090 +-0.9511,0.0000,0.0000,0.3090 +-0.9511,0.0000,0.0000,0.3090 +-0.9511,0.0000,0.0000,0.3090 +-0.9558,0.0000,0.0000,0.2940 +-0.9558,0.0000,0.0000,0.2940 +-0.9558,0.0000,0.0000,0.2940 +-0.9558,0.0000,0.0000,0.2940 +-0.9603,0.0000,0.0000,0.2790 +-0.9603,0.0000,0.0000,0.2790 +-0.9603,0.0000,0.0000,0.2790 +-0.9603,0.0000,0.0000,0.2790 +-0.9646,0.0000,0.0000,0.2639 +-0.9646,0.0000,0.0000,0.2639 +-0.9646,0.0000,0.0000,0.2639 +-0.9646,0.0000,0.0000,0.2639 +-0.9686,0.0000,0.0000,0.2487 +-0.9686,0.0000,0.0000,0.2487 +-0.9686,0.0000,0.0000,0.2487 +-0.9686,0.0000,0.0000,0.2487 +-0.9724,0.0000,0.0000,0.2334 +-0.9724,0.0000,0.0000,0.2334 +-0.9724,0.0000,0.0000,0.2334 +-0.9724,0.0000,0.0000,0.2334 +-0.9759,0.0000,0.0000,0.2181 +-0.9759,0.0000,0.0000,0.2181 +-0.9759,0.0000,0.0000,0.2181 +-0.9759,0.0000,0.0000,0.2181 +-0.9792,0.0000,0.0000,0.2028 +-0.9792,0.0000,0.0000,0.2028 +-0.9792,0.0000,0.0000,0.2028 +-0.9792,0.0000,0.0000,0.2028 +-0.9823,0.0000,0.0000,0.1874 +-0.9823,0.0000,0.0000,0.1874 +-0.9823,0.0000,0.0000,0.1874 +-0.9823,0.0000,0.0000,0.1874 +-0.9851,0.0000,0.0000,0.1719 +-0.9851,0.0000,0.0000,0.1719 +-0.9851,0.0000,0.0000,0.1719 +-0.9851,0.0000,0.0000,0.1719 +-0.9877,0.0000,0.0000,0.1564 +-0.9877,0.0000,0.0000,0.1564 +-0.9877,0.0000,0.0000,0.1564 +-0.9877,0.0000,0.0000,0.1564 +-0.9900,0.0000,0.0000,0.1409 +-0.9900,0.0000,0.0000,0.1409 +-0.9900,0.0000,0.0000,0.1409 +-0.9900,0.0000,0.0000,0.1409 +-0.9921,0.0000,0.0000,0.1253 +-0.9921,0.0000,0.0000,0.1253 +-0.9921,0.0000,0.0000,0.1253 +-0.9921,0.0000,0.0000,0.1253 +-0.9940,0.0000,0.0000,0.1097 +-0.9940,0.0000,0.0000,0.1097 +-0.9940,0.0000,0.0000,0.1097 +-0.9940,0.0000,0.0000,0.1097 +-0.9956,0.0000,0.0000,0.0941 +-0.9956,0.0000,0.0000,0.0941 +-0.9956,0.0000,0.0000,0.0941 +-0.9956,0.0000,0.0000,0.0941 +-0.9969,0.0000,0.0000,0.0785 +-0.9969,0.0000,0.0000,0.0785 +-0.9969,0.0000,0.0000,0.0785 +-0.9969,0.0000,0.0000,0.0785 +-0.9980,0.0000,0.0000,0.0628 +-0.9980,0.0000,0.0000,0.0628 +-0.9980,0.0000,0.0000,0.0628 +-0.9980,0.0000,0.0000,0.0628 +-0.9989,0.0000,0.0000,0.0471 +-0.9989,0.0000,0.0000,0.0471 +-0.9989,0.0000,0.0000,0.0471 +-0.9989,0.0000,0.0000,0.0471 +-0.9995,0.0000,0.0000,0.0314 +-0.9995,0.0000,0.0000,0.0314 +-0.9995,0.0000,0.0000,0.0314 +-0.9995,0.0000,0.0000,0.0314 +-0.9999,0.0000,0.0000,0.0157 +-0.9999,0.0000,0.0000,0.0157 +-0.9999,0.0000,0.0000,0.0157 +-0.9999,0.0000,0.0000,0.0157 +1.0000,0.0000,0.0000,0.0000 +1.0000,0.0000,0.0000,0.0000 +1.0000,0.0000,0.0000,0.0000 +1.0000,0.0000,0.0000,0.0000 diff --git a/scripts/trajectories/full-circle-4s.csv b/scripts/trajectories/full-circle-4s.csv new file mode 100644 index 0000000000..4174a531b7 --- /dev/null +++ b/scripts/trajectories/full-circle-4s.csv @@ -0,0 +1,800 @@ +0.9999,0.0000,0.0000,-0.0157 +0.9999,0.0000,0.0000,-0.0157 +0.9999,0.0000,0.0000,-0.0157 +0.9999,0.0000,0.0000,-0.0157 +0.9995,0.0000,0.0000,-0.0314 +0.9995,0.0000,0.0000,-0.0314 +0.9995,0.0000,0.0000,-0.0314 +0.9995,0.0000,0.0000,-0.0314 +0.9989,0.0000,0.0000,-0.0471 +0.9989,0.0000,0.0000,-0.0471 +0.9989,0.0000,0.0000,-0.0471 +0.9989,0.0000,0.0000,-0.0471 +0.9980,0.0000,0.0000,-0.0628 +0.9980,0.0000,0.0000,-0.0628 +0.9980,0.0000,0.0000,-0.0628 +0.9980,0.0000,0.0000,-0.0628 +0.9969,0.0000,0.0000,-0.0785 +0.9969,0.0000,0.0000,-0.0785 +0.9969,0.0000,0.0000,-0.0785 +0.9969,0.0000,0.0000,-0.0785 +0.9956,0.0000,0.0000,-0.0941 +0.9956,0.0000,0.0000,-0.0941 +0.9956,0.0000,0.0000,-0.0941 +0.9956,0.0000,0.0000,-0.0941 +0.9940,0.0000,0.0000,-0.1097 +0.9940,0.0000,0.0000,-0.1097 +0.9940,0.0000,0.0000,-0.1097 +0.9940,0.0000,0.0000,-0.1097 +0.9921,0.0000,0.0000,-0.1253 +0.9921,0.0000,0.0000,-0.1253 +0.9921,0.0000,0.0000,-0.1253 +0.9921,0.0000,0.0000,-0.1253 +0.9900,0.0000,0.0000,-0.1409 +0.9900,0.0000,0.0000,-0.1409 +0.9900,0.0000,0.0000,-0.1409 +0.9900,0.0000,0.0000,-0.1409 +0.9877,0.0000,0.0000,-0.1564 +0.9877,0.0000,0.0000,-0.1564 +0.9877,0.0000,0.0000,-0.1564 +0.9877,0.0000,0.0000,-0.1564 +0.9851,0.0000,0.0000,-0.1719 +0.9851,0.0000,0.0000,-0.1719 +0.9851,0.0000,0.0000,-0.1719 +0.9851,0.0000,0.0000,-0.1719 +0.9823,0.0000,0.0000,-0.1874 +0.9823,0.0000,0.0000,-0.1874 +0.9823,0.0000,0.0000,-0.1874 +0.9823,0.0000,0.0000,-0.1874 +0.9792,0.0000,0.0000,-0.2028 +0.9792,0.0000,0.0000,-0.2028 +0.9792,0.0000,0.0000,-0.2028 +0.9792,0.0000,0.0000,-0.2028 +0.9759,0.0000,0.0000,-0.2181 +0.9759,0.0000,0.0000,-0.2181 +0.9759,0.0000,0.0000,-0.2181 +0.9759,0.0000,0.0000,-0.2181 +0.9724,0.0000,0.0000,-0.2334 +0.9724,0.0000,0.0000,-0.2334 +0.9724,0.0000,0.0000,-0.2334 +0.9724,0.0000,0.0000,-0.2334 +0.9686,0.0000,0.0000,-0.2487 +0.9686,0.0000,0.0000,-0.2487 +0.9686,0.0000,0.0000,-0.2487 +0.9686,0.0000,0.0000,-0.2487 +0.9646,0.0000,0.0000,-0.2639 +0.9646,0.0000,0.0000,-0.2639 +0.9646,0.0000,0.0000,-0.2639 +0.9646,0.0000,0.0000,-0.2639 +0.9603,0.0000,0.0000,-0.2790 +0.9603,0.0000,0.0000,-0.2790 +0.9603,0.0000,0.0000,-0.2790 +0.9603,0.0000,0.0000,-0.2790 +0.9558,0.0000,0.0000,-0.2940 +0.9558,0.0000,0.0000,-0.2940 +0.9558,0.0000,0.0000,-0.2940 +0.9558,0.0000,0.0000,-0.2940 +0.9511,0.0000,0.0000,-0.3090 +0.9511,0.0000,0.0000,-0.3090 +0.9511,0.0000,0.0000,-0.3090 +0.9511,0.0000,0.0000,-0.3090 +0.9461,0.0000,0.0000,-0.3239 +0.9461,0.0000,0.0000,-0.3239 +0.9461,0.0000,0.0000,-0.3239 +0.9461,0.0000,0.0000,-0.3239 +0.9409,0.0000,0.0000,-0.3387 +0.9409,0.0000,0.0000,-0.3387 +0.9409,0.0000,0.0000,-0.3387 +0.9409,0.0000,0.0000,-0.3387 +0.9354,0.0000,0.0000,-0.3535 +0.9354,0.0000,0.0000,-0.3535 +0.9354,0.0000,0.0000,-0.3535 +0.9354,0.0000,0.0000,-0.3535 +0.9298,0.0000,0.0000,-0.3681 +0.9298,0.0000,0.0000,-0.3681 +0.9298,0.0000,0.0000,-0.3681 +0.9298,0.0000,0.0000,-0.3681 +0.9239,0.0000,0.0000,-0.3827 +0.9239,0.0000,0.0000,-0.3827 +0.9239,0.0000,0.0000,-0.3827 +0.9239,0.0000,0.0000,-0.3827 +0.9178,0.0000,0.0000,-0.3971 +0.9178,0.0000,0.0000,-0.3971 +0.9178,0.0000,0.0000,-0.3971 +0.9178,0.0000,0.0000,-0.3971 +0.9114,0.0000,0.0000,-0.4115 +0.9114,0.0000,0.0000,-0.4115 +0.9114,0.0000,0.0000,-0.4115 +0.9114,0.0000,0.0000,-0.4115 +0.9048,0.0000,0.0000,-0.4258 +0.9048,0.0000,0.0000,-0.4258 +0.9048,0.0000,0.0000,-0.4258 +0.9048,0.0000,0.0000,-0.4258 +0.8980,0.0000,0.0000,-0.4399 +0.8980,0.0000,0.0000,-0.4399 +0.8980,0.0000,0.0000,-0.4399 +0.8980,0.0000,0.0000,-0.4399 +0.8910,0.0000,0.0000,-0.4540 +0.8910,0.0000,0.0000,-0.4540 +0.8910,0.0000,0.0000,-0.4540 +0.8910,0.0000,0.0000,-0.4540 +0.8838,0.0000,0.0000,-0.4679 +0.8838,0.0000,0.0000,-0.4679 +0.8838,0.0000,0.0000,-0.4679 +0.8838,0.0000,0.0000,-0.4679 +0.8763,0.0000,0.0000,-0.4818 +0.8763,0.0000,0.0000,-0.4818 +0.8763,0.0000,0.0000,-0.4818 +0.8763,0.0000,0.0000,-0.4818 +0.8686,0.0000,0.0000,-0.4955 +0.8686,0.0000,0.0000,-0.4955 +0.8686,0.0000,0.0000,-0.4955 +0.8686,0.0000,0.0000,-0.4955 +0.8607,0.0000,0.0000,-0.5090 +0.8607,0.0000,0.0000,-0.5090 +0.8607,0.0000,0.0000,-0.5090 +0.8607,0.0000,0.0000,-0.5090 +0.8526,0.0000,0.0000,-0.5225 +0.8526,0.0000,0.0000,-0.5225 +0.8526,0.0000,0.0000,-0.5225 +0.8526,0.0000,0.0000,-0.5225 +0.8443,0.0000,0.0000,-0.5358 +0.8443,0.0000,0.0000,-0.5358 +0.8443,0.0000,0.0000,-0.5358 +0.8443,0.0000,0.0000,-0.5358 +0.8358,0.0000,0.0000,-0.5490 +0.8358,0.0000,0.0000,-0.5490 +0.8358,0.0000,0.0000,-0.5490 +0.8358,0.0000,0.0000,-0.5490 +0.8271,0.0000,0.0000,-0.5621 +0.8271,0.0000,0.0000,-0.5621 +0.8271,0.0000,0.0000,-0.5621 +0.8271,0.0000,0.0000,-0.5621 +0.8181,0.0000,0.0000,-0.5750 +0.8181,0.0000,0.0000,-0.5750 +0.8181,0.0000,0.0000,-0.5750 +0.8181,0.0000,0.0000,-0.5750 +0.8090,0.0000,0.0000,-0.5878 +0.8090,0.0000,0.0000,-0.5878 +0.8090,0.0000,0.0000,-0.5878 +0.8090,0.0000,0.0000,-0.5878 +0.7997,0.0000,0.0000,-0.6004 +0.7997,0.0000,0.0000,-0.6004 +0.7997,0.0000,0.0000,-0.6004 +0.7997,0.0000,0.0000,-0.6004 +0.7902,0.0000,0.0000,-0.6129 +0.7902,0.0000,0.0000,-0.6129 +0.7902,0.0000,0.0000,-0.6129 +0.7902,0.0000,0.0000,-0.6129 +0.7804,0.0000,0.0000,-0.6252 +0.7804,0.0000,0.0000,-0.6252 +0.7804,0.0000,0.0000,-0.6252 +0.7804,0.0000,0.0000,-0.6252 +0.7705,0.0000,0.0000,-0.6374 +0.7705,0.0000,0.0000,-0.6374 +0.7705,0.0000,0.0000,-0.6374 +0.7705,0.0000,0.0000,-0.6374 +0.7604,0.0000,0.0000,-0.6494 +0.7604,0.0000,0.0000,-0.6494 +0.7604,0.0000,0.0000,-0.6494 +0.7604,0.0000,0.0000,-0.6494 +0.7501,0.0000,0.0000,-0.6613 +0.7501,0.0000,0.0000,-0.6613 +0.7501,0.0000,0.0000,-0.6613 +0.7501,0.0000,0.0000,-0.6613 +0.7396,0.0000,0.0000,-0.6730 +0.7396,0.0000,0.0000,-0.6730 +0.7396,0.0000,0.0000,-0.6730 +0.7396,0.0000,0.0000,-0.6730 +0.7290,0.0000,0.0000,-0.6845 +0.7290,0.0000,0.0000,-0.6845 +0.7290,0.0000,0.0000,-0.6845 +0.7290,0.0000,0.0000,-0.6845 +0.7181,0.0000,0.0000,-0.6959 +0.7181,0.0000,0.0000,-0.6959 +0.7181,0.0000,0.0000,-0.6959 +0.7181,0.0000,0.0000,-0.6959 +0.7071,0.0000,0.0000,-0.7071 +0.7071,0.0000,0.0000,-0.7071 +0.7071,0.0000,0.0000,-0.7071 +0.7071,0.0000,0.0000,-0.7071 +0.6959,0.0000,0.0000,-0.7181 +0.6959,0.0000,0.0000,-0.7181 +0.6959,0.0000,0.0000,-0.7181 +0.6959,0.0000,0.0000,-0.7181 +0.6845,0.0000,0.0000,-0.7290 +0.6845,0.0000,0.0000,-0.7290 +0.6845,0.0000,0.0000,-0.7290 +0.6845,0.0000,0.0000,-0.7290 +0.6730,0.0000,0.0000,-0.7396 +0.6730,0.0000,0.0000,-0.7396 +0.6730,0.0000,0.0000,-0.7396 +0.6730,0.0000,0.0000,-0.7396 +0.6613,0.0000,0.0000,-0.7501 +0.6613,0.0000,0.0000,-0.7501 +0.6613,0.0000,0.0000,-0.7501 +0.6613,0.0000,0.0000,-0.7501 +0.6494,0.0000,0.0000,-0.7604 +0.6494,0.0000,0.0000,-0.7604 +0.6494,0.0000,0.0000,-0.7604 +0.6494,0.0000,0.0000,-0.7604 +0.6374,0.0000,0.0000,-0.7705 +0.6374,0.0000,0.0000,-0.7705 +0.6374,0.0000,0.0000,-0.7705 +0.6374,0.0000,0.0000,-0.7705 +0.6252,0.0000,0.0000,-0.7804 +0.6252,0.0000,0.0000,-0.7804 +0.6252,0.0000,0.0000,-0.7804 +0.6252,0.0000,0.0000,-0.7804 +0.6129,0.0000,0.0000,-0.7902 +0.6129,0.0000,0.0000,-0.7902 +0.6129,0.0000,0.0000,-0.7902 +0.6129,0.0000,0.0000,-0.7902 +0.6004,0.0000,0.0000,-0.7997 +0.6004,0.0000,0.0000,-0.7997 +0.6004,0.0000,0.0000,-0.7997 +0.6004,0.0000,0.0000,-0.7997 +0.5878,0.0000,0.0000,-0.8090 +0.5878,0.0000,0.0000,-0.8090 +0.5878,0.0000,0.0000,-0.8090 +0.5878,0.0000,0.0000,-0.8090 +0.5750,0.0000,0.0000,-0.8181 +0.5750,0.0000,0.0000,-0.8181 +0.5750,0.0000,0.0000,-0.8181 +0.5750,0.0000,0.0000,-0.8181 +0.5621,0.0000,0.0000,-0.8271 +0.5621,0.0000,0.0000,-0.8271 +0.5621,0.0000,0.0000,-0.8271 +0.5621,0.0000,0.0000,-0.8271 +0.5490,0.0000,0.0000,-0.8358 +0.5490,0.0000,0.0000,-0.8358 +0.5490,0.0000,0.0000,-0.8358 +0.5490,0.0000,0.0000,-0.8358 +0.5358,0.0000,0.0000,-0.8443 +0.5358,0.0000,0.0000,-0.8443 +0.5358,0.0000,0.0000,-0.8443 +0.5358,0.0000,0.0000,-0.8443 +0.5225,0.0000,0.0000,-0.8526 +0.5225,0.0000,0.0000,-0.8526 +0.5225,0.0000,0.0000,-0.8526 +0.5225,0.0000,0.0000,-0.8526 +0.5090,0.0000,0.0000,-0.8607 +0.5090,0.0000,0.0000,-0.8607 +0.5090,0.0000,0.0000,-0.8607 +0.5090,0.0000,0.0000,-0.8607 +0.4955,0.0000,0.0000,-0.8686 +0.4955,0.0000,0.0000,-0.8686 +0.4955,0.0000,0.0000,-0.8686 +0.4955,0.0000,0.0000,-0.8686 +0.4818,0.0000,0.0000,-0.8763 +0.4818,0.0000,0.0000,-0.8763 +0.4818,0.0000,0.0000,-0.8763 +0.4818,0.0000,0.0000,-0.8763 +0.4679,0.0000,0.0000,-0.8838 +0.4679,0.0000,0.0000,-0.8838 +0.4679,0.0000,0.0000,-0.8838 +0.4679,0.0000,0.0000,-0.8838 +0.4540,0.0000,0.0000,-0.8910 +0.4540,0.0000,0.0000,-0.8910 +0.4540,0.0000,0.0000,-0.8910 +0.4540,0.0000,0.0000,-0.8910 +0.4399,0.0000,0.0000,-0.8980 +0.4399,0.0000,0.0000,-0.8980 +0.4399,0.0000,0.0000,-0.8980 +0.4399,0.0000,0.0000,-0.8980 +0.4258,0.0000,0.0000,-0.9048 +0.4258,0.0000,0.0000,-0.9048 +0.4258,0.0000,0.0000,-0.9048 +0.4258,0.0000,0.0000,-0.9048 +0.4115,0.0000,0.0000,-0.9114 +0.4115,0.0000,0.0000,-0.9114 +0.4115,0.0000,0.0000,-0.9114 +0.4115,0.0000,0.0000,-0.9114 +0.3971,0.0000,0.0000,-0.9178 +0.3971,0.0000,0.0000,-0.9178 +0.3971,0.0000,0.0000,-0.9178 +0.3971,0.0000,0.0000,-0.9178 +0.3827,0.0000,0.0000,-0.9239 +0.3827,0.0000,0.0000,-0.9239 +0.3827,0.0000,0.0000,-0.9239 +0.3827,0.0000,0.0000,-0.9239 +0.3681,0.0000,0.0000,-0.9298 +0.3681,0.0000,0.0000,-0.9298 +0.3681,0.0000,0.0000,-0.9298 +0.3681,0.0000,0.0000,-0.9298 +0.3535,0.0000,0.0000,-0.9354 +0.3535,0.0000,0.0000,-0.9354 +0.3535,0.0000,0.0000,-0.9354 +0.3535,0.0000,0.0000,-0.9354 +0.3387,0.0000,0.0000,-0.9409 +0.3387,0.0000,0.0000,-0.9409 +0.3387,0.0000,0.0000,-0.9409 +0.3387,0.0000,0.0000,-0.9409 +0.3239,0.0000,0.0000,-0.9461 +0.3239,0.0000,0.0000,-0.9461 +0.3239,0.0000,0.0000,-0.9461 +0.3239,0.0000,0.0000,-0.9461 +0.3090,0.0000,0.0000,-0.9511 +0.3090,0.0000,0.0000,-0.9511 +0.3090,0.0000,0.0000,-0.9511 +0.3090,0.0000,0.0000,-0.9511 +0.2940,0.0000,0.0000,-0.9558 +0.2940,0.0000,0.0000,-0.9558 +0.2940,0.0000,0.0000,-0.9558 +0.2940,0.0000,0.0000,-0.9558 +0.2790,0.0000,0.0000,-0.9603 +0.2790,0.0000,0.0000,-0.9603 +0.2790,0.0000,0.0000,-0.9603 +0.2790,0.0000,0.0000,-0.9603 +0.2639,0.0000,0.0000,-0.9646 +0.2639,0.0000,0.0000,-0.9646 +0.2639,0.0000,0.0000,-0.9646 +0.2639,0.0000,0.0000,-0.9646 +0.2487,0.0000,0.0000,-0.9686 +0.2487,0.0000,0.0000,-0.9686 +0.2487,0.0000,0.0000,-0.9686 +0.2487,0.0000,0.0000,-0.9686 +0.2334,0.0000,0.0000,-0.9724 +0.2334,0.0000,0.0000,-0.9724 +0.2334,0.0000,0.0000,-0.9724 +0.2334,0.0000,0.0000,-0.9724 +0.2181,0.0000,0.0000,-0.9759 +0.2181,0.0000,0.0000,-0.9759 +0.2181,0.0000,0.0000,-0.9759 +0.2181,0.0000,0.0000,-0.9759 +0.2028,0.0000,0.0000,-0.9792 +0.2028,0.0000,0.0000,-0.9792 +0.2028,0.0000,0.0000,-0.9792 +0.2028,0.0000,0.0000,-0.9792 +0.1874,0.0000,0.0000,-0.9823 +0.1874,0.0000,0.0000,-0.9823 +0.1874,0.0000,0.0000,-0.9823 +0.1874,0.0000,0.0000,-0.9823 +0.1719,0.0000,0.0000,-0.9851 +0.1719,0.0000,0.0000,-0.9851 +0.1719,0.0000,0.0000,-0.9851 +0.1719,0.0000,0.0000,-0.9851 +0.1564,0.0000,0.0000,-0.9877 +0.1564,0.0000,0.0000,-0.9877 +0.1564,0.0000,0.0000,-0.9877 +0.1564,0.0000,0.0000,-0.9877 +0.1409,0.0000,0.0000,-0.9900 +0.1409,0.0000,0.0000,-0.9900 +0.1409,0.0000,0.0000,-0.9900 +0.1409,0.0000,0.0000,-0.9900 +0.1253,0.0000,0.0000,-0.9921 +0.1253,0.0000,0.0000,-0.9921 +0.1253,0.0000,0.0000,-0.9921 +0.1253,0.0000,0.0000,-0.9921 +0.1097,0.0000,0.0000,-0.9940 +0.1097,0.0000,0.0000,-0.9940 +0.1097,0.0000,0.0000,-0.9940 +0.1097,0.0000,0.0000,-0.9940 +0.0941,0.0000,0.0000,-0.9956 +0.0941,0.0000,0.0000,-0.9956 +0.0941,0.0000,0.0000,-0.9956 +0.0941,0.0000,0.0000,-0.9956 +0.0785,0.0000,0.0000,-0.9969 +0.0785,0.0000,0.0000,-0.9969 +0.0785,0.0000,0.0000,-0.9969 +0.0785,0.0000,0.0000,-0.9969 +0.0628,0.0000,0.0000,-0.9980 +0.0628,0.0000,0.0000,-0.9980 +0.0628,0.0000,0.0000,-0.9980 +0.0628,0.0000,0.0000,-0.9980 +0.0471,0.0000,0.0000,-0.9989 +0.0471,0.0000,0.0000,-0.9989 +0.0471,0.0000,0.0000,-0.9989 +0.0471,0.0000,0.0000,-0.9989 +0.0314,0.0000,0.0000,-0.9995 +0.0314,0.0000,0.0000,-0.9995 +0.0314,0.0000,0.0000,-0.9995 +0.0314,0.0000,0.0000,-0.9995 +0.0157,0.0000,0.0000,-0.9999 +0.0157,0.0000,0.0000,-0.9999 +0.0157,0.0000,0.0000,-0.9999 +0.0157,0.0000,0.0000,-0.9999 +-0.0000,0.0000,0.0000,-1.0000 +-0.0000,0.0000,0.0000,-1.0000 +-0.0000,0.0000,0.0000,-1.0000 +-0.0000,0.0000,0.0000,-1.0000 +-0.0157,0.0000,0.0000,-0.9999 +-0.0157,0.0000,0.0000,-0.9999 +-0.0157,0.0000,0.0000,-0.9999 +-0.0157,0.0000,0.0000,-0.9999 +-0.0314,0.0000,0.0000,-0.9995 +-0.0314,0.0000,0.0000,-0.9995 +-0.0314,0.0000,0.0000,-0.9995 +-0.0314,0.0000,0.0000,-0.9995 +-0.0471,0.0000,0.0000,-0.9989 +-0.0471,0.0000,0.0000,-0.9989 +-0.0471,0.0000,0.0000,-0.9989 +-0.0471,0.0000,0.0000,-0.9989 +-0.0628,0.0000,0.0000,-0.9980 +-0.0628,0.0000,0.0000,-0.9980 +-0.0628,0.0000,0.0000,-0.9980 +-0.0628,0.0000,0.0000,-0.9980 +-0.0785,0.0000,0.0000,-0.9969 +-0.0785,0.0000,0.0000,-0.9969 +-0.0785,0.0000,0.0000,-0.9969 +-0.0785,0.0000,0.0000,-0.9969 +-0.0941,0.0000,0.0000,-0.9956 +-0.0941,0.0000,0.0000,-0.9956 +-0.0941,0.0000,0.0000,-0.9956 +-0.0941,0.0000,0.0000,-0.9956 +-0.1097,0.0000,0.0000,-0.9940 +-0.1097,0.0000,0.0000,-0.9940 +-0.1097,0.0000,0.0000,-0.9940 +-0.1097,0.0000,0.0000,-0.9940 +-0.1253,0.0000,0.0000,-0.9921 +-0.1253,0.0000,0.0000,-0.9921 +-0.1253,0.0000,0.0000,-0.9921 +-0.1253,0.0000,0.0000,-0.9921 +-0.1409,0.0000,0.0000,-0.9900 +-0.1409,0.0000,0.0000,-0.9900 +-0.1409,0.0000,0.0000,-0.9900 +-0.1409,0.0000,0.0000,-0.9900 +-0.1564,0.0000,0.0000,-0.9877 +-0.1564,0.0000,0.0000,-0.9877 +-0.1564,0.0000,0.0000,-0.9877 +-0.1564,0.0000,0.0000,-0.9877 +-0.1719,0.0000,0.0000,-0.9851 +-0.1719,0.0000,0.0000,-0.9851 +-0.1719,0.0000,0.0000,-0.9851 +-0.1719,0.0000,0.0000,-0.9851 +-0.1874,0.0000,0.0000,-0.9823 +-0.1874,0.0000,0.0000,-0.9823 +-0.1874,0.0000,0.0000,-0.9823 +-0.1874,0.0000,0.0000,-0.9823 +-0.2028,0.0000,0.0000,-0.9792 +-0.2028,0.0000,0.0000,-0.9792 +-0.2028,0.0000,0.0000,-0.9792 +-0.2028,0.0000,0.0000,-0.9792 +-0.2181,0.0000,0.0000,-0.9759 +-0.2181,0.0000,0.0000,-0.9759 +-0.2181,0.0000,0.0000,-0.9759 +-0.2181,0.0000,0.0000,-0.9759 +-0.2334,0.0000,0.0000,-0.9724 +-0.2334,0.0000,0.0000,-0.9724 +-0.2334,0.0000,0.0000,-0.9724 +-0.2334,0.0000,0.0000,-0.9724 +-0.2487,0.0000,0.0000,-0.9686 +-0.2487,0.0000,0.0000,-0.9686 +-0.2487,0.0000,0.0000,-0.9686 +-0.2487,0.0000,0.0000,-0.9686 +-0.2639,0.0000,0.0000,-0.9646 +-0.2639,0.0000,0.0000,-0.9646 +-0.2639,0.0000,0.0000,-0.9646 +-0.2639,0.0000,0.0000,-0.9646 +-0.2790,0.0000,0.0000,-0.9603 +-0.2790,0.0000,0.0000,-0.9603 +-0.2790,0.0000,0.0000,-0.9603 +-0.2790,0.0000,0.0000,-0.9603 +-0.2940,0.0000,0.0000,-0.9558 +-0.2940,0.0000,0.0000,-0.9558 +-0.2940,0.0000,0.0000,-0.9558 +-0.2940,0.0000,0.0000,-0.9558 +-0.3090,0.0000,0.0000,-0.9511 +-0.3090,0.0000,0.0000,-0.9511 +-0.3090,0.0000,0.0000,-0.9511 +-0.3090,0.0000,0.0000,-0.9511 +-0.3239,0.0000,0.0000,-0.9461 +-0.3239,0.0000,0.0000,-0.9461 +-0.3239,0.0000,0.0000,-0.9461 +-0.3239,0.0000,0.0000,-0.9461 +-0.3387,0.0000,0.0000,-0.9409 +-0.3387,0.0000,0.0000,-0.9409 +-0.3387,0.0000,0.0000,-0.9409 +-0.3387,0.0000,0.0000,-0.9409 +-0.3535,0.0000,0.0000,-0.9354 +-0.3535,0.0000,0.0000,-0.9354 +-0.3535,0.0000,0.0000,-0.9354 +-0.3535,0.0000,0.0000,-0.9354 +-0.3681,0.0000,0.0000,-0.9298 +-0.3681,0.0000,0.0000,-0.9298 +-0.3681,0.0000,0.0000,-0.9298 +-0.3681,0.0000,0.0000,-0.9298 +-0.3827,0.0000,0.0000,-0.9239 +-0.3827,0.0000,0.0000,-0.9239 +-0.3827,0.0000,0.0000,-0.9239 +-0.3827,0.0000,0.0000,-0.9239 +-0.3971,0.0000,0.0000,-0.9178 +-0.3971,0.0000,0.0000,-0.9178 +-0.3971,0.0000,0.0000,-0.9178 +-0.3971,0.0000,0.0000,-0.9178 +-0.4115,0.0000,0.0000,-0.9114 +-0.4115,0.0000,0.0000,-0.9114 +-0.4115,0.0000,0.0000,-0.9114 +-0.4115,0.0000,0.0000,-0.9114 +-0.4258,0.0000,0.0000,-0.9048 +-0.4258,0.0000,0.0000,-0.9048 +-0.4258,0.0000,0.0000,-0.9048 +-0.4258,0.0000,0.0000,-0.9048 +-0.4399,0.0000,0.0000,-0.8980 +-0.4399,0.0000,0.0000,-0.8980 +-0.4399,0.0000,0.0000,-0.8980 +-0.4399,0.0000,0.0000,-0.8980 +-0.4540,0.0000,0.0000,-0.8910 +-0.4540,0.0000,0.0000,-0.8910 +-0.4540,0.0000,0.0000,-0.8910 +-0.4540,0.0000,0.0000,-0.8910 +-0.4679,0.0000,0.0000,-0.8838 +-0.4679,0.0000,0.0000,-0.8838 +-0.4679,0.0000,0.0000,-0.8838 +-0.4679,0.0000,0.0000,-0.8838 +-0.4818,0.0000,0.0000,-0.8763 +-0.4818,0.0000,0.0000,-0.8763 +-0.4818,0.0000,0.0000,-0.8763 +-0.4818,0.0000,0.0000,-0.8763 +-0.4955,0.0000,0.0000,-0.8686 +-0.4955,0.0000,0.0000,-0.8686 +-0.4955,0.0000,0.0000,-0.8686 +-0.4955,0.0000,0.0000,-0.8686 +-0.5090,0.0000,0.0000,-0.8607 +-0.5090,0.0000,0.0000,-0.8607 +-0.5090,0.0000,0.0000,-0.8607 +-0.5090,0.0000,0.0000,-0.8607 +-0.5225,0.0000,0.0000,-0.8526 +-0.5225,0.0000,0.0000,-0.8526 +-0.5225,0.0000,0.0000,-0.8526 +-0.5225,0.0000,0.0000,-0.8526 +-0.5358,0.0000,0.0000,-0.8443 +-0.5358,0.0000,0.0000,-0.8443 +-0.5358,0.0000,0.0000,-0.8443 +-0.5358,0.0000,0.0000,-0.8443 +-0.5490,0.0000,0.0000,-0.8358 +-0.5490,0.0000,0.0000,-0.8358 +-0.5490,0.0000,0.0000,-0.8358 +-0.5490,0.0000,0.0000,-0.8358 +-0.5621,0.0000,0.0000,-0.8271 +-0.5621,0.0000,0.0000,-0.8271 +-0.5621,0.0000,0.0000,-0.8271 +-0.5621,0.0000,0.0000,-0.8271 +-0.5750,0.0000,0.0000,-0.8181 +-0.5750,0.0000,0.0000,-0.8181 +-0.5750,0.0000,0.0000,-0.8181 +-0.5750,0.0000,0.0000,-0.8181 +-0.5878,0.0000,0.0000,-0.8090 +-0.5878,0.0000,0.0000,-0.8090 +-0.5878,0.0000,0.0000,-0.8090 +-0.5878,0.0000,0.0000,-0.8090 +-0.6004,0.0000,0.0000,-0.7997 +-0.6004,0.0000,0.0000,-0.7997 +-0.6004,0.0000,0.0000,-0.7997 +-0.6004,0.0000,0.0000,-0.7997 +-0.6129,0.0000,0.0000,-0.7902 +-0.6129,0.0000,0.0000,-0.7902 +-0.6129,0.0000,0.0000,-0.7902 +-0.6129,0.0000,0.0000,-0.7902 +-0.6252,0.0000,0.0000,-0.7804 +-0.6252,0.0000,0.0000,-0.7804 +-0.6252,0.0000,0.0000,-0.7804 +-0.6252,0.0000,0.0000,-0.7804 +-0.6374,0.0000,0.0000,-0.7705 +-0.6374,0.0000,0.0000,-0.7705 +-0.6374,0.0000,0.0000,-0.7705 +-0.6374,0.0000,0.0000,-0.7705 +-0.6494,0.0000,0.0000,-0.7604 +-0.6494,0.0000,0.0000,-0.7604 +-0.6494,0.0000,0.0000,-0.7604 +-0.6494,0.0000,0.0000,-0.7604 +-0.6613,0.0000,0.0000,-0.7501 +-0.6613,0.0000,0.0000,-0.7501 +-0.6613,0.0000,0.0000,-0.7501 +-0.6613,0.0000,0.0000,-0.7501 +-0.6730,0.0000,0.0000,-0.7396 +-0.6730,0.0000,0.0000,-0.7396 +-0.6730,0.0000,0.0000,-0.7396 +-0.6730,0.0000,0.0000,-0.7396 +-0.6845,0.0000,0.0000,-0.7290 +-0.6845,0.0000,0.0000,-0.7290 +-0.6845,0.0000,0.0000,-0.7290 +-0.6845,0.0000,0.0000,-0.7290 +-0.6959,0.0000,0.0000,-0.7181 +-0.6959,0.0000,0.0000,-0.7181 +-0.6959,0.0000,0.0000,-0.7181 +-0.6959,0.0000,0.0000,-0.7181 +-0.7071,0.0000,0.0000,-0.7071 +-0.7071,0.0000,0.0000,-0.7071 +-0.7071,0.0000,0.0000,-0.7071 +-0.7071,0.0000,0.0000,-0.7071 +-0.7181,0.0000,0.0000,-0.6959 +-0.7181,0.0000,0.0000,-0.6959 +-0.7181,0.0000,0.0000,-0.6959 +-0.7181,0.0000,0.0000,-0.6959 +-0.7290,0.0000,0.0000,-0.6845 +-0.7290,0.0000,0.0000,-0.6845 +-0.7290,0.0000,0.0000,-0.6845 +-0.7290,0.0000,0.0000,-0.6845 +-0.7396,0.0000,0.0000,-0.6730 +-0.7396,0.0000,0.0000,-0.6730 +-0.7396,0.0000,0.0000,-0.6730 +-0.7396,0.0000,0.0000,-0.6730 +-0.7501,0.0000,0.0000,-0.6613 +-0.7501,0.0000,0.0000,-0.6613 +-0.7501,0.0000,0.0000,-0.6613 +-0.7501,0.0000,0.0000,-0.6613 +-0.7604,0.0000,0.0000,-0.6494 +-0.7604,0.0000,0.0000,-0.6494 +-0.7604,0.0000,0.0000,-0.6494 +-0.7604,0.0000,0.0000,-0.6494 +-0.7705,0.0000,0.0000,-0.6374 +-0.7705,0.0000,0.0000,-0.6374 +-0.7705,0.0000,0.0000,-0.6374 +-0.7705,0.0000,0.0000,-0.6374 +-0.7804,0.0000,0.0000,-0.6252 +-0.7804,0.0000,0.0000,-0.6252 +-0.7804,0.0000,0.0000,-0.6252 +-0.7804,0.0000,0.0000,-0.6252 +-0.7902,0.0000,0.0000,-0.6129 +-0.7902,0.0000,0.0000,-0.6129 +-0.7902,0.0000,0.0000,-0.6129 +-0.7902,0.0000,0.0000,-0.6129 +-0.7997,0.0000,0.0000,-0.6004 +-0.7997,0.0000,0.0000,-0.6004 +-0.7997,0.0000,0.0000,-0.6004 +-0.7997,0.0000,0.0000,-0.6004 +-0.8090,0.0000,0.0000,-0.5878 +-0.8090,0.0000,0.0000,-0.5878 +-0.8090,0.0000,0.0000,-0.5878 +-0.8090,0.0000,0.0000,-0.5878 +-0.8182,0.0000,0.0000,-0.5750 +-0.8182,0.0000,0.0000,-0.5750 +-0.8182,0.0000,0.0000,-0.5750 +-0.8182,0.0000,0.0000,-0.5750 +-0.8271,0.0000,0.0000,-0.5621 +-0.8271,0.0000,0.0000,-0.5621 +-0.8271,0.0000,0.0000,-0.5621 +-0.8271,0.0000,0.0000,-0.5621 +-0.8358,0.0000,0.0000,-0.5490 +-0.8358,0.0000,0.0000,-0.5490 +-0.8358,0.0000,0.0000,-0.5490 +-0.8358,0.0000,0.0000,-0.5490 +-0.8443,0.0000,0.0000,-0.5358 +-0.8443,0.0000,0.0000,-0.5358 +-0.8443,0.0000,0.0000,-0.5358 +-0.8443,0.0000,0.0000,-0.5358 +-0.8526,0.0000,0.0000,-0.5225 +-0.8526,0.0000,0.0000,-0.5225 +-0.8526,0.0000,0.0000,-0.5225 +-0.8526,0.0000,0.0000,-0.5225 +-0.8607,0.0000,0.0000,-0.5090 +-0.8607,0.0000,0.0000,-0.5090 +-0.8607,0.0000,0.0000,-0.5090 +-0.8607,0.0000,0.0000,-0.5090 +-0.8686,0.0000,0.0000,-0.4955 +-0.8686,0.0000,0.0000,-0.4955 +-0.8686,0.0000,0.0000,-0.4955 +-0.8686,0.0000,0.0000,-0.4955 +-0.8763,0.0000,0.0000,-0.4818 +-0.8763,0.0000,0.0000,-0.4818 +-0.8763,0.0000,0.0000,-0.4818 +-0.8763,0.0000,0.0000,-0.4818 +-0.8838,0.0000,0.0000,-0.4679 +-0.8838,0.0000,0.0000,-0.4679 +-0.8838,0.0000,0.0000,-0.4679 +-0.8838,0.0000,0.0000,-0.4679 +-0.8910,0.0000,0.0000,-0.4540 +-0.8910,0.0000,0.0000,-0.4540 +-0.8910,0.0000,0.0000,-0.4540 +-0.8910,0.0000,0.0000,-0.4540 +-0.8980,0.0000,0.0000,-0.4399 +-0.8980,0.0000,0.0000,-0.4399 +-0.8980,0.0000,0.0000,-0.4399 +-0.8980,0.0000,0.0000,-0.4399 +-0.9048,0.0000,0.0000,-0.4258 +-0.9048,0.0000,0.0000,-0.4258 +-0.9048,0.0000,0.0000,-0.4258 +-0.9048,0.0000,0.0000,-0.4258 +-0.9114,0.0000,0.0000,-0.4115 +-0.9114,0.0000,0.0000,-0.4115 +-0.9114,0.0000,0.0000,-0.4115 +-0.9114,0.0000,0.0000,-0.4115 +-0.9178,0.0000,0.0000,-0.3971 +-0.9178,0.0000,0.0000,-0.3971 +-0.9178,0.0000,0.0000,-0.3971 +-0.9178,0.0000,0.0000,-0.3971 +-0.9239,0.0000,0.0000,-0.3827 +-0.9239,0.0000,0.0000,-0.3827 +-0.9239,0.0000,0.0000,-0.3827 +-0.9239,0.0000,0.0000,-0.3827 +-0.9298,0.0000,0.0000,-0.3681 +-0.9298,0.0000,0.0000,-0.3681 +-0.9298,0.0000,0.0000,-0.3681 +-0.9298,0.0000,0.0000,-0.3681 +-0.9354,0.0000,0.0000,-0.3535 +-0.9354,0.0000,0.0000,-0.3535 +-0.9354,0.0000,0.0000,-0.3535 +-0.9354,0.0000,0.0000,-0.3535 +-0.9409,0.0000,0.0000,-0.3387 +-0.9409,0.0000,0.0000,-0.3387 +-0.9409,0.0000,0.0000,-0.3387 +-0.9409,0.0000,0.0000,-0.3387 +-0.9461,0.0000,0.0000,-0.3239 +-0.9461,0.0000,0.0000,-0.3239 +-0.9461,0.0000,0.0000,-0.3239 +-0.9461,0.0000,0.0000,-0.3239 +-0.9511,0.0000,0.0000,-0.3090 +-0.9511,0.0000,0.0000,-0.3090 +-0.9511,0.0000,0.0000,-0.3090 +-0.9511,0.0000,0.0000,-0.3090 +-0.9558,0.0000,0.0000,-0.2940 +-0.9558,0.0000,0.0000,-0.2940 +-0.9558,0.0000,0.0000,-0.2940 +-0.9558,0.0000,0.0000,-0.2940 +-0.9603,0.0000,0.0000,-0.2790 +-0.9603,0.0000,0.0000,-0.2790 +-0.9603,0.0000,0.0000,-0.2790 +-0.9603,0.0000,0.0000,-0.2790 +-0.9646,0.0000,0.0000,-0.2639 +-0.9646,0.0000,0.0000,-0.2639 +-0.9646,0.0000,0.0000,-0.2639 +-0.9646,0.0000,0.0000,-0.2639 +-0.9686,0.0000,0.0000,-0.2487 +-0.9686,0.0000,0.0000,-0.2487 +-0.9686,0.0000,0.0000,-0.2487 +-0.9686,0.0000,0.0000,-0.2487 +-0.9724,0.0000,0.0000,-0.2334 +-0.9724,0.0000,0.0000,-0.2334 +-0.9724,0.0000,0.0000,-0.2334 +-0.9724,0.0000,0.0000,-0.2334 +-0.9759,0.0000,0.0000,-0.2181 +-0.9759,0.0000,0.0000,-0.2181 +-0.9759,0.0000,0.0000,-0.2181 +-0.9759,0.0000,0.0000,-0.2181 +-0.9792,0.0000,0.0000,-0.2028 +-0.9792,0.0000,0.0000,-0.2028 +-0.9792,0.0000,0.0000,-0.2028 +-0.9792,0.0000,0.0000,-0.2028 +-0.9823,0.0000,0.0000,-0.1874 +-0.9823,0.0000,0.0000,-0.1874 +-0.9823,0.0000,0.0000,-0.1874 +-0.9823,0.0000,0.0000,-0.1874 +-0.9851,0.0000,0.0000,-0.1719 +-0.9851,0.0000,0.0000,-0.1719 +-0.9851,0.0000,0.0000,-0.1719 +-0.9851,0.0000,0.0000,-0.1719 +-0.9877,0.0000,0.0000,-0.1564 +-0.9877,0.0000,0.0000,-0.1564 +-0.9877,0.0000,0.0000,-0.1564 +-0.9877,0.0000,0.0000,-0.1564 +-0.9900,0.0000,0.0000,-0.1409 +-0.9900,0.0000,0.0000,-0.1409 +-0.9900,0.0000,0.0000,-0.1409 +-0.9900,0.0000,0.0000,-0.1409 +-0.9921,0.0000,0.0000,-0.1253 +-0.9921,0.0000,0.0000,-0.1253 +-0.9921,0.0000,0.0000,-0.1253 +-0.9921,0.0000,0.0000,-0.1253 +-0.9940,0.0000,0.0000,-0.1097 +-0.9940,0.0000,0.0000,-0.1097 +-0.9940,0.0000,0.0000,-0.1097 +-0.9940,0.0000,0.0000,-0.1097 +-0.9956,0.0000,0.0000,-0.0941 +-0.9956,0.0000,0.0000,-0.0941 +-0.9956,0.0000,0.0000,-0.0941 +-0.9956,0.0000,0.0000,-0.0941 +-0.9969,0.0000,0.0000,-0.0785 +-0.9969,0.0000,0.0000,-0.0785 +-0.9969,0.0000,0.0000,-0.0785 +-0.9969,0.0000,0.0000,-0.0785 +-0.9980,0.0000,0.0000,-0.0628 +-0.9980,0.0000,0.0000,-0.0628 +-0.9980,0.0000,0.0000,-0.0628 +-0.9980,0.0000,0.0000,-0.0628 +-0.9989,0.0000,0.0000,-0.0471 +-0.9989,0.0000,0.0000,-0.0471 +-0.9989,0.0000,0.0000,-0.0471 +-0.9989,0.0000,0.0000,-0.0471 +-0.9995,0.0000,0.0000,-0.0314 +-0.9995,0.0000,0.0000,-0.0314 +-0.9995,0.0000,0.0000,-0.0314 +-0.9995,0.0000,0.0000,-0.0314 +-0.9999,0.0000,0.0000,-0.0157 +-0.9999,0.0000,0.0000,-0.0157 +-0.9999,0.0000,0.0000,-0.0157 +-0.9999,0.0000,0.0000,-0.0157 +1.0000,0.0000,0.0000,-0.0000 +1.0000,0.0000,0.0000,-0.0000 +1.0000,0.0000,0.0000,-0.0000 +1.0000,0.0000,0.0000,-0.0000 diff --git a/scripts/trajectories/full-circle-with-up-and-down-4s-Vector3.csv b/scripts/trajectories/full-circle-with-up-and-down-4s-Vector3.csv new file mode 100644 index 0000000000..8fe2d2fe05 --- /dev/null +++ b/scripts/trajectories/full-circle-with-up-and-down-4s-Vector3.csv @@ -0,0 +1,200 @@ +0.0000,0.0000,0.0000,0.7012,-0.0220,-0.7126 +0.0000,0.0000,0.0000,0.7057,-0.0444,-0.7071 +0.0000,0.0000,0.0000,0.7095,-0.0671,-0.7015 +0.0000,0.0000,0.0000,0.7125,-0.0900,-0.6959 +0.0000,0.0000,0.0000,0.7147,-0.1132,-0.6903 +0.0000,0.0000,0.0000,0.7161,-0.1366,-0.6845 +0.0000,0.0000,0.0000,0.7166,-0.1602,-0.6788 +0.0000,0.0000,0.0000,0.7164,-0.1839,-0.6730 +0.0000,0.0000,0.0000,0.7153,-0.2078,-0.6672 +0.0000,0.0000,0.0000,0.7134,-0.2318,-0.6613 +0.0000,0.0000,0.0000,0.7106,-0.2558,-0.6554 +0.0000,0.0000,0.0000,0.7070,-0.2799,-0.6494 +0.0000,0.0000,0.0000,0.7025,-0.3040,-0.6435 +0.0000,0.0000,0.0000,0.6972,-0.3281,-0.6374 +0.0000,0.0000,0.0000,0.6910,-0.3521,-0.6314 +0.0000,0.0000,0.0000,0.6839,-0.3760,-0.6252 +0.0000,0.0000,0.0000,0.6760,-0.3998,-0.6191 +0.0000,0.0000,0.0000,0.6671,-0.4234,-0.6129 +0.0000,0.0000,0.0000,0.6575,-0.4468,-0.6067 +0.0000,0.0000,0.0000,0.6470,-0.4700,-0.6004 +0.0000,0.0000,0.0000,0.6356,-0.4930,-0.5941 +0.0000,0.0000,0.0000,0.6234,-0.5157,-0.5878 +0.0000,0.0000,0.0000,0.6103,-0.5380,-0.5814 +0.0000,0.0000,0.0000,0.5964,-0.5601,-0.5750 +0.0000,0.0000,0.0000,0.5817,-0.5817,-0.5686 +0.0000,0.0000,0.0000,0.5662,-0.6029,-0.5621 +0.0000,0.0000,0.0000,0.5499,-0.6237,-0.5556 +0.0000,0.0000,0.0000,0.5328,-0.6440,-0.5490 +0.0000,0.0000,0.0000,0.5149,-0.6638,-0.5424 +0.0000,0.0000,0.0000,0.4963,-0.6831,-0.5358 +0.0000,0.0000,0.0000,0.4769,-0.7018,-0.5292 +0.0000,0.0000,0.0000,0.4569,-0.7199,-0.5225 +0.0000,0.0000,0.0000,0.4361,-0.7374,-0.5158 +0.0000,0.0000,0.0000,0.4147,-0.7543,-0.5090 +0.0000,0.0000,0.0000,0.3926,-0.7705,-0.5023 +0.0000,0.0000,0.0000,0.3698,-0.7860,-0.4955 +0.0000,0.0000,0.0000,0.3465,-0.8007,-0.4886 +0.0000,0.0000,0.0000,0.3226,-0.8148,-0.4818 +0.0000,0.0000,0.0000,0.2981,-0.8280,-0.4749 +0.0000,0.0000,0.0000,0.2731,-0.8405,-0.4679 +0.0000,0.0000,0.0000,0.2476,-0.8522,-0.4610 +0.0000,0.0000,0.0000,0.2216,-0.8630,-0.4540 +0.0000,0.0000,0.0000,0.1951,-0.8730,-0.4470 +0.0000,0.0000,0.0000,0.1683,-0.8821,-0.4399 +0.0000,0.0000,0.0000,0.1410,-0.8904,-0.4329 +0.0000,0.0000,0.0000,0.1134,-0.8977,-0.4258 +0.0000,0.0000,0.0000,0.0855,-0.9041,-0.4187 +0.0000,0.0000,0.0000,0.0572,-0.9096,-0.4115 +0.0000,0.0000,0.0000,0.0287,-0.9142,-0.4043 +0.0000,0.0000,0.0000,-0.0000,-0.9178,-0.3971 +0.0000,0.0000,0.0000,-0.0289,-0.9204,-0.3899 +0.0000,0.0000,0.0000,-0.0580,-0.9221,-0.3827 +0.0000,0.0000,0.0000,-0.0872,-0.9227,-0.3754 +0.0000,0.0000,0.0000,-0.1165,-0.9224,-0.3681 +0.0000,0.0000,0.0000,-0.1459,-0.9212,-0.3608 +0.0000,0.0000,0.0000,-0.1753,-0.9189,-0.3535 +0.0000,0.0000,0.0000,-0.2047,-0.9156,-0.3461 +0.0000,0.0000,0.0000,-0.2340,-0.9113,-0.3387 +0.0000,0.0000,0.0000,-0.2632,-0.9060,-0.3313 +0.0000,0.0000,0.0000,-0.2924,-0.8998,-0.3239 +0.0000,0.0000,0.0000,-0.3213,-0.8925,-0.3165 +0.0000,0.0000,0.0000,-0.3501,-0.8843,-0.3090 +0.0000,0.0000,0.0000,-0.3787,-0.8750,-0.3015 +0.0000,0.0000,0.0000,-0.4070,-0.8648,-0.2940 +0.0000,0.0000,0.0000,-0.4350,-0.8536,-0.2865 +0.0000,0.0000,0.0000,-0.4626,-0.8415,-0.2790 +0.0000,0.0000,0.0000,-0.4899,-0.8284,-0.2714 +0.0000,0.0000,0.0000,-0.5168,-0.8144,-0.2639 +0.0000,0.0000,0.0000,-0.5433,-0.7995,-0.2563 +0.0000,0.0000,0.0000,-0.5693,-0.7836,-0.2487 +0.0000,0.0000,0.0000,-0.5948,-0.7669,-0.2411 +0.0000,0.0000,0.0000,-0.6198,-0.7492,-0.2334 +0.0000,0.0000,0.0000,-0.6442,-0.7307,-0.2258 +0.0000,0.0000,0.0000,-0.6681,-0.7114,-0.2181 +0.0000,0.0000,0.0000,-0.6913,-0.6913,-0.2105 +0.0000,0.0000,0.0000,-0.7138,-0.6703,-0.2028 +0.0000,0.0000,0.0000,-0.7357,-0.6486,-0.1951 +0.0000,0.0000,0.0000,-0.7569,-0.6261,-0.1874 +0.0000,0.0000,0.0000,-0.7773,-0.6029,-0.1797 +0.0000,0.0000,0.0000,-0.7970,-0.5790,-0.1719 +0.0000,0.0000,0.0000,-0.8159,-0.5545,-0.1642 +0.0000,0.0000,0.0000,-0.8339,-0.5292,-0.1564 +0.0000,0.0000,0.0000,-0.8512,-0.5034,-0.1487 +0.0000,0.0000,0.0000,-0.8676,-0.4769,-0.1409 +0.0000,0.0000,0.0000,-0.8831,-0.4499,-0.1331 +0.0000,0.0000,0.0000,-0.8977,-0.4224,-0.1253 +0.0000,0.0000,0.0000,-0.9114,-0.3944,-0.1175 +0.0000,0.0000,0.0000,-0.9242,-0.3659,-0.1097 +0.0000,0.0000,0.0000,-0.9360,-0.3370,-0.1019 +0.0000,0.0000,0.0000,-0.9468,-0.3076,-0.0941 +0.0000,0.0000,0.0000,-0.9567,-0.2779,-0.0863 +0.0000,0.0000,0.0000,-0.9656,-0.2479,-0.0785 +0.0000,0.0000,0.0000,-0.9735,-0.2176,-0.0706 +0.0000,0.0000,0.0000,-0.9803,-0.1870,-0.0628 +0.0000,0.0000,0.0000,-0.9862,-0.1562,-0.0549 +0.0000,0.0000,0.0000,-0.9910,-0.1252,-0.0471 +0.0000,0.0000,0.0000,-0.9948,-0.0940,-0.0393 +0.0000,0.0000,0.0000,-0.9975,-0.0628,-0.0314 +0.0000,0.0000,0.0000,-0.9992,-0.0314,-0.0236 +0.0000,0.0000,0.0000,-0.9999,0.0000,-0.0157 +0.0000,0.0000,0.0000,-0.9995,0.0314,-0.0079 +0.0000,0.0000,0.0000,-0.9980,0.0628,0.0000 +0.0000,0.0000,0.0000,-0.9955,0.0941,0.0079 +0.0000,0.0000,0.0000,-0.9920,0.1253,0.0157 +0.0000,0.0000,0.0000,-0.9874,0.1564,0.0236 +0.0000,0.0000,0.0000,-0.9818,0.1873,0.0314 +0.0000,0.0000,0.0000,-0.9752,0.2180,0.0393 +0.0000,0.0000,0.0000,-0.9675,0.2484,0.0471 +0.0000,0.0000,0.0000,-0.9588,0.2786,0.0550 +0.0000,0.0000,0.0000,-0.9492,0.3084,0.0628 +0.0000,0.0000,0.0000,-0.9385,0.3379,0.0706 +0.0000,0.0000,0.0000,-0.9269,0.3670,0.0785 +0.0000,0.0000,0.0000,-0.9143,0.3957,0.0863 +0.0000,0.0000,0.0000,-0.9008,0.4239,0.0941 +0.0000,0.0000,0.0000,-0.8864,0.4516,0.1019 +0.0000,0.0000,0.0000,-0.8710,0.4788,0.1097 +0.0000,0.0000,0.0000,-0.8548,0.5055,0.1175 +0.0000,0.0000,0.0000,-0.8377,0.5316,0.1253 +0.0000,0.0000,0.0000,-0.8197,0.5571,0.1331 +0.0000,0.0000,0.0000,-0.8009,0.5819,0.1409 +0.0000,0.0000,0.0000,-0.7814,0.6061,0.1487 +0.0000,0.0000,0.0000,-0.7610,0.6296,0.1564 +0.0000,0.0000,0.0000,-0.7399,0.6523,0.1642 +0.0000,0.0000,0.0000,-0.7181,0.6744,0.1719 +0.0000,0.0000,0.0000,-0.6956,0.6956,0.1797 +0.0000,0.0000,0.0000,-0.6724,0.7161,0.1874 +0.0000,0.0000,0.0000,-0.6486,0.7357,0.1951 +0.0000,0.0000,0.0000,-0.6242,0.7545,0.2028 +0.0000,0.0000,0.0000,-0.5992,0.7725,0.2105 +0.0000,0.0000,0.0000,-0.5736,0.7895,0.2181 +0.0000,0.0000,0.0000,-0.5476,0.8057,0.2258 +0.0000,0.0000,0.0000,-0.5210,0.8210,0.2334 +0.0000,0.0000,0.0000,-0.4940,0.8354,0.2411 +0.0000,0.0000,0.0000,-0.4666,0.8488,0.2487 +0.0000,0.0000,0.0000,-0.4388,0.8612,0.2563 +0.0000,0.0000,0.0000,-0.4107,0.8728,0.2639 +0.0000,0.0000,0.0000,-0.3822,0.8833,0.2714 +0.0000,0.0000,0.0000,-0.3535,0.8929,0.2790 +0.0000,0.0000,0.0000,-0.3245,0.9014,0.2865 +0.0000,0.0000,0.0000,-0.2954,0.9090,0.2940 +0.0000,0.0000,0.0000,-0.2660,0.9156,0.3015 +0.0000,0.0000,0.0000,-0.2365,0.9212,0.3090 +0.0000,0.0000,0.0000,-0.2069,0.9258,0.3165 +0.0000,0.0000,0.0000,-0.1773,0.9293,0.3239 +0.0000,0.0000,0.0000,-0.1476,0.9319,0.3313 +0.0000,0.0000,0.0000,-0.1179,0.9335,0.3387 +0.0000,0.0000,0.0000,-0.0883,0.9340,0.3461 +0.0000,0.0000,0.0000,-0.0587,0.9336,0.3535 +0.0000,0.0000,0.0000,-0.0293,0.9322,0.3608 +0.0000,0.0000,0.0000,0.0000,0.9298,0.3681 +0.0000,0.0000,0.0000,0.0291,0.9264,0.3754 +0.0000,0.0000,0.0000,0.0580,0.9221,0.3827 +0.0000,0.0000,0.0000,0.0867,0.9168,0.3899 +0.0000,0.0000,0.0000,0.1150,0.9105,0.3971 +0.0000,0.0000,0.0000,0.1431,0.9033,0.4043 +0.0000,0.0000,0.0000,0.1708,0.8953,0.4115 +0.0000,0.0000,0.0000,0.1981,0.8863,0.4187 +0.0000,0.0000,0.0000,0.2250,0.8764,0.4258 +0.0000,0.0000,0.0000,0.2515,0.8657,0.4329 +0.0000,0.0000,0.0000,0.2775,0.8541,0.4399 +0.0000,0.0000,0.0000,0.3030,0.8417,0.4470 +0.0000,0.0000,0.0000,0.3280,0.8284,0.4540 +0.0000,0.0000,0.0000,0.3524,0.8144,0.4610 +0.0000,0.0000,0.0000,0.3763,0.7997,0.4679 +0.0000,0.0000,0.0000,0.3995,0.7841,0.4749 +0.0000,0.0000,0.0000,0.4222,0.7679,0.4818 +0.0000,0.0000,0.0000,0.4441,0.7510,0.4886 +0.0000,0.0000,0.0000,0.4654,0.7334,0.4955 +0.0000,0.0000,0.0000,0.4860,0.7152,0.5023 +0.0000,0.0000,0.0000,0.5059,0.6964,0.5090 +0.0000,0.0000,0.0000,0.5251,0.6769,0.5158 +0.0000,0.0000,0.0000,0.5435,0.6570,0.5225 +0.0000,0.0000,0.0000,0.5611,0.6365,0.5292 +0.0000,0.0000,0.0000,0.5780,0.6155,0.5358 +0.0000,0.0000,0.0000,0.5940,0.5940,0.5424 +0.0000,0.0000,0.0000,0.6093,0.5721,0.5490 +0.0000,0.0000,0.0000,0.6237,0.5499,0.5556 +0.0000,0.0000,0.0000,0.6373,0.5272,0.5621 +0.0000,0.0000,0.0000,0.6500,0.5042,0.5686 +0.0000,0.0000,0.0000,0.6619,0.4809,0.5750 +0.0000,0.0000,0.0000,0.6729,0.4573,0.5814 +0.0000,0.0000,0.0000,0.6831,0.4335,0.5878 +0.0000,0.0000,0.0000,0.6924,0.4095,0.5941 +0.0000,0.0000,0.0000,0.7008,0.3852,0.6004 +0.0000,0.0000,0.0000,0.7083,0.3609,0.6067 +0.0000,0.0000,0.0000,0.7150,0.3364,0.6129 +0.0000,0.0000,0.0000,0.7207,0.3119,0.6191 +0.0000,0.0000,0.0000,0.7256,0.2873,0.6252 +0.0000,0.0000,0.0000,0.7296,0.2627,0.6314 +0.0000,0.0000,0.0000,0.7328,0.2381,0.6374 +0.0000,0.0000,0.0000,0.7351,0.2136,0.6435 +0.0000,0.0000,0.0000,0.7365,0.1891,0.6494 +0.0000,0.0000,0.0000,0.7371,0.1648,0.6554 +0.0000,0.0000,0.0000,0.7368,0.1406,0.6613 +0.0000,0.0000,0.0000,0.7357,0.1165,0.6672 +0.0000,0.0000,0.0000,0.7338,0.0927,0.6730 +0.0000,0.0000,0.0000,0.7311,0.0691,0.6788 +0.0000,0.0000,0.0000,0.7275,0.0458,0.6845 +0.0000,0.0000,0.0000,0.7232,0.0227,0.6903 +0.0000,0.0000,0.0000,0.7181,-0.0000,0.6959 diff --git a/scripts/trajectories/full-circle-with-up-and-down-4s-ccw-Vector3.csv b/scripts/trajectories/full-circle-with-up-and-down-4s-ccw-Vector3.csv new file mode 100644 index 0000000000..6310889020 --- /dev/null +++ b/scripts/trajectories/full-circle-with-up-and-down-4s-ccw-Vector3.csv @@ -0,0 +1,200 @@ +0.0000,0.0000,0.0000,0.7012,0.0220,0.7126 +0.0000,0.0000,0.0000,0.7057,0.0444,0.7071 +0.0000,0.0000,0.0000,0.7095,0.0671,0.7015 +0.0000,0.0000,0.0000,0.7125,0.0900,0.6959 +0.0000,0.0000,0.0000,0.7147,0.1132,0.6903 +0.0000,0.0000,0.0000,0.7161,0.1366,0.6845 +0.0000,0.0000,0.0000,0.7166,0.1602,0.6788 +0.0000,0.0000,0.0000,0.7164,0.1839,0.6730 +0.0000,0.0000,0.0000,0.7153,0.2078,0.6672 +0.0000,0.0000,0.0000,0.7134,0.2318,0.6613 +0.0000,0.0000,0.0000,0.7106,0.2558,0.6554 +0.0000,0.0000,0.0000,0.7070,0.2799,0.6494 +0.0000,0.0000,0.0000,0.7025,0.3040,0.6435 +0.0000,0.0000,0.0000,0.6972,0.3281,0.6374 +0.0000,0.0000,0.0000,0.6910,0.3521,0.6314 +0.0000,0.0000,0.0000,0.6839,0.3760,0.6252 +0.0000,0.0000,0.0000,0.6760,0.3998,0.6191 +0.0000,0.0000,0.0000,0.6671,0.4234,0.6129 +0.0000,0.0000,0.0000,0.6575,0.4468,0.6067 +0.0000,0.0000,0.0000,0.6470,0.4700,0.6004 +0.0000,0.0000,0.0000,0.6356,0.4930,0.5941 +0.0000,0.0000,0.0000,0.6234,0.5157,0.5878 +0.0000,0.0000,0.0000,0.6103,0.5380,0.5814 +0.0000,0.0000,0.0000,0.5964,0.5601,0.5750 +0.0000,0.0000,0.0000,0.5817,0.5817,0.5686 +0.0000,0.0000,0.0000,0.5662,0.6029,0.5621 +0.0000,0.0000,0.0000,0.5499,0.6237,0.5556 +0.0000,0.0000,0.0000,0.5328,0.6440,0.5490 +0.0000,0.0000,0.0000,0.5149,0.6638,0.5424 +0.0000,0.0000,0.0000,0.4963,0.6831,0.5358 +0.0000,0.0000,0.0000,0.4769,0.7018,0.5292 +0.0000,0.0000,0.0000,0.4569,0.7199,0.5225 +0.0000,0.0000,0.0000,0.4361,0.7374,0.5158 +0.0000,0.0000,0.0000,0.4147,0.7543,0.5090 +0.0000,0.0000,0.0000,0.3926,0.7705,0.5023 +0.0000,0.0000,0.0000,0.3698,0.7860,0.4955 +0.0000,0.0000,0.0000,0.3465,0.8007,0.4886 +0.0000,0.0000,0.0000,0.3226,0.8148,0.4818 +0.0000,0.0000,0.0000,0.2981,0.8280,0.4749 +0.0000,0.0000,0.0000,0.2731,0.8405,0.4679 +0.0000,0.0000,0.0000,0.2476,0.8522,0.4610 +0.0000,0.0000,0.0000,0.2216,0.8630,0.4540 +0.0000,0.0000,0.0000,0.1951,0.8730,0.4470 +0.0000,0.0000,0.0000,0.1683,0.8821,0.4399 +0.0000,0.0000,0.0000,0.1410,0.8904,0.4329 +0.0000,0.0000,0.0000,0.1134,0.8977,0.4258 +0.0000,0.0000,0.0000,0.0855,0.9041,0.4187 +0.0000,0.0000,0.0000,0.0572,0.9096,0.4115 +0.0000,0.0000,0.0000,0.0287,0.9142,0.4043 +0.0000,0.0000,0.0000,-0.0000,0.9178,0.3971 +0.0000,0.0000,0.0000,-0.0289,0.9204,0.3899 +0.0000,0.0000,0.0000,-0.0580,0.9221,0.3827 +0.0000,0.0000,0.0000,-0.0872,0.9227,0.3754 +0.0000,0.0000,0.0000,-0.1165,0.9224,0.3681 +0.0000,0.0000,0.0000,-0.1459,0.9212,0.3608 +0.0000,0.0000,0.0000,-0.1753,0.9189,0.3535 +0.0000,0.0000,0.0000,-0.2047,0.9156,0.3461 +0.0000,0.0000,0.0000,-0.2340,0.9113,0.3387 +0.0000,0.0000,0.0000,-0.2632,0.9060,0.3313 +0.0000,0.0000,0.0000,-0.2924,0.8998,0.3239 +0.0000,0.0000,0.0000,-0.3213,0.8925,0.3165 +0.0000,0.0000,0.0000,-0.3501,0.8843,0.3090 +0.0000,0.0000,0.0000,-0.3787,0.8750,0.3015 +0.0000,0.0000,0.0000,-0.4070,0.8648,0.2940 +0.0000,0.0000,0.0000,-0.4350,0.8536,0.2865 +0.0000,0.0000,0.0000,-0.4626,0.8415,0.2790 +0.0000,0.0000,0.0000,-0.4899,0.8284,0.2714 +0.0000,0.0000,0.0000,-0.5168,0.8144,0.2639 +0.0000,0.0000,0.0000,-0.5433,0.7995,0.2563 +0.0000,0.0000,0.0000,-0.5693,0.7836,0.2487 +0.0000,0.0000,0.0000,-0.5948,0.7669,0.2411 +0.0000,0.0000,0.0000,-0.6198,0.7492,0.2334 +0.0000,0.0000,0.0000,-0.6442,0.7307,0.2258 +0.0000,0.0000,0.0000,-0.6681,0.7114,0.2181 +0.0000,0.0000,0.0000,-0.6913,0.6913,0.2105 +0.0000,0.0000,0.0000,-0.7138,0.6703,0.2028 +0.0000,0.0000,0.0000,-0.7357,0.6486,0.1951 +0.0000,0.0000,0.0000,-0.7569,0.6261,0.1874 +0.0000,0.0000,0.0000,-0.7773,0.6029,0.1797 +0.0000,0.0000,0.0000,-0.7970,0.5790,0.1719 +0.0000,0.0000,0.0000,-0.8159,0.5545,0.1642 +0.0000,0.0000,0.0000,-0.8339,0.5292,0.1564 +0.0000,0.0000,0.0000,-0.8512,0.5034,0.1487 +0.0000,0.0000,0.0000,-0.8676,0.4769,0.1409 +0.0000,0.0000,0.0000,-0.8831,0.4499,0.1331 +0.0000,0.0000,0.0000,-0.8977,0.4224,0.1253 +0.0000,0.0000,0.0000,-0.9114,0.3944,0.1175 +0.0000,0.0000,0.0000,-0.9242,0.3659,0.1097 +0.0000,0.0000,0.0000,-0.9360,0.3370,0.1019 +0.0000,0.0000,0.0000,-0.9468,0.3076,0.0941 +0.0000,0.0000,0.0000,-0.9567,0.2779,0.0863 +0.0000,0.0000,0.0000,-0.9656,0.2479,0.0785 +0.0000,0.0000,0.0000,-0.9735,0.2176,0.0706 +0.0000,0.0000,0.0000,-0.9803,0.1870,0.0628 +0.0000,0.0000,0.0000,-0.9862,0.1562,0.0549 +0.0000,0.0000,0.0000,-0.9910,0.1252,0.0471 +0.0000,0.0000,0.0000,-0.9948,0.0940,0.0393 +0.0000,0.0000,0.0000,-0.9975,0.0628,0.0314 +0.0000,0.0000,0.0000,-0.9992,0.0314,0.0236 +0.0000,0.0000,0.0000,-0.9999,-0.0000,0.0157 +0.0000,0.0000,0.0000,-0.9995,-0.0314,0.0079 +0.0000,0.0000,0.0000,-0.9980,-0.0628,-0.0000 +0.0000,0.0000,0.0000,-0.9955,-0.0941,-0.0079 +0.0000,0.0000,0.0000,-0.9920,-0.1253,-0.0157 +0.0000,0.0000,0.0000,-0.9874,-0.1564,-0.0236 +0.0000,0.0000,0.0000,-0.9818,-0.1873,-0.0314 +0.0000,0.0000,0.0000,-0.9752,-0.2180,-0.0393 +0.0000,0.0000,0.0000,-0.9675,-0.2484,-0.0471 +0.0000,0.0000,0.0000,-0.9588,-0.2786,-0.0550 +0.0000,0.0000,0.0000,-0.9492,-0.3084,-0.0628 +0.0000,0.0000,0.0000,-0.9385,-0.3379,-0.0706 +0.0000,0.0000,0.0000,-0.9269,-0.3670,-0.0785 +0.0000,0.0000,0.0000,-0.9143,-0.3957,-0.0863 +0.0000,0.0000,0.0000,-0.9008,-0.4239,-0.0941 +0.0000,0.0000,0.0000,-0.8864,-0.4516,-0.1019 +0.0000,0.0000,0.0000,-0.8710,-0.4788,-0.1097 +0.0000,0.0000,0.0000,-0.8548,-0.5055,-0.1175 +0.0000,0.0000,0.0000,-0.8377,-0.5316,-0.1253 +0.0000,0.0000,0.0000,-0.8197,-0.5571,-0.1331 +0.0000,0.0000,0.0000,-0.8009,-0.5819,-0.1409 +0.0000,0.0000,0.0000,-0.7814,-0.6061,-0.1487 +0.0000,0.0000,0.0000,-0.7610,-0.6296,-0.1564 +0.0000,0.0000,0.0000,-0.7399,-0.6523,-0.1642 +0.0000,0.0000,0.0000,-0.7181,-0.6744,-0.1719 +0.0000,0.0000,0.0000,-0.6956,-0.6956,-0.1797 +0.0000,0.0000,0.0000,-0.6724,-0.7161,-0.1874 +0.0000,0.0000,0.0000,-0.6486,-0.7357,-0.1951 +0.0000,0.0000,0.0000,-0.6242,-0.7545,-0.2028 +0.0000,0.0000,0.0000,-0.5992,-0.7725,-0.2105 +0.0000,0.0000,0.0000,-0.5736,-0.7895,-0.2181 +0.0000,0.0000,0.0000,-0.5476,-0.8057,-0.2258 +0.0000,0.0000,0.0000,-0.5210,-0.8210,-0.2334 +0.0000,0.0000,0.0000,-0.4940,-0.8354,-0.2411 +0.0000,0.0000,0.0000,-0.4666,-0.8488,-0.2487 +0.0000,0.0000,0.0000,-0.4388,-0.8612,-0.2563 +0.0000,0.0000,0.0000,-0.4107,-0.8728,-0.2639 +0.0000,0.0000,0.0000,-0.3822,-0.8833,-0.2714 +0.0000,0.0000,0.0000,-0.3535,-0.8929,-0.2790 +0.0000,0.0000,0.0000,-0.3245,-0.9014,-0.2865 +0.0000,0.0000,0.0000,-0.2954,-0.9090,-0.2940 +0.0000,0.0000,0.0000,-0.2660,-0.9156,-0.3015 +0.0000,0.0000,0.0000,-0.2365,-0.9212,-0.3090 +0.0000,0.0000,0.0000,-0.2069,-0.9258,-0.3165 +0.0000,0.0000,0.0000,-0.1773,-0.9293,-0.3239 +0.0000,0.0000,0.0000,-0.1476,-0.9319,-0.3313 +0.0000,0.0000,0.0000,-0.1179,-0.9335,-0.3387 +0.0000,0.0000,0.0000,-0.0883,-0.9340,-0.3461 +0.0000,0.0000,0.0000,-0.0587,-0.9336,-0.3535 +0.0000,0.0000,0.0000,-0.0293,-0.9322,-0.3608 +0.0000,0.0000,0.0000,0.0000,-0.9298,-0.3681 +0.0000,0.0000,0.0000,0.0291,-0.9264,-0.3754 +0.0000,0.0000,0.0000,0.0580,-0.9221,-0.3827 +0.0000,0.0000,0.0000,0.0867,-0.9168,-0.3899 +0.0000,0.0000,0.0000,0.1150,-0.9105,-0.3971 +0.0000,0.0000,0.0000,0.1431,-0.9033,-0.4043 +0.0000,0.0000,0.0000,0.1708,-0.8953,-0.4115 +0.0000,0.0000,0.0000,0.1981,-0.8863,-0.4187 +0.0000,0.0000,0.0000,0.2250,-0.8764,-0.4258 +0.0000,0.0000,0.0000,0.2515,-0.8657,-0.4329 +0.0000,0.0000,0.0000,0.2775,-0.8541,-0.4399 +0.0000,0.0000,0.0000,0.3030,-0.8417,-0.4470 +0.0000,0.0000,0.0000,0.3280,-0.8284,-0.4540 +0.0000,0.0000,0.0000,0.3524,-0.8144,-0.4610 +0.0000,0.0000,0.0000,0.3763,-0.7997,-0.4679 +0.0000,0.0000,0.0000,0.3995,-0.7841,-0.4749 +0.0000,0.0000,0.0000,0.4222,-0.7679,-0.4818 +0.0000,0.0000,0.0000,0.4441,-0.7510,-0.4886 +0.0000,0.0000,0.0000,0.4654,-0.7334,-0.4955 +0.0000,0.0000,0.0000,0.4860,-0.7152,-0.5023 +0.0000,0.0000,0.0000,0.5059,-0.6964,-0.5090 +0.0000,0.0000,0.0000,0.5251,-0.6769,-0.5158 +0.0000,0.0000,0.0000,0.5435,-0.6570,-0.5225 +0.0000,0.0000,0.0000,0.5611,-0.6365,-0.5292 +0.0000,0.0000,0.0000,0.5780,-0.6155,-0.5358 +0.0000,0.0000,0.0000,0.5940,-0.5940,-0.5424 +0.0000,0.0000,0.0000,0.6093,-0.5721,-0.5490 +0.0000,0.0000,0.0000,0.6237,-0.5499,-0.5556 +0.0000,0.0000,0.0000,0.6373,-0.5272,-0.5621 +0.0000,0.0000,0.0000,0.6500,-0.5042,-0.5686 +0.0000,0.0000,0.0000,0.6619,-0.4809,-0.5750 +0.0000,0.0000,0.0000,0.6729,-0.4573,-0.5814 +0.0000,0.0000,0.0000,0.6831,-0.4335,-0.5878 +0.0000,0.0000,0.0000,0.6924,-0.4095,-0.5941 +0.0000,0.0000,0.0000,0.7008,-0.3852,-0.6004 +0.0000,0.0000,0.0000,0.7083,-0.3609,-0.6067 +0.0000,0.0000,0.0000,0.7150,-0.3364,-0.6129 +0.0000,0.0000,0.0000,0.7207,-0.3119,-0.6191 +0.0000,0.0000,0.0000,0.7256,-0.2873,-0.6252 +0.0000,0.0000,0.0000,0.7296,-0.2627,-0.6314 +0.0000,0.0000,0.0000,0.7328,-0.2381,-0.6374 +0.0000,0.0000,0.0000,0.7351,-0.2136,-0.6435 +0.0000,0.0000,0.0000,0.7365,-0.1891,-0.6494 +0.0000,0.0000,0.0000,0.7371,-0.1648,-0.6554 +0.0000,0.0000,0.0000,0.7368,-0.1406,-0.6613 +0.0000,0.0000,0.0000,0.7357,-0.1165,-0.6672 +0.0000,0.0000,0.0000,0.7338,-0.0927,-0.6730 +0.0000,0.0000,0.0000,0.7311,-0.0691,-0.6788 +0.0000,0.0000,0.0000,0.7275,-0.0458,-0.6845 +0.0000,0.0000,0.0000,0.7232,-0.0227,-0.6903 +0.0000,0.0000,0.0000,0.7181,0.0000,-0.6959 diff --git a/scripts/trajectories/full-circle-with-up-and-down-4s-ccw.csv b/scripts/trajectories/full-circle-with-up-and-down-4s-ccw.csv new file mode 100644 index 0000000000..1e4a316720 --- /dev/null +++ b/scripts/trajectories/full-circle-with-up-and-down-4s-ccw.csv @@ -0,0 +1,800 @@ +0.9223,-0.0000,-0.3863,0.0119 +0.9223,-0.0000,-0.3863,0.0119 +0.9223,-0.0000,-0.3863,0.0119 +0.9223,-0.0000,-0.3863,0.0119 +0.9235,-0.0000,-0.3828,0.0240 +0.9235,-0.0000,-0.3828,0.0240 +0.9235,-0.0000,-0.3828,0.0240 +0.9235,-0.0000,-0.3828,0.0240 +0.9245,-0.0000,-0.3794,0.0363 +0.9245,-0.0000,-0.3794,0.0363 +0.9245,-0.0000,-0.3794,0.0363 +0.9245,-0.0000,-0.3794,0.0363 +0.9253,-0.0000,-0.3760,0.0486 +0.9253,-0.0000,-0.3760,0.0486 +0.9253,-0.0000,-0.3760,0.0486 +0.9253,-0.0000,-0.3760,0.0486 +0.9259,-0.0000,-0.3727,0.0611 +0.9259,-0.0000,-0.3727,0.0611 +0.9259,-0.0000,-0.3727,0.0611 +0.9259,-0.0000,-0.3727,0.0611 +0.9263,-0.0000,-0.3695,0.0737 +0.9263,-0.0000,-0.3695,0.0737 +0.9263,-0.0000,-0.3695,0.0737 +0.9263,-0.0000,-0.3695,0.0737 +0.9265,-0.0000,-0.3663,0.0865 +0.9265,-0.0000,-0.3663,0.0865 +0.9265,-0.0000,-0.3663,0.0865 +0.9265,-0.0000,-0.3663,0.0865 +0.9264,-0.0000,-0.3632,0.0993 +0.9264,-0.0000,-0.3632,0.0993 +0.9264,-0.0000,-0.3632,0.0993 +0.9264,-0.0000,-0.3632,0.0993 +0.9261,-0.0000,-0.3602,0.1122 +0.9261,-0.0000,-0.3602,0.1122 +0.9261,-0.0000,-0.3602,0.1122 +0.9261,-0.0000,-0.3602,0.1122 +0.9256,-0.0000,-0.3572,0.1252 +0.9256,-0.0000,-0.3572,0.1252 +0.9256,-0.0000,-0.3572,0.1252 +0.9256,-0.0000,-0.3572,0.1252 +0.9248,-0.0000,-0.3543,0.1383 +0.9248,-0.0000,-0.3543,0.1383 +0.9248,-0.0000,-0.3543,0.1383 +0.9248,-0.0000,-0.3543,0.1383 +0.9239,-0.0000,-0.3515,0.1515 +0.9239,-0.0000,-0.3515,0.1515 +0.9239,-0.0000,-0.3515,0.1515 +0.9239,-0.0000,-0.3515,0.1515 +0.9226,-0.0000,-0.3487,0.1648 +0.9226,-0.0000,-0.3487,0.1648 +0.9226,-0.0000,-0.3487,0.1648 +0.9226,-0.0000,-0.3487,0.1648 +0.9212,-0.0000,-0.3460,0.1781 +0.9212,-0.0000,-0.3460,0.1781 +0.9212,-0.0000,-0.3460,0.1781 +0.9212,-0.0000,-0.3460,0.1781 +0.9195,-0.0000,-0.3433,0.1914 +0.9195,-0.0000,-0.3433,0.1914 +0.9195,-0.0000,-0.3433,0.1914 +0.9195,-0.0000,-0.3433,0.1914 +0.9176,-0.0000,-0.3407,0.2049 +0.9176,-0.0000,-0.3407,0.2049 +0.9176,-0.0000,-0.3407,0.2049 +0.9176,-0.0000,-0.3407,0.2049 +0.9154,-0.0000,-0.3382,0.2183 +0.9154,-0.0000,-0.3382,0.2183 +0.9154,-0.0000,-0.3382,0.2183 +0.9154,-0.0000,-0.3382,0.2183 +0.9130,-0.0000,-0.3357,0.2319 +0.9130,-0.0000,-0.3357,0.2319 +0.9130,-0.0000,-0.3357,0.2319 +0.9130,-0.0000,-0.3357,0.2319 +0.9104,-0.0000,-0.3332,0.2454 +0.9104,-0.0000,-0.3332,0.2454 +0.9104,-0.0000,-0.3332,0.2454 +0.9104,-0.0000,-0.3332,0.2454 +0.9075,-0.0000,-0.3308,0.2590 +0.9075,-0.0000,-0.3308,0.2590 +0.9075,-0.0000,-0.3308,0.2590 +0.9075,-0.0000,-0.3308,0.2590 +0.9043,-0.0000,-0.3285,0.2726 +0.9043,-0.0000,-0.3285,0.2726 +0.9043,-0.0000,-0.3285,0.2726 +0.9043,-0.0000,-0.3285,0.2726 +0.9009,-0.0000,-0.3262,0.2862 +0.9009,-0.0000,-0.3262,0.2862 +0.9009,-0.0000,-0.3262,0.2862 +0.9009,-0.0000,-0.3262,0.2862 +0.8973,-0.0000,-0.3240,0.2998 +0.8973,-0.0000,-0.3240,0.2998 +0.8973,-0.0000,-0.3240,0.2998 +0.8973,-0.0000,-0.3240,0.2998 +0.8934,-0.0000,-0.3218,0.3134 +0.8934,-0.0000,-0.3218,0.3134 +0.8934,-0.0000,-0.3218,0.3134 +0.8934,-0.0000,-0.3218,0.3134 +0.8893,-0.0000,-0.3197,0.3271 +0.8893,-0.0000,-0.3197,0.3271 +0.8893,-0.0000,-0.3197,0.3271 +0.8893,-0.0000,-0.3197,0.3271 +0.8849,-0.0000,-0.3176,0.3407 +0.8849,-0.0000,-0.3176,0.3407 +0.8849,-0.0000,-0.3176,0.3407 +0.8849,-0.0000,-0.3176,0.3407 +0.8803,-0.0000,-0.3156,0.3543 +0.8803,-0.0000,-0.3156,0.3543 +0.8803,-0.0000,-0.3156,0.3543 +0.8803,-0.0000,-0.3156,0.3543 +0.8754,-0.0000,-0.3136,0.3678 +0.8754,-0.0000,-0.3136,0.3678 +0.8754,-0.0000,-0.3136,0.3678 +0.8754,-0.0000,-0.3136,0.3678 +0.8703,-0.0000,-0.3116,0.3814 +0.8703,-0.0000,-0.3116,0.3814 +0.8703,-0.0000,-0.3116,0.3814 +0.8703,-0.0000,-0.3116,0.3814 +0.8650,-0.0000,-0.3097,0.3949 +0.8650,-0.0000,-0.3097,0.3949 +0.8650,-0.0000,-0.3097,0.3949 +0.8650,-0.0000,-0.3097,0.3949 +0.8593,-0.0000,-0.3079,0.4083 +0.8593,-0.0000,-0.3079,0.4083 +0.8593,-0.0000,-0.3079,0.4083 +0.8593,-0.0000,-0.3079,0.4083 +0.8535,-0.0000,-0.3061,0.4217 +0.8535,-0.0000,-0.3061,0.4217 +0.8535,-0.0000,-0.3061,0.4217 +0.8535,-0.0000,-0.3061,0.4217 +0.8474,-0.0000,-0.3043,0.4351 +0.8474,-0.0000,-0.3043,0.4351 +0.8474,-0.0000,-0.3043,0.4351 +0.8474,-0.0000,-0.3043,0.4351 +0.8410,-0.0000,-0.3026,0.4484 +0.8410,-0.0000,-0.3026,0.4484 +0.8410,-0.0000,-0.3026,0.4484 +0.8410,-0.0000,-0.3026,0.4484 +0.8344,-0.0000,-0.3010,0.4617 +0.8344,-0.0000,-0.3010,0.4617 +0.8344,-0.0000,-0.3010,0.4617 +0.8344,-0.0000,-0.3010,0.4617 +0.8276,-0.0000,-0.2993,0.4748 +0.8276,-0.0000,-0.2993,0.4748 +0.8276,-0.0000,-0.2993,0.4748 +0.8276,-0.0000,-0.2993,0.4748 +0.8205,-0.0000,-0.2978,0.4879 +0.8205,-0.0000,-0.2978,0.4879 +0.8205,-0.0000,-0.2978,0.4879 +0.8205,-0.0000,-0.2978,0.4879 +0.8132,-0.0000,-0.2962,0.5010 +0.8132,-0.0000,-0.2962,0.5010 +0.8132,-0.0000,-0.2962,0.5010 +0.8132,-0.0000,-0.2962,0.5010 +0.8056,-0.0000,-0.2947,0.5139 +0.8056,-0.0000,-0.2947,0.5139 +0.8056,-0.0000,-0.2947,0.5139 +0.8056,-0.0000,-0.2947,0.5139 +0.7978,-0.0000,-0.2932,0.5267 +0.7978,-0.0000,-0.2932,0.5267 +0.7978,-0.0000,-0.2932,0.5267 +0.7978,-0.0000,-0.2932,0.5267 +0.7898,-0.0000,-0.2918,0.5395 +0.7898,-0.0000,-0.2918,0.5395 +0.7898,-0.0000,-0.2918,0.5395 +0.7898,-0.0000,-0.2918,0.5395 +0.7815,-0.0000,-0.2904,0.5521 +0.7815,-0.0000,-0.2904,0.5521 +0.7815,-0.0000,-0.2904,0.5521 +0.7815,-0.0000,-0.2904,0.5521 +0.7730,-0.0000,-0.2891,0.5647 +0.7730,-0.0000,-0.2891,0.5647 +0.7730,-0.0000,-0.2891,0.5647 +0.7730,-0.0000,-0.2891,0.5647 +0.7643,-0.0000,-0.2878,0.5771 +0.7643,-0.0000,-0.2878,0.5771 +0.7643,-0.0000,-0.2878,0.5771 +0.7643,-0.0000,-0.2878,0.5771 +0.7553,-0.0000,-0.2865,0.5894 +0.7553,-0.0000,-0.2865,0.5894 +0.7553,-0.0000,-0.2865,0.5894 +0.7553,-0.0000,-0.2865,0.5894 +0.7461,-0.0000,-0.2853,0.6016 +0.7461,-0.0000,-0.2853,0.6016 +0.7461,-0.0000,-0.2853,0.6016 +0.7461,-0.0000,-0.2853,0.6016 +0.7367,-0.0000,-0.2841,0.6136 +0.7367,-0.0000,-0.2841,0.6136 +0.7367,-0.0000,-0.2841,0.6136 +0.7367,-0.0000,-0.2841,0.6136 +0.7271,-0.0000,-0.2830,0.6255 +0.7271,-0.0000,-0.2830,0.6255 +0.7271,-0.0000,-0.2830,0.6255 +0.7271,-0.0000,-0.2830,0.6255 +0.7172,-0.0000,-0.2819,0.6373 +0.7172,-0.0000,-0.2819,0.6373 +0.7172,-0.0000,-0.2819,0.6373 +0.7172,-0.0000,-0.2819,0.6373 +0.7071,-0.0000,-0.2808,0.6490 +0.7071,-0.0000,-0.2808,0.6490 +0.7071,-0.0000,-0.2808,0.6490 +0.7071,-0.0000,-0.2808,0.6490 +0.6968,-0.0000,-0.2798,0.6604 +0.6968,-0.0000,-0.2798,0.6604 +0.6968,-0.0000,-0.2798,0.6604 +0.6968,-0.0000,-0.2798,0.6604 +0.6863,-0.0000,-0.2788,0.6718 +0.6863,-0.0000,-0.2788,0.6718 +0.6863,-0.0000,-0.2788,0.6718 +0.6863,-0.0000,-0.2788,0.6718 +0.6756,-0.0000,-0.2779,0.6829 +0.6756,-0.0000,-0.2779,0.6829 +0.6756,-0.0000,-0.2779,0.6829 +0.6756,-0.0000,-0.2779,0.6829 +0.6646,-0.0000,-0.2769,0.6940 +0.6646,-0.0000,-0.2769,0.6940 +0.6646,-0.0000,-0.2769,0.6940 +0.6646,-0.0000,-0.2769,0.6940 +0.6535,-0.0000,-0.2761,0.7048 +0.6535,-0.0000,-0.2761,0.7048 +0.6535,-0.0000,-0.2761,0.7048 +0.6535,-0.0000,-0.2761,0.7048 +0.6422,-0.0000,-0.2752,0.7155 +0.6422,-0.0000,-0.2752,0.7155 +0.6422,-0.0000,-0.2752,0.7155 +0.6422,-0.0000,-0.2752,0.7155 +0.6306,-0.0000,-0.2744,0.7260 +0.6306,-0.0000,-0.2744,0.7260 +0.6306,-0.0000,-0.2744,0.7260 +0.6306,-0.0000,-0.2744,0.7260 +0.6189,-0.0000,-0.2737,0.7363 +0.6189,-0.0000,-0.2737,0.7363 +0.6189,-0.0000,-0.2737,0.7363 +0.6189,-0.0000,-0.2737,0.7363 +0.6069,-0.0000,-0.2730,0.7464 +0.6069,-0.0000,-0.2730,0.7464 +0.6069,-0.0000,-0.2730,0.7464 +0.6069,-0.0000,-0.2730,0.7464 +0.5948,-0.0000,-0.2723,0.7563 +0.5948,-0.0000,-0.2723,0.7563 +0.5948,-0.0000,-0.2723,0.7563 +0.5948,-0.0000,-0.2723,0.7563 +0.5825,-0.0000,-0.2716,0.7661 +0.5825,-0.0000,-0.2716,0.7661 +0.5825,-0.0000,-0.2716,0.7661 +0.5825,-0.0000,-0.2716,0.7661 +0.5700,-0.0000,-0.2710,0.7756 +0.5700,-0.0000,-0.2710,0.7756 +0.5700,-0.0000,-0.2710,0.7756 +0.5700,-0.0000,-0.2710,0.7756 +0.5574,-0.0000,-0.2705,0.7850 +0.5574,-0.0000,-0.2705,0.7850 +0.5574,-0.0000,-0.2705,0.7850 +0.5574,-0.0000,-0.2705,0.7850 +0.5445,-0.0000,-0.2700,0.7941 +0.5445,-0.0000,-0.2700,0.7941 +0.5445,-0.0000,-0.2700,0.7941 +0.5445,-0.0000,-0.2700,0.7941 +0.5315,-0.0000,-0.2695,0.8030 +0.5315,-0.0000,-0.2695,0.8030 +0.5315,-0.0000,-0.2695,0.8030 +0.5315,-0.0000,-0.2695,0.8030 +0.5184,-0.0000,-0.2691,0.8117 +0.5184,-0.0000,-0.2691,0.8117 +0.5184,-0.0000,-0.2691,0.8117 +0.5184,-0.0000,-0.2691,0.8117 +0.5050,-0.0000,-0.2687,0.8202 +0.5050,-0.0000,-0.2687,0.8202 +0.5050,-0.0000,-0.2687,0.8202 +0.5050,-0.0000,-0.2687,0.8202 +0.4915,-0.0000,-0.2684,0.8285 +0.4915,-0.0000,-0.2684,0.8285 +0.4915,-0.0000,-0.2684,0.8285 +0.4915,-0.0000,-0.2684,0.8285 +0.4779,-0.0000,-0.2682,0.8365 +0.4779,-0.0000,-0.2682,0.8365 +0.4779,-0.0000,-0.2682,0.8365 +0.4779,-0.0000,-0.2682,0.8365 +0.4640,-0.0000,-0.2680,0.8443 +0.4640,-0.0000,-0.2680,0.8443 +0.4640,-0.0000,-0.2680,0.8443 +0.4640,-0.0000,-0.2680,0.8443 +0.4501,-0.0000,-0.2678,0.8519 +0.4501,-0.0000,-0.2678,0.8519 +0.4501,-0.0000,-0.2678,0.8519 +0.4501,-0.0000,-0.2678,0.8519 +0.4360,-0.0000,-0.2677,0.8592 +0.4360,-0.0000,-0.2677,0.8592 +0.4360,-0.0000,-0.2677,0.8592 +0.4360,-0.0000,-0.2677,0.8592 +0.4218,-0.0000,-0.2677,0.8663 +0.4218,-0.0000,-0.2677,0.8663 +0.4218,-0.0000,-0.2677,0.8663 +0.4218,-0.0000,-0.2677,0.8663 +0.4074,-0.0000,-0.2677,0.8731 +0.4074,-0.0000,-0.2677,0.8731 +0.4074,-0.0000,-0.2677,0.8731 +0.4074,-0.0000,-0.2677,0.8731 +0.3929,-0.0000,-0.2678,0.8797 +0.3929,-0.0000,-0.2678,0.8797 +0.3929,-0.0000,-0.2678,0.8797 +0.3929,-0.0000,-0.2678,0.8797 +0.3783,-0.0000,-0.2680,0.8860 +0.3783,-0.0000,-0.2680,0.8860 +0.3783,-0.0000,-0.2680,0.8860 +0.3783,-0.0000,-0.2680,0.8860 +0.3635,-0.0000,-0.2683,0.8921 +0.3635,-0.0000,-0.2683,0.8921 +0.3635,-0.0000,-0.2683,0.8921 +0.3635,-0.0000,-0.2683,0.8921 +0.3487,-0.0000,-0.2687,0.8979 +0.3487,-0.0000,-0.2687,0.8979 +0.3487,-0.0000,-0.2687,0.8979 +0.3487,-0.0000,-0.2687,0.8979 +0.3337,-0.0000,-0.2692,0.9034 +0.3337,-0.0000,-0.2692,0.9034 +0.3337,-0.0000,-0.2692,0.9034 +0.3337,-0.0000,-0.2692,0.9034 +0.3186,-0.0000,-0.2698,0.9087 +0.3186,-0.0000,-0.2698,0.9087 +0.3186,-0.0000,-0.2698,0.9087 +0.3186,-0.0000,-0.2698,0.9087 +0.3034,-0.0000,-0.2705,0.9136 +0.3034,-0.0000,-0.2705,0.9136 +0.3034,-0.0000,-0.2705,0.9136 +0.3034,-0.0000,-0.2705,0.9136 +0.2882,-0.0000,-0.2714,0.9183 +0.2882,-0.0000,-0.2714,0.9183 +0.2882,-0.0000,-0.2714,0.9183 +0.2882,-0.0000,-0.2714,0.9183 +0.2728,-0.0000,-0.2725,0.9227 +0.2728,-0.0000,-0.2725,0.9227 +0.2728,-0.0000,-0.2725,0.9227 +0.2728,-0.0000,-0.2725,0.9227 +0.2573,-0.0000,-0.2738,0.9267 +0.2573,-0.0000,-0.2738,0.9267 +0.2573,-0.0000,-0.2738,0.9267 +0.2573,-0.0000,-0.2738,0.9267 +0.2418,-0.0000,-0.2753,0.9305 +0.2418,-0.0000,-0.2753,0.9305 +0.2418,-0.0000,-0.2753,0.9305 +0.2418,-0.0000,-0.2753,0.9305 +0.2262,-0.0000,-0.2771,0.9339 +0.2262,-0.0000,-0.2771,0.9339 +0.2262,-0.0000,-0.2771,0.9339 +0.2262,-0.0000,-0.2771,0.9339 +0.2105,-0.0000,-0.2792,0.9369 +0.2105,-0.0000,-0.2792,0.9369 +0.2105,-0.0000,-0.2792,0.9369 +0.2105,-0.0000,-0.2792,0.9369 +0.1947,-0.0000,-0.2818,0.9395 +0.1947,-0.0000,-0.2818,0.9395 +0.1947,-0.0000,-0.2818,0.9395 +0.1947,-0.0000,-0.2818,0.9395 +0.1789,-0.0000,-0.2848,0.9417 +0.1789,-0.0000,-0.2848,0.9417 +0.1789,-0.0000,-0.2848,0.9417 +0.1789,-0.0000,-0.2848,0.9417 +0.1630,-0.0000,-0.2886,0.9435 +0.1630,-0.0000,-0.2886,0.9435 +0.1630,-0.0000,-0.2886,0.9435 +0.1630,-0.0000,-0.2886,0.9435 +0.1471,-0.0000,-0.2933,0.9446 +0.1471,-0.0000,-0.2933,0.9446 +0.1471,-0.0000,-0.2933,0.9446 +0.1471,-0.0000,-0.2933,0.9446 +0.1312,-0.0000,-0.2991,0.9452 +0.1312,-0.0000,-0.2991,0.9452 +0.1312,-0.0000,-0.2991,0.9452 +0.1312,-0.0000,-0.2991,0.9452 +0.1152,-0.0000,-0.3067,0.9448 +0.1152,-0.0000,-0.3067,0.9448 +0.1152,-0.0000,-0.3067,0.9448 +0.1152,-0.0000,-0.3067,0.9448 +0.0991,-0.0000,-0.3167,0.9433 +0.0991,-0.0000,-0.3167,0.9433 +0.0991,-0.0000,-0.3167,0.9433 +0.0991,-0.0000,-0.3167,0.9433 +0.0831,-0.0000,-0.3307,0.9401 +0.0831,-0.0000,-0.3307,0.9401 +0.0831,-0.0000,-0.3307,0.9401 +0.0831,-0.0000,-0.3307,0.9401 +0.0670,-0.0000,-0.3514,0.9338 +0.0670,-0.0000,-0.3514,0.9338 +0.0670,-0.0000,-0.3514,0.9338 +0.0670,-0.0000,-0.3514,0.9338 +0.0510,-0.0000,-0.3848,0.9216 +0.0510,-0.0000,-0.3848,0.9216 +0.0510,-0.0000,-0.3848,0.9216 +0.0510,-0.0000,-0.3848,0.9216 +0.0351,-0.0000,-0.4473,0.8937 +0.0351,-0.0000,-0.4473,0.8937 +0.0351,-0.0000,-0.4473,0.8937 +0.0351,-0.0000,-0.4473,0.8937 +0.0196,-0.0000,-0.6000,0.7997 +0.0196,-0.0000,-0.6000,0.7997 +0.0196,-0.0000,-0.6000,0.7997 +0.0196,-0.0000,-0.6000,0.7997 +0.0079,-0.0000,-1.0000,-0.0001 +0.0079,-0.0000,-1.0000,-0.0001 +0.0079,-0.0000,-1.0000,-0.0001 +0.0079,-0.0000,-1.0000,-0.0001 +0.0162,-0.0000,-0.2425,-0.9700 +0.0162,-0.0000,-0.2425,-0.9700 +0.0162,-0.0000,-0.2425,-0.9700 +0.0162,-0.0000,-0.2425,-0.9700 +0.0314,-0.0000,0.0000,-0.9995 +0.0314,-0.0000,0.0000,-0.9995 +0.0314,-0.0000,0.0000,-0.9995 +0.0314,-0.0000,0.0000,-0.9995 +0.0473,-0.0000,0.0831,-0.9954 +0.0473,-0.0000,0.0831,-0.9954 +0.0473,-0.0000,0.0831,-0.9954 +0.0473,-0.0000,0.0831,-0.9954 +0.0633,-0.0000,0.1241,-0.9902 +0.0633,-0.0000,0.1241,-0.9902 +0.0633,-0.0000,0.1241,-0.9902 +0.0633,-0.0000,0.1241,-0.9902 +0.0793,-0.0000,0.1485,-0.9857 +0.0793,-0.0000,0.1485,-0.9857 +0.0793,-0.0000,0.1485,-0.9857 +0.0793,-0.0000,0.1485,-0.9857 +0.0954,-0.0000,0.1646,-0.9817 +0.0954,-0.0000,0.1646,-0.9817 +0.0954,-0.0000,0.1646,-0.9817 +0.0954,-0.0000,0.1646,-0.9817 +0.1114,-0.0000,0.1762,-0.9780 +0.1114,-0.0000,0.1762,-0.9780 +0.1114,-0.0000,0.1762,-0.9780 +0.1114,-0.0000,0.1762,-0.9780 +0.1275,-0.0000,0.1848,-0.9745 +0.1275,-0.0000,0.1848,-0.9745 +0.1275,-0.0000,0.1848,-0.9745 +0.1275,-0.0000,0.1848,-0.9745 +0.1435,-0.0000,0.1915,-0.9709 +0.1435,-0.0000,0.1915,-0.9709 +0.1435,-0.0000,0.1915,-0.9709 +0.1435,-0.0000,0.1915,-0.9709 +0.1594,-0.0000,0.1970,-0.9674 +0.1594,-0.0000,0.1970,-0.9674 +0.1594,-0.0000,0.1970,-0.9674 +0.1594,-0.0000,0.1970,-0.9674 +0.1753,-0.0000,0.2014,-0.9637 +0.1753,-0.0000,0.2014,-0.9637 +0.1753,-0.0000,0.2014,-0.9637 +0.1753,-0.0000,0.2014,-0.9637 +0.1912,-0.0000,0.2052,-0.9599 +0.1912,-0.0000,0.2052,-0.9599 +0.1912,-0.0000,0.2052,-0.9599 +0.1912,-0.0000,0.2052,-0.9599 +0.2070,-0.0000,0.2085,-0.9559 +0.2070,-0.0000,0.2085,-0.9559 +0.2070,-0.0000,0.2085,-0.9559 +0.2070,-0.0000,0.2085,-0.9559 +0.2227,-0.0000,0.2113,-0.9517 +0.2227,-0.0000,0.2113,-0.9517 +0.2227,-0.0000,0.2113,-0.9517 +0.2227,-0.0000,0.2113,-0.9517 +0.2384,-0.0000,0.2138,-0.9473 +0.2384,-0.0000,0.2138,-0.9473 +0.2384,-0.0000,0.2138,-0.9473 +0.2384,-0.0000,0.2138,-0.9473 +0.2540,-0.0000,0.2161,-0.9428 +0.2540,-0.0000,0.2161,-0.9428 +0.2540,-0.0000,0.2161,-0.9428 +0.2540,-0.0000,0.2161,-0.9428 +0.2695,-0.0000,0.2181,-0.9380 +0.2695,-0.0000,0.2181,-0.9380 +0.2695,-0.0000,0.2181,-0.9380 +0.2695,-0.0000,0.2181,-0.9380 +0.2849,-0.0000,0.2200,-0.9330 +0.2849,-0.0000,0.2200,-0.9330 +0.2849,-0.0000,0.2200,-0.9330 +0.2849,-0.0000,0.2200,-0.9330 +0.3002,-0.0000,0.2217,-0.9277 +0.3002,-0.0000,0.2217,-0.9277 +0.3002,-0.0000,0.2217,-0.9277 +0.3002,-0.0000,0.2217,-0.9277 +0.3155,-0.0000,0.2233,-0.9223 +0.3155,-0.0000,0.2233,-0.9223 +0.3155,-0.0000,0.2233,-0.9223 +0.3155,-0.0000,0.2233,-0.9223 +0.3306,-0.0000,0.2248,-0.9166 +0.3306,-0.0000,0.2248,-0.9166 +0.3306,-0.0000,0.2248,-0.9166 +0.3306,-0.0000,0.2248,-0.9166 +0.3457,-0.0000,0.2263,-0.9107 +0.3457,-0.0000,0.2263,-0.9107 +0.3457,-0.0000,0.2263,-0.9107 +0.3457,-0.0000,0.2263,-0.9107 +0.3606,-0.0000,0.2277,-0.9045 +0.3606,-0.0000,0.2277,-0.9045 +0.3606,-0.0000,0.2277,-0.9045 +0.3606,-0.0000,0.2277,-0.9045 +0.3754,-0.0000,0.2290,-0.8981 +0.3754,-0.0000,0.2290,-0.8981 +0.3754,-0.0000,0.2290,-0.8981 +0.3754,-0.0000,0.2290,-0.8981 +0.3901,-0.0000,0.2303,-0.8915 +0.3901,-0.0000,0.2303,-0.8915 +0.3901,-0.0000,0.2303,-0.8915 +0.3901,-0.0000,0.2303,-0.8915 +0.4047,-0.0000,0.2315,-0.8847 +0.4047,-0.0000,0.2315,-0.8847 +0.4047,-0.0000,0.2315,-0.8847 +0.4047,-0.0000,0.2315,-0.8847 +0.4192,-0.0000,0.2327,-0.8776 +0.4192,-0.0000,0.2327,-0.8776 +0.4192,-0.0000,0.2327,-0.8776 +0.4192,-0.0000,0.2327,-0.8776 +0.4335,-0.0000,0.2339,-0.8703 +0.4335,-0.0000,0.2339,-0.8703 +0.4335,-0.0000,0.2339,-0.8703 +0.4335,-0.0000,0.2339,-0.8703 +0.4477,-0.0000,0.2351,-0.8627 +0.4477,-0.0000,0.2351,-0.8627 +0.4477,-0.0000,0.2351,-0.8627 +0.4477,-0.0000,0.2351,-0.8627 +0.4617,-0.0000,0.2362,-0.8550 +0.4617,-0.0000,0.2362,-0.8550 +0.4617,-0.0000,0.2362,-0.8550 +0.4617,-0.0000,0.2362,-0.8550 +0.4756,-0.0000,0.2374,-0.8470 +0.4756,-0.0000,0.2374,-0.8470 +0.4756,-0.0000,0.2374,-0.8470 +0.4756,-0.0000,0.2374,-0.8470 +0.4894,-0.0000,0.2385,-0.8388 +0.4894,-0.0000,0.2385,-0.8388 +0.4894,-0.0000,0.2385,-0.8388 +0.4894,-0.0000,0.2385,-0.8388 +0.5030,-0.0000,0.2396,-0.8304 +0.5030,-0.0000,0.2396,-0.8304 +0.5030,-0.0000,0.2396,-0.8304 +0.5030,-0.0000,0.2396,-0.8304 +0.5164,-0.0000,0.2408,-0.8218 +0.5164,-0.0000,0.2408,-0.8218 +0.5164,-0.0000,0.2408,-0.8218 +0.5164,-0.0000,0.2408,-0.8218 +0.5297,-0.0000,0.2419,-0.8130 +0.5297,-0.0000,0.2419,-0.8130 +0.5297,-0.0000,0.2419,-0.8130 +0.5297,-0.0000,0.2419,-0.8130 +0.5428,-0.0000,0.2431,-0.8039 +0.5428,-0.0000,0.2431,-0.8039 +0.5428,-0.0000,0.2431,-0.8039 +0.5428,-0.0000,0.2431,-0.8039 +0.5558,-0.0000,0.2442,-0.7947 +0.5558,-0.0000,0.2442,-0.7947 +0.5558,-0.0000,0.2442,-0.7947 +0.5558,-0.0000,0.2442,-0.7947 +0.5685,-0.0000,0.2454,-0.7852 +0.5685,-0.0000,0.2454,-0.7852 +0.5685,-0.0000,0.2454,-0.7852 +0.5685,-0.0000,0.2454,-0.7852 +0.5811,-0.0000,0.2465,-0.7756 +0.5811,-0.0000,0.2465,-0.7756 +0.5811,-0.0000,0.2465,-0.7756 +0.5811,-0.0000,0.2465,-0.7756 +0.5936,-0.0000,0.2477,-0.7657 +0.5936,-0.0000,0.2477,-0.7657 +0.5936,-0.0000,0.2477,-0.7657 +0.5936,-0.0000,0.2477,-0.7657 +0.6058,-0.0000,0.2489,-0.7557 +0.6058,-0.0000,0.2489,-0.7557 +0.6058,-0.0000,0.2489,-0.7557 +0.6058,-0.0000,0.2489,-0.7557 +0.6179,-0.0000,0.2501,-0.7455 +0.6179,-0.0000,0.2501,-0.7455 +0.6179,-0.0000,0.2501,-0.7455 +0.6179,-0.0000,0.2501,-0.7455 +0.6297,-0.0000,0.2513,-0.7351 +0.6297,-0.0000,0.2513,-0.7351 +0.6297,-0.0000,0.2513,-0.7351 +0.6297,-0.0000,0.2513,-0.7351 +0.6414,-0.0000,0.2525,-0.7245 +0.6414,-0.0000,0.2525,-0.7245 +0.6414,-0.0000,0.2525,-0.7245 +0.6414,-0.0000,0.2525,-0.7245 +0.6528,-0.0000,0.2538,-0.7137 +0.6528,-0.0000,0.2538,-0.7137 +0.6528,-0.0000,0.2538,-0.7137 +0.6528,-0.0000,0.2538,-0.7137 +0.6641,-0.0000,0.2550,-0.7028 +0.6641,-0.0000,0.2550,-0.7028 +0.6641,-0.0000,0.2550,-0.7028 +0.6641,-0.0000,0.2550,-0.7028 +0.6752,-0.0000,0.2563,-0.6917 +0.6752,-0.0000,0.2563,-0.6917 +0.6752,-0.0000,0.2563,-0.6917 +0.6752,-0.0000,0.2563,-0.6917 +0.6860,-0.0000,0.2576,-0.6804 +0.6860,-0.0000,0.2576,-0.6804 +0.6860,-0.0000,0.2576,-0.6804 +0.6860,-0.0000,0.2576,-0.6804 +0.6967,-0.0000,0.2590,-0.6690 +0.6967,-0.0000,0.2590,-0.6690 +0.6967,-0.0000,0.2590,-0.6690 +0.6967,-0.0000,0.2590,-0.6690 +0.7071,-0.0000,0.2603,-0.6575 +0.7071,-0.0000,0.2603,-0.6575 +0.7071,-0.0000,0.2603,-0.6575 +0.7071,-0.0000,0.2603,-0.6575 +0.7173,-0.0000,0.2617,-0.6457 +0.7173,-0.0000,0.2617,-0.6457 +0.7173,-0.0000,0.2617,-0.6457 +0.7173,-0.0000,0.2617,-0.6457 +0.7273,-0.0000,0.2631,-0.6339 +0.7273,-0.0000,0.2631,-0.6339 +0.7273,-0.0000,0.2631,-0.6339 +0.7273,-0.0000,0.2631,-0.6339 +0.7371,-0.0000,0.2645,-0.6219 +0.7371,-0.0000,0.2645,-0.6219 +0.7371,-0.0000,0.2645,-0.6219 +0.7371,-0.0000,0.2645,-0.6219 +0.7467,-0.0000,0.2659,-0.6097 +0.7467,-0.0000,0.2659,-0.6097 +0.7467,-0.0000,0.2659,-0.6097 +0.7467,-0.0000,0.2659,-0.6097 +0.7560,-0.0000,0.2674,-0.5974 +0.7560,-0.0000,0.2674,-0.5974 +0.7560,-0.0000,0.2674,-0.5974 +0.7560,-0.0000,0.2674,-0.5974 +0.7651,-0.0000,0.2689,-0.5851 +0.7651,-0.0000,0.2689,-0.5851 +0.7651,-0.0000,0.2689,-0.5851 +0.7651,-0.0000,0.2689,-0.5851 +0.7740,-0.0000,0.2705,-0.5725 +0.7740,-0.0000,0.2705,-0.5725 +0.7740,-0.0000,0.2705,-0.5725 +0.7740,-0.0000,0.2705,-0.5725 +0.7826,-0.0000,0.2720,-0.5599 +0.7826,-0.0000,0.2720,-0.5599 +0.7826,-0.0000,0.2720,-0.5599 +0.7826,-0.0000,0.2720,-0.5599 +0.7910,-0.0000,0.2736,-0.5472 +0.7910,-0.0000,0.2736,-0.5472 +0.7910,-0.0000,0.2736,-0.5472 +0.7910,-0.0000,0.2736,-0.5472 +0.7992,-0.0000,0.2752,-0.5343 +0.7992,-0.0000,0.2752,-0.5343 +0.7992,-0.0000,0.2752,-0.5343 +0.7992,-0.0000,0.2752,-0.5343 +0.8072,-0.0000,0.2769,-0.5214 +0.8072,-0.0000,0.2769,-0.5214 +0.8072,-0.0000,0.2769,-0.5214 +0.8072,-0.0000,0.2769,-0.5214 +0.8149,-0.0000,0.2786,-0.5083 +0.8149,-0.0000,0.2786,-0.5083 +0.8149,-0.0000,0.2786,-0.5083 +0.8149,-0.0000,0.2786,-0.5083 +0.8223,-0.0000,0.2803,-0.4952 +0.8223,-0.0000,0.2803,-0.4952 +0.8223,-0.0000,0.2803,-0.4952 +0.8223,-0.0000,0.2803,-0.4952 +0.8295,-0.0000,0.2820,-0.4820 +0.8295,-0.0000,0.2820,-0.4820 +0.8295,-0.0000,0.2820,-0.4820 +0.8295,-0.0000,0.2820,-0.4820 +0.8365,-0.0000,0.2838,-0.4687 +0.8365,-0.0000,0.2838,-0.4687 +0.8365,-0.0000,0.2838,-0.4687 +0.8365,-0.0000,0.2838,-0.4687 +0.8433,-0.0000,0.2857,-0.4553 +0.8433,-0.0000,0.2857,-0.4553 +0.8433,-0.0000,0.2857,-0.4553 +0.8433,-0.0000,0.2857,-0.4553 +0.8497,-0.0000,0.2875,-0.4419 +0.8497,-0.0000,0.2875,-0.4419 +0.8497,-0.0000,0.2875,-0.4419 +0.8497,-0.0000,0.2875,-0.4419 +0.8560,-0.0000,0.2894,-0.4284 +0.8560,-0.0000,0.2894,-0.4284 +0.8560,-0.0000,0.2894,-0.4284 +0.8560,-0.0000,0.2894,-0.4284 +0.8620,-0.0000,0.2913,-0.4148 +0.8620,-0.0000,0.2913,-0.4148 +0.8620,-0.0000,0.2913,-0.4148 +0.8620,-0.0000,0.2913,-0.4148 +0.8677,-0.0000,0.2933,-0.4012 +0.8677,-0.0000,0.2933,-0.4012 +0.8677,-0.0000,0.2933,-0.4012 +0.8677,-0.0000,0.2933,-0.4012 +0.8732,-0.0000,0.2953,-0.3876 +0.8732,-0.0000,0.2953,-0.3876 +0.8732,-0.0000,0.2953,-0.3876 +0.8732,-0.0000,0.2953,-0.3876 +0.8785,-0.0000,0.2974,-0.3739 +0.8785,-0.0000,0.2974,-0.3739 +0.8785,-0.0000,0.2974,-0.3739 +0.8785,-0.0000,0.2974,-0.3739 +0.8835,-0.0000,0.2995,-0.3602 +0.8835,-0.0000,0.2995,-0.3602 +0.8835,-0.0000,0.2995,-0.3602 +0.8835,-0.0000,0.2995,-0.3602 +0.8883,-0.0000,0.3016,-0.3465 +0.8883,-0.0000,0.3016,-0.3465 +0.8883,-0.0000,0.3016,-0.3465 +0.8883,-0.0000,0.3016,-0.3465 +0.8928,-0.0000,0.3038,-0.3327 +0.8928,-0.0000,0.3038,-0.3327 +0.8928,-0.0000,0.3038,-0.3327 +0.8928,-0.0000,0.3038,-0.3327 +0.8970,-0.0000,0.3060,-0.3189 +0.8970,-0.0000,0.3060,-0.3189 +0.8970,-0.0000,0.3060,-0.3189 +0.8970,-0.0000,0.3060,-0.3189 +0.9010,-0.0000,0.3083,-0.3051 +0.9010,-0.0000,0.3083,-0.3051 +0.9010,-0.0000,0.3083,-0.3051 +0.9010,-0.0000,0.3083,-0.3051 +0.9048,-0.0000,0.3106,-0.2913 +0.9048,-0.0000,0.3106,-0.2913 +0.9048,-0.0000,0.3106,-0.2913 +0.9048,-0.0000,0.3106,-0.2913 +0.9083,-0.0000,0.3130,-0.2776 +0.9083,-0.0000,0.3130,-0.2776 +0.9083,-0.0000,0.3130,-0.2776 +0.9083,-0.0000,0.3130,-0.2776 +0.9116,-0.0000,0.3154,-0.2638 +0.9116,-0.0000,0.3154,-0.2638 +0.9116,-0.0000,0.3154,-0.2638 +0.9116,-0.0000,0.3154,-0.2638 +0.9146,-0.0000,0.3179,-0.2500 +0.9146,-0.0000,0.3179,-0.2500 +0.9146,-0.0000,0.3179,-0.2500 +0.9146,-0.0000,0.3179,-0.2500 +0.9174,-0.0000,0.3204,-0.2363 +0.9174,-0.0000,0.3204,-0.2363 +0.9174,-0.0000,0.3204,-0.2363 +0.9174,-0.0000,0.3204,-0.2363 +0.9199,-0.0000,0.3229,-0.2226 +0.9199,-0.0000,0.3229,-0.2226 +0.9199,-0.0000,0.3229,-0.2226 +0.9199,-0.0000,0.3229,-0.2226 +0.9222,-0.0000,0.3256,-0.2089 +0.9222,-0.0000,0.3256,-0.2089 +0.9222,-0.0000,0.3256,-0.2089 +0.9222,-0.0000,0.3256,-0.2089 +0.9242,-0.0000,0.3282,-0.1952 +0.9242,-0.0000,0.3282,-0.1952 +0.9242,-0.0000,0.3282,-0.1952 +0.9242,-0.0000,0.3282,-0.1952 +0.9260,-0.0000,0.3309,-0.1817 +0.9260,-0.0000,0.3309,-0.1817 +0.9260,-0.0000,0.3309,-0.1817 +0.9260,-0.0000,0.3309,-0.1817 +0.9276,-0.0000,0.3337,-0.1681 +0.9276,-0.0000,0.3337,-0.1681 +0.9276,-0.0000,0.3337,-0.1681 +0.9276,-0.0000,0.3337,-0.1681 +0.9289,-0.0000,0.3366,-0.1546 +0.9289,-0.0000,0.3366,-0.1546 +0.9289,-0.0000,0.3366,-0.1546 +0.9289,-0.0000,0.3366,-0.1546 +0.9300,-0.0000,0.3395,-0.1412 +0.9300,-0.0000,0.3395,-0.1412 +0.9300,-0.0000,0.3395,-0.1412 +0.9300,-0.0000,0.3395,-0.1412 +0.9308,-0.0000,0.3424,-0.1279 +0.9308,-0.0000,0.3424,-0.1279 +0.9308,-0.0000,0.3424,-0.1279 +0.9308,-0.0000,0.3424,-0.1279 +0.9314,-0.0000,0.3454,-0.1146 +0.9314,-0.0000,0.3454,-0.1146 +0.9314,-0.0000,0.3454,-0.1146 +0.9314,-0.0000,0.3454,-0.1146 +0.9318,-0.0000,0.3485,-0.1015 +0.9318,-0.0000,0.3485,-0.1015 +0.9318,-0.0000,0.3485,-0.1015 +0.9318,-0.0000,0.3485,-0.1015 +0.9320,-0.0000,0.3516,-0.0884 +0.9320,-0.0000,0.3516,-0.0884 +0.9320,-0.0000,0.3516,-0.0884 +0.9320,-0.0000,0.3516,-0.0884 +0.9319,-0.0000,0.3548,-0.0754 +0.9319,-0.0000,0.3548,-0.0754 +0.9319,-0.0000,0.3548,-0.0754 +0.9319,-0.0000,0.3548,-0.0754 +0.9316,-0.0000,0.3581,-0.0625 +0.9316,-0.0000,0.3581,-0.0625 +0.9316,-0.0000,0.3581,-0.0625 +0.9316,-0.0000,0.3581,-0.0625 +0.9311,-0.0000,0.3614,-0.0498 +0.9311,-0.0000,0.3614,-0.0498 +0.9311,-0.0000,0.3614,-0.0498 +0.9311,-0.0000,0.3614,-0.0498 +0.9303,-0.0000,0.3648,-0.0371 +0.9303,-0.0000,0.3648,-0.0371 +0.9303,-0.0000,0.3648,-0.0371 +0.9303,-0.0000,0.3648,-0.0371 +0.9294,-0.0000,0.3683,-0.0246 +0.9294,-0.0000,0.3683,-0.0246 +0.9294,-0.0000,0.3683,-0.0246 +0.9294,-0.0000,0.3683,-0.0246 +0.9282,-0.0000,0.3718,-0.0122 +0.9282,-0.0000,0.3718,-0.0122 +0.9282,-0.0000,0.3718,-0.0122 +0.9282,-0.0000,0.3718,-0.0122 +0.9269,0.0000,0.3754,0.0000 +0.9269,0.0000,0.3754,0.0000 +0.9269,0.0000,0.3754,0.0000 +0.9269,0.0000,0.3754,0.0000 diff --git a/scripts/trajectories/full-circle-with-up-and-down-4s-fixed-pos-offset-Vector3.csv b/scripts/trajectories/full-circle-with-up-and-down-4s-fixed-pos-offset-Vector3.csv new file mode 100644 index 0000000000..c858131d94 --- /dev/null +++ b/scripts/trajectories/full-circle-with-up-and-down-4s-fixed-pos-offset-Vector3.csv @@ -0,0 +1,200 @@ +10.0000,10.0000,10.0000,10.7012,9.9780,9.2874 +10.0000,10.0000,10.0000,10.7057,9.9556,9.2929 +10.0000,10.0000,10.0000,10.7095,9.9329,9.2985 +10.0000,10.0000,10.0000,10.7125,9.9100,9.3041 +10.0000,10.0000,10.0000,10.7147,9.8868,9.3097 +10.0000,10.0000,10.0000,10.7161,9.8634,9.3155 +10.0000,10.0000,10.0000,10.7166,9.8398,9.3212 +10.0000,10.0000,10.0000,10.7164,9.8161,9.3270 +10.0000,10.0000,10.0000,10.7153,9.7922,9.3328 +10.0000,10.0000,10.0000,10.7134,9.7682,9.3387 +10.0000,10.0000,10.0000,10.7106,9.7442,9.3446 +10.0000,10.0000,10.0000,10.7070,9.7201,9.3506 +10.0000,10.0000,10.0000,10.7025,9.6960,9.3565 +10.0000,10.0000,10.0000,10.6972,9.6719,9.3626 +10.0000,10.0000,10.0000,10.6910,9.6479,9.3686 +10.0000,10.0000,10.0000,10.6839,9.6240,9.3748 +10.0000,10.0000,10.0000,10.6760,9.6002,9.3809 +10.0000,10.0000,10.0000,10.6671,9.5766,9.3871 +10.0000,10.0000,10.0000,10.6575,9.5532,9.3933 +10.0000,10.0000,10.0000,10.6470,9.5300,9.3996 +10.0000,10.0000,10.0000,10.6356,9.5070,9.4059 +10.0000,10.0000,10.0000,10.6234,9.4843,9.4122 +10.0000,10.0000,10.0000,10.6103,9.4620,9.4186 +10.0000,10.0000,10.0000,10.5964,9.4399,9.4250 +10.0000,10.0000,10.0000,10.5817,9.4183,9.4314 +10.0000,10.0000,10.0000,10.5662,9.3971,9.4379 +10.0000,10.0000,10.0000,10.5499,9.3763,9.4444 +10.0000,10.0000,10.0000,10.5328,9.3560,9.4510 +10.0000,10.0000,10.0000,10.5149,9.3362,9.4576 +10.0000,10.0000,10.0000,10.4963,9.3169,9.4642 +10.0000,10.0000,10.0000,10.4769,9.2982,9.4708 +10.0000,10.0000,10.0000,10.4569,9.2801,9.4775 +10.0000,10.0000,10.0000,10.4361,9.2626,9.4842 +10.0000,10.0000,10.0000,10.4147,9.2457,9.4910 +10.0000,10.0000,10.0000,10.3926,9.2295,9.4977 +10.0000,10.0000,10.0000,10.3698,9.2140,9.5045 +10.0000,10.0000,10.0000,10.3465,9.1993,9.5114 +10.0000,10.0000,10.0000,10.3226,9.1852,9.5182 +10.0000,10.0000,10.0000,10.2981,9.1720,9.5251 +10.0000,10.0000,10.0000,10.2731,9.1595,9.5321 +10.0000,10.0000,10.0000,10.2476,9.1478,9.5390 +10.0000,10.0000,10.0000,10.2216,9.1370,9.5460 +10.0000,10.0000,10.0000,10.1951,9.1270,9.5530 +10.0000,10.0000,10.0000,10.1683,9.1179,9.5601 +10.0000,10.0000,10.0000,10.1410,9.1096,9.5671 +10.0000,10.0000,10.0000,10.1134,9.1023,9.5742 +10.0000,10.0000,10.0000,10.0855,9.0959,9.5813 +10.0000,10.0000,10.0000,10.0572,9.0904,9.5885 +10.0000,10.0000,10.0000,10.0287,9.0858,9.5957 +10.0000,10.0000,10.0000,10.0000,9.0822,9.6029 +10.0000,10.0000,10.0000,9.9711,9.0796,9.6101 +10.0000,10.0000,10.0000,9.9420,9.0779,9.6173 +10.0000,10.0000,10.0000,9.9128,9.0773,9.6246 +10.0000,10.0000,10.0000,9.8835,9.0776,9.6319 +10.0000,10.0000,10.0000,9.8541,9.0788,9.6392 +10.0000,10.0000,10.0000,9.8247,9.0811,9.6465 +10.0000,10.0000,10.0000,9.7953,9.0844,9.6539 +10.0000,10.0000,10.0000,9.7660,9.0887,9.6613 +10.0000,10.0000,10.0000,9.7368,9.0940,9.6687 +10.0000,10.0000,10.0000,9.7076,9.1002,9.6761 +10.0000,10.0000,10.0000,9.6787,9.1075,9.6835 +10.0000,10.0000,10.0000,9.6499,9.1157,9.6910 +10.0000,10.0000,10.0000,9.6213,9.1250,9.6985 +10.0000,10.0000,10.0000,9.5930,9.1352,9.7060 +10.0000,10.0000,10.0000,9.5650,9.1464,9.7135 +10.0000,10.0000,10.0000,9.5374,9.1585,9.7210 +10.0000,10.0000,10.0000,9.5101,9.1716,9.7286 +10.0000,10.0000,10.0000,9.4832,9.1856,9.7361 +10.0000,10.0000,10.0000,9.4567,9.2005,9.7437 +10.0000,10.0000,10.0000,9.4307,9.2164,9.7513 +10.0000,10.0000,10.0000,9.4052,9.2331,9.7589 +10.0000,10.0000,10.0000,9.3802,9.2508,9.7666 +10.0000,10.0000,10.0000,9.3558,9.2693,9.7742 +10.0000,10.0000,10.0000,9.3319,9.2886,9.7819 +10.0000,10.0000,10.0000,9.3087,9.3087,9.7895 +10.0000,10.0000,10.0000,9.2862,9.3297,9.7972 +10.0000,10.0000,10.0000,9.2643,9.3514,9.8049 +10.0000,10.0000,10.0000,9.2431,9.3739,9.8126 +10.0000,10.0000,10.0000,9.2227,9.3971,9.8203 +10.0000,10.0000,10.0000,9.2030,9.4210,9.8281 +10.0000,10.0000,10.0000,9.1841,9.4455,9.8358 +10.0000,10.0000,10.0000,9.1661,9.4708,9.8436 +10.0000,10.0000,10.0000,9.1488,9.4966,9.8513 +10.0000,10.0000,10.0000,9.1324,9.5231,9.8591 +10.0000,10.0000,10.0000,9.1169,9.5501,9.8669 +10.0000,10.0000,10.0000,9.1023,9.5776,9.8747 +10.0000,10.0000,10.0000,9.0886,9.6056,9.8825 +10.0000,10.0000,10.0000,9.0758,9.6341,9.8903 +10.0000,10.0000,10.0000,9.0640,9.6630,9.8981 +10.0000,10.0000,10.0000,9.0532,9.6924,9.9059 +10.0000,10.0000,10.0000,9.0433,9.7221,9.9137 +10.0000,10.0000,10.0000,9.0344,9.7521,9.9215 +10.0000,10.0000,10.0000,9.0265,9.7824,9.9294 +10.0000,10.0000,10.0000,9.0197,9.8130,9.9372 +10.0000,10.0000,10.0000,9.0138,9.8438,9.9451 +10.0000,10.0000,10.0000,9.0090,9.8748,9.9529 +10.0000,10.0000,10.0000,9.0052,9.9060,9.9607 +10.0000,10.0000,10.0000,9.0025,9.9372,9.9686 +10.0000,10.0000,10.0000,9.0008,9.9686,9.9764 +10.0000,10.0000,10.0000,9.0001,10.0000,9.9843 +10.0000,10.0000,10.0000,9.0005,10.0314,9.9921 +10.0000,10.0000,10.0000,9.0020,10.0628,10.0000 +10.0000,10.0000,10.0000,9.0045,10.0941,10.0079 +10.0000,10.0000,10.0000,9.0080,10.1253,10.0157 +10.0000,10.0000,10.0000,9.0126,10.1564,10.0236 +10.0000,10.0000,10.0000,9.0182,10.1873,10.0314 +10.0000,10.0000,10.0000,9.0248,10.2180,10.0393 +10.0000,10.0000,10.0000,9.0325,10.2484,10.0471 +10.0000,10.0000,10.0000,9.0412,10.2786,10.0550 +10.0000,10.0000,10.0000,9.0508,10.3084,10.0628 +10.0000,10.0000,10.0000,9.0615,10.3379,10.0706 +10.0000,10.0000,10.0000,9.0731,10.3670,10.0785 +10.0000,10.0000,10.0000,9.0857,10.3957,10.0863 +10.0000,10.0000,10.0000,9.0992,10.4239,10.0941 +10.0000,10.0000,10.0000,9.1136,10.4516,10.1019 +10.0000,10.0000,10.0000,9.1290,10.4788,10.1097 +10.0000,10.0000,10.0000,9.1452,10.5055,10.1175 +10.0000,10.0000,10.0000,9.1623,10.5316,10.1253 +10.0000,10.0000,10.0000,9.1803,10.5571,10.1331 +10.0000,10.0000,10.0000,9.1991,10.5819,10.1409 +10.0000,10.0000,10.0000,9.2186,10.6061,10.1487 +10.0000,10.0000,10.0000,9.2390,10.6296,10.1564 +10.0000,10.0000,10.0000,9.2601,10.6523,10.1642 +10.0000,10.0000,10.0000,9.2819,10.6744,10.1719 +10.0000,10.0000,10.0000,9.3044,10.6956,10.1797 +10.0000,10.0000,10.0000,9.3276,10.7161,10.1874 +10.0000,10.0000,10.0000,9.3514,10.7357,10.1951 +10.0000,10.0000,10.0000,9.3758,10.7545,10.2028 +10.0000,10.0000,10.0000,9.4008,10.7725,10.2105 +10.0000,10.0000,10.0000,9.4264,10.7895,10.2181 +10.0000,10.0000,10.0000,9.4524,10.8057,10.2258 +10.0000,10.0000,10.0000,9.4790,10.8210,10.2334 +10.0000,10.0000,10.0000,9.5060,10.8354,10.2411 +10.0000,10.0000,10.0000,9.5334,10.8488,10.2487 +10.0000,10.0000,10.0000,9.5612,10.8612,10.2563 +10.0000,10.0000,10.0000,9.5893,10.8728,10.2639 +10.0000,10.0000,10.0000,9.6178,10.8833,10.2714 +10.0000,10.0000,10.0000,9.6465,10.8929,10.2790 +10.0000,10.0000,10.0000,9.6755,10.9014,10.2865 +10.0000,10.0000,10.0000,9.7046,10.9090,10.2940 +10.0000,10.0000,10.0000,9.7340,10.9156,10.3015 +10.0000,10.0000,10.0000,9.7635,10.9212,10.3090 +10.0000,10.0000,10.0000,9.7931,10.9258,10.3165 +10.0000,10.0000,10.0000,9.8227,10.9293,10.3239 +10.0000,10.0000,10.0000,9.8524,10.9319,10.3313 +10.0000,10.0000,10.0000,9.8821,10.9335,10.3387 +10.0000,10.0000,10.0000,9.9117,10.9340,10.3461 +10.0000,10.0000,10.0000,9.9413,10.9336,10.3535 +10.0000,10.0000,10.0000,9.9707,10.9322,10.3608 +10.0000,10.0000,10.0000,10.0000,10.9298,10.3681 +10.0000,10.0000,10.0000,10.0291,10.9264,10.3754 +10.0000,10.0000,10.0000,10.0580,10.9221,10.3827 +10.0000,10.0000,10.0000,10.0867,10.9168,10.3899 +10.0000,10.0000,10.0000,10.1150,10.9105,10.3971 +10.0000,10.0000,10.0000,10.1431,10.9033,10.4043 +10.0000,10.0000,10.0000,10.1708,10.8953,10.4115 +10.0000,10.0000,10.0000,10.1981,10.8863,10.4187 +10.0000,10.0000,10.0000,10.2250,10.8764,10.4258 +10.0000,10.0000,10.0000,10.2515,10.8657,10.4329 +10.0000,10.0000,10.0000,10.2775,10.8541,10.4399 +10.0000,10.0000,10.0000,10.3030,10.8417,10.4470 +10.0000,10.0000,10.0000,10.3280,10.8284,10.4540 +10.0000,10.0000,10.0000,10.3524,10.8144,10.4610 +10.0000,10.0000,10.0000,10.3763,10.7997,10.4679 +10.0000,10.0000,10.0000,10.3995,10.7841,10.4749 +10.0000,10.0000,10.0000,10.4222,10.7679,10.4818 +10.0000,10.0000,10.0000,10.4441,10.7510,10.4886 +10.0000,10.0000,10.0000,10.4654,10.7334,10.4955 +10.0000,10.0000,10.0000,10.4860,10.7152,10.5023 +10.0000,10.0000,10.0000,10.5059,10.6964,10.5090 +10.0000,10.0000,10.0000,10.5251,10.6769,10.5158 +10.0000,10.0000,10.0000,10.5435,10.6570,10.5225 +10.0000,10.0000,10.0000,10.5611,10.6365,10.5292 +10.0000,10.0000,10.0000,10.5780,10.6155,10.5358 +10.0000,10.0000,10.0000,10.5940,10.5940,10.5424 +10.0000,10.0000,10.0000,10.6093,10.5721,10.5490 +10.0000,10.0000,10.0000,10.6237,10.5499,10.5556 +10.0000,10.0000,10.0000,10.6373,10.5272,10.5621 +10.0000,10.0000,10.0000,10.6500,10.5042,10.5686 +10.0000,10.0000,10.0000,10.6619,10.4809,10.5750 +10.0000,10.0000,10.0000,10.6729,10.4573,10.5814 +10.0000,10.0000,10.0000,10.6831,10.4335,10.5878 +10.0000,10.0000,10.0000,10.6924,10.4095,10.5941 +10.0000,10.0000,10.0000,10.7008,10.3852,10.6004 +10.0000,10.0000,10.0000,10.7083,10.3609,10.6067 +10.0000,10.0000,10.0000,10.7150,10.3364,10.6129 +10.0000,10.0000,10.0000,10.7207,10.3119,10.6191 +10.0000,10.0000,10.0000,10.7256,10.2873,10.6252 +10.0000,10.0000,10.0000,10.7296,10.2627,10.6314 +10.0000,10.0000,10.0000,10.7328,10.2381,10.6374 +10.0000,10.0000,10.0000,10.7351,10.2136,10.6435 +10.0000,10.0000,10.0000,10.7365,10.1891,10.6494 +10.0000,10.0000,10.0000,10.7371,10.1648,10.6554 +10.0000,10.0000,10.0000,10.7368,10.1406,10.6613 +10.0000,10.0000,10.0000,10.7357,10.1165,10.6672 +10.0000,10.0000,10.0000,10.7338,10.0927,10.6730 +10.0000,10.0000,10.0000,10.7311,10.0691,10.6788 +10.0000,10.0000,10.0000,10.7275,10.0458,10.6845 +10.0000,10.0000,10.0000,10.7232,10.0227,10.6903 +10.0000,10.0000,10.0000,10.7181,10.0000,10.6959 diff --git a/scripts/trajectories/full-circle-with-up-and-down-4s.csv b/scripts/trajectories/full-circle-with-up-and-down-4s.csv new file mode 100644 index 0000000000..31692f4673 --- /dev/null +++ b/scripts/trajectories/full-circle-with-up-and-down-4s.csv @@ -0,0 +1,800 @@ +0.9223,-0.0000,0.3863,-0.0119 +0.9223,-0.0000,0.3863,-0.0119 +0.9223,-0.0000,0.3863,-0.0119 +0.9223,-0.0000,0.3863,-0.0119 +0.9235,-0.0000,0.3828,-0.0240 +0.9235,-0.0000,0.3828,-0.0240 +0.9235,-0.0000,0.3828,-0.0240 +0.9235,-0.0000,0.3828,-0.0240 +0.9245,-0.0000,0.3794,-0.0363 +0.9245,-0.0000,0.3794,-0.0363 +0.9245,-0.0000,0.3794,-0.0363 +0.9245,-0.0000,0.3794,-0.0363 +0.9253,-0.0000,0.3760,-0.0486 +0.9253,-0.0000,0.3760,-0.0486 +0.9253,-0.0000,0.3760,-0.0486 +0.9253,-0.0000,0.3760,-0.0486 +0.9259,-0.0000,0.3727,-0.0611 +0.9259,-0.0000,0.3727,-0.0611 +0.9259,-0.0000,0.3727,-0.0611 +0.9259,-0.0000,0.3727,-0.0611 +0.9263,-0.0000,0.3695,-0.0737 +0.9263,-0.0000,0.3695,-0.0737 +0.9263,-0.0000,0.3695,-0.0737 +0.9263,-0.0000,0.3695,-0.0737 +0.9265,-0.0000,0.3663,-0.0865 +0.9265,-0.0000,0.3663,-0.0865 +0.9265,-0.0000,0.3663,-0.0865 +0.9265,-0.0000,0.3663,-0.0865 +0.9264,-0.0000,0.3632,-0.0993 +0.9264,-0.0000,0.3632,-0.0993 +0.9264,-0.0000,0.3632,-0.0993 +0.9264,-0.0000,0.3632,-0.0993 +0.9261,-0.0000,0.3602,-0.1122 +0.9261,-0.0000,0.3602,-0.1122 +0.9261,-0.0000,0.3602,-0.1122 +0.9261,-0.0000,0.3602,-0.1122 +0.9256,-0.0000,0.3572,-0.1252 +0.9256,-0.0000,0.3572,-0.1252 +0.9256,-0.0000,0.3572,-0.1252 +0.9256,-0.0000,0.3572,-0.1252 +0.9248,-0.0000,0.3543,-0.1383 +0.9248,-0.0000,0.3543,-0.1383 +0.9248,-0.0000,0.3543,-0.1383 +0.9248,-0.0000,0.3543,-0.1383 +0.9239,-0.0000,0.3515,-0.1515 +0.9239,-0.0000,0.3515,-0.1515 +0.9239,-0.0000,0.3515,-0.1515 +0.9239,-0.0000,0.3515,-0.1515 +0.9226,-0.0000,0.3487,-0.1648 +0.9226,-0.0000,0.3487,-0.1648 +0.9226,-0.0000,0.3487,-0.1648 +0.9226,-0.0000,0.3487,-0.1648 +0.9212,-0.0000,0.3460,-0.1781 +0.9212,-0.0000,0.3460,-0.1781 +0.9212,-0.0000,0.3460,-0.1781 +0.9212,-0.0000,0.3460,-0.1781 +0.9195,-0.0000,0.3433,-0.1914 +0.9195,-0.0000,0.3433,-0.1914 +0.9195,-0.0000,0.3433,-0.1914 +0.9195,-0.0000,0.3433,-0.1914 +0.9176,-0.0000,0.3407,-0.2049 +0.9176,-0.0000,0.3407,-0.2049 +0.9176,-0.0000,0.3407,-0.2049 +0.9176,-0.0000,0.3407,-0.2049 +0.9154,-0.0000,0.3382,-0.2183 +0.9154,-0.0000,0.3382,-0.2183 +0.9154,-0.0000,0.3382,-0.2183 +0.9154,-0.0000,0.3382,-0.2183 +0.9130,-0.0000,0.3357,-0.2319 +0.9130,-0.0000,0.3357,-0.2319 +0.9130,-0.0000,0.3357,-0.2319 +0.9130,-0.0000,0.3357,-0.2319 +0.9104,-0.0000,0.3332,-0.2454 +0.9104,-0.0000,0.3332,-0.2454 +0.9104,-0.0000,0.3332,-0.2454 +0.9104,-0.0000,0.3332,-0.2454 +0.9075,-0.0000,0.3308,-0.2590 +0.9075,-0.0000,0.3308,-0.2590 +0.9075,-0.0000,0.3308,-0.2590 +0.9075,-0.0000,0.3308,-0.2590 +0.9043,-0.0000,0.3285,-0.2726 +0.9043,-0.0000,0.3285,-0.2726 +0.9043,-0.0000,0.3285,-0.2726 +0.9043,-0.0000,0.3285,-0.2726 +0.9009,-0.0000,0.3262,-0.2862 +0.9009,-0.0000,0.3262,-0.2862 +0.9009,-0.0000,0.3262,-0.2862 +0.9009,-0.0000,0.3262,-0.2862 +0.8973,-0.0000,0.3240,-0.2998 +0.8973,-0.0000,0.3240,-0.2998 +0.8973,-0.0000,0.3240,-0.2998 +0.8973,-0.0000,0.3240,-0.2998 +0.8934,-0.0000,0.3218,-0.3134 +0.8934,-0.0000,0.3218,-0.3134 +0.8934,-0.0000,0.3218,-0.3134 +0.8934,-0.0000,0.3218,-0.3134 +0.8893,-0.0000,0.3197,-0.3271 +0.8893,-0.0000,0.3197,-0.3271 +0.8893,-0.0000,0.3197,-0.3271 +0.8893,-0.0000,0.3197,-0.3271 +0.8849,-0.0000,0.3176,-0.3407 +0.8849,-0.0000,0.3176,-0.3407 +0.8849,-0.0000,0.3176,-0.3407 +0.8849,-0.0000,0.3176,-0.3407 +0.8803,-0.0000,0.3156,-0.3543 +0.8803,-0.0000,0.3156,-0.3543 +0.8803,-0.0000,0.3156,-0.3543 +0.8803,-0.0000,0.3156,-0.3543 +0.8754,-0.0000,0.3136,-0.3678 +0.8754,-0.0000,0.3136,-0.3678 +0.8754,-0.0000,0.3136,-0.3678 +0.8754,-0.0000,0.3136,-0.3678 +0.8703,-0.0000,0.3116,-0.3814 +0.8703,-0.0000,0.3116,-0.3814 +0.8703,-0.0000,0.3116,-0.3814 +0.8703,-0.0000,0.3116,-0.3814 +0.8650,-0.0000,0.3097,-0.3949 +0.8650,-0.0000,0.3097,-0.3949 +0.8650,-0.0000,0.3097,-0.3949 +0.8650,-0.0000,0.3097,-0.3949 +0.8593,-0.0000,0.3079,-0.4083 +0.8593,-0.0000,0.3079,-0.4083 +0.8593,-0.0000,0.3079,-0.4083 +0.8593,-0.0000,0.3079,-0.4083 +0.8535,-0.0000,0.3061,-0.4217 +0.8535,-0.0000,0.3061,-0.4217 +0.8535,-0.0000,0.3061,-0.4217 +0.8535,-0.0000,0.3061,-0.4217 +0.8474,-0.0000,0.3043,-0.4351 +0.8474,-0.0000,0.3043,-0.4351 +0.8474,-0.0000,0.3043,-0.4351 +0.8474,-0.0000,0.3043,-0.4351 +0.8410,-0.0000,0.3026,-0.4484 +0.8410,-0.0000,0.3026,-0.4484 +0.8410,-0.0000,0.3026,-0.4484 +0.8410,-0.0000,0.3026,-0.4484 +0.8344,-0.0000,0.3010,-0.4617 +0.8344,-0.0000,0.3010,-0.4617 +0.8344,-0.0000,0.3010,-0.4617 +0.8344,-0.0000,0.3010,-0.4617 +0.8276,-0.0000,0.2993,-0.4748 +0.8276,-0.0000,0.2993,-0.4748 +0.8276,-0.0000,0.2993,-0.4748 +0.8276,-0.0000,0.2993,-0.4748 +0.8205,-0.0000,0.2978,-0.4879 +0.8205,-0.0000,0.2978,-0.4879 +0.8205,-0.0000,0.2978,-0.4879 +0.8205,-0.0000,0.2978,-0.4879 +0.8132,-0.0000,0.2962,-0.5010 +0.8132,-0.0000,0.2962,-0.5010 +0.8132,-0.0000,0.2962,-0.5010 +0.8132,-0.0000,0.2962,-0.5010 +0.8056,-0.0000,0.2947,-0.5139 +0.8056,-0.0000,0.2947,-0.5139 +0.8056,-0.0000,0.2947,-0.5139 +0.8056,-0.0000,0.2947,-0.5139 +0.7978,-0.0000,0.2932,-0.5267 +0.7978,-0.0000,0.2932,-0.5267 +0.7978,-0.0000,0.2932,-0.5267 +0.7978,-0.0000,0.2932,-0.5267 +0.7898,-0.0000,0.2918,-0.5395 +0.7898,-0.0000,0.2918,-0.5395 +0.7898,-0.0000,0.2918,-0.5395 +0.7898,-0.0000,0.2918,-0.5395 +0.7815,-0.0000,0.2904,-0.5521 +0.7815,-0.0000,0.2904,-0.5521 +0.7815,-0.0000,0.2904,-0.5521 +0.7815,-0.0000,0.2904,-0.5521 +0.7730,-0.0000,0.2891,-0.5647 +0.7730,-0.0000,0.2891,-0.5647 +0.7730,-0.0000,0.2891,-0.5647 +0.7730,-0.0000,0.2891,-0.5647 +0.7643,-0.0000,0.2878,-0.5771 +0.7643,-0.0000,0.2878,-0.5771 +0.7643,-0.0000,0.2878,-0.5771 +0.7643,-0.0000,0.2878,-0.5771 +0.7553,-0.0000,0.2865,-0.5894 +0.7553,-0.0000,0.2865,-0.5894 +0.7553,-0.0000,0.2865,-0.5894 +0.7553,-0.0000,0.2865,-0.5894 +0.7461,-0.0000,0.2853,-0.6016 +0.7461,-0.0000,0.2853,-0.6016 +0.7461,-0.0000,0.2853,-0.6016 +0.7461,-0.0000,0.2853,-0.6016 +0.7367,-0.0000,0.2841,-0.6136 +0.7367,-0.0000,0.2841,-0.6136 +0.7367,-0.0000,0.2841,-0.6136 +0.7367,-0.0000,0.2841,-0.6136 +0.7271,-0.0000,0.2830,-0.6255 +0.7271,-0.0000,0.2830,-0.6255 +0.7271,-0.0000,0.2830,-0.6255 +0.7271,-0.0000,0.2830,-0.6255 +0.7172,-0.0000,0.2819,-0.6373 +0.7172,-0.0000,0.2819,-0.6373 +0.7172,-0.0000,0.2819,-0.6373 +0.7172,-0.0000,0.2819,-0.6373 +0.7071,-0.0000,0.2808,-0.6490 +0.7071,-0.0000,0.2808,-0.6490 +0.7071,-0.0000,0.2808,-0.6490 +0.7071,-0.0000,0.2808,-0.6490 +0.6968,-0.0000,0.2798,-0.6604 +0.6968,-0.0000,0.2798,-0.6604 +0.6968,-0.0000,0.2798,-0.6604 +0.6968,-0.0000,0.2798,-0.6604 +0.6863,-0.0000,0.2788,-0.6718 +0.6863,-0.0000,0.2788,-0.6718 +0.6863,-0.0000,0.2788,-0.6718 +0.6863,-0.0000,0.2788,-0.6718 +0.6756,-0.0000,0.2779,-0.6829 +0.6756,-0.0000,0.2779,-0.6829 +0.6756,-0.0000,0.2779,-0.6829 +0.6756,-0.0000,0.2779,-0.6829 +0.6646,-0.0000,0.2769,-0.6940 +0.6646,-0.0000,0.2769,-0.6940 +0.6646,-0.0000,0.2769,-0.6940 +0.6646,-0.0000,0.2769,-0.6940 +0.6535,-0.0000,0.2761,-0.7048 +0.6535,-0.0000,0.2761,-0.7048 +0.6535,-0.0000,0.2761,-0.7048 +0.6535,-0.0000,0.2761,-0.7048 +0.6422,-0.0000,0.2752,-0.7155 +0.6422,-0.0000,0.2752,-0.7155 +0.6422,-0.0000,0.2752,-0.7155 +0.6422,-0.0000,0.2752,-0.7155 +0.6306,-0.0000,0.2744,-0.7260 +0.6306,-0.0000,0.2744,-0.7260 +0.6306,-0.0000,0.2744,-0.7260 +0.6306,-0.0000,0.2744,-0.7260 +0.6189,-0.0000,0.2737,-0.7363 +0.6189,-0.0000,0.2737,-0.7363 +0.6189,-0.0000,0.2737,-0.7363 +0.6189,-0.0000,0.2737,-0.7363 +0.6069,-0.0000,0.2730,-0.7464 +0.6069,-0.0000,0.2730,-0.7464 +0.6069,-0.0000,0.2730,-0.7464 +0.6069,-0.0000,0.2730,-0.7464 +0.5948,-0.0000,0.2723,-0.7563 +0.5948,-0.0000,0.2723,-0.7563 +0.5948,-0.0000,0.2723,-0.7563 +0.5948,-0.0000,0.2723,-0.7563 +0.5825,-0.0000,0.2716,-0.7661 +0.5825,-0.0000,0.2716,-0.7661 +0.5825,-0.0000,0.2716,-0.7661 +0.5825,-0.0000,0.2716,-0.7661 +0.5700,-0.0000,0.2710,-0.7756 +0.5700,-0.0000,0.2710,-0.7756 +0.5700,-0.0000,0.2710,-0.7756 +0.5700,-0.0000,0.2710,-0.7756 +0.5574,-0.0000,0.2705,-0.7850 +0.5574,-0.0000,0.2705,-0.7850 +0.5574,-0.0000,0.2705,-0.7850 +0.5574,-0.0000,0.2705,-0.7850 +0.5445,-0.0000,0.2700,-0.7941 +0.5445,-0.0000,0.2700,-0.7941 +0.5445,-0.0000,0.2700,-0.7941 +0.5445,-0.0000,0.2700,-0.7941 +0.5315,-0.0000,0.2695,-0.8030 +0.5315,-0.0000,0.2695,-0.8030 +0.5315,-0.0000,0.2695,-0.8030 +0.5315,-0.0000,0.2695,-0.8030 +0.5184,-0.0000,0.2691,-0.8117 +0.5184,-0.0000,0.2691,-0.8117 +0.5184,-0.0000,0.2691,-0.8117 +0.5184,-0.0000,0.2691,-0.8117 +0.5050,-0.0000,0.2687,-0.8202 +0.5050,-0.0000,0.2687,-0.8202 +0.5050,-0.0000,0.2687,-0.8202 +0.5050,-0.0000,0.2687,-0.8202 +0.4915,-0.0000,0.2684,-0.8285 +0.4915,-0.0000,0.2684,-0.8285 +0.4915,-0.0000,0.2684,-0.8285 +0.4915,-0.0000,0.2684,-0.8285 +0.4779,-0.0000,0.2682,-0.8365 +0.4779,-0.0000,0.2682,-0.8365 +0.4779,-0.0000,0.2682,-0.8365 +0.4779,-0.0000,0.2682,-0.8365 +0.4640,-0.0000,0.2680,-0.8443 +0.4640,-0.0000,0.2680,-0.8443 +0.4640,-0.0000,0.2680,-0.8443 +0.4640,-0.0000,0.2680,-0.8443 +0.4501,-0.0000,0.2678,-0.8519 +0.4501,-0.0000,0.2678,-0.8519 +0.4501,-0.0000,0.2678,-0.8519 +0.4501,-0.0000,0.2678,-0.8519 +0.4360,-0.0000,0.2677,-0.8592 +0.4360,-0.0000,0.2677,-0.8592 +0.4360,-0.0000,0.2677,-0.8592 +0.4360,-0.0000,0.2677,-0.8592 +0.4218,-0.0000,0.2677,-0.8663 +0.4218,-0.0000,0.2677,-0.8663 +0.4218,-0.0000,0.2677,-0.8663 +0.4218,-0.0000,0.2677,-0.8663 +0.4074,-0.0000,0.2677,-0.8731 +0.4074,-0.0000,0.2677,-0.8731 +0.4074,-0.0000,0.2677,-0.8731 +0.4074,-0.0000,0.2677,-0.8731 +0.3929,-0.0000,0.2678,-0.8797 +0.3929,-0.0000,0.2678,-0.8797 +0.3929,-0.0000,0.2678,-0.8797 +0.3929,-0.0000,0.2678,-0.8797 +0.3783,-0.0000,0.2680,-0.8860 +0.3783,-0.0000,0.2680,-0.8860 +0.3783,-0.0000,0.2680,-0.8860 +0.3783,-0.0000,0.2680,-0.8860 +0.3635,-0.0000,0.2683,-0.8921 +0.3635,-0.0000,0.2683,-0.8921 +0.3635,-0.0000,0.2683,-0.8921 +0.3635,-0.0000,0.2683,-0.8921 +0.3487,-0.0000,0.2687,-0.8979 +0.3487,-0.0000,0.2687,-0.8979 +0.3487,-0.0000,0.2687,-0.8979 +0.3487,-0.0000,0.2687,-0.8979 +0.3337,-0.0000,0.2692,-0.9034 +0.3337,-0.0000,0.2692,-0.9034 +0.3337,-0.0000,0.2692,-0.9034 +0.3337,-0.0000,0.2692,-0.9034 +0.3186,-0.0000,0.2698,-0.9087 +0.3186,-0.0000,0.2698,-0.9087 +0.3186,-0.0000,0.2698,-0.9087 +0.3186,-0.0000,0.2698,-0.9087 +0.3034,-0.0000,0.2705,-0.9136 +0.3034,-0.0000,0.2705,-0.9136 +0.3034,-0.0000,0.2705,-0.9136 +0.3034,-0.0000,0.2705,-0.9136 +0.2882,-0.0000,0.2714,-0.9183 +0.2882,-0.0000,0.2714,-0.9183 +0.2882,-0.0000,0.2714,-0.9183 +0.2882,-0.0000,0.2714,-0.9183 +0.2728,-0.0000,0.2725,-0.9227 +0.2728,-0.0000,0.2725,-0.9227 +0.2728,-0.0000,0.2725,-0.9227 +0.2728,-0.0000,0.2725,-0.9227 +0.2573,-0.0000,0.2738,-0.9267 +0.2573,-0.0000,0.2738,-0.9267 +0.2573,-0.0000,0.2738,-0.9267 +0.2573,-0.0000,0.2738,-0.9267 +0.2418,-0.0000,0.2753,-0.9305 +0.2418,-0.0000,0.2753,-0.9305 +0.2418,-0.0000,0.2753,-0.9305 +0.2418,-0.0000,0.2753,-0.9305 +0.2262,-0.0000,0.2771,-0.9339 +0.2262,-0.0000,0.2771,-0.9339 +0.2262,-0.0000,0.2771,-0.9339 +0.2262,-0.0000,0.2771,-0.9339 +0.2105,-0.0000,0.2792,-0.9369 +0.2105,-0.0000,0.2792,-0.9369 +0.2105,-0.0000,0.2792,-0.9369 +0.2105,-0.0000,0.2792,-0.9369 +0.1947,-0.0000,0.2818,-0.9395 +0.1947,-0.0000,0.2818,-0.9395 +0.1947,-0.0000,0.2818,-0.9395 +0.1947,-0.0000,0.2818,-0.9395 +0.1789,-0.0000,0.2848,-0.9417 +0.1789,-0.0000,0.2848,-0.9417 +0.1789,-0.0000,0.2848,-0.9417 +0.1789,-0.0000,0.2848,-0.9417 +0.1630,-0.0000,0.2886,-0.9435 +0.1630,-0.0000,0.2886,-0.9435 +0.1630,-0.0000,0.2886,-0.9435 +0.1630,-0.0000,0.2886,-0.9435 +0.1471,-0.0000,0.2933,-0.9446 +0.1471,-0.0000,0.2933,-0.9446 +0.1471,-0.0000,0.2933,-0.9446 +0.1471,-0.0000,0.2933,-0.9446 +0.1312,-0.0000,0.2991,-0.9452 +0.1312,-0.0000,0.2991,-0.9452 +0.1312,-0.0000,0.2991,-0.9452 +0.1312,-0.0000,0.2991,-0.9452 +0.1152,-0.0000,0.3067,-0.9448 +0.1152,-0.0000,0.3067,-0.9448 +0.1152,-0.0000,0.3067,-0.9448 +0.1152,-0.0000,0.3067,-0.9448 +0.0991,-0.0000,0.3167,-0.9433 +0.0991,-0.0000,0.3167,-0.9433 +0.0991,-0.0000,0.3167,-0.9433 +0.0991,-0.0000,0.3167,-0.9433 +0.0831,-0.0000,0.3307,-0.9401 +0.0831,-0.0000,0.3307,-0.9401 +0.0831,-0.0000,0.3307,-0.9401 +0.0831,-0.0000,0.3307,-0.9401 +0.0670,-0.0000,0.3514,-0.9338 +0.0670,-0.0000,0.3514,-0.9338 +0.0670,-0.0000,0.3514,-0.9338 +0.0670,-0.0000,0.3514,-0.9338 +0.0510,-0.0000,0.3848,-0.9216 +0.0510,-0.0000,0.3848,-0.9216 +0.0510,-0.0000,0.3848,-0.9216 +0.0510,-0.0000,0.3848,-0.9216 +0.0351,-0.0000,0.4473,-0.8937 +0.0351,-0.0000,0.4473,-0.8937 +0.0351,-0.0000,0.4473,-0.8937 +0.0351,-0.0000,0.4473,-0.8937 +0.0196,-0.0000,0.6000,-0.7997 +0.0196,-0.0000,0.6000,-0.7997 +0.0196,-0.0000,0.6000,-0.7997 +0.0196,-0.0000,0.6000,-0.7997 +0.0079,0.0000,1.0000,0.0001 +0.0079,0.0000,1.0000,0.0001 +0.0079,0.0000,1.0000,0.0001 +0.0079,0.0000,1.0000,0.0001 +0.0162,0.0000,0.2425,0.9700 +0.0162,0.0000,0.2425,0.9700 +0.0162,0.0000,0.2425,0.9700 +0.0162,0.0000,0.2425,0.9700 +0.0314,-0.0000,-0.0000,0.9995 +0.0314,-0.0000,-0.0000,0.9995 +0.0314,-0.0000,-0.0000,0.9995 +0.0314,-0.0000,-0.0000,0.9995 +0.0473,-0.0000,-0.0831,0.9954 +0.0473,-0.0000,-0.0831,0.9954 +0.0473,-0.0000,-0.0831,0.9954 +0.0473,-0.0000,-0.0831,0.9954 +0.0633,-0.0000,-0.1241,0.9902 +0.0633,-0.0000,-0.1241,0.9902 +0.0633,-0.0000,-0.1241,0.9902 +0.0633,-0.0000,-0.1241,0.9902 +0.0793,-0.0000,-0.1485,0.9857 +0.0793,-0.0000,-0.1485,0.9857 +0.0793,-0.0000,-0.1485,0.9857 +0.0793,-0.0000,-0.1485,0.9857 +0.0954,-0.0000,-0.1646,0.9817 +0.0954,-0.0000,-0.1646,0.9817 +0.0954,-0.0000,-0.1646,0.9817 +0.0954,-0.0000,-0.1646,0.9817 +0.1114,-0.0000,-0.1762,0.9780 +0.1114,-0.0000,-0.1762,0.9780 +0.1114,-0.0000,-0.1762,0.9780 +0.1114,-0.0000,-0.1762,0.9780 +0.1275,-0.0000,-0.1848,0.9745 +0.1275,-0.0000,-0.1848,0.9745 +0.1275,-0.0000,-0.1848,0.9745 +0.1275,-0.0000,-0.1848,0.9745 +0.1435,-0.0000,-0.1915,0.9709 +0.1435,-0.0000,-0.1915,0.9709 +0.1435,-0.0000,-0.1915,0.9709 +0.1435,-0.0000,-0.1915,0.9709 +0.1594,-0.0000,-0.1970,0.9674 +0.1594,-0.0000,-0.1970,0.9674 +0.1594,-0.0000,-0.1970,0.9674 +0.1594,-0.0000,-0.1970,0.9674 +0.1753,-0.0000,-0.2014,0.9637 +0.1753,-0.0000,-0.2014,0.9637 +0.1753,-0.0000,-0.2014,0.9637 +0.1753,-0.0000,-0.2014,0.9637 +0.1912,-0.0000,-0.2052,0.9599 +0.1912,-0.0000,-0.2052,0.9599 +0.1912,-0.0000,-0.2052,0.9599 +0.1912,-0.0000,-0.2052,0.9599 +0.2070,-0.0000,-0.2085,0.9559 +0.2070,-0.0000,-0.2085,0.9559 +0.2070,-0.0000,-0.2085,0.9559 +0.2070,-0.0000,-0.2085,0.9559 +0.2227,-0.0000,-0.2113,0.9517 +0.2227,-0.0000,-0.2113,0.9517 +0.2227,-0.0000,-0.2113,0.9517 +0.2227,-0.0000,-0.2113,0.9517 +0.2384,-0.0000,-0.2138,0.9473 +0.2384,-0.0000,-0.2138,0.9473 +0.2384,-0.0000,-0.2138,0.9473 +0.2384,-0.0000,-0.2138,0.9473 +0.2540,-0.0000,-0.2161,0.9428 +0.2540,-0.0000,-0.2161,0.9428 +0.2540,-0.0000,-0.2161,0.9428 +0.2540,-0.0000,-0.2161,0.9428 +0.2695,-0.0000,-0.2181,0.9380 +0.2695,-0.0000,-0.2181,0.9380 +0.2695,-0.0000,-0.2181,0.9380 +0.2695,-0.0000,-0.2181,0.9380 +0.2849,-0.0000,-0.2200,0.9330 +0.2849,-0.0000,-0.2200,0.9330 +0.2849,-0.0000,-0.2200,0.9330 +0.2849,-0.0000,-0.2200,0.9330 +0.3002,-0.0000,-0.2217,0.9277 +0.3002,-0.0000,-0.2217,0.9277 +0.3002,-0.0000,-0.2217,0.9277 +0.3002,-0.0000,-0.2217,0.9277 +0.3155,-0.0000,-0.2233,0.9223 +0.3155,-0.0000,-0.2233,0.9223 +0.3155,-0.0000,-0.2233,0.9223 +0.3155,-0.0000,-0.2233,0.9223 +0.3306,-0.0000,-0.2248,0.9166 +0.3306,-0.0000,-0.2248,0.9166 +0.3306,-0.0000,-0.2248,0.9166 +0.3306,-0.0000,-0.2248,0.9166 +0.3457,-0.0000,-0.2263,0.9107 +0.3457,-0.0000,-0.2263,0.9107 +0.3457,-0.0000,-0.2263,0.9107 +0.3457,-0.0000,-0.2263,0.9107 +0.3606,-0.0000,-0.2277,0.9045 +0.3606,-0.0000,-0.2277,0.9045 +0.3606,-0.0000,-0.2277,0.9045 +0.3606,-0.0000,-0.2277,0.9045 +0.3754,-0.0000,-0.2290,0.8981 +0.3754,-0.0000,-0.2290,0.8981 +0.3754,-0.0000,-0.2290,0.8981 +0.3754,-0.0000,-0.2290,0.8981 +0.3901,-0.0000,-0.2303,0.8915 +0.3901,-0.0000,-0.2303,0.8915 +0.3901,-0.0000,-0.2303,0.8915 +0.3901,-0.0000,-0.2303,0.8915 +0.4047,-0.0000,-0.2315,0.8847 +0.4047,-0.0000,-0.2315,0.8847 +0.4047,-0.0000,-0.2315,0.8847 +0.4047,-0.0000,-0.2315,0.8847 +0.4192,-0.0000,-0.2327,0.8776 +0.4192,-0.0000,-0.2327,0.8776 +0.4192,-0.0000,-0.2327,0.8776 +0.4192,-0.0000,-0.2327,0.8776 +0.4335,-0.0000,-0.2339,0.8703 +0.4335,-0.0000,-0.2339,0.8703 +0.4335,-0.0000,-0.2339,0.8703 +0.4335,-0.0000,-0.2339,0.8703 +0.4477,-0.0000,-0.2351,0.8627 +0.4477,-0.0000,-0.2351,0.8627 +0.4477,-0.0000,-0.2351,0.8627 +0.4477,-0.0000,-0.2351,0.8627 +0.4617,-0.0000,-0.2362,0.8550 +0.4617,-0.0000,-0.2362,0.8550 +0.4617,-0.0000,-0.2362,0.8550 +0.4617,-0.0000,-0.2362,0.8550 +0.4756,-0.0000,-0.2374,0.8470 +0.4756,-0.0000,-0.2374,0.8470 +0.4756,-0.0000,-0.2374,0.8470 +0.4756,-0.0000,-0.2374,0.8470 +0.4894,-0.0000,-0.2385,0.8388 +0.4894,-0.0000,-0.2385,0.8388 +0.4894,-0.0000,-0.2385,0.8388 +0.4894,-0.0000,-0.2385,0.8388 +0.5030,-0.0000,-0.2396,0.8304 +0.5030,-0.0000,-0.2396,0.8304 +0.5030,-0.0000,-0.2396,0.8304 +0.5030,-0.0000,-0.2396,0.8304 +0.5164,-0.0000,-0.2408,0.8218 +0.5164,-0.0000,-0.2408,0.8218 +0.5164,-0.0000,-0.2408,0.8218 +0.5164,-0.0000,-0.2408,0.8218 +0.5297,-0.0000,-0.2419,0.8130 +0.5297,-0.0000,-0.2419,0.8130 +0.5297,-0.0000,-0.2419,0.8130 +0.5297,-0.0000,-0.2419,0.8130 +0.5428,-0.0000,-0.2431,0.8039 +0.5428,-0.0000,-0.2431,0.8039 +0.5428,-0.0000,-0.2431,0.8039 +0.5428,-0.0000,-0.2431,0.8039 +0.5558,-0.0000,-0.2442,0.7947 +0.5558,-0.0000,-0.2442,0.7947 +0.5558,-0.0000,-0.2442,0.7947 +0.5558,-0.0000,-0.2442,0.7947 +0.5685,-0.0000,-0.2454,0.7852 +0.5685,-0.0000,-0.2454,0.7852 +0.5685,-0.0000,-0.2454,0.7852 +0.5685,-0.0000,-0.2454,0.7852 +0.5811,-0.0000,-0.2465,0.7756 +0.5811,-0.0000,-0.2465,0.7756 +0.5811,-0.0000,-0.2465,0.7756 +0.5811,-0.0000,-0.2465,0.7756 +0.5936,-0.0000,-0.2477,0.7657 +0.5936,-0.0000,-0.2477,0.7657 +0.5936,-0.0000,-0.2477,0.7657 +0.5936,-0.0000,-0.2477,0.7657 +0.6058,-0.0000,-0.2489,0.7557 +0.6058,-0.0000,-0.2489,0.7557 +0.6058,-0.0000,-0.2489,0.7557 +0.6058,-0.0000,-0.2489,0.7557 +0.6179,-0.0000,-0.2501,0.7455 +0.6179,-0.0000,-0.2501,0.7455 +0.6179,-0.0000,-0.2501,0.7455 +0.6179,-0.0000,-0.2501,0.7455 +0.6297,-0.0000,-0.2513,0.7351 +0.6297,-0.0000,-0.2513,0.7351 +0.6297,-0.0000,-0.2513,0.7351 +0.6297,-0.0000,-0.2513,0.7351 +0.6414,-0.0000,-0.2525,0.7245 +0.6414,-0.0000,-0.2525,0.7245 +0.6414,-0.0000,-0.2525,0.7245 +0.6414,-0.0000,-0.2525,0.7245 +0.6528,-0.0000,-0.2538,0.7137 +0.6528,-0.0000,-0.2538,0.7137 +0.6528,-0.0000,-0.2538,0.7137 +0.6528,-0.0000,-0.2538,0.7137 +0.6641,-0.0000,-0.2550,0.7028 +0.6641,-0.0000,-0.2550,0.7028 +0.6641,-0.0000,-0.2550,0.7028 +0.6641,-0.0000,-0.2550,0.7028 +0.6752,-0.0000,-0.2563,0.6917 +0.6752,-0.0000,-0.2563,0.6917 +0.6752,-0.0000,-0.2563,0.6917 +0.6752,-0.0000,-0.2563,0.6917 +0.6860,-0.0000,-0.2576,0.6804 +0.6860,-0.0000,-0.2576,0.6804 +0.6860,-0.0000,-0.2576,0.6804 +0.6860,-0.0000,-0.2576,0.6804 +0.6967,-0.0000,-0.2590,0.6690 +0.6967,-0.0000,-0.2590,0.6690 +0.6967,-0.0000,-0.2590,0.6690 +0.6967,-0.0000,-0.2590,0.6690 +0.7071,-0.0000,-0.2603,0.6575 +0.7071,-0.0000,-0.2603,0.6575 +0.7071,-0.0000,-0.2603,0.6575 +0.7071,-0.0000,-0.2603,0.6575 +0.7173,-0.0000,-0.2617,0.6457 +0.7173,-0.0000,-0.2617,0.6457 +0.7173,-0.0000,-0.2617,0.6457 +0.7173,-0.0000,-0.2617,0.6457 +0.7273,-0.0000,-0.2631,0.6339 +0.7273,-0.0000,-0.2631,0.6339 +0.7273,-0.0000,-0.2631,0.6339 +0.7273,-0.0000,-0.2631,0.6339 +0.7371,-0.0000,-0.2645,0.6219 +0.7371,-0.0000,-0.2645,0.6219 +0.7371,-0.0000,-0.2645,0.6219 +0.7371,-0.0000,-0.2645,0.6219 +0.7467,-0.0000,-0.2659,0.6097 +0.7467,-0.0000,-0.2659,0.6097 +0.7467,-0.0000,-0.2659,0.6097 +0.7467,-0.0000,-0.2659,0.6097 +0.7560,-0.0000,-0.2674,0.5974 +0.7560,-0.0000,-0.2674,0.5974 +0.7560,-0.0000,-0.2674,0.5974 +0.7560,-0.0000,-0.2674,0.5974 +0.7651,-0.0000,-0.2689,0.5851 +0.7651,-0.0000,-0.2689,0.5851 +0.7651,-0.0000,-0.2689,0.5851 +0.7651,-0.0000,-0.2689,0.5851 +0.7740,-0.0000,-0.2705,0.5725 +0.7740,-0.0000,-0.2705,0.5725 +0.7740,-0.0000,-0.2705,0.5725 +0.7740,-0.0000,-0.2705,0.5725 +0.7826,-0.0000,-0.2720,0.5599 +0.7826,-0.0000,-0.2720,0.5599 +0.7826,-0.0000,-0.2720,0.5599 +0.7826,-0.0000,-0.2720,0.5599 +0.7910,-0.0000,-0.2736,0.5472 +0.7910,-0.0000,-0.2736,0.5472 +0.7910,-0.0000,-0.2736,0.5472 +0.7910,-0.0000,-0.2736,0.5472 +0.7992,-0.0000,-0.2752,0.5343 +0.7992,-0.0000,-0.2752,0.5343 +0.7992,-0.0000,-0.2752,0.5343 +0.7992,-0.0000,-0.2752,0.5343 +0.8072,-0.0000,-0.2769,0.5214 +0.8072,-0.0000,-0.2769,0.5214 +0.8072,-0.0000,-0.2769,0.5214 +0.8072,-0.0000,-0.2769,0.5214 +0.8149,-0.0000,-0.2786,0.5083 +0.8149,-0.0000,-0.2786,0.5083 +0.8149,-0.0000,-0.2786,0.5083 +0.8149,-0.0000,-0.2786,0.5083 +0.8223,-0.0000,-0.2803,0.4952 +0.8223,-0.0000,-0.2803,0.4952 +0.8223,-0.0000,-0.2803,0.4952 +0.8223,-0.0000,-0.2803,0.4952 +0.8295,-0.0000,-0.2820,0.4820 +0.8295,-0.0000,-0.2820,0.4820 +0.8295,-0.0000,-0.2820,0.4820 +0.8295,-0.0000,-0.2820,0.4820 +0.8365,-0.0000,-0.2838,0.4687 +0.8365,-0.0000,-0.2838,0.4687 +0.8365,-0.0000,-0.2838,0.4687 +0.8365,-0.0000,-0.2838,0.4687 +0.8433,-0.0000,-0.2857,0.4553 +0.8433,-0.0000,-0.2857,0.4553 +0.8433,-0.0000,-0.2857,0.4553 +0.8433,-0.0000,-0.2857,0.4553 +0.8497,-0.0000,-0.2875,0.4419 +0.8497,-0.0000,-0.2875,0.4419 +0.8497,-0.0000,-0.2875,0.4419 +0.8497,-0.0000,-0.2875,0.4419 +0.8560,-0.0000,-0.2894,0.4284 +0.8560,-0.0000,-0.2894,0.4284 +0.8560,-0.0000,-0.2894,0.4284 +0.8560,-0.0000,-0.2894,0.4284 +0.8620,-0.0000,-0.2913,0.4148 +0.8620,-0.0000,-0.2913,0.4148 +0.8620,-0.0000,-0.2913,0.4148 +0.8620,-0.0000,-0.2913,0.4148 +0.8677,-0.0000,-0.2933,0.4012 +0.8677,-0.0000,-0.2933,0.4012 +0.8677,-0.0000,-0.2933,0.4012 +0.8677,-0.0000,-0.2933,0.4012 +0.8732,-0.0000,-0.2953,0.3876 +0.8732,-0.0000,-0.2953,0.3876 +0.8732,-0.0000,-0.2953,0.3876 +0.8732,-0.0000,-0.2953,0.3876 +0.8785,-0.0000,-0.2974,0.3739 +0.8785,-0.0000,-0.2974,0.3739 +0.8785,-0.0000,-0.2974,0.3739 +0.8785,-0.0000,-0.2974,0.3739 +0.8835,-0.0000,-0.2995,0.3602 +0.8835,-0.0000,-0.2995,0.3602 +0.8835,-0.0000,-0.2995,0.3602 +0.8835,-0.0000,-0.2995,0.3602 +0.8883,-0.0000,-0.3016,0.3465 +0.8883,-0.0000,-0.3016,0.3465 +0.8883,-0.0000,-0.3016,0.3465 +0.8883,-0.0000,-0.3016,0.3465 +0.8928,-0.0000,-0.3038,0.3327 +0.8928,-0.0000,-0.3038,0.3327 +0.8928,-0.0000,-0.3038,0.3327 +0.8928,-0.0000,-0.3038,0.3327 +0.8970,-0.0000,-0.3060,0.3189 +0.8970,-0.0000,-0.3060,0.3189 +0.8970,-0.0000,-0.3060,0.3189 +0.8970,-0.0000,-0.3060,0.3189 +0.9010,-0.0000,-0.3083,0.3051 +0.9010,-0.0000,-0.3083,0.3051 +0.9010,-0.0000,-0.3083,0.3051 +0.9010,-0.0000,-0.3083,0.3051 +0.9048,-0.0000,-0.3106,0.2913 +0.9048,-0.0000,-0.3106,0.2913 +0.9048,-0.0000,-0.3106,0.2913 +0.9048,-0.0000,-0.3106,0.2913 +0.9083,-0.0000,-0.3130,0.2776 +0.9083,-0.0000,-0.3130,0.2776 +0.9083,-0.0000,-0.3130,0.2776 +0.9083,-0.0000,-0.3130,0.2776 +0.9116,-0.0000,-0.3154,0.2638 +0.9116,-0.0000,-0.3154,0.2638 +0.9116,-0.0000,-0.3154,0.2638 +0.9116,-0.0000,-0.3154,0.2638 +0.9146,-0.0000,-0.3179,0.2500 +0.9146,-0.0000,-0.3179,0.2500 +0.9146,-0.0000,-0.3179,0.2500 +0.9146,-0.0000,-0.3179,0.2500 +0.9174,-0.0000,-0.3204,0.2363 +0.9174,-0.0000,-0.3204,0.2363 +0.9174,-0.0000,-0.3204,0.2363 +0.9174,-0.0000,-0.3204,0.2363 +0.9199,-0.0000,-0.3229,0.2226 +0.9199,-0.0000,-0.3229,0.2226 +0.9199,-0.0000,-0.3229,0.2226 +0.9199,-0.0000,-0.3229,0.2226 +0.9222,-0.0000,-0.3256,0.2089 +0.9222,-0.0000,-0.3256,0.2089 +0.9222,-0.0000,-0.3256,0.2089 +0.9222,-0.0000,-0.3256,0.2089 +0.9242,-0.0000,-0.3282,0.1952 +0.9242,-0.0000,-0.3282,0.1952 +0.9242,-0.0000,-0.3282,0.1952 +0.9242,-0.0000,-0.3282,0.1952 +0.9260,-0.0000,-0.3309,0.1817 +0.9260,-0.0000,-0.3309,0.1817 +0.9260,-0.0000,-0.3309,0.1817 +0.9260,-0.0000,-0.3309,0.1817 +0.9276,-0.0000,-0.3337,0.1681 +0.9276,-0.0000,-0.3337,0.1681 +0.9276,-0.0000,-0.3337,0.1681 +0.9276,-0.0000,-0.3337,0.1681 +0.9289,-0.0000,-0.3366,0.1546 +0.9289,-0.0000,-0.3366,0.1546 +0.9289,-0.0000,-0.3366,0.1546 +0.9289,-0.0000,-0.3366,0.1546 +0.9300,-0.0000,-0.3395,0.1412 +0.9300,-0.0000,-0.3395,0.1412 +0.9300,-0.0000,-0.3395,0.1412 +0.9300,-0.0000,-0.3395,0.1412 +0.9308,-0.0000,-0.3424,0.1279 +0.9308,-0.0000,-0.3424,0.1279 +0.9308,-0.0000,-0.3424,0.1279 +0.9308,-0.0000,-0.3424,0.1279 +0.9314,-0.0000,-0.3454,0.1146 +0.9314,-0.0000,-0.3454,0.1146 +0.9314,-0.0000,-0.3454,0.1146 +0.9314,-0.0000,-0.3454,0.1146 +0.9318,-0.0000,-0.3485,0.1015 +0.9318,-0.0000,-0.3485,0.1015 +0.9318,-0.0000,-0.3485,0.1015 +0.9318,-0.0000,-0.3485,0.1015 +0.9320,-0.0000,-0.3516,0.0884 +0.9320,-0.0000,-0.3516,0.0884 +0.9320,-0.0000,-0.3516,0.0884 +0.9320,-0.0000,-0.3516,0.0884 +0.9319,-0.0000,-0.3548,0.0754 +0.9319,-0.0000,-0.3548,0.0754 +0.9319,-0.0000,-0.3548,0.0754 +0.9319,-0.0000,-0.3548,0.0754 +0.9316,-0.0000,-0.3581,0.0625 +0.9316,-0.0000,-0.3581,0.0625 +0.9316,-0.0000,-0.3581,0.0625 +0.9316,-0.0000,-0.3581,0.0625 +0.9311,-0.0000,-0.3614,0.0498 +0.9311,-0.0000,-0.3614,0.0498 +0.9311,-0.0000,-0.3614,0.0498 +0.9311,-0.0000,-0.3614,0.0498 +0.9303,-0.0000,-0.3648,0.0371 +0.9303,-0.0000,-0.3648,0.0371 +0.9303,-0.0000,-0.3648,0.0371 +0.9303,-0.0000,-0.3648,0.0371 +0.9294,-0.0000,-0.3683,0.0246 +0.9294,-0.0000,-0.3683,0.0246 +0.9294,-0.0000,-0.3683,0.0246 +0.9294,-0.0000,-0.3683,0.0246 +0.9282,-0.0000,-0.3718,0.0122 +0.9282,-0.0000,-0.3718,0.0122 +0.9282,-0.0000,-0.3718,0.0122 +0.9282,-0.0000,-0.3718,0.0122 +0.9269,-0.0000,-0.3754,-0.0000 +0.9269,-0.0000,-0.3754,-0.0000 +0.9269,-0.0000,-0.3754,-0.0000 +0.9269,-0.0000,-0.3754,-0.0000 diff --git a/tests/renderer/test_renderer.py b/tests/renderer/test_renderer.py index 866d2eee2c..690f495c7f 100644 --- a/tests/renderer/test_renderer.py +++ b/tests/renderer/test_renderer.py @@ -26,12 +26,10 @@ the United Nations Convention on Contracts on the International Sales of Goods. """ - import pytest from .utils import * - """ Ambisonics """ @@ -58,6 +56,156 @@ def test_ambisonics_binaural_headrotation(test_info, in_fmt, out_fmt, trj_file): ) +# Test compares rendering with just a trajectory file against rendering with a trajectory file + a zero ref rotation. +# These should be binary equivalent. +@pytest.mark.parametrize("trj_file", HR_TRAJECTORIES_TO_TEST) +@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI) +def test_ambisonics_binaural_headrotation_refrotzero(test_info, in_fmt, out_fmt, trj_file): + compare_renderer_args( + test_info, + in_fmt, + out_fmt, + ref_kwargs={ + "name_extension": "refrotzero", + "trj_file": HR_TRAJECTORY_DIR.joinpath(f"{trj_file}.csv") + }, + cut_kwargs={ + "trj_file": HR_TRAJECTORY_DIR.joinpath(f"{trj_file}.csv"), + "refrot_file": HR_TRAJECTORY_DIR.joinpath("const000.csv") + } + ) + + +# Second test compares rendering with no head rotation against rendering with equal ref and head rotation. +# These should also be binary equivalent. +# Note that reference rotation is supplied per 4 subframes; head rotation per subframe. +@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI) +def test_ambisonics_binaural_headrotation_refrotequal(test_info, in_fmt, out_fmt): + compare_renderer_args( + test_info, + in_fmt, + out_fmt, + ref_kwargs={ + "name_extension": "refrotequal", + }, + cut_kwargs={ + "trj_file": HR_TRAJECTORY_DIR.joinpath("azi_plus_2-ele_plus_2-every-100-frames.csv"), + "refrot_file": HR_TRAJECTORY_DIR.joinpath("azi_plus_2-ele_plus_2-every-25-rows.csv") + } + ) + +# This test compares rendering with: +# ref: head rotation trajectory file (OTR=NONE) +# cut: identical head rotation trajectory file as ref but in addition a constant +# reference vector in the looking direction of the coordinate system (OTR=REF_VEC) +@pytest.mark.parametrize("trj_file", HR_TRAJECTORIES_TO_TEST) +@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI) +def test_ambisonics_binaural_headrotation_refveczero(test_info, in_fmt, out_fmt, trj_file): + compare_renderer_args( + test_info, + in_fmt, + out_fmt, + ref_kwargs={ + "name_extension": "refveczero", + "trj_file": HR_TRAJECTORY_DIR.joinpath(f"{trj_file}.csv") + }, + cut_kwargs={ + "trj_file": HR_TRAJECTORY_DIR.joinpath(f"{trj_file}.csv"), + "refvec_file": HR_TRAJECTORY_DIR.joinpath("const000-Vector3.csv") + } + ) + +# This test compares rendering with: +# ref: no head rotation (OTR=NONE) +# cut: rendering with head rotation and a ref vector which moves in the +# looking-direction of the head rotation and therefore compensates it (OTR=REF_VEC) +@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI) +def test_ambisonics_binaural_headrotation_refvecequal(test_info, in_fmt, out_fmt): + compare_renderer_args( + test_info, + in_fmt, + out_fmt, + ref_kwargs={ + "name_extension": "refvecequal", + }, + cut_kwargs={ + "trj_file": HR_TRAJECTORY_DIR.joinpath("full-circle-with-up-and-down-4s.csv"), + "refvec_file": HR_TRAJECTORY_DIR.joinpath("full-circle-with-up-and-down-4s-Vector3.csv") + } + ) + +# This test compares rendering with: +# ref: a head rotation trajectory with elevation (OTR=NONE) +# cut: a static head rotation and a reference position trajectory which moves +# in a way that produces the same acoustic output as the ref head rot trajectory (OTR=REF_VEC) +@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI) +def test_ambisonics_binaural_headrotation_refvec_rotating(test_info, in_fmt, out_fmt): + compare_renderer_args( + test_info, + in_fmt, + out_fmt, + ref_kwargs={ + "name_extension": "refvec_rotating", + "trj_file": HR_TRAJECTORY_DIR.joinpath("full-circle-with-up-and-down-4s.csv"), + }, + cut_kwargs={ + "trj_file": HR_TRAJECTORY_DIR.joinpath("const000.csv"), + "refvec_file": HR_TRAJECTORY_DIR.joinpath("full-circle-with-up-and-down-4s-ccw-Vector3.csv") + } + ) + +# This test compares rendering with: +# ref: a head rotation trajectory with elevation (OTR=NONE) +# cut: a static head rotation and a reference position trajectory which moves +# in a way that produces the same acoustic output as the ref head rot trajectory (OTR=REF_VEC) +# which also contains a fixed position offset between listener and reference position (which +# gets compensated in the REF_VEV OTR modes) +@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI) +def test_ambisonics_binaural_headrotation_refvec_rotating_fixed_pos_offset(test_info, in_fmt, out_fmt): + compare_renderer_args( + test_info, + in_fmt, + out_fmt, + ref_kwargs={ + "name_extension": "refvec_rotating", + "trj_file": HR_TRAJECTORY_DIR.joinpath("full-circle-with-up-and-down-4s-ccw.csv"), + }, + cut_kwargs={ + "trj_file": HR_TRAJECTORY_DIR.joinpath("const000.csv"), + "refvec_file": HR_TRAJECTORY_DIR.joinpath("full-circle-with-up-and-down-4s-fixed-pos-offset-Vector3.csv") + } + ) + +# This test compares rendering with: +# ref: a reference position trajectory with elevation and REF_VEC_LEV OTR mode (OTR=REF_VEC_LEV) +# cut: a reference position trajectory without the elevation and REF_VEC OTR mode (OTR=REF_VEC) +# Since the only difference between REF_VEC_LEV and REF_VEC is that *LEV ignores +# the height difference in positions, the output must be binary equivalent. +@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI) +def test_ambisonics_binaural_headrotation_refveclev_vs_refvec(test_info, in_fmt, out_fmt): + compare_renderer_args( + test_info, + in_fmt, + out_fmt, + ref_kwargs={ + "name_extension": "refveclevel", + "trj_file": HR_TRAJECTORY_DIR.joinpath("const000.csv"), + "refveclev_file": HR_TRAJECTORY_DIR.joinpath("full-circle-with-up-and-down-4s-Vector3.csv"), + }, + cut_kwargs={ + "trj_file": HR_TRAJECTORY_DIR.joinpath("const000.csv"), + "refvec_file": HR_TRAJECTORY_DIR.joinpath("full-circle-4s-Vector3.csv") + } + ) + + """ Multichannel """ @@ -96,6 +244,30 @@ def test_multichannel_binaural_headrotation(test_info, in_fmt, out_fmt, trj_file trj_file=HR_TRAJECTORY_DIR.joinpath(f"{trj_file}.csv"), ) +# This test compares rendering with: +# ref: a head rotation trajectory with elevation (OTR=NONE) +# cut: a static head rotation and a reference position trajectory which moves +# in a way that produces the same acoustic output as the ref head rot trajectory (OTR=REF_VEC) +@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_MC) +def test_multichannel_binaural_headrotation_refvec_rotating(test_info, in_fmt, out_fmt): + if in_fmt in ["MONO", "STEREO"]: + pytest.skip("MONO or STEREO to Binaural rendering unsupported") + + compare_renderer_args( + test_info, + in_fmt, + out_fmt, + ref_kwargs={ + "name_extension": "refvec_rotating", + "trj_file": HR_TRAJECTORY_DIR.joinpath("full-circle-with-up-and-down-4s.csv"), + }, + cut_kwargs={ + "trj_file": HR_TRAJECTORY_DIR.joinpath("const000.csv"), + "refvec_file": HR_TRAJECTORY_DIR.joinpath("full-circle-with-up-and-down-4s-ccw-Vector3.csv") + } + ) + """ ISM """ @@ -144,6 +316,33 @@ def test_ism_binaural_headrotation(test_info, in_fmt, out_fmt, trj_file): in_meta_files=in_meta_files, ) +# This test compares rendering with: +# ref: a head rotation trajectory with elevation (OTR=NONE) +# cut: a static head rotation and a reference position trajectory which moves +# in a way that produces the same acoustic output as the ref head rot trajectory (OTR=REF_VEC) +@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_ISM) +def test_ism_binaural_headrotation_refvec_rotating(test_info, in_fmt, out_fmt): + try: + in_meta_files = FORMAT_TO_METADATA_FILES[in_fmt] + except: + in_meta_files = None + + compare_renderer_args( + test_info, + in_fmt, + out_fmt, + ref_kwargs={ + "name_extension": "refvec_rotating", + "trj_file": HR_TRAJECTORY_DIR.joinpath("full-circle-with-up-and-down-4s.csv"), + "in_meta_files": in_meta_files + }, + cut_kwargs={ + "trj_file": HR_TRAJECTORY_DIR.joinpath("const000.csv"), + "refvec_file": HR_TRAJECTORY_DIR.joinpath("full-circle-with-up-and-down-4s-ccw-Vector3.csv"), + "in_meta_files": in_meta_files + } + ) """ MASA """ diff --git a/tests/renderer/utils.py b/tests/renderer/utils.py index 143c33b066..7a98dff300 100644 --- a/tests/renderer/utils.py +++ b/tests/renderer/utils.py @@ -31,12 +31,11 @@ import subprocess as sp import sys from pathlib import Path from tempfile import TemporaryDirectory -from typing import Optional, Tuple +from typing import Optional, Tuple, Dict import numpy as np import pytest - from .compare_audio import compare_audio_arrays from .constants import * @@ -106,6 +105,10 @@ def run_renderer( metadata_input: Optional[str] = None, in_meta_files: Optional[list] = None, trj_file: Optional[str] = None, + name_extension: Optional[str] = None, + refrot_file: Optional[str] = None, + refvec_file: Optional[str] = None, + refveclev_file: Optional[str] = None, output_path_base: str = OUTPUT_PATH_CUT, binary_suffix: str = "", is_comparetest: Optional[bool] = False, @@ -116,6 +119,23 @@ def run_renderer( else: trj_name = "" + if refrot_file is not None: + refrot_name = f"_{refrot_file.stem}" + else: + refrot_name = "" + + if refvec_file is not None: + refvec_name = f"_{refvec_file.stem}" + else: + refvec_name = "" + + if refveclev_file is not None: + refveclev_name = f"_{refveclev_file.stem}" + else: + refveclev_name = "" + + + if not isinstance(out_fmt, str): out_name = f"{out_fmt.stem}" else: @@ -136,7 +156,7 @@ def run_renderer( in_file = FORMAT_TO_FILE[in_fmt] in_name = in_fmt - out_file = str(output_path_base.joinpath(f"{in_name}_to_{out_name}{trj_name}.wav")) + out_file = str(output_path_base.joinpath(f"{in_name}_to_{out_name}{trj_name}{refrot_name}{refvec_name}{refveclev_name}{name_extension}.wav")) cmd = RENDERER_CMD[:] cmd[2] = str(in_file) @@ -152,6 +172,18 @@ def run_renderer( if trj_file is not None: cmd.extend(["-tf", str(trj_file)]) + if refrot_file is not None: + cmd.extend(["-rf", str(refrot_file)]) + cmd.extend(["-otr", "ref"]) + + if refvec_file is not None: + cmd.extend(["-rvf", str(refvec_file)]) + cmd.extend(["-otr", "ref_vec"]) + + if refveclev_file is not None: + cmd.extend(["-rvf", str(refveclev_file)]) + cmd.extend(["-otr", "ref_vec_lev"]) + run_cmd(cmd) return pyaudio3dtools.audiofile.readfile(out_file) @@ -222,3 +254,8 @@ def compare_renderer_vs_pyscripts(test_info, in_fmt, out_fmt, **kwargs): ref, ref_fs = run_pyscripts(in_fmt, out_fmt, **kwargs) cut, cut_fs = run_renderer(in_fmt, out_fmt, **kwargs) check_BE(test_info, ref, ref_fs, cut, cut_fs) + +def compare_renderer_args(test_info, in_fmt, out_fmt, ref_kwargs: Dict, cut_kwargs: Dict): + ref, ref_fs = run_renderer(in_fmt, out_fmt, **ref_kwargs) + cut, cut_fs = run_renderer(in_fmt, out_fmt, **cut_kwargs) + check_BE(test_info, ref, ref_fs, cut, cut_fs) \ No newline at end of file -- GitLab From 3e78c239db89c956cf410b83e2daee374cd021ee Mon Sep 17 00:00:00 2001 From: malenov Date: Tue, 28 Mar 2023 18:59:52 +0200 Subject: [PATCH 033/331] re-integrate IND_LIST_DYN --- lib_com/bitstream.c | 552 +++++++++++++++++++++++++- lib_com/cnst.h | 2 + lib_com/ivas_cnst.h | 6 +- lib_com/ivas_prot.h | 13 +- lib_com/options.h | 2 +- lib_com/prot.h | 35 ++ lib_enc/acelp_core_switch_enc.c | 17 + lib_enc/cng_enc.c | 8 + lib_enc/dtx.c | 8 +- lib_enc/enc_ppp.c | 9 +- lib_enc/eval_pit_contr.c | 8 + lib_enc/fd_cng_enc.c | 17 +- lib_enc/igf_enc.c | 82 ++++ lib_enc/init_enc.c | 16 + lib_enc/ivas_core_enc.c | 25 +- lib_enc/ivas_corecoder_enc_reconfig.c | 225 ++++++++++- lib_enc/ivas_cpe_enc.c | 26 +- lib_enc/ivas_init_enc.c | 68 +++- lib_enc/ivas_ism_dtx_enc.c | 17 +- lib_enc/ivas_ism_metadata_enc.c | 4 + lib_enc/ivas_lfe_enc.c | 31 ++ lib_enc/ivas_masa_enc.c | 33 ++ lib_enc/ivas_qmetadata_enc.c | 91 ++++- lib_enc/ivas_sce_enc.c | 25 +- lib_enc/ivas_spar_encoder.c | 6 +- lib_enc/ivas_spar_md_enc.c | 39 +- lib_enc/ivas_stereo_mdct_core_enc.c | 19 + lib_enc/lib_enc.c | 35 +- lib_enc/stat_enc.h | 18 +- lib_enc/tcx_utils_enc.c | 16 + 30 files changed, 1375 insertions(+), 78 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index e5f72590a6..c28c04112b 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -62,6 +62,11 @@ FILE *FEC_pattern = NULL; /* FEC pattern file (for simulation of FEC) */ #endif +#ifdef IND_LIST_DYN +#define STEP_MAX_NUM_INDICES 20 /* increase the maximum number of allowed indices in the list by this amount */ +#endif + +#ifndef IND_LIST_DYN /*-------------------------------------------------------------------* * pack_bit() * @@ -115,6 +120,7 @@ static Word16 unpack_bit( return bit; } +#endif /*-------------------------------------------------------------------* * rate2AMRWB_IOmode() @@ -214,6 +220,238 @@ Word16 rate2EVSmode( return rate2AMRWB_IOmode( brate ); } +#ifdef IND_LIST_DYN +/*-------------------------------------------------------------------* + * ind_list_realloc() + * + * Re-allocate the list of indices as the maximum number of allowed indices has changed + *-------------------------------------------------------------------*/ + +ivas_error ind_list_realloc( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + int16_t max_num_indices /* i : new maximum number of allowed indices in the list */ +) +{ + int16_t i; + INDICE_HANDLE new_ind_list; + + /* allocate new buffer of indices */ + if ( ( new_ind_list = (INDICE_HANDLE) malloc( max_num_indices * sizeof( Indice ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); + } + + /* move indices from the old list to the new list */ + i = 0; + while ( hBstr->ind_list[i].nb_bits > 0 ) + { + new_ind_list[i].id = hBstr->ind_list[i].id; + new_ind_list[i].value = hBstr->ind_list[i].value; + new_ind_list[i].nb_bits = hBstr->ind_list[i].nb_bits; + i++; + } + + /* reset nb_bits of all other indices to -1 */ + for ( ; i < max_num_indices; i++ ) + { + new_ind_list[i].nb_bits = -1; + } + + /* free the old list */ + free( hBstr->ind_list ); + + /* set pointer to the new list */ + hBstr->ind_list = new_ind_list; + + /* set the new maximum for the allowed number of indices */ + hBstr->max_num_indices = max_num_indices; + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------* + * get_max_num_indices() + * + * Set the maximum allowed number of indices in the list + *-----------------------------------------------------------------------*/ + +int16_t get_max_num_indices( /* o : maximum number of indices */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t total_brate /* i : total bitrate */ +) +{ + /* set the maximum required number of indices */ + if ( ivas_format == MONO_FORMAT ) + { + if ( total_brate < IVAS_24k4 ) + { + return 450; + } + else + { + return 450; + } + } + else if ( ivas_format == STEREO_FORMAT ) + { + if ( total_brate < IVAS_24k4 ) + { + return 250; + } + else if ( total_brate < IVAS_128k ) + { + return 450; + } + else + { + return 550; + } + } + else if ( ivas_format == ISM_FORMAT ) + { + if ( total_brate < IVAS_24k4 ) + { + return 250; + } + else if ( total_brate < IVAS_128k ) + { + return 450; + } + else + { + return 700; + } + } + else if ( ivas_format == SBA_FORMAT ) + { + if ( total_brate < IVAS_24k4 ) + { + return 250; + } + else if ( total_brate < IVAS_128k ) + { + return 450; + } + else + { + return 700; + } + } + else if ( ivas_format == MASA_FORMAT ) + { + if ( total_brate < IVAS_24k4 ) + { + return 250; + } + else if ( total_brate < IVAS_160k ) + { + return 450; + } + else + { + return 700; + } + } + else if ( ivas_format == MC_FORMAT ) + { + if ( total_brate < IVAS_24k4 ) + { + return 450; + } + else + { + return 1050; + } + } + + return 1050; +} + +#ifdef IND_LIST_DYN +/*-----------------------------------------------------------------------* + * set_max_set_max_num_indices_metadatanum_indices() + * + * Set the maximum allowed number of metadata indices in the list + *-----------------------------------------------------------------------*/ + +int16_t get_max_num_indices_metadata( /* o : maximum number of indices */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +) +{ + /* set the maximum required number of metadata indices */ + if ( ivas_format == MONO_FORMAT ) + { + return 0; + } + else if ( ivas_format == STEREO_FORMAT ) + { + return 80; + } + else if ( ivas_format == ISM_FORMAT ) + { + return 60; + } + else if ( ivas_format == SBA_FORMAT ) + { + if ( ivas_total_brate < IVAS_24k4 ) + { + return 80; + } + else if ( ivas_total_brate < IVAS_48k ) + { + return 670; + } + else + { + return 1060; + } + } + else if ( ivas_format == MASA_FORMAT ) + { + if ( ivas_total_brate < IVAS_32k ) + { + return 90; + } + else if ( ivas_total_brate < IVAS_48k ) + { + return 130; + } + else if ( ivas_total_brate < IVAS_192k ) + { + return 330; + } + else if ( ivas_total_brate < IVAS_384k ) + { + return 1000; + } + else + { + return 1950; + } + } + else if ( ivas_format == MC_FORMAT ) + { + if ( ivas_total_brate == IVAS_32k || ivas_total_brate == IVAS_48k || ivas_total_brate == IVAS_64k ) + { + return 300; + } + if ( ivas_total_brate == IVAS_80k || ivas_total_brate == IVAS_96k ) + { + return 170; + } + else + { + return 90; + } + } + + return 1050; +} +#endif +#endif + /*-------------------------------------------------------------------* * push_indice() * @@ -237,6 +475,9 @@ ivas_error push_indice( ) { int16_t i; +#ifdef IND_LIST_DYN + int16_t j; +#endif ivas_error error; error = IVAS_ERR_OK; @@ -263,12 +504,48 @@ ivas_error push_indice( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Indice ID = %d with value %d is trying to allocate %d bits which exceeds 16 bits (frame %d) !\n", id, value, nb_bits, frame ); } +#ifndef IND_LIST_DYN if ( id >= MAX_NUM_INDICES ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Indice ID = %d exceeds the total number of indices: %d (frame %d) !\n", id, MAX_NUM_INDICES, frame ); } #endif +#endif +#ifdef IND_LIST_DYN + /* check, if the maximum number of indices has been reached and re-allocate the buffer */ + /* the re-allocation can be avoided by increasing the limits in get_max_num_indices() and get_max_num_indices_metadata() */ + if ( hBstr->nb_ind_tot >= hBstr->max_num_indices ) + { +#ifdef DEBUGGING + DEBUG_LINE( 1 ) + printf( "Warning: Maximum number of indices %d has been exceeded (frame %d)! Increase the limits in get_max_num_indices() or get_max_num_indices_metadata().\n", hBstr->max_num_indices, frame ); +#endif + + /* reallocate the buffer of indices with increased limit */ + ind_list_realloc( hBstr, hBstr->nb_ind_tot + STEP_MAX_NUM_INDICES ); + } +#endif + +#ifdef IND_LIST_DYN + /* find the location in the list of indices */ + i = hBstr->nb_ind_tot; + while ( i > 0 && id < hBstr->ind_list[i - 1].id ) + { + i--; + } + + /* shift indices, if the new id is to be written somewhere inside the list */ + if ( i < hBstr->nb_ind_tot ) + { + for ( j = hBstr->nb_ind_tot; j > i; j-- ) + { + hBstr->ind_list[j].id = hBstr->ind_list[j - 1].id; + hBstr->ind_list[j].nb_bits = hBstr->ind_list[j - 1].nb_bits; + hBstr->ind_list[j].value = hBstr->ind_list[j - 1].value; + } + } +#else if ( hBstr->last_ind == id ) { /* indice with the same name as the previous one */ @@ -283,21 +560,31 @@ ivas_error push_indice( i++; } } +#endif +#ifndef IND_LIST_DYN #ifdef DEBUGGING if ( hBstr->ind_list[i].nb_bits > 0 ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Indice ID = %d with value %d is trying to re-write an existing indice (frame %d) !\n", id, value, frame ); } +#endif #endif /* store the new indice in the list */ +#ifdef IND_LIST_DYN + hBstr->ind_list[i].id = id; +#endif hBstr->ind_list[i].value = value; hBstr->ind_list[i].nb_bits = nb_bits; /* updates */ +#ifdef IND_LIST_DYN + hBstr->nb_ind_tot++; +#else hBstr->next_ind = i + 1; hBstr->last_ind = id; +#endif hBstr->nb_bits_tot += nb_bits; return error; @@ -324,6 +611,9 @@ ivas_error push_next_indice( #endif ) { +#ifdef IND_LIST_DYN + int16_t prev_id; +#endif ivas_error error; error = IVAS_ERR_OK; @@ -342,6 +632,7 @@ ivas_error push_next_indice( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Indice with value %d is trying to allocate %d bits which exceeds 16 bits !\n", value, nb_bits ); } +#ifndef IND_LIST_DYN if ( hBstr->next_ind >= MAX_NUM_INDICES ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Total number of indices exceeded: %d !\n", MAX_NUM_INDICES ); @@ -352,16 +643,54 @@ ivas_error push_next_indice( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Indice with value %d is trying to re-write an existing indice (frame %d) !\n", value, frame ); } #endif +#endif + +#ifdef IND_LIST_DYN + /* check, if the maximum number of indices has been reached and re-allocate the buffer */ + /* the re-allocation can be avoided by increasing the limits in get_max_num_indices() and get_max_num_indices_metadata() */ + if ( hBstr->nb_ind_tot >= hBstr->max_num_indices ) + { +#ifdef DEBUGGING + DEBUG_LINE( 1 ) + printf( "Warning: Maximum number of indices %d has been exceeded (frame %d)! Increase the limits in get_max_num_indices() or get_max_num_indices_metadata().\n", hBstr->max_num_indices, frame ); +#endif + + /* reallocate the buffer of indices with increased limit */ + ind_list_realloc( hBstr, hBstr->nb_ind_tot + STEP_MAX_NUM_INDICES ); + } +#endif + + +#ifdef IND_LIST_DYN + /* get the id of the previous indice -> it will be re-used */ + if ( hBstr->nb_ind_tot > 0 ) + { + prev_id = hBstr->ind_list[hBstr->nb_ind_tot - 1].id; + } + else + { + prev_id = 0; + } +#endif /* store the values in the list */ +#ifdef IND_LIST_DYN + hBstr->ind_list[hBstr->nb_ind_tot].id = prev_id; + hBstr->ind_list[hBstr->nb_ind_tot].value = value; + hBstr->ind_list[hBstr->nb_ind_tot].nb_bits = nb_bits; +#else hBstr->ind_list[hBstr->next_ind].value = value; hBstr->ind_list[hBstr->next_ind].nb_bits = nb_bits; - hBstr->next_ind++; +#endif - /* update the total number of bits already written */ + /* updates */ +#ifdef IND_LIST_DYN + hBstr->nb_ind_tot++; +#else + hBstr->next_ind++; +#endif hBstr->nb_bits_tot += nb_bits; - return error; } @@ -389,10 +718,28 @@ void push_next_bits( uint16_t code; int16_t i, nb_bits_m15; Indice *ptr; +#ifdef IND_LIST_DYN + int16_t prev_id; +#endif #ifdef DEBUG_BS_READ_WRITE printf( "%s: %d: %d\n", func, line, nb_bits ); #endif + +#ifdef IND_LIST_DYN + ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; + + /* get the id of the previous indice -> will be re-used here as well */ + if ( hBstr->nb_ind_tot > 0 ) + { + prev_id = hBstr->ind_list[hBstr->nb_ind_tot - 1].id; + } + else + { + prev_id = 0; + } +#else ptr = &hBstr->ind_list[hBstr->next_ind]; +#endif nb_bits_m15 = nb_bits - 15; for ( i = 0; i < nb_bits_m15; i += 16 ) @@ -404,8 +751,29 @@ void push_next_bits( printf( "code: %d\n", code ); #endif ptr->nb_bits = 16; +#ifdef IND_LIST_DYN + ptr->id = prev_id; + hBstr->nb_ind_tot++; +#endif + +#ifdef IND_LIST_DYN + /* check, if the maximum number of indices has been reached and re-allocate the buffer */ + /* the re-allocation can be avoided by increasing the limits in get_max_num_indices() and get_max_num_indices_metadata() */ + if ( hBstr->nb_ind_tot >= hBstr->max_num_indices ) + { +#ifdef DEBUGGING + DEBUG_LINE( 1 ) + printf( "Warning: Maximum number of indices %d has been exceeded (frame %d)! Increase the limits in get_max_num_indices() or get_max_num_indices_metadata().\n", hBstr->max_num_indices, frame ); +#endif + + /* reallocate the buffer of indices with increased limit */ + ind_list_realloc( hBstr, hBstr->nb_ind_tot + STEP_MAX_NUM_INDICES ); + } +#endif + ++ptr; } + for ( ; i < nb_bits; ++i ) { ptr->value = bits[i]; @@ -413,15 +781,118 @@ void push_next_bits( printf( "value: %d\n", ptr->value ); #endif ptr->nb_bits = 1; +#ifdef IND_LIST_DYN + ptr->id = prev_id; + hBstr->nb_ind_tot++; +#endif + +#ifdef IND_LIST_DYN + /* check, if the maximum number of indices has been reached and re-allocate the buffer */ + /* the re-allocation can be avoided by increasing the limits in get_max_num_indices() and get_max_num_indices_metadata() */ + if ( hBstr->nb_ind_tot >= hBstr->max_num_indices ) + { +#ifdef DEBUGGING + DEBUG_LINE( 1 ) + printf( "Warning: Maximum number of indices %d has been exceeded (frame %d)! Increase the limits in get_max_num_indices() or get_max_num_indices_metadata().\n", hBstr->max_num_indices, frame ); +#endif + + /* reallocate the buffer of indices with increased limit */ + ind_list_realloc( hBstr, hBstr->nb_ind_tot + STEP_MAX_NUM_INDICES ); + } +#endif + ++ptr; } + +#ifndef IND_LIST_DYN hBstr->next_ind = (int16_t) ( ptr - hBstr->ind_list ); +#endif hBstr->nb_bits_tot = hBstr->nb_bits_tot + nb_bits; return; } +#ifdef IND_LIST_DYN +/*-------------------------------------------------------------------* + * find_indice() + * + * Find indice based on its id + *-------------------------------------------------------------------*/ + +/*! r: result: index of the indice in the list, -1 if not found */ +int16_t find_indice( + BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ + int16_t id, /* i : ID of the indice */ + uint16_t *value, /* o : value of the quantized indice */ + int16_t *nb_bits /* o : number of bits used to quantize the indice */ +) +{ + int16_t i; + + for ( i = 0; i < hBstr->nb_ind_tot; i++ ) + { + if ( hBstr->ind_list[i].id == id && hBstr->ind_list[i].nb_bits > 0 ) + { + *value = hBstr->ind_list[i].value; + *nb_bits = hBstr->ind_list[i].nb_bits; + return i; + } + } + + return -1; +} + +/*-------------------------------------------------------------------* + * delete_indice() + * + * Delete indice based on its id (note, that nb_ind_tot and nb_bits_tot are updated) + *-------------------------------------------------------------------*/ + +/*! r: number of deleted indices */ +uint16_t delete_indice( + BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ + int16_t id /* i : ID of the indice */ +) +{ + int16_t i, j; + + j = 0; + for ( i = 0; i < hBstr->nb_ind_tot; i++ ) + { + if ( hBstr->ind_list[i].id == id ) + { + hBstr->nb_bits_tot -= hBstr->ind_list[i].nb_bits; + continue; + } + + if ( j < i ) + { + /* shift the indice left */ + hBstr->ind_list[j].id = hBstr->ind_list[i].id; + hBstr->ind_list[j].value = hBstr->ind_list[i].value; + hBstr->ind_list[j].nb_bits = hBstr->ind_list[i].nb_bits; + } + + j++; + } + + hBstr->nb_ind_tot = j; +#ifndef IND_LIST_DYN + hBstr->next_ind = j; +#endif + + for ( ; j < i; j++ ) + { + /* reset the shifted indices at the end of the list */ + hBstr->ind_list[j].nb_bits = -1; + } + + return i - j; +} +#endif + + /*-------------------------------------------------------------------* * get_next_indice() * @@ -638,8 +1109,14 @@ void reset_indices_enc( int16_t i; hBstr->nb_bits_tot = 0; +#ifdef IND_LIST_DYN + hBstr->nb_ind_tot = 0; +#else hBstr->next_ind = 0; +#endif +#ifndef IND_LIST_DYN hBstr->last_ind = -1; +#endif for ( i = 0; i < max_num_indices; i++ ) { @@ -670,7 +1147,11 @@ void reset_indices_dec( *-------------------------------------------------------------------*/ static int16_t write_indices_to_stream( +#ifdef IND_LIST_DYN + Indice *ind_list, +#else Indice *ind_list_metadata, +#endif uint16_t **pt_stream, const int16_t inc, const int16_t num_indices ) @@ -684,8 +1165,13 @@ static int16_t write_indices_to_stream( for ( i = 0; i < num_indices; i++ ) { +#ifdef IND_LIST_DYN + value = ind_list[i].value; + nb_bits = ind_list[i].nb_bits; +#else value = ind_list_metadata[i].value; nb_bits = ind_list_metadata[i].nb_bits; +#endif if ( nb_bits > 0 ) { @@ -717,6 +1203,10 @@ static int16_t write_indices_to_stream( { /* fprintf( stderr, "Warning: %s: nb_bits == 0!\n", __func__ ); */ } + else + { + /* fprintf( stderr, "Warning: %s: nb_bits == %d!\n", __func__, nb_bits ); */ + } #endif } #ifdef ENABLE_BITRATE_VERIFICATION @@ -745,6 +1235,10 @@ static ivas_error write_indices_element( uint16_t *pt_stream_backup; uint16_t *pt_stream_end; int16_t nb_bits_tot_metadata; +#ifdef IND_LIST_DYN + int16_t nb_ind_tot_metadata; +#endif + Indice *ind_list_metadata; int16_t n, n_channels; #ifdef ENABLE_BITRATE_VERIFICATION @@ -755,6 +1249,9 @@ static ivas_error write_indices_element( error = IVAS_ERR_OK; ind_list_metadata = NULL; +#ifdef IND_LIST_DYN + nb_ind_tot_metadata = 0; +#endif if ( st_ivas->hEncoderConfig->ivas_format == MONO_FORMAT ) { @@ -772,6 +1269,9 @@ static ivas_error write_indices_element( { nb_bits_tot_metadata = st_ivas->hSCE[element_id]->hMetaData->nb_bits_tot; ind_list_metadata = st_ivas->hSCE[element_id]->hMetaData->ind_list; +#ifdef IND_LIST_DYN + nb_ind_tot_metadata = st_ivas->hSCE[element_id]->hMetaData->nb_ind_tot; +#endif } } else if ( !is_SCE && st_ivas->hCPE[element_id] != NULL ) @@ -782,6 +1282,9 @@ static ivas_error write_indices_element( { nb_bits_tot_metadata = st_ivas->hCPE[element_id]->hMetaData->nb_bits_tot; ind_list_metadata = st_ivas->hCPE[element_id]->hMetaData->ind_list; +#ifdef IND_LIST_DYN + nb_ind_tot_metadata = st_ivas->hCPE[element_id]->hMetaData->nb_ind_tot; +#endif } } #ifdef DEBUGGING @@ -822,7 +1325,13 @@ static ivas_error write_indices_element( #ifdef ENABLE_BITRATE_VERIFICATION total_nb_bits = #endif - write_indices_to_stream( ind_list_metadata, &pt_stream_loc, -1, MAX_BITS_METADATA ); + write_indices_to_stream( ind_list_metadata, &pt_stream_loc, -1, +#ifdef IND_LIST_DYN + nb_ind_tot_metadata +#else + MAX_BITS_METADATA +#endif + ); #ifdef ENABLE_BITRATE_VERIFICATION if ( total_nb_bits != nb_bits_tot_metadata ) @@ -842,7 +1351,13 @@ static ivas_error write_indices_element( #ifdef ENABLE_BITRATE_VERIFICATION total_nb_bits = #endif - write_indices_to_stream( sts[n]->hBstr->ind_list, &pt_stream_loc, 1, MAX_NUM_INDICES ); + write_indices_to_stream( sts[n]->hBstr->ind_list, &pt_stream_loc, 1, +#ifdef IND_LIST_DYN + sts[n]->hBstr->nb_ind_tot +#else + MAX_NUM_INDICES +#endif + ); #ifdef ENABLE_BITRATE_VERIFICATION if ( total_nb_bits != sts[n]->hBstr->nb_bits_tot ) @@ -865,21 +1380,41 @@ static ivas_error write_indices_element( { if ( st_ivas->hSCE[element_id]->hMetaData != NULL ) { +#ifdef IND_LIST_DYN + reset_indices_enc( st_ivas->hSCE[element_id]->hMetaData, st_ivas->hSCE[element_id]->hMetaData->max_num_indices ); +#else reset_indices_enc( st_ivas->hSCE[element_id]->hMetaData, MAX_BITS_METADATA ); +#endif } - reset_indices_enc( sts[0]->hBstr, MAX_NUM_INDICES ); + reset_indices_enc( sts[0]->hBstr, +#ifdef IND_LIST_DYN + sts[0]->hBstr->max_num_indices +#else + MAX_NUM_INDICES +#endif + ); } else { if ( st_ivas->hCPE[element_id]->hMetaData != NULL ) { +#ifdef IND_LIST_DYN + reset_indices_enc( st_ivas->hCPE[element_id]->hMetaData, st_ivas->hCPE[element_id]->hMetaData->max_num_indices ); +#else reset_indices_enc( st_ivas->hCPE[element_id]->hMetaData, MAX_BITS_METADATA ); +#endif } for ( n = 0; n < n_channels; n++ ) { - reset_indices_enc( sts[n]->hBstr, MAX_NUM_INDICES ); + reset_indices_enc( sts[n]->hBstr, +#ifdef IND_LIST_DYN + sts[n]->hBstr->max_num_indices +#else + MAX_NUM_INDICES +#endif + ); } } @@ -975,7 +1510,7 @@ ivas_error write_indices_ivas( return error; } - +#ifndef IND_LIST_DYN /*-------------------------------------------------------------------* * indices_to_serial_generic() * @@ -1025,6 +1560,7 @@ void indices_to_serial_generic( return; } +#endif /*---------------------------------------------------------------------* * convertSerialToBytestream( ) diff --git a/lib_com/cnst.h b/lib_com/cnst.h index db1dc3d898..4f03276837 100644 --- a/lib_com/cnst.h +++ b/lib_com/cnst.h @@ -449,7 +449,9 @@ enum IND_STEREO_2ND_CODER_T, IND_UNUSED, +#ifndef IND_LIST_DYN MAX_NUM_INDICES = IND_UNUSED + 772 /* Total 2640 in line with MAX_BITS_METADATA */ +#endif }; /*----------------------------------------------------------------------------------* diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 3f48b0b43e..b3a022b8cd 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -176,8 +176,12 @@ typedef enum #define MAX_CPE ( MAX_TRANSPORT_CHANNELS / CPE_CHANNELS ) /* max. number of CPEs */ #define MAX_BITS_METADATA 2640 /* max. bit-budget of metadata, one channel */ /* IVAS_fmToDo: to be confirmed for final value once mature */ +#ifndef IND_LIST_DYN #define MAX_NUM_METADATA max( 2, MAX_NUM_OBJECTS ) /* number of max. metadata (now only 2 for DirAC) */ - +#endif +#ifdef IND_LIST_DYN +#define MAX_NUM_IND_TEMP_LIST 10 /* maximum number of indices in the temporary list */ +#endif #define IVAS_ENC_DELAY_NS ACELP_LOOK_NS #define IVAS_DEC_DELAY_NS 3250000L /* 3.25 ms: IVAS decoder delay (without renderer delay) */ diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index e8597bbf3c..9184997dea 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -262,9 +262,11 @@ void ivas_initialize_handles_enc( ); ivas_error ivas_init_encoder( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - Indice ind_list[][MAX_NUM_INDICES], /* i : indices list */ - Indice ind_list_metadata[][MAX_BITS_METADATA] /* i : indices list metadata */ + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +#ifndef IND_LIST_DYN + ,Indice ind_list[][MAX_NUM_INDICES] /* i : indices list */ + ,Indice ind_list_metadata[][MAX_BITS_METADATA] /* i : indices list metadata */ +#endif ); void destroy_core_enc( @@ -2092,6 +2094,9 @@ void InternalTCXDecoder( void stereo_mdct_core_enc( CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ +#ifdef IND_LIST_DYN + const int16_t ivas_format, /* i : IVAS format */ +#endif float new_samples[CPE_CHANNELS][L_INP], /* i : new samples */ float old_wsp[CPE_CHANNELS][L_WSP], /* i : 12.8kHz weighted speech (for LTP */ float pitch_buf[CPE_CHANNELS][NB_SUBFR16k] /* o : floating pitch for each subframe */ @@ -3037,7 +3042,9 @@ void ivas_qmetadata_close( void restore_metadata_buffer( BSTR_ENC_HANDLE hMetaData, const int16_t next_ind_start, +#ifndef IND_LIST_DYN const int16_t last_ind_start, +#endif const int16_t bit_pos_start ); diff --git a/lib_com/options.h b/lib_com/options.h index c054a9b5a7..4d935aa8af 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -132,7 +132,7 @@ /* ################# Start DEVELOPMENT switches ######################## */ #define BASOP_NOGLOB /* Disable global symbols in BASOPs, Overflow/Carry in BASOPs disabled, additional BASOPs in case of Overflow */ -#define BITSTREAM_INDICES_MEMORY /* Don't count memory for bitstream Indice at the encoder - it is a temporary solution for development only */ +#define IND_LIST_DYN /* VA: Issue 18: Dynamic allocation of ind_list[] and ind_list_metadata[] based on # of transport channels */ #define LSF_RE_USE_SECONDARY_CHANNEL /* TD stereo Secondary channel LSF Q improvement */ #ifdef LSF_RE_USE_SECONDARY_CHANNEL diff --git a/lib_com/prot.h b/lib_com/prot.h index c8f69fe832..72b29413c8 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -515,6 +515,35 @@ void push_next_bits( #endif ); +#ifdef IND_LIST_DYN +int16_t get_max_num_indices( /* o : maximum number of indices */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t total_brate /* i : total bitrate */ +); + +int16_t get_max_num_indices_metadata( /* o : maximum number of indices */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +); + +ivas_error ind_list_realloc( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + int16_t max_num_indices /* i : new maximum number of allowed indices in the list */ +); + +int16_t find_indice( /* o : index of the indice in the list, -1 if not found */ + BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ + int16_t id, /* i : ID of the indice */ + uint16_t *value, /* o : value of the quantized indice */ + int16_t *nb_bits /* o : number of bits used to quantize the indice */ +); + +uint16_t delete_indice( /* o : number of deleted indices */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + int16_t id /* i : ID of the indice */ +); +#endif + /*! r: value of the indice */ #ifdef DEBUG_BS_READ_WRITE #define get_next_indice( ... ) get_next_indice_( __VA_ARGS__, __LINE__, __func__ ) @@ -613,12 +642,14 @@ Decoder_State **reset_elements( ); +#ifndef IND_LIST_DYN void indices_to_serial_generic( const Indice *ind_list, /* i : indices list */ const Word16 num_indices, /* i : number of indices to write */ UWord8 *pFrame, /* o : byte array with bit packet and byte aligned coded speech data */ Word16 *pFrame_size /* o : size of the binary encoded access unit [bits] */ ); +#endif void convertSerialToBytestream( const uint16_t *const serial, /* i : input serial bitstream with values 0 and 1 */ @@ -2223,8 +2254,12 @@ void read_next_force( int32_t *force_profile_cnt /* i/o: counter of frames for force switching profile file */ ); #endif + ivas_error init_encoder( Encoder_State *st, /* i/o: state structure */ +#ifdef IND_LIST_DYN + ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : encoder configuration handle */ +#endif const int16_t idchan, /* i : channel ID */ const int16_t var_SID_rate_flag, /* i : flag for variable SID update rate */ const int16_t interval_SID, /* i : interval for SID update */ diff --git a/lib_enc/acelp_core_switch_enc.c b/lib_enc/acelp_core_switch_enc.c index 291c2128a1..1a3488d92d 100644 --- a/lib_enc/acelp_core_switch_enc.c +++ b/lib_enc/acelp_core_switch_enc.c @@ -73,6 +73,10 @@ void acelp_core_switch_enc( const float *inp; int32_t cbrate; float Aq[2 * ( M + 1 )]; +#ifdef IND_LIST_DYN + uint16_t value; + int16_t nb_bits; +#endif BSTR_ENC_HANDLE hBstr = st->hBstr; /* initializations */ @@ -159,12 +163,25 @@ void acelp_core_switch_enc( * Manipulate ACELP subframe indices (move them to their proper place) *----------------------------------------------------------------*/ +#ifdef IND_LIST_DYN + i = find_indice( hBstr, TAG_ACELP_SUBFR_LOOP_START, &value, &nb_bits ); +#ifdef DEBUGGING + assert( i >= 0 && "Internal error in ACELP core switching - unable to find ACELP subframe indices!" ); +#endif + while ( hBstr->ind_list[i].id == TAG_ACELP_SUBFR_LOOP_START ) + { + push_indice( hBstr, IND_CORE_SWITCHING_CELP_SUBFRAME, hBstr->ind_list[i].value, hBstr->ind_list[i].nb_bits ); + i++; + } + delete_indice( hBstr, TAG_ACELP_SUBFR_LOOP_START ); +#else for ( i = 0; i < 20; i++ ) { hBstr->ind_list[IND_CORE_SWITCHING_CELP_SUBFRAME + i].value = hBstr->ind_list[TAG_ACELP_SUBFR_LOOP_START + i].value; hBstr->ind_list[IND_CORE_SWITCHING_CELP_SUBFRAME + i].nb_bits = hBstr->ind_list[TAG_ACELP_SUBFR_LOOP_START + i].nb_bits; hBstr->ind_list[TAG_ACELP_SUBFR_LOOP_START + i].nb_bits = -1; } +#endif /*----------------------------------------------------------------* * BWE encoding diff --git a/lib_enc/cng_enc.c b/lib_enc/cng_enc.c index 04d9e41166..0f17b82923 100644 --- a/lib_enc/cng_enc.c +++ b/lib_enc/cng_enc.c @@ -885,8 +885,12 @@ void swb_CNG_enc( else if ( st->element_mode == IVAS_CPE_DFT && st->core_brate == SID_2k40 ) { /* LF-boost not used in DFT-stereo, instead the bandwidth is transmitted */ +#ifdef IND_LIST_DYN + delete_indice( st->hBstr, IND_CNG_ENV1 ); +#else st->hBstr->nb_bits_tot = st->hBstr->nb_bits_tot - st->hBstr->ind_list[IND_CNG_ENV1].nb_bits; st->hBstr->ind_list[IND_CNG_ENV1].nb_bits = -1; +#endif push_indice( st->hBstr, IND_BWIDTH, st->bwidth, 2 ); push_indice( st->hBstr, IND_UNUSED, 0, 4 ); push_indice( st->hBstr, IND_SID_BW, 1, 1 ); @@ -962,8 +966,12 @@ static void shb_CNG_encod( push_indice( hBstr, IND_SHB_CNG_GAIN, idx_ener, 4 ); push_indice( hBstr, IND_SID_BW, 1, 1 ); +#ifdef IND_LIST_DYN + delete_indice( hBstr, IND_CNG_ENV1 ); +#else hBstr->nb_bits_tot = hBstr->nb_bits_tot - hBstr->ind_list[IND_CNG_ENV1].nb_bits; hBstr->ind_list[IND_CNG_ENV1].nb_bits = -1; +#endif if ( st->element_mode == IVAS_CPE_DFT ) { push_indice( st->hBstr, IND_BWIDTH, st->bwidth, 2 ); diff --git a/lib_enc/dtx.c b/lib_enc/dtx.c index c99a8faf28..9656f96eb6 100644 --- a/lib_enc/dtx.c +++ b/lib_enc/dtx.c @@ -259,7 +259,13 @@ void dtx( /* reset the bitstream (IVAS format signaling was already written) */ if ( st->element_mode != IVAS_CPE_MDCT && st->hBstr != NULL ) { - reset_indices_enc( st->hBstr, MAX_NUM_INDICES ); + reset_indices_enc( st->hBstr, +#ifdef IND_LIST_DYN + st->hBstr->max_num_indices +#else + MAX_NUM_INDICES +#endif + ); } } diff --git a/lib_enc/enc_ppp.c b/lib_enc/enc_ppp.c index 823d6cf3cd..462557035f 100644 --- a/lib_enc/enc_ppp.c +++ b/lib_enc/enc_ppp.c @@ -169,7 +169,14 @@ ivas_error encod_ppp( } /* delete previous indices */ - reset_indices_enc( hBstr, MAX_NUM_INDICES ); + reset_indices_enc( hBstr, +#ifdef IND_LIST_DYN + hBstr->max_num_indices +#else + MAX_NUM_INDICES +#endif + ); + /* signaling matrix (writing of signaling bits) */ signaling_enc( st ); diff --git a/lib_enc/eval_pit_contr.c b/lib_enc/eval_pit_contr.c index 5dd3101772..76bf54b025 100644 --- a/lib_enc/eval_pit_contr.c +++ b/lib_enc/eval_pit_contr.c @@ -326,18 +326,26 @@ int16_t Pit_exc_contribution_len( /* pitch contribution useless - delete all previously written indices belonging to pitch contribution */ for ( i = TAG_ACELP_SUBFR_LOOP_START; i < TAG_ACELP_SUBFR_LOOP_END; i++ ) { +#ifdef IND_LIST_DYN + delete_indice( hBstr, i ); +#else if ( hBstr->ind_list[i].nb_bits != -1 ) { hBstr->nb_bits_tot -= hBstr->ind_list[i].nb_bits; hBstr->ind_list[i].nb_bits = -1; } +#endif } +#ifdef IND_LIST_DYN + delete_indice( hBstr, IND_ES_PRED ); +#else if ( hBstr->ind_list[IND_ES_PRED].nb_bits != -1 ) { hBstr->nb_bits_tot -= hBstr->ind_list[IND_ES_PRED].nb_bits; hBstr->ind_list[IND_ES_PRED].nb_bits = -1; } +#endif } if ( st->core_brate < CFREQ_BITRATE ) diff --git a/lib_enc/fd_cng_enc.c b/lib_enc/fd_cng_enc.c index e43b65d56a..2f38de3955 100644 --- a/lib_enc/fd_cng_enc.c +++ b/lib_enc/fd_cng_enc.c @@ -895,8 +895,21 @@ void stereoFdCngCoherence( else if ( sts[0]->core_brate <= SID_2k40 && sts[1]->core_brate <= SID_2k40 ) { /* case: no VAD for both channels -> INACTIVE FRAME */ - reset_indices_enc( sts[0]->hBstr, MAX_NUM_INDICES ); - reset_indices_enc( sts[1]->hBstr, MAX_NUM_INDICES ); + reset_indices_enc( sts[0]->hBstr, +#ifdef IND_LIST_DYN + sts[0]->hBstr->max_num_indices +#else + MAX_NUM_INDICES +#endif + ); + + reset_indices_enc( sts[1]->hBstr, +#ifdef IND_LIST_DYN + sts[1]->hBstr->max_num_indices +#else + MAX_NUM_INDICES +#endif + ); /* synchronize SID sending for variable SID rate */ if ( sts[0]->core_brate != sts[1]->core_brate ) diff --git a/lib_enc/igf_enc.c b/lib_enc/igf_enc.c index 9c68e3fcc7..677bc1639e 100644 --- a/lib_enc/igf_enc.c +++ b/lib_enc/igf_enc.c @@ -1707,6 +1707,41 @@ void IGFEncSetMode( return; } +#ifdef IND_LIST_DYN + +/*-------------------------------------------------------------------* + * pack_bit() + * + * insert a bit into packed octet + *-------------------------------------------------------------------*/ + +static void pack_bit( + const int16_t bit, /* i : bit to be packed */ + uint8_t **pt, /* i/o: pointer to octet array into which bit will be placed */ + uint8_t *omask /* i/o: output mask to indicate where in the octet the bit is to be written */ +) +{ + if ( *omask == 0x80 ) + { + **pt = 0; + } + + if ( bit != 0 ) + { + **pt = **pt | *omask; + } + + *omask >>= 1; + if ( *omask == 0 ) + { + *omask = 0x80; + ( *pt )++; + } + + return; +} + +#endif /*-------------------------------------------------------------------* * IGFEncConcatenateBitstream() @@ -1722,10 +1757,56 @@ void IGFEncConcatenateBitstream( { int16_t i; IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; +#ifdef IND_LIST_DYN + Indice *ind_list; + uint8_t *pFrame; /* byte array with bit packet and byte aligned coded speech data */ + int16_t *pFrame_size; /* number of bits in the binary encoded access unit [bits] */ + int16_t k, nb_bits_written; + int32_t imask; + uint8_t omask; +#endif hPrivateData = &hIGFEnc->igfData; +#ifndef IND_LIST_DYN hBstr->next_ind -= bsBits; +#endif + +#ifdef IND_LIST_DYN + ind_list = &hBstr->ind_list[hBstr->nb_ind_tot - bsBits]; /* here, we assume that each bit has been written as a single indice */ + pFrame = hPrivateData->igfBitstream; + pFrame_size = &hPrivateData->igfBitstreamBits; + nb_bits_written = 0; + + omask = ( 0x80 >> ( *pFrame_size & 0x7 ) ); + pFrame += *pFrame_size >> 3; + + /* bitstream packing (conversion of individual indices into a serial stream) */ + for ( i = 0; i < bsBits; i++ ) + { + if ( ind_list[i].nb_bits > 0 ) + { + /* mask from MSB to LSB */ + imask = 1 << ( ind_list[i].nb_bits - 1 ); + /* write bit by bit */ + for ( k = 0; k < ind_list[i].nb_bits; k++ ) + { + pack_bit( ind_list[i].value & imask, &pFrame, &omask ); + imask >>= 1; + } + nb_bits_written += ind_list[i].nb_bits; + + /* delete the indice */ + ind_list[i].nb_bits = -1; + } + } + + *pFrame_size += nb_bits_written; + + /* update list of indices */ + hBstr->nb_ind_tot -= bsBits; + hBstr->nb_bits_tot -= nb_bits_written; +#else indices_to_serial_generic( &hBstr->ind_list[hBstr->next_ind], bsBits, hPrivateData->igfBitstream, &hPrivateData->igfBitstreamBits ); /* make sure there are no leftovers from the temporary bitstream writing */ @@ -1735,6 +1816,7 @@ void IGFEncConcatenateBitstream( } hBstr->nb_bits_tot -= hIGFEnc->infoTotalBitsPerFrameWritten; +#endif return; } diff --git a/lib_enc/init_enc.c b/lib_enc/init_enc.c index 16b1cf0c29..acf5298734 100644 --- a/lib_enc/init_enc.c +++ b/lib_enc/init_enc.c @@ -55,6 +55,9 @@ ivas_error init_encoder( Encoder_State *st, /* i/o: state structure */ +#ifdef IND_LIST_DYN + ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : encoder configuration handle */ +#endif const int16_t idchan, /* i : channel ID */ const int16_t var_SID_rate_flag, /* i : flag for variable SID update rate */ const int16_t interval_SID, /* i : interval for SID update */ @@ -112,6 +115,19 @@ ivas_error init_encoder( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Bitstream structure\n" ) ); } + +#ifdef IND_LIST_DYN + /* set the maximum allowed number of indices in the list */ + st->hBstr->max_num_indices = get_max_num_indices( hEncoderConfig->ivas_format, st->total_brate ); + + /* allocate buffer of indices */ + if ( ( st->hBstr->ind_list = (INDICE_HANDLE) malloc( st->hBstr->max_num_indices * sizeof( Indice ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); + } + + reset_indices_enc( st->hBstr, st->hBstr->max_num_indices ); +#endif } else { diff --git a/lib_enc/ivas_core_enc.c b/lib_enc/ivas_core_enc.c index 002e499f4b..9c29f60b71 100644 --- a/lib_enc/ivas_core_enc.c +++ b/lib_enc/ivas_core_enc.c @@ -103,6 +103,9 @@ ivas_error ivas_core_enc( int16_t last_element_mode, tdm_Pitch_reuse_flag; int32_t element_brate, last_element_brate, input_Fs; ivas_error error; +#ifdef IND_LIST_DYN + int16_t max_num_indices; +#endif push_wmops( "ivas_core_enc" ); @@ -195,6 +198,22 @@ ivas_error ivas_core_enc( { st = sts[n]; +#ifdef IND_LIST_DYN + /*---------------------------------------------------------------------* + * Re-allocate the list of indices, if needed + *---------------------------------------------------------------------*/ + + /* get the maximum allowed number of indices in the list */ + max_num_indices = get_max_num_indices( ivas_format, st->total_brate ); + + /* check, if the maximum number of allowed indices has changed */ + if ( max_num_indices != st->hBstr->max_num_indices ) + { + /* re-allocate the list of indices */ + ind_list_realloc( st->hBstr, max_num_indices ); + } +#endif + /*---------------------------------------------------------------------* * Write signaling info into the bitstream *---------------------------------------------------------------------*/ @@ -263,7 +282,11 @@ ivas_error ivas_core_enc( } else { - stereo_mdct_core_enc( hCPE, old_inp_16k, old_wsp, pitch_buf ); + stereo_mdct_core_enc( hCPE, +#ifdef IND_LIST_DYN + ivas_format, +#endif + old_inp_16k, old_wsp, pitch_buf ); } } else if ( sts[0]->core_brate == SID_2k40 && sts[1]->core_brate == SID_2k40 ) diff --git a/lib_enc/ivas_corecoder_enc_reconfig.c b/lib_enc/ivas_corecoder_enc_reconfig.c index e9d6968f1b..74c27f4bff 100644 --- a/lib_enc/ivas_corecoder_enc_reconfig.c +++ b/lib_enc/ivas_corecoder_enc_reconfig.c @@ -41,7 +41,6 @@ #endif #include "wmc_auto.h" - /*-------------------------------------------------------------------* * ivas_corecoder_enc_reconfig() * @@ -61,9 +60,23 @@ ivas_error ivas_corecoder_enc_reconfig( int16_t n, sce_id, cpe_id; int16_t len_inp_memory, n_CoreCoder_existing, nSCE_existing, nCPE_existing; float input_buff[MCT_MAX_BLOCKS][L_FRAME48k + NS2SA( 48000, IVAS_FB_ENC_DELAY_NS )]; - BSTR_ENC_HANDLE hBstr, hMetaData; - Indice *ind_list, *ind_list_metadata; - int16_t nb_bits_tot, next_ind, last_ind; + BSTR_ENC_HANDLE hBstr; +#ifndef IND_LIST_DYN + Indice *ind_list; +#endif +#ifndef IND_LIST_DYN + Indice *ind_list_metadata; + BSTR_ENC_HANDLE hMetaData; +#endif +#ifdef IND_LIST_DYN + int16_t i, nb_bits, max_num_indices_metadata; + Indice temp_ind_list[MAX_NUM_IND_TEMP_LIST]; +#endif + int16_t nb_bits_tot; +#ifndef IND_LIST_DYN + int16_t last_ind; + int16_t next_ind; +#endif ENCODER_CONFIG_HANDLE hEncoderConfig; ivas_error error; @@ -91,6 +104,20 @@ ivas_error ivas_corecoder_enc_reconfig( copy_encoder_config( st_ivas, st_ivas->hSCE[sce_id]->hCoreCoder[0], 0 ); st_ivas->hSCE[sce_id]->element_brate = brate_SCE; st_ivas->hSCE[sce_id]->hCoreCoder[0]->total_brate = st_ivas->hSCE[sce_id]->element_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ +#ifdef IND_LIST_DYN + if ( st_ivas->hSCE[sce_id]->hMetaData != NULL ) + { + /* get the maximum allowed number of indices in the list */ + max_num_indices_metadata = get_max_num_indices_metadata( hEncoderConfig->ivas_format, hEncoderConfig->ivas_total_brate ); + + /* check, if the maximum number of allowed indices has changed */ + if ( max_num_indices_metadata != st_ivas->hSCE[sce_id]->hMetaData->max_num_indices ) + { + /* re-allocate the list of metadata indices */ + ind_list_realloc( st_ivas->hSCE[sce_id]->hMetaData, max_num_indices_metadata ); + } + } +#endif } for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) @@ -104,6 +131,20 @@ ivas_error ivas_corecoder_enc_reconfig( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->total_brate = st_ivas->hCPE[cpe_id]->element_brate / ( st_ivas->nCPE > 1 ? 1 : CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ } +#ifdef IND_LIST_DYN + if ( st_ivas->hCPE[cpe_id]->hMetaData != NULL ) + { + /* get the maximum allowed number of indices in the list */ + max_num_indices_metadata = get_max_num_indices_metadata( hEncoderConfig->ivas_format, hEncoderConfig->ivas_total_brate ); + + /* check, if the maximum number of allowed indices has changed */ + if ( max_num_indices_metadata != st_ivas->hCPE[cpe_id]->hMetaData->max_num_indices ) + { + /* re-allocate the list of metadata indices */ + ind_list_realloc( st_ivas->hCPE[cpe_id]->hMetaData, max_num_indices_metadata ); + } + } +#endif } if ( st_ivas->nCPE > 1 ) @@ -133,21 +174,29 @@ ivas_error ivas_corecoder_enc_reconfig( } /* something in transport changes */ +#ifndef IND_LIST_DYN ind_list = NULL; ind_list_metadata = NULL; +#endif hBstr = NULL; +#ifndef IND_LIST_DYN hMetaData = NULL; +#endif /* get the index list pointers */ if ( nSCE_old ) { hBstr = st_ivas->hSCE[0]->hCoreCoder[0]->hBstr; +#ifndef IND_LIST_DYN hMetaData = st_ivas->hSCE[0]->hMetaData; +#endif } else if ( nCPE_old ) { hBstr = st_ivas->hCPE[0]->hCoreCoder[0]->hBstr; +#ifndef IND_LIST_DYN hMetaData = st_ivas->hCPE[nCPE_old - 1]->hMetaData; +#endif } #ifdef DEBUGGING else @@ -157,11 +206,41 @@ ivas_error ivas_corecoder_enc_reconfig( #endif /* save bitstream information */ - ind_list = hBstr->ind_list; /* pointer to the beginning of the global list */ nb_bits_tot = hBstr->nb_bits_tot; +#ifndef IND_LIST_DYN + ind_list = hBstr->ind_list; /* pointer to the beginning of the global list */ next_ind = hBstr->next_ind; last_ind = hBstr->last_ind; +#endif +#ifdef IND_LIST_DYN + i = 0; + nb_bits = 0; + while ( nb_bits < nb_bits_tot && i < MAX_NUM_IND_TEMP_LIST ) + { + if ( hBstr->ind_list[i].nb_bits > 0 ) + { + temp_ind_list[i].id = hBstr->ind_list[i].id; + temp_ind_list[i].value = hBstr->ind_list[i].value; + temp_ind_list[i].nb_bits = hBstr->ind_list[i].nb_bits; + } + + nb_bits += temp_ind_list[i].nb_bits; + i++; + } + + for ( ; i < MAX_NUM_IND_TEMP_LIST; i++ ) + { + /* reset nb_bits of all other indices to -1 */ + temp_ind_list[i].nb_bits = -1; + } + +#ifdef DEBUGGING + assert( ( nb_bits == nb_bits_tot ) && "Error saving bitstream information during core-coder reconfiguration!\n" ); +#endif +#endif +#ifndef IND_LIST_DYN ind_list_metadata = hMetaData->ind_list; /* pointer to the beginning of the global list */ +#endif if ( hEncoderConfig->ivas_format == MC_FORMAT && last_mc_mode == MC_MODE_MCMASA && st_ivas->mc_mode == MC_MODE_MCMASA ) { @@ -256,23 +335,56 @@ ivas_error ivas_corecoder_enc_reconfig( mvr2r( input_buff[sce_id], st_ivas->hSCE[sce_id]->hCoreCoder[0]->input_buff, len_inp_memory ); } - /* prepare bitstream buffers */ +#ifndef IND_LIST_DYN + /* allocate buffer of indices */ st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list + sce_id * MAX_NUM_INDICES; +#endif /* only reset indices if it is not the first index list, this already contains the IVAS format bits */ if ( sce_id > 0 ) { - reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); + reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, +#ifdef IND_LIST_DYN + st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->max_num_indices +#else + MAX_NUM_INDICES +#endif + ); } else { - st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->last_ind = last_ind; st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->nb_bits_tot = nb_bits_tot; +#ifndef IND_LIST_DYN + st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->last_ind = last_ind; st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->next_ind = next_ind; +#endif +#ifdef IND_LIST_DYN + /* re-fill the buffer of indices with already written indices */ + i = 0; + nb_bits = 0; + while ( nb_bits < nb_bits_tot && i < MAX_NUM_IND_TEMP_LIST ) + { + if ( temp_ind_list[i].nb_bits > 0 ) + { + st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list[i].id = temp_ind_list[i].id; + st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list[i].value = temp_ind_list[i].value; + st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; + } + + nb_bits += temp_ind_list[i].nb_bits; + i++; + } + st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->nb_ind_tot = i; +#ifdef DEBUGGING + assert( ( nb_bits == nb_bits_tot ) && "Error restoring bitstream information during core-coder reconfiguration!\n" ); +#endif +#endif } +#ifndef IND_LIST_DYN st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata + sce_id * MAX_BITS_METADATA; reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA ); +#endif } } @@ -284,22 +396,52 @@ ivas_error ivas_corecoder_enc_reconfig( { st_ivas->hCPE[cpe_id]->element_brate = brate_CPE; - /* prepare bitstream buffers */ + /* allocate buffer of indices */ for ( n = 0; n < CPE_CHANNELS; n++ ) { copy_encoder_config( st_ivas, st_ivas->hCPE[cpe_id]->hCoreCoder[n], 0 ); st_ivas->hCPE[cpe_id]->hCoreCoder[n]->total_brate = st_ivas->hCPE[cpe_id]->element_brate / ( st_ivas->nCPE > 1 ? 1 : CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ +#ifndef IND_LIST_DYN st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list + ( cpe_id * CPE_CHANNELS + n + st_ivas->nSCE ) * MAX_NUM_INDICES; +#endif if ( cpe_id * CPE_CHANNELS + n > 0 || ( st_ivas->mc_mode == MC_MODE_MCMASA && st_ivas->nSCE > 0 ) ) { - reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); + reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, +#ifdef IND_LIST_DYN + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->max_num_indices +#else + MAX_NUM_INDICES +#endif + ); } else { - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->last_ind = last_ind; st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_bits_tot = nb_bits_tot; +#ifndef IND_LIST_DYN + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->last_ind = last_ind; st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->next_ind = next_ind; +#endif +#ifdef IND_LIST_DYN + i = 0; + nb_bits = 0; + while ( nb_bits < nb_bits_tot && i < MAX_NUM_IND_TEMP_LIST ) + { + if ( temp_ind_list[i].nb_bits > 0 ) + { + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list[i].id = temp_ind_list[i].id; + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list[i].value = temp_ind_list[i].value; + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; + } + + nb_bits += temp_ind_list[i].nb_bits; + i++; + } + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_ind_tot = i; +#ifdef DEBUGGING + assert( ( nb_bits == nb_bits_tot ) && "Error restoring bitstream information during core-coder reconfiguration!\n" ); +#endif +#endif } } } @@ -325,19 +467,49 @@ ivas_error ivas_corecoder_enc_reconfig( } } - /* prepare bitstream buffers */ for ( n = 0; n < CPE_CHANNELS; n++ ) { +#ifndef IND_LIST_DYN st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list + ( cpe_id * CPE_CHANNELS + n + st_ivas->nSCE ) * MAX_NUM_INDICES; +#endif + /* only reset indices if it is not the first index list, this already contains the IVAS format bits */ if ( cpe_id * CPE_CHANNELS + n > 0 || ( st_ivas->mc_mode == MC_MODE_MCMASA && st_ivas->nSCE > 0 ) ) { - reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); + reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, +#ifdef IND_LIST_DYN + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->max_num_indices +#else + MAX_NUM_INDICES +#endif + ); } else { - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->last_ind = last_ind; st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_bits_tot = nb_bits_tot; +#ifndef IND_LIST_DYN + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->last_ind = last_ind; st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->next_ind = next_ind; +#endif +#ifdef IND_LIST_DYN + i = 0; + nb_bits = 0; + while ( nb_bits < nb_bits_tot && i < MAX_NUM_IND_TEMP_LIST ) + { + if ( temp_ind_list[i].nb_bits > 0 ) + { + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list[i].id = temp_ind_list[i].id; + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list[i].value = temp_ind_list[i].value; + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; + } + + nb_bits += temp_ind_list[i].nb_bits; + i++; + } + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_ind_tot = i; +#ifdef DEBUGGING + assert( ( nb_bits == nb_bits_tot ) && "Error restoring bitstream information during core-coder reconfiguration!\n" ); +#endif +#endif } if ( hEncoderConfig->Opt_DTX_ON ) @@ -372,7 +544,6 @@ ivas_error ivas_corecoder_enc_reconfig( for ( n = 0; n < CPE_CHANNELS; n++ ) { st_ivas->hCPE[0]->hCoreCoder[n]->total_brate = st_ivas->hCPE[0]->element_brate; - st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal = (int16_t) ( st_ivas->hCPE[0]->element_brate / FRAMES_PER_SEC ); st_ivas->hCPE[0]->hCoreCoder[n]->igf = getIgfPresent( st_ivas->hCPE[0]->hCoreCoder[n]->element_mode, st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal * FRAMES_PER_SEC, @@ -404,7 +575,7 @@ ivas_error ivas_corecoder_enc_reconfig( } } - /* metadata handling for CPEs */ + /* alllocate buffer for metadata indices */ if ( st_ivas->nCPE > 0 ) { if ( st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData == NULL ) @@ -413,15 +584,36 @@ ivas_error ivas_corecoder_enc_reconfig( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MetaData structure\n" ) ); } + +#ifdef IND_LIST_DYN + /* set the maximum allowed number of metadata indices in the list */ + st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->max_num_indices = get_max_num_indices_metadata( hEncoderConfig->ivas_total_brate, hEncoderConfig->ivas_format ); + + /* allocate buffer of metadata indices */ + if ( ( st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->ind_list = (INDICE_HANDLE) malloc( st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->max_num_indices * sizeof( Indice ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); + } +#endif } +#ifdef IND_LIST_DYN + reset_indices_enc( st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData, st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->max_num_indices ); +#else st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->ind_list = ind_list_metadata + st_ivas->nSCE * MAX_NUM_INDICES; reset_indices_enc( st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData, MAX_BITS_METADATA ); +#endif for ( cpe_id = 0; cpe_id < st_ivas->nCPE - 1; cpe_id++ ) { if ( st_ivas->hCPE[cpe_id]->hMetaData != NULL ) { +#ifdef IND_LIST_DYN + if ( st_ivas->hCPE[cpe_id]->hMetaData->ind_list != NULL ) + { + free( st_ivas->hCPE[cpe_id]->hMetaData->ind_list ); + } +#endif free( st_ivas->hCPE[cpe_id]->hMetaData ); st_ivas->hCPE[cpe_id]->hMetaData = NULL; } @@ -440,7 +632,6 @@ ivas_error ivas_corecoder_enc_reconfig( for ( n = 0; n < CPE_CHANNELS; n++ ) { st_ivas->hCPE[0]->hCoreCoder[n]->total_brate = st_ivas->hCPE[0]->element_brate; - st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal = (int16_t) ( st_ivas->hCPE[0]->element_brate / FRAMES_PER_SEC ); st_ivas->hCPE[0]->hCoreCoder[n]->igf = getIgfPresent( st_ivas->hCPE[0]->hCoreCoder[n]->element_mode, st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal * FRAMES_PER_SEC, diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index f9b787ac56..82cda2357a 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -811,6 +811,19 @@ ivas_error create_cpe_enc( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MetaData structure\n" ) ); } + +#ifdef IND_LIST_DYN + /* set the maximum allowed number of indices in the list */ + hCPE->hMetaData->max_num_indices = get_max_num_indices_metadata( hEncoderConfig->ivas_format, hEncoderConfig->ivas_total_brate ); + + /* allocate buffer of metadata indices */ + if ( ( hCPE->hMetaData->ind_list = (INDICE_HANDLE) malloc( hCPE->hMetaData->max_num_indices * sizeof( Indice ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); + } + + reset_indices_enc( hCPE->hMetaData, hCPE->hMetaData->max_num_indices ); +#endif } /*-----------------------------------------------------------------* @@ -832,7 +845,12 @@ ivas_error create_cpe_enc( st->mct_chan_mode = MCT_CHAN_MODE_LFE; } - if ( ( error = init_encoder( st, n, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 0, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) + if ( ( error = init_encoder( st, + +#ifdef IND_LIST_DYN + hEncoderConfig, +#endif + n, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 0, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) { return error; } @@ -1004,6 +1022,12 @@ void destroy_cpe_enc( if ( hCPE->hMetaData != NULL ) { +#ifdef IND_LIST_DYN + if ( hCPE->hMetaData->ind_list != NULL ) + { + free( hCPE->hMetaData->ind_list ); + } +#endif free( hCPE->hMetaData ); hCPE->hMetaData = NULL; } diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index dfaa321605..e0713950ca 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -313,9 +313,15 @@ void ivas_initialize_handles_enc( *-------------------------------------------------------------------*/ ivas_error ivas_init_encoder( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - Indice ind_list[][MAX_NUM_INDICES], /* o : bitstream indices */ + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +#ifndef IND_LIST_DYN + , + Indice ind_list[][MAX_NUM_INDICES] /* o : bitstream indices */ +#endif +#ifndef IND_LIST_DYN + , Indice ind_list_metadata[][MAX_BITS_METADATA] /* o : bitstream indices metadata */ +#endif ) { int16_t i, n; @@ -361,9 +367,10 @@ ivas_error ivas_init_encoder( return error; } - /* prepare bitstream buffers */ +#ifndef IND_LIST_DYN st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); +#endif /* prepare stereo downmix for EVS */ if ( hEncoderConfig->stereo_dmx_evs == 1 ) @@ -386,16 +393,20 @@ ivas_error ivas_init_encoder( return error; } - /* prepare bitstream buffers */ +#ifndef IND_LIST_DYN + /* allocate buffer of indices */ for ( n = 0; n < CPE_CHANNELS; n++ ) { st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[n]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); } +#endif +#ifndef IND_LIST_DYN /* MetaData for DFT stereo */ st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[0]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA ); +#endif } else if ( ivas_format == ISM_FORMAT ) { @@ -415,12 +426,16 @@ ivas_error ivas_init_encoder( return error; } - /* prepare bitstream buffers */ + /* MetaData for ISMs */ +#ifndef IND_LIST_DYN st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); +#endif +#ifndef IND_LIST_DYN st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA ); +#endif } if ( st_ivas->ism_mode == ISM_MODE_PARAM ) @@ -485,12 +500,16 @@ ivas_error ivas_init_encoder( return error; } - /* prepare bitstream buffers */ + /* MetaData for SBA */ +#ifndef IND_LIST_DYN st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); +#endif +#ifndef IND_LIST_DYN st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA ); +#endif if ( st_ivas->sba_mode == SBA_MODE_SPAR && st_ivas->hEncoderConfig->Opt_DTX_ON ) { @@ -505,11 +524,12 @@ ivas_error ivas_init_encoder( return error; } - /* prepare bitstream buffers */ for ( n = 0; n < CPE_CHANNELS; n++ ) { +#ifndef IND_LIST_DYN st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[cpe_id * CPE_CHANNELS + n]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); +#endif if ( hEncoderConfig->Opt_DTX_ON ) { @@ -517,12 +537,14 @@ ivas_error ivas_init_encoder( } } +#ifndef IND_LIST_DYN /* Metadata only initialized for the last CPE index */ if ( cpe_id == st_ivas->nCPE - 1 ) { st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[st_ivas->nSCE]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA ); } +#endif } if ( st_ivas->nCPE > 1 ) @@ -551,6 +573,8 @@ ivas_error ivas_init_encoder( return error; } +#ifndef IND_LIST_DYN + /* allocate buffer of indices */ for ( n = 0; n < CPE_CHANNELS; n++ ) { /* we need the correct bitstream also for the LFE channel since it might become a proper coded channel when @@ -558,13 +582,16 @@ ivas_error ivas_init_encoder( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[cpe_id * CPE_CHANNELS + n]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); } +#endif +#ifndef IND_LIST_DYN /* Metadata only initialized for the last CPE index*/ if ( cpe_id == st_ivas->nCPE - 1 ) { st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[st_ivas->nSCE]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA ); } +#endif } if ( ( error = create_mct_enc( st_ivas ) ) != IVAS_ERR_OK ) @@ -593,19 +620,23 @@ ivas_error ivas_init_encoder( return error; } - /* prepare bitstream buffers */ +#ifndef IND_LIST_DYN + /* allocate buffer of indices */ for ( n = 0; n < CPE_CHANNELS; n++ ) { st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[cpe_id * CPE_CHANNELS + n]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); } +#endif +#ifndef IND_LIST_DYN /* Metadata only initialized for the last CPE index*/ if ( cpe_id == st_ivas->nCPE - 1 ) { st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[st_ivas->nSCE]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA ); } +#endif } if ( st_ivas->nCPE > 1 ) @@ -646,12 +677,15 @@ ivas_error ivas_init_encoder( return error; } - /* prepare bitstream buffers */ +#ifndef IND_LIST_DYN + /* allocate buffer of indices */ st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); - +#endif +#ifndef IND_LIST_DYN st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA ); +#endif } for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) @@ -663,19 +697,23 @@ ivas_error ivas_init_encoder( return error; } - /* prepare bitstream buffers */ +#ifndef IND_LIST_DYN + /* allocate buffer of indices */ for ( n = 0; n < CPE_CHANNELS; n++ ) { st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[cpe_id * CPE_CHANNELS + n + st_ivas->nSCE]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); } +#endif +#ifndef IND_LIST_DYN /* Metadata only initialized for the last CPE index*/ if ( cpe_id == st_ivas->nCPE - 1 ) { st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[st_ivas->nSCE]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA ); } +#endif } } } @@ -739,6 +777,14 @@ void destroy_core_enc( if ( hCoreCoder->hBstr != NULL ) { +#ifdef IND_LIST_DYN + /* deallocate buffer of indices */ + if ( hCoreCoder->hBstr->ind_list != NULL ) + { + free( hCoreCoder->hBstr->ind_list ); + } +#endif + free( hCoreCoder->hBstr ); hCoreCoder->hBstr = NULL; } diff --git a/lib_enc/ivas_ism_dtx_enc.c b/lib_enc/ivas_ism_dtx_enc.c index 3839a42a9d..9f3ae679c6 100644 --- a/lib_enc/ivas_ism_dtx_enc.c +++ b/lib_enc/ivas_ism_dtx_enc.c @@ -174,7 +174,14 @@ int16_t ivas_ism_dtx_enc( if ( dtx_flag ) { /* reset the bitstream (IVAS format signaling was already written) */ - reset_indices_enc( hSCE[0]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); + reset_indices_enc( hSCE[0]->hCoreCoder[0]->hBstr, + +#ifdef IND_LIST_DYN + hSCE[0]->hCoreCoder[0]->hBstr->max_num_indices +#else + MAX_NUM_INDICES +#endif + ); } /*------------------------------------------------------------------* @@ -385,7 +392,13 @@ int16_t ivas_ism_dtx_enc( if ( ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == -1 ) && ( st_ivas->hSCE[0]->hCoreCoder[0]->last_core_brate == SID_2k40 || st_ivas->hSCE[0]->hCoreCoder[0]->last_core_brate == FRAME_NO_DATA ) ) { st_ivas->hSCE[0]->hCoreCoder[0]->core_brate = st_ivas->hSCE[0]->hCoreCoder[0]->last_core_brate; - reset_indices_enc( st_ivas->hSCE[0]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); + reset_indices_enc( st_ivas->hSCE[0]->hCoreCoder[0]->hBstr, +#ifdef IND_LIST_DYN + st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->max_num_indices +#else + MAX_NUM_INDICES +#endif + ); } st_ivas->hSCE[1]->hCoreCoder[0]->core_brate = st_ivas->hSCE[0]->hCoreCoder[0]->core_brate; diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index 1540e35ce4..ddac05ff00 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -877,7 +877,11 @@ ivas_error ivas_ism_metadata_enc( /* write metadata only in active frames */ if ( hSCE[0]->hCoreCoder[0]->core_brate > SID_2k40 ) { +#ifdef IND_LIST_DYN + reset_indices_enc( hSCE[ch]->hMetaData, hSCE[ch]->hMetaData->max_num_indices ); +#else reset_indices_enc( hSCE[ch]->hMetaData, MAX_BITS_METADATA ); +#endif } } diff --git a/lib_enc/ivas_lfe_enc.c b/lib_enc/ivas_lfe_enc.c index a14424774f..9a5b754942 100644 --- a/lib_enc/ivas_lfe_enc.c +++ b/lib_enc/ivas_lfe_enc.c @@ -98,7 +98,11 @@ static void ivas_lfe_enc_quant( BSTR_ENC_HANDLE hBstr ) { int16_t bits_written; +#ifdef IND_LIST_DYN + int16_t nb_ind_tot; +#else int16_t next_ind_pos; +#endif uint16_t quant_strategy, write_bit; int16_t num_quant_strategies; int16_t shift_bits; @@ -117,7 +121,11 @@ static void ivas_lfe_enc_quant( num_quant_strategies = IVAS_MAX_NUM_QUANT_STRATS; shift_bits = IVAS_LFE_SHIFT_BITS; bits_written = hBstr->nb_bits_tot; +#ifdef IND_LIST_DYN + nb_ind_tot = hBstr->nb_ind_tot; +#else next_ind_pos = hBstr->next_ind; +#endif for ( quant_strategy = 0; quant_strategy < num_quant_strategies; quant_strategy++ ) @@ -243,7 +251,11 @@ static void ivas_lfe_enc_quant( } bits_written_arith_enc = hBstr->nb_bits_tot; +#ifdef IND_LIST_DYN + next_ind_pos_arith_enc = hBstr->nb_ind_tot; +#else next_ind_pos_arith_enc = hBstr->next_ind; +#endif push_next_indice( hBstr, coding_strategy, 1 ); base2_num_bits_tot = hBstr->nb_bits_tot - bits_written; @@ -259,13 +271,24 @@ static void ivas_lfe_enc_quant( { if ( quant_strategy == ( num_quant_strategies - 1 ) || ( ( target_bits + IVAS_LFE_ID_BITS ) >= base2_num_bits_tot ) ) { +#ifdef IND_LIST_DYN + /* reset bits buffer and code the indices with base 2 coding */ + for ( j = hBstr->nb_ind_tot - 1; j >= next_ind_pos_arith_enc; j-- ) + { + hBstr->ind_list[j].nb_bits = -1; + } + hBstr->nb_ind_tot = next_ind_pos_arith_enc; +#else /* reset bits buffer and code the indices with base 2 coding */ for ( j = hBstr->next_ind - 1; j >= next_ind_pos_arith_enc; j-- ) { hBstr->ind_list[j].nb_bits = -1; } +#endif hBstr->nb_bits_tot = bits_written_arith_enc; +#ifndef IND_LIST_DYN hBstr->next_ind = next_ind_pos_arith_enc; +#endif coding_strategy = 1; push_next_indice( hBstr, coding_strategy, 1 ); @@ -298,13 +321,21 @@ static void ivas_lfe_enc_quant( if ( quant_strategy < ( num_quant_strategies - 1 ) ) { /* reset all indices that were already written - TODO: maybe better store them temporarily first and write at the very end? */ +#ifdef IND_LIST_DYN + for ( j = hBstr->nb_ind_tot - 1; j >= nb_ind_tot; j-- ) +#else for ( j = hBstr->next_ind - 1; j >= next_ind_pos; j-- ) +#endif { hBstr->ind_list[j].nb_bits = -1; } hBstr->nb_bits_tot = bits_written; +#ifdef IND_LIST_DYN + hBstr->nb_ind_tot = nb_ind_tot; +#else hBstr->next_ind = next_ind_pos; +#endif } } } diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 337753925c..b5e100145d 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -1708,6 +1708,9 @@ void ivas_masa_enc_reconfigure( int16_t n, tmp; int16_t sce_id, cpe_id; int32_t ivas_total_brate; +#ifdef IND_LIST_DYN + int16_t max_num_indices_metadata; +#endif ivas_total_brate = st_ivas->hEncoderConfig->ivas_total_brate; @@ -1718,6 +1721,21 @@ void ivas_masa_enc_reconfigure( copy_encoder_config( st_ivas, st_ivas->hSCE[sce_id]->hCoreCoder[0], 0 ); st_ivas->hSCE[sce_id]->element_brate = ivas_total_brate / st_ivas->nchan_transport; st_ivas->hSCE[sce_id]->hCoreCoder[0]->total_brate = st_ivas->hSCE[sce_id]->element_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ + +#ifdef IND_LIST_DYN + if ( st_ivas->hSCE[sce_id]->hMetaData != NULL ) + { + /* get the maximum allowed number of indices in the list */ + max_num_indices_metadata = get_max_num_indices_metadata( st_ivas->hEncoderConfig->ivas_format, st_ivas->hEncoderConfig->ivas_total_brate ); + + /* check, if the maximum number of allowed indices has changed */ + if ( max_num_indices_metadata != st_ivas->hSCE[sce_id]->hMetaData->max_num_indices ) + { + /* re-allocate the list of metadata indices */ + ind_list_realloc( st_ivas->hSCE[sce_id]->hMetaData, max_num_indices_metadata ); + } + } +#endif } for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) @@ -1729,6 +1747,21 @@ void ivas_masa_enc_reconfigure( { copy_encoder_config( st_ivas, st_ivas->hCPE[cpe_id]->hCoreCoder[n], 0 ); st_ivas->hCPE[cpe_id]->hCoreCoder[n]->total_brate = st_ivas->hCPE[cpe_id]->element_brate / ( st_ivas->nCPE > 1 ? 1 : CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ + +#ifdef IND_LIST_DYN + if ( st_ivas->hCPE[cpe_id]->hMetaData != NULL ) + { + /* get the maximum allowed number of indices in the list */ + max_num_indices_metadata = get_max_num_indices_metadata( st_ivas->hEncoderConfig->ivas_format, st_ivas->hEncoderConfig->ivas_total_brate ); + + /* check, if the maximum number of allowed indices has changed */ + if ( max_num_indices_metadata != st_ivas->hCPE[cpe_id]->hMetaData->max_num_indices ) + { + /* re-allocate the list of metadata indices */ + ind_list_realloc( st_ivas->hCPE[cpe_id]->hMetaData, max_num_indices_metadata ); + } + } +#endif } if ( ivas_total_brate < MASA_STEREO_MIN_BITRATE ) diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index ac4f83a657..97bc34a9cb 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -130,7 +130,10 @@ ivas_error ivas_qmetadata_enc_encode( ) { int16_t i, bit_pos_start, bit_pos_start_coh; - int16_t next_ind_start, last_ind_start; + int16_t next_ind_start; +#ifndef IND_LIST_DYN + int16_t last_ind_start; +#endif uint16_t diffuseness_index_max_ec_frame; uint16_t diffuseness_index_max_ec_frame_pre[QMETADATA_MAX_NO_DIRECTIONS]; int16_t bits_dir_raw_pre[QMETADATA_MAX_NO_DIRECTIONS]; @@ -403,8 +406,12 @@ ivas_error ivas_qmetadata_enc_encode( /* Save state of metadata bitstream buffer after writing energy ratios, number of dirs and save space for coherence*/ bit_pos_start = hMetaData->nb_bits_tot; +#ifdef IND_LIST_DYN + next_ind_start = hMetaData->nb_ind_tot; +#else next_ind_start = hMetaData->next_ind; last_ind_start = hMetaData->last_ind; +#endif /* Encode quantized directions with EC frame-wise*/ if ( total_bits_1dir + bits_surround_coh <= hQMetaData->qmetadata_max_bit_req ) @@ -413,7 +420,11 @@ ivas_error ivas_qmetadata_enc_encode( bits_signaling[d]++; } +#ifdef IND_LIST_DYN + next_ind_raw_flag = hMetaData->nb_ind_tot; +#else next_ind_raw_flag = hMetaData->next_ind; +#endif push_next_indice( hMetaData, 0, 1 ); /* Raw coding flag*/ bits_dir_bands[0] = ivas_qmetadata_raw_encode_dir( NULL, q_direction, q_direction->cfg.nbands, q_direction->cfg.start_band ); @@ -445,7 +456,11 @@ ivas_error ivas_qmetadata_enc_encode( /* Encode quantized directions with EC band-wise */ if ( ( total_bits_1dir + bits_surround_coh <= hQMetaData->qmetadata_max_bit_req ) && ( bits_dir[d] + bits_diff[d] + bits_coherence[d] + bits_signaling[d] > total_bits_1dir ) && q_direction->cfg.nblocks > 1 ) { - restore_metadata_buffer( hMetaData, next_ind_start, last_ind_start, bit_pos_start ); + restore_metadata_buffer( hMetaData, next_ind_start, +#ifndef IND_LIST_DYN + last_ind_start, +#endif + bit_pos_start ); /* Write signaling */ push_next_indice( hMetaData, 1, 1 ); /*Write 1 bit to signal no EC frame-wise (EC1)*/ @@ -453,7 +468,11 @@ ivas_error ivas_qmetadata_enc_encode( bits_signaling[d] = 3; /* Write raw flags */ +#ifdef IND_LIST_DYN + next_ind_raw_flag = hMetaData->nb_ind_tot; +#else next_ind_raw_flag = hMetaData->next_ind; +#endif for ( i = start_band; i < nbands; i++ ) { push_next_indice( hMetaData, 0, 1 ); /* Raw coding flag*/ @@ -522,7 +541,11 @@ ivas_error ivas_qmetadata_enc_encode( /*Bit budget exceeded, bit reduction strategy?*/ extra_bits = 0; - restore_metadata_buffer( hMetaData, next_ind_start, last_ind_start, bit_pos_start ); + restore_metadata_buffer( hMetaData, next_ind_start, +#ifndef IND_LIST_DYN + last_ind_start, +#endif + bit_pos_start ); push_next_indice( hMetaData, 1, 1 ); /*Write 1 bit to signal no EC frame-wise (EC1)*/ if ( nblocks > 1 ) @@ -908,15 +931,19 @@ void ivas_qmetadata_enc_sid_encode( void reset_metadata_spatial( const IVAS_FORMAT ivas_format, /* i : IVAS format */ - BSTR_ENC_HANDLE hMetaData, /* i/o: Metadata bitstream handle */ + BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ const int32_t element_brate, /* i : element bitrate */ int32_t *total_brate, /* o : total bitrate */ const int32_t core_brate, /* i : core bitrate */ - const int16_t nb_bits_metadata, /* i : number of meatdata bits */ + const int16_t nb_bits_metadata, /* i : number of metadata bits */ const SBA_MODE sba_mode /* i : SBA mode */ ) { int16_t i, next_ind_sid, last_ind_sid; +#ifdef IND_LIST_DYN + int16_t j; +#endif + int16_t metadata_sid_bits; if ( core_brate == SID_2k40 || core_brate == FRAME_NO_DATA ) @@ -925,7 +952,9 @@ void reset_metadata_spatial( { if ( sba_mode == SBA_MODE_SPAR ) { +#ifdef DEBUGGING assert( hMetaData->ind_list[0].nb_bits == 1 ); +#endif hMetaData->ind_list[0].value = 1; metadata_sid_bits = (int16_t) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; while ( hMetaData->nb_bits_tot < metadata_sid_bits ) @@ -936,15 +965,22 @@ void reset_metadata_spatial( else { /* Reset metadata and keep only SID metadata*/ +#ifdef IND_LIST_DYN + last_ind_sid = hMetaData->nb_ind_tot; + next_ind_sid = hMetaData->nb_ind_tot; +#else last_ind_sid = hMetaData->next_ind; next_ind_sid = hMetaData->next_ind; +#endif while ( hMetaData->nb_bits_tot > nb_bits_metadata ) { next_ind_sid--; hMetaData->nb_bits_tot -= hMetaData->ind_list[next_ind_sid].nb_bits; } +#ifndef IND_LIST_DYN hMetaData->next_ind = 0; +#endif hMetaData->nb_bits_tot = 0; for ( i = 0; i < next_ind_sid; i++ ) @@ -952,6 +988,17 @@ void reset_metadata_spatial( hMetaData->ind_list[i].nb_bits = -1; } +#ifdef IND_LIST_DYN + for ( j = 0, i = next_ind_sid; i < last_ind_sid; i++, j++ ) + { + hMetaData->ind_list[j].value = hMetaData->ind_list[i].value; + hMetaData->ind_list[j].nb_bits = hMetaData->ind_list[i].nb_bits; + hMetaData->nb_bits_tot += hMetaData->ind_list[j].nb_bits; + hMetaData->ind_list[i].nb_bits = -1; + } + + hMetaData->nb_ind_tot = j; +#else for ( i = next_ind_sid; i < last_ind_sid; i++ ) { hMetaData->ind_list[hMetaData->next_ind].value = hMetaData->ind_list[i].value; @@ -960,13 +1007,20 @@ void reset_metadata_spatial( hMetaData->next_ind++; hMetaData->ind_list[i].nb_bits = -1; } + hMetaData->last_ind = hMetaData->next_ind; +#endif +#ifdef DEBUGGING assert( ( hMetaData->nb_bits_tot == ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS ) && "Problem of SID metadata in SCE" ); +#endif } } else { /*Reset metadata*/ +#ifdef IND_LIST_DYN + reset_indices_enc( hMetaData, hMetaData->max_num_indices ); +#else for ( i = 0; i < hMetaData->next_ind; i++ ) { hMetaData->ind_list[i].nb_bits = -1; @@ -974,6 +1028,7 @@ void reset_metadata_spatial( hMetaData->nb_bits_tot = 0; hMetaData->next_ind = 0; hMetaData->last_ind = 0; +#endif } *total_brate = element_brate; @@ -983,12 +1038,22 @@ void reset_metadata_spatial( /* Reset SID metadata bits*/ while ( hMetaData->nb_bits_tot > nb_bits_metadata ) { +#ifdef IND_LIST_DYN + hMetaData->nb_ind_tot--; + hMetaData->nb_bits_tot -= hMetaData->ind_list[hMetaData->nb_ind_tot].nb_bits; + hMetaData->ind_list[hMetaData->nb_ind_tot].nb_bits = -1; +#else hMetaData->next_ind--; hMetaData->nb_bits_tot -= hMetaData->ind_list[hMetaData->next_ind].nb_bits; hMetaData->ind_list[hMetaData->next_ind].nb_bits = -1; +#endif } +#ifdef DEBUGGING assert( hMetaData->nb_bits_tot == nb_bits_metadata && "Problem in metadata for SCE" ); +#endif +#ifndef IND_LIST_DYN hMetaData->last_ind = hMetaData->next_ind; +#endif } return; @@ -1494,24 +1559,34 @@ static int16_t ivas_qmetadata_entropy_encode_df_ratio( /*------------------------------------------------------------------------- * restore_metadata_buffer() * - * Reset metadata buffer + * Restore metadata buffer *------------------------------------------------------------------------*/ void restore_metadata_buffer( BSTR_ENC_HANDLE hMetaData, const int16_t next_ind_start, +#ifndef IND_LIST_DYN const int16_t last_ind_start, +#endif const int16_t bit_pos_start ) { int16_t i; +#ifdef IND_LIST_DYN + for ( i = next_ind_start; i <= hMetaData->nb_ind_tot; i++ ) +#else for ( i = next_ind_start; i <= hMetaData->next_ind; i++ ) +#endif { hMetaData->ind_list[i].nb_bits = -1; } hMetaData->nb_bits_tot = bit_pos_start; +#ifdef IND_LIST_DYN + hMetaData->nb_ind_tot = next_ind_start; +#else hMetaData->next_ind = next_ind_start; hMetaData->last_ind = last_ind_start; +#endif return; } @@ -4701,7 +4776,11 @@ static int16_t ivas_qmetadata_quantize_coherence( else { /* write dummy data now and save the position */ +#ifdef IND_LIST_DYN + *indice_coherence = hMetaData->nb_ind_tot; +#else *indice_coherence = hMetaData->next_ind; +#endif k = nbits; while ( k > 0 ) { diff --git a/lib_enc/ivas_sce_enc.c b/lib_enc/ivas_sce_enc.c index c8577a85ba..e54fee386b 100644 --- a/lib_enc/ivas_sce_enc.c +++ b/lib_enc/ivas_sce_enc.c @@ -312,6 +312,19 @@ ivas_error create_sce_enc( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MetaData structure\n" ) ); } + +#ifdef IND_LIST_DYN + /* set the maximum allowed number of indices in the list */ + hSCE->hMetaData->max_num_indices = get_max_num_indices_metadata( st_ivas->hEncoderConfig->ivas_format, st_ivas->hEncoderConfig->ivas_total_brate ); + + /* allocate buffer of metadata indices */ + if ( ( hSCE->hMetaData->ind_list = (INDICE_HANDLE) malloc( hSCE->hMetaData->max_num_indices * sizeof( Indice ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); + } + + reset_indices_enc( hSCE->hMetaData, hSCE->hMetaData->max_num_indices ); +#endif } else { @@ -332,7 +345,11 @@ ivas_error create_sce_enc( st->total_brate = hSCE->element_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ st->mct_chan_mode = MCT_CHAN_MODE_REGULAR; - if ( ( error = init_encoder( st, 0, st_ivas->hEncoderConfig->var_SID_rate_flag, st_ivas->hEncoderConfig->interval_SID, 0, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) + if ( ( error = init_encoder( st, +#ifdef IND_LIST_DYN + st_ivas->hEncoderConfig, +#endif + 0, st_ivas->hEncoderConfig->var_SID_rate_flag, st_ivas->hEncoderConfig->interval_SID, 0, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) { return error; } @@ -367,6 +384,12 @@ void destroy_sce_enc( if ( hSCE->hMetaData != NULL ) { +#ifdef IND_LIST_DYN + if ( hSCE->hMetaData->ind_list != NULL ) + { + free( hSCE->hMetaData->ind_list ); + } +#endif free( hSCE->hMetaData ); hSCE->hMetaData = NULL; } diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index c659979d2b..05329491a1 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -202,7 +202,11 @@ ivas_error ivas_spar_enc_open( hSpar->hCoreCoderVAD->total_brate = hEncoderConfig->ivas_total_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ hSpar->hCoreCoderVAD->mct_chan_mode = MCT_CHAN_MODE_IGNORE; - if ( ( error = init_encoder( hSpar->hCoreCoderVAD, 0, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 1, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) + if ( ( error = init_encoder( hSpar->hCoreCoderVAD, +#ifdef IND_LIST_DYN + hEncoderConfig, +#endif + 0, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 1, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index 645f690ac0..44fb18dbc2 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -510,17 +510,29 @@ static void write_metadata_buffer( BSTR_ENC_HANDLE hMetaData_tmp, BSTR_ENC_HANDLE hMetaData, const int16_t bit_pos_start, - const int16_t next_ind_start, - const int16_t last_ind_start ) + const int16_t next_ind_start +#ifndef IND_LIST_DYN + , + const int16_t last_ind_start +#endif +) { int16_t i; if ( hMetaData->nb_bits_tot > 0 ) { - restore_metadata_buffer( hMetaData, next_ind_start, last_ind_start, bit_pos_start ); + restore_metadata_buffer( hMetaData, next_ind_start, +#ifndef IND_LIST_DYN + last_ind_start, +#endif + bit_pos_start ); } +#ifdef IND_LIST_DYN + for ( i = 0; i < hMetaData_tmp->nb_ind_tot; i++ ) +#else for ( i = 0; i < hMetaData_tmp->next_ind; i++ ) +#endif { push_next_indice( hMetaData, hMetaData_tmp->ind_list[i].value, hMetaData_tmp->ind_list[i].nb_bits ); } @@ -556,7 +568,10 @@ ivas_error ivas_spar_md_enc_process( int16_t nB, bands_bw, packed_ok = 0; ivas_strats_t cs[MAX_CODING_STRATS]; int16_t code_strat; - int16_t bit_pos_start, next_ind_start, last_ind_start; + int16_t bit_pos_start, next_ind_start; +#ifndef IND_LIST_DYN + int16_t last_ind_start; +#endif BSTR_ENC_DATA hMetaData_tmp; Indice ind_list_tmp[MAX_BITS_METADATA]; // IVAS_fmToDo: size to be optimized float Wscale[IVAS_MAX_NUM_BANDS]; @@ -609,8 +624,12 @@ ivas_error ivas_spar_md_enc_process( /* Save state of metadata bitstream buffer */ bit_pos_start = hMetaData->nb_bits_tot; +#ifdef IND_LIST_DYN + next_ind_start = hMetaData->nb_ind_tot; +#else next_ind_start = hMetaData->next_ind; last_ind_start = hMetaData->last_ind; +#endif dmx_switch = 0; @@ -871,13 +890,23 @@ ivas_error ivas_spar_md_enc_process( strat = cs[i]; if ( strat != NO_STRAT ) { +#ifdef IND_LIST_DYN + hMetaData_tmp.max_num_indices = MAX_BITS_METADATA; + reset_indices_enc( &hMetaData_tmp, hMetaData_tmp.max_num_indices ); +#else reset_indices_enc( &hMetaData_tmp, MAX_BITS_METADATA ); +#endif ivas_write_spar_md_bitstream( hMdEnc, num_bands, bands_bw, &hMetaData_tmp, hEncoderConfig->ivas_total_brate, strat, qsi, planarCP ); if ( hMetaData->nb_bits_tot == bit_pos_start || hMetaData_tmp.nb_bits_tot < ( hMetaData->nb_bits_tot - bit_pos_start ) ) { - write_metadata_buffer( &hMetaData_tmp, hMetaData, bit_pos_start, next_ind_start, last_ind_start ); + write_metadata_buffer( &hMetaData_tmp, hMetaData, bit_pos_start, next_ind_start +#ifndef IND_LIST_DYN + , + last_ind_start +#endif + ); code_strat = strat; } if ( hMetaData->nb_bits_tot - bit_pos_start + ( ( ( hEncoderConfig->ivas_total_brate == IVAS_256k ) && ( sba_order == SBA_FOA_ORDER ) ) ? 1 : 0 ) <= hMdEnc->spar_md_cfg.tgt_bits_per_blk ) diff --git a/lib_enc/ivas_stereo_mdct_core_enc.c b/lib_enc/ivas_stereo_mdct_core_enc.c index 9500da4fb9..7cf4a930b5 100644 --- a/lib_enc/ivas_stereo_mdct_core_enc.c +++ b/lib_enc/ivas_stereo_mdct_core_enc.c @@ -117,6 +117,9 @@ static void sync_tcx_mode( void stereo_mdct_core_enc( CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ +#ifdef IND_LIST_DYN + const int16_t ivas_format, /* i : IVAS format */ +#endif float new_samples[CPE_CHANNELS][L_INP], /* i : new samples */ float old_wsp[CPE_CHANNELS][L_WSP], /* i : 12.8kHz weighted speech (for LTP */ float pitch_buf[CPE_CHANNELS][NB_SUBFR16k] /* o : floating pitch for each subframe */ @@ -145,6 +148,9 @@ void stereo_mdct_core_enc( int16_t p_param[CPE_CHANNELS][2]; int16_t stereo_bits; int16_t meta_bits, signal_bits; +#ifdef IND_LIST_DYN + int16_t max_num_indices; +#endif push_wmops( "stereo_mdct_core_enc" ); @@ -179,6 +185,19 @@ void stereo_mdct_core_enc( { st = sts[ch]; SetTCXModeInfo( st, st->hTranDet, &st->hTcxCfg->tcx_curr_overlap_mode ); + +#ifdef IND_LIST_DYN + /* re-allocate list of indices, if needed (note that st->total_brate is modified later in this function) */ + /* get the maximum allowed number of indices in the list */ + max_num_indices = get_max_num_indices( ivas_format, st->total_brate ); + + /* check, if the maximum number of allowed indices has changed */ + if ( max_num_indices != st->hBstr->max_num_indices ) + { + /* re-allocate the list of indices */ + ind_list_realloc( st->hBstr, max_num_indices ); + } +#endif } /* adaptively sync tcx modes*/ diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 50052cda3c..f3db751e0a 100755 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -48,8 +48,12 @@ struct IVAS_ENC { Encoder_Struct *st_ivas; - Indice ind_list[MAX_NUM_DATA][MAX_NUM_INDICES]; /* list of indices */ +#ifndef IND_LIST_DYN + Indice ind_list[MAX_NUM_DATA][MAX_NUM_INDICES]; /* list of indices */ +#endif +#ifndef IND_LIST_DYN Indice ind_list_metadata[MAX_NUM_METADATA][MAX_BITS_METADATA]; /* list of indices for metadata */ +#endif ENC_CORE_HANDLE hCoreCoder; bool isConfigured; #ifdef DEBUGGING @@ -99,7 +103,9 @@ ivas_error IVAS_ENC_Open( ) { Encoder_Struct *st_ivas; +#ifndef IND_LIST_DYN int16_t i, j; +#endif if ( phIvasEnc == NULL ) { @@ -110,13 +116,7 @@ ivas_error IVAS_ENC_Open( * Allocate and initialize IVAS application encoder handle *-----------------------------------------------------------------*/ -#ifdef BITSTREAM_INDICES_MEMORY -#define WMC_TOOL_SKIP if ( ( *phIvasEnc = (IVAS_ENC_HANDLE) malloc( sizeof( struct IVAS_ENC ) ) ) == NULL ) -#undef WMC_TOOL_SKIP -#else - if ( ( *phIvasEnc = (IVAS_ENC_HANDLE) malloc( sizeof( struct IVAS_ENC ) ) ) == NULL ) -#endif { return IVAS_ERR_FAILED_ALLOC; } @@ -134,6 +134,7 @@ ivas_error IVAS_ENC_Open( * Initialize indices *-----------------------------------------------------------------*/ +#ifndef IND_LIST_DYN for ( i = 0; i < MAX_NUM_DATA; ++i ) { for ( j = 0; j < MAX_NUM_INDICES; ++j ) @@ -142,7 +143,9 @@ ivas_error IVAS_ENC_Open( ( *phIvasEnc )->ind_list[i][j].value = 0; } } +#endif +#ifndef IND_LIST_DYN for ( i = 0; i < MAX_NUM_METADATA; ++i ) { for ( j = 0; j < MAX_BITS_METADATA; ++j ) @@ -151,6 +154,7 @@ ivas_error IVAS_ENC_Open( ( *phIvasEnc )->ind_list_metadata[i][j].value = 0; } } +#endif /*-----------------------------------------------------------------* * Allocate IVAS-codec encoder state @@ -220,13 +224,7 @@ void IVAS_ENC_Close( ( *phIvasEnc )->st_ivas = NULL; -#ifdef BITSTREAM_INDICES_MEMORY -#define WMC_TOOL_SKIP - free( *phIvasEnc ); -#undef WMC_TOOL_SKIP -#else free( *phIvasEnc ); -#endif *phIvasEnc = NULL; phIvasEnc = NULL; @@ -923,7 +921,16 @@ static ivas_error configureEncoder( * Finalize initialization *-----------------------------------------------------------------*/ - if ( ( error = ivas_init_encoder( st_ivas, hIvasEnc->ind_list, hIvasEnc->ind_list_metadata ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_init_encoder( st_ivas +#ifndef IND_LIST_DYN + , + hIvasEnc->ind_list +#endif +#ifndef IND_LIST_DYN + , + hIvasEnc->ind_list_metadata +#endif + ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index ec7fb594d1..b0e01d16f7 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -51,11 +51,20 @@ * Indice *------------------------------------------------------------------------------------------*/ +#ifdef IND_LIST_DYN +typedef struct +{ + int16_t id; /* id of the indice */ + uint16_t value; /* value of the quantized indice */ + int16_t nb_bits; /* number of bits used for the quantization of the indice */ +} Indice, *INDICE_HANDLE; +#else typedef struct { uint16_t value; /* value of the quantized indice */ int16_t nb_bits; /* number of bits used for the quantization of the indice */ } Indice; +#endif /*----------------------------------------------------------------------------------* * Bitstream structure @@ -63,11 +72,16 @@ typedef struct typedef struct bitstream_enc_data_structure { +#ifdef IND_LIST_DYN + int16_t nb_ind_tot; /* total number of indices already written */ +#endif int16_t nb_bits_tot; /* total number of bits already written */ Indice *ind_list; /* list of indices */ - int16_t next_ind; /* pointer to the next empty slot in the list of indices */ +#ifndef IND_LIST_DYN + int16_t next_ind; /* pointer to the next empty slot in the list of indices */ int16_t last_ind; /* last written indice */ - +#endif + int16_t max_num_indices; /* maximum number of indices in the list */ } BSTR_ENC_DATA, *BSTR_ENC_HANDLE; /*----------------------------------------------------------------------------------* diff --git a/lib_enc/tcx_utils_enc.c b/lib_enc/tcx_utils_enc.c index ba709f0158..2dd5340992 100644 --- a/lib_enc/tcx_utils_enc.c +++ b/lib_enc/tcx_utils_enc.c @@ -1486,11 +1486,19 @@ void ProcessIGF( } else { +#ifdef IND_LIST_DYN + pBsStart = hBstr->nb_ind_tot; +#else pBsStart = hBstr->next_ind; +#endif IGFEncWriteBitstream( hIGFEnc, hBstr, &hIGFEnc->infoTotalBitsPerFrameWritten, igfGridIdx, isIndepFlag ); +#ifdef IND_LIST_DYN + bsBits = hBstr->nb_ind_tot - pBsStart; +#else bsBits = hBstr->next_ind - pBsStart; +#endif IGFEncConcatenateBitstream( hIGFEnc, bsBits, hBstr ); } @@ -1570,11 +1578,19 @@ void ProcessStereoIGF( else { hBstr = sts[ch]->hBstr; +#ifdef IND_LIST_DYN + pBsStart = hBstr->nb_ind_tot; +#else pBsStart = hBstr->next_ind; +#endif IGFEncWriteBitstream( hIGFEnc[ch], hBstr, &hIGFEnc[ch]->infoTotalBitsPerFrameWritten, igfGridIdx, isIndepFlag ); +#ifdef IND_LIST_DYN + bsBits = hBstr->nb_ind_tot - pBsStart; +#else bsBits = hBstr->next_ind - pBsStart; +#endif IGFEncConcatenateBitstream( hIGFEnc[ch], bsBits, hBstr ); } } -- GitLab From 6124eb866602ce4b7cbc8c2bfeaf58a87a56a4a6 Mon Sep 17 00:00:00 2001 From: malenov Date: Tue, 28 Mar 2023 20:11:35 +0200 Subject: [PATCH 034/331] adjust the max number of indices for ISM3 at 384 kbps --- lib_com/bitstream.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index c28c04112b..9406031323 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -320,7 +320,7 @@ int16_t get_max_num_indices( /* o : maximum numb } else { - return 700; + return 760; } } else if ( ivas_format == SBA_FORMAT ) @@ -518,7 +518,7 @@ ivas_error push_indice( if ( hBstr->nb_ind_tot >= hBstr->max_num_indices ) { #ifdef DEBUGGING - DEBUG_LINE( 1 ) + DEBUG_LINE( 0 ) printf( "Warning: Maximum number of indices %d has been exceeded (frame %d)! Increase the limits in get_max_num_indices() or get_max_num_indices_metadata().\n", hBstr->max_num_indices, frame ); #endif @@ -651,7 +651,7 @@ ivas_error push_next_indice( if ( hBstr->nb_ind_tot >= hBstr->max_num_indices ) { #ifdef DEBUGGING - DEBUG_LINE( 1 ) + DEBUG_LINE( 0 ) printf( "Warning: Maximum number of indices %d has been exceeded (frame %d)! Increase the limits in get_max_num_indices() or get_max_num_indices_metadata().\n", hBstr->max_num_indices, frame ); #endif @@ -728,7 +728,7 @@ void push_next_bits( #ifdef IND_LIST_DYN ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; - /* get the id of the previous indice -> will be re-used here as well */ + /* get the id of the previous indice -> will be re-used */ if ( hBstr->nb_ind_tot > 0 ) { prev_id = hBstr->ind_list[hBstr->nb_ind_tot - 1].id; @@ -762,16 +762,21 @@ void push_next_bits( if ( hBstr->nb_ind_tot >= hBstr->max_num_indices ) { #ifdef DEBUGGING - DEBUG_LINE( 1 ) + DEBUG_LINE( 0 ) printf( "Warning: Maximum number of indices %d has been exceeded (frame %d)! Increase the limits in get_max_num_indices() or get_max_num_indices_metadata().\n", hBstr->max_num_indices, frame ); #endif /* reallocate the buffer of indices with increased limit */ ind_list_realloc( hBstr, hBstr->nb_ind_tot + STEP_MAX_NUM_INDICES ); + ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; } -#endif - + else + { + ++ptr; + } +#else ++ptr; +#endif } for ( ; i < nb_bits; ++i ) @@ -792,16 +797,21 @@ void push_next_bits( if ( hBstr->nb_ind_tot >= hBstr->max_num_indices ) { #ifdef DEBUGGING - DEBUG_LINE( 1 ) + DEBUG_LINE( 0 ) printf( "Warning: Maximum number of indices %d has been exceeded (frame %d)! Increase the limits in get_max_num_indices() or get_max_num_indices_metadata().\n", hBstr->max_num_indices, frame ); #endif /* reallocate the buffer of indices with increased limit */ ind_list_realloc( hBstr, hBstr->nb_ind_tot + STEP_MAX_NUM_INDICES ); + ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; } -#endif - + else + { + ++ptr; + } +#else ++ptr; +#endif } #ifndef IND_LIST_DYN -- GitLab From 58afcaf4bb10fb333db82da8f3fbbd74e016cbb9 Mon Sep 17 00:00:00 2001 From: Vladimir Malenovsky Date: Tue, 28 Mar 2023 20:21:58 +0200 Subject: [PATCH 035/331] clang format --- lib_com/prot.h | 2 +- lib_enc/dtx.c | 2 +- lib_enc/enc_ppp.c | 4 ++-- lib_enc/init_enc.c | 2 +- lib_enc/ivas_core_enc.c | 4 ++-- lib_enc/ivas_cpe_enc.c | 2 +- lib_enc/ivas_sce_enc.c | 6 +++--- lib_enc/ivas_spar_encoder.c | 4 ++-- lib_enc/ivas_stereo_mdct_core_enc.c | 2 +- lib_enc/stat_enc.h | 2 +- 10 files changed, 15 insertions(+), 15 deletions(-) diff --git a/lib_com/prot.h b/lib_com/prot.h index 72b29413c8..8430df6a7c 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -2256,7 +2256,7 @@ void read_next_force( #endif ivas_error init_encoder( - Encoder_State *st, /* i/o: state structure */ + Encoder_State *st, /* i/o: state structure */ #ifdef IND_LIST_DYN ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : encoder configuration handle */ #endif diff --git a/lib_enc/dtx.c b/lib_enc/dtx.c index 9656f96eb6..652c28f139 100644 --- a/lib_enc/dtx.c +++ b/lib_enc/dtx.c @@ -259,7 +259,7 @@ void dtx( /* reset the bitstream (IVAS format signaling was already written) */ if ( st->element_mode != IVAS_CPE_MDCT && st->hBstr != NULL ) { - reset_indices_enc( st->hBstr, + reset_indices_enc( st->hBstr, #ifdef IND_LIST_DYN st->hBstr->max_num_indices #else diff --git a/lib_enc/enc_ppp.c b/lib_enc/enc_ppp.c index 462557035f..1bfed647dc 100644 --- a/lib_enc/enc_ppp.c +++ b/lib_enc/enc_ppp.c @@ -171,9 +171,9 @@ ivas_error encod_ppp( /* delete previous indices */ reset_indices_enc( hBstr, #ifdef IND_LIST_DYN - hBstr->max_num_indices + hBstr->max_num_indices #else - MAX_NUM_INDICES + MAX_NUM_INDICES #endif ); diff --git a/lib_enc/init_enc.c b/lib_enc/init_enc.c index acf5298734..9c11420560 100644 --- a/lib_enc/init_enc.c +++ b/lib_enc/init_enc.c @@ -54,7 +54,7 @@ *-----------------------------------------------------------------------*/ ivas_error init_encoder( - Encoder_State *st, /* i/o: state structure */ + Encoder_State *st, /* i/o: state structure */ #ifdef IND_LIST_DYN ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : encoder configuration handle */ #endif diff --git a/lib_enc/ivas_core_enc.c b/lib_enc/ivas_core_enc.c index 9c29f60b71..040a8469c5 100644 --- a/lib_enc/ivas_core_enc.c +++ b/lib_enc/ivas_core_enc.c @@ -282,11 +282,11 @@ ivas_error ivas_core_enc( } else { - stereo_mdct_core_enc( hCPE, + stereo_mdct_core_enc( hCPE, #ifdef IND_LIST_DYN ivas_format, #endif - old_inp_16k, old_wsp, pitch_buf ); + old_inp_16k, old_wsp, pitch_buf ); } } else if ( sts[0]->core_brate == SID_2k40 && sts[1]->core_brate == SID_2k40 ) diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index 82cda2357a..5a39b1935e 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -846,7 +846,7 @@ ivas_error create_cpe_enc( } if ( ( error = init_encoder( st, - + #ifdef IND_LIST_DYN hEncoderConfig, #endif diff --git a/lib_enc/ivas_sce_enc.c b/lib_enc/ivas_sce_enc.c index e54fee386b..6c75de4113 100644 --- a/lib_enc/ivas_sce_enc.c +++ b/lib_enc/ivas_sce_enc.c @@ -345,11 +345,11 @@ ivas_error create_sce_enc( st->total_brate = hSCE->element_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ st->mct_chan_mode = MCT_CHAN_MODE_REGULAR; - if ( ( error = init_encoder( st, + if ( ( error = init_encoder( st, #ifdef IND_LIST_DYN st_ivas->hEncoderConfig, -#endif - 0, st_ivas->hEncoderConfig->var_SID_rate_flag, st_ivas->hEncoderConfig->interval_SID, 0, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) +#endif + 0, st_ivas->hEncoderConfig->var_SID_rate_flag, st_ivas->hEncoderConfig->interval_SID, 0, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 05329491a1..b6b79e3fa6 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -205,8 +205,8 @@ ivas_error ivas_spar_enc_open( if ( ( error = init_encoder( hSpar->hCoreCoderVAD, #ifdef IND_LIST_DYN hEncoderConfig, -#endif - 0, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 1, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) +#endif + 0, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 1, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_enc/ivas_stereo_mdct_core_enc.c b/lib_enc/ivas_stereo_mdct_core_enc.c index 7cf4a930b5..047db979e2 100644 --- a/lib_enc/ivas_stereo_mdct_core_enc.c +++ b/lib_enc/ivas_stereo_mdct_core_enc.c @@ -116,7 +116,7 @@ static void sync_tcx_mode( *-------------------------------------------------------------------*/ void stereo_mdct_core_enc( - CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ #ifdef IND_LIST_DYN const int16_t ivas_format, /* i : IVAS format */ #endif diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index b0e01d16f7..c37ed76dc7 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -79,7 +79,7 @@ typedef struct bitstream_enc_data_structure Indice *ind_list; /* list of indices */ #ifndef IND_LIST_DYN int16_t next_ind; /* pointer to the next empty slot in the list of indices */ - int16_t last_ind; /* last written indice */ + int16_t last_ind; /* last written indice */ #endif int16_t max_num_indices; /* maximum number of indices in the list */ } BSTR_ENC_DATA, *BSTR_ENC_HANDLE; -- GitLab From d9c1c08f48c32239a95695bc09ccccdb2c39d8e8 Mon Sep 17 00:00:00 2001 From: malenov Date: Wed, 29 Mar 2023 13:12:37 +0200 Subject: [PATCH 036/331] Fix re-allocation to avoid out-of-mem access (limit loop to max_num_indices) --- lib_com/bitstream.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index 9406031323..5feaf34186 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -243,7 +243,7 @@ ivas_error ind_list_realloc( /* move indices from the old list to the new list */ i = 0; - while ( hBstr->ind_list[i].nb_bits > 0 ) + while ( hBstr->ind_list[i].nb_bits > 0 && i < hBstr->max_num_indices ) { new_ind_list[i].id = hBstr->ind_list[i].id; new_ind_list[i].value = hBstr->ind_list[i].value; -- GitLab From 31dc1fdbf912959a867d2da48ea28e37f2277b3e Mon Sep 17 00:00:00 2001 From: rtyag Date: Thu, 30 Mar 2023 15:43:43 +1100 Subject: [PATCH 037/331] rtyag review comments inline --- lib_com/ivas_spar_com.c | 50 +++++++++++++++++++++++++++++++++++++ lib_enc/ivas_spar_encoder.c | 9 +++++++ lib_enc/ivas_spar_md_enc.c | 7 ++++++ 3 files changed, 66 insertions(+) diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index cb6ff23fc0..b6c4fd769d 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -2145,6 +2145,56 @@ void ivas_spar_set_bitrate_config( pSpar_md_cfg->tgt_bits_per_blk += md_coding_bits_header; pSpar_md_cfg->max_bits_per_blk += md_coding_bits_header; + /*rtyag: IMO this is where we should have the check and compute worst case MD bits + +what we want to check is +if (pSpar_md_cfg->max_bits_per_blk - md_coding_bits_header >= base2(PR_bits_perband + P_bits_perband + C_bits_perband)*num_bands) +if above condition is not true then assert(0); +Here, we dont really need to account for AGC or PCA as we have been taking AGC and PCA bits from core coder always.  + +pSpar_md_cfg->max_bits_per_blk is what you should use to bail out of arith/huff coder during processing. + +  + +When it comes to reporting the max MD bits for bitstream indices allocation then that should be +what we write in hMetaData handle in worst case +i.e. pSpar_md_cfg->max_bits_per_blk  + AGC max bits + PCA max bits + DirAC max bits + +AGC bits can be computed as +if(hSpar->AGC_Enable) +{ +AGC_bits = (ndmx == 1)?AGC_BITS_PER_CH : AGC_SIGNALLING_BITS + AGC_BITS_PER_CH*ndmx +} +else +{ +AGC_bits = AGC_SIGNALLING_BITS +} + +PCA bits can be computed as + if (hEncoderConfig->Opt_PCA_ON ) + { + PCA_bits = 1 + IVAS_PCA_QBITS + IVAS_PCA_QBITS - 1; + } + else + { + if ( ivas_total_brate == PCA_BRATE && sba_order == SBA_FOA_ORDER ) + { + PCA_bits = 1; + } + else + { + PCA_bits = 0; + } + } + + + + for dirac_bits, try using + min(hQMetaData->metadata_max_bits+1, 500); (note: 500 is a temp value, actual value will come from FhG. + If you see self test failure with 500 then increase it in steps of 100 until you see BE results) + + */ + return; } diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index bb91e0b5b9..516c86d655 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -452,6 +452,15 @@ static ivas_error ivas_spar_enc_process( push_wmops( "ivas_spar_enc_process" ); + /* + rtyag : for debugging, + + store the start_nb_bits = hMetaData->nb_bits_tot here and then at the end of this function + compute total_md_bits = hMetaData->nb_bits_tot - start_nb_bits; + and the assert (total_md_bits <= hMdEnc->max_md_bits_sba), this should pass for all self tests + + */ + /*-----------------------------------------------------------------------------------------* * Initialization *-----------------------------------------------------------------------------------------*/ diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index 6e2e35fdc3..2b4e9e12e8 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -213,6 +213,9 @@ ivas_error ivas_spar_md_enc_open( } #ifdef ARITH_HUFF_CODER_CHANGES + /*rtyag : this should be moved to ivas_spar_set_bitrate_config() after we calculate + pSpar_md_cfg->max_bits_per_blk, refer to my comment in ivas_spar_set_bitrate_config() + */ /*calculate the worst case strat vlaue*/ table_idx = ivas_get_spar_table_idx( hEncoderConfig->ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL ); if ( ( ivas_spar_br_table_consts[table_idx].q_lvls[2][0] == 1 && @@ -237,6 +240,7 @@ ivas_error ivas_spar_md_enc_open( n_input = ivas_sba_get_nchan_metadata( sba_order ); n_dmx = ivas_spar_br_table_consts[table_idx].nchan_transport; n_dec = n_input - n_dmx; + /*rtyag : please use (int16_t)ceilf(log2f(q_lvls[][])), no need to add +1*/ bits_PR = ( (int16_t) log2( ivas_spar_br_table_consts[table_idx].q_lvls[quant_strat][0] ) + 1 ) * ( n_input - 1 ); bits_C = ( (int16_t) log2( ivas_spar_br_table_consts[table_idx].q_lvls[quant_strat][1] ) + 1 ) * ( ( n_dmx - 1 ) * n_dec ); bits_P = ( (int16_t) log2( ivas_spar_br_table_consts[table_idx].q_lvls[quant_strat][2] ) + 1 ) * n_dec; @@ -247,7 +251,10 @@ ivas_error ivas_spar_md_enc_open( { printf( "wc_coarse_strat is greater than table_cal_wc!" ); } + /*rtyag : rename it to hMdEnc->max_md_bits_sba and refer to my comment in ivas_spar_set_bitrate_config() on how to compute it*/ hMdEnc->wc_strat = wc_coarse_strat; + /*rtyag : we dont need to malloc, we just need to report this hMdEnc->max_md_bits_sba value. + Please refer to my comment in ivas_spar_set_bitrate_config() function*/ hMdEnc->wc_coarse_strat_buff = (Indice *) malloc( wc_coarse_strat * sizeof( Indice ) ); #endif *hMdEnc_in = hMdEnc; -- GitLab From a93884e3970e2fff192f8125c6ee9d3722e91621 Mon Sep 17 00:00:00 2001 From: rtyag Date: Mon, 3 Apr 2023 13:21:20 +1000 Subject: [PATCH 038/331] changes w.r.t max bits by ittiam --- lib_com/ivas_cnst.h | 3 +- lib_com/ivas_prot.h | 10 ++- lib_com/ivas_spar_com.c | 115 ++++++++++++++---------- lib_com/ivas_stat_com.h | 10 +++ lib_com/options.h | 2 +- lib_dec/ivas_spar_md_dec.c | 7 +- lib_enc/ivas_entropy_coder.c | 11 +-- lib_enc/ivas_spar_encoder.c | 43 ++++++--- lib_enc/ivas_spar_md_enc.c | 163 ++++++++++++----------------------- lib_enc/ivas_stat_enc.h | 4 - 10 files changed, 188 insertions(+), 180 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index afdf8a2675..6a5e82f381 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -80,7 +80,8 @@ typedef enum #define IVAS_FORMAT_SIGNALING_NBITS 2 /* number of bits for signaling the IVAS format */ #define IVAS_FORMAT_SIGNALING_NBITS_SBA ( IVAS_FORMAT_SIGNALING_NBITS + 1 ) #ifdef ARITH_HUFF_CODER_CHANGES -#define IVAS_SBA_SIGNALING_OVERHEAD IVAS_FORMAT_SIGNALING_NBITS_SBA + SBA_ORDER_BITS + SBA_PLANAR_BITS + AGC_SIGNALLING_BITS + SPAR_NUM_CODING_STRAT_BITS +//#define IVAS_SBA_SIGNALING_OVERHEAD IVAS_FORMAT_SIGNALING_NBITS_SBA + SBA_ORDER_BITS + SBA_PLANAR_BITS + AGC_SIGNALLING_BITS + SPAR_NUM_CODING_STRAT_BITS +#define IVAS_SBA_SIGNALING_OVERHEAD 600 #endif diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index c1b5227886..c74de4b9ce 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3924,7 +3924,12 @@ int16_t ivas_get_sba_num_TCs( void ivas_spar_set_bitrate_config( ivas_spar_md_com_cfg *pSpar_md_cfg, /* i/o: SPAR MD config. handle */ const int16_t table_idx, /* i : config. table index */ - const int16_t num_bands /* i : number of bands */ + const int16_t num_bands /* i : number of bands */ +#ifdef ARITH_HUFF_CODER_CHANGES + , + const int16_t enc_flag + ,const int16_t Opt_PCA_ON +#endif ); void ivas_spar_bitrate_dist( @@ -4011,6 +4016,9 @@ ivas_error ivas_spar_md_enc_process( const int16_t dtx_vad, const int16_t nchan_inp, const int16_t sba_order /* i : Ambisonic (SBA) order */ +#ifdef ARITH_HUFF_CODER_CHANGES + , int16_t max_md_bit_dirac +#endif ); void ivas_compute_spar_params( diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index b6c4fd769d..8534414d41 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -2094,12 +2094,25 @@ void ivas_spar_set_bitrate_config( ivas_spar_md_com_cfg *pSpar_md_cfg, /* i/o: SPAR MD config. handle */ const int16_t table_idx, /* i : config. table index */ const int16_t num_bands /* i : number of bands */ +#ifdef ARITH_HUFF_CODER_CHANGES + , + const int16_t enc_flag, + const int16_t Opt_PCA_ON +#endif ) { int32_t ivas_total_brate; int16_t i, total_bits, max_bits, code, length; int16_t sba_order; int16_t md_coding_bits_header; +#ifdef ARITH_HUFF_CODER_CHANGES + int16_t bits_PR, bits_C, bits_P = 0; + int16_t wc_coarse_strat = 0; + int16_t n_input, n_dmx, n_dec = 0; + int16_t table_idx_val, quant_strat = 0; + int16_t table_cal_wc = 0; + int16_t val = 0; +#endif pSpar_md_cfg->nchan_transport = ivas_spar_br_table_consts[table_idx].nchan_transport; for ( i = 0; i < pSpar_md_cfg->nchan_transport; i++ ) @@ -2145,56 +2158,64 @@ void ivas_spar_set_bitrate_config( pSpar_md_cfg->tgt_bits_per_blk += md_coding_bits_header; pSpar_md_cfg->max_bits_per_blk += md_coding_bits_header; - /*rtyag: IMO this is where we should have the check and compute worst case MD bits - -what we want to check is -if (pSpar_md_cfg->max_bits_per_blk - md_coding_bits_header >= base2(PR_bits_perband + P_bits_perband + C_bits_perband)*num_bands) -if above condition is not true then assert(0); -Here, we dont really need to account for AGC or PCA as we have been taking AGC and PCA bits from core coder always.  - -pSpar_md_cfg->max_bits_per_blk is what you should use to bail out of arith/huff coder during processing. - -  - -When it comes to reporting the max MD bits for bitstream indices allocation then that should be -what we write in hMetaData handle in worst case -i.e. pSpar_md_cfg->max_bits_per_blk  + AGC max bits + PCA max bits + DirAC max bits - -AGC bits can be computed as -if(hSpar->AGC_Enable) -{ -AGC_bits = (ndmx == 1)?AGC_BITS_PER_CH : AGC_SIGNALLING_BITS + AGC_BITS_PER_CH*ndmx -} -else -{ -AGC_bits = AGC_SIGNALLING_BITS -} - -PCA bits can be computed as - if (hEncoderConfig->Opt_PCA_ON ) - { - PCA_bits = 1 + IVAS_PCA_QBITS + IVAS_PCA_QBITS - 1; - } - else - { - if ( ivas_total_brate == PCA_BRATE && sba_order == SBA_FOA_ORDER ) - { - PCA_bits = 1; - } +#ifdef ARITH_HUFF_CODER_CHANGES + if ( enc_flag) + { + /*calculate the worst case strat vlaue*/ + table_idx_val = ivas_get_spar_table_idx( ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL ); + if ( ( ivas_spar_br_table_consts[table_idx].q_lvls[2][0] == 1 && + ivas_spar_br_table_consts[table_idx].q_lvls[2][1] == 1 && + ivas_spar_br_table_consts[table_idx].q_lvls[2][2] == 1 && + ivas_spar_br_table_consts[table_idx].q_lvls[2][3] == 1 ) ) + { + quant_strat = QUANT_STRAT_0; + } else - { - PCA_bits = 0; - } - } - - - - for dirac_bits, try using - min(hQMetaData->metadata_max_bits+1, 500); (note: 500 is a temp value, actual value will come from FhG. - If you see self test failure with 500 then increase it in steps of 100 until you see BE results) + { + quant_strat = QUANT_STRAT_2; + } + /*worst case table calculated value*/ + for ( i = 0; i < ivas_spar_br_table_consts[table_idx_val].nchan_transport; i++ ) + { + table_cal_wc += ivas_spar_br_table_consts[table_idx_val].core_brs[i][1]; + } + table_cal_wc = ( ivas_total_brate - table_cal_wc ) / FRAMES_PER_SEC; - */ + n_input = ivas_sba_get_nchan_metadata( sba_order ); + n_dmx = ivas_spar_br_table_consts[table_idx_val].nchan_transport; + n_dec = n_input - n_dmx; + bits_PR = (int16_t) ceilf( log2f( ivas_spar_br_table_consts[table_idx_val].q_lvls[quant_strat][0] ) ) * ( n_input - 1 ); + bits_C = (int16_t) ceilf( log2f( ivas_spar_br_table_consts[table_idx_val].q_lvls[quant_strat][1] ) ) * ( ( n_dmx - 1 ) * n_dec ); + bits_P = (int16_t) ceilf( log2f( ivas_spar_br_table_consts[table_idx_val].q_lvls[quant_strat][2] ) ) * ( n_dec ); + wc_coarse_strat = bits_PR + bits_C + bits_P; + wc_coarse_strat = ( ( wc_coarse_strat * IVAS_MAX_NUM_BANDS ) * FRAMES_PER_SEC + ( IVAS_SBA_SIGNALING_OVERHEAD ) ) / FRAMES_PER_SEC; + pSpar_md_cfg->max_md_bits_sba = wc_coarse_strat; + if ( Opt_PCA_ON ) + { + pSpar_md_cfg->PCA_val = 1 + IVAS_PCA_QBITS + IVAS_PCA_QBITS - 1; + } + else + { + if ( ivas_total_brate == PCA_BRATE && sba_order == SBA_FOA_ORDER ) + { + pSpar_md_cfg->PCA_val = 1; + } + else + { + pSpar_md_cfg->PCA_val = 0; + } + } + if ( wc_coarse_strat > table_cal_wc ) + { + assert( 0 ); + } + if ( pSpar_md_cfg->max_bits_per_blk - md_coding_bits_header < wc_coarse_strat ) + { + // assert( 0 ); + } + } +#endif return; } diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index 8231588551..1e5aa01ca6 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -38,6 +38,9 @@ #include "typedef.h" #include "cnst.h" #include "ivas_cnst.h" +#ifdef ARITH_HUFF_CODER_CHANGES +#include "stat_enc.h" +#endif /*----------------------------------------------------------------------------------* @@ -239,6 +242,13 @@ typedef struct ivas_spar_md_com_cfg int16_t agc_bits_ch_idx; int16_t planarCP; int16_t num_umx_chs; +#ifdef ARITH_HUFF_CODER_CHANGES + int16_t max_md_bits_sba; + int16_t WC_value; + Indice *wc_coarse_strat_buff; + int16_t AGC_status; + int16_t PCA_val; +#endif } ivas_spar_md_com_cfg; diff --git a/lib_com/options.h b/lib_com/options.h index 6fb4689323..a5acbbbe2f 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -170,7 +170,7 @@ #define FIX_350_MASA_DELAY_COMP /* Nokia: Issue 350: MASA audio/meta delay compensation */ #define FIX_372_LIB_REND_VALIDATE_IO /* FhG: Issue 372: IVAS_rend segfaults with unsupported I/O configs - add validation checks of I/O config */ -#define ARITH_HUFF_CODER_CHANGES +#define ARITH_HUFF_CODER_CHANGES /* DLB: Optimization of metadata memory for Huffman and arithmetic coders */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ #endif diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index ff6f858d31..ec85ac60f7 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -448,7 +448,12 @@ ivas_error ivas_spar_md_dec_init( hMdDec->spar_hoa_md_flag = ivas_sba_get_spar_hoa_md_flag( sba_order, hDecoderConfig->ivas_total_brate ); hMdDec->spar_md.num_bands = ( hMdDec->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); - ivas_spar_set_bitrate_config( &hMdDec->spar_md_cfg, hMdDec->table_idx, hMdDec->spar_md.num_bands ); + ivas_spar_set_bitrate_config( &hMdDec->spar_md_cfg, hMdDec->table_idx, hMdDec->spar_md.num_bands +#ifdef ARITH_HUFF_CODER_CHANGES + ,0 + , 0 +#endif + ); nchan_transport = hMdDec->spar_md_cfg.nchan_transport; diff --git a/lib_enc/ivas_entropy_coder.c b/lib_enc/ivas_entropy_coder.c index 69b665b391..02ac26c2ab 100644 --- a/lib_enc/ivas_entropy_coder.c +++ b/lib_enc/ivas_entropy_coder.c @@ -149,16 +149,11 @@ static void ivas_arith_encode_array( if ( pArith->dyn_model_bits > 0 ) { ivas_get_dyn_freq_model( pInput, in_len, &model_index, pArith, &pCum_freq ); + push_next_indice(hMetaData, model_index, pArith->dyn_model_bits); #ifdef ARITH_HUFF_CODER_CHANGES - if ( ( hMetaData->nb_bits_tot + pArith->dyn_model_bits) <= wc_strat_arith ) + if ((hMetaData->nb_bits_tot) > wc_strat_arith) { -#endif - push_next_indice( hMetaData, model_index, pArith->dyn_model_bits ); -#ifdef ARITH_HUFF_CODER_CHANGES - } - else - { - return; + return; } #endif } diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 516c86d655..9a3b303dd0 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -153,6 +153,9 @@ ivas_error ivas_spar_enc_open( #endif hSpar->hAgcEnc = NULL; +#ifdef ARITH_HUFF_CODER_CHANGES + hSpar->hMdEnc->spar_md_cfg.AGC_status = hSpar->AGC_Enable; +#endif if ( hSpar->AGC_Enable ) { if ( ( error = ivas_spar_agc_enc_open( &hSpar->hAgcEnc, input_Fs, nchan_inp ) ) != IVAS_ERR_OK ) @@ -450,16 +453,16 @@ static ivas_error ivas_spar_enc_process( float dir[3], avg_dir[3]; float energySum, vecLen; +#ifdef ARITH_HUFF_CODER_CHANGES + int16_t start_nb_bits, total_md_bits; +#endif push_wmops( "ivas_spar_enc_process" ); - /* - rtyag : for debugging, - - store the start_nb_bits = hMetaData->nb_bits_tot here and then at the end of this function - compute total_md_bits = hMetaData->nb_bits_tot - start_nb_bits; - and the assert (total_md_bits <= hMdEnc->max_md_bits_sba), this should pass for all self tests - - */ +#ifdef ARITH_HUFF_CODER_CHANGES + int16_t max_md_bit_dirac = 0; + max_md_bit_dirac = hQMetaData->metadata_max_bits; + start_nb_bits = hMetaData->nb_bits_tot; +#endif /*-----------------------------------------------------------------------------------------* * Initialization @@ -649,7 +652,12 @@ static ivas_error ivas_spar_enc_process( } else { - ivas_spar_set_bitrate_config( &hSpar->hMdEnc->spar_md_cfg, table_idx, ( hSpar->hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND ); + ivas_spar_set_bitrate_config( &hSpar->hMdEnc->spar_md_cfg, table_idx, ( hSpar->hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND +#ifdef ARITH_HUFF_CODER_CHANGES + ,1 + , hEncoderConfig->Opt_PCA_ON +#endif + ); } } /*-----------------------------------------------------------------------------------------* @@ -674,7 +682,11 @@ static ivas_error ivas_spar_enc_process( if ( hSpar->hMdEnc->spar_hoa_md_flag == 0 ) { - ivas_spar_md_enc_process( hSpar->hMdEnc, hEncoderConfig, cov_real, cov_dtx_real, hMetaData, dtx_vad, nchan_inp, sba_order ); + ivas_spar_md_enc_process( hSpar->hMdEnc, hEncoderConfig, cov_real, cov_dtx_real, hMetaData, dtx_vad, nchan_inp, sba_order +#ifdef ARITH_HUFF_CODER_CHANGES + , max_md_bit_dirac +#endif + ); } { @@ -721,7 +733,11 @@ static ivas_error ivas_spar_enc_process( if ( hSpar->hMdEnc->spar_hoa_md_flag ) { - ivas_spar_md_enc_process( hSpar->hMdEnc, hEncoderConfig, cov_real, cov_dtx_real, hMetaData, dtx_vad, nchan_inp, sba_order ); + ivas_spar_md_enc_process( hSpar->hMdEnc, hEncoderConfig, cov_real, cov_dtx_real, hMetaData, dtx_vad, nchan_inp, sba_order +#ifdef ARITH_HUFF_CODER_CHANGES + , max_md_bit_dirac +#endif + ); } /*-----------------------------------------------------------------------------------------* @@ -892,5 +908,10 @@ static ivas_error ivas_spar_enc_process( pop_wmops(); +#ifdef ARITH_HUFF_CODER_CHANGES + total_md_bits = hMetaData->nb_bits_tot - start_nb_bits; + //assert(total_md_bits <= hSpar->hMdEnc->spar_md_cfg.max_md_bits_sba); +#endif + return error; } diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index 2b4e9e12e8..2708420f9e 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -110,14 +110,6 @@ ivas_error ivas_spar_md_enc_open( ivas_spar_md_enc_state_t *hMdEnc; ivas_error error; int16_t num_channels, i, j; -#ifdef ARITH_HUFF_CODER_CHANGES - int16_t bits_PR, bits_C, bits_P = 0; - int32_t wc_coarse_strat = 0; - int16_t num_bands_arith_huff = IVAS_MAX_NUM_BANDS; - int16_t n_input, n_dmx, n_dec = 0; - int16_t table_idx, quant_strat = 0; - int32_t table_cal_wc = 0; -#endif error = IVAS_ERR_OK; if ( ( hMdEnc = (ivas_spar_md_enc_state_t *) malloc( sizeof( ivas_spar_md_enc_state_t ) ) ) == NULL ) @@ -211,52 +203,10 @@ ivas_error ivas_spar_md_enc_open( { return error; } - #ifdef ARITH_HUFF_CODER_CHANGES - /*rtyag : this should be moved to ivas_spar_set_bitrate_config() after we calculate - pSpar_md_cfg->max_bits_per_blk, refer to my comment in ivas_spar_set_bitrate_config() - */ - /*calculate the worst case strat vlaue*/ - table_idx = ivas_get_spar_table_idx( hEncoderConfig->ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL ); - if ( ( ivas_spar_br_table_consts[table_idx].q_lvls[2][0] == 1 && - ivas_spar_br_table_consts[table_idx].q_lvls[2][1] == 1 && - ivas_spar_br_table_consts[table_idx].q_lvls[2][2] == 1 && - ivas_spar_br_table_consts[table_idx].q_lvls[2][3] == 1 ) ) - { - quant_strat = QUANT_STRAT_0; - } - else - { - quant_strat = QUANT_STRAT_2; - } - /*worst case table calculated value*/ - for ( i = 0; i < ivas_spar_br_table_consts[table_idx].nchan_transport; i++ ) - { - table_cal_wc += ivas_spar_br_table_consts[table_idx].core_brs[i][1]; - } - table_cal_wc = hEncoderConfig->ivas_total_brate - table_cal_wc; - table_cal_wc = table_cal_wc / FRAMES_PER_SEC; - - n_input = ivas_sba_get_nchan_metadata( sba_order ); - n_dmx = ivas_spar_br_table_consts[table_idx].nchan_transport; - n_dec = n_input - n_dmx; - /*rtyag : please use (int16_t)ceilf(log2f(q_lvls[][])), no need to add +1*/ - bits_PR = ( (int16_t) log2( ivas_spar_br_table_consts[table_idx].q_lvls[quant_strat][0] ) + 1 ) * ( n_input - 1 ); - bits_C = ( (int16_t) log2( ivas_spar_br_table_consts[table_idx].q_lvls[quant_strat][1] ) + 1 ) * ( ( n_dmx - 1 ) * n_dec ); - bits_P = ( (int16_t) log2( ivas_spar_br_table_consts[table_idx].q_lvls[quant_strat][2] ) + 1 ) * n_dec; - wc_coarse_strat = bits_PR + bits_C + bits_P; - wc_coarse_strat = ( ( wc_coarse_strat * num_bands_arith_huff ) + ( IVAS_SBA_SIGNALING_OVERHEAD + hMdEnc->spar_md_cfg.quant_strat_bits ) ) * FRAMES_PER_SEC; - wc_coarse_strat = wc_coarse_strat / FRAMES_PER_SEC; - if ( wc_coarse_strat >= table_cal_wc ) - { - printf( "wc_coarse_strat is greater than table_cal_wc!" ); - } - /*rtyag : rename it to hMdEnc->max_md_bits_sba and refer to my comment in ivas_spar_set_bitrate_config() on how to compute it*/ - hMdEnc->wc_strat = wc_coarse_strat; - /*rtyag : we dont need to malloc, we just need to report this hMdEnc->max_md_bits_sba value. - Please refer to my comment in ivas_spar_set_bitrate_config() function*/ - hMdEnc->wc_coarse_strat_buff = (Indice *) malloc( wc_coarse_strat * sizeof( Indice ) ); + hMdEnc->spar_md_cfg.wc_coarse_strat_buff = (Indice *)malloc(hMdEnc->spar_md_cfg.max_md_bits_sba * sizeof(Indice)); #endif + *hMdEnc_in = hMdEnc; return error; @@ -339,11 +289,11 @@ void ivas_spar_md_enc_close( free( hMdEnc->mixer_mat_local ); } #ifdef ARITH_HUFF_CODER_CHANGES - if ( hMdEnc->wc_coarse_strat_buff != NULL ) + if ( hMdEnc->spar_md_cfg.wc_coarse_strat_buff != NULL ) { - free( hMdEnc->wc_coarse_strat_buff ); - hMdEnc->wc_coarse_strat_buff = NULL; - hMdEnc->wc_strat = 0; + free( hMdEnc->spar_md_cfg.wc_coarse_strat_buff ); + hMdEnc->spar_md_cfg.wc_coarse_strat_buff = NULL; + hMdEnc->spar_md_cfg.max_md_bits_sba = 0; } #endif if ( hMdEnc != NULL ) @@ -377,7 +327,12 @@ ivas_error ivas_spar_md_enc_init( table_idx = ivas_get_spar_table_idx( hEncoderConfig->ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL ); - ivas_spar_set_bitrate_config( &hMdEnc->spar_md_cfg, table_idx, ( hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND ); + ivas_spar_set_bitrate_config( &hMdEnc->spar_md_cfg, table_idx, ( hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND +#ifdef ARITH_HUFF_CODER_CHANGES + , 1 ,hEncoderConfig->ivas_total_brate + , hEncoderConfig->Opt_PCA_ON +#endif + ); /* get FB coefficients */ for ( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) @@ -602,6 +557,10 @@ ivas_error ivas_spar_md_enc_process( const int16_t dtx_vad, const int16_t nchan_inp, const int16_t sba_order /* i : Ambisonic (SBA) order */ +#ifdef ARITH_HUFF_CODER_CHANGES + , + int16_t max_md_bit_dirac +#endif ) { float pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS]; @@ -618,6 +577,10 @@ ivas_error ivas_spar_md_enc_process( BSTR_ENC_DATA hMetaData_tmp; #ifndef ARITH_HUFF_CODER_CHANGES Indice ind_list_tmp[MAX_BITS_METADATA]; // IVAS_fmToDo: size to be optimized +#endif +#ifdef ARITH_HUFF_CODER_CHANGES + int16_t dirac_bits, AGC_bits; + int16_t table_idx_val, ndmx; #endif float Wscale[IVAS_MAX_NUM_BANDS]; @@ -666,7 +629,7 @@ ivas_error ivas_spar_md_enc_process( } #ifdef ARITH_HUFF_CODER_CHANGES - hMetaData_tmp.ind_list = hMdEnc->wc_coarse_strat_buff; + hMetaData_tmp.ind_list = hMdEnc->spar_md_cfg.wc_coarse_strat_buff; #else hMetaData_tmp.ind_list = ind_list_tmp; #endif @@ -929,7 +892,20 @@ ivas_error ivas_spar_md_enc_process( } ivas_select_next_strat( hMdEnc->spar_md_cfg.prior_strat, cs, dmx_switch, dtx_vad ); - +#ifdef ARITH_HUFF_CODER_CHANGES + table_idx_val = ivas_get_spar_table_idx(hEncoderConfig->ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL); + ndmx = ivas_spar_br_table_consts[table_idx_val].nchan_transport; + if (hMdEnc->spar_md_cfg.AGC_status) + { + AGC_bits = (ndmx == 1) ? AGC_BITS_PER_CH : AGC_SIGNALLING_BITS + AGC_BITS_PER_CH * ndmx; + } + else + { + AGC_bits = AGC_SIGNALLING_BITS; + } + dirac_bits = min(max_md_bit_dirac + 1, 500); + hMdEnc->spar_md_cfg.WC_value = hMdEnc->spar_md_cfg.max_bits_per_blk + AGC_bits + hMdEnc->spar_md_cfg.PCA_val + dirac_bits; +#endif for ( i = 0; i < MAX_CODING_STRATS; i++ ) { strat = cs[i]; @@ -939,11 +915,16 @@ ivas_error ivas_spar_md_enc_process( reset_indices_enc( &hMetaData_tmp, MAX_BITS_METADATA ); #else - reset_indices_enc( &hMetaData_tmp, hMdEnc->wc_strat ); + reset_indices_enc( &hMetaData_tmp, hMdEnc->spar_md_cfg.max_md_bits_sba ); + #endif ivas_write_spar_md_bitstream( hMdEnc, num_bands, bands_bw, &hMetaData_tmp, hEncoderConfig->ivas_total_brate, strat, qsi, planarCP ); - if ( hMetaData->nb_bits_tot == bit_pos_start || hMetaData_tmp.nb_bits_tot < ( hMetaData->nb_bits_tot - bit_pos_start ) ) +#ifdef ARITH_HUFF_CODER_CHANGES + if ( (hMetaData_tmp.nb_bits_tot <= hMdEnc->spar_md_cfg.WC_value) && ( hMetaData->nb_bits_tot == bit_pos_start || ( hMetaData_tmp.nb_bits_tot < ( hMetaData->nb_bits_tot - bit_pos_start ) ) ) ) +#else + if ( hMetaData->nb_bits_tot == bit_pos_start || (hMetaData_tmp.nb_bits_tot < (hMetaData->nb_bits_tot - bit_pos_start))) +#endif { write_metadata_buffer( &hMetaData_tmp, hMetaData, bit_pos_start, next_ind_start, last_ind_start ); code_strat = strat; @@ -1345,14 +1326,9 @@ static void ivas_get_huffman_coded_bs( for ( j = pred_offset; j < pred_coeff_dim; j++ ) { ivas_huffman_encode( &hMdEnc->huff_coeffs.pred_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j], &code, &len ); + push_next_indice( hMetaData, code, len ); #ifdef ARITH_HUFF_CODER_CHANGES - if ( ( hMetaData->nb_bits_tot + len ) <= hMdEnc->wc_strat ) - { -#endif - push_next_indice( hMetaData, code, len ); -#ifdef ARITH_HUFF_CODER_CHANGES - } - else + if ( ( hMetaData->nb_bits_tot ) > hMdEnc->spar_md_cfg.max_bits_per_blk ) { return; } @@ -1364,14 +1340,9 @@ static void ivas_get_huffman_coded_bs( if ( keep_planar[(int16_t) floor( j / ( ndm - 1 ) )] ) { ivas_huffman_encode( &hMdEnc->huff_coeffs.drct_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].drct_index_re[j], &code, &len ); + push_next_indice( hMetaData, code, len ); #ifdef ARITH_HUFF_CODER_CHANGES - if ( ( hMetaData->nb_bits_tot + len ) <= hMdEnc->wc_strat ) - { -#endif - push_next_indice( hMetaData, code, len ); -#ifdef ARITH_HUFF_CODER_CHANGES - } - else + if ( ( hMetaData->nb_bits_tot ) > hMdEnc->spar_md_cfg.max_bits_per_blk ) { return; } @@ -1384,14 +1355,9 @@ static void ivas_get_huffman_coded_bs( if ( keep_planar[j] ) { ivas_huffman_encode( &hMdEnc->huff_coeffs.decd_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].decd_index_re[j], &code, &len ); + push_next_indice( hMetaData, code, len ); #ifdef ARITH_HUFF_CODER_CHANGES - if ( ( hMetaData->nb_bits_tot + len ) <= hMdEnc->wc_strat ) - { -#endif - push_next_indice( hMetaData, code, len ); -#ifdef ARITH_HUFF_CODER_CHANGES - } - else + if ( ( hMetaData->nb_bits_tot ) > hMdEnc->spar_md_cfg.max_bits_per_blk ) { return; } @@ -1404,14 +1370,9 @@ static void ivas_get_huffman_coded_bs( for ( j = pred_offset; j < pred_coeff_dim; j++ ) { ivas_huffman_encode( &hMdEnc->huff_coeffs.pred_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j], &code, &len ); + push_next_indice( hMetaData, code, len ); #ifdef ARITH_HUFF_CODER_CHANGES - if ( ( hMetaData->nb_bits_tot + len ) <= hMdEnc->wc_strat ) - { -#endif - push_next_indice( hMetaData, code, len ); -#ifdef ARITH_HUFF_CODER_CHANGES - } - else + if ( ( hMetaData->nb_bits_tot ) > hMdEnc->spar_md_cfg.max_bits_per_blk ) { return; } @@ -1421,14 +1382,9 @@ static void ivas_get_huffman_coded_bs( for ( j = 0; j < ndec * ( ndm - 1 ); j++ ) { ivas_huffman_encode( &hMdEnc->huff_coeffs.drct_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].drct_index_re[j], &code, &len ); + push_next_indice( hMetaData, code, len ); #ifdef ARITH_HUFF_CODER_CHANGES - if ( ( hMetaData->nb_bits_tot + len ) <= hMdEnc->wc_strat ) - { -#endif - push_next_indice( hMetaData, code, len ); -#ifdef ARITH_HUFF_CODER_CHANGES - } - else + if ( ( hMetaData->nb_bits_tot ) > hMdEnc->spar_md_cfg.max_bits_per_blk ) { return; } @@ -1438,14 +1394,9 @@ static void ivas_get_huffman_coded_bs( for ( j = 0; j < ndec; j++ ) { ivas_huffman_encode( &hMdEnc->huff_coeffs.decd_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].decd_index_re[j], &code, &len ); + push_next_indice( hMetaData, code, len ); #ifdef ARITH_HUFF_CODER_CHANGES - if ( ( hMetaData->nb_bits_tot + len ) <= hMdEnc->wc_strat ) - { -#endif - push_next_indice( hMetaData, code, len ); -#ifdef ARITH_HUFF_CODER_CHANGES - } - else + if ( ( hMetaData->nb_bits_tot ) > hMdEnc->spar_md_cfg.max_bits_per_blk ) { return; } @@ -1542,7 +1493,7 @@ static void ivas_get_arith_coded_bs( symbol_arr_re, symbol_arr_old_re, pred_cell_dims, hMetaData, any_diff #ifdef ARITH_HUFF_CODER_CHANGES , - hMdEnc->wc_strat + hMdEnc->spar_md_cfg.max_bits_per_blk #endif ); if ( hMdEnc->spar_hoa_md_flag ) @@ -1589,7 +1540,7 @@ static void ivas_get_arith_coded_bs( symbol_arr_re, symbol_arr_old_re, drct_cell_dims, hMetaData, any_diff #ifdef ARITH_HUFF_CODER_CHANGES , - hMdEnc->wc_strat + hMdEnc->spar_md_cfg.max_bits_per_blk #endif ); @@ -1612,7 +1563,7 @@ static void ivas_get_arith_coded_bs( symbol_arr_re, symbol_arr_old_re, decd_cell_dims, hMetaData, any_diff #ifdef ARITH_HUFF_CODER_CHANGES , - hMdEnc->wc_strat + hMdEnc->spar_md_cfg.max_bits_per_blk #endif ); diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index fe4d57ef60..af1566b2ab 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -674,10 +674,6 @@ typedef struct ivas_spar_md_enc_state_t ivas_huff_coeffs_t huff_coeffs; int16_t table_idx; int16_t spar_hoa_md_flag; -#ifdef ARITH_HUFF_CODER_CHANGES - int16_t wc_strat; - Indice *wc_coarse_strat_buff; -#endif } ivas_spar_md_enc_state_t; /* PCA structure */ -- GitLab From 2905c1f3147659caa3584bb67599abf4f83c4db2 Mon Sep 17 00:00:00 2001 From: Shikha Shetgeri <100861@ittiam.com> Date: Tue, 4 Apr 2023 11:42:52 +0530 Subject: [PATCH 039/331] resolved build warnings --- lib_com/ivas_spar_com.c | 3 +-- lib_enc/ivas_spar_md_enc.c | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index 8534414d41..5bb349b52c 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -2110,8 +2110,7 @@ void ivas_spar_set_bitrate_config( int16_t wc_coarse_strat = 0; int16_t n_input, n_dmx, n_dec = 0; int16_t table_idx_val, quant_strat = 0; - int16_t table_cal_wc = 0; - int16_t val = 0; + int32_t table_cal_wc = 0; #endif pSpar_md_cfg->nchan_transport = ivas_spar_br_table_consts[table_idx].nchan_transport; diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index 2da4a205f5..ceb8247110 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -330,7 +330,7 @@ ivas_error ivas_spar_md_enc_init( ivas_spar_set_bitrate_config( &hMdEnc->spar_md_cfg, table_idx, ( hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND #ifdef ARITH_HUFF_CODER_CHANGES - , 1 ,hEncoderConfig->ivas_total_brate + , 1 , hEncoderConfig->Opt_PCA_ON #endif ); -- GitLab From 5b53afc91ceba2d5ef83323645536e0fb1c94f39 Mon Sep 17 00:00:00 2001 From: rtyag Date: Tue, 4 Apr 2023 19:27:52 +1000 Subject: [PATCH 040/331] entropy coder changes, clean up, fixes --- lib_com/ivas_cnst.h | 6 +- lib_com/ivas_dirac_com.c | 74 +++++++++- lib_com/ivas_prot.h | 28 +++- lib_com/ivas_rom_com.h | 1 - lib_com/ivas_spar_com.c | 79 ++++++----- lib_com/ivas_stat_com.h | 9 +- lib_com/options.h | 1 + lib_dec/ivas_spar_md_dec.c | 14 +- lib_enc/ivas_entropy_coder.c | 158 +++++++++++++++++---- lib_enc/ivas_sba_enc.c | 15 ++ lib_enc/ivas_spar_encoder.c | 28 ++-- lib_enc/ivas_spar_md_enc.c | 258 +++++++++++++++++++++-------------- 12 files changed, 458 insertions(+), 213 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 23080f7b46..a7c3ba5536 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -79,10 +79,6 @@ typedef enum #define IVAS_FORMAT_SIGNALING_NBITS 2 /* number of bits for signaling the IVAS format */ #define IVAS_FORMAT_SIGNALING_NBITS_SBA ( IVAS_FORMAT_SIGNALING_NBITS + 1 ) -#ifdef ARITH_HUFF_CODER_CHANGES -//#define IVAS_SBA_SIGNALING_OVERHEAD IVAS_FORMAT_SIGNALING_NBITS_SBA + SBA_ORDER_BITS + SBA_PLANAR_BITS + AGC_SIGNALLING_BITS + SPAR_NUM_CODING_STRAT_BITS -#define IVAS_SBA_SIGNALING_OVERHEAD 600 -#endif /*----------------------------------------------------------------------------------* @@ -995,6 +991,7 @@ typedef enum #define AGC_EMAX 0 #ifdef ARITH_HUFF_CODER_CHANGES #define AGC_SIGNALLING_BITS 1 +#define IVAS_SPAR_ARITH_OVERSHOOT_BITS (16) #endif /* Common SPAR metadata constants */ @@ -1656,6 +1653,7 @@ typedef enum #define IVAS_16K_12BANDS_ACTIVE_BANDS 10 #define SPAR_DIRAC_SPLIT_START_BAND 8 +#define DIRAC_TO_SPAR_HBR_PRED_CHS (FOA_CHANNELS - 1) #define SPAR_DTX_BANDS 2 #define DIRAC_DTX_BANDS 2 #define SPAR_DIRAC_DTX_BANDS ( SPAR_DTX_BANDS + DIRAC_DTX_BANDS ) diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index 01f133a3b7..5f1bc5c19b 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -289,6 +289,70 @@ void ivas_dirac_config_bands( return; } +#ifdef ARITH_HUFF_CODER_CHANGES +void ivas_get_dirac_sba_max_md_bits( + const int32_t sba_total_brate, + int16_t *bits_frame_nominal, + int16_t *metadata_max_bits, + int16_t *qmetadata_max_bit_req, + int16_t nbands ) +{ + if ( sba_total_brate <= IVAS_13k2 ) + { + *bits_frame_nominal = ACELP_9k60 / FRAMES_PER_SEC; + *metadata_max_bits = 70; + } + else if ( sba_total_brate <= IVAS_16k4 ) + { + *bits_frame_nominal = ACELP_13k20 / FRAMES_PER_SEC; + *metadata_max_bits = 80; + } + else if ( sba_total_brate <= IVAS_24k4 ) + { + *bits_frame_nominal = ACELP_16k40 / FRAMES_PER_SEC; + *metadata_max_bits = 103; + } + else if ( sba_total_brate <= IVAS_32k ) + { + *bits_frame_nominal = ACELP_32k / FRAMES_PER_SEC; + *metadata_max_bits = 214; + } + else if ( sba_total_brate <= IVAS_48k ) + { + *bits_frame_nominal = IVAS_48k / FRAMES_PER_SEC; + *metadata_max_bits = 240; + } + else if ( sba_total_brate <= IVAS_64k ) + { + *bits_frame_nominal = IVAS_64k / FRAMES_PER_SEC; + *metadata_max_bits = 200; + } + else if ( sba_total_brate <= IVAS_80k ) + { + *bits_frame_nominal = IVAS_80k / FRAMES_PER_SEC; + *metadata_max_bits = 200; + } + else if ( sba_total_brate <= IVAS_96k ) + { + *bits_frame_nominal = IVAS_96k / FRAMES_PER_SEC; + *metadata_max_bits = 200; + } + else if ( sba_total_brate <= IVAS_128k ) + { + *bits_frame_nominal = IVAS_128k / FRAMES_PER_SEC; + *metadata_max_bits = 250; + } + else + { + *bits_frame_nominal = (int16_t) ( sba_total_brate / FRAMES_PER_SEC ); + *metadata_max_bits = MAX16B; /* no limit */ + } + *metadata_max_bits = (int16_t) ceilf( (float) *metadata_max_bits * nbands / 5 ); + *qmetadata_max_bit_req = QMETADATA_MAXBIT_REQ_SBA >> 1; + + return; +} +#endif /*------------------------------------------------------------------------- * ivas_dirac_sba_config() @@ -358,7 +422,14 @@ ivas_error ivas_dirac_sba_config( { return error; } - +#ifdef ARITH_HUFF_CODER_CHANGES + ivas_get_dirac_sba_max_md_bits( + sba_total_brate, + &hQMetaData->bits_frame_nominal, + &hQMetaData->metadata_max_bits, + &hQMetaData->qmetadata_max_bit_req, + hQMetaData->q_direction[0].cfg.nbands ); +#else if ( sba_total_brate <= IVAS_13k2 ) { hQMetaData->bits_frame_nominal = ACELP_9k60 / FRAMES_PER_SEC; @@ -412,6 +483,7 @@ ivas_error ivas_dirac_sba_config( hQMetaData->metadata_max_bits = (int16_t) ceilf( (float) hQMetaData->metadata_max_bits * hQMetaData->q_direction[0].cfg.nbands / 5 ); hQMetaData->qmetadata_max_bit_req = QMETADATA_MAXBIT_REQ_SBA >> 1; +#endif return error; } diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 32f14b28b2..729693ef92 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -114,6 +114,10 @@ ivas_error ivas_spar_md_enc_init ivas_error ivas_sba_enc_reconfigure( Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ); +#ifdef ARITH_HUFF_CODER_CHANGES +int16_t ivas_sba_get_max_md_bits( + Encoder_Struct *st_ivas ); +#endif void destroy_sce_enc( SCE_ENC_HANDLE hSCE /* i/o: SCE encoder structure */ @@ -3361,6 +3365,15 @@ void ivas_dirac_config_bands( IVAS_FB_MIXER_HANDLE hFbMdft ); +#ifdef ARITH_HUFF_CODER_CHANGES +void ivas_get_dirac_sba_max_md_bits( + const int32_t sba_total_brate, + int16_t *bits_frame_nominal, + int16_t *metadata_max_bits, + int16_t *qmetadata_max_bit_req, + int16_t nbands ); +#endif + ivas_error ivas_dirac_sba_config( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ int16_t *nchan_transport, /* o : number of transport channel needed for MASA format */ @@ -4007,8 +4020,9 @@ void ivas_spar_set_bitrate_config( const int16_t num_bands /* i : number of bands */ #ifdef ARITH_HUFF_CODER_CHANGES , - const int16_t enc_flag - ,const int16_t Opt_PCA_ON + const int16_t enc_flag, + const int16_t pca_flag, + const int16_t agc_flag #endif ); @@ -4096,9 +4110,6 @@ ivas_error ivas_spar_md_enc_process( const int16_t dtx_vad, const int16_t nchan_inp, const int16_t sba_order /* i : Ambisonic (SBA) order */ -#ifdef ARITH_HUFF_CODER_CHANGES - , int16_t max_md_bit_dirac -#endif ); void ivas_compute_spar_params( @@ -4449,7 +4460,12 @@ int16_t ivas_get_bits_to_encode( void ivas_huffman_encode( ivas_huffman_cfg_t *huff_cfg, int16_t in, int16_t *hcode, int16_t *hlen ); void ivas_spar_huff_coeffs_com_init( ivas_huff_coeffs_t *pHuff_coeffs, ivas_spar_md_com_cfg *pSpar_cfg, const int16_t table_idx, const int16_t enc_dec ); void ivas_spar_arith_coeffs_com_init( ivas_arith_coeffs_t *pArith_coeffs, ivas_spar_md_com_cfg *pSpar_cfg, const int16_t table_idx, const int16_t enc_dec ); -void ivas_arith_encode_cmplx_cell_array(ivas_arith_t *pArith_re, ivas_arith_t *pArith_re_diff, const int16_t *pDo_diff, const int16_t nB, int16_t *pSymbol_re, int16_t *pSymbol_old_re, ivas_cell_dim_t *pCell_dims, BSTR_ENC_HANDLE hMetaData, const int16_t any_diff +#ifdef ARITH_HUFF_CODER_CHANGES +int16_t ivas_arith_encode_cmplx_cell_array( +#else +void ivas_arith_encode_cmplx_cell_array( +#endif +ivas_arith_t *pArith_re, ivas_arith_t *pArith_re_diff, const int16_t *pDo_diff, const int16_t nB, int16_t *pSymbol_re, int16_t *pSymbol_old_re, ivas_cell_dim_t *pCell_dims, BSTR_ENC_HANDLE hMetaData, const int16_t any_diff #ifdef ARITH_HUFF_CODER_CHANGES , int32_t wc_strat_arith #endif diff --git a/lib_com/ivas_rom_com.h b/lib_com/ivas_rom_com.h index a095c9e4b4..0fea291b30 100644 --- a/lib_com/ivas_rom_com.h +++ b/lib_com/ivas_rom_com.h @@ -318,7 +318,6 @@ extern const float McMASA_LFEGain_vectors[64]; extern const float ism_azimuth_borders[4]; extern const float ism_elevation_borders[4]; - /*----------------------------------------------------------------------------------* * Param ISM ROM tables *----------------------------------------------------------------------------------*/ diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index 5bb349b52c..0ca8d01785 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -2097,7 +2097,8 @@ void ivas_spar_set_bitrate_config( #ifdef ARITH_HUFF_CODER_CHANGES , const int16_t enc_flag, - const int16_t Opt_PCA_ON + const int16_t pca_flag, + const int16_t agc_flag #endif ) { @@ -2106,11 +2107,11 @@ void ivas_spar_set_bitrate_config( int16_t sba_order; int16_t md_coding_bits_header; #ifdef ARITH_HUFF_CODER_CHANGES - int16_t bits_PR, bits_C, bits_P = 0; - int16_t wc_coarse_strat = 0; - int16_t n_input, n_dmx, n_dec = 0; - int16_t table_idx_val, quant_strat = 0; - int32_t table_cal_wc = 0; + int16_t agc_bits, pca_bits, num_PR_bits_dirac_bands; + int16_t bits_PR, bits_C, bits_P; + int16_t wc_coarse_strat; + int16_t n_input, n_dmx, n_dec; + int16_t quant_strat; #endif pSpar_md_cfg->nchan_transport = ivas_spar_br_table_consts[table_idx].nchan_transport; @@ -2158,14 +2159,10 @@ void ivas_spar_set_bitrate_config( pSpar_md_cfg->max_bits_per_blk += md_coding_bits_header; #ifdef ARITH_HUFF_CODER_CHANGES - if ( enc_flag) + if ( enc_flag ) { - /*calculate the worst case strat vlaue*/ - table_idx_val = ivas_get_spar_table_idx( ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL ); - if ( ( ivas_spar_br_table_consts[table_idx].q_lvls[2][0] == 1 && - ivas_spar_br_table_consts[table_idx].q_lvls[2][1] == 1 && - ivas_spar_br_table_consts[table_idx].q_lvls[2][2] == 1 && - ivas_spar_br_table_consts[table_idx].q_lvls[2][3] == 1 ) ) + /*calculate the actual worst case bits*/ + if ( ivas_total_brate >= BRATE_SPAR_Q_STRAT ) { quant_strat = QUANT_STRAT_0; } @@ -2173,46 +2170,58 @@ void ivas_spar_set_bitrate_config( { quant_strat = QUANT_STRAT_2; } - /*worst case table calculated value*/ - for ( i = 0; i < ivas_spar_br_table_consts[table_idx_val].nchan_transport; i++ ) - { - table_cal_wc += ivas_spar_br_table_consts[table_idx_val].core_brs[i][1]; - } - table_cal_wc = ( ivas_total_brate - table_cal_wc ) / FRAMES_PER_SEC; + + num_PR_bits_dirac_bands = num_bands - SPAR_DIRAC_SPLIT_START_BAND; + num_PR_bits_dirac_bands = max( 0, num_PR_bits_dirac_bands ); + num_PR_bits_dirac_bands *= DIRAC_TO_SPAR_HBR_PRED_CHS; n_input = ivas_sba_get_nchan_metadata( sba_order ); - n_dmx = ivas_spar_br_table_consts[table_idx_val].nchan_transport; + n_dmx = ivas_spar_br_table_consts[table_idx].nchan_transport; n_dec = n_input - n_dmx; - bits_PR = (int16_t) ceilf( log2f( ivas_spar_br_table_consts[table_idx_val].q_lvls[quant_strat][0] ) ) * ( n_input - 1 ); - bits_C = (int16_t) ceilf( log2f( ivas_spar_br_table_consts[table_idx_val].q_lvls[quant_strat][1] ) ) * ( ( n_dmx - 1 ) * n_dec ); - bits_P = (int16_t) ceilf( log2f( ivas_spar_br_table_consts[table_idx_val].q_lvls[quant_strat][2] ) ) * ( n_dec ); + bits_PR = (int16_t) ceilf( log2f( ivas_spar_br_table_consts[table_idx].q_lvls[quant_strat][0] ) ); + num_PR_bits_dirac_bands *= bits_PR; + bits_PR = bits_PR * ( n_input - 1 ); + bits_C = (int16_t) ceilf( log2f( ivas_spar_br_table_consts[table_idx].q_lvls[quant_strat][1] ) ) * ( ( n_dmx - 1 ) * n_dec ); + bits_P = (int16_t) ceilf( log2f( ivas_spar_br_table_consts[table_idx].q_lvls[quant_strat][2] ) ) * ( n_dec ); wc_coarse_strat = bits_PR + bits_C + bits_P; - wc_coarse_strat = ( ( wc_coarse_strat * IVAS_MAX_NUM_BANDS ) * FRAMES_PER_SEC + ( IVAS_SBA_SIGNALING_OVERHEAD ) ) / FRAMES_PER_SEC; - pSpar_md_cfg->max_md_bits_sba = wc_coarse_strat; + wc_coarse_strat *= num_bands; + wc_coarse_strat -= num_PR_bits_dirac_bands; + wc_coarse_strat += md_coding_bits_header; - if ( Opt_PCA_ON ) + if ( pSpar_md_cfg->max_bits_per_blk < wc_coarse_strat ) { - pSpar_md_cfg->PCA_val = 1 + IVAS_PCA_QBITS + IVAS_PCA_QBITS - 1; + assert( 0 ); } - else + + if ( agc_flag ) { - if ( ivas_total_brate == PCA_BRATE && sba_order == SBA_FOA_ORDER ) + if ( pSpar_md_cfg->nchan_transport == 1 ) { - pSpar_md_cfg->PCA_val = 1; + agc_bits = AGC_BITS_PER_CH; } else { - pSpar_md_cfg->PCA_val = 0; + agc_bits = AGC_BITS_PER_CH * pSpar_md_cfg->nchan_transport + AGC_SIGNALLING_BITS; } } - if ( wc_coarse_strat > table_cal_wc ) + else + { + agc_bits = AGC_SIGNALLING_BITS; + } + + if ( ivas_total_brate == PCA_BRATE && sba_order == SBA_FOA_ORDER ) { - assert( 0 ); + pca_bits = 1; + if ( pca_flag ) + { + pca_bits += IVAS_PCA_QBITS + IVAS_PCA_QBITS - 1; + } } - if ( pSpar_md_cfg->max_bits_per_blk - md_coding_bits_header < wc_coarse_strat ) + else { - // assert( 0 ); + pca_bits = 0; } + pSpar_md_cfg->max_md_bits_spar = pSpar_md_cfg->max_bits_per_blk + agc_bits + pca_bits; } #endif return; diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index e5dd7296d1..5bfa73f873 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -38,9 +38,6 @@ #include "typedef.h" #include "cnst.h" #include "ivas_cnst.h" -#ifdef ARITH_HUFF_CODER_CHANGES -#include "stat_enc.h" -#endif /*----------------------------------------------------------------------------------* @@ -262,11 +259,7 @@ typedef struct ivas_spar_md_com_cfg int16_t planarCP; int16_t num_umx_chs; #ifdef ARITH_HUFF_CODER_CHANGES - int16_t max_md_bits_sba; - int16_t WC_value; - Indice *wc_coarse_strat_buff; - int16_t AGC_status; - int16_t PCA_val; + int16_t max_md_bits_spar; #endif } ivas_spar_md_com_cfg; diff --git a/lib_com/options.h b/lib_com/options.h index 62254935dd..0108375321 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -151,6 +151,7 @@ #define FIX_382_MASA_META_FRAMING_ASYNC /* Nokia: Issue 382: detect potential MASA metadata framing offset */ + #define ARITH_HUFF_CODER_CHANGES /* DLB: Optimization of metadata memory for Huffman and arithmetic coders */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index 8af2a7c278..0f63c6be1e 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -448,8 +448,8 @@ ivas_error ivas_spar_md_dec_init( ivas_spar_set_bitrate_config( &hMdDec->spar_md_cfg, hMdDec->table_idx, hMdDec->spar_md.num_bands #ifdef ARITH_HUFF_CODER_CHANGES - ,0 - , 0 + , + 0, 0, 0 #endif ); @@ -1762,7 +1762,7 @@ static void ivas_decode_arith_bs( { if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) { - pred_cell_dims[i].dim1 -= ( FOA_CHANNELS - 1 ); + pred_cell_dims[i].dim1 -= DIRAC_TO_SPAR_HBR_PRED_CHS; } } pred_cell_dims[i].dim2 = 1; @@ -1795,7 +1795,7 @@ static void ivas_decode_arith_bs( for ( j = 0; j < pred_cell_dims[i].dim1; j++ ) { hMdDec->spar_md_prev.band_coeffs_idx_mapped[i].pred_index_re[j] = - hMdDec->spar_md_prev.band_coeffs_idx_mapped[i].pred_index_re[j + ( FOA_CHANNELS - 1 )]; + hMdDec->spar_md_prev.band_coeffs_idx_mapped[i].pred_index_re[j + DIRAC_TO_SPAR_HBR_PRED_CHS]; } } } @@ -1816,10 +1816,10 @@ static void ivas_decode_arith_bs( { for ( j = pred_cell_dims[i].dim1 - 1; j >= 0; j-- ) { - hMdDec->spar_md.band_coeffs_idx[i].pred_index_re[j + ( FOA_CHANNELS - 1 )] = + hMdDec->spar_md.band_coeffs_idx[i].pred_index_re[j + DIRAC_TO_SPAR_HBR_PRED_CHS] = hMdDec->spar_md.band_coeffs_idx[i].pred_index_re[j]; } - for ( j = 0; j < FOA_CHANNELS - 1; j++ ) + for ( j = 0; j < DIRAC_TO_SPAR_HBR_PRED_CHS; j++ ) { hMdDec->spar_md.band_coeffs_idx[i].pred_index_re[j] = 0; } @@ -2078,7 +2078,7 @@ static void ivas_decode_huffman_bs( { if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) { - pred_offset = FOA_CHANNELS - 1; + pred_offset = DIRAC_TO_SPAR_HBR_PRED_CHS; } } diff --git a/lib_enc/ivas_entropy_coder.c b/lib_enc/ivas_entropy_coder.c index 02ac26c2ab..830a05e41a 100644 --- a/lib_enc/ivas_entropy_coder.c +++ b/lib_enc/ivas_entropy_coder.c @@ -128,8 +128,11 @@ static ivas_error ivas_get_dyn_freq_model( * * Arith encoding of an array of symbols *-----------------------------------------------------------------------------------------*/ - +#ifdef ARITH_HUFF_CODER_CHANGES +static int16_t ivas_arith_encode_array( +#else static void ivas_arith_encode_array( +#endif int16_t *pInput, ivas_arith_t *pArith, BSTR_ENC_HANDLE hMetaData, @@ -149,13 +152,13 @@ static void ivas_arith_encode_array( if ( pArith->dyn_model_bits > 0 ) { ivas_get_dyn_freq_model( pInput, in_len, &model_index, pArith, &pCum_freq ); - push_next_indice(hMetaData, model_index, pArith->dyn_model_bits); #ifdef ARITH_HUFF_CODER_CHANGES - if ((hMetaData->nb_bits_tot) > wc_strat_arith) + if ( ( hMetaData->nb_bits_tot + pArith->dyn_model_bits ) > wc_strat_arith ) { - return; + return -1; } #endif + push_next_indice( hMetaData, model_index, pArith->dyn_model_bits ); } else { @@ -169,12 +172,27 @@ static void ivas_arith_encode_array( ind = pInput[i] - pArith->vals[0]; ivas_ari_encode_14bits_ext( hMetaData, &as, ind, (const uint16_t *) pCum_freq ); +#ifdef ARITH_HUFF_CODER_CHANGES + if ( hMetaData->nb_bits_tot > wc_strat_arith ) + { + return -1; + } +#endif } ivas_ari_done_encoding_14bits( hMetaData, &as ); +#ifdef ARITH_HUFF_CODER_CHANGES + if ( hMetaData->nb_bits_tot > wc_strat_arith ) + { + return -1; + } +#endif } - +#ifdef ARITH_HUFF_CODER_CHANGES + return 0; +#else return; +#endif } @@ -183,15 +201,26 @@ static void ivas_arith_encode_array( * * Differential arith encoding *-----------------------------------------------------------------------------------------*/ - +#ifdef ARITH_HUFF_CODER_CHANGES +static int16_t ivas_arithCoder_encode_array_diff( +#else static void ivas_arithCoder_encode_array_diff( +#endif ivas_arith_t *pArith_diff, int16_t *pIn_new, int16_t *pIn_old_scratch, const int16_t length, - BSTR_ENC_HANDLE hMetaData ) + BSTR_ENC_HANDLE hMetaData +#ifdef ARITH_HUFF_CODER_CHANGES + , + int32_t wc_strat_arith +#endif +) { int16_t n; +#ifdef ARITH_HUFF_CODER_CHANGES + int16_t arith_result; +#endif if ( length > 0 ) { @@ -202,15 +231,22 @@ static void ivas_arithCoder_encode_array_diff( ivas_wrap_arround( pIn_old_scratch, pArith_diff->vals[0], pArith_diff->vals[pArith_diff->range - 1], length ); - ivas_arith_encode_array( pIn_old_scratch, pArith_diff, hMetaData, length #ifdef ARITH_HUFF_CODER_CHANGES - , - MAX_NUM_INDICES + arith_result = ivas_arith_encode_array( pIn_old_scratch, pArith_diff, hMetaData, length, + wc_strat_arith ); + if ( arith_result < 0 ) + { + return -1; + } +#else + ivas_arith_encode_array( pIn_old_scratch, pArith_diff, hMetaData, length ); #endif - ); } - +#ifdef ARITH_HUFF_CODER_CHANGES + return 0; +#else return; +#endif } @@ -244,8 +280,11 @@ void ivas_huffman_encode( * * Arithmetic encode a cell array *-----------------------------------------------------------------------------------------*/ - +#ifdef ARITH_HUFF_CODER_CHANGES +static int16_t arith_encode_cell_array( +#else static void arith_encode_cell_array( +#endif ivas_cell_dim_t *pCell_dims, BSTR_ENC_HANDLE hMetaData, const int16_t nB, @@ -259,6 +298,9 @@ static void arith_encode_cell_array( { int16_t total_symbol_len = 0; int16_t i; +#ifdef ARITH_HUFF_CODER_CHANGES + int16_t arith_result; +#endif for ( i = 0; i < nB; i++ ) { @@ -271,16 +313,24 @@ static void arith_encode_cell_array( { if ( pArith->range > 1 ) { - ivas_arith_encode_array( pSymbol, pArith, hMetaData, total_symbol_len #ifdef ARITH_HUFF_CODER_CHANGES - , - wc_strat_arith + arith_result = ivas_arith_encode_array( pSymbol, pArith, hMetaData, total_symbol_len, + wc_strat_arith ); + if ( arith_result < 0 ) + { + return -1; + } +#else + ivas_arith_encode_array( pSymbol, pArith, hMetaData, total_symbol_len ); #endif - ); } } +#ifdef ARITH_HUFF_CODER_CHANGES + return 0; +#else return; +#endif } @@ -289,16 +339,27 @@ static void arith_encode_cell_array( * * Arithmetic encode a cell array - differential *-----------------------------------------------------------------------------------------*/ - +#ifdef ARITH_HUFF_CODER_CHANGES +static int16_t arith_encode_cell_array_diff( +#else static void arith_encode_cell_array_diff( +#endif const ivas_cell_dim_t *pCell_dims, BSTR_ENC_HANDLE hMetaData, int16_t nB, ivas_arith_t *pArith_diff, int16_t *pSymbol_old, - int16_t *pSymbol ) + int16_t *pSymbol +#ifdef ARITH_HUFF_CODER_CHANGES + , + int32_t wc_strat_arith +#endif +) { int16_t i, total_symbol_len; +#ifdef ARITH_HUFF_CODER_CHANGES + int16_t arith_result; +#endif total_symbol_len = 0; for ( i = 0; i < nB; i++ ) @@ -312,11 +373,24 @@ static void arith_encode_cell_array_diff( { if ( pArith_diff->range > 1 ) { +#ifdef ARITH_HUFF_CODER_CHANGES + arith_result = ivas_arithCoder_encode_array_diff( pArith_diff, pSymbol, pSymbol_old, total_symbol_len, hMetaData, + wc_strat_arith ); + if ( arith_result < 0 ) + { + return -1; + } +#else ivas_arithCoder_encode_array_diff( pArith_diff, pSymbol, pSymbol_old, total_symbol_len, hMetaData ); +#endif } } +#ifdef ARITH_HUFF_CODER_CHANGES + return 0; +#else return; +#endif } @@ -325,8 +399,11 @@ static void arith_encode_cell_array_diff( * * Arithmetic encode a cell array *-----------------------------------------------------------------------------------------*/ - +#ifdef ARITH_HUFF_CODER_CHANGES +int16_t ivas_arith_encode_cmplx_cell_array( +#else void ivas_arith_encode_cmplx_cell_array( +#endif ivas_arith_t *pArith_re, ivas_arith_t *pArith_re_diff, const int16_t *pDo_diff, @@ -348,6 +425,9 @@ void ivas_arith_encode_cmplx_cell_array( ivas_cell_dim_t cell_dim[IVAS_MAX_NUM_BANDS], cell_dim_diff[IVAS_MAX_NUM_BANDS]; int16_t len, idx, i, j, idx1; int16_t total_len; +#ifdef ARITH_HUFF_CODER_CHANGES + int16_t arith_result; +#endif idx1 = 0; if ( any_diff == 1 ) @@ -413,24 +493,44 @@ void ivas_arith_encode_cmplx_cell_array( }*/ #endif - arith_encode_cell_array( cell_dim, hMetaData, nB, pArith_re, input #ifdef ARITH_HUFF_CODER_CHANGES - , - wc_strat_arith -#endif - ); + arith_result = arith_encode_cell_array( cell_dim, hMetaData, nB, pArith_re, input, + wc_strat_arith ); + if ( arith_result < 0 ) + { + return -1; + } + + arith_result = arith_encode_cell_array_diff( cell_dim_diff, hMetaData, nB, pArith_re_diff, input_old, input_new, + wc_strat_arith ); + if ( arith_result < 0 ) + { + return -1; + } +#else + arith_encode_cell_array( cell_dim, hMetaData, nB, pArith_re, input ); arith_encode_cell_array_diff( cell_dim_diff, hMetaData, nB, pArith_re_diff, input_old, input_new ); +#endif } else { - arith_encode_cell_array( pCell_dims, hMetaData, nB, pArith_re, pSymbol_re #ifdef ARITH_HUFF_CODER_CHANGES - , - wc_strat_arith + arith_result = arith_encode_cell_array( pCell_dims, hMetaData, nB, pArith_re, pSymbol_re, + wc_strat_arith ); + if ( arith_result < 0 ) + { + return -1; + } +#else + arith_encode_cell_array( pCell_dims, hMetaData, nB, pArith_re, pSymbol_re ); #endif - ); } + +#ifdef ARITH_HUFF_CODER_CHANGES + return 0; +#else return; +#endif } diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index d3aab0a6e8..2a1d192378 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -322,3 +322,18 @@ ivas_error ivas_sba_enc_reconfigure( return error; } + +#ifdef ARITH_HUFF_CODER_CHANGES +int16_t ivas_sba_get_max_md_bits( + Encoder_Struct *st_ivas ) +{ + int16_t max_md_bits; + + max_md_bits = min( st_ivas->hQMetaData->metadata_max_bits + 1, 500 ); // TODO: remove 500 once max MD bits has been defined at all bitrates in DirAC + if ( st_ivas->sba_mode == SBA_MODE_SPAR ) + { + max_md_bits += st_ivas->hSpar->hMdEnc->spar_md_cfg.max_md_bits_spar; + } + return max_md_bits; +} +#endif \ No newline at end of file diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 6fd44be4a5..c41554055e 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -138,9 +138,6 @@ ivas_error ivas_spar_enc_open( #endif hSpar->hAgcEnc = NULL; -#ifdef ARITH_HUFF_CODER_CHANGES - hSpar->hMdEnc->spar_md_cfg.AGC_status = hSpar->AGC_Enable; -#endif if ( hSpar->AGC_Enable ) { if ( ( error = ivas_spar_agc_enc_open( &hSpar->hAgcEnc, input_Fs, nchan_inp ) ) != IVAS_ERR_OK ) @@ -216,6 +213,7 @@ ivas_error ivas_spar_enc_open( hSpar->hFrontVad = NULL; } } + /*-----------------------------------------------------------------* * Final assignment *-----------------------------------------------------------------*/ @@ -412,13 +410,11 @@ static ivas_error ivas_spar_enc_process( float energySum, vecLen; #ifdef ARITH_HUFF_CODER_CHANGES - int16_t start_nb_bits, total_md_bits; + int16_t start_nb_bits, total_md_bits, total_sba_bits; #endif push_wmops( "ivas_spar_enc_process" ); #ifdef ARITH_HUFF_CODER_CHANGES - int16_t max_md_bit_dirac = 0; - max_md_bit_dirac = hQMetaData->metadata_max_bits; start_nb_bits = hMetaData->nb_bits_tot; #endif @@ -608,8 +604,9 @@ static ivas_error ivas_spar_enc_process( { ivas_spar_set_bitrate_config( &hSpar->hMdEnc->spar_md_cfg, table_idx, ( hSpar->hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND #ifdef ARITH_HUFF_CODER_CHANGES - ,1 - , hEncoderConfig->Opt_PCA_ON + , + 1, hEncoderConfig->Opt_PCA_ON, + hSpar->AGC_Enable #endif ); } @@ -636,11 +633,7 @@ static ivas_error ivas_spar_enc_process( if ( hSpar->hMdEnc->spar_hoa_md_flag == 0 ) { - ivas_spar_md_enc_process( hSpar->hMdEnc, hEncoderConfig, cov_real, cov_dtx_real, hMetaData, dtx_vad, nchan_inp, sba_order -#ifdef ARITH_HUFF_CODER_CHANGES - , max_md_bit_dirac -#endif - ); + ivas_spar_md_enc_process( hSpar->hMdEnc, hEncoderConfig, cov_real, cov_dtx_real, hMetaData, dtx_vad, nchan_inp, sba_order ); } { @@ -687,11 +680,7 @@ static ivas_error ivas_spar_enc_process( if ( hSpar->hMdEnc->spar_hoa_md_flag ) { - ivas_spar_md_enc_process( hSpar->hMdEnc, hEncoderConfig, cov_real, cov_dtx_real, hMetaData, dtx_vad, nchan_inp, sba_order -#ifdef ARITH_HUFF_CODER_CHANGES - , max_md_bit_dirac -#endif - ); + ivas_spar_md_enc_process( hSpar->hMdEnc, hEncoderConfig, cov_real, cov_dtx_real, hMetaData, dtx_vad, nchan_inp, sba_order ); } /*-----------------------------------------------------------------------------------------* @@ -864,7 +853,8 @@ static ivas_error ivas_spar_enc_process( #ifdef ARITH_HUFF_CODER_CHANGES total_md_bits = hMetaData->nb_bits_tot - start_nb_bits; - //assert(total_md_bits <= hSpar->hMdEnc->spar_md_cfg.max_md_bits_sba); + total_sba_bits = ivas_sba_get_max_md_bits( st_ivas ); + assert( total_md_bits <= total_sba_bits ); #endif return error; diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index ceb8247110..9d4993a493 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -71,9 +71,16 @@ static void ivas_band_mixer( float *cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], static void ivas_get_band_differential_index( ivas_band_coeffs_ind_t *pBand_idx, const int16_t q_levels[2], const int16_t one_sided, const int16_t nB, const int16_t complex_cov, const int16_t dim, const ivas_coeffs_type_t coeff_type ); +#ifdef ARITH_HUFF_CODER_CHANGES +static int16_t ivas_get_huffman_coded_bs( ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t nB, const int16_t qsi, const int16_t planarCP ); +#else static void ivas_get_huffman_coded_bs( ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t nB, const int16_t qsi, const int16_t planarCP ); - +#endif +#ifdef ARITH_HUFF_CODER_CHANGES +static int16_t ivas_get_arith_coded_bs( ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t *pDo_diff, const int16_t bands_bw, const int16_t nB, const int16_t qsi, const int16_t planarCP ); +#else static void ivas_get_arith_coded_bs( ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t *pDo_diff, const int16_t bands_bw, const int16_t nB, const int16_t qsi, const int16_t planarCP ); +#endif static ivas_error ivas_spar_set_enc_config( ivas_spar_md_enc_state_t *hMdEnc, int16_t *max_freq_per_chan, const int16_t nchan_transport, float *pFC, const int16_t nchan_inp ); @@ -203,9 +210,6 @@ ivas_error ivas_spar_md_enc_open( { return error; } -#ifdef ARITH_HUFF_CODER_CHANGES - hMdEnc->spar_md_cfg.wc_coarse_strat_buff = (Indice *)malloc(hMdEnc->spar_md_cfg.max_md_bits_sba * sizeof(Indice)); -#endif *hMdEnc_in = hMdEnc; @@ -291,14 +295,6 @@ void ivas_spar_md_enc_close( } free( hMdEnc->mixer_mat_local ); } -#ifdef ARITH_HUFF_CODER_CHANGES - if ( hMdEnc->spar_md_cfg.wc_coarse_strat_buff != NULL ) - { - free( hMdEnc->spar_md_cfg.wc_coarse_strat_buff ); - hMdEnc->spar_md_cfg.wc_coarse_strat_buff = NULL; - hMdEnc->spar_md_cfg.max_md_bits_sba = 0; - } -#endif free( *hMdEnc_in ); *hMdEnc_in = NULL; @@ -330,8 +326,9 @@ ivas_error ivas_spar_md_enc_init( ivas_spar_set_bitrate_config( &hMdEnc->spar_md_cfg, table_idx, ( hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND #ifdef ARITH_HUFF_CODER_CHANGES - , 1 - , hEncoderConfig->Opt_PCA_ON + , + 1, hEncoderConfig->Opt_PCA_ON, ivas_agc_enc_get_flag( hEncoderConfig->Opt_AGC_ON, ivas_spar_br_table_consts[table_idx].nchan_transport ) + #endif ); @@ -558,10 +555,6 @@ ivas_error ivas_spar_md_enc_process( const int16_t dtx_vad, const int16_t nchan_inp, const int16_t sba_order /* i : Ambisonic (SBA) order */ -#ifdef ARITH_HUFF_CODER_CHANGES - , - int16_t max_md_bit_dirac -#endif ) { float pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS]; @@ -576,14 +569,19 @@ ivas_error ivas_spar_md_enc_process( int16_t code_strat; int16_t bit_pos_start, next_ind_start, last_ind_start; BSTR_ENC_DATA hMetaData_tmp; -#ifndef ARITH_HUFF_CODER_CHANGES +#ifdef ARITH_HUFF_CODER_CHANGES + Indice *ind_list_tmp; + int16_t md_indices_allocated; +#else Indice ind_list_tmp[MAX_BITS_METADATA]; // IVAS_fmToDo: size to be optimized #endif + float Wscale[IVAS_MAX_NUM_BANDS]; + #ifdef ARITH_HUFF_CODER_CHANGES - int16_t dirac_bits, AGC_bits; - int16_t table_idx_val, ndmx; + /*extra 16 bits for arithmetic coder as overshoot check is after a symbol is written*/ + md_indices_allocated = hMdEnc->spar_md_cfg.max_bits_per_blk + IVAS_SPAR_ARITH_OVERSHOOT_BITS; + ind_list_tmp = (Indice *) malloc( sizeof( Indice ) * md_indices_allocated ); #endif - float Wscale[IVAS_MAX_NUM_BANDS]; num_quant_strats = hMdEnc->spar_md_cfg.num_quant_strats; num_ch = ivas_sba_get_nchan_metadata( sba_order ); @@ -629,11 +627,8 @@ ivas_error ivas_spar_md_enc_process( num_quant_strats = 1; } -#ifdef ARITH_HUFF_CODER_CHANGES - hMetaData_tmp.ind_list = hMdEnc->spar_md_cfg.wc_coarse_strat_buff; -#else hMetaData_tmp.ind_list = ind_list_tmp; -#endif + hMetaData_tmp.nb_bits_tot = 0; /* Save state of metadata bitstream buffer */ bit_pos_start = hMetaData->nb_bits_tot; @@ -659,7 +654,7 @@ ivas_error ivas_spar_md_enc_process( { for ( b = SPAR_DIRAC_SPLIT_START_BAND; b < num_bands; b++ ) { - for ( i = 0; i < FOA_CHANNELS - 1; i++ ) + for ( i = 0; i < DIRAC_TO_SPAR_HBR_PRED_CHS; i++ ) { pred_coeffs_re_local[i][b] = hMdEnc->spar_md.band_coeffs[b].pred_re[i]; } @@ -798,7 +793,7 @@ ivas_error ivas_spar_md_enc_process( { for ( b = SPAR_DIRAC_SPLIT_START_BAND; b < num_bands; b++ ) { - for ( i = 0; i < FOA_CHANNELS - 1; i++ ) + for ( i = 0; i < DIRAC_TO_SPAR_HBR_PRED_CHS; i++ ) { /* Use the prediction coeffs computed based on DirAC MD to generate mixer matrix */ pred_coeffs_re[i][b] = pred_coeffs_re_local[i][b]; @@ -893,47 +888,34 @@ ivas_error ivas_spar_md_enc_process( } ivas_select_next_strat( hMdEnc->spar_md_cfg.prior_strat, cs, dmx_switch, dtx_vad ); -#ifdef ARITH_HUFF_CODER_CHANGES - table_idx_val = ivas_get_spar_table_idx(hEncoderConfig->ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL); - ndmx = ivas_spar_br_table_consts[table_idx_val].nchan_transport; - if (hMdEnc->spar_md_cfg.AGC_status) - { - AGC_bits = (ndmx == 1) ? AGC_BITS_PER_CH : AGC_SIGNALLING_BITS + AGC_BITS_PER_CH * ndmx; - } - else - { - AGC_bits = AGC_SIGNALLING_BITS; - } - dirac_bits = min(max_md_bit_dirac + 1, 500); - hMdEnc->spar_md_cfg.WC_value = hMdEnc->spar_md_cfg.max_bits_per_blk + AGC_bits + hMdEnc->spar_md_cfg.PCA_val + dirac_bits; -#endif + for ( i = 0; i < MAX_CODING_STRATS; i++ ) { strat = cs[i]; if ( strat != NO_STRAT ) { -#ifndef ARITH_HUFF_CODER_CHANGES - reset_indices_enc( &hMetaData_tmp, MAX_BITS_METADATA ); - +#ifdef ARITH_HUFF_CODER_CHANGES + reset_indices_enc( &hMetaData_tmp, md_indices_allocated ); #else - reset_indices_enc( &hMetaData_tmp, hMdEnc->spar_md_cfg.max_md_bits_sba ); - + reset_indices_enc( &hMetaData_tmp, MAX_BITS_METADATA ); #endif ivas_write_spar_md_bitstream( hMdEnc, num_bands, bands_bw, &hMetaData_tmp, hEncoderConfig->ivas_total_brate, strat, qsi, planarCP ); #ifdef ARITH_HUFF_CODER_CHANGES - if ( (hMetaData_tmp.nb_bits_tot <= hMdEnc->spar_md_cfg.WC_value) && ( hMetaData->nb_bits_tot == bit_pos_start || ( hMetaData_tmp.nb_bits_tot < ( hMetaData->nb_bits_tot - bit_pos_start ) ) ) ) -#else - if ( hMetaData->nb_bits_tot == bit_pos_start || (hMetaData_tmp.nb_bits_tot < (hMetaData->nb_bits_tot - bit_pos_start))) + /*write to main buffer if its a valid bitstream*/ + if ( hMetaData_tmp.nb_bits_tot > 0 ) #endif { - write_metadata_buffer( &hMetaData_tmp, hMetaData, bit_pos_start, next_ind_start, last_ind_start ); - code_strat = strat; - } - if ( hMetaData->nb_bits_tot - bit_pos_start + ( ( ( hEncoderConfig->ivas_total_brate == IVAS_256k ) && ( sba_order == SBA_FOA_ORDER ) ) ? 1 : 0 ) <= hMdEnc->spar_md_cfg.tgt_bits_per_blk ) - { - packed_ok = 1; - break; + if ( hMetaData->nb_bits_tot == bit_pos_start || ( hMetaData_tmp.nb_bits_tot < ( hMetaData->nb_bits_tot - bit_pos_start ) ) ) + { + write_metadata_buffer( &hMetaData_tmp, hMetaData, bit_pos_start, next_ind_start, last_ind_start ); + code_strat = strat; + } + if ( hMetaData->nb_bits_tot - bit_pos_start + ( ( ( hEncoderConfig->ivas_total_brate == IVAS_256k ) && ( sba_order == SBA_FOA_ORDER ) ) ? 1 : 0 ) <= hMdEnc->spar_md_cfg.tgt_bits_per_blk ) + { + packed_ok = 1; + break; + } } } } @@ -943,12 +925,27 @@ ivas_error ivas_spar_md_enc_process( break; } - if ( hMetaData->nb_bits_tot - bit_pos_start + ( ( ( hEncoderConfig->ivas_total_brate == IVAS_256k ) && ( sba_order == SBA_FOA_ORDER ) ) ? 1 : 0 ) <= hMdEnc->spar_md_cfg.max_bits_per_blk ) +#ifdef ARITH_HUFF_CODER_CHANGES + /*only if valid bitstream was written to main buffer*/ + if ( hMetaData->nb_bits_tot > bit_pos_start ) +#endif { - break; + if ( hMetaData->nb_bits_tot - bit_pos_start + ( ( ( hEncoderConfig->ivas_total_brate == IVAS_256k ) && ( sba_order == SBA_FOA_ORDER ) ) ? 1 : 0 ) <= hMdEnc->spar_md_cfg.max_bits_per_blk ) + { +#ifdef ARITH_HUFF_CODER_CHANGES + packed_ok = 1; +#endif + break; + } } } +#ifdef ARITH_HUFF_CODER_CHANGES + if ( dtx_vad == 1 ) + { + assert( packed_ok == 1 ); + } +#endif if ( hEncoderConfig->ivas_total_brate >= IVAS_256k ) { assert( qsi == 0 ); @@ -1133,6 +1130,10 @@ ivas_error ivas_spar_md_enc_process( hMdEnc->spar_md.dtx_vad = dtx_vad; hMdEnc->spar_md.num_bands = num_bands; +#ifdef ARITH_HUFF_CODER_CHANGES + free( ind_list_tmp ); +#endif + return IVAS_ERR_OK; } @@ -1202,6 +1203,9 @@ static void ivas_write_spar_md_bitstream( { int16_t no_ec, i; int16_t do_diff[IVAS_MAX_NUM_BANDS]; +#ifdef ARITH_HUFF_CODER_CHANGES + int16_t entropy_coding_result; +#endif if ( strat == NO_STRAT ) { @@ -1279,13 +1283,26 @@ static void ivas_write_spar_md_bitstream( #endif if ( no_ec == 1 ) { - ivas_get_huffman_coded_bs( hMdEnc, hMetaData, nB, qsi, planarCP ); +#ifdef ARITH_HUFF_CODER_CHANGES + entropy_coding_result = +#endif + ivas_get_huffman_coded_bs( hMdEnc, hMetaData, nB, qsi, planarCP ); } else { - ivas_get_arith_coded_bs( hMdEnc, hMetaData, do_diff, bands_bw, nB, qsi, planarCP ); +#ifdef ARITH_HUFF_CODER_CHANGES + entropy_coding_result = +#endif + ivas_get_arith_coded_bs( hMdEnc, hMetaData, do_diff, bands_bw, nB, qsi, planarCP ); } +#ifdef ARITH_HUFF_CODER_CHANGES + if ( entropy_coding_result < 0 ) + { + hMetaData->nb_bits_tot = 0; + } +#endif + return; } @@ -1295,8 +1312,11 @@ static void ivas_write_spar_md_bitstream( * * Generate huffman coded bitstream *-----------------------------------------------------------------------------------------*/ - +#ifdef ARITH_HUFF_CODER_CHANGES +static int16_t ivas_get_huffman_coded_bs( +#else static void ivas_get_huffman_coded_bs( +#endif ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t nB, @@ -1318,7 +1338,7 @@ static void ivas_get_huffman_coded_bs( { if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) { - pred_offset = FOA_CHANNELS - 1; + pred_offset = DIRAC_TO_SPAR_HBR_PRED_CHS; } } @@ -1327,13 +1347,13 @@ static void ivas_get_huffman_coded_bs( for ( j = pred_offset; j < pred_coeff_dim; j++ ) { ivas_huffman_encode( &hMdEnc->huff_coeffs.pred_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j], &code, &len ); - push_next_indice( hMetaData, code, len ); #ifdef ARITH_HUFF_CODER_CHANGES - if ( ( hMetaData->nb_bits_tot ) > hMdEnc->spar_md_cfg.max_bits_per_blk ) + if ( ( hMetaData->nb_bits_tot + len ) > hMdEnc->spar_md_cfg.max_bits_per_blk ) { - return; + return -1; } #endif + push_next_indice( hMetaData, code, len ); } for ( j = 0; j < ndec * ( ndm - 1 ); j++ ) @@ -1341,13 +1361,13 @@ static void ivas_get_huffman_coded_bs( if ( keep_planar[(int16_t) floor( j / ( ndm - 1 ) )] ) { ivas_huffman_encode( &hMdEnc->huff_coeffs.drct_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].drct_index_re[j], &code, &len ); - push_next_indice( hMetaData, code, len ); #ifdef ARITH_HUFF_CODER_CHANGES - if ( ( hMetaData->nb_bits_tot ) > hMdEnc->spar_md_cfg.max_bits_per_blk ) + if ( ( hMetaData->nb_bits_tot + len ) > hMdEnc->spar_md_cfg.max_bits_per_blk ) { - return; + return -1; } #endif + push_next_indice( hMetaData, code, len ); } } @@ -1356,13 +1376,13 @@ static void ivas_get_huffman_coded_bs( if ( keep_planar[j] ) { ivas_huffman_encode( &hMdEnc->huff_coeffs.decd_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].decd_index_re[j], &code, &len ); - push_next_indice( hMetaData, code, len ); #ifdef ARITH_HUFF_CODER_CHANGES - if ( ( hMetaData->nb_bits_tot ) > hMdEnc->spar_md_cfg.max_bits_per_blk ) + if ( ( hMetaData->nb_bits_tot + len ) > hMdEnc->spar_md_cfg.max_bits_per_blk ) { - return; + return -1; } #endif + push_next_indice( hMetaData, code, len ); } } } @@ -1371,42 +1391,46 @@ static void ivas_get_huffman_coded_bs( for ( j = pred_offset; j < pred_coeff_dim; j++ ) { ivas_huffman_encode( &hMdEnc->huff_coeffs.pred_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j], &code, &len ); - push_next_indice( hMetaData, code, len ); #ifdef ARITH_HUFF_CODER_CHANGES - if ( ( hMetaData->nb_bits_tot ) > hMdEnc->spar_md_cfg.max_bits_per_blk ) + if ( ( hMetaData->nb_bits_tot + len ) > hMdEnc->spar_md_cfg.max_bits_per_blk ) { - return; + return -1; } #endif + push_next_indice( hMetaData, code, len ); } for ( j = 0; j < ndec * ( ndm - 1 ); j++ ) { ivas_huffman_encode( &hMdEnc->huff_coeffs.drct_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].drct_index_re[j], &code, &len ); - push_next_indice( hMetaData, code, len ); #ifdef ARITH_HUFF_CODER_CHANGES - if ( ( hMetaData->nb_bits_tot ) > hMdEnc->spar_md_cfg.max_bits_per_blk ) + if ( ( hMetaData->nb_bits_tot + len ) > hMdEnc->spar_md_cfg.max_bits_per_blk ) { - return; + return -1; } #endif + push_next_indice( hMetaData, code, len ); } for ( j = 0; j < ndec; j++ ) { ivas_huffman_encode( &hMdEnc->huff_coeffs.decd_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].decd_index_re[j], &code, &len ); - push_next_indice( hMetaData, code, len ); #ifdef ARITH_HUFF_CODER_CHANGES - if ( ( hMetaData->nb_bits_tot ) > hMdEnc->spar_md_cfg.max_bits_per_blk ) + if ( ( hMetaData->nb_bits_tot + len ) > hMdEnc->spar_md_cfg.max_bits_per_blk ) { - return; + return -1; } #endif + push_next_indice( hMetaData, code, len ); } } } +#ifdef ARITH_HUFF_CODER_CHANGES + return 0; +#else return; +#endif } @@ -1415,8 +1439,11 @@ static void ivas_get_huffman_coded_bs( * * Generate arithmetic coded bitstream *-----------------------------------------------------------------------------------------*/ - +#ifdef ARITH_HUFF_CODER_CHANGES +static int16_t ivas_get_arith_coded_bs( +#else static void ivas_get_arith_coded_bs( +#endif ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t *pDo_diff, @@ -1432,6 +1459,10 @@ static void ivas_get_arith_coded_bs( ivas_cell_dim_t decx_cell_dims[IVAS_MAX_NUM_BANDS]; int16_t symbol_arr_re[IVAS_MAX_INPUT_LEN]; int16_t symbol_arr_old_re[IVAS_MAX_INPUT_LEN]; +#ifdef ARITH_HUFF_CODER_CHANGES + int16_t arith_result; +#endif + for ( i = 0; i < nB; i++ ) { int16_t ndm, ndec; @@ -1442,7 +1473,7 @@ static void ivas_get_arith_coded_bs( { if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) { - pred_cell_dims[i].dim1 -= ( FOA_CHANNELS - 1 ); + pred_cell_dims[i].dim1 -= DIRAC_TO_SPAR_HBR_PRED_CHS; } } pred_cell_dims[i].dim2 = 1; @@ -1472,12 +1503,12 @@ static void ivas_get_arith_coded_bs( for ( j = 0; j < pred_cell_dims[i].dim1; j++ ) { hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j] = - hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j + ( FOA_CHANNELS - 1 )]; + hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j + DIRAC_TO_SPAR_HBR_PRED_CHS]; if ( any_diff == 1 ) { hMdEnc->spar_md_prior.band_coeffs_idx_mapped[i].pred_index_re[j] = - hMdEnc->spar_md_prior.band_coeffs_idx_mapped[i].pred_index_re[j + ( FOA_CHANNELS - 1 )]; + hMdEnc->spar_md_prior.band_coeffs_idx_mapped[i].pred_index_re[j + DIRAC_TO_SPAR_HBR_PRED_CHS]; } } } @@ -1490,13 +1521,19 @@ static void ivas_get_arith_coded_bs( ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md_prior.band_coeffs_idx_mapped, nB, symbol_arr_old_re, pred_cell_dims, PRED_COEFF, planarCP ); } - ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.pred_arith_re[qsi], &hMdEnc->arith_coeffs.pred_arith_re_diff[qsi], pDo_diff, nB, - symbol_arr_re, symbol_arr_old_re, pred_cell_dims, hMetaData, any_diff #ifdef ARITH_HUFF_CODER_CHANGES - , - hMdEnc->spar_md_cfg.max_bits_per_blk + arith_result = ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.pred_arith_re[qsi], &hMdEnc->arith_coeffs.pred_arith_re_diff[qsi], pDo_diff, nB, + symbol_arr_re, symbol_arr_old_re, pred_cell_dims, hMetaData, any_diff, + hMdEnc->spar_md_cfg.max_bits_per_blk ); + if ( arith_result < 0 ) + { + return -1; + } +#else + ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.pred_arith_re[qsi], &hMdEnc->arith_coeffs.pred_arith_re_diff[qsi], pDo_diff, nB, + symbol_arr_re, symbol_arr_old_re, pred_cell_dims, hMetaData, any_diff ); #endif - ); + if ( hMdEnc->spar_hoa_md_flag ) { for ( i = 0; i < nB; i++ ) @@ -1505,10 +1542,10 @@ static void ivas_get_arith_coded_bs( { for ( j = pred_cell_dims[i].dim1 - 1; j >= 0; j-- ) { - hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j + ( FOA_CHANNELS - 1 )] = + hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j + DIRAC_TO_SPAR_HBR_PRED_CHS] = hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j]; } - for ( j = 0; j < FOA_CHANNELS - 1; j++ ) + for ( j = 0; j < DIRAC_TO_SPAR_HBR_PRED_CHS; j++ ) { hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j] = 0; } @@ -1537,13 +1574,19 @@ static void ivas_get_arith_coded_bs( } } - ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.drct_arith_re[qsi], &hMdEnc->arith_coeffs.drct_arith_re_diff[qsi], pDo_diff, nB, - symbol_arr_re, symbol_arr_old_re, drct_cell_dims, hMetaData, any_diff #ifdef ARITH_HUFF_CODER_CHANGES - , - hMdEnc->spar_md_cfg.max_bits_per_blk + arith_result = ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.drct_arith_re[qsi], &hMdEnc->arith_coeffs.drct_arith_re_diff[qsi], pDo_diff, nB, + symbol_arr_re, symbol_arr_old_re, drct_cell_dims, hMetaData, any_diff, + hMdEnc->spar_md_cfg.max_bits_per_blk ); + if ( arith_result < 0 ) + { + return -1; + } +#else + ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.drct_arith_re[qsi], &hMdEnc->arith_coeffs.drct_arith_re_diff[qsi], pDo_diff, nB, + symbol_arr_re, symbol_arr_old_re, drct_cell_dims, hMetaData, any_diff ); #endif - ); + ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md.band_coeffs_idx, nB, symbol_arr_re, decd_cell_dims, DECD_COEFF, planarCP ); @@ -1559,14 +1602,19 @@ static void ivas_get_arith_coded_bs( decd_cell_dims[i].dim1 = decd_cell_dims[i].dim1 - IVAS_SPAR_HOA3_NP_CHS; } } - - ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.decd_arith_re[qsi], &hMdEnc->arith_coeffs.decd_arith_re_diff[qsi], pDo_diff, nB, - symbol_arr_re, symbol_arr_old_re, decd_cell_dims, hMetaData, any_diff #ifdef ARITH_HUFF_CODER_CHANGES - , - hMdEnc->spar_md_cfg.max_bits_per_blk + arith_result = ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.decd_arith_re[qsi], &hMdEnc->arith_coeffs.decd_arith_re_diff[qsi], pDo_diff, nB, + symbol_arr_re, symbol_arr_old_re, decd_cell_dims, hMetaData, any_diff, + hMdEnc->spar_md_cfg.max_bits_per_blk ); + if ( arith_result < 0 ) + { + return -1; + } +#else + ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.decd_arith_re[qsi], &hMdEnc->arith_coeffs.decd_arith_re_diff[qsi], pDo_diff, nB, + symbol_arr_re, symbol_arr_old_re, decd_cell_dims, hMetaData, any_diff ); #endif - ); + ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md.band_coeffs_idx, nB, symbol_arr_re, decx_cell_dims, DECX_COEFF, planarCP ); @@ -1575,7 +1623,11 @@ static void ivas_get_arith_coded_bs( ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md_prior.band_coeffs_idx_mapped, nB, symbol_arr_old_re, decx_cell_dims, DECX_COEFF, planarCP ); } +#ifdef ARITH_HUFF_CODER_CHANGES + return 0; +#else return; +#endif } -- GitLab From 5f626b9c79ae9a91afe4eb361842212375c888dc Mon Sep 17 00:00:00 2001 From: Shikha Shetgeri <100861@ittiam.com> Date: Tue, 4 Apr 2023 18:45:39 +0530 Subject: [PATCH 041/331] resolved instrumentation build errors --- lib_dec/ivas_ism_dec.c | 19 ++++++++++++++++++- lib_enc/ivas_spar_md_enc.c | 4 ++-- lib_enc/ivas_stat_enc.h | 3 ++- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index e6571e83d9..c9ec616573 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -377,9 +377,25 @@ ivas_error ivas_ism_dec_config( #ifdef NCHAN_ISM_PARAMETER switch ( st_ivas->nchan_ism ) + { + case 1: + st_ivas->transport_config = AUDIO_CONFIG_ISM1; + break; + case 2: + st_ivas->transport_config = AUDIO_CONFIG_ISM2; + break; + case 3: + st_ivas->transport_config = AUDIO_CONFIG_ISM3; + break; + case 4: + st_ivas->transport_config = AUDIO_CONFIG_ISM4; + break; + default: + st_ivas->transport_config = AUDIO_CONFIG_INVALID; + break; + } #else switch ( num_obj ) -#endif { case 1: st_ivas->transport_config = AUDIO_CONFIG_ISM1; @@ -397,6 +413,7 @@ ivas_error ivas_ism_dec_config( st_ivas->transport_config = AUDIO_CONFIG_INVALID; break; } +#endif return error; } diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index 9d4993a493..45028a9575 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -1869,7 +1869,7 @@ static void ivas_write_parameter_bitstream_dtx( pr -= idx; pr_pd_bits = ivas_get_bits_to_encode( pd_q_lvls * pr_q_lvls ); - value = (uint16_t) ( pr * pd_q_lvls + pd ); + value = ( uint16_t )( pr * pd_q_lvls + pd ); push_next_indice( hMetaData, value, pr_pd_bits ); } @@ -1893,7 +1893,7 @@ static void ivas_write_parameter_bitstream_dtx( pr_idx2 = pSpar_md->band_coeffs_idx[i].pred_index_re[pr_idx_2 - 1]; pr_idx2 -= idx; - value = (uint16_t) ( pr_idx2 * pr_q_lvls1 + pr_idx1 ); + value = ( uint16_t )( pr_idx2 * pr_q_lvls1 + pr_idx1 ); pr_pr_bits = ivas_get_bits_to_encode( pr_q_lvls1 * pr_q_lvls2 ); diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 34fc5116d2..d1279e5540 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -1058,9 +1058,10 @@ typedef struct encoder_config_structure int16_t force; /* parameter to force specific "core" of the Core-Coder*/ int16_t mdct_stereo_mode_cmdl; /* mdct stereo mode forced from command-line, employed only when DEBUG_FORCE_MDCT_STEREO_MODE is activated */ #ifdef DEBUG_AGC_ENCODER_CMD_OPTION - int16_t Opt_AGC_ON; /* flag indicating AGC operation in SBA */ + //int16_t Opt_AGC_ON; /* flag indicating AGC operation in SBA */ #endif #endif + int16_t Opt_AGC_ON; /* flag indicating AGC operation in SBA */ } ENCODER_CONFIG, *ENCODER_CONFIG_HANDLE; -- GitLab From ab543b83178e8e93766379ebe0e2e2adf694fcc3 Mon Sep 17 00:00:00 2001 From: Shikha Shetgeri <100861@ittiam.com> Date: Tue, 4 Apr 2023 19:10:36 +0530 Subject: [PATCH 042/331] pipeline error fix - set1 --- lib_enc/ivas_sba_enc.c | 1 + lib_enc/ivas_spar_md_enc.c | 11 ++++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index 2a1d192378..26b243a423 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -336,4 +336,5 @@ int16_t ivas_sba_get_max_md_bits( } return max_md_bits; } + #endif \ No newline at end of file diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index 45028a9575..da83e9cb65 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -327,7 +327,12 @@ ivas_error ivas_spar_md_enc_init( ivas_spar_set_bitrate_config( &hMdEnc->spar_md_cfg, table_idx, ( hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND #ifdef ARITH_HUFF_CODER_CHANGES , - 1, hEncoderConfig->Opt_PCA_ON, ivas_agc_enc_get_flag( hEncoderConfig->Opt_AGC_ON, ivas_spar_br_table_consts[table_idx].nchan_transport ) + 1, hEncoderConfig->Opt_PCA_ON, +#ifndef DEBUG_AGC_ENCODER_CMD_OPTION + ivas_agc_enc_get_flag( ivas_spar_br_table_consts[table_idx].nchan_transport ) +#else + ivas_agc_enc_get_flag( hEncoderConfig->Opt_AGC_ON, ivas_spar_br_table_consts[table_idx].nchan_transport ) +#endif #endif ); @@ -1869,7 +1874,7 @@ static void ivas_write_parameter_bitstream_dtx( pr -= idx; pr_pd_bits = ivas_get_bits_to_encode( pd_q_lvls * pr_q_lvls ); - value = ( uint16_t )( pr * pd_q_lvls + pd ); + value = (uint16_t) ( pr * pd_q_lvls + pd ); push_next_indice( hMetaData, value, pr_pd_bits ); } @@ -1893,7 +1898,7 @@ static void ivas_write_parameter_bitstream_dtx( pr_idx2 = pSpar_md->band_coeffs_idx[i].pred_index_re[pr_idx_2 - 1]; pr_idx2 -= idx; - value = ( uint16_t )( pr_idx2 * pr_q_lvls1 + pr_idx1 ); + value = (uint16_t) ( pr_idx2 * pr_q_lvls1 + pr_idx1 ); pr_pr_bits = ivas_get_bits_to_encode( pr_q_lvls1 * pr_q_lvls2 ); -- GitLab From f9d1944b6ffafbe7971a1c611646dcdbbd5462cd Mon Sep 17 00:00:00 2001 From: Shikha Shetgeri <100861@ittiam.com> Date: Tue, 4 Apr 2023 20:27:12 +0530 Subject: [PATCH 043/331] pipeline error fix - set 2 --- lib_enc/ivas_sba_enc.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index 26b243a423..7b9bffe878 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -336,5 +336,4 @@ int16_t ivas_sba_get_max_md_bits( } return max_md_bits; } - -#endif \ No newline at end of file +#endif -- GitLab From 3e3a924dc21b8990db6fae1051c0cb7e5a0f3130 Mon Sep 17 00:00:00 2001 From: Vladimir Malenovsky Date: Thu, 13 Apr 2023 12:02:11 +0200 Subject: [PATCH 044/331] refactoring of ind_list allocation mechanism based on long buffer --- apps/encoder.c | 2 + lib_com/bitstream.c | 749 +++++++++++++++++++++----- lib_com/ivas_cnst.h | 3 + lib_com/ivas_prot.h | 3 - lib_com/options.h | 1 + lib_com/options.h.unchanged | 170 ++++++ lib_com/prot.h | 31 +- lib_enc/dtx.c | 2 +- lib_enc/enc_ppp.c | 2 +- lib_enc/evs_enc.c | 15 +- lib_enc/fd_cng_enc.c | 19 +- lib_enc/init_enc.c | 20 +- lib_enc/ivas_core_enc.c | 55 +- lib_enc/ivas_corecoder_enc_reconfig.c | 179 +++--- lib_enc/ivas_cpe_enc.c | 23 +- lib_enc/ivas_enc.c | 5 + lib_enc/ivas_init_enc.c | 81 ++- lib_enc/ivas_ism_dtx_enc.c | 4 +- lib_enc/ivas_ism_enc.c | 15 + lib_enc/ivas_ism_metadata_enc.c | 2 +- lib_enc/ivas_masa_enc.c | 33 -- lib_enc/ivas_mct_core_enc.c | 7 + lib_enc/ivas_mct_enc.c | 7 + lib_enc/ivas_mct_enc_mct.c | 19 + lib_enc/ivas_mdct_core_enc.c | 8 + lib_enc/ivas_qmetadata_enc.c | 2 +- lib_enc/ivas_sce_enc.c | 26 +- lib_enc/ivas_spar_encoder.c | 2 +- lib_enc/ivas_spar_md_enc.c | 13 +- lib_enc/ivas_stat_enc.h | 13 + lib_enc/ivas_stereo_mdct_core_enc.c | 34 +- lib_enc/ivas_stereo_td_enc.c | 54 ++ lib_enc/lib_enc.c | 102 ++++ lib_enc/stat_enc.h | 5 +- lib_enc/tcx_utils_enc.c | 7 +- 35 files changed, 1293 insertions(+), 420 deletions(-) create mode 100644 lib_com/options.h.unchanged diff --git a/apps/encoder.c b/apps/encoder.c index ff6f461838..5e5150d24c 100644 --- a/apps/encoder.c +++ b/apps/encoder.c @@ -760,10 +760,12 @@ int main( } frame++; +#ifndef DEBUG_IND_LIST if ( !arg.quietModeEnabled ) { fprintf( stdout, "%-8d\b\b\b\b\b\b\b\b", frame ); } +#endif #ifdef WMOPS update_mem(); diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index 5feaf34186..4d74baf88e 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -224,7 +224,7 @@ Word16 rate2EVSmode( /*-------------------------------------------------------------------* * ind_list_realloc() * - * Re-allocate the list of indices as the maximum number of allowed indices has changed + * Re-allocate the list of indices *-------------------------------------------------------------------*/ ivas_error ind_list_realloc( @@ -232,7 +232,7 @@ ivas_error ind_list_realloc( int16_t max_num_indices /* i : new maximum number of allowed indices in the list */ ) { - int16_t i; + int16_t i, ind_list_pos; INDICE_HANDLE new_ind_list; /* allocate new buffer of indices */ @@ -242,13 +242,14 @@ ivas_error ind_list_realloc( } /* move indices from the old list to the new list */ - i = 0; - while ( hBstr->ind_list[i].nb_bits > 0 && i < hBstr->max_num_indices ) + for ( i = 0; i < min(max_num_indices, *( hBstr->ivas_max_num_indices )); i++ ) { - new_ind_list[i].id = hBstr->ind_list[i].id; - new_ind_list[i].value = hBstr->ind_list[i].value; - new_ind_list[i].nb_bits = hBstr->ind_list[i].nb_bits; - i++; + if ( hBstr->ivas_ind_list_zero[i].nb_bits > -1 ) + { + new_ind_list[i].id = hBstr->ivas_ind_list_zero[i].id; + new_ind_list[i].value = hBstr->ivas_ind_list_zero[i].value; + } + new_ind_list[i].nb_bits = hBstr->ivas_ind_list_zero[i].nb_bits; } /* reset nb_bits of all other indices to -1 */ @@ -257,125 +258,465 @@ ivas_error ind_list_realloc( new_ind_list[i].nb_bits = -1; } + /* get the current position inside the old list */ + ind_list_pos = (int16_t)(hBstr->ind_list - hBstr->ivas_ind_list_zero); + /* free the old list */ - free( hBstr->ind_list ); + free( hBstr->ivas_ind_list_zero ); - /* set pointer to the new list */ - hBstr->ind_list = new_ind_list; + /* set pointers in the new list */ + hBstr->ind_list = &new_ind_list[ind_list_pos]; + hBstr->ivas_ind_list_zero = new_ind_list; - /* set the new maximum for the allowed number of indices */ - hBstr->max_num_indices = max_num_indices; + /* set the new maximum number of indices */ + *(hBstr->ivas_max_num_indices) = max_num_indices; return IVAS_ERR_OK; } /*-----------------------------------------------------------------------* - * get_max_num_indices() + * get_ivas_max_num_indices() * - * Set the maximum allowed number of indices in the list + * Get the maximum allowed number of indices in the encoder *-----------------------------------------------------------------------*/ -int16_t get_max_num_indices( /* o : maximum number of indices */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const int32_t total_brate /* i : total bitrate */ +int16_t get_ivas_max_num_indices( /* o : maximum number of indices */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ ) { - /* set the maximum required number of indices */ - if ( ivas_format == MONO_FORMAT ) + if ( ivas_format == STEREO_FORMAT ) { - if ( total_brate < IVAS_24k4 ) + if ( ivas_total_brate <= IVAS_16k4 ) + { + return 300; + } + else if ( ivas_total_brate <= IVAS_24k4 ) + { + return 400; + } + else if ( ivas_total_brate <= IVAS_32k ) { return 450; } + else if ( ivas_total_brate <= IVAS_48k ) + { + return 650; + } + else if ( ivas_total_brate <= IVAS_80k ) + { + return 750; + } + else if ( ivas_total_brate <= IVAS_128k ) + { + return 850; + } + else if ( ivas_total_brate <= IVAS_192k ) + { + return 950; + } + else if ( ivas_total_brate <= IVAS_256k ) + { + return 1350; + } else { - return 450; + return 1650; } } - else if ( ivas_format == STEREO_FORMAT ) + else if ( ivas_format == ISM_FORMAT || ivas_format == MONO_FORMAT ) { - if ( total_brate < IVAS_24k4 ) + if ( ivas_total_brate <= IVAS_16k4 ) { return 250; } - else if ( total_brate < IVAS_128k ) + else if ( ivas_total_brate <= IVAS_24k4 ) + { + return 350; + } + else if ( ivas_total_brate <= IVAS_32k ) { return 450; } - else + else if ( ivas_total_brate <= IVAS_48k ) { return 550; } - } - else if ( ivas_format == ISM_FORMAT ) - { - if ( total_brate < IVAS_24k4 ) + else if ( ivas_total_brate <= IVAS_64k ) { - return 250; + return 620; } - else if ( total_brate < IVAS_128k ) + else if ( ivas_total_brate <= IVAS_80k ) { - return 450; + return 670; + } + else if ( ivas_total_brate <= IVAS_96k ) + { + return 780; + } + else if ( ivas_total_brate <= IVAS_128k ) + { + return 880; + } + else if ( ivas_total_brate <= IVAS_192k ) + { + return 950; + } + else if ( ivas_total_brate <= IVAS_256k ) + { + return 1100; + } + else if ( ivas_total_brate <= IVAS_384k ) + { + return 1300; } else { - return 760; + return 1650; } } else if ( ivas_format == SBA_FORMAT ) { - if ( total_brate < IVAS_24k4 ) + if ( ivas_total_brate <= IVAS_16k4 ) { return 250; } - else if ( total_brate < IVAS_128k ) + else if ( ivas_total_brate <= IVAS_24k4 ) { - return 450; + return 350; + } + else if ( ivas_total_brate <= IVAS_32k ) + { + return 400; + } + else if ( ivas_total_brate <= IVAS_48k ) + { + return 650; + } + else if ( ivas_total_brate <= IVAS_80k ) + { + return 750; + } + else if ( ivas_total_brate <= IVAS_128k ) + { + return 1020; + } + else if ( ivas_total_brate <= IVAS_160k ) + { + return 1160; + } + else if ( ivas_total_brate <= IVAS_192k ) + { + return 1220; + } + else if ( ivas_total_brate <= IVAS_256k ) + { + return 1300; + } + else if ( ivas_total_brate <= IVAS_384k ) + { + return 1720; } else { - return 700; + return 2000; } } else if ( ivas_format == MASA_FORMAT ) { - if ( total_brate < IVAS_24k4 ) + if ( ivas_total_brate <= IVAS_16k4 ) + { + return 300; + } + else if ( ivas_total_brate <= IVAS_32k ) + { + return 400; + } + else if ( ivas_total_brate <= IVAS_48k ) + { + return 650; + } + else if ( ivas_total_brate <= IVAS_80k ) + { + return 750; + } + else if ( ivas_total_brate <= IVAS_160k ) + { + return 850; + } + else if ( ivas_total_brate <= IVAS_192k ) + { + return 950; + } + else if ( ivas_total_brate <= IVAS_256k ) + { + return 1150; + } + else if ( ivas_total_brate <= IVAS_384k ) + { + return 1450; + } + else + { + return 1650; + } + } + else if ( ivas_format == MC_FORMAT ) + { + if ( ivas_total_brate <= IVAS_16k4 ) { return 250; } - else if ( total_brate < IVAS_160k ) + else if ( ivas_total_brate <= IVAS_24k4 ) { - return 450; + return 350; + } + else if ( ivas_total_brate <= IVAS_32k ) + { + return 400; + } + else if ( ivas_total_brate <= IVAS_48k ) + { + return 650; + } + else if ( ivas_total_brate <= IVAS_64k ) + { + return 750; + } + else if ( ivas_total_brate <= IVAS_80k ) + { + return 850; + } + else if ( ivas_total_brate <= IVAS_128k ) + { + return 1150; + } + else if ( ivas_total_brate <= IVAS_160k ) + { + return 1420; + } + else if ( ivas_total_brate <= IVAS_256k ) + { + return 2120; + } + else if ( ivas_total_brate <= IVAS_384k ) + { + return 2250; } else + { + return 2450; + } + } + + return 2450; +} + +/*-----------------------------------------------------------------------* + * get_core_max_num_indices() + * + * Get the maximum allowed number of indices in the core coder + *-----------------------------------------------------------------------*/ + +int16_t get_core_max_num_indices( /* o : maximum number of indices */ + const int16_t core, /* i : core */ + const int32_t total_brate /* i : total bitrate */ +) +{ + /* set the maximum number of indices in the core coder */ + if ( core == ACELP_CORE || core == AMR_WB_CORE ) + { + if ( total_brate <= 9600 ) + { + return 60; + } + else if ( total_brate <= IVAS_13k2 ) + { + return 70; + } + else if ( total_brate <= IVAS_16k4 ) + { + return 80; + } + else if ( total_brate <= IVAS_24k4 ) + { + return 100; + } + else if ( total_brate <= IVAS_32k ) + { + return 180; + } + else if ( total_brate <= IVAS_48k ) + { + return 340; + } + else if ( total_brate <= IVAS_80k ) + { + return 450; + } + else if ( total_brate <= IVAS_96k ) + { + return 500; + } + else if ( total_brate <= IVAS_128k ) + { + return 550; + } + else if ( total_brate <= IVAS_160k ) + { + return 600; + } + else if ( total_brate <= IVAS_192k ) + { + return 650; + } + else if ( total_brate <= IVAS_256k ) { return 700; } + else + { + return 800; + } } - else if ( ivas_format == MC_FORMAT ) + else if ( core == TCX_20_CORE || core == TCX_10_CORE ) + { + if ( total_brate <= 9600 ) + { + return 100; + } + else if ( total_brate <= IVAS_13k2 ) + { + return 150; + } + else if ( total_brate <= IVAS_16k4 ) + { + return 200; + } + else if ( total_brate <= IVAS_24k4 ) + { + return 310; + } + else if ( total_brate <= IVAS_32k ) + { + return 330; + } + else if ( total_brate <= IVAS_48k ) + { + return 340; + } + else if ( total_brate <= IVAS_80k ) + { + return 380; + } + else if ( total_brate <= IVAS_96k ) + { + return 400; + } + else if ( total_brate <= IVAS_128k ) + { + return 460; + } + else if ( total_brate <= IVAS_160k ) + { + return 470; + } + else if ( total_brate <= IVAS_192k ) + { + return 570; + } + else if ( total_brate <= IVAS_256k ) + { + return 680; + } + else + { + return 800; + } + } + else if ( core == HQ_CORE ) { - if ( total_brate < IVAS_24k4 ) + if ( total_brate <= 9600 ) + { + return 100; + } + else if ( total_brate <= IVAS_16k4 ) + { + return 200; + } + else if ( total_brate <= IVAS_24k4 ) + { + return 240; + } + else if ( total_brate <= IVAS_32k ) + { + return 300; + } + else if ( total_brate <= IVAS_48k ) + { + return 380; + } + else if ( total_brate <= IVAS_96k ) + { + return 400; + } + else if ( total_brate <= IVAS_128k ) { return 450; } + else if ( total_brate <= IVAS_160k ) + { + return 550; + } + else if ( total_brate <= IVAS_192k ) + { + return 600; + } + else if ( total_brate <= IVAS_256k ) + { + return 700; + } else { - return 1050; + return 800; } } + else + { + return 50; + } +} + +/*-----------------------------------------------------------------------* + * get_BWE_max_num_indices() + * + * Get the maximum number of indices in the BWE + *-----------------------------------------------------------------------*/ - return 1050; +int16_t get_BWE_max_num_indices( /* o : maximum number of indices */ + const int32_t extl_brate /* i : extensiona layer bitrate */ +) +{ + /* set the maximum number of indices in the BWE */ + if ( extl_brate < SWB_BWE_16k ) + { + return 30; + } + else + { + return 150; + } } + -#ifdef IND_LIST_DYN /*-----------------------------------------------------------------------* - * set_max_set_max_num_indices_metadatanum_indices() + * get_ivas_max_num_indices_metadata() * * Set the maximum allowed number of metadata indices in the list *-----------------------------------------------------------------------*/ -int16_t get_max_num_indices_metadata( /* o : maximum number of indices */ +int16_t get_ivas_max_num_indices_metadata( /* o : maximum number of indices */ const IVAS_FORMAT ivas_format, /* i : IVAS format */ const int32_t ivas_total_brate /* i : IVAS total bitrate */ ) @@ -387,71 +728,235 @@ int16_t get_max_num_indices_metadata( /* o : max } else if ( ivas_format == STEREO_FORMAT ) { - return 80; + if ( ivas_total_brate <= IVAS_16k4 ) + { + return 40; + } + else + { + return 80; + } } else if ( ivas_format == ISM_FORMAT ) { - return 60; + if ( ivas_total_brate <= IVAS_16k4 ) + { + return 20; + } + else if ( ivas_total_brate <= IVAS_32k ) + { + return 65; + } + else + { + return 30; + } } else if ( ivas_format == SBA_FORMAT ) { - if ( ivas_total_brate < IVAS_24k4 ) + if ( ivas_total_brate <= IVAS_16k4 ) { - return 80; + return 100; } - else if ( ivas_total_brate < IVAS_48k ) + else if ( ivas_total_brate <= IVAS_24k4 ) { - return 670; + return 200; + } + else if ( ivas_total_brate <= IVAS_32k ) + { + return 250; + } + else if ( ivas_total_brate <= IVAS_192k ) + { + return 300; + } + else if ( ivas_total_brate <= IVAS_256k ) + { + return 1000; + } + else if ( ivas_total_brate <= IVAS_384k ) + { + return 1000; } else { - return 1060; + return 1000; } } else if ( ivas_format == MASA_FORMAT ) { - if ( ivas_total_brate < IVAS_32k ) + if ( ivas_total_brate <= IVAS_16k4 ) { - return 90; + return 80; } - else if ( ivas_total_brate < IVAS_48k ) + else if ( ivas_total_brate <= IVAS_32k ) { - return 130; + return 110; } - else if ( ivas_total_brate < IVAS_192k ) + else if ( ivas_total_brate <= IVAS_48k ) { - return 330; + return 180; } - else if ( ivas_total_brate < IVAS_384k ) + else if ( ivas_total_brate <= IVAS_96k ) { - return 1000; + return 200; + } + else if ( ivas_total_brate <= IVAS_128k ) + { + return 250; + } + else if ( ivas_total_brate <= IVAS_160k ) + { + return 320; + } + else if ( ivas_total_brate <= IVAS_192k ) + { + return 430; + } + else if ( ivas_total_brate <= IVAS_256k ) + { + return 600; + } + else if ( ivas_total_brate <= IVAS_384k ) + { + return 850; } else { - return 1950; + return 900; } } else if ( ivas_format == MC_FORMAT ) { - if ( ivas_total_brate == IVAS_32k || ivas_total_brate == IVAS_48k || ivas_total_brate == IVAS_64k ) + if ( ivas_total_brate <= IVAS_13k2 ) { - return 300; + return 80; + } + else if ( ivas_total_brate <= IVAS_24k4 ) + { + return 100; + } + else if ( ivas_total_brate <= IVAS_64k ) + { + return 200; } - if ( ivas_total_brate == IVAS_80k || ivas_total_brate == IVAS_96k ) + else if ( ivas_total_brate <= IVAS_96k ) { - return 170; + return 220; } else { - return 90; + return 60; + } + } + + return 50; +} + +/*-------------------------------------------------------------------* + * move_indices() + * + * Move indices inside the buffer or among two buffers + *-------------------------------------------------------------------*/ + +ivas_error move_indices( + INDICE_HANDLE old_ind_list, /* i/o: old location of indices */ + INDICE_HANDLE new_ind_list, /* i/o: new location of indices */ + const int16_t nb_indices /* i : number of moved indices */ +) +{ + int16_t i; + ivas_error error; + + error = IVAS_ERR_OK; + + if ( new_ind_list < old_ind_list ) + { + for ( i = 0; i < nb_indices; i++ ) + { + new_ind_list[i].id = old_ind_list[i].id; + new_ind_list[i].value = old_ind_list[i].value; + new_ind_list[i].nb_bits = old_ind_list[i].nb_bits; + + old_ind_list[i].nb_bits = -1; + } + } + else if ( new_ind_list > old_ind_list ) + { + for ( i = nb_indices - 1; i >= 0; i-- ) + { + new_ind_list[i].id = old_ind_list[i].id; + new_ind_list[i].value = old_ind_list[i].value; + new_ind_list[i].nb_bits = old_ind_list[i].nb_bits; + + old_ind_list[i].nb_bits = -1; } } - return 1050; + return error; } + #endif + +#ifdef IND_LIST_DYN +/*-------------------------------------------------------------------* + * check_ind_list_limits() + * + * Check, if if the maximum number of indices has been reached -> reallocate + * Check, if we will not overwrite an existing indice -> adjust the location + *-------------------------------------------------------------------*/ + +ivas_error check_ind_list_limits( + BSTR_ENC_HANDLE hBstr /* i/o: encoder bitstream handle */ +) +{ + ivas_error error; + + error = IVAS_ERR_OK; + + /* check, if the maximum number of indices has been reached and re-allocate the buffer */ + /* the re-allocation can be avoided by increasing the limits in get_ivas_max_num_indices() or get_ivas_max_num_indices_metadata() */ + if ( ( &hBstr->ind_list[hBstr->nb_ind_tot] - hBstr->ivas_ind_list_zero ) >= *( hBstr->ivas_max_num_indices ) ) + { +#ifdef DEBUGGING + fprintf( stderr, "Warning: The maximum number of indices %d has been exceeded in frame %d! Increase the limits in get_ivas_max_num_indices() or get_max_num_indices_metadata().\n", *( hBstr->ivas_max_num_indices ), frame ); #endif + /* reallocate the buffer of indices with increased limit */ + ind_list_realloc( hBstr, *( hBstr->ivas_max_num_indices ) + STEP_MAX_NUM_INDICES ); + } + + /* check, if we will not overwrite an existing indice */ + if ( hBstr->ind_list[hBstr->nb_ind_tot].nb_bits > 0 ) + { + if ( hBstr->nb_ind_tot == 0 ) + { +#ifdef DEBUGGING + fprintf( stderr, "Warning: Trying to overwrite an existing indice ID = %d in frame %d!\n", hBstr->ind_list[hBstr->nb_ind_tot].id, frame ); +#endif + /* move the pointer to the next available empty slot */ + while ( hBstr->ind_list[0].nb_bits > 0 && hBstr->ind_list < &hBstr->ivas_ind_list_zero[*( hBstr->ivas_max_num_indices )] ) + { + hBstr->ind_list++; + } + + if ( hBstr->ind_list >= &hBstr->ivas_ind_list_zero[*( hBstr->ivas_max_num_indices )] ) + { + /* no available empty slot -> need to re-allocate the buffer */ + ind_list_realloc( hBstr, *( hBstr->ivas_max_num_indices ) + STEP_MAX_NUM_INDICES ); + } + } + else + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Buffer of indices corrupted in frame %d! Attempt to overwrite indice ID = %d (value: %d, bits: %d)!\n", frame, hBstr->ind_list[hBstr->nb_ind_tot].id, hBstr->ind_list[hBstr->nb_ind_tot].value, hBstr->ind_list[hBstr->nb_ind_tot].nb_bits ); + } + } + + return error; +} +#endif + + /*-------------------------------------------------------------------* * push_indice() * @@ -491,6 +996,7 @@ ivas_error push_indice( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Indice ID = %d with value %d exceeds the range of %d bits (frame %d) !\n", id, value, nb_bits, frame ); } +#ifndef IND_LIST_DYN #if 0 /* mul, 2020-11-19: to be de-activated until proper solution found */ if ( nb_bits < 1 ) @@ -498,6 +1004,7 @@ ivas_error push_indice( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, " Trying to push indice ID = %d with value %d that has %d bits (frame %d) !\n", id, value, nb_bits, frame ); } else +#endif #endif if ( nb_bits > 16 ) { @@ -513,29 +1020,19 @@ ivas_error push_indice( #endif #ifdef IND_LIST_DYN - /* check, if the maximum number of indices has been reached and re-allocate the buffer */ - /* the re-allocation can be avoided by increasing the limits in get_max_num_indices() and get_max_num_indices_metadata() */ - if ( hBstr->nb_ind_tot >= hBstr->max_num_indices ) - { -#ifdef DEBUGGING - DEBUG_LINE( 0 ) - printf( "Warning: Maximum number of indices %d has been exceeded (frame %d)! Increase the limits in get_max_num_indices() or get_max_num_indices_metadata().\n", hBstr->max_num_indices, frame ); -#endif - - /* reallocate the buffer of indices with increased limit */ - ind_list_realloc( hBstr, hBstr->nb_ind_tot + STEP_MAX_NUM_INDICES ); - } + /* check the limits in the list of indices */ + error = check_ind_list_limits( hBstr ); #endif #ifdef IND_LIST_DYN - /* find the location in the list of indices */ + /* find the location in the list of indices based on ID */ i = hBstr->nb_ind_tot; while ( i > 0 && id < hBstr->ind_list[i - 1].id ) { i--; } - /* shift indices, if the new id is to be written somewhere inside the list */ + /* shift indices, if the new ID is to be written somewhere inside the list */ if ( i < hBstr->nb_ind_tot ) { for ( j = hBstr->nb_ind_tot; j > i; j-- ) @@ -646,21 +1143,10 @@ ivas_error push_next_indice( #endif #ifdef IND_LIST_DYN - /* check, if the maximum number of indices has been reached and re-allocate the buffer */ - /* the re-allocation can be avoided by increasing the limits in get_max_num_indices() and get_max_num_indices_metadata() */ - if ( hBstr->nb_ind_tot >= hBstr->max_num_indices ) - { -#ifdef DEBUGGING - DEBUG_LINE( 0 ) - printf( "Warning: Maximum number of indices %d has been exceeded (frame %d)! Increase the limits in get_max_num_indices() or get_max_num_indices_metadata().\n", hBstr->max_num_indices, frame ); + /* check the limits in the list of indices */ + error = check_ind_list_limits( hBstr ); #endif - /* reallocate the buffer of indices with increased limit */ - ind_list_realloc( hBstr, hBstr->nb_ind_tot + STEP_MAX_NUM_INDICES ); - } -#endif - - #ifdef IND_LIST_DYN /* get the id of the previous indice -> it will be re-used */ if ( hBstr->nb_ind_tot > 0 ) @@ -746,6 +1232,12 @@ void push_next_bits( { code = (uint16_t) ( ( bits[i] << 15 ) | ( ( bits[i + 1] << 14 ) | ( ( bits[i + 2] << 13 ) | ( ( bits[i + 3] << 12 ) | ( ( bits[i + 4] << 11 ) | ( ( bits[i + 5] << 10 ) | ( ( bits[i + 6] << 9 ) | ( ( bits[i + 7] << 8 ) | ( ( bits[i + 8] << 7 ) | ( ( bits[i + 9] << 6 ) | ( ( bits[i + 10] << 5 ) | ( ( bits[i + 11] << 4 ) | ( ( bits[i + 12] << 3 ) | ( ( bits[i + 13] << 2 ) | ( ( bits[i + 14] << 1 ) | bits[i + 15] ) ) ) ) ) ) ) ) ) ) ) ) ) ) ); +#ifdef IND_LIST_DYN + /* check the limits in the list of indices */ + check_ind_list_limits( hBstr ); + ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; +#endif + ptr->value = code; #ifdef DEBUG_BS_READ_WRITE printf( "code: %d\n", code ); @@ -755,32 +1247,17 @@ void push_next_bits( ptr->id = prev_id; hBstr->nb_ind_tot++; #endif - -#ifdef IND_LIST_DYN - /* check, if the maximum number of indices has been reached and re-allocate the buffer */ - /* the re-allocation can be avoided by increasing the limits in get_max_num_indices() and get_max_num_indices_metadata() */ - if ( hBstr->nb_ind_tot >= hBstr->max_num_indices ) - { -#ifdef DEBUGGING - DEBUG_LINE( 0 ) - printf( "Warning: Maximum number of indices %d has been exceeded (frame %d)! Increase the limits in get_max_num_indices() or get_max_num_indices_metadata().\n", hBstr->max_num_indices, frame ); -#endif - - /* reallocate the buffer of indices with increased limit */ - ind_list_realloc( hBstr, hBstr->nb_ind_tot + STEP_MAX_NUM_INDICES ); - ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; - } - else - { - ++ptr; - } -#else ++ptr; -#endif } for ( ; i < nb_bits; ++i ) { +#ifdef IND_LIST_DYN + /* check the limits in the list of indices */ + check_ind_list_limits( hBstr ); + ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; +#endif + ptr->value = bits[i]; #ifdef DEBUG_BS_READ_WRITE printf( "value: %d\n", ptr->value ); @@ -790,28 +1267,7 @@ void push_next_bits( ptr->id = prev_id; hBstr->nb_ind_tot++; #endif - -#ifdef IND_LIST_DYN - /* check, if the maximum number of indices has been reached and re-allocate the buffer */ - /* the re-allocation can be avoided by increasing the limits in get_max_num_indices() and get_max_num_indices_metadata() */ - if ( hBstr->nb_ind_tot >= hBstr->max_num_indices ) - { -#ifdef DEBUGGING - DEBUG_LINE( 0 ) - printf( "Warning: Maximum number of indices %d has been exceeded (frame %d)! Increase the limits in get_max_num_indices() or get_max_num_indices_metadata().\n", hBstr->max_num_indices, frame ); -#endif - - /* reallocate the buffer of indices with increased limit */ - ind_list_realloc( hBstr, hBstr->nb_ind_tot + STEP_MAX_NUM_INDICES ); - ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; - } - else - { - ++ptr; - } -#else ++ptr; -#endif } #ifndef IND_LIST_DYN @@ -1123,8 +1579,6 @@ void reset_indices_enc( hBstr->nb_ind_tot = 0; #else hBstr->next_ind = 0; -#endif -#ifndef IND_LIST_DYN hBstr->last_ind = -1; #endif @@ -1391,7 +1845,7 @@ static ivas_error write_indices_element( if ( st_ivas->hSCE[element_id]->hMetaData != NULL ) { #ifdef IND_LIST_DYN - reset_indices_enc( st_ivas->hSCE[element_id]->hMetaData, st_ivas->hSCE[element_id]->hMetaData->max_num_indices ); + reset_indices_enc( st_ivas->hSCE[element_id]->hMetaData, st_ivas->hSCE[element_id]->hMetaData->nb_ind_tot ); #else reset_indices_enc( st_ivas->hSCE[element_id]->hMetaData, MAX_BITS_METADATA ); #endif @@ -1399,7 +1853,7 @@ static ivas_error write_indices_element( reset_indices_enc( sts[0]->hBstr, #ifdef IND_LIST_DYN - sts[0]->hBstr->max_num_indices + sts[0]->hBstr->nb_ind_tot #else MAX_NUM_INDICES #endif @@ -1410,7 +1864,7 @@ static ivas_error write_indices_element( if ( st_ivas->hCPE[element_id]->hMetaData != NULL ) { #ifdef IND_LIST_DYN - reset_indices_enc( st_ivas->hCPE[element_id]->hMetaData, st_ivas->hCPE[element_id]->hMetaData->max_num_indices ); + reset_indices_enc( st_ivas->hCPE[element_id]->hMetaData, st_ivas->hCPE[element_id]->hMetaData->nb_ind_tot ); #else reset_indices_enc( st_ivas->hCPE[element_id]->hMetaData, MAX_BITS_METADATA ); #endif @@ -1418,9 +1872,9 @@ static ivas_error write_indices_element( for ( n = 0; n < n_channels; n++ ) { - reset_indices_enc( sts[n]->hBstr, + reset_indices_enc( sts[n]->hBstr, #ifdef IND_LIST_DYN - sts[n]->hBstr->max_num_indices + sts[n]->hBstr->nb_ind_tot #else MAX_NUM_INDICES #endif @@ -1471,6 +1925,7 @@ ivas_error write_indices_ivas( { sts = st_ivas->hSCE[n]->hCoreCoder; i += sts[0]->hBstr->nb_bits_tot; + if ( st_ivas->hSCE[n]->hMetaData != NULL ) { i += st_ivas->hSCE[n]->hMetaData->nb_bits_tot; @@ -1484,6 +1939,7 @@ ivas_error write_indices_ivas( { i += sts[ch]->hBstr->nb_bits_tot; } + if ( st_ivas->hCPE[n]->hMetaData != NULL ) { i += st_ivas->hCPE[n]->hMetaData->nb_bits_tot; @@ -1501,6 +1957,7 @@ ivas_error write_indices_ivas( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Bitstream write size mismatch! Actual bitrate: %ld vs. Reference bitrate: %d\n", i * 50L, ivas_total_brate ); } #endif + /*-----------------------------------------------------------------* * Encode Payload *-----------------------------------------------------------------*/ diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index b3a022b8cd..63acf66ad8 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -180,7 +180,10 @@ typedef enum #define MAX_NUM_METADATA max( 2, MAX_NUM_OBJECTS ) /* number of max. metadata (now only 2 for DirAC) */ #endif #ifdef IND_LIST_DYN +#define MIN_NUM_IND 10 /* minimum number of indices in the core coder */ +#define MAX_NUM_IND_LFE 100 /* maximum number of indices in the LFE encoder */ #define MAX_NUM_IND_TEMP_LIST 10 /* maximum number of indices in the temporary list */ +#define MAX_IND_TDM_TMP 10 /* maximum number of indices in the temporary list of TD stereo spatial parameters */ #endif #define IVAS_ENC_DELAY_NS ACELP_LOOK_NS diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 9184997dea..2aecd25d7c 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -2094,9 +2094,6 @@ void InternalTCXDecoder( void stereo_mdct_core_enc( CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ -#ifdef IND_LIST_DYN - const int16_t ivas_format, /* i : IVAS format */ -#endif float new_samples[CPE_CHANNELS][L_INP], /* i : new samples */ float old_wsp[CPE_CHANNELS][L_WSP], /* i : 12.8kHz weighted speech (for LTP */ float pitch_buf[CPE_CHANNELS][NB_SUBFR16k] /* o : floating pitch for each subframe */ diff --git a/lib_com/options.h b/lib_com/options.h index 4d935aa8af..18e8b3a585 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -133,6 +133,7 @@ #define BASOP_NOGLOB /* Disable global symbols in BASOPs, Overflow/Carry in BASOPs disabled, additional BASOPs in case of Overflow */ #define IND_LIST_DYN /* VA: Issue 18: Dynamic allocation of ind_list[] and ind_list_metadata[] based on # of transport channels */ +//#define DEBUG_IND_LIST #define LSF_RE_USE_SECONDARY_CHANNEL /* TD stereo Secondary channel LSF Q improvement */ #ifdef LSF_RE_USE_SECONDARY_CHANNEL diff --git a/lib_com/options.h.unchanged b/lib_com/options.h.unchanged new file mode 100644 index 0000000000..2e5949f967 --- /dev/null +++ b/lib_com/options.h.unchanged @@ -0,0 +1,170 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#ifndef OPTIONS_H +#define OPTIONS_H + +/* clang-format off */ +/* ################### Start compiler switches ######################## */ + +#define SUPPORT_JBM_TRACEFILE /* support for JBM tracefile, which is needed for 3GPP objective/subjective testing, but not relevant for real-world implementations */ + +/* #################### End compiler switches ######################### */ + + +/* ################### Start DEBUGGING switches ########################### */ + +#ifndef RELEASE +#define DEBUGGING /* Activate debugging part of the code */ +#endif +/*#define WMOPS*/ /* Activate complexity and memory counters */ +/*#define WMOPS_PER_FRAME*/ /* Output per-frame complexity (writes one float value per frame to the file "wmops_analysis") */ +/*#define WMOPS_DETAIL*/ /* Output detailed complexity printout for every function. Increases runtime overhead */ +/*#define WMOPS_WC_FRAME_ANALYSIS*/ /* Output detailed complexity analysis for the worst-case frame */ +/*#define MEM_COUNT_DETAILS*/ /* Output detailed memory analysis for the worst-case frame (writes to the file "mem_analysis.csv") */ + +#ifdef DEBUGGING + +/*#define DEBUG_MODE_INFO*/ /* output most important parameters to the subdirectory "res/" */ +#ifdef DEBUG_MODE_INFO +/*#define DEBUG_MODE_ACELP*/ /* output most important ACELP core parameters to the subdirectory "res/" */ +/*#define DEBUG_MODE_TCX*/ /* output most important TCX core parameters to the subdirectory "res/" */ +/*#define DEBUG_MODE_DFT*/ /* output most important DFT stereo parameters to the subdirectory "res/" */ +/*#define DEBUG_MODE_TD*/ /* output most important TD stereo parameters to the subdirectory "res/ */ +/*#define DEBUG_MODE_DIRAC*/ /* output most important DIRAC parameters to the subdirectory "res/" */ +/*#define DEBUG_MODE_MDCT*/ /* output most important MDCT parameters to the subdirectory "res/" */ +/*#define DEBUG_MODE_PARAM_MC */ /* output Parametric MC paramters to the subdirectory "res/" */ +/*#define DEBUG_MODE_PARAM_ISM*/ /* output Parametric ISM paramters to the subdirectory "res/" */ +/*#define DEBUG_MODE_INFO_TWEAK*/ /* enable command line switch to specify subdirectory for debug info output inside "./res/" */ +/*#define DEBUG_MODE_INFO_PLC */ /* define to output PLC related parameters */ +/*#define DEBUG_MODE_INFO_ALLRAD*/ /* define to output generated HOA decoding mtx */ +/*#define DEBUG_MODE_LFE */ /* define to output LFE relevant parameters */ +#endif + +#ifdef DEBUG_MODE_MDCT +#define DEBUG_PLOT_BITS +#endif + +#define ENABLE_BITRATE_VERIFICATION /* Enable bitrate verification - use when playing with bit budget */ +/*#define DEBUG_PLOT*/ +/*#define ALLOW_BYTE_EP*/ /* allow byte fer pattern files and check fer pattern file validity */ +#define WRAP_AS_EIDXOR /* wraps FER file (as in STL_eid-xor.c/softbit.c) */ + +#define DEBUG_FORCE_MDCT_STEREO_MODE /* Force stereo mode decision for MDCT stereo: -stere 3 1 forces L/R coding and -stereo 3 2 forces full M/S coding */ +/*#define DEBUG_STEREO_DFT_NOCORE*/ /* DFT stereo: by-pass core coder at decoder side*/ +/*#define DEBUG_STEREO_DFT_NOSTEREO*/ /* DFT stereo: by-pass stereo processing at encoder and decoder side*/ +/*#define DEBUG_STEREO_DFT_NOQRES*/ +/*#define DEBUG_STEREO_DFT_OUTRESPRED*/ /* output residual prediction signal instead of L/R*/ +/*#define DBG_STEREO_ICBWE2_TBE2K8*/ /* Enables TBE_2K8 for higher bitrates with ICBWE in operation for TD/DFT Stereo. Needs quality eval and currently only used for debugging purposes */ + +/*DirAC Debug switches*/ +/*#define DEBUG_DISABLE_DIRAC_DELAY_COMP */ /* temporarily disable delay compensation on DirAC encoder */ +/*#define DEBUG_BS_READ_WRITE*/ +/*#define DEBUG_MODE_DIRAC_NOCORE*/ +/*#define DEBUG_MODE_QMETADATA*/ /* output q_metadata parameters */ + +/*MCT Debug switches*/ +/*#define DEBUG_FORCE_MCT_CP*/ /* force MCT Stereo pairs for verification with SPAR */ +#ifdef DEBUG_FORCE_MCT_CP +/*#define DEBUG_SINGLE_CODE_OMNI*/ /* force 3 TC SBA always code W channel seperately */ +#endif + +/*PLC Debug switches*/ +/*#define DEBUG_NO_TONAL_PLC*/ +/*#define DEBUG_NO_TD_TCX_PLC */ +/*#define DEBUG_FORCE_TD_TCX_CONCEALMENT*/ +/*#define DEBUG_PLC_INFO*/ + +/*#define DEBUG_EFAP_POLY_TOFILE*/ /* Write poly_select values to file in EFAP, used for generating ROM LUTs */ +/*#define TDREND_HRTF_TABLE_METHODS*/ /* Enable HRTF lookup from tables, for testing & evaluation. Supply file in table format to use. Note that a suitable HR filter lookup method should be written if the filters sample point grids are not in the formats. */ +/*#define TDREND_STANDALONE*/ /* Used when renderer is built in standalone form, without IVAS encoding/decoding (see scripts/object_renderer_standalone). This is just here to ensure this is cleaned out by prepare_instrumentation.sh */ + +/*#define DEBUG_SBA*/ /* debug DIRAC/SPAR in-out */ +#ifdef DEBUG_SBA +/*#define DEBUG_SBA_AUDIO_DUMP*/ /* SBA intermediate audio wav file dumping */ +/*#define DEBUG_SBA_MD_DUMP*/ /* SBA metadata and variable file dumping */ +/*#define DEBUG_SPAR_MD_TARGET_TUNING*/ /* SPAR MD target bitrate tuning debug code */ +/*#define DEBUG_SPAR_BYPASS_EVS_CODEC*/ /* bypass EVS coding in float precision, emulating EVS encoder/decoder delay */ +/*#define DEBUG_SPAR_WRITE_OUT_COV*/ /* write covariance per frame into a text file for verification */ +/*#define DEBUG_SPAR_DIRAC_WRITE_OUT_PRED_PARS*/ +/*#define DEBUG_AGC*/ /* debug SPAR AGC in-out */ +#endif +/*#define SPAR_HOA_DBG*/ /* SPAR HOA debug statements */ +/*#define DEBUG_BINAURAL_FILTER_DESIGN*/ /* debugging of Crend binaural filter design */ +#define DEBUG_AGC_ENCODER_CMD_OPTION /* Ability to force enable or disable AGC behaviour in DIRAC/SPAR via command line option */ + +#endif +/* #################### End DEBUGGING switches ############################ */ + +/* ################# Start DEVELOPMENT switches ######################## */ + +#define BASOP_NOGLOB /* Disable global symbols in BASOPs, Overflow/Carry in BASOPs disabled, additional BASOPs in case of Overflow */ +//#define IND_LIST_DYN /* VA: Issue 18: Dynamic allocation of ind_list[] and ind_list_metadata[] based on # of transport channels */ +//#define DEBUG_VLAD + +#define LSF_RE_USE_SECONDARY_CHANNEL /* TD stereo Secondary channel LSF Q improvement */ +#ifdef LSF_RE_USE_SECONDARY_CHANNEL +/*#define LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE */ /* switch to isolate the reuse mode case */ +#endif +#define DISABLE_ADAP_RES_COD_TMP /* temporary fix for IVAS-403, disables adaptive residual coding */ +/*#define ITD_WINNER_GAIN_MODIFY */ /* ITD optimization - WORK IN PROGRESS */ +/*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ +#define FIX_I109_ORIENTATION_TRACKING /* Issue 109: Harmonize head and orientation tracking */ +/*#define SBA_HPF_TUNING_DEC*/ + +#define BINAURALIZATION_DELAY_REPORT /* VA: Issue 255 - Changes the way the decoder delay is reported */ +#define TUNE_360_OBJECT_WITH_NOISE /* VA: issue 360: consider objects being speech+noise for active speech coding */ +#define FIX_350_MASA_DELAY_COMP /* Nokia: Issue 350: MASA audio/meta delay compensation */ +#define FIX_372_LIB_REND_VALIDATE_IO /* FhG: Issue 372: IVAS_rend segfaults with unsupported I/O configs - add validation checks of I/O config */ +#define FIX_376_SBA_ROTATE /*DLB: Fix for issue 376*/ +#define TD5 /* Eri: Contribution 17: Extended metadata for 6 DoF rendering in TD renderer */ +#define TD5_FIX_INVALID_MEMORY_ACCESS /* FhG: Resolves segfault in case IVAS_REND_InitConfig gets initialized with rendererConfigEnabled:=false && ISM are being rendered */ +#define FIX_371_DELAY_REPORT /* Issue 371: div. by zero with -no_delay_cmp */ +#define FIX_373_MASA_DELAY_COMP_MSAN /* Nokia: Issue 373: MASA audio/meta delay compensation. MSAN bugfix */ + +#ifdef FIX_I109_ORIENTATION_TRACKING +#define OTR_REFERENCE_VECTOR_TRACKING /* FhG: enables the reference position orientation tracking mode */ +#endif + +#define FIX_380_BFI_PARAMISM /* VA: issue 380 - fix metadata recovery in ParamISM BFI */ +#define FIX_MDCT_BASED_BWD /* FhG: fixes for BWD for issues with reaction to transients for MDCT-stereo and MCT */ +#define DISCRETE_ISM_DTX_CNG /* FhG/VA: contribution 15 - DTX/CNG for (discrete) ISM */ +#define NCHAN_ISM_PARAMETER /* VA: make 'nchan_ism' parameter part of st_ivas/hEncoderConfig */ + + +/* ################## End DEVELOPMENT switches ######################### */ +/* clang-format on */ +#endif diff --git a/lib_com/prot.h b/lib_com/prot.h index 8430df6a7c..8ad9378e4c 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -516,14 +516,23 @@ void push_next_bits( ); #ifdef IND_LIST_DYN -int16_t get_max_num_indices( /* o : maximum number of indices */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ +int16_t get_ivas_max_num_indices( /* o : maximum number of indices */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +); + +int16_t get_core_max_num_indices( /* o : maximum number of indices */ + const int16_t core, /* i : core */ const int32_t total_brate /* i : total bitrate */ ); -int16_t get_max_num_indices_metadata( /* o : maximum number of indices */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const int32_t ivas_total_brate /* i : IVAS total bitrate */ +int16_t get_BWE_max_num_indices( /* o : maximum number of indices */ + const int32_t extl_brate /* i : extensiona layer bitrate */ +); + +int16_t get_ivas_max_num_indices_metadata( /* o : maximum number of indices for metadata */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ ); ivas_error ind_list_realloc( @@ -531,6 +540,16 @@ ivas_error ind_list_realloc( int16_t max_num_indices /* i : new maximum number of allowed indices in the list */ ); +ivas_error check_ind_list_limits( + BSTR_ENC_HANDLE hBstr /* i/o: encoder bitstream handle */ +); + +ivas_error move_indices( + INDICE_HANDLE old_ind_list, /* i/o: old location of indices */ + INDICE_HANDLE new_ind_list, /* i/o: new location of indices */ + const int16_t nb_indices /* i : number of moved indices */ +); + int16_t find_indice( /* o : index of the indice in the list, -1 if not found */ BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ int16_t id, /* i : ID of the indice */ @@ -2258,7 +2277,7 @@ void read_next_force( ivas_error init_encoder( Encoder_State *st, /* i/o: state structure */ #ifdef IND_LIST_DYN - ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : encoder configuration handle */ + Encoder_Struct *st_ivas, /* i/o: encoder state structure */ #endif const int16_t idchan, /* i : channel ID */ const int16_t var_SID_rate_flag, /* i : flag for variable SID update rate */ diff --git a/lib_enc/dtx.c b/lib_enc/dtx.c index 652c28f139..5afa2a4251 100644 --- a/lib_enc/dtx.c +++ b/lib_enc/dtx.c @@ -261,7 +261,7 @@ void dtx( { reset_indices_enc( st->hBstr, #ifdef IND_LIST_DYN - st->hBstr->max_num_indices + st->hBstr->nb_ind_tot #else MAX_NUM_INDICES #endif diff --git a/lib_enc/enc_ppp.c b/lib_enc/enc_ppp.c index 1bfed647dc..328c1d5b52 100644 --- a/lib_enc/enc_ppp.c +++ b/lib_enc/enc_ppp.c @@ -171,7 +171,7 @@ ivas_error encod_ppp( /* delete previous indices */ reset_indices_enc( hBstr, #ifdef IND_LIST_DYN - hBstr->max_num_indices + hBstr->nb_ind_tot #else MAX_NUM_INDICES #endif diff --git a/lib_enc/evs_enc.c b/lib_enc/evs_enc.c index b90f10359b..048986b9f9 100644 --- a/lib_enc/evs_enc.c +++ b/lib_enc/evs_enc.c @@ -99,7 +99,9 @@ ivas_error evs_enc( int16_t pitch_orig[3]; /* original open-loop pitch values that might be altered in core_acelp_tcx20_switching() within MODE2 */ #endif ivas_error error; - +#ifdef DEBUG_IND_LIST + int16_t old_nb_ind; +#endif error = IVAS_ERR_OK; push_wmops( "evs_enc" ); @@ -381,6 +383,10 @@ ivas_error evs_enc( *---------------------------------------------------------------------*/ push_wmops( "BWE_encoding" ); +#ifdef DEBUG_IND_LIST + old_nb_ind = st->hBstr->nb_ind_tot; +#endif + if ( st->input_Fs >= 16000 && st->bwidth < SWB ) { /* Common pre-processing for WB TBE and WB BWE */ @@ -502,6 +508,13 @@ ivas_error evs_enc( st->codec_mode = MODE2; } +#ifdef DEBUG_IND_LIST + if ( st->hBstr->nb_ind_tot - old_nb_ind > 0 ) + { + fprintf( stdout, "Total number of allocated indices (BWE): %d, bitrate: %d, #indices: %d\n", st->extl, st->extl_brate, st->hBstr->nb_ind_tot - old_nb_ind ); + } +#endif + #ifdef DEBUG_MODE_INFO dbgwrite( &st->codec_mode, sizeof( int16_t ), 1, input_frame, "res/codec" ); dbgwrite( &st->core, sizeof( int16_t ), 1, input_frame, "res/core" ); diff --git a/lib_enc/fd_cng_enc.c b/lib_enc/fd_cng_enc.c index 2f38de3955..29f4c900bc 100644 --- a/lib_enc/fd_cng_enc.c +++ b/lib_enc/fd_cng_enc.c @@ -897,7 +897,7 @@ void stereoFdCngCoherence( /* case: no VAD for both channels -> INACTIVE FRAME */ reset_indices_enc( sts[0]->hBstr, #ifdef IND_LIST_DYN - sts[0]->hBstr->max_num_indices + sts[0]->hBstr->nb_ind_tot #else MAX_NUM_INDICES #endif @@ -905,7 +905,7 @@ void stereoFdCngCoherence( reset_indices_enc( sts[1]->hBstr, #ifdef IND_LIST_DYN - sts[1]->hBstr->max_num_indices + sts[1]->hBstr->nb_ind_tot #else MAX_NUM_INDICES #endif @@ -1117,12 +1117,14 @@ void FdCngEncodeMDCTStereoSID( /* ---- Write SID bitstream ---- */ +#ifndef IND_LIST_DYN /* side info */ push_indice( sts[0]->hBstr, IND_SID_TYPE, 1, 1 ); push_indice( sts[0]->hBstr, IND_BWIDTH, sts[0]->bwidth, 2 ); push_indice( sts[0]->hBstr, IND_ACELP_16KHZ, sts[0]->L_frame == L_FRAME16k ? 1 : 0, 1 ); push_indice( sts[1]->hBstr, IND_SID_TYPE, coh_idx, 4 ); push_indice( sts[1]->hBstr, IND_SID_TYPE, no_side_flag, 1 ); +#endif /* noise shapes and channel gains */ for ( ch = 0; ch < CPE_CHANNELS; ch++ ) @@ -1130,10 +1132,23 @@ void FdCngEncodeMDCTStereoSID( if ( ch ) { stages = FD_CNG_JOINT_stages_25bits; +#ifdef IND_LIST_DYN + sts[ch]->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; + + /* side info */ + push_indice( sts[ch]->hBstr, IND_SID_TYPE, coh_idx, 4 ); + push_indice( sts[ch]->hBstr, IND_SID_TYPE, no_side_flag, 1 ); +#endif } else { stages = FD_CNG_stages_37bits; +#ifdef IND_LIST_DYN + /* side info */ + push_indice( sts[ch]->hBstr, IND_SID_TYPE, 1, 1 ); + push_indice( sts[ch]->hBstr, IND_BWIDTH, sts[0]->bwidth, 2 ); + push_indice( sts[ch]->hBstr, IND_ACELP_16KHZ, sts[0]->L_frame == L_FRAME16k ? 1 : 0, 1 ); +#endif } for ( int16_t i = 0; i < stages; i++ ) diff --git a/lib_enc/init_enc.c b/lib_enc/init_enc.c index 9c11420560..fcb605fc10 100644 --- a/lib_enc/init_enc.c +++ b/lib_enc/init_enc.c @@ -54,9 +54,9 @@ *-----------------------------------------------------------------------*/ ivas_error init_encoder( - Encoder_State *st, /* i/o: state structure */ + Encoder_State *st, /* i/o: state structure */ #ifdef IND_LIST_DYN - ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : encoder configuration handle */ + Encoder_Struct *st_ivas, /* i/o: encoder state structure */ #endif const int16_t idchan, /* i : channel ID */ const int16_t var_SID_rate_flag, /* i : flag for variable SID update rate */ @@ -117,16 +117,12 @@ ivas_error init_encoder( } #ifdef IND_LIST_DYN - /* set the maximum allowed number of indices in the list */ - st->hBstr->max_num_indices = get_max_num_indices( hEncoderConfig->ivas_format, st->total_brate ); - - /* allocate buffer of indices */ - if ( ( st->hBstr->ind_list = (INDICE_HANDLE) malloc( st->hBstr->max_num_indices * sizeof( Indice ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); - } - - reset_indices_enc( st->hBstr, st->hBstr->max_num_indices ); + /* set pointer to the buffer of indices */ + st->hBstr->ind_list = st_ivas->ind_list; + st->hBstr->ivas_ind_list_zero = st_ivas->ind_list; + st->hBstr->ivas_max_num_indices = &st_ivas->ivas_max_num_indices; + st->hBstr->nb_ind_tot = 0; + st->hBstr->nb_bits_tot = 0; #endif } else diff --git a/lib_enc/ivas_core_enc.c b/lib_enc/ivas_core_enc.c index 040a8469c5..435fc0fa6c 100644 --- a/lib_enc/ivas_core_enc.c +++ b/lib_enc/ivas_core_enc.c @@ -104,7 +104,10 @@ ivas_error ivas_core_enc( int32_t element_brate, last_element_brate, input_Fs; ivas_error error; #ifdef IND_LIST_DYN - int16_t max_num_indices; + int16_t max_num_indices_BWE; +#ifdef DEBUG_IND_LIST + int16_t old_nb_ind; +#endif #endif push_wmops( "ivas_core_enc" ); @@ -199,18 +202,19 @@ ivas_error ivas_core_enc( st = sts[n]; #ifdef IND_LIST_DYN - /*---------------------------------------------------------------------* - * Re-allocate the list of indices, if needed - *---------------------------------------------------------------------*/ + /* update pointer to the buffer of indices of the second channel */ + if ( n == 1 && st->element_mode == IVAS_CPE_TD ) + { + /* adjust the pointer to the buffer of indices of the secondary channel (make space for BWE indices) */ + max_num_indices_BWE = get_BWE_max_num_indices( sts[0]->extl_brate ); + st->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot + max_num_indices_BWE; - /* get the maximum allowed number of indices in the list */ - max_num_indices = get_max_num_indices( ivas_format, st->total_brate ); + /* write TD stereo spatial parameters */ + move_indices( hStereoTD->tdm_hBstr_tmp.ind_list, st->hBstr->ind_list, hStereoTD->tdm_hBstr_tmp.nb_ind_tot ); + st->hBstr->nb_ind_tot += hStereoTD->tdm_hBstr_tmp.nb_ind_tot; + st->hBstr->nb_bits_tot += hStereoTD->tdm_hBstr_tmp.nb_bits_tot; - /* check, if the maximum number of allowed indices has changed */ - if ( max_num_indices != st->hBstr->max_num_indices ) - { - /* re-allocate the list of indices */ - ind_list_realloc( st->hBstr, max_num_indices ); + reset_indices_enc( &hStereoTD->tdm_hBstr_tmp, MAX_IND_TDM_TMP ); } #endif @@ -282,11 +286,7 @@ ivas_error ivas_core_enc( } else { - stereo_mdct_core_enc( hCPE, -#ifdef IND_LIST_DYN - ivas_format, -#endif - old_inp_16k, old_wsp, pitch_buf ); + stereo_mdct_core_enc( hCPE, old_inp_16k, old_wsp, pitch_buf ); } } else if ( sts[0]->core_brate == SID_2k40 && sts[1]->core_brate == SID_2k40 ) @@ -321,6 +321,10 @@ ivas_error ivas_core_enc( { st = sts[n]; +#ifdef DEBUG_IND_LIST + old_nb_ind = st->hBstr->nb_ind_tot; +#endif + /*---------------------------------------------------------------------* * Postprocessing for ACELP/HQ core switching *---------------------------------------------------------------------*/ @@ -426,8 +430,27 @@ ivas_error ivas_core_enc( { updt_enc_common( st ); } + +#ifdef DEBUG_IND_LIST + if ( sts[n]->hBstr->nb_ind_tot - old_nb_ind > 0 ) + { + fprintf( stdout, "Total number of allocated indices (BWE): %d, bitrate: %d, #indices: %d\n", sts[n]->extl, sts[n]->extl_brate, sts[n]->hBstr->nb_ind_tot - old_nb_ind ); + } +#endif } +#ifdef IND_LIST_DYN +#ifdef DEBUG_IND_LIST + for ( n = 0; n < n_CoreChannels; n++ ) + { + if ( sts[n]->hBstr->nb_ind_tot > 0 ) + { + fprintf( stdout, "Total number of allocated indices (core): %d, bitrate: %d, #indices: %d\n", sts[n]->core, sts[n]->total_brate, sts[n]->hBstr->nb_ind_tot ); + } + } +#endif +#endif + #ifdef DEBUG_MODE_INFO for ( n = 0; n < n_CoreChannels; n++ ) diff --git a/lib_enc/ivas_corecoder_enc_reconfig.c b/lib_enc/ivas_corecoder_enc_reconfig.c index 74c27f4bff..b639df1547 100644 --- a/lib_enc/ivas_corecoder_enc_reconfig.c +++ b/lib_enc/ivas_corecoder_enc_reconfig.c @@ -69,7 +69,7 @@ ivas_error ivas_corecoder_enc_reconfig( BSTR_ENC_HANDLE hMetaData; #endif #ifdef IND_LIST_DYN - int16_t i, nb_bits, max_num_indices_metadata; + int16_t i, nb_bits; Indice temp_ind_list[MAX_NUM_IND_TEMP_LIST]; #endif int16_t nb_bits_tot; @@ -77,6 +77,7 @@ ivas_error ivas_corecoder_enc_reconfig( int16_t last_ind; int16_t next_ind; #endif + ENCODER_CONFIG_HANDLE hEncoderConfig; ivas_error error; @@ -104,20 +105,6 @@ ivas_error ivas_corecoder_enc_reconfig( copy_encoder_config( st_ivas, st_ivas->hSCE[sce_id]->hCoreCoder[0], 0 ); st_ivas->hSCE[sce_id]->element_brate = brate_SCE; st_ivas->hSCE[sce_id]->hCoreCoder[0]->total_brate = st_ivas->hSCE[sce_id]->element_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ -#ifdef IND_LIST_DYN - if ( st_ivas->hSCE[sce_id]->hMetaData != NULL ) - { - /* get the maximum allowed number of indices in the list */ - max_num_indices_metadata = get_max_num_indices_metadata( hEncoderConfig->ivas_format, hEncoderConfig->ivas_total_brate ); - - /* check, if the maximum number of allowed indices has changed */ - if ( max_num_indices_metadata != st_ivas->hSCE[sce_id]->hMetaData->max_num_indices ) - { - /* re-allocate the list of metadata indices */ - ind_list_realloc( st_ivas->hSCE[sce_id]->hMetaData, max_num_indices_metadata ); - } - } -#endif } for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) @@ -131,20 +118,6 @@ ivas_error ivas_corecoder_enc_reconfig( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->total_brate = st_ivas->hCPE[cpe_id]->element_brate / ( st_ivas->nCPE > 1 ? 1 : CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ } -#ifdef IND_LIST_DYN - if ( st_ivas->hCPE[cpe_id]->hMetaData != NULL ) - { - /* get the maximum allowed number of indices in the list */ - max_num_indices_metadata = get_max_num_indices_metadata( hEncoderConfig->ivas_format, hEncoderConfig->ivas_total_brate ); - - /* check, if the maximum number of allowed indices has changed */ - if ( max_num_indices_metadata != st_ivas->hCPE[cpe_id]->hMetaData->max_num_indices ) - { - /* re-allocate the list of metadata indices */ - ind_list_realloc( st_ivas->hCPE[cpe_id]->hMetaData, max_num_indices_metadata ); - } - } -#endif } if ( st_ivas->nCPE > 1 ) @@ -222,8 +195,12 @@ ivas_error ivas_corecoder_enc_reconfig( temp_ind_list[i].id = hBstr->ind_list[i].id; temp_ind_list[i].value = hBstr->ind_list[i].value; temp_ind_list[i].nb_bits = hBstr->ind_list[i].nb_bits; + hBstr->ind_list[i].nb_bits = -1; } + hBstr->nb_bits_tot = 0; + hBstr->nb_ind_tot = 0; + nb_bits += temp_ind_list[i].nb_bits; i++; } @@ -345,7 +322,7 @@ ivas_error ivas_corecoder_enc_reconfig( { reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, #ifdef IND_LIST_DYN - st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->max_num_indices + st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->nb_ind_tot #else MAX_NUM_INDICES #endif @@ -353,31 +330,10 @@ ivas_error ivas_corecoder_enc_reconfig( } else { - st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->nb_bits_tot = nb_bits_tot; #ifndef IND_LIST_DYN + st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->nb_bits_tot = nb_bits_tot; st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->last_ind = last_ind; st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->next_ind = next_ind; -#endif -#ifdef IND_LIST_DYN - /* re-fill the buffer of indices with already written indices */ - i = 0; - nb_bits = 0; - while ( nb_bits < nb_bits_tot && i < MAX_NUM_IND_TEMP_LIST ) - { - if ( temp_ind_list[i].nb_bits > 0 ) - { - st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list[i].id = temp_ind_list[i].id; - st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list[i].value = temp_ind_list[i].value; - st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; - } - - nb_bits += temp_ind_list[i].nb_bits; - i++; - } - st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->nb_ind_tot = i; -#ifdef DEBUGGING - assert( ( nb_bits == nb_bits_tot ) && "Error restoring bitstream information during core-coder reconfiguration!\n" ); -#endif #endif } @@ -409,7 +365,7 @@ ivas_error ivas_corecoder_enc_reconfig( { reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, #ifdef IND_LIST_DYN - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->max_num_indices + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_ind_tot #else MAX_NUM_INDICES #endif @@ -417,30 +373,10 @@ ivas_error ivas_corecoder_enc_reconfig( } else { - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_bits_tot = nb_bits_tot; #ifndef IND_LIST_DYN + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_bits_tot = nb_bits_tot; st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->last_ind = last_ind; st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->next_ind = next_ind; -#endif -#ifdef IND_LIST_DYN - i = 0; - nb_bits = 0; - while ( nb_bits < nb_bits_tot && i < MAX_NUM_IND_TEMP_LIST ) - { - if ( temp_ind_list[i].nb_bits > 0 ) - { - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list[i].id = temp_ind_list[i].id; - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list[i].value = temp_ind_list[i].value; - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; - } - - nb_bits += temp_ind_list[i].nb_bits; - i++; - } - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_ind_tot = i; -#ifdef DEBUGGING - assert( ( nb_bits == nb_bits_tot ) && "Error restoring bitstream information during core-coder reconfiguration!\n" ); -#endif #endif } } @@ -477,7 +413,7 @@ ivas_error ivas_corecoder_enc_reconfig( { reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, #ifdef IND_LIST_DYN - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->max_num_indices + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_ind_tot #else MAX_NUM_INDICES #endif @@ -485,30 +421,10 @@ ivas_error ivas_corecoder_enc_reconfig( } else { - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_bits_tot = nb_bits_tot; #ifndef IND_LIST_DYN + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_bits_tot = nb_bits_tot; st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->last_ind = last_ind; st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->next_ind = next_ind; -#endif -#ifdef IND_LIST_DYN - i = 0; - nb_bits = 0; - while ( nb_bits < nb_bits_tot && i < MAX_NUM_IND_TEMP_LIST ) - { - if ( temp_ind_list[i].nb_bits > 0 ) - { - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list[i].id = temp_ind_list[i].id; - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list[i].value = temp_ind_list[i].value; - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; - } - - nb_bits += temp_ind_list[i].nb_bits; - i++; - } - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_ind_tot = i; -#ifdef DEBUGGING - assert( ( nb_bits == nb_bits_tot ) && "Error restoring bitstream information during core-coder reconfiguration!\n" ); -#endif #endif } @@ -520,6 +436,51 @@ ivas_error ivas_corecoder_enc_reconfig( } } +#ifdef IND_LIST_DYN + /* restore bitstream - IVAS format bits should be written in the first core channel of the first SCE/CPE */ + i = 0; + nb_bits = 0; + if ( st_ivas->nSCE > 0 ) + { + while ( nb_bits < nb_bits_tot && i < MAX_NUM_IND_TEMP_LIST ) + { + if ( temp_ind_list[i].nb_bits > 0 ) + { + st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->ind_list[i].id = temp_ind_list[i].id; + st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->ind_list[i].value = temp_ind_list[i].value; + st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; + } + + nb_bits += temp_ind_list[i].nb_bits; + i++; + } + st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->nb_ind_tot = i; + st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->nb_bits_tot = nb_bits_tot; + } + else if ( st_ivas->nCPE > 0 ) + { + while ( nb_bits < nb_bits_tot && i < MAX_NUM_IND_TEMP_LIST ) + { + if ( temp_ind_list[i].nb_bits > 0 ) + { + st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->ind_list[i].id = temp_ind_list[i].id; + st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->ind_list[i].value = temp_ind_list[i].value; + st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; + } + + nb_bits += temp_ind_list[i].nb_bits; + i++; + } + st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->nb_ind_tot = i; + st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->nb_bits_tot = nb_bits_tot; + } + +#ifdef DEBUGGING + assert( ( nb_bits == nb_bits_tot ) && "Error restoring bitstream information during core-coder reconfiguration!\n" ); +#endif +#endif + + if ( last_mc_mode == MC_MODE_MCMASA && st_ivas->mc_mode == MC_MODE_MCMASA ) { /* restore modified transport signal */ @@ -544,7 +505,7 @@ ivas_error ivas_corecoder_enc_reconfig( for ( n = 0; n < CPE_CHANNELS; n++ ) { st_ivas->hCPE[0]->hCoreCoder[n]->total_brate = st_ivas->hCPE[0]->element_brate; - st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal = (int16_t) ( st_ivas->hCPE[0]->element_brate / FRAMES_PER_SEC ); + st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal = ( int16_t )( st_ivas->hCPE[0]->element_brate / FRAMES_PER_SEC ); st_ivas->hCPE[0]->hCoreCoder[n]->igf = getIgfPresent( st_ivas->hCPE[0]->hCoreCoder[n]->element_mode, st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal * FRAMES_PER_SEC, st_ivas->hCPE[0]->hCoreCoder[n]->bwidth, @@ -586,19 +547,17 @@ ivas_error ivas_corecoder_enc_reconfig( } #ifdef IND_LIST_DYN - /* set the maximum allowed number of metadata indices in the list */ - st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->max_num_indices = get_max_num_indices_metadata( hEncoderConfig->ivas_total_brate, hEncoderConfig->ivas_format ); - - /* allocate buffer of metadata indices */ - if ( ( st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->ind_list = (INDICE_HANDLE) malloc( st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->max_num_indices * sizeof( Indice ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); - } + /* set pointer to the buffer of metadata indices */ + st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->ind_list = st_ivas->ind_list_metadata; + st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->ivas_ind_list_zero = st_ivas->ind_list_metadata; + st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->ivas_max_num_indices = &st_ivas->ivas_max_num_indices_metadata; + st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->nb_ind_tot = 0; + st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->nb_bits_tot = 0; #endif } #ifdef IND_LIST_DYN - reset_indices_enc( st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData, st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->max_num_indices ); + reset_indices_enc( st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData, st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->nb_ind_tot ); #else st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->ind_list = ind_list_metadata + st_ivas->nSCE * MAX_NUM_INDICES; reset_indices_enc( st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData, MAX_BITS_METADATA ); @@ -608,12 +567,6 @@ ivas_error ivas_corecoder_enc_reconfig( { if ( st_ivas->hCPE[cpe_id]->hMetaData != NULL ) { -#ifdef IND_LIST_DYN - if ( st_ivas->hCPE[cpe_id]->hMetaData->ind_list != NULL ) - { - free( st_ivas->hCPE[cpe_id]->hMetaData->ind_list ); - } -#endif free( st_ivas->hCPE[cpe_id]->hMetaData ); st_ivas->hCPE[cpe_id]->hMetaData = NULL; } @@ -632,7 +585,7 @@ ivas_error ivas_corecoder_enc_reconfig( for ( n = 0; n < CPE_CHANNELS; n++ ) { st_ivas->hCPE[0]->hCoreCoder[n]->total_brate = st_ivas->hCPE[0]->element_brate; - st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal = (int16_t) ( st_ivas->hCPE[0]->element_brate / FRAMES_PER_SEC ); + st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal = ( int16_t )( st_ivas->hCPE[0]->element_brate / FRAMES_PER_SEC ); st_ivas->hCPE[0]->hCoreCoder[n]->igf = getIgfPresent( st_ivas->hCPE[0]->hCoreCoder[n]->element_mode, st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal * FRAMES_PER_SEC, st_ivas->hCPE[0]->hCoreCoder[n]->bwidth, diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index 5a39b1935e..35bbd62cca 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -813,16 +813,11 @@ ivas_error create_cpe_enc( } #ifdef IND_LIST_DYN - /* set the maximum allowed number of indices in the list */ - hCPE->hMetaData->max_num_indices = get_max_num_indices_metadata( hEncoderConfig->ivas_format, hEncoderConfig->ivas_total_brate ); - - /* allocate buffer of metadata indices */ - if ( ( hCPE->hMetaData->ind_list = (INDICE_HANDLE) malloc( hCPE->hMetaData->max_num_indices * sizeof( Indice ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); - } - - reset_indices_enc( hCPE->hMetaData, hCPE->hMetaData->max_num_indices ); + /* set pointer to the buffer of metadata indices */ + hCPE->hMetaData->ind_list = st_ivas->ind_list_metadata; + hCPE->hMetaData->ivas_ind_list_zero = st_ivas->ind_list_metadata; + hCPE->hMetaData->ivas_max_num_indices = &st_ivas->ivas_max_num_indices_metadata; + reset_indices_enc( hCPE->hMetaData, st_ivas->ivas_max_num_indices_metadata ); #endif } @@ -848,7 +843,7 @@ ivas_error create_cpe_enc( if ( ( error = init_encoder( st, #ifdef IND_LIST_DYN - hEncoderConfig, + st_ivas, #endif n, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 0, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) { @@ -1022,12 +1017,6 @@ void destroy_cpe_enc( if ( hCPE->hMetaData != NULL ) { -#ifdef IND_LIST_DYN - if ( hCPE->hMetaData->ind_list != NULL ) - { - free( hCPE->hMetaData->ind_list ); - } -#endif free( hCPE->hMetaData ); hCPE->hMetaData = NULL; } diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index 1e4ba82207..7edf1e0b14 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -291,6 +291,7 @@ ivas_error ivas_enc( if ( st_ivas->mc_mode == MC_MODE_MCT ) { st_ivas->hLFE->hBstr = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0]->hBstr : st_ivas->hCPE[0]->hCoreCoder[0]->hBstr; + ivas_lfe_enc( st_ivas->hLFE, data_f[LFE_CHANNEL], input_frame, st_ivas->hLFE->hBstr ); } @@ -342,6 +343,10 @@ ivas_error ivas_enc( return error; } +#ifdef IND_LIST_DYN + st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->ind_list = st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->ind_list + st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->nb_ind_tot; +#endif + if ( ( error = ivas_cpe_enc( st_ivas, 0, data_f[0], data_f[1], input_frame, hMetaData->nb_bits_tot ) ) != IVAS_ERR_OK ) { return error; diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index e0713950ca..f370665381 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -351,6 +351,43 @@ ivas_error ivas_init_encoder( st_ivas->sba_mode = SBA_MODE_NONE; st_ivas->nchan_transport = -1; + +#ifdef IND_LIST_DYN + /*-----------------------------------------------------------------* + * Allocate and initialize buffer of indices + *-----------------------------------------------------------------*/ + + /* set the maximum allowed number of indices in the list */ + st_ivas->ivas_max_num_indices = get_ivas_max_num_indices( ivas_format, ivas_total_brate ); + + /* allocate buffer of indices */ + if ( ( st_ivas->ind_list = (INDICE_HANDLE) malloc( st_ivas->ivas_max_num_indices * sizeof( Indice ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); + } + + /* reset the list of indices */ + for ( i = 0; i < st_ivas->ivas_max_num_indices; i++ ) + { + st_ivas->ind_list[i].nb_bits = -1; + } + + /* set the maximum allowed number of metadata indices in the list */ + st_ivas->ivas_max_num_indices_metadata = get_ivas_max_num_indices_metadata( st_ivas->hEncoderConfig->ivas_format, st_ivas->hEncoderConfig->ivas_total_brate ); + + /* allocate buffer of indices */ + if ( ( st_ivas->ind_list_metadata = (INDICE_HANDLE) malloc( st_ivas->ivas_max_num_indices_metadata * sizeof( Indice ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of metadata indices!\n" ) ); + } + + /* reset the list of metadata indices */ + for ( i = 0; i < st_ivas->ivas_max_num_indices_metadata; i++ ) + { + st_ivas->ind_list[i].nb_bits = -1; + } +#endif + /*-----------------------------------------------------------------* * Allocate and initialize SCE/CPE and other handles *-----------------------------------------------------------------*/ @@ -400,9 +437,7 @@ ivas_error ivas_init_encoder( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[n]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); } -#endif -#ifndef IND_LIST_DYN /* MetaData for DFT stereo */ st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[0]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA ); @@ -426,13 +461,11 @@ ivas_error ivas_init_encoder( return error; } - /* MetaData for ISMs */ #ifndef IND_LIST_DYN + /* MetaData for ISMs */ st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); -#endif -#ifndef IND_LIST_DYN st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA ); #endif @@ -500,13 +533,11 @@ ivas_error ivas_init_encoder( return error; } - /* MetaData for SBA */ #ifndef IND_LIST_DYN + /* MetaData for SBA */ st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); -#endif -#ifndef IND_LIST_DYN st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA ); #endif @@ -582,9 +613,7 @@ ivas_error ivas_init_encoder( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[cpe_id * CPE_CHANNELS + n]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); } -#endif -#ifndef IND_LIST_DYN /* Metadata only initialized for the last CPE index*/ if ( cpe_id == st_ivas->nCPE - 1 ) { @@ -627,9 +656,7 @@ ivas_error ivas_init_encoder( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[cpe_id * CPE_CHANNELS + n]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); } -#endif -#ifndef IND_LIST_DYN /* Metadata only initialized for the last CPE index*/ if ( cpe_id == st_ivas->nCPE - 1 ) { @@ -681,8 +708,7 @@ ivas_error ivas_init_encoder( /* allocate buffer of indices */ st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); -#endif -#ifndef IND_LIST_DYN + st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA ); #endif @@ -704,9 +730,7 @@ ivas_error ivas_init_encoder( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[cpe_id * CPE_CHANNELS + n + st_ivas->nSCE]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); } -#endif -#ifndef IND_LIST_DYN /* Metadata only initialized for the last CPE index*/ if ( cpe_id == st_ivas->nCPE - 1 ) { @@ -715,6 +739,7 @@ ivas_error ivas_init_encoder( } #endif } + } } #ifdef DEBUGGING @@ -767,6 +792,10 @@ void destroy_core_enc( ENC_CORE_HANDLE hCoreCoder /* i/o: core encoder structure */ ) { +#ifdef IND_LIST_DYN + int16_t i; +#endif + destroy_cldfb_encoder( hCoreCoder ); if ( hCoreCoder->hSignalBuf != NULL ) @@ -778,13 +807,12 @@ void destroy_core_enc( if ( hCoreCoder->hBstr != NULL ) { #ifdef IND_LIST_DYN - /* deallocate buffer of indices */ - if ( hCoreCoder->hBstr->ind_list != NULL ) + /* reset buffer of indices */ + for ( i = 0; i < hCoreCoder->hBstr->nb_ind_tot; i++) { - free( hCoreCoder->hBstr->ind_list ); + hCoreCoder->hBstr->ind_list[i].nb_bits = -1; } #endif - free( hCoreCoder->hBstr ); hCoreCoder->hBstr = NULL; } @@ -1020,6 +1048,19 @@ void ivas_destroy_enc( st_ivas->hEncoderConfig = NULL; } +#ifdef IND_LIST_DYN + /* Buffer of indices */ + if ( st_ivas->ind_list != NULL ) + { + free( st_ivas->ind_list ); + } + + if ( st_ivas->ind_list_metadata != NULL ) + { + free( st_ivas->ind_list_metadata ); + } +#endif + /* main IVAS handle */ free( st_ivas ); diff --git a/lib_enc/ivas_ism_dtx_enc.c b/lib_enc/ivas_ism_dtx_enc.c index 9f3ae679c6..cae975b9e8 100644 --- a/lib_enc/ivas_ism_dtx_enc.c +++ b/lib_enc/ivas_ism_dtx_enc.c @@ -177,7 +177,7 @@ int16_t ivas_ism_dtx_enc( reset_indices_enc( hSCE[0]->hCoreCoder[0]->hBstr, #ifdef IND_LIST_DYN - hSCE[0]->hCoreCoder[0]->hBstr->max_num_indices + hSCE[0]->hCoreCoder[0]->hBstr->nb_ind_tot #else MAX_NUM_INDICES #endif @@ -394,7 +394,7 @@ int16_t ivas_ism_dtx_enc( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate = st_ivas->hSCE[0]->hCoreCoder[0]->last_core_brate; reset_indices_enc( st_ivas->hSCE[0]->hCoreCoder[0]->hBstr, #ifdef IND_LIST_DYN - st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->max_num_indices + st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->nb_ind_tot #else MAX_NUM_INDICES #endif diff --git a/lib_enc/ivas_ism_enc.c b/lib_enc/ivas_ism_enc.c index 25ce78ff2e..919f5285df 100644 --- a/lib_enc/ivas_ism_enc.c +++ b/lib_enc/ivas_ism_enc.c @@ -95,6 +95,9 @@ ivas_error ivas_ism_enc( int16_t dtx_flag, sid_flag, flag_noisy_speech; #endif int16_t i, nBits; +#endif +#ifdef IND_LIST_DYN + Encoder_State *prev_st = NULL; #endif ivas_error error; @@ -343,6 +346,14 @@ ivas_error ivas_ism_enc( hSCE = st_ivas->hSCE[sce_id]; st = hSCE->hCoreCoder[0]; +#ifdef IND_LIST_DYN + /* update pointer to the buffer of indices of the next channel */ + if ( sce_id > 0 ) + { + st->hBstr->ind_list = prev_st->hBstr->ind_list + prev_st->hBstr->nb_ind_tot; + } +#endif + if ( st->low_rate_mode ) { st->bwidth = WB; @@ -390,6 +401,10 @@ ivas_error ivas_ism_enc( /* Store previous attack detection flag */ st->hTranDet->transientDetector.prev_bIsAttackPresent = st->hTranDet->transientDetector.bIsAttackPresent; + +#ifdef IND_LIST_DYN + prev_st = st; +#endif } if ( dtx_flag ) diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index ddac05ff00..893cf25ba3 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -878,7 +878,7 @@ ivas_error ivas_ism_metadata_enc( if ( hSCE[0]->hCoreCoder[0]->core_brate > SID_2k40 ) { #ifdef IND_LIST_DYN - reset_indices_enc( hSCE[ch]->hMetaData, hSCE[ch]->hMetaData->max_num_indices ); + reset_indices_enc( hSCE[ch]->hMetaData, hSCE[ch]->hMetaData->nb_ind_tot ); #else reset_indices_enc( hSCE[ch]->hMetaData, MAX_BITS_METADATA ); #endif diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index b5e100145d..337753925c 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -1708,9 +1708,6 @@ void ivas_masa_enc_reconfigure( int16_t n, tmp; int16_t sce_id, cpe_id; int32_t ivas_total_brate; -#ifdef IND_LIST_DYN - int16_t max_num_indices_metadata; -#endif ivas_total_brate = st_ivas->hEncoderConfig->ivas_total_brate; @@ -1721,21 +1718,6 @@ void ivas_masa_enc_reconfigure( copy_encoder_config( st_ivas, st_ivas->hSCE[sce_id]->hCoreCoder[0], 0 ); st_ivas->hSCE[sce_id]->element_brate = ivas_total_brate / st_ivas->nchan_transport; st_ivas->hSCE[sce_id]->hCoreCoder[0]->total_brate = st_ivas->hSCE[sce_id]->element_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ - -#ifdef IND_LIST_DYN - if ( st_ivas->hSCE[sce_id]->hMetaData != NULL ) - { - /* get the maximum allowed number of indices in the list */ - max_num_indices_metadata = get_max_num_indices_metadata( st_ivas->hEncoderConfig->ivas_format, st_ivas->hEncoderConfig->ivas_total_brate ); - - /* check, if the maximum number of allowed indices has changed */ - if ( max_num_indices_metadata != st_ivas->hSCE[sce_id]->hMetaData->max_num_indices ) - { - /* re-allocate the list of metadata indices */ - ind_list_realloc( st_ivas->hSCE[sce_id]->hMetaData, max_num_indices_metadata ); - } - } -#endif } for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) @@ -1747,21 +1729,6 @@ void ivas_masa_enc_reconfigure( { copy_encoder_config( st_ivas, st_ivas->hCPE[cpe_id]->hCoreCoder[n], 0 ); st_ivas->hCPE[cpe_id]->hCoreCoder[n]->total_brate = st_ivas->hCPE[cpe_id]->element_brate / ( st_ivas->nCPE > 1 ? 1 : CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ - -#ifdef IND_LIST_DYN - if ( st_ivas->hCPE[cpe_id]->hMetaData != NULL ) - { - /* get the maximum allowed number of indices in the list */ - max_num_indices_metadata = get_max_num_indices_metadata( st_ivas->hEncoderConfig->ivas_format, st_ivas->hEncoderConfig->ivas_total_brate ); - - /* check, if the maximum number of allowed indices has changed */ - if ( max_num_indices_metadata != st_ivas->hCPE[cpe_id]->hMetaData->max_num_indices ) - { - /* re-allocate the list of metadata indices */ - ind_list_realloc( st_ivas->hCPE[cpe_id]->hMetaData, max_num_indices_metadata ); - } - } -#endif } if ( ivas_total_brate < MASA_STEREO_MIN_BITRATE ) diff --git a/lib_enc/ivas_mct_core_enc.c b/lib_enc/ivas_mct_core_enc.c index 5cbcb57daf..38f193550b 100644 --- a/lib_enc/ivas_mct_core_enc.c +++ b/lib_enc/ivas_mct_core_enc.c @@ -411,6 +411,13 @@ void ivas_mct_core_enc( for ( ch = 0; ch < nChannels; ch++ ) { st = sts[ch]; +#ifdef IND_LIST_DYN + /* update the pointer to the buffer of indices of the second channel */ + if ( ch > 0 ) + { + st->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; + } +#endif if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_LFE || sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) { continue; diff --git a/lib_enc/ivas_mct_enc.c b/lib_enc/ivas_mct_enc.c index b66a2c5733..947be5225f 100644 --- a/lib_enc/ivas_mct_enc.c +++ b/lib_enc/ivas_mct_enc.c @@ -180,6 +180,13 @@ ivas_error ivas_mct_enc( { hCPE = st_ivas->hCPE[cpe_id]; +#ifdef IND_LIST_DYN + if ( cpe_id > 0 ) + { + hCPE->hCoreCoder[0]->hBstr->ind_list = st_ivas->hCPE[cpe_id - 1]->hCoreCoder[1]->hBstr->ind_list + st_ivas->hCPE[cpe_id - 1]->hCoreCoder[1]->hBstr->nb_ind_tot; + } +#endif + ivas_mdct_quant_coder( hCPE, hMCT->LFE_off, hMCT->tnsBits[cpe_id], hMCT->tnsSize[cpe_id], hMCT->p_param[cpe_id], 1 ); /* update input samples buffer (as done in ivas_cpe_enc() for other than MCT coding) */ diff --git a/lib_enc/ivas_mct_enc_mct.c b/lib_enc/ivas_mct_enc_mct.c index ee0c529b8b..de0e081240 100644 --- a/lib_enc/ivas_mct_enc_mct.c +++ b/lib_enc/ivas_mct_enc_mct.c @@ -855,6 +855,18 @@ void mctStereoIGF_enc( p_st[0] = sts[ch1]; p_st[1] = sts[ch2]; +#ifdef IND_LIST_DYN + if (ch1 > 0) + { + sts[ch1]->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; + } + + if ( ch2 > 0 ) + { + sts[ch2]->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; + } +#endif + p_powerSpec[0] = powerSpec[ch1]; p_powerSpec[1] = powerSpec[ch2]; @@ -902,6 +914,13 @@ void mctStereoIGF_enc( continue; } +#ifdef IND_LIST_DYN + if ( ch > 0 ) + { + st->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; + } +#endif + nSubframes = st->hTcxEnc->tcxMode == TCX_20 ? 1 : NB_DIV; for ( n = 0; n < nSubframes; n++ ) { diff --git a/lib_enc/ivas_mdct_core_enc.c b/lib_enc/ivas_mdct_core_enc.c index ef9264d5df..32bb41a62c 100644 --- a/lib_enc/ivas_mdct_core_enc.c +++ b/lib_enc/ivas_mdct_core_enc.c @@ -1275,6 +1275,14 @@ void ivas_mdct_quant_coder( { st = sts[ch]; +#ifdef IND_LIST_DYN + /* update the pointer to the buffer of indices of the second channel */ + if ( ch > 0 ) + { + st->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; + } +#endif + if ( ( st->mct_chan_mode == MCT_CHAN_MODE_LFE && LFE_off ) || ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) ) { /*Enable appropriate upadte of tcx_curr_overlap_mode even for uncoded channel index 1*/ diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index 97bc34a9cb..2c812850af 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -1019,7 +1019,7 @@ void reset_metadata_spatial( { /*Reset metadata*/ #ifdef IND_LIST_DYN - reset_indices_enc( hMetaData, hMetaData->max_num_indices ); + reset_indices_enc( hMetaData, hMetaData->nb_ind_tot ); #else for ( i = 0; i < hMetaData->next_ind; i++ ) { diff --git a/lib_enc/ivas_sce_enc.c b/lib_enc/ivas_sce_enc.c index 6c75de4113..7fc461193b 100644 --- a/lib_enc/ivas_sce_enc.c +++ b/lib_enc/ivas_sce_enc.c @@ -282,6 +282,9 @@ ivas_error create_sce_enc( SCE_ENC_HANDLE hSCE; Encoder_State *st; ivas_error error; +#ifdef IND_LIST_DYN + //int16_t i; +#endif error = IVAS_ERR_OK; @@ -314,16 +317,11 @@ ivas_error create_sce_enc( } #ifdef IND_LIST_DYN - /* set the maximum allowed number of indices in the list */ - hSCE->hMetaData->max_num_indices = get_max_num_indices_metadata( st_ivas->hEncoderConfig->ivas_format, st_ivas->hEncoderConfig->ivas_total_brate ); - - /* allocate buffer of metadata indices */ - if ( ( hSCE->hMetaData->ind_list = (INDICE_HANDLE) malloc( hSCE->hMetaData->max_num_indices * sizeof( Indice ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); - } - - reset_indices_enc( hSCE->hMetaData, hSCE->hMetaData->max_num_indices ); + /* set pointer to the buffer of metadata indices */ + hSCE->hMetaData->ind_list = st_ivas->ind_list_metadata; + hSCE->hMetaData->ivas_ind_list_zero = st_ivas->ind_list_metadata; + hSCE->hMetaData->ivas_max_num_indices = &st_ivas->ivas_max_num_indices_metadata; + reset_indices_enc( hSCE->hMetaData, st_ivas->ivas_max_num_indices_metadata ); #endif } else @@ -347,7 +345,7 @@ ivas_error create_sce_enc( if ( ( error = init_encoder( st, #ifdef IND_LIST_DYN - st_ivas->hEncoderConfig, + st_ivas, #endif 0, st_ivas->hEncoderConfig->var_SID_rate_flag, st_ivas->hEncoderConfig->interval_SID, 0, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) { @@ -384,12 +382,6 @@ void destroy_sce_enc( if ( hSCE->hMetaData != NULL ) { -#ifdef IND_LIST_DYN - if ( hSCE->hMetaData->ind_list != NULL ) - { - free( hSCE->hMetaData->ind_list ); - } -#endif free( hSCE->hMetaData ); hSCE->hMetaData = NULL; } diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index b6b79e3fa6..b52690979d 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -204,7 +204,7 @@ ivas_error ivas_spar_enc_open( if ( ( error = init_encoder( hSpar->hCoreCoderVAD, #ifdef IND_LIST_DYN - hEncoderConfig, + st_ivas, #endif 0, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 1, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) { diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index 44fb18dbc2..b3e73871e3 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -574,6 +574,9 @@ ivas_error ivas_spar_md_enc_process( #endif BSTR_ENC_DATA hMetaData_tmp; Indice ind_list_tmp[MAX_BITS_METADATA]; // IVAS_fmToDo: size to be optimized +#ifdef IND_LIST_DYN + int16_t max_num_indices_tmp; +#endif float Wscale[IVAS_MAX_NUM_BANDS]; num_quant_strats = hMdEnc->spar_md_cfg.num_quant_strats; @@ -621,6 +624,11 @@ ivas_error ivas_spar_md_enc_process( } hMetaData_tmp.ind_list = ind_list_tmp; +#ifdef IND_LIST_DYN + max_num_indices_tmp = MAX_BITS_METADATA; + hMetaData_tmp.ivas_max_num_indices = &max_num_indices_tmp; + hMetaData_tmp.ivas_ind_list_zero = ind_list_tmp; +#endif /* Save state of metadata bitstream buffer */ bit_pos_start = hMetaData->nb_bits_tot; @@ -890,12 +898,7 @@ ivas_error ivas_spar_md_enc_process( strat = cs[i]; if ( strat != NO_STRAT ) { -#ifdef IND_LIST_DYN - hMetaData_tmp.max_num_indices = MAX_BITS_METADATA; - reset_indices_enc( &hMetaData_tmp, hMetaData_tmp.max_num_indices ); -#else reset_indices_enc( &hMetaData_tmp, MAX_BITS_METADATA ); -#endif ivas_write_spar_md_bitstream( hMdEnc, num_bands, bands_bw, &hMetaData_tmp, hEncoderConfig->ivas_total_brate, strat, qsi, planarCP ); diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index a56f6423d3..a48e4b72e8 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -331,6 +331,12 @@ typedef struct stereo_mdct_enc_data_structure typedef struct stereo_td_enc_data_structure { +#ifdef IND_LIST_DYN + BSTR_ENC_DATA tdm_hBstr_tmp; /* temporary bitstream structure holding TD stereo spatial parameters */ + Indice tdm_ind_list_tmp[MAX_IND_TDM_TMP]; /* temporary list of indices holding TD stereo spatial parameters */ + int16_t max_ind_tdm_tmp; /* maximum number of indices in the temporary list of indices holding TD stereo spatial parameters */ +#endif + int16_t tdm_lp_reuse_flag; /* Flag that indicate if it is possible to reuse the LP coefficient from the primary channel or not */ int16_t tdm_low_rate_mode; /* secondary channel low rate mode flag */ float tdm_Pri_pitch_buf[NB_SUBFR]; @@ -1064,6 +1070,13 @@ typedef struct { ENCODER_CONFIG_HANDLE hEncoderConfig; /* Encoder configuration structure */ +#ifdef IND_LIST_DYN + Indice *ind_list; /* List of indices */ + int16_t ivas_max_num_indices; /* Maximum allowed number of indices in the list */ + Indice *ind_list_metadata; /* List of indices for metadata */ + int16_t ivas_max_num_indices_metadata; /* Maximum allowed number of indices in the list of metadata */ +#endif + /* high-level encoder parameters */ int16_t nchan_transport; /* number of transport channels */ int16_t sba_analysis_order; /* Ambisonic (SBA) order used for analysis and coding */ diff --git a/lib_enc/ivas_stereo_mdct_core_enc.c b/lib_enc/ivas_stereo_mdct_core_enc.c index 047db979e2..b5f266cffa 100644 --- a/lib_enc/ivas_stereo_mdct_core_enc.c +++ b/lib_enc/ivas_stereo_mdct_core_enc.c @@ -117,9 +117,6 @@ static void sync_tcx_mode( void stereo_mdct_core_enc( CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ -#ifdef IND_LIST_DYN - const int16_t ivas_format, /* i : IVAS format */ -#endif float new_samples[CPE_CHANNELS][L_INP], /* i : new samples */ float old_wsp[CPE_CHANNELS][L_WSP], /* i : 12.8kHz weighted speech (for LTP */ float pitch_buf[CPE_CHANNELS][NB_SUBFR16k] /* o : floating pitch for each subframe */ @@ -148,9 +145,6 @@ void stereo_mdct_core_enc( int16_t p_param[CPE_CHANNELS][2]; int16_t stereo_bits; int16_t meta_bits, signal_bits; -#ifdef IND_LIST_DYN - int16_t max_num_indices; -#endif push_wmops( "stereo_mdct_core_enc" ); @@ -185,19 +179,6 @@ void stereo_mdct_core_enc( { st = sts[ch]; SetTCXModeInfo( st, st->hTranDet, &st->hTcxCfg->tcx_curr_overlap_mode ); - -#ifdef IND_LIST_DYN - /* re-allocate list of indices, if needed (note that st->total_brate is modified later in this function) */ - /* get the maximum allowed number of indices in the list */ - max_num_indices = get_max_num_indices( ivas_format, st->total_brate ); - - /* check, if the maximum number of allowed indices has changed */ - if ( max_num_indices != st->hBstr->max_num_indices ) - { - /* re-allocate the list of indices */ - ind_list_realloc( st->hBstr, max_num_indices ); - } -#endif } /* adaptively sync tcx modes*/ @@ -380,7 +361,13 @@ void stereo_mdct_core_enc( for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = sts[ch]; - +#ifdef IND_LIST_DYN + /* update the pointer to the buffer of indices of the second channel */ + if ( ch == 1 ) + { + st->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; + } +#endif ProcessIGF( st, st->hTcxEnc->spectrum[n], orig_spectrum[ch][n], &powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, hCPE->hCoreCoder[0]->sp_aud_decision0, 0 ); } } @@ -391,6 +378,13 @@ void stereo_mdct_core_enc( for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = sts[ch]; +#ifdef IND_LIST_DYN + /* update the pointer to the buffer of indices of the second channel */ + if ( ch == 1 ) + { + st->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; + } +#endif nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; if ( st->igf ) { diff --git a/lib_enc/ivas_stereo_td_enc.c b/lib_enc/ivas_stereo_td_enc.c index 3857795dce..28cb1dfeb1 100644 --- a/lib_enc/ivas_stereo_td_enc.c +++ b/lib_enc/ivas_stereo_td_enc.c @@ -124,6 +124,14 @@ void stereo_td_init_enc( hStereoTD->tdm_prev_desired_idx = LRTD_STEREO_LEFT_IS_PRIM; } +#ifdef IND_LIST_DYN + hStereoTD->tdm_hBstr_tmp.ind_list = hStereoTD->tdm_ind_list_tmp; + hStereoTD->tdm_hBstr_tmp.ivas_ind_list_zero = hStereoTD->tdm_ind_list_tmp; + hStereoTD->max_ind_tdm_tmp = MAX_IND_TDM_TMP; + hStereoTD->tdm_hBstr_tmp.ivas_max_num_indices = &hStereoTD->max_ind_tdm_tmp; + reset_indices_enc( &hStereoTD->tdm_hBstr_tmp, MAX_IND_TDM_TMP ); +#endif + return; } @@ -314,12 +322,16 @@ void tdm_configure_enc( int16_t tdm_ratio_bit_alloc_idx, mod_ct; STEREO_TD_ENC_DATA_HANDLE hStereoTD; Encoder_State **sts; +#ifndef IND_LIST_DYN BSTR_ENC_HANDLE hBstr; +#endif int16_t loc_coder_tyape_raw0; hStereoTD = hCPE->hStereoTD; sts = hCPE->hCoreCoder; +#ifndef IND_LIST_DYN hBstr = sts[1]->hBstr; +#endif loc_coder_tyape_raw0 = sts[0]->coder_type_raw; /*----------------------------------------------------------------* @@ -475,6 +487,46 @@ void tdm_configure_enc( * Bitstream writing *----------------------------------------------------------------*/ +#ifdef IND_LIST_DYN + /* transmit the ratio index */ + if ( tdm_SM_or_LRTD_Pri && hStereoTD->tdm_LRTD_flag == 0 ) + { + push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_TD_ALPHA, tdm_ratio_idx_SM, TDM_RATIO_BITS ); + } + else + { + if ( hStereoTD->tdm_LRTD_flag == 1 ) + { + push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_TD_ALPHA, hStereoTD->tdm_inst_ratio_idx, TDM_RATIO_BITS ); + } + else + { + push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_TD_ALPHA, tdm_ratio_idx, TDM_RATIO_BITS ); + } + } + + /* LPC reuse flag */ + if ( sts[1]->coder_type == INACTIVE && tdm_ratio_idx < 29 && tdm_ratio_idx > 1 ) + { + /* normal TD, tdm_lp_reuse_flag always on, tdm_use_IAWB_Ave_lpc varies tdm_ratio_idx<29 && tdm_ratio_idx> 1*/ + push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_LPC_REUSE, hStereoTD->tdm_use_IAWB_Ave_lpc, TDM_LP_REUSE_BITS ); + } + else + { + push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_LPC_REUSE, hStereoTD->tdm_lp_reuse_flag, TDM_LP_REUSE_BITS ); + } + + /* LRTD flag */ + push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_LRTD_FLAG, hStereoTD->tdm_LRTD_flag, TDM_LR_CONTENT_BITS ); + + /* Stereo ICA parameters */ + if ( hStereoTD->tdm_LRTD_flag == 0 ) + { + push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_REFCHAN, hCPE->hStereoTCA->refChanIndx, STEREO_BITS_TCA_CHAN ); + push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_CORRSTATS, hCPE->hStereoTCA->indx_ica_NCShift, STEREO_BITS_TCA_CORRSTATS ); + push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_GD, hCPE->hStereoTCA->indx_ica_gD, STEREO_BITS_TCA_GD ); + } +#else /* transmit the ratio index */ if ( tdm_SM_or_LRTD_Pri && hStereoTD->tdm_LRTD_flag == 0 ) { @@ -513,12 +565,14 @@ void tdm_configure_enc( push_indice( hBstr, IND_STEREO_CORRSTATS, hCPE->hStereoTCA->indx_ica_NCShift, STEREO_BITS_TCA_CORRSTATS ); push_indice( hBstr, IND_STEREO_GD, hCPE->hStereoTCA->indx_ica_gD, STEREO_BITS_TCA_GD ); } +#endif #ifdef DEBUG_MODE_TD dbgwrite( &hStereoTD->tdm_low_rate_mode, 2, 1, 320, "res/tdm_low_rate_mode" ); dbgwrite( &hStereoTD->tdm_lp_reuse_flag, 2, 1, 320, "res/tdm_lp_reuse_flag" ); dbgwrite( &mod_ct, 2, 1, 320, "res/mod_ct.enx" ); #endif + /*----------------------------------------------------------------* * Updates *----------------------------------------------------------------*/ diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index f3db751e0a..ee3618399c 100755 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -35,11 +35,13 @@ #include "prot.h" #include #include +#include #include #ifdef DEBUGGING #include "debug.h" #endif #include "wmc_auto.h" +#include "options.h" /*---------------------------------------------------------------------* * Local struct @@ -182,6 +184,11 @@ ivas_error IVAS_ENC_Open( /* initialize pointers to handles to NULL */ ivas_initialize_handles_enc( st_ivas ); +#ifdef IND_LIST_DYN + st_ivas->ind_list = NULL; + st_ivas->ind_list_metadata = NULL; +#endif + /* set high-level parameters */ st_ivas->mc_mode = MC_MODE_NONE; st_ivas->ism_mode = ISM_MODE_NONE; @@ -1081,6 +1088,9 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( ENCODER_CONFIG_HANDLE hEncoderConfig; ENC_CORE_HANDLE hCoreCoder; int16_t i; +#ifdef IND_LIST_DYN + int16_t n, ch; +#endif ivas_error error; error = IVAS_ERR_OK; @@ -1148,6 +1158,73 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( hIvasEnc->switchingActive = true; } +#ifdef IND_LIST_DYN + /*-----------------------------------------------------------------* + * Re-allocate and re-initialize buffer of indices if IVAS total bitrate has changed + *-----------------------------------------------------------------*/ + + if ( hEncoderConfig->ivas_total_brate != hEncoderConfig->last_ivas_total_brate ) + { + /* de-allocate old buffer of indices */ + free( st_ivas->ind_list ); + free( st_ivas->ind_list_metadata ); + + /* set the maximum allowed number of indices in the list */ + st_ivas->ivas_max_num_indices = get_ivas_max_num_indices( hEncoderConfig->ivas_format, hEncoderConfig->ivas_total_brate ); + st_ivas->ivas_max_num_indices_metadata = get_ivas_max_num_indices_metadata( hEncoderConfig->ivas_format, hEncoderConfig->ivas_total_brate ); + + /* allocate new buffer of indices */ + if ( ( st_ivas->ind_list = (INDICE_HANDLE) malloc( st_ivas->ivas_max_num_indices * sizeof( Indice ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); + } + + if ( ( st_ivas->ind_list_metadata = (INDICE_HANDLE) malloc( st_ivas->ivas_max_num_indices_metadata * sizeof( Indice ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of metadata indices!\n" ) ); + } + + /* reset the list of indices */ + for ( i = 0; i < st_ivas->ivas_max_num_indices; i++ ) + { + st_ivas->ind_list[i].nb_bits = -1; + } + + for ( i = 0; i < st_ivas->ivas_max_num_indices_metadata; i++ ) + { + st_ivas->ind_list_metadata[i].nb_bits = -1; + } + + /* set pointers to the new buffer of indices in each element */ + for ( n = 0; n < st_ivas->nSCE; n++ ) + { + st_ivas->hSCE[n]->hCoreCoder[0]->hBstr->ind_list = st_ivas->ind_list; + st_ivas->hSCE[n]->hCoreCoder[0]->hBstr->ivas_ind_list_zero = st_ivas->ind_list; + + if ( st_ivas->hSCE[n]->hMetaData != NULL ) + { + st_ivas->hSCE[n]->hMetaData->ind_list = st_ivas->ind_list_metadata; + st_ivas->hSCE[n]->hMetaData->ivas_ind_list_zero = st_ivas->ind_list_metadata; + } + } + + for ( n = 0; n < st_ivas->nCPE; n++ ) + { + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st_ivas->hCPE[n]->hCoreCoder[ch]->hBstr->ind_list = st_ivas->ind_list; + st_ivas->hCPE[n]->hCoreCoder[ch]->hBstr->ivas_ind_list_zero = st_ivas->ind_list; + } + + if ( st_ivas->hCPE[n]->hMetaData != NULL ) + { + st_ivas->hCPE[n]->hMetaData->ind_list = st_ivas->ind_list_metadata; + st_ivas->hCPE[n]->hMetaData->ivas_ind_list_zero = st_ivas->ind_list_metadata; + } + } + } +#endif + if ( hIvasEnc->switchingActive && hEncoderConfig->ivas_format == MONO_FORMAT ) { copy_encoder_config( st_ivas, hCoreCoder, 0 ); @@ -1188,6 +1265,31 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( } } + +#ifdef DEBUG_IND_LIST + int16_t total_nb_ind = 0; + for ( i = 0; i < st_ivas->ivas_max_num_indices; i++ ) + { + if ( st_ivas->ind_list[i].nb_bits > -1 ) + { + total_nb_ind++; + } + } + + fprintf( stdout, "Total number of allocated indices (codec): IVAS format: %d, bitrate: %d, #indices: %d\n", hEncoderConfig->ivas_format, hEncoderConfig->ivas_total_brate, total_nb_ind ); + + total_nb_ind = 0; + for ( i = 0; i < st_ivas->ivas_max_num_indices_metadata; i++ ) + { + if ( st_ivas->ind_list_metadata[i].nb_bits > -1 ) + { + total_nb_ind++; + } + } + + fprintf( stdout, "Total number of allocated indices (metadata): IVAS format: %d, bitrate: %d, #indices: %d\n", hEncoderConfig->ivas_format, hEncoderConfig->ivas_total_brate, total_nb_ind ); +#endif + /* write indices into bitstream buffer */ write_indices_ivas( st_ivas, outputBitStream, numOutBits ); diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index c37ed76dc7..fe4b00d849 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -81,7 +81,10 @@ typedef struct bitstream_enc_data_structure int16_t next_ind; /* pointer to the next empty slot in the list of indices */ int16_t last_ind; /* last written indice */ #endif - int16_t max_num_indices; /* maximum number of indices in the list */ +#ifdef IND_LIST_DYN + int16_t *ivas_max_num_indices; /* maximum total number of indices in the list */ + Indice *ivas_ind_list_zero; /* beginning of the buffer of indices */ +#endif } BSTR_ENC_DATA, *BSTR_ENC_HANDLE; /*----------------------------------------------------------------------------------* diff --git a/lib_enc/tcx_utils_enc.c b/lib_enc/tcx_utils_enc.c index 2dd5340992..8099b8cb07 100644 --- a/lib_enc/tcx_utils_enc.c +++ b/lib_enc/tcx_utils_enc.c @@ -1583,7 +1583,12 @@ void ProcessStereoIGF( #else pBsStart = hBstr->next_ind; #endif - +#ifdef IND_LIST_DYN + if ( ch > 0 ) + { + hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; + } +#endif IGFEncWriteBitstream( hIGFEnc[ch], hBstr, &hIGFEnc[ch]->infoTotalBitsPerFrameWritten, igfGridIdx, isIndepFlag ); #ifdef IND_LIST_DYN -- GitLab From c39a37b3705c45fec60cdfec9c22abfe22a31322 Mon Sep 17 00:00:00 2001 From: malenov Date: Thu, 13 Apr 2023 13:00:00 +0200 Subject: [PATCH 045/331] increase the max number of indices of HOA3 metadata at 32 kbps --- lib_com/bitstream.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index 4d74baf88e..a2c351d49d 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -764,11 +764,11 @@ int16_t get_ivas_max_num_indices_metadata( /* o : max } else if ( ivas_total_brate <= IVAS_32k ) { - return 250; + return 300; } else if ( ivas_total_brate <= IVAS_192k ) { - return 300; + return 500; } else if ( ivas_total_brate <= IVAS_256k ) { -- GitLab From 1322bfda864256aab9abc876c59e0716562e7570 Mon Sep 17 00:00:00 2001 From: malenov Date: Thu, 13 Apr 2023 13:08:16 +0200 Subject: [PATCH 046/331] clang format --- lib_com/bitstream.c | 36 +++++++++++++-------------- lib_com/prot.h | 20 +++++++-------- lib_enc/init_enc.c | 4 +-- lib_enc/ivas_corecoder_enc_reconfig.c | 4 +-- lib_enc/ivas_init_enc.c | 3 +-- lib_enc/ivas_mct_enc_mct.c | 2 +- lib_enc/ivas_sce_enc.c | 2 +- lib_enc/ivas_stereo_mdct_core_enc.c | 2 +- 8 files changed, 36 insertions(+), 37 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index a2c351d49d..d2b53a2be9 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -242,7 +242,7 @@ ivas_error ind_list_realloc( } /* move indices from the old list to the new list */ - for ( i = 0; i < min(max_num_indices, *( hBstr->ivas_max_num_indices )); i++ ) + for ( i = 0; i < min( max_num_indices, *( hBstr->ivas_max_num_indices ) ); i++ ) { if ( hBstr->ivas_ind_list_zero[i].nb_bits > -1 ) { @@ -259,7 +259,7 @@ ivas_error ind_list_realloc( } /* get the current position inside the old list */ - ind_list_pos = (int16_t)(hBstr->ind_list - hBstr->ivas_ind_list_zero); + ind_list_pos = (int16_t) ( hBstr->ind_list - hBstr->ivas_ind_list_zero ); /* free the old list */ free( hBstr->ivas_ind_list_zero ); @@ -269,7 +269,7 @@ ivas_error ind_list_realloc( hBstr->ivas_ind_list_zero = new_ind_list; /* set the new maximum number of indices */ - *(hBstr->ivas_max_num_indices) = max_num_indices; + *( hBstr->ivas_max_num_indices ) = max_num_indices; return IVAS_ERR_OK; } @@ -282,8 +282,8 @@ ivas_error ind_list_realloc( *-----------------------------------------------------------------------*/ int16_t get_ivas_max_num_indices( /* o : maximum number of indices */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const int32_t ivas_total_brate /* i : IVAS total bitrate */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ ) { if ( ivas_format == STEREO_FORMAT ) @@ -516,12 +516,12 @@ int16_t get_ivas_max_num_indices( /* o : maximum /*-----------------------------------------------------------------------* * get_core_max_num_indices() * - * Get the maximum allowed number of indices in the core coder + * Get the maximum allowed number of indices in the core coder *-----------------------------------------------------------------------*/ -int16_t get_core_max_num_indices( /* o : maximum number of indices */ - const int16_t core, /* i : core */ - const int32_t total_brate /* i : total bitrate */ +int16_t get_core_max_num_indices( /* o : maximum number of indices */ + const int16_t core, /* i : core */ + const int32_t total_brate /* i : total bitrate */ ) { /* set the maximum number of indices in the core coder */ @@ -691,11 +691,11 @@ int16_t get_core_max_num_indices( /* o : maximum number of indices */ /*-----------------------------------------------------------------------* * get_BWE_max_num_indices() * - * Get the maximum number of indices in the BWE + * Get the maximum number of indices in the BWE *-----------------------------------------------------------------------*/ -int16_t get_BWE_max_num_indices( /* o : maximum number of indices */ - const int32_t extl_brate /* i : extensiona layer bitrate */ +int16_t get_BWE_max_num_indices( /* o : maximum number of indices */ + const int32_t extl_brate /* i : extensiona layer bitrate */ ) { /* set the maximum number of indices in the BWE */ @@ -708,7 +708,7 @@ int16_t get_BWE_max_num_indices( /* o : maximum numb return 150; } } - + /*-----------------------------------------------------------------------* * get_ivas_max_num_indices_metadata() @@ -716,9 +716,9 @@ int16_t get_BWE_max_num_indices( /* o : maximum numb * Set the maximum allowed number of metadata indices in the list *-----------------------------------------------------------------------*/ -int16_t get_ivas_max_num_indices_metadata( /* o : maximum number of indices */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const int32_t ivas_total_brate /* i : IVAS total bitrate */ +int16_t get_ivas_max_num_indices_metadata( /* o : maximum number of indices */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ ) { /* set the maximum required number of metadata indices */ @@ -903,7 +903,7 @@ ivas_error move_indices( * check_ind_list_limits() * * Check, if if the maximum number of indices has been reached -> reallocate - * Check, if we will not overwrite an existing indice -> adjust the location + * Check, if we will not overwrite an existing indice -> adjust the location *-------------------------------------------------------------------*/ ivas_error check_ind_list_limits( @@ -1872,7 +1872,7 @@ static ivas_error write_indices_element( for ( n = 0; n < n_channels; n++ ) { - reset_indices_enc( sts[n]->hBstr, + reset_indices_enc( sts[n]->hBstr, #ifdef IND_LIST_DYN sts[n]->hBstr->nb_ind_tot #else diff --git a/lib_com/prot.h b/lib_com/prot.h index f4960083ea..718ad91e41 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -516,23 +516,23 @@ void push_next_bits( ); #ifdef IND_LIST_DYN -int16_t get_ivas_max_num_indices( /* o : maximum number of indices */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const int32_t ivas_total_brate /* i : IVAS total bitrate */ +int16_t get_ivas_max_num_indices( /* o : maximum number of indices */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ ); int16_t get_core_max_num_indices( /* o : maximum number of indices */ - const int16_t core, /* i : core */ - const int32_t total_brate /* i : total bitrate */ + const int16_t core, /* i : core */ + const int32_t total_brate /* i : total bitrate */ ); -int16_t get_BWE_max_num_indices( /* o : maximum number of indices */ +int16_t get_BWE_max_num_indices( /* o : maximum number of indices */ const int32_t extl_brate /* i : extensiona layer bitrate */ ); -int16_t get_ivas_max_num_indices_metadata( /* o : maximum number of indices for metadata */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const int32_t ivas_total_brate /* i : IVAS total bitrate */ +int16_t get_ivas_max_num_indices_metadata( /* o : maximum number of indices for metadata */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ ); ivas_error ind_list_realloc( @@ -2273,7 +2273,7 @@ void read_next_force( ivas_error init_encoder( Encoder_State *st, /* i/o: state structure */ #ifdef IND_LIST_DYN - Encoder_Struct *st_ivas, /* i/o: encoder state structure */ + Encoder_Struct *st_ivas, /* i/o: encoder state structure */ #endif const int16_t idchan, /* i : channel ID */ const int16_t var_SID_rate_flag, /* i : flag for variable SID update rate */ diff --git a/lib_enc/init_enc.c b/lib_enc/init_enc.c index fcb605fc10..6e4611e3d6 100644 --- a/lib_enc/init_enc.c +++ b/lib_enc/init_enc.c @@ -54,9 +54,9 @@ *-----------------------------------------------------------------------*/ ivas_error init_encoder( - Encoder_State *st, /* i/o: state structure */ + Encoder_State *st, /* i/o: state structure */ #ifdef IND_LIST_DYN - Encoder_Struct *st_ivas, /* i/o: encoder state structure */ + Encoder_Struct *st_ivas, /* i/o: encoder state structure */ #endif const int16_t idchan, /* i : channel ID */ const int16_t var_SID_rate_flag, /* i : flag for variable SID update rate */ diff --git a/lib_enc/ivas_corecoder_enc_reconfig.c b/lib_enc/ivas_corecoder_enc_reconfig.c index c96771d38d..c8c8671aab 100644 --- a/lib_enc/ivas_corecoder_enc_reconfig.c +++ b/lib_enc/ivas_corecoder_enc_reconfig.c @@ -509,7 +509,7 @@ ivas_error ivas_corecoder_enc_reconfig( for ( n = 0; n < CPE_CHANNELS; n++ ) { st_ivas->hCPE[0]->hCoreCoder[n]->total_brate = st_ivas->hCPE[0]->element_brate; - st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal = ( int16_t )( st_ivas->hCPE[0]->element_brate / FRAMES_PER_SEC ); + st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal = (int16_t) ( st_ivas->hCPE[0]->element_brate / FRAMES_PER_SEC ); st_ivas->hCPE[0]->hCoreCoder[n]->igf = getIgfPresent( st_ivas->hCPE[0]->hCoreCoder[n]->element_mode, st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal * FRAMES_PER_SEC, st_ivas->hCPE[0]->hCoreCoder[n]->bwidth, @@ -589,7 +589,7 @@ ivas_error ivas_corecoder_enc_reconfig( for ( n = 0; n < CPE_CHANNELS; n++ ) { st_ivas->hCPE[0]->hCoreCoder[n]->total_brate = st_ivas->hCPE[0]->element_brate; - st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal = ( int16_t )( st_ivas->hCPE[0]->element_brate / FRAMES_PER_SEC ); + st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal = (int16_t) ( st_ivas->hCPE[0]->element_brate / FRAMES_PER_SEC ); st_ivas->hCPE[0]->hCoreCoder[n]->igf = getIgfPresent( st_ivas->hCPE[0]->hCoreCoder[n]->element_mode, st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal * FRAMES_PER_SEC, st_ivas->hCPE[0]->hCoreCoder[n]->bwidth, diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index f370665381..a9960a445d 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -739,7 +739,6 @@ ivas_error ivas_init_encoder( } #endif } - } } #ifdef DEBUGGING @@ -808,7 +807,7 @@ void destroy_core_enc( { #ifdef IND_LIST_DYN /* reset buffer of indices */ - for ( i = 0; i < hCoreCoder->hBstr->nb_ind_tot; i++) + for ( i = 0; i < hCoreCoder->hBstr->nb_ind_tot; i++ ) { hCoreCoder->hBstr->ind_list[i].nb_bits = -1; } diff --git a/lib_enc/ivas_mct_enc_mct.c b/lib_enc/ivas_mct_enc_mct.c index de0e081240..fbe57791f4 100644 --- a/lib_enc/ivas_mct_enc_mct.c +++ b/lib_enc/ivas_mct_enc_mct.c @@ -856,7 +856,7 @@ void mctStereoIGF_enc( p_st[1] = sts[ch2]; #ifdef IND_LIST_DYN - if (ch1 > 0) + if ( ch1 > 0 ) { sts[ch1]->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; } diff --git a/lib_enc/ivas_sce_enc.c b/lib_enc/ivas_sce_enc.c index 7fc461193b..4754470402 100644 --- a/lib_enc/ivas_sce_enc.c +++ b/lib_enc/ivas_sce_enc.c @@ -283,7 +283,7 @@ ivas_error create_sce_enc( Encoder_State *st; ivas_error error; #ifdef IND_LIST_DYN - //int16_t i; + // int16_t i; #endif error = IVAS_ERR_OK; diff --git a/lib_enc/ivas_stereo_mdct_core_enc.c b/lib_enc/ivas_stereo_mdct_core_enc.c index b5f266cffa..c78a3a63df 100644 --- a/lib_enc/ivas_stereo_mdct_core_enc.c +++ b/lib_enc/ivas_stereo_mdct_core_enc.c @@ -116,7 +116,7 @@ static void sync_tcx_mode( *-------------------------------------------------------------------*/ void stereo_mdct_core_enc( - CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ float new_samples[CPE_CHANNELS][L_INP], /* i : new samples */ float old_wsp[CPE_CHANNELS][L_WSP], /* i : 12.8kHz weighted speech (for LTP */ float pitch_buf[CPE_CHANNELS][NB_SUBFR16k] /* o : floating pitch for each subframe */ -- GitLab From 74d03a50a12831f104da01f3ecd7176391175a69 Mon Sep 17 00:00:00 2001 From: Vladimir Malenovsky Date: Thu, 13 Apr 2023 14:19:51 +0200 Subject: [PATCH 047/331] cleanup --- lib_com/options.h.unchanged | 170 ------------------------------------ lib_enc/ivas_sce_enc.c | 3 - 2 files changed, 173 deletions(-) delete mode 100644 lib_com/options.h.unchanged diff --git a/lib_com/options.h.unchanged b/lib_com/options.h.unchanged deleted file mode 100644 index 2e5949f967..0000000000 --- a/lib_com/options.h.unchanged +++ /dev/null @@ -1,170 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -/*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 - ====================================================================================*/ - -#ifndef OPTIONS_H -#define OPTIONS_H - -/* clang-format off */ -/* ################### Start compiler switches ######################## */ - -#define SUPPORT_JBM_TRACEFILE /* support for JBM tracefile, which is needed for 3GPP objective/subjective testing, but not relevant for real-world implementations */ - -/* #################### End compiler switches ######################### */ - - -/* ################### Start DEBUGGING switches ########################### */ - -#ifndef RELEASE -#define DEBUGGING /* Activate debugging part of the code */ -#endif -/*#define WMOPS*/ /* Activate complexity and memory counters */ -/*#define WMOPS_PER_FRAME*/ /* Output per-frame complexity (writes one float value per frame to the file "wmops_analysis") */ -/*#define WMOPS_DETAIL*/ /* Output detailed complexity printout for every function. Increases runtime overhead */ -/*#define WMOPS_WC_FRAME_ANALYSIS*/ /* Output detailed complexity analysis for the worst-case frame */ -/*#define MEM_COUNT_DETAILS*/ /* Output detailed memory analysis for the worst-case frame (writes to the file "mem_analysis.csv") */ - -#ifdef DEBUGGING - -/*#define DEBUG_MODE_INFO*/ /* output most important parameters to the subdirectory "res/" */ -#ifdef DEBUG_MODE_INFO -/*#define DEBUG_MODE_ACELP*/ /* output most important ACELP core parameters to the subdirectory "res/" */ -/*#define DEBUG_MODE_TCX*/ /* output most important TCX core parameters to the subdirectory "res/" */ -/*#define DEBUG_MODE_DFT*/ /* output most important DFT stereo parameters to the subdirectory "res/" */ -/*#define DEBUG_MODE_TD*/ /* output most important TD stereo parameters to the subdirectory "res/ */ -/*#define DEBUG_MODE_DIRAC*/ /* output most important DIRAC parameters to the subdirectory "res/" */ -/*#define DEBUG_MODE_MDCT*/ /* output most important MDCT parameters to the subdirectory "res/" */ -/*#define DEBUG_MODE_PARAM_MC */ /* output Parametric MC paramters to the subdirectory "res/" */ -/*#define DEBUG_MODE_PARAM_ISM*/ /* output Parametric ISM paramters to the subdirectory "res/" */ -/*#define DEBUG_MODE_INFO_TWEAK*/ /* enable command line switch to specify subdirectory for debug info output inside "./res/" */ -/*#define DEBUG_MODE_INFO_PLC */ /* define to output PLC related parameters */ -/*#define DEBUG_MODE_INFO_ALLRAD*/ /* define to output generated HOA decoding mtx */ -/*#define DEBUG_MODE_LFE */ /* define to output LFE relevant parameters */ -#endif - -#ifdef DEBUG_MODE_MDCT -#define DEBUG_PLOT_BITS -#endif - -#define ENABLE_BITRATE_VERIFICATION /* Enable bitrate verification - use when playing with bit budget */ -/*#define DEBUG_PLOT*/ -/*#define ALLOW_BYTE_EP*/ /* allow byte fer pattern files and check fer pattern file validity */ -#define WRAP_AS_EIDXOR /* wraps FER file (as in STL_eid-xor.c/softbit.c) */ - -#define DEBUG_FORCE_MDCT_STEREO_MODE /* Force stereo mode decision for MDCT stereo: -stere 3 1 forces L/R coding and -stereo 3 2 forces full M/S coding */ -/*#define DEBUG_STEREO_DFT_NOCORE*/ /* DFT stereo: by-pass core coder at decoder side*/ -/*#define DEBUG_STEREO_DFT_NOSTEREO*/ /* DFT stereo: by-pass stereo processing at encoder and decoder side*/ -/*#define DEBUG_STEREO_DFT_NOQRES*/ -/*#define DEBUG_STEREO_DFT_OUTRESPRED*/ /* output residual prediction signal instead of L/R*/ -/*#define DBG_STEREO_ICBWE2_TBE2K8*/ /* Enables TBE_2K8 for higher bitrates with ICBWE in operation for TD/DFT Stereo. Needs quality eval and currently only used for debugging purposes */ - -/*DirAC Debug switches*/ -/*#define DEBUG_DISABLE_DIRAC_DELAY_COMP */ /* temporarily disable delay compensation on DirAC encoder */ -/*#define DEBUG_BS_READ_WRITE*/ -/*#define DEBUG_MODE_DIRAC_NOCORE*/ -/*#define DEBUG_MODE_QMETADATA*/ /* output q_metadata parameters */ - -/*MCT Debug switches*/ -/*#define DEBUG_FORCE_MCT_CP*/ /* force MCT Stereo pairs for verification with SPAR */ -#ifdef DEBUG_FORCE_MCT_CP -/*#define DEBUG_SINGLE_CODE_OMNI*/ /* force 3 TC SBA always code W channel seperately */ -#endif - -/*PLC Debug switches*/ -/*#define DEBUG_NO_TONAL_PLC*/ -/*#define DEBUG_NO_TD_TCX_PLC */ -/*#define DEBUG_FORCE_TD_TCX_CONCEALMENT*/ -/*#define DEBUG_PLC_INFO*/ - -/*#define DEBUG_EFAP_POLY_TOFILE*/ /* Write poly_select values to file in EFAP, used for generating ROM LUTs */ -/*#define TDREND_HRTF_TABLE_METHODS*/ /* Enable HRTF lookup from tables, for testing & evaluation. Supply file in table format to use. Note that a suitable HR filter lookup method should be written if the filters sample point grids are not in the formats. */ -/*#define TDREND_STANDALONE*/ /* Used when renderer is built in standalone form, without IVAS encoding/decoding (see scripts/object_renderer_standalone). This is just here to ensure this is cleaned out by prepare_instrumentation.sh */ - -/*#define DEBUG_SBA*/ /* debug DIRAC/SPAR in-out */ -#ifdef DEBUG_SBA -/*#define DEBUG_SBA_AUDIO_DUMP*/ /* SBA intermediate audio wav file dumping */ -/*#define DEBUG_SBA_MD_DUMP*/ /* SBA metadata and variable file dumping */ -/*#define DEBUG_SPAR_MD_TARGET_TUNING*/ /* SPAR MD target bitrate tuning debug code */ -/*#define DEBUG_SPAR_BYPASS_EVS_CODEC*/ /* bypass EVS coding in float precision, emulating EVS encoder/decoder delay */ -/*#define DEBUG_SPAR_WRITE_OUT_COV*/ /* write covariance per frame into a text file for verification */ -/*#define DEBUG_SPAR_DIRAC_WRITE_OUT_PRED_PARS*/ -/*#define DEBUG_AGC*/ /* debug SPAR AGC in-out */ -#endif -/*#define SPAR_HOA_DBG*/ /* SPAR HOA debug statements */ -/*#define DEBUG_BINAURAL_FILTER_DESIGN*/ /* debugging of Crend binaural filter design */ -#define DEBUG_AGC_ENCODER_CMD_OPTION /* Ability to force enable or disable AGC behaviour in DIRAC/SPAR via command line option */ - -#endif -/* #################### End DEBUGGING switches ############################ */ - -/* ################# Start DEVELOPMENT switches ######################## */ - -#define BASOP_NOGLOB /* Disable global symbols in BASOPs, Overflow/Carry in BASOPs disabled, additional BASOPs in case of Overflow */ -//#define IND_LIST_DYN /* VA: Issue 18: Dynamic allocation of ind_list[] and ind_list_metadata[] based on # of transport channels */ -//#define DEBUG_VLAD - -#define LSF_RE_USE_SECONDARY_CHANNEL /* TD stereo Secondary channel LSF Q improvement */ -#ifdef LSF_RE_USE_SECONDARY_CHANNEL -/*#define LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE */ /* switch to isolate the reuse mode case */ -#endif -#define DISABLE_ADAP_RES_COD_TMP /* temporary fix for IVAS-403, disables adaptive residual coding */ -/*#define ITD_WINNER_GAIN_MODIFY */ /* ITD optimization - WORK IN PROGRESS */ -/*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ -#define FIX_I109_ORIENTATION_TRACKING /* Issue 109: Harmonize head and orientation tracking */ -/*#define SBA_HPF_TUNING_DEC*/ - -#define BINAURALIZATION_DELAY_REPORT /* VA: Issue 255 - Changes the way the decoder delay is reported */ -#define TUNE_360_OBJECT_WITH_NOISE /* VA: issue 360: consider objects being speech+noise for active speech coding */ -#define FIX_350_MASA_DELAY_COMP /* Nokia: Issue 350: MASA audio/meta delay compensation */ -#define FIX_372_LIB_REND_VALIDATE_IO /* FhG: Issue 372: IVAS_rend segfaults with unsupported I/O configs - add validation checks of I/O config */ -#define FIX_376_SBA_ROTATE /*DLB: Fix for issue 376*/ -#define TD5 /* Eri: Contribution 17: Extended metadata for 6 DoF rendering in TD renderer */ -#define TD5_FIX_INVALID_MEMORY_ACCESS /* FhG: Resolves segfault in case IVAS_REND_InitConfig gets initialized with rendererConfigEnabled:=false && ISM are being rendered */ -#define FIX_371_DELAY_REPORT /* Issue 371: div. by zero with -no_delay_cmp */ -#define FIX_373_MASA_DELAY_COMP_MSAN /* Nokia: Issue 373: MASA audio/meta delay compensation. MSAN bugfix */ - -#ifdef FIX_I109_ORIENTATION_TRACKING -#define OTR_REFERENCE_VECTOR_TRACKING /* FhG: enables the reference position orientation tracking mode */ -#endif - -#define FIX_380_BFI_PARAMISM /* VA: issue 380 - fix metadata recovery in ParamISM BFI */ -#define FIX_MDCT_BASED_BWD /* FhG: fixes for BWD for issues with reaction to transients for MDCT-stereo and MCT */ -#define DISCRETE_ISM_DTX_CNG /* FhG/VA: contribution 15 - DTX/CNG for (discrete) ISM */ -#define NCHAN_ISM_PARAMETER /* VA: make 'nchan_ism' parameter part of st_ivas/hEncoderConfig */ - - -/* ################## End DEVELOPMENT switches ######################### */ -/* clang-format on */ -#endif diff --git a/lib_enc/ivas_sce_enc.c b/lib_enc/ivas_sce_enc.c index 4754470402..649d378ce0 100644 --- a/lib_enc/ivas_sce_enc.c +++ b/lib_enc/ivas_sce_enc.c @@ -282,9 +282,6 @@ ivas_error create_sce_enc( SCE_ENC_HANDLE hSCE; Encoder_State *st; ivas_error error; -#ifdef IND_LIST_DYN - // int16_t i; -#endif error = IVAS_ERR_OK; -- GitLab From 6750cfb300a34ef4389e1ac469fbeaf32f92d9d5 Mon Sep 17 00:00:00 2001 From: Vladimir Malenovsky Date: Thu, 13 Apr 2023 14:35:34 +0200 Subject: [PATCH 048/331] clang format --- lib_enc/ivas_cpe_enc.c | 4 ++-- lib_enc/ivas_mct_core_enc.c | 2 +- lib_enc/ivas_mct_enc.c | 2 +- lib_enc/ivas_mdct_core_enc.c | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index fbb16a341e..9f36ed53fe 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -869,9 +869,9 @@ ivas_error create_cpe_enc( #endif if ( ( error = init_encoder( st, #ifdef IND_LIST_DYN - st_ivas, + st_ivas, #endif - n, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 0, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) + n, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 0, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_enc/ivas_mct_core_enc.c b/lib_enc/ivas_mct_core_enc.c index a8171b199f..49befac21c 100644 --- a/lib_enc/ivas_mct_core_enc.c +++ b/lib_enc/ivas_mct_core_enc.c @@ -444,7 +444,7 @@ void ivas_mct_core_enc( #ifdef IND_LIST_DYN /* update the pointer to the buffer of indices of the second channel */ - if (ch > 0) + if ( ch > 0 ) { st->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; } diff --git a/lib_enc/ivas_mct_enc.c b/lib_enc/ivas_mct_enc.c index b739868c24..c6ec1bbe1d 100644 --- a/lib_enc/ivas_mct_enc.c +++ b/lib_enc/ivas_mct_enc.c @@ -266,7 +266,7 @@ ivas_error ivas_mct_enc( hCPE = st_ivas->hCPE[cpe_id]; #ifdef IND_LIST_DYN - if (cpe_id > 0) + if ( cpe_id > 0 ) { hCPE->hCoreCoder[0]->hBstr->ind_list = st_ivas->hCPE[cpe_id - 1]->hCoreCoder[1]->hBstr->ind_list + st_ivas->hCPE[cpe_id - 1]->hCoreCoder[1]->hBstr->nb_ind_tot; } diff --git a/lib_enc/ivas_mdct_core_enc.c b/lib_enc/ivas_mdct_core_enc.c index 862a2436a2..3d68252654 100644 --- a/lib_enc/ivas_mdct_core_enc.c +++ b/lib_enc/ivas_mdct_core_enc.c @@ -1368,7 +1368,7 @@ void ivas_mdct_quant_coder( #ifdef IND_LIST_DYN /* update the pointer to the buffer of indices of the second channel */ - if (ch > 0) + if ( ch > 0 ) { st->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; } -- GitLab From 5bd1ef366819cff5a6a97c8d90756bc6e979b979 Mon Sep 17 00:00:00 2001 From: emerit Date: Thu, 13 Apr 2023 18:48:55 +0200 Subject: [PATCH 049/331] Initial switch between HO3 filters by define for crend only --- lib_com/options.h | 6 + lib_rend/ivas_rom_binaural_crend_head.c | 1239 ++++++++++++++++- lib_rend/ivas_rom_binaural_crend_head.h | 162 +++ .../generate_crend_ivas_tables_from_sofa.c | 42 + 4 files changed, 1435 insertions(+), 14 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index cce0aff460..3ccd9eead9 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -169,6 +169,12 @@ #define ISSUE_24_CLEANUP_MCT_LFE /* Issue 24: Cleanup LFE path withing MCT */ +#define USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 +#define USE_HRIR_128_48000_DOLBY_SBA1 +#define USE_HRIR_128_48000_DOLBY_SBA2 +#define USE_HRIR_128_48000_DOLBY_SBA3 +//#define USE_ORANGE_HRIR_53_HOA3S_48000 +#define USE_IIS_BRIR_OFFICIALMPEG_COMBINED /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_rend/ivas_rom_binaural_crend_head.c b/lib_rend/ivas_rom_binaural_crend_head.c index 56a9a9ef53..3c5515db8e 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.c +++ b/lib_rend/ivas_rom_binaural_crend_head.c @@ -47,14 +47,12 @@ #include "cnst.h" #include "ivas_cnst.h" -#define WMC_TOOL_SKIP +#ifdef USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 + /********************** CRendBin_Combined_HRIR **********************/ -#ifdef FIX_BINAURAL_DELAY_PRECISION -const float CRendBin_Combined_HRIR_latency_s = 0.000020834f; -#else + const float CRendBin_Combined_HRIR_latency_s = 0.000020833333110f; -#endif /* Sample Rate = 48000 */ @@ -643,14 +641,14 @@ const float CRendBin_Combined_HRIR_coeff_im_16kHz[15][BINAURAL_CHANNELS][80]={ }; const float *CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; const float *CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; +#endif /* USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 */ + +#ifdef USE_ORANGE_HRIR_53_HOA3S_48000 + /********************** CRendBin_HOA3_HRIR **********************/ -#ifdef FIX_BINAURAL_DELAY_PRECISION -const float CRendBin_HOA3_HRIR_latency_s = 0.001333334f; -#else const float CRendBin_HOA3_HRIR_latency_s = 0.001333333319053f; -#endif /* Sample Rate = 48000 */ @@ -1595,14 +1593,1226 @@ const float CRendBin_HOA3_HRIR_coeff_im_16kHz[16][BINAURAL_CHANNELS][160]={ }; const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; +#endif /* USE_ORANGE_HRIR_53_HOA3S_48000 */ + +#ifdef USE_HRIR_128_48000_DOLBY_SBA1 + + +/********************** CRendBin_FOA_HRIR **********************/ + +const float CRendBin_FOA_HRIR_latency_s = 0.000000000000000f; + +/* Sample Rate = 48000 */ + +const int16_t CRendBin_FOA_HRIR_max_num_iterations_48kHz = 1; +const uint16_t CRendBin_FOA_HRIR_num_iterations_48kHz[4][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {0, 0}; +const uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[4][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}}; +const uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_48kHz = 0; +const float CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz[4]={0.000000f, 0.000000f, 0.000000f, 0.000000f}; +const uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float CRendBin_FOA_HRIR_coeff_re_48kHz[4][BINAURAL_CHANNELS][240]={ + { + {0.966218f, 0.733332f, 0.371154f, 0.013886f, -0.255271f, -0.429740f, -0.543550f, -0.621345f, -0.659916f, -0.644001f, -0.568080f, -0.442479f, -0.285885f, -0.117060f, 0.048289f, 0.198155f, 0.325513f, 0.429363f, 0.513050f, 0.580002f, 0.630568f, 0.663334f, 0.679201f, 0.682684f, 0.678369f, 0.667227f, 0.647704f, 0.619700f, 0.585896f, 0.549425f, 0.511893f, 0.474018f, 0.436790f, 0.401079f, 0.366792f, 0.333238f, 0.300207f, 0.268253f, 0.237980f, 0.209327f, 0.181631f, 0.154220f, 0.126862f, 0.099653f, 0.072728f, 0.046213f, 0.020311f, -0.004833f, -0.029303f, -0.053269f, -0.076722f, -0.099506f, -0.121536f, -0.142793f, -0.163190f, -0.182595f, -0.200971f, -0.218400f, -0.234976f, -0.250747f, -0.265719f, -0.279920f, -0.293435f, -0.306316f, -0.318471f, -0.329791f, -0.340363f, -0.350414f, -0.360064f, -0.369343f, -0.378409f, -0.387487f, -0.396622f, -0.405768f, -0.415062f, -0.424742f, -0.434871f, -0.445428f, -0.456546f, -0.468369f, -0.480767f, -0.493503f, -0.506517f, -0.519763f, -0.532917f, -0.545542f, -0.557444f, -0.568682f, -0.579373f, -0.589605f, -0.599351f, -0.608366f, -0.616332f, -0.623173f, -0.629056f, -0.634137f, + -0.638497f, -0.642283f, -0.645662f, -0.648684f, -0.651369f, -0.653856f, -0.656358f, -0.659052f, -0.662067f, -0.665441f, -0.669082f, -0.672962f, -0.677320f, -0.682427f, -0.688193f, -0.694213f, -0.700145f, -0.705838f, -0.711215f, -0.716271f, -0.721089f, -0.725695f, -0.730008f, -0.734025f, -0.737880f, -0.741661f, -0.745353f, -0.748949f, -0.752427f, -0.755642f, -0.758483f, -0.761036f, -0.763409f, -0.765535f, -0.767317f, -0.768797f, -0.770037f, -0.771055f, -0.771976f, -0.773014f, -0.774208f, -0.775426f, -0.776630f, -0.777879f, -0.779146f, -0.780393f, -0.781721f, -0.783183f, -0.784625f, -0.785917f, -0.787109f, -0.788195f, -0.789049f, -0.789723f, -0.790445f, -0.791250f, -0.791985f, -0.792673f, -0.793450f, -0.794206f, -0.794720f, -0.795007f, -0.795162f, -0.795109f, -0.794841f, -0.794586f, -0.794452f, -0.794311f, -0.794201f, -0.794328f, -0.794586f, -0.794650f, -0.794553f, -0.794548f, -0.794548f, -0.794345f, -0.794130f, -0.794134f, -0.794153f, -0.793993f, -0.793868f, -0.793862f, -0.793701f, -0.793441f, -0.793538f, -0.793995f, -0.794422f, -0.794952f, -0.795989f, -0.797227f, -0.798155f, -0.799084f, -0.800408f, -0.801603f, -0.802279f, -0.803069f, + -0.804253f, -0.805010f, -0.805191f, -0.805803f, -0.806764f, -0.806769f, -0.806120f, -0.806405f, -0.806891f, -0.805335f, -0.802611f, -0.801532f, -0.801187f, -0.798575f, -0.795591f, -0.796825f, -0.800459f, -0.800016f, -0.795129f, -0.790229f, -0.782215f, -0.762867f, -0.737407f, -0.726767f, -0.742649f, -0.769892f, -0.782797f, -0.773088f, -0.754154f, -0.741924f, -0.738734f, -0.735957f, -0.729899f, -0.733260f, -0.765228f, -0.825366f, -0.883849f, -0.908419f, -0.898347f, -0.880383f, -0.873387f, -0.871922f, -0.866468f, -0.862326f, -0.868453f, -0.880014f, -0.885448f, -0.884194f}, + {0.966218f, 0.733332f, 0.371154f, 0.013886f, -0.255271f, -0.429740f, -0.543550f, -0.621345f, -0.659916f, -0.644001f, -0.568080f, -0.442479f, -0.285885f, -0.117060f, 0.048289f, 0.198155f, 0.325513f, 0.429363f, 0.513050f, 0.580002f, 0.630568f, 0.663334f, 0.679201f, 0.682684f, 0.678369f, 0.667227f, 0.647704f, 0.619700f, 0.585896f, 0.549425f, 0.511893f, 0.474018f, 0.436790f, 0.401079f, 0.366792f, 0.333238f, 0.300207f, 0.268253f, 0.237980f, 0.209327f, 0.181631f, 0.154220f, 0.126862f, 0.099653f, 0.072728f, 0.046213f, 0.020311f, -0.004833f, -0.029303f, -0.053269f, -0.076722f, -0.099506f, -0.121536f, -0.142793f, -0.163190f, -0.182595f, -0.200971f, -0.218400f, -0.234976f, -0.250747f, -0.265719f, -0.279920f, -0.293435f, -0.306316f, -0.318471f, -0.329791f, -0.340363f, -0.350414f, -0.360064f, -0.369343f, -0.378409f, -0.387487f, -0.396622f, -0.405768f, -0.415062f, -0.424742f, -0.434871f, -0.445428f, -0.456546f, -0.468369f, -0.480767f, -0.493503f, -0.506517f, -0.519763f, -0.532917f, -0.545542f, -0.557444f, -0.568682f, -0.579373f, -0.589605f, -0.599351f, -0.608366f, -0.616332f, -0.623173f, -0.629056f, -0.634137f, + -0.638497f, -0.642283f, -0.645662f, -0.648684f, -0.651369f, -0.653856f, -0.656358f, -0.659052f, -0.662067f, -0.665441f, -0.669082f, -0.672962f, -0.677320f, -0.682427f, -0.688193f, -0.694213f, -0.700145f, -0.705838f, -0.711215f, -0.716271f, -0.721089f, -0.725695f, -0.730008f, -0.734025f, -0.737880f, -0.741661f, -0.745353f, -0.748949f, -0.752427f, -0.755642f, -0.758483f, -0.761036f, -0.763409f, -0.765535f, -0.767317f, -0.768797f, -0.770037f, -0.771055f, -0.771976f, -0.773014f, -0.774208f, -0.775426f, -0.776630f, -0.777879f, -0.779146f, -0.780393f, -0.781721f, -0.783183f, -0.784625f, -0.785917f, -0.787109f, -0.788195f, -0.789049f, -0.789723f, -0.790445f, -0.791250f, -0.791985f, -0.792673f, -0.793450f, -0.794206f, -0.794720f, -0.795007f, -0.795162f, -0.795109f, -0.794841f, -0.794586f, -0.794452f, -0.794311f, -0.794201f, -0.794328f, -0.794586f, -0.794650f, -0.794553f, -0.794548f, -0.794548f, -0.794345f, -0.794130f, -0.794134f, -0.794153f, -0.793993f, -0.793868f, -0.793862f, -0.793701f, -0.793441f, -0.793538f, -0.793995f, -0.794422f, -0.794952f, -0.795989f, -0.797227f, -0.798155f, -0.799084f, -0.800408f, -0.801603f, -0.802279f, -0.803069f, + -0.804253f, -0.805010f, -0.805191f, -0.805803f, -0.806764f, -0.806769f, -0.806120f, -0.806405f, -0.806891f, -0.805335f, -0.802611f, -0.801532f, -0.801187f, -0.798575f, -0.795591f, -0.796825f, -0.800459f, -0.800016f, -0.795129f, -0.790229f, -0.782215f, -0.762867f, -0.737407f, -0.726767f, -0.742649f, -0.769892f, -0.782797f, -0.773088f, -0.754154f, -0.741924f, -0.738734f, -0.735957f, -0.729899f, -0.733260f, -0.765228f, -0.825366f, -0.883849f, -0.908419f, -0.898347f, -0.880383f, -0.873387f, -0.871922f, -0.866468f, -0.862326f, -0.868453f, -0.880014f, -0.885448f, -0.884194f} + }, + { + {0.069530f, 0.352738f, 0.714280f, 0.885288f, 0.713446f, 0.249298f, -0.318649f, -0.806052f, -1.124658f, -1.273893f, -1.286408f, -1.194906f, -1.028517f, -0.813598f, -0.570832f, -0.316123f, -0.064436f, 0.170206f, 0.377639f, 0.553010f, 0.696908f, 0.814493f, 0.911484f, 0.989435f, 1.046484f, 1.082848f, 1.103173f, 1.113184f, 1.116310f, 1.113920f, 1.106470f, 1.093611f, 1.074757f, 1.050402f, 1.022191f, 0.991595f, 0.959051f, 0.924074f, 0.885689f, 0.843261f, 0.797446f, 0.750023f, 0.702554f, 0.655685f, 0.609659f, 0.564706f, 0.520834f, 0.477976f, 0.436490f, 0.396954f, 0.359480f, 0.323618f, 0.288809f, 0.254673f, 0.221164f, 0.188708f, 0.157916f, 0.129070f, 0.102244f, 0.077759f, 0.055883f, 0.036223f, 0.018124f, 0.001473f, -0.013588f, -0.027502f, -0.041003f, -0.054210f, -0.066807f, -0.078910f, -0.090976f, -0.103076f, -0.114988f, -0.126900f, -0.139348f, -0.152546f, -0.166308f, -0.180589f, -0.195635f, -0.211564f, -0.228146f, -0.245089f, -0.262373f, -0.280192f, -0.298603f, -0.317350f, -0.336088f, -0.354672f, -0.373219f, -0.392122f, -0.412082f, -0.433737f, -0.456989f, -0.480976f, -0.504974f, -0.528975f, + -0.553152f, -0.577124f, -0.600047f, -0.621125f, -0.639881f, -0.656290f, -0.670723f, -0.683391f, -0.693803f, -0.701164f, -0.705315f, -0.706891f, -0.706661f, -0.705140f, -0.702740f, -0.699905f, -0.697104f, -0.694822f, -0.693380f, -0.692694f, -0.692541f, -0.693119f, -0.694952f, -0.698257f, -0.702754f, -0.707981f, -0.713393f, -0.718373f, -0.722645f, -0.726500f, -0.730288f, -0.733956f, -0.737383f, -0.740707f, -0.744006f, -0.747044f, -0.749626f, -0.751802f, -0.753644f, -0.755218f, -0.756809f, -0.758751f, -0.761058f, -0.763556f, -0.766202f, -0.768999f, -0.771906f, -0.775076f, -0.778852f, -0.783366f, -0.788481f, -0.794119f, -0.800196f, -0.806401f, -0.812542f, -0.818875f, -0.825636f, -0.832649f, -0.839808f, -0.847342f, -0.855190f, -0.862784f, -0.869788f, -0.876325f, -0.882332f, -0.887508f, -0.891946f, -0.895972f, -0.899482f, -0.902212f, -0.904315f, -0.905931f, -0.906830f, -0.907099f, -0.907371f, -0.907866f, -0.908254f, -0.908692f, -0.909708f, -0.910961f, -0.911524f, -0.911241f, -0.910472f, -0.909066f, -0.906977f, -0.904953f, -0.903361f, -0.901613f, -0.899703f, -0.898494f, -0.897842f, -0.896702f, -0.895299f, -0.894642f, -0.894316f, -0.893517f, + -0.893003f, -0.893248f, -0.893094f, -0.892684f, -0.893769f, -0.895229f, -0.894416f, -0.893811f, -0.897241f, -0.900009f, -0.896265f, -0.894143f, -0.903468f, -0.910502f, -0.893479f, -0.864358f, -0.859282f, -0.881749f, -0.897594f, -0.897013f, -0.910837f, -0.943680f, -0.945397f, -0.885614f, -0.810842f, -0.785450f, -0.810782f, -0.840026f, -0.841958f, -0.818240f, -0.787351f, -0.773027f, -0.771807f, -0.719767f, -0.550609f, -0.313730f, -0.167709f, -0.207926f, -0.353731f, -0.457636f, -0.477010f, -0.476826f, -0.500626f, -0.512220f, -0.460719f, -0.349140f, -0.228045f, -0.152067f}, + {-0.069530f, -0.352738f, -0.714280f, -0.885288f, -0.713446f, -0.249298f, 0.318649f, 0.806052f, 1.124658f, 1.273893f, 1.286408f, 1.194906f, 1.028517f, 0.813598f, 0.570832f, 0.316123f, 0.064436f, -0.170206f, -0.377639f, -0.553010f, -0.696908f, -0.814493f, -0.911484f, -0.989435f, -1.046484f, -1.082848f, -1.103173f, -1.113184f, -1.116310f, -1.113920f, -1.106470f, -1.093611f, -1.074757f, -1.050402f, -1.022191f, -0.991595f, -0.959051f, -0.924074f, -0.885689f, -0.843261f, -0.797446f, -0.750023f, -0.702554f, -0.655685f, -0.609659f, -0.564706f, -0.520834f, -0.477976f, -0.436490f, -0.396954f, -0.359480f, -0.323618f, -0.288809f, -0.254673f, -0.221164f, -0.188708f, -0.157916f, -0.129070f, -0.102244f, -0.077759f, -0.055883f, -0.036223f, -0.018124f, -0.001473f, 0.013588f, 0.027502f, 0.041003f, 0.054210f, 0.066807f, 0.078910f, 0.090976f, 0.103076f, 0.114988f, 0.126900f, 0.139348f, 0.152546f, 0.166308f, 0.180589f, 0.195635f, 0.211564f, 0.228146f, 0.245089f, 0.262373f, 0.280192f, 0.298603f, 0.317350f, 0.336088f, 0.354672f, 0.373219f, 0.392122f, 0.412082f, 0.433737f, 0.456989f, 0.480976f, 0.504974f, 0.528975f, + 0.553152f, 0.577124f, 0.600047f, 0.621125f, 0.639881f, 0.656290f, 0.670723f, 0.683391f, 0.693803f, 0.701164f, 0.705315f, 0.706891f, 0.706661f, 0.705140f, 0.702740f, 0.699905f, 0.697104f, 0.694822f, 0.693380f, 0.692694f, 0.692541f, 0.693119f, 0.694952f, 0.698257f, 0.702754f, 0.707981f, 0.713393f, 0.718373f, 0.722645f, 0.726500f, 0.730288f, 0.733956f, 0.737383f, 0.740707f, 0.744006f, 0.747044f, 0.749626f, 0.751802f, 0.753644f, 0.755218f, 0.756809f, 0.758751f, 0.761058f, 0.763556f, 0.766202f, 0.768999f, 0.771906f, 0.775076f, 0.778852f, 0.783366f, 0.788481f, 0.794119f, 0.800196f, 0.806401f, 0.812542f, 0.818875f, 0.825636f, 0.832649f, 0.839808f, 0.847342f, 0.855190f, 0.862784f, 0.869788f, 0.876325f, 0.882332f, 0.887508f, 0.891946f, 0.895972f, 0.899482f, 0.902212f, 0.904315f, 0.905931f, 0.906830f, 0.907099f, 0.907371f, 0.907866f, 0.908254f, 0.908692f, 0.909708f, 0.910961f, 0.911524f, 0.911241f, 0.910472f, 0.909066f, 0.906977f, 0.904953f, 0.903361f, 0.901613f, 0.899703f, 0.898494f, 0.897842f, 0.896702f, 0.895299f, 0.894642f, 0.894316f, 0.893517f, + 0.893003f, 0.893248f, 0.893094f, 0.892684f, 0.893769f, 0.895229f, 0.894416f, 0.893811f, 0.897241f, 0.900009f, 0.896265f, 0.894143f, 0.903468f, 0.910502f, 0.893479f, 0.864358f, 0.859282f, 0.881749f, 0.897594f, 0.897013f, 0.910837f, 0.943680f, 0.945397f, 0.885614f, 0.810842f, 0.785450f, 0.810782f, 0.840026f, 0.841958f, 0.818240f, 0.787351f, 0.773027f, 0.771807f, 0.719767f, 0.550609f, 0.313730f, 0.167709f, 0.207926f, 0.353731f, 0.457636f, 0.477010f, 0.476826f, 0.500626f, 0.512220f, 0.460719f, 0.349140f, 0.228045f, 0.152067f} + }, + { + {0.111800f, 0.092661f, 0.019679f, -0.084828f, -0.131610f, -0.075720f, 0.020947f, 0.070804f, 0.057095f, 0.017174f, -0.024764f, -0.063473f, -0.081887f, -0.063680f, -0.026483f, -0.005095f, -0.004637f, 0.001937f, 0.032512f, 0.076614f, 0.117317f, 0.150397f, 0.176796f, 0.192008f, 0.191179f, 0.177643f, 0.160955f, 0.148604f, 0.140863f, 0.132054f, 0.116684f, 0.094872f, 0.071200f, 0.049422f, 0.031033f, 0.018196f, 0.014048f, 0.019156f, 0.030249f, 0.043163f, 0.055421f, 0.066053f, 0.074723f, 0.081336f, 0.085615f, 0.087194f, 0.086271f, 0.083351f, 0.078080f, 0.069159f, 0.055488f, 0.036660f, 0.012659f, -0.016143f, -0.049048f, -0.085606f, -0.125572f, -0.168143f, -0.212165f, -0.257142f, -0.302871f, -0.348257f, -0.391847f, -0.433166f, -0.472058f, -0.507229f, -0.537018f, -0.560983f, -0.579257f, -0.591157f, -0.595846f, -0.593435f, -0.584148f, -0.567609f, -0.544156f, -0.515516f, -0.482987f, -0.446431f, -0.406289f, -0.365128f, -0.325668f, -0.288357f, -0.252382f, -0.218489f, -0.189259f, -0.166273f, -0.148047f, -0.131878f, -0.117566f, -0.107866f, -0.104589f, -0.105701f, -0.107613f, -0.109110f, -0.111389f, -0.115264f, + -0.120183f, -0.125324f, -0.129915f, -0.132847f, -0.133281f, -0.131381f, -0.127775f, -0.122673f, -0.115742f, -0.106161f, -0.092976f, -0.076359f, -0.058245f, -0.040715f, -0.024211f, -0.008209f, 0.007258f, 0.021783f, 0.035256f, 0.047287f, 0.056855f, 0.063257f, 0.066479f, 0.066398f, 0.062795f, 0.056194f, 0.047396f, 0.036403f, 0.022988f, 0.007826f, -0.008088f, -0.024369f, -0.040627f, -0.056023f, -0.070170f, -0.083234f, -0.094733f, -0.103775f, -0.110653f, -0.116618f, -0.122314f, -0.128068f, -0.134857f, -0.143057f, -0.151192f, -0.157728f, -0.162866f, -0.167154f, -0.170084f, -0.171405f, -0.171850f, -0.171588f, -0.169994f, -0.167442f, -0.165063f, -0.162823f, -0.160119f, -0.157592f, -0.156017f, -0.154586f, -0.152457f, -0.150257f, -0.148223f, -0.145186f, -0.140883f, -0.136504f, -0.132024f, -0.126153f, -0.119172f, -0.112453f, -0.105722f, -0.098322f, -0.091699f, -0.087128f, -0.083245f, -0.079038f, -0.075972f, -0.074448f, -0.072364f, -0.069148f, -0.066198f, -0.062479f, -0.055594f, -0.046807f, -0.038577f, -0.029196f, -0.016675f, -0.003950f, 0.006731f, 0.018542f, 0.032724f, 0.044915f, 0.054264f, 0.065298f, 0.077171f, 0.084883f, + 0.091733f, 0.103322f, 0.113002f, 0.114742f, 0.120485f, 0.137595f, 0.147068f, 0.139282f, 0.143207f, 0.172839f, 0.184844f, 0.156538f, 0.155945f, 0.236396f, 0.307519f, 0.240925f, 0.079148f, -0.007414f, 0.032856f, 0.086859f, 0.091724f, 0.123044f, 0.215138f, 0.257298f, 0.162344f, 0.014559f, -0.050405f, -0.023988f, 0.006360f, -0.000879f, -0.010258f, 0.021849f, 0.100940f, 0.184008f, 0.193280f, 0.089909f, -0.050182f, -0.095653f, -0.016073f, 0.083366f, 0.106152f, 0.075547f, 0.065316f, 0.083957f, 0.084840f, 0.051826f, 0.014987f, -0.002403f}, + {0.111800f, 0.092661f, 0.019679f, -0.084828f, -0.131610f, -0.075720f, 0.020947f, 0.070804f, 0.057095f, 0.017174f, -0.024764f, -0.063473f, -0.081887f, -0.063680f, -0.026483f, -0.005095f, -0.004637f, 0.001937f, 0.032512f, 0.076614f, 0.117317f, 0.150397f, 0.176796f, 0.192008f, 0.191179f, 0.177643f, 0.160955f, 0.148604f, 0.140863f, 0.132054f, 0.116684f, 0.094872f, 0.071200f, 0.049422f, 0.031033f, 0.018196f, 0.014048f, 0.019156f, 0.030249f, 0.043163f, 0.055421f, 0.066053f, 0.074723f, 0.081336f, 0.085615f, 0.087194f, 0.086271f, 0.083351f, 0.078080f, 0.069159f, 0.055488f, 0.036660f, 0.012659f, -0.016143f, -0.049048f, -0.085606f, -0.125572f, -0.168143f, -0.212165f, -0.257142f, -0.302871f, -0.348257f, -0.391847f, -0.433166f, -0.472058f, -0.507229f, -0.537018f, -0.560983f, -0.579257f, -0.591157f, -0.595846f, -0.593435f, -0.584148f, -0.567609f, -0.544156f, -0.515516f, -0.482987f, -0.446431f, -0.406289f, -0.365128f, -0.325668f, -0.288357f, -0.252382f, -0.218489f, -0.189259f, -0.166273f, -0.148047f, -0.131878f, -0.117566f, -0.107866f, -0.104589f, -0.105701f, -0.107613f, -0.109110f, -0.111389f, -0.115264f, + -0.120183f, -0.125324f, -0.129915f, -0.132847f, -0.133281f, -0.131381f, -0.127775f, -0.122673f, -0.115742f, -0.106161f, -0.092976f, -0.076359f, -0.058245f, -0.040715f, -0.024211f, -0.008209f, 0.007258f, 0.021783f, 0.035256f, 0.047287f, 0.056855f, 0.063257f, 0.066479f, 0.066398f, 0.062795f, 0.056194f, 0.047396f, 0.036403f, 0.022988f, 0.007826f, -0.008088f, -0.024369f, -0.040627f, -0.056023f, -0.070170f, -0.083234f, -0.094733f, -0.103775f, -0.110653f, -0.116618f, -0.122314f, -0.128068f, -0.134857f, -0.143057f, -0.151192f, -0.157728f, -0.162866f, -0.167154f, -0.170084f, -0.171405f, -0.171850f, -0.171588f, -0.169994f, -0.167442f, -0.165063f, -0.162823f, -0.160119f, -0.157592f, -0.156017f, -0.154586f, -0.152457f, -0.150257f, -0.148223f, -0.145186f, -0.140883f, -0.136504f, -0.132024f, -0.126153f, -0.119172f, -0.112453f, -0.105722f, -0.098322f, -0.091699f, -0.087128f, -0.083245f, -0.079038f, -0.075972f, -0.074448f, -0.072364f, -0.069148f, -0.066198f, -0.062479f, -0.055594f, -0.046807f, -0.038577f, -0.029196f, -0.016675f, -0.003950f, 0.006731f, 0.018542f, 0.032724f, 0.044915f, 0.054264f, 0.065298f, 0.077171f, 0.084883f, + 0.091733f, 0.103322f, 0.113002f, 0.114742f, 0.120485f, 0.137595f, 0.147068f, 0.139282f, 0.143207f, 0.172839f, 0.184844f, 0.156538f, 0.155945f, 0.236396f, 0.307519f, 0.240925f, 0.079148f, -0.007414f, 0.032856f, 0.086859f, 0.091724f, 0.123044f, 0.215138f, 0.257298f, 0.162344f, 0.014559f, -0.050405f, -0.023988f, 0.006360f, -0.000879f, -0.010258f, 0.021849f, 0.100940f, 0.184008f, 0.193280f, 0.089909f, -0.050182f, -0.095653f, -0.016073f, 0.083366f, 0.106152f, 0.075547f, 0.065316f, 0.083957f, 0.084840f, 0.051826f, 0.014987f, -0.002403f} + }, + { + {0.059457f, 0.085936f, 0.085241f, 0.027833f, -0.043944f, -0.063521f, -0.019521f, 0.033320f, 0.036813f, -0.016068f, -0.088274f, -0.140585f, -0.158479f, -0.151114f, -0.137138f, -0.128832f, -0.122444f, -0.103537f, -0.063178f, -0.006147f, 0.056899f, 0.119000f, 0.175976f, 0.223007f, 0.258809f, 0.290082f, 0.325544f, 0.366060f, 0.404748f, 0.435940f, 0.459659f, 0.477057f, 0.485768f, 0.481949f, 0.464583f, 0.435511f, 0.396430f, 0.348217f, 0.293152f, 0.235872f, 0.181156f, 0.131462f, 0.086995f, 0.047291f, 0.011925f, -0.019860f, -0.049234f, -0.077087f, -0.103305f, -0.126782f, -0.146073f, -0.160114f, -0.168584f, -0.172163f, -0.172742f, -0.172926f, -0.174658f, -0.178393f, -0.183847f, -0.190894f, -0.199120f, -0.207336f, -0.214617f, -0.221287f, -0.227964f, -0.234364f, -0.240080f, -0.245597f, -0.251299f, -0.256363f, -0.259991f, -0.262809f, -0.265586f, -0.267476f, -0.267095f, -0.264473f, -0.260252f, -0.253718f, -0.243511f, -0.229851f, -0.214251f, -0.197126f, -0.177462f, -0.155123f, -0.131960f, -0.110023f, -0.089716f, -0.070352f, -0.051528f, -0.033035f, -0.014169f, 0.005575f, 0.025309f, 0.043447f, 0.059669f, 0.074999f, + 0.089633f, 0.101857f, 0.109868f, 0.113881f, 0.115686f, 0.116439f, 0.115296f, 0.110050f, 0.099149f, 0.083422f, 0.065582f, 0.047620f, 0.029031f, 0.008119f, -0.015408f, -0.039719f, -0.062334f, -0.081886f, -0.098915f, -0.115347f, -0.132714f, -0.150577f, -0.167011f, -0.180529f, -0.191095f, -0.199667f, -0.207607f, -0.216183f, -0.225727f, -0.235418f, -0.244418f, -0.252854f, -0.261300f, -0.270058f, -0.279398f, -0.289700f, -0.300910f, -0.312505f, -0.324199f, -0.335987f, -0.347581f, -0.358572f, -0.368949f, -0.378735f, -0.387465f, -0.394661f, -0.400258f, -0.404073f, -0.405616f, -0.404811f, -0.402129f, -0.397863f, -0.392175f, -0.385744f, -0.379333f, -0.373003f, -0.366685f, -0.360900f, -0.356011f, -0.351700f, -0.347985f, -0.345621f, -0.344803f, -0.344833f, -0.345464f, -0.347028f, -0.349093f, -0.350709f, -0.351891f, -0.353267f, -0.354902f, -0.356927f, -0.360197f, -0.364876f, -0.369876f, -0.374777f, -0.380264f, -0.386061f, -0.390973f, -0.395145f, -0.399381f, -0.402703f, -0.403726f, -0.403187f, -0.401906f, -0.398520f, -0.392428f, -0.385687f, -0.379088f, -0.370803f, -0.361132f, -0.352826f, -0.345523f, -0.336817f, -0.328347f, -0.322499f, + -0.316073f, -0.307037f, -0.300969f, -0.299317f, -0.292838f, -0.280644f, -0.277266f, -0.283217f, -0.276239f, -0.255690f, -0.255875f, -0.279115f, -0.268071f, -0.203008f, -0.169784f, -0.245698f, -0.365333f, -0.404529f, -0.361687f, -0.334923f, -0.343079f, -0.311549f, -0.240812f, -0.239266f, -0.346481f, -0.455499f, -0.471686f, -0.438424f, -0.438562f, -0.467601f, -0.476962f, -0.461364f, -0.428614f, -0.352244f, -0.233087f, -0.153489f, -0.187619f, -0.290385f, -0.350672f, -0.336184f, -0.314805f, -0.337205f, -0.368617f, -0.359721f, -0.333879f, -0.360020f, -0.453502f, -0.541952f}, + {0.059457f, 0.085936f, 0.085241f, 0.027833f, -0.043944f, -0.063521f, -0.019521f, 0.033320f, 0.036813f, -0.016068f, -0.088274f, -0.140585f, -0.158479f, -0.151114f, -0.137138f, -0.128832f, -0.122444f, -0.103537f, -0.063178f, -0.006147f, 0.056899f, 0.119000f, 0.175976f, 0.223007f, 0.258809f, 0.290082f, 0.325544f, 0.366060f, 0.404748f, 0.435940f, 0.459659f, 0.477057f, 0.485768f, 0.481949f, 0.464583f, 0.435511f, 0.396430f, 0.348217f, 0.293152f, 0.235872f, 0.181156f, 0.131462f, 0.086995f, 0.047291f, 0.011925f, -0.019860f, -0.049234f, -0.077087f, -0.103305f, -0.126782f, -0.146073f, -0.160114f, -0.168584f, -0.172163f, -0.172742f, -0.172926f, -0.174658f, -0.178393f, -0.183847f, -0.190894f, -0.199120f, -0.207336f, -0.214617f, -0.221287f, -0.227964f, -0.234364f, -0.240080f, -0.245597f, -0.251299f, -0.256363f, -0.259991f, -0.262809f, -0.265586f, -0.267476f, -0.267095f, -0.264473f, -0.260252f, -0.253718f, -0.243511f, -0.229851f, -0.214251f, -0.197126f, -0.177462f, -0.155123f, -0.131960f, -0.110023f, -0.089716f, -0.070352f, -0.051528f, -0.033035f, -0.014169f, 0.005575f, 0.025309f, 0.043447f, 0.059669f, 0.074999f, + 0.089633f, 0.101857f, 0.109868f, 0.113881f, 0.115686f, 0.116439f, 0.115296f, 0.110050f, 0.099149f, 0.083422f, 0.065582f, 0.047620f, 0.029031f, 0.008119f, -0.015408f, -0.039719f, -0.062334f, -0.081886f, -0.098915f, -0.115347f, -0.132714f, -0.150577f, -0.167011f, -0.180529f, -0.191095f, -0.199667f, -0.207607f, -0.216183f, -0.225727f, -0.235418f, -0.244418f, -0.252854f, -0.261300f, -0.270058f, -0.279398f, -0.289700f, -0.300910f, -0.312505f, -0.324199f, -0.335987f, -0.347581f, -0.358572f, -0.368949f, -0.378735f, -0.387465f, -0.394661f, -0.400258f, -0.404073f, -0.405616f, -0.404811f, -0.402129f, -0.397863f, -0.392175f, -0.385744f, -0.379333f, -0.373003f, -0.366685f, -0.360900f, -0.356011f, -0.351700f, -0.347985f, -0.345621f, -0.344803f, -0.344833f, -0.345464f, -0.347028f, -0.349093f, -0.350709f, -0.351891f, -0.353267f, -0.354902f, -0.356927f, -0.360197f, -0.364876f, -0.369876f, -0.374777f, -0.380264f, -0.386061f, -0.390973f, -0.395145f, -0.399381f, -0.402703f, -0.403726f, -0.403187f, -0.401906f, -0.398520f, -0.392428f, -0.385687f, -0.379088f, -0.370803f, -0.361132f, -0.352826f, -0.345523f, -0.336817f, -0.328347f, -0.322499f, + -0.316073f, -0.307037f, -0.300969f, -0.299317f, -0.292838f, -0.280644f, -0.277266f, -0.283217f, -0.276239f, -0.255690f, -0.255875f, -0.279115f, -0.268071f, -0.203008f, -0.169784f, -0.245698f, -0.365333f, -0.404529f, -0.361687f, -0.334923f, -0.343079f, -0.311549f, -0.240812f, -0.239266f, -0.346481f, -0.455499f, -0.471686f, -0.438424f, -0.438562f, -0.467601f, -0.476962f, -0.461364f, -0.428614f, -0.352244f, -0.233087f, -0.153489f, -0.187619f, -0.290385f, -0.350672f, -0.336184f, -0.314805f, -0.337205f, -0.368617f, -0.359721f, -0.333879f, -0.360020f, -0.453502f, -0.541952f} + } +}; +const float CRendBin_FOA_HRIR_coeff_im_48kHz[4][BINAURAL_CHANNELS][240]={ + { + {-0.232642f, -0.619757f, -0.819335f, -0.824328f, -0.706584f, -0.546612f, -0.382357f, -0.211011f, -0.022767f, 0.174826f, 0.359188f, 0.508148f, 0.609626f, 0.661324f, 0.667146f, 0.635245f, 0.576667f, 0.502394f, 0.419701f, 0.331090f, 0.237324f, 0.141387f, 0.048569f, -0.037525f, -0.117560f, -0.193955f, -0.266698f, -0.333052f, -0.390834f, -0.440313f, -0.482842f, -0.519219f, -0.550026f, -0.576478f, -0.599941f, -0.620936f, -0.639198f, -0.654639f, -0.667907f, -0.679984f, -0.691454f, -0.702244f, -0.711985f, -0.720441f, -0.727553f, -0.733292f, -0.737699f, -0.740994f, -0.743411f, -0.744954f, -0.745498f, -0.745034f, -0.743668f, -0.741462f, -0.738438f, -0.734723f, -0.730530f, -0.726026f, -0.721284f, -0.716333f, -0.711223f, -0.706042f, -0.700845f, -0.695593f, -0.690269f, -0.685041f, -0.680161f, -0.675721f, -0.671676f, -0.668072f, -0.665011f, -0.662423f, -0.660150f, -0.658206f, -0.656688f, -0.655503f, -0.654437f, -0.653421f, -0.652408f, -0.651126f, -0.649247f, -0.646675f, -0.643399f, -0.639213f, -0.633903f, -0.627573f, -0.620560f, -0.613122f, -0.605346f, -0.597201f, -0.588552f, -0.579312f, -0.569672f, -0.560020f, -0.550630f, -0.541590f, + -0.532994f, -0.524947f, -0.517448f, -0.510454f, -0.504037f, -0.498304f, -0.493261f, -0.488818f, -0.484835f, -0.481127f, -0.477591f, -0.474316f, -0.471348f, -0.468385f, -0.464947f, -0.460801f, -0.456039f, -0.450823f, -0.445293f, -0.439599f, -0.433815f, -0.427903f, -0.421886f, -0.415901f, -0.410010f, -0.404135f, -0.398211f, -0.392213f, -0.386062f, -0.379728f, -0.373352f, -0.367079f, -0.360861f, -0.354623f, -0.348453f, -0.342474f, -0.336717f, -0.331241f, -0.326150f, -0.321375f, -0.316703f, -0.312055f, -0.307501f, -0.303027f, -0.298575f, -0.294194f, -0.289903f, -0.285550f, -0.281022f, -0.276422f, -0.271827f, -0.267178f, -0.262535f, -0.258098f, -0.253864f, -0.249627f, -0.245362f, -0.241189f, -0.237022f, -0.232677f, -0.228229f, -0.223866f, -0.219586f, -0.215378f, -0.211424f, -0.207793f, -0.204299f, -0.200877f, -0.197662f, -0.194546f, -0.191240f, -0.187807f, -0.184548f, -0.181425f, -0.178221f, -0.175084f, -0.172235f, -0.169471f, -0.166568f, -0.163737f, -0.161128f, -0.158515f, -0.155899f, -0.153649f, -0.151723f, -0.149662f, -0.147483f, -0.145537f, -0.143560f, -0.141061f, -0.138329f, -0.135814f, -0.133105f, -0.129813f, -0.126525f, -0.123593f, + -0.120298f, -0.116424f, -0.112883f, -0.109720f, -0.105787f, -0.101273f, -0.097619f, -0.094331f, -0.089558f, -0.084187f, -0.080833f, -0.078688f, -0.074889f, -0.070753f, -0.069809f, -0.069830f, -0.064961f, -0.055837f, -0.048252f, -0.041884f, -0.032181f, -0.025073f, -0.035481f, -0.064601f, -0.090757f, -0.092450f, -0.073213f, -0.055377f, -0.054369f, -0.066563f, -0.079976f, -0.091134f, -0.109543f, -0.143769f, -0.182405f, -0.196180f, -0.167685f, -0.114625f, -0.072411f, -0.055952f, -0.051237f, -0.043408f, -0.036029f, -0.036627f, -0.038865f, -0.031657f, -0.016835f, -0.004448f}, + {-0.232642f, -0.619757f, -0.819335f, -0.824328f, -0.706584f, -0.546612f, -0.382357f, -0.211011f, -0.022767f, 0.174826f, 0.359188f, 0.508148f, 0.609626f, 0.661324f, 0.667146f, 0.635245f, 0.576667f, 0.502394f, 0.419701f, 0.331090f, 0.237324f, 0.141387f, 0.048569f, -0.037525f, -0.117560f, -0.193955f, -0.266698f, -0.333052f, -0.390834f, -0.440313f, -0.482842f, -0.519219f, -0.550026f, -0.576478f, -0.599941f, -0.620936f, -0.639198f, -0.654639f, -0.667907f, -0.679984f, -0.691454f, -0.702244f, -0.711985f, -0.720441f, -0.727553f, -0.733292f, -0.737699f, -0.740994f, -0.743411f, -0.744954f, -0.745498f, -0.745034f, -0.743668f, -0.741462f, -0.738438f, -0.734723f, -0.730530f, -0.726026f, -0.721284f, -0.716333f, -0.711223f, -0.706042f, -0.700845f, -0.695593f, -0.690269f, -0.685041f, -0.680161f, -0.675721f, -0.671676f, -0.668072f, -0.665011f, -0.662423f, -0.660150f, -0.658206f, -0.656688f, -0.655503f, -0.654437f, -0.653421f, -0.652408f, -0.651126f, -0.649247f, -0.646675f, -0.643399f, -0.639213f, -0.633903f, -0.627573f, -0.620560f, -0.613122f, -0.605346f, -0.597201f, -0.588552f, -0.579312f, -0.569672f, -0.560020f, -0.550630f, -0.541590f, + -0.532994f, -0.524947f, -0.517448f, -0.510454f, -0.504037f, -0.498304f, -0.493261f, -0.488818f, -0.484835f, -0.481127f, -0.477591f, -0.474316f, -0.471348f, -0.468385f, -0.464947f, -0.460801f, -0.456039f, -0.450823f, -0.445293f, -0.439599f, -0.433815f, -0.427903f, -0.421886f, -0.415901f, -0.410010f, -0.404135f, -0.398211f, -0.392213f, -0.386062f, -0.379728f, -0.373352f, -0.367079f, -0.360861f, -0.354623f, -0.348453f, -0.342474f, -0.336717f, -0.331241f, -0.326150f, -0.321375f, -0.316703f, -0.312055f, -0.307501f, -0.303027f, -0.298575f, -0.294194f, -0.289903f, -0.285550f, -0.281022f, -0.276422f, -0.271827f, -0.267178f, -0.262535f, -0.258098f, -0.253864f, -0.249627f, -0.245362f, -0.241189f, -0.237022f, -0.232677f, -0.228229f, -0.223866f, -0.219586f, -0.215378f, -0.211424f, -0.207793f, -0.204299f, -0.200877f, -0.197662f, -0.194546f, -0.191240f, -0.187807f, -0.184548f, -0.181425f, -0.178221f, -0.175084f, -0.172235f, -0.169471f, -0.166568f, -0.163737f, -0.161128f, -0.158515f, -0.155899f, -0.153649f, -0.151723f, -0.149662f, -0.147483f, -0.145537f, -0.143560f, -0.141061f, -0.138329f, -0.135814f, -0.133105f, -0.129813f, -0.126525f, -0.123593f, + -0.120298f, -0.116424f, -0.112883f, -0.109720f, -0.105787f, -0.101273f, -0.097619f, -0.094331f, -0.089558f, -0.084187f, -0.080833f, -0.078688f, -0.074889f, -0.070753f, -0.069809f, -0.069830f, -0.064961f, -0.055837f, -0.048252f, -0.041884f, -0.032181f, -0.025073f, -0.035481f, -0.064601f, -0.090757f, -0.092450f, -0.073213f, -0.055377f, -0.054369f, -0.066563f, -0.079976f, -0.091134f, -0.109543f, -0.143769f, -0.182405f, -0.196180f, -0.167685f, -0.114625f, -0.072411f, -0.055952f, -0.051237f, -0.043408f, -0.036029f, -0.036627f, -0.038865f, -0.031657f, -0.016835f, -0.004448f} + }, + { + {0.140382f, 0.284796f, 0.113059f, -0.341301f, -0.862015f, -1.204634f, -1.248279f, -1.029758f, -0.664763f, -0.256066f, 0.137783f, 0.487211f, 0.775946f, 0.997771f, 1.153436f, 1.245420f, 1.277398f, 1.256961f, 1.195620f, 1.106451f, 1.001768f, 0.890131f, 0.774183f, 0.653473f, 0.530185f, 0.410173f, 0.298320f, 0.195312f, 0.099336f, 0.008646f, -0.078032f, -0.161428f, -0.241062f, -0.315649f, -0.384630f, -0.448733f, -0.509170f, -0.566793f, -0.621581f, -0.672385f, -0.717596f, -0.756520f, -0.789753f, -0.818228f, -0.842538f, -0.863181f, -0.880623f, -0.894965f, -0.906175f, -0.914704f, -0.921413f, -0.926918f, -0.931340f, -0.934448f, -0.935793f, -0.935022f, -0.932267f, -0.927970f, -0.922378f, -0.915726f, -0.908718f, -0.902136f, -0.896106f, -0.890432f, -0.885422f, -0.881597f, -0.878827f, -0.876579f, -0.874831f, -0.873952f, -0.873913f, -0.874370f, -0.875375f, -0.877274f, -0.880013f, -0.883133f, -0.886386f, -0.889857f, -0.893495f, -0.896943f, -0.899891f, -0.902370f, -0.904567f, -0.906469f, -0.907798f, -0.908330f, -0.908151f, -0.907581f, -0.906978f, -0.906626f, -0.906487f, -0.905858f, -0.903647f, -0.899249f, -0.892899f, -0.884927f, + -0.875053f, -0.862712f, -0.847727f, -0.830455f, -0.811563f, -0.791782f, -0.771500f, -0.750522f, -0.728617f, -0.706326f, -0.684815f, -0.664994f, -0.647154f, -0.631330f, -0.617578f, -0.605915f, -0.596270f, -0.588409f, -0.581848f, -0.576120f, -0.571189f, -0.567244f, -0.564062f, -0.560956f, -0.557300f, -0.552749f, -0.547149f, -0.540696f, -0.533982f, -0.527464f, -0.521067f, -0.514596f, -0.508155f, -0.501839f, -0.495465f, -0.488925f, -0.482422f, -0.476181f, -0.470299f, -0.464951f, -0.460286f, -0.456131f, -0.452168f, -0.448311f, -0.444625f, -0.441111f, -0.437847f, -0.435012f, -0.432529f, -0.430047f, -0.427337f, -0.424316f, -0.420805f, -0.416729f, -0.412382f, -0.407980f, -0.403285f, -0.398067f, -0.392448f, -0.386360f, -0.379335f, -0.371209f, -0.362359f, -0.353002f, -0.343026f, -0.332618f, -0.322186f, -0.311707f, -0.300948f, -0.290105f, -0.279460f, -0.268914f, -0.258530f, -0.248800f, -0.239810f, -0.231038f, -0.222364f, -0.214099f, -0.205871f, -0.196868f, -0.187179f, -0.177547f, -0.168128f, -0.158861f, -0.150296f, -0.142677f, -0.135313f, -0.127959f, -0.121270f, -0.115110f, -0.108460f, -0.101467f, -0.095154f, -0.089193f, -0.082636f, -0.076028f, + -0.070002f, -0.063579f, -0.056514f, -0.050189f, -0.043975f, -0.035661f, -0.026929f, -0.020905f, -0.014065f, -0.001634f, 0.010286f, 0.014441f, 0.021776f, 0.046877f, 0.075043f, 0.076336f, 0.055881f, 0.051243f, 0.071963f, 0.088061f, 0.093592f, 0.127625f, 0.202698f, 0.263860f, 0.260005f, 0.216330f, 0.195773f, 0.220955f, 0.268761f, 0.311828f, 0.337692f, 0.357947f, 0.413641f, 0.524316f, 0.615425f, 0.563270f, 0.351718f, 0.123833f, 0.026612f, 0.054001f, 0.097163f, 0.102905f, 0.112567f, 0.165999f, 0.234599f, 0.256682f, 0.199112f, 0.074735f}, + {-0.140382f, -0.284796f, -0.113059f, 0.341301f, 0.862015f, 1.204634f, 1.248279f, 1.029758f, 0.664763f, 0.256066f, -0.137783f, -0.487211f, -0.775946f, -0.997771f, -1.153436f, -1.245420f, -1.277398f, -1.256961f, -1.195620f, -1.106451f, -1.001768f, -0.890131f, -0.774183f, -0.653473f, -0.530185f, -0.410173f, -0.298320f, -0.195312f, -0.099336f, -0.008646f, 0.078032f, 0.161428f, 0.241062f, 0.315649f, 0.384630f, 0.448733f, 0.509170f, 0.566793f, 0.621581f, 0.672385f, 0.717596f, 0.756520f, 0.789753f, 0.818228f, 0.842538f, 0.863181f, 0.880623f, 0.894965f, 0.906175f, 0.914704f, 0.921413f, 0.926918f, 0.931340f, 0.934448f, 0.935793f, 0.935022f, 0.932267f, 0.927970f, 0.922378f, 0.915726f, 0.908718f, 0.902136f, 0.896106f, 0.890432f, 0.885422f, 0.881597f, 0.878827f, 0.876579f, 0.874831f, 0.873952f, 0.873913f, 0.874370f, 0.875375f, 0.877274f, 0.880013f, 0.883133f, 0.886386f, 0.889857f, 0.893495f, 0.896943f, 0.899891f, 0.902370f, 0.904567f, 0.906469f, 0.907798f, 0.908330f, 0.908151f, 0.907581f, 0.906978f, 0.906626f, 0.906487f, 0.905858f, 0.903647f, 0.899249f, 0.892899f, 0.884927f, + 0.875053f, 0.862712f, 0.847727f, 0.830455f, 0.811563f, 0.791782f, 0.771500f, 0.750522f, 0.728617f, 0.706326f, 0.684815f, 0.664994f, 0.647154f, 0.631330f, 0.617578f, 0.605915f, 0.596270f, 0.588409f, 0.581848f, 0.576120f, 0.571189f, 0.567244f, 0.564062f, 0.560956f, 0.557300f, 0.552749f, 0.547149f, 0.540696f, 0.533982f, 0.527464f, 0.521067f, 0.514596f, 0.508155f, 0.501839f, 0.495465f, 0.488925f, 0.482422f, 0.476181f, 0.470299f, 0.464951f, 0.460286f, 0.456131f, 0.452168f, 0.448311f, 0.444625f, 0.441111f, 0.437847f, 0.435012f, 0.432529f, 0.430047f, 0.427337f, 0.424316f, 0.420805f, 0.416729f, 0.412382f, 0.407980f, 0.403285f, 0.398067f, 0.392448f, 0.386360f, 0.379335f, 0.371209f, 0.362359f, 0.353002f, 0.343026f, 0.332618f, 0.322186f, 0.311707f, 0.300948f, 0.290105f, 0.279460f, 0.268914f, 0.258530f, 0.248800f, 0.239810f, 0.231038f, 0.222364f, 0.214099f, 0.205871f, 0.196868f, 0.187179f, 0.177547f, 0.168128f, 0.158861f, 0.150296f, 0.142677f, 0.135313f, 0.127959f, 0.121270f, 0.115110f, 0.108460f, 0.101467f, 0.095154f, 0.089193f, 0.082636f, 0.076028f, + 0.070002f, 0.063579f, 0.056514f, 0.050189f, 0.043975f, 0.035661f, 0.026929f, 0.020905f, 0.014065f, 0.001634f, -0.010286f, -0.014441f, -0.021776f, -0.046877f, -0.075043f, -0.076336f, -0.055881f, -0.051243f, -0.071963f, -0.088061f, -0.093592f, -0.127625f, -0.202698f, -0.263860f, -0.260005f, -0.216330f, -0.195773f, -0.220955f, -0.268761f, -0.311828f, -0.337692f, -0.357947f, -0.413641f, -0.524316f, -0.615425f, -0.563270f, -0.351718f, -0.123833f, -0.026612f, -0.054001f, -0.097163f, -0.102905f, -0.112567f, -0.165999f, -0.234599f, -0.256682f, -0.199112f, -0.074735f} + }, + { + {-0.025709f, -0.087852f, -0.139072f, -0.114670f, -0.010581f, 0.083762f, 0.089935f, 0.027679f, -0.033031f, -0.059926f, -0.060733f, -0.038043f, 0.008721f, 0.055627f, 0.072784f, 0.065756f, 0.067013f, 0.089127f, 0.112190f, 0.115989f, 0.101255f, 0.076571f, 0.043604f, 0.002504f, -0.039568f, -0.072838f, -0.093984f, -0.107885f, -0.122174f, -0.140465f, -0.159571f, -0.173362f, -0.178912f, -0.177313f, -0.169818f, -0.156888f, -0.141159f, -0.127823f, -0.120897f, -0.120944f, -0.126572f, -0.136377f, -0.149380f, -0.165024f, -0.183014f, -0.202776f, -0.223635f, -0.245715f, -0.269757f, -0.295840f, -0.323002f, -0.349990f, -0.375616f, -0.398737f, -0.418610f, -0.434862f, -0.446808f, -0.453571f, -0.454971f, -0.451233f, -0.441889f, -0.426235f, -0.404594f, -0.377728f, -0.345446f, -0.307343f, -0.264342f, -0.217973f, -0.168839f, -0.117241f, -0.064423f, -0.011833f, 0.039787f, 0.089385f, 0.134986f, 0.175305f, 0.210590f, 0.240697f, 0.263879f, 0.278867f, 0.286867f, 0.289982f, 0.288504f, 0.281317f, 0.268764f, 0.253745f, 0.239176f, 0.224979f, 0.208874f, 0.190415f, 0.172740f, 0.159261f, 0.149978f, 0.142540f, 0.135820f, 0.130669f, + 0.128026f, 0.128135f, 0.131114f, 0.136745f, 0.143982f, 0.151658f, 0.159406f, 0.167441f, 0.175977f, 0.184865f, 0.192984f, 0.198243f, 0.199231f, 0.196556f, 0.191632f, 0.184859f, 0.175906f, 0.164788f, 0.151549f, 0.135833f, 0.117715f, 0.098073f, 0.077678f, 0.056957f, 0.036748f, 0.018014f, 0.000872f, -0.014868f, -0.028575f, -0.039388f, -0.047290f, -0.052543f, -0.054987f, -0.054782f, -0.052664f, -0.048888f, -0.043302f, -0.036732f, -0.030687f, -0.025659f, -0.021283f, -0.017577f, -0.014246f, -0.009715f, -0.002804f, 0.005660f, 0.014470f, 0.023743f, 0.033647f, 0.043359f, 0.052494f, 0.061578f, 0.070378f, 0.077923f, 0.084389f, 0.090692f, 0.096591f, 0.101528f, 0.106380f, 0.112094f, 0.118037f, 0.123692f, 0.129929f, 0.136925f, 0.143401f, 0.149129f, 0.155244f, 0.161468f, 0.166321f, 0.169947f, 0.173303f, 0.175561f, 0.175884f, 0.175902f, 0.177023f, 0.178070f, 0.178540f, 0.180407f, 0.184301f, 0.188503f, 0.193141f, 0.199909f, 0.207375f, 0.212779f, 0.217314f, 0.222988f, 0.227302f, 0.227989f, 0.228035f, 0.229199f, 0.227725f, 0.222579f, 0.218340f, 0.215242f, 0.208655f, 0.200648f, + 0.196609f, 0.191792f, 0.180454f, 0.171665f, 0.171997f, 0.166224f, 0.145987f, 0.134797f, 0.144064f, 0.138339f, 0.100138f, 0.083322f, 0.120723f, 0.129214f, 0.021665f, -0.123541f, -0.144768f, -0.034350f, 0.057753f, 0.060616f, 0.056870f, 0.089515f, 0.067490f, -0.060009f, -0.181042f, -0.173043f, -0.072960f, -0.000831f, 0.008317f, 0.010713f, 0.046903f, 0.097902f, 0.114688f, 0.055575f, -0.066337f, -0.157373f, -0.122700f, 0.009537f, 0.105443f, 0.088390f, 0.020247f, -0.007578f, 0.004660f, 0.000024f, -0.033101f, -0.055003f, -0.043748f, -0.015207f}, + {-0.025709f, -0.087852f, -0.139072f, -0.114670f, -0.010581f, 0.083762f, 0.089935f, 0.027679f, -0.033031f, -0.059926f, -0.060733f, -0.038043f, 0.008721f, 0.055627f, 0.072784f, 0.065756f, 0.067013f, 0.089127f, 0.112190f, 0.115989f, 0.101255f, 0.076571f, 0.043604f, 0.002504f, -0.039568f, -0.072838f, -0.093984f, -0.107885f, -0.122174f, -0.140465f, -0.159571f, -0.173362f, -0.178912f, -0.177313f, -0.169818f, -0.156888f, -0.141159f, -0.127823f, -0.120897f, -0.120944f, -0.126572f, -0.136377f, -0.149380f, -0.165024f, -0.183014f, -0.202776f, -0.223635f, -0.245715f, -0.269757f, -0.295840f, -0.323002f, -0.349990f, -0.375616f, -0.398737f, -0.418610f, -0.434862f, -0.446808f, -0.453571f, -0.454971f, -0.451233f, -0.441889f, -0.426235f, -0.404594f, -0.377728f, -0.345446f, -0.307343f, -0.264342f, -0.217973f, -0.168839f, -0.117241f, -0.064423f, -0.011833f, 0.039787f, 0.089385f, 0.134986f, 0.175305f, 0.210590f, 0.240697f, 0.263879f, 0.278867f, 0.286867f, 0.289982f, 0.288504f, 0.281317f, 0.268764f, 0.253745f, 0.239176f, 0.224979f, 0.208874f, 0.190415f, 0.172740f, 0.159261f, 0.149978f, 0.142540f, 0.135820f, 0.130669f, + 0.128026f, 0.128135f, 0.131114f, 0.136745f, 0.143982f, 0.151658f, 0.159406f, 0.167441f, 0.175977f, 0.184865f, 0.192984f, 0.198243f, 0.199231f, 0.196556f, 0.191632f, 0.184859f, 0.175906f, 0.164788f, 0.151549f, 0.135833f, 0.117715f, 0.098073f, 0.077678f, 0.056957f, 0.036748f, 0.018014f, 0.000872f, -0.014868f, -0.028575f, -0.039388f, -0.047290f, -0.052543f, -0.054987f, -0.054782f, -0.052664f, -0.048888f, -0.043302f, -0.036732f, -0.030687f, -0.025659f, -0.021283f, -0.017577f, -0.014246f, -0.009715f, -0.002804f, 0.005660f, 0.014470f, 0.023743f, 0.033647f, 0.043359f, 0.052494f, 0.061578f, 0.070378f, 0.077923f, 0.084389f, 0.090692f, 0.096591f, 0.101528f, 0.106380f, 0.112094f, 0.118037f, 0.123692f, 0.129929f, 0.136925f, 0.143401f, 0.149129f, 0.155244f, 0.161468f, 0.166321f, 0.169947f, 0.173303f, 0.175561f, 0.175884f, 0.175902f, 0.177023f, 0.178070f, 0.178540f, 0.180407f, 0.184301f, 0.188503f, 0.193141f, 0.199909f, 0.207375f, 0.212779f, 0.217314f, 0.222988f, 0.227302f, 0.227989f, 0.228035f, 0.229199f, 0.227725f, 0.222579f, 0.218340f, 0.215242f, 0.208655f, 0.200648f, + 0.196609f, 0.191792f, 0.180454f, 0.171665f, 0.171997f, 0.166224f, 0.145987f, 0.134797f, 0.144064f, 0.138339f, 0.100138f, 0.083322f, 0.120723f, 0.129214f, 0.021665f, -0.123541f, -0.144768f, -0.034350f, 0.057753f, 0.060616f, 0.056870f, 0.089515f, 0.067490f, -0.060009f, -0.181042f, -0.173043f, -0.072960f, -0.000831f, 0.008317f, 0.010713f, 0.046903f, 0.097902f, 0.114688f, 0.055575f, -0.066337f, -0.157373f, -0.122700f, 0.009537f, 0.105443f, 0.088390f, 0.020247f, -0.007578f, 0.004660f, 0.000024f, -0.033101f, -0.055003f, -0.043748f, -0.015207f} + }, + { + {0.004301f, -0.013476f, -0.069855f, -0.112233f, -0.090233f, -0.023427f, 0.018901f, -0.004024f, -0.066053f, -0.110415f, -0.105009f, -0.058395f, 0.001235f, 0.050922f, 0.084875f, 0.113445f, 0.150612f, 0.198514f, 0.245067f, 0.276957f, 0.290295f, 0.287473f, 0.270798f, 0.244182f, 0.215808f, 0.191987f, 0.169678f, 0.140040f, 0.098790f, 0.049069f, -0.005223f, -0.064266f, -0.129212f, -0.197710f, -0.264893f, -0.327191f, -0.382959f, -0.430138f, -0.465663f, -0.487872f, -0.498285f, -0.500319f, -0.496901f, -0.489765f, -0.480177f, -0.469238f, -0.457371f, -0.444016f, -0.428168f, -0.409285f, -0.387825f, -0.365159f, -0.343191f, -0.324015f, -0.309255f, -0.299101f, -0.292156f, -0.286670f, -0.281620f, -0.276311f, -0.269794f, -0.261628f, -0.252562f, -0.243448f, -0.234059f, -0.223904f, -0.213327f, -0.202652f, -0.191162f, -0.178231f, -0.164569f, -0.150934f, -0.136555f, -0.120347f, -0.102808f, -0.085100f, -0.067101f, -0.048163f, -0.029184f, -0.012044f, 0.002742f, 0.016047f, 0.027774f, 0.036175f, 0.040005f, 0.040094f, 0.038140f, 0.034953f, 0.030572f, 0.025196f, 0.018816f, 0.010402f, -0.001256f, -0.015920f, -0.032251f, -0.049947f, + -0.070292f, -0.094062f, -0.119898f, -0.145560f, -0.170281f, -0.195266f, -0.222067f, -0.250644f, -0.278790f, -0.303633f, -0.324109f, -0.341676f, -0.358158f, -0.373323f, -0.385151f, -0.392113f, -0.394639f, -0.394771f, -0.394738f, -0.395368f, -0.395476f, -0.393190f, -0.388016f, -0.381245f, -0.374662f, -0.369480f, -0.366096f, -0.363936f, -0.361729f, -0.358693f, -0.355247f, -0.352152f, -0.349560f, -0.347298f, -0.345265f, -0.343082f, -0.340057f, -0.335871f, -0.330643f, -0.324295f, -0.316590f, -0.307660f, -0.297736f, -0.286624f, -0.274141f, -0.260611f, -0.246376f, -0.231487f, -0.216324f, -0.201731f, -0.188250f, -0.176027f, -0.165469f, -0.156991f, -0.150296f, -0.144906f, -0.140952f, -0.138536f, -0.137112f, -0.136366f, -0.136669f, -0.137907f, -0.139122f, -0.139867f, -0.140476f, -0.140741f, -0.139998f, -0.138538f, -0.137285f, -0.136389f, -0.135636f, -0.135341f, -0.135341f, -0.134436f, -0.132129f, -0.129168f, -0.125552f, -0.120298f, -0.113600f, -0.106478f, -0.098431f, -0.088467f, -0.077617f, -0.067238f, -0.056573f, -0.045203f, -0.035126f, -0.027288f, -0.019916f, -0.012845f, -0.008413f, -0.006290f, -0.003787f, -0.001744f, -0.002475f, -0.003553f, + -0.002665f, -0.004018f, -0.009329f, -0.011340f, -0.008882f, -0.013592f, -0.026133f, -0.028495f, -0.020197f, -0.028759f, -0.055232f, -0.055789f, -0.023439f, -0.031660f, -0.124564f, -0.217122f, -0.200917f, -0.107754f, -0.056107f, -0.066073f, -0.058846f, -0.027906f, -0.061373f, -0.169830f, -0.234929f, -0.183494f, -0.092827f, -0.059029f, -0.063888f, -0.041976f, 0.009389f, 0.060627f, 0.114330f, 0.163356f, 0.148189f, 0.037885f, -0.089951f, -0.129600f, -0.082891f, -0.043468f, -0.059765f, -0.084990f, -0.070715f, -0.045983f, -0.067518f, -0.125030f, -0.140466f, -0.062947f}, + {0.004301f, -0.013476f, -0.069855f, -0.112233f, -0.090233f, -0.023427f, 0.018901f, -0.004024f, -0.066053f, -0.110415f, -0.105009f, -0.058395f, 0.001235f, 0.050922f, 0.084875f, 0.113445f, 0.150612f, 0.198514f, 0.245067f, 0.276957f, 0.290295f, 0.287473f, 0.270798f, 0.244182f, 0.215808f, 0.191987f, 0.169678f, 0.140040f, 0.098790f, 0.049069f, -0.005223f, -0.064266f, -0.129212f, -0.197710f, -0.264893f, -0.327191f, -0.382959f, -0.430138f, -0.465663f, -0.487872f, -0.498285f, -0.500319f, -0.496901f, -0.489765f, -0.480177f, -0.469238f, -0.457371f, -0.444016f, -0.428168f, -0.409285f, -0.387825f, -0.365159f, -0.343191f, -0.324015f, -0.309255f, -0.299101f, -0.292156f, -0.286670f, -0.281620f, -0.276311f, -0.269794f, -0.261628f, -0.252562f, -0.243448f, -0.234059f, -0.223904f, -0.213327f, -0.202652f, -0.191162f, -0.178231f, -0.164569f, -0.150934f, -0.136555f, -0.120347f, -0.102808f, -0.085100f, -0.067101f, -0.048163f, -0.029184f, -0.012044f, 0.002742f, 0.016047f, 0.027774f, 0.036175f, 0.040005f, 0.040094f, 0.038140f, 0.034953f, 0.030572f, 0.025196f, 0.018816f, 0.010402f, -0.001256f, -0.015920f, -0.032251f, -0.049947f, + -0.070292f, -0.094062f, -0.119898f, -0.145560f, -0.170281f, -0.195266f, -0.222067f, -0.250644f, -0.278790f, -0.303633f, -0.324109f, -0.341676f, -0.358158f, -0.373323f, -0.385151f, -0.392113f, -0.394639f, -0.394771f, -0.394738f, -0.395368f, -0.395476f, -0.393190f, -0.388016f, -0.381245f, -0.374662f, -0.369480f, -0.366096f, -0.363936f, -0.361729f, -0.358693f, -0.355247f, -0.352152f, -0.349560f, -0.347298f, -0.345265f, -0.343082f, -0.340057f, -0.335871f, -0.330643f, -0.324295f, -0.316590f, -0.307660f, -0.297736f, -0.286624f, -0.274141f, -0.260611f, -0.246376f, -0.231487f, -0.216324f, -0.201731f, -0.188250f, -0.176027f, -0.165469f, -0.156991f, -0.150296f, -0.144906f, -0.140952f, -0.138536f, -0.137112f, -0.136366f, -0.136669f, -0.137907f, -0.139122f, -0.139867f, -0.140476f, -0.140741f, -0.139998f, -0.138538f, -0.137285f, -0.136389f, -0.135636f, -0.135341f, -0.135341f, -0.134436f, -0.132129f, -0.129168f, -0.125552f, -0.120298f, -0.113600f, -0.106478f, -0.098431f, -0.088467f, -0.077617f, -0.067238f, -0.056573f, -0.045203f, -0.035126f, -0.027288f, -0.019916f, -0.012845f, -0.008413f, -0.006290f, -0.003787f, -0.001744f, -0.002475f, -0.003553f, + -0.002665f, -0.004018f, -0.009329f, -0.011340f, -0.008882f, -0.013592f, -0.026133f, -0.028495f, -0.020197f, -0.028759f, -0.055232f, -0.055789f, -0.023439f, -0.031660f, -0.124564f, -0.217122f, -0.200917f, -0.107754f, -0.056107f, -0.066073f, -0.058846f, -0.027906f, -0.061373f, -0.169830f, -0.234929f, -0.183494f, -0.092827f, -0.059029f, -0.063888f, -0.041976f, 0.009389f, 0.060627f, 0.114330f, 0.163356f, 0.148189f, 0.037885f, -0.089951f, -0.129600f, -0.082891f, -0.043468f, -0.059765f, -0.084990f, -0.070715f, -0.045983f, -0.067518f, -0.125030f, -0.140466f, -0.062947f} + } +}; +const float *CRendBin_FOA_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float *CRendBin_FOA_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; + +/* Sample Rate = 32000 */ + +const int16_t CRendBin_FOA_HRIR_max_num_iterations_32kHz = 1; +const uint16_t CRendBin_FOA_HRIR_num_iterations_32kHz[4][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {0, 0}; +const uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[4][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}}; +const uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_32kHz = 0; +const float CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz[4]={0.000000f, 0.000000f, 0.000000f, 0.000000f}; +const uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float CRendBin_FOA_HRIR_coeff_re_32kHz[4][BINAURAL_CHANNELS][160]={ + { + {1.009979f, 0.777112f, 0.414923f, 0.057622f, -0.211538f, -0.386004f, -0.499848f, -0.577684f, -0.616265f, -0.600367f, -0.524501f, -0.398947f, -0.242372f, -0.073587f, 0.091690f, 0.241505f, 0.368831f, 0.472616f, 0.556219f, 0.623114f, 0.673631f, 0.706309f, 0.722082f, 0.725502f, 0.721116f, 0.709865f, 0.690241f, 0.662164f, 0.628264f, 0.591665f, 0.554026f, 0.516064f, 0.478714f, 0.442859f, 0.408459f, 0.374798f, 0.341619f, 0.309511f, 0.279115f, 0.250331f, 0.222462f, 0.194888f, 0.167394f, 0.140026f, 0.112906f, 0.086220f, 0.060166f, 0.034831f, 0.010148f, -0.013999f, -0.037628f, -0.060633f, -0.082892f, -0.104342f, -0.124944f, -0.144600f, -0.163218f, -0.180856f, -0.197673f, -0.213722f, -0.228947f, -0.243382f, -0.257175f, -0.270358f, -0.282781f, -0.294366f, -0.305254f, -0.315630f, -0.325566f, -0.335147f, -0.344568f, -0.353990f, -0.363436f, -0.372929f, -0.382614f, -0.392659f, -0.403132f, -0.414084f, -0.425629f, -0.437840f, -0.450624f, -0.463808f, -0.477282f, -0.490945f, -0.504537f, -0.517665f, -0.530059f, -0.541752f, -0.552944f, -0.563732f, -0.574004f, -0.583524f, -0.592061f, -0.599512f, -0.605962f, -0.611610f, + -0.616618f, -0.621070f, -0.625065f, -0.628734f, -0.632150f, -0.635359f, -0.638542f, -0.641977f, -0.645810f, -0.649971f, -0.654375f, -0.659108f, -0.664378f, -0.670346f, -0.676981f, -0.683983f, -0.690928f, -0.697577f, -0.703957f, -0.710141f, -0.716086f, -0.721769f, -0.727253f, -0.732564f, -0.737680f, -0.742698f, -0.747770f, -0.752853f, -0.757757f, -0.762422f, -0.766902f, -0.771169f, -0.775186f, -0.779046f, -0.782792f, -0.786271f, -0.789448f, -0.792589f, -0.795895f, -0.799306f, -0.802854f, -0.806744f, -0.810903f, -0.815048f, -0.819301f, -0.824043f, -0.829159f, -0.834320f, -0.839804f, -0.845960f, -0.852309f, -0.858549f, -0.865591f, -0.873918f, -0.882709f, -0.892835f, -0.906137f, -0.914609f, -0.894289f, -0.824242f, -0.716694f, -0.616066f, -0.558379f, -0.540483f}, + {1.009979f, 0.777112f, 0.414923f, 0.057622f, -0.211538f, -0.386004f, -0.499848f, -0.577684f, -0.616265f, -0.600367f, -0.524501f, -0.398947f, -0.242372f, -0.073587f, 0.091690f, 0.241505f, 0.368831f, 0.472616f, 0.556219f, 0.623114f, 0.673631f, 0.706309f, 0.722082f, 0.725502f, 0.721116f, 0.709865f, 0.690241f, 0.662164f, 0.628264f, 0.591665f, 0.554026f, 0.516064f, 0.478714f, 0.442859f, 0.408459f, 0.374798f, 0.341619f, 0.309511f, 0.279115f, 0.250331f, 0.222462f, 0.194888f, 0.167394f, 0.140026f, 0.112906f, 0.086220f, 0.060166f, 0.034831f, 0.010148f, -0.013999f, -0.037628f, -0.060633f, -0.082892f, -0.104342f, -0.124944f, -0.144600f, -0.163218f, -0.180856f, -0.197673f, -0.213722f, -0.228947f, -0.243382f, -0.257175f, -0.270358f, -0.282781f, -0.294366f, -0.305254f, -0.315630f, -0.325566f, -0.335147f, -0.344568f, -0.353990f, -0.363436f, -0.372929f, -0.382614f, -0.392659f, -0.403132f, -0.414084f, -0.425629f, -0.437840f, -0.450624f, -0.463808f, -0.477282f, -0.490945f, -0.504537f, -0.517665f, -0.530059f, -0.541752f, -0.552944f, -0.563732f, -0.574004f, -0.583524f, -0.592061f, -0.599512f, -0.605962f, -0.611610f, + -0.616618f, -0.621070f, -0.625065f, -0.628734f, -0.632150f, -0.635359f, -0.638542f, -0.641977f, -0.645810f, -0.649971f, -0.654375f, -0.659108f, -0.664378f, -0.670346f, -0.676981f, -0.683983f, -0.690928f, -0.697577f, -0.703957f, -0.710141f, -0.716086f, -0.721769f, -0.727253f, -0.732564f, -0.737680f, -0.742698f, -0.747770f, -0.752853f, -0.757757f, -0.762422f, -0.766902f, -0.771169f, -0.775186f, -0.779046f, -0.782792f, -0.786271f, -0.789448f, -0.792589f, -0.795895f, -0.799306f, -0.802854f, -0.806744f, -0.810903f, -0.815048f, -0.819301f, -0.824043f, -0.829159f, -0.834320f, -0.839804f, -0.845960f, -0.852309f, -0.858549f, -0.865591f, -0.873918f, -0.882709f, -0.892835f, -0.906137f, -0.914609f, -0.894289f, -0.824242f, -0.716694f, -0.616066f, -0.558379f, -0.540483f} + }, + { + {0.126193f, 0.409379f, 0.770915f, 0.941927f, 0.770060f, 0.305875f, -0.262088f, -0.749508f, -1.068164f, -1.217448f, -1.229991f, -1.138532f, -0.972214f, -0.757355f, -0.514633f, -0.259993f, -0.008395f, 0.226177f, 0.433546f, 0.608821f, 0.752615f, 0.870118f, 0.967021f, 1.044852f, 1.101784f, 1.138051f, 1.158261f, 1.168128f, 1.171126f, 1.168620f, 1.161027f, 1.148005f, 1.129009f, 1.104516f, 1.076132f, 1.045356f, 1.012656f, 0.977512f, 0.938926f, 0.896304f, 0.850314f, 0.802692f, 0.754998f, 0.707919f, 0.661694f, 0.616510f, 0.572388f, 0.529305f, 0.487590f, 0.447788f, 0.410045f, 0.373936f, 0.338864f, 0.304430f, 0.270631f, 0.237903f, 0.206810f, 0.177634f, 0.150497f, 0.125709f, 0.103489f, 0.083471f, 0.065037f, 0.048044f, 0.032597f, 0.018295f, 0.004431f, -0.009163f, -0.022189f, -0.034707f, -0.047174f, -0.059713f, -0.072094f, -0.084452f, -0.097346f, -0.111038f, -0.125310f, -0.140074f, -0.155621f, -0.172102f, -0.189235f, -0.206705f, -0.224555f, -0.242985f, -0.261989f, -0.281321f, -0.300697f, -0.319952f, -0.339143f, -0.358700f, -0.379378f, -0.401765f, -0.425720f, -0.450446f, -0.475248f, -0.500046f, + -0.525001f, -0.549812f, -0.573628f, -0.595576f, -0.615206f, -0.632568f, -0.647989f, -0.661616f, -0.673019f, -0.681460f, -0.686704f, -0.689348f, -0.690254f, -0.689954f, -0.688764f, -0.687137f, -0.685645f, -0.684742f, -0.684652f, -0.685353f, -0.686715f, -0.688850f, -0.692213f, -0.697136f, -0.703389f, -0.710382f, -0.717558f, -0.724449f, -0.730762f, -0.736643f, -0.742509f, -0.748462f, -0.754275f, -0.759964f, -0.765773f, -0.771574f, -0.776977f, -0.781995f, -0.786951f, -0.791913f, -0.796914f, -0.802402f, -0.808694f, -0.815443f, -0.822369f, -0.829834f, -0.838049f, -0.846765f, -0.856294f, -0.867454f, -0.880120f, -0.893624f, -0.908541f, -0.925665f, -0.944278f, -0.965081f, -0.991098f, -1.015883f, -1.012611f, -0.952141f, -0.840918f, -0.727278f, -0.656859f, -0.632381f}, + {-0.126193f, -0.409379f, -0.770915f, -0.941927f, -0.770060f, -0.305875f, 0.262088f, 0.749508f, 1.068164f, 1.217448f, 1.229991f, 1.138532f, 0.972214f, 0.757355f, 0.514633f, 0.259993f, 0.008395f, -0.226177f, -0.433546f, -0.608821f, -0.752615f, -0.870118f, -0.967021f, -1.044852f, -1.101784f, -1.138051f, -1.158261f, -1.168128f, -1.171126f, -1.168620f, -1.161027f, -1.148005f, -1.129009f, -1.104516f, -1.076132f, -1.045356f, -1.012656f, -0.977512f, -0.938926f, -0.896304f, -0.850314f, -0.802692f, -0.754998f, -0.707919f, -0.661694f, -0.616510f, -0.572388f, -0.529305f, -0.487590f, -0.447788f, -0.410045f, -0.373936f, -0.338864f, -0.304430f, -0.270631f, -0.237903f, -0.206810f, -0.177634f, -0.150497f, -0.125709f, -0.103489f, -0.083471f, -0.065037f, -0.048044f, -0.032597f, -0.018295f, -0.004431f, 0.009163f, 0.022189f, 0.034707f, 0.047174f, 0.059713f, 0.072094f, 0.084452f, 0.097346f, 0.111038f, 0.125310f, 0.140074f, 0.155621f, 0.172102f, 0.189235f, 0.206705f, 0.224555f, 0.242985f, 0.261989f, 0.281321f, 0.300697f, 0.319952f, 0.339143f, 0.358700f, 0.379378f, 0.401765f, 0.425720f, 0.450446f, 0.475248f, 0.500046f, + 0.525001f, 0.549812f, 0.573628f, 0.595576f, 0.615206f, 0.632568f, 0.647989f, 0.661616f, 0.673019f, 0.681460f, 0.686704f, 0.689348f, 0.690254f, 0.689954f, 0.688764f, 0.687137f, 0.685645f, 0.684742f, 0.684652f, 0.685353f, 0.686715f, 0.688850f, 0.692213f, 0.697136f, 0.703389f, 0.710382f, 0.717558f, 0.724449f, 0.730762f, 0.736643f, 0.742509f, 0.748462f, 0.754275f, 0.759964f, 0.765773f, 0.771574f, 0.776977f, 0.781995f, 0.786951f, 0.791913f, 0.796914f, 0.802402f, 0.808694f, 0.815443f, 0.822369f, 0.829834f, 0.838049f, 0.846765f, 0.856294f, 0.867454f, 0.880120f, 0.893624f, 0.908541f, 0.925665f, 0.944278f, 0.965081f, 0.991098f, 1.015883f, 1.012611f, 0.952141f, 0.840918f, 0.727278f, 0.656859f, 0.632381f} + }, + { + {0.100473f, 0.081403f, 0.008408f, -0.096160f, -0.142910f, -0.086957f, 0.009676f, 0.059490f, 0.045841f, 0.005967f, -0.036022f, -0.074745f, -0.093081f, -0.074850f, -0.037707f, -0.016301f, -0.015759f, -0.009186f, 0.021343f, 0.065496f, 0.106277f, 0.139333f, 0.165707f, 0.180998f, 0.180229f, 0.166656f, 0.149972f, 0.137718f, 0.130014f, 0.121165f, 0.105833f, 0.084123f, 0.060463f, 0.038655f, 0.020340f, 0.007598f, 0.003439f, 0.008540f, 0.019735f, 0.032727f, 0.044961f, 0.055618f, 0.064410f, 0.071075f, 0.075329f, 0.076972f, 0.076175f, 0.073282f, 0.067999f, 0.059179f, 0.045627f, 0.026803f, 0.002818f, -0.025852f, -0.058657f, -0.095222f, -0.135136f, -0.177554f, -0.221503f, -0.266485f, -0.312117f, -0.357344f, -0.400888f, -0.442195f, -0.480948f, -0.515968f, -0.545732f, -0.569651f, -0.587751f, -0.599520f, -0.604194f, -0.601692f, -0.592207f, -0.575564f, -0.552090f, -0.523307f, -0.490573f, -0.453940f, -0.413752f, -0.372396f, -0.332738f, -0.295372f, -0.259306f, -0.225175f, -0.195768f, -0.172732f, -0.154358f, -0.137922f, -0.123460f, -0.113695f, -0.110203f, -0.111037f, -0.112826f, -0.114219f, -0.116218f, -0.119819f, + -0.124632f, -0.129608f, -0.133861f, -0.136539f, -0.136862f, -0.134717f, -0.130731f, -0.125401f, -0.118326f, -0.108409f, -0.094822f, -0.077996f, -0.059675f, -0.041714f, -0.024804f, -0.008597f, 0.007173f, 0.022215f, 0.036085f, 0.048349f, 0.058347f, 0.065338f, 0.068946f, 0.069169f, 0.066144f, 0.060186f, 0.051779f, 0.041215f, 0.028539f, 0.014060f, -0.001423f, -0.017088f, -0.032440f, -0.047116f, -0.060725f, -0.072923f, -0.083344f, -0.091603f, -0.097740f, -0.102516f, -0.106948f, -0.111785f, -0.117487f, -0.124080f, -0.130710f, -0.136046f, -0.139531f, -0.141637f, -0.142666f, -0.142187f, -0.140003f, -0.136622f, -0.132265f, -0.126492f, -0.119386f, -0.111731f, -0.102678f, -0.088388f, -0.065422f, -0.036215f, -0.009683f, 0.005414f, 0.008111f, 0.005632f}, + {0.100473f, 0.081403f, 0.008408f, -0.096160f, -0.142910f, -0.086957f, 0.009676f, 0.059490f, 0.045841f, 0.005967f, -0.036022f, -0.074745f, -0.093081f, -0.074850f, -0.037707f, -0.016301f, -0.015759f, -0.009186f, 0.021343f, 0.065496f, 0.106277f, 0.139333f, 0.165707f, 0.180998f, 0.180229f, 0.166656f, 0.149972f, 0.137718f, 0.130014f, 0.121165f, 0.105833f, 0.084123f, 0.060463f, 0.038655f, 0.020340f, 0.007598f, 0.003439f, 0.008540f, 0.019735f, 0.032727f, 0.044961f, 0.055618f, 0.064410f, 0.071075f, 0.075329f, 0.076972f, 0.076175f, 0.073282f, 0.067999f, 0.059179f, 0.045627f, 0.026803f, 0.002818f, -0.025852f, -0.058657f, -0.095222f, -0.135136f, -0.177554f, -0.221503f, -0.266485f, -0.312117f, -0.357344f, -0.400888f, -0.442195f, -0.480948f, -0.515968f, -0.545732f, -0.569651f, -0.587751f, -0.599520f, -0.604194f, -0.601692f, -0.592207f, -0.575564f, -0.552090f, -0.523307f, -0.490573f, -0.453940f, -0.413752f, -0.372396f, -0.332738f, -0.295372f, -0.259306f, -0.225175f, -0.195768f, -0.172732f, -0.154358f, -0.137922f, -0.123460f, -0.113695f, -0.110203f, -0.111037f, -0.112826f, -0.114219f, -0.116218f, -0.119819f, + -0.124632f, -0.129608f, -0.133861f, -0.136539f, -0.136862f, -0.134717f, -0.130731f, -0.125401f, -0.118326f, -0.108409f, -0.094822f, -0.077996f, -0.059675f, -0.041714f, -0.024804f, -0.008597f, 0.007173f, 0.022215f, 0.036085f, 0.048349f, 0.058347f, 0.065338f, 0.068946f, 0.069169f, 0.066144f, 0.060186f, 0.051779f, 0.041215f, 0.028539f, 0.014060f, -0.001423f, -0.017088f, -0.032440f, -0.047116f, -0.060725f, -0.072923f, -0.083344f, -0.091603f, -0.097740f, -0.102516f, -0.106948f, -0.111785f, -0.117487f, -0.124080f, -0.130710f, -0.136046f, -0.139531f, -0.141637f, -0.142666f, -0.142187f, -0.140003f, -0.136622f, -0.132265f, -0.126492f, -0.119386f, -0.111731f, -0.102678f, -0.088388f, -0.065422f, -0.036215f, -0.009683f, 0.005414f, 0.008111f, 0.005632f} + }, + { + {0.084126f, 0.110632f, 0.109927f, 0.052485f, -0.019287f, -0.038848f, 0.005122f, 0.057928f, 0.061429f, 0.008547f, -0.063703f, -0.116047f, -0.133935f, -0.126590f, -0.112671f, -0.104392f, -0.098006f, -0.079140f, -0.038844f, 0.018165f, 0.081196f, 0.143237f, 0.200149f, 0.247159f, 0.282929f, 0.314126f, 0.349526f, 0.390018f, 0.428654f, 0.459758f, 0.483418f, 0.500784f, 0.509421f, 0.505506f, 0.488086f, 0.458967f, 0.419791f, 0.371480f, 0.316363f, 0.259016f, 0.204186f, 0.154396f, 0.109872f, 0.070078f, 0.034584f, 0.002707f, -0.026736f, -0.054704f, -0.081058f, -0.104625f, -0.124002f, -0.138182f, -0.146792f, -0.150463f, -0.151151f, -0.151495f, -0.153367f, -0.157201f, -0.162792f, -0.170016f, -0.178380f, -0.186711f, -0.194159f, -0.201018f, -0.207832f, -0.214370f, -0.220282f, -0.225993f, -0.231839f, -0.237070f, -0.240921f, -0.243936f, -0.246870f, -0.248962f, -0.248825f, -0.246404f, -0.242360f, -0.236067f, -0.226121f, -0.212667f, -0.197275f, -0.180428f, -0.161038f, -0.138916f, -0.116002f, -0.094379f, -0.074355f, -0.055230f, -0.036702f, -0.018555f, 0.000018f, 0.019490f, 0.038874f, 0.056640f, 0.072553f, 0.087565f, + 0.101794f, 0.113622f, 0.121301f, 0.124936f, 0.126283f, 0.126618f, 0.125103f, 0.119406f, 0.107998f, 0.091827f, 0.073557f, 0.055064f, 0.035918f, 0.014525f, -0.009510f, -0.034439f, -0.057660f, -0.077747f, -0.095384f, -0.112527f, -0.130553f, -0.149032f, -0.166196f, -0.180522f, -0.191817f, -0.201118f, -0.209934f, -0.219423f, -0.229793f, -0.240368f, -0.250415f, -0.259888f, -0.269297f, -0.279146f, -0.289735f, -0.301233f, -0.313608f, -0.326568f, -0.339762f, -0.352968f, -0.366026f, -0.378749f, -0.390962f, -0.402499f, -0.413143f, -0.422598f, -0.430524f, -0.436635f, -0.440820f, -0.443116f, -0.443609f, -0.442643f, -0.440995f, -0.439351f, -0.437985f, -0.437691f, -0.439475f, -0.440249f, -0.429869f, -0.398587f, -0.350485f, -0.304484f, -0.277094f, -0.267957f}, + {0.084126f, 0.110632f, 0.109927f, 0.052485f, -0.019287f, -0.038848f, 0.005122f, 0.057928f, 0.061429f, 0.008547f, -0.063703f, -0.116047f, -0.133935f, -0.126590f, -0.112671f, -0.104392f, -0.098006f, -0.079140f, -0.038844f, 0.018165f, 0.081196f, 0.143237f, 0.200149f, 0.247159f, 0.282929f, 0.314126f, 0.349526f, 0.390018f, 0.428654f, 0.459758f, 0.483418f, 0.500784f, 0.509421f, 0.505506f, 0.488086f, 0.458967f, 0.419791f, 0.371480f, 0.316363f, 0.259016f, 0.204186f, 0.154396f, 0.109872f, 0.070078f, 0.034584f, 0.002707f, -0.026736f, -0.054704f, -0.081058f, -0.104625f, -0.124002f, -0.138182f, -0.146792f, -0.150463f, -0.151151f, -0.151495f, -0.153367f, -0.157201f, -0.162792f, -0.170016f, -0.178380f, -0.186711f, -0.194159f, -0.201018f, -0.207832f, -0.214370f, -0.220282f, -0.225993f, -0.231839f, -0.237070f, -0.240921f, -0.243936f, -0.246870f, -0.248962f, -0.248825f, -0.246404f, -0.242360f, -0.236067f, -0.226121f, -0.212667f, -0.197275f, -0.180428f, -0.161038f, -0.138916f, -0.116002f, -0.094379f, -0.074355f, -0.055230f, -0.036702f, -0.018555f, 0.000018f, 0.019490f, 0.038874f, 0.056640f, 0.072553f, 0.087565f, + 0.101794f, 0.113622f, 0.121301f, 0.124936f, 0.126283f, 0.126618f, 0.125103f, 0.119406f, 0.107998f, 0.091827f, 0.073557f, 0.055064f, 0.035918f, 0.014525f, -0.009510f, -0.034439f, -0.057660f, -0.077747f, -0.095384f, -0.112527f, -0.130553f, -0.149032f, -0.166196f, -0.180522f, -0.191817f, -0.201118f, -0.209934f, -0.219423f, -0.229793f, -0.240368f, -0.250415f, -0.259888f, -0.269297f, -0.279146f, -0.289735f, -0.301233f, -0.313608f, -0.326568f, -0.339762f, -0.352968f, -0.366026f, -0.378749f, -0.390962f, -0.402499f, -0.413143f, -0.422598f, -0.430524f, -0.436635f, -0.440820f, -0.443116f, -0.443609f, -0.442643f, -0.440995f, -0.439351f, -0.437985f, -0.437691f, -0.439475f, -0.440249f, -0.429869f, -0.398587f, -0.350485f, -0.304484f, -0.277094f, -0.267957f} + } +}; +const float CRendBin_FOA_HRIR_coeff_im_32kHz[4][BINAURAL_CHANNELS][160]={ + { + {-0.232358f, -0.618932f, -0.817988f, -0.822429f, -0.704120f, -0.543614f, -0.378833f, -0.206926f, -0.018121f, 0.180000f, 0.364897f, 0.514426f, 0.616459f, 0.668682f, 0.675051f, 0.643723f, 0.585693f, 0.511949f, 0.429816f, 0.341780f, 0.248555f, 0.153155f, 0.060910f, -0.024611f, -0.104107f, -0.179953f, -0.252112f, -0.317896f, -0.375138f, -0.424053f, -0.465990f, -0.501801f, -0.532062f, -0.557932f, -0.580799f, -0.601232f, -0.618935f, -0.633778f, -0.646448f, -0.657961f, -0.668856f, -0.679034f, -0.688176f, -0.696064f, -0.702581f, -0.707694f, -0.711504f, -0.714221f, -0.716020f, -0.716930f, -0.716876f, -0.715816f, -0.713811f, -0.710965f, -0.707339f, -0.703007f, -0.698153f, -0.693006f, -0.687652f, -0.682057f, -0.676269f, -0.670441f, -0.664614f, -0.658690f, -0.652674f, -0.646792f, -0.641260f, -0.636117f, -0.631369f, -0.627101f, -0.623357f, -0.620039f, -0.617052f, -0.614426f, -0.612191f, -0.610248f, -0.608457f, -0.606735f, -0.604964f, -0.602902f, -0.600284f, -0.596973f, -0.592896f, -0.587908f, -0.581839f, -0.574727f, -0.566872f, -0.558610f, -0.550047f, -0.541068f, -0.531535f, -0.521448f, -0.510981f, -0.500437f, -0.490122f, -0.480207f, + -0.470732f, -0.461729f, -0.453265f, -0.445358f, -0.437994f, -0.431236f, -0.425185f, -0.419778f, -0.414766f, -0.409960f, -0.405367f, -0.401056f, -0.396961f, -0.392823f, -0.388266f, -0.382991f, -0.376987f, -0.370509f, -0.363780f, -0.356832f, -0.349674f, -0.342400f, -0.335071f, -0.327671f, -0.320250f, -0.312889f, -0.305495f, -0.297875f, -0.290005f, -0.282015f, -0.273947f, -0.265780f, -0.257599f, -0.249466f, -0.241282f, -0.233043f, -0.224988f, -0.217256f, -0.209671f, -0.202109f, -0.194641f, -0.187154f, -0.179346f, -0.171265f, -0.163191f, -0.154940f, -0.146069f, -0.136661f, -0.126931f, -0.116365f, -0.104453f, -0.091629f, -0.077926f, -0.061879f, -0.042494f, -0.019328f, 0.013280f, 0.066673f, 0.141327f, 0.209865f, 0.231108f, 0.189731f, 0.112424f, 0.035208f}, + {-0.232358f, -0.618932f, -0.817988f, -0.822429f, -0.704120f, -0.543614f, -0.378833f, -0.206926f, -0.018121f, 0.180000f, 0.364897f, 0.514426f, 0.616459f, 0.668682f, 0.675051f, 0.643723f, 0.585693f, 0.511949f, 0.429816f, 0.341780f, 0.248555f, 0.153155f, 0.060910f, -0.024611f, -0.104107f, -0.179953f, -0.252112f, -0.317896f, -0.375138f, -0.424053f, -0.465990f, -0.501801f, -0.532062f, -0.557932f, -0.580799f, -0.601232f, -0.618935f, -0.633778f, -0.646448f, -0.657961f, -0.668856f, -0.679034f, -0.688176f, -0.696064f, -0.702581f, -0.707694f, -0.711504f, -0.714221f, -0.716020f, -0.716930f, -0.716876f, -0.715816f, -0.713811f, -0.710965f, -0.707339f, -0.703007f, -0.698153f, -0.693006f, -0.687652f, -0.682057f, -0.676269f, -0.670441f, -0.664614f, -0.658690f, -0.652674f, -0.646792f, -0.641260f, -0.636117f, -0.631369f, -0.627101f, -0.623357f, -0.620039f, -0.617052f, -0.614426f, -0.612191f, -0.610248f, -0.608457f, -0.606735f, -0.604964f, -0.602902f, -0.600284f, -0.596973f, -0.592896f, -0.587908f, -0.581839f, -0.574727f, -0.566872f, -0.558610f, -0.550047f, -0.541068f, -0.531535f, -0.521448f, -0.510981f, -0.500437f, -0.490122f, -0.480207f, + -0.470732f, -0.461729f, -0.453265f, -0.445358f, -0.437994f, -0.431236f, -0.425185f, -0.419778f, -0.414766f, -0.409960f, -0.405367f, -0.401056f, -0.396961f, -0.392823f, -0.388266f, -0.382991f, -0.376987f, -0.370509f, -0.363780f, -0.356832f, -0.349674f, -0.342400f, -0.335071f, -0.327671f, -0.320250f, -0.312889f, -0.305495f, -0.297875f, -0.290005f, -0.282015f, -0.273947f, -0.265780f, -0.257599f, -0.249466f, -0.241282f, -0.233043f, -0.224988f, -0.217256f, -0.209671f, -0.202109f, -0.194641f, -0.187154f, -0.179346f, -0.171265f, -0.163191f, -0.154940f, -0.146069f, -0.136661f, -0.126931f, -0.116365f, -0.104453f, -0.091629f, -0.077926f, -0.061879f, -0.042494f, -0.019328f, 0.013280f, 0.066673f, 0.141327f, 0.209865f, 0.231108f, 0.189731f, 0.112424f, 0.035208f} + }, + { + {0.140725f, 0.285846f, 0.114832f, -0.338829f, -0.858853f, -1.200757f, -1.243681f, -1.024467f, -0.658777f, -0.249357f, 0.145208f, 0.495328f, 0.784769f, 1.007322f, 1.163699f, 1.256377f, 1.289073f, 1.269367f, 1.208734f, 1.120266f, 1.016312f, 0.905408f, 0.790167f, 0.670170f, 0.547622f, 0.428343f, 0.317200f, 0.214919f, 0.119693f, 0.029734f, -0.056227f, -0.138879f, -0.217755f, -0.291611f, -0.359863f, -0.423205f, -0.482880f, -0.539767f, -0.593809f, -0.643836f, -0.688282f, -0.726462f, -0.758927f, -0.786612f, -0.810154f, -0.830039f, -0.846690f, -0.860232f, -0.870666f, -0.878418f, -0.884314f, -0.889009f, -0.892646f, -0.894952f, -0.895464f, -0.893873f, -0.890318f, -0.885190f, -0.878745f, -0.871264f, -0.863433f, -0.855991f, -0.849090f, -0.842574f, -0.836712f, -0.831995f, -0.828338f, -0.825230f, -0.822595f, -0.820794f, -0.819852f, -0.819422f, -0.819501f, -0.820450f, -0.822267f, -0.824464f, -0.826748f, -0.829242f, -0.831935f, -0.834417f, -0.836352f, -0.837828f, -0.839046f, -0.839930f, -0.840203f, -0.839703f, -0.838501f, -0.836856f, -0.835153f, -0.833735f, -0.832516f, -0.830749f, -0.827395f, -0.821885f, -0.814387f, -0.805210f, + -0.794148f, -0.780636f, -0.764422f, -0.745876f, -0.725740f, -0.704713f, -0.683108f, -0.660784f, -0.637569f, -0.613932f, -0.590994f, -0.569749f, -0.550511f, -0.533220f, -0.517926f, -0.504746f, -0.493587f, -0.484110f, -0.475879f, -0.468521f, -0.461919f, -0.456181f, -0.451182f, -0.446293f, -0.440761f, -0.434205f, -0.426610f, -0.418162f, -0.409301f, -0.400521f, -0.391893f, -0.383127f, -0.374182f, -0.365278f, -0.356340f, -0.347069f, -0.337579f, -0.328306f, -0.319353f, -0.310619f, -0.302285f, -0.294430f, -0.286564f, -0.278288f, -0.269879f, -0.261530f, -0.252867f, -0.243819f, -0.234732f, -0.225124f, -0.213896f, -0.200946f, -0.186484f, -0.169123f, -0.147421f, -0.120998f, -0.084260f, -0.023064f, 0.068036f, 0.162002f, 0.209461f, 0.185183f, 0.113708f, 0.036109f}, + {-0.140725f, -0.285846f, -0.114832f, 0.338829f, 0.858853f, 1.200757f, 1.243681f, 1.024467f, 0.658777f, 0.249357f, -0.145208f, -0.495328f, -0.784769f, -1.007322f, -1.163699f, -1.256377f, -1.289073f, -1.269367f, -1.208734f, -1.120266f, -1.016312f, -0.905408f, -0.790167f, -0.670170f, -0.547622f, -0.428343f, -0.317200f, -0.214919f, -0.119693f, -0.029734f, 0.056227f, 0.138879f, 0.217755f, 0.291611f, 0.359863f, 0.423205f, 0.482880f, 0.539767f, 0.593809f, 0.643836f, 0.688282f, 0.726462f, 0.758927f, 0.786612f, 0.810154f, 0.830039f, 0.846690f, 0.860232f, 0.870666f, 0.878418f, 0.884314f, 0.889009f, 0.892646f, 0.894952f, 0.895464f, 0.893873f, 0.890318f, 0.885190f, 0.878745f, 0.871264f, 0.863433f, 0.855991f, 0.849090f, 0.842574f, 0.836712f, 0.831995f, 0.828338f, 0.825230f, 0.822595f, 0.820794f, 0.819852f, 0.819422f, 0.819501f, 0.820450f, 0.822267f, 0.824464f, 0.826748f, 0.829242f, 0.831935f, 0.834417f, 0.836352f, 0.837828f, 0.839046f, 0.839930f, 0.840203f, 0.839703f, 0.838501f, 0.836856f, 0.835153f, 0.833735f, 0.832516f, 0.830749f, 0.827395f, 0.821885f, 0.814387f, 0.805210f, + 0.794148f, 0.780636f, 0.764422f, 0.745876f, 0.725740f, 0.704713f, 0.683108f, 0.660784f, 0.637569f, 0.613932f, 0.590994f, 0.569749f, 0.550511f, 0.533220f, 0.517926f, 0.504746f, 0.493587f, 0.484110f, 0.475879f, 0.468521f, 0.461919f, 0.456181f, 0.451182f, 0.446293f, 0.440761f, 0.434205f, 0.426610f, 0.418162f, 0.409301f, 0.400521f, 0.391893f, 0.383127f, 0.374182f, 0.365278f, 0.356340f, 0.347069f, 0.337579f, 0.328306f, 0.319353f, 0.310619f, 0.302285f, 0.294430f, 0.286564f, 0.278288f, 0.269879f, 0.261530f, 0.252867f, 0.243819f, 0.234732f, 0.225124f, 0.213896f, 0.200946f, 0.186484f, 0.169123f, 0.147421f, 0.120998f, 0.084260f, 0.023064f, -0.068036f, -0.162002f, -0.209461f, -0.185183f, -0.113708f, -0.036109f} + }, + { + {-0.025748f, -0.088043f, -0.139476f, -0.115197f, -0.011193f, 0.082969f, 0.088942f, 0.026588f, -0.034225f, -0.061322f, -0.062307f, -0.039701f, 0.006935f, 0.053627f, 0.070634f, 0.063527f, 0.064625f, 0.086525f, 0.109466f, 0.113177f, 0.098256f, 0.073370f, 0.040304f, -0.000903f, -0.043184f, -0.076634f, -0.097864f, -0.111901f, -0.126411f, -0.144854f, -0.164041f, -0.178000f, -0.183770f, -0.182295f, -0.174892f, -0.162161f, -0.146640f, -0.133405f, -0.126594f, -0.126862f, -0.132675f, -0.142567f, -0.155716f, -0.171595f, -0.189741f, -0.209590f, -0.230631f, -0.252944f, -0.277113f, -0.303296f, -0.330673f, -0.357881f, -0.383611f, -0.406858f, -0.426972f, -0.443418f, -0.455456f, -0.462382f, -0.464036f, -0.460461f, -0.451211f, -0.435760f, -0.414371f, -0.387638f, -0.355468f, -0.317605f, -0.274841f, -0.228581f, -0.179590f, -0.128261f, -0.075652f, -0.023161f, 0.028274f, 0.077590f, 0.123014f, 0.163229f, 0.198282f, 0.228110f, 0.251149f, 0.266010f, 0.273735f, 0.276588f, 0.274993f, 0.267638f, 0.254778f, 0.239529f, 0.224852f, 0.210436f, 0.194008f, 0.175358f, 0.157564f, 0.143811f, 0.134209f, 0.126617f, 0.119747f, 0.114269f, + 0.111331f, 0.111312f, 0.114089f, 0.119358f, 0.126337f, 0.133893f, 0.141375f, 0.149029f, 0.157354f, 0.166105f, 0.173888f, 0.178773f, 0.179595f, 0.176738f, 0.171416f, 0.164301f, 0.155212f, 0.143845f, 0.130161f, 0.114157f, 0.095909f, 0.075932f, 0.055076f, 0.034130f, 0.013765f, -0.005393f, -0.022978f, -0.038882f, -0.052804f, -0.064120f, -0.072409f, -0.077779f, -0.080530f, -0.080874f, -0.079051f, -0.075375f, -0.070202f, -0.064178f, -0.058307f, -0.053393f, -0.049529f, -0.046287f, -0.042980f, -0.038600f, -0.032246f, -0.024048f, -0.015064f, -0.005957f, 0.003498f, 0.013364f, 0.023023f, 0.032130f, 0.041053f, 0.049833f, 0.057916f, 0.065747f, 0.075176f, 0.086297f, 0.094235f, 0.091380f, 0.074398f, 0.048616f, 0.024108f, 0.006730f}, + {-0.025748f, -0.088043f, -0.139476f, -0.115197f, -0.011193f, 0.082969f, 0.088942f, 0.026588f, -0.034225f, -0.061322f, -0.062307f, -0.039701f, 0.006935f, 0.053627f, 0.070634f, 0.063527f, 0.064625f, 0.086525f, 0.109466f, 0.113177f, 0.098256f, 0.073370f, 0.040304f, -0.000903f, -0.043184f, -0.076634f, -0.097864f, -0.111901f, -0.126411f, -0.144854f, -0.164041f, -0.178000f, -0.183770f, -0.182295f, -0.174892f, -0.162161f, -0.146640f, -0.133405f, -0.126594f, -0.126862f, -0.132675f, -0.142567f, -0.155716f, -0.171595f, -0.189741f, -0.209590f, -0.230631f, -0.252944f, -0.277113f, -0.303296f, -0.330673f, -0.357881f, -0.383611f, -0.406858f, -0.426972f, -0.443418f, -0.455456f, -0.462382f, -0.464036f, -0.460461f, -0.451211f, -0.435760f, -0.414371f, -0.387638f, -0.355468f, -0.317605f, -0.274841f, -0.228581f, -0.179590f, -0.128261f, -0.075652f, -0.023161f, 0.028274f, 0.077590f, 0.123014f, 0.163229f, 0.198282f, 0.228110f, 0.251149f, 0.266010f, 0.273735f, 0.276588f, 0.274993f, 0.267638f, 0.254778f, 0.239529f, 0.224852f, 0.210436f, 0.194008f, 0.175358f, 0.157564f, 0.143811f, 0.134209f, 0.126617f, 0.119747f, 0.114269f, + 0.111331f, 0.111312f, 0.114089f, 0.119358f, 0.126337f, 0.133893f, 0.141375f, 0.149029f, 0.157354f, 0.166105f, 0.173888f, 0.178773f, 0.179595f, 0.176738f, 0.171416f, 0.164301f, 0.155212f, 0.143845f, 0.130161f, 0.114157f, 0.095909f, 0.075932f, 0.055076f, 0.034130f, 0.013765f, -0.005393f, -0.022978f, -0.038882f, -0.052804f, -0.064120f, -0.072409f, -0.077779f, -0.080530f, -0.080874f, -0.079051f, -0.075375f, -0.070202f, -0.064178f, -0.058307f, -0.053393f, -0.049529f, -0.046287f, -0.042980f, -0.038600f, -0.032246f, -0.024048f, -0.015064f, -0.005957f, 0.003498f, 0.013364f, 0.023023f, 0.032130f, 0.041053f, 0.049833f, 0.057916f, 0.065747f, 0.075176f, 0.086297f, 0.094235f, 0.091380f, 0.074398f, 0.048616f, 0.024108f, 0.006730f} + }, + { + {0.004469f, -0.013004f, -0.069105f, -0.111166f, -0.088832f, -0.021733f, 0.020879f, -0.001719f, -0.063420f, -0.107499f, -0.101798f, -0.054848f, 0.005100f, 0.055067f, 0.089328f, 0.118238f, 0.155712f, 0.203896f, 0.250771f, 0.283001f, 0.296634f, 0.294104f, 0.277764f, 0.251482f, 0.223398f, 0.199881f, 0.177918f, 0.148605f, 0.107643f, 0.058242f, 0.004301f, -0.054426f, -0.119079f, -0.187240f, -0.254072f, -0.316062f, -0.371526f, -0.418353f, -0.453530f, -0.475436f, -0.485529f, -0.487199f, -0.483439f, -0.475999f, -0.466072f, -0.454762f, -0.442562f, -0.428896f, -0.412688f, -0.393430f, -0.371644f, -0.348652f, -0.326306f, -0.306758f, -0.291674f, -0.281173f, -0.273835f, -0.267982f, -0.262603f, -0.256924f, -0.250004f, -0.241478f, -0.232071f, -0.222562f, -0.212764f, -0.202253f, -0.191316f, -0.180223f, -0.168324f, -0.155035f, -0.140988f, -0.126915f, -0.112130f, -0.095556f, -0.077601f, -0.059440f, -0.041038f, -0.021717f, -0.002289f, 0.015312f, 0.030501f, 0.044216f, 0.056422f, 0.065288f, 0.069528f, 0.070062f, 0.068614f, 0.065893f, 0.061937f, 0.057048f, 0.051195f, 0.043250f, 0.032044f, 0.017911f, 0.002122f, -0.015098f, + -0.034951f, -0.058147f, -0.083429f, -0.108599f, -0.132778f, -0.157148f, -0.183384f, -0.211440f, -0.238983f, -0.263177f, -0.283075f, -0.300073f, -0.315887f, -0.330370f, -0.341598f, -0.347926f, -0.349714f, -0.349134f, -0.348462f, -0.348374f, -0.347673f, -0.344642f, -0.338765f, -0.331173f, -0.323708f, -0.317734f, -0.313552f, -0.310449f, -0.307281f, -0.303381f, -0.299002f, -0.294820f, -0.291172f, -0.287927f, -0.284777f, -0.281331f, -0.277114f, -0.271760f, -0.265156f, -0.257312f, -0.248203f, -0.237804f, -0.226127f, -0.213169f, -0.198913f, -0.183401f, -0.166800f, -0.149450f, -0.131791f, -0.114224f, -0.097167f, -0.081134f, -0.066331f, -0.052328f, -0.038637f, -0.024717f, -0.007855f, 0.017147f, 0.051304f, 0.083630f, 0.096079f, 0.080803f, 0.048580f, 0.015325f}, + {0.004469f, -0.013004f, -0.069105f, -0.111166f, -0.088832f, -0.021733f, 0.020879f, -0.001719f, -0.063420f, -0.107499f, -0.101798f, -0.054848f, 0.005100f, 0.055067f, 0.089328f, 0.118238f, 0.155712f, 0.203896f, 0.250771f, 0.283001f, 0.296634f, 0.294104f, 0.277764f, 0.251482f, 0.223398f, 0.199881f, 0.177918f, 0.148605f, 0.107643f, 0.058242f, 0.004301f, -0.054426f, -0.119079f, -0.187240f, -0.254072f, -0.316062f, -0.371526f, -0.418353f, -0.453530f, -0.475436f, -0.485529f, -0.487199f, -0.483439f, -0.475999f, -0.466072f, -0.454762f, -0.442562f, -0.428896f, -0.412688f, -0.393430f, -0.371644f, -0.348652f, -0.326306f, -0.306758f, -0.291674f, -0.281173f, -0.273835f, -0.267982f, -0.262603f, -0.256924f, -0.250004f, -0.241478f, -0.232071f, -0.222562f, -0.212764f, -0.202253f, -0.191316f, -0.180223f, -0.168324f, -0.155035f, -0.140988f, -0.126915f, -0.112130f, -0.095556f, -0.077601f, -0.059440f, -0.041038f, -0.021717f, -0.002289f, 0.015312f, 0.030501f, 0.044216f, 0.056422f, 0.065288f, 0.069528f, 0.070062f, 0.068614f, 0.065893f, 0.061937f, 0.057048f, 0.051195f, 0.043250f, 0.032044f, 0.017911f, 0.002122f, -0.015098f, + -0.034951f, -0.058147f, -0.083429f, -0.108599f, -0.132778f, -0.157148f, -0.183384f, -0.211440f, -0.238983f, -0.263177f, -0.283075f, -0.300073f, -0.315887f, -0.330370f, -0.341598f, -0.347926f, -0.349714f, -0.349134f, -0.348462f, -0.348374f, -0.347673f, -0.344642f, -0.338765f, -0.331173f, -0.323708f, -0.317734f, -0.313552f, -0.310449f, -0.307281f, -0.303381f, -0.299002f, -0.294820f, -0.291172f, -0.287927f, -0.284777f, -0.281331f, -0.277114f, -0.271760f, -0.265156f, -0.257312f, -0.248203f, -0.237804f, -0.226127f, -0.213169f, -0.198913f, -0.183401f, -0.166800f, -0.149450f, -0.131791f, -0.114224f, -0.097167f, -0.081134f, -0.066331f, -0.052328f, -0.038637f, -0.024717f, -0.007855f, 0.017147f, 0.051304f, 0.083630f, 0.096079f, 0.080803f, 0.048580f, 0.015325f} + } +}; +const float *CRendBin_FOA_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float *CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; + +/* Sample Rate = 16000 */ + +const int16_t CRendBin_FOA_HRIR_max_num_iterations_16kHz = 1; +const uint16_t CRendBin_FOA_HRIR_num_iterations_16kHz[4][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {0, 0}; +const uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[4][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}}; +const uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_16kHz = 0; +const float CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz[4]={0.000000f, 0.000000f, 0.000000f, 0.000000f}; +const uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float CRendBin_FOA_HRIR_coeff_re_16kHz[4][BINAURAL_CHANNELS][80]={ + { + { 1.066299f, 0.831753f, 0.469820f, 0.113997f, -0.155945f, -0.332046f, -0.445167f, -0.521969f, -0.562027f, -0.547501f, -0.470580f, -0.344643f, -0.190080f, -0.022238f, 0.144217f, 0.293618f, 0.418613f, 0.521970f, 0.606614f, 0.672232f, 0.720345f, 0.753099f, 0.769493f, 0.770796f, 0.764174f, 0.753391f, 0.733696f, 0.702773f, 0.667010f, 0.631061f, 0.592423f, 0.551074f, 0.512366f, 0.477047f, 0.440550f, 0.403206f, 0.369206f, 0.337153f, 0.303479f, 0.270983f, 0.242735f, 0.214328f, 0.182386f, 0.151528f, 0.124233f, 0.095401f, 0.063829f, 0.035419f, 0.010359f, -0.017668f, -0.047701f, -0.073299f, -0.096723f, -0.124198f, -0.151868f, -0.173748f, -0.195138f, -0.221363f, -0.245696f, -0.264016f, -0.284769f, -0.310840f, -0.332497f, -0.348925f, -0.371386f, -0.398406f, -0.417735f, -0.434354f, -0.462032f, -0.492418f, -0.512100f, -0.536134f, -0.579084f, -0.619428f, -0.648156f, -0.709398f, -0.814740f, -0.869114f, -0.792023f, -0.672661f}, + { 1.066299f, 0.831753f, 0.469820f, 0.113997f, -0.155945f, -0.332046f, -0.445167f, -0.521969f, -0.562027f, -0.547501f, -0.470580f, -0.344643f, -0.190080f, -0.022238f, 0.144217f, 0.293618f, 0.418613f, 0.521970f, 0.606614f, 0.672232f, 0.720345f, 0.753099f, 0.769493f, 0.770796f, 0.764174f, 0.753391f, 0.733696f, 0.702773f, 0.667010f, 0.631061f, 0.592423f, 0.551074f, 0.512366f, 0.477047f, 0.440550f, 0.403206f, 0.369206f, 0.337153f, 0.303479f, 0.270983f, 0.242735f, 0.214328f, 0.182386f, 0.151528f, 0.124233f, 0.095401f, 0.063829f, 0.035419f, 0.010359f, -0.017668f, -0.047701f, -0.073299f, -0.096723f, -0.124198f, -0.151868f, -0.173748f, -0.195138f, -0.221363f, -0.245696f, -0.264016f, -0.284769f, -0.310840f, -0.332497f, -0.348925f, -0.371386f, -0.398406f, -0.417735f, -0.434354f, -0.462032f, -0.492418f, -0.512100f, -0.536134f, -0.579084f, -0.619428f, -0.648156f, -0.709398f, -0.814740f, -0.869114f, -0.792023f, -0.672661f} + }, + { + { 0.198789f, 0.479449f, 0.841384f, 1.014645f, 0.841631f, 0.375013f, -0.191824f, -0.677633f, -0.998453f, -1.149750f, -1.160640f, -1.068514f, -0.905139f, -0.691625f, -0.447031f, -0.192888f, 0.055312f, 0.289339f, 0.498414f, 0.671927f, 0.812235f, 0.929986f, 1.028010f, 1.102848f, 1.156570f, 1.193717f, 1.214057f, 1.219865f, 1.220241f, 1.218942f, 1.210137f, 1.192271f, 1.171448f, 1.148056f, 1.116865f, 1.080826f, 1.047158f, 1.012474f, 0.969360f, 0.921459f, 0.875238f, 0.826839f, 0.772906f, 0.720924f, 0.674871f, 0.627049f, 0.575132f, 0.527820f, 0.486114f, 0.441193f, 0.394366f, 0.354847f, 0.318787f, 0.276146f, 0.232314f, 0.196874f, 0.162640f, 0.121555f, 0.083765f, 0.056442f, 0.027308f, -0.009054f, -0.038581f, -0.059134f, -0.087738f, -0.123968f, -0.149625f, -0.170423f, -0.207343f, -0.249859f, -0.276408f, -0.306618f, -0.365081f, -0.423301f, -0.461101f, -0.538219f, -0.693008f, -0.822733f, -0.808512f, -0.718004f}, + { -0.198789f, -0.479449f, -0.841384f, -1.014645f, -0.841631f, -0.375013f, 0.191824f, 0.677633f, 0.998453f, 1.149750f, 1.160640f, 1.068514f, 0.905139f, 0.691625f, 0.447031f, 0.192888f, -0.055312f, -0.289339f, -0.498414f, -0.671927f, -0.812235f, -0.929986f, -1.028010f, -1.102848f, -1.156570f, -1.193717f, -1.214057f, -1.219865f, -1.220241f, -1.218942f, -1.210137f, -1.192271f, -1.171448f, -1.148056f, -1.116865f, -1.080826f, -1.047158f, -1.012474f, -0.969360f, -0.921459f, -0.875238f, -0.826839f, -0.772906f, -0.720924f, -0.674871f, -0.627049f, -0.575132f, -0.527820f, -0.486114f, -0.441193f, -0.394366f, -0.354847f, -0.318787f, -0.276146f, -0.232314f, -0.196874f, -0.162640f, -0.121555f, -0.083765f, -0.056442f, -0.027308f, 0.009054f, 0.038581f, 0.059134f, 0.087738f, 0.123968f, 0.149625f, 0.170423f, 0.207343f, 0.249859f, 0.276408f, 0.306618f, 0.365081f, 0.423301f, 0.461101f, 0.538219f, 0.693008f, 0.822733f, 0.808512f, 0.718004f} + }, + { + { 0.103651f, 0.085763f, 0.012539f, -0.093163f, -0.139453f, -0.082442f, 0.013534f, 0.062431f, 0.049641f, 0.010543f, -0.032439f, -0.071721f, -0.088915f, -0.070311f, -0.034358f, -0.013054f, -0.011243f, -0.004768f, 0.024546f, 0.069095f, 0.111091f, 0.143571f, 0.168893f, 0.185054f, 0.185266f, 0.170698f, 0.153302f, 0.142305f, 0.135188f, 0.125048f, 0.109492f, 0.089281f, 0.065694f, 0.042479f, 0.024528f, 0.013336f, 0.008677f, 0.012472f, 0.024654f, 0.039032f, 0.050209f, 0.059898f, 0.070266f, 0.077933f, 0.080669f, 0.081921f, 0.083181f, 0.080706f, 0.073626f, 0.065218f, 0.054022f, 0.034879f, 0.009091f, -0.018174f, -0.048558f, -0.086265f, -0.127620f, -0.167472f, -0.209212f, -0.256149f, -0.302368f, -0.343698f, -0.385541f, -0.429466f, -0.467232f, -0.496747f, -0.525598f, -0.552414f, -0.566656f, -0.570548f, -0.575284f, -0.574945f, -0.555162f, -0.525091f, -0.502518f, -0.469417f, -0.387422f, -0.261252f, -0.144788f, -0.082088f}, + { 0.103651f, 0.085763f, 0.012539f, -0.093163f, -0.139453f, -0.082442f, 0.013534f, 0.062431f, 0.049641f, 0.010543f, -0.032439f, -0.071721f, -0.088915f, -0.070311f, -0.034358f, -0.013054f, -0.011243f, -0.004768f, 0.024546f, 0.069095f, 0.111091f, 0.143571f, 0.168893f, 0.185054f, 0.185266f, 0.170698f, 0.153302f, 0.142305f, 0.135188f, 0.125048f, 0.109492f, 0.089281f, 0.065694f, 0.042479f, 0.024528f, 0.013336f, 0.008677f, 0.012472f, 0.024654f, 0.039032f, 0.050209f, 0.059898f, 0.070266f, 0.077933f, 0.080669f, 0.081921f, 0.083181f, 0.080706f, 0.073626f, 0.065218f, 0.054022f, 0.034879f, 0.009091f, -0.018174f, -0.048558f, -0.086265f, -0.127620f, -0.167472f, -0.209212f, -0.256149f, -0.302368f, -0.343698f, -0.385541f, -0.429466f, -0.467232f, -0.496747f, -0.525598f, -0.552414f, -0.566656f, -0.570548f, -0.575284f, -0.574945f, -0.555162f, -0.525091f, -0.502518f, -0.469417f, -0.387422f, -0.261252f, -0.144788f, -0.082088f} + }, + { + { 0.083483f, 0.110085f, 0.109339f, 0.051764f, -0.020010f, -0.039528f, 0.004322f, 0.056971f, 0.060463f, 0.007557f, -0.064887f, -0.117401f, -0.135318f, -0.128075f, -0.114412f, -0.106312f, -0.099989f, -0.081312f, -0.041326f, 0.015498f, 0.078415f, 0.140173f, 0.196734f, 0.243546f, 0.279130f, 0.309950f, 0.344966f, 0.385237f, 0.423595f, 0.454230f, 0.477480f, 0.494581f, 0.502830f, 0.498359f, 0.480501f, 0.451053f, 0.411362f, 0.362412f, 0.306822f, 0.249052f, 0.193565f, 0.143055f, 0.098009f, 0.057666f, 0.021358f, -0.011323f, -0.041360f, -0.070040f, -0.097383f, -0.121846f, -0.141922f, -0.157021f, -0.166819f, -0.171494f, -0.173029f, -0.174559f, -0.177852f, -0.182824f, -0.189469f, -0.198225f, -0.208300f, -0.217936f, -0.226727f, -0.235597f, -0.244500f, -0.252545f, -0.260216f, -0.268673f, -0.277131f, -0.284050f, -0.290328f, -0.297485f, -0.303758f, -0.307256f, -0.311324f, -0.317826f, -0.314403f, -0.281644f, -0.222084f, -0.172483f}, + { 0.083483f, 0.110085f, 0.109339f, 0.051764f, -0.020010f, -0.039528f, 0.004322f, 0.056971f, 0.060463f, 0.007557f, -0.064887f, -0.117401f, -0.135318f, -0.128075f, -0.114412f, -0.106312f, -0.099989f, -0.081312f, -0.041326f, 0.015498f, 0.078415f, 0.140173f, 0.196734f, 0.243546f, 0.279130f, 0.309950f, 0.344966f, 0.385237f, 0.423595f, 0.454230f, 0.477480f, 0.494581f, 0.502830f, 0.498359f, 0.480501f, 0.451053f, 0.411362f, 0.362412f, 0.306822f, 0.249052f, 0.193565f, 0.143055f, 0.098009f, 0.057666f, 0.021358f, -0.011323f, -0.041360f, -0.070040f, -0.097383f, -0.121846f, -0.141922f, -0.157021f, -0.166819f, -0.171494f, -0.173029f, -0.174559f, -0.177852f, -0.182824f, -0.189469f, -0.198225f, -0.208300f, -0.217936f, -0.226727f, -0.235597f, -0.244500f, -0.252545f, -0.260216f, -0.268673f, -0.277131f, -0.284050f, -0.290328f, -0.297485f, -0.303758f, -0.307256f, -0.311324f, -0.317826f, -0.314403f, -0.281644f, -0.222084f, -0.172483f} + } +}; +const float CRendBin_FOA_HRIR_coeff_im_16kHz[4][BINAURAL_CHANNELS][80]={ + { + { -0.232163f, -0.616528f, -0.811918f, -0.814798f, -0.695968f, -0.532619f, -0.364404f, -0.191506f, -0.001808f, 0.199692f, 0.387587f, 0.537698f, 0.641196f, 0.697162f, 0.705949f, 0.675021f, 0.619155f, 0.549292f, 0.468934f, 0.381382f, 0.291066f, 0.199434f, 0.108353f, 0.023680f, -0.052215f, -0.124647f, -0.196123f, -0.260439f, -0.313530f, -0.359586f, -0.401100f, -0.434616f, -0.460396f, -0.484091f, -0.506500f, -0.523681f, -0.536851f, -0.550232f, -0.562059f, -0.569337f, -0.575950f, -0.585287f, -0.592832f, -0.595580f, -0.598359f, -0.603032f, -0.604124f, -0.600994f, -0.599842f, -0.600349f, -0.596133f, -0.588817f, -0.584797f, -0.581075f, -0.571581f, -0.560976f, -0.555050f, -0.547876f, -0.534759f, -0.523342f, -0.517217f, -0.507305f, -0.491703f, -0.480933f, -0.474754f, -0.461397f, -0.443990f, -0.435549f, -0.429457f, -0.411877f, -0.393966f, -0.389373f, -0.379526f, -0.350778f, -0.331174f, -0.325571f, -0.264083f, -0.109094f, 0.034816f, 0.040644f}, + { -0.232163f, -0.616528f, -0.811918f, -0.814798f, -0.695968f, -0.532619f, -0.364404f, -0.191506f, -0.001808f, 0.199692f, 0.387587f, 0.537698f, 0.641196f, 0.697162f, 0.705949f, 0.675021f, 0.619155f, 0.549292f, 0.468934f, 0.381382f, 0.291066f, 0.199434f, 0.108353f, 0.023680f, -0.052215f, -0.124647f, -0.196123f, -0.260439f, -0.313530f, -0.359586f, -0.401100f, -0.434616f, -0.460396f, -0.484091f, -0.506500f, -0.523681f, -0.536851f, -0.550232f, -0.562059f, -0.569337f, -0.575950f, -0.585287f, -0.592832f, -0.595580f, -0.598359f, -0.603032f, -0.604124f, -0.600994f, -0.599842f, -0.600349f, -0.596133f, -0.588817f, -0.584797f, -0.581075f, -0.571581f, -0.560976f, -0.555050f, -0.547876f, -0.534759f, -0.523342f, -0.517217f, -0.507305f, -0.491703f, -0.480933f, -0.474754f, -0.461397f, -0.443990f, -0.435549f, -0.429457f, -0.411877f, -0.393966f, -0.389373f, -0.379526f, -0.350778f, -0.331174f, -0.325571f, -0.264083f, -0.109094f, 0.034816f, 0.040644f} + }, + { + { 0.140804f, 0.288820f, 0.122901f, -0.328836f, -0.848509f, -1.186567f, -1.224746f, -1.004466f, -0.637872f, -0.223802f, 0.174851f, 0.525416f, 0.816608f, 1.044355f, 1.203947f, 1.296780f, 1.332269f, 1.317962f, 1.259572f, 1.171367f, 1.071313f, 0.965637f, 0.851706f, 0.732493f, 0.614874f, 0.500288f, 0.389707f, 0.289113f, 0.199637f, 0.113528f, 0.027703f, -0.052051f, -0.124690f, -0.195739f, -0.263851f, -0.322890f, -0.376254f, -0.431439f, -0.484825f, -0.529101f, -0.567623f, -0.605089f, -0.635842f, -0.656446f, -0.674899f, -0.694758f, -0.708108f, -0.713529f, -0.720098f, -0.728010f, -0.728543f, -0.724531f, -0.725793f, -0.727741f, -0.720454f, -0.710172f, -0.705821f, -0.698895f, -0.681963f, -0.666550f, -0.659346f, -0.647466f, -0.627275f, -0.614491f, -0.610170f, -0.596698f, -0.576958f, -0.570455f, -0.569107f, -0.551386f, -0.531742f, -0.532880f, -0.530696f, -0.501217f, -0.483082f, -0.497277f, -0.457348f, -0.288094f, -0.085091f, 0.000003f}, + { -0.140804f, -0.288820f, -0.122901f, 0.328836f, 0.848509f, 1.186567f, 1.224746f, 1.004466f, 0.637872f, 0.223802f, -0.174851f, -0.525416f, -0.816608f, -1.044355f, -1.203947f, -1.296780f, -1.332269f, -1.317962f, -1.259572f, -1.171367f, -1.071313f, -0.965637f, -0.851706f, -0.732493f, -0.614874f, -0.500288f, -0.389707f, -0.289113f, -0.199637f, -0.113528f, -0.027703f, 0.052051f, 0.124690f, 0.195739f, 0.263851f, 0.322890f, 0.376254f, 0.431439f, 0.484825f, 0.529101f, 0.567623f, 0.605089f, 0.635842f, 0.656446f, 0.674899f, 0.694758f, 0.708108f, 0.713529f, 0.720098f, 0.728010f, 0.728543f, 0.724531f, 0.725793f, 0.727741f, 0.720454f, 0.710172f, 0.705821f, 0.698895f, 0.681963f, 0.666550f, 0.659346f, 0.647466f, 0.627275f, 0.614491f, 0.610170f, 0.596698f, 0.576958f, 0.570455f, 0.569107f, 0.551386f, 0.531742f, 0.532880f, 0.530696f, 0.501217f, 0.483082f, 0.497277f, 0.457348f, 0.288094f, 0.085091f, -0.000003f} + }, + { + { -0.025177f, -0.087633f, -0.140274f, -0.115695f, -0.010636f, 0.082920f, 0.087853f, 0.026212f, -0.033798f, -0.061874f, -0.063579f, -0.039952f, 0.007102f, 0.052570f, 0.069283f, 0.063355f, 0.064400f, 0.084995f, 0.108122f, 0.112992f, 0.097520f, 0.071428f, 0.039020f, -0.001236f, -0.044527f, -0.078904f, -0.099083f, -0.112548f, -0.128423f, -0.147364f, -0.165244f, -0.179148f, -0.186479f, -0.184966f, -0.176189f, -0.164004f, -0.150041f, -0.136188f, -0.128157f, -0.129591f, -0.136736f, -0.145463f, -0.157784f, -0.175387f, -0.194418f, -0.212665f, -0.233498f, -0.257959f, -0.282364f, -0.306702f, -0.334694f, -0.364260f, -0.389417f, -0.410847f, -0.432554f, -0.451286f, -0.461837f, -0.467316f, -0.471644f, -0.469923f, -0.458220f, -0.442113f, -0.424518f, -0.398733f, -0.363110f, -0.325903f, -0.288018f, -0.241039f, -0.187411f, -0.138730f, -0.091862f, -0.035017f, 0.023593f, 0.067423f, 0.108501f, 0.170368f, 0.233774f, 0.244228f, 0.178383f, 0.063811f}, + { -0.025177f, -0.087633f, -0.140274f, -0.115695f, -0.010636f, 0.082920f, 0.087853f, 0.026212f, -0.033798f, -0.061874f, -0.063579f, -0.039952f, 0.007102f, 0.052570f, 0.069283f, 0.063355f, 0.064400f, 0.084995f, 0.108122f, 0.112992f, 0.097520f, 0.071428f, 0.039020f, -0.001236f, -0.044527f, -0.078904f, -0.099083f, -0.112548f, -0.128423f, -0.147364f, -0.165244f, -0.179148f, -0.186479f, -0.184966f, -0.176189f, -0.164004f, -0.150041f, -0.136188f, -0.128157f, -0.129591f, -0.136736f, -0.145463f, -0.157784f, -0.175387f, -0.194418f, -0.212665f, -0.233498f, -0.257959f, -0.282364f, -0.306702f, -0.334694f, -0.364260f, -0.389417f, -0.410847f, -0.432554f, -0.451286f, -0.461837f, -0.467316f, -0.471644f, -0.469923f, -0.458220f, -0.442113f, -0.424518f, -0.398733f, -0.363110f, -0.325903f, -0.288018f, -0.241039f, -0.187411f, -0.138730f, -0.091862f, -0.035017f, 0.023593f, 0.067423f, 0.108501f, 0.170368f, 0.233774f, 0.244228f, 0.178383f, 0.063811f} + }, + { + { 0.004703f, -0.012419f, -0.068264f, -0.109935f, -0.087140f, -0.019730f, 0.023154f, 0.000984f, -0.060278f, -0.104075f, -0.098075f, -0.050669f, 0.009688f, 0.059915f, 0.094514f, 0.123898f, 0.161742f, 0.210179f, 0.257436f, 0.290142f, 0.304107f, 0.301838f, 0.285923f, 0.260106f, 0.232315f, 0.209084f, 0.187584f, 0.158711f, 0.118014f, 0.068935f, 0.015486f, -0.042837f, -0.107244f, -0.175037f, -0.241360f, -0.302992f, -0.358214f, -0.404621f, -0.439290f, -0.460886f, -0.470726f, -0.471924f, -0.467673f, -0.459973f, -0.449766f, -0.437936f, -0.425279f, -0.411399f, -0.394870f, -0.375052f, -0.352862f, -0.329697f, -0.306974f, -0.286835f, -0.271419f, -0.260782f, -0.252993f, -0.246525f, -0.240909f, -0.235119f, -0.227642f, -0.218477f, -0.208956f, -0.199340f, -0.188795f, -0.177591f, -0.166699f, -0.155414f, -0.142302f, -0.128106f, -0.114274f, -0.099433f, -0.081705f, -0.063092f, -0.044843f, -0.019680f, 0.019853f, 0.060923f, 0.070962f, 0.031790f}, + { 0.004703f, -0.012419f, -0.068264f, -0.109935f, -0.087140f, -0.019730f, 0.023154f, 0.000984f, -0.060278f, -0.104075f, -0.098075f, -0.050669f, 0.009688f, 0.059915f, 0.094514f, 0.123898f, 0.161742f, 0.210179f, 0.257436f, 0.290142f, 0.304107f, 0.301838f, 0.285923f, 0.260106f, 0.232315f, 0.209084f, 0.187584f, 0.158711f, 0.118014f, 0.068935f, 0.015486f, -0.042837f, -0.107244f, -0.175037f, -0.241360f, -0.302992f, -0.358214f, -0.404621f, -0.439290f, -0.460886f, -0.470726f, -0.471924f, -0.467673f, -0.459973f, -0.449766f, -0.437936f, -0.425279f, -0.411399f, -0.394870f, -0.375052f, -0.352862f, -0.329697f, -0.306974f, -0.286835f, -0.271419f, -0.260782f, -0.252993f, -0.246525f, -0.240909f, -0.235119f, -0.227642f, -0.218477f, -0.208956f, -0.199340f, -0.188795f, -0.177591f, -0.166699f, -0.155414f, -0.142302f, -0.128106f, -0.114274f, -0.099433f, -0.081705f, -0.063092f, -0.044843f, -0.019680f, 0.019853f, 0.060923f, 0.070962f, 0.031790f} + } +}; +const float *CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float *CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; +#endif /* USE_HRIR_128_48000_DOLBY_SBA1 */ + +#ifdef USE_HRIR_128_48000_DOLBY_SBA2 + + +/********************** CRendBin_HOA2_HRIR **********************/ + +const float CRendBin_HOA2_HRIR_latency_s = 0.000000000000000f; + +/* Sample Rate = 48000 */ + +const int16_t CRendBin_HOA2_HRIR_max_num_iterations_48kHz = 1; +const uint16_t CRendBin_HOA2_HRIR_num_iterations_48kHz[9][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {0, 0}; +const uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[9][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}}; +const uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_48kHz = 0; +const float CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz[9]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f}; +const uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float CRendBin_HOA2_HRIR_coeff_re_48kHz[9][BINAURAL_CHANNELS][240]={ + { + {0.955467f, 0.635681f, 0.166653f, -0.248686f, -0.508651f, -0.626077f, -0.650285f, -0.604530f, -0.488417f, -0.308510f, -0.090053f, 0.133390f, 0.331939f, 0.484574f, 0.581273f, 0.623235f, 0.619217f, 0.579562f, 0.512138f, 0.422298f, 0.315745f, 0.200824f, 0.086720f, -0.021278f, -0.123379f, -0.220908f, -0.311538f, -0.390400f, -0.454756f, -0.505495f, -0.544554f, -0.573087f, -0.592353f, -0.604514f, -0.611652f, -0.614839f, -0.614702f, -0.612258f, -0.608712f, -0.604725f, -0.600146f, -0.594359f, -0.586798f, -0.577264f, -0.565860f, -0.552745f, -0.538040f, -0.521885f, -0.504388f, -0.485535f, -0.465319f, -0.443966f, -0.421881f, -0.399382f, -0.376688f, -0.354132f, -0.332145f, -0.310934f, -0.290358f, -0.270218f, -0.250519f, -0.231307f, -0.212442f, -0.193768f, -0.175388f, -0.157519f, -0.140147f, -0.123115f, -0.106462f, -0.090326f, -0.074575f, -0.058912f, -0.043292f, -0.027843f, -0.012429f, 0.003258f, 0.019199f, 0.035158f, 0.051271f, 0.067966f, 0.085226f, 0.102477f, 0.119366f, 0.136149f, 0.153084f, 0.169846f, 0.185867f, 0.201051f, 0.215857f, 0.230656f, 0.245156f, 0.258620f, 0.270655f, 0.281594f, 0.291923f, 0.301545f, + 0.309937f, 0.316968f, 0.323239f, 0.329553f, 0.336281f, 0.343277f, 0.350289f, 0.357415f, 0.365174f, 0.374055f, 0.384018f, 0.394584f, 0.405384f, 0.416401f, 0.427714f, 0.439268f, 0.450898f, 0.462356f, 0.473320f, 0.483570f, 0.493122f, 0.502098f, 0.510577f, 0.518647f, 0.526423f, 0.533949f, 0.541211f, 0.548278f, 0.555224f, 0.561949f, 0.568280f, 0.574177f, 0.579652f, 0.584611f, 0.589021f, 0.593080f, 0.597009f, 0.600857f, 0.604651f, 0.608500f, 0.612417f, 0.616274f, 0.620049f, 0.623888f, 0.627902f, 0.632129f, 0.636648f, 0.641474f, 0.646442f, 0.651406f, 0.656384f, 0.661348f, 0.666127f, 0.670667f, 0.675091f, 0.679372f, 0.683315f, 0.686889f, 0.690210f, 0.693196f, 0.695655f, 0.697621f, 0.699235f, 0.700467f, 0.701329f, 0.702091f, 0.702934f, 0.703776f, 0.704674f, 0.705900f, 0.707411f, 0.708825f, 0.710050f, 0.711305f, 0.712526f, 0.713461f, 0.714246f, 0.715152f, 0.716020f, 0.716635f, 0.717247f, 0.718065f, 0.718834f, 0.719533f, 0.720673f, 0.722398f, 0.724272f, 0.726300f, 0.728964f, 0.732074f, 0.734989f, 0.737890f, 0.741305f, 0.744740f, 0.747549f, 0.750362f, + 0.753763f, 0.756792f, 0.758849f, 0.761249f, 0.764561f, 0.766959f, 0.767817f, 0.769595f, 0.772990f, 0.774514f, 0.772907f, 0.772944f, 0.777562f, 0.781372f, 0.778511f, 0.772279f, 0.769953f, 0.772161f, 0.774253f, 0.773522f, 0.767718f, 0.752282f, 0.729193f, 0.714109f, 0.722150f, 0.746693f, 0.763324f, 0.757243f, 0.738026f, 0.724006f, 0.720101f, 0.717852f, 0.714019f, 0.720891f, 0.753307f, 0.807040f, 0.856442f, 0.878090f, 0.873417f, 0.862096f, 0.856572f, 0.853129f, 0.847435f, 0.844863f, 0.848629f, 0.849468f, 0.838876f, 0.825576f}, + {0.955467f, 0.635681f, 0.166653f, -0.248686f, -0.508651f, -0.626077f, -0.650285f, -0.604530f, -0.488417f, -0.308510f, -0.090053f, 0.133390f, 0.331939f, 0.484574f, 0.581273f, 0.623235f, 0.619217f, 0.579562f, 0.512138f, 0.422298f, 0.315745f, 0.200824f, 0.086720f, -0.021278f, -0.123379f, -0.220908f, -0.311538f, -0.390400f, -0.454756f, -0.505495f, -0.544554f, -0.573087f, -0.592353f, -0.604514f, -0.611652f, -0.614839f, -0.614702f, -0.612258f, -0.608712f, -0.604725f, -0.600146f, -0.594359f, -0.586798f, -0.577264f, -0.565860f, -0.552745f, -0.538040f, -0.521885f, -0.504388f, -0.485535f, -0.465319f, -0.443966f, -0.421881f, -0.399382f, -0.376688f, -0.354132f, -0.332145f, -0.310934f, -0.290358f, -0.270218f, -0.250519f, -0.231307f, -0.212442f, -0.193768f, -0.175388f, -0.157519f, -0.140147f, -0.123115f, -0.106462f, -0.090326f, -0.074575f, -0.058912f, -0.043292f, -0.027843f, -0.012429f, 0.003258f, 0.019199f, 0.035158f, 0.051271f, 0.067966f, 0.085226f, 0.102477f, 0.119366f, 0.136149f, 0.153084f, 0.169846f, 0.185867f, 0.201051f, 0.215857f, 0.230656f, 0.245156f, 0.258620f, 0.270655f, 0.281594f, 0.291923f, 0.301545f, + 0.309937f, 0.316968f, 0.323239f, 0.329553f, 0.336281f, 0.343277f, 0.350289f, 0.357415f, 0.365174f, 0.374055f, 0.384018f, 0.394584f, 0.405384f, 0.416401f, 0.427714f, 0.439268f, 0.450898f, 0.462356f, 0.473320f, 0.483570f, 0.493122f, 0.502098f, 0.510577f, 0.518647f, 0.526423f, 0.533949f, 0.541211f, 0.548278f, 0.555224f, 0.561949f, 0.568280f, 0.574177f, 0.579652f, 0.584611f, 0.589021f, 0.593080f, 0.597009f, 0.600857f, 0.604651f, 0.608500f, 0.612417f, 0.616274f, 0.620049f, 0.623888f, 0.627902f, 0.632129f, 0.636648f, 0.641474f, 0.646442f, 0.651406f, 0.656384f, 0.661348f, 0.666127f, 0.670667f, 0.675091f, 0.679372f, 0.683315f, 0.686889f, 0.690210f, 0.693196f, 0.695655f, 0.697621f, 0.699235f, 0.700467f, 0.701329f, 0.702091f, 0.702934f, 0.703776f, 0.704674f, 0.705900f, 0.707411f, 0.708825f, 0.710050f, 0.711305f, 0.712526f, 0.713461f, 0.714246f, 0.715152f, 0.716020f, 0.716635f, 0.717247f, 0.718065f, 0.718834f, 0.719533f, 0.720673f, 0.722398f, 0.724272f, 0.726300f, 0.728964f, 0.732074f, 0.734989f, 0.737890f, 0.741305f, 0.744740f, 0.747549f, 0.750362f, + 0.753763f, 0.756792f, 0.758849f, 0.761249f, 0.764561f, 0.766959f, 0.767817f, 0.769595f, 0.772990f, 0.774514f, 0.772907f, 0.772944f, 0.777562f, 0.781372f, 0.778511f, 0.772279f, 0.769953f, 0.772161f, 0.774253f, 0.773522f, 0.767718f, 0.752282f, 0.729193f, 0.714109f, 0.722150f, 0.746693f, 0.763324f, 0.757243f, 0.738026f, 0.724006f, 0.720101f, 0.717852f, 0.714019f, 0.720891f, 0.753307f, 0.807040f, 0.856442f, 0.878090f, 0.873417f, 0.862096f, 0.856572f, 0.853129f, 0.847435f, 0.844863f, 0.848629f, 0.849468f, 0.838876f, 0.825576f} + }, + { + {0.097314f, 0.414173f, 0.747626f, 0.754590f, 0.330783f, -0.326705f, -0.901613f, -1.190599f, -1.185056f, -0.986921f, -0.692990f, -0.354873f, -0.002249f, 0.335288f, 0.631311f, 0.869888f, 1.042481f, 1.143077f, 1.170924f, 1.135842f, 1.056300f, 0.949835f, 0.825366f, 0.685238f, 0.533253f, 0.378103f, 0.228763f, 0.089252f, -0.040641f, -0.161495f, -0.272981f, -0.375031f, -0.468133f, -0.552605f, -0.628716f, -0.697354f, -0.759761f, -0.816645f, -0.867878f, -0.912811f, -0.950646f, -0.980831f, -1.003432f, -1.019091f, -1.028553f, -1.032320f, -1.030690f, -1.023992f, -1.012844f, -0.998265f, -0.981431f, -0.963113f, -0.943286f, -0.921325f, -0.896613f, -0.869049f, -0.839024f, -0.807064f, -0.773676f, -0.739520f, -0.705375f, -0.671722f, -0.638603f, -0.606135f, -0.574805f, -0.544984f, -0.516534f, -0.489311f, -0.463725f, -0.440280f, -0.418894f, -0.399253f, -0.381525f, -0.365999f, -0.352195f, -0.339137f, -0.326488f, -0.314596f, -0.303283f, -0.291474f, -0.278425f, -0.264548f, -0.250445f, -0.235726f, -0.219500f, -0.201656f, -0.182949f, -0.163967f, -0.144609f, -0.124484f, -0.103249f, -0.080535f, -0.055987f, -0.029425f, -0.000739f, 0.030319f, + 0.063929f, 0.099772f, 0.136966f, 0.174386f, 0.211037f, 0.246212f, 0.279379f, 0.309898f, 0.336976f, 0.360053f, 0.379082f, 0.394265f, 0.405690f, 0.413493f, 0.418257f, 0.421046f, 0.423069f, 0.425261f, 0.427920f, 0.430738f, 0.433463f, 0.436544f, 0.440906f, 0.447174f, 0.455301f, 0.464713f, 0.474496f, 0.483726f, 0.492054f, 0.499849f, 0.507562f, 0.515203f, 0.522591f, 0.529726f, 0.536646f, 0.543230f, 0.549348f, 0.554966f, 0.560050f, 0.564644f, 0.569000f, 0.573385f, 0.577839f, 0.582298f, 0.586765f, 0.591237f, 0.595738f, 0.600532f, 0.606012f, 0.612378f, 0.619693f, 0.628054f, 0.637369f, 0.647229f, 0.657409f, 0.668130f, 0.679533f, 0.691385f, 0.703604f, 0.716403f, 0.729644f, 0.742723f, 0.755282f, 0.767338f, 0.778713f, 0.789114f, 0.798667f, 0.807637f, 0.815884f, 0.823219f, 0.829774f, 0.835517f, 0.840126f, 0.843797f, 0.847226f, 0.850573f, 0.853543f, 0.856458f, 0.859889f, 0.863411f, 0.866099f, 0.867816f, 0.868779f, 0.868745f, 0.867866f, 0.867084f, 0.866670f, 0.865984f, 0.865256f, 0.865448f, 0.866168f, 0.866282f, 0.866234f, 0.866993f, 0.867839f, 0.868126f, + 0.868997f, 0.870630f, 0.871367f, 0.871898f, 0.874706f, 0.877884f, 0.877771f, 0.878026f, 0.884032f, 0.889476f, 0.886115f, 0.884433f, 0.898714f, 0.912808f, 0.896260f, 0.858730f, 0.845640f, 0.869140f, 0.891869f, 0.896006f, 0.911910f, 0.948673f, 0.954899f, 0.894533f, 0.814533f, 0.786292f, 0.814134f, 0.846554f, 0.848304f, 0.823226f, 0.793405f, 0.782599f, 0.785720f, 0.738162f, 0.572339f, 0.335226f, 0.185068f, 0.220164f, 0.362443f, 0.464261f, 0.482183f, 0.481394f, 0.504881f, 0.514608f, 0.459824f, 0.346966f, 0.228758f, 0.156688f}, + {-0.097314f, -0.414173f, -0.747626f, -0.754590f, -0.330783f, 0.326705f, 0.901613f, 1.190599f, 1.185056f, 0.986921f, 0.692990f, 0.354873f, 0.002249f, -0.335288f, -0.631311f, -0.869888f, -1.042481f, -1.143077f, -1.170924f, -1.135842f, -1.056300f, -0.949835f, -0.825366f, -0.685238f, -0.533253f, -0.378103f, -0.228763f, -0.089252f, 0.040641f, 0.161495f, 0.272981f, 0.375031f, 0.468133f, 0.552605f, 0.628716f, 0.697354f, 0.759761f, 0.816645f, 0.867878f, 0.912811f, 0.950646f, 0.980831f, 1.003432f, 1.019091f, 1.028553f, 1.032320f, 1.030690f, 1.023992f, 1.012844f, 0.998265f, 0.981431f, 0.963113f, 0.943286f, 0.921325f, 0.896613f, 0.869049f, 0.839024f, 0.807064f, 0.773676f, 0.739520f, 0.705375f, 0.671722f, 0.638603f, 0.606135f, 0.574805f, 0.544984f, 0.516534f, 0.489311f, 0.463725f, 0.440280f, 0.418894f, 0.399253f, 0.381525f, 0.365999f, 0.352195f, 0.339137f, 0.326488f, 0.314596f, 0.303283f, 0.291474f, 0.278425f, 0.264548f, 0.250445f, 0.235726f, 0.219500f, 0.201656f, 0.182949f, 0.163967f, 0.144609f, 0.124484f, 0.103249f, 0.080535f, 0.055987f, 0.029425f, 0.000739f, -0.030319f, + -0.063929f, -0.099772f, -0.136966f, -0.174386f, -0.211037f, -0.246212f, -0.279379f, -0.309898f, -0.336976f, -0.360053f, -0.379082f, -0.394265f, -0.405690f, -0.413493f, -0.418257f, -0.421046f, -0.423069f, -0.425261f, -0.427920f, -0.430738f, -0.433463f, -0.436544f, -0.440906f, -0.447174f, -0.455301f, -0.464713f, -0.474496f, -0.483726f, -0.492054f, -0.499849f, -0.507562f, -0.515203f, -0.522591f, -0.529726f, -0.536646f, -0.543230f, -0.549348f, -0.554966f, -0.560050f, -0.564644f, -0.569000f, -0.573385f, -0.577839f, -0.582298f, -0.586765f, -0.591237f, -0.595738f, -0.600532f, -0.606012f, -0.612378f, -0.619693f, -0.628054f, -0.637369f, -0.647229f, -0.657409f, -0.668130f, -0.679533f, -0.691385f, -0.703604f, -0.716403f, -0.729644f, -0.742723f, -0.755282f, -0.767338f, -0.778713f, -0.789114f, -0.798667f, -0.807637f, -0.815884f, -0.823219f, -0.829774f, -0.835517f, -0.840126f, -0.843797f, -0.847226f, -0.850573f, -0.853543f, -0.856458f, -0.859889f, -0.863411f, -0.866099f, -0.867816f, -0.868779f, -0.868745f, -0.867866f, -0.867084f, -0.866670f, -0.865984f, -0.865256f, -0.865448f, -0.866168f, -0.866282f, -0.866234f, -0.866993f, -0.867839f, -0.868126f, + -0.868997f, -0.870630f, -0.871367f, -0.871898f, -0.874706f, -0.877884f, -0.877771f, -0.878026f, -0.884032f, -0.889476f, -0.886115f, -0.884433f, -0.898714f, -0.912808f, -0.896260f, -0.858730f, -0.845640f, -0.869140f, -0.891869f, -0.896006f, -0.911910f, -0.948673f, -0.954899f, -0.894533f, -0.814533f, -0.786292f, -0.814134f, -0.846554f, -0.848304f, -0.823226f, -0.793405f, -0.782599f, -0.785720f, -0.738162f, -0.572339f, -0.335226f, -0.185068f, -0.220164f, -0.362443f, -0.464261f, -0.482183f, -0.481394f, -0.504881f, -0.514608f, -0.459824f, -0.346966f, -0.228758f, -0.156688f} + }, + { + {0.116713f, 0.072126f, -0.020631f, -0.112176f, -0.120235f, -0.031894f, 0.067439f, 0.091659f, 0.039310f, -0.034445f, -0.085235f, -0.095294f, -0.062685f, -0.007339f, 0.035234f, 0.050997f, 0.062562f, 0.092595f, 0.130453f, 0.149870f, 0.142288f, 0.116439f, 0.078486f, 0.030060f, -0.020701f, -0.060937f, -0.085675f, -0.101228f, -0.116230f, -0.133115f, -0.147632f, -0.154014f, -0.150236f, -0.138833f, -0.123518f, -0.107035f, -0.092734f, -0.085340f, -0.087853f, -0.099007f, -0.115280f, -0.134212f, -0.154704f, -0.175585f, -0.195498f, -0.213771f, -0.230537f, -0.246204f, -0.261004f, -0.274518f, -0.285368f, -0.291759f, -0.292561f, -0.287601f, -0.276917f, -0.260193f, -0.237217f, -0.208432f, -0.174533f, -0.135701f, -0.091811f, -0.043233f, 0.009243f, 0.065150f, 0.124187f, 0.185310f, 0.246775f, 0.307108f, 0.365223f, 0.419659f, 0.468551f, 0.510367f, 0.543904f, 0.567857f, 0.581410f, 0.585089f, 0.579988f, 0.566359f, 0.544196f, 0.515148f, 0.482355f, 0.447851f, 0.411415f, 0.372943f, 0.334830f, 0.300327f, 0.269892f, 0.241113f, 0.212758f, 0.187086f, 0.166978f, 0.152277f, 0.140516f, 0.130249f, 0.122026f, 0.116711f, + 0.114395f, 0.114642f, 0.116582f, 0.118903f, 0.120560f, 0.121397f, 0.121803f, 0.122096f, 0.122081f, 0.120568f, 0.115639f, 0.106376f, 0.094049f, 0.080746f, 0.067280f, 0.053238f, 0.038276f, 0.022433f, 0.005947f, -0.010351f, -0.025082f, -0.037294f, -0.046681f, -0.052842f, -0.055367f, -0.054587f, -0.051101f, -0.044816f, -0.035505f, -0.023804f, -0.010663f, 0.003451f, 0.018016f, 0.032133f, 0.045369f, 0.057764f, 0.068693f, 0.077173f, 0.083414f, 0.088574f, 0.093316f, 0.098141f, 0.104298f, 0.112463f, 0.121400f, 0.129615f, 0.137158f, 0.144434f, 0.150888f, 0.156189f, 0.160875f, 0.164864f, 0.167274f, 0.168212f, 0.168642f, 0.168568f, 0.167544f, 0.166341f, 0.165856f, 0.165449f, 0.164412f, 0.163410f, 0.162696f, 0.161164f, 0.158594f, 0.156177f, 0.153901f, 0.150467f, 0.146055f, 0.141871f, 0.137505f, 0.132216f, 0.127455f, 0.124584f, 0.122335f, 0.119725f, 0.118247f, 0.118393f, 0.118126f, 0.116848f, 0.115875f, 0.114029f, 0.108671f, 0.100879f, 0.093121f, 0.083708f, 0.070519f, 0.056452f, 0.043960f, 0.029990f, 0.013203f, -0.001963f, -0.014381f, -0.028555f, -0.043767f, -0.054771f, + -0.064616f, -0.079267f, -0.092295f, -0.096950f, -0.104863f, -0.124550f, -0.137426f, -0.132020f, -0.136512f, -0.167601f, -0.183275f, -0.156719f, -0.153305f, -0.232829f, -0.312161f, -0.256735f, -0.095012f, 0.003970f, -0.025692f, -0.079935f, -0.088484f, -0.118715f, -0.210193f, -0.259911f, -0.175437f, -0.030063f, 0.040705f, 0.019139f, -0.011331f, -0.004889f, 0.006382f, -0.022770f, -0.100066f, -0.183271f, -0.195497f, -0.097381f, 0.039125f, 0.086187f, 0.011399f, -0.085034f, -0.108289f, -0.079208f, -0.069267f, -0.087019f, -0.087070f, -0.054365f, -0.019140f, -0.003388f}, + {0.116713f, 0.072126f, -0.020631f, -0.112176f, -0.120235f, -0.031894f, 0.067439f, 0.091659f, 0.039310f, -0.034445f, -0.085235f, -0.095294f, -0.062685f, -0.007339f, 0.035234f, 0.050997f, 0.062562f, 0.092595f, 0.130453f, 0.149870f, 0.142288f, 0.116439f, 0.078486f, 0.030060f, -0.020701f, -0.060937f, -0.085675f, -0.101228f, -0.116230f, -0.133115f, -0.147632f, -0.154014f, -0.150236f, -0.138833f, -0.123518f, -0.107035f, -0.092734f, -0.085340f, -0.087853f, -0.099007f, -0.115280f, -0.134212f, -0.154704f, -0.175585f, -0.195498f, -0.213771f, -0.230537f, -0.246204f, -0.261004f, -0.274518f, -0.285368f, -0.291759f, -0.292561f, -0.287601f, -0.276917f, -0.260193f, -0.237217f, -0.208432f, -0.174533f, -0.135701f, -0.091811f, -0.043233f, 0.009243f, 0.065150f, 0.124187f, 0.185310f, 0.246775f, 0.307108f, 0.365223f, 0.419659f, 0.468551f, 0.510367f, 0.543904f, 0.567857f, 0.581410f, 0.585089f, 0.579988f, 0.566359f, 0.544196f, 0.515148f, 0.482355f, 0.447851f, 0.411415f, 0.372943f, 0.334830f, 0.300327f, 0.269892f, 0.241113f, 0.212758f, 0.187086f, 0.166978f, 0.152277f, 0.140516f, 0.130249f, 0.122026f, 0.116711f, + 0.114395f, 0.114642f, 0.116582f, 0.118903f, 0.120560f, 0.121397f, 0.121803f, 0.122096f, 0.122081f, 0.120568f, 0.115639f, 0.106376f, 0.094049f, 0.080746f, 0.067280f, 0.053238f, 0.038276f, 0.022433f, 0.005947f, -0.010351f, -0.025082f, -0.037294f, -0.046681f, -0.052842f, -0.055367f, -0.054587f, -0.051101f, -0.044816f, -0.035505f, -0.023804f, -0.010663f, 0.003451f, 0.018016f, 0.032133f, 0.045369f, 0.057764f, 0.068693f, 0.077173f, 0.083414f, 0.088574f, 0.093316f, 0.098141f, 0.104298f, 0.112463f, 0.121400f, 0.129615f, 0.137158f, 0.144434f, 0.150888f, 0.156189f, 0.160875f, 0.164864f, 0.167274f, 0.168212f, 0.168642f, 0.168568f, 0.167544f, 0.166341f, 0.165856f, 0.165449f, 0.164412f, 0.163410f, 0.162696f, 0.161164f, 0.158594f, 0.156177f, 0.153901f, 0.150467f, 0.146055f, 0.141871f, 0.137505f, 0.132216f, 0.127455f, 0.124584f, 0.122335f, 0.119725f, 0.118247f, 0.118393f, 0.118126f, 0.116848f, 0.115875f, 0.114029f, 0.108671f, 0.100879f, 0.093121f, 0.083708f, 0.070519f, 0.056452f, 0.043960f, 0.029990f, 0.013203f, -0.001963f, -0.014381f, -0.028555f, -0.043767f, -0.054771f, + -0.064616f, -0.079267f, -0.092295f, -0.096950f, -0.104863f, -0.124550f, -0.137426f, -0.132020f, -0.136512f, -0.167601f, -0.183275f, -0.156719f, -0.153305f, -0.232829f, -0.312161f, -0.256735f, -0.095012f, 0.003970f, -0.025692f, -0.079935f, -0.088484f, -0.118715f, -0.210193f, -0.259911f, -0.175437f, -0.030063f, 0.040705f, 0.019139f, -0.011331f, -0.004889f, 0.006382f, -0.022770f, -0.100066f, -0.183271f, -0.195497f, -0.097381f, 0.039125f, 0.086187f, 0.011399f, -0.085034f, -0.108289f, -0.079208f, -0.069267f, -0.087019f, -0.087070f, -0.054365f, -0.019140f, -0.003388f} + }, + { + {0.057716f, 0.076756f, 0.058868f, -0.013782f, -0.079436f, -0.074073f, -0.016187f, 0.017124f, -0.018250f, -0.093448f, -0.149405f, -0.153777f, -0.115034f, -0.060844f, -0.011733f, 0.031700f, 0.082185f, 0.146750f, 0.215597f, 0.270817f, 0.301494f, 0.306907f, 0.290675f, 0.258743f, 0.219989f, 0.180823f, 0.138641f, 0.085701f, 0.019654f, -0.054132f, -0.130307f, -0.208118f, -0.286879f, -0.361597f, -0.426062f, -0.477609f, -0.516371f, -0.541854f, -0.552928f, -0.550365f, -0.537270f, -0.517036f, -0.491948f, -0.463535f, -0.433204f, -0.402160f, -0.370923f, -0.339116f, -0.306013f, -0.271593f, -0.237008f, -0.204076f, -0.174628f, -0.150090f, -0.130726f, -0.115027f, -0.100582f, -0.085793f, -0.070243f, -0.053770f, -0.036295f, -0.018447f, -0.001151f, 0.015432f, 0.031657f, 0.047424f, 0.062600f, 0.078005f, 0.094600f, 0.112028f, 0.129305f, 0.146558f, 0.164522f, 0.182587f, 0.199005f, 0.212998f, 0.224982f, 0.234524f, 0.239833f, 0.239930f, 0.235886f, 0.228926f, 0.218536f, 0.203779f, 0.185737f, 0.167006f, 0.148890f, 0.130591f, 0.111280f, 0.091321f, 0.070885f, 0.048967f, 0.024866f, -0.000541f, -0.026100f, -0.051960f, + -0.078659f, -0.105381f, -0.130303f, -0.152361f, -0.171822f, -0.189236f, -0.204261f, -0.215422f, -0.221132f, -0.221347f, -0.217950f, -0.212885f, -0.206158f, -0.196258f, -0.182255f, -0.164983f, -0.146569f, -0.129160f, -0.113464f, -0.098109f, -0.081029f, -0.061799f, -0.042161f, -0.024344f, -0.009539f, 0.002365f, 0.012635f, 0.023134f, 0.034939f, 0.047539f, 0.059892f, 0.071761f, 0.083571f, 0.095796f, 0.109100f, 0.124264f, 0.141372f, 0.159700f, 0.178598f, 0.197760f, 0.216729f, 0.235064f, 0.252852f, 0.270238f, 0.286751f, 0.301767f, 0.315065f, 0.326358f, 0.335078f, 0.341096f, 0.344846f, 0.346536f, 0.346164f, 0.344265f, 0.341562f, 0.338166f, 0.334119f, 0.330115f, 0.326715f, 0.323760f, 0.321440f, 0.320712f, 0.321901f, 0.324294f, 0.327593f, 0.332127f, 0.337417f, 0.342367f, 0.346858f, 0.351462f, 0.356178f, 0.361075f, 0.367067f, 0.374444f, 0.382147f, 0.389740f, 0.397992f, 0.406725f, 0.414722f, 0.422146f, 0.429946f, 0.437160f, 0.442159f, 0.445488f, 0.447970f, 0.448137f, 0.445126f, 0.440944f, 0.436547f, 0.430064f, 0.421619f, 0.414105f, 0.407405f, 0.399002f, 0.390437f, 0.384435f, + 0.377920f, 0.368392f, 0.361461f, 0.359383f, 0.352793f, 0.339519f, 0.334298f, 0.339584f, 0.332793f, 0.310207f, 0.306283f, 0.327892f, 0.317434f, 0.246418f, 0.196934f, 0.258692f, 0.381164f, 0.436129f, 0.404093f, 0.376464f, 0.381882f, 0.351261f, 0.276746f, 0.261983f, 0.357657f, 0.468349f, 0.494143f, 0.465205f, 0.461850f, 0.487233f, 0.497133f, 0.484317f, 0.455264f, 0.383620f, 0.267215f, 0.184416f, 0.211056f, 0.308507f, 0.369236f, 0.358171f, 0.338304f, 0.358938f, 0.388546f, 0.381045f, 0.357053f, 0.377955f, 0.457097f, 0.532101f}, + {0.057716f, 0.076756f, 0.058868f, -0.013782f, -0.079436f, -0.074073f, -0.016187f, 0.017124f, -0.018250f, -0.093448f, -0.149405f, -0.153777f, -0.115034f, -0.060844f, -0.011733f, 0.031700f, 0.082185f, 0.146750f, 0.215597f, 0.270817f, 0.301494f, 0.306907f, 0.290675f, 0.258743f, 0.219989f, 0.180823f, 0.138641f, 0.085701f, 0.019654f, -0.054132f, -0.130307f, -0.208118f, -0.286879f, -0.361597f, -0.426062f, -0.477609f, -0.516371f, -0.541854f, -0.552928f, -0.550365f, -0.537270f, -0.517036f, -0.491948f, -0.463535f, -0.433204f, -0.402160f, -0.370923f, -0.339116f, -0.306013f, -0.271593f, -0.237008f, -0.204076f, -0.174628f, -0.150090f, -0.130726f, -0.115027f, -0.100582f, -0.085793f, -0.070243f, -0.053770f, -0.036295f, -0.018447f, -0.001151f, 0.015432f, 0.031657f, 0.047424f, 0.062600f, 0.078005f, 0.094600f, 0.112028f, 0.129305f, 0.146558f, 0.164522f, 0.182587f, 0.199005f, 0.212998f, 0.224982f, 0.234524f, 0.239833f, 0.239930f, 0.235886f, 0.228926f, 0.218536f, 0.203779f, 0.185737f, 0.167006f, 0.148890f, 0.130591f, 0.111280f, 0.091321f, 0.070885f, 0.048967f, 0.024866f, -0.000541f, -0.026100f, -0.051960f, + -0.078659f, -0.105381f, -0.130303f, -0.152361f, -0.171822f, -0.189236f, -0.204261f, -0.215422f, -0.221132f, -0.221347f, -0.217950f, -0.212885f, -0.206158f, -0.196258f, -0.182255f, -0.164983f, -0.146569f, -0.129160f, -0.113464f, -0.098109f, -0.081029f, -0.061799f, -0.042161f, -0.024344f, -0.009539f, 0.002365f, 0.012635f, 0.023134f, 0.034939f, 0.047539f, 0.059892f, 0.071761f, 0.083571f, 0.095796f, 0.109100f, 0.124264f, 0.141372f, 0.159700f, 0.178598f, 0.197760f, 0.216729f, 0.235064f, 0.252852f, 0.270238f, 0.286751f, 0.301767f, 0.315065f, 0.326358f, 0.335078f, 0.341096f, 0.344846f, 0.346536f, 0.346164f, 0.344265f, 0.341562f, 0.338166f, 0.334119f, 0.330115f, 0.326715f, 0.323760f, 0.321440f, 0.320712f, 0.321901f, 0.324294f, 0.327593f, 0.332127f, 0.337417f, 0.342367f, 0.346858f, 0.351462f, 0.356178f, 0.361075f, 0.367067f, 0.374444f, 0.382147f, 0.389740f, 0.397992f, 0.406725f, 0.414722f, 0.422146f, 0.429946f, 0.437160f, 0.442159f, 0.445488f, 0.447970f, 0.448137f, 0.445126f, 0.440944f, 0.436547f, 0.430064f, 0.421619f, 0.414105f, 0.407405f, 0.399002f, 0.390437f, 0.384435f, + 0.377920f, 0.368392f, 0.361461f, 0.359383f, 0.352793f, 0.339519f, 0.334298f, 0.339584f, 0.332793f, 0.310207f, 0.306283f, 0.327892f, 0.317434f, 0.246418f, 0.196934f, 0.258692f, 0.381164f, 0.436129f, 0.404093f, 0.376464f, 0.381882f, 0.351261f, 0.276746f, 0.261983f, 0.357657f, 0.468349f, 0.494143f, 0.465205f, 0.461850f, 0.487233f, 0.497133f, 0.484317f, 0.455264f, 0.383620f, 0.267215f, 0.184416f, 0.211056f, 0.308507f, 0.369236f, 0.358171f, 0.338304f, 0.358938f, 0.388546f, 0.381045f, 0.357053f, 0.377955f, 0.457097f, 0.532101f} + }, + { + {0.022217f, 0.015375f, 0.018397f, 0.035300f, 0.046690f, 0.037732f, 0.022017f, 0.019869f, 0.019459f, -0.017327f, -0.102816f, -0.194710f, -0.234177f, -0.204599f, -0.138417f, -0.071733f, -0.010515f, 0.056797f, 0.132305f, 0.206318f, 0.271841f, 0.327874f, 0.371103f, 0.395052f, 0.398096f, 0.384964f, 0.359169f, 0.319562f, 0.265403f, 0.199868f, 0.126987f, 0.048878f, -0.032648f, -0.114915f, -0.195782f, -0.273182f, -0.342322f, -0.396309f, -0.431191f, -0.448778f, -0.453935f, -0.450961f, -0.442889f, -0.431917f, -0.419114f, -0.404570f, -0.388255f, -0.370115f, -0.349678f, -0.326644f, -0.301721f, -0.276201f, -0.251220f, -0.227989f, -0.207822f, -0.191043f, -0.176530f, -0.162962f, -0.149778f, -0.136591f, -0.122722f, -0.107799f, -0.091935f, -0.075014f, -0.056648f, -0.036913f, -0.016138f, 0.005944f, 0.029814f, 0.055061f, 0.080836f, 0.107214f, 0.134806f, 0.163054f, 0.190286f, 0.215551f, 0.238967f, 0.259885f, 0.276238f, 0.286705f, 0.292383f, 0.294992f, 0.294208f, 0.288458f, 0.278037f, 0.265391f, 0.251792f, 0.235652f, 0.215265f, 0.191614f, 0.166954f, 0.141873f, 0.115571f, 0.088358f, 0.062140f, 0.038532f, + 0.017724f, -0.000836f, -0.017500f, -0.032211f, -0.044805f, -0.055481f, -0.064916f, -0.073629f, -0.081559f, -0.088826f, -0.096406f, -0.105164f, -0.114511f, -0.122871f, -0.129287f, -0.134060f, -0.138257f, -0.143042f, -0.148807f, -0.154441f, -0.158070f, -0.158906f, -0.157915f, -0.156673f, -0.156277f, -0.157153f, -0.158912f, -0.160379f, -0.160516f, -0.159249f, -0.156964f, -0.153673f, -0.149149f, -0.143200f, -0.135383f, -0.125140f, -0.112610f, -0.098657f, -0.084044f, -0.069283f, -0.055081f, -0.042021f, -0.030039f, -0.019014f, -0.009440f, -0.001841f, 0.003841f, 0.007710f, 0.009630f, 0.009945f, 0.009536f, 0.008864f, 0.007876f, 0.006845f, 0.006260f, 0.006131f, 0.006419f, 0.007674f, 0.010369f, 0.014373f, 0.019846f, 0.027504f, 0.037346f, 0.048440f, 0.060307f, 0.073056f, 0.086098f, 0.098456f, 0.110125f, 0.121485f, 0.132067f, 0.141513f, 0.150626f, 0.159945f, 0.168818f, 0.177104f, 0.185774f, 0.194992f, 0.203954f, 0.212873f, 0.222383f, 0.231384f, 0.238515f, 0.244594f, 0.250498f, 0.254857f, 0.256981f, 0.258841f, 0.261200f, 0.262096f, 0.261400f, 0.261397f, 0.261615f, 0.259828f, 0.257747f, 0.257682f, + 0.256474f, 0.252253f, 0.250769f, 0.253635f, 0.251629f, 0.243566f, 0.243777f, 0.253044f, 0.249024f, 0.229975f, 0.229614f, 0.251308f, 0.237376f, 0.164020f, 0.115660f, 0.179182f, 0.302935f, 0.361288f, 0.332595f, 0.300984f, 0.297187f, 0.266515f, 0.205485f, 0.199320f, 0.282776f, 0.373785f, 0.395770f, 0.375092f, 0.369258f, 0.379275f, 0.378846f, 0.358644f, 0.304226f, 0.203779f, 0.113276f, 0.133067f, 0.271506f, 0.405312f, 0.429713f, 0.382366f, 0.361258f, 0.383739f, 0.398504f, 0.388066f, 0.377952f, 0.369700f, 0.341555f, 0.307263f}, + {-0.022217f, -0.015375f, -0.018397f, -0.035300f, -0.046690f, -0.037732f, -0.022017f, -0.019869f, -0.019459f, 0.017327f, 0.102816f, 0.194710f, 0.234177f, 0.204599f, 0.138417f, 0.071733f, 0.010515f, -0.056797f, -0.132305f, -0.206318f, -0.271841f, -0.327874f, -0.371103f, -0.395052f, -0.398096f, -0.384964f, -0.359169f, -0.319562f, -0.265403f, -0.199868f, -0.126987f, -0.048878f, 0.032648f, 0.114915f, 0.195782f, 0.273182f, 0.342322f, 0.396309f, 0.431191f, 0.448778f, 0.453935f, 0.450961f, 0.442889f, 0.431917f, 0.419114f, 0.404570f, 0.388255f, 0.370115f, 0.349678f, 0.326644f, 0.301721f, 0.276201f, 0.251220f, 0.227989f, 0.207822f, 0.191043f, 0.176530f, 0.162962f, 0.149778f, 0.136591f, 0.122722f, 0.107799f, 0.091935f, 0.075014f, 0.056648f, 0.036913f, 0.016138f, -0.005944f, -0.029814f, -0.055061f, -0.080836f, -0.107214f, -0.134806f, -0.163054f, -0.190286f, -0.215551f, -0.238967f, -0.259885f, -0.276238f, -0.286705f, -0.292383f, -0.294992f, -0.294208f, -0.288458f, -0.278037f, -0.265391f, -0.251792f, -0.235652f, -0.215265f, -0.191614f, -0.166954f, -0.141873f, -0.115571f, -0.088358f, -0.062140f, -0.038532f, + -0.017724f, 0.000836f, 0.017500f, 0.032211f, 0.044805f, 0.055481f, 0.064916f, 0.073629f, 0.081559f, 0.088826f, 0.096406f, 0.105164f, 0.114511f, 0.122871f, 0.129287f, 0.134060f, 0.138257f, 0.143042f, 0.148807f, 0.154441f, 0.158070f, 0.158906f, 0.157915f, 0.156673f, 0.156277f, 0.157153f, 0.158912f, 0.160379f, 0.160516f, 0.159249f, 0.156964f, 0.153673f, 0.149149f, 0.143200f, 0.135383f, 0.125140f, 0.112610f, 0.098657f, 0.084044f, 0.069283f, 0.055081f, 0.042021f, 0.030039f, 0.019014f, 0.009440f, 0.001841f, -0.003841f, -0.007710f, -0.009630f, -0.009945f, -0.009536f, -0.008864f, -0.007876f, -0.006845f, -0.006260f, -0.006131f, -0.006419f, -0.007674f, -0.010369f, -0.014373f, -0.019846f, -0.027504f, -0.037346f, -0.048440f, -0.060307f, -0.073056f, -0.086098f, -0.098456f, -0.110125f, -0.121485f, -0.132067f, -0.141513f, -0.150626f, -0.159945f, -0.168818f, -0.177104f, -0.185774f, -0.194992f, -0.203954f, -0.212873f, -0.222383f, -0.231384f, -0.238515f, -0.244594f, -0.250498f, -0.254857f, -0.256981f, -0.258841f, -0.261200f, -0.262096f, -0.261400f, -0.261397f, -0.261615f, -0.259828f, -0.257747f, -0.257682f, + -0.256474f, -0.252253f, -0.250769f, -0.253635f, -0.251629f, -0.243566f, -0.243777f, -0.253044f, -0.249024f, -0.229975f, -0.229614f, -0.251308f, -0.237376f, -0.164020f, -0.115660f, -0.179182f, -0.302935f, -0.361288f, -0.332595f, -0.300984f, -0.297187f, -0.266515f, -0.205485f, -0.199320f, -0.282776f, -0.373785f, -0.395770f, -0.375092f, -0.369258f, -0.379275f, -0.378846f, -0.358644f, -0.304226f, -0.203779f, -0.113276f, -0.133067f, -0.271506f, -0.405312f, -0.429713f, -0.382366f, -0.361258f, -0.383739f, -0.398504f, -0.388066f, -0.377952f, -0.369700f, -0.341555f, -0.307263f} + }, + { + {0.003437f, -0.012198f, -0.001203f, 0.021097f, -0.002466f, -0.043512f, 0.000962f, 0.131262f, 0.193341f, 0.073245f, -0.141155f, -0.268143f, -0.241794f, -0.140847f, -0.054105f, 0.002619f, 0.050716f, 0.099528f, 0.145239f, 0.181794f, 0.200756f, 0.196431f, 0.173654f, 0.142090f, 0.107331f, 0.073891f, 0.048716f, 0.034602f, 0.027293f, 0.024058f, 0.027766f, 0.038832f, 0.050743f, 0.057603f, 0.060423f, 0.063103f, 0.066372f, 0.067205f, 0.061224f, 0.045463f, 0.021062f, -0.007194f, -0.035078f, -0.061177f, -0.084943f, -0.105741f, -0.124709f, -0.144522f, -0.166406f, -0.189512f, -0.213041f, -0.236632f, -0.259187f, -0.279363f, -0.296402f, -0.308917f, -0.314459f, -0.311746f, -0.301536f, -0.284320f, -0.259412f, -0.227155f, -0.189434f, -0.147199f, -0.099925f, -0.048097f, 0.006127f, 0.061017f, 0.115797f, 0.169006f, 0.218343f, 0.262025f, 0.298749f, 0.326845f, 0.345052f, 0.353588f, 0.353173f, 0.343709f, 0.325096f, 0.298746f, 0.267135f, 0.231913f, 0.193115f, 0.150515f, 0.105513f, 0.060953f, 0.018598f, -0.022322f, -0.063041f, -0.102759f, -0.139669f, -0.173357f, -0.204275f, -0.231780f, -0.254700f, -0.272996f, + -0.286913f, -0.295377f, -0.297011f, -0.291997f, -0.281495f, -0.266021f, -0.245380f, -0.219470f, -0.188934f, -0.156137f, -0.125122f, -0.098779f, -0.076246f, -0.054735f, -0.033488f, -0.014413f, 0.000330f, 0.009800f, 0.014374f, 0.015862f, 0.016591f, 0.017377f, 0.017391f, 0.016313f, 0.015068f, 0.014452f, 0.014844f, 0.017137f, 0.022089f, 0.029075f, 0.037043f, 0.045911f, 0.055611f, 0.064990f, 0.073012f, 0.079676f, 0.084818f, 0.087704f, 0.088459f, 0.088069f, 0.086787f, 0.084427f, 0.081841f, 0.080001f, 0.078313f, 0.075848f, 0.073092f, 0.070651f, 0.067838f, 0.064177f, 0.060367f, 0.056565f, 0.051968f, 0.046818f, 0.042330f, 0.038426f, 0.034201f, 0.030169f, 0.027300f, 0.024914f, 0.022225f, 0.020280f, 0.019900f, 0.019979f, 0.019917f, 0.020854f, 0.022870f, 0.024349f, 0.025106f, 0.026471f, 0.028137f, 0.028929f, 0.029895f, 0.032523f, 0.035592f, 0.037737f, 0.040348f, 0.044286f, 0.047546f, 0.049185f, 0.050714f, 0.051542f, 0.048951f, 0.043598f, 0.038299f, 0.031936f, 0.022010f, 0.010903f, 0.001637f, -0.008334f, -0.021151f, -0.033005f, -0.042008f, -0.052364f, -0.064471f, -0.073163f, + -0.079941f, -0.090963f, -0.101864f, -0.105166f, -0.109415f, -0.124289f, -0.135694f, -0.130563f, -0.130580f, -0.154548f, -0.170385f, -0.149105f, -0.139181f, -0.196892f, -0.261751f, -0.216013f, -0.071571f, 0.026285f, 0.005174f, -0.050751f, -0.064299f, -0.081628f, -0.152957f, -0.210051f, -0.161120f, -0.036845f, 0.049592f, 0.047608f, 0.003439f, -0.026155f, -0.042297f, -0.092917f, -0.208966f, -0.338758f, -0.363990f, -0.229119f, -0.040285f, 0.032605f, -0.046756f, -0.151981f, -0.170066f, -0.127443f, -0.110599f, -0.135320f, -0.151985f, -0.135982f, -0.110796f, -0.098463f}, + {-0.003437f, 0.012198f, 0.001203f, -0.021097f, 0.002466f, 0.043512f, -0.000962f, -0.131262f, -0.193341f, -0.073245f, 0.141155f, 0.268143f, 0.241794f, 0.140847f, 0.054105f, -0.002619f, -0.050716f, -0.099528f, -0.145239f, -0.181794f, -0.200756f, -0.196431f, -0.173654f, -0.142090f, -0.107331f, -0.073891f, -0.048716f, -0.034602f, -0.027293f, -0.024058f, -0.027766f, -0.038832f, -0.050743f, -0.057603f, -0.060423f, -0.063103f, -0.066372f, -0.067205f, -0.061224f, -0.045463f, -0.021062f, 0.007194f, 0.035078f, 0.061177f, 0.084943f, 0.105741f, 0.124709f, 0.144522f, 0.166406f, 0.189512f, 0.213041f, 0.236632f, 0.259187f, 0.279363f, 0.296402f, 0.308917f, 0.314459f, 0.311746f, 0.301536f, 0.284320f, 0.259412f, 0.227155f, 0.189434f, 0.147199f, 0.099925f, 0.048097f, -0.006127f, -0.061017f, -0.115797f, -0.169006f, -0.218343f, -0.262025f, -0.298749f, -0.326845f, -0.345052f, -0.353588f, -0.353173f, -0.343709f, -0.325096f, -0.298746f, -0.267135f, -0.231913f, -0.193115f, -0.150515f, -0.105513f, -0.060953f, -0.018598f, 0.022322f, 0.063041f, 0.102759f, 0.139669f, 0.173357f, 0.204275f, 0.231780f, 0.254700f, 0.272996f, + 0.286913f, 0.295377f, 0.297011f, 0.291997f, 0.281495f, 0.266021f, 0.245380f, 0.219470f, 0.188934f, 0.156137f, 0.125122f, 0.098779f, 0.076246f, 0.054735f, 0.033488f, 0.014413f, -0.000330f, -0.009800f, -0.014374f, -0.015862f, -0.016591f, -0.017377f, -0.017391f, -0.016313f, -0.015068f, -0.014452f, -0.014844f, -0.017137f, -0.022089f, -0.029075f, -0.037043f, -0.045911f, -0.055611f, -0.064990f, -0.073012f, -0.079676f, -0.084818f, -0.087704f, -0.088459f, -0.088069f, -0.086787f, -0.084427f, -0.081841f, -0.080001f, -0.078313f, -0.075848f, -0.073092f, -0.070651f, -0.067838f, -0.064177f, -0.060367f, -0.056565f, -0.051968f, -0.046818f, -0.042330f, -0.038426f, -0.034201f, -0.030169f, -0.027300f, -0.024914f, -0.022225f, -0.020280f, -0.019900f, -0.019979f, -0.019917f, -0.020854f, -0.022870f, -0.024349f, -0.025106f, -0.026471f, -0.028137f, -0.028929f, -0.029895f, -0.032523f, -0.035592f, -0.037737f, -0.040348f, -0.044286f, -0.047546f, -0.049185f, -0.050714f, -0.051542f, -0.048951f, -0.043598f, -0.038299f, -0.031936f, -0.022010f, -0.010903f, -0.001637f, 0.008334f, 0.021151f, 0.033005f, 0.042008f, 0.052364f, 0.064471f, 0.073163f, + 0.079941f, 0.090963f, 0.101864f, 0.105166f, 0.109415f, 0.124289f, 0.135694f, 0.130563f, 0.130580f, 0.154548f, 0.170385f, 0.149105f, 0.139181f, 0.196892f, 0.261751f, 0.216013f, 0.071571f, -0.026285f, -0.005174f, 0.050751f, 0.064299f, 0.081628f, 0.152957f, 0.210051f, 0.161120f, 0.036845f, -0.049592f, -0.047608f, -0.003439f, 0.026155f, 0.042297f, 0.092917f, 0.208966f, 0.338758f, 0.363990f, 0.229119f, 0.040285f, -0.032605f, 0.046756f, 0.151981f, 0.170066f, 0.127443f, 0.110599f, 0.135320f, 0.151985f, 0.135982f, 0.110796f, 0.098463f} + }, + { + {-0.013125f, -0.012286f, -0.029270f, -0.061330f, -0.081694f, -0.084134f, -0.091685f, -0.102795f, -0.065219f, 0.061788f, 0.237540f, 0.366702f, 0.391070f, 0.329203f, 0.231539f, 0.128665f, 0.030035f, -0.055797f, -0.120914f, -0.167779f, -0.204453f, -0.233321f, -0.251764f, -0.259124f, -0.256054f, -0.240951f, -0.214156f, -0.184034f, -0.162756f, -0.155363f, -0.156163f, -0.155957f, -0.150073f, -0.139152f, -0.125066f, -0.108295f, -0.088604f, -0.066285f, -0.041833f, -0.015371f, 0.012408f, 0.039073f, 0.061555f, 0.078734f, 0.092119f, 0.103815f, 0.114599f, 0.124104f, 0.131882f, 0.137736f, 0.141533f, 0.143131f, 0.142328f, 0.138733f, 0.131953f, 0.122040f, 0.109684f, 0.095975f, 0.082044f, 0.068749f, 0.056557f, 0.045720f, 0.036579f, 0.029561f, 0.024955f, 0.022883f, 0.023595f, 0.027669f, 0.035746f, 0.048030f, 0.064154f, 0.083701f, 0.106779f, 0.133727f, 0.164258f, 0.197388f, 0.232365f, 0.269041f, 0.306917f, 0.344448f, 0.379910f, 0.412508f, 0.441996f, 0.467563f, 0.487862f, 0.502016f, 0.509982f, 0.512033f, 0.508380f, 0.499122f, 0.483934f, 0.461848f, 0.432088f, 0.395456f, 0.354502f, 0.311899f, + 0.268761f, 0.224882f, 0.180662f, 0.138577f, 0.102422f, 0.074928f, 0.056036f, 0.043532f, 0.035361f, 0.031276f, 0.032342f, 0.039114f, 0.050516f, 0.064273f, 0.078040f, 0.090120f, 0.099605f, 0.106269f, 0.110292f, 0.111800f, 0.110505f, 0.105782f, 0.097125f, 0.084634f, 0.069175f, 0.052019f, 0.034230f, 0.016325f, -0.001585f, -0.019467f, -0.037208f, -0.054624f, -0.071625f, -0.088455f, -0.105611f, -0.123311f, -0.141167f, -0.158623f, -0.175578f, -0.192349f, -0.209294f, -0.226791f, -0.245271f, -0.264788f, -0.284670f, -0.303913f, -0.321795f, -0.337907f, -0.351875f, -0.363338f, -0.372063f, -0.377966f, -0.381198f, -0.382224f, -0.381582f, -0.379626f, -0.376697f, -0.373288f, -0.369744f, -0.366057f, -0.362215f, -0.358447f, -0.354924f, -0.351586f, -0.348440f, -0.345609f, -0.342984f, -0.340226f, -0.337164f, -0.333840f, -0.330365f, -0.327079f, -0.324467f, -0.322570f, -0.320900f, -0.319189f, -0.317555f, -0.315784f, -0.313305f, -0.309987f, -0.306067f, -0.301378f, -0.295609f, -0.289009f, -0.281841f, -0.273722f, -0.264499f, -0.254839f, -0.245040f, -0.234614f, -0.223819f, -0.213828f, -0.204802f, -0.195896f, -0.187327f, -0.179883f, + -0.172843f, -0.165369f, -0.158571f, -0.152828f, -0.145851f, -0.137397f, -0.131226f, -0.127613f, -0.121187f, -0.112221f, -0.109209f, -0.111868f, -0.106951f, -0.093814f, -0.094519f, -0.118779f, -0.140589f, -0.136582f, -0.124286f, -0.127257f, -0.127194f, -0.098697f, -0.071650f, -0.098895f, -0.168848f, -0.212657f, -0.201109f, -0.174379f, -0.169160f, -0.176945f, -0.183912f, -0.189724f, -0.175821f, -0.122967f, -0.075644f, -0.113343f, -0.231230f, -0.325873f, -0.333768f, -0.305146f, -0.299949f, -0.300130f, -0.283939f, -0.290832f, -0.324013f, -0.278523f, -0.090004f, 0.105839f}, + {-0.013125f, -0.012286f, -0.029270f, -0.061330f, -0.081694f, -0.084134f, -0.091685f, -0.102795f, -0.065219f, 0.061788f, 0.237540f, 0.366702f, 0.391070f, 0.329203f, 0.231539f, 0.128665f, 0.030035f, -0.055797f, -0.120914f, -0.167779f, -0.204453f, -0.233321f, -0.251764f, -0.259124f, -0.256054f, -0.240951f, -0.214156f, -0.184034f, -0.162756f, -0.155363f, -0.156163f, -0.155957f, -0.150073f, -0.139152f, -0.125066f, -0.108295f, -0.088604f, -0.066285f, -0.041833f, -0.015371f, 0.012408f, 0.039073f, 0.061555f, 0.078734f, 0.092119f, 0.103815f, 0.114599f, 0.124104f, 0.131882f, 0.137736f, 0.141533f, 0.143131f, 0.142328f, 0.138733f, 0.131953f, 0.122040f, 0.109684f, 0.095975f, 0.082044f, 0.068749f, 0.056557f, 0.045720f, 0.036579f, 0.029561f, 0.024955f, 0.022883f, 0.023595f, 0.027669f, 0.035746f, 0.048030f, 0.064154f, 0.083701f, 0.106779f, 0.133727f, 0.164258f, 0.197388f, 0.232365f, 0.269041f, 0.306917f, 0.344448f, 0.379910f, 0.412508f, 0.441996f, 0.467563f, 0.487862f, 0.502016f, 0.509982f, 0.512033f, 0.508380f, 0.499122f, 0.483934f, 0.461848f, 0.432088f, 0.395456f, 0.354502f, 0.311899f, + 0.268761f, 0.224882f, 0.180662f, 0.138577f, 0.102422f, 0.074928f, 0.056036f, 0.043532f, 0.035361f, 0.031276f, 0.032342f, 0.039114f, 0.050516f, 0.064273f, 0.078040f, 0.090120f, 0.099605f, 0.106269f, 0.110292f, 0.111800f, 0.110505f, 0.105782f, 0.097125f, 0.084634f, 0.069175f, 0.052019f, 0.034230f, 0.016325f, -0.001585f, -0.019467f, -0.037208f, -0.054624f, -0.071625f, -0.088455f, -0.105611f, -0.123311f, -0.141167f, -0.158623f, -0.175578f, -0.192349f, -0.209294f, -0.226791f, -0.245271f, -0.264788f, -0.284670f, -0.303913f, -0.321795f, -0.337907f, -0.351875f, -0.363338f, -0.372063f, -0.377966f, -0.381198f, -0.382224f, -0.381582f, -0.379626f, -0.376697f, -0.373288f, -0.369744f, -0.366057f, -0.362215f, -0.358447f, -0.354924f, -0.351586f, -0.348440f, -0.345609f, -0.342984f, -0.340226f, -0.337164f, -0.333840f, -0.330365f, -0.327079f, -0.324467f, -0.322570f, -0.320900f, -0.319189f, -0.317555f, -0.315784f, -0.313305f, -0.309987f, -0.306067f, -0.301378f, -0.295609f, -0.289009f, -0.281841f, -0.273722f, -0.264499f, -0.254839f, -0.245040f, -0.234614f, -0.223819f, -0.213828f, -0.204802f, -0.195896f, -0.187327f, -0.179883f, + -0.172843f, -0.165369f, -0.158571f, -0.152828f, -0.145851f, -0.137397f, -0.131226f, -0.127613f, -0.121187f, -0.112221f, -0.109209f, -0.111868f, -0.106951f, -0.093814f, -0.094519f, -0.118779f, -0.140589f, -0.136582f, -0.124286f, -0.127257f, -0.127194f, -0.098697f, -0.071650f, -0.098895f, -0.168848f, -0.212657f, -0.201109f, -0.174379f, -0.169160f, -0.176945f, -0.183912f, -0.189724f, -0.175821f, -0.122967f, -0.075644f, -0.113343f, -0.231230f, -0.325873f, -0.333768f, -0.305146f, -0.299949f, -0.300130f, -0.283939f, -0.290832f, -0.324013f, -0.278523f, -0.090004f, 0.105839f} + }, + { + {0.050610f, -0.021351f, -0.100660f, -0.104774f, -0.001476f, 0.148669f, 0.225308f, 0.152954f, -0.017164f, -0.150555f, -0.164165f, -0.095774f, -0.032833f, -0.010556f, -0.007376f, -0.005342f, -0.006979f, -0.005520f, 0.015106f, 0.047669f, 0.063520f, 0.053315f, 0.039601f, 0.043141f, 0.059336f, 0.074668f, 0.086926f, 0.099752f, 0.110453f, 0.112472f, 0.103586f, 0.087024f, 0.068584f, 0.053729f, 0.043401f, 0.032419f, 0.014740f, -0.010636f, -0.040573f, -0.071513f, -0.100005f, -0.122661f, -0.138393f, -0.148847f, -0.155444f, -0.158100f, -0.157286f, -0.154654f, -0.151141f, -0.146642f, -0.141589f, -0.136794f, -0.132018f, -0.126472f, -0.120197f, -0.113478f, -0.105693f, -0.096136f, -0.085272f, -0.074193f, -0.063578f, -0.053837f, -0.045575f, -0.039450f, -0.035848f, -0.034577f, -0.034666f, -0.035080f, -0.035819f, -0.037340f, -0.038869f, -0.038729f, -0.036395f, -0.032558f, -0.026954f, -0.017828f, -0.003894f, 0.014663f, 0.037307f, 0.063972f, 0.094584f, 0.128616f, 0.164960f, 0.201947f, 0.238243f, 0.273778f, 0.308471f, 0.340250f, 0.366585f, 0.388241f, 0.408822f, 0.429564f, 0.446929f, 0.456648f, 0.458222f, 0.454015f, + 0.445283f, 0.430644f, 0.408172f, 0.378082f, 0.342964f, 0.305191f, 0.264513f, 0.219134f, 0.169076f, 0.117258f, 0.067008f, 0.019484f, -0.026357f, -0.072188f, -0.118578f, -0.163875f, -0.204958f, -0.239778f, -0.268783f, -0.293465f, -0.314413f, -0.331340f, -0.343971f, -0.352262f, -0.356602f, -0.358148f, -0.358147f, -0.356868f, -0.354035f, -0.349981f, -0.345415f, -0.340428f, -0.334505f, -0.326935f, -0.316753f, -0.303400f, -0.288003f, -0.272824f, -0.259031f, -0.246114f, -0.233327f, -0.220114f, -0.205519f, -0.189122f, -0.172346f, -0.157167f, -0.143959f, -0.132013f, -0.121111f, -0.111003f, -0.100614f, -0.089445f, -0.078639f, -0.069419f, -0.061736f, -0.055228f, -0.049885f, -0.045103f, -0.039720f, -0.033390f, -0.026593f, -0.019544f, -0.012457f, -0.006080f, -0.000606f, 0.004882f, 0.010838f, 0.016694f, 0.022579f, 0.029413f, 0.036726f, 0.042841f, 0.047462f, 0.051547f, 0.054909f, 0.056743f, 0.057750f, 0.058983f, 0.059835f, 0.059730f, 0.059790f, 0.060557f, 0.060792f, 0.060463f, 0.061464f, 0.063958f, 0.066147f, 0.068356f, 0.072542f, 0.077895f, 0.082279f, 0.086766f, 0.093073f, 0.099166f, 0.103431f, 0.108681f, + 0.115924f, 0.120958f, 0.123369f, 0.129092f, 0.137670f, 0.140558f, 0.138996f, 0.145136f, 0.157044f, 0.157137f, 0.147369f, 0.154619f, 0.181695f, 0.189239f, 0.157222f, 0.128976f, 0.151684f, 0.202074f, 0.221839f, 0.206540f, 0.201774f, 0.218344f, 0.212651f, 0.164038f, 0.118748f, 0.127617f, 0.174253f, 0.199599f, 0.180895f, 0.151327f, 0.140967f, 0.129460f, 0.078567f, -0.000953f, -0.044718f, -0.008185f, 0.074463f, 0.126113f, 0.114079f, 0.078761f, 0.073555f, 0.099683f, 0.115917f, 0.100920f, 0.084812f, 0.112488f, 0.184986f, 0.249040f}, + {0.050610f, -0.021351f, -0.100660f, -0.104774f, -0.001476f, 0.148669f, 0.225308f, 0.152954f, -0.017164f, -0.150555f, -0.164165f, -0.095774f, -0.032833f, -0.010556f, -0.007376f, -0.005342f, -0.006979f, -0.005520f, 0.015106f, 0.047669f, 0.063520f, 0.053315f, 0.039601f, 0.043141f, 0.059336f, 0.074668f, 0.086926f, 0.099752f, 0.110453f, 0.112472f, 0.103586f, 0.087024f, 0.068584f, 0.053729f, 0.043401f, 0.032419f, 0.014740f, -0.010636f, -0.040573f, -0.071513f, -0.100005f, -0.122661f, -0.138393f, -0.148847f, -0.155444f, -0.158100f, -0.157286f, -0.154654f, -0.151141f, -0.146642f, -0.141589f, -0.136794f, -0.132018f, -0.126472f, -0.120197f, -0.113478f, -0.105693f, -0.096136f, -0.085272f, -0.074193f, -0.063578f, -0.053837f, -0.045575f, -0.039450f, -0.035848f, -0.034577f, -0.034666f, -0.035080f, -0.035819f, -0.037340f, -0.038869f, -0.038729f, -0.036395f, -0.032558f, -0.026954f, -0.017828f, -0.003894f, 0.014663f, 0.037307f, 0.063972f, 0.094584f, 0.128616f, 0.164960f, 0.201947f, 0.238243f, 0.273778f, 0.308471f, 0.340250f, 0.366585f, 0.388241f, 0.408822f, 0.429564f, 0.446929f, 0.456648f, 0.458222f, 0.454015f, + 0.445283f, 0.430644f, 0.408172f, 0.378082f, 0.342964f, 0.305191f, 0.264513f, 0.219134f, 0.169076f, 0.117258f, 0.067008f, 0.019484f, -0.026357f, -0.072188f, -0.118578f, -0.163875f, -0.204958f, -0.239778f, -0.268783f, -0.293465f, -0.314413f, -0.331340f, -0.343971f, -0.352262f, -0.356602f, -0.358148f, -0.358147f, -0.356868f, -0.354035f, -0.349981f, -0.345415f, -0.340428f, -0.334505f, -0.326935f, -0.316753f, -0.303400f, -0.288003f, -0.272824f, -0.259031f, -0.246114f, -0.233327f, -0.220114f, -0.205519f, -0.189122f, -0.172346f, -0.157167f, -0.143959f, -0.132013f, -0.121111f, -0.111003f, -0.100614f, -0.089445f, -0.078639f, -0.069419f, -0.061736f, -0.055228f, -0.049885f, -0.045103f, -0.039720f, -0.033390f, -0.026593f, -0.019544f, -0.012457f, -0.006080f, -0.000606f, 0.004882f, 0.010838f, 0.016694f, 0.022579f, 0.029413f, 0.036726f, 0.042841f, 0.047462f, 0.051547f, 0.054909f, 0.056743f, 0.057750f, 0.058983f, 0.059835f, 0.059730f, 0.059790f, 0.060557f, 0.060792f, 0.060463f, 0.061464f, 0.063958f, 0.066147f, 0.068356f, 0.072542f, 0.077895f, 0.082279f, 0.086766f, 0.093073f, 0.099166f, 0.103431f, 0.108681f, + 0.115924f, 0.120958f, 0.123369f, 0.129092f, 0.137670f, 0.140558f, 0.138996f, 0.145136f, 0.157044f, 0.157137f, 0.147369f, 0.154619f, 0.181695f, 0.189239f, 0.157222f, 0.128976f, 0.151684f, 0.202074f, 0.221839f, 0.206540f, 0.201774f, 0.218344f, 0.212651f, 0.164038f, 0.118748f, 0.127617f, 0.174253f, 0.199599f, 0.180895f, 0.151327f, 0.140967f, 0.129460f, 0.078567f, -0.000953f, -0.044718f, -0.008185f, 0.074463f, 0.126113f, 0.114079f, 0.078761f, 0.073555f, 0.099683f, 0.115917f, 0.100920f, 0.084812f, 0.112488f, 0.184986f, 0.249040f} + }, + { + {-0.007259f, 0.065962f, 0.096309f, 0.006203f, -0.159743f, -0.308935f, -0.381128f, -0.338419f, -0.157384f, 0.121690f, 0.390091f, 0.561354f, 0.636734f, 0.654536f, 0.616285f, 0.502886f, 0.333745f, 0.163082f, 0.024174f, -0.091879f, -0.205022f, -0.317570f, -0.417716f, -0.495244f, -0.549209f, -0.586773f, -0.616327f, -0.639690f, -0.652018f, -0.649196f, -0.631826f, -0.601837f, -0.559630f, -0.505851f, -0.442897f, -0.373591f, -0.300236f, -0.225238f, -0.151321f, -0.081172f, -0.017263f, 0.039030f, 0.088587f, 0.133536f, 0.174581f, 0.210389f, 0.239635f, 0.262423f, 0.279828f, 0.293433f, 0.305269f, 0.316863f, 0.328072f, 0.337528f, 0.344140f, 0.347611f, 0.347874f, 0.344828f, 0.338652f, 0.329942f, 0.319435f, 0.307658f, 0.294798f, 0.280926f, 0.266291f, 0.251209f, 0.235746f, 0.219931f, 0.204222f, 0.189273f, 0.175236f, 0.161855f, 0.149231f, 0.137841f, 0.127719f, 0.118342f, 0.109578f, 0.102141f, 0.096648f, 0.092633f, 0.088918f, 0.084709f, 0.079908f, 0.074514f, 0.068253f, 0.061036f, 0.053526f, 0.046953f, 0.042328f, 0.039859f, 0.039087f, 0.039576f, 0.041346f, 0.044345f, 0.047321f, 0.047623f, + 0.042687f, 0.031837f, 0.016339f, -0.002376f, -0.024180f, -0.049770f, -0.078870f, -0.109212f, -0.137584f, -0.161947f, -0.182317f, -0.199471f, -0.213209f, -0.222271f, -0.225693f, -0.223821f, -0.218155f, -0.210460f, -0.201796f, -0.192062f, -0.180645f, -0.167638f, -0.154215f, -0.141821f, -0.131276f, -0.122438f, -0.114188f, -0.104943f, -0.093887f, -0.081673f, -0.069541f, -0.058028f, -0.046937f, -0.035989f, -0.024863f, -0.013051f, -0.000327f, 0.012968f, 0.026458f, 0.040102f, 0.053835f, 0.067424f, 0.080870f, 0.094376f, 0.107841f, 0.120849f, 0.133049f, 0.144070f, 0.153324f, 0.160345f, 0.165072f, 0.167561f, 0.167875f, 0.166359f, 0.163402f, 0.158903f, 0.152585f, 0.144627f, 0.135297f, 0.124447f, 0.112145f, 0.099225f, 0.086451f, 0.073867f, 0.061586f, 0.050227f, 0.039978f, 0.030333f, 0.021214f, 0.013255f, 0.006789f, 0.001699f, -0.001887f, -0.003958f, -0.005254f, -0.006402f, -0.007235f, -0.007883f, -0.009180f, -0.011060f, -0.012189f, -0.011989f, -0.011177f, -0.009936f, -0.007788f, -0.005316f, -0.003617f, -0.002436f, -0.001133f, -0.000357f, -0.000436f, -0.000049f, 0.001324f, 0.002343f, 0.002892f, 0.004473f, + 0.006454f, 0.006882f, 0.007116f, 0.009391f, 0.011036f, 0.009231f, 0.008488f, 0.012900f, 0.016080f, 0.012730f, 0.012822f, 0.025048f, 0.034679f, 0.024410f, 0.011274f, 0.029631f, 0.076704f, 0.110326f, 0.108291f, 0.095726f, 0.100643f, 0.113980f, 0.112557f, 0.097168f, 0.087042f, 0.092041f, 0.107251f, 0.124685f, 0.138049f, 0.143937f, 0.145917f, 0.147885f, 0.136336f, 0.082786f, -0.018275f, -0.118932f, -0.151821f, -0.107798f, -0.055208f, -0.053504f, -0.072264f, -0.048152f, -0.003743f, -0.018576f, -0.062348f, 0.027201f, 0.312207f, 0.589094f}, + {-0.007259f, 0.065962f, 0.096309f, 0.006203f, -0.159743f, -0.308935f, -0.381128f, -0.338419f, -0.157384f, 0.121690f, 0.390091f, 0.561354f, 0.636734f, 0.654536f, 0.616285f, 0.502886f, 0.333745f, 0.163082f, 0.024174f, -0.091879f, -0.205022f, -0.317570f, -0.417716f, -0.495244f, -0.549209f, -0.586773f, -0.616327f, -0.639690f, -0.652018f, -0.649196f, -0.631826f, -0.601837f, -0.559630f, -0.505851f, -0.442897f, -0.373591f, -0.300236f, -0.225238f, -0.151321f, -0.081172f, -0.017263f, 0.039030f, 0.088587f, 0.133536f, 0.174581f, 0.210389f, 0.239635f, 0.262423f, 0.279828f, 0.293433f, 0.305269f, 0.316863f, 0.328072f, 0.337528f, 0.344140f, 0.347611f, 0.347874f, 0.344828f, 0.338652f, 0.329942f, 0.319435f, 0.307658f, 0.294798f, 0.280926f, 0.266291f, 0.251209f, 0.235746f, 0.219931f, 0.204222f, 0.189273f, 0.175236f, 0.161855f, 0.149231f, 0.137841f, 0.127719f, 0.118342f, 0.109578f, 0.102141f, 0.096648f, 0.092633f, 0.088918f, 0.084709f, 0.079908f, 0.074514f, 0.068253f, 0.061036f, 0.053526f, 0.046953f, 0.042328f, 0.039859f, 0.039087f, 0.039576f, 0.041346f, 0.044345f, 0.047321f, 0.047623f, + 0.042687f, 0.031837f, 0.016339f, -0.002376f, -0.024180f, -0.049770f, -0.078870f, -0.109212f, -0.137584f, -0.161947f, -0.182317f, -0.199471f, -0.213209f, -0.222271f, -0.225693f, -0.223821f, -0.218155f, -0.210460f, -0.201796f, -0.192062f, -0.180645f, -0.167638f, -0.154215f, -0.141821f, -0.131276f, -0.122438f, -0.114188f, -0.104943f, -0.093887f, -0.081673f, -0.069541f, -0.058028f, -0.046937f, -0.035989f, -0.024863f, -0.013051f, -0.000327f, 0.012968f, 0.026458f, 0.040102f, 0.053835f, 0.067424f, 0.080870f, 0.094376f, 0.107841f, 0.120849f, 0.133049f, 0.144070f, 0.153324f, 0.160345f, 0.165072f, 0.167561f, 0.167875f, 0.166359f, 0.163402f, 0.158903f, 0.152585f, 0.144627f, 0.135297f, 0.124447f, 0.112145f, 0.099225f, 0.086451f, 0.073867f, 0.061586f, 0.050227f, 0.039978f, 0.030333f, 0.021214f, 0.013255f, 0.006789f, 0.001699f, -0.001887f, -0.003958f, -0.005254f, -0.006402f, -0.007235f, -0.007883f, -0.009180f, -0.011060f, -0.012189f, -0.011989f, -0.011177f, -0.009936f, -0.007788f, -0.005316f, -0.003617f, -0.002436f, -0.001133f, -0.000357f, -0.000436f, -0.000049f, 0.001324f, 0.002343f, 0.002892f, 0.004473f, + 0.006454f, 0.006882f, 0.007116f, 0.009391f, 0.011036f, 0.009231f, 0.008488f, 0.012900f, 0.016080f, 0.012730f, 0.012822f, 0.025048f, 0.034679f, 0.024410f, 0.011274f, 0.029631f, 0.076704f, 0.110326f, 0.108291f, 0.095726f, 0.100643f, 0.113980f, 0.112557f, 0.097168f, 0.087042f, 0.092041f, 0.107251f, 0.124685f, 0.138049f, 0.143937f, 0.145917f, 0.147885f, 0.136336f, 0.082786f, -0.018275f, -0.118932f, -0.151821f, -0.107798f, -0.055208f, -0.053504f, -0.072264f, -0.048152f, -0.003743f, -0.018576f, -0.062348f, 0.027201f, 0.312207f, 0.589094f} + } +}; +const float CRendBin_HOA2_HRIR_coeff_im_48kHz[9][BINAURAL_CHANNELS][240]={ + { + {-0.279578f, -0.717721f, -0.877611f, -0.774906f, -0.535062f, -0.269989f, -0.021067f, 0.209874f, 0.413226f, 0.563225f, 0.637276f, 0.629373f, 0.548884f, 0.414833f, 0.250811f, 0.079096f, -0.084627f, -0.232375f, -0.360791f, -0.467119f, -0.547631f, -0.599855f, -0.625984f, -0.632346f, -0.624188f, -0.602062f, -0.564595f, -0.513530f, -0.454080f, -0.391123f, -0.327168f, -0.263808f, -0.202953f, -0.145944f, -0.092780f, -0.042980f, 0.003472f, 0.046452f, 0.086451f, 0.124553f, 0.161794f, 0.198667f, 0.235068f, 0.270617f, 0.305017f, 0.338134f, 0.369878f, 0.400174f, 0.429020f, 0.456378f, 0.482018f, 0.505631f, 0.527097f, 0.546486f, 0.563827f, 0.579121f, 0.592594f, 0.604726f, 0.615911f, 0.626238f, 0.635705f, 0.644462f, 0.652664f, 0.660229f, 0.667010f, 0.673113f, 0.678788f, 0.684082f, 0.688924f, 0.693472f, 0.698001f, 0.702510f, 0.706806f, 0.710936f, 0.715101f, 0.719195f, 0.722909f, 0.726269f, 0.729530f, 0.732512f, 0.734617f, 0.735606f, 0.735863f, 0.735678f, 0.734755f, 0.732698f, 0.729673f, 0.726255f, 0.722712f, 0.718664f, 0.713561f, 0.707417f, 0.700900f, 0.694611f, 0.688481f, 0.682146f, + 0.675755f, 0.670059f, 0.665672f, 0.662528f, 0.660105f, 0.658010f, 0.656294f, 0.655275f, 0.655042f, 0.655135f, 0.654860f, 0.653870f, 0.652278f, 0.650245f, 0.647706f, 0.644488f, 0.640451f, 0.635518f, 0.629758f, 0.623449f, 0.616889f, 0.610232f, 0.603544f, 0.596898f, 0.590297f, 0.583682f, 0.577056f, 0.570442f, 0.563736f, 0.556801f, 0.549678f, 0.542492f, 0.535279f, 0.528093f, 0.521154f, 0.514648f, 0.508527f, 0.502690f, 0.497140f, 0.491836f, 0.486633f, 0.481501f, 0.476572f, 0.471906f, 0.467418f, 0.463039f, 0.458686f, 0.454164f, 0.449331f, 0.444241f, 0.438935f, 0.433317f, 0.427381f, 0.421288f, 0.415067f, 0.408572f, 0.401819f, 0.394993f, 0.388100f, 0.381032f, 0.373904f, 0.366955f, 0.360223f, 0.353709f, 0.347609f, 0.342029f, 0.336786f, 0.331780f, 0.327133f, 0.322727f, 0.318173f, 0.313407f, 0.308724f, 0.304155f, 0.299488f, 0.294851f, 0.290528f, 0.286392f, 0.282213f, 0.278211f, 0.274620f, 0.271203f, 0.267853f, 0.264940f, 0.262515f, 0.260046f, 0.257391f, 0.254933f, 0.252512f, 0.249509f, 0.246067f, 0.242749f, 0.239216f, 0.234883f, 0.230316f, 0.226146f, + 0.221603f, 0.216109f, 0.210802f, 0.206272f, 0.200974f, 0.194324f, 0.188446f, 0.183987f, 0.178038f, 0.169726f, 0.163182f, 0.160324f, 0.155860f, 0.145447f, 0.133826f, 0.127980f, 0.126532f, 0.122924f, 0.114883f, 0.103866f, 0.090500f, 0.079053f, 0.080753f, 0.100935f, 0.125261f, 0.130967f, 0.113407f, 0.091776f, 0.085866f, 0.095550f, 0.107946f, 0.118310f, 0.135431f, 0.165381f, 0.195627f, 0.202054f, 0.174034f, 0.127848f, 0.089951f, 0.070123f, 0.058538f, 0.046398f, 0.036783f, 0.032164f, 0.024778f, 0.009249f, -0.004637f, -0.004463f}, + {-0.279578f, -0.717721f, -0.877611f, -0.774906f, -0.535062f, -0.269989f, -0.021067f, 0.209874f, 0.413226f, 0.563225f, 0.637276f, 0.629373f, 0.548884f, 0.414833f, 0.250811f, 0.079096f, -0.084627f, -0.232375f, -0.360791f, -0.467119f, -0.547631f, -0.599855f, -0.625984f, -0.632346f, -0.624188f, -0.602062f, -0.564595f, -0.513530f, -0.454080f, -0.391123f, -0.327168f, -0.263808f, -0.202953f, -0.145944f, -0.092780f, -0.042980f, 0.003472f, 0.046452f, 0.086451f, 0.124553f, 0.161794f, 0.198667f, 0.235068f, 0.270617f, 0.305017f, 0.338134f, 0.369878f, 0.400174f, 0.429020f, 0.456378f, 0.482018f, 0.505631f, 0.527097f, 0.546486f, 0.563827f, 0.579121f, 0.592594f, 0.604726f, 0.615911f, 0.626238f, 0.635705f, 0.644462f, 0.652664f, 0.660229f, 0.667010f, 0.673113f, 0.678788f, 0.684082f, 0.688924f, 0.693472f, 0.698001f, 0.702510f, 0.706806f, 0.710936f, 0.715101f, 0.719195f, 0.722909f, 0.726269f, 0.729530f, 0.732512f, 0.734617f, 0.735606f, 0.735863f, 0.735678f, 0.734755f, 0.732698f, 0.729673f, 0.726255f, 0.722712f, 0.718664f, 0.713561f, 0.707417f, 0.700900f, 0.694611f, 0.688481f, 0.682146f, + 0.675755f, 0.670059f, 0.665672f, 0.662528f, 0.660105f, 0.658010f, 0.656294f, 0.655275f, 0.655042f, 0.655135f, 0.654860f, 0.653870f, 0.652278f, 0.650245f, 0.647706f, 0.644488f, 0.640451f, 0.635518f, 0.629758f, 0.623449f, 0.616889f, 0.610232f, 0.603544f, 0.596898f, 0.590297f, 0.583682f, 0.577056f, 0.570442f, 0.563736f, 0.556801f, 0.549678f, 0.542492f, 0.535279f, 0.528093f, 0.521154f, 0.514648f, 0.508527f, 0.502690f, 0.497140f, 0.491836f, 0.486633f, 0.481501f, 0.476572f, 0.471906f, 0.467418f, 0.463039f, 0.458686f, 0.454164f, 0.449331f, 0.444241f, 0.438935f, 0.433317f, 0.427381f, 0.421288f, 0.415067f, 0.408572f, 0.401819f, 0.394993f, 0.388100f, 0.381032f, 0.373904f, 0.366955f, 0.360223f, 0.353709f, 0.347609f, 0.342029f, 0.336786f, 0.331780f, 0.327133f, 0.322727f, 0.318173f, 0.313407f, 0.308724f, 0.304155f, 0.299488f, 0.294851f, 0.290528f, 0.286392f, 0.282213f, 0.278211f, 0.274620f, 0.271203f, 0.267853f, 0.264940f, 0.262515f, 0.260046f, 0.257391f, 0.254933f, 0.252512f, 0.249509f, 0.246067f, 0.242749f, 0.239216f, 0.234883f, 0.230316f, 0.226146f, + 0.221603f, 0.216109f, 0.210802f, 0.206272f, 0.200974f, 0.194324f, 0.188446f, 0.183987f, 0.178038f, 0.169726f, 0.163182f, 0.160324f, 0.155860f, 0.145447f, 0.133826f, 0.127980f, 0.126532f, 0.122924f, 0.114883f, 0.103866f, 0.090500f, 0.079053f, 0.080753f, 0.100935f, 0.125261f, 0.130967f, 0.113407f, 0.091776f, 0.085866f, 0.095550f, 0.107946f, 0.118310f, 0.135431f, 0.165381f, 0.195627f, 0.202054f, 0.174034f, 0.127848f, 0.089951f, 0.070123f, 0.058538f, 0.046398f, 0.036783f, 0.032164f, 0.024778f, 0.009249f, -0.004637f, -0.004463f} + }, + { + {0.138076f, 0.232898f, -0.059293f, -0.612224f, -1.079196f, -1.174106f, -0.864429f, -0.332847f, 0.203546f, 0.626268f, 0.915930f, 1.086338f, 1.145817f, 1.101913f, 0.971577f, 0.776715f, 0.537327f, 0.273208f, 0.007437f, -0.237576f, -0.448750f, -0.625455f, -0.772863f, -0.892799f, -0.982209f, -1.039402f, -1.068583f, -1.077066f, -1.070181f, -1.050445f, -1.019817f, -0.980553f, -0.934407f, -0.882631f, -0.826646f, -0.767793f, -0.706548f, -0.642564f, -0.575417f, -0.505095f, -0.432158f, -0.357731f, -0.283190f, -0.209614f, -0.137562f, -0.067329f, 0.000718f, 0.066025f, 0.127937f, 0.186022f, 0.240454f, 0.292036f, 0.341688f, 0.389810f, 0.436063f, 0.479708f, 0.520133f, 0.557017f, 0.590135f, 0.619320f, 0.644743f, 0.666931f, 0.686264f, 0.702737f, 0.716446f, 0.727930f, 0.737674f, 0.745631f, 0.751724f, 0.756469f, 0.760579f, 0.764261f, 0.767563f, 0.771136f, 0.775889f, 0.781953f, 0.788798f, 0.796429f, 0.805575f, 0.816463f, 0.828227f, 0.840053f, 0.852209f, 0.865317f, 0.879077f, 0.892490f, 0.905078f, 0.917237f, 0.929509f, 0.942079f, 0.954921f, 0.967923f, 0.980775f, 0.993059f, 1.004433f, 1.014471f, + 1.022368f, 1.027077f, 1.027777f, 1.024171f, 1.016419f, 1.004875f, 0.989829f, 0.971522f, 0.950481f, 0.927664f, 0.904094f, 0.880496f, 0.857481f, 0.835889f, 0.816673f, 0.800449f, 0.787227f, 0.776425f, 0.767212f, 0.759123f, 0.752399f, 0.747484f, 0.744215f, 0.741719f, 0.738940f, 0.735065f, 0.729726f, 0.723226f, 0.716367f, 0.709723f, 0.703224f, 0.696593f, 0.689822f, 0.683015f, 0.676123f, 0.669098f, 0.662044f, 0.655092f, 0.648381f, 0.642144f, 0.636550f, 0.631509f, 0.626846f, 0.622532f, 0.618608f, 0.615118f, 0.612225f, 0.610115f, 0.608697f, 0.607677f, 0.606831f, 0.605900f, 0.604476f, 0.602385f, 0.599878f, 0.597091f, 0.593736f, 0.589617f, 0.584851f, 0.579299f, 0.572456f, 0.564168f, 0.554769f, 0.544430f, 0.533113f, 0.521100f, 0.508789f, 0.496142f, 0.483005f, 0.469593f, 0.456081f, 0.442365f, 0.428689f, 0.415677f, 0.403373f, 0.391276f, 0.379404f, 0.368075f, 0.356787f, 0.344691f, 0.331928f, 0.319178f, 0.306569f, 0.294254f, 0.282956f, 0.272791f, 0.262941f, 0.253310f, 0.244606f, 0.236417f, 0.227600f, 0.218521f, 0.210224f, 0.202126f, 0.193377f, 0.184872f, + 0.177026f, 0.168429f, 0.159251f, 0.151477f, 0.143811f, 0.133179f, 0.122218f, 0.115290f, 0.107467f, 0.092035f, 0.077002f, 0.072747f, 0.065602f, 0.034483f, -0.005140f, -0.013392f, 0.010536f, 0.022405f, 0.003341f, -0.016208f, -0.024400f, -0.060491f, -0.141552f, -0.211147f, -0.211352f, -0.166013f, -0.144212f, -0.172423f, -0.224227f, -0.268380f, -0.293530f, -0.314223f, -0.372350f, -0.487543f, -0.585910f, -0.542642f, -0.338207f, -0.113721f, -0.017641f, -0.045890f, -0.089863f, -0.096510f, -0.108175f, -0.164168f, -0.233196f, -0.252807f, -0.193549f, -0.071985f}, + {-0.138076f, -0.232898f, 0.059293f, 0.612224f, 1.079196f, 1.174106f, 0.864429f, 0.332847f, -0.203546f, -0.626268f, -0.915930f, -1.086338f, -1.145817f, -1.101913f, -0.971577f, -0.776715f, -0.537327f, -0.273208f, -0.007437f, 0.237576f, 0.448750f, 0.625455f, 0.772863f, 0.892799f, 0.982209f, 1.039402f, 1.068583f, 1.077066f, 1.070181f, 1.050445f, 1.019817f, 0.980553f, 0.934407f, 0.882631f, 0.826646f, 0.767793f, 0.706548f, 0.642564f, 0.575417f, 0.505095f, 0.432158f, 0.357731f, 0.283190f, 0.209614f, 0.137562f, 0.067329f, -0.000718f, -0.066025f, -0.127937f, -0.186022f, -0.240454f, -0.292036f, -0.341688f, -0.389810f, -0.436063f, -0.479708f, -0.520133f, -0.557017f, -0.590135f, -0.619320f, -0.644743f, -0.666931f, -0.686264f, -0.702737f, -0.716446f, -0.727930f, -0.737674f, -0.745631f, -0.751724f, -0.756469f, -0.760579f, -0.764261f, -0.767563f, -0.771136f, -0.775889f, -0.781953f, -0.788798f, -0.796429f, -0.805575f, -0.816463f, -0.828227f, -0.840053f, -0.852209f, -0.865317f, -0.879077f, -0.892490f, -0.905078f, -0.917237f, -0.929509f, -0.942079f, -0.954921f, -0.967923f, -0.980775f, -0.993059f, -1.004433f, -1.014471f, + -1.022368f, -1.027077f, -1.027777f, -1.024171f, -1.016419f, -1.004875f, -0.989829f, -0.971522f, -0.950481f, -0.927664f, -0.904094f, -0.880496f, -0.857481f, -0.835889f, -0.816673f, -0.800449f, -0.787227f, -0.776425f, -0.767212f, -0.759123f, -0.752399f, -0.747484f, -0.744215f, -0.741719f, -0.738940f, -0.735065f, -0.729726f, -0.723226f, -0.716367f, -0.709723f, -0.703224f, -0.696593f, -0.689822f, -0.683015f, -0.676123f, -0.669098f, -0.662044f, -0.655092f, -0.648381f, -0.642144f, -0.636550f, -0.631509f, -0.626846f, -0.622532f, -0.618608f, -0.615118f, -0.612225f, -0.610115f, -0.608697f, -0.607677f, -0.606831f, -0.605900f, -0.604476f, -0.602385f, -0.599878f, -0.597091f, -0.593736f, -0.589617f, -0.584851f, -0.579299f, -0.572456f, -0.564168f, -0.554769f, -0.544430f, -0.533113f, -0.521100f, -0.508789f, -0.496142f, -0.483005f, -0.469593f, -0.456081f, -0.442365f, -0.428689f, -0.415677f, -0.403373f, -0.391276f, -0.379404f, -0.368075f, -0.356787f, -0.344691f, -0.331928f, -0.319178f, -0.306569f, -0.294254f, -0.282956f, -0.272791f, -0.262941f, -0.253310f, -0.244606f, -0.236417f, -0.227600f, -0.218521f, -0.210224f, -0.202126f, -0.193377f, -0.184872f, + -0.177026f, -0.168429f, -0.159251f, -0.151477f, -0.143811f, -0.133179f, -0.122218f, -0.115290f, -0.107467f, -0.092035f, -0.077002f, -0.072747f, -0.065602f, -0.034483f, 0.005140f, 0.013392f, -0.010536f, -0.022405f, -0.003341f, 0.016208f, 0.024400f, 0.060491f, 0.141552f, 0.211147f, 0.211352f, 0.166013f, 0.144212f, 0.172423f, 0.224227f, 0.268380f, 0.293530f, 0.314223f, 0.372350f, 0.487543f, 0.585910f, 0.542642f, 0.338207f, 0.113721f, 0.017641f, 0.045890f, 0.089863f, 0.096510f, 0.108175f, 0.164168f, 0.233196f, 0.252807f, 0.193549f, 0.071985f} + }, + { + {-0.037543f, -0.106298f, -0.132530f, -0.073451f, 0.040855f, 0.110624f, 0.077156f, -0.013882f, -0.078578f, -0.081147f, -0.036444f, 0.028042f, 0.082921f, 0.101725f, 0.085482f, 0.065260f, 0.061559f, 0.057998f, 0.029356f, -0.022782f, -0.077787f, -0.123346f, -0.158215f, -0.178489f, -0.178126f, -0.160401f, -0.137683f, -0.119363f, -0.104942f, -0.088255f, -0.065195f, -0.037559f, -0.011105f, 0.009311f, 0.021969f, 0.026322f, 0.021717f, 0.009661f, -0.004873f, -0.016525f, -0.022987f, -0.024411f, -0.021007f, -0.012643f, 0.000208f, 0.016512f, 0.035490f, 0.057006f, 0.081545f, 0.110024f, 0.143089f, 0.180306f, 0.220287f, 0.261700f, 0.303801f, 0.345902f, 0.386845f, 0.425449f, 0.461174f, 0.493797f, 0.522610f, 0.546536f, 0.564888f, 0.577273f, 0.582799f, 0.580231f, 0.568985f, 0.549222f, 0.521000f, 0.484211f, 0.439353f, 0.387577f, 0.330111f, 0.268508f, 0.205168f, 0.142536f, 0.081907f, 0.024074f, -0.029079f, -0.075065f, -0.113125f, -0.144667f, -0.170681f, -0.189953f, -0.201133f, -0.205765f, -0.207348f, -0.207284f, -0.203651f, -0.194832f, -0.182670f, -0.170621f, -0.160017f, -0.149783f, -0.139015f, -0.128209f, + -0.118405f, -0.110532f, -0.105361f, -0.103080f, -0.102998f, -0.104199f, -0.106317f, -0.109616f, -0.114814f, -0.122543f, -0.132141f, -0.141277f, -0.147750f, -0.151340f, -0.153125f, -0.153636f, -0.152546f, -0.149354f, -0.143412f, -0.133993f, -0.121078f, -0.105467f, -0.087876f, -0.068787f, -0.049126f, -0.029929f, -0.011465f, 0.006234f, 0.022384f, 0.036020f, 0.046948f, 0.055235f, 0.060646f, 0.063321f, 0.063920f, 0.062627f, 0.059315f, 0.054877f, 0.050886f, 0.047979f, 0.046017f, 0.045215f, 0.045354f, 0.044782f, 0.042070f, 0.037698f, 0.032628f, 0.026663f, 0.019561f, 0.011982f, 0.004168f, -0.004450f, -0.013603f, -0.022173f, -0.030039f, -0.037798f, -0.045029f, -0.051093f, -0.056790f, -0.063043f, -0.069298f, -0.075124f, -0.081416f, -0.088384f, -0.094829f, -0.100596f, -0.106885f, -0.113537f, -0.119188f, -0.124015f, -0.128908f, -0.132920f, -0.135078f, -0.136917f, -0.139850f, -0.142734f, -0.145054f, -0.148801f, -0.154723f, -0.161242f, -0.168600f, -0.178599f, -0.189814f, -0.199312f, -0.208105f, -0.218177f, -0.226967f, -0.231947f, -0.235940f, -0.240788f, -0.242709f, -0.240449f, -0.238584f, -0.237547f, -0.232614f, -0.225682f, + -0.222453f, -0.218439f, -0.207392f, -0.198145f, -0.198203f, -0.192708f, -0.171847f, -0.158579f, -0.166585f, -0.161468f, -0.122471f, -0.101708f, -0.137293f, -0.150514f, -0.047189f, 0.105121f, 0.141538f, 0.038879f, -0.058972f, -0.070125f, -0.067759f, -0.100256f, -0.083756f, 0.038302f, 0.163436f, 0.166050f, 0.072134f, -0.001083f, -0.012004f, -0.012920f, -0.047149f, -0.098550f, -0.117690f, -0.061872f, 0.057074f, 0.148338f, 0.118443f, -0.008074f, -0.102218f, -0.087453f, -0.021704f, 0.005998f, -0.005131f, 0.000032f, 0.032495f, 0.053140f, 0.041387f, 0.014100f}, + {-0.037543f, -0.106298f, -0.132530f, -0.073451f, 0.040855f, 0.110624f, 0.077156f, -0.013882f, -0.078578f, -0.081147f, -0.036444f, 0.028042f, 0.082921f, 0.101725f, 0.085482f, 0.065260f, 0.061559f, 0.057998f, 0.029356f, -0.022782f, -0.077787f, -0.123346f, -0.158215f, -0.178489f, -0.178126f, -0.160401f, -0.137683f, -0.119363f, -0.104942f, -0.088255f, -0.065195f, -0.037559f, -0.011105f, 0.009311f, 0.021969f, 0.026322f, 0.021717f, 0.009661f, -0.004873f, -0.016525f, -0.022987f, -0.024411f, -0.021007f, -0.012643f, 0.000208f, 0.016512f, 0.035490f, 0.057006f, 0.081545f, 0.110024f, 0.143089f, 0.180306f, 0.220287f, 0.261700f, 0.303801f, 0.345902f, 0.386845f, 0.425449f, 0.461174f, 0.493797f, 0.522610f, 0.546536f, 0.564888f, 0.577273f, 0.582799f, 0.580231f, 0.568985f, 0.549222f, 0.521000f, 0.484211f, 0.439353f, 0.387577f, 0.330111f, 0.268508f, 0.205168f, 0.142536f, 0.081907f, 0.024074f, -0.029079f, -0.075065f, -0.113125f, -0.144667f, -0.170681f, -0.189953f, -0.201133f, -0.205765f, -0.207348f, -0.207284f, -0.203651f, -0.194832f, -0.182670f, -0.170621f, -0.160017f, -0.149783f, -0.139015f, -0.128209f, + -0.118405f, -0.110532f, -0.105361f, -0.103080f, -0.102998f, -0.104199f, -0.106317f, -0.109616f, -0.114814f, -0.122543f, -0.132141f, -0.141277f, -0.147750f, -0.151340f, -0.153125f, -0.153636f, -0.152546f, -0.149354f, -0.143412f, -0.133993f, -0.121078f, -0.105467f, -0.087876f, -0.068787f, -0.049126f, -0.029929f, -0.011465f, 0.006234f, 0.022384f, 0.036020f, 0.046948f, 0.055235f, 0.060646f, 0.063321f, 0.063920f, 0.062627f, 0.059315f, 0.054877f, 0.050886f, 0.047979f, 0.046017f, 0.045215f, 0.045354f, 0.044782f, 0.042070f, 0.037698f, 0.032628f, 0.026663f, 0.019561f, 0.011982f, 0.004168f, -0.004450f, -0.013603f, -0.022173f, -0.030039f, -0.037798f, -0.045029f, -0.051093f, -0.056790f, -0.063043f, -0.069298f, -0.075124f, -0.081416f, -0.088384f, -0.094829f, -0.100596f, -0.106885f, -0.113537f, -0.119188f, -0.124015f, -0.128908f, -0.132920f, -0.135078f, -0.136917f, -0.139850f, -0.142734f, -0.145054f, -0.148801f, -0.154723f, -0.161242f, -0.168600f, -0.178599f, -0.189814f, -0.199312f, -0.208105f, -0.218177f, -0.226967f, -0.231947f, -0.235940f, -0.240788f, -0.242709f, -0.240449f, -0.238584f, -0.237547f, -0.232614f, -0.225682f, + -0.222453f, -0.218439f, -0.207392f, -0.198145f, -0.198203f, -0.192708f, -0.171847f, -0.158579f, -0.166585f, -0.161468f, -0.122471f, -0.101708f, -0.137293f, -0.150514f, -0.047189f, 0.105121f, 0.141538f, 0.038879f, -0.058972f, -0.070125f, -0.067759f, -0.100256f, -0.083756f, 0.038302f, 0.163436f, 0.166050f, 0.072134f, -0.001083f, -0.012004f, -0.012920f, -0.047149f, -0.098550f, -0.117690f, -0.061872f, 0.057074f, 0.148338f, 0.118443f, -0.008074f, -0.102218f, -0.087453f, -0.021704f, 0.005998f, -0.005131f, 0.000032f, 0.032495f, 0.053140f, 0.041387f, 0.014100f} + }, + { + {-0.001106f, -0.029336f, -0.088077f, -0.114632f, -0.068558f, 0.003679f, 0.023786f, -0.022926f, -0.076983f, -0.077263f, -0.017663f, 0.063789f, 0.127856f, 0.160626f, 0.172314f, 0.179408f, 0.185660f, 0.178469f, 0.143908f, 0.081866f, 0.004191f, -0.076672f, -0.152185f, -0.216145f, -0.266904f, -0.310241f, -0.353459f, -0.395898f, -0.429566f, -0.448814f, -0.454423f, -0.447805f, -0.426583f, -0.388419f, -0.335647f, -0.273327f, -0.204930f, -0.132418f, -0.058962f, 0.011028f, 0.074401f, 0.130338f, 0.179186f, 0.221323f, 0.257177f, 0.287606f, 0.313805f, 0.336653f, 0.356005f, 0.370794f, 0.380013f, 0.383528f, 0.382178f, 0.377769f, 0.372920f, 0.369927f, 0.369378f, 0.370338f, 0.371805f, 0.373185f, 0.373702f, 0.372612f, 0.370075f, 0.366792f, 0.362926f, 0.358356f, 0.353579f, 0.349053f, 0.343991f, 0.337160f, 0.328527f, 0.318673f, 0.306976f, 0.292001f, 0.273582f, 0.252844f, 0.230152f, 0.204754f, 0.176888f, 0.148599f, 0.121626f, 0.095786f, 0.070566f, 0.047273f, 0.028034f, 0.013069f, 0.000532f, -0.010938f, -0.021026f, -0.029352f, -0.036545f, -0.042848f, -0.047044f, -0.047912f, -0.045699f, -0.041015f, + -0.033180f, -0.020912f, -0.004151f, 0.015844f, 0.037990f, 0.062328f, 0.089567f, 0.119856f, 0.151790f, 0.182876f, 0.211529f, 0.238379f, 0.264991f, 0.291575f, 0.316519f, 0.337842f, 0.354699f, 0.367998f, 0.379918f, 0.392155f, 0.404219f, 0.413945f, 0.419814f, 0.422264f, 0.423013f, 0.423999f, 0.426644f, 0.431049f, 0.435919f, 0.439985f, 0.443271f, 0.446555f, 0.450297f, 0.454641f, 0.459593f, 0.464544f, 0.468334f, 0.470226f, 0.470176f, 0.468166f, 0.464117f, 0.458340f, 0.451170f, 0.442355f, 0.431549f, 0.418970f, 0.404970f, 0.389655f, 0.373457f, 0.357280f, 0.341693f, 0.326836f, 0.313170f, 0.301285f, 0.291120f, 0.282416f, 0.275493f, 0.270594f, 0.267224f, 0.265075f, 0.264513f, 0.265346f, 0.266418f, 0.267094f, 0.267617f, 0.267704f, 0.266552f, 0.264373f, 0.262126f, 0.260015f, 0.257862f, 0.256090f, 0.254673f, 0.252424f, 0.248786f, 0.244534f, 0.239712f, 0.233258f, 0.225288f, 0.216847f, 0.207365f, 0.195576f, 0.182346f, 0.169120f, 0.155183f, 0.140015f, 0.125688f, 0.113431f, 0.101547f, 0.089772f, 0.080598f, 0.073961f, 0.067095f, 0.060688f, 0.057289f, 0.054588f, + 0.049873f, 0.047292f, 0.049167f, 0.048148f, 0.042023f, 0.042578f, 0.052039f, 0.052105f, 0.039829f, 0.042979f, 0.066307f, 0.065764f, 0.028206f, 0.026431f, 0.116043f, 0.221103f, 0.223358f, 0.136204f, 0.075662f, 0.075938f, 0.065554f, 0.030357f, 0.054492f, 0.158858f, 0.232985f, 0.194413f, 0.106812f, 0.067102f, 0.067912f, 0.048003f, 0.000150f, -0.049393f, -0.102920f, -0.154412f, -0.145923f, -0.043235f, 0.082041f, 0.125246f, 0.083044f, 0.044160f, 0.057384f, 0.079976f, 0.065854f, 0.041133f, 0.057617f, 0.106489f, 0.119625f, 0.053552f}, + {-0.001106f, -0.029336f, -0.088077f, -0.114632f, -0.068558f, 0.003679f, 0.023786f, -0.022926f, -0.076983f, -0.077263f, -0.017663f, 0.063789f, 0.127856f, 0.160626f, 0.172314f, 0.179408f, 0.185660f, 0.178469f, 0.143908f, 0.081866f, 0.004191f, -0.076672f, -0.152185f, -0.216145f, -0.266904f, -0.310241f, -0.353459f, -0.395898f, -0.429566f, -0.448814f, -0.454423f, -0.447805f, -0.426583f, -0.388419f, -0.335647f, -0.273327f, -0.204930f, -0.132418f, -0.058962f, 0.011028f, 0.074401f, 0.130338f, 0.179186f, 0.221323f, 0.257177f, 0.287606f, 0.313805f, 0.336653f, 0.356005f, 0.370794f, 0.380013f, 0.383528f, 0.382178f, 0.377769f, 0.372920f, 0.369927f, 0.369378f, 0.370338f, 0.371805f, 0.373185f, 0.373702f, 0.372612f, 0.370075f, 0.366792f, 0.362926f, 0.358356f, 0.353579f, 0.349053f, 0.343991f, 0.337160f, 0.328527f, 0.318673f, 0.306976f, 0.292001f, 0.273582f, 0.252844f, 0.230152f, 0.204754f, 0.176888f, 0.148599f, 0.121626f, 0.095786f, 0.070566f, 0.047273f, 0.028034f, 0.013069f, 0.000532f, -0.010938f, -0.021026f, -0.029352f, -0.036545f, -0.042848f, -0.047044f, -0.047912f, -0.045699f, -0.041015f, + -0.033180f, -0.020912f, -0.004151f, 0.015844f, 0.037990f, 0.062328f, 0.089567f, 0.119856f, 0.151790f, 0.182876f, 0.211529f, 0.238379f, 0.264991f, 0.291575f, 0.316519f, 0.337842f, 0.354699f, 0.367998f, 0.379918f, 0.392155f, 0.404219f, 0.413945f, 0.419814f, 0.422264f, 0.423013f, 0.423999f, 0.426644f, 0.431049f, 0.435919f, 0.439985f, 0.443271f, 0.446555f, 0.450297f, 0.454641f, 0.459593f, 0.464544f, 0.468334f, 0.470226f, 0.470176f, 0.468166f, 0.464117f, 0.458340f, 0.451170f, 0.442355f, 0.431549f, 0.418970f, 0.404970f, 0.389655f, 0.373457f, 0.357280f, 0.341693f, 0.326836f, 0.313170f, 0.301285f, 0.291120f, 0.282416f, 0.275493f, 0.270594f, 0.267224f, 0.265075f, 0.264513f, 0.265346f, 0.266418f, 0.267094f, 0.267617f, 0.267704f, 0.266552f, 0.264373f, 0.262126f, 0.260015f, 0.257862f, 0.256090f, 0.254673f, 0.252424f, 0.248786f, 0.244534f, 0.239712f, 0.233258f, 0.225288f, 0.216847f, 0.207365f, 0.195576f, 0.182346f, 0.169120f, 0.155183f, 0.140015f, 0.125688f, 0.113431f, 0.101547f, 0.089772f, 0.080598f, 0.073961f, 0.067095f, 0.060688f, 0.057289f, 0.054588f, + 0.049873f, 0.047292f, 0.049167f, 0.048148f, 0.042023f, 0.042578f, 0.052039f, 0.052105f, 0.039829f, 0.042979f, 0.066307f, 0.065764f, 0.028206f, 0.026431f, 0.116043f, 0.221103f, 0.223358f, 0.136204f, 0.075662f, 0.075938f, 0.065554f, 0.030357f, 0.054492f, 0.158858f, 0.232985f, 0.194413f, 0.106812f, 0.067102f, 0.067912f, 0.048003f, 0.000150f, -0.049393f, -0.102920f, -0.154412f, -0.145923f, -0.043235f, 0.082041f, 0.125246f, 0.083044f, 0.044160f, 0.057384f, 0.079976f, 0.065854f, 0.041133f, 0.057617f, 0.106489f, 0.119625f, 0.053552f} + }, + { + {-0.003789f, -0.003563f, 0.005390f, 0.004253f, -0.016392f, -0.039478f, -0.046987f, -0.050995f, -0.077966f, -0.121934f, -0.135164f, -0.078389f, 0.031562f, 0.138714f, 0.205564f, 0.238423f, 0.259289f, 0.272913f, 0.269301f, 0.243849f, 0.201082f, 0.144127f, 0.072703f, -0.009192f, -0.092622f, -0.171911f, -0.247325f, -0.318739f, -0.382003f, -0.432956f, -0.470676f, -0.495269f, -0.505851f, -0.501895f, -0.483566f, -0.449894f, -0.399742f, -0.335951f, -0.266183f, -0.198350f, -0.136588f, -0.081779f, -0.033568f, 0.009088f, 0.047647f, 0.083109f, 0.115870f, 0.146272f, 0.174342f, 0.199243f, 0.219907f, 0.235988f, 0.247660f, 0.255290f, 0.260042f, 0.263953f, 0.268571f, 0.274114f, 0.280349f, 0.287365f, 0.295056f, 0.302862f, 0.310459f, 0.317888f, 0.324842f, 0.330747f, 0.335542f, 0.339373f, 0.341625f, 0.341355f, 0.338531f, 0.333589f, 0.325911f, 0.314093f, 0.297767f, 0.277788f, 0.254435f, 0.226961f, 0.195597f, 0.162625f, 0.130256f, 0.098385f, 0.065891f, 0.033566f, 0.003825f, -0.022571f, -0.047471f, -0.072174f, -0.095089f, -0.113849f, -0.128315f, -0.139798f, -0.148327f, -0.152538f, -0.151922f, -0.147693f, + -0.141449f, -0.134009f, -0.125542f, -0.116170f, -0.106339f, -0.096745f, -0.087767f, -0.079178f, -0.070833f, -0.063188f, -0.056416f, -0.049448f, -0.040822f, -0.030317f, -0.019055f, -0.008311f, 0.001362f, 0.010417f, 0.020238f, 0.032100f, 0.045698f, 0.059224f, 0.071090f, 0.081057f, 0.089857f, 0.098613f, 0.108519f, 0.120125f, 0.132885f, 0.145947f, 0.159099f, 0.172520f, 0.186195f, 0.200063f, 0.214027f, 0.227406f, 0.239060f, 0.248310f, 0.255115f, 0.259453f, 0.261381f, 0.261468f, 0.260276f, 0.257747f, 0.253798f, 0.248995f, 0.243998f, 0.239084f, 0.234733f, 0.231749f, 0.230386f, 0.230266f, 0.231313f, 0.233779f, 0.237497f, 0.242150f, 0.247940f, 0.255021f, 0.262901f, 0.271206f, 0.280071f, 0.289077f, 0.297036f, 0.303388f, 0.308430f, 0.311992f, 0.313524f, 0.313400f, 0.312461f, 0.310668f, 0.307845f, 0.304798f, 0.302098f, 0.299086f, 0.295438f, 0.291960f, 0.288762f, 0.284855f, 0.280127f, 0.275167f, 0.269236f, 0.261328f, 0.252490f, 0.244013f, 0.235006f, 0.224872f, 0.215456f, 0.207625f, 0.199481f, 0.190596f, 0.183143f, 0.177022f, 0.169991f, 0.163109f, 0.158683f, 0.154359f, + 0.148010f, 0.143942f, 0.143859f, 0.140381f, 0.132047f, 0.130317f, 0.136071f, 0.131329f, 0.114971f, 0.114353f, 0.131726f, 0.123744f, 0.081739f, 0.079871f, 0.169779f, 0.273251f, 0.274171f, 0.185331f, 0.118375f, 0.110316f, 0.100500f, 0.075041f, 0.100840f, 0.188865f, 0.245753f, 0.209825f, 0.136354f, 0.098537f, 0.089245f, 0.068116f, 0.030138f, -0.014604f, -0.058375f, -0.058884f, 0.036565f, 0.189080f, 0.269087f, 0.211524f, 0.102010f, 0.054393f, 0.068058f, 0.069962f, 0.039279f, 0.011969f, -0.001065f, -0.019914f, -0.036169f, -0.019550f}, + {0.003789f, 0.003563f, -0.005390f, -0.004253f, 0.016392f, 0.039478f, 0.046987f, 0.050995f, 0.077966f, 0.121934f, 0.135164f, 0.078389f, -0.031562f, -0.138714f, -0.205564f, -0.238423f, -0.259289f, -0.272913f, -0.269301f, -0.243849f, -0.201082f, -0.144127f, -0.072703f, 0.009192f, 0.092622f, 0.171911f, 0.247325f, 0.318739f, 0.382003f, 0.432956f, 0.470676f, 0.495269f, 0.505851f, 0.501895f, 0.483566f, 0.449894f, 0.399742f, 0.335951f, 0.266183f, 0.198350f, 0.136588f, 0.081779f, 0.033568f, -0.009088f, -0.047647f, -0.083109f, -0.115870f, -0.146272f, -0.174342f, -0.199243f, -0.219907f, -0.235988f, -0.247660f, -0.255290f, -0.260042f, -0.263953f, -0.268571f, -0.274114f, -0.280349f, -0.287365f, -0.295056f, -0.302862f, -0.310459f, -0.317888f, -0.324842f, -0.330747f, -0.335542f, -0.339373f, -0.341625f, -0.341355f, -0.338531f, -0.333589f, -0.325911f, -0.314093f, -0.297767f, -0.277788f, -0.254435f, -0.226961f, -0.195597f, -0.162625f, -0.130256f, -0.098385f, -0.065891f, -0.033566f, -0.003825f, 0.022571f, 0.047471f, 0.072174f, 0.095089f, 0.113849f, 0.128315f, 0.139798f, 0.148327f, 0.152538f, 0.151922f, 0.147693f, + 0.141449f, 0.134009f, 0.125542f, 0.116170f, 0.106339f, 0.096745f, 0.087767f, 0.079178f, 0.070833f, 0.063188f, 0.056416f, 0.049448f, 0.040822f, 0.030317f, 0.019055f, 0.008311f, -0.001362f, -0.010417f, -0.020238f, -0.032100f, -0.045698f, -0.059224f, -0.071090f, -0.081057f, -0.089857f, -0.098613f, -0.108519f, -0.120125f, -0.132885f, -0.145947f, -0.159099f, -0.172520f, -0.186195f, -0.200063f, -0.214027f, -0.227406f, -0.239060f, -0.248310f, -0.255115f, -0.259453f, -0.261381f, -0.261468f, -0.260276f, -0.257747f, -0.253798f, -0.248995f, -0.243998f, -0.239084f, -0.234733f, -0.231749f, -0.230386f, -0.230266f, -0.231313f, -0.233779f, -0.237497f, -0.242150f, -0.247940f, -0.255021f, -0.262901f, -0.271206f, -0.280071f, -0.289077f, -0.297036f, -0.303388f, -0.308430f, -0.311992f, -0.313524f, -0.313400f, -0.312461f, -0.310668f, -0.307845f, -0.304798f, -0.302098f, -0.299086f, -0.295438f, -0.291960f, -0.288762f, -0.284855f, -0.280127f, -0.275167f, -0.269236f, -0.261328f, -0.252490f, -0.244013f, -0.235006f, -0.224872f, -0.215456f, -0.207625f, -0.199481f, -0.190596f, -0.183143f, -0.177022f, -0.169991f, -0.163109f, -0.158683f, -0.154359f, + -0.148010f, -0.143942f, -0.143859f, -0.140381f, -0.132047f, -0.130317f, -0.136071f, -0.131329f, -0.114971f, -0.114353f, -0.131726f, -0.123744f, -0.081739f, -0.079871f, -0.169779f, -0.273251f, -0.274171f, -0.185331f, -0.118375f, -0.110316f, -0.100500f, -0.075041f, -0.100840f, -0.188865f, -0.245753f, -0.209825f, -0.136354f, -0.098537f, -0.089245f, -0.068116f, -0.030138f, 0.014604f, 0.058375f, 0.058884f, -0.036565f, -0.189080f, -0.269087f, -0.211524f, -0.102010f, -0.054393f, -0.068058f, -0.069962f, -0.039279f, -0.011969f, 0.001065f, 0.019914f, 0.036169f, 0.019550f} + }, + { + {-0.006846f, -0.000152f, 0.019374f, 0.004568f, -0.021442f, 0.016645f, 0.094894f, 0.078760f, -0.081254f, -0.243610f, -0.240659f, -0.079782f, 0.093230f, 0.178154f, 0.191226f, 0.185348f, 0.178503f, 0.163321f, 0.134365f, 0.090634f, 0.035061f, -0.021392f, -0.066568f, -0.096797f, -0.113194f, -0.115470f, -0.106244f, -0.093474f, -0.082246f, -0.071041f, -0.059987f, -0.054977f, -0.059639f, -0.069988f, -0.080582f, -0.091156f, -0.105014f, -0.124424f, -0.148446f, -0.172697f, -0.191456f, -0.201829f, -0.205066f, -0.203411f, -0.198122f, -0.190935f, -0.184076f, -0.177679f, -0.169636f, -0.158353f, -0.143485f, -0.124415f, -0.100358f, -0.071388f, -0.037625f, 0.001321f, 0.044603f, 0.089548f, 0.134068f, 0.177680f, 0.219330f, 0.256720f, 0.288657f, 0.315550f, 0.336880f, 0.350608f, 0.355516f, 0.351864f, 0.339573f, 0.317907f, 0.287002f, 0.247963f, 0.201779f, 0.149696f, 0.094063f, 0.037338f, -0.019185f, -0.074517f, -0.126620f, -0.173157f, -0.213261f, -0.247652f, -0.276903f, -0.300055f, -0.315444f, -0.323001f, -0.324860f, -0.322914f, -0.316675f, -0.304809f, -0.287684f, -0.266683f, -0.242026f, -0.213279f, -0.181142f, -0.146760f, + -0.110142f, -0.071145f, -0.031211f, 0.007509f, 0.043988f, 0.078081f, 0.109247f, 0.136169f, 0.156829f, 0.169152f, 0.173118f, 0.171933f, 0.169302f, 0.165775f, 0.159289f, 0.148635f, 0.134827f, 0.119999f, 0.106488f, 0.096001f, 0.088379f, 0.082075f, 0.076456f, 0.072384f, 0.070438f, 0.070288f, 0.071753f, 0.074612f, 0.077583f, 0.079232f, 0.079389f, 0.078235f, 0.075055f, 0.069328f, 0.061745f, 0.052996f, 0.043060f, 0.032476f, 0.022488f, 0.013477f, 0.005059f, -0.002387f, -0.008316f, -0.013571f, -0.019235f, -0.024853f, -0.029688f, -0.034327f, -0.039294f, -0.043859f, -0.047636f, -0.051298f, -0.054721f, -0.056837f, -0.057796f, -0.058696f, -0.059300f, -0.058729f, -0.057642f, -0.056982f, -0.055954f, -0.053837f, -0.051823f, -0.050759f, -0.049643f, -0.048234f, -0.047974f, -0.049006f, -0.049803f, -0.050341f, -0.051811f, -0.053521f, -0.054180f, -0.055033f, -0.057656f, -0.060879f, -0.063704f, -0.067950f, -0.074626f, -0.081990f, -0.089761f, -0.099845f, -0.111314f, -0.121038f, -0.129556f, -0.139256f, -0.148166f, -0.153341f, -0.157148f, -0.162167f, -0.165226f, -0.164304f, -0.163483f, -0.164081f, -0.161527f, -0.156368f, + -0.154318f, -0.152643f, -0.144643f, -0.136635f, -0.137086f, -0.134879f, -0.118831f, -0.106512f, -0.113435f, -0.113117f, -0.082437f, -0.060570f, -0.086167f, -0.101264f, -0.021545f, 0.106592f, 0.140238f, 0.045381f, -0.056517f, -0.078374f, -0.074532f, -0.103109f, -0.107473f, -0.023777f, 0.086175f, 0.108098f, 0.028080f, -0.068297f, -0.117080f, -0.133674f, -0.164582f, -0.217773f, -0.236408f, -0.146856f, 0.037683f, 0.182002f, 0.158627f, 0.006930f, -0.106384f, -0.089821f, -0.015786f, 0.009329f, -0.016630f, -0.027747f, -0.002433f, 0.022946f, 0.022944f, 0.008213f}, + {0.006846f, 0.000152f, -0.019374f, -0.004568f, 0.021442f, -0.016645f, -0.094894f, -0.078760f, 0.081254f, 0.243610f, 0.240659f, 0.079782f, -0.093230f, -0.178154f, -0.191226f, -0.185348f, -0.178503f, -0.163321f, -0.134365f, -0.090634f, -0.035061f, 0.021392f, 0.066568f, 0.096797f, 0.113194f, 0.115470f, 0.106244f, 0.093474f, 0.082246f, 0.071041f, 0.059987f, 0.054977f, 0.059639f, 0.069988f, 0.080582f, 0.091156f, 0.105014f, 0.124424f, 0.148446f, 0.172697f, 0.191456f, 0.201829f, 0.205066f, 0.203411f, 0.198122f, 0.190935f, 0.184076f, 0.177679f, 0.169636f, 0.158353f, 0.143485f, 0.124415f, 0.100358f, 0.071388f, 0.037625f, -0.001321f, -0.044603f, -0.089548f, -0.134068f, -0.177680f, -0.219330f, -0.256720f, -0.288657f, -0.315550f, -0.336880f, -0.350608f, -0.355516f, -0.351864f, -0.339573f, -0.317907f, -0.287002f, -0.247963f, -0.201779f, -0.149696f, -0.094063f, -0.037338f, 0.019185f, 0.074517f, 0.126620f, 0.173157f, 0.213261f, 0.247652f, 0.276903f, 0.300055f, 0.315444f, 0.323001f, 0.324860f, 0.322914f, 0.316675f, 0.304809f, 0.287684f, 0.266683f, 0.242026f, 0.213279f, 0.181142f, 0.146760f, + 0.110142f, 0.071145f, 0.031211f, -0.007509f, -0.043988f, -0.078081f, -0.109247f, -0.136169f, -0.156829f, -0.169152f, -0.173118f, -0.171933f, -0.169302f, -0.165775f, -0.159289f, -0.148635f, -0.134827f, -0.119999f, -0.106488f, -0.096001f, -0.088379f, -0.082075f, -0.076456f, -0.072384f, -0.070438f, -0.070288f, -0.071753f, -0.074612f, -0.077583f, -0.079232f, -0.079389f, -0.078235f, -0.075055f, -0.069328f, -0.061745f, -0.052996f, -0.043060f, -0.032476f, -0.022488f, -0.013477f, -0.005059f, 0.002387f, 0.008316f, 0.013571f, 0.019235f, 0.024853f, 0.029688f, 0.034327f, 0.039294f, 0.043859f, 0.047636f, 0.051298f, 0.054721f, 0.056837f, 0.057796f, 0.058696f, 0.059300f, 0.058729f, 0.057642f, 0.056982f, 0.055954f, 0.053837f, 0.051823f, 0.050759f, 0.049643f, 0.048234f, 0.047974f, 0.049006f, 0.049803f, 0.050341f, 0.051811f, 0.053521f, 0.054180f, 0.055033f, 0.057656f, 0.060879f, 0.063704f, 0.067950f, 0.074626f, 0.081990f, 0.089761f, 0.099845f, 0.111314f, 0.121038f, 0.129556f, 0.139256f, 0.148166f, 0.153341f, 0.157148f, 0.162167f, 0.165226f, 0.164304f, 0.163483f, 0.164081f, 0.161527f, 0.156368f, + 0.154318f, 0.152643f, 0.144643f, 0.136635f, 0.137086f, 0.134879f, 0.118831f, 0.106512f, 0.113435f, 0.113117f, 0.082437f, 0.060570f, 0.086167f, 0.101264f, 0.021545f, -0.106592f, -0.140238f, -0.045381f, 0.056517f, 0.078374f, 0.074532f, 0.103109f, 0.107473f, 0.023777f, -0.086175f, -0.108098f, -0.028080f, 0.068297f, 0.117080f, 0.133674f, 0.164582f, 0.217773f, 0.236408f, 0.146856f, -0.037683f, -0.182002f, -0.158627f, -0.006930f, 0.106384f, 0.089821f, 0.015786f, -0.009329f, 0.016630f, 0.027747f, 0.002433f, -0.022946f, -0.022944f, -0.008213f} + }, + { + {-0.001420f, -0.012065f, -0.026492f, -0.020203f, 0.009739f, 0.039421f, 0.066264f, 0.123513f, 0.219923f, 0.294024f, 0.266235f, 0.127758f, -0.051262f, -0.196504f, -0.284732f, -0.327956f, -0.337211f, -0.317958f, -0.281436f, -0.240577f, -0.198997f, -0.153781f, -0.105052f, -0.056036f, -0.008353f, 0.035683f, 0.069060f, 0.085305f, 0.087456f, 0.087200f, 0.094464f, 0.110361f, 0.130021f, 0.149198f, 0.166810f, 0.183045f, 0.197421f, 0.209077f, 0.217550f, 0.222212f, 0.221593f, 0.214614f, 0.202528f, 0.188537f, 0.175138f, 0.162537f, 0.149700f, 0.136000f, 0.121499f, 0.106417f, 0.090943f, 0.075268f, 0.059568f, 0.044160f, 0.029790f, 0.017578f, 0.008567f, 0.003340f, 0.001927f, 0.003952f, 0.008947f, 0.016627f, 0.026844f, 0.039331f, 0.053686f, 0.069631f, 0.087084f, 0.105849f, 0.125258f, 0.144267f, 0.162023f, 0.178236f, 0.192755f, 0.204836f, 0.213266f, 0.217287f, 0.216843f, 0.211652f, 0.200710f, 0.183257f, 0.159710f, 0.131033f, 0.097576f, 0.059269f, 0.016690f, -0.028770f, -0.075739f, -0.123333f, -0.170970f, -0.218285f, -0.265068f, -0.310574f, -0.352756f, -0.388810f, -0.416934f, -0.437347f, + -0.451255f, -0.458880f, -0.458839f, -0.449713f, -0.432204f, -0.409619f, -0.386020f, -0.363800f, -0.342969f, -0.322690f, -0.303273f, -0.286626f, -0.275007f, -0.269641f, -0.270390f, -0.276241f, -0.285888f, -0.298144f, -0.312255f, -0.327971f, -0.345199f, -0.363508f, -0.381893f, -0.399002f, -0.413686f, -0.425507f, -0.434753f, -0.441996f, -0.447655f, -0.451917f, -0.454880f, -0.456722f, -0.457797f, -0.458478f, -0.458752f, -0.458121f, -0.456157f, -0.453025f, -0.449242f, -0.445115f, -0.440663f, -0.435765f, -0.429977f, -0.422410f, -0.412255f, -0.399353f, -0.384044f, -0.366690f, -0.347614f, -0.327259f, -0.306182f, -0.285019f, -0.264467f, -0.245070f, -0.227032f, -0.210404f, -0.195308f, -0.181726f, -0.169332f, -0.157853f, -0.147307f, -0.137689f, -0.128750f, -0.120299f, -0.112312f, -0.104627f, -0.096937f, -0.089190f, -0.081612f, -0.074406f, -0.067751f, -0.061796f, -0.056271f, -0.050527f, -0.044251f, -0.037633f, -0.030645f, -0.022940f, -0.014604f, -0.006131f, 0.002380f, 0.011084f, 0.019647f, 0.027656f, 0.035299f, 0.042653f, 0.049064f, 0.054179f, 0.058475f, 0.061913f, 0.063651f, 0.063792f, 0.063468f, 0.062805f, 0.061111f, 0.058940f, + 0.057196f, 0.055040f, 0.051853f, 0.049240f, 0.047435f, 0.043389f, 0.036776f, 0.032043f, 0.029194f, 0.021482f, 0.009242f, 0.002996f, 0.002545f, -0.009347f, -0.036379f, -0.052805f, -0.041320f, -0.024358f, -0.027246f, -0.034686f, -0.024798f, -0.022626f, -0.064861f, -0.125246f, -0.137627f, -0.092121f, -0.047334f, -0.041987f, -0.054463f, -0.057870f, -0.053789f, -0.041072f, -0.015593f, -0.013176f, -0.080518f, -0.182863f, -0.217493f, -0.150387f, -0.062968f, -0.026715f, -0.015171f, 0.011874f, 0.031103f, 0.034503f, 0.089489f, 0.214435f, 0.272951f, 0.129518f}, + {-0.001420f, -0.012065f, -0.026492f, -0.020203f, 0.009739f, 0.039421f, 0.066264f, 0.123513f, 0.219923f, 0.294024f, 0.266235f, 0.127758f, -0.051262f, -0.196504f, -0.284732f, -0.327956f, -0.337211f, -0.317958f, -0.281436f, -0.240577f, -0.198997f, -0.153781f, -0.105052f, -0.056036f, -0.008353f, 0.035683f, 0.069060f, 0.085305f, 0.087456f, 0.087200f, 0.094464f, 0.110361f, 0.130021f, 0.149198f, 0.166810f, 0.183045f, 0.197421f, 0.209077f, 0.217550f, 0.222212f, 0.221593f, 0.214614f, 0.202528f, 0.188537f, 0.175138f, 0.162537f, 0.149700f, 0.136000f, 0.121499f, 0.106417f, 0.090943f, 0.075268f, 0.059568f, 0.044160f, 0.029790f, 0.017578f, 0.008567f, 0.003340f, 0.001927f, 0.003952f, 0.008947f, 0.016627f, 0.026844f, 0.039331f, 0.053686f, 0.069631f, 0.087084f, 0.105849f, 0.125258f, 0.144267f, 0.162023f, 0.178236f, 0.192755f, 0.204836f, 0.213266f, 0.217287f, 0.216843f, 0.211652f, 0.200710f, 0.183257f, 0.159710f, 0.131033f, 0.097576f, 0.059269f, 0.016690f, -0.028770f, -0.075739f, -0.123333f, -0.170970f, -0.218285f, -0.265068f, -0.310574f, -0.352756f, -0.388810f, -0.416934f, -0.437347f, + -0.451255f, -0.458880f, -0.458839f, -0.449713f, -0.432204f, -0.409619f, -0.386020f, -0.363800f, -0.342969f, -0.322690f, -0.303273f, -0.286626f, -0.275007f, -0.269641f, -0.270390f, -0.276241f, -0.285888f, -0.298144f, -0.312255f, -0.327971f, -0.345199f, -0.363508f, -0.381893f, -0.399002f, -0.413686f, -0.425507f, -0.434753f, -0.441996f, -0.447655f, -0.451917f, -0.454880f, -0.456722f, -0.457797f, -0.458478f, -0.458752f, -0.458121f, -0.456157f, -0.453025f, -0.449242f, -0.445115f, -0.440663f, -0.435765f, -0.429977f, -0.422410f, -0.412255f, -0.399353f, -0.384044f, -0.366690f, -0.347614f, -0.327259f, -0.306182f, -0.285019f, -0.264467f, -0.245070f, -0.227032f, -0.210404f, -0.195308f, -0.181726f, -0.169332f, -0.157853f, -0.147307f, -0.137689f, -0.128750f, -0.120299f, -0.112312f, -0.104627f, -0.096937f, -0.089190f, -0.081612f, -0.074406f, -0.067751f, -0.061796f, -0.056271f, -0.050527f, -0.044251f, -0.037633f, -0.030645f, -0.022940f, -0.014604f, -0.006131f, 0.002380f, 0.011084f, 0.019647f, 0.027656f, 0.035299f, 0.042653f, 0.049064f, 0.054179f, 0.058475f, 0.061913f, 0.063651f, 0.063792f, 0.063468f, 0.062805f, 0.061111f, 0.058940f, + 0.057196f, 0.055040f, 0.051853f, 0.049240f, 0.047435f, 0.043389f, 0.036776f, 0.032043f, 0.029194f, 0.021482f, 0.009242f, 0.002996f, 0.002545f, -0.009347f, -0.036379f, -0.052805f, -0.041320f, -0.024358f, -0.027246f, -0.034686f, -0.024798f, -0.022626f, -0.064861f, -0.125246f, -0.137627f, -0.092121f, -0.047334f, -0.041987f, -0.054463f, -0.057870f, -0.053789f, -0.041072f, -0.015593f, -0.013176f, -0.080518f, -0.182863f, -0.217493f, -0.150387f, -0.062968f, -0.026715f, -0.015171f, 0.011874f, 0.031103f, 0.034503f, 0.089489f, 0.214435f, 0.272951f, 0.129518f} + }, + { + {-0.038036f, -0.074902f, -0.024728f, 0.087455f, 0.171578f, 0.138660f, -0.013344f, -0.177067f, -0.224993f, -0.133475f, 0.000768f, 0.073679f, 0.073125f, 0.051799f, 0.042554f, 0.040258f, 0.042095f, 0.055917f, 0.071808f, 0.065859f, 0.038024f, 0.016554f, 0.018640f, 0.030709f, 0.033652f, 0.026271f, 0.015742f, 0.001748f, -0.019927f, -0.047556f, -0.074394f, -0.094749f, -0.106738f, -0.113212f, -0.120520f, -0.132744f, -0.147313f, -0.158256f, -0.161754f, -0.156711f, -0.143250f, -0.123457f, -0.101193f, -0.079047f, -0.057237f, -0.036057f, -0.016869f, -0.000173f, 0.014829f, 0.028457f, 0.040426f, 0.051286f, 0.062027f, 0.072634f, 0.082611f, 0.092229f, 0.101796f, 0.110497f, 0.117155f, 0.121469f, 0.123745f, 0.124154f, 0.122894f, 0.120542f, 0.118067f, 0.116669f, 0.117188f, 0.119429f, 0.122852f, 0.127992f, 0.135991f, 0.146706f, 0.158839f, 0.172086f, 0.187416f, 0.204930f, 0.223054f, 0.240129f, 0.255405f, 0.268314f, 0.277870f, 0.282894f, 0.282322f, 0.275749f, 0.263854f, 0.247296f, 0.225295f, 0.197079f, 0.164656f, 0.131544f, 0.098081f, 0.060564f, 0.016252f, -0.032884f, -0.082704f, -0.131427f, + -0.180130f, -0.229646f, -0.278328f, -0.323025f, -0.361917f, -0.395929f, -0.426764f, -0.453823f, -0.474235f, -0.486045f, -0.490258f, -0.489520f, -0.485692f, -0.478679f, -0.466693f, -0.447817f, -0.422153f, -0.392219f, -0.360719f, -0.328559f, -0.295468f, -0.261492f, -0.227219f, -0.193485f, -0.161356f, -0.131578f, -0.103829f, -0.077323f, -0.051994f, -0.028199f, -0.005636f, 0.016498f, 0.038710f, 0.061118f, 0.083300f, 0.103747f, 0.120694f, 0.134062f, 0.145495f, 0.156353f, 0.166955f, 0.177434f, 0.187498f, 0.195642f, 0.200481f, 0.202621f, 0.203729f, 0.204510f, 0.205051f, 0.205904f, 0.207126f, 0.207456f, 0.205955f, 0.203314f, 0.200582f, 0.198064f, 0.196146f, 0.195517f, 0.195977f, 0.196494f, 0.196550f, 0.196111f, 0.194868f, 0.192897f, 0.191150f, 0.190037f, 0.188817f, 0.187238f, 0.185888f, 0.184302f, 0.181068f, 0.176285f, 0.171411f, 0.166717f, 0.161536f, 0.156496f, 0.152668f, 0.149485f, 0.146174f, 0.143623f, 0.142412f, 0.141376f, 0.140226f, 0.140504f, 0.142241f, 0.143471f, 0.144125f, 0.145942f, 0.148225f, 0.148788f, 0.148461f, 0.149129f, 0.149237f, 0.147094f, 0.145098f, 0.144601f, + 0.142172f, 0.137100f, 0.134404f, 0.134101f, 0.129092f, 0.120268f, 0.117850f, 0.120259f, 0.112981f, 0.098190f, 0.097531f, 0.110374f, 0.103615f, 0.067766f, 0.046475f, 0.073314f, 0.111894f, 0.105684f, 0.062494f, 0.035374f, 0.034378f, 0.017735f, -0.027142f, -0.052915f, -0.024407f, 0.022722f, 0.028116f, -0.013868f, -0.055362f, -0.066124f, -0.069119f, -0.094576f, -0.122680f, -0.100213f, -0.014486f, 0.075343f, 0.099155f, 0.055635f, 0.009056f, 0.009599f, 0.040799f, 0.054429f, 0.037946f, 0.027022f, 0.053523f, 0.098025f, 0.105408f, 0.046190f}, + {-0.038036f, -0.074902f, -0.024728f, 0.087455f, 0.171578f, 0.138660f, -0.013344f, -0.177067f, -0.224993f, -0.133475f, 0.000768f, 0.073679f, 0.073125f, 0.051799f, 0.042554f, 0.040258f, 0.042095f, 0.055917f, 0.071808f, 0.065859f, 0.038024f, 0.016554f, 0.018640f, 0.030709f, 0.033652f, 0.026271f, 0.015742f, 0.001748f, -0.019927f, -0.047556f, -0.074394f, -0.094749f, -0.106738f, -0.113212f, -0.120520f, -0.132744f, -0.147313f, -0.158256f, -0.161754f, -0.156711f, -0.143250f, -0.123457f, -0.101193f, -0.079047f, -0.057237f, -0.036057f, -0.016869f, -0.000173f, 0.014829f, 0.028457f, 0.040426f, 0.051286f, 0.062027f, 0.072634f, 0.082611f, 0.092229f, 0.101796f, 0.110497f, 0.117155f, 0.121469f, 0.123745f, 0.124154f, 0.122894f, 0.120542f, 0.118067f, 0.116669f, 0.117188f, 0.119429f, 0.122852f, 0.127992f, 0.135991f, 0.146706f, 0.158839f, 0.172086f, 0.187416f, 0.204930f, 0.223054f, 0.240129f, 0.255405f, 0.268314f, 0.277870f, 0.282894f, 0.282322f, 0.275749f, 0.263854f, 0.247296f, 0.225295f, 0.197079f, 0.164656f, 0.131544f, 0.098081f, 0.060564f, 0.016252f, -0.032884f, -0.082704f, -0.131427f, + -0.180130f, -0.229646f, -0.278328f, -0.323025f, -0.361917f, -0.395929f, -0.426764f, -0.453823f, -0.474235f, -0.486045f, -0.490258f, -0.489520f, -0.485692f, -0.478679f, -0.466693f, -0.447817f, -0.422153f, -0.392219f, -0.360719f, -0.328559f, -0.295468f, -0.261492f, -0.227219f, -0.193485f, -0.161356f, -0.131578f, -0.103829f, -0.077323f, -0.051994f, -0.028199f, -0.005636f, 0.016498f, 0.038710f, 0.061118f, 0.083300f, 0.103747f, 0.120694f, 0.134062f, 0.145495f, 0.156353f, 0.166955f, 0.177434f, 0.187498f, 0.195642f, 0.200481f, 0.202621f, 0.203729f, 0.204510f, 0.205051f, 0.205904f, 0.207126f, 0.207456f, 0.205955f, 0.203314f, 0.200582f, 0.198064f, 0.196146f, 0.195517f, 0.195977f, 0.196494f, 0.196550f, 0.196111f, 0.194868f, 0.192897f, 0.191150f, 0.190037f, 0.188817f, 0.187238f, 0.185888f, 0.184302f, 0.181068f, 0.176285f, 0.171411f, 0.166717f, 0.161536f, 0.156496f, 0.152668f, 0.149485f, 0.146174f, 0.143623f, 0.142412f, 0.141376f, 0.140226f, 0.140504f, 0.142241f, 0.143471f, 0.144125f, 0.145942f, 0.148225f, 0.148788f, 0.148461f, 0.149129f, 0.149237f, 0.147094f, 0.145098f, 0.144601f, + 0.142172f, 0.137100f, 0.134404f, 0.134101f, 0.129092f, 0.120268f, 0.117850f, 0.120259f, 0.112981f, 0.098190f, 0.097531f, 0.110374f, 0.103615f, 0.067766f, 0.046475f, 0.073314f, 0.111894f, 0.105684f, 0.062494f, 0.035374f, 0.034378f, 0.017735f, -0.027142f, -0.052915f, -0.024407f, 0.022722f, 0.028116f, -0.013868f, -0.055362f, -0.066124f, -0.069119f, -0.094576f, -0.122680f, -0.100213f, -0.014486f, 0.075343f, 0.099155f, 0.055635f, 0.009056f, 0.009599f, 0.040799f, 0.054429f, 0.037946f, 0.027022f, 0.053523f, 0.098025f, 0.105408f, 0.046190f} + }, + { + {0.027441f, 0.021679f, -0.082621f, -0.191948f, -0.202084f, -0.094108f, 0.096974f, 0.326618f, 0.521978f, 0.590057f, 0.497559f, 0.307017f, 0.099764f, -0.101988f, -0.307232f, -0.491820f, -0.609355f, -0.649595f, -0.646886f, -0.633907f, -0.612951f, -0.571444f, -0.505172f, -0.422223f, -0.334883f, -0.251121f, -0.170169f, -0.086087f, 0.003629f, 0.095234f, 0.184031f, 0.268139f, 0.346272f, 0.415753f, 0.474124f, 0.520403f, 0.554178f, 0.575097f, 0.583394f, 0.580090f, 0.567158f, 0.547787f, 0.525101f, 0.500036f, 0.471584f, 0.439385f, 0.404951f, 0.370416f, 0.337380f, 0.306853f, 0.278873f, 0.252040f, 0.224475f, 0.195404f, 0.165334f, 0.135006f, 0.104920f, 0.075648f, 0.047947f, 0.022412f, -0.000792f, -0.021853f, -0.040983f, -0.058167f, -0.073292f, -0.086448f, -0.097776f, -0.107101f, -0.114171f, -0.119257f, -0.122970f, -0.125515f, -0.126712f, -0.126774f, -0.126359f, -0.125690f, -0.124305f, -0.122054f, -0.119813f, -0.118756f, -0.119207f, -0.120613f, -0.122402f, -0.124386f, -0.126292f, -0.127367f, -0.126798f, -0.124468f, -0.121185f, -0.118139f, -0.116167f, -0.115553f, -0.116624f, -0.120458f, -0.128545f, -0.141294f, + -0.156980f, -0.172648f, -0.186184f, -0.197243f, -0.206090f, -0.211880f, -0.212427f, -0.205830f, -0.192230f, -0.173709f, -0.152371f, -0.128816f, -0.102692f, -0.074344f, -0.045427f, -0.018045f, 0.006404f, 0.027767f, 0.046885f, 0.064600f, 0.080777f, 0.094441f, 0.104938f, 0.112698f, 0.118996f, 0.125328f, 0.132751f, 0.141144f, 0.149168f, 0.155522f, 0.160126f, 0.163757f, 0.166992f, 0.170045f, 0.173074f, 0.175948f, 0.178087f, 0.179025f, 0.178790f, 0.177467f, 0.174929f, 0.171183f, 0.166401f, 0.160453f, 0.152932f, 0.143629f, 0.132548f, 0.119638f, 0.105028f, 0.089256f, 0.072911f, 0.056388f, 0.040116f, 0.024480f, 0.009419f, -0.005258f, -0.019264f, -0.032140f, -0.043833f, -0.054222f, -0.062625f, -0.068570f, -0.072428f, -0.074596f, -0.074922f, -0.073532f, -0.071151f, -0.068045f, -0.063754f, -0.058200f, -0.051948f, -0.045349f, -0.038611f, -0.032407f, -0.027221f, -0.022662f, -0.018431f, -0.014899f, -0.011798f, -0.007903f, -0.002918f, 0.002034f, 0.006392f, 0.010574f, 0.014257f, 0.016609f, 0.018102f, 0.019736f, 0.021213f, 0.022181f, 0.023713f, 0.026265f, 0.028470f, 0.029930f, 0.032014f, 0.034470f, + 0.035580f, 0.036329f, 0.038845f, 0.041238f, 0.041102f, 0.042047f, 0.047533f, 0.052212f, 0.051464f, 0.053228f, 0.064060f, 0.071678f, 0.064058f, 0.058056f, 0.078804f, 0.113563f, 0.120945f, 0.090397f, 0.057586f, 0.050567f, 0.053941f, 0.042361f, 0.020875f, 0.011317f, 0.018428f, 0.028794f, 0.030929f, 0.021922f, 0.003208f, -0.020240f, -0.044523f, -0.076714f, -0.128079f, -0.186110f, -0.204814f, -0.146629f, -0.038156f, 0.042081f, 0.052437f, 0.040839f, 0.071199f, 0.121547f, 0.126005f, 0.113437f, 0.196100f, 0.367783f, 0.422586f, 0.192647f}, + {0.027441f, 0.021679f, -0.082621f, -0.191948f, -0.202084f, -0.094108f, 0.096974f, 0.326618f, 0.521978f, 0.590057f, 0.497559f, 0.307017f, 0.099764f, -0.101988f, -0.307232f, -0.491820f, -0.609355f, -0.649595f, -0.646886f, -0.633907f, -0.612951f, -0.571444f, -0.505172f, -0.422223f, -0.334883f, -0.251121f, -0.170169f, -0.086087f, 0.003629f, 0.095234f, 0.184031f, 0.268139f, 0.346272f, 0.415753f, 0.474124f, 0.520403f, 0.554178f, 0.575097f, 0.583394f, 0.580090f, 0.567158f, 0.547787f, 0.525101f, 0.500036f, 0.471584f, 0.439385f, 0.404951f, 0.370416f, 0.337380f, 0.306853f, 0.278873f, 0.252040f, 0.224475f, 0.195404f, 0.165334f, 0.135006f, 0.104920f, 0.075648f, 0.047947f, 0.022412f, -0.000792f, -0.021853f, -0.040983f, -0.058167f, -0.073292f, -0.086448f, -0.097776f, -0.107101f, -0.114171f, -0.119257f, -0.122970f, -0.125515f, -0.126712f, -0.126774f, -0.126359f, -0.125690f, -0.124305f, -0.122054f, -0.119813f, -0.118756f, -0.119207f, -0.120613f, -0.122402f, -0.124386f, -0.126292f, -0.127367f, -0.126798f, -0.124468f, -0.121185f, -0.118139f, -0.116167f, -0.115553f, -0.116624f, -0.120458f, -0.128545f, -0.141294f, + -0.156980f, -0.172648f, -0.186184f, -0.197243f, -0.206090f, -0.211880f, -0.212427f, -0.205830f, -0.192230f, -0.173709f, -0.152371f, -0.128816f, -0.102692f, -0.074344f, -0.045427f, -0.018045f, 0.006404f, 0.027767f, 0.046885f, 0.064600f, 0.080777f, 0.094441f, 0.104938f, 0.112698f, 0.118996f, 0.125328f, 0.132751f, 0.141144f, 0.149168f, 0.155522f, 0.160126f, 0.163757f, 0.166992f, 0.170045f, 0.173074f, 0.175948f, 0.178087f, 0.179025f, 0.178790f, 0.177467f, 0.174929f, 0.171183f, 0.166401f, 0.160453f, 0.152932f, 0.143629f, 0.132548f, 0.119638f, 0.105028f, 0.089256f, 0.072911f, 0.056388f, 0.040116f, 0.024480f, 0.009419f, -0.005258f, -0.019264f, -0.032140f, -0.043833f, -0.054222f, -0.062625f, -0.068570f, -0.072428f, -0.074596f, -0.074922f, -0.073532f, -0.071151f, -0.068045f, -0.063754f, -0.058200f, -0.051948f, -0.045349f, -0.038611f, -0.032407f, -0.027221f, -0.022662f, -0.018431f, -0.014899f, -0.011798f, -0.007903f, -0.002918f, 0.002034f, 0.006392f, 0.010574f, 0.014257f, 0.016609f, 0.018102f, 0.019736f, 0.021213f, 0.022181f, 0.023713f, 0.026265f, 0.028470f, 0.029930f, 0.032014f, 0.034470f, + 0.035580f, 0.036329f, 0.038845f, 0.041238f, 0.041102f, 0.042047f, 0.047533f, 0.052212f, 0.051464f, 0.053228f, 0.064060f, 0.071678f, 0.064058f, 0.058056f, 0.078804f, 0.113563f, 0.120945f, 0.090397f, 0.057586f, 0.050567f, 0.053941f, 0.042361f, 0.020875f, 0.011317f, 0.018428f, 0.028794f, 0.030929f, 0.021922f, 0.003208f, -0.020240f, -0.044523f, -0.076714f, -0.128079f, -0.186110f, -0.204814f, -0.146629f, -0.038156f, 0.042081f, 0.052437f, 0.040839f, 0.071199f, 0.121547f, 0.126005f, 0.113437f, 0.196100f, 0.367783f, 0.422586f, 0.192647f} + } +}; +const float *CRendBin_HOA2_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float *CRendBin_HOA2_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; + +/* Sample Rate = 32000 */ + +const int16_t CRendBin_HOA2_HRIR_max_num_iterations_32kHz = 1; +const uint16_t CRendBin_HOA2_HRIR_num_iterations_32kHz[9][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {0, 0}; +const uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[9][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}}; +const uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_32kHz = 0; +const float CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz[9]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f}; +const uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float CRendBin_HOA2_HRIR_coeff_re_32kHz[9][BINAURAL_CHANNELS][160]={ + { + {0.897602f, 0.577826f, 0.108806f, -0.306523f, -0.566468f, -0.683867f, -0.708050f, -0.662267f, -0.546112f, -0.366162f, -0.147663f, 0.075830f, 0.274439f, 0.427135f, 0.523893f, 0.565927f, 0.561989f, 0.522411f, 0.455067f, 0.365320f, 0.258865f, 0.144039f, 0.030037f, -0.077847f, -0.179832f, -0.277247f, -0.367752f, -0.446478f, -0.510700f, -0.561304f, -0.600215f, -0.628591f, -0.647703f, -0.659706f, -0.666671f, -0.669681f, -0.669369f, -0.666740f, -0.662997f, -0.658812f, -0.654035f, -0.648036f, -0.640253f, -0.630498f, -0.618870f, -0.605516f, -0.590564f, -0.574163f, -0.556413f, -0.537291f, -0.516802f, -0.495178f, -0.472808f, -0.450009f, -0.427015f, -0.404157f, -0.381849f, -0.360307f, -0.339403f, -0.318926f, -0.298870f, -0.279294f, -0.260068f, -0.241018f, -0.222243f, -0.203976f, -0.186205f, -0.168754f, -0.151665f, -0.135094f, -0.118902f, -0.102773f, -0.086674f, -0.070750f, -0.054844f, -0.038640f, -0.022176f, -0.005693f, 0.010967f, 0.028233f, 0.046067f, 0.063897f, 0.081395f, 0.098808f, 0.116372f, 0.133779f, 0.150477f, 0.166354f, 0.181854f, 0.197372f, 0.212626f, 0.226853f, 0.239657f, 0.251401f, 0.262567f, 0.273031f, + 0.282281f, 0.290215f, 0.297417f, 0.304666f, 0.312357f, 0.320369f, 0.328416f, 0.336584f, 0.345432f, 0.355456f, 0.366574f, 0.378314f, 0.390352f, 0.402657f, 0.415266f, 0.428155f, 0.441199f, 0.454112f, 0.466543f, 0.478326f, 0.489500f, 0.500130f, 0.510290f, 0.520137f, 0.529784f, 0.539205f, 0.548418f, 0.557568f, 0.566687f, 0.575611f, 0.584243f, 0.592610f, 0.600634f, 0.608188f, 0.615368f, 0.622392f, 0.629357f, 0.636344f, 0.643544f, 0.651019f, 0.658638f, 0.666412f, 0.674501f, 0.682889f, 0.691585f, 0.700932f, 0.711138f, 0.721918f, 0.733181f, 0.745327f, 0.758323f, 0.771744f, 0.786076f, 0.802163f, 0.819709f, 0.839320f, 0.863573f, 0.887678f, 0.889456f, 0.843076f, 0.751715f, 0.655369f, 0.594023f, 0.571927f}, + {0.897602f, 0.577826f, 0.108806f, -0.306523f, -0.566468f, -0.683867f, -0.708050f, -0.662267f, -0.546112f, -0.366162f, -0.147663f, 0.075830f, 0.274439f, 0.427135f, 0.523893f, 0.565927f, 0.561989f, 0.522411f, 0.455067f, 0.365320f, 0.258865f, 0.144039f, 0.030037f, -0.077847f, -0.179832f, -0.277247f, -0.367752f, -0.446478f, -0.510700f, -0.561304f, -0.600215f, -0.628591f, -0.647703f, -0.659706f, -0.666671f, -0.669681f, -0.669369f, -0.666740f, -0.662997f, -0.658812f, -0.654035f, -0.648036f, -0.640253f, -0.630498f, -0.618870f, -0.605516f, -0.590564f, -0.574163f, -0.556413f, -0.537291f, -0.516802f, -0.495178f, -0.472808f, -0.450009f, -0.427015f, -0.404157f, -0.381849f, -0.360307f, -0.339403f, -0.318926f, -0.298870f, -0.279294f, -0.260068f, -0.241018f, -0.222243f, -0.203976f, -0.186205f, -0.168754f, -0.151665f, -0.135094f, -0.118902f, -0.102773f, -0.086674f, -0.070750f, -0.054844f, -0.038640f, -0.022176f, -0.005693f, 0.010967f, 0.028233f, 0.046067f, 0.063897f, 0.081395f, 0.098808f, 0.116372f, 0.133779f, 0.150477f, 0.166354f, 0.181854f, 0.197372f, 0.212626f, 0.226853f, 0.239657f, 0.251401f, 0.262567f, 0.273031f, + 0.282281f, 0.290215f, 0.297417f, 0.304666f, 0.312357f, 0.320369f, 0.328416f, 0.336584f, 0.345432f, 0.355456f, 0.366574f, 0.378314f, 0.390352f, 0.402657f, 0.415266f, 0.428155f, 0.441199f, 0.454112f, 0.466543f, 0.478326f, 0.489500f, 0.500130f, 0.510290f, 0.520137f, 0.529784f, 0.539205f, 0.548418f, 0.557568f, 0.566687f, 0.575611f, 0.584243f, 0.592610f, 0.600634f, 0.608188f, 0.615368f, 0.622392f, 0.629357f, 0.636344f, 0.643544f, 0.651019f, 0.658638f, 0.666412f, 0.674501f, 0.682889f, 0.691585f, 0.700932f, 0.711138f, 0.721918f, 0.733181f, 0.745327f, 0.758323f, 0.771744f, 0.786076f, 0.802163f, 0.819709f, 0.839320f, 0.863573f, 0.887678f, 0.889456f, 0.843076f, 0.751715f, 0.655369f, 0.594023f, 0.571927f} + }, + { + {0.025194f, 0.342112f, 0.675564f, 0.682494f, 0.258733f, -0.398681f, -0.973589f, -1.262576f, -1.256946f, -1.058731f, -0.764793f, -0.426634f, -0.073890f, 0.263727f, 0.559774f, 0.798438f, 0.971176f, 1.071852f, 1.099750f, 1.064803f, 0.985420f, 0.879037f, 0.754656f, 0.614706f, 0.462886f, 0.307828f, 0.158623f, 0.019325f, -0.110401f, -0.231143f, -0.342445f, -0.444256f, -0.537190f, -0.621517f, -0.697392f, -0.765776f, -0.828007f, -0.884703f, -0.935654f, -0.980323f, -1.017968f, -1.047912f, -1.070192f, -1.085582f, -1.094827f, -1.098295f, -1.096314f, -1.089341f, -1.077935f, -1.062999f, -1.045792f, -1.027186f, -1.007049f, -0.984675f, -0.959577f, -0.931701f, -0.901301f, -0.868883f, -0.835096f, -0.800590f, -0.766000f, -0.731849f, -0.698317f, -0.665445f, -0.633597f, -0.603249f, -0.574361f, -0.546664f, -0.520494f, -0.496496f, -0.474634f, -0.454436f, -0.436061f, -0.419958f, -0.405621f, -0.391915f, -0.378565f, -0.366066f, -0.354142f, -0.341591f, -0.327794f, -0.313265f, -0.298453f, -0.282899f, -0.265880f, -0.247319f, -0.227788f, -0.207881f, -0.187683f, -0.166750f, -0.144562f, -0.120841f, -0.095390f, -0.067900f, -0.038125f, -0.005978f, + 0.028618f, 0.065539f, 0.103963f, 0.142557f, 0.180312f, 0.216742f, 0.251282f, 0.283074f, 0.311414f, 0.335949f, 0.356498f, 0.373081f, 0.385974f, 0.395461f, 0.401900f, 0.406261f, 0.410013f, 0.414134f, 0.418648f, 0.423274f, 0.428046f, 0.433325f, 0.439768f, 0.448163f, 0.458716f, 0.470631f, 0.482794f, 0.494578f, 0.505783f, 0.516446f, 0.526959f, 0.537714f, 0.548520f, 0.558994f, 0.569308f, 0.579744f, 0.589954f, 0.599564f, 0.608906f, 0.618335f, 0.627675f, 0.637031f, 0.647025f, 0.657685f, 0.668438f, 0.679464f, 0.691511f, 0.704568f, 0.718501f, 0.734270f, 0.752608f, 0.772902f, 0.795176f, 0.820738f, 0.849727f, 0.882515f, 0.922967f, 0.969024f, 0.996502f, 0.969523f, 0.881689f, 0.774824f, 0.699914f, 0.669918f}, + {-0.025194f, -0.342112f, -0.675564f, -0.682494f, -0.258733f, 0.398681f, 0.973589f, 1.262576f, 1.256946f, 1.058731f, 0.764793f, 0.426634f, 0.073890f, -0.263727f, -0.559774f, -0.798438f, -0.971176f, -1.071852f, -1.099750f, -1.064803f, -0.985420f, -0.879037f, -0.754656f, -0.614706f, -0.462886f, -0.307828f, -0.158623f, -0.019325f, 0.110401f, 0.231143f, 0.342445f, 0.444256f, 0.537190f, 0.621517f, 0.697392f, 0.765776f, 0.828007f, 0.884703f, 0.935654f, 0.980323f, 1.017968f, 1.047912f, 1.070192f, 1.085582f, 1.094827f, 1.098295f, 1.096314f, 1.089341f, 1.077935f, 1.062999f, 1.045792f, 1.027186f, 1.007049f, 0.984675f, 0.959577f, 0.931701f, 0.901301f, 0.868883f, 0.835096f, 0.800590f, 0.766000f, 0.731849f, 0.698317f, 0.665445f, 0.633597f, 0.603249f, 0.574361f, 0.546664f, 0.520494f, 0.496496f, 0.474634f, 0.454436f, 0.436061f, 0.419958f, 0.405621f, 0.391915f, 0.378565f, 0.366066f, 0.354142f, 0.341591f, 0.327794f, 0.313265f, 0.298453f, 0.282899f, 0.265880f, 0.247319f, 0.227788f, 0.207881f, 0.187683f, 0.166750f, 0.144562f, 0.120841f, 0.095390f, 0.067900f, 0.038125f, 0.005978f, + -0.028618f, -0.065539f, -0.103963f, -0.142557f, -0.180312f, -0.216742f, -0.251282f, -0.283074f, -0.311414f, -0.335949f, -0.356498f, -0.373081f, -0.385974f, -0.395461f, -0.401900f, -0.406261f, -0.410013f, -0.414134f, -0.418648f, -0.423274f, -0.428046f, -0.433325f, -0.439768f, -0.448163f, -0.458716f, -0.470631f, -0.482794f, -0.494578f, -0.505783f, -0.516446f, -0.526959f, -0.537714f, -0.548520f, -0.558994f, -0.569308f, -0.579744f, -0.589954f, -0.599564f, -0.608906f, -0.618335f, -0.627675f, -0.637031f, -0.647025f, -0.657685f, -0.668438f, -0.679464f, -0.691511f, -0.704568f, -0.718501f, -0.734270f, -0.752608f, -0.772902f, -0.795176f, -0.820738f, -0.849727f, -0.882515f, -0.922967f, -0.969024f, -0.996502f, -0.969523f, -0.881689f, -0.774824f, -0.699914f, -0.669918f} + }, + { + {0.123783f, 0.079142f, -0.013604f, -0.105100f, -0.113185f, -0.024894f, 0.074468f, 0.098724f, 0.046327f, -0.027465f, -0.078213f, -0.088258f, -0.055710f, -0.000383f, 0.042236f, 0.057986f, 0.069486f, 0.099522f, 0.137420f, 0.156798f, 0.149156f, 0.123327f, 0.085399f, 0.036913f, -0.013895f, -0.054098f, -0.078834f, -0.094462f, -0.109491f, -0.126339f, -0.140883f, -0.147343f, -0.143570f, -0.132138f, -0.116877f, -0.100467f, -0.086153f, -0.078747f, -0.081336f, -0.092548f, -0.108797f, -0.127742f, -0.148326f, -0.169245f, -0.189131f, -0.207447f, -0.224308f, -0.239991f, -0.254774f, -0.268361f, -0.279300f, -0.285688f, -0.286493f, -0.281631f, -0.271021f, -0.254283f, -0.231338f, -0.202668f, -0.168822f, -0.129974f, -0.086151f, -0.037693f, 0.014755f, 0.070664f, 0.129601f, 0.190610f, 0.252066f, 0.312376f, 0.370362f, 0.424702f, 0.473595f, 0.515352f, 0.548741f, 0.572621f, 0.586173f, 0.589753f, 0.584497f, 0.570819f, 0.548637f, 0.519448f, 0.486508f, 0.451975f, 0.415486f, 0.376839f, 0.338596f, 0.304072f, 0.273539f, 0.244560f, 0.216101f, 0.190399f, 0.170141f, 0.155231f, 0.143391f, 0.133067f, 0.124640f, 0.119123f, + 0.116745f, 0.116888f, 0.118578f, 0.120715f, 0.122313f, 0.122982f, 0.123106f, 0.123239f, 0.123145f, 0.121392f, 0.116164f, 0.106765f, 0.094311f, 0.080694f, 0.066929f, 0.052762f, 0.037599f, 0.021374f, 0.004602f, -0.011834f, -0.026863f, -0.039513f, -0.049167f, -0.055515f, -0.058454f, -0.058150f, -0.054920f, -0.048913f, -0.040142f, -0.028937f, -0.016071f, -0.002374f, 0.011525f, 0.025132f, 0.038028f, 0.049816f, 0.059954f, 0.067900f, 0.073662f, 0.077971f, 0.081798f, 0.086018f, 0.091452f, 0.098460f, 0.106332f, 0.113772f, 0.120190f, 0.125901f, 0.131052f, 0.135199f, 0.138076f, 0.139868f, 0.140465f, 0.139339f, 0.136539f, 0.132830f, 0.127801f, 0.118282f, 0.100330f, 0.074236f, 0.047165f, 0.028710f, 0.022439f, 0.022954f}, + {0.123783f, 0.079142f, -0.013604f, -0.105100f, -0.113185f, -0.024894f, 0.074468f, 0.098724f, 0.046327f, -0.027465f, -0.078213f, -0.088258f, -0.055710f, -0.000383f, 0.042236f, 0.057986f, 0.069486f, 0.099522f, 0.137420f, 0.156798f, 0.149156f, 0.123327f, 0.085399f, 0.036913f, -0.013895f, -0.054098f, -0.078834f, -0.094462f, -0.109491f, -0.126339f, -0.140883f, -0.147343f, -0.143570f, -0.132138f, -0.116877f, -0.100467f, -0.086153f, -0.078747f, -0.081336f, -0.092548f, -0.108797f, -0.127742f, -0.148326f, -0.169245f, -0.189131f, -0.207447f, -0.224308f, -0.239991f, -0.254774f, -0.268361f, -0.279300f, -0.285688f, -0.286493f, -0.281631f, -0.271021f, -0.254283f, -0.231338f, -0.202668f, -0.168822f, -0.129974f, -0.086151f, -0.037693f, 0.014755f, 0.070664f, 0.129601f, 0.190610f, 0.252066f, 0.312376f, 0.370362f, 0.424702f, 0.473595f, 0.515352f, 0.548741f, 0.572621f, 0.586173f, 0.589753f, 0.584497f, 0.570819f, 0.548637f, 0.519448f, 0.486508f, 0.451975f, 0.415486f, 0.376839f, 0.338596f, 0.304072f, 0.273539f, 0.244560f, 0.216101f, 0.190399f, 0.170141f, 0.155231f, 0.143391f, 0.133067f, 0.124640f, 0.119123f, + 0.116745f, 0.116888f, 0.118578f, 0.120715f, 0.122313f, 0.122982f, 0.123106f, 0.123239f, 0.123145f, 0.121392f, 0.116164f, 0.106765f, 0.094311f, 0.080694f, 0.066929f, 0.052762f, 0.037599f, 0.021374f, 0.004602f, -0.011834f, -0.026863f, -0.039513f, -0.049167f, -0.055515f, -0.058454f, -0.058150f, -0.054920f, -0.048913f, -0.040142f, -0.028937f, -0.016071f, -0.002374f, 0.011525f, 0.025132f, 0.038028f, 0.049816f, 0.059954f, 0.067900f, 0.073662f, 0.077971f, 0.081798f, 0.086018f, 0.091452f, 0.098460f, 0.106332f, 0.113772f, 0.120190f, 0.125901f, 0.131052f, 0.135199f, 0.138076f, 0.139868f, 0.140465f, 0.139339f, 0.136539f, 0.132830f, 0.127801f, 0.118282f, 0.100330f, 0.074236f, 0.047165f, 0.028710f, 0.022439f, 0.022954f} + }, + { + {0.022041f, 0.041073f, 0.023192f, -0.049439f, -0.115087f, -0.109721f, -0.051812f, -0.018474f, -0.053835f, -0.129015f, -0.184936f, -0.189273f, -0.150509f, -0.096286f, -0.047125f, -0.003652f, 0.046865f, 0.111479f, 0.180387f, 0.235653f, 0.266376f, 0.271854f, 0.255690f, 0.223813f, 0.185119f, 0.146033f, 0.103929f, 0.051053f, -0.014916f, -0.088609f, -0.164699f, -0.242434f, -0.321099f, -0.395711f, -0.460083f, -0.511538f, -0.550187f, -0.575553f, -0.586525f, -0.583852f, -0.570627f, -0.550265f, -0.525062f, -0.496520f, -0.466042f, -0.434860f, -0.403494f, -0.371536f, -0.338271f, -0.303703f, -0.268969f, -0.235863f, -0.206239f, -0.181539f, -0.162004f, -0.146110f, -0.131475f, -0.116507f, -0.100761f, -0.084071f, -0.066392f, -0.048344f, -0.030824f, -0.014005f, 0.002442f, 0.018433f, 0.033863f, 0.049525f, 0.066361f, 0.084044f, 0.101603f, 0.119134f, 0.137365f, 0.155718f, 0.172448f, 0.186743f, 0.199023f, 0.208891f, 0.214543f, 0.214968f, 0.211256f, 0.204664f, 0.194649f, 0.180250f, 0.162586f, 0.144266f, 0.126558f, 0.108656f, 0.089774f, 0.070272f, 0.050282f, 0.028810f, 0.005195f, -0.019706f, -0.044775f, -0.070130f, + -0.096279f, -0.122442f, -0.146818f, -0.168301f, -0.187141f, -0.203936f, -0.218346f, -0.228848f, -0.233859f, -0.233385f, -0.229288f, -0.223466f, -0.215952f, -0.205276f, -0.190468f, -0.172326f, -0.153023f, -0.134730f, -0.118099f, -0.101742f, -0.083649f, -0.063397f, -0.042664f, -0.023688f, -0.007718f, 0.005386f, 0.016948f, 0.028798f, 0.041965f, 0.055994f, 0.069887f, 0.083350f, 0.096784f, 0.110737f, 0.125898f, 0.142980f, 0.162069f, 0.182529f, 0.203711f, 0.225239f, 0.246691f, 0.267725f, 0.288408f, 0.308817f, 0.328558f, 0.347128f, 0.364265f, 0.379624f, 0.392789f, 0.403810f, 0.413056f, 0.420712f, 0.427179f, 0.433354f, 0.439897f, 0.447590f, 0.458254f, 0.470968f, 0.475795f, 0.458226f, 0.416144f, 0.367510f, 0.333844f, 0.320329f}, + {0.022041f, 0.041073f, 0.023192f, -0.049439f, -0.115087f, -0.109721f, -0.051812f, -0.018474f, -0.053835f, -0.129015f, -0.184936f, -0.189273f, -0.150509f, -0.096286f, -0.047125f, -0.003652f, 0.046865f, 0.111479f, 0.180387f, 0.235653f, 0.266376f, 0.271854f, 0.255690f, 0.223813f, 0.185119f, 0.146033f, 0.103929f, 0.051053f, -0.014916f, -0.088609f, -0.164699f, -0.242434f, -0.321099f, -0.395711f, -0.460083f, -0.511538f, -0.550187f, -0.575553f, -0.586525f, -0.583852f, -0.570627f, -0.550265f, -0.525062f, -0.496520f, -0.466042f, -0.434860f, -0.403494f, -0.371536f, -0.338271f, -0.303703f, -0.268969f, -0.235863f, -0.206239f, -0.181539f, -0.162004f, -0.146110f, -0.131475f, -0.116507f, -0.100761f, -0.084071f, -0.066392f, -0.048344f, -0.030824f, -0.014005f, 0.002442f, 0.018433f, 0.033863f, 0.049525f, 0.066361f, 0.084044f, 0.101603f, 0.119134f, 0.137365f, 0.155718f, 0.172448f, 0.186743f, 0.199023f, 0.208891f, 0.214543f, 0.214968f, 0.211256f, 0.204664f, 0.194649f, 0.180250f, 0.162586f, 0.144266f, 0.126558f, 0.108656f, 0.089774f, 0.070272f, 0.050282f, 0.028810f, 0.005195f, -0.019706f, -0.044775f, -0.070130f, + -0.096279f, -0.122442f, -0.146818f, -0.168301f, -0.187141f, -0.203936f, -0.218346f, -0.228848f, -0.233859f, -0.233385f, -0.229288f, -0.223466f, -0.215952f, -0.205276f, -0.190468f, -0.172326f, -0.153023f, -0.134730f, -0.118099f, -0.101742f, -0.083649f, -0.063397f, -0.042664f, -0.023688f, -0.007718f, 0.005386f, 0.016948f, 0.028798f, 0.041965f, 0.055994f, 0.069887f, 0.083350f, 0.096784f, 0.110737f, 0.125898f, 0.142980f, 0.162069f, 0.182529f, 0.203711f, 0.225239f, 0.246691f, 0.267725f, 0.288408f, 0.308817f, 0.328558f, 0.347128f, 0.364265f, 0.379624f, 0.392789f, 0.403810f, 0.413056f, 0.420712f, 0.427179f, 0.433354f, 0.439897f, 0.447590f, 0.458254f, 0.470968f, 0.475795f, 0.458226f, 0.416144f, 0.367510f, 0.333844f, 0.320329f} + }, + { + {-0.005214f, -0.012035f, -0.009014f, 0.007877f, 0.019283f, 0.010352f, -0.005363f, -0.007510f, -0.007889f, -0.044647f, -0.130133f, -0.222011f, -0.261436f, -0.231829f, -0.165637f, -0.098922f, -0.037652f, 0.029690f, 0.105217f, 0.179277f, 0.244858f, 0.300922f, 0.344183f, 0.368195f, 0.371300f, 0.358203f, 0.332456f, 0.292925f, 0.238828f, 0.173336f, 0.100520f, 0.022498f, -0.058965f, -0.141179f, -0.221961f, -0.299269f, -0.368344f, -0.422261f, -0.457042f, -0.474532f, -0.479617f, -0.476556f, -0.468368f, -0.457295f, -0.444411f, -0.429759f, -0.413316f, -0.395072f, -0.374540f, -0.351376f, -0.326316f, -0.300687f, -0.275591f, -0.252211f, -0.231900f, -0.215002f, -0.200352f, -0.186616f, -0.173280f, -0.159962f, -0.145930f, -0.130822f, -0.114800f, -0.097728f, -0.079173f, -0.059239f, -0.038296f, -0.016038f, 0.008048f, 0.033506f, 0.059464f, 0.086049f, 0.113882f, 0.142353f, 0.169789f, 0.195294f, 0.218976f, 0.240131f, 0.256716f, 0.267460f, 0.273427f, 0.276291f, 0.275776f, 0.270341f, 0.260230f, 0.247866f, 0.234578f, 0.218792f, 0.198739f, 0.175404f, 0.151105f, 0.126417f, 0.100478f, 0.073625f, 0.047824f, 0.024650f, + 0.004240f, -0.013904f, -0.030088f, -0.044324f, -0.056473f, -0.066662f, -0.075552f, -0.083740f, -0.091164f, -0.097859f, -0.104823f, -0.112999f, -0.121758f, -0.129448f, -0.135168f, -0.139283f, -0.142788f, -0.146790f, -0.151766f, -0.156646f, -0.159449f, -0.159367f, -0.157478f, -0.155349f, -0.153958f, -0.153759f, -0.154479f, -0.154881f, -0.153809f, -0.151277f, -0.147765f, -0.143164f, -0.137159f, -0.129701f, -0.120395f, -0.108503f, -0.094137f, -0.078348f, -0.061862f, -0.044971f, -0.028452f, -0.013082f, 0.001363f, 0.015222f, 0.027814f, 0.038476f, 0.047586f, 0.055404f, 0.061486f, 0.066217f, 0.071000f, 0.076305f, 0.081762f, 0.088199f, 0.096942f, 0.108135f, 0.123108f, 0.145741f, 0.175423f, 0.200807f, 0.208485f, 0.197997f, 0.181833f, 0.171727f}, + {0.005214f, 0.012035f, 0.009014f, -0.007877f, -0.019283f, -0.010352f, 0.005363f, 0.007510f, 0.007889f, 0.044647f, 0.130133f, 0.222011f, 0.261436f, 0.231829f, 0.165637f, 0.098922f, 0.037652f, -0.029690f, -0.105217f, -0.179277f, -0.244858f, -0.300922f, -0.344183f, -0.368195f, -0.371300f, -0.358203f, -0.332456f, -0.292925f, -0.238828f, -0.173336f, -0.100520f, -0.022498f, 0.058965f, 0.141179f, 0.221961f, 0.299269f, 0.368344f, 0.422261f, 0.457042f, 0.474532f, 0.479617f, 0.476556f, 0.468368f, 0.457295f, 0.444411f, 0.429759f, 0.413316f, 0.395072f, 0.374540f, 0.351376f, 0.326316f, 0.300687f, 0.275591f, 0.252211f, 0.231900f, 0.215002f, 0.200352f, 0.186616f, 0.173280f, 0.159962f, 0.145930f, 0.130822f, 0.114800f, 0.097728f, 0.079173f, 0.059239f, 0.038296f, 0.016038f, -0.008048f, -0.033506f, -0.059464f, -0.086049f, -0.113882f, -0.142353f, -0.169789f, -0.195294f, -0.218976f, -0.240131f, -0.256716f, -0.267460f, -0.273427f, -0.276291f, -0.275776f, -0.270341f, -0.260230f, -0.247866f, -0.234578f, -0.218792f, -0.198739f, -0.175404f, -0.151105f, -0.126417f, -0.100478f, -0.073625f, -0.047824f, -0.024650f, + -0.004240f, 0.013904f, 0.030088f, 0.044324f, 0.056473f, 0.066662f, 0.075552f, 0.083740f, 0.091164f, 0.097859f, 0.104823f, 0.112999f, 0.121758f, 0.129448f, 0.135168f, 0.139283f, 0.142788f, 0.146790f, 0.151766f, 0.156646f, 0.159449f, 0.159367f, 0.157478f, 0.155349f, 0.153958f, 0.153759f, 0.154479f, 0.154881f, 0.153809f, 0.151277f, 0.147765f, 0.143164f, 0.137159f, 0.129701f, 0.120395f, 0.108503f, 0.094137f, 0.078348f, 0.061862f, 0.044971f, 0.028452f, 0.013082f, -0.001363f, -0.015222f, -0.027814f, -0.038476f, -0.047586f, -0.055404f, -0.061486f, -0.066217f, -0.071000f, -0.076305f, -0.081762f, -0.088199f, -0.096942f, -0.108135f, -0.123108f, -0.145741f, -0.175423f, -0.200807f, -0.208485f, -0.197997f, -0.181833f, -0.171727f} + }, + { + {0.008681f, -0.007006f, 0.004000f, 0.026347f, 0.002760f, -0.038331f, 0.006171f, 0.136506f, 0.198542f, 0.078413f, -0.135945f, -0.262918f, -0.236625f, -0.135691f, -0.048903f, 0.007812f, 0.055850f, 0.104669f, 0.150421f, 0.186943f, 0.205853f, 0.201553f, 0.178803f, 0.147187f, 0.112390f, 0.078987f, 0.053819f, 0.039640f, 0.032313f, 0.029119f, 0.032808f, 0.043807f, 0.055721f, 0.062616f, 0.065392f, 0.068013f, 0.071303f, 0.072155f, 0.066110f, 0.050305f, 0.025937f, -0.002323f, -0.030282f, -0.056406f, -0.080135f, -0.100964f, -0.120011f, -0.139825f, -0.161681f, -0.184845f, -0.208443f, -0.232018f, -0.254562f, -0.274818f, -0.291910f, -0.304396f, -0.309955f, -0.307333f, -0.297155f, -0.279908f, -0.255047f, -0.222884f, -0.185171f, -0.142916f, -0.095718f, -0.043976f, 0.010261f, 0.065148f, 0.119827f, 0.172971f, 0.222331f, 0.265979f, 0.302588f, 0.330642f, 0.348872f, 0.357338f, 0.356806f, 0.347327f, 0.328721f, 0.302266f, 0.270550f, 0.235332f, 0.196512f, 0.153780f, 0.108694f, 0.064148f, 0.021732f, -0.019338f, -0.060114f, -0.099823f, -0.136838f, -0.170677f, -0.201625f, -0.229144f, -0.252213f, -0.270647f, + -0.284574f, -0.293091f, -0.294909f, -0.290009f, -0.279511f, -0.264143f, -0.243706f, -0.217880f, -0.187362f, -0.154731f, -0.123924f, -0.097637f, -0.075158f, -0.053870f, -0.032820f, -0.013784f, 0.000845f, 0.010043f, 0.014447f, 0.015892f, 0.016428f, 0.016909f, 0.016785f, 0.015629f, 0.014101f, 0.013167f, 0.013445f, 0.015591f, 0.020168f, 0.026843f, 0.034697f, 0.043310f, 0.052551f, 0.061637f, 0.069506f, 0.075771f, 0.080384f, 0.082989f, 0.083492f, 0.082527f, 0.080660f, 0.077997f, 0.074980f, 0.072358f, 0.070026f, 0.067161f, 0.063681f, 0.060202f, 0.056641f, 0.052323f, 0.047305f, 0.042095f, 0.036453f, 0.029989f, 0.023331f, 0.017095f, 0.010304f, 0.001573f, -0.008448f, -0.017114f, -0.022058f, -0.022784f, -0.020762f, -0.018652f}, + {-0.008681f, 0.007006f, -0.004000f, -0.026347f, -0.002760f, 0.038331f, -0.006171f, -0.136506f, -0.198542f, -0.078413f, 0.135945f, 0.262918f, 0.236625f, 0.135691f, 0.048903f, -0.007812f, -0.055850f, -0.104669f, -0.150421f, -0.186943f, -0.205853f, -0.201553f, -0.178803f, -0.147187f, -0.112390f, -0.078987f, -0.053819f, -0.039640f, -0.032313f, -0.029119f, -0.032808f, -0.043807f, -0.055721f, -0.062616f, -0.065392f, -0.068013f, -0.071303f, -0.072155f, -0.066110f, -0.050305f, -0.025937f, 0.002323f, 0.030282f, 0.056406f, 0.080135f, 0.100964f, 0.120011f, 0.139825f, 0.161681f, 0.184845f, 0.208443f, 0.232018f, 0.254562f, 0.274818f, 0.291910f, 0.304396f, 0.309955f, 0.307333f, 0.297155f, 0.279908f, 0.255047f, 0.222884f, 0.185171f, 0.142916f, 0.095718f, 0.043976f, -0.010261f, -0.065148f, -0.119827f, -0.172971f, -0.222331f, -0.265979f, -0.302588f, -0.330642f, -0.348872f, -0.357338f, -0.356806f, -0.347327f, -0.328721f, -0.302266f, -0.270550f, -0.235332f, -0.196512f, -0.153780f, -0.108694f, -0.064148f, -0.021732f, 0.019338f, 0.060114f, 0.099823f, 0.136838f, 0.170677f, 0.201625f, 0.229144f, 0.252213f, 0.270647f, + 0.284574f, 0.293091f, 0.294909f, 0.290009f, 0.279511f, 0.264143f, 0.243706f, 0.217880f, 0.187362f, 0.154731f, 0.123924f, 0.097637f, 0.075158f, 0.053870f, 0.032820f, 0.013784f, -0.000845f, -0.010043f, -0.014447f, -0.015892f, -0.016428f, -0.016909f, -0.016785f, -0.015629f, -0.014101f, -0.013167f, -0.013445f, -0.015591f, -0.020168f, -0.026843f, -0.034697f, -0.043310f, -0.052551f, -0.061637f, -0.069506f, -0.075771f, -0.080384f, -0.082989f, -0.083492f, -0.082527f, -0.080660f, -0.077997f, -0.074980f, -0.072358f, -0.070026f, -0.067161f, -0.063681f, -0.060202f, -0.056641f, -0.052323f, -0.047305f, -0.042095f, -0.036453f, -0.029989f, -0.023331f, -0.017095f, -0.010304f, -0.001573f, 0.008448f, 0.017114f, 0.022058f, 0.022784f, 0.020762f, 0.018652f} + }, + { + {0.010401f, 0.011253f, -0.005738f, -0.037817f, -0.058181f, -0.060618f, -0.068188f, -0.079320f, -0.041748f, 0.085251f, 0.260974f, 0.390110f, 0.414471f, 0.352584f, 0.254882f, 0.151981f, 0.053337f, -0.032528f, -0.097690f, -0.144583f, -0.181281f, -0.210195f, -0.228688f, -0.236078f, -0.233043f, -0.217999f, -0.191257f, -0.161169f, -0.139941f, -0.132615f, -0.133470f, -0.133307f, -0.127486f, -0.116641f, -0.102612f, -0.085894f, -0.066281f, -0.044043f, -0.019652f, 0.006743f, 0.034431f, 0.061010f, 0.083425f, 0.100521f, 0.113804f, 0.125411f, 0.136119f, 0.145525f, 0.153189f, 0.158951f, 0.162658f, 0.164140f, 0.163216f, 0.159523f, 0.152636f, 0.142591f, 0.130108f, 0.116292f, 0.102235f, 0.088793f, 0.076467f, 0.065511f, 0.056223f, 0.049044f, 0.044299f, 0.042089f, 0.042633f, 0.046534f, 0.054462f, 0.066587f, 0.082521f, 0.101885f, 0.124801f, 0.151564f, 0.181885f, 0.214821f, 0.249618f, 0.286081f, 0.323727f, 0.361053f, 0.396309f, 0.428665f, 0.457905f, 0.483250f, 0.503314f, 0.517194f, 0.524894f, 0.526702f, 0.522777f, 0.513215f, 0.497742f, 0.475384f, 0.445311f, 0.408344f, 0.367083f, 0.324169f, + 0.280673f, 0.236428f, 0.191872f, 0.149429f, 0.112868f, 0.084975f, 0.065708f, 0.052790f, 0.044161f, 0.039640f, 0.040280f, 0.046572f, 0.057462f, 0.070737f, 0.084014f, 0.095537f, 0.104450f, 0.110574f, 0.114025f, 0.114888f, 0.112953f, 0.107615f, 0.098282f, 0.085047f, 0.068865f, 0.050993f, 0.032402f, 0.013636f, -0.005100f, -0.023831f, -0.042533f, -0.060949f, -0.078915f, -0.096773f, -0.115088f, -0.133965f, -0.152974f, -0.171700f, -0.190072f, -0.208255f, -0.226621f, -0.245729f, -0.265976f, -0.287239f, -0.308946f, -0.330305f, -0.350469f, -0.368845f, -0.385301f, -0.399717f, -0.411580f, -0.420680f, -0.427727f, -0.433416f, -0.437771f, -0.441680f, -0.446803f, -0.450047f, -0.439787f, -0.404903f, -0.350495f, -0.298509f, -0.267685f, -0.257452f}, + {0.010401f, 0.011253f, -0.005738f, -0.037817f, -0.058181f, -0.060618f, -0.068188f, -0.079320f, -0.041748f, 0.085251f, 0.260974f, 0.390110f, 0.414471f, 0.352584f, 0.254882f, 0.151981f, 0.053337f, -0.032528f, -0.097690f, -0.144583f, -0.181281f, -0.210195f, -0.228688f, -0.236078f, -0.233043f, -0.217999f, -0.191257f, -0.161169f, -0.139941f, -0.132615f, -0.133470f, -0.133307f, -0.127486f, -0.116641f, -0.102612f, -0.085894f, -0.066281f, -0.044043f, -0.019652f, 0.006743f, 0.034431f, 0.061010f, 0.083425f, 0.100521f, 0.113804f, 0.125411f, 0.136119f, 0.145525f, 0.153189f, 0.158951f, 0.162658f, 0.164140f, 0.163216f, 0.159523f, 0.152636f, 0.142591f, 0.130108f, 0.116292f, 0.102235f, 0.088793f, 0.076467f, 0.065511f, 0.056223f, 0.049044f, 0.044299f, 0.042089f, 0.042633f, 0.046534f, 0.054462f, 0.066587f, 0.082521f, 0.101885f, 0.124801f, 0.151564f, 0.181885f, 0.214821f, 0.249618f, 0.286081f, 0.323727f, 0.361053f, 0.396309f, 0.428665f, 0.457905f, 0.483250f, 0.503314f, 0.517194f, 0.524894f, 0.526702f, 0.522777f, 0.513215f, 0.497742f, 0.475384f, 0.445311f, 0.408344f, 0.367083f, 0.324169f, + 0.280673f, 0.236428f, 0.191872f, 0.149429f, 0.112868f, 0.084975f, 0.065708f, 0.052790f, 0.044161f, 0.039640f, 0.040280f, 0.046572f, 0.057462f, 0.070737f, 0.084014f, 0.095537f, 0.104450f, 0.110574f, 0.114025f, 0.114888f, 0.112953f, 0.107615f, 0.098282f, 0.085047f, 0.068865f, 0.050993f, 0.032402f, 0.013636f, -0.005100f, -0.023831f, -0.042533f, -0.060949f, -0.078915f, -0.096773f, -0.115088f, -0.133965f, -0.152974f, -0.171700f, -0.190072f, -0.208255f, -0.226621f, -0.245729f, -0.265976f, -0.287239f, -0.308946f, -0.330305f, -0.350469f, -0.368845f, -0.385301f, -0.399717f, -0.411580f, -0.420680f, -0.427727f, -0.433416f, -0.437771f, -0.441680f, -0.446803f, -0.450047f, -0.439787f, -0.404903f, -0.350495f, -0.298509f, -0.267685f, -0.257452f} + }, + { + {0.036665f, -0.035275f, -0.114586f, -0.118718f, -0.015407f, 0.134760f, 0.211391f, 0.139028f, -0.031067f, -0.164438f, -0.178059f, -0.109666f, -0.046695f, -0.024403f, -0.021231f, -0.019183f, -0.020786f, -0.019318f, 0.001305f, 0.033895f, 0.049781f, 0.039580f, 0.025871f, 0.029449f, 0.045676f, 0.061011f, 0.073286f, 0.086158f, 0.096886f, 0.098911f, 0.090055f, 0.073542f, 0.055125f, 0.040281f, 0.029997f, 0.019065f, 0.001405f, -0.023950f, -0.053831f, -0.084724f, -0.113197f, -0.135819f, -0.151486f, -0.161898f, -0.168472f, -0.171078f, -0.170195f, -0.167525f, -0.163981f, -0.159417f, -0.154294f, -0.149463f, -0.144644f, -0.139019f, -0.132677f, -0.125920f, -0.118076f, -0.108431f, -0.097501f, -0.086377f, -0.075686f, -0.065850f, -0.057526f, -0.051345f, -0.047649f, -0.046281f, -0.046306f, -0.046648f, -0.047277f, -0.048699f, -0.050162f, -0.049930f, -0.047471f, -0.043537f, -0.037855f, -0.028614f, -0.014546f, 0.004109f, 0.026848f, 0.053650f, 0.084403f, 0.118539f, 0.154999f, 0.192146f, 0.228589f, 0.264237f, 0.299074f, 0.331034f, 0.357520f, 0.379308f, 0.400066f, 0.421005f, 0.438529f, 0.448405f, 0.450190f, 0.446198f, + 0.437637f, 0.423191f, 0.400965f, 0.371104f, 0.336181f, 0.298645f, 0.258247f, 0.213115f, 0.163286f, 0.111757f, 0.061822f, 0.014570f, -0.030995f, -0.076478f, -0.122515f, -0.167505f, -0.208248f, -0.242655f, -0.271265f, -0.295587f, -0.316112f, -0.332553f, -0.344736f, -0.352592f, -0.356405f, -0.357380f, -0.356859f, -0.355036f, -0.351548f, -0.346820f, -0.341632f, -0.335951f, -0.329211f, -0.320835f, -0.309876f, -0.295618f, -0.279195f, -0.263025f, -0.248221f, -0.234100f, -0.220000f, -0.205518f, -0.189543f, -0.171498f, -0.152987f, -0.136079f, -0.120874f, -0.106575f, -0.093232f, -0.080535f, -0.067000f, -0.052177f, -0.037476f, -0.023661f, -0.010075f, 0.003625f, 0.018537f, 0.038226f, 0.063691f, 0.087121f, 0.097456f, 0.092996f, 0.082823f, 0.076118f}, + {0.036665f, -0.035275f, -0.114586f, -0.118718f, -0.015407f, 0.134760f, 0.211391f, 0.139028f, -0.031067f, -0.164438f, -0.178059f, -0.109666f, -0.046695f, -0.024403f, -0.021231f, -0.019183f, -0.020786f, -0.019318f, 0.001305f, 0.033895f, 0.049781f, 0.039580f, 0.025871f, 0.029449f, 0.045676f, 0.061011f, 0.073286f, 0.086158f, 0.096886f, 0.098911f, 0.090055f, 0.073542f, 0.055125f, 0.040281f, 0.029997f, 0.019065f, 0.001405f, -0.023950f, -0.053831f, -0.084724f, -0.113197f, -0.135819f, -0.151486f, -0.161898f, -0.168472f, -0.171078f, -0.170195f, -0.167525f, -0.163981f, -0.159417f, -0.154294f, -0.149463f, -0.144644f, -0.139019f, -0.132677f, -0.125920f, -0.118076f, -0.108431f, -0.097501f, -0.086377f, -0.075686f, -0.065850f, -0.057526f, -0.051345f, -0.047649f, -0.046281f, -0.046306f, -0.046648f, -0.047277f, -0.048699f, -0.050162f, -0.049930f, -0.047471f, -0.043537f, -0.037855f, -0.028614f, -0.014546f, 0.004109f, 0.026848f, 0.053650f, 0.084403f, 0.118539f, 0.154999f, 0.192146f, 0.228589f, 0.264237f, 0.299074f, 0.331034f, 0.357520f, 0.379308f, 0.400066f, 0.421005f, 0.438529f, 0.448405f, 0.450190f, 0.446198f, + 0.437637f, 0.423191f, 0.400965f, 0.371104f, 0.336181f, 0.298645f, 0.258247f, 0.213115f, 0.163286f, 0.111757f, 0.061822f, 0.014570f, -0.030995f, -0.076478f, -0.122515f, -0.167505f, -0.208248f, -0.242655f, -0.271265f, -0.295587f, -0.316112f, -0.332553f, -0.344736f, -0.352592f, -0.356405f, -0.357380f, -0.356859f, -0.355036f, -0.351548f, -0.346820f, -0.341632f, -0.335951f, -0.329211f, -0.320835f, -0.309876f, -0.295618f, -0.279195f, -0.263025f, -0.248221f, -0.234100f, -0.220000f, -0.205518f, -0.189543f, -0.171498f, -0.152987f, -0.136079f, -0.120874f, -0.106575f, -0.093232f, -0.080535f, -0.067000f, -0.052177f, -0.037476f, -0.023661f, -0.010075f, 0.003625f, 0.018537f, 0.038226f, 0.063691f, 0.087121f, 0.097456f, 0.092996f, 0.082823f, 0.076118f} + }, + { + {-0.008953f, 0.064232f, 0.094587f, 0.004517f, -0.161443f, -0.310666f, -0.382836f, -0.340098f, -0.159090f, 0.119965f, 0.388400f, 0.559679f, 0.635026f, 0.652824f, 0.614612f, 0.501215f, 0.332040f, 0.161390f, 0.022521f, -0.093546f, -0.206716f, -0.319236f, -0.419351f, -0.496904f, -0.550885f, -0.588411f, -0.617946f, -0.641341f, -0.653668f, -0.650802f, -0.633429f, -0.603472f, -0.561247f, -0.507426f, -0.444484f, -0.375202f, -0.301814f, -0.226782f, -0.152889f, -0.082752f, -0.018798f, 0.037516f, 0.087042f, 0.131996f, 0.173092f, 0.208904f, 0.238119f, 0.260931f, 0.278385f, 0.291978f, 0.303791f, 0.315427f, 0.326675f, 0.336106f, 0.342711f, 0.346235f, 0.346522f, 0.343445f, 0.337281f, 0.328630f, 0.318130f, 0.306322f, 0.293494f, 0.279679f, 0.265033f, 0.249931f, 0.234518f, 0.218749f, 0.203017f, 0.188064f, 0.174092f, 0.160740f, 0.148084f, 0.136713f, 0.126662f, 0.117293f, 0.108500f, 0.101106f, 0.095680f, 0.091654f, 0.087922f, 0.083778f, 0.079032f, 0.073611f, 0.067353f, 0.060218f, 0.052743f, 0.046136f, 0.041541f, 0.039159f, 0.038398f, 0.038857f, 0.040687f, 0.043768f, 0.046732f, 0.047020f, + 0.042169f, 0.031387f, 0.015858f, -0.002845f, -0.024544f, -0.050092f, -0.079230f, -0.109526f, -0.137786f, -0.162138f, -0.182539f, -0.199609f, -0.213243f, -0.222324f, -0.225756f, -0.223768f, -0.218019f, -0.210365f, -0.201676f, -0.191803f, -0.180339f, -0.167382f, -0.153889f, -0.141348f, -0.130799f, -0.122005f, -0.113636f, -0.104260f, -0.093244f, -0.081045f, -0.068752f, -0.057146f, -0.046134f, -0.035156f, -0.023843f, -0.012002f, 0.000616f, 0.014000f, 0.027669f, 0.041253f, 0.054871f, 0.068605f, 0.082172f, 0.095499f, 0.108853f, 0.122030f, 0.134208f, 0.144885f, 0.154018f, 0.161135f, 0.165524f, 0.167382f, 0.167449f, 0.165627f, 0.161493f, 0.155562f, 0.147668f, 0.134574f, 0.112712f, 0.084430f, 0.058667f, 0.043534f, 0.039424f, 0.040242f}, + {-0.008953f, 0.064232f, 0.094587f, 0.004517f, -0.161443f, -0.310666f, -0.382836f, -0.340098f, -0.159090f, 0.119965f, 0.388400f, 0.559679f, 0.635026f, 0.652824f, 0.614612f, 0.501215f, 0.332040f, 0.161390f, 0.022521f, -0.093546f, -0.206716f, -0.319236f, -0.419351f, -0.496904f, -0.550885f, -0.588411f, -0.617946f, -0.641341f, -0.653668f, -0.650802f, -0.633429f, -0.603472f, -0.561247f, -0.507426f, -0.444484f, -0.375202f, -0.301814f, -0.226782f, -0.152889f, -0.082752f, -0.018798f, 0.037516f, 0.087042f, 0.131996f, 0.173092f, 0.208904f, 0.238119f, 0.260931f, 0.278385f, 0.291978f, 0.303791f, 0.315427f, 0.326675f, 0.336106f, 0.342711f, 0.346235f, 0.346522f, 0.343445f, 0.337281f, 0.328630f, 0.318130f, 0.306322f, 0.293494f, 0.279679f, 0.265033f, 0.249931f, 0.234518f, 0.218749f, 0.203017f, 0.188064f, 0.174092f, 0.160740f, 0.148084f, 0.136713f, 0.126662f, 0.117293f, 0.108500f, 0.101106f, 0.095680f, 0.091654f, 0.087922f, 0.083778f, 0.079032f, 0.073611f, 0.067353f, 0.060218f, 0.052743f, 0.046136f, 0.041541f, 0.039159f, 0.038398f, 0.038857f, 0.040687f, 0.043768f, 0.046732f, 0.047020f, + 0.042169f, 0.031387f, 0.015858f, -0.002845f, -0.024544f, -0.050092f, -0.079230f, -0.109526f, -0.137786f, -0.162138f, -0.182539f, -0.199609f, -0.213243f, -0.222324f, -0.225756f, -0.223768f, -0.218019f, -0.210365f, -0.201676f, -0.191803f, -0.180339f, -0.167382f, -0.153889f, -0.141348f, -0.130799f, -0.122005f, -0.113636f, -0.104260f, -0.093244f, -0.081045f, -0.068752f, -0.057146f, -0.046134f, -0.035156f, -0.023843f, -0.012002f, 0.000616f, 0.014000f, 0.027669f, 0.041253f, 0.054871f, 0.068605f, 0.082172f, 0.095499f, 0.108853f, 0.122030f, 0.134208f, 0.144885f, 0.154018f, 0.161135f, 0.165524f, 0.167382f, 0.167449f, 0.165627f, 0.161493f, 0.155562f, 0.147668f, 0.134574f, 0.112712f, 0.084430f, 0.058667f, 0.043534f, 0.039424f, 0.040242f} + } +}; +const float CRendBin_HOA2_HRIR_coeff_im_32kHz[9][BINAURAL_CHANNELS][160]={ + { + {-0.279937f, -0.718806f, -0.879425f, -0.777443f, -0.538320f, -0.273976f, -0.025783f, 0.204435f, 0.407063f, 0.556330f, 0.629651f, 0.621025f, 0.539807f, 0.405020f, 0.240268f, 0.067825f, -0.096633f, -0.245120f, -0.374269f, -0.481330f, -0.562584f, -0.615551f, -0.642416f, -0.649519f, -0.642111f, -0.620732f, -0.584007f, -0.533693f, -0.475001f, -0.412795f, -0.349591f, -0.286993f, -0.226903f, -0.170652f, -0.118251f, -0.069223f, -0.023545f, 0.018667f, 0.057892f, 0.095208f, 0.131668f, 0.167761f, 0.203372f, 0.238124f, 0.271732f, 0.304055f, 0.334993f, 0.364479f, 0.392521f, 0.419068f, 0.443884f, 0.466673f, 0.487320f, 0.505877f, 0.522377f, 0.536834f, 0.549468f, 0.560746f, 0.571072f, 0.580544f, 0.589150f, 0.597030f, 0.604353f, 0.611043f, 0.616937f, 0.622138f, 0.626912f, 0.631307f, 0.635234f, 0.638853f, 0.642459f, 0.646040f, 0.649387f, 0.652562f, 0.655777f, 0.658908f, 0.661640f, 0.664015f, 0.666294f, 0.668275f, 0.669360f, 0.669333f, 0.668569f, 0.667339f, 0.665357f, 0.662247f, 0.658157f, 0.653645f, 0.649002f, 0.643858f, 0.637637f, 0.630346f, 0.622683f, 0.615246f, 0.607937f, 0.600397f, + 0.592808f, 0.585902f, 0.580266f, 0.575856f, 0.572174f, 0.568794f, 0.565750f, 0.563397f, 0.561829f, 0.560549f, 0.558858f, 0.556454f, 0.553437f, 0.549923f, 0.545870f, 0.541143f, 0.535568f, 0.529029f, 0.521642f, 0.513706f, 0.505466f, 0.497055f, 0.488604f, 0.480183f, 0.471722f, 0.463177f, 0.454619f, 0.446034f, 0.437240f, 0.428157f, 0.418884f, 0.409461f, 0.399865f, 0.390252f, 0.380863f, 0.371747f, 0.362849f, 0.354203f, 0.345760f, 0.337306f, 0.328769f, 0.320260f, 0.311738f, 0.303082f, 0.294401f, 0.285697f, 0.276522f, 0.266569f, 0.256016f, 0.244725f, 0.232076f, 0.218041f, 0.202877f, 0.185600f, 0.164906f, 0.140260f, 0.107084f, 0.053389f, -0.026623f, -0.111560f, -0.159294f, -0.146202f, -0.091208f, -0.029119f}, + {-0.279937f, -0.718806f, -0.879425f, -0.777443f, -0.538320f, -0.273976f, -0.025783f, 0.204435f, 0.407063f, 0.556330f, 0.629651f, 0.621025f, 0.539807f, 0.405020f, 0.240268f, 0.067825f, -0.096633f, -0.245120f, -0.374269f, -0.481330f, -0.562584f, -0.615551f, -0.642416f, -0.649519f, -0.642111f, -0.620732f, -0.584007f, -0.533693f, -0.475001f, -0.412795f, -0.349591f, -0.286993f, -0.226903f, -0.170652f, -0.118251f, -0.069223f, -0.023545f, 0.018667f, 0.057892f, 0.095208f, 0.131668f, 0.167761f, 0.203372f, 0.238124f, 0.271732f, 0.304055f, 0.334993f, 0.364479f, 0.392521f, 0.419068f, 0.443884f, 0.466673f, 0.487320f, 0.505877f, 0.522377f, 0.536834f, 0.549468f, 0.560746f, 0.571072f, 0.580544f, 0.589150f, 0.597030f, 0.604353f, 0.611043f, 0.616937f, 0.622138f, 0.626912f, 0.631307f, 0.635234f, 0.638853f, 0.642459f, 0.646040f, 0.649387f, 0.652562f, 0.655777f, 0.658908f, 0.661640f, 0.664015f, 0.666294f, 0.668275f, 0.669360f, 0.669333f, 0.668569f, 0.667339f, 0.665357f, 0.662247f, 0.658157f, 0.653645f, 0.649002f, 0.643858f, 0.637637f, 0.630346f, 0.622683f, 0.615246f, 0.607937f, 0.600397f, + 0.592808f, 0.585902f, 0.580266f, 0.575856f, 0.572174f, 0.568794f, 0.565750f, 0.563397f, 0.561829f, 0.560549f, 0.558858f, 0.556454f, 0.553437f, 0.549923f, 0.545870f, 0.541143f, 0.535568f, 0.529029f, 0.521642f, 0.513706f, 0.505466f, 0.497055f, 0.488604f, 0.480183f, 0.471722f, 0.463177f, 0.454619f, 0.446034f, 0.437240f, 0.428157f, 0.418884f, 0.409461f, 0.399865f, 0.390252f, 0.380863f, 0.371747f, 0.362849f, 0.354203f, 0.345760f, 0.337306f, 0.328769f, 0.320260f, 0.311738f, 0.303082f, 0.294401f, 0.285697f, 0.276522f, 0.266569f, 0.256016f, 0.244725f, 0.232076f, 0.218041f, 0.202877f, 0.185600f, 0.164906f, 0.140260f, 0.107084f, 0.053389f, -0.026623f, -0.111560f, -0.159294f, -0.146202f, -0.091208f, -0.029119f} + }, + { + {0.137655f, 0.231573f, -0.061569f, -0.615380f, -1.083201f, -1.179039f, -0.870305f, -0.339584f, 0.195943f, 0.617719f, 0.906453f, 1.076009f, 1.134598f, 1.089734f, 0.958490f, 0.762775f, 0.522469f, 0.257386f, -0.009275f, -0.255153f, -0.467276f, -0.644940f, -0.793225f, -0.914050f, -1.004432f, -1.062573f, -1.092628f, -1.102031f, -1.096136f, -1.077334f, -1.047589f, -1.009280f, -0.964133f, -0.913278f, -0.858195f, -0.800334f, -0.740087f, -0.677018f, -0.610805f, -0.541506f, -0.469560f, -0.396052f, -0.322485f, -0.249955f, -0.178885f, -0.109588f, -0.042559f, 0.021688f, 0.082623f, 0.139743f, 0.193113f, 0.243630f, 0.292304f, 0.339419f, 0.384570f, 0.427151f, 0.466585f, 0.502409f, 0.534395f, 0.562517f, 0.586922f, 0.607994f, 0.626173f, 0.641582f, 0.654228f, 0.664541f, 0.673117f, 0.679999f, 0.684972f, 0.688494f, 0.691429f, 0.694010f, 0.696123f, 0.698431f, 0.702002f, 0.706919f, 0.712502f, 0.718834f, 0.726783f, 0.736462f, 0.746890f, 0.757392f, 0.768323f, 0.780141f, 0.792495f, 0.804563f, 0.815877f, 0.826652f, 0.837457f, 0.848656f, 0.860155f, 0.871670f, 0.883000f, 0.893877f, 0.903812f, 0.912257f, + 0.918585f, 0.921831f, 0.920971f, 0.915668f, 0.906299f, 0.893208f, 0.876460f, 0.856357f, 0.833641f, 0.809154f, 0.783725f, 0.758238f, 0.733466f, 0.710044f, 0.688800f, 0.670590f, 0.655493f, 0.642657f, 0.631241f, 0.621055f, 0.612285f, 0.605091f, 0.599433f, 0.594697f, 0.589631f, 0.583188f, 0.575258f, 0.566315f, 0.556840f, 0.547295f, 0.537964f, 0.528587f, 0.518763f, 0.508660f, 0.498613f, 0.488388f, 0.477700f, 0.466959f, 0.456614f, 0.446483f, 0.436467f, 0.426959f, 0.417879f, 0.408578f, 0.399091f, 0.390055f, 0.381339f, 0.372396f, 0.363526f, 0.354887f, 0.345302f, 0.333890f, 0.320994f, 0.305859f, 0.286532f, 0.262266f, 0.228831f, 0.171282f, 0.076774f, -0.036269f, -0.117427f, -0.129893f, -0.087208f, -0.028616f}, + {-0.137655f, -0.231573f, 0.061569f, 0.615380f, 1.083201f, 1.179039f, 0.870305f, 0.339584f, -0.195943f, -0.617719f, -0.906453f, -1.076009f, -1.134598f, -1.089734f, -0.958490f, -0.762775f, -0.522469f, -0.257386f, 0.009275f, 0.255153f, 0.467276f, 0.644940f, 0.793225f, 0.914050f, 1.004432f, 1.062573f, 1.092628f, 1.102031f, 1.096136f, 1.077334f, 1.047589f, 1.009280f, 0.964133f, 0.913278f, 0.858195f, 0.800334f, 0.740087f, 0.677018f, 0.610805f, 0.541506f, 0.469560f, 0.396052f, 0.322485f, 0.249955f, 0.178885f, 0.109588f, 0.042559f, -0.021688f, -0.082623f, -0.139743f, -0.193113f, -0.243630f, -0.292304f, -0.339419f, -0.384570f, -0.427151f, -0.466585f, -0.502409f, -0.534395f, -0.562517f, -0.586922f, -0.607994f, -0.626173f, -0.641582f, -0.654228f, -0.664541f, -0.673117f, -0.679999f, -0.684972f, -0.688494f, -0.691429f, -0.694010f, -0.696123f, -0.698431f, -0.702002f, -0.706919f, -0.712502f, -0.718834f, -0.726783f, -0.736462f, -0.746890f, -0.757392f, -0.768323f, -0.780141f, -0.792495f, -0.804563f, -0.815877f, -0.826652f, -0.837457f, -0.848656f, -0.860155f, -0.871670f, -0.883000f, -0.893877f, -0.903812f, -0.912257f, + -0.918585f, -0.921831f, -0.920971f, -0.915668f, -0.906299f, -0.893208f, -0.876460f, -0.856357f, -0.833641f, -0.809154f, -0.783725f, -0.758238f, -0.733466f, -0.710044f, -0.688800f, -0.670590f, -0.655493f, -0.642657f, -0.631241f, -0.621055f, -0.612285f, -0.605091f, -0.599433f, -0.594697f, -0.589631f, -0.583188f, -0.575258f, -0.566315f, -0.556840f, -0.547295f, -0.537964f, -0.528587f, -0.518763f, -0.508660f, -0.498613f, -0.488388f, -0.477700f, -0.466959f, -0.456614f, -0.446483f, -0.436467f, -0.426959f, -0.417879f, -0.408578f, -0.399091f, -0.390055f, -0.381339f, -0.372396f, -0.363526f, -0.354887f, -0.345302f, -0.333890f, -0.320994f, -0.305859f, -0.286532f, -0.262266f, -0.228831f, -0.171282f, -0.076774f, 0.036269f, 0.117427f, 0.129893f, 0.087208f, 0.028616f} + }, + { + {-0.037524f, -0.106181f, -0.132266f, -0.073112f, 0.041237f, 0.111128f, 0.077796f, -0.013186f, -0.077825f, -0.080256f, -0.035434f, 0.029096f, 0.084053f, 0.103004f, 0.086859f, 0.066675f, 0.063076f, 0.059663f, 0.031095f, -0.020998f, -0.075878f, -0.121299f, -0.156113f, -0.176326f, -0.175820f, -0.157975f, -0.135214f, -0.116812f, -0.102238f, -0.085453f, -0.062353f, -0.034609f, -0.008002f, 0.012488f, 0.025194f, 0.029679f, 0.025216f, 0.013215f, -0.001254f, -0.012755f, -0.019093f, -0.020474f, -0.016980f, -0.008454f, 0.004498f, 0.020843f, 0.039938f, 0.061615f, 0.086231f, 0.114761f, 0.147970f, 0.185336f, 0.225373f, 0.266858f, 0.309124f, 0.351354f, 0.392341f, 0.431045f, 0.466945f, 0.499672f, 0.528530f, 0.552586f, 0.571112f, 0.583575f, 0.589158f, 0.586750f, 0.575666f, 0.555960f, 0.527818f, 0.491213f, 0.446493f, 0.394762f, 0.337410f, 0.276002f, 0.212771f, 0.150186f, 0.089707f, 0.032067f, -0.021005f, -0.066929f, -0.104805f, -0.136170f, -0.162127f, -0.181305f, -0.192276f, -0.196759f, -0.198297f, -0.198100f, -0.194244f, -0.185310f, -0.173099f, -0.160874f, -0.150052f, -0.139737f, -0.128898f, -0.117875f, + -0.107875f, -0.099948f, -0.094668f, -0.092141f, -0.091897f, -0.093057f, -0.095016f, -0.098057f, -0.103137f, -0.110818f, -0.120204f, -0.129091f, -0.135491f, -0.139004f, -0.140529f, -0.140823f, -0.139694f, -0.136376f, -0.130141f, -0.120557f, -0.107620f, -0.091821f, -0.073930f, -0.054741f, -0.035051f, -0.015600f, 0.003138f, 0.020870f, 0.037083f, 0.051025f, 0.062165f, 0.070424f, 0.075956f, 0.078959f, 0.079669f, 0.078304f, 0.075176f, 0.071037f, 0.067021f, 0.064014f, 0.062283f, 0.061670f, 0.061603f, 0.060906f, 0.058404f, 0.053985f, 0.048455f, 0.042281f, 0.035195f, 0.027085f, 0.018350f, 0.009174f, -0.000669f, -0.010994f, -0.021132f, -0.031283f, -0.043062f, -0.057197f, -0.070252f, -0.074970f, -0.065974f, -0.045809f, -0.023709f, -0.006772f}, + {-0.037524f, -0.106181f, -0.132266f, -0.073112f, 0.041237f, 0.111128f, 0.077796f, -0.013186f, -0.077825f, -0.080256f, -0.035434f, 0.029096f, 0.084053f, 0.103004f, 0.086859f, 0.066675f, 0.063076f, 0.059663f, 0.031095f, -0.020998f, -0.075878f, -0.121299f, -0.156113f, -0.176326f, -0.175820f, -0.157975f, -0.135214f, -0.116812f, -0.102238f, -0.085453f, -0.062353f, -0.034609f, -0.008002f, 0.012488f, 0.025194f, 0.029679f, 0.025216f, 0.013215f, -0.001254f, -0.012755f, -0.019093f, -0.020474f, -0.016980f, -0.008454f, 0.004498f, 0.020843f, 0.039938f, 0.061615f, 0.086231f, 0.114761f, 0.147970f, 0.185336f, 0.225373f, 0.266858f, 0.309124f, 0.351354f, 0.392341f, 0.431045f, 0.466945f, 0.499672f, 0.528530f, 0.552586f, 0.571112f, 0.583575f, 0.589158f, 0.586750f, 0.575666f, 0.555960f, 0.527818f, 0.491213f, 0.446493f, 0.394762f, 0.337410f, 0.276002f, 0.212771f, 0.150186f, 0.089707f, 0.032067f, -0.021005f, -0.066929f, -0.104805f, -0.136170f, -0.162127f, -0.181305f, -0.192276f, -0.196759f, -0.198297f, -0.198100f, -0.194244f, -0.185310f, -0.173099f, -0.160874f, -0.150052f, -0.139737f, -0.128898f, -0.117875f, + -0.107875f, -0.099948f, -0.094668f, -0.092141f, -0.091897f, -0.093057f, -0.095016f, -0.098057f, -0.103137f, -0.110818f, -0.120204f, -0.129091f, -0.135491f, -0.139004f, -0.140529f, -0.140823f, -0.139694f, -0.136376f, -0.130141f, -0.120557f, -0.107620f, -0.091821f, -0.073930f, -0.054741f, -0.035051f, -0.015600f, 0.003138f, 0.020870f, 0.037083f, 0.051025f, 0.062165f, 0.070424f, 0.075956f, 0.078959f, 0.079669f, 0.078304f, 0.075176f, 0.071037f, 0.067021f, 0.064014f, 0.062283f, 0.061670f, 0.061603f, 0.060906f, 0.058404f, 0.053985f, 0.048455f, 0.042281f, 0.035195f, 0.027085f, 0.018350f, 0.009174f, -0.000669f, -0.010994f, -0.021132f, -0.031283f, -0.043062f, -0.057197f, -0.070252f, -0.074970f, -0.065974f, -0.045809f, -0.023709f, -0.006772f} + }, + { + {-0.001333f, -0.030005f, -0.089178f, -0.116179f, -0.070558f, 0.001241f, 0.020913f, -0.026250f, -0.080759f, -0.081475f, -0.022314f, 0.058682f, 0.122300f, 0.154634f, 0.165876f, 0.172510f, 0.178315f, 0.170686f, 0.135671f, 0.073168f, -0.004954f, -0.086261f, -0.162235f, -0.226658f, -0.277864f, -0.321652f, -0.365340f, -0.408241f, -0.442359f, -0.462069f, -0.468153f, -0.461999f, -0.441233f, -0.403541f, -0.351250f, -0.289395f, -0.221463f, -0.149435f, -0.076464f, -0.006943f, 0.055954f, 0.111395f, 0.159755f, 0.201416f, 0.236781f, 0.266704f, 0.292410f, 0.314773f, 0.333620f, 0.347895f, 0.356616f, 0.359633f, 0.357762f, 0.352831f, 0.347475f, 0.343968f, 0.342881f, 0.343312f, 0.344262f, 0.345108f, 0.345073f, 0.343446f, 0.340377f, 0.336539f, 0.332107f, 0.326988f, 0.321660f, 0.316556f, 0.310916f, 0.303524f, 0.294315f, 0.283862f, 0.271573f, 0.256019f, 0.236997f, 0.215638f, 0.192339f, 0.166339f, 0.137841f, 0.108908f, 0.081311f, 0.054840f, 0.028956f, 0.004999f, -0.014887f, -0.030518f, -0.043751f, -0.055909f, -0.066672f, -0.075704f, -0.083627f, -0.090643f, -0.095550f, -0.097168f, -0.095719f, -0.091778f, + -0.084700f, -0.073230f, -0.057268f, -0.038056f, -0.016721f, 0.006768f, 0.033168f, 0.062626f, 0.093687f, 0.123868f, 0.151635f, 0.177592f, 0.203260f, 0.228881f, 0.252880f, 0.273234f, 0.289066f, 0.301335f, 0.312237f, 0.323412f, 0.334360f, 0.342975f, 0.347732f, 0.349006f, 0.348534f, 0.348309f, 0.349721f, 0.352813f, 0.356335f, 0.359060f, 0.360956f, 0.362759f, 0.364992f, 0.367821f, 0.371174f, 0.374427f, 0.376493f, 0.376627f, 0.374696f, 0.370693f, 0.364611f, 0.356723f, 0.347263f, 0.336013f, 0.322697f, 0.307449f, 0.290502f, 0.272009f, 0.252471f, 0.232612f, 0.212802f, 0.193266f, 0.174453f, 0.156397f, 0.138549f, 0.120439f, 0.099951f, 0.070805f, 0.027885f, -0.020982f, -0.054876f, -0.058831f, -0.039154f, -0.012828f}, + {-0.001333f, -0.030005f, -0.089178f, -0.116179f, -0.070558f, 0.001241f, 0.020913f, -0.026250f, -0.080759f, -0.081475f, -0.022314f, 0.058682f, 0.122300f, 0.154634f, 0.165876f, 0.172510f, 0.178315f, 0.170686f, 0.135671f, 0.073168f, -0.004954f, -0.086261f, -0.162235f, -0.226658f, -0.277864f, -0.321652f, -0.365340f, -0.408241f, -0.442359f, -0.462069f, -0.468153f, -0.461999f, -0.441233f, -0.403541f, -0.351250f, -0.289395f, -0.221463f, -0.149435f, -0.076464f, -0.006943f, 0.055954f, 0.111395f, 0.159755f, 0.201416f, 0.236781f, 0.266704f, 0.292410f, 0.314773f, 0.333620f, 0.347895f, 0.356616f, 0.359633f, 0.357762f, 0.352831f, 0.347475f, 0.343968f, 0.342881f, 0.343312f, 0.344262f, 0.345108f, 0.345073f, 0.343446f, 0.340377f, 0.336539f, 0.332107f, 0.326988f, 0.321660f, 0.316556f, 0.310916f, 0.303524f, 0.294315f, 0.283862f, 0.271573f, 0.256019f, 0.236997f, 0.215638f, 0.192339f, 0.166339f, 0.137841f, 0.108908f, 0.081311f, 0.054840f, 0.028956f, 0.004999f, -0.014887f, -0.030518f, -0.043751f, -0.055909f, -0.066672f, -0.075704f, -0.083627f, -0.090643f, -0.095550f, -0.097168f, -0.095719f, -0.091778f, + -0.084700f, -0.073230f, -0.057268f, -0.038056f, -0.016721f, 0.006768f, 0.033168f, 0.062626f, 0.093687f, 0.123868f, 0.151635f, 0.177592f, 0.203260f, 0.228881f, 0.252880f, 0.273234f, 0.289066f, 0.301335f, 0.312237f, 0.323412f, 0.334360f, 0.342975f, 0.347732f, 0.349006f, 0.348534f, 0.348309f, 0.349721f, 0.352813f, 0.356335f, 0.359060f, 0.360956f, 0.362759f, 0.364992f, 0.367821f, 0.371174f, 0.374427f, 0.376493f, 0.376627f, 0.374696f, 0.370693f, 0.364611f, 0.356723f, 0.347263f, 0.336013f, 0.322697f, 0.307449f, 0.290502f, 0.272009f, 0.252471f, 0.232612f, 0.212802f, 0.193266f, 0.174453f, 0.156397f, 0.138549f, 0.120439f, 0.099951f, 0.070805f, 0.027885f, -0.020982f, -0.054876f, -0.058831f, -0.039154f, -0.012828f} + }, + { + {-0.003949f, -0.004065f, 0.004529f, 0.003058f, -0.017910f, -0.041346f, -0.049210f, -0.053546f, -0.080846f, -0.125171f, -0.138752f, -0.082301f, 0.027313f, 0.134102f, 0.200608f, 0.233142f, 0.253660f, 0.266920f, 0.262970f, 0.237188f, 0.194063f, 0.136745f, 0.064986f, -0.017247f, -0.101044f, -0.180693f, -0.256442f, -0.328205f, -0.391843f, -0.443152f, -0.481210f, -0.506165f, -0.517126f, -0.513522f, -0.495538f, -0.462242f, -0.412470f, -0.349030f, -0.279619f, -0.212173f, -0.150791f, -0.096336f, -0.048496f, -0.006238f, 0.031944f, 0.067046f, 0.099419f, 0.129417f, 0.157110f, 0.181639f, 0.201899f, 0.217571f, 0.228864f, 0.236108f, 0.240440f, 0.243939f, 0.248173f, 0.253310f, 0.259111f, 0.265714f, 0.273010f, 0.280389f, 0.287541f, 0.294554f, 0.301097f, 0.306552f, 0.310894f, 0.314304f, 0.316123f, 0.315383f, 0.312099f, 0.306725f, 0.298589f, 0.286282f, 0.269490f, 0.249062f, 0.225223f, 0.197242f, 0.165404f, 0.131961f, 0.099076f, 0.066683f, 0.033703f, 0.000877f, -0.029410f, -0.056340f, -0.081745f, -0.106984f, -0.130473f, -0.149782f, -0.164778f, -0.176837f, -0.185968f, -0.190743f, -0.190692f, -0.187082f, + -0.181465f, -0.174611f, -0.166752f, -0.158044f, -0.148865f, -0.139889f, -0.131570f, -0.123691f, -0.116025f, -0.109038f, -0.102988f, -0.096774f, -0.088859f, -0.079067f, -0.068595f, -0.058652f, -0.049731f, -0.041459f, -0.032502f, -0.021490f, -0.008698f, 0.003957f, 0.014879f, 0.023943f, 0.031863f, 0.039641f, 0.048517f, 0.059156f, 0.070934f, 0.082892f, 0.094921f, 0.107290f, 0.119849f, 0.132466f, 0.145202f, 0.157413f, 0.167770f, 0.175597f, 0.181049f, 0.184050f, 0.184444f, 0.182904f, 0.180196f, 0.176079f, 0.170279f, 0.163603f, 0.156847f, 0.149956f, 0.143323f, 0.138140f, 0.134607f, 0.131865f, 0.130015f, 0.129755f, 0.130428f, 0.131261f, 0.132652f, 0.131757f, 0.119661f, 0.090367f, 0.051746f, 0.020184f, 0.004349f, 0.000237f}, + {0.003949f, 0.004065f, -0.004529f, -0.003058f, 0.017910f, 0.041346f, 0.049210f, 0.053546f, 0.080846f, 0.125171f, 0.138752f, 0.082301f, -0.027313f, -0.134102f, -0.200608f, -0.233142f, -0.253660f, -0.266920f, -0.262970f, -0.237188f, -0.194063f, -0.136745f, -0.064986f, 0.017247f, 0.101044f, 0.180693f, 0.256442f, 0.328205f, 0.391843f, 0.443152f, 0.481210f, 0.506165f, 0.517126f, 0.513522f, 0.495538f, 0.462242f, 0.412470f, 0.349030f, 0.279619f, 0.212173f, 0.150791f, 0.096336f, 0.048496f, 0.006238f, -0.031944f, -0.067046f, -0.099419f, -0.129417f, -0.157110f, -0.181639f, -0.201899f, -0.217571f, -0.228864f, -0.236108f, -0.240440f, -0.243939f, -0.248173f, -0.253310f, -0.259111f, -0.265714f, -0.273010f, -0.280389f, -0.287541f, -0.294554f, -0.301097f, -0.306552f, -0.310894f, -0.314304f, -0.316123f, -0.315383f, -0.312099f, -0.306725f, -0.298589f, -0.286282f, -0.269490f, -0.249062f, -0.225223f, -0.197242f, -0.165404f, -0.131961f, -0.099076f, -0.066683f, -0.033703f, -0.000877f, 0.029410f, 0.056340f, 0.081745f, 0.106984f, 0.130473f, 0.149782f, 0.164778f, 0.176837f, 0.185968f, 0.190743f, 0.190692f, 0.187082f, + 0.181465f, 0.174611f, 0.166752f, 0.158044f, 0.148865f, 0.139889f, 0.131570f, 0.123691f, 0.116025f, 0.109038f, 0.102988f, 0.096774f, 0.088859f, 0.079067f, 0.068595f, 0.058652f, 0.049731f, 0.041459f, 0.032502f, 0.021490f, 0.008698f, -0.003957f, -0.014879f, -0.023943f, -0.031863f, -0.039641f, -0.048517f, -0.059156f, -0.070934f, -0.082892f, -0.094921f, -0.107290f, -0.119849f, -0.132466f, -0.145202f, -0.157413f, -0.167770f, -0.175597f, -0.181049f, -0.184050f, -0.184444f, -0.182904f, -0.180196f, -0.176079f, -0.170279f, -0.163603f, -0.156847f, -0.149956f, -0.143323f, -0.138140f, -0.134607f, -0.131865f, -0.130015f, -0.129755f, -0.130428f, -0.131261f, -0.132652f, -0.131757f, -0.119661f, -0.090367f, -0.051746f, -0.020184f, -0.004349f, -0.000237f} + }, + { + {-0.006838f, -0.000073f, 0.019569f, 0.004812f, -0.021179f, 0.017001f, 0.095357f, 0.079254f, -0.080727f, -0.242975f, -0.239933f, -0.079038f, 0.094027f, 0.179068f, 0.192210f, 0.186347f, 0.179576f, 0.164512f, 0.135604f, 0.091894f, 0.036418f, -0.019928f, -0.065074f, -0.095268f, -0.111552f, -0.113737f, -0.104494f, -0.091666f, -0.080317f, -0.069042f, -0.057974f, -0.052882f, -0.057423f, -0.067725f, -0.078296f, -0.088767f, -0.102514f, -0.121895f, -0.145878f, -0.170008f, -0.188674f, -0.199029f, -0.202203f, -0.200419f, -0.195060f, -0.187856f, -0.180908f, -0.174383f, -0.166293f, -0.154984f, -0.140002f, -0.120815f, -0.096730f, -0.067714f, -0.033820f, 0.005223f, 0.048523f, 0.093540f, 0.138202f, 0.181886f, 0.223555f, 0.261046f, 0.293122f, 0.320062f, 0.341424f, 0.355281f, 0.360314f, 0.356691f, 0.344454f, 0.322937f, 0.292135f, 0.253115f, 0.207016f, 0.155091f, 0.099534f, 0.042831f, -0.013572f, -0.068750f, -0.120804f, -0.167303f, -0.207256f, -0.241508f, -0.270731f, -0.293815f, -0.309031f, -0.316475f, -0.318315f, -0.316263f, -0.309841f, -0.297894f, -0.280743f, -0.259596f, -0.234760f, -0.205963f, -0.173776f, -0.139211f, + -0.102436f, -0.063409f, -0.023388f, 0.015541f, 0.052145f, 0.086261f, 0.117562f, 0.144705f, 0.165452f, 0.177810f, 0.181963f, 0.180989f, 0.178411f, 0.174952f, 0.168699f, 0.158230f, 0.144450f, 0.129742f, 0.116497f, 0.106152f, 0.098556f, 0.092438f, 0.087095f, 0.083117f, 0.081219f, 0.081325f, 0.083051f, 0.085959f, 0.089030f, 0.090997f, 0.091374f, 0.090241f, 0.087241f, 0.081872f, 0.074446f, 0.065721f, 0.056063f, 0.045844f, 0.035939f, 0.026995f, 0.018956f, 0.011839f, 0.005924f, 0.000823f, -0.004378f, -0.009757f, -0.014627f, -0.018984f, -0.023457f, -0.027936f, -0.031769f, -0.035015f, -0.038036f, -0.040342f, -0.041399f, -0.041932f, -0.042717f, -0.042585f, -0.039224f, -0.031819f, -0.021956f, -0.012357f, -0.005285f, -0.001296f}, + {0.006838f, 0.000073f, -0.019569f, -0.004812f, 0.021179f, -0.017001f, -0.095357f, -0.079254f, 0.080727f, 0.242975f, 0.239933f, 0.079038f, -0.094027f, -0.179068f, -0.192210f, -0.186347f, -0.179576f, -0.164512f, -0.135604f, -0.091894f, -0.036418f, 0.019928f, 0.065074f, 0.095268f, 0.111552f, 0.113737f, 0.104494f, 0.091666f, 0.080317f, 0.069042f, 0.057974f, 0.052882f, 0.057423f, 0.067725f, 0.078296f, 0.088767f, 0.102514f, 0.121895f, 0.145878f, 0.170008f, 0.188674f, 0.199029f, 0.202203f, 0.200419f, 0.195060f, 0.187856f, 0.180908f, 0.174383f, 0.166293f, 0.154984f, 0.140002f, 0.120815f, 0.096730f, 0.067714f, 0.033820f, -0.005223f, -0.048523f, -0.093540f, -0.138202f, -0.181886f, -0.223555f, -0.261046f, -0.293122f, -0.320062f, -0.341424f, -0.355281f, -0.360314f, -0.356691f, -0.344454f, -0.322937f, -0.292135f, -0.253115f, -0.207016f, -0.155091f, -0.099534f, -0.042831f, 0.013572f, 0.068750f, 0.120804f, 0.167303f, 0.207256f, 0.241508f, 0.270731f, 0.293815f, 0.309031f, 0.316475f, 0.318315f, 0.316263f, 0.309841f, 0.297894f, 0.280743f, 0.259596f, 0.234760f, 0.205963f, 0.173776f, 0.139211f, + 0.102436f, 0.063409f, 0.023388f, -0.015541f, -0.052145f, -0.086261f, -0.117562f, -0.144705f, -0.165452f, -0.177810f, -0.181963f, -0.180989f, -0.178411f, -0.174952f, -0.168699f, -0.158230f, -0.144450f, -0.129742f, -0.116497f, -0.106152f, -0.098556f, -0.092438f, -0.087095f, -0.083117f, -0.081219f, -0.081325f, -0.083051f, -0.085959f, -0.089030f, -0.090997f, -0.091374f, -0.090241f, -0.087241f, -0.081872f, -0.074446f, -0.065721f, -0.056063f, -0.045844f, -0.035939f, -0.026995f, -0.018956f, -0.011839f, -0.005924f, -0.000823f, 0.004378f, 0.009757f, 0.014627f, 0.018984f, 0.023457f, 0.027936f, 0.031769f, 0.035015f, 0.038036f, 0.040342f, 0.041399f, 0.041932f, 0.042717f, 0.042585f, 0.039224f, 0.031819f, 0.021956f, 0.012357f, 0.005285f, 0.001296f} + }, + { + {-0.001268f, -0.011623f, -0.025773f, -0.019189f, 0.011057f, 0.041023f, 0.068146f, 0.125696f, 0.222407f, 0.296789f, 0.269284f, 0.131113f, -0.047610f, -0.192572f, -0.280508f, -0.323423f, -0.332386f, -0.312852f, -0.276029f, -0.234862f, -0.192992f, -0.147490f, -0.098453f, -0.049129f, -0.001158f, 0.043170f, 0.076863f, 0.093414f, 0.095853f, 0.095899f, 0.103483f, 0.119683f, 0.139635f, 0.159125f, 0.177059f, 0.193595f, 0.208271f, 0.220249f, 0.229045f, 0.234009f, 0.233700f, 0.227053f, 0.215289f, 0.201603f, 0.188525f, 0.176263f, 0.163748f, 0.150359f, 0.136192f, 0.121455f, 0.106303f, 0.090949f, 0.075597f, 0.060536f, 0.046491f, 0.034613f, 0.025962f, 0.021084f, 0.020003f, 0.022378f, 0.027742f, 0.035774f, 0.046332f, 0.059186f, 0.073920f, 0.090220f, 0.108028f, 0.127179f, 0.146973f, 0.166342f, 0.184471f, 0.201087f, 0.215996f, 0.228448f, 0.237272f, 0.241711f, 0.241663f, 0.236858f, 0.226335f, 0.209312f, 0.186169f, 0.157898f, 0.124884f, 0.087019f, 0.044857f, -0.000171f, -0.046674f, -0.093813f, -0.141018f, -0.187871f, -0.234164f, -0.279203f, -0.320929f, -0.356487f, -0.384099f, -0.404029f, + -0.417450f, -0.424542f, -0.423967f, -0.414337f, -0.396303f, -0.373146f, -0.348990f, -0.326237f, -0.304833f, -0.283944f, -0.263944f, -0.246725f, -0.234478f, -0.228461f, -0.228593f, -0.233819f, -0.242777f, -0.254337f, -0.267790f, -0.282812f, -0.299281f, -0.316843f, -0.334511f, -0.350840f, -0.364685f, -0.375697f, -0.384143f, -0.390499f, -0.395225f, -0.398596f, -0.400645f, -0.401464f, -0.401489f, -0.401163f, -0.400362f, -0.398530f, -0.395360f, -0.391048f, -0.385958f, -0.380382f, -0.374495f, -0.368144f, -0.360693f, -0.351302f, -0.339340f, -0.324513f, -0.306932f, -0.287105f, -0.265519f, -0.242294f, -0.217711f, -0.192689f, -0.167920f, -0.143119f, -0.118052f, -0.092771f, -0.064621f, -0.027534f, 0.019774f, 0.064488f, 0.085852f, 0.075236f, 0.045270f, 0.014113f}, + {-0.001268f, -0.011623f, -0.025773f, -0.019189f, 0.011057f, 0.041023f, 0.068146f, 0.125696f, 0.222407f, 0.296789f, 0.269284f, 0.131113f, -0.047610f, -0.192572f, -0.280508f, -0.323423f, -0.332386f, -0.312852f, -0.276029f, -0.234862f, -0.192992f, -0.147490f, -0.098453f, -0.049129f, -0.001158f, 0.043170f, 0.076863f, 0.093414f, 0.095853f, 0.095899f, 0.103483f, 0.119683f, 0.139635f, 0.159125f, 0.177059f, 0.193595f, 0.208271f, 0.220249f, 0.229045f, 0.234009f, 0.233700f, 0.227053f, 0.215289f, 0.201603f, 0.188525f, 0.176263f, 0.163748f, 0.150359f, 0.136192f, 0.121455f, 0.106303f, 0.090949f, 0.075597f, 0.060536f, 0.046491f, 0.034613f, 0.025962f, 0.021084f, 0.020003f, 0.022378f, 0.027742f, 0.035774f, 0.046332f, 0.059186f, 0.073920f, 0.090220f, 0.108028f, 0.127179f, 0.146973f, 0.166342f, 0.184471f, 0.201087f, 0.215996f, 0.228448f, 0.237272f, 0.241711f, 0.241663f, 0.236858f, 0.226335f, 0.209312f, 0.186169f, 0.157898f, 0.124884f, 0.087019f, 0.044857f, -0.000171f, -0.046674f, -0.093813f, -0.141018f, -0.187871f, -0.234164f, -0.279203f, -0.320929f, -0.356487f, -0.384099f, -0.404029f, + -0.417450f, -0.424542f, -0.423967f, -0.414337f, -0.396303f, -0.373146f, -0.348990f, -0.326237f, -0.304833f, -0.283944f, -0.263944f, -0.246725f, -0.234478f, -0.228461f, -0.228593f, -0.233819f, -0.242777f, -0.254337f, -0.267790f, -0.282812f, -0.299281f, -0.316843f, -0.334511f, -0.350840f, -0.364685f, -0.375697f, -0.384143f, -0.390499f, -0.395225f, -0.398596f, -0.400645f, -0.401464f, -0.401489f, -0.401163f, -0.400362f, -0.398530f, -0.395360f, -0.391048f, -0.385958f, -0.380382f, -0.374495f, -0.368144f, -0.360693f, -0.351302f, -0.339340f, -0.324513f, -0.306932f, -0.287105f, -0.265519f, -0.242294f, -0.217711f, -0.192689f, -0.167920f, -0.143119f, -0.118052f, -0.092771f, -0.064621f, -0.027534f, 0.019774f, 0.064488f, 0.085852f, 0.075236f, 0.045270f, 0.014113f} + }, + { + {-0.038110f, -0.075146f, -0.025161f, 0.086861f, 0.170835f, 0.137738f, -0.014451f, -0.178329f, -0.226409f, -0.135078f, -0.001014f, 0.071747f, 0.071029f, 0.049512f, 0.040096f, 0.037651f, 0.039313f, 0.052944f, 0.068671f, 0.062568f, 0.034549f, 0.012890f, 0.014819f, 0.026726f, 0.029476f, 0.021912f, 0.011228f, -0.002938f, -0.024811f, -0.052618f, -0.079613f, -0.100151f, -0.112340f, -0.118985f, -0.126456f, -0.138876f, -0.153643f, -0.164753f, -0.168424f, -0.163586f, -0.150319f, -0.130693f, -0.108614f, -0.086681f, -0.065059f, -0.044049f, -0.025062f, -0.008581f, 0.006237f, 0.019687f, 0.031442f, 0.042086f, 0.052645f, 0.063061f, 0.072813f, 0.082218f, 0.091601f, 0.100095f, 0.106517f, 0.110624f, 0.112708f, 0.112893f, 0.111393f, 0.108835f, 0.106157f, 0.104517f, 0.104794f, 0.106828f, 0.110032f, 0.114914f, 0.122673f, 0.133176f, 0.145069f, 0.158047f, 0.173137f, 0.190427f, 0.208289f, 0.225087f, 0.240122f, 0.252791f, 0.262062f, 0.266804f, 0.265987f, 0.259150f, 0.246951f, 0.230107f, 0.207850f, 0.179343f, 0.146598f, 0.113197f, 0.079461f, 0.041623f, -0.003026f, -0.052458f, -0.102576f, -0.151651f, + -0.200702f, -0.250524f, -0.299538f, -0.344617f, -0.383867f, -0.418204f, -0.449410f, -0.476879f, -0.497661f, -0.509826f, -0.514454f, -0.514151f, -0.510709f, -0.504091f, -0.492568f, -0.474151f, -0.448897f, -0.419410f, -0.388422f, -0.356746f, -0.324102f, -0.290635f, -0.256925f, -0.223703f, -0.192072f, -0.162880f, -0.135745f, -0.109787f, -0.085028f, -0.061904f, -0.040007f, -0.018473f, 0.003074f, 0.024714f, 0.046173f, 0.065944f, 0.082103f, 0.094598f, 0.105239f, 0.115311f, 0.124969f, 0.134460f, 0.143642f, 0.150842f, 0.154541f, 0.155566f, 0.155668f, 0.155273f, 0.154440f, 0.154045f, 0.154074f, 0.152898f, 0.149782f, 0.145794f, 0.141598f, 0.137270f, 0.133687f, 0.129549f, 0.118095f, 0.093347f, 0.059954f, 0.030500f, 0.012452f, 0.003233f}, + {-0.038110f, -0.075146f, -0.025161f, 0.086861f, 0.170835f, 0.137738f, -0.014451f, -0.178329f, -0.226409f, -0.135078f, -0.001014f, 0.071747f, 0.071029f, 0.049512f, 0.040096f, 0.037651f, 0.039313f, 0.052944f, 0.068671f, 0.062568f, 0.034549f, 0.012890f, 0.014819f, 0.026726f, 0.029476f, 0.021912f, 0.011228f, -0.002938f, -0.024811f, -0.052618f, -0.079613f, -0.100151f, -0.112340f, -0.118985f, -0.126456f, -0.138876f, -0.153643f, -0.164753f, -0.168424f, -0.163586f, -0.150319f, -0.130693f, -0.108614f, -0.086681f, -0.065059f, -0.044049f, -0.025062f, -0.008581f, 0.006237f, 0.019687f, 0.031442f, 0.042086f, 0.052645f, 0.063061f, 0.072813f, 0.082218f, 0.091601f, 0.100095f, 0.106517f, 0.110624f, 0.112708f, 0.112893f, 0.111393f, 0.108835f, 0.106157f, 0.104517f, 0.104794f, 0.106828f, 0.110032f, 0.114914f, 0.122673f, 0.133176f, 0.145069f, 0.158047f, 0.173137f, 0.190427f, 0.208289f, 0.225087f, 0.240122f, 0.252791f, 0.262062f, 0.266804f, 0.265987f, 0.259150f, 0.246951f, 0.230107f, 0.207850f, 0.179343f, 0.146598f, 0.113197f, 0.079461f, 0.041623f, -0.003026f, -0.052458f, -0.102576f, -0.151651f, + -0.200702f, -0.250524f, -0.299538f, -0.344617f, -0.383867f, -0.418204f, -0.449410f, -0.476879f, -0.497661f, -0.509826f, -0.514454f, -0.514151f, -0.510709f, -0.504091f, -0.492568f, -0.474151f, -0.448897f, -0.419410f, -0.388422f, -0.356746f, -0.324102f, -0.290635f, -0.256925f, -0.223703f, -0.192072f, -0.162880f, -0.135745f, -0.109787f, -0.085028f, -0.061904f, -0.040007f, -0.018473f, 0.003074f, 0.024714f, 0.046173f, 0.065944f, 0.082103f, 0.094598f, 0.105239f, 0.115311f, 0.124969f, 0.134460f, 0.143642f, 0.150842f, 0.154541f, 0.155566f, 0.155668f, 0.155273f, 0.154440f, 0.154045f, 0.154074f, 0.152898f, 0.149782f, 0.145794f, 0.141598f, 0.137270f, 0.133687f, 0.129549f, 0.118095f, 0.093347f, 0.059954f, 0.030500f, 0.012452f, 0.003233f} + }, + { + {0.027412f, 0.021630f, -0.082657f, -0.192018f, -0.202211f, -0.094239f, 0.096849f, 0.326445f, 0.521758f, 0.589844f, 0.497341f, 0.306742f, 0.099455f, -0.102283f, -0.307547f, -0.492196f, -0.609749f, -0.649976f, -0.647303f, -0.634380f, -0.613427f, -0.571915f, -0.505693f, -0.422791f, -0.335442f, -0.251686f, -0.170793f, -0.086744f, 0.002987f, 0.094569f, 0.183305f, 0.267395f, 0.345542f, 0.414985f, 0.473298f, 0.519576f, 0.553356f, 0.574222f, 0.582473f, 0.579178f, 0.566240f, 0.546806f, 0.524087f, 0.499039f, 0.470563f, 0.438298f, 0.403850f, 0.369330f, 0.336252f, 0.305665f, 0.277686f, 0.250860f, 0.223237f, 0.194118f, 0.164061f, 0.133725f, 0.103572f, 0.074268f, 0.046587f, 0.021025f, -0.002250f, -0.023323f, -0.042436f, -0.059666f, -0.074855f, -0.088006f, -0.099327f, -0.108715f, -0.115836f, -0.120903f, -0.124625f, -0.127245f, -0.128473f, -0.128509f, -0.128126f, -0.127534f, -0.126157f, -0.123884f, -0.121697f, -0.120709f, -0.121149f, -0.122545f, -0.124406f, -0.126443f, -0.128321f, -0.129408f, -0.128923f, -0.126622f, -0.123305f, -0.120296f, -0.118410f, -0.117799f, -0.118840f, -0.122736f, -0.130899f, -0.143626f, + -0.159298f, -0.175051f, -0.188642f, -0.199660f, -0.208519f, -0.214407f, -0.214978f, -0.208332f, -0.194776f, -0.176354f, -0.155006f, -0.131408f, -0.105361f, -0.077096f, -0.048137f, -0.020733f, 0.003611f, 0.024921f, 0.044105f, 0.061808f, 0.077866f, 0.091518f, 0.102092f, 0.109797f, 0.115978f, 0.122346f, 0.129837f, 0.138130f, 0.146061f, 0.152497f, 0.157139f, 0.160632f, 0.163819f, 0.166991f, 0.170004f, 0.172717f, 0.174872f, 0.175941f, 0.175619f, 0.174137f, 0.171689f, 0.168049f, 0.163091f, 0.157009f, 0.149642f, 0.140361f, 0.128990f, 0.115985f, 0.101537f, 0.085578f, 0.068755f, 0.052109f, 0.035768f, 0.019324f, 0.003160f, -0.012450f, -0.028834f, -0.046486f, -0.060943f, -0.064580f, -0.054322f, -0.035670f, -0.017673f, -0.004951f}, + {0.027412f, 0.021630f, -0.082657f, -0.192018f, -0.202211f, -0.094239f, 0.096849f, 0.326445f, 0.521758f, 0.589844f, 0.497341f, 0.306742f, 0.099455f, -0.102283f, -0.307547f, -0.492196f, -0.609749f, -0.649976f, -0.647303f, -0.634380f, -0.613427f, -0.571915f, -0.505693f, -0.422791f, -0.335442f, -0.251686f, -0.170793f, -0.086744f, 0.002987f, 0.094569f, 0.183305f, 0.267395f, 0.345542f, 0.414985f, 0.473298f, 0.519576f, 0.553356f, 0.574222f, 0.582473f, 0.579178f, 0.566240f, 0.546806f, 0.524087f, 0.499039f, 0.470563f, 0.438298f, 0.403850f, 0.369330f, 0.336252f, 0.305665f, 0.277686f, 0.250860f, 0.223237f, 0.194118f, 0.164061f, 0.133725f, 0.103572f, 0.074268f, 0.046587f, 0.021025f, -0.002250f, -0.023323f, -0.042436f, -0.059666f, -0.074855f, -0.088006f, -0.099327f, -0.108715f, -0.115836f, -0.120903f, -0.124625f, -0.127245f, -0.128473f, -0.128509f, -0.128126f, -0.127534f, -0.126157f, -0.123884f, -0.121697f, -0.120709f, -0.121149f, -0.122545f, -0.124406f, -0.126443f, -0.128321f, -0.129408f, -0.128923f, -0.126622f, -0.123305f, -0.120296f, -0.118410f, -0.117799f, -0.118840f, -0.122736f, -0.130899f, -0.143626f, + -0.159298f, -0.175051f, -0.188642f, -0.199660f, -0.208519f, -0.214407f, -0.214978f, -0.208332f, -0.194776f, -0.176354f, -0.155006f, -0.131408f, -0.105361f, -0.077096f, -0.048137f, -0.020733f, 0.003611f, 0.024921f, 0.044105f, 0.061808f, 0.077866f, 0.091518f, 0.102092f, 0.109797f, 0.115978f, 0.122346f, 0.129837f, 0.138130f, 0.146061f, 0.152497f, 0.157139f, 0.160632f, 0.163819f, 0.166991f, 0.170004f, 0.172717f, 0.174872f, 0.175941f, 0.175619f, 0.174137f, 0.171689f, 0.168049f, 0.163091f, 0.157009f, 0.149642f, 0.140361f, 0.128990f, 0.115985f, 0.101537f, 0.085578f, 0.068755f, 0.052109f, 0.035768f, 0.019324f, 0.003160f, -0.012450f, -0.028834f, -0.046486f, -0.060943f, -0.064580f, -0.054322f, -0.035670f, -0.017673f, -0.004951f} + } +}; +const float *CRendBin_HOA2_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float *CRendBin_HOA2_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; + +/* Sample Rate = 16000 */ + +const int16_t CRendBin_HOA2_HRIR_max_num_iterations_16kHz = 1; +const uint16_t CRendBin_HOA2_HRIR_num_iterations_16kHz[9][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {0, 0}; +const uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[9][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}}; +const uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_16kHz = 0; +const float CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz[9]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f}; +const uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float CRendBin_HOA2_HRIR_coeff_re_16kHz[9][BINAURAL_CHANNELS][80]={ + { + { 0.854113f, 0.536451f, 0.067092f, -0.350133f, -0.609131f, -0.724504f, -0.749647f, -0.705240f, -0.587299f, -0.405686f, -0.188603f, 0.034290f, 0.235326f, 0.389114f, 0.484257f, 0.526650f, 0.525509f, 0.486339f, 0.417501f, 0.329156f, 0.225561f, 0.110464f, -0.004565f, -0.110029f, -0.209397f, -0.307633f, -0.398358f, -0.473786f, -0.535896f, -0.587622f, -0.625653f, -0.650087f, -0.667773f, -0.680841f, -0.685616f, -0.684346f, -0.683354f, -0.681293f, -0.673940f, -0.665480f, -0.660678f, -0.654254f, -0.641454f, -0.627762f, -0.616498f, -0.601208f, -0.579959f, -0.560224f, -0.542768f, -0.519685f, -0.491848f, -0.467631f, -0.444806f, -0.415518f, -0.384419f, -0.359637f, -0.335182f, -0.304116f, -0.274642f, -0.252517f, -0.227297f, -0.194558f, -0.166484f, -0.145123f, -0.116152f, -0.080136f, -0.053083f, -0.030604f, 0.005387f, 0.046361f, 0.073460f, 0.102702f, 0.155814f, 0.209408f, 0.244378f, 0.309617f, 0.442675f, 0.565949f, 0.579052f, 0.523768f}, + { 0.854113f, 0.536451f, 0.067092f, -0.350133f, -0.609131f, -0.724504f, -0.749647f, -0.705240f, -0.587299f, -0.405686f, -0.188603f, 0.034290f, 0.235326f, 0.389114f, 0.484257f, 0.526650f, 0.525509f, 0.486339f, 0.417501f, 0.329156f, 0.225561f, 0.110464f, -0.004565f, -0.110029f, -0.209397f, -0.307633f, -0.398358f, -0.473786f, -0.535896f, -0.587622f, -0.625653f, -0.650087f, -0.667773f, -0.680841f, -0.685616f, -0.684346f, -0.683354f, -0.681293f, -0.673940f, -0.665480f, -0.660678f, -0.654254f, -0.641454f, -0.627762f, -0.616498f, -0.601208f, -0.579959f, -0.560224f, -0.542768f, -0.519685f, -0.491848f, -0.467631f, -0.444806f, -0.415518f, -0.384419f, -0.359637f, -0.335182f, -0.304116f, -0.274642f, -0.252517f, -0.227297f, -0.194558f, -0.166484f, -0.145123f, -0.116152f, -0.080136f, -0.053083f, -0.030604f, 0.005387f, 0.046361f, 0.073460f, 0.102702f, 0.155814f, 0.209408f, 0.244378f, 0.309617f, 0.442675f, 0.565949f, 0.579052f, 0.523768f} + }, + { + { -0.012443f, 0.306951f, 0.640002f, 0.644701f, 0.222035f, -0.433014f, -1.009059f, -1.299682f, -1.291983f, -1.091837f, -0.799579f, -0.462162f, -0.106609f, 0.232265f, 0.526384f, 0.765415f, 0.941389f, 1.042514f, 1.068606f, 1.035233f, 0.959157f, 0.852416f, 0.726756f, 0.589559f, 0.440759f, 0.284682f, 0.135118f, -0.000404f, -0.127707f, -0.249843f, -0.360240f, -0.457524f, -0.548845f, -0.634531f, -0.707989f, -0.771448f, -0.832955f, -0.890467f, -0.937355f, -0.977102f, -1.014815f, -1.044459f, -1.061037f, -1.071895f, -1.081707f, -1.083157f, -1.073972f, -1.063175f, -1.052317f, -1.033040f, -1.007384f, -0.985836f, -0.965459f, -0.935829f, -0.901362f, -0.871368f, -0.838870f, -0.795666f, -0.751917f, -0.715707f, -0.675655f, -0.626445f, -0.582556f, -0.547393f, -0.504423f, -0.453551f, -0.413720f, -0.380963f, -0.333822f, -0.281188f, -0.246458f, -0.212864f, -0.152864f, -0.091358f, -0.055541f, 0.008028f, 0.159750f, 0.338247f, 0.427051f, 0.426619f}, + { 0.012443f, -0.306951f, -0.640002f, -0.644701f, -0.222035f, 0.433014f, 1.009059f, 1.299682f, 1.291983f, 1.091837f, 0.799579f, 0.462162f, 0.106609f, -0.232265f, -0.526384f, -0.765415f, -0.941389f, -1.042514f, -1.068606f, -1.035233f, -0.959157f, -0.852416f, -0.726756f, -0.589559f, -0.440759f, -0.284682f, -0.135118f, 0.000404f, 0.127707f, 0.249843f, 0.360240f, 0.457524f, 0.548845f, 0.634531f, 0.707989f, 0.771448f, 0.832955f, 0.890467f, 0.937355f, 0.977102f, 1.014815f, 1.044459f, 1.061037f, 1.071895f, 1.081707f, 1.083157f, 1.073972f, 1.063175f, 1.052317f, 1.033040f, 1.007384f, 0.985836f, 0.965459f, 0.935829f, 0.901362f, 0.871368f, 0.838870f, 0.795666f, 0.751917f, 0.715707f, 0.675655f, 0.626445f, 0.582556f, 0.547393f, 0.504423f, 0.453551f, 0.413720f, 0.380963f, 0.333822f, 0.281188f, 0.246458f, 0.212864f, 0.152864f, 0.091358f, 0.055541f, -0.008028f, -0.159750f, -0.338247f, -0.427051f, -0.426619f} + }, + { + { 0.106040f, 0.060914f, -0.031732f, -0.122748f, -0.131004f, -0.043133f, 0.056519f, 0.081183f, 0.028467f, -0.045616f, -0.095920f, -0.105685f, -0.073558f, -0.018343f, 0.024819f, 0.040683f, 0.051725f, 0.081855f, 0.120329f, 0.139638f, 0.131573f, 0.106054f, 0.068663f, 0.019936f, -0.031186f, -0.070885f, -0.095191f, -0.111198f, -0.126364f, -0.142556f, -0.156831f, -0.163750f, -0.159885f, -0.147705f, -0.132376f, -0.116427f, -0.101758f, -0.093589f, -0.096321f, -0.107910f, -0.123532f, -0.141780f, -0.162704f, -0.183821f, -0.202825f, -0.220588f, -0.237945f, -0.253555f, -0.267240f, -0.280492f, -0.292011f, -0.297968f, -0.297520f, -0.292601f, -0.282562f, -0.264953f, -0.240677f, -0.212280f, -0.178881f, -0.138637f, -0.093494f, -0.045703f, 0.006560f, 0.064510f, 0.124631f, 0.184450f, 0.246159f, 0.309391f, 0.368198f, 0.420383f, 0.470265f, 0.516543f, 0.549526f, 0.568203f, 0.584977f, 0.598750f, 0.576096f, 0.483726f, 0.343185f, 0.235289f}, + { 0.106040f, 0.060914f, -0.031732f, -0.122748f, -0.131004f, -0.043133f, 0.056519f, 0.081183f, 0.028467f, -0.045616f, -0.095920f, -0.105685f, -0.073558f, -0.018343f, 0.024819f, 0.040683f, 0.051725f, 0.081855f, 0.120329f, 0.139638f, 0.131573f, 0.106054f, 0.068663f, 0.019936f, -0.031186f, -0.070885f, -0.095191f, -0.111198f, -0.126364f, -0.142556f, -0.156831f, -0.163750f, -0.159885f, -0.147705f, -0.132376f, -0.116427f, -0.101758f, -0.093589f, -0.096321f, -0.107910f, -0.123532f, -0.141780f, -0.162704f, -0.183821f, -0.202825f, -0.220588f, -0.237945f, -0.253555f, -0.267240f, -0.280492f, -0.292011f, -0.297968f, -0.297520f, -0.292601f, -0.282562f, -0.264953f, -0.240677f, -0.212280f, -0.178881f, -0.138637f, -0.093494f, -0.045703f, 0.006560f, 0.064510f, 0.124631f, 0.184450f, 0.246159f, 0.309391f, 0.368198f, 0.420383f, 0.470265f, 0.516543f, 0.549526f, 0.568203f, 0.584977f, 0.598750f, 0.576096f, 0.483726f, 0.343185f, 0.235289f} + }, + { + { 0.025607f, 0.045038f, 0.027103f, -0.045868f, -0.111319f, -0.105551f, -0.047795f, -0.014679f, -0.049667f, -0.124496f, -0.180635f, -0.185029f, -0.145752f, -0.091265f, -0.042340f, 0.001278f, 0.052398f, 0.117166f, 0.185884f, 0.241515f, 0.272871f, 0.278398f, 0.262158f, 0.230861f, 0.192777f, 0.153660f, 0.111660f, 0.059556f, -0.005878f, -0.079629f, -0.155374f, -0.232190f, -0.310424f, -0.385049f, -0.448791f, -0.499238f, -0.537567f, -0.562808f, -0.572842f, -0.569135f, -0.555677f, -0.534949f, -0.508499f, -0.478959f, -0.448272f, -0.416372f, -0.383474f, -0.350600f, -0.317045f, -0.281295f, -0.244792f, -0.210869f, -0.180716f, -0.154266f, -0.132786f, -0.116138f, -0.100516f, -0.083127f, -0.065324f, -0.047830f, -0.028398f, -0.007151f, 0.012489f, 0.030425f, 0.049855f, 0.069959f, 0.087587f, 0.105253f, 0.127127f, 0.150063f, 0.170135f, 0.192124f, 0.219421f, 0.244672f, 0.266012f, 0.295860f, 0.330524f, 0.332753f, 0.281342f, 0.221813f}, + { 0.025607f, 0.045038f, 0.027103f, -0.045868f, -0.111319f, -0.105551f, -0.047795f, -0.014679f, -0.049667f, -0.124496f, -0.180635f, -0.185029f, -0.145752f, -0.091265f, -0.042340f, 0.001278f, 0.052398f, 0.117166f, 0.185884f, 0.241515f, 0.272871f, 0.278398f, 0.262158f, 0.230861f, 0.192777f, 0.153660f, 0.111660f, 0.059556f, -0.005878f, -0.079629f, -0.155374f, -0.232190f, -0.310424f, -0.385049f, -0.448791f, -0.499238f, -0.537567f, -0.562808f, -0.572842f, -0.569135f, -0.555677f, -0.534949f, -0.508499f, -0.478959f, -0.448272f, -0.416372f, -0.383474f, -0.350600f, -0.317045f, -0.281295f, -0.244792f, -0.210869f, -0.180716f, -0.154266f, -0.132786f, -0.116138f, -0.100516f, -0.083127f, -0.065324f, -0.047830f, -0.028398f, -0.007151f, 0.012489f, 0.030425f, 0.049855f, 0.069959f, 0.087587f, 0.105253f, 0.127127f, 0.150063f, 0.170135f, 0.192124f, 0.219421f, 0.244672f, 0.266012f, 0.295860f, 0.330524f, 0.332753f, 0.281342f, 0.221813f} + }, + { + { 0.000686f, -0.005679f, -0.002736f, 0.013737f, 0.025339f, 0.016835f, 0.000897f, -0.001565f, -0.001575f, -0.037994f, -0.123814f, -0.215847f, -0.254773f, -0.224963f, -0.159158f, -0.092400f, -0.030561f, 0.036822f, 0.111977f, 0.186298f, 0.252449f, 0.308392f, 0.351372f, 0.375856f, 0.379463f, 0.366110f, 0.340246f, 0.301367f, 0.247642f, 0.181811f, 0.109110f, 0.031862f, -0.049402f, -0.131957f, -0.212350f, -0.288831f, -0.357898f, -0.412063f, -0.446158f, -0.462855f, -0.468107f, -0.465087f, -0.455925f, -0.444179f, -0.431579f, -0.416646f, -0.398983f, -0.380257f, -0.360020f, -0.336141f, -0.309688f, -0.283814f, -0.258868f, -0.234234f, -0.212458f, -0.195547f, -0.180677f, -0.165064f, -0.150310f, -0.137125f, -0.122189f, -0.104504f, -0.087232f, -0.070209f, -0.049591f, -0.026301f, -0.004365f, 0.018481f, 0.046634f, 0.076352f, 0.103125f, 0.132539f, 0.168518f, 0.202438f, 0.232093f, 0.272054f, 0.318122f, 0.326574f, 0.271717f, 0.205315f}, + { -0.000686f, 0.005679f, 0.002736f, -0.013737f, -0.025339f, -0.016835f, -0.000897f, 0.001565f, 0.001575f, 0.037994f, 0.123814f, 0.215847f, 0.254773f, 0.224963f, 0.159158f, 0.092400f, 0.030561f, -0.036822f, -0.111977f, -0.186298f, -0.252449f, -0.308392f, -0.351372f, -0.375856f, -0.379463f, -0.366110f, -0.340246f, -0.301367f, -0.247642f, -0.181811f, -0.109110f, -0.031862f, 0.049402f, 0.131957f, 0.212350f, 0.288831f, 0.357898f, 0.412063f, 0.446158f, 0.462855f, 0.468107f, 0.465087f, 0.455925f, 0.444179f, 0.431579f, 0.416646f, 0.398983f, 0.380257f, 0.360020f, 0.336141f, 0.309688f, 0.283814f, 0.258868f, 0.234234f, 0.212458f, 0.195547f, 0.180677f, 0.165064f, 0.150310f, 0.137125f, 0.122189f, 0.104504f, 0.087232f, 0.070209f, 0.049591f, 0.026301f, 0.004365f, -0.018481f, -0.046634f, -0.076352f, -0.103125f, -0.132539f, -0.168518f, -0.202438f, -0.232093f, -0.272054f, -0.318122f, -0.326574f, -0.271717f, -0.205315f} + }, + { + { 0.007904f, -0.008429f, 0.002701f, 0.025666f, 0.001826f, -0.039845f, 0.005012f, 0.135846f, 0.197408f, 0.076852f, -0.136969f, -0.263642f, -0.237977f, -0.137254f, -0.049823f, 0.006941f, 0.054280f, 0.103144f, 0.149549f, 0.185848f, 0.204085f, 0.200088f, 0.177900f, 0.145801f, 0.110457f, 0.077582f, 0.052788f, 0.037914f, 0.030252f, 0.027742f, 0.031540f, 0.041709f, 0.053562f, 0.061202f, 0.063767f, 0.065527f, 0.069061f, 0.070600f, 0.064006f, 0.047422f, 0.023594f, -0.004162f, -0.032992f, -0.059696f, -0.082643f, -0.103277f, -0.123459f, -0.143553f, -0.164480f, -0.187877f, -0.212785f, -0.236261f, -0.257871f, -0.278890f, -0.297353f, -0.309320f, -0.314125f, -0.312895f, -0.304021f, -0.285839f, -0.260655f, -0.230623f, -0.194026f, -0.150485f, -0.103758f, -0.055096f, -0.001701f, 0.054669f, 0.107407f, 0.155932f, 0.204710f, 0.249689f, 0.280936f, 0.300421f, 0.318178f, 0.326332f, 0.297895f, 0.222216f, 0.128176f, 0.064416f}, + { -0.007904f, 0.008429f, -0.002701f, -0.025666f, -0.001826f, 0.039845f, -0.005012f, -0.135846f, -0.197408f, -0.076852f, 0.136969f, 0.263642f, 0.237977f, 0.137254f, 0.049823f, -0.006941f, -0.054280f, -0.103144f, -0.149549f, -0.185848f, -0.204085f, -0.200088f, -0.177900f, -0.145801f, -0.110457f, -0.077582f, -0.052788f, -0.037914f, -0.030252f, -0.027742f, -0.031540f, -0.041709f, -0.053562f, -0.061202f, -0.063767f, -0.065527f, -0.069061f, -0.070600f, -0.064006f, -0.047422f, -0.023594f, 0.004162f, 0.032992f, 0.059696f, 0.082643f, 0.103277f, 0.123459f, 0.143553f, 0.164480f, 0.187877f, 0.212785f, 0.236261f, 0.257871f, 0.278890f, 0.297353f, 0.309320f, 0.314125f, 0.312895f, 0.304021f, 0.285839f, 0.260655f, 0.230623f, 0.194026f, 0.150485f, 0.103758f, 0.055096f, 0.001701f, -0.054669f, -0.107407f, -0.155932f, -0.204710f, -0.249689f, -0.280936f, -0.300421f, -0.318178f, -0.326332f, -0.297895f, -0.222216f, -0.128176f, -0.064416f} + }, + { + { -0.012716f, -0.011283f, -0.028399f, -0.061054f, -0.081205f, -0.083144f, -0.091074f, -0.102690f, -0.064724f, 0.062608f, 0.237783f, 0.366599f, 0.391473f, 0.329692f, 0.231326f, 0.128318f, 0.030222f, -0.055798f, -0.121650f, -0.168422f, -0.204629f, -0.233962f, -0.253078f, -0.260136f, -0.256765f, -0.242370f, -0.216094f, -0.185514f, -0.164188f, -0.157679f, -0.158772f, -0.158039f, -0.152420f, -0.142465f, -0.128405f, -0.111148f, -0.092065f, -0.070678f, -0.045979f, -0.019198f, 0.007643f, 0.033532f, 0.056493f, 0.073700f, 0.085876f, 0.097069f, 0.108478f, 0.117609f, 0.124012f, 0.129735f, 0.134173f, 0.134912f, 0.132726f, 0.129439f, 0.123146f, 0.111851f, 0.098311f, 0.085383f, 0.071577f, 0.056410f, 0.043514f, 0.033919f, 0.024302f, 0.015077f, 0.010656f, 0.010232f, 0.009612f, 0.011570f, 0.021452f, 0.035720f, 0.049452f, 0.068352f, 0.096786f, 0.126020f, 0.154079f, 0.197033f, 0.251253f, 0.270031f, 0.223100f, 0.160302f}, + { -0.012716f, -0.011283f, -0.028399f, -0.061054f, -0.081205f, -0.083144f, -0.091074f, -0.102690f, -0.064724f, 0.062608f, 0.237783f, 0.366599f, 0.391473f, 0.329692f, 0.231326f, 0.128318f, 0.030222f, -0.055798f, -0.121650f, -0.168422f, -0.204629f, -0.233962f, -0.253078f, -0.260136f, -0.256765f, -0.242370f, -0.216094f, -0.185514f, -0.164188f, -0.157679f, -0.158772f, -0.158039f, -0.152420f, -0.142465f, -0.128405f, -0.111148f, -0.092065f, -0.070678f, -0.045979f, -0.019198f, 0.007643f, 0.033532f, 0.056493f, 0.073700f, 0.085876f, 0.097069f, 0.108478f, 0.117609f, 0.124012f, 0.129735f, 0.134173f, 0.134912f, 0.132726f, 0.129439f, 0.123146f, 0.111851f, 0.098311f, 0.085383f, 0.071577f, 0.056410f, 0.043514f, 0.033919f, 0.024302f, 0.015077f, 0.010656f, 0.010232f, 0.009612f, 0.011570f, 0.021452f, 0.035720f, 0.049452f, 0.068352f, 0.096786f, 0.126020f, 0.154079f, 0.197033f, 0.251253f, 0.270031f, 0.223100f, 0.160302f} + }, + { + { 0.035859f, -0.035357f, -0.114806f, -0.119629f, -0.016035f, 0.134784f, 0.211022f, 0.138101f, -0.031463f, -0.164348f, -0.178566f, -0.110510f, -0.046828f, -0.024291f, -0.021836f, -0.019841f, -0.020649f, -0.019218f, 0.000673f, 0.033520f, 0.050179f, 0.039650f, 0.025311f, 0.029447f, 0.046313f, 0.061065f, 0.072923f, 0.086604f, 0.097738f, 0.098999f, 0.090037f, 0.074499f, 0.056179f, 0.040502f, 0.030491f, 0.020585f, 0.002674f, -0.023442f, -0.052639f, -0.082588f, -0.111653f, -0.134805f, -0.149388f, -0.159077f, -0.166519f, -0.169259f, -0.166952f, -0.163907f, -0.161378f, -0.156387f, -0.149606f, -0.144842f, -0.140986f, -0.134223f, -0.126134f, -0.119925f, -0.112707f, -0.101068f, -0.088476f, -0.078329f, -0.067520f, -0.054684f, -0.044956f, -0.039968f, -0.034783f, -0.029180f, -0.028179f, -0.029379f, -0.025982f, -0.021388f, -0.022077f, -0.020755f, -0.008615f, 0.005112f, 0.013009f, 0.034539f, 0.085352f, 0.136291f, 0.147338f, 0.130821f}, + { 0.035859f, -0.035357f, -0.114806f, -0.119629f, -0.016035f, 0.134784f, 0.211022f, 0.138101f, -0.031463f, -0.164348f, -0.178566f, -0.110510f, -0.046828f, -0.024291f, -0.021836f, -0.019841f, -0.020649f, -0.019218f, 0.000673f, 0.033520f, 0.050179f, 0.039650f, 0.025311f, 0.029447f, 0.046313f, 0.061065f, 0.072923f, 0.086604f, 0.097738f, 0.098999f, 0.090037f, 0.074499f, 0.056179f, 0.040502f, 0.030491f, 0.020585f, 0.002674f, -0.023442f, -0.052639f, -0.082588f, -0.111653f, -0.134805f, -0.149388f, -0.159077f, -0.166519f, -0.169259f, -0.166952f, -0.163907f, -0.161378f, -0.156387f, -0.149606f, -0.144842f, -0.140986f, -0.134223f, -0.126134f, -0.119925f, -0.112707f, -0.101068f, -0.088476f, -0.078329f, -0.067520f, -0.054684f, -0.044956f, -0.039968f, -0.034783f, -0.029180f, -0.028179f, -0.029379f, -0.025982f, -0.021388f, -0.022077f, -0.020755f, -0.008615f, 0.005112f, 0.013009f, 0.034539f, 0.085352f, 0.136291f, 0.147338f, 0.130821f} + }, + { + { -0.000277f, 0.072507f, 0.102938f, 0.013249f, -0.152871f, -0.302455f, -0.374408f, -0.331367f, -0.150657f, 0.128128f, 0.396891f, 0.568348f, 0.643297f, 0.660957f, 0.623136f, 0.509757f, 0.340137f, 0.169505f, 0.031029f, -0.085194f, -0.198795f, -0.311141f, -0.410925f, -0.488800f, -0.543139f, -0.580355f, -0.609683f, -0.633539f, -0.646097f, -0.642831f, -0.625426f, -0.596020f, -0.553861f, -0.499612f, -0.436850f, -0.368148f, -0.294645f, -0.219235f, -0.145750f, -0.076151f, -0.011910f, 0.044644f, 0.093543f, 0.138070f, 0.179584f, 0.215412f, 0.243810f, 0.266366f, 0.284297f, 0.297593f, 0.308450f, 0.320041f, 0.331716f, 0.340456f, 0.346032f, 0.349732f, 0.350243f, 0.345998f, 0.338804f, 0.330510f, 0.319816f, 0.306267f, 0.292468f, 0.279073f, 0.263490f, 0.245910f, 0.229601f, 0.214043f, 0.196022f, 0.177471f, 0.162554f, 0.148486f, 0.130576f, 0.113131f, 0.101342f, 0.086559f, 0.056990f, 0.019982f, -0.005018f, -0.012955f}, + { -0.000277f, 0.072507f, 0.102938f, 0.013249f, -0.152871f, -0.302455f, -0.374408f, -0.331367f, -0.150657f, 0.128128f, 0.396891f, 0.568348f, 0.643297f, 0.660957f, 0.623136f, 0.509757f, 0.340137f, 0.169505f, 0.031029f, -0.085194f, -0.198795f, -0.311141f, -0.410925f, -0.488800f, -0.543139f, -0.580355f, -0.609683f, -0.633539f, -0.646097f, -0.642831f, -0.625426f, -0.596020f, -0.553861f, -0.499612f, -0.436850f, -0.368148f, -0.294645f, -0.219235f, -0.145750f, -0.076151f, -0.011910f, 0.044644f, 0.093543f, 0.138070f, 0.179584f, 0.215412f, 0.243810f, 0.266366f, 0.284297f, 0.297593f, 0.308450f, 0.320041f, 0.331716f, 0.340456f, 0.346032f, 0.349732f, 0.350243f, 0.345998f, 0.338804f, 0.330510f, 0.319816f, 0.306267f, 0.292468f, 0.279073f, 0.263490f, 0.245910f, 0.229601f, 0.214043f, 0.196022f, 0.177471f, 0.162554f, 0.148486f, 0.130576f, 0.113131f, 0.101342f, 0.086559f, 0.056990f, 0.019982f, -0.005018f, -0.012955f} + } +}; +const float CRendBin_HOA2_HRIR_coeff_im_16kHz[9][BINAURAL_CHANNELS][80]={ + { + { -0.279849f, -0.720835f, -0.885416f, -0.784738f, -0.545597f, -0.284166f, -0.039642f, 0.189992f, 0.392178f, 0.537862f, 0.608064f, 0.599378f, 0.517014f, 0.378190f, 0.211052f, 0.038799f, -0.127672f, -0.280366f, -0.411081f, -0.518033f, -0.602220f, -0.659249f, -0.686892f, -0.694308f, -0.690691f, -0.672923f, -0.636337f, -0.587078f, -0.532859f, -0.473554f, -0.410112f, -0.349570f, -0.294359f, -0.240124f, -0.187465f, -0.141656f, -0.100915f, -0.059776f, -0.020698f, 0.012198f, 0.044049f, 0.079925f, 0.114533f, 0.143760f, 0.173471f, 0.206190f, 0.234826f, 0.257923f, 0.283113f, 0.310262f, 0.331082f, 0.346996f, 0.366076f, 0.384865f, 0.395359f, 0.402963f, 0.415413f, 0.425799f, 0.427896f, 0.431174f, 0.440886f, 0.445771f, 0.442548f, 0.444490f, 0.452426f, 0.451179f, 0.443114f, 0.445296f, 0.451405f, 0.442876f, 0.431564f, 0.437517f, 0.441102f, 0.420868f, 0.408764f, 0.426165f, 0.404391f, 0.275313f, 0.105567f, 0.014714f}, + { -0.279849f, -0.720835f, -0.885416f, -0.784738f, -0.545597f, -0.284166f, -0.039642f, 0.189992f, 0.392178f, 0.537862f, 0.608064f, 0.599378f, 0.517014f, 0.378190f, 0.211052f, 0.038799f, -0.127672f, -0.280366f, -0.411081f, -0.518033f, -0.602220f, -0.659249f, -0.686892f, -0.694308f, -0.690691f, -0.672923f, -0.636337f, -0.587078f, -0.532859f, -0.473554f, -0.410112f, -0.349570f, -0.294359f, -0.240124f, -0.187465f, -0.141656f, -0.100915f, -0.059776f, -0.020698f, 0.012198f, 0.044049f, 0.079925f, 0.114533f, 0.143760f, 0.173471f, 0.206190f, 0.234826f, 0.257923f, 0.283113f, 0.310262f, 0.331082f, 0.346996f, 0.366076f, 0.384865f, 0.395359f, 0.402963f, 0.415413f, 0.425799f, 0.427896f, 0.431174f, 0.440886f, 0.445771f, 0.442548f, 0.444490f, 0.452426f, 0.451179f, 0.443114f, 0.445296f, 0.451405f, 0.442876f, 0.431564f, 0.437517f, 0.441102f, 0.420868f, 0.408764f, 0.426165f, 0.404391f, 0.275313f, 0.105567f, 0.014714f} + }, + { + { 0.137891f, 0.229594f, -0.067928f, -0.623005f, -1.090538f, -1.189519f, -0.884822f, -0.354524f, 0.180758f, 0.598608f, 0.883947f, 1.053700f, 1.111227f, 1.061907f, 0.928126f, 0.732907f, 0.490534f, 0.220795f, -0.047441f, -0.292902f, -0.508160f, -0.690313f, -0.839240f, -0.960125f, -1.054642f, -1.116743f, -1.146677f, -1.156988f, -1.156022f, -1.140346f, -1.110014f, -1.073762f, -1.034019f, -0.985244f, -0.929519f, -0.875052f, -0.820278f, -0.758166f, -0.691738f, -0.627222f, -0.560364f, -0.486773f, -0.413937f, -0.347468f, -0.280644f, -0.210486f, -0.145643f, -0.088457f, -0.030518f, 0.027797f, 0.077074f, 0.119974f, 0.167213f, 0.215231f, 0.254026f, 0.289039f, 0.328776f, 0.364400f, 0.387539f, 0.408919f, 0.435376f, 0.454122f, 0.460897f, 0.471406f, 0.487696f, 0.492222f, 0.486983f, 0.492364f, 0.502301f, 0.494577f, 0.481913f, 0.489869f, 0.498275f, 0.479752f, 0.470075f, 0.504969f, 0.517158f, 0.412306f, 0.223203f, 0.061484f}, + { -0.137891f, -0.229594f, 0.067928f, 0.623005f, 1.090538f, 1.189519f, 0.884822f, 0.354524f, -0.180758f, -0.598608f, -0.883947f, -1.053700f, -1.111227f, -1.061907f, -0.928126f, -0.732907f, -0.490534f, -0.220795f, 0.047441f, 0.292902f, 0.508160f, 0.690313f, 0.839240f, 0.960125f, 1.054642f, 1.116743f, 1.146677f, 1.156988f, 1.156022f, 1.140346f, 1.110014f, 1.073762f, 1.034019f, 0.985244f, 0.929519f, 0.875052f, 0.820278f, 0.758166f, 0.691738f, 0.627222f, 0.560364f, 0.486773f, 0.413937f, 0.347468f, 0.280644f, 0.210486f, 0.145643f, 0.088457f, 0.030518f, -0.027797f, -0.077074f, -0.119974f, -0.167213f, -0.215231f, -0.254026f, -0.289039f, -0.328776f, -0.364400f, -0.387539f, -0.408919f, -0.435376f, -0.454122f, -0.460897f, -0.471406f, -0.487696f, -0.492222f, -0.486983f, -0.492364f, -0.502301f, -0.494577f, -0.481913f, -0.489869f, -0.498275f, -0.479752f, -0.470075f, -0.504969f, -0.517158f, -0.412306f, -0.223203f, -0.061484f} + }, + { + { -0.037944f, -0.106904f, -0.132860f, -0.074197f, 0.039345f, 0.109112f, 0.075839f, -0.015806f, -0.081154f, -0.083561f, -0.038813f, 0.024921f, 0.079316f, 0.098387f, 0.081988f, 0.060932f, 0.056952f, 0.053685f, 0.024659f, -0.028315f, -0.083387f, -0.128710f, -0.164189f, -0.185222f, -0.184737f, -0.166916f, -0.145003f, -0.127294f, -0.112613f, -0.096040f, -0.073923f, -0.046696f, -0.019918f, 0.000121f, 0.011773f, 0.015947f, 0.011639f, -0.001080f, -0.016599f, -0.028201f, -0.034495f, -0.036865f, -0.034339f, -0.025728f, -0.012939f, 0.002163f, 0.020448f, 0.042341f, 0.066491f, 0.093562f, 0.126180f, 0.163808f, 0.202979f, 0.242843f, 0.284779f, 0.327198f, 0.366815f, 0.403787f, 0.439636f, 0.472316f, 0.499155f, 0.521398f, 0.540138f, 0.552065f, 0.554704f, 0.550353f, 0.539674f, 0.518421f, 0.485659f, 0.446647f, 0.402248f, 0.346247f, 0.279546f, 0.213387f, 0.148100f, 0.064032f, -0.046179f, -0.142400f, -0.158189f, -0.068950f}, + { -0.037944f, -0.106904f, -0.132860f, -0.074197f, 0.039345f, 0.109112f, 0.075839f, -0.015806f, -0.081154f, -0.083561f, -0.038813f, 0.024921f, 0.079316f, 0.098387f, 0.081988f, 0.060932f, 0.056952f, 0.053685f, 0.024659f, -0.028315f, -0.083387f, -0.128710f, -0.164189f, -0.185222f, -0.184737f, -0.166916f, -0.145003f, -0.127294f, -0.112613f, -0.096040f, -0.073923f, -0.046696f, -0.019918f, 0.000121f, 0.011773f, 0.015947f, 0.011639f, -0.001080f, -0.016599f, -0.028201f, -0.034495f, -0.036865f, -0.034339f, -0.025728f, -0.012939f, 0.002163f, 0.020448f, 0.042341f, 0.066491f, 0.093562f, 0.126180f, 0.163808f, 0.202979f, 0.242843f, 0.284779f, 0.327198f, 0.366815f, 0.403787f, 0.439636f, 0.472316f, 0.499155f, 0.521398f, 0.540138f, 0.552065f, 0.554704f, 0.550353f, 0.539674f, 0.518421f, 0.485659f, 0.446647f, 0.402248f, 0.346247f, 0.279546f, 0.213387f, 0.148100f, 0.064032f, -0.046179f, -0.142400f, -0.158189f, -0.068950f} + }, + { + { -0.001343f, -0.030465f, -0.090431f, -0.117729f, -0.072159f, -0.000959f, 0.017976f, -0.029349f, -0.083995f, -0.085435f, -0.026909f, 0.054025f, 0.117372f, 0.148897f, 0.159644f, 0.166262f, 0.171633f, 0.163163f, 0.127809f, 0.065274f, -0.013456f, -0.095573f, -0.171737f, -0.236275f, -0.288250f, -0.332759f, -0.376516f, -0.419675f, -0.454690f, -0.474981f, -0.481065f, -0.475362f, -0.455565f, -0.418282f, -0.365992f, -0.304811f, -0.237851f, -0.166048f, -0.093163f, -0.024547f, 0.037453f, 0.092832f, 0.140930f, 0.181479f, 0.216098f, 0.246070f, 0.271249f, 0.292345f, 0.310665f, 0.325008f, 0.332856f, 0.334536f, 0.332397f, 0.327422f, 0.320787f, 0.315984f, 0.314890f, 0.314985f, 0.314210f, 0.313937f, 0.314092f, 0.311588f, 0.306338f, 0.301707f, 0.297473f, 0.290554f, 0.282600f, 0.277168f, 0.271223f, 0.260355f, 0.248072f, 0.237680f, 0.222743f, 0.199693f, 0.176748f, 0.151965f, 0.102492f, 0.025265f, -0.032061f, -0.023375f}, + { -0.001343f, -0.030465f, -0.090431f, -0.117729f, -0.072159f, -0.000959f, 0.017976f, -0.029349f, -0.083995f, -0.085435f, -0.026909f, 0.054025f, 0.117372f, 0.148897f, 0.159644f, 0.166262f, 0.171633f, 0.163163f, 0.127809f, 0.065274f, -0.013456f, -0.095573f, -0.171737f, -0.236275f, -0.288250f, -0.332759f, -0.376516f, -0.419675f, -0.454690f, -0.474981f, -0.481065f, -0.475362f, -0.455565f, -0.418282f, -0.365992f, -0.304811f, -0.237851f, -0.166048f, -0.093163f, -0.024547f, 0.037453f, 0.092832f, 0.140930f, 0.181479f, 0.216098f, 0.246070f, 0.271249f, 0.292345f, 0.310665f, 0.325008f, 0.332856f, 0.334536f, 0.332397f, 0.327422f, 0.320787f, 0.315984f, 0.314890f, 0.314985f, 0.314210f, 0.313937f, 0.314092f, 0.311588f, 0.306338f, 0.301707f, 0.297473f, 0.290554f, 0.282600f, 0.277168f, 0.271223f, 0.260355f, 0.248072f, 0.237680f, 0.222743f, 0.199693f, 0.176748f, 0.151965f, 0.102492f, 0.025265f, -0.032061f, -0.023375f} + }, + { + { -0.003822f, -0.004182f, 0.003769f, 0.002231f, -0.018518f, -0.042371f, -0.050814f, -0.055060f, -0.082241f, -0.127129f, -0.141168f, -0.084513f, 0.025067f, 0.131195f, 0.197402f, 0.230196f, 0.250490f, 0.263052f, 0.258983f, 0.233443f, 0.189892f, 0.131909f, 0.060205f, -0.021879f, -0.106291f, -0.186505f, -0.262057f, -0.333838f, -0.398243f, -0.449958f, -0.487738f, -0.512937f, -0.524754f, -0.521358f, -0.503097f, -0.470311f, -0.421405f, -0.357963f, -0.288378f, -0.221718f, -0.161127f, -0.106483f, -0.058681f, -0.017466f, 0.020089f, 0.055500f, 0.087512f, 0.116263f, 0.143565f, 0.168412f, 0.187881f, 0.202191f, 0.213370f, 0.220775f, 0.223797f, 0.225934f, 0.230320f, 0.235230f, 0.239129f, 0.244505f, 0.252120f, 0.258553f, 0.263155f, 0.269212f, 0.275974f, 0.279247f, 0.280325f, 0.283134f, 0.284382f, 0.279208f, 0.271780f, 0.265915f, 0.254057f, 0.231999f, 0.209308f, 0.183649f, 0.128013f, 0.038161f, -0.030805f, -0.024799f}, + { 0.003822f, 0.004182f, -0.003769f, -0.002231f, 0.018518f, 0.042371f, 0.050814f, 0.055060f, 0.082241f, 0.127129f, 0.141168f, 0.084513f, -0.025067f, -0.131195f, -0.197402f, -0.230196f, -0.250490f, -0.263052f, -0.258983f, -0.233443f, -0.189892f, -0.131909f, -0.060205f, 0.021879f, 0.106291f, 0.186505f, 0.262057f, 0.333838f, 0.398243f, 0.449958f, 0.487738f, 0.512937f, 0.524754f, 0.521358f, 0.503097f, 0.470311f, 0.421405f, 0.357963f, 0.288378f, 0.221718f, 0.161127f, 0.106483f, 0.058681f, 0.017466f, -0.020089f, -0.055500f, -0.087512f, -0.116263f, -0.143565f, -0.168412f, -0.187881f, -0.202191f, -0.213370f, -0.220775f, -0.223797f, -0.225934f, -0.230320f, -0.235230f, -0.239129f, -0.244505f, -0.252120f, -0.258553f, -0.263155f, -0.269212f, -0.275974f, -0.279247f, -0.280325f, -0.283134f, -0.284382f, -0.279208f, -0.271780f, -0.265915f, -0.254057f, -0.231999f, -0.209308f, -0.183649f, -0.128013f, -0.038161f, 0.030805f, 0.024799f} + }, + { + { -0.007141f, -0.000269f, 0.020053f, 0.005151f, -0.021397f, 0.017134f, 0.096077f, 0.079602f, -0.080798f, -0.242492f, -0.239038f, -0.078682f, 0.094173f, 0.179901f, 0.193223f, 0.186734f, 0.180011f, 0.165677f, 0.136686f, 0.092362f, 0.037203f, -0.018468f, -0.063954f, -0.094649f, -0.110368f, -0.112031f, -0.103341f, -0.090810f, -0.078704f, -0.067141f, -0.056765f, -0.051692f, -0.055372f, -0.065676f, -0.076978f, -0.087145f, -0.100035f, -0.119731f, -0.144366f, -0.167862f, -0.185792f, -0.196760f, -0.200382f, -0.197667f, -0.191812f, -0.185459f, -0.178637f, -0.170957f, -0.162715f, -0.152400f, -0.137119f, -0.116662f, -0.092858f, -0.064845f, -0.030146f, 0.010135f, 0.052660f, 0.096829f, 0.142849f, 0.187559f, 0.227910f, 0.264896f, 0.298909f, 0.326420f, 0.345843f, 0.359746f, 0.367295f, 0.363369f, 0.348300f, 0.327585f, 0.299800f, 0.258398f, 0.207127f, 0.156648f, 0.103405f, 0.032624f, -0.049949f, -0.107648f, -0.105316f, -0.043186f}, + { 0.007141f, 0.000269f, -0.020053f, -0.005151f, 0.021397f, -0.017134f, -0.096077f, -0.079602f, 0.080798f, 0.242492f, 0.239038f, 0.078682f, -0.094173f, -0.179901f, -0.193223f, -0.186734f, -0.180011f, -0.165677f, -0.136686f, -0.092362f, -0.037203f, 0.018468f, 0.063954f, 0.094649f, 0.110368f, 0.112031f, 0.103341f, 0.090810f, 0.078704f, 0.067141f, 0.056765f, 0.051692f, 0.055372f, 0.065676f, 0.076978f, 0.087145f, 0.100035f, 0.119731f, 0.144366f, 0.167862f, 0.185792f, 0.196760f, 0.200382f, 0.197667f, 0.191812f, 0.185459f, 0.178637f, 0.170957f, 0.162715f, 0.152400f, 0.137119f, 0.116662f, 0.092858f, 0.064845f, 0.030146f, -0.010135f, -0.052660f, -0.096829f, -0.142849f, -0.187559f, -0.227910f, -0.264896f, -0.298909f, -0.326420f, -0.345843f, -0.359746f, -0.367295f, -0.363369f, -0.348300f, -0.327585f, -0.299800f, -0.258398f, -0.207127f, -0.156648f, -0.103405f, -0.032624f, 0.049949f, 0.107648f, 0.105316f, 0.043186f} + }, + { + { -0.001068f, -0.011669f, -0.026585f, -0.020015f, 0.010585f, 0.040078f, 0.066520f, 0.124261f, 0.221193f, 0.294911f, 0.266885f, 0.129051f, -0.049656f, -0.195409f, -0.283656f, -0.326169f, -0.335364f, -0.316666f, -0.279923f, -0.238383f, -0.197010f, -0.152299f, -0.103120f, -0.053556f, -0.006327f, 0.037345f, 0.071350f, 0.087916f, 0.089422f, 0.089013f, 0.097000f, 0.112917f, 0.131823f, 0.151104f, 0.169420f, 0.185327f, 0.198942f, 0.210964f, 0.219989f, 0.223967f, 0.222689f, 0.216294f, 0.204468f, 0.189464f, 0.175607f, 0.163713f, 0.150702f, 0.135728f, 0.121043f, 0.106637f, 0.090424f, 0.073312f, 0.057730f, 0.042745f, 0.026954f, 0.013259f, 0.004619f, -0.000739f, -0.004364f, -0.003750f, 0.001700f, 0.008264f, 0.015354f, 0.026579f, 0.041079f, 0.054236f, 0.067442f, 0.085032f, 0.103334f, 0.116515f, 0.128381f, 0.142875f, 0.152038f, 0.151164f, 0.149997f, 0.145519f, 0.107611f, 0.028941f, -0.034761f, -0.026006f}, + { -0.001068f, -0.011669f, -0.026585f, -0.020015f, 0.010585f, 0.040078f, 0.066520f, 0.124261f, 0.221193f, 0.294911f, 0.266885f, 0.129051f, -0.049656f, -0.195409f, -0.283656f, -0.326169f, -0.335364f, -0.316666f, -0.279923f, -0.238383f, -0.197010f, -0.152299f, -0.103120f, -0.053556f, -0.006327f, 0.037345f, 0.071350f, 0.087916f, 0.089422f, 0.089013f, 0.097000f, 0.112917f, 0.131823f, 0.151104f, 0.169420f, 0.185327f, 0.198942f, 0.210964f, 0.219989f, 0.223967f, 0.222689f, 0.216294f, 0.204468f, 0.189464f, 0.175607f, 0.163713f, 0.150702f, 0.135728f, 0.121043f, 0.106637f, 0.090424f, 0.073312f, 0.057730f, 0.042745f, 0.026954f, 0.013259f, 0.004619f, -0.000739f, -0.004364f, -0.003750f, 0.001700f, 0.008264f, 0.015354f, 0.026579f, 0.041079f, 0.054236f, 0.067442f, 0.085032f, 0.103334f, 0.116515f, 0.128381f, 0.142875f, 0.152038f, 0.151164f, 0.149997f, 0.145519f, 0.107611f, 0.028941f, -0.034761f, -0.026006f} + }, + { + { -0.037828f, -0.075096f, -0.025986f, 0.086083f, 0.170568f, 0.136964f, -0.015998f, -0.179579f, -0.227305f, -0.136711f, -0.003232f, 0.070010f, 0.069408f, 0.046996f, 0.037246f, 0.035376f, 0.036858f, 0.049531f, 0.065210f, 0.059663f, 0.031146f, 0.008574f, 0.010733f, 0.023060f, 0.025014f, 0.016687f, 0.006465f, -0.007530f, -0.030444f, -0.058769f, -0.085159f, -0.105870f, -0.119253f, -0.126108f, -0.132952f, -0.145953f, -0.161950f, -0.172937f, -0.176110f, -0.172287f, -0.160154f, -0.140096f, -0.117814f, -0.097309f, -0.076591f, -0.054926f, -0.036201f, -0.021493f, -0.007233f, 0.006947f, 0.017810f, 0.026450f, 0.036880f, 0.047880f, 0.055961f, 0.063286f, 0.072990f, 0.081618f, 0.085458f, 0.087597f, 0.090387f, 0.089833f, 0.084714f, 0.080517f, 0.078723f, 0.074845f, 0.070311f, 0.071284f, 0.075074f, 0.075104f, 0.076588f, 0.086990f, 0.097901f, 0.100583f, 0.107487f, 0.127031f, 0.132157f, 0.094602f, 0.037294f, 0.005325f}, + { -0.037828f, -0.075096f, -0.025986f, 0.086083f, 0.170568f, 0.136964f, -0.015998f, -0.179579f, -0.227305f, -0.136711f, -0.003232f, 0.070010f, 0.069408f, 0.046996f, 0.037246f, 0.035376f, 0.036858f, 0.049531f, 0.065210f, 0.059663f, 0.031146f, 0.008574f, 0.010733f, 0.023060f, 0.025014f, 0.016687f, 0.006465f, -0.007530f, -0.030444f, -0.058769f, -0.085159f, -0.105870f, -0.119253f, -0.126108f, -0.132952f, -0.145953f, -0.161950f, -0.172937f, -0.176110f, -0.172287f, -0.160154f, -0.140096f, -0.117814f, -0.097309f, -0.076591f, -0.054926f, -0.036201f, -0.021493f, -0.007233f, 0.006947f, 0.017810f, 0.026450f, 0.036880f, 0.047880f, 0.055961f, 0.063286f, 0.072990f, 0.081618f, 0.085458f, 0.087597f, 0.090387f, 0.089833f, 0.084714f, 0.080517f, 0.078723f, 0.074845f, 0.070311f, 0.071284f, 0.075074f, 0.075104f, 0.076588f, 0.086990f, 0.097901f, 0.100583f, 0.107487f, 0.127031f, 0.132157f, 0.094602f, 0.037294f, 0.005325f} + }, + { + { 0.027301f, 0.021738f, -0.081975f, -0.191273f, -0.201656f, -0.093313f, 0.098293f, 0.327814f, 0.523024f, 0.591610f, 0.499519f, 0.308744f, 0.101488f, -0.099663f, -0.304655f, -0.489528f, -0.606885f, -0.646492f, -0.643705f, -0.630992f, -0.609667f, -0.567561f, -0.501376f, -0.418604f, -0.330719f, -0.246456f, -0.165722f, -0.081663f, 0.008736f, 0.100691f, 0.189194f, 0.273485f, 0.352379f, 0.422027f, 0.480102f, 0.526801f, 0.561345f, 0.582237f, 0.590324f, 0.587683f, 0.575450f, 0.555880f, 0.533158f, 0.508979f, 0.481080f, 0.448562f, 0.414355f, 0.380878f, 0.348188f, 0.317304f, 0.289889f, 0.264214f, 0.236745f, 0.207390f, 0.178284f, 0.149119f, 0.118860f, 0.089518f, 0.063222f, 0.038738f, 0.015103f, -0.005639f, -0.022904f, -0.039298f, -0.055077f, -0.067305f, -0.076311f, -0.085345f, -0.093266f, -0.096501f, -0.097512f, -0.100870f, -0.103292f, -0.100064f, -0.097365f, -0.102461f, -0.105454f, -0.089136f, -0.054435f, -0.017187f}, + { 0.027301f, 0.021738f, -0.081975f, -0.191273f, -0.201656f, -0.093313f, 0.098293f, 0.327814f, 0.523024f, 0.591610f, 0.499519f, 0.308744f, 0.101488f, -0.099663f, -0.304655f, -0.489528f, -0.606885f, -0.646492f, -0.643705f, -0.630992f, -0.609667f, -0.567561f, -0.501376f, -0.418604f, -0.330719f, -0.246456f, -0.165722f, -0.081663f, 0.008736f, 0.100691f, 0.189194f, 0.273485f, 0.352379f, 0.422027f, 0.480102f, 0.526801f, 0.561345f, 0.582237f, 0.590324f, 0.587683f, 0.575450f, 0.555880f, 0.533158f, 0.508979f, 0.481080f, 0.448562f, 0.414355f, 0.380878f, 0.348188f, 0.317304f, 0.289889f, 0.264214f, 0.236745f, 0.207390f, 0.178284f, 0.149119f, 0.118860f, 0.089518f, 0.063222f, 0.038738f, 0.015103f, -0.005639f, -0.022904f, -0.039298f, -0.055077f, -0.067305f, -0.076311f, -0.085345f, -0.093266f, -0.096501f, -0.097512f, -0.100870f, -0.103292f, -0.100064f, -0.097365f, -0.102461f, -0.105454f, -0.089136f, -0.054435f, -0.017187f} + } +}; +const float *CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float *CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; +#endif /* USE_HRIR_128_48000_DOLBY_SBA2 */ + +#ifdef USE_HRIR_128_48000_DOLBY_SBA3 + + +/********************** CRendBin_HOA3_HRIR **********************/ + +const float CRendBin_HOA3_HRIR_latency_s = 0.000000000000000f; + +/* Sample Rate = 48000 */ + +const int16_t CRendBin_HOA3_HRIR_max_num_iterations_48kHz = 1; +const uint16_t CRendBin_HOA3_HRIR_num_iterations_48kHz[16][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {0, 0}; +const uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[16][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}}; +const uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz = 0; +const float CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz[16]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f}; +const uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float CRendBin_HOA3_HRIR_coeff_re_48kHz[16][BINAURAL_CHANNELS][240]={ + { + {0.975460f, 0.823508f, 0.578722f, 0.311394f, 0.071393f, -0.117298f, -0.265803f, -0.406443f, -0.536876f, -0.603591f, -0.568995f, -0.446021f, -0.232011f, 0.098533f, 0.446049f, 0.539124f, 0.219489f, -0.255318f, -0.399037f, -0.041354f, 0.472264f, 0.693368f, 0.533266f, 0.219305f, -0.059008f, -0.291241f, -0.505715f, -0.670083f, -0.755827f, -0.790827f, -0.808813f, -0.807132f, -0.777516f, -0.733727f, -0.690346f, -0.645074f, -0.594162f, -0.543258f, -0.496359f, -0.450603f, -0.404959f, -0.361817f, -0.320310f, -0.277796f, -0.235759f, -0.196817f, -0.159540f, -0.122007f, -0.085990f, -0.053099f, -0.021484f, 0.010278f, 0.040672f, 0.068775f, 0.095789f, 0.121856f, 0.145524f, 0.166807f, 0.187076f, 0.206251f, 0.223418f, 0.239269f, 0.254992f, 0.270072f, 0.283633f, 0.296367f, 0.309129f, 0.321380f, 0.332609f, 0.343518f, 0.354653f, 0.365577f, 0.376080f, 0.386687f, 0.397603f, 0.408487f, 0.419268f, 0.430118f, 0.440990f, 0.451887f, 0.462914f, 0.473622f, 0.483318f, 0.492236f, 0.501131f, 0.509707f, 0.516930f, 0.522835f, 0.528471f, 0.534052f, 0.538627f, 0.541575f, 0.543261f, 0.544286f, 0.544970f, 0.545324f, + 0.544992f, 0.543702f, 0.542083f, 0.541321f, 0.541767f, 0.542678f, 0.543474f, 0.544468f, 0.546285f, 0.549302f, 0.553570f, 0.558668f, 0.563836f, 0.568775f, 0.574014f, 0.580118f, 0.586957f, 0.594005f, 0.600840f, 0.607125f, 0.612700f, 0.617868f, 0.623088f, 0.628356f, 0.633282f, 0.637656f, 0.641523f, 0.644919f, 0.647931f, 0.650762f, 0.653419f, 0.655595f, 0.657072f, 0.657932f, 0.658320f, 0.658353f, 0.658263f, 0.658277f, 0.658369f, 0.658425f, 0.658492f, 0.658661f, 0.658936f, 0.659454f, 0.660549f, 0.662412f, 0.664935f, 0.667968f, 0.671455f, 0.675277f, 0.679269f, 0.683383f, 0.687622f, 0.691852f, 0.695884f, 0.699596f, 0.702892f, 0.705658f, 0.707869f, 0.709572f, 0.710785f, 0.711543f, 0.711953f, 0.712094f, 0.711995f, 0.711765f, 0.711575f, 0.711499f, 0.711595f, 0.712021f, 0.712800f, 0.713666f, 0.714410f, 0.715098f, 0.715743f, 0.716167f, 0.716376f, 0.716567f, 0.716703f, 0.716617f, 0.716501f, 0.716656f, 0.716977f, 0.717361f, 0.718171f, 0.719629f, 0.721375f, 0.723265f, 0.725713f, 0.728693f, 0.731584f, 0.734403f, 0.737690f, 0.741092f, 0.743862f, 0.746530f, + 0.749856f, 0.752896f, 0.754767f, 0.756924f, 0.760408f, 0.763073f, 0.763626f, 0.765163f, 0.769439f, 0.771950f, 0.769853f, 0.769580f, 0.776657f, 0.782626f, 0.774831f, 0.756861f, 0.745683f, 0.748813f, 0.757334f, 0.761317f, 0.758260f, 0.746087f, 0.724051f, 0.704063f, 0.704633f, 0.725907f, 0.744126f, 0.739878f, 0.720948f, 0.707668f, 0.705590f, 0.705432f, 0.704944f, 0.716791f, 0.751654f, 0.801379f, 0.844163f, 0.864649f, 0.865574f, 0.859719f, 0.854548f, 0.849005f, 0.842929f, 0.840816f, 0.842745f, 0.839787f, 0.826402f, 0.812303f}, + {0.975460f, 0.823508f, 0.578722f, 0.311394f, 0.071393f, -0.117298f, -0.265803f, -0.406443f, -0.536876f, -0.603591f, -0.568995f, -0.446021f, -0.232011f, 0.098533f, 0.446049f, 0.539124f, 0.219489f, -0.255318f, -0.399037f, -0.041354f, 0.472264f, 0.693368f, 0.533266f, 0.219305f, -0.059008f, -0.291241f, -0.505715f, -0.670083f, -0.755827f, -0.790827f, -0.808813f, -0.807132f, -0.777516f, -0.733727f, -0.690346f, -0.645074f, -0.594162f, -0.543258f, -0.496359f, -0.450603f, -0.404959f, -0.361817f, -0.320310f, -0.277796f, -0.235759f, -0.196817f, -0.159540f, -0.122007f, -0.085990f, -0.053099f, -0.021484f, 0.010278f, 0.040672f, 0.068775f, 0.095789f, 0.121856f, 0.145524f, 0.166807f, 0.187076f, 0.206251f, 0.223418f, 0.239269f, 0.254992f, 0.270072f, 0.283633f, 0.296367f, 0.309129f, 0.321380f, 0.332609f, 0.343518f, 0.354653f, 0.365577f, 0.376080f, 0.386687f, 0.397603f, 0.408487f, 0.419268f, 0.430118f, 0.440990f, 0.451887f, 0.462914f, 0.473622f, 0.483318f, 0.492236f, 0.501131f, 0.509707f, 0.516930f, 0.522835f, 0.528471f, 0.534052f, 0.538627f, 0.541575f, 0.543261f, 0.544286f, 0.544970f, 0.545324f, + 0.544992f, 0.543702f, 0.542083f, 0.541321f, 0.541767f, 0.542678f, 0.543474f, 0.544468f, 0.546285f, 0.549302f, 0.553570f, 0.558668f, 0.563836f, 0.568775f, 0.574014f, 0.580118f, 0.586957f, 0.594005f, 0.600840f, 0.607125f, 0.612700f, 0.617868f, 0.623088f, 0.628356f, 0.633282f, 0.637656f, 0.641523f, 0.644919f, 0.647931f, 0.650762f, 0.653419f, 0.655595f, 0.657072f, 0.657932f, 0.658320f, 0.658353f, 0.658263f, 0.658277f, 0.658369f, 0.658425f, 0.658492f, 0.658661f, 0.658936f, 0.659454f, 0.660549f, 0.662412f, 0.664935f, 0.667968f, 0.671455f, 0.675277f, 0.679269f, 0.683383f, 0.687622f, 0.691852f, 0.695884f, 0.699596f, 0.702892f, 0.705658f, 0.707869f, 0.709572f, 0.710785f, 0.711543f, 0.711953f, 0.712094f, 0.711995f, 0.711765f, 0.711575f, 0.711499f, 0.711595f, 0.712021f, 0.712800f, 0.713666f, 0.714410f, 0.715098f, 0.715743f, 0.716167f, 0.716376f, 0.716567f, 0.716703f, 0.716617f, 0.716501f, 0.716656f, 0.716977f, 0.717361f, 0.718171f, 0.719629f, 0.721375f, 0.723265f, 0.725713f, 0.728693f, 0.731584f, 0.734403f, 0.737690f, 0.741092f, 0.743862f, 0.746530f, + 0.749856f, 0.752896f, 0.754767f, 0.756924f, 0.760408f, 0.763073f, 0.763626f, 0.765163f, 0.769439f, 0.771950f, 0.769853f, 0.769580f, 0.776657f, 0.782626f, 0.774831f, 0.756861f, 0.745683f, 0.748813f, 0.757334f, 0.761317f, 0.758260f, 0.746087f, 0.724051f, 0.704063f, 0.704633f, 0.725907f, 0.744126f, 0.739878f, 0.720948f, 0.707668f, 0.705590f, 0.705432f, 0.704944f, 0.716791f, 0.751654f, 0.801379f, 0.844163f, 0.864649f, 0.865574f, 0.859719f, 0.854548f, 0.849005f, 0.842929f, 0.840816f, 0.842745f, 0.839787f, 0.826402f, 0.812303f} + }, + { + {0.073227f, 0.301823f, 0.659487f, 0.955673f, 1.013690f, 0.793634f, 0.374105f, -0.142456f, -0.636566f, -0.963913f, -1.063402f, -1.003613f, -0.793969f, -0.284345f, 0.500040f, 1.037338f, 0.731315f, -0.256929f, -0.976234f, -0.710231f, 0.228481f, 0.963086f, 1.064126f, 0.788617f, 0.498005f, 0.250379f, -0.019938f, -0.265502f, -0.411395f, -0.490847f, -0.571594f, -0.649046f, -0.690175f, -0.706288f, -0.723736f, -0.737713f, -0.735526f, -0.724667f, -0.712804f, -0.692713f, -0.661167f, -0.626102f, -0.589545f, -0.546090f, -0.498002f, -0.452447f, -0.407806f, -0.359001f, -0.309737f, -0.266056f, -0.225762f, -0.184774f, -0.145070f, -0.108495f, -0.071916f, -0.033988f, 0.002132f, 0.035682f, 0.069246f, 0.102139f, 0.131153f, 0.156988f, 0.182356f, 0.205965f, 0.225206f, 0.241562f, 0.257404f, 0.271324f, 0.281570f, 0.289838f, 0.297808f, 0.304325f, 0.308777f, 0.312991f, 0.318081f, 0.323338f, 0.328814f, 0.335493f, 0.343315f, 0.351924f, 0.361990f, 0.373445f, 0.384675f, 0.395327f, 0.406987f, 0.419758f, 0.431579f, 0.441848f, 0.452193f, 0.463217f, 0.473985f, 0.484732f, 0.496782f, 0.510255f, 0.524670f, 0.540714f, + 0.558946f, 0.578263f, 0.597653f, 0.617532f, 0.637778f, 0.656691f, 0.673126f, 0.687434f, 0.699645f, 0.708958f, 0.715168f, 0.718470f, 0.718323f, 0.714568f, 0.708854f, 0.703133f, 0.697784f, 0.692574f, 0.687835f, 0.683584f, 0.679336f, 0.675668f, 0.674108f, 0.674971f, 0.677066f, 0.679457f, 0.681721f, 0.683072f, 0.683153f, 0.682996f, 0.683558f, 0.684336f, 0.684660f, 0.684936f, 0.685504f, 0.685877f, 0.685935f, 0.686278f, 0.686908f, 0.687209f, 0.687279f, 0.687704f, 0.688320f, 0.688672f, 0.689087f, 0.689985f, 0.691034f, 0.692103f, 0.693870f, 0.696717f, 0.700287f, 0.704592f, 0.710078f, 0.716487f, 0.723147f, 0.730171f, 0.737961f, 0.746101f, 0.754088f, 0.762266f, 0.770876f, 0.779330f, 0.787325f, 0.795322f, 0.803321f, 0.810685f, 0.817438f, 0.824131f, 0.830559f, 0.836142f, 0.841071f, 0.845643f, 0.849388f, 0.852128f, 0.854615f, 0.857157f, 0.859203f, 0.860848f, 0.862840f, 0.864890f, 0.866029f, 0.866351f, 0.866455f, 0.866032f, 0.864930f, 0.864120f, 0.863977f, 0.863628f, 0.863131f, 0.863615f, 0.864728f, 0.865122f, 0.865257f, 0.866254f, 0.867273f, 0.867579f, + 0.868533f, 0.870222f, 0.870634f, 0.870784f, 0.873682f, 0.876733f, 0.875499f, 0.874870f, 0.881460f, 0.887147f, 0.882040f, 0.879821f, 0.897958f, 0.915002f, 0.891682f, 0.839628f, 0.817204f, 0.843673f, 0.874820f, 0.884019f, 0.901906f, 0.940936f, 0.947666f, 0.883159f, 0.797756f, 0.768151f, 0.798253f, 0.832623f, 0.835284f, 0.812421f, 0.787095f, 0.782104f, 0.791333f, 0.748682f, 0.584396f, 0.345257f, 0.192332f, 0.226244f, 0.368019f, 0.468300f, 0.484212f, 0.482396f, 0.505439f, 0.513973f, 0.457796f, 0.345461f, 0.230189f, 0.161014f}, + {-0.073227f, -0.301823f, -0.659487f, -0.955673f, -1.013690f, -0.793634f, -0.374105f, 0.142456f, 0.636566f, 0.963913f, 1.063402f, 1.003613f, 0.793969f, 0.284345f, -0.500040f, -1.037338f, -0.731315f, 0.256929f, 0.976234f, 0.710231f, -0.228481f, -0.963086f, -1.064126f, -0.788617f, -0.498005f, -0.250379f, 0.019938f, 0.265502f, 0.411395f, 0.490847f, 0.571594f, 0.649046f, 0.690175f, 0.706288f, 0.723736f, 0.737713f, 0.735526f, 0.724667f, 0.712804f, 0.692713f, 0.661167f, 0.626102f, 0.589545f, 0.546090f, 0.498002f, 0.452447f, 0.407806f, 0.359001f, 0.309737f, 0.266056f, 0.225762f, 0.184774f, 0.145070f, 0.108495f, 0.071916f, 0.033988f, -0.002132f, -0.035682f, -0.069246f, -0.102139f, -0.131153f, -0.156988f, -0.182356f, -0.205965f, -0.225206f, -0.241562f, -0.257404f, -0.271324f, -0.281570f, -0.289838f, -0.297808f, -0.304325f, -0.308777f, -0.312991f, -0.318081f, -0.323338f, -0.328814f, -0.335493f, -0.343315f, -0.351924f, -0.361990f, -0.373445f, -0.384675f, -0.395327f, -0.406987f, -0.419758f, -0.431579f, -0.441848f, -0.452193f, -0.463217f, -0.473985f, -0.484732f, -0.496782f, -0.510255f, -0.524670f, -0.540714f, + -0.558946f, -0.578263f, -0.597653f, -0.617532f, -0.637778f, -0.656691f, -0.673126f, -0.687434f, -0.699645f, -0.708958f, -0.715168f, -0.718470f, -0.718323f, -0.714568f, -0.708854f, -0.703133f, -0.697784f, -0.692574f, -0.687835f, -0.683584f, -0.679336f, -0.675668f, -0.674108f, -0.674971f, -0.677066f, -0.679457f, -0.681721f, -0.683072f, -0.683153f, -0.682996f, -0.683558f, -0.684336f, -0.684660f, -0.684936f, -0.685504f, -0.685877f, -0.685935f, -0.686278f, -0.686908f, -0.687209f, -0.687279f, -0.687704f, -0.688320f, -0.688672f, -0.689087f, -0.689985f, -0.691034f, -0.692103f, -0.693870f, -0.696717f, -0.700287f, -0.704592f, -0.710078f, -0.716487f, -0.723147f, -0.730171f, -0.737961f, -0.746101f, -0.754088f, -0.762266f, -0.770876f, -0.779330f, -0.787325f, -0.795322f, -0.803321f, -0.810685f, -0.817438f, -0.824131f, -0.830559f, -0.836142f, -0.841071f, -0.845643f, -0.849388f, -0.852128f, -0.854615f, -0.857157f, -0.859203f, -0.860848f, -0.862840f, -0.864890f, -0.866029f, -0.866351f, -0.866455f, -0.866032f, -0.864930f, -0.864120f, -0.863977f, -0.863628f, -0.863131f, -0.863615f, -0.864728f, -0.865122f, -0.865257f, -0.866254f, -0.867273f, -0.867579f, + -0.868533f, -0.870222f, -0.870634f, -0.870784f, -0.873682f, -0.876733f, -0.875499f, -0.874870f, -0.881460f, -0.887147f, -0.882040f, -0.879821f, -0.897958f, -0.915002f, -0.891682f, -0.839628f, -0.817204f, -0.843673f, -0.874820f, -0.884019f, -0.901906f, -0.940936f, -0.947666f, -0.883159f, -0.797756f, -0.768151f, -0.798253f, -0.832623f, -0.835284f, -0.812421f, -0.787095f, -0.782104f, -0.791333f, -0.748682f, -0.584396f, -0.345257f, -0.192332f, -0.226244f, -0.368019f, -0.468300f, -0.484212f, -0.482396f, -0.505439f, -0.513973f, -0.457796f, -0.345461f, -0.230189f, -0.161014f} + }, + { + {0.113201f, 0.111255f, 0.062496f, -0.036435f, -0.115479f, -0.108810f, -0.030648f, 0.049302f, 0.081380f, 0.064091f, 0.017171f, -0.040018f, -0.081158f, -0.072117f, -0.003900f, 0.074532f, 0.085464f, 0.008934f, -0.074247f, -0.059957f, 0.058118f, 0.176907f, 0.199559f, 0.129266f, 0.036145f, -0.031274f, -0.072728f, -0.101353f, -0.120897f, -0.133619f, -0.144152f, -0.151623f, -0.151014f, -0.142713f, -0.132576f, -0.124993f, -0.122480f, -0.128384f, -0.143590f, -0.163192f, -0.181024f, -0.195180f, -0.206462f, -0.214744f, -0.219693f, -0.222384f, -0.223825f, -0.223517f, -0.220501f, -0.214073f, -0.202961f, -0.185599f, -0.161639f, -0.131885f, -0.096760f, -0.056217f, -0.010994f, 0.037427f, 0.088132f, 0.140996f, 0.195587f, 0.250830f, 0.305827f, 0.360100f, 0.412716f, 0.461882f, 0.505735f, 0.543017f, 0.572658f, 0.593353f, 0.604059f, 0.604476f, 0.594671f, 0.574892f, 0.546245f, 0.510837f, 0.470526f, 0.426227f, 0.379201f, 0.332145f, 0.287708f, 0.246390f, 0.207286f, 0.170835f, 0.139340f, 0.114215f, 0.093949f, 0.075976f, 0.060036f, 0.048360f, 0.042554f, 0.041557f, 0.043175f, 0.046486f, 0.051934f, 0.059907f, + 0.070097f, 0.081683f, 0.093339f, 0.103485f, 0.111132f, 0.116280f, 0.119264f, 0.120059f, 0.118158f, 0.112647f, 0.102730f, 0.088852f, 0.072929f, 0.056776f, 0.040720f, 0.024308f, 0.007601f, -0.008889f, -0.024661f, -0.038942f, -0.050666f, -0.059218f, -0.064521f, -0.066366f, -0.064544f, -0.059537f, -0.052086f, -0.042363f, -0.030480f, -0.017295f, -0.003822f, 0.009499f, 0.022278f, 0.033878f, 0.044118f, 0.053185f, 0.060622f, 0.065726f, 0.068967f, 0.071661f, 0.074575f, 0.078214f, 0.083614f, 0.091159f, 0.099538f, 0.107386f, 0.114815f, 0.122154f, 0.128784f, 0.134356f, 0.139373f, 0.143742f, 0.146631f, 0.148142f, 0.149165f, 0.149684f, 0.149308f, 0.148792f, 0.148973f, 0.149269f, 0.149092f, 0.149111f, 0.149527f, 0.149268f, 0.148148f, 0.147256f, 0.146477f, 0.144536f, 0.141617f, 0.138828f, 0.135709f, 0.131550f, 0.127734f, 0.125499f, 0.123615f, 0.121214f, 0.119758f, 0.119680f, 0.119076f, 0.117474f, 0.116107f, 0.113750f, 0.107932f, 0.099801f, 0.091667f, 0.081824f, 0.068369f, 0.054219f, 0.041640f, 0.027646f, 0.011112f, -0.003667f, -0.015819f, -0.029675f, -0.044315f, -0.054790f, + -0.064326f, -0.078448f, -0.090599f, -0.094677f, -0.102373f, -0.121236f, -0.132668f, -0.126597f, -0.131229f, -0.161295f, -0.174763f, -0.147871f, -0.146506f, -0.225759f, -0.299779f, -0.239299f, -0.079199f, 0.013784f, -0.018892f, -0.072010f, -0.080447f, -0.112933f, -0.204539f, -0.250865f, -0.164556f, -0.022383f, 0.043514f, 0.019856f, -0.010446f, -0.004334f, 0.005958f, -0.023233f, -0.099252f, -0.180595f, -0.191231f, -0.093061f, 0.041294f, 0.085841f, 0.010948f, -0.083414f, -0.105347f, -0.076840f, -0.067493f, -0.084603f, -0.084004f, -0.051805f, -0.017571f, -0.002347f}, + {0.113201f, 0.111255f, 0.062496f, -0.036435f, -0.115479f, -0.108810f, -0.030648f, 0.049302f, 0.081380f, 0.064091f, 0.017171f, -0.040018f, -0.081158f, -0.072117f, -0.003900f, 0.074532f, 0.085464f, 0.008934f, -0.074247f, -0.059957f, 0.058118f, 0.176907f, 0.199559f, 0.129266f, 0.036145f, -0.031274f, -0.072728f, -0.101353f, -0.120897f, -0.133619f, -0.144152f, -0.151623f, -0.151014f, -0.142713f, -0.132576f, -0.124993f, -0.122480f, -0.128384f, -0.143590f, -0.163192f, -0.181024f, -0.195180f, -0.206462f, -0.214744f, -0.219693f, -0.222384f, -0.223825f, -0.223517f, -0.220501f, -0.214073f, -0.202961f, -0.185599f, -0.161639f, -0.131885f, -0.096760f, -0.056217f, -0.010994f, 0.037427f, 0.088132f, 0.140996f, 0.195587f, 0.250830f, 0.305827f, 0.360100f, 0.412716f, 0.461882f, 0.505735f, 0.543017f, 0.572658f, 0.593353f, 0.604059f, 0.604476f, 0.594671f, 0.574892f, 0.546245f, 0.510837f, 0.470526f, 0.426227f, 0.379201f, 0.332145f, 0.287708f, 0.246390f, 0.207286f, 0.170835f, 0.139340f, 0.114215f, 0.093949f, 0.075976f, 0.060036f, 0.048360f, 0.042554f, 0.041557f, 0.043175f, 0.046486f, 0.051934f, 0.059907f, + 0.070097f, 0.081683f, 0.093339f, 0.103485f, 0.111132f, 0.116280f, 0.119264f, 0.120059f, 0.118158f, 0.112647f, 0.102730f, 0.088852f, 0.072929f, 0.056776f, 0.040720f, 0.024308f, 0.007601f, -0.008889f, -0.024661f, -0.038942f, -0.050666f, -0.059218f, -0.064521f, -0.066366f, -0.064544f, -0.059537f, -0.052086f, -0.042363f, -0.030480f, -0.017295f, -0.003822f, 0.009499f, 0.022278f, 0.033878f, 0.044118f, 0.053185f, 0.060622f, 0.065726f, 0.068967f, 0.071661f, 0.074575f, 0.078214f, 0.083614f, 0.091159f, 0.099538f, 0.107386f, 0.114815f, 0.122154f, 0.128784f, 0.134356f, 0.139373f, 0.143742f, 0.146631f, 0.148142f, 0.149165f, 0.149684f, 0.149308f, 0.148792f, 0.148973f, 0.149269f, 0.149092f, 0.149111f, 0.149527f, 0.149268f, 0.148148f, 0.147256f, 0.146477f, 0.144536f, 0.141617f, 0.138828f, 0.135709f, 0.131550f, 0.127734f, 0.125499f, 0.123615f, 0.121214f, 0.119758f, 0.119680f, 0.119076f, 0.117474f, 0.116107f, 0.113750f, 0.107932f, 0.099801f, 0.091667f, 0.081824f, 0.068369f, 0.054219f, 0.041640f, 0.027646f, 0.011112f, -0.003667f, -0.015819f, -0.029675f, -0.044315f, -0.054790f, + -0.064326f, -0.078448f, -0.090599f, -0.094677f, -0.102373f, -0.121236f, -0.132668f, -0.126597f, -0.131229f, -0.161295f, -0.174763f, -0.147871f, -0.146506f, -0.225759f, -0.299779f, -0.239299f, -0.079199f, 0.013784f, -0.018892f, -0.072010f, -0.080447f, -0.112933f, -0.204539f, -0.250865f, -0.164556f, -0.022383f, 0.043514f, 0.019856f, -0.010446f, -0.004334f, 0.005958f, -0.023233f, -0.099252f, -0.180595f, -0.191231f, -0.093061f, 0.041294f, 0.085841f, 0.010948f, -0.083414f, -0.105347f, -0.076840f, -0.067493f, -0.084603f, -0.084004f, -0.051805f, -0.017571f, -0.002347f} + }, + { + {0.054055f, 0.080144f, 0.095193f, 0.063102f, -0.005644f, -0.052793f, -0.033146f, 0.026919f, 0.054914f, 0.016920f, -0.052950f, -0.110724f, -0.143661f, -0.134100f, -0.045681f, 0.095928f, 0.160690f, 0.047402f, -0.151768f, -0.216602f, -0.050846f, 0.209112f, 0.366520f, 0.368777f, 0.294144f, 0.206763f, 0.103814f, -0.023703f, -0.154443f, -0.267781f, -0.365935f, -0.454372f, -0.526514f, -0.574683f, -0.599022f, -0.601726f, -0.583803f, -0.549027f, -0.503573f, -0.451857f, -0.396930f, -0.342314f, -0.289887f, -0.238831f, -0.188998f, -0.142181f, -0.098840f, -0.057157f, -0.016442f, 0.021589f, 0.055280f, 0.083963f, 0.106624f, 0.122561f, 0.133456f, 0.142639f, 0.152376f, 0.163270f, 0.175500f, 0.188983f, 0.202812f, 0.215870f, 0.227814f, 0.238821f, 0.248889f, 0.258049f, 0.266875f, 0.276085f, 0.285672f, 0.294836f, 0.302892f, 0.309831f, 0.315582f, 0.319103f, 0.319043f, 0.315165f, 0.308042f, 0.297413f, 0.282312f, 0.263067f, 0.241504f, 0.218613f, 0.193711f, 0.166772f, 0.139868f, 0.115038f, 0.092093f, 0.069831f, 0.048202f, 0.027768f, 0.007904f, -0.012801f, -0.034642f, -0.056589f, -0.077960f, -0.099200f, + -0.120729f, -0.141741f, -0.160599f, -0.176129f, -0.188274f, -0.197469f, -0.203521f, -0.205315f, -0.201874f, -0.193589f, -0.181986f, -0.168217f, -0.152170f, -0.133210f, -0.111470f, -0.088281f, -0.065547f, -0.044626f, -0.025388f, -0.006381f, 0.013678f, 0.034496f, 0.054455f, 0.072021f, 0.086678f, 0.098972f, 0.110224f, 0.121865f, 0.134429f, 0.147294f, 0.159646f, 0.171334f, 0.182686f, 0.194160f, 0.206441f, 0.220224f, 0.235532f, 0.251719f, 0.268159f, 0.284460f, 0.300193f, 0.315099f, 0.329380f, 0.343193f, 0.356104f, 0.367475f, 0.376942f, 0.384199f, 0.388905f, 0.391168f, 0.391540f, 0.390411f, 0.388001f, 0.384777f, 0.381131f, 0.376983f, 0.372381f, 0.367930f, 0.364049f, 0.360653f, 0.358088f, 0.357239f, 0.358255f, 0.360393f, 0.363365f, 0.367396f, 0.371992f, 0.376223f, 0.380072f, 0.384061f, 0.388180f, 0.392520f, 0.397869f, 0.404370f, 0.411044f, 0.417566f, 0.424627f, 0.431988f, 0.438611f, 0.444798f, 0.451419f, 0.457489f, 0.461517f, 0.464027f, 0.465670f, 0.465002f, 0.461321f, 0.456568f, 0.451550f, 0.444528f, 0.435774f, 0.428002f, 0.420951f, 0.412298f, 0.403657f, 0.397481f, + 0.390665f, 0.381040f, 0.374155f, 0.371854f, 0.364940f, 0.351783f, 0.346842f, 0.351883f, 0.344736f, 0.322593f, 0.319327f, 0.340524f, 0.329255f, 0.258906f, 0.211144f, 0.273202f, 0.394219f, 0.448480f, 0.417577f, 0.391001f, 0.396218f, 0.365475f, 0.291216f, 0.274724f, 0.365856f, 0.472436f, 0.497448f, 0.469302f, 0.464924f, 0.487653f, 0.496252f, 0.484901f, 0.459066f, 0.391143f, 0.277817f, 0.195678f, 0.219900f, 0.314264f, 0.374360f, 0.364906f, 0.345945f, 0.365513f, 0.393896f, 0.386513f, 0.362639f, 0.381476f, 0.456585f, 0.528305f}, + {0.054055f, 0.080144f, 0.095193f, 0.063102f, -0.005644f, -0.052793f, -0.033146f, 0.026919f, 0.054914f, 0.016920f, -0.052950f, -0.110724f, -0.143661f, -0.134100f, -0.045681f, 0.095928f, 0.160690f, 0.047402f, -0.151768f, -0.216602f, -0.050846f, 0.209112f, 0.366520f, 0.368777f, 0.294144f, 0.206763f, 0.103814f, -0.023703f, -0.154443f, -0.267781f, -0.365935f, -0.454372f, -0.526514f, -0.574683f, -0.599022f, -0.601726f, -0.583803f, -0.549027f, -0.503573f, -0.451857f, -0.396930f, -0.342314f, -0.289887f, -0.238831f, -0.188998f, -0.142181f, -0.098840f, -0.057157f, -0.016442f, 0.021589f, 0.055280f, 0.083963f, 0.106624f, 0.122561f, 0.133456f, 0.142639f, 0.152376f, 0.163270f, 0.175500f, 0.188983f, 0.202812f, 0.215870f, 0.227814f, 0.238821f, 0.248889f, 0.258049f, 0.266875f, 0.276085f, 0.285672f, 0.294836f, 0.302892f, 0.309831f, 0.315582f, 0.319103f, 0.319043f, 0.315165f, 0.308042f, 0.297413f, 0.282312f, 0.263067f, 0.241504f, 0.218613f, 0.193711f, 0.166772f, 0.139868f, 0.115038f, 0.092093f, 0.069831f, 0.048202f, 0.027768f, 0.007904f, -0.012801f, -0.034642f, -0.056589f, -0.077960f, -0.099200f, + -0.120729f, -0.141741f, -0.160599f, -0.176129f, -0.188274f, -0.197469f, -0.203521f, -0.205315f, -0.201874f, -0.193589f, -0.181986f, -0.168217f, -0.152170f, -0.133210f, -0.111470f, -0.088281f, -0.065547f, -0.044626f, -0.025388f, -0.006381f, 0.013678f, 0.034496f, 0.054455f, 0.072021f, 0.086678f, 0.098972f, 0.110224f, 0.121865f, 0.134429f, 0.147294f, 0.159646f, 0.171334f, 0.182686f, 0.194160f, 0.206441f, 0.220224f, 0.235532f, 0.251719f, 0.268159f, 0.284460f, 0.300193f, 0.315099f, 0.329380f, 0.343193f, 0.356104f, 0.367475f, 0.376942f, 0.384199f, 0.388905f, 0.391168f, 0.391540f, 0.390411f, 0.388001f, 0.384777f, 0.381131f, 0.376983f, 0.372381f, 0.367930f, 0.364049f, 0.360653f, 0.358088f, 0.357239f, 0.358255f, 0.360393f, 0.363365f, 0.367396f, 0.371992f, 0.376223f, 0.380072f, 0.384061f, 0.388180f, 0.392520f, 0.397869f, 0.404370f, 0.411044f, 0.417566f, 0.424627f, 0.431988f, 0.438611f, 0.444798f, 0.451419f, 0.457489f, 0.461517f, 0.464027f, 0.465670f, 0.465002f, 0.461321f, 0.456568f, 0.451550f, 0.444528f, 0.435774f, 0.428002f, 0.420951f, 0.412298f, 0.403657f, 0.397481f, + 0.390665f, 0.381040f, 0.374155f, 0.371854f, 0.364940f, 0.351783f, 0.346842f, 0.351883f, 0.344736f, 0.322593f, 0.319327f, 0.340524f, 0.329255f, 0.258906f, 0.211144f, 0.273202f, 0.394219f, 0.448480f, 0.417577f, 0.391001f, 0.396218f, 0.365475f, 0.291216f, 0.274724f, 0.365856f, 0.472436f, 0.497448f, 0.469302f, 0.464924f, 0.487653f, 0.496252f, 0.484901f, 0.459066f, 0.391143f, 0.277817f, 0.195678f, 0.219900f, 0.314264f, 0.374360f, 0.364906f, 0.345945f, 0.365513f, 0.393896f, 0.386513f, 0.362639f, 0.381476f, 0.456585f, 0.528305f} + }, + { + {0.017978f, 0.007378f, 0.003418f, 0.018456f, 0.041119f, 0.049699f, 0.045284f, 0.053666f, 0.084664f, 0.105401f, 0.067063f, -0.046619f, -0.190974f, -0.265169f, -0.173793f, 0.058765f, 0.244978f, 0.189686f, -0.078447f, -0.301201f, -0.263931f, -0.016751f, 0.224527f, 0.329934f, 0.329708f, 0.288913f, 0.216901f, 0.107803f, -0.012593f, -0.114794f, -0.198221f, -0.272534f, -0.334167f, -0.377176f, -0.406071f, -0.424824f, -0.427385f, -0.407924f, -0.370647f, -0.324637f, -0.276593f, -0.230996f, -0.190824f, -0.155968f, -0.124589f, -0.095978f, -0.069693f, -0.043868f, -0.017228f, 0.008963f, 0.032944f, 0.054527f, 0.073798f, 0.090002f, 0.103058f, 0.114400f, 0.125425f, 0.136553f, 0.148113f, 0.160641f, 0.174135f, 0.188230f, 0.203013f, 0.218608f, 0.234347f, 0.249425f, 0.264041f, 0.278849f, 0.293615f, 0.307424f, 0.320009f, 0.331840f, 0.342789f, 0.351655f, 0.357399f, 0.360118f, 0.360077f, 0.356398f, 0.347903f, 0.335144f, 0.320169f, 0.303908f, 0.285237f, 0.263508f, 0.240490f, 0.218250f, 0.196115f, 0.171654f, 0.144348f, 0.116453f, 0.090117f, 0.065280f, 0.040995f, 0.017579f, -0.003437f, -0.020932f, + -0.035118f, -0.047019f, -0.057328f, -0.065776f, -0.071630f, -0.074772f, -0.075997f, -0.076290f, -0.076370f, -0.076995f, -0.078917f, -0.082069f, -0.085393f, -0.087934f, -0.089781f, -0.091750f, -0.094623f, -0.098708f, -0.103476f, -0.107500f, -0.109441f, -0.109318f, -0.108409f, -0.108026f, -0.108758f, -0.110515f, -0.112612f, -0.114027f, -0.114146f, -0.113106f, -0.111149f, -0.108063f, -0.103456f, -0.097000f, -0.088276f, -0.077056f, -0.063885f, -0.049838f, -0.035764f, -0.022273f, -0.010091f, 0.000305f, 0.008995f, 0.015941f, 0.020499f, 0.022137f, 0.021019f, 0.017496f, 0.011856f, 0.004888f, -0.002191f, -0.008658f, -0.014359f, -0.019010f, -0.022276f, -0.024240f, -0.024935f, -0.023872f, -0.020695f, -0.015538f, -0.008189f, 0.002002f, 0.014912f, 0.029556f, 0.045382f, 0.062300f, 0.079546f, 0.096100f, 0.111896f, 0.127148f, 0.141252f, 0.153795f, 0.165494f, 0.176815f, 0.187180f, 0.196581f, 0.206032f, 0.215728f, 0.224988f, 0.234090f, 0.243604f, 0.252464f, 0.259543f, 0.265839f, 0.272231f, 0.277374f, 0.280682f, 0.284095f, 0.288228f, 0.291051f, 0.292390f, 0.294354f, 0.296334f, 0.296199f, 0.295740f, 0.297143f, + 0.297187f, 0.294165f, 0.293865f, 0.297697f, 0.296410f, 0.289007f, 0.289718f, 0.298972f, 0.294490f, 0.274911f, 0.273741f, 0.293559f, 0.276485f, 0.199476f, 0.147802f, 0.208854f, 0.331440f, 0.389914f, 0.361504f, 0.329091f, 0.323542f, 0.290902f, 0.227246f, 0.217065f, 0.296479f, 0.385838f, 0.408311f, 0.387215f, 0.378506f, 0.385103f, 0.382955f, 0.362880f, 0.310127f, 0.213082f, 0.126049f, 0.145716f, 0.279676f, 0.409157f, 0.433671f, 0.389293f, 0.369545f, 0.390925f, 0.404683f, 0.394197f, 0.383439f, 0.373704f, 0.344838f, 0.310855f}, + {-0.017978f, -0.007378f, -0.003418f, -0.018456f, -0.041119f, -0.049699f, -0.045284f, -0.053666f, -0.084664f, -0.105401f, -0.067063f, 0.046619f, 0.190974f, 0.265169f, 0.173793f, -0.058765f, -0.244978f, -0.189686f, 0.078447f, 0.301201f, 0.263931f, 0.016751f, -0.224527f, -0.329934f, -0.329708f, -0.288913f, -0.216901f, -0.107803f, 0.012593f, 0.114794f, 0.198221f, 0.272534f, 0.334167f, 0.377176f, 0.406071f, 0.424824f, 0.427385f, 0.407924f, 0.370647f, 0.324637f, 0.276593f, 0.230996f, 0.190824f, 0.155968f, 0.124589f, 0.095978f, 0.069693f, 0.043868f, 0.017228f, -0.008963f, -0.032944f, -0.054527f, -0.073798f, -0.090002f, -0.103058f, -0.114400f, -0.125425f, -0.136553f, -0.148113f, -0.160641f, -0.174135f, -0.188230f, -0.203013f, -0.218608f, -0.234347f, -0.249425f, -0.264041f, -0.278849f, -0.293615f, -0.307424f, -0.320009f, -0.331840f, -0.342789f, -0.351655f, -0.357399f, -0.360118f, -0.360077f, -0.356398f, -0.347903f, -0.335144f, -0.320169f, -0.303908f, -0.285237f, -0.263508f, -0.240490f, -0.218250f, -0.196115f, -0.171654f, -0.144348f, -0.116453f, -0.090117f, -0.065280f, -0.040995f, -0.017579f, 0.003437f, 0.020932f, + 0.035118f, 0.047019f, 0.057328f, 0.065776f, 0.071630f, 0.074772f, 0.075997f, 0.076290f, 0.076370f, 0.076995f, 0.078917f, 0.082069f, 0.085393f, 0.087934f, 0.089781f, 0.091750f, 0.094623f, 0.098708f, 0.103476f, 0.107500f, 0.109441f, 0.109318f, 0.108409f, 0.108026f, 0.108758f, 0.110515f, 0.112612f, 0.114027f, 0.114146f, 0.113106f, 0.111149f, 0.108063f, 0.103456f, 0.097000f, 0.088276f, 0.077056f, 0.063885f, 0.049838f, 0.035764f, 0.022273f, 0.010091f, -0.000305f, -0.008995f, -0.015941f, -0.020499f, -0.022137f, -0.021019f, -0.017496f, -0.011856f, -0.004888f, 0.002191f, 0.008658f, 0.014359f, 0.019010f, 0.022276f, 0.024240f, 0.024935f, 0.023872f, 0.020695f, 0.015538f, 0.008189f, -0.002002f, -0.014912f, -0.029556f, -0.045382f, -0.062300f, -0.079546f, -0.096100f, -0.111896f, -0.127148f, -0.141252f, -0.153795f, -0.165494f, -0.176815f, -0.187180f, -0.196581f, -0.206032f, -0.215728f, -0.224988f, -0.234090f, -0.243604f, -0.252464f, -0.259543f, -0.265839f, -0.272231f, -0.277374f, -0.280682f, -0.284095f, -0.288228f, -0.291051f, -0.292390f, -0.294354f, -0.296334f, -0.296199f, -0.295740f, -0.297143f, + -0.297187f, -0.294165f, -0.293865f, -0.297697f, -0.296410f, -0.289007f, -0.289718f, -0.298972f, -0.294490f, -0.274911f, -0.273741f, -0.293559f, -0.276485f, -0.199476f, -0.147802f, -0.208854f, -0.331440f, -0.389914f, -0.361504f, -0.329091f, -0.323542f, -0.290902f, -0.227246f, -0.217065f, -0.296479f, -0.385838f, -0.408311f, -0.387215f, -0.378506f, -0.385103f, -0.382955f, -0.362880f, -0.310127f, -0.213082f, -0.126049f, -0.145716f, -0.279676f, -0.409157f, -0.433671f, -0.389293f, -0.369545f, -0.390925f, -0.404683f, -0.394197f, -0.383439f, -0.373704f, -0.344838f, -0.310855f} + }, + { + {0.027544f, -0.017341f, -0.023513f, 0.026515f, 0.039947f, -0.034516f, -0.096596f, -0.020772f, 0.151935f, 0.242778f, 0.149801f, -0.044033f, -0.181114f, -0.177468f, -0.055862f, 0.090745f, 0.145910f, 0.053909f, -0.102523f, -0.163455f, -0.067881f, 0.078061f, 0.138424f, 0.098143f, 0.036791f, 0.006996f, 0.000119f, 0.002369f, 0.021565f, 0.059784f, 0.101198f, 0.132385f, 0.151843f, 0.159909f, 0.156211f, 0.145023f, 0.130647f, 0.110287f, 0.079835f, 0.042474f, 0.005390f, -0.027255f, -0.053608f, -0.071675f, -0.081807f, -0.087931f, -0.093657f, -0.099808f, -0.106220f, -0.112687f, -0.117932f, -0.120493f, -0.120521f, -0.118539f, -0.113168f, -0.102044f, -0.084258f, -0.060368f, -0.030901f, 0.003748f, 0.042511f, 0.083811f, 0.126393f, 0.169523f, 0.212498f, 0.254135f, 0.292796f, 0.326898f, 0.355155f, 0.376131f, 0.388053f, 0.389497f, 0.379942f, 0.359534f, 0.328997f, 0.289934f, 0.244331f, 0.193634f, 0.139228f, 0.083598f, 0.029408f, -0.022692f, -0.073695f, -0.123339f, -0.169305f, -0.209948f, -0.246184f, -0.279689f, -0.310546f, -0.337815f, -0.361405f, -0.381914f, -0.399020f, -0.411385f, -0.418144f, -0.419390f, + -0.415008f, -0.404128f, -0.386279f, -0.362312f, -0.333530f, -0.300394f, -0.262664f, -0.220761f, -0.176830f, -0.134417f, -0.096541f, -0.063537f, -0.033190f, -0.003613f, 0.024357f, 0.048059f, 0.065620f, 0.077181f, 0.084404f, 0.089492f, 0.093981f, 0.097804f, 0.099996f, 0.100408f, 0.100059f, 0.100044f, 0.101037f, 0.103570f, 0.107641f, 0.112334f, 0.116752f, 0.120810f, 0.124401f, 0.126672f, 0.126908f, 0.125168f, 0.121503f, 0.115724f, 0.108269f, 0.100065f, 0.091446f, 0.082435f, 0.073719f, 0.065954f, 0.058708f, 0.051452f, 0.044644f, 0.038636f, 0.032761f, 0.026588f, 0.020600f, 0.014885f, 0.008899f, 0.002909f, -0.002242f, -0.006808f, -0.011545f, -0.016005f, -0.019451f, -0.022427f, -0.025359f, -0.027161f, -0.027123f, -0.026184f, -0.024787f, -0.022001f, -0.017911f, -0.013971f, -0.010312f, -0.005846f, -0.000945f, 0.003364f, 0.007981f, 0.014043f, 0.020341f, 0.025721f, 0.031421f, 0.038054f, 0.043780f, 0.047857f, 0.051586f, 0.054231f, 0.053369f, 0.049784f, 0.045976f, 0.040764f, 0.032016f, 0.022151f, 0.013836f, 0.004597f, -0.007321f, -0.018275f, -0.026778f, -0.036758f, -0.048211f, -0.056341f, + -0.062971f, -0.073642f, -0.083668f, -0.086428f, -0.090734f, -0.105031f, -0.114994f, -0.109424f, -0.110454f, -0.134392f, -0.148541f, -0.127696f, -0.121882f, -0.181720f, -0.241824f, -0.189799f, -0.046739f, 0.042939f, 0.016342f, -0.039119f, -0.052732f, -0.073996f, -0.147151f, -0.199696f, -0.145744f, -0.023298f, 0.056543f, 0.050437f, 0.006574f, -0.021832f, -0.037988f, -0.088616f, -0.203471f, -0.330990f, -0.353783f, -0.218264f, -0.032140f, 0.036633f, -0.044084f, -0.147160f, -0.163258f, -0.121115f, -0.105238f, -0.129326f, -0.144788f, -0.128572f, -0.103746f, -0.091528f}, + {-0.027544f, 0.017341f, 0.023513f, -0.026515f, -0.039947f, 0.034516f, 0.096596f, 0.020772f, -0.151935f, -0.242778f, -0.149801f, 0.044033f, 0.181114f, 0.177468f, 0.055862f, -0.090745f, -0.145910f, -0.053909f, 0.102523f, 0.163455f, 0.067881f, -0.078061f, -0.138424f, -0.098143f, -0.036791f, -0.006996f, -0.000119f, -0.002369f, -0.021565f, -0.059784f, -0.101198f, -0.132385f, -0.151843f, -0.159909f, -0.156211f, -0.145023f, -0.130647f, -0.110287f, -0.079835f, -0.042474f, -0.005390f, 0.027255f, 0.053608f, 0.071675f, 0.081807f, 0.087931f, 0.093657f, 0.099808f, 0.106220f, 0.112687f, 0.117932f, 0.120493f, 0.120521f, 0.118539f, 0.113168f, 0.102044f, 0.084258f, 0.060368f, 0.030901f, -0.003748f, -0.042511f, -0.083811f, -0.126393f, -0.169523f, -0.212498f, -0.254135f, -0.292796f, -0.326898f, -0.355155f, -0.376131f, -0.388053f, -0.389497f, -0.379942f, -0.359534f, -0.328997f, -0.289934f, -0.244331f, -0.193634f, -0.139228f, -0.083598f, -0.029408f, 0.022692f, 0.073695f, 0.123339f, 0.169305f, 0.209948f, 0.246184f, 0.279689f, 0.310546f, 0.337815f, 0.361405f, 0.381914f, 0.399020f, 0.411385f, 0.418144f, 0.419390f, + 0.415008f, 0.404128f, 0.386279f, 0.362312f, 0.333530f, 0.300394f, 0.262664f, 0.220761f, 0.176830f, 0.134417f, 0.096541f, 0.063537f, 0.033190f, 0.003613f, -0.024357f, -0.048059f, -0.065620f, -0.077181f, -0.084404f, -0.089492f, -0.093981f, -0.097804f, -0.099996f, -0.100408f, -0.100059f, -0.100044f, -0.101037f, -0.103570f, -0.107641f, -0.112334f, -0.116752f, -0.120810f, -0.124401f, -0.126672f, -0.126908f, -0.125168f, -0.121503f, -0.115724f, -0.108269f, -0.100065f, -0.091446f, -0.082435f, -0.073719f, -0.065954f, -0.058708f, -0.051452f, -0.044644f, -0.038636f, -0.032761f, -0.026588f, -0.020600f, -0.014885f, -0.008899f, -0.002909f, 0.002242f, 0.006808f, 0.011545f, 0.016005f, 0.019451f, 0.022427f, 0.025359f, 0.027161f, 0.027123f, 0.026184f, 0.024787f, 0.022001f, 0.017911f, 0.013971f, 0.010312f, 0.005846f, 0.000945f, -0.003364f, -0.007981f, -0.014043f, -0.020341f, -0.025721f, -0.031421f, -0.038054f, -0.043780f, -0.047857f, -0.051586f, -0.054231f, -0.053369f, -0.049784f, -0.045976f, -0.040764f, -0.032016f, -0.022151f, -0.013836f, -0.004597f, 0.007321f, 0.018275f, 0.026778f, 0.036758f, 0.048211f, 0.056341f, + 0.062971f, 0.073642f, 0.083668f, 0.086428f, 0.090734f, 0.105031f, 0.114994f, 0.109424f, 0.110454f, 0.134392f, 0.148541f, 0.127696f, 0.121882f, 0.181720f, 0.241824f, 0.189799f, 0.046739f, -0.042939f, -0.016342f, 0.039119f, 0.052732f, 0.073996f, 0.147151f, 0.199696f, 0.145744f, 0.023298f, -0.056543f, -0.050437f, -0.006574f, 0.021832f, 0.037988f, 0.088616f, 0.203471f, 0.330990f, 0.353783f, 0.218264f, 0.032140f, -0.036633f, 0.044084f, 0.147160f, 0.163258f, 0.121115f, 0.105238f, 0.129326f, 0.144788f, 0.128572f, 0.103746f, 0.091528f} + }, + { + {-0.011223f, 0.003687f, -0.000414f, -0.031357f, -0.057663f, -0.067766f, -0.096325f, -0.163726f, -0.224966f, -0.208955f, -0.081157f, 0.143478f, 0.387596f, 0.486520f, 0.284836f, -0.140976f, -0.441017f, -0.327075f, 0.074175f, 0.349898f, 0.280575f, 0.038443f, -0.108886f, -0.113839f, -0.086300f, -0.070325f, -0.024649f, 0.049306f, 0.092524f, 0.083781f, 0.061156f, 0.054148f, 0.055920f, 0.058263f, 0.066644f, 0.080523f, 0.090464f, 0.094364f, 0.097422f, 0.100540f, 0.101437f, 0.100572f, 0.097579f, 0.089393f, 0.076799f, 0.064921f, 0.054954f, 0.043366f, 0.029470f, 0.015923f, 0.002488f, -0.013502f, -0.031896f, -0.050733f, -0.070213f, -0.091008f, -0.111378f, -0.129544f, -0.145955f, -0.160863f, -0.172868f, -0.181246f, -0.186438f, -0.187665f, -0.183178f, -0.172712f, -0.156892f, -0.135107f, -0.106648f, -0.072711f, -0.034981f, 0.006334f, 0.051208f, 0.098168f, 0.145386f, 0.191890f, 0.236833f, 0.278964f, 0.317170f, 0.350442f, 0.377669f, 0.398477f, 0.413442f, 0.422594f, 0.424961f, 0.420296f, 0.409675f, 0.393798f, 0.372388f, 0.345493f, 0.313465f, 0.275611f, 0.231027f, 0.180958f, 0.128479f, 0.075813f, + 0.023515f, -0.027844f, -0.076427f, -0.119258f, -0.152932f, -0.175194f, -0.186637f, -0.189934f, -0.186882f, -0.177217f, -0.160537f, -0.138059f, -0.112219f, -0.085735f, -0.061204f, -0.040465f, -0.024039f, -0.011686f, -0.003299f, 0.001080f, 0.001404f, -0.002708f, -0.011712f, -0.025056f, -0.041001f, -0.057813f, -0.074544f, -0.090766f, -0.106414f, -0.121885f, -0.137514f, -0.153038f, -0.168182f, -0.183440f, -0.199575f, -0.216690f, -0.234361f, -0.252307f, -0.270421f, -0.288580f, -0.306905f, -0.325883f, -0.345856f, -0.366553f, -0.387191f, -0.406764f, -0.424298f, -0.439192f, -0.451304f, -0.460581f, -0.466844f, -0.470145f, -0.470993f, -0.469950f, -0.467318f, -0.463413f, -0.458793f, -0.453934f, -0.448965f, -0.443919f, -0.438978f, -0.434313f, -0.429938f, -0.425843f, -0.422067f, -0.418527f, -0.414975f, -0.411168f, -0.406936f, -0.402186f, -0.397105f, -0.392257f, -0.388096f, -0.384459f, -0.380881f, -0.377213f, -0.373462f, -0.369262f, -0.364132f, -0.358049f, -0.351167f, -0.343304f, -0.334329f, -0.324576f, -0.314218f, -0.302915f, -0.290682f, -0.278196f, -0.265680f, -0.252744f, -0.239783f, -0.227924f, -0.217230f, -0.206891f, -0.197140f, -0.188670f, + -0.180713f, -0.172459f, -0.165010f, -0.158739f, -0.151375f, -0.142611f, -0.136204f, -0.132665f, -0.126667f, -0.118002f, -0.114967f, -0.118021f, -0.114254f, -0.101693f, -0.101321f, -0.124560f, -0.148010f, -0.147590f, -0.137378f, -0.139760f, -0.138747f, -0.110154f, -0.081767f, -0.105233f, -0.171870f, -0.215991f, -0.207009f, -0.181245f, -0.174445f, -0.180343f, -0.186444f, -0.191819f, -0.178097f, -0.127153f, -0.082373f, -0.120177f, -0.235388f, -0.328199f, -0.337442f, -0.311065f, -0.306275f, -0.305983f, -0.290025f, -0.296380f, -0.327277f, -0.281376f, -0.097597f, 0.092327f}, + {-0.011223f, 0.003687f, -0.000414f, -0.031357f, -0.057663f, -0.067766f, -0.096325f, -0.163726f, -0.224966f, -0.208955f, -0.081157f, 0.143478f, 0.387596f, 0.486520f, 0.284836f, -0.140976f, -0.441017f, -0.327075f, 0.074175f, 0.349898f, 0.280575f, 0.038443f, -0.108886f, -0.113839f, -0.086300f, -0.070325f, -0.024649f, 0.049306f, 0.092524f, 0.083781f, 0.061156f, 0.054148f, 0.055920f, 0.058263f, 0.066644f, 0.080523f, 0.090464f, 0.094364f, 0.097422f, 0.100540f, 0.101437f, 0.100572f, 0.097579f, 0.089393f, 0.076799f, 0.064921f, 0.054954f, 0.043366f, 0.029470f, 0.015923f, 0.002488f, -0.013502f, -0.031896f, -0.050733f, -0.070213f, -0.091008f, -0.111378f, -0.129544f, -0.145955f, -0.160863f, -0.172868f, -0.181246f, -0.186438f, -0.187665f, -0.183178f, -0.172712f, -0.156892f, -0.135107f, -0.106648f, -0.072711f, -0.034981f, 0.006334f, 0.051208f, 0.098168f, 0.145386f, 0.191890f, 0.236833f, 0.278964f, 0.317170f, 0.350442f, 0.377669f, 0.398477f, 0.413442f, 0.422594f, 0.424961f, 0.420296f, 0.409675f, 0.393798f, 0.372388f, 0.345493f, 0.313465f, 0.275611f, 0.231027f, 0.180958f, 0.128479f, 0.075813f, + 0.023515f, -0.027844f, -0.076427f, -0.119258f, -0.152932f, -0.175194f, -0.186637f, -0.189934f, -0.186882f, -0.177217f, -0.160537f, -0.138059f, -0.112219f, -0.085735f, -0.061204f, -0.040465f, -0.024039f, -0.011686f, -0.003299f, 0.001080f, 0.001404f, -0.002708f, -0.011712f, -0.025056f, -0.041001f, -0.057813f, -0.074544f, -0.090766f, -0.106414f, -0.121885f, -0.137514f, -0.153038f, -0.168182f, -0.183440f, -0.199575f, -0.216690f, -0.234361f, -0.252307f, -0.270421f, -0.288580f, -0.306905f, -0.325883f, -0.345856f, -0.366553f, -0.387191f, -0.406764f, -0.424298f, -0.439192f, -0.451304f, -0.460581f, -0.466844f, -0.470145f, -0.470993f, -0.469950f, -0.467318f, -0.463413f, -0.458793f, -0.453934f, -0.448965f, -0.443919f, -0.438978f, -0.434313f, -0.429938f, -0.425843f, -0.422067f, -0.418527f, -0.414975f, -0.411168f, -0.406936f, -0.402186f, -0.397105f, -0.392257f, -0.388096f, -0.384459f, -0.380881f, -0.377213f, -0.373462f, -0.369262f, -0.364132f, -0.358049f, -0.351167f, -0.343304f, -0.334329f, -0.324576f, -0.314218f, -0.302915f, -0.290682f, -0.278196f, -0.265680f, -0.252744f, -0.239783f, -0.227924f, -0.217230f, -0.206891f, -0.197140f, -0.188670f, + -0.180713f, -0.172459f, -0.165010f, -0.158739f, -0.151375f, -0.142611f, -0.136204f, -0.132665f, -0.126667f, -0.118002f, -0.114967f, -0.118021f, -0.114254f, -0.101693f, -0.101321f, -0.124560f, -0.148010f, -0.147590f, -0.137378f, -0.139760f, -0.138747f, -0.110154f, -0.081767f, -0.105233f, -0.171870f, -0.215991f, -0.207009f, -0.181245f, -0.174445f, -0.180343f, -0.186444f, -0.191819f, -0.178097f, -0.127153f, -0.082373f, -0.120177f, -0.235388f, -0.328199f, -0.337442f, -0.311065f, -0.306275f, -0.305983f, -0.290025f, -0.296380f, -0.327277f, -0.281376f, -0.097597f, 0.092327f} + }, + { + {0.054589f, -0.001637f, -0.079543f, -0.135743f, -0.131804f, -0.043458f, 0.104068f, 0.217533f, 0.204070f, 0.074239f, -0.060507f, -0.108806f, -0.081689f, -0.039379f, -0.004993f, 0.029597f, 0.049473f, 0.026070f, -0.027204f, -0.057970f, -0.040922f, -0.005408f, 0.012701f, 0.016342f, 0.029669f, 0.058829f, 0.089715f, 0.111195f, 0.121951f, 0.120092f, 0.101652f, 0.069740f, 0.035273f, 0.006521f, -0.017134f, -0.040773f, -0.067733f, -0.098260f, -0.130202f, -0.159125f, -0.179923f, -0.190245f, -0.191892f, -0.188409f, -0.182228f, -0.174485f, -0.166098f, -0.157672f, -0.148951f, -0.139390f, -0.129028f, -0.118145f, -0.106568f, -0.094035f, -0.080835f, -0.067363f, -0.053428f, -0.038739f, -0.023875f, -0.010097f, 0.001710f, 0.011389f, 0.018876f, 0.023826f, 0.026232f, 0.027134f, 0.028095f, 0.029852f, 0.032050f, 0.034619f, 0.038653f, 0.045252f, 0.054228f, 0.064975f, 0.078084f, 0.094927f, 0.115972f, 0.140559f, 0.168055f, 0.198238f, 0.230625f, 0.264146f, 0.297428f, 0.329230f, 0.359002f, 0.386873f, 0.412350f, 0.433497f, 0.448864f, 0.459882f, 0.469349f, 0.477249f, 0.480035f, 0.474609f, 0.461344f, 0.442380f, + 0.418375f, 0.388058f, 0.350422f, 0.306536f, 0.259028f, 0.209804f, 0.158634f, 0.104592f, 0.048670f, -0.006109f, -0.057348f, -0.105165f, -0.151294f, -0.197048f, -0.242030f, -0.284064f, -0.320505f, -0.350300f, -0.374580f, -0.394966f, -0.411917f, -0.425031f, -0.434070f, -0.439211f, -0.441124f, -0.441102f, -0.440376f, -0.439189f, -0.437206f, -0.434556f, -0.431640f, -0.428284f, -0.423789f, -0.417348f, -0.408064f, -0.395487f, -0.380583f, -0.365150f, -0.349938f, -0.334311f, -0.317544f, -0.299138f, -0.278349f, -0.255141f, -0.231262f, -0.208784f, -0.188088f, -0.168556f, -0.150109f, -0.132628f, -0.115237f, -0.097788f, -0.081784f, -0.068578f, -0.057918f, -0.049072f, -0.041700f, -0.034982f, -0.027605f, -0.019168f, -0.010254f, -0.001254f, 0.007586f, 0.015692f, 0.023079f, 0.030753f, 0.039150f, 0.047677f, 0.056423f, 0.066196f, 0.076374f, 0.085165f, 0.092238f, 0.098541f, 0.103858f, 0.107357f, 0.109771f, 0.112187f, 0.113992f, 0.114589f, 0.115084f, 0.115986f, 0.116053f, 0.115391f, 0.116090f, 0.118375f, 0.120418f, 0.122613f, 0.127014f, 0.132736f, 0.137519f, 0.142486f, 0.149375f, 0.155994f, 0.160690f, 0.166504f, + 0.174416f, 0.179864f, 0.182512f, 0.188824f, 0.198165f, 0.201158f, 0.199276f, 0.205855f, 0.218574f, 0.217938f, 0.206203f, 0.213074f, 0.240900f, 0.244438f, 0.200317f, 0.158123f, 0.174531f, 0.227413f, 0.251412f, 0.237058f, 0.230785f, 0.244489f, 0.233509f, 0.178591f, 0.130638f, 0.141894f, 0.191497f, 0.216461f, 0.195657f, 0.165578f, 0.156193f, 0.145395f, 0.095257f, 0.017498f, -0.024939f, 0.010288f, 0.089729f, 0.139320f, 0.127786f, 0.093936f, 0.089116f, 0.114421f, 0.129992f, 0.115341f, 0.099739f, 0.126419f, 0.196125f, 0.257597f}, + {0.054589f, -0.001637f, -0.079543f, -0.135743f, -0.131804f, -0.043458f, 0.104068f, 0.217533f, 0.204070f, 0.074239f, -0.060507f, -0.108806f, -0.081689f, -0.039379f, -0.004993f, 0.029597f, 0.049473f, 0.026070f, -0.027204f, -0.057970f, -0.040922f, -0.005408f, 0.012701f, 0.016342f, 0.029669f, 0.058829f, 0.089715f, 0.111195f, 0.121951f, 0.120092f, 0.101652f, 0.069740f, 0.035273f, 0.006521f, -0.017134f, -0.040773f, -0.067733f, -0.098260f, -0.130202f, -0.159125f, -0.179923f, -0.190245f, -0.191892f, -0.188409f, -0.182228f, -0.174485f, -0.166098f, -0.157672f, -0.148951f, -0.139390f, -0.129028f, -0.118145f, -0.106568f, -0.094035f, -0.080835f, -0.067363f, -0.053428f, -0.038739f, -0.023875f, -0.010097f, 0.001710f, 0.011389f, 0.018876f, 0.023826f, 0.026232f, 0.027134f, 0.028095f, 0.029852f, 0.032050f, 0.034619f, 0.038653f, 0.045252f, 0.054228f, 0.064975f, 0.078084f, 0.094927f, 0.115972f, 0.140559f, 0.168055f, 0.198238f, 0.230625f, 0.264146f, 0.297428f, 0.329230f, 0.359002f, 0.386873f, 0.412350f, 0.433497f, 0.448864f, 0.459882f, 0.469349f, 0.477249f, 0.480035f, 0.474609f, 0.461344f, 0.442380f, + 0.418375f, 0.388058f, 0.350422f, 0.306536f, 0.259028f, 0.209804f, 0.158634f, 0.104592f, 0.048670f, -0.006109f, -0.057348f, -0.105165f, -0.151294f, -0.197048f, -0.242030f, -0.284064f, -0.320505f, -0.350300f, -0.374580f, -0.394966f, -0.411917f, -0.425031f, -0.434070f, -0.439211f, -0.441124f, -0.441102f, -0.440376f, -0.439189f, -0.437206f, -0.434556f, -0.431640f, -0.428284f, -0.423789f, -0.417348f, -0.408064f, -0.395487f, -0.380583f, -0.365150f, -0.349938f, -0.334311f, -0.317544f, -0.299138f, -0.278349f, -0.255141f, -0.231262f, -0.208784f, -0.188088f, -0.168556f, -0.150109f, -0.132628f, -0.115237f, -0.097788f, -0.081784f, -0.068578f, -0.057918f, -0.049072f, -0.041700f, -0.034982f, -0.027605f, -0.019168f, -0.010254f, -0.001254f, 0.007586f, 0.015692f, 0.023079f, 0.030753f, 0.039150f, 0.047677f, 0.056423f, 0.066196f, 0.076374f, 0.085165f, 0.092238f, 0.098541f, 0.103858f, 0.107357f, 0.109771f, 0.112187f, 0.113992f, 0.114589f, 0.115084f, 0.115986f, 0.116053f, 0.115391f, 0.116090f, 0.118375f, 0.120418f, 0.122613f, 0.127014f, 0.132736f, 0.137519f, 0.142486f, 0.149375f, 0.155994f, 0.160690f, 0.166504f, + 0.174416f, 0.179864f, 0.182512f, 0.188824f, 0.198165f, 0.201158f, 0.199276f, 0.205855f, 0.218574f, 0.217938f, 0.206203f, 0.213074f, 0.240900f, 0.244438f, 0.200317f, 0.158123f, 0.174531f, 0.227413f, 0.251412f, 0.237058f, 0.230785f, 0.244489f, 0.233509f, 0.178591f, 0.130638f, 0.141894f, 0.191497f, 0.216461f, 0.195657f, 0.165578f, 0.156193f, 0.145395f, 0.095257f, 0.017498f, -0.024939f, 0.010288f, 0.089729f, 0.139320f, 0.127786f, 0.093936f, 0.089116f, 0.114421f, 0.129992f, 0.115341f, 0.099739f, 0.126419f, 0.196125f, 0.257597f} + }, + { + {-0.026157f, 0.068639f, 0.138852f, 0.116633f, 0.040871f, -0.066112f, -0.241888f, -0.457026f, -0.568605f, -0.471298f, -0.196549f, 0.181955f, 0.589203f, 0.816657f, 0.568697f, -0.134981f, -0.747445f, -0.685246f, -0.015441f, 0.605050f, 0.693322f, 0.391281f, 0.106693f, -0.011722f, -0.080268f, -0.174474f, -0.247103f, -0.273141f, -0.292930f, -0.320883f, -0.325188f, -0.295283f, -0.254575f, -0.212925f, -0.160163f, -0.098014f, -0.039915f, 0.010923f, 0.057040f, 0.092984f, 0.114618f, 0.128942f, 0.142270f, 0.151647f, 0.154912f, 0.155718f, 0.154665f, 0.148180f, 0.137772f, 0.129391f, 0.124178f, 0.118997f, 0.113394f, 0.108290f, 0.101692f, 0.091970f, 0.080942f, 0.069580f, 0.055904f, 0.039705f, 0.023561f, 0.007840f, -0.009525f, -0.028172f, -0.045799f, -0.062600f, -0.080032f, -0.096800f, -0.110687f, -0.122210f, -0.132699f, -0.141465f, -0.147899f, -0.153417f, -0.159057f, -0.164064f, -0.168042f, -0.171581f, -0.174482f, -0.176315f, -0.178283f, -0.181779f, -0.186166f, -0.190389f, -0.194992f, -0.200352f, -0.204977f, -0.207427f, -0.207840f, -0.206456f, -0.202971f, -0.197962f, -0.192616f, -0.187178f, -0.182088f, -0.179900f, + -0.183369f, -0.192384f, -0.205113f, -0.221034f, -0.240727f, -0.263826f, -0.288814f, -0.313701f, -0.336107f, -0.354222f, -0.368133f, -0.378639f, -0.385041f, -0.385850f, -0.381086f, -0.372078f, -0.359829f, -0.345156f, -0.329222f, -0.312415f, -0.294047f, -0.274257f, -0.254754f, -0.236913f, -0.220646f, -0.205336f, -0.190177f, -0.173810f, -0.155586f, -0.136859f, -0.119423f, -0.103382f, -0.087912f, -0.072828f, -0.057948f, -0.042443f, -0.026135f, -0.010040f, 0.005293f, 0.020416f, 0.035572f, 0.050402f, 0.065217f, 0.080748f, 0.096694f, 0.112113f, 0.126763f, 0.140626f, 0.152945f, 0.163087f, 0.171376f, 0.178108f, 0.182919f, 0.185770f, 0.187134f, 0.186908f, 0.184596f, 0.180511f, 0.175333f, 0.168990f, 0.161399f, 0.153419f, 0.145682f, 0.137689f, 0.129219f, 0.121085f, 0.113576f, 0.105961f, 0.098227f, 0.091437f, 0.086015f, 0.081580f, 0.078300f, 0.076492f, 0.075448f, 0.074428f, 0.073773f, 0.073571f, 0.072898f, 0.071705f, 0.071330f, 0.072161f, 0.073161f, 0.074179f, 0.076012f, 0.078167f, 0.079475f, 0.080318f, 0.081495f, 0.082291f, 0.082316f, 0.082970f, 0.084730f, 0.086114f, 0.087018f, 0.088948f, + 0.091133f, 0.091673f, 0.092125f, 0.094480f, 0.095720f, 0.093481f, 0.092767f, 0.096810f, 0.098287f, 0.092965f, 0.091911f, 0.101679f, 0.104826f, 0.086445f, 0.069405f, 0.089245f, 0.138069f, 0.169948f, 0.164683f, 0.150204f, 0.153627f, 0.164399f, 0.160775f, 0.145233f, 0.135702f, 0.139942f, 0.153308f, 0.169163f, 0.181118f, 0.185093f, 0.185347f, 0.187089f, 0.176933f, 0.125522f, 0.026481f, -0.073387f, -0.108076f, -0.068160f, -0.019136f, -0.018020f, -0.035753f, -0.012095f, 0.030752f, 0.016593f, -0.024770f, 0.062804f, 0.338438f, 0.605650f}, + {-0.026157f, 0.068639f, 0.138852f, 0.116633f, 0.040871f, -0.066112f, -0.241888f, -0.457026f, -0.568605f, -0.471298f, -0.196549f, 0.181955f, 0.589203f, 0.816657f, 0.568697f, -0.134981f, -0.747445f, -0.685246f, -0.015441f, 0.605050f, 0.693322f, 0.391281f, 0.106693f, -0.011722f, -0.080268f, -0.174474f, -0.247103f, -0.273141f, -0.292930f, -0.320883f, -0.325188f, -0.295283f, -0.254575f, -0.212925f, -0.160163f, -0.098014f, -0.039915f, 0.010923f, 0.057040f, 0.092984f, 0.114618f, 0.128942f, 0.142270f, 0.151647f, 0.154912f, 0.155718f, 0.154665f, 0.148180f, 0.137772f, 0.129391f, 0.124178f, 0.118997f, 0.113394f, 0.108290f, 0.101692f, 0.091970f, 0.080942f, 0.069580f, 0.055904f, 0.039705f, 0.023561f, 0.007840f, -0.009525f, -0.028172f, -0.045799f, -0.062600f, -0.080032f, -0.096800f, -0.110687f, -0.122210f, -0.132699f, -0.141465f, -0.147899f, -0.153417f, -0.159057f, -0.164064f, -0.168042f, -0.171581f, -0.174482f, -0.176315f, -0.178283f, -0.181779f, -0.186166f, -0.190389f, -0.194992f, -0.200352f, -0.204977f, -0.207427f, -0.207840f, -0.206456f, -0.202971f, -0.197962f, -0.192616f, -0.187178f, -0.182088f, -0.179900f, + -0.183369f, -0.192384f, -0.205113f, -0.221034f, -0.240727f, -0.263826f, -0.288814f, -0.313701f, -0.336107f, -0.354222f, -0.368133f, -0.378639f, -0.385041f, -0.385850f, -0.381086f, -0.372078f, -0.359829f, -0.345156f, -0.329222f, -0.312415f, -0.294047f, -0.274257f, -0.254754f, -0.236913f, -0.220646f, -0.205336f, -0.190177f, -0.173810f, -0.155586f, -0.136859f, -0.119423f, -0.103382f, -0.087912f, -0.072828f, -0.057948f, -0.042443f, -0.026135f, -0.010040f, 0.005293f, 0.020416f, 0.035572f, 0.050402f, 0.065217f, 0.080748f, 0.096694f, 0.112113f, 0.126763f, 0.140626f, 0.152945f, 0.163087f, 0.171376f, 0.178108f, 0.182919f, 0.185770f, 0.187134f, 0.186908f, 0.184596f, 0.180511f, 0.175333f, 0.168990f, 0.161399f, 0.153419f, 0.145682f, 0.137689f, 0.129219f, 0.121085f, 0.113576f, 0.105961f, 0.098227f, 0.091437f, 0.086015f, 0.081580f, 0.078300f, 0.076492f, 0.075448f, 0.074428f, 0.073773f, 0.073571f, 0.072898f, 0.071705f, 0.071330f, 0.072161f, 0.073161f, 0.074179f, 0.076012f, 0.078167f, 0.079475f, 0.080318f, 0.081495f, 0.082291f, 0.082316f, 0.082970f, 0.084730f, 0.086114f, 0.087018f, 0.088948f, + 0.091133f, 0.091673f, 0.092125f, 0.094480f, 0.095720f, 0.093481f, 0.092767f, 0.096810f, 0.098287f, 0.092965f, 0.091911f, 0.101679f, 0.104826f, 0.086445f, 0.069405f, 0.089245f, 0.138069f, 0.169948f, 0.164683f, 0.150204f, 0.153627f, 0.164399f, 0.160775f, 0.145233f, 0.135702f, 0.139942f, 0.153308f, 0.169163f, 0.181118f, 0.185093f, 0.185347f, 0.187089f, 0.176933f, 0.125522f, 0.026481f, -0.073387f, -0.108076f, -0.068160f, -0.019136f, -0.018020f, -0.035753f, -0.012095f, 0.030752f, 0.016593f, -0.024770f, 0.062804f, 0.338438f, 0.605650f} + }, + { + {-0.007369f, -0.009113f, -0.001099f, 0.022658f, 0.070924f, 0.152318f, 0.232129f, 0.241139f, 0.159597f, 0.019376f, -0.191743f, -0.478726f, -0.641786f, -0.366448f, 0.302362f, 0.784726f, 0.561501f, -0.152339f, -0.632004f, -0.504209f, -0.082826f, 0.166508f, 0.170061f, 0.132434f, 0.150576f, 0.156677f, 0.112765f, 0.064809f, 0.038940f, 0.011560f, -0.026185f, -0.052670f, -0.058435f, -0.055297f, -0.050368f, -0.042168f, -0.033153f, -0.026070f, -0.017664f, -0.007165f, -0.000019f, 0.002560f, 0.006005f, 0.011682f, 0.014961f, 0.014711f, 0.014629f, 0.015662f, 0.015718f, 0.015511f, 0.017772f, 0.022545f, 0.028288f, 0.035048f, 0.042950f, 0.050476f, 0.056636f, 0.061995f, 0.066457f, 0.069051f, 0.070123f, 0.070862f, 0.071035f, 0.069703f, 0.067216f, 0.064295f, 0.060502f, 0.055392f, 0.049663f, 0.043845f, 0.037475f, 0.030360f, 0.022950f, 0.015014f, 0.005606f, -0.005567f, -0.018119f, -0.031952f, -0.046962f, -0.062497f, -0.078234f, -0.094671f, -0.111772f, -0.128161f, -0.142543f, -0.154931f, -0.165841f, -0.175123f, -0.182010f, -0.185649f, -0.185515f, -0.181851f, -0.175561f, -0.167354f, -0.157511f, -0.146709f, + -0.136223f, -0.126946f, -0.118986f, -0.112528f, -0.108273f, -0.106653f, -0.107197f, -0.108900f, -0.110998f, -0.113479f, -0.117023f, -0.122152f, -0.128391f, -0.134603f, -0.140110f, -0.145050f, -0.149794f, -0.154521f, -0.159112f, -0.163000f, -0.165438f, -0.166306f, -0.166315f, -0.166210f, -0.166147f, -0.165802f, -0.164520f, -0.161506f, -0.156473f, -0.149994f, -0.142735f, -0.134670f, -0.125420f, -0.114771f, -0.102543f, -0.088669f, -0.073713f, -0.058625f, -0.043867f, -0.029420f, -0.015423f, -0.002012f, 0.011080f, 0.023915f, 0.035810f, 0.046102f, 0.054869f, 0.062393f, 0.068774f, 0.074464f, 0.080241f, 0.086360f, 0.092594f, 0.098983f, 0.105615f, 0.112093f, 0.118168f, 0.124284f, 0.130714f, 0.137142f, 0.143655f, 0.150871f, 0.158659f, 0.166225f, 0.173522f, 0.180945f, 0.187978f, 0.193921f, 0.199247f, 0.204493f, 0.209025f, 0.212545f, 0.216101f, 0.220182f, 0.223965f, 0.227482f, 0.231885f, 0.237074f, 0.242015f, 0.247127f, 0.253052f, 0.258300f, 0.261689f, 0.264868f, 0.268891f, 0.271822f, 0.273082f, 0.275283f, 0.278781f, 0.280657f, 0.281124f, 0.283268f, 0.285951f, 0.286133f, 0.286398f, 0.289463f, + 0.290488f, 0.287311f, 0.288136f, 0.294374f, 0.292805f, 0.282671f, 0.284319f, 0.297926f, 0.292144f, 0.265659f, 0.265620f, 0.295582f, 0.275872f, 0.176874f, 0.118624f, 0.219351f, 0.399705f, 0.477971f, 0.424361f, 0.364658f, 0.350250f, 0.304253f, 0.215924f, 0.205638f, 0.330161f, 0.473519f, 0.512784f, 0.473603f, 0.445373f, 0.445924f, 0.442945f, 0.420484f, 0.362318f, 0.253795f, 0.151402f, 0.158962f, 0.280224f, 0.386924f, 0.389886f, 0.347680f, 0.344603f, 0.363776f, 0.360809f, 0.360105f, 0.372309f, 0.308063f, 0.110063f, -0.088473f}, + {0.007369f, 0.009113f, 0.001099f, -0.022658f, -0.070924f, -0.152318f, -0.232129f, -0.241139f, -0.159597f, -0.019376f, 0.191743f, 0.478726f, 0.641786f, 0.366448f, -0.302362f, -0.784726f, -0.561501f, 0.152339f, 0.632004f, 0.504209f, 0.082826f, -0.166508f, -0.170061f, -0.132434f, -0.150576f, -0.156677f, -0.112765f, -0.064809f, -0.038940f, -0.011560f, 0.026185f, 0.052670f, 0.058435f, 0.055297f, 0.050368f, 0.042168f, 0.033153f, 0.026070f, 0.017664f, 0.007165f, 0.000019f, -0.002560f, -0.006005f, -0.011682f, -0.014961f, -0.014711f, -0.014629f, -0.015662f, -0.015718f, -0.015511f, -0.017772f, -0.022545f, -0.028288f, -0.035048f, -0.042950f, -0.050476f, -0.056636f, -0.061995f, -0.066457f, -0.069051f, -0.070123f, -0.070862f, -0.071035f, -0.069703f, -0.067216f, -0.064295f, -0.060502f, -0.055392f, -0.049663f, -0.043845f, -0.037475f, -0.030360f, -0.022950f, -0.015014f, -0.005606f, 0.005567f, 0.018119f, 0.031952f, 0.046962f, 0.062497f, 0.078234f, 0.094671f, 0.111772f, 0.128161f, 0.142543f, 0.154931f, 0.165841f, 0.175123f, 0.182010f, 0.185649f, 0.185515f, 0.181851f, 0.175561f, 0.167354f, 0.157511f, 0.146709f, + 0.136223f, 0.126946f, 0.118986f, 0.112528f, 0.108273f, 0.106653f, 0.107197f, 0.108900f, 0.110998f, 0.113479f, 0.117023f, 0.122152f, 0.128391f, 0.134603f, 0.140110f, 0.145050f, 0.149794f, 0.154521f, 0.159112f, 0.163000f, 0.165438f, 0.166306f, 0.166315f, 0.166210f, 0.166147f, 0.165802f, 0.164520f, 0.161506f, 0.156473f, 0.149994f, 0.142735f, 0.134670f, 0.125420f, 0.114771f, 0.102543f, 0.088669f, 0.073713f, 0.058625f, 0.043867f, 0.029420f, 0.015423f, 0.002012f, -0.011080f, -0.023915f, -0.035810f, -0.046102f, -0.054869f, -0.062393f, -0.068774f, -0.074464f, -0.080241f, -0.086360f, -0.092594f, -0.098983f, -0.105615f, -0.112093f, -0.118168f, -0.124284f, -0.130714f, -0.137142f, -0.143655f, -0.150871f, -0.158659f, -0.166225f, -0.173522f, -0.180945f, -0.187978f, -0.193921f, -0.199247f, -0.204493f, -0.209025f, -0.212545f, -0.216101f, -0.220182f, -0.223965f, -0.227482f, -0.231885f, -0.237074f, -0.242015f, -0.247127f, -0.253052f, -0.258300f, -0.261689f, -0.264868f, -0.268891f, -0.271822f, -0.273082f, -0.275283f, -0.278781f, -0.280657f, -0.281124f, -0.283268f, -0.285951f, -0.286133f, -0.286398f, -0.289463f, + -0.290488f, -0.287311f, -0.288136f, -0.294374f, -0.292805f, -0.282671f, -0.284319f, -0.297926f, -0.292144f, -0.265659f, -0.265620f, -0.295582f, -0.275872f, -0.176874f, -0.118624f, -0.219351f, -0.399705f, -0.477971f, -0.424361f, -0.364658f, -0.350250f, -0.304253f, -0.215924f, -0.205638f, -0.330161f, -0.473519f, -0.512784f, -0.473603f, -0.445373f, -0.445924f, -0.442945f, -0.420484f, -0.362318f, -0.253795f, -0.151402f, -0.158962f, -0.280224f, -0.386924f, -0.389886f, -0.347680f, -0.344603f, -0.363776f, -0.360809f, -0.360105f, -0.372309f, -0.308063f, -0.110063f, 0.088473f} + }, + { + {-0.002688f, 0.005432f, 0.012718f, 0.008286f, -0.018981f, -0.066947f, -0.093651f, -0.039678f, 0.084418f, 0.167639f, 0.115873f, -0.019344f, -0.096903f, -0.063275f, 0.000491f, 0.014385f, -0.000484f, 0.009731f, 0.035483f, 0.032840f, 0.004036f, -0.010890f, -0.002359f, 0.000339f, -0.017379f, -0.034722f, -0.031174f, -0.012598f, 0.004762f, 0.015141f, 0.020393f, 0.020069f, 0.012230f, -0.002097f, -0.019459f, -0.036054f, -0.048695f, -0.056607f, -0.062102f, -0.067345f, -0.071275f, -0.071399f, -0.067330f, -0.060925f, -0.054215f, -0.048750f, -0.045891f, -0.046130f, -0.048390f, -0.050799f, -0.051951f, -0.051168f, -0.048155f, -0.042971f, -0.036130f, -0.028335f, -0.020063f, -0.011496f, -0.002777f, 0.005857f, 0.014252f, 0.022441f, 0.030314f, 0.037365f, 0.043111f, 0.047651f, 0.051375f, 0.054291f, 0.056203f, 0.057437f, 0.058706f, 0.060226f, 0.061657f, 0.063036f, 0.065132f, 0.068679f, 0.073849f, 0.080769f, 0.090037f, 0.102333f, 0.117751f, 0.135818f, 0.156080f, 0.178486f, 0.203206f, 0.230031f, 0.257901f, 0.285243f, 0.310971f, 0.334898f, 0.356785f, 0.375158f, 0.387601f, 0.392296f, 0.388904f, 0.377910f, + 0.359590f, 0.333993f, 0.301815f, 0.264974f, 0.226129f, 0.187410f, 0.149597f, 0.112764f, 0.077779f, 0.046673f, 0.021036f, 0.000235f, -0.018297f, -0.036907f, -0.055957f, -0.073988f, -0.089329f, -0.101608f, -0.111952f, -0.121846f, -0.131868f, -0.141542f, -0.150198f, -0.157697f, -0.164481f, -0.171286f, -0.178744f, -0.186942f, -0.195343f, -0.203302f, -0.210537f, -0.217024f, -0.222694f, -0.227441f, -0.231177f, -0.233784f, -0.235253f, -0.235915f, -0.236263f, -0.236534f, -0.236669f, -0.236547f, -0.236024f, -0.235038f, -0.233954f, -0.233475f, -0.233944f, -0.235111f, -0.236668f, -0.238427f, -0.239938f, -0.240742f, -0.241159f, -0.242072f, -0.243807f, -0.245955f, -0.248133f, -0.250080f, -0.251134f, -0.250524f, -0.248011f, -0.243591f, -0.237000f, -0.228096f, -0.217152f, -0.204269f, -0.189244f, -0.172334f, -0.154244f, -0.135283f, -0.115616f, -0.096165f, -0.077963f, -0.060968f, -0.044792f, -0.029876f, -0.016585f, -0.004235f, 0.007671f, 0.018639f, 0.028667f, 0.038632f, 0.048378f, 0.056858f, 0.064590f, 0.073057f, 0.081754f, 0.089292f, 0.096631f, 0.105231f, 0.113645f, 0.120294f, 0.126811f, 0.134121f, 0.139781f, 0.143768f, + 0.149981f, 0.157487f, 0.160603f, 0.162003f, 0.170584f, 0.181780f, 0.181900f, 0.177636f, 0.189907f, 0.209624f, 0.204280f, 0.186664f, 0.216719f, 0.295365f, 0.323582f, 0.234869f, 0.109824f, 0.071288f, 0.113232f, 0.138910f, 0.132778f, 0.165020f, 0.231457f, 0.229499f, 0.127086f, 0.030054f, 0.024335f, 0.057848f, 0.047811f, 0.011116f, 0.005056f, 0.015613f, 0.000201f, -0.011538f, 0.040879f, 0.133184f, 0.174164f, 0.133872f, 0.077041f, 0.063200f, 0.079294f, 0.086196f, 0.077456f, 0.068117f, 0.062643f, 0.057750f, 0.055152f, 0.055779f}, + {0.002688f, -0.005432f, -0.012718f, -0.008286f, 0.018981f, 0.066947f, 0.093651f, 0.039678f, -0.084418f, -0.167639f, -0.115873f, 0.019344f, 0.096903f, 0.063275f, -0.000491f, -0.014385f, 0.000484f, -0.009731f, -0.035483f, -0.032840f, -0.004036f, 0.010890f, 0.002359f, -0.000339f, 0.017379f, 0.034722f, 0.031174f, 0.012598f, -0.004762f, -0.015141f, -0.020393f, -0.020069f, -0.012230f, 0.002097f, 0.019459f, 0.036054f, 0.048695f, 0.056607f, 0.062102f, 0.067345f, 0.071275f, 0.071399f, 0.067330f, 0.060925f, 0.054215f, 0.048750f, 0.045891f, 0.046130f, 0.048390f, 0.050799f, 0.051951f, 0.051168f, 0.048155f, 0.042971f, 0.036130f, 0.028335f, 0.020063f, 0.011496f, 0.002777f, -0.005857f, -0.014252f, -0.022441f, -0.030314f, -0.037365f, -0.043111f, -0.047651f, -0.051375f, -0.054291f, -0.056203f, -0.057437f, -0.058706f, -0.060226f, -0.061657f, -0.063036f, -0.065132f, -0.068679f, -0.073849f, -0.080769f, -0.090037f, -0.102333f, -0.117751f, -0.135818f, -0.156080f, -0.178486f, -0.203206f, -0.230031f, -0.257901f, -0.285243f, -0.310971f, -0.334898f, -0.356785f, -0.375158f, -0.387601f, -0.392296f, -0.388904f, -0.377910f, + -0.359590f, -0.333993f, -0.301815f, -0.264974f, -0.226129f, -0.187410f, -0.149597f, -0.112764f, -0.077779f, -0.046673f, -0.021036f, -0.000235f, 0.018297f, 0.036907f, 0.055957f, 0.073988f, 0.089329f, 0.101608f, 0.111952f, 0.121846f, 0.131868f, 0.141542f, 0.150198f, 0.157697f, 0.164481f, 0.171286f, 0.178744f, 0.186942f, 0.195343f, 0.203302f, 0.210537f, 0.217024f, 0.222694f, 0.227441f, 0.231177f, 0.233784f, 0.235253f, 0.235915f, 0.236263f, 0.236534f, 0.236669f, 0.236547f, 0.236024f, 0.235038f, 0.233954f, 0.233475f, 0.233944f, 0.235111f, 0.236668f, 0.238427f, 0.239938f, 0.240742f, 0.241159f, 0.242072f, 0.243807f, 0.245955f, 0.248133f, 0.250080f, 0.251134f, 0.250524f, 0.248011f, 0.243591f, 0.237000f, 0.228096f, 0.217152f, 0.204269f, 0.189244f, 0.172334f, 0.154244f, 0.135283f, 0.115616f, 0.096165f, 0.077963f, 0.060968f, 0.044792f, 0.029876f, 0.016585f, 0.004235f, -0.007671f, -0.018639f, -0.028667f, -0.038632f, -0.048378f, -0.056858f, -0.064590f, -0.073057f, -0.081754f, -0.089292f, -0.096631f, -0.105231f, -0.113645f, -0.120294f, -0.126811f, -0.134121f, -0.139781f, -0.143768f, + -0.149981f, -0.157487f, -0.160603f, -0.162003f, -0.170584f, -0.181780f, -0.181900f, -0.177636f, -0.189907f, -0.209624f, -0.204280f, -0.186664f, -0.216719f, -0.295365f, -0.323582f, -0.234869f, -0.109824f, -0.071288f, -0.113232f, -0.138910f, -0.132778f, -0.165020f, -0.231457f, -0.229499f, -0.127086f, -0.030054f, -0.024335f, -0.057848f, -0.047811f, -0.011116f, -0.005056f, -0.015613f, -0.000201f, 0.011538f, -0.040879f, -0.133184f, -0.174164f, -0.133872f, -0.077041f, -0.063200f, -0.079294f, -0.086196f, -0.077456f, -0.068117f, -0.062643f, -0.057750f, -0.055152f, -0.055779f} + }, + { + {-0.031395f, -0.017549f, 0.012545f, 0.027085f, -0.001298f, -0.019483f, 0.059019f, 0.208286f, 0.263492f, 0.087514f, -0.255313f, -0.510902f, -0.435627f, -0.033493f, 0.386939f, 0.463824f, 0.150130f, -0.224282f, -0.317692f, -0.133994f, 0.063533f, 0.108717f, 0.062538f, 0.027810f, 0.001853f, -0.049162f, -0.095299f, -0.093148f, -0.061382f, -0.047017f, -0.057265f, -0.066961f, -0.063290f, -0.049263f, -0.023679f, 0.015474f, 0.059281f, 0.096124f, 0.123579f, 0.144087f, 0.157932f, 0.165971f, 0.171378f, 0.175091f, 0.175299f, 0.172128f, 0.167569f, 0.161483f, 0.152440f, 0.141016f, 0.128172f, 0.112226f, 0.090989f, 0.065073f, 0.036626f, 0.006936f, -0.022810f, -0.050769f, -0.076246f, -0.100391f, -0.124040f, -0.146496f, -0.166945f, -0.185227f, -0.200710f, -0.211804f, -0.216957f, -0.215246f, -0.206186f, -0.189818f, -0.166688f, -0.137158f, -0.101286f, -0.059912f, -0.015051f, 0.031417f, 0.078741f, 0.126363f, 0.172683f, 0.215583f, 0.253881f, 0.287628f, 0.317019f, 0.341528f, 0.360300f, 0.373071f, 0.380303f, 0.382359f, 0.378941f, 0.369492f, 0.353667f, 0.331025f, 0.300798f, 0.262671f, 0.217574f, 0.167114f, + 0.112510f, 0.054898f, -0.003462f, -0.059139f, -0.109030f, -0.151676f, -0.187106f, -0.215626f, -0.236627f, -0.248501f, -0.250097f, -0.242458f, -0.228671f, -0.211714f, -0.192851f, -0.172157f, -0.149779f, -0.126242f, -0.102213f, -0.078565f, -0.056361f, -0.036419f, -0.019092f, -0.004417f, 0.008006f, 0.019186f, 0.030126f, 0.040878f, 0.050508f, 0.057885f, 0.062245f, 0.063363f, 0.061684f, 0.058047f, 0.052884f, 0.045898f, 0.036639f, 0.025030f, 0.011292f, -0.004121f, -0.020506f, -0.037329f, -0.054568f, -0.072173f, -0.089494f, -0.105753f, -0.120651f, -0.134025f, -0.145470f, -0.154818f, -0.162347f, -0.168112f, -0.171794f, -0.173503f, -0.173945f, -0.173633f, -0.172788f, -0.171982f, -0.171913f, -0.172586f, -0.173607f, -0.174969f, -0.176759f, -0.178632f, -0.180379f, -0.182333f, -0.184562f, -0.186478f, -0.187751f, -0.188632f, -0.189123f, -0.188994f, -0.188640f, -0.188675f, -0.188837f, -0.188578f, -0.188189f, -0.188042f, -0.187510f, -0.185863f, -0.183172f, -0.179315f, -0.173560f, -0.165995f, -0.157668f, -0.148777f, -0.138701f, -0.127933f, -0.117657f, -0.107677f, -0.097244f, -0.087142f, -0.078362f, -0.070096f, -0.061614f, -0.054068f, + -0.047958f, -0.041708f, -0.035013f, -0.029793f, -0.025876f, -0.020687f, -0.014884f, -0.012039f, -0.011329f, -0.008255f, -0.004063f, -0.005183f, -0.011321f, -0.014544f, -0.013137f, -0.015356f, -0.025141f, -0.034687f, -0.036741f, -0.035196f, -0.036780f, -0.038630f, -0.031709f, -0.015609f, -0.004294f, -0.011898f, -0.032698f, -0.044235f, -0.036962f, -0.028397f, -0.032322f, -0.028167f, 0.009611f, 0.057777f, 0.058012f, -0.006611f, -0.081631f, -0.103618f, -0.068370f, -0.022195f, -0.005259f, -0.017573f, -0.028765f, -0.015361f, 0.003597f, -0.022097f, -0.107014f, -0.188977f}, + {0.031395f, 0.017549f, -0.012545f, -0.027085f, 0.001298f, 0.019483f, -0.059019f, -0.208286f, -0.263492f, -0.087514f, 0.255313f, 0.510902f, 0.435627f, 0.033493f, -0.386939f, -0.463824f, -0.150130f, 0.224282f, 0.317692f, 0.133994f, -0.063533f, -0.108717f, -0.062538f, -0.027810f, -0.001853f, 0.049162f, 0.095299f, 0.093148f, 0.061382f, 0.047017f, 0.057265f, 0.066961f, 0.063290f, 0.049263f, 0.023679f, -0.015474f, -0.059281f, -0.096124f, -0.123579f, -0.144087f, -0.157932f, -0.165971f, -0.171378f, -0.175091f, -0.175299f, -0.172128f, -0.167569f, -0.161483f, -0.152440f, -0.141016f, -0.128172f, -0.112226f, -0.090989f, -0.065073f, -0.036626f, -0.006936f, 0.022810f, 0.050769f, 0.076246f, 0.100391f, 0.124040f, 0.146496f, 0.166945f, 0.185227f, 0.200710f, 0.211804f, 0.216957f, 0.215246f, 0.206186f, 0.189818f, 0.166688f, 0.137158f, 0.101286f, 0.059912f, 0.015051f, -0.031417f, -0.078741f, -0.126363f, -0.172683f, -0.215583f, -0.253881f, -0.287628f, -0.317019f, -0.341528f, -0.360300f, -0.373071f, -0.380303f, -0.382359f, -0.378941f, -0.369492f, -0.353667f, -0.331025f, -0.300798f, -0.262671f, -0.217574f, -0.167114f, + -0.112510f, -0.054898f, 0.003462f, 0.059139f, 0.109030f, 0.151676f, 0.187106f, 0.215626f, 0.236627f, 0.248501f, 0.250097f, 0.242458f, 0.228671f, 0.211714f, 0.192851f, 0.172157f, 0.149779f, 0.126242f, 0.102213f, 0.078565f, 0.056361f, 0.036419f, 0.019092f, 0.004417f, -0.008006f, -0.019186f, -0.030126f, -0.040878f, -0.050508f, -0.057885f, -0.062245f, -0.063363f, -0.061684f, -0.058047f, -0.052884f, -0.045898f, -0.036639f, -0.025030f, -0.011292f, 0.004121f, 0.020506f, 0.037329f, 0.054568f, 0.072173f, 0.089494f, 0.105753f, 0.120651f, 0.134025f, 0.145470f, 0.154818f, 0.162347f, 0.168112f, 0.171794f, 0.173503f, 0.173945f, 0.173633f, 0.172788f, 0.171982f, 0.171913f, 0.172586f, 0.173607f, 0.174969f, 0.176759f, 0.178632f, 0.180379f, 0.182333f, 0.184562f, 0.186478f, 0.187751f, 0.188632f, 0.189123f, 0.188994f, 0.188640f, 0.188675f, 0.188837f, 0.188578f, 0.188189f, 0.188042f, 0.187510f, 0.185863f, 0.183172f, 0.179315f, 0.173560f, 0.165995f, 0.157668f, 0.148777f, 0.138701f, 0.127933f, 0.117657f, 0.107677f, 0.097244f, 0.087142f, 0.078362f, 0.070096f, 0.061614f, 0.054068f, + 0.047958f, 0.041708f, 0.035013f, 0.029793f, 0.025876f, 0.020687f, 0.014884f, 0.012039f, 0.011329f, 0.008255f, 0.004063f, 0.005183f, 0.011321f, 0.014544f, 0.013137f, 0.015356f, 0.025141f, 0.034687f, 0.036741f, 0.035196f, 0.036780f, 0.038630f, 0.031709f, 0.015609f, 0.004294f, 0.011898f, 0.032698f, 0.044235f, 0.036962f, 0.028397f, 0.032322f, 0.028167f, -0.009611f, -0.057777f, -0.058012f, 0.006611f, 0.081631f, 0.103618f, 0.068370f, 0.022195f, 0.005259f, 0.017573f, 0.028765f, 0.015361f, -0.003597f, 0.022097f, 0.107014f, 0.188977f} + }, + { + {-0.019502f, -0.024108f, -0.023741f, -0.009796f, 0.015547f, 0.040200f, 0.049418f, 0.030039f, -0.022935f, -0.089805f, -0.122188f, -0.081481f, 0.009195f, 0.073870f, 0.061521f, -0.001319f, -0.051768f, -0.064073f, -0.056806f, -0.044490f, -0.019688f, 0.017657f, 0.047591f, 0.057938f, 0.061200f, 0.071250f, 0.079820f, 0.068542f, 0.033537f, -0.011849f, -0.051126f, -0.073885f, -0.077564f, -0.068013f, -0.056218f, -0.049942f, -0.048764f, -0.047509f, -0.042223f, -0.032636f, -0.021389f, -0.011717f, -0.004812f, 0.000602f, 0.006040f, 0.011907f, 0.018434f, 0.026017f, 0.034094f, 0.041240f, 0.046701f, 0.050589f, 0.052772f, 0.052796f, 0.050455f, 0.045432f, 0.037083f, 0.025409f, 0.011341f, -0.004349f, -0.021366f, -0.039047f, -0.056623f, -0.074233f, -0.092292f, -0.110264f, -0.127486f, -0.144411f, -0.161405f, -0.177189f, -0.189933f, -0.198872f, -0.203514f, -0.202567f, -0.195078f, -0.181502f, -0.162623f, -0.138623f, -0.110014f, -0.078167f, -0.044145f, -0.008062f, 0.029925f, 0.068792f, 0.107070f, 0.143639f, 0.178228f, 0.211182f, 0.242095f, 0.268826f, 0.288929f, 0.301918f, 0.308848f, 0.309956f, 0.304163f, 0.290661f, + 0.269776f, 0.242758f, 0.211892f, 0.180019f, 0.148692f, 0.117379f, 0.085253f, 0.053049f, 0.022899f, -0.002684f, -0.021788f, -0.034534f, -0.043357f, -0.050497f, -0.055571f, -0.056701f, -0.053111f, -0.045412f, -0.034615f, -0.022156f, -0.009575f, 0.002997f, 0.016842f, 0.032605f, 0.049621f, 0.067258f, 0.085130f, 0.102158f, 0.117320f, 0.130988f, 0.143895f, 0.155582f, 0.165326f, 0.173298f, 0.179406f, 0.182544f, 0.182218f, 0.179194f, 0.173800f, 0.165487f, 0.154409f, 0.141300f, 0.125879f, 0.107494f, 0.086830f, 0.064946f, 0.041711f, 0.017064f, -0.007788f, -0.032117f, -0.056536f, -0.080769f, -0.103025f, -0.122613f, -0.140519f, -0.156975f, -0.171383f, -0.184548f, -0.197943f, -0.211256f, -0.223337f, -0.234237f, -0.243922f, -0.251152f, -0.255800f, -0.259609f, -0.263111f, -0.265127f, -0.266052f, -0.267563f, -0.268996f, -0.268445f, -0.266765f, -0.265908f, -0.265057f, -0.262930f, -0.261168f, -0.261121f, -0.261008f, -0.259822f, -0.259144f, -0.258514f, -0.255135f, -0.249662f, -0.245226f, -0.240818f, -0.233602f, -0.225815f, -0.220718f, -0.215649f, -0.207922f, -0.201220f, -0.197675f, -0.192842f, -0.185897f, -0.182258f, + -0.180668f, -0.174392f, -0.167600f, -0.168651f, -0.169029f, -0.157694f, -0.148968f, -0.158093f, -0.162902f, -0.141194f, -0.125772f, -0.150997f, -0.167269f, -0.107757f, -0.029434f, -0.064168f, -0.214163f, -0.327492f, -0.315349f, -0.260318f, -0.248751f, -0.230395f, -0.140550f, -0.051921f, -0.083798f, -0.221304f, -0.333518f, -0.342531f, -0.290265f, -0.249776f, -0.232606f, -0.189157f, -0.077884f, 0.062184f, 0.117635f, 0.018087f, -0.157652f, -0.249383f, -0.198595f, -0.105435f, -0.085189f, -0.130387f, -0.154588f, -0.124714f, -0.094023f, -0.119576f, -0.192526f, -0.253906f}, + {-0.019502f, -0.024108f, -0.023741f, -0.009796f, 0.015547f, 0.040200f, 0.049418f, 0.030039f, -0.022935f, -0.089805f, -0.122188f, -0.081481f, 0.009195f, 0.073870f, 0.061521f, -0.001319f, -0.051768f, -0.064073f, -0.056806f, -0.044490f, -0.019688f, 0.017657f, 0.047591f, 0.057938f, 0.061200f, 0.071250f, 0.079820f, 0.068542f, 0.033537f, -0.011849f, -0.051126f, -0.073885f, -0.077564f, -0.068013f, -0.056218f, -0.049942f, -0.048764f, -0.047509f, -0.042223f, -0.032636f, -0.021389f, -0.011717f, -0.004812f, 0.000602f, 0.006040f, 0.011907f, 0.018434f, 0.026017f, 0.034094f, 0.041240f, 0.046701f, 0.050589f, 0.052772f, 0.052796f, 0.050455f, 0.045432f, 0.037083f, 0.025409f, 0.011341f, -0.004349f, -0.021366f, -0.039047f, -0.056623f, -0.074233f, -0.092292f, -0.110264f, -0.127486f, -0.144411f, -0.161405f, -0.177189f, -0.189933f, -0.198872f, -0.203514f, -0.202567f, -0.195078f, -0.181502f, -0.162623f, -0.138623f, -0.110014f, -0.078167f, -0.044145f, -0.008062f, 0.029925f, 0.068792f, 0.107070f, 0.143639f, 0.178228f, 0.211182f, 0.242095f, 0.268826f, 0.288929f, 0.301918f, 0.308848f, 0.309956f, 0.304163f, 0.290661f, + 0.269776f, 0.242758f, 0.211892f, 0.180019f, 0.148692f, 0.117379f, 0.085253f, 0.053049f, 0.022899f, -0.002684f, -0.021788f, -0.034534f, -0.043357f, -0.050497f, -0.055571f, -0.056701f, -0.053111f, -0.045412f, -0.034615f, -0.022156f, -0.009575f, 0.002997f, 0.016842f, 0.032605f, 0.049621f, 0.067258f, 0.085130f, 0.102158f, 0.117320f, 0.130988f, 0.143895f, 0.155582f, 0.165326f, 0.173298f, 0.179406f, 0.182544f, 0.182218f, 0.179194f, 0.173800f, 0.165487f, 0.154409f, 0.141300f, 0.125879f, 0.107494f, 0.086830f, 0.064946f, 0.041711f, 0.017064f, -0.007788f, -0.032117f, -0.056536f, -0.080769f, -0.103025f, -0.122613f, -0.140519f, -0.156975f, -0.171383f, -0.184548f, -0.197943f, -0.211256f, -0.223337f, -0.234237f, -0.243922f, -0.251152f, -0.255800f, -0.259609f, -0.263111f, -0.265127f, -0.266052f, -0.267563f, -0.268996f, -0.268445f, -0.266765f, -0.265908f, -0.265057f, -0.262930f, -0.261168f, -0.261121f, -0.261008f, -0.259822f, -0.259144f, -0.258514f, -0.255135f, -0.249662f, -0.245226f, -0.240818f, -0.233602f, -0.225815f, -0.220718f, -0.215649f, -0.207922f, -0.201220f, -0.197675f, -0.192842f, -0.185897f, -0.182258f, + -0.180668f, -0.174392f, -0.167600f, -0.168651f, -0.169029f, -0.157694f, -0.148968f, -0.158093f, -0.162902f, -0.141194f, -0.125772f, -0.150997f, -0.167269f, -0.107757f, -0.029434f, -0.064168f, -0.214163f, -0.327492f, -0.315349f, -0.260318f, -0.248751f, -0.230395f, -0.140550f, -0.051921f, -0.083798f, -0.221304f, -0.333518f, -0.342531f, -0.290265f, -0.249776f, -0.232606f, -0.189157f, -0.077884f, 0.062184f, 0.117635f, 0.018087f, -0.157652f, -0.249383f, -0.198595f, -0.105435f, -0.085189f, -0.130387f, -0.154588f, -0.124714f, -0.094023f, -0.119576f, -0.192526f, -0.253906f} + }, + { + {-0.020459f, -0.024226f, -0.007319f, 0.032932f, 0.070261f, 0.086507f, 0.075862f, 0.020380f, -0.084294f, -0.176022f, -0.160990f, -0.027778f, 0.117310f, 0.158297f, 0.084734f, -0.019435f, -0.070381f, -0.045836f, 0.018199f, 0.061503f, 0.043846f, -0.020982f, -0.078254f, -0.087465f, -0.055763f, -0.014491f, 0.018486f, 0.043047f, 0.061052f, 0.072989f, 0.082705f, 0.092874f, 0.099131f, 0.096147f, 0.085745f, 0.073416f, 0.060647f, 0.045821f, 0.029788f, 0.016090f, 0.007003f, 0.002079f, -0.000428f, -0.002439f, -0.005629f, -0.011124f, -0.019711f, -0.031936f, -0.047212f, -0.063304f, -0.077628f, -0.088759f, -0.096303f, -0.100279f, -0.101461f, -0.101586f, -0.102290f, -0.104165f, -0.107222f, -0.111679f, -0.117799f, -0.125379f, -0.133735f, -0.141832f, -0.148297f, -0.151761f, -0.151415f, -0.147006f, -0.138423f, -0.125892f, -0.110520f, -0.093878f, -0.076767f, -0.059088f, -0.041213f, -0.024578f, -0.010198f, 0.002580f, 0.014740f, 0.025521f, 0.033050f, 0.036977f, 0.039052f, 0.040734f, 0.041611f, 0.041098f, 0.040698f, 0.043240f, 0.050015f, 0.059556f, 0.069410f, 0.078511f, 0.087586f, 0.097736f, 0.109169f, 0.121258f, + 0.133264f, 0.144615f, 0.154849f, 0.163981f, 0.173051f, 0.183709f, 0.196801f, 0.211503f, 0.226081f, 0.239369f, 0.251298f, 0.262094f, 0.271304f, 0.277782f, 0.280558f, 0.279527f, 0.275234f, 0.268056f, 0.257727f, 0.243568f, 0.225141f, 0.202779f, 0.177630f, 0.151117f, 0.124165f, 0.096863f, 0.068855f, 0.040060f, 0.011112f, -0.016739f, -0.042197f, -0.064683f, -0.084716f, -0.103488f, -0.121850f, -0.139509f, -0.155119f, -0.167247f, -0.175419f, -0.180319f, -0.183098f, -0.184680f, -0.185579f, -0.185807f, -0.184744f, -0.181522f, -0.175876f, -0.168297f, -0.159258f, -0.148806f, -0.137132f, -0.124962f, -0.113038f, -0.101619f, -0.090702f, -0.080308f, -0.070353f, -0.060612f, -0.050949f, -0.041416f, -0.032282f, -0.024135f, -0.017602f, -0.012726f, -0.009002f, -0.006124f, -0.004067f, -0.002466f, -0.000761f, 0.000957f, 0.002161f, 0.002971f, 0.004124f, 0.006037f, 0.008815f, 0.012852f, 0.018515f, 0.025647f, 0.034053f, 0.043642f, 0.053522f, 0.062187f, 0.069139f, 0.074948f, 0.079527f, 0.082208f, 0.083470f, 0.084404f, 0.084728f, 0.083626f, 0.081696f, 0.079585f, 0.076316f, 0.071580f, 0.067155f, 0.063445f, + 0.058415f, 0.052516f, 0.049067f, 0.047225f, 0.042514f, 0.036817f, 0.036645f, 0.038671f, 0.032655f, 0.022831f, 0.024748f, 0.033033f, 0.020825f, -0.012684f, -0.026595f, 0.002934f, 0.039449f, 0.037888f, 0.011764f, 0.003902f, 0.012957f, 0.004264f, -0.017371f, -0.007040f, 0.042603f, 0.080439f, 0.072238f, 0.048300f, 0.049597f, 0.067279f, 0.069762f, 0.058815f, 0.056785f, 0.054038f, 0.014698f, -0.061189f, -0.119777f, -0.117042f, -0.074421f, -0.044738f, -0.040786f, -0.033880f, -0.015908f, -0.014212f, -0.029787f, -0.010524f, 0.073048f, 0.159587f}, + {-0.020459f, -0.024226f, -0.007319f, 0.032932f, 0.070261f, 0.086507f, 0.075862f, 0.020380f, -0.084294f, -0.176022f, -0.160990f, -0.027778f, 0.117310f, 0.158297f, 0.084734f, -0.019435f, -0.070381f, -0.045836f, 0.018199f, 0.061503f, 0.043846f, -0.020982f, -0.078254f, -0.087465f, -0.055763f, -0.014491f, 0.018486f, 0.043047f, 0.061052f, 0.072989f, 0.082705f, 0.092874f, 0.099131f, 0.096147f, 0.085745f, 0.073416f, 0.060647f, 0.045821f, 0.029788f, 0.016090f, 0.007003f, 0.002079f, -0.000428f, -0.002439f, -0.005629f, -0.011124f, -0.019711f, -0.031936f, -0.047212f, -0.063304f, -0.077628f, -0.088759f, -0.096303f, -0.100279f, -0.101461f, -0.101586f, -0.102290f, -0.104165f, -0.107222f, -0.111679f, -0.117799f, -0.125379f, -0.133735f, -0.141832f, -0.148297f, -0.151761f, -0.151415f, -0.147006f, -0.138423f, -0.125892f, -0.110520f, -0.093878f, -0.076767f, -0.059088f, -0.041213f, -0.024578f, -0.010198f, 0.002580f, 0.014740f, 0.025521f, 0.033050f, 0.036977f, 0.039052f, 0.040734f, 0.041611f, 0.041098f, 0.040698f, 0.043240f, 0.050015f, 0.059556f, 0.069410f, 0.078511f, 0.087586f, 0.097736f, 0.109169f, 0.121258f, + 0.133264f, 0.144615f, 0.154849f, 0.163981f, 0.173051f, 0.183709f, 0.196801f, 0.211503f, 0.226081f, 0.239369f, 0.251298f, 0.262094f, 0.271304f, 0.277782f, 0.280558f, 0.279527f, 0.275234f, 0.268056f, 0.257727f, 0.243568f, 0.225141f, 0.202779f, 0.177630f, 0.151117f, 0.124165f, 0.096863f, 0.068855f, 0.040060f, 0.011112f, -0.016739f, -0.042197f, -0.064683f, -0.084716f, -0.103488f, -0.121850f, -0.139509f, -0.155119f, -0.167247f, -0.175419f, -0.180319f, -0.183098f, -0.184680f, -0.185579f, -0.185807f, -0.184744f, -0.181522f, -0.175876f, -0.168297f, -0.159258f, -0.148806f, -0.137132f, -0.124962f, -0.113038f, -0.101619f, -0.090702f, -0.080308f, -0.070353f, -0.060612f, -0.050949f, -0.041416f, -0.032282f, -0.024135f, -0.017602f, -0.012726f, -0.009002f, -0.006124f, -0.004067f, -0.002466f, -0.000761f, 0.000957f, 0.002161f, 0.002971f, 0.004124f, 0.006037f, 0.008815f, 0.012852f, 0.018515f, 0.025647f, 0.034053f, 0.043642f, 0.053522f, 0.062187f, 0.069139f, 0.074948f, 0.079527f, 0.082208f, 0.083470f, 0.084404f, 0.084728f, 0.083626f, 0.081696f, 0.079585f, 0.076316f, 0.071580f, 0.067155f, 0.063445f, + 0.058415f, 0.052516f, 0.049067f, 0.047225f, 0.042514f, 0.036817f, 0.036645f, 0.038671f, 0.032655f, 0.022831f, 0.024748f, 0.033033f, 0.020825f, -0.012684f, -0.026595f, 0.002934f, 0.039449f, 0.037888f, 0.011764f, 0.003902f, 0.012957f, 0.004264f, -0.017371f, -0.007040f, 0.042603f, 0.080439f, 0.072238f, 0.048300f, 0.049597f, 0.067279f, 0.069762f, 0.058815f, 0.056785f, 0.054038f, 0.014698f, -0.061189f, -0.119777f, -0.117042f, -0.074421f, -0.044738f, -0.040786f, -0.033880f, -0.015908f, -0.014212f, -0.029787f, -0.010524f, 0.073048f, 0.159587f} + }, + { + {0.019230f, 0.005435f, -0.001670f, -0.001294f, -0.010487f, -0.014461f, 0.030667f, 0.113202f, 0.129777f, 0.000014f, -0.192920f, -0.252233f, -0.092604f, 0.136952f, 0.210772f, 0.080821f, -0.088991f, -0.135389f, -0.068588f, -0.005284f, 0.003323f, 0.008914f, 0.058759f, 0.125754f, 0.159400f, 0.154680f, 0.140967f, 0.131350f, 0.112781f, 0.074083f, 0.020441f, -0.036433f, -0.087254f, -0.125241f, -0.147468f, -0.156986f, -0.158982f, -0.155710f, -0.147485f, -0.135704f, -0.122237f, -0.108291f, -0.095850f, -0.087923f, -0.085775f, -0.087690f, -0.091184f, -0.094666f, -0.096753f, -0.096083f, -0.092338f, -0.086137f, -0.077823f, -0.067513f, -0.056131f, -0.045302f, -0.036332f, -0.029950f, -0.026691f, -0.026859f, -0.030291f, -0.036478f, -0.044739f, -0.054291f, -0.064399f, -0.074432f, -0.083671f, -0.091357f, -0.096998f, -0.100237f, -0.100391f, -0.096616f, -0.088516f, -0.076165f, -0.059741f, -0.039630f, -0.016638f, 0.008301f, 0.034252f, 0.059947f, 0.084149f, 0.106719f, 0.128442f, 0.149556f, 0.169460f, 0.188009f, 0.205788f, 0.222968f, 0.239578f, 0.257255f, 0.278793f, 0.304945f, 0.333017f, 0.359631f, 0.383799f, 0.406350f, + 0.427076f, 0.443453f, 0.452044f, 0.450717f, 0.439522f, 0.419637f, 0.391822f, 0.356313f, 0.314014f, 0.266992f, 0.217371f, 0.166115f, 0.113115f, 0.058318f, 0.002811f, -0.051061f, -0.100914f, -0.145969f, -0.187244f, -0.225959f, -0.262069f, -0.294432f, -0.321896f, -0.344122f, -0.361927f, -0.376984f, -0.390730f, -0.403348f, -0.414010f, -0.421940f, -0.426962f, -0.429318f, -0.429290f, -0.426748f, -0.420950f, -0.411152f, -0.397449f, -0.380556f, -0.360910f, -0.338489f, -0.313239f, -0.285005f, -0.253467f, -0.218939f, -0.182850f, -0.146776f, -0.111419f, -0.076975f, -0.043728f, -0.011673f, 0.019551f, 0.049686f, 0.077567f, 0.102298f, 0.124067f, 0.143556f, 0.161395f, 0.178368f, 0.195283f, 0.212309f, 0.228806f, 0.243707f, 0.255881f, 0.264647f, 0.270268f, 0.273474f, 0.274516f, 0.273393f, 0.270618f, 0.266694f, 0.261220f, 0.253687f, 0.244636f, 0.234924f, 0.224646f, 0.213843f, 0.203253f, 0.193378f, 0.183911f, 0.174737f, 0.166068f, 0.157360f, 0.147829f, 0.137984f, 0.128785f, 0.119872f, 0.110662f, 0.102037f, 0.094727f, 0.087797f, 0.080834f, 0.075139f, 0.070900f, 0.066532f, 0.062189f, 0.059562f, + 0.057528f, 0.053708f, 0.049943f, 0.048889f, 0.046992f, 0.040524f, 0.035070f, 0.036201f, 0.036089f, 0.026789f, 0.019854f, 0.028515f, 0.036415f, 0.016301f, -0.020707f, -0.031384f, -0.002200f, 0.032420f, 0.043959f, 0.043313f, 0.045513f, 0.041021f, 0.025268f, 0.020977f, 0.042917f, 0.069031f, 0.074200f, 0.068229f, 0.074435f, 0.093211f, 0.111764f, 0.127851f, 0.138412f, 0.126789f, 0.090350f, 0.062570f, 0.076196f, 0.116262f, 0.139539f, 0.132391f, 0.119607f, 0.119984f, 0.124718f, 0.125718f, 0.138639f, 0.182077f, 0.246020f, 0.293881f}, + {0.019230f, 0.005435f, -0.001670f, -0.001294f, -0.010487f, -0.014461f, 0.030667f, 0.113202f, 0.129777f, 0.000014f, -0.192920f, -0.252233f, -0.092604f, 0.136952f, 0.210772f, 0.080821f, -0.088991f, -0.135389f, -0.068588f, -0.005284f, 0.003323f, 0.008914f, 0.058759f, 0.125754f, 0.159400f, 0.154680f, 0.140967f, 0.131350f, 0.112781f, 0.074083f, 0.020441f, -0.036433f, -0.087254f, -0.125241f, -0.147468f, -0.156986f, -0.158982f, -0.155710f, -0.147485f, -0.135704f, -0.122237f, -0.108291f, -0.095850f, -0.087923f, -0.085775f, -0.087690f, -0.091184f, -0.094666f, -0.096753f, -0.096083f, -0.092338f, -0.086137f, -0.077823f, -0.067513f, -0.056131f, -0.045302f, -0.036332f, -0.029950f, -0.026691f, -0.026859f, -0.030291f, -0.036478f, -0.044739f, -0.054291f, -0.064399f, -0.074432f, -0.083671f, -0.091357f, -0.096998f, -0.100237f, -0.100391f, -0.096616f, -0.088516f, -0.076165f, -0.059741f, -0.039630f, -0.016638f, 0.008301f, 0.034252f, 0.059947f, 0.084149f, 0.106719f, 0.128442f, 0.149556f, 0.169460f, 0.188009f, 0.205788f, 0.222968f, 0.239578f, 0.257255f, 0.278793f, 0.304945f, 0.333017f, 0.359631f, 0.383799f, 0.406350f, + 0.427076f, 0.443453f, 0.452044f, 0.450717f, 0.439522f, 0.419637f, 0.391822f, 0.356313f, 0.314014f, 0.266992f, 0.217371f, 0.166115f, 0.113115f, 0.058318f, 0.002811f, -0.051061f, -0.100914f, -0.145969f, -0.187244f, -0.225959f, -0.262069f, -0.294432f, -0.321896f, -0.344122f, -0.361927f, -0.376984f, -0.390730f, -0.403348f, -0.414010f, -0.421940f, -0.426962f, -0.429318f, -0.429290f, -0.426748f, -0.420950f, -0.411152f, -0.397449f, -0.380556f, -0.360910f, -0.338489f, -0.313239f, -0.285005f, -0.253467f, -0.218939f, -0.182850f, -0.146776f, -0.111419f, -0.076975f, -0.043728f, -0.011673f, 0.019551f, 0.049686f, 0.077567f, 0.102298f, 0.124067f, 0.143556f, 0.161395f, 0.178368f, 0.195283f, 0.212309f, 0.228806f, 0.243707f, 0.255881f, 0.264647f, 0.270268f, 0.273474f, 0.274516f, 0.273393f, 0.270618f, 0.266694f, 0.261220f, 0.253687f, 0.244636f, 0.234924f, 0.224646f, 0.213843f, 0.203253f, 0.193378f, 0.183911f, 0.174737f, 0.166068f, 0.157360f, 0.147829f, 0.137984f, 0.128785f, 0.119872f, 0.110662f, 0.102037f, 0.094727f, 0.087797f, 0.080834f, 0.075139f, 0.070900f, 0.066532f, 0.062189f, 0.059562f, + 0.057528f, 0.053708f, 0.049943f, 0.048889f, 0.046992f, 0.040524f, 0.035070f, 0.036201f, 0.036089f, 0.026789f, 0.019854f, 0.028515f, 0.036415f, 0.016301f, -0.020707f, -0.031384f, -0.002200f, 0.032420f, 0.043959f, 0.043313f, 0.045513f, 0.041021f, 0.025268f, 0.020977f, 0.042917f, 0.069031f, 0.074200f, 0.068229f, 0.074435f, 0.093211f, 0.111764f, 0.127851f, 0.138412f, 0.126789f, 0.090350f, 0.062570f, 0.076196f, 0.116262f, 0.139539f, 0.132391f, 0.119607f, 0.119984f, 0.124718f, 0.125718f, 0.138639f, 0.182077f, 0.246020f, 0.293881f} + }, + { + {-0.004423f, -0.003680f, -0.002575f, -0.001704f, -0.003298f, -0.009990f, -0.016789f, -0.009381f, 0.013931f, 0.019772f, -0.029696f, -0.105359f, -0.108022f, 0.013139f, 0.158404f, 0.164232f, 0.005487f, -0.155136f, -0.155733f, -0.019301f, 0.099136f, 0.104894f, 0.038243f, -0.019329f, -0.038505f, -0.031569f, -0.007440f, 0.030512f, 0.068864f, 0.092556f, 0.099631f, 0.096497f, 0.087824f, 0.077833f, 0.072061f, 0.071039f, 0.067981f, 0.056527f, 0.036499f, 0.011015f, -0.016897f, -0.043579f, -0.064988f, -0.079286f, -0.087153f, -0.089777f, -0.088480f, -0.085494f, -0.082997f, -0.081746f, -0.081767f, -0.083418f, -0.086783f, -0.090960f, -0.094751f, -0.097418f, -0.098548f, -0.098108f, -0.096834f, -0.095829f, -0.095756f, -0.096938f, -0.099845f, -0.104733f, -0.111080f, -0.118033f, -0.125180f, -0.132437f, -0.139508f, -0.145970f, -0.151644f, -0.156453f, -0.160072f, -0.162123f, -0.162733f, -0.162527f, -0.161866f, -0.160437f, -0.157991f, -0.155238f, -0.153188f, -0.151562f, -0.148788f, -0.143986f, -0.138030f, -0.131928f, -0.124917f, -0.115172f, -0.102129f, -0.087299f, -0.072817f, -0.059768f, -0.048018f, -0.037364f, -0.028595f, -0.023189f, + -0.021839f, -0.023601f, -0.026896f, -0.031210f, -0.037395f, -0.046314f, -0.057460f, -0.068846f, -0.078064f, -0.083668f, -0.085857f, -0.085916f, -0.084872f, -0.082672f, -0.078518f, -0.071816f, -0.062803f, -0.052472f, -0.041961f, -0.031940f, -0.022440f, -0.013098f, -0.003491f, 0.006606f, 0.017075f, 0.027610f, 0.038115f, 0.048801f, 0.059796f, 0.070835f, 0.081425f, 0.091108f, 0.099513f, 0.106449f, 0.112073f, 0.116786f, 0.120921f, 0.124710f, 0.128466f, 0.132563f, 0.137299f, 0.142939f, 0.149802f, 0.158143f, 0.168056f, 0.179520f, 0.192346f, 0.206065f, 0.220068f, 0.233786f, 0.246615f, 0.257930f, 0.267420f, 0.275131f, 0.280999f, 0.284712f, 0.286146f, 0.285449f, 0.282583f, 0.277328f, 0.269804f, 0.260438f, 0.249489f, 0.237152f, 0.223959f, 0.210474f, 0.196856f, 0.183212f, 0.169971f, 0.157536f, 0.146111f, 0.136111f, 0.127934f, 0.121231f, 0.115268f, 0.109883f, 0.105097f, 0.100223f, 0.094576f, 0.088506f, 0.082554f, 0.076446f, 0.069926f, 0.063313f, 0.056344f, 0.048087f, 0.038644f, 0.028934f, 0.018687f, 0.007186f, -0.004414f, -0.014506f, -0.023733f, -0.033085f, -0.041408f, -0.048241f, + -0.055610f, -0.063517f, -0.069118f, -0.073690f, -0.081987f, -0.091437f, -0.094480f, -0.095028f, -0.104280f, -0.115905f, -0.112025f, -0.101605f, -0.115283f, -0.144765f, -0.134628f, -0.067980f, -0.010744f, -0.020992f, -0.061710f, -0.068485f, -0.059208f, -0.090471f, -0.135033f, -0.106671f, -0.005182f, 0.066546f, 0.051133f, 0.009516f, 0.011923f, 0.041853f, 0.055633f, 0.061571f, 0.078429f, 0.074336f, 0.017492f, -0.049276f, -0.053327f, 0.006541f, 0.062892f, 0.074902f, 0.066734f, 0.070182f, 0.080188f, 0.084197f, 0.098518f, 0.148064f, 0.224120f, 0.282366f}, + {-0.004423f, -0.003680f, -0.002575f, -0.001704f, -0.003298f, -0.009990f, -0.016789f, -0.009381f, 0.013931f, 0.019772f, -0.029696f, -0.105359f, -0.108022f, 0.013139f, 0.158404f, 0.164232f, 0.005487f, -0.155136f, -0.155733f, -0.019301f, 0.099136f, 0.104894f, 0.038243f, -0.019329f, -0.038505f, -0.031569f, -0.007440f, 0.030512f, 0.068864f, 0.092556f, 0.099631f, 0.096497f, 0.087824f, 0.077833f, 0.072061f, 0.071039f, 0.067981f, 0.056527f, 0.036499f, 0.011015f, -0.016897f, -0.043579f, -0.064988f, -0.079286f, -0.087153f, -0.089777f, -0.088480f, -0.085494f, -0.082997f, -0.081746f, -0.081767f, -0.083418f, -0.086783f, -0.090960f, -0.094751f, -0.097418f, -0.098548f, -0.098108f, -0.096834f, -0.095829f, -0.095756f, -0.096938f, -0.099845f, -0.104733f, -0.111080f, -0.118033f, -0.125180f, -0.132437f, -0.139508f, -0.145970f, -0.151644f, -0.156453f, -0.160072f, -0.162123f, -0.162733f, -0.162527f, -0.161866f, -0.160437f, -0.157991f, -0.155238f, -0.153188f, -0.151562f, -0.148788f, -0.143986f, -0.138030f, -0.131928f, -0.124917f, -0.115172f, -0.102129f, -0.087299f, -0.072817f, -0.059768f, -0.048018f, -0.037364f, -0.028595f, -0.023189f, + -0.021839f, -0.023601f, -0.026896f, -0.031210f, -0.037395f, -0.046314f, -0.057460f, -0.068846f, -0.078064f, -0.083668f, -0.085857f, -0.085916f, -0.084872f, -0.082672f, -0.078518f, -0.071816f, -0.062803f, -0.052472f, -0.041961f, -0.031940f, -0.022440f, -0.013098f, -0.003491f, 0.006606f, 0.017075f, 0.027610f, 0.038115f, 0.048801f, 0.059796f, 0.070835f, 0.081425f, 0.091108f, 0.099513f, 0.106449f, 0.112073f, 0.116786f, 0.120921f, 0.124710f, 0.128466f, 0.132563f, 0.137299f, 0.142939f, 0.149802f, 0.158143f, 0.168056f, 0.179520f, 0.192346f, 0.206065f, 0.220068f, 0.233786f, 0.246615f, 0.257930f, 0.267420f, 0.275131f, 0.280999f, 0.284712f, 0.286146f, 0.285449f, 0.282583f, 0.277328f, 0.269804f, 0.260438f, 0.249489f, 0.237152f, 0.223959f, 0.210474f, 0.196856f, 0.183212f, 0.169971f, 0.157536f, 0.146111f, 0.136111f, 0.127934f, 0.121231f, 0.115268f, 0.109883f, 0.105097f, 0.100223f, 0.094576f, 0.088506f, 0.082554f, 0.076446f, 0.069926f, 0.063313f, 0.056344f, 0.048087f, 0.038644f, 0.028934f, 0.018687f, 0.007186f, -0.004414f, -0.014506f, -0.023733f, -0.033085f, -0.041408f, -0.048241f, + -0.055610f, -0.063517f, -0.069118f, -0.073690f, -0.081987f, -0.091437f, -0.094480f, -0.095028f, -0.104280f, -0.115905f, -0.112025f, -0.101605f, -0.115283f, -0.144765f, -0.134628f, -0.067980f, -0.010744f, -0.020992f, -0.061710f, -0.068485f, -0.059208f, -0.090471f, -0.135033f, -0.106671f, -0.005182f, 0.066546f, 0.051133f, 0.009516f, 0.011923f, 0.041853f, 0.055633f, 0.061571f, 0.078429f, 0.074336f, 0.017492f, -0.049276f, -0.053327f, 0.006541f, 0.062892f, 0.074902f, 0.066734f, 0.070182f, 0.080188f, 0.084197f, 0.098518f, 0.148064f, 0.224120f, 0.282366f} + } +}; +const float CRendBin_HOA3_HRIR_coeff_im_48kHz[16][BINAURAL_CHANNELS][240]={ + { + {-0.176883f, -0.484101f, -0.681502f, -0.759839f, -0.743260f, -0.671712f, -0.583362f, -0.478304f, -0.318825f, -0.095272f, 0.143578f, 0.354065f, 0.522400f, 0.573653f, 0.367199f, -0.078420f, -0.434443f, -0.343870f, 0.124508f, 0.486226f, 0.372821f, -0.092766f, -0.525036f, -0.722391f, -0.754199f, -0.724386f, -0.637689f, -0.485195f, -0.312888f, -0.164002f, -0.032292f, 0.097628f, 0.214974f, 0.307441f, 0.382911f, 0.451049f, 0.508993f, 0.554173f, 0.591982f, 0.625936f, 0.654364f, 0.677958f, 0.699685f, 0.718618f, 0.732355f, 0.742627f, 0.751969f, 0.759034f, 0.762320f, 0.763889f, 0.765445f, 0.765427f, 0.762747f, 0.758848f, 0.754374f, 0.748173f, 0.740408f, 0.732723f, 0.725282f, 0.717124f, 0.708777f, 0.701375f, 0.694353f, 0.686709f, 0.679081f, 0.672366f, 0.665974f, 0.659245f, 0.652813f, 0.647208f, 0.641839f, 0.636297f, 0.631020f, 0.626150f, 0.621184f, 0.615916f, 0.610540f, 0.605002f, 0.599137f, 0.592942f, 0.586130f, 0.578295f, 0.569816f, 0.561467f, 0.553030f, 0.543661f, 0.533605f, 0.523989f, 0.514958f, 0.505546f, 0.495406f, 0.485340f, 0.476136f, 0.467922f, 0.460482f, 0.453537f, + 0.447032f, 0.441566f, 0.437916f, 0.435874f, 0.434316f, 0.432632f, 0.431274f, 0.430811f, 0.431194f, 0.431966f, 0.432511f, 0.432256f, 0.431201f, 0.430003f, 0.429097f, 0.428076f, 0.426269f, 0.423428f, 0.419640f, 0.415127f, 0.410339f, 0.405686f, 0.401048f, 0.395985f, 0.390391f, 0.384517f, 0.378555f, 0.372595f, 0.366765f, 0.361032f, 0.355147f, 0.349030f, 0.342953f, 0.337206f, 0.331908f, 0.327170f, 0.323068f, 0.319457f, 0.316138f, 0.313128f, 0.310528f, 0.308327f, 0.306547f, 0.305321f, 0.304600f, 0.304043f, 0.303340f, 0.302393f, 0.301119f, 0.299399f, 0.297227f, 0.294657f, 0.291623f, 0.288018f, 0.283862f, 0.279239f, 0.274219f, 0.268923f, 0.263528f, 0.258150f, 0.252868f, 0.247800f, 0.243031f, 0.238568f, 0.234457f, 0.230786f, 0.227529f, 0.224597f, 0.221967f, 0.219543f, 0.217037f, 0.214279f, 0.211416f, 0.208572f, 0.205658f, 0.202707f, 0.199947f, 0.197400f, 0.194917f, 0.192647f, 0.190846f, 0.189375f, 0.188016f, 0.186967f, 0.186341f, 0.185707f, 0.184804f, 0.183946f, 0.183129f, 0.181782f, 0.179880f, 0.177983f, 0.175907f, 0.173014f, 0.169749f, 0.166885f, + 0.163721f, 0.159457f, 0.155288f, 0.152176f, 0.148348f, 0.142651f, 0.137657f, 0.134832f, 0.130418f, 0.122200f, 0.115519f, 0.114151f, 0.110369f, 0.095566f, 0.077072f, 0.070974f, 0.079309f, 0.087709f, 0.085554f, 0.075310f, 0.062218f, 0.049806f, 0.047081f, 0.063318f, 0.089933f, 0.102721f, 0.090827f, 0.071653f, 0.068003f, 0.080960f, 0.096237f, 0.109049f, 0.128470f, 0.157990f, 0.183447f, 0.185496f, 0.159930f, 0.121484f, 0.088399f, 0.066734f, 0.051403f, 0.038568f, 0.029965f, 0.024659f, 0.015630f, 0.000683f, -0.009979f, -0.006119f}, + {-0.176883f, -0.484101f, -0.681502f, -0.759839f, -0.743260f, -0.671712f, -0.583362f, -0.478304f, -0.318825f, -0.095272f, 0.143578f, 0.354065f, 0.522400f, 0.573653f, 0.367199f, -0.078420f, -0.434443f, -0.343870f, 0.124508f, 0.486226f, 0.372821f, -0.092766f, -0.525036f, -0.722391f, -0.754199f, -0.724386f, -0.637689f, -0.485195f, -0.312888f, -0.164002f, -0.032292f, 0.097628f, 0.214974f, 0.307441f, 0.382911f, 0.451049f, 0.508993f, 0.554173f, 0.591982f, 0.625936f, 0.654364f, 0.677958f, 0.699685f, 0.718618f, 0.732355f, 0.742627f, 0.751969f, 0.759034f, 0.762320f, 0.763889f, 0.765445f, 0.765427f, 0.762747f, 0.758848f, 0.754374f, 0.748173f, 0.740408f, 0.732723f, 0.725282f, 0.717124f, 0.708777f, 0.701375f, 0.694353f, 0.686709f, 0.679081f, 0.672366f, 0.665974f, 0.659245f, 0.652813f, 0.647208f, 0.641839f, 0.636297f, 0.631020f, 0.626150f, 0.621184f, 0.615916f, 0.610540f, 0.605002f, 0.599137f, 0.592942f, 0.586130f, 0.578295f, 0.569816f, 0.561467f, 0.553030f, 0.543661f, 0.533605f, 0.523989f, 0.514958f, 0.505546f, 0.495406f, 0.485340f, 0.476136f, 0.467922f, 0.460482f, 0.453537f, + 0.447032f, 0.441566f, 0.437916f, 0.435874f, 0.434316f, 0.432632f, 0.431274f, 0.430811f, 0.431194f, 0.431966f, 0.432511f, 0.432256f, 0.431201f, 0.430003f, 0.429097f, 0.428076f, 0.426269f, 0.423428f, 0.419640f, 0.415127f, 0.410339f, 0.405686f, 0.401048f, 0.395985f, 0.390391f, 0.384517f, 0.378555f, 0.372595f, 0.366765f, 0.361032f, 0.355147f, 0.349030f, 0.342953f, 0.337206f, 0.331908f, 0.327170f, 0.323068f, 0.319457f, 0.316138f, 0.313128f, 0.310528f, 0.308327f, 0.306547f, 0.305321f, 0.304600f, 0.304043f, 0.303340f, 0.302393f, 0.301119f, 0.299399f, 0.297227f, 0.294657f, 0.291623f, 0.288018f, 0.283862f, 0.279239f, 0.274219f, 0.268923f, 0.263528f, 0.258150f, 0.252868f, 0.247800f, 0.243031f, 0.238568f, 0.234457f, 0.230786f, 0.227529f, 0.224597f, 0.221967f, 0.219543f, 0.217037f, 0.214279f, 0.211416f, 0.208572f, 0.205658f, 0.202707f, 0.199947f, 0.197400f, 0.194917f, 0.192647f, 0.190846f, 0.189375f, 0.188016f, 0.186967f, 0.186341f, 0.185707f, 0.184804f, 0.183946f, 0.183129f, 0.181782f, 0.179880f, 0.177983f, 0.175907f, 0.173014f, 0.169749f, 0.166885f, + 0.163721f, 0.159457f, 0.155288f, 0.152176f, 0.148348f, 0.142651f, 0.137657f, 0.134832f, 0.130418f, 0.122200f, 0.115519f, 0.114151f, 0.110369f, 0.095566f, 0.077072f, 0.070974f, 0.079309f, 0.087709f, 0.085554f, 0.075310f, 0.062218f, 0.049806f, 0.047081f, 0.063318f, 0.089933f, 0.102721f, 0.090827f, 0.071653f, 0.068003f, 0.080960f, 0.096237f, 0.109049f, 0.128470f, 0.157990f, 0.183447f, 0.185496f, 0.159930f, 0.121484f, 0.088399f, 0.066734f, 0.051403f, 0.038568f, 0.029965f, 0.024659f, 0.015630f, 0.000683f, -0.009979f, -0.006119f} + }, + { + {0.139811f, 0.337680f, 0.309928f, 0.007865f, -0.460052f, -0.904017f, -1.187273f, -1.245347f, -1.047341f, -0.642813f, -0.178251f, 0.255482f, 0.696327f, 1.065155f, 0.997728f, 0.263824f, -0.669296f, -0.911797f, -0.169209f, 0.827247f, 1.142336f, 0.643160f, -0.071883f, -0.512664f, -0.694340f, -0.796456f, -0.832000f, -0.752642f, -0.618206f, -0.514447f, -0.432971f, -0.329732f, -0.215270f, -0.120320f, -0.037944f, 0.050458f, 0.138590f, 0.216448f, 0.291141f, 0.367466f, 0.437249f, 0.497434f, 0.554267f, 0.607280f, 0.650114f, 0.684871f, 0.717859f, 0.746604f, 0.765897f, 0.779257f, 0.792413f, 0.803890f, 0.811171f, 0.817031f, 0.823086f, 0.826132f, 0.825083f, 0.822817f, 0.819425f, 0.812156f, 0.801947f, 0.792033f, 0.781683f, 0.768517f, 0.754237f, 0.741632f, 0.729521f, 0.716105f, 0.703200f, 0.692765f, 0.683590f, 0.674714f, 0.667761f, 0.663634f, 0.661007f, 0.659222f, 0.658950f, 0.659915f, 0.661194f, 0.662882f, 0.664859f, 0.665785f, 0.665416f, 0.665313f, 0.665679f, 0.664686f, 0.662061f, 0.659813f, 0.658729f, 0.657658f, 0.656469f, 0.656268f, 0.656891f, 0.657238f, 0.657303f, 0.657243f, + 0.655771f, 0.651744f, 0.645638f, 0.637693f, 0.626755f, 0.612363f, 0.595752f, 0.577822f, 0.558363f, 0.537653f, 0.516647f, 0.495719f, 0.475297f, 0.457049f, 0.442419f, 0.430883f, 0.421223f, 0.413188f, 0.406700f, 0.401222f, 0.396933f, 0.394659f, 0.393933f, 0.392945f, 0.390662f, 0.387246f, 0.382789f, 0.377529f, 0.372623f, 0.368899f, 0.365629f, 0.361963f, 0.358320f, 0.355195f, 0.352156f, 0.348998f, 0.346276f, 0.344053f, 0.341722f, 0.339344f, 0.337548f, 0.336220f, 0.334859f, 0.333734f, 0.333307f, 0.333272f, 0.333372f, 0.334113f, 0.335707f, 0.337542f, 0.339297f, 0.341219f, 0.343021f, 0.344012f, 0.344285f, 0.344318f, 0.343803f, 0.342252f, 0.340023f, 0.337478f, 0.334140f, 0.329736f, 0.324809f, 0.319534f, 0.313397f, 0.306449f, 0.299331f, 0.291965f, 0.283816f, 0.275134f, 0.266430f, 0.257468f, 0.248114f, 0.239081f, 0.230677f, 0.222271f, 0.213733f, 0.205671f, 0.197839f, 0.189344f, 0.180405f, 0.171906f, 0.163769f, 0.155721f, 0.148459f, 0.142253f, 0.136125f, 0.129829f, 0.124280f, 0.119189f, 0.113229f, 0.106765f, 0.101047f, 0.095433f, 0.088960f, 0.082699f, + 0.077090f, 0.070452f, 0.063164f, 0.057658f, 0.052165f, 0.042986f, 0.033716f, 0.029705f, 0.024528f, 0.010022f, -0.003487f, -0.003563f, -0.008281f, -0.044222f, -0.091161f, -0.097337f, -0.059345f, -0.032430f, -0.044938f, -0.063814f, -0.071121f, -0.106555f, -0.189396f, -0.259807f, -0.255503f, -0.202390f, -0.174583f, -0.199128f, -0.246722f, -0.285440f, -0.305850f, -0.323862f, -0.381849f, -0.499832f, -0.602701f, -0.562505f, -0.358033f, -0.132175f, -0.035515f, -0.063390f, -0.105690f, -0.109852f, -0.119592f, -0.173771f, -0.239521f, -0.254709f, -0.192460f, -0.071071f}, + {-0.139811f, -0.337680f, -0.309928f, -0.007865f, 0.460052f, 0.904017f, 1.187273f, 1.245347f, 1.047341f, 0.642813f, 0.178251f, -0.255482f, -0.696327f, -1.065155f, -0.997728f, -0.263824f, 0.669296f, 0.911797f, 0.169209f, -0.827247f, -1.142336f, -0.643160f, 0.071883f, 0.512664f, 0.694340f, 0.796456f, 0.832000f, 0.752642f, 0.618206f, 0.514447f, 0.432971f, 0.329732f, 0.215270f, 0.120320f, 0.037944f, -0.050458f, -0.138590f, -0.216448f, -0.291141f, -0.367466f, -0.437249f, -0.497434f, -0.554267f, -0.607280f, -0.650114f, -0.684871f, -0.717859f, -0.746604f, -0.765897f, -0.779257f, -0.792413f, -0.803890f, -0.811171f, -0.817031f, -0.823086f, -0.826132f, -0.825083f, -0.822817f, -0.819425f, -0.812156f, -0.801947f, -0.792033f, -0.781683f, -0.768517f, -0.754237f, -0.741632f, -0.729521f, -0.716105f, -0.703200f, -0.692765f, -0.683590f, -0.674714f, -0.667761f, -0.663634f, -0.661007f, -0.659222f, -0.658950f, -0.659915f, -0.661194f, -0.662882f, -0.664859f, -0.665785f, -0.665416f, -0.665313f, -0.665679f, -0.664686f, -0.662061f, -0.659813f, -0.658729f, -0.657658f, -0.656469f, -0.656268f, -0.656891f, -0.657238f, -0.657303f, -0.657243f, + -0.655771f, -0.651744f, -0.645638f, -0.637693f, -0.626755f, -0.612363f, -0.595752f, -0.577822f, -0.558363f, -0.537653f, -0.516647f, -0.495719f, -0.475297f, -0.457049f, -0.442419f, -0.430883f, -0.421223f, -0.413188f, -0.406700f, -0.401222f, -0.396933f, -0.394659f, -0.393933f, -0.392945f, -0.390662f, -0.387246f, -0.382789f, -0.377529f, -0.372623f, -0.368899f, -0.365629f, -0.361963f, -0.358320f, -0.355195f, -0.352156f, -0.348998f, -0.346276f, -0.344053f, -0.341722f, -0.339344f, -0.337548f, -0.336220f, -0.334859f, -0.333734f, -0.333307f, -0.333272f, -0.333372f, -0.334113f, -0.335707f, -0.337542f, -0.339297f, -0.341219f, -0.343021f, -0.344012f, -0.344285f, -0.344318f, -0.343803f, -0.342252f, -0.340023f, -0.337478f, -0.334140f, -0.329736f, -0.324809f, -0.319534f, -0.313397f, -0.306449f, -0.299331f, -0.291965f, -0.283816f, -0.275134f, -0.266430f, -0.257468f, -0.248114f, -0.239081f, -0.230677f, -0.222271f, -0.213733f, -0.205671f, -0.197839f, -0.189344f, -0.180405f, -0.171906f, -0.163769f, -0.155721f, -0.148459f, -0.142253f, -0.136125f, -0.129829f, -0.124280f, -0.119189f, -0.113229f, -0.106765f, -0.101047f, -0.095433f, -0.088960f, -0.082699f, + -0.077090f, -0.070452f, -0.063164f, -0.057658f, -0.052165f, -0.042986f, -0.033716f, -0.029705f, -0.024528f, -0.010022f, 0.003487f, 0.003563f, 0.008281f, 0.044222f, 0.091161f, 0.097337f, 0.059345f, 0.032430f, 0.044938f, 0.063814f, 0.071121f, 0.106555f, 0.189396f, 0.259807f, 0.255503f, 0.202390f, 0.174583f, 0.199128f, 0.246722f, 0.285440f, 0.305850f, 0.323862f, 0.381849f, 0.499832f, 0.602701f, 0.562505f, 0.358033f, 0.132175f, 0.035515f, 0.063390f, 0.105690f, 0.109852f, 0.119592f, 0.173771f, 0.239521f, 0.254709f, 0.192460f, 0.071071f} + }, + { + {-0.016781f, -0.068243f, -0.130746f, -0.141416f, -0.067559f, 0.038187f, 0.093997f, 0.073178f, 0.011465f, -0.045861f, -0.075899f, -0.068574f, -0.019327f, 0.052634f, 0.094768f, 0.060753f, -0.027027f, -0.077305f, -0.023530f, 0.088252f, 0.138743f, 0.067072f, -0.068421f, -0.168551f, -0.195815f, -0.179551f, -0.154143f, -0.128577f, -0.102726f, -0.079391f, -0.057784f, -0.033774f, -0.009097f, 0.009560f, 0.019329f, 0.021904f, 0.018986f, 0.013454f, 0.011658f, 0.018744f, 0.033844f, 0.053207f, 0.075186f, 0.099543f, 0.125114f, 0.150979f, 0.177911f, 0.206990f, 0.238370f, 0.272065f, 0.308056f, 0.345140f, 0.381215f, 0.414936f, 0.445808f, 0.472862f, 0.494658f, 0.510583f, 0.520909f, 0.525555f, 0.523765f, 0.515041f, 0.499435f, 0.476740f, 0.446232f, 0.407570f, 0.361399f, 0.308775f, 0.250601f, 0.188053f, 0.122990f, 0.057485f, -0.006595f, -0.067182f, -0.121979f, -0.169504f, -0.209530f, -0.241819f, -0.265268f, -0.279334f, -0.285567f, -0.286357f, -0.282397f, -0.272798f, -0.257898f, -0.240486f, -0.223313f, -0.206272f, -0.187317f, -0.165922f, -0.144335f, -0.125136f, -0.108811f, -0.094377f, -0.081395f, -0.070507f, + -0.062659f, -0.058663f, -0.058998f, -0.063313f, -0.070418f, -0.079177f, -0.089168f, -0.100422f, -0.112928f, -0.126214f, -0.138846f, -0.148727f, -0.154652f, -0.157196f, -0.157495f, -0.155734f, -0.151422f, -0.144279f, -0.134159f, -0.120888f, -0.104827f, -0.086912f, -0.067889f, -0.048281f, -0.029015f, -0.011094f, 0.005181f, 0.019751f, 0.031977f, 0.041217f, 0.047615f, 0.051560f, 0.053135f, 0.052694f, 0.050946f, 0.048096f, 0.044101f, 0.039876f, 0.036856f, 0.035478f, 0.035381f, 0.036484f, 0.038318f, 0.039253f, 0.038058f, 0.035282f, 0.031776f, 0.027264f, 0.021518f, 0.015211f, 0.008590f, 0.001128f, -0.006896f, -0.014429f, -0.021357f, -0.028208f, -0.034548f, -0.039784f, -0.044670f, -0.050039f, -0.055371f, -0.060341f, -0.065860f, -0.072126f, -0.078038f, -0.083530f, -0.089755f, -0.096500f, -0.102463f, -0.107840f, -0.113445f, -0.118322f, -0.121541f, -0.124548f, -0.128590f, -0.132518f, -0.135868f, -0.140523f, -0.147120f, -0.154177f, -0.162021f, -0.172330f, -0.183624f, -0.193140f, -0.201940f, -0.211830f, -0.220237f, -0.224852f, -0.228495f, -0.232832f, -0.234204f, -0.231610f, -0.229485f, -0.228034f, -0.222763f, -0.215763f, + -0.212373f, -0.207950f, -0.196785f, -0.187807f, -0.187735f, -0.181688f, -0.161030f, -0.148748f, -0.156874f, -0.151004f, -0.112810f, -0.094549f, -0.130495f, -0.140613f, -0.036068f, 0.110983f, 0.139885f, 0.034927f, -0.060252f, -0.070101f, -0.069384f, -0.102012f, -0.083008f, 0.039303f, 0.160141f, 0.158502f, 0.064730f, -0.005748f, -0.015098f, -0.015700f, -0.048894f, -0.098403f, -0.116107f, -0.060059f, 0.057678f, 0.146655f, 0.115290f, -0.010018f, -0.101454f, -0.085603f, -0.021018f, 0.005687f, -0.004967f, 0.000661f, 0.032397f, 0.052112f, 0.040359f, 0.013723f}, + {-0.016781f, -0.068243f, -0.130746f, -0.141416f, -0.067559f, 0.038187f, 0.093997f, 0.073178f, 0.011465f, -0.045861f, -0.075899f, -0.068574f, -0.019327f, 0.052634f, 0.094768f, 0.060753f, -0.027027f, -0.077305f, -0.023530f, 0.088252f, 0.138743f, 0.067072f, -0.068421f, -0.168551f, -0.195815f, -0.179551f, -0.154143f, -0.128577f, -0.102726f, -0.079391f, -0.057784f, -0.033774f, -0.009097f, 0.009560f, 0.019329f, 0.021904f, 0.018986f, 0.013454f, 0.011658f, 0.018744f, 0.033844f, 0.053207f, 0.075186f, 0.099543f, 0.125114f, 0.150979f, 0.177911f, 0.206990f, 0.238370f, 0.272065f, 0.308056f, 0.345140f, 0.381215f, 0.414936f, 0.445808f, 0.472862f, 0.494658f, 0.510583f, 0.520909f, 0.525555f, 0.523765f, 0.515041f, 0.499435f, 0.476740f, 0.446232f, 0.407570f, 0.361399f, 0.308775f, 0.250601f, 0.188053f, 0.122990f, 0.057485f, -0.006595f, -0.067182f, -0.121979f, -0.169504f, -0.209530f, -0.241819f, -0.265268f, -0.279334f, -0.285567f, -0.286357f, -0.282397f, -0.272798f, -0.257898f, -0.240486f, -0.223313f, -0.206272f, -0.187317f, -0.165922f, -0.144335f, -0.125136f, -0.108811f, -0.094377f, -0.081395f, -0.070507f, + -0.062659f, -0.058663f, -0.058998f, -0.063313f, -0.070418f, -0.079177f, -0.089168f, -0.100422f, -0.112928f, -0.126214f, -0.138846f, -0.148727f, -0.154652f, -0.157196f, -0.157495f, -0.155734f, -0.151422f, -0.144279f, -0.134159f, -0.120888f, -0.104827f, -0.086912f, -0.067889f, -0.048281f, -0.029015f, -0.011094f, 0.005181f, 0.019751f, 0.031977f, 0.041217f, 0.047615f, 0.051560f, 0.053135f, 0.052694f, 0.050946f, 0.048096f, 0.044101f, 0.039876f, 0.036856f, 0.035478f, 0.035381f, 0.036484f, 0.038318f, 0.039253f, 0.038058f, 0.035282f, 0.031776f, 0.027264f, 0.021518f, 0.015211f, 0.008590f, 0.001128f, -0.006896f, -0.014429f, -0.021357f, -0.028208f, -0.034548f, -0.039784f, -0.044670f, -0.050039f, -0.055371f, -0.060341f, -0.065860f, -0.072126f, -0.078038f, -0.083530f, -0.089755f, -0.096500f, -0.102463f, -0.107840f, -0.113445f, -0.118322f, -0.121541f, -0.124548f, -0.128590f, -0.132518f, -0.135868f, -0.140523f, -0.147120f, -0.154177f, -0.162021f, -0.172330f, -0.183624f, -0.193140f, -0.201940f, -0.211830f, -0.220237f, -0.224852f, -0.228495f, -0.232832f, -0.234204f, -0.231610f, -0.229485f, -0.228034f, -0.222763f, -0.215763f, + -0.212373f, -0.207950f, -0.196785f, -0.187807f, -0.187735f, -0.181688f, -0.161030f, -0.148748f, -0.156874f, -0.151004f, -0.112810f, -0.094549f, -0.130495f, -0.140613f, -0.036068f, 0.110983f, 0.139885f, 0.034927f, -0.060252f, -0.070101f, -0.069384f, -0.102012f, -0.083008f, 0.039303f, 0.160141f, 0.158502f, 0.064730f, -0.005748f, -0.015098f, -0.015700f, -0.048894f, -0.098403f, -0.116107f, -0.060059f, 0.057678f, 0.146655f, 0.115290f, -0.010018f, -0.101454f, -0.085603f, -0.021018f, 0.005687f, -0.004967f, 0.000661f, 0.032397f, 0.052112f, 0.040359f, 0.013723f} + }, + { + {0.006419f, -0.000380f, -0.044417f, -0.097071f, -0.106348f, -0.055854f, 0.004864f, 0.009382f, -0.047117f, -0.104090f, -0.111791f, -0.074420f, -0.009073f, 0.081673f, 0.159525f, 0.135409f, -0.015787f, -0.158879f, -0.117328f, 0.102390f, 0.292403f, 0.276855f, 0.089234f, -0.117191f, -0.257832f, -0.352481f, -0.428424f, -0.472227f, -0.470382f, -0.436585f, -0.386629f, -0.319685f, -0.232981f, -0.133703f, -0.030900f, 0.070632f, 0.166068f, 0.249726f, 0.319333f, 0.375582f, 0.418982f, 0.450841f, 0.474355f, 0.491560f, 0.502057f, 0.506326f, 0.506785f, 0.504408f, 0.497667f, 0.485632f, 0.469281f, 0.449749f, 0.428169f, 0.407143f, 0.389707f, 0.376669f, 0.366612f, 0.357997f, 0.349801f, 0.340868f, 0.330294f, 0.318219f, 0.305334f, 0.291955f, 0.278163f, 0.264312f, 0.250670f, 0.236749f, 0.221537f, 0.204458f, 0.185733f, 0.165583f, 0.143517f, 0.119055f, 0.092907f, 0.066472f, 0.040271f, 0.014131f, -0.011039f, -0.033282f, -0.051808f, -0.067531f, -0.080714f, -0.089863f, -0.094019f, -0.094607f, -0.093686f, -0.091642f, -0.087952f, -0.083101f, -0.078109f, -0.072686f, -0.065387f, -0.055476f, -0.043458f, -0.029662f, + -0.013257f, 0.006916f, 0.031000f, 0.057968f, 0.086658f, 0.116744f, 0.148568f, 0.181979f, 0.215566f, 0.247404f, 0.276573f, 0.303534f, 0.328908f, 0.352272f, 0.372331f, 0.388025f, 0.399465f, 0.408063f, 0.415676f, 0.423147f, 0.429593f, 0.433431f, 0.434049f, 0.432310f, 0.429814f, 0.428057f, 0.427836f, 0.428809f, 0.429787f, 0.429913f, 0.429361f, 0.428784f, 0.428608f, 0.429050f, 0.430098f, 0.431131f, 0.431113f, 0.429393f, 0.425893f, 0.420648f, 0.413761f, 0.405616f, 0.396473f, 0.386033f, 0.373928f, 0.360298f, 0.345527f, 0.329947f, 0.314161f, 0.299015f, 0.284997f, 0.272196f, 0.260812f, 0.251021f, 0.242599f, 0.235398f, 0.229778f, 0.225921f, 0.223433f, 0.222164f, 0.222404f, 0.223783f, 0.225163f, 0.226017f, 0.226580f, 0.226598f, 0.225440f, 0.223398f, 0.221323f, 0.219343f, 0.217296f, 0.215536f, 0.213959f, 0.211506f, 0.207783f, 0.203519f, 0.198702f, 0.192425f, 0.184911f, 0.177078f, 0.168256f, 0.157265f, 0.144949f, 0.132581f, 0.119457f, 0.105218f, 0.091890f, 0.080542f, 0.069569f, 0.058845f, 0.050696f, 0.044902f, 0.038873f, 0.033407f, 0.030820f, 0.028752f, + 0.024794f, 0.023084f, 0.025581f, 0.025045f, 0.019741f, 0.021233f, 0.031130f, 0.031471f, 0.020092f, 0.024258f, 0.047646f, 0.046851f, 0.010282f, 0.010120f, 0.099751f, 0.203325f, 0.205161f, 0.119406f, 0.059799f, 0.059279f, 0.047887f, 0.012235f, 0.034847f, 0.136400f, 0.209510f, 0.173631f, 0.089751f, 0.051420f, 0.052166f, 0.034003f, -0.009700f, -0.054980f, -0.105932f, -0.156941f, -0.150251f, -0.050937f, 0.072024f, 0.116139f, 0.076669f, 0.039024f, 0.051258f, 0.072987f, 0.059581f, 0.035660f, 0.051333f, 0.098827f, 0.112731f, 0.050734f}, + {0.006419f, -0.000380f, -0.044417f, -0.097071f, -0.106348f, -0.055854f, 0.004864f, 0.009382f, -0.047117f, -0.104090f, -0.111791f, -0.074420f, -0.009073f, 0.081673f, 0.159525f, 0.135409f, -0.015787f, -0.158879f, -0.117328f, 0.102390f, 0.292403f, 0.276855f, 0.089234f, -0.117191f, -0.257832f, -0.352481f, -0.428424f, -0.472227f, -0.470382f, -0.436585f, -0.386629f, -0.319685f, -0.232981f, -0.133703f, -0.030900f, 0.070632f, 0.166068f, 0.249726f, 0.319333f, 0.375582f, 0.418982f, 0.450841f, 0.474355f, 0.491560f, 0.502057f, 0.506326f, 0.506785f, 0.504408f, 0.497667f, 0.485632f, 0.469281f, 0.449749f, 0.428169f, 0.407143f, 0.389707f, 0.376669f, 0.366612f, 0.357997f, 0.349801f, 0.340868f, 0.330294f, 0.318219f, 0.305334f, 0.291955f, 0.278163f, 0.264312f, 0.250670f, 0.236749f, 0.221537f, 0.204458f, 0.185733f, 0.165583f, 0.143517f, 0.119055f, 0.092907f, 0.066472f, 0.040271f, 0.014131f, -0.011039f, -0.033282f, -0.051808f, -0.067531f, -0.080714f, -0.089863f, -0.094019f, -0.094607f, -0.093686f, -0.091642f, -0.087952f, -0.083101f, -0.078109f, -0.072686f, -0.065387f, -0.055476f, -0.043458f, -0.029662f, + -0.013257f, 0.006916f, 0.031000f, 0.057968f, 0.086658f, 0.116744f, 0.148568f, 0.181979f, 0.215566f, 0.247404f, 0.276573f, 0.303534f, 0.328908f, 0.352272f, 0.372331f, 0.388025f, 0.399465f, 0.408063f, 0.415676f, 0.423147f, 0.429593f, 0.433431f, 0.434049f, 0.432310f, 0.429814f, 0.428057f, 0.427836f, 0.428809f, 0.429787f, 0.429913f, 0.429361f, 0.428784f, 0.428608f, 0.429050f, 0.430098f, 0.431131f, 0.431113f, 0.429393f, 0.425893f, 0.420648f, 0.413761f, 0.405616f, 0.396473f, 0.386033f, 0.373928f, 0.360298f, 0.345527f, 0.329947f, 0.314161f, 0.299015f, 0.284997f, 0.272196f, 0.260812f, 0.251021f, 0.242599f, 0.235398f, 0.229778f, 0.225921f, 0.223433f, 0.222164f, 0.222404f, 0.223783f, 0.225163f, 0.226017f, 0.226580f, 0.226598f, 0.225440f, 0.223398f, 0.221323f, 0.219343f, 0.217296f, 0.215536f, 0.213959f, 0.211506f, 0.207783f, 0.203519f, 0.198702f, 0.192425f, 0.184911f, 0.177078f, 0.168256f, 0.157265f, 0.144949f, 0.132581f, 0.119457f, 0.105218f, 0.091890f, 0.080542f, 0.069569f, 0.058845f, 0.050696f, 0.044902f, 0.038873f, 0.033407f, 0.030820f, 0.028752f, + 0.024794f, 0.023084f, 0.025581f, 0.025045f, 0.019741f, 0.021233f, 0.031130f, 0.031471f, 0.020092f, 0.024258f, 0.047646f, 0.046851f, 0.010282f, 0.010120f, 0.099751f, 0.203325f, 0.205161f, 0.119406f, 0.059799f, 0.059279f, 0.047887f, 0.012235f, 0.034847f, 0.136400f, 0.209510f, 0.173631f, 0.089751f, 0.051420f, 0.052166f, 0.034003f, -0.009700f, -0.054980f, -0.105932f, -0.156941f, -0.150251f, -0.050937f, 0.072024f, 0.116139f, 0.076669f, 0.039024f, 0.051258f, 0.072987f, 0.059581f, 0.035660f, 0.051333f, 0.098827f, 0.112731f, 0.050734f} + }, + { + {-0.004145f, -0.003666f, 0.011472f, 0.025737f, 0.020888f, 0.002681f, -0.005708f, -0.001729f, -0.016346f, -0.075712f, -0.160203f, -0.207765f, -0.152869f, 0.017357f, 0.211441f, 0.262841f, 0.087261f, -0.176895f, -0.266228f, -0.075175f, 0.219293f, 0.361347f, 0.282230f, 0.104299f, -0.053635f, -0.176306f, -0.281631f, -0.353803f, -0.373719f, -0.355618f, -0.322626f, -0.277765f, -0.217383f, -0.148569f, -0.078599f, -0.004588f, 0.075448f, 0.153048f, 0.217527f, 0.265298f, 0.297854f, 0.317827f, 0.329255f, 0.336467f, 0.341363f, 0.344354f, 0.346614f, 0.348711f, 0.348971f, 0.345749f, 0.339625f, 0.331802f, 0.322488f, 0.312203f, 0.302613f, 0.294865f, 0.288630f, 0.283324f, 0.278784f, 0.274543f, 0.269837f, 0.264413f, 0.258247f, 0.250753f, 0.241341f, 0.230387f, 0.218578f, 0.205635f, 0.190698f, 0.173676f, 0.155193f, 0.135271f, 0.113074f, 0.088233f, 0.061586f, 0.034088f, 0.005671f, -0.023848f, -0.053155f, -0.080091f, -0.104054f, -0.126354f, -0.147577f, -0.166135f, -0.180635f, -0.192361f, -0.203590f, -0.214103f, -0.221263f, -0.223474f, -0.221824f, -0.217974f, -0.211925f, -0.202660f, -0.190084f, -0.175511f, + -0.160523f, -0.145801f, -0.131012f, -0.115698f, -0.100234f, -0.085751f, -0.073156f, -0.062624f, -0.054028f, -0.047150f, -0.041205f, -0.034932f, -0.027678f, -0.019998f, -0.012848f, -0.006575f, -0.000758f, 0.005551f, 0.013454f, 0.023353f, 0.034257f, 0.044468f, 0.053061f, 0.060377f, 0.067374f, 0.075053f, 0.084164f, 0.094773f, 0.106230f, 0.117963f, 0.129996f, 0.142510f, 0.155380f, 0.168334f, 0.180912f, 0.192154f, 0.200956f, 0.206850f, 0.209945f, 0.210369f, 0.208393f, 0.204697f, 0.199808f, 0.193700f, 0.186516f, 0.179137f, 0.172540f, 0.167322f, 0.164156f, 0.163805f, 0.166348f, 0.171193f, 0.177950f, 0.186502f, 0.196457f, 0.207441f, 0.219566f, 0.232839f, 0.246720f, 0.260848f, 0.275255f, 0.289353f, 0.301890f, 0.312265f, 0.320652f, 0.326802f, 0.330234f, 0.331393f, 0.331081f, 0.329265f, 0.325882f, 0.321843f, 0.317809f, 0.313301f, 0.308200f, 0.303376f, 0.298948f, 0.294010f, 0.288493f, 0.282922f, 0.276566f, 0.268585f, 0.260096f, 0.252244f, 0.244001f, 0.234745f, 0.226212f, 0.219060f, 0.211305f, 0.202525f, 0.194820f, 0.188050f, 0.180130f, 0.172258f, 0.166654f, 0.160911f, + 0.153056f, 0.147449f, 0.145612f, 0.140126f, 0.129723f, 0.125834f, 0.129084f, 0.121600f, 0.102649f, 0.099485f, 0.113861f, 0.102603f, 0.058029f, 0.054997f, 0.145041f, 0.249571f, 0.251898f, 0.163725f, 0.095922f, 0.086161f, 0.074951f, 0.048383f, 0.072896f, 0.160524f, 0.219423f, 0.186863f, 0.115135f, 0.076735f, 0.067205f, 0.048319f, 0.014202f, -0.026677f, -0.067100f, -0.065851f, 0.027911f, 0.176276f, 0.254369f, 0.199913f, 0.095255f, 0.049417f, 0.061851f, 0.063067f, 0.033342f, 0.006788f, -0.006173f, -0.024075f, -0.038289f, -0.020048f}, + {0.004145f, 0.003666f, -0.011472f, -0.025737f, -0.020888f, -0.002681f, 0.005708f, 0.001729f, 0.016346f, 0.075712f, 0.160203f, 0.207765f, 0.152869f, -0.017357f, -0.211441f, -0.262841f, -0.087261f, 0.176895f, 0.266228f, 0.075175f, -0.219293f, -0.361347f, -0.282230f, -0.104299f, 0.053635f, 0.176306f, 0.281631f, 0.353803f, 0.373719f, 0.355618f, 0.322626f, 0.277765f, 0.217383f, 0.148569f, 0.078599f, 0.004588f, -0.075448f, -0.153048f, -0.217527f, -0.265298f, -0.297854f, -0.317827f, -0.329255f, -0.336467f, -0.341363f, -0.344354f, -0.346614f, -0.348711f, -0.348971f, -0.345749f, -0.339625f, -0.331802f, -0.322488f, -0.312203f, -0.302613f, -0.294865f, -0.288630f, -0.283324f, -0.278784f, -0.274543f, -0.269837f, -0.264413f, -0.258247f, -0.250753f, -0.241341f, -0.230387f, -0.218578f, -0.205635f, -0.190698f, -0.173676f, -0.155193f, -0.135271f, -0.113074f, -0.088233f, -0.061586f, -0.034088f, -0.005671f, 0.023848f, 0.053155f, 0.080091f, 0.104054f, 0.126354f, 0.147577f, 0.166135f, 0.180635f, 0.192361f, 0.203590f, 0.214103f, 0.221263f, 0.223474f, 0.221824f, 0.217974f, 0.211925f, 0.202660f, 0.190084f, 0.175511f, + 0.160523f, 0.145801f, 0.131012f, 0.115698f, 0.100234f, 0.085751f, 0.073156f, 0.062624f, 0.054028f, 0.047150f, 0.041205f, 0.034932f, 0.027678f, 0.019998f, 0.012848f, 0.006575f, 0.000758f, -0.005551f, -0.013454f, -0.023353f, -0.034257f, -0.044468f, -0.053061f, -0.060377f, -0.067374f, -0.075053f, -0.084164f, -0.094773f, -0.106230f, -0.117963f, -0.129996f, -0.142510f, -0.155380f, -0.168334f, -0.180912f, -0.192154f, -0.200956f, -0.206850f, -0.209945f, -0.210369f, -0.208393f, -0.204697f, -0.199808f, -0.193700f, -0.186516f, -0.179137f, -0.172540f, -0.167322f, -0.164156f, -0.163805f, -0.166348f, -0.171193f, -0.177950f, -0.186502f, -0.196457f, -0.207441f, -0.219566f, -0.232839f, -0.246720f, -0.260848f, -0.275255f, -0.289353f, -0.301890f, -0.312265f, -0.320652f, -0.326802f, -0.330234f, -0.331393f, -0.331081f, -0.329265f, -0.325882f, -0.321843f, -0.317809f, -0.313301f, -0.308200f, -0.303376f, -0.298948f, -0.294010f, -0.288493f, -0.282922f, -0.276566f, -0.268585f, -0.260096f, -0.252244f, -0.244001f, -0.234745f, -0.226212f, -0.219060f, -0.211305f, -0.202525f, -0.194820f, -0.188050f, -0.180130f, -0.172258f, -0.166654f, -0.160911f, + -0.153056f, -0.147449f, -0.145612f, -0.140126f, -0.129723f, -0.125834f, -0.129084f, -0.121600f, -0.102649f, -0.099485f, -0.113861f, -0.102603f, -0.058029f, -0.054997f, -0.145041f, -0.249571f, -0.251898f, -0.163725f, -0.095922f, -0.086161f, -0.074951f, -0.048383f, -0.072896f, -0.160524f, -0.219423f, -0.186863f, -0.115135f, -0.076735f, -0.067205f, -0.048319f, -0.014202f, 0.026677f, 0.067100f, 0.065851f, -0.027911f, -0.176276f, -0.254369f, -0.199913f, -0.095255f, -0.049417f, -0.061851f, -0.063067f, -0.033342f, -0.006788f, 0.006173f, 0.024075f, 0.038289f, 0.020048f} + }, + { + {-0.021669f, -0.023685f, 0.023828f, 0.034018f, -0.023524f, -0.049286f, 0.040503f, 0.161875f, 0.150811f, -0.019734f, -0.197676f, -0.229030f, -0.106401f, 0.062770f, 0.162365f, 0.129952f, -0.007762f, -0.128175f, -0.106139f, 0.044971f, 0.173666f, 0.163889f, 0.058328f, -0.023611f, -0.033294f, -0.007600f, 0.017864f, 0.044155f, 0.072516f, 0.086941f, 0.077826f, 0.052501f, 0.019845f, -0.016546f, -0.051887f, -0.081943f, -0.109000f, -0.136036f, -0.158638f, -0.169848f, -0.168532f, -0.157762f, -0.140048f, -0.118475f, -0.097856f, -0.081023f, -0.066814f, -0.053083f, -0.038732f, -0.022657f, -0.003922f, 0.016835f, 0.038572f, 0.061908f, 0.087943f, 0.115804f, 0.143100f, 0.168000f, 0.189456f, 0.206191f, 0.216814f, 0.220647f, 0.217699f, 0.207967f, 0.191048f, 0.166404f, 0.133914f, 0.094053f, 0.047458f, -0.005253f, -0.062902f, -0.123378f, -0.184188f, -0.242930f, -0.297204f, -0.344947f, -0.385106f, -0.417196f, -0.440297f, -0.453766f, -0.458836f, -0.457795f, -0.451309f, -0.438205f, -0.418365f, -0.394081f, -0.367688f, -0.339298f, -0.307922f, -0.273643f, -0.237339f, -0.199024f, -0.157916f, -0.114031f, -0.068508f, -0.022295f, + 0.024378f, 0.070864f, 0.115420f, 0.156302f, 0.192913f, 0.225272f, 0.252645f, 0.273162f, 0.284913f, 0.287670f, 0.283774f, 0.276781f, 0.268540f, 0.257900f, 0.242812f, 0.223195f, 0.201277f, 0.179871f, 0.160911f, 0.144831f, 0.130605f, 0.116910f, 0.103678f, 0.091983f, 0.082527f, 0.075057f, 0.068993f, 0.063538f, 0.057488f, 0.050008f, 0.041284f, 0.031626f, 0.020682f, 0.008290f, -0.004841f, -0.017983f, -0.030869f, -0.042934f, -0.053314f, -0.061863f, -0.068957f, -0.074456f, -0.078162f, -0.080807f, -0.083164f, -0.084941f, -0.085810f, -0.086426f, -0.087233f, -0.087667f, -0.087431f, -0.086993f, -0.086222f, -0.084410f, -0.081830f, -0.079316f, -0.076543f, -0.072767f, -0.068486f, -0.064301f, -0.059443f, -0.053446f, -0.047480f, -0.042320f, -0.037216f, -0.032146f, -0.028420f, -0.026114f, -0.023941f, -0.021979f, -0.021258f, -0.021151f, -0.020625f, -0.020834f, -0.023040f, -0.026119f, -0.029262f, -0.034092f, -0.041349f, -0.049446f, -0.058245f, -0.069370f, -0.081739f, -0.092511f, -0.102306f, -0.113154f, -0.123020f, -0.129316f, -0.134387f, -0.140442f, -0.144425f, -0.144702f, -0.145130f, -0.146612f, -0.144890f, -0.140872f, + -0.139791f, -0.138608f, -0.131360f, -0.124680f, -0.126031f, -0.124079f, -0.109182f, -0.099237f, -0.107590f, -0.107222f, -0.078014f, -0.060004f, -0.087081f, -0.098386f, -0.015611f, 0.107616f, 0.131899f, 0.033279f, -0.065099f, -0.084123f, -0.081752f, -0.110294f, -0.109745f, -0.022550f, 0.083650f, 0.098982f, 0.017454f, -0.075044f, -0.120096f, -0.135564f, -0.165934f, -0.217688f, -0.234747f, -0.144650f, 0.038500f, 0.179477f, 0.153231f, 0.002298f, -0.107319f, -0.088405f, -0.015190f, 0.008703f, -0.016573f, -0.026527f, -0.001403f, 0.023135f, 0.022859f, 0.008202f}, + {0.021669f, 0.023685f, -0.023828f, -0.034018f, 0.023524f, 0.049286f, -0.040503f, -0.161875f, -0.150811f, 0.019734f, 0.197676f, 0.229030f, 0.106401f, -0.062770f, -0.162365f, -0.129952f, 0.007762f, 0.128175f, 0.106139f, -0.044971f, -0.173666f, -0.163889f, -0.058328f, 0.023611f, 0.033294f, 0.007600f, -0.017864f, -0.044155f, -0.072516f, -0.086941f, -0.077826f, -0.052501f, -0.019845f, 0.016546f, 0.051887f, 0.081943f, 0.109000f, 0.136036f, 0.158638f, 0.169848f, 0.168532f, 0.157762f, 0.140048f, 0.118475f, 0.097856f, 0.081023f, 0.066814f, 0.053083f, 0.038732f, 0.022657f, 0.003922f, -0.016835f, -0.038572f, -0.061908f, -0.087943f, -0.115804f, -0.143100f, -0.168000f, -0.189456f, -0.206191f, -0.216814f, -0.220647f, -0.217699f, -0.207967f, -0.191048f, -0.166404f, -0.133914f, -0.094053f, -0.047458f, 0.005253f, 0.062902f, 0.123378f, 0.184188f, 0.242930f, 0.297204f, 0.344947f, 0.385106f, 0.417196f, 0.440297f, 0.453766f, 0.458836f, 0.457795f, 0.451309f, 0.438205f, 0.418365f, 0.394081f, 0.367688f, 0.339298f, 0.307922f, 0.273643f, 0.237339f, 0.199024f, 0.157916f, 0.114031f, 0.068508f, 0.022295f, + -0.024378f, -0.070864f, -0.115420f, -0.156302f, -0.192913f, -0.225272f, -0.252645f, -0.273162f, -0.284913f, -0.287670f, -0.283774f, -0.276781f, -0.268540f, -0.257900f, -0.242812f, -0.223195f, -0.201277f, -0.179871f, -0.160911f, -0.144831f, -0.130605f, -0.116910f, -0.103678f, -0.091983f, -0.082527f, -0.075057f, -0.068993f, -0.063538f, -0.057488f, -0.050008f, -0.041284f, -0.031626f, -0.020682f, -0.008290f, 0.004841f, 0.017983f, 0.030869f, 0.042934f, 0.053314f, 0.061863f, 0.068957f, 0.074456f, 0.078162f, 0.080807f, 0.083164f, 0.084941f, 0.085810f, 0.086426f, 0.087233f, 0.087667f, 0.087431f, 0.086993f, 0.086222f, 0.084410f, 0.081830f, 0.079316f, 0.076543f, 0.072767f, 0.068486f, 0.064301f, 0.059443f, 0.053446f, 0.047480f, 0.042320f, 0.037216f, 0.032146f, 0.028420f, 0.026114f, 0.023941f, 0.021979f, 0.021258f, 0.021151f, 0.020625f, 0.020834f, 0.023040f, 0.026119f, 0.029262f, 0.034092f, 0.041349f, 0.049446f, 0.058245f, 0.069370f, 0.081739f, 0.092511f, 0.102306f, 0.113154f, 0.123020f, 0.129316f, 0.134387f, 0.140442f, 0.144425f, 0.144702f, 0.145130f, 0.146612f, 0.144890f, 0.140872f, + 0.139791f, 0.138608f, 0.131360f, 0.124680f, 0.126031f, 0.124079f, 0.109182f, 0.099237f, 0.107590f, 0.107222f, 0.078014f, 0.060004f, 0.087081f, 0.098386f, 0.015611f, -0.107616f, -0.131899f, -0.033279f, 0.065099f, 0.084123f, 0.081752f, 0.110294f, 0.109745f, 0.022550f, -0.083650f, -0.098982f, -0.017454f, 0.075044f, 0.120096f, 0.135564f, 0.165934f, 0.217688f, 0.234747f, 0.144650f, -0.038500f, -0.179477f, -0.153231f, -0.002298f, 0.107319f, 0.088405f, 0.015190f, -0.008703f, 0.016573f, 0.026527f, 0.001403f, -0.023135f, -0.022859f, -0.008202f} + }, + { + {0.003490f, -0.006226f, -0.035846f, -0.051515f, -0.041640f, -0.036076f, -0.045949f, -0.026763f, 0.066247f, 0.214586f, 0.349145f, 0.387379f, 0.248996f, -0.075217f, -0.411222f, -0.465190f, -0.135467f, 0.290951f, 0.408104f, 0.149776f, -0.165632f, -0.250425f, -0.140194f, -0.027408f, 0.020877f, 0.060945f, 0.105649f, 0.105114f, 0.053903f, 0.006713f, -0.005167f, -0.000920f, 0.000082f, 0.001162f, 0.003555f, -0.001284f, -0.014085f, -0.027073f, -0.038241f, -0.050923f, -0.065125f, -0.079722f, -0.096066f, -0.112906f, -0.125552f, -0.133576f, -0.141406f, -0.150172f, -0.156901f, -0.161372f, -0.166117f, -0.170690f, -0.172431f, -0.171130f, -0.167726f, -0.160965f, -0.149498f, -0.134444f, -0.116933f, -0.096204f, -0.071970f, -0.045391f, -0.016742f, 0.014649f, 0.047943f, 0.081229f, 0.113842f, 0.145533f, 0.174464f, 0.198570f, 0.217592f, 0.231713f, 0.239760f, 0.240421f, 0.233709f, 0.220058f, 0.199450f, 0.172046f, 0.138437f, 0.099252f, 0.055563f, 0.009024f, -0.039375f, -0.089650f, -0.141184f, -0.192202f, -0.241534f, -0.289259f, -0.335192f, -0.378497f, -0.418885f, -0.456107f, -0.488166f, -0.512093f, -0.526677f, -0.532781f, + -0.531064f, -0.520888f, -0.501308f, -0.472277f, -0.435515f, -0.394864f, -0.354737f, -0.317425f, -0.282773f, -0.250772f, -0.223195f, -0.202435f, -0.189950f, -0.186050f, -0.189968f, -0.199904f, -0.213864f, -0.230597f, -0.249442f, -0.269776f, -0.291088f, -0.312839f, -0.333762f, -0.352022f, -0.366526f, -0.377502f, -0.385752f, -0.392049f, -0.397160f, -0.401566f, -0.405131f, -0.407696f, -0.409744f, -0.411829f, -0.413700f, -0.414630f, -0.414284f, -0.412722f, -0.409992f, -0.406200f, -0.401590f, -0.396097f, -0.389065f, -0.379621f, -0.367177f, -0.351595f, -0.333246f, -0.312889f, -0.291241f, -0.268764f, -0.245990f, -0.223712f, -0.202570f, -0.182754f, -0.164339f, -0.147556f, -0.132499f, -0.118902f, -0.106443f, -0.095030f, -0.084602f, -0.074944f, -0.065829f, -0.057130f, -0.048678f, -0.040225f, -0.031636f, -0.022960f, -0.014347f, -0.006068f, 0.001494f, 0.008244f, 0.014668f, 0.021396f, 0.028573f, 0.036064f, 0.044011f, 0.052627f, 0.061660f, 0.070662f, 0.079560f, 0.088346f, 0.096620f, 0.104093f, 0.110970f, 0.117205f, 0.122169f, 0.125646f, 0.128091f, 0.129387f, 0.128805f, 0.126607f, 0.123922f, 0.120854f, 0.116797f, 0.112354f, + 0.108374f, 0.103999f, 0.098631f, 0.093863f, 0.089953f, 0.083871f, 0.075164f, 0.068279f, 0.063593f, 0.054484f, 0.040704f, 0.032538f, 0.030791f, 0.018823f, -0.008680f, -0.027757f, -0.019659f, -0.003550f, -0.004449f, -0.010080f, -0.000027f, 0.002567f, -0.038050f, -0.098261f, -0.113993f, -0.072907f, -0.029749f, -0.023328f, -0.035246f, -0.040054f, -0.038086f, -0.027498f, -0.004695f, -0.004589f, -0.071780f, -0.172134f, -0.206569f, -0.142510f, -0.058281f, -0.022574f, -0.010410f, 0.016164f, 0.034763f, 0.038405f, 0.092021f, 0.212278f, 0.267090f, 0.126265f}, + {0.003490f, -0.006226f, -0.035846f, -0.051515f, -0.041640f, -0.036076f, -0.045949f, -0.026763f, 0.066247f, 0.214586f, 0.349145f, 0.387379f, 0.248996f, -0.075217f, -0.411222f, -0.465190f, -0.135467f, 0.290951f, 0.408104f, 0.149776f, -0.165632f, -0.250425f, -0.140194f, -0.027408f, 0.020877f, 0.060945f, 0.105649f, 0.105114f, 0.053903f, 0.006713f, -0.005167f, -0.000920f, 0.000082f, 0.001162f, 0.003555f, -0.001284f, -0.014085f, -0.027073f, -0.038241f, -0.050923f, -0.065125f, -0.079722f, -0.096066f, -0.112906f, -0.125552f, -0.133576f, -0.141406f, -0.150172f, -0.156901f, -0.161372f, -0.166117f, -0.170690f, -0.172431f, -0.171130f, -0.167726f, -0.160965f, -0.149498f, -0.134444f, -0.116933f, -0.096204f, -0.071970f, -0.045391f, -0.016742f, 0.014649f, 0.047943f, 0.081229f, 0.113842f, 0.145533f, 0.174464f, 0.198570f, 0.217592f, 0.231713f, 0.239760f, 0.240421f, 0.233709f, 0.220058f, 0.199450f, 0.172046f, 0.138437f, 0.099252f, 0.055563f, 0.009024f, -0.039375f, -0.089650f, -0.141184f, -0.192202f, -0.241534f, -0.289259f, -0.335192f, -0.378497f, -0.418885f, -0.456107f, -0.488166f, -0.512093f, -0.526677f, -0.532781f, + -0.531064f, -0.520888f, -0.501308f, -0.472277f, -0.435515f, -0.394864f, -0.354737f, -0.317425f, -0.282773f, -0.250772f, -0.223195f, -0.202435f, -0.189950f, -0.186050f, -0.189968f, -0.199904f, -0.213864f, -0.230597f, -0.249442f, -0.269776f, -0.291088f, -0.312839f, -0.333762f, -0.352022f, -0.366526f, -0.377502f, -0.385752f, -0.392049f, -0.397160f, -0.401566f, -0.405131f, -0.407696f, -0.409744f, -0.411829f, -0.413700f, -0.414630f, -0.414284f, -0.412722f, -0.409992f, -0.406200f, -0.401590f, -0.396097f, -0.389065f, -0.379621f, -0.367177f, -0.351595f, -0.333246f, -0.312889f, -0.291241f, -0.268764f, -0.245990f, -0.223712f, -0.202570f, -0.182754f, -0.164339f, -0.147556f, -0.132499f, -0.118902f, -0.106443f, -0.095030f, -0.084602f, -0.074944f, -0.065829f, -0.057130f, -0.048678f, -0.040225f, -0.031636f, -0.022960f, -0.014347f, -0.006068f, 0.001494f, 0.008244f, 0.014668f, 0.021396f, 0.028573f, 0.036064f, 0.044011f, 0.052627f, 0.061660f, 0.070662f, 0.079560f, 0.088346f, 0.096620f, 0.104093f, 0.110970f, 0.117205f, 0.122169f, 0.125646f, 0.128091f, 0.129387f, 0.128805f, 0.126607f, 0.123922f, 0.120854f, 0.116797f, 0.112354f, + 0.108374f, 0.103999f, 0.098631f, 0.093863f, 0.089953f, 0.083871f, 0.075164f, 0.068279f, 0.063593f, 0.054484f, 0.040704f, 0.032538f, 0.030791f, 0.018823f, -0.008680f, -0.027757f, -0.019659f, -0.003550f, -0.004449f, -0.010080f, -0.000027f, 0.002567f, -0.038050f, -0.098261f, -0.113993f, -0.072907f, -0.029749f, -0.023328f, -0.035246f, -0.040054f, -0.038086f, -0.027498f, -0.004695f, -0.004589f, -0.071780f, -0.172134f, -0.206569f, -0.142510f, -0.058281f, -0.022574f, -0.010410f, 0.016164f, 0.034763f, 0.038405f, 0.092021f, 0.212278f, 0.267090f, 0.126265f} + }, + { + {-0.035472f, -0.081798f, -0.071269f, -0.002255f, 0.102860f, 0.192934f, 0.195307f, 0.077888f, -0.089815f, -0.183178f, -0.148660f, -0.050318f, 0.021927f, 0.047034f, 0.051279f, 0.039696f, 0.000788f, -0.043082f, -0.046115f, -0.002300f, 0.043120f, 0.054272f, 0.044462f, 0.043697f, 0.054210f, 0.056230f, 0.039591f, 0.010104f, -0.026057f, -0.066929f, -0.106323f, -0.133976f, -0.146070f, -0.148720f, -0.149808f, -0.151671f, -0.151914f, -0.146987f, -0.133736f, -0.110668f, -0.079889f, -0.046679f, -0.015936f, 0.010534f, 0.033170f, 0.052610f, 0.069360f, 0.084349f, 0.098446f, 0.111692f, 0.123760f, 0.134762f, 0.144930f, 0.153971f, 0.161484f, 0.167609f, 0.172556f, 0.175798f, 0.176488f, 0.174543f, 0.170771f, 0.166009f, 0.160711f, 0.155506f, 0.151631f, 0.150263f, 0.151447f, 0.154253f, 0.158209f, 0.163925f, 0.171822f, 0.181027f, 0.190414f, 0.200062f, 0.210583f, 0.221416f, 0.230907f, 0.237799f, 0.241620f, 0.241826f, 0.237494f, 0.227842f, 0.212650f, 0.192367f, 0.167818f, 0.139250f, 0.105981f, 0.068046f, 0.027691f, -0.012582f, -0.053404f, -0.097965f, -0.147589f, -0.199683f, -0.250713f, -0.299600f, + -0.347211f, -0.393568f, -0.436641f, -0.473794f, -0.504000f, -0.528334f, -0.547986f, -0.562129f, -0.568657f, -0.567015f, -0.559255f, -0.548048f, -0.534395f, -0.517300f, -0.494938f, -0.466303f, -0.432494f, -0.396273f, -0.359899f, -0.323754f, -0.287306f, -0.250581f, -0.214271f, -0.179261f, -0.146467f, -0.116331f, -0.088268f, -0.061282f, -0.035046f, -0.009658f, 0.015292f, 0.040570f, 0.066577f, 0.093272f, 0.120122f, 0.145742f, 0.168648f, 0.188835f, 0.207643f, 0.226003f, 0.243897f, 0.261131f, 0.277062f, 0.290013f, 0.298689f, 0.303838f, 0.307126f, 0.309188f, 0.310081f, 0.310329f, 0.309928f, 0.307653f, 0.302863f, 0.296760f, 0.290865f, 0.285707f, 0.281670f, 0.279350f, 0.278412f, 0.277635f, 0.276342f, 0.274531f, 0.272081f, 0.269199f, 0.266771f, 0.265042f, 0.263139f, 0.260717f, 0.258256f, 0.255195f, 0.250108f, 0.243164f, 0.235906f, 0.228645f, 0.220748f, 0.212913f, 0.206270f, 0.200266f, 0.194120f, 0.188745f, 0.184754f, 0.181033f, 0.177428f, 0.175609f, 0.175577f, 0.175232f, 0.174471f, 0.175053f, 0.176162f, 0.175457f, 0.173795f, 0.173114f, 0.171744f, 0.167956f, 0.164332f, 0.162227f, + 0.157916f, 0.150729f, 0.146110f, 0.143936f, 0.136426f, 0.124657f, 0.119818f, 0.119996f, 0.109141f, 0.089750f, 0.085717f, 0.095940f, 0.083230f, 0.037463f, 0.009372f, 0.039437f, 0.088203f, 0.089602f, 0.047152f, 0.017437f, 0.014054f, -0.004805f, -0.050861f, -0.073779f, -0.038800f, 0.013222f, 0.018847f, -0.024526f, -0.065147f, -0.073405f, -0.074806f, -0.099582f, -0.126782f, -0.104109f, -0.020258f, 0.067040f, 0.090571f, 0.049397f, 0.005260f, 0.006347f, 0.036806f, 0.050161f, 0.034434f, 0.024218f, 0.050191f, 0.093391f, 0.100755f, 0.044175f}, + {-0.035472f, -0.081798f, -0.071269f, -0.002255f, 0.102860f, 0.192934f, 0.195307f, 0.077888f, -0.089815f, -0.183178f, -0.148660f, -0.050318f, 0.021927f, 0.047034f, 0.051279f, 0.039696f, 0.000788f, -0.043082f, -0.046115f, -0.002300f, 0.043120f, 0.054272f, 0.044462f, 0.043697f, 0.054210f, 0.056230f, 0.039591f, 0.010104f, -0.026057f, -0.066929f, -0.106323f, -0.133976f, -0.146070f, -0.148720f, -0.149808f, -0.151671f, -0.151914f, -0.146987f, -0.133736f, -0.110668f, -0.079889f, -0.046679f, -0.015936f, 0.010534f, 0.033170f, 0.052610f, 0.069360f, 0.084349f, 0.098446f, 0.111692f, 0.123760f, 0.134762f, 0.144930f, 0.153971f, 0.161484f, 0.167609f, 0.172556f, 0.175798f, 0.176488f, 0.174543f, 0.170771f, 0.166009f, 0.160711f, 0.155506f, 0.151631f, 0.150263f, 0.151447f, 0.154253f, 0.158209f, 0.163925f, 0.171822f, 0.181027f, 0.190414f, 0.200062f, 0.210583f, 0.221416f, 0.230907f, 0.237799f, 0.241620f, 0.241826f, 0.237494f, 0.227842f, 0.212650f, 0.192367f, 0.167818f, 0.139250f, 0.105981f, 0.068046f, 0.027691f, -0.012582f, -0.053404f, -0.097965f, -0.147589f, -0.199683f, -0.250713f, -0.299600f, + -0.347211f, -0.393568f, -0.436641f, -0.473794f, -0.504000f, -0.528334f, -0.547986f, -0.562129f, -0.568657f, -0.567015f, -0.559255f, -0.548048f, -0.534395f, -0.517300f, -0.494938f, -0.466303f, -0.432494f, -0.396273f, -0.359899f, -0.323754f, -0.287306f, -0.250581f, -0.214271f, -0.179261f, -0.146467f, -0.116331f, -0.088268f, -0.061282f, -0.035046f, -0.009658f, 0.015292f, 0.040570f, 0.066577f, 0.093272f, 0.120122f, 0.145742f, 0.168648f, 0.188835f, 0.207643f, 0.226003f, 0.243897f, 0.261131f, 0.277062f, 0.290013f, 0.298689f, 0.303838f, 0.307126f, 0.309188f, 0.310081f, 0.310329f, 0.309928f, 0.307653f, 0.302863f, 0.296760f, 0.290865f, 0.285707f, 0.281670f, 0.279350f, 0.278412f, 0.277635f, 0.276342f, 0.274531f, 0.272081f, 0.269199f, 0.266771f, 0.265042f, 0.263139f, 0.260717f, 0.258256f, 0.255195f, 0.250108f, 0.243164f, 0.235906f, 0.228645f, 0.220748f, 0.212913f, 0.206270f, 0.200266f, 0.194120f, 0.188745f, 0.184754f, 0.181033f, 0.177428f, 0.175609f, 0.175577f, 0.175232f, 0.174471f, 0.175053f, 0.176162f, 0.175457f, 0.173795f, 0.173114f, 0.171744f, 0.167956f, 0.164332f, 0.162227f, + 0.157916f, 0.150729f, 0.146110f, 0.143936f, 0.136426f, 0.124657f, 0.119818f, 0.119996f, 0.109141f, 0.089750f, 0.085717f, 0.095940f, 0.083230f, 0.037463f, 0.009372f, 0.039437f, 0.088203f, 0.089602f, 0.047152f, 0.017437f, 0.014054f, -0.004805f, -0.050861f, -0.073779f, -0.038800f, 0.013222f, 0.018847f, -0.024526f, -0.065147f, -0.073405f, -0.074806f, -0.099582f, -0.126782f, -0.104109f, -0.020258f, 0.067040f, 0.090571f, 0.049397f, 0.005260f, 0.006347f, 0.036806f, 0.050161f, 0.034434f, 0.024218f, 0.050191f, 0.093391f, 0.100755f, 0.044175f} + }, + { + {0.042678f, 0.061622f, -0.028196f, -0.143885f, -0.224072f, -0.284508f, -0.302731f, -0.182658f, 0.099504f, 0.420275f, 0.638704f, 0.687316f, 0.489750f, -0.015410f, -0.622302f, -0.830198f, -0.349626f, 0.436547f, 0.802596f, 0.482187f, -0.101825f, -0.430320f, -0.436453f, -0.363990f, -0.342331f, -0.313261f, -0.238930f, -0.165973f, -0.115181f, -0.053004f, 0.030022f, 0.103505f, 0.154387f, 0.196765f, 0.232985f, 0.250719f, 0.249480f, 0.238127f, 0.217259f, 0.185995f, 0.153039f, 0.125445f, 0.099295f, 0.070881f, 0.043774f, 0.019636f, -0.004691f, -0.028215f, -0.045888f, -0.058070f, -0.069863f, -0.082739f, -0.095207f, -0.108273f, -0.123140f, -0.137644f, -0.150201f, -0.162441f, -0.174694f, -0.184462f, -0.191311f, -0.197478f, -0.202881f, -0.205254f, -0.204820f, -0.203437f, -0.200391f, -0.193986f, -0.185403f, -0.176781f, -0.167901f, -0.158151f, -0.148852f, -0.140977f, -0.133478f, -0.125631f, -0.118126f, -0.111133f, -0.104255f, -0.098270f, -0.094045f, -0.090471f, -0.086049f, -0.081094f, -0.076093f, -0.069893f, -0.061614f, -0.052313f, -0.043250f, -0.034722f, -0.027423f, -0.022573f, -0.020398f, -0.020777f, -0.024856f, -0.033392f, + -0.044257f, -0.054140f, -0.061819f, -0.067591f, -0.070708f, -0.069377f, -0.062218f, -0.048572f, -0.028734f, -0.004500f, 0.022107f, 0.050743f, 0.081816f, 0.114155f, 0.145494f, 0.174558f, 0.201036f, 0.224549f, 0.245211f, 0.263919f, 0.280758f, 0.294514f, 0.304706f, 0.312583f, 0.319626f, 0.326612f, 0.334080f, 0.341832f, 0.348235f, 0.351861f, 0.353358f, 0.354260f, 0.354991f, 0.355418f, 0.355888f, 0.356297f, 0.355581f, 0.353292f, 0.350219f, 0.346812f, 0.342664f, 0.337795f, 0.332648f, 0.326745f, 0.319058f, 0.309473f, 0.298401f, 0.285643f, 0.271046f, 0.255382f, 0.239371f, 0.222910f, 0.206045f, 0.189388f, 0.173090f, 0.156857f, 0.141104f, 0.126636f, 0.113452f, 0.101318f, 0.090789f, 0.082249f, 0.074992f, 0.068538f, 0.063491f, 0.060061f, 0.057439f, 0.055455f, 0.054981f, 0.056161f, 0.058110f, 0.060472f, 0.063342f, 0.066055f, 0.067915f, 0.069371f, 0.070847f, 0.071784f, 0.072212f, 0.073343f, 0.075403f, 0.077120f, 0.078098f, 0.079147f, 0.080031f, 0.079753f, 0.078802f, 0.078270f, 0.077725f, 0.076661f, 0.076178f, 0.076704f, 0.076726f, 0.075852f, 0.075519f, 0.075400f, + 0.073798f, 0.071864f, 0.071587f, 0.070807f, 0.067455f, 0.065540f, 0.067863f, 0.068385f, 0.063450f, 0.062038f, 0.069276f, 0.071356f, 0.058960f, 0.053379f, 0.078818f, 0.116438f, 0.121889f, 0.088110f, 0.054333f, 0.047493f, 0.050192f, 0.038198f, 0.017981f, 0.009829f, 0.016479f, 0.025304f, 0.026670f, 0.017667f, -0.001131f, -0.024314f, -0.047086f, -0.077035f, -0.126851f, -0.184821f, -0.205141f, -0.150219f, -0.045456f, 0.033147f, 0.045118f, 0.036078f, 0.066884f, 0.116177f, 0.121086f, 0.109949f, 0.190572f, 0.356239f, 0.408472f, 0.186052f}, + {0.042678f, 0.061622f, -0.028196f, -0.143885f, -0.224072f, -0.284508f, -0.302731f, -0.182658f, 0.099504f, 0.420275f, 0.638704f, 0.687316f, 0.489750f, -0.015410f, -0.622302f, -0.830198f, -0.349626f, 0.436547f, 0.802596f, 0.482187f, -0.101825f, -0.430320f, -0.436453f, -0.363990f, -0.342331f, -0.313261f, -0.238930f, -0.165973f, -0.115181f, -0.053004f, 0.030022f, 0.103505f, 0.154387f, 0.196765f, 0.232985f, 0.250719f, 0.249480f, 0.238127f, 0.217259f, 0.185995f, 0.153039f, 0.125445f, 0.099295f, 0.070881f, 0.043774f, 0.019636f, -0.004691f, -0.028215f, -0.045888f, -0.058070f, -0.069863f, -0.082739f, -0.095207f, -0.108273f, -0.123140f, -0.137644f, -0.150201f, -0.162441f, -0.174694f, -0.184462f, -0.191311f, -0.197478f, -0.202881f, -0.205254f, -0.204820f, -0.203437f, -0.200391f, -0.193986f, -0.185403f, -0.176781f, -0.167901f, -0.158151f, -0.148852f, -0.140977f, -0.133478f, -0.125631f, -0.118126f, -0.111133f, -0.104255f, -0.098270f, -0.094045f, -0.090471f, -0.086049f, -0.081094f, -0.076093f, -0.069893f, -0.061614f, -0.052313f, -0.043250f, -0.034722f, -0.027423f, -0.022573f, -0.020398f, -0.020777f, -0.024856f, -0.033392f, + -0.044257f, -0.054140f, -0.061819f, -0.067591f, -0.070708f, -0.069377f, -0.062218f, -0.048572f, -0.028734f, -0.004500f, 0.022107f, 0.050743f, 0.081816f, 0.114155f, 0.145494f, 0.174558f, 0.201036f, 0.224549f, 0.245211f, 0.263919f, 0.280758f, 0.294514f, 0.304706f, 0.312583f, 0.319626f, 0.326612f, 0.334080f, 0.341832f, 0.348235f, 0.351861f, 0.353358f, 0.354260f, 0.354991f, 0.355418f, 0.355888f, 0.356297f, 0.355581f, 0.353292f, 0.350219f, 0.346812f, 0.342664f, 0.337795f, 0.332648f, 0.326745f, 0.319058f, 0.309473f, 0.298401f, 0.285643f, 0.271046f, 0.255382f, 0.239371f, 0.222910f, 0.206045f, 0.189388f, 0.173090f, 0.156857f, 0.141104f, 0.126636f, 0.113452f, 0.101318f, 0.090789f, 0.082249f, 0.074992f, 0.068538f, 0.063491f, 0.060061f, 0.057439f, 0.055455f, 0.054981f, 0.056161f, 0.058110f, 0.060472f, 0.063342f, 0.066055f, 0.067915f, 0.069371f, 0.070847f, 0.071784f, 0.072212f, 0.073343f, 0.075403f, 0.077120f, 0.078098f, 0.079147f, 0.080031f, 0.079753f, 0.078802f, 0.078270f, 0.077725f, 0.076661f, 0.076178f, 0.076704f, 0.076726f, 0.075852f, 0.075519f, 0.075400f, + 0.073798f, 0.071864f, 0.071587f, 0.070807f, 0.067455f, 0.065540f, 0.067863f, 0.068385f, 0.063450f, 0.062038f, 0.069276f, 0.071356f, 0.058960f, 0.053379f, 0.078818f, 0.116438f, 0.121889f, 0.088110f, 0.054333f, 0.047493f, 0.050192f, 0.038198f, 0.017981f, 0.009829f, 0.016479f, 0.025304f, 0.026670f, 0.017667f, -0.001131f, -0.024314f, -0.047086f, -0.077035f, -0.126851f, -0.184821f, -0.205141f, -0.150219f, -0.045456f, 0.033147f, 0.045118f, 0.036078f, 0.066884f, 0.116177f, 0.121086f, 0.109949f, 0.190572f, 0.356239f, 0.408472f, 0.186052f} + }, + { + {0.005237f, 0.021703f, 0.045977f, 0.071806f, 0.092952f, 0.081260f, -0.003190f, -0.145310f, -0.275966f, -0.362527f, -0.395227f, -0.264156f, 0.150047f, 0.651732f, 0.736748f, 0.178493f, -0.546265f, -0.726461f, -0.253335f, 0.307326f, 0.460253f, 0.280757f, 0.110658f, 0.068622f, 0.044595f, -0.021458f, -0.074721f, -0.084225f, -0.083528f, -0.089857f, -0.082326f, -0.054179f, -0.024468f, -0.003872f, 0.012161f, 0.024961f, 0.032523f, 0.038120f, 0.043734f, 0.045226f, 0.042031f, 0.040072f, 0.040964f, 0.039871f, 0.035748f, 0.033014f, 0.032973f, 0.032945f, 0.032894f, 0.035106f, 0.038930f, 0.041809f, 0.043292f, 0.043813f, 0.042340f, 0.038269f, 0.032751f, 0.026426f, 0.018771f, 0.010266f, 0.002197f, -0.005598f, -0.014102f, -0.022944f, -0.031212f, -0.039210f, -0.047434f, -0.055236f, -0.062092f, -0.068591f, -0.075131f, -0.081310f, -0.087184f, -0.093424f, -0.099923f, -0.105783f, -0.110523f, -0.114008f, -0.115743f, -0.115455f, -0.113562f, -0.110039f, -0.103812f, -0.094238f, -0.082140f, -0.068646f, -0.053906f, -0.037508f, -0.019400f, -0.000138f, 0.019150f, 0.037116f, 0.052952f, 0.066525f, 0.077559f, 0.085419f, + 0.090024f, 0.092137f, 0.092407f, 0.090931f, 0.088051f, 0.084846f, 0.082459f, 0.081306f, 0.081002f, 0.080874f, 0.080752f, 0.081399f, 0.083837f, 0.088256f, 0.093970f, 0.100339f, 0.107259f, 0.114966f, 0.123841f, 0.134136f, 0.145461f, 0.156869f, 0.167780f, 0.178468f, 0.189584f, 0.201647f, 0.214894f, 0.228991f, 0.243006f, 0.256233f, 0.268833f, 0.281258f, 0.293527f, 0.305381f, 0.316502f, 0.326245f, 0.333893f, 0.339409f, 0.343323f, 0.345920f, 0.347256f, 0.347629f, 0.347192f, 0.345526f, 0.342384f, 0.338359f, 0.334213f, 0.330257f, 0.326814f, 0.324352f, 0.322779f, 0.321501f, 0.320285f, 0.319177f, 0.317892f, 0.316244f, 0.314676f, 0.313474f, 0.312258f, 0.310891f, 0.309761f, 0.308650f, 0.306736f, 0.303971f, 0.300919f, 0.297365f, 0.292823f, 0.287889f, 0.283309f, 0.278653f, 0.273613f, 0.269123f, 0.265633f, 0.262210f, 0.258582f, 0.255670f, 0.253312f, 0.250271f, 0.246652f, 0.243183f, 0.238876f, 0.232859f, 0.226812f, 0.222000f, 0.216739f, 0.210266f, 0.204891f, 0.201099f, 0.196094f, 0.189759f, 0.185117f, 0.181542f, 0.175943f, 0.170100f, 0.166931f, 0.162845f, + 0.155378f, 0.150889f, 0.151178f, 0.145769f, 0.133595f, 0.131101f, 0.138699f, 0.131114f, 0.107876f, 0.107399f, 0.131831f, 0.121095f, 0.065160f, 0.067368f, 0.195312f, 0.334380f, 0.321328f, 0.179544f, 0.074250f, 0.062451f, 0.055156f, 0.024988f, 0.064983f, 0.195879f, 0.284344f, 0.231376f, 0.110090f, 0.037519f, 0.019981f, -0.000182f, -0.041027f, -0.092433f, -0.145801f, -0.157474f, -0.070642f, 0.074676f, 0.146071f, 0.088851f, 0.000113f, -0.023302f, -0.011566f, -0.029134f, -0.060776f, -0.081612f, -0.140841f, -0.254957f, -0.296521f, -0.136956f}, + {-0.005237f, -0.021703f, -0.045977f, -0.071806f, -0.092952f, -0.081260f, 0.003190f, 0.145310f, 0.275966f, 0.362527f, 0.395227f, 0.264156f, -0.150047f, -0.651732f, -0.736748f, -0.178493f, 0.546265f, 0.726461f, 0.253335f, -0.307326f, -0.460253f, -0.280757f, -0.110658f, -0.068622f, -0.044595f, 0.021458f, 0.074721f, 0.084225f, 0.083528f, 0.089857f, 0.082326f, 0.054179f, 0.024468f, 0.003872f, -0.012161f, -0.024961f, -0.032523f, -0.038120f, -0.043734f, -0.045226f, -0.042031f, -0.040072f, -0.040964f, -0.039871f, -0.035748f, -0.033014f, -0.032973f, -0.032945f, -0.032894f, -0.035106f, -0.038930f, -0.041809f, -0.043292f, -0.043813f, -0.042340f, -0.038269f, -0.032751f, -0.026426f, -0.018771f, -0.010266f, -0.002197f, 0.005598f, 0.014102f, 0.022944f, 0.031212f, 0.039210f, 0.047434f, 0.055236f, 0.062092f, 0.068591f, 0.075131f, 0.081310f, 0.087184f, 0.093424f, 0.099923f, 0.105783f, 0.110523f, 0.114008f, 0.115743f, 0.115455f, 0.113562f, 0.110039f, 0.103812f, 0.094238f, 0.082140f, 0.068646f, 0.053906f, 0.037508f, 0.019400f, 0.000138f, -0.019150f, -0.037116f, -0.052952f, -0.066525f, -0.077559f, -0.085419f, + -0.090024f, -0.092137f, -0.092407f, -0.090931f, -0.088051f, -0.084846f, -0.082459f, -0.081306f, -0.081002f, -0.080874f, -0.080752f, -0.081399f, -0.083837f, -0.088256f, -0.093970f, -0.100339f, -0.107259f, -0.114966f, -0.123841f, -0.134136f, -0.145461f, -0.156869f, -0.167780f, -0.178468f, -0.189584f, -0.201647f, -0.214894f, -0.228991f, -0.243006f, -0.256233f, -0.268833f, -0.281258f, -0.293527f, -0.305381f, -0.316502f, -0.326245f, -0.333893f, -0.339409f, -0.343323f, -0.345920f, -0.347256f, -0.347629f, -0.347192f, -0.345526f, -0.342384f, -0.338359f, -0.334213f, -0.330257f, -0.326814f, -0.324352f, -0.322779f, -0.321501f, -0.320285f, -0.319177f, -0.317892f, -0.316244f, -0.314676f, -0.313474f, -0.312258f, -0.310891f, -0.309761f, -0.308650f, -0.306736f, -0.303971f, -0.300919f, -0.297365f, -0.292823f, -0.287889f, -0.283309f, -0.278653f, -0.273613f, -0.269123f, -0.265633f, -0.262210f, -0.258582f, -0.255670f, -0.253312f, -0.250271f, -0.246652f, -0.243183f, -0.238876f, -0.232859f, -0.226812f, -0.222000f, -0.216739f, -0.210266f, -0.204891f, -0.201099f, -0.196094f, -0.189759f, -0.185117f, -0.181542f, -0.175943f, -0.170100f, -0.166931f, -0.162845f, + -0.155378f, -0.150889f, -0.151178f, -0.145769f, -0.133595f, -0.131101f, -0.138699f, -0.131114f, -0.107876f, -0.107399f, -0.131831f, -0.121095f, -0.065160f, -0.067368f, -0.195312f, -0.334380f, -0.321328f, -0.179544f, -0.074250f, -0.062451f, -0.055156f, -0.024988f, -0.064983f, -0.195879f, -0.284344f, -0.231376f, -0.110090f, -0.037519f, -0.019981f, 0.000182f, 0.041027f, 0.092433f, 0.145801f, 0.157474f, 0.070642f, -0.074676f, -0.146071f, -0.088851f, -0.000113f, 0.023302f, 0.011566f, 0.029134f, 0.060776f, 0.081612f, 0.140841f, 0.254957f, 0.296521f, 0.136956f} + }, + { + {0.003290f, 0.004457f, -0.005528f, -0.024503f, -0.040658f, -0.025318f, 0.044206f, 0.129212f, 0.134877f, 0.022060f, -0.113425f, -0.138652f, -0.048257f, 0.038579f, 0.043176f, 0.010064f, 0.006812f, 0.021760f, 0.008859f, -0.024480f, -0.035157f, -0.018780f, -0.010069f, -0.021483f, -0.027992f, -0.012071f, 0.011813f, 0.022917f, 0.019094f, 0.008846f, -0.003933f, -0.019076f, -0.033862f, -0.044037f, -0.047229f, -0.043365f, -0.034518f, -0.024371f, -0.015194f, -0.005790f, 0.005807f, 0.018765f, 0.030239f, 0.038382f, 0.043045f, 0.044775f, 0.044750f, 0.045028f, 0.047510f, 0.052757f, 0.060176f, 0.068888f, 0.078026f, 0.086682f, 0.094135f, 0.100148f, 0.104865f, 0.108434f, 0.110857f, 0.112171f, 0.112552f, 0.112064f, 0.110518f, 0.107865f, 0.104605f, 0.101407f, 0.098467f, 0.095713f, 0.093491f, 0.092393f, 0.092459f, 0.093229f, 0.094672f, 0.097391f, 0.101744f, 0.107363f, 0.113784f, 0.120958f, 0.128800f, 0.136599f, 0.143271f, 0.148034f, 0.150614f, 0.150845f, 0.148141f, 0.141385f, 0.129494f, 0.112216f, 0.090156f, 0.063735f, 0.032399f, -0.004651f, -0.046969f, -0.092530f, -0.138942f, -0.184556f, + -0.228255f, -0.268567f, -0.303451f, -0.331114f, -0.351060f, -0.364229f, -0.371919f, -0.374505f, -0.371598f, -0.363669f, -0.353079f, -0.342887f, -0.334569f, -0.327154f, -0.318566f, -0.307656f, -0.295101f, -0.282663f, -0.271630f, -0.261889f, -0.252419f, -0.242495f, -0.232267f, -0.222371f, -0.213326f, -0.205197f, -0.197481f, -0.189342f, -0.180196f, -0.170060f, -0.159249f, -0.147949f, -0.136227f, -0.124196f, -0.111996f, -0.099831f, -0.088089f, -0.077140f, -0.066975f, -0.057295f, -0.047872f, -0.038650f, -0.029694f, -0.021309f, -0.013879f, -0.007297f, -0.000899f, 0.005873f, 0.013174f, 0.021158f, 0.029939f, 0.039052f, 0.047778f, 0.056179f, 0.065084f, 0.075097f, 0.086363f, 0.099143f, 0.113686f, 0.129646f, 0.146404f, 0.163684f, 0.181241f, 0.198487f, 0.214981f, 0.230647f, 0.245100f, 0.257590f, 0.267839f, 0.275939f, 0.281514f, 0.284182f, 0.284595f, 0.283723f, 0.281609f, 0.278146f, 0.274139f, 0.270221f, 0.265944f, 0.261144f, 0.256555f, 0.252147f, 0.247009f, 0.241520f, 0.236982f, 0.232888f, 0.227759f, 0.222258f, 0.217750f, 0.212978f, 0.206361f, 0.199432f, 0.193539f, 0.186770f, 0.178678f, 0.172413f, + 0.167586f, 0.159508f, 0.149897f, 0.145822f, 0.143645f, 0.132268f, 0.117259f, 0.115520f, 0.119222f, 0.102510f, 0.076298f, 0.083698f, 0.113656f, 0.084809f, -0.030790f, -0.132140f, -0.115897f, -0.025563f, 0.020739f, 0.007588f, 0.010784f, 0.033761f, -0.006155f, -0.114325f, -0.177032f, -0.130405f, -0.055807f, -0.044287f, -0.066534f, -0.052950f, -0.016133f, -0.003723f, 0.004837f, 0.055791f, 0.115431f, 0.104274f, 0.022364f, -0.044182f, -0.042903f, -0.010534f, 0.000271f, -0.011501f, -0.020234f, -0.019218f, -0.016156f, -0.012286f, -0.006242f, -0.001442f}, + {-0.003290f, -0.004457f, 0.005528f, 0.024503f, 0.040658f, 0.025318f, -0.044206f, -0.129212f, -0.134877f, -0.022060f, 0.113425f, 0.138652f, 0.048257f, -0.038579f, -0.043176f, -0.010064f, -0.006812f, -0.021760f, -0.008859f, 0.024480f, 0.035157f, 0.018780f, 0.010069f, 0.021483f, 0.027992f, 0.012071f, -0.011813f, -0.022917f, -0.019094f, -0.008846f, 0.003933f, 0.019076f, 0.033862f, 0.044037f, 0.047229f, 0.043365f, 0.034518f, 0.024371f, 0.015194f, 0.005790f, -0.005807f, -0.018765f, -0.030239f, -0.038382f, -0.043045f, -0.044775f, -0.044750f, -0.045028f, -0.047510f, -0.052757f, -0.060176f, -0.068888f, -0.078026f, -0.086682f, -0.094135f, -0.100148f, -0.104865f, -0.108434f, -0.110857f, -0.112171f, -0.112552f, -0.112064f, -0.110518f, -0.107865f, -0.104605f, -0.101407f, -0.098467f, -0.095713f, -0.093491f, -0.092393f, -0.092459f, -0.093229f, -0.094672f, -0.097391f, -0.101744f, -0.107363f, -0.113784f, -0.120958f, -0.128800f, -0.136599f, -0.143271f, -0.148034f, -0.150614f, -0.150845f, -0.148141f, -0.141385f, -0.129494f, -0.112216f, -0.090156f, -0.063735f, -0.032399f, 0.004651f, 0.046969f, 0.092530f, 0.138942f, 0.184556f, + 0.228255f, 0.268567f, 0.303451f, 0.331114f, 0.351060f, 0.364229f, 0.371919f, 0.374505f, 0.371598f, 0.363669f, 0.353079f, 0.342887f, 0.334569f, 0.327154f, 0.318566f, 0.307656f, 0.295101f, 0.282663f, 0.271630f, 0.261889f, 0.252419f, 0.242495f, 0.232267f, 0.222371f, 0.213326f, 0.205197f, 0.197481f, 0.189342f, 0.180196f, 0.170060f, 0.159249f, 0.147949f, 0.136227f, 0.124196f, 0.111996f, 0.099831f, 0.088089f, 0.077140f, 0.066975f, 0.057295f, 0.047872f, 0.038650f, 0.029694f, 0.021309f, 0.013879f, 0.007297f, 0.000899f, -0.005873f, -0.013174f, -0.021158f, -0.029939f, -0.039052f, -0.047778f, -0.056179f, -0.065084f, -0.075097f, -0.086363f, -0.099143f, -0.113686f, -0.129646f, -0.146404f, -0.163684f, -0.181241f, -0.198487f, -0.214981f, -0.230647f, -0.245100f, -0.257590f, -0.267839f, -0.275939f, -0.281514f, -0.284182f, -0.284595f, -0.283723f, -0.281609f, -0.278146f, -0.274139f, -0.270221f, -0.265944f, -0.261144f, -0.256555f, -0.252147f, -0.247009f, -0.241520f, -0.236982f, -0.232888f, -0.227759f, -0.222258f, -0.217750f, -0.212978f, -0.206361f, -0.199432f, -0.193539f, -0.186770f, -0.178678f, -0.172413f, + -0.167586f, -0.159508f, -0.149897f, -0.145822f, -0.143645f, -0.132268f, -0.117259f, -0.115520f, -0.119222f, -0.102510f, -0.076298f, -0.083698f, -0.113656f, -0.084809f, 0.030790f, 0.132140f, 0.115897f, 0.025563f, -0.020739f, -0.007588f, -0.010784f, -0.033761f, 0.006155f, 0.114325f, 0.177032f, 0.130405f, 0.055807f, 0.044287f, 0.066534f, 0.052950f, 0.016133f, 0.003723f, -0.004837f, -0.055791f, -0.115431f, -0.104274f, -0.022364f, 0.044182f, 0.042903f, 0.010534f, -0.000271f, 0.011501f, 0.020234f, 0.019218f, 0.016156f, 0.012286f, 0.006242f, 0.001442f} + }, + { + {0.011164f, 0.032836f, 0.036645f, 0.010266f, -0.002453f, 0.048984f, 0.112171f, 0.055369f, -0.161208f, -0.386598f, -0.393418f, -0.096523f, 0.327126f, 0.541470f, 0.342730f, -0.107176f, -0.401047f, -0.302387f, 0.016123f, 0.212089f, 0.167723f, 0.036742f, -0.030253f, -0.044201f, -0.062205f, -0.067661f, -0.027021f, 0.029533f, 0.052252f, 0.045066f, 0.045409f, 0.066031f, 0.094060f, 0.121955f, 0.148648f, 0.165808f, 0.164983f, 0.149562f, 0.128033f, 0.103839f, 0.078146f, 0.053697f, 0.031162f, 0.008320f, -0.015066f, -0.036973f, -0.057449f, -0.078140f, -0.098645f, -0.117711f, -0.136293f, -0.155534f, -0.173582f, -0.187426f, -0.195978f, -0.199282f, -0.197030f, -0.189763f, -0.179374f, -0.166925f, -0.151599f, -0.132527f, -0.109872f, -0.083662f, -0.053273f, -0.018574f, 0.019487f, 0.059494f, 0.099905f, 0.139081f, 0.175756f, 0.209103f, 0.237873f, 0.260210f, 0.274934f, 0.282259f, 0.282639f, 0.275632f, 0.260647f, 0.238307f, 0.210293f, 0.177967f, 0.141703f, 0.101603f, 0.058418f, 0.013424f, -0.032487f, -0.079182f, -0.126657f, -0.174435f, -0.221816f, -0.268160f, -0.312343f, -0.352314f, -0.385884f, -0.411766f, + -0.429215f, -0.436998f, -0.433649f, -0.418961f, -0.394679f, -0.363490f, -0.327514f, -0.287649f, -0.244197f, -0.198315f, -0.152926f, -0.111682f, -0.076694f, -0.047638f, -0.023186f, -0.002688f, 0.013718f, 0.025795f, 0.033396f, 0.036453f, 0.035301f, 0.030767f, 0.023826f, 0.015431f, 0.006538f, -0.002356f, -0.011778f, -0.022870f, -0.036327f, -0.051958f, -0.068973f, -0.086308f, -0.103002f, -0.118765f, -0.133990f, -0.148972f, -0.163394f, -0.176630f, -0.188097f, -0.197282f, -0.203969f, -0.208402f, -0.210775f, -0.210752f, -0.207996f, -0.202785f, -0.195626f, -0.186736f, -0.176426f, -0.165358f, -0.153969f, -0.142280f, -0.130641f, -0.119870f, -0.110421f, -0.102206f, -0.095291f, -0.089829f, -0.085360f, -0.081117f, -0.076882f, -0.072735f, -0.068397f, -0.063649f, -0.058777f, -0.053866f, -0.048414f, -0.042214f, -0.035732f, -0.029221f, -0.022534f, -0.015932f, -0.009843f, -0.003888f, 0.002599f, 0.009436f, 0.016248f, 0.023570f, 0.031998f, 0.041152f, 0.050592f, 0.060497f, 0.070490f, 0.079404f, 0.086950f, 0.093796f, 0.099686f, 0.103660f, 0.106051f, 0.107861f, 0.108670f, 0.107687f, 0.105806f, 0.104009f, 0.101428f, 0.097536f, + 0.093765f, 0.090589f, 0.086306f, 0.080851f, 0.076442f, 0.072650f, 0.066432f, 0.058555f, 0.053047f, 0.048898f, 0.040819f, 0.029903f, 0.023605f, 0.022728f, 0.019228f, 0.010531f, 0.005076f, 0.008678f, 0.015334f, 0.017655f, 0.018434f, 0.024584f, 0.033609f, 0.033286f, 0.017113f, -0.002988f, -0.006746f, 0.008393f, 0.021799f, 0.020507f, 0.021478f, 0.041101f, 0.054308f, 0.019430f, -0.054565f, -0.102615f, -0.079454f, -0.013054f, 0.033272f, 0.030133f, -0.000759f, -0.021432f, -0.017817f, -0.013999f, -0.044719f, -0.101574f, -0.121223f, -0.055701f}, + {-0.011164f, -0.032836f, -0.036645f, -0.010266f, 0.002453f, -0.048984f, -0.112171f, -0.055369f, 0.161208f, 0.386598f, 0.393418f, 0.096523f, -0.327126f, -0.541470f, -0.342730f, 0.107176f, 0.401047f, 0.302387f, -0.016123f, -0.212089f, -0.167723f, -0.036742f, 0.030253f, 0.044201f, 0.062205f, 0.067661f, 0.027021f, -0.029533f, -0.052252f, -0.045066f, -0.045409f, -0.066031f, -0.094060f, -0.121955f, -0.148648f, -0.165808f, -0.164983f, -0.149562f, -0.128033f, -0.103839f, -0.078146f, -0.053697f, -0.031162f, -0.008320f, 0.015066f, 0.036973f, 0.057449f, 0.078140f, 0.098645f, 0.117711f, 0.136293f, 0.155534f, 0.173582f, 0.187426f, 0.195978f, 0.199282f, 0.197030f, 0.189763f, 0.179374f, 0.166925f, 0.151599f, 0.132527f, 0.109872f, 0.083662f, 0.053273f, 0.018574f, -0.019487f, -0.059494f, -0.099905f, -0.139081f, -0.175756f, -0.209103f, -0.237873f, -0.260210f, -0.274934f, -0.282259f, -0.282639f, -0.275632f, -0.260647f, -0.238307f, -0.210293f, -0.177967f, -0.141703f, -0.101603f, -0.058418f, -0.013424f, 0.032487f, 0.079182f, 0.126657f, 0.174435f, 0.221816f, 0.268160f, 0.312343f, 0.352314f, 0.385884f, 0.411766f, + 0.429215f, 0.436998f, 0.433649f, 0.418961f, 0.394679f, 0.363490f, 0.327514f, 0.287649f, 0.244197f, 0.198315f, 0.152926f, 0.111682f, 0.076694f, 0.047638f, 0.023186f, 0.002688f, -0.013718f, -0.025795f, -0.033396f, -0.036453f, -0.035301f, -0.030767f, -0.023826f, -0.015431f, -0.006538f, 0.002356f, 0.011778f, 0.022870f, 0.036327f, 0.051958f, 0.068973f, 0.086308f, 0.103002f, 0.118765f, 0.133990f, 0.148972f, 0.163394f, 0.176630f, 0.188097f, 0.197282f, 0.203969f, 0.208402f, 0.210775f, 0.210752f, 0.207996f, 0.202785f, 0.195626f, 0.186736f, 0.176426f, 0.165358f, 0.153969f, 0.142280f, 0.130641f, 0.119870f, 0.110421f, 0.102206f, 0.095291f, 0.089829f, 0.085360f, 0.081117f, 0.076882f, 0.072735f, 0.068397f, 0.063649f, 0.058777f, 0.053866f, 0.048414f, 0.042214f, 0.035732f, 0.029221f, 0.022534f, 0.015932f, 0.009843f, 0.003888f, -0.002599f, -0.009436f, -0.016248f, -0.023570f, -0.031998f, -0.041152f, -0.050592f, -0.060497f, -0.070490f, -0.079404f, -0.086950f, -0.093796f, -0.099686f, -0.103660f, -0.106051f, -0.107861f, -0.108670f, -0.107687f, -0.105806f, -0.104009f, -0.101428f, -0.097536f, + -0.093765f, -0.090589f, -0.086306f, -0.080851f, -0.076442f, -0.072650f, -0.066432f, -0.058555f, -0.053047f, -0.048898f, -0.040819f, -0.029903f, -0.023605f, -0.022728f, -0.019228f, -0.010531f, -0.005076f, -0.008678f, -0.015334f, -0.017655f, -0.018434f, -0.024584f, -0.033609f, -0.033286f, -0.017113f, 0.002988f, 0.006746f, -0.008393f, -0.021799f, -0.020507f, -0.021478f, -0.041101f, -0.054308f, -0.019430f, 0.054565f, 0.102615f, 0.079454f, 0.013054f, -0.033272f, -0.030133f, 0.000759f, 0.021432f, 0.017817f, 0.013999f, 0.044719f, 0.101574f, 0.121223f, 0.055701f} + }, + { + {-0.000057f, 0.004618f, 0.017682f, 0.031128f, 0.031889f, 0.012604f, -0.024428f, -0.067381f, -0.092044f, -0.068699f, 0.006663f, 0.086585f, 0.103494f, 0.041969f, -0.038554f, -0.069591f, -0.044517f, -0.004822f, 0.023300f, 0.046137f, 0.066610f, 0.069547f, 0.049468f, 0.024226f, 0.008422f, -0.007184f, -0.037346f, -0.077238f, -0.107144f, -0.113458f, -0.096785f, -0.066490f, -0.035038f, -0.013153f, -0.003730f, -0.000878f, 0.003116f, 0.011034f, 0.020563f, 0.027847f, 0.030544f, 0.029277f, 0.026700f, 0.024711f, 0.023212f, 0.021560f, 0.019500f, 0.016290f, 0.010748f, 0.002681f, -0.007062f, -0.017978f, -0.030113f, -0.043238f, -0.056960f, -0.071085f, -0.084942f, -0.097195f, -0.106968f, -0.114229f, -0.118841f, -0.120501f, -0.119614f, -0.116789f, -0.111677f, -0.103680f, -0.093172f, -0.080489f, -0.064566f, -0.044178f, -0.019643f, 0.008060f, 0.038626f, 0.071500f, 0.104878f, 0.136913f, 0.166805f, 0.193866f, 0.216842f, 0.234966f, 0.248504f, 0.257609f, 0.261575f, 0.259590f, 0.251591f, 0.238272f, 0.220487f, 0.198276f, 0.170561f, 0.136698f, 0.098189f, 0.057682f, 0.016496f, -0.025495f, -0.067816f, -0.108621f, + -0.145658f, -0.176870f, -0.200772f, -0.217529f, -0.228950f, -0.236396f, -0.239262f, -0.236051f, -0.226084f, -0.210128f, -0.190544f, -0.170619f, -0.152249f, -0.134448f, -0.115361f, -0.095074f, -0.075354f, -0.057740f, -0.043170f, -0.032135f, -0.023928f, -0.016976f, -0.010829f, -0.006589f, -0.005154f, -0.006616f, -0.011291f, -0.019411f, -0.030043f, -0.042074f, -0.055747f, -0.071687f, -0.089493f, -0.108727f, -0.129821f, -0.152682f, -0.176004f, -0.198998f, -0.221985f, -0.244760f, -0.266417f, -0.286912f, -0.306659f, -0.324871f, -0.340388f, -0.353362f, -0.364168f, -0.372020f, -0.376464f, -0.378404f, -0.378114f, -0.374521f, -0.367666f, -0.359313f, -0.350349f, -0.340361f, -0.329902f, -0.320119f, -0.310406f, -0.299314f, -0.286923f, -0.273822f, -0.259542f, -0.244326f, -0.229980f, -0.217077f, -0.204279f, -0.191540f, -0.180261f, -0.169869f, -0.158554f, -0.147117f, -0.137572f, -0.129135f, -0.120174f, -0.111850f, -0.105358f, -0.098801f, -0.090788f, -0.082858f, -0.075269f, -0.065930f, -0.055595f, -0.047479f, -0.040967f, -0.033205f, -0.025890f, -0.022124f, -0.019442f, -0.014783f, -0.011252f, -0.011244f, -0.010626f, -0.007763f, -0.007496f, -0.009654f, + -0.008162f, -0.005566f, -0.009317f, -0.013253f, -0.007832f, -0.004274f, -0.015488f, -0.023533f, -0.010153f, -0.002382f, -0.027502f, -0.045274f, -0.009521f, 0.021910f, -0.048635f, -0.183515f, -0.228104f, -0.131244f, -0.015609f, 0.018983f, 0.026755f, 0.075115f, 0.100455f, 0.016691f, -0.118628f, -0.165113f, -0.084096f, 0.032836f, 0.098202f, 0.116964f, 0.144314f, 0.200805f, 0.235092f, 0.168366f, -0.003252f, -0.162099f, -0.176037f, -0.055350f, 0.054849f, 0.051827f, -0.015974f, -0.043441f, -0.012571f, 0.007826f, -0.027403f, -0.083452f, -0.095889f, -0.042074f}, + {-0.000057f, 0.004618f, 0.017682f, 0.031128f, 0.031889f, 0.012604f, -0.024428f, -0.067381f, -0.092044f, -0.068699f, 0.006663f, 0.086585f, 0.103494f, 0.041969f, -0.038554f, -0.069591f, -0.044517f, -0.004822f, 0.023300f, 0.046137f, 0.066610f, 0.069547f, 0.049468f, 0.024226f, 0.008422f, -0.007184f, -0.037346f, -0.077238f, -0.107144f, -0.113458f, -0.096785f, -0.066490f, -0.035038f, -0.013153f, -0.003730f, -0.000878f, 0.003116f, 0.011034f, 0.020563f, 0.027847f, 0.030544f, 0.029277f, 0.026700f, 0.024711f, 0.023212f, 0.021560f, 0.019500f, 0.016290f, 0.010748f, 0.002681f, -0.007062f, -0.017978f, -0.030113f, -0.043238f, -0.056960f, -0.071085f, -0.084942f, -0.097195f, -0.106968f, -0.114229f, -0.118841f, -0.120501f, -0.119614f, -0.116789f, -0.111677f, -0.103680f, -0.093172f, -0.080489f, -0.064566f, -0.044178f, -0.019643f, 0.008060f, 0.038626f, 0.071500f, 0.104878f, 0.136913f, 0.166805f, 0.193866f, 0.216842f, 0.234966f, 0.248504f, 0.257609f, 0.261575f, 0.259590f, 0.251591f, 0.238272f, 0.220487f, 0.198276f, 0.170561f, 0.136698f, 0.098189f, 0.057682f, 0.016496f, -0.025495f, -0.067816f, -0.108621f, + -0.145658f, -0.176870f, -0.200772f, -0.217529f, -0.228950f, -0.236396f, -0.239262f, -0.236051f, -0.226084f, -0.210128f, -0.190544f, -0.170619f, -0.152249f, -0.134448f, -0.115361f, -0.095074f, -0.075354f, -0.057740f, -0.043170f, -0.032135f, -0.023928f, -0.016976f, -0.010829f, -0.006589f, -0.005154f, -0.006616f, -0.011291f, -0.019411f, -0.030043f, -0.042074f, -0.055747f, -0.071687f, -0.089493f, -0.108727f, -0.129821f, -0.152682f, -0.176004f, -0.198998f, -0.221985f, -0.244760f, -0.266417f, -0.286912f, -0.306659f, -0.324871f, -0.340388f, -0.353362f, -0.364168f, -0.372020f, -0.376464f, -0.378404f, -0.378114f, -0.374521f, -0.367666f, -0.359313f, -0.350349f, -0.340361f, -0.329902f, -0.320119f, -0.310406f, -0.299314f, -0.286923f, -0.273822f, -0.259542f, -0.244326f, -0.229980f, -0.217077f, -0.204279f, -0.191540f, -0.180261f, -0.169869f, -0.158554f, -0.147117f, -0.137572f, -0.129135f, -0.120174f, -0.111850f, -0.105358f, -0.098801f, -0.090788f, -0.082858f, -0.075269f, -0.065930f, -0.055595f, -0.047479f, -0.040967f, -0.033205f, -0.025890f, -0.022124f, -0.019442f, -0.014783f, -0.011252f, -0.011244f, -0.010626f, -0.007763f, -0.007496f, -0.009654f, + -0.008162f, -0.005566f, -0.009317f, -0.013253f, -0.007832f, -0.004274f, -0.015488f, -0.023533f, -0.010153f, -0.002382f, -0.027502f, -0.045274f, -0.009521f, 0.021910f, -0.048635f, -0.183515f, -0.228104f, -0.131244f, -0.015609f, 0.018983f, 0.026755f, 0.075115f, 0.100455f, 0.016691f, -0.118628f, -0.165113f, -0.084096f, 0.032836f, 0.098202f, 0.116964f, 0.144314f, 0.200805f, 0.235092f, 0.168366f, -0.003252f, -0.162099f, -0.176037f, -0.055350f, 0.054849f, 0.051827f, -0.015974f, -0.043441f, -0.012571f, 0.007826f, -0.027403f, -0.083452f, -0.095889f, -0.042074f} + }, + { + {0.003286f, 0.020663f, 0.047015f, 0.053514f, 0.027668f, -0.018005f, -0.074845f, -0.129718f, -0.133764f, -0.040778f, 0.107952f, 0.192417f, 0.138911f, 0.002813f, -0.096900f, -0.097211f, -0.027296f, 0.041753f, 0.055973f, 0.009638f, -0.053234f, -0.074730f, -0.036276f, 0.028003f, 0.073968f, 0.088912f, 0.085590f, 0.075178f, 0.060843f, 0.045753f, 0.031933f, 0.015643f, -0.006543f, -0.030509f, -0.049634f, -0.063067f, -0.073747f, -0.081798f, -0.084797f, -0.082534f, -0.077869f, -0.073890f, -0.072300f, -0.073599f, -0.077378f, -0.082705f, -0.088483f, -0.093078f, -0.094258f, -0.090539f, -0.082362f, -0.071359f, -0.059106f, -0.047102f, -0.036931f, -0.029407f, -0.023973f, -0.019544f, -0.015494f, -0.011431f, -0.006598f, 0.000010f, 0.009248f, 0.021699f, 0.037488f, 0.055980f, 0.076003f, 0.096419f, 0.116146f, 0.133812f, 0.148176f, 0.159051f, 0.167129f, 0.172618f, 0.174876f, 0.173820f, 0.170796f, 0.167101f, 0.162315f, 0.155354f, 0.146888f, 0.139280f, 0.133952f, 0.130225f, 0.127363f, 0.126470f, 0.129155f, 0.134873f, 0.140780f, 0.144329f, 0.145336f, 0.145342f, 0.145533f, 0.145667f, 0.144745f, 0.142112f, + 0.137732f, 0.131877f, 0.125120f, 0.118473f, 0.112800f, 0.107738f, 0.101543f, 0.092388f, 0.079744f, 0.064329f, 0.046886f, 0.027329f, 0.005126f, -0.019726f, -0.046309f, -0.073397f, -0.100300f, -0.127038f, -0.153757f, -0.180066f, -0.204868f, -0.226760f, -0.244721f, -0.258627f, -0.269120f, -0.276888f, -0.282007f, -0.283898f, -0.281834f, -0.275598f, -0.265873f, -0.254057f, -0.241477f, -0.228516f, -0.214415f, -0.197989f, -0.178738f, -0.157442f, -0.135714f, -0.114934f, -0.095604f, -0.077515f, -0.060115f, -0.042690f, -0.024757f, -0.006617f, 0.010792f, 0.026792f, 0.041319f, 0.054297f, 0.065248f, 0.073855f, 0.080421f, 0.085476f, 0.089337f, 0.092227f, 0.094391f, 0.095900f, 0.096594f, 0.096231f, 0.094555f, 0.091499f, 0.087561f, 0.083596f, 0.080064f, 0.076942f, 0.074384f, 0.072705f, 0.071678f, 0.070768f, 0.070120f, 0.070423f, 0.071853f, 0.074033f, 0.076789f, 0.079999f, 0.083058f, 0.085305f, 0.086394f, 0.085686f, 0.082340f, 0.076614f, 0.069777f, 0.062351f, 0.054034f, 0.045374f, 0.037457f, 0.030035f, 0.022223f, 0.014513f, 0.007727f, 0.001194f, -0.005463f, -0.010784f, -0.014329f, -0.017958f, + -0.021688f, -0.022941f, -0.022426f, -0.024089f, -0.026735f, -0.025120f, -0.021928f, -0.025401f, -0.031768f, -0.028507f, -0.020527f, -0.027990f, -0.046743f, -0.042080f, -0.003396f, 0.027264f, 0.013170f, -0.020073f, -0.025760f, -0.008495f, -0.005552f, -0.014133f, 0.003435f, 0.044906f, 0.059066f, 0.024448f, -0.015911f, -0.021124f, -0.009130f, -0.017009f, -0.041372f, -0.056366f, -0.066541f, -0.097055f, -0.137463f, -0.138780f, -0.079675f, -0.003607f, 0.033428f, 0.030812f, 0.028961f, 0.041471f, 0.044399f, 0.035401f, 0.052169f, 0.103505f, 0.125865f, 0.058885f}, + {0.003286f, 0.020663f, 0.047015f, 0.053514f, 0.027668f, -0.018005f, -0.074845f, -0.129718f, -0.133764f, -0.040778f, 0.107952f, 0.192417f, 0.138911f, 0.002813f, -0.096900f, -0.097211f, -0.027296f, 0.041753f, 0.055973f, 0.009638f, -0.053234f, -0.074730f, -0.036276f, 0.028003f, 0.073968f, 0.088912f, 0.085590f, 0.075178f, 0.060843f, 0.045753f, 0.031933f, 0.015643f, -0.006543f, -0.030509f, -0.049634f, -0.063067f, -0.073747f, -0.081798f, -0.084797f, -0.082534f, -0.077869f, -0.073890f, -0.072300f, -0.073599f, -0.077378f, -0.082705f, -0.088483f, -0.093078f, -0.094258f, -0.090539f, -0.082362f, -0.071359f, -0.059106f, -0.047102f, -0.036931f, -0.029407f, -0.023973f, -0.019544f, -0.015494f, -0.011431f, -0.006598f, 0.000010f, 0.009248f, 0.021699f, 0.037488f, 0.055980f, 0.076003f, 0.096419f, 0.116146f, 0.133812f, 0.148176f, 0.159051f, 0.167129f, 0.172618f, 0.174876f, 0.173820f, 0.170796f, 0.167101f, 0.162315f, 0.155354f, 0.146888f, 0.139280f, 0.133952f, 0.130225f, 0.127363f, 0.126470f, 0.129155f, 0.134873f, 0.140780f, 0.144329f, 0.145336f, 0.145342f, 0.145533f, 0.145667f, 0.144745f, 0.142112f, + 0.137732f, 0.131877f, 0.125120f, 0.118473f, 0.112800f, 0.107738f, 0.101543f, 0.092388f, 0.079744f, 0.064329f, 0.046886f, 0.027329f, 0.005126f, -0.019726f, -0.046309f, -0.073397f, -0.100300f, -0.127038f, -0.153757f, -0.180066f, -0.204868f, -0.226760f, -0.244721f, -0.258627f, -0.269120f, -0.276888f, -0.282007f, -0.283898f, -0.281834f, -0.275598f, -0.265873f, -0.254057f, -0.241477f, -0.228516f, -0.214415f, -0.197989f, -0.178738f, -0.157442f, -0.135714f, -0.114934f, -0.095604f, -0.077515f, -0.060115f, -0.042690f, -0.024757f, -0.006617f, 0.010792f, 0.026792f, 0.041319f, 0.054297f, 0.065248f, 0.073855f, 0.080421f, 0.085476f, 0.089337f, 0.092227f, 0.094391f, 0.095900f, 0.096594f, 0.096231f, 0.094555f, 0.091499f, 0.087561f, 0.083596f, 0.080064f, 0.076942f, 0.074384f, 0.072705f, 0.071678f, 0.070768f, 0.070120f, 0.070423f, 0.071853f, 0.074033f, 0.076789f, 0.079999f, 0.083058f, 0.085305f, 0.086394f, 0.085686f, 0.082340f, 0.076614f, 0.069777f, 0.062351f, 0.054034f, 0.045374f, 0.037457f, 0.030035f, 0.022223f, 0.014513f, 0.007727f, 0.001194f, -0.005463f, -0.010784f, -0.014329f, -0.017958f, + -0.021688f, -0.022941f, -0.022426f, -0.024089f, -0.026735f, -0.025120f, -0.021928f, -0.025401f, -0.031768f, -0.028507f, -0.020527f, -0.027990f, -0.046743f, -0.042080f, -0.003396f, 0.027264f, 0.013170f, -0.020073f, -0.025760f, -0.008495f, -0.005552f, -0.014133f, 0.003435f, 0.044906f, 0.059066f, 0.024448f, -0.015911f, -0.021124f, -0.009130f, -0.017009f, -0.041372f, -0.056366f, -0.066541f, -0.097055f, -0.137463f, -0.138780f, -0.079675f, -0.003607f, 0.033428f, 0.030812f, 0.028961f, 0.041471f, 0.044399f, 0.035401f, 0.052169f, 0.103505f, 0.125865f, 0.058885f} + }, + { + {-0.008208f, -0.013688f, -0.006252f, -0.003509f, -0.000109f, 0.028292f, 0.061055f, 0.024138f, -0.104438f, -0.212259f, -0.151442f, 0.066373f, 0.240645f, 0.196077f, -0.011619f, -0.162771f, -0.129256f, 0.005131f, 0.087028f, 0.080806f, 0.064102f, 0.086674f, 0.110230f, 0.085283f, 0.023202f, -0.032808f, -0.069022f, -0.103127f, -0.145227f, -0.184194f, -0.205940f, -0.206303f, -0.187706f, -0.155585f, -0.118331f, -0.083351f, -0.052728f, -0.025564f, -0.002289f, 0.015831f, 0.028630f, 0.036097f, 0.037847f, 0.035268f, 0.032049f, 0.031340f, 0.033967f, 0.039715f, 0.048284f, 0.058597f, 0.068960f, 0.078321f, 0.086272f, 0.091981f, 0.094350f, 0.093104f, 0.088896f, 0.082572f, 0.074997f, 0.067252f, 0.060472f, 0.055558f, 0.053169f, 0.053701f, 0.057297f, 0.064029f, 0.073926f, 0.086744f, 0.102064f, 0.119670f, 0.139384f, 0.160516f, 0.181938f, 0.202628f, 0.221700f, 0.238171f, 0.251219f, 0.260419f, 0.265483f, 0.266392f, 0.264039f, 0.259842f, 0.254367f, 0.247216f, 0.238440f, 0.228874f, 0.218946f, 0.208612f, 0.198629f, 0.190002f, 0.181465f, 0.169225f, 0.150296f, 0.124983f, 0.095177f, 0.061211f, + 0.021451f, -0.025424f, -0.078440f, -0.134573f, -0.190595f, -0.244573f, -0.295574f, -0.342341f, -0.383017f, -0.416353f, -0.442566f, -0.462633f, -0.476956f, -0.484792f, -0.484883f, -0.476795f, -0.461886f, -0.442644f, -0.420810f, -0.396369f, -0.368491f, -0.337007f, -0.302883f, -0.267801f, -0.233394f, -0.200316f, -0.167839f, -0.134651f, -0.100107f, -0.064503f, -0.028445f, 0.007706f, 0.044017f, 0.080865f, 0.118334f, 0.155669f, 0.191736f, 0.225992f, 0.258520f, 0.289333f, 0.318229f, 0.344969f, 0.368855f, 0.388566f, 0.403168f, 0.412970f, 0.418830f, 0.421249f, 0.420617f, 0.417464f, 0.411799f, 0.403018f, 0.391082f, 0.377094f, 0.362346f, 0.347502f, 0.332870f, 0.318542f, 0.303993f, 0.288174f, 0.270212f, 0.249812f, 0.227373f, 0.204002f, 0.180881f, 0.158425f, 0.136570f, 0.115633f, 0.095977f, 0.077237f, 0.059024f, 0.041966f, 0.026915f, 0.013775f, 0.002182f, -0.007580f, -0.015397f, -0.021975f, -0.027835f, -0.032904f, -0.037503f, -0.042152f, -0.046265f, -0.048885f, -0.050394f, -0.051562f, -0.051807f, -0.050532f, -0.048722f, -0.047061f, -0.044541f, -0.040961f, -0.037883f, -0.035465f, -0.032172f, -0.028676f, + -0.027034f, -0.025811f, -0.022482f, -0.019608f, -0.020221f, -0.019720f, -0.013487f, -0.008119f, -0.010233f, -0.010395f, 0.001311f, 0.010757f, -0.000943f, -0.017589f, -0.002503f, 0.044026f, 0.079204f, 0.078273f, 0.062973f, 0.057328f, 0.054722f, 0.047981f, 0.053572f, 0.079412f, 0.100675f, 0.095962f, 0.081490f, 0.082712f, 0.095429f, 0.100415f, 0.094405f, 0.081773f, 0.057784f, 0.027126f, 0.018211f, 0.048214f, 0.088778f, 0.097349f, 0.072951f, 0.051550f, 0.052834f, 0.062422f, 0.067011f, 0.076631f, 0.100316f, 0.119769f, 0.103439f, 0.041360f}, + {-0.008208f, -0.013688f, -0.006252f, -0.003509f, -0.000109f, 0.028292f, 0.061055f, 0.024138f, -0.104438f, -0.212259f, -0.151442f, 0.066373f, 0.240645f, 0.196077f, -0.011619f, -0.162771f, -0.129256f, 0.005131f, 0.087028f, 0.080806f, 0.064102f, 0.086674f, 0.110230f, 0.085283f, 0.023202f, -0.032808f, -0.069022f, -0.103127f, -0.145227f, -0.184194f, -0.205940f, -0.206303f, -0.187706f, -0.155585f, -0.118331f, -0.083351f, -0.052728f, -0.025564f, -0.002289f, 0.015831f, 0.028630f, 0.036097f, 0.037847f, 0.035268f, 0.032049f, 0.031340f, 0.033967f, 0.039715f, 0.048284f, 0.058597f, 0.068960f, 0.078321f, 0.086272f, 0.091981f, 0.094350f, 0.093104f, 0.088896f, 0.082572f, 0.074997f, 0.067252f, 0.060472f, 0.055558f, 0.053169f, 0.053701f, 0.057297f, 0.064029f, 0.073926f, 0.086744f, 0.102064f, 0.119670f, 0.139384f, 0.160516f, 0.181938f, 0.202628f, 0.221700f, 0.238171f, 0.251219f, 0.260419f, 0.265483f, 0.266392f, 0.264039f, 0.259842f, 0.254367f, 0.247216f, 0.238440f, 0.228874f, 0.218946f, 0.208612f, 0.198629f, 0.190002f, 0.181465f, 0.169225f, 0.150296f, 0.124983f, 0.095177f, 0.061211f, + 0.021451f, -0.025424f, -0.078440f, -0.134573f, -0.190595f, -0.244573f, -0.295574f, -0.342341f, -0.383017f, -0.416353f, -0.442566f, -0.462633f, -0.476956f, -0.484792f, -0.484883f, -0.476795f, -0.461886f, -0.442644f, -0.420810f, -0.396369f, -0.368491f, -0.337007f, -0.302883f, -0.267801f, -0.233394f, -0.200316f, -0.167839f, -0.134651f, -0.100107f, -0.064503f, -0.028445f, 0.007706f, 0.044017f, 0.080865f, 0.118334f, 0.155669f, 0.191736f, 0.225992f, 0.258520f, 0.289333f, 0.318229f, 0.344969f, 0.368855f, 0.388566f, 0.403168f, 0.412970f, 0.418830f, 0.421249f, 0.420617f, 0.417464f, 0.411799f, 0.403018f, 0.391082f, 0.377094f, 0.362346f, 0.347502f, 0.332870f, 0.318542f, 0.303993f, 0.288174f, 0.270212f, 0.249812f, 0.227373f, 0.204002f, 0.180881f, 0.158425f, 0.136570f, 0.115633f, 0.095977f, 0.077237f, 0.059024f, 0.041966f, 0.026915f, 0.013775f, 0.002182f, -0.007580f, -0.015397f, -0.021975f, -0.027835f, -0.032904f, -0.037503f, -0.042152f, -0.046265f, -0.048885f, -0.050394f, -0.051562f, -0.051807f, -0.050532f, -0.048722f, -0.047061f, -0.044541f, -0.040961f, -0.037883f, -0.035465f, -0.032172f, -0.028676f, + -0.027034f, -0.025811f, -0.022482f, -0.019608f, -0.020221f, -0.019720f, -0.013487f, -0.008119f, -0.010233f, -0.010395f, 0.001311f, 0.010757f, -0.000943f, -0.017589f, -0.002503f, 0.044026f, 0.079204f, 0.078273f, 0.062973f, 0.057328f, 0.054722f, 0.047981f, 0.053572f, 0.079412f, 0.100675f, 0.095962f, 0.081490f, 0.082712f, 0.095429f, 0.100415f, 0.094405f, 0.081773f, 0.057784f, 0.027126f, 0.018211f, 0.048214f, 0.088778f, 0.097349f, 0.072951f, 0.051550f, 0.052834f, 0.062422f, 0.067011f, 0.076631f, 0.100316f, 0.119769f, 0.103439f, 0.041360f} + }, + { + {0.000219f, 0.000300f, -0.000470f, -0.002728f, -0.006703f, -0.008428f, -0.000706f, 0.012589f, 0.007717f, -0.030161f, -0.063150f, -0.022389f, 0.092419f, 0.167025f, 0.089527f, -0.089858f, -0.186663f, -0.096473f, 0.078276f, 0.157986f, 0.092888f, -0.015711f, -0.064513f, -0.046259f, -0.006048f, 0.029868f, 0.057048f, 0.067711f, 0.054805f, 0.025907f, -0.004867f, -0.030693f, -0.050327f, -0.062834f, -0.070993f, -0.082208f, -0.100409f, -0.121588f, -0.139387f, -0.150407f, -0.153184f, -0.147055f, -0.133768f, -0.117152f, -0.100383f, -0.085266f, -0.073367f, -0.065601f, -0.061218f, -0.058786f, -0.057561f, -0.056982f, -0.055899f, -0.053334f, -0.049279f, -0.044299f, -0.039109f, -0.034702f, -0.031969f, -0.031001f, -0.031321f, -0.032558f, -0.034285f, -0.035576f, -0.035504f, -0.033868f, -0.030920f, -0.026684f, -0.021019f, -0.014048f, -0.006042f, 0.002921f, 0.012786f, 0.023091f, 0.033121f, 0.042601f, 0.051888f, 0.061215f, 0.070060f, 0.077878f, 0.085314f, 0.093797f, 0.103649f, 0.113550f, 0.122419f, 0.130931f, 0.140271f, 0.149926f, 0.157672f, 0.161652f, 0.161819f, 0.159329f, 0.155027f, 0.148727f, 0.139965f, 0.129315f, + 0.118619f, 0.109608f, 0.102489f, 0.096346f, 0.090816f, 0.087026f, 0.086861f, 0.091494f, 0.100455f, 0.111859f, 0.123631f, 0.134788f, 0.145673f, 0.157015f, 0.168875f, 0.180410f, 0.190453f, 0.198281f, 0.203996f, 0.208295f, 0.211928f, 0.215320f, 0.218485f, 0.221142f, 0.222973f, 0.223938f, 0.224257f, 0.223992f, 0.222832f, 0.220406f, 0.216624f, 0.211660f, 0.205873f, 0.199818f, 0.194086f, 0.189011f, 0.184682f, 0.181185f, 0.178623f, 0.176955f, 0.176031f, 0.175702f, 0.175731f, 0.175711f, 0.175153f, 0.173544f, 0.170305f, 0.164929f, 0.157174f, 0.146976f, 0.134373f, 0.119682f, 0.103470f, 0.086119f, 0.067710f, 0.048467f, 0.028881f, 0.009271f, -0.010260f, -0.029330f, -0.047315f, -0.063863f, -0.078855f, -0.091983f, -0.102963f, -0.111948f, -0.119186f, -0.124595f, -0.128116f, -0.130005f, -0.130481f, -0.129750f, -0.128536f, -0.127737f, -0.127523f, -0.127680f, -0.128531f, -0.130397f, -0.132664f, -0.134604f, -0.136451f, -0.138583f, -0.140708f, -0.142803f, -0.145415f, -0.148218f, -0.150086f, -0.150982f, -0.151526f, -0.150868f, -0.147786f, -0.143240f, -0.138700f, -0.133465f, -0.126931f, -0.120761f, + -0.115292f, -0.108172f, -0.099972f, -0.094325f, -0.089251f, -0.078635f, -0.065607f, -0.059298f, -0.054658f, -0.037602f, -0.015717f, -0.011967f, -0.016342f, 0.013157f, 0.076563f, 0.108377f, 0.069685f, 0.015195f, 0.011815f, 0.037173f, 0.033724f, 0.024026f, 0.075469f, 0.166990f, 0.196872f, 0.134676f, 0.067436f, 0.066393f, 0.096537f, 0.098834f, 0.080944f, 0.071627f, 0.053354f, 0.007270f, -0.023186f, 0.015389f, 0.096957f, 0.143102f, 0.126994f, 0.094569f, 0.086781f, 0.093942f, 0.095842f, 0.101364f, 0.124293f, 0.145641f, 0.126044f, 0.050604f}, + {0.000219f, 0.000300f, -0.000470f, -0.002728f, -0.006703f, -0.008428f, -0.000706f, 0.012589f, 0.007717f, -0.030161f, -0.063150f, -0.022389f, 0.092419f, 0.167025f, 0.089527f, -0.089858f, -0.186663f, -0.096473f, 0.078276f, 0.157986f, 0.092888f, -0.015711f, -0.064513f, -0.046259f, -0.006048f, 0.029868f, 0.057048f, 0.067711f, 0.054805f, 0.025907f, -0.004867f, -0.030693f, -0.050327f, -0.062834f, -0.070993f, -0.082208f, -0.100409f, -0.121588f, -0.139387f, -0.150407f, -0.153184f, -0.147055f, -0.133768f, -0.117152f, -0.100383f, -0.085266f, -0.073367f, -0.065601f, -0.061218f, -0.058786f, -0.057561f, -0.056982f, -0.055899f, -0.053334f, -0.049279f, -0.044299f, -0.039109f, -0.034702f, -0.031969f, -0.031001f, -0.031321f, -0.032558f, -0.034285f, -0.035576f, -0.035504f, -0.033868f, -0.030920f, -0.026684f, -0.021019f, -0.014048f, -0.006042f, 0.002921f, 0.012786f, 0.023091f, 0.033121f, 0.042601f, 0.051888f, 0.061215f, 0.070060f, 0.077878f, 0.085314f, 0.093797f, 0.103649f, 0.113550f, 0.122419f, 0.130931f, 0.140271f, 0.149926f, 0.157672f, 0.161652f, 0.161819f, 0.159329f, 0.155027f, 0.148727f, 0.139965f, 0.129315f, + 0.118619f, 0.109608f, 0.102489f, 0.096346f, 0.090816f, 0.087026f, 0.086861f, 0.091494f, 0.100455f, 0.111859f, 0.123631f, 0.134788f, 0.145673f, 0.157015f, 0.168875f, 0.180410f, 0.190453f, 0.198281f, 0.203996f, 0.208295f, 0.211928f, 0.215320f, 0.218485f, 0.221142f, 0.222973f, 0.223938f, 0.224257f, 0.223992f, 0.222832f, 0.220406f, 0.216624f, 0.211660f, 0.205873f, 0.199818f, 0.194086f, 0.189011f, 0.184682f, 0.181185f, 0.178623f, 0.176955f, 0.176031f, 0.175702f, 0.175731f, 0.175711f, 0.175153f, 0.173544f, 0.170305f, 0.164929f, 0.157174f, 0.146976f, 0.134373f, 0.119682f, 0.103470f, 0.086119f, 0.067710f, 0.048467f, 0.028881f, 0.009271f, -0.010260f, -0.029330f, -0.047315f, -0.063863f, -0.078855f, -0.091983f, -0.102963f, -0.111948f, -0.119186f, -0.124595f, -0.128116f, -0.130005f, -0.130481f, -0.129750f, -0.128536f, -0.127737f, -0.127523f, -0.127680f, -0.128531f, -0.130397f, -0.132664f, -0.134604f, -0.136451f, -0.138583f, -0.140708f, -0.142803f, -0.145415f, -0.148218f, -0.150086f, -0.150982f, -0.151526f, -0.150868f, -0.147786f, -0.143240f, -0.138700f, -0.133465f, -0.126931f, -0.120761f, + -0.115292f, -0.108172f, -0.099972f, -0.094325f, -0.089251f, -0.078635f, -0.065607f, -0.059298f, -0.054658f, -0.037602f, -0.015717f, -0.011967f, -0.016342f, 0.013157f, 0.076563f, 0.108377f, 0.069685f, 0.015195f, 0.011815f, 0.037173f, 0.033724f, 0.024026f, 0.075469f, 0.166990f, 0.196872f, 0.134676f, 0.067436f, 0.066393f, 0.096537f, 0.098834f, 0.080944f, 0.071627f, 0.053354f, 0.007270f, -0.023186f, 0.015389f, 0.096957f, 0.143102f, 0.126994f, 0.094569f, 0.086781f, 0.093942f, 0.095842f, 0.101364f, 0.124293f, 0.145641f, 0.126044f, 0.050604f} + } +}; +const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; + +/* Sample Rate = 32000 */ + +const int16_t CRendBin_HOA3_HRIR_max_num_iterations_32kHz = 1; +const uint16_t CRendBin_HOA3_HRIR_num_iterations_32kHz[16][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {0, 0}; +const uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[16][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}}; +const uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz = 0; +const float CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz[16]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f}; +const uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float CRendBin_HOA3_HRIR_coeff_re_32kHz[16][BINAURAL_CHANNELS][160]={ + { + {0.931532f, 0.779586f, 0.534806f, 0.267486f, 0.027500f, -0.161171f, -0.309658f, -0.450275f, -0.580679f, -0.647362f, -0.612734f, -0.489723f, -0.275668f, 0.054919f, 0.402480f, 0.495609f, 0.176032f, -0.298719f, -0.442377f, -0.084625f, 0.429064f, 0.650237f, 0.490213f, 0.176336f, -0.101893f, -0.334041f, -0.548421f, -0.712689f, -0.798336f, -0.833235f, -0.851109f, -0.849315f, -0.819587f, -0.775679f, -0.732168f, -0.686769f, -0.635729f, -0.584686f, -0.537641f, -0.491741f, -0.445951f, -0.402650f, -0.360980f, -0.318308f, -0.276103f, -0.236981f, -0.199525f, -0.161814f, -0.125607f, -0.092516f, -0.060704f, -0.028744f, 0.001865f, 0.030189f, 0.057418f, 0.083709f, 0.107616f, 0.129141f, 0.149647f, 0.169072f, 0.186505f, 0.202619f, 0.218604f, 0.233964f, 0.247817f, 0.260837f, 0.273890f, 0.286455f, 0.298003f, 0.309223f, 0.320684f, 0.331955f, 0.342805f, 0.353754f, 0.365034f, 0.376301f, 0.387457f, 0.398686f, 0.409965f, 0.421281f, 0.432717f, 0.443847f, 0.453997f, 0.463372f, 0.472714f, 0.481764f, 0.489489f, 0.495891f, 0.502022f, 0.508134f, 0.513263f, 0.516755f, 0.518993f, 0.520614f, 0.521907f, 0.522857f, + 0.523146f, 0.522523f, 0.521573f, 0.521473f, 0.522622f, 0.524278f, 0.525810f, 0.527544f, 0.530160f, 0.534008f, 0.539089f, 0.545026f, 0.551103f, 0.556966f, 0.563115f, 0.570181f, 0.578053f, 0.586133f, 0.593998f, 0.601393f, 0.608145f, 0.614471f, 0.620875f, 0.627436f, 0.633702f, 0.639394f, 0.644645f, 0.649553f, 0.654100f, 0.658455f, 0.662756f, 0.666713f, 0.669967f, 0.672628f, 0.675002f, 0.677150f, 0.679153f, 0.681355f, 0.683893f, 0.686498f, 0.689096f, 0.692014f, 0.695373f, 0.699038f, 0.703324f, 0.708802f, 0.715349f, 0.722435f, 0.730226f, 0.739134f, 0.748704f, 0.758497f, 0.769323f, 0.781691f, 0.794631f, 0.808625f, 0.825667f, 0.839224f, 0.827293f, 0.769028f, 0.673613f, 0.581351f, 0.526749f, 0.508903f}, + {0.931532f, 0.779586f, 0.534806f, 0.267486f, 0.027500f, -0.161171f, -0.309658f, -0.450275f, -0.580679f, -0.647362f, -0.612734f, -0.489723f, -0.275668f, 0.054919f, 0.402480f, 0.495609f, 0.176032f, -0.298719f, -0.442377f, -0.084625f, 0.429064f, 0.650237f, 0.490213f, 0.176336f, -0.101893f, -0.334041f, -0.548421f, -0.712689f, -0.798336f, -0.833235f, -0.851109f, -0.849315f, -0.819587f, -0.775679f, -0.732168f, -0.686769f, -0.635729f, -0.584686f, -0.537641f, -0.491741f, -0.445951f, -0.402650f, -0.360980f, -0.318308f, -0.276103f, -0.236981f, -0.199525f, -0.161814f, -0.125607f, -0.092516f, -0.060704f, -0.028744f, 0.001865f, 0.030189f, 0.057418f, 0.083709f, 0.107616f, 0.129141f, 0.149647f, 0.169072f, 0.186505f, 0.202619f, 0.218604f, 0.233964f, 0.247817f, 0.260837f, 0.273890f, 0.286455f, 0.298003f, 0.309223f, 0.320684f, 0.331955f, 0.342805f, 0.353754f, 0.365034f, 0.376301f, 0.387457f, 0.398686f, 0.409965f, 0.421281f, 0.432717f, 0.443847f, 0.453997f, 0.463372f, 0.472714f, 0.481764f, 0.489489f, 0.495891f, 0.502022f, 0.508134f, 0.513263f, 0.516755f, 0.518993f, 0.520614f, 0.521907f, 0.522857f, + 0.523146f, 0.522523f, 0.521573f, 0.521473f, 0.522622f, 0.524278f, 0.525810f, 0.527544f, 0.530160f, 0.534008f, 0.539089f, 0.545026f, 0.551103f, 0.556966f, 0.563115f, 0.570181f, 0.578053f, 0.586133f, 0.593998f, 0.601393f, 0.608145f, 0.614471f, 0.620875f, 0.627436f, 0.633702f, 0.639394f, 0.644645f, 0.649553f, 0.654100f, 0.658455f, 0.662756f, 0.666713f, 0.669967f, 0.672628f, 0.675002f, 0.677150f, 0.679153f, 0.681355f, 0.683893f, 0.686498f, 0.689096f, 0.692014f, 0.695373f, 0.699038f, 0.703324f, 0.708802f, 0.715349f, 0.722435f, 0.730226f, 0.739134f, 0.748704f, 0.758497f, 0.769323f, 0.781691f, 0.794631f, 0.808625f, 0.825667f, 0.839224f, 0.827293f, 0.769028f, 0.673613f, 0.581351f, 0.526749f, 0.508903f} + }, + { + {0.025824f, 0.254482f, 0.612140f, 0.908281f, 0.966338f, 0.746349f, 0.326804f, -0.189774f, -0.683810f, -1.011094f, -1.110601f, -1.050792f, -0.841050f, -0.331373f, 0.453002f, 0.990359f, 0.684451f, -0.303752f, -1.023046f, -0.756945f, 0.181886f, 0.916524f, 1.017605f, 0.742230f, 0.451730f, 0.204139f, -0.066098f, -0.311503f, -0.457293f, -0.536699f, -0.617322f, -0.694602f, -0.735639f, -0.751680f, -0.768963f, -0.782765f, -0.780489f, -0.769523f, -0.757459f, -0.737198f, -0.705559f, -0.670342f, -0.633558f, -0.589942f, -0.541742f, -0.495987f, -0.451106f, -0.402147f, -0.352739f, -0.308813f, -0.268274f, -0.227132f, -0.187240f, -0.150381f, -0.113561f, -0.075466f, -0.039106f, -0.005245f, 0.028554f, 0.061642f, 0.090951f, 0.117114f, 0.142717f, 0.166563f, 0.186151f, 0.202842f, 0.218927f, 0.233139f, 0.243777f, 0.252381f, 0.260617f, 0.267492f, 0.272370f, 0.276920f, 0.282318f, 0.288000f, 0.293924f, 0.300949f, 0.309137f, 0.318235f, 0.328763f, 0.340586f, 0.352257f, 0.363455f, 0.375587f, 0.388768f, 0.401116f, 0.411976f, 0.422808f, 0.434307f, 0.445690f, 0.457064f, 0.469628f, 0.483664f, 0.498780f, 0.515481f, + 0.534276f, 0.554263f, 0.574434f, 0.595002f, 0.615889f, 0.635594f, 0.652882f, 0.667922f, 0.680882f, 0.691118f, 0.698246f, 0.702348f, 0.703094f, 0.700394f, 0.695668f, 0.690852f, 0.686570f, 0.682549f, 0.678880f, 0.675687f, 0.672709f, 0.670365f, 0.669993f, 0.672124f, 0.675718f, 0.679580f, 0.683205f, 0.686101f, 0.687934f, 0.689429f, 0.691608f, 0.694284f, 0.696649f, 0.698823f, 0.701383f, 0.704096f, 0.706544f, 0.709152f, 0.712317f, 0.715522f, 0.718443f, 0.721714f, 0.725654f, 0.729661f, 0.733628f, 0.738335f, 0.743905f, 0.749740f, 0.756281f, 0.764683f, 0.774778f, 0.785838f, 0.798756f, 0.814520f, 0.832066f, 0.851590f, 0.875921f, 0.899332f, 0.897448f, 0.844156f, 0.745650f, 0.645128f, 0.582813f, 0.561026f}, + {-0.025824f, -0.254482f, -0.612140f, -0.908281f, -0.966338f, -0.746349f, -0.326804f, 0.189774f, 0.683810f, 1.011094f, 1.110601f, 1.050792f, 0.841050f, 0.331373f, -0.453002f, -0.990359f, -0.684451f, 0.303752f, 1.023046f, 0.756945f, -0.181886f, -0.916524f, -1.017605f, -0.742230f, -0.451730f, -0.204139f, 0.066098f, 0.311503f, 0.457293f, 0.536699f, 0.617322f, 0.694602f, 0.735639f, 0.751680f, 0.768963f, 0.782765f, 0.780489f, 0.769523f, 0.757459f, 0.737198f, 0.705559f, 0.670342f, 0.633558f, 0.589942f, 0.541742f, 0.495987f, 0.451106f, 0.402147f, 0.352739f, 0.308813f, 0.268274f, 0.227132f, 0.187240f, 0.150381f, 0.113561f, 0.075466f, 0.039106f, 0.005245f, -0.028554f, -0.061642f, -0.090951f, -0.117114f, -0.142717f, -0.166563f, -0.186151f, -0.202842f, -0.218927f, -0.233139f, -0.243777f, -0.252381f, -0.260617f, -0.267492f, -0.272370f, -0.276920f, -0.282318f, -0.288000f, -0.293924f, -0.300949f, -0.309137f, -0.318235f, -0.328763f, -0.340586f, -0.352257f, -0.363455f, -0.375587f, -0.388768f, -0.401116f, -0.411976f, -0.422808f, -0.434307f, -0.445690f, -0.457064f, -0.469628f, -0.483664f, -0.498780f, -0.515481f, + -0.534276f, -0.554263f, -0.574434f, -0.595002f, -0.615889f, -0.635594f, -0.652882f, -0.667922f, -0.680882f, -0.691118f, -0.698246f, -0.702348f, -0.703094f, -0.700394f, -0.695668f, -0.690852f, -0.686570f, -0.682549f, -0.678880f, -0.675687f, -0.672709f, -0.670365f, -0.669993f, -0.672124f, -0.675718f, -0.679580f, -0.683205f, -0.686101f, -0.687934f, -0.689429f, -0.691608f, -0.694284f, -0.696649f, -0.698823f, -0.701383f, -0.704096f, -0.706544f, -0.709152f, -0.712317f, -0.715522f, -0.718443f, -0.721714f, -0.725654f, -0.729661f, -0.733628f, -0.738335f, -0.743905f, -0.749740f, -0.756281f, -0.764683f, -0.774778f, -0.785838f, -0.798756f, -0.814520f, -0.832066f, -0.851590f, -0.875921f, -0.899332f, -0.897448f, -0.844156f, -0.745650f, -0.645128f, -0.582813f, -0.561026f} + }, + { + {0.119957f, 0.117962f, 0.069212f, -0.029675f, -0.108741f, -0.102118f, -0.023931f, 0.056050f, 0.088085f, 0.070763f, 0.023879f, -0.033299f, -0.074494f, -0.065471f, 0.002786f, 0.081205f, 0.092077f, 0.015549f, -0.067599f, -0.053344f, 0.064674f, 0.183481f, 0.206152f, 0.135803f, 0.042639f, -0.024752f, -0.066208f, -0.094901f, -0.114472f, -0.127164f, -0.137723f, -0.145267f, -0.144666f, -0.136342f, -0.126255f, -0.118741f, -0.116220f, -0.122116f, -0.137393f, -0.157052f, -0.174865f, -0.189037f, -0.200404f, -0.208724f, -0.213653f, -0.216386f, -0.217918f, -0.217629f, -0.214601f, -0.208243f, -0.197216f, -0.179855f, -0.155904f, -0.126242f, -0.091188f, -0.050638f, -0.005448f, 0.042864f, 0.093516f, 0.146388f, 0.200914f, 0.256043f, 0.311008f, 0.365277f, 0.417798f, 0.466855f, 0.510693f, 0.547948f, 0.577466f, 0.598067f, 0.608767f, 0.609124f, 0.599179f, 0.579326f, 0.550670f, 0.515166f, 0.474707f, 0.430356f, 0.383305f, 0.336114f, 0.291535f, 0.250182f, 0.211022f, 0.174404f, 0.142783f, 0.117629f, 0.097265f, 0.079103f, 0.063058f, 0.051346f, 0.045393f, 0.044197f, 0.045733f, 0.048982f, 0.054235f, 0.062014f, + 0.072137f, 0.083617f, 0.095036f, 0.105002f, 0.112583f, 0.117569f, 0.120284f, 0.120922f, 0.118935f, 0.113194f, 0.102993f, 0.088978f, 0.072927f, 0.056475f, 0.040135f, 0.023595f, 0.006691f, -0.010161f, -0.026205f, -0.040628f, -0.052638f, -0.061602f, -0.067163f, -0.069194f, -0.067764f, -0.063204f, -0.056002f, -0.046549f, -0.035172f, -0.022453f, -0.009246f, 0.003678f, 0.015836f, 0.026957f, 0.036871f, 0.045370f, 0.052074f, 0.056677f, 0.059467f, 0.061374f, 0.063445f, 0.066522f, 0.071251f, 0.077736f, 0.085143f, 0.092280f, 0.098682f, 0.104606f, 0.110061f, 0.114592f, 0.117985f, 0.120397f, 0.121682f, 0.121377f, 0.119567f, 0.116933f, 0.113144f, 0.105492f, 0.090436f, 0.067892f, 0.043890f, 0.027049f, 0.020974f, 0.021165f}, + {0.119957f, 0.117962f, 0.069212f, -0.029675f, -0.108741f, -0.102118f, -0.023931f, 0.056050f, 0.088085f, 0.070763f, 0.023879f, -0.033299f, -0.074494f, -0.065471f, 0.002786f, 0.081205f, 0.092077f, 0.015549f, -0.067599f, -0.053344f, 0.064674f, 0.183481f, 0.206152f, 0.135803f, 0.042639f, -0.024752f, -0.066208f, -0.094901f, -0.114472f, -0.127164f, -0.137723f, -0.145267f, -0.144666f, -0.136342f, -0.126255f, -0.118741f, -0.116220f, -0.122116f, -0.137393f, -0.157052f, -0.174865f, -0.189037f, -0.200404f, -0.208724f, -0.213653f, -0.216386f, -0.217918f, -0.217629f, -0.214601f, -0.208243f, -0.197216f, -0.179855f, -0.155904f, -0.126242f, -0.091188f, -0.050638f, -0.005448f, 0.042864f, 0.093516f, 0.146388f, 0.200914f, 0.256043f, 0.311008f, 0.365277f, 0.417798f, 0.466855f, 0.510693f, 0.547948f, 0.577466f, 0.598067f, 0.608767f, 0.609124f, 0.599179f, 0.579326f, 0.550670f, 0.515166f, 0.474707f, 0.430356f, 0.383305f, 0.336114f, 0.291535f, 0.250182f, 0.211022f, 0.174404f, 0.142783f, 0.117629f, 0.097265f, 0.079103f, 0.063058f, 0.051346f, 0.045393f, 0.044197f, 0.045733f, 0.048982f, 0.054235f, 0.062014f, + 0.072137f, 0.083617f, 0.095036f, 0.105002f, 0.112583f, 0.117569f, 0.120284f, 0.120922f, 0.118935f, 0.113194f, 0.102993f, 0.088978f, 0.072927f, 0.056475f, 0.040135f, 0.023595f, 0.006691f, -0.010161f, -0.026205f, -0.040628f, -0.052638f, -0.061602f, -0.067163f, -0.069194f, -0.067764f, -0.063204f, -0.056002f, -0.046549f, -0.035172f, -0.022453f, -0.009246f, 0.003678f, 0.015836f, 0.026957f, 0.036871f, 0.045370f, 0.052074f, 0.056677f, 0.059467f, 0.061374f, 0.063445f, 0.066522f, 0.071251f, 0.077736f, 0.085143f, 0.092280f, 0.098682f, 0.104606f, 0.110061f, 0.114592f, 0.117985f, 0.120397f, 0.121682f, 0.121377f, 0.119567f, 0.116933f, 0.113144f, 0.105492f, 0.090436f, 0.067892f, 0.043890f, 0.027049f, 0.020974f, 0.021165f} + }, + { + {0.021954f, 0.048037f, 0.063092f, 0.031017f, -0.037723f, -0.084868f, -0.065201f, -0.005112f, 0.022895f, -0.015083f, -0.084921f, -0.142665f, -0.175582f, -0.165991f, -0.077530f, 0.064116f, 0.128907f, 0.015662f, -0.183455f, -0.248246f, -0.082450f, 0.177565f, 0.335035f, 0.337341f, 0.262762f, 0.175451f, 0.072571f, -0.054887f, -0.185560f, -0.298815f, -0.396893f, -0.485261f, -0.557320f, -0.605394f, -0.629649f, -0.632272f, -0.614250f, -0.579369f, -0.533822f, -0.482010f, -0.426968f, -0.372237f, -0.319708f, -0.268539f, -0.218575f, -0.171634f, -0.128178f, -0.086363f, -0.045502f, -0.007338f, 0.026484f, 0.055319f, 0.078139f, 0.094220f, 0.105266f, 0.114621f, 0.124529f, 0.135582f, 0.147984f, 0.161659f, 0.175672f, 0.188906f, 0.201046f, 0.212265f, 0.222531f, 0.231889f, 0.240937f, 0.250378f, 0.260180f, 0.269567f, 0.277872f, 0.285061f, 0.291048f, 0.294821f, 0.295039f, 0.291430f, 0.284567f, 0.274225f, 0.259431f, 0.240476f, 0.219205f, 0.196639f, 0.172071f, 0.145449f, 0.118875f, 0.094409f, 0.071829f, 0.049916f, 0.028662f, 0.008634f, -0.010832f, -0.031148f, -0.052563f, -0.074059f, -0.094995f, -0.115796f, + -0.136840f, -0.157354f, -0.175731f, -0.190760f, -0.202356f, -0.211001f, -0.216517f, -0.217735f, -0.213675f, -0.204779f, -0.192568f, -0.178136f, -0.161391f, -0.141749f, -0.119310f, -0.095356f, -0.071835f, -0.050142f, -0.030092f, -0.010201f, 0.010750f, 0.032456f, 0.053367f, 0.071957f, 0.087636f, 0.100966f, 0.113346f, 0.126179f, 0.139929f, 0.154026f, 0.167726f, 0.180816f, 0.193572f, 0.206537f, 0.220447f, 0.235905f, 0.252915f, 0.270947f, 0.289388f, 0.307739f, 0.325599f, 0.342846f, 0.359653f, 0.376064f, 0.391737f, 0.406191f, 0.418988f, 0.429712f, 0.438219f, 0.444820f, 0.449911f, 0.453835f, 0.457284f, 0.461020f, 0.465212f, 0.470429f, 0.478257f, 0.486742f, 0.485064f, 0.459936f, 0.412181f, 0.361516f, 0.328482f, 0.316016f}, + {0.021954f, 0.048037f, 0.063092f, 0.031017f, -0.037723f, -0.084868f, -0.065201f, -0.005112f, 0.022895f, -0.015083f, -0.084921f, -0.142665f, -0.175582f, -0.165991f, -0.077530f, 0.064116f, 0.128907f, 0.015662f, -0.183455f, -0.248246f, -0.082450f, 0.177565f, 0.335035f, 0.337341f, 0.262762f, 0.175451f, 0.072571f, -0.054887f, -0.185560f, -0.298815f, -0.396893f, -0.485261f, -0.557320f, -0.605394f, -0.629649f, -0.632272f, -0.614250f, -0.579369f, -0.533822f, -0.482010f, -0.426968f, -0.372237f, -0.319708f, -0.268539f, -0.218575f, -0.171634f, -0.128178f, -0.086363f, -0.045502f, -0.007338f, 0.026484f, 0.055319f, 0.078139f, 0.094220f, 0.105266f, 0.114621f, 0.124529f, 0.135582f, 0.147984f, 0.161659f, 0.175672f, 0.188906f, 0.201046f, 0.212265f, 0.222531f, 0.231889f, 0.240937f, 0.250378f, 0.260180f, 0.269567f, 0.277872f, 0.285061f, 0.291048f, 0.294821f, 0.295039f, 0.291430f, 0.284567f, 0.274225f, 0.259431f, 0.240476f, 0.219205f, 0.196639f, 0.172071f, 0.145449f, 0.118875f, 0.094409f, 0.071829f, 0.049916f, 0.028662f, 0.008634f, -0.010832f, -0.031148f, -0.052563f, -0.074059f, -0.094995f, -0.115796f, + -0.136840f, -0.157354f, -0.175731f, -0.190760f, -0.202356f, -0.211001f, -0.216517f, -0.217735f, -0.213675f, -0.204779f, -0.192568f, -0.178136f, -0.161391f, -0.141749f, -0.119310f, -0.095356f, -0.071835f, -0.050142f, -0.030092f, -0.010201f, 0.010750f, 0.032456f, 0.053367f, 0.071957f, 0.087636f, 0.100966f, 0.113346f, 0.126179f, 0.139929f, 0.154026f, 0.167726f, 0.180816f, 0.193572f, 0.206537f, 0.220447f, 0.235905f, 0.252915f, 0.270947f, 0.289388f, 0.307739f, 0.325599f, 0.342846f, 0.359653f, 0.376064f, 0.391737f, 0.406191f, 0.418988f, 0.429712f, 0.438219f, 0.444820f, 0.449911f, 0.453835f, 0.457284f, 0.461020f, 0.465212f, 0.470429f, 0.478257f, 0.486742f, 0.485064f, 0.459936f, 0.412181f, 0.361516f, 0.328482f, 0.316016f} + }, + { + {-0.007503f, -0.018071f, -0.022034f, -0.007019f, 0.015663f, 0.024279f, 0.019856f, 0.028228f, 0.059265f, 0.080034f, 0.041688f, -0.071985f, -0.216288f, -0.290455f, -0.199084f, 0.033503f, 0.219776f, 0.164507f, -0.103621f, -0.326326f, -0.288993f, -0.041795f, 0.199504f, 0.304980f, 0.304814f, 0.264038f, 0.192066f, 0.083050f, -0.037289f, -0.139466f, -0.222831f, -0.297054f, -0.358635f, -0.401608f, -0.430419f, -0.449077f, -0.451590f, -0.432074f, -0.394694f, -0.348591f, -0.300496f, -0.254823f, -0.214532f, -0.179585f, -0.148147f, -0.119436f, -0.093021f, -0.067108f, -0.040394f, -0.014078f, 0.010038f, 0.031708f, 0.051075f, 0.067427f, 0.080619f, 0.092054f, 0.103201f, 0.114496f, 0.126191f, 0.138824f, 0.152470f, 0.166746f, 0.181664f, 0.197385f, 0.213306f, 0.228573f, 0.243329f, 0.258289f, 0.273266f, 0.287270f, 0.300006f, 0.312023f, 0.323208f, 0.332273f, 0.338187f, 0.341130f, 0.341345f, 0.337872f, 0.329576f, 0.317081f, 0.302379f, 0.286336f, 0.267902f, 0.246477f, 0.223744f, 0.201743f, 0.179892f, 0.155773f, 0.128766f, 0.101142f, 0.075145f, 0.050682f, 0.026716f, 0.003617f, -0.017003f, -0.034092f, + -0.047931f, -0.059456f, -0.069308f, -0.077317f, -0.082784f, -0.085477f, -0.086182f, -0.086000f, -0.085634f, -0.085723f, -0.087061f, -0.089692f, -0.092489f, -0.094395f, -0.095590f, -0.096974f, -0.099214f, -0.102553f, -0.106591f, -0.109940f, -0.111114f, -0.110117f, -0.108385f, -0.107202f, -0.106996f, -0.107734f, -0.108885f, -0.109325f, -0.108294f, -0.106062f, -0.102988f, -0.098685f, -0.092663f, -0.084794f, -0.074707f, -0.061933f, -0.047004f, -0.031245f, -0.015438f, 0.000083f, 0.014483f, 0.027034f, 0.038033f, 0.047706f, 0.055152f, 0.059661f, 0.061803f, 0.062109f, 0.060454f, 0.057667f, 0.055600f, 0.054965f, 0.055463f, 0.057980f, 0.063846f, 0.072975f, 0.086512f, 0.108858f, 0.140638f, 0.171127f, 0.185558f, 0.180720f, 0.167370f, 0.157904f}, + {0.007503f, 0.018071f, 0.022034f, 0.007019f, -0.015663f, -0.024279f, -0.019856f, -0.028228f, -0.059265f, -0.080034f, -0.041688f, 0.071985f, 0.216288f, 0.290455f, 0.199084f, -0.033503f, -0.219776f, -0.164507f, 0.103621f, 0.326326f, 0.288993f, 0.041795f, -0.199504f, -0.304980f, -0.304814f, -0.264038f, -0.192066f, -0.083050f, 0.037289f, 0.139466f, 0.222831f, 0.297054f, 0.358635f, 0.401608f, 0.430419f, 0.449077f, 0.451590f, 0.432074f, 0.394694f, 0.348591f, 0.300496f, 0.254823f, 0.214532f, 0.179585f, 0.148147f, 0.119436f, 0.093021f, 0.067108f, 0.040394f, 0.014078f, -0.010038f, -0.031708f, -0.051075f, -0.067427f, -0.080619f, -0.092054f, -0.103201f, -0.114496f, -0.126191f, -0.138824f, -0.152470f, -0.166746f, -0.181664f, -0.197385f, -0.213306f, -0.228573f, -0.243329f, -0.258289f, -0.273266f, -0.287270f, -0.300006f, -0.312023f, -0.323208f, -0.332273f, -0.338187f, -0.341130f, -0.341345f, -0.337872f, -0.329576f, -0.317081f, -0.302379f, -0.286336f, -0.267902f, -0.246477f, -0.223744f, -0.201743f, -0.179892f, -0.155773f, -0.128766f, -0.101142f, -0.075145f, -0.050682f, -0.026716f, -0.003617f, 0.017003f, 0.034092f, + 0.047931f, 0.059456f, 0.069308f, 0.077317f, 0.082784f, 0.085477f, 0.086182f, 0.086000f, 0.085634f, 0.085723f, 0.087061f, 0.089692f, 0.092489f, 0.094395f, 0.095590f, 0.096974f, 0.099214f, 0.102553f, 0.106591f, 0.109940f, 0.111114f, 0.110117f, 0.108385f, 0.107202f, 0.106996f, 0.107734f, 0.108885f, 0.109325f, 0.108294f, 0.106062f, 0.102988f, 0.098685f, 0.092663f, 0.084794f, 0.074707f, 0.061933f, 0.047004f, 0.031245f, 0.015438f, -0.000083f, -0.014483f, -0.027034f, -0.038033f, -0.047706f, -0.055152f, -0.059661f, -0.061803f, -0.062109f, -0.060454f, -0.057667f, -0.055600f, -0.054965f, -0.055463f, -0.057980f, -0.063846f, -0.072975f, -0.086512f, -0.108858f, -0.140638f, -0.171127f, -0.185558f, -0.180720f, -0.167370f, -0.157904f} + }, + { + {0.033462f, -0.011452f, -0.017620f, 0.032435f, 0.045854f, -0.028637f, -0.090702f, -0.014859f, 0.157822f, 0.248642f, 0.155687f, -0.038140f, -0.175256f, -0.171621f, -0.049992f, 0.096608f, 0.151735f, 0.059734f, -0.096679f, -0.157632f, -0.062095f, 0.083857f, 0.144231f, 0.103916f, 0.042535f, 0.012755f, 0.005878f, 0.008085f, 0.027262f, 0.065497f, 0.106896f, 0.138036f, 0.157486f, 0.165566f, 0.161837f, 0.150604f, 0.136230f, 0.115874f, 0.085377f, 0.047978f, 0.010903f, -0.021750f, -0.048159f, -0.066253f, -0.076374f, -0.082524f, -0.088309f, -0.094475f, -0.100881f, -0.107392f, -0.112694f, -0.115260f, -0.115292f, -0.113369f, -0.108048f, -0.096922f, -0.079156f, -0.055336f, -0.025908f, 0.008746f, 0.047468f, 0.088692f, 0.131249f, 0.174377f, 0.217290f, 0.258854f, 0.297502f, 0.331588f, 0.359765f, 0.380676f, 0.392592f, 0.393999f, 0.384351f, 0.363891f, 0.333348f, 0.294223f, 0.248522f, 0.197787f, 0.143366f, 0.087648f, 0.033362f, -0.018763f, -0.069801f, -0.119555f, -0.165608f, -0.206270f, -0.242567f, -0.276200f, -0.307129f, -0.334420f, -0.358104f, -0.378747f, -0.395911f, -0.408313f, -0.415200f, -0.416578f, + -0.412241f, -0.401426f, -0.383736f, -0.359890f, -0.331149f, -0.298118f, -0.260569f, -0.218772f, -0.174893f, -0.132630f, -0.094946f, -0.062032f, -0.031764f, -0.002387f, 0.025391f, 0.049012f, 0.066448f, 0.077765f, 0.084806f, 0.089808f, 0.094109f, 0.097653f, 0.099678f, 0.099974f, 0.099364f, 0.099047f, 0.099882f, 0.102244f, 0.105972f, 0.110354f, 0.114607f, 0.118404f, 0.121573f, 0.123531f, 0.123564f, 0.121439f, 0.117280f, 0.111181f, 0.103433f, 0.094690f, 0.085509f, 0.076144f, 0.066975f, 0.058481f, 0.050601f, 0.042886f, 0.035360f, 0.028387f, 0.021756f, 0.014870f, 0.007725f, 0.000696f, -0.006360f, -0.013704f, -0.020901f, -0.027694f, -0.035063f, -0.043655f, -0.051368f, -0.054456f, -0.051542f, -0.045299f, -0.039709f, -0.036841f}, + {-0.033462f, 0.011452f, 0.017620f, -0.032435f, -0.045854f, 0.028637f, 0.090702f, 0.014859f, -0.157822f, -0.248642f, -0.155687f, 0.038140f, 0.175256f, 0.171621f, 0.049992f, -0.096608f, -0.151735f, -0.059734f, 0.096679f, 0.157632f, 0.062095f, -0.083857f, -0.144231f, -0.103916f, -0.042535f, -0.012755f, -0.005878f, -0.008085f, -0.027262f, -0.065497f, -0.106896f, -0.138036f, -0.157486f, -0.165566f, -0.161837f, -0.150604f, -0.136230f, -0.115874f, -0.085377f, -0.047978f, -0.010903f, 0.021750f, 0.048159f, 0.066253f, 0.076374f, 0.082524f, 0.088309f, 0.094475f, 0.100881f, 0.107392f, 0.112694f, 0.115260f, 0.115292f, 0.113369f, 0.108048f, 0.096922f, 0.079156f, 0.055336f, 0.025908f, -0.008746f, -0.047468f, -0.088692f, -0.131249f, -0.174377f, -0.217290f, -0.258854f, -0.297502f, -0.331588f, -0.359765f, -0.380676f, -0.392592f, -0.393999f, -0.384351f, -0.363891f, -0.333348f, -0.294223f, -0.248522f, -0.197787f, -0.143366f, -0.087648f, -0.033362f, 0.018763f, 0.069801f, 0.119555f, 0.165608f, 0.206270f, 0.242567f, 0.276200f, 0.307129f, 0.334420f, 0.358104f, 0.378747f, 0.395911f, 0.408313f, 0.415200f, 0.416578f, + 0.412241f, 0.401426f, 0.383736f, 0.359890f, 0.331149f, 0.298118f, 0.260569f, 0.218772f, 0.174893f, 0.132630f, 0.094946f, 0.062032f, 0.031764f, 0.002387f, -0.025391f, -0.049012f, -0.066448f, -0.077765f, -0.084806f, -0.089808f, -0.094109f, -0.097653f, -0.099678f, -0.099974f, -0.099364f, -0.099047f, -0.099882f, -0.102244f, -0.105972f, -0.110354f, -0.114607f, -0.118404f, -0.121573f, -0.123531f, -0.123564f, -0.121439f, -0.117280f, -0.111181f, -0.103433f, -0.094690f, -0.085509f, -0.076144f, -0.066975f, -0.058481f, -0.050601f, -0.042886f, -0.035360f, -0.028387f, -0.021756f, -0.014870f, -0.007725f, -0.000696f, 0.006360f, 0.013704f, 0.020901f, 0.027694f, 0.035063f, 0.043655f, 0.051368f, 0.054456f, 0.051542f, 0.045299f, 0.039709f, 0.036841f} + }, + { + {0.007632f, 0.022548f, 0.018442f, -0.012511f, -0.038820f, -0.048924f, -0.077495f, -0.144911f, -0.206158f, -0.190155f, -0.062376f, 0.162240f, 0.406347f, 0.505256f, 0.303545f, -0.122289f, -0.422346f, -0.308428f, 0.092789f, 0.368487f, 0.299142f, 0.056978f, -0.090390f, -0.095371f, -0.067860f, -0.051927f, -0.006294f, 0.067628f, 0.110810f, 0.102017f, 0.079345f, 0.072300f, 0.074025f, 0.076311f, 0.084642f, 0.098477f, 0.108362f, 0.112197f, 0.115201f, 0.118268f, 0.119098f, 0.118162f, 0.115112f, 0.106864f, 0.094193f, 0.082239f, 0.072210f, 0.060549f, 0.046565f, 0.032938f, 0.019433f, 0.003358f, -0.015133f, -0.034053f, -0.053613f, -0.074508f, -0.094983f, -0.113236f, -0.129739f, -0.144761f, -0.156877f, -0.165350f, -0.170649f, -0.172003f, -0.167632f, -0.157270f, -0.141575f, -0.119930f, -0.091592f, -0.057772f, -0.020186f, 0.020979f, 0.065725f, 0.112552f, 0.159607f, 0.205951f, 0.250757f, 0.292733f, 0.330757f, 0.363863f, 0.390939f, 0.411566f, 0.426332f, 0.435310f, 0.437507f, 0.432635f, 0.421800f, 0.405738f, 0.384132f, 0.357002f, 0.324746f, 0.286692f, 0.241881f, 0.191549f, 0.138830f, 0.085942f, + 0.033379f, -0.018269f, -0.067107f, -0.110190f, -0.144170f, -0.166746f, -0.178462f, -0.182052f, -0.179351f, -0.170023f, -0.153643f, -0.131509f, -0.106065f, -0.079941f, -0.055749f, -0.035417f, -0.019431f, -0.007467f, 0.000527f, 0.004427f, 0.004267f, -0.000272f, -0.009744f, -0.023644f, -0.040120f, -0.057414f, -0.074708f, -0.091572f, -0.107804f, -0.123837f, -0.140150f, -0.156409f, -0.172204f, -0.188141f, -0.205108f, -0.223061f, -0.241479f, -0.260269f, -0.279397f, -0.298518f, -0.317733f, -0.337794f, -0.359009f, -0.380830f, -0.402589f, -0.423591f, -0.442671f, -0.458932f, -0.472565f, -0.483822f, -0.492080f, -0.497195f, -0.500388f, -0.502373f, -0.502625f, -0.501972f, -0.501991f, -0.497827f, -0.475773f, -0.426176f, -0.359349f, -0.301285f, -0.269949f, -0.260941f}, + {0.007632f, 0.022548f, 0.018442f, -0.012511f, -0.038820f, -0.048924f, -0.077495f, -0.144911f, -0.206158f, -0.190155f, -0.062376f, 0.162240f, 0.406347f, 0.505256f, 0.303545f, -0.122289f, -0.422346f, -0.308428f, 0.092789f, 0.368487f, 0.299142f, 0.056978f, -0.090390f, -0.095371f, -0.067860f, -0.051927f, -0.006294f, 0.067628f, 0.110810f, 0.102017f, 0.079345f, 0.072300f, 0.074025f, 0.076311f, 0.084642f, 0.098477f, 0.108362f, 0.112197f, 0.115201f, 0.118268f, 0.119098f, 0.118162f, 0.115112f, 0.106864f, 0.094193f, 0.082239f, 0.072210f, 0.060549f, 0.046565f, 0.032938f, 0.019433f, 0.003358f, -0.015133f, -0.034053f, -0.053613f, -0.074508f, -0.094983f, -0.113236f, -0.129739f, -0.144761f, -0.156877f, -0.165350f, -0.170649f, -0.172003f, -0.167632f, -0.157270f, -0.141575f, -0.119930f, -0.091592f, -0.057772f, -0.020186f, 0.020979f, 0.065725f, 0.112552f, 0.159607f, 0.205951f, 0.250757f, 0.292733f, 0.330757f, 0.363863f, 0.390939f, 0.411566f, 0.426332f, 0.435310f, 0.437507f, 0.432635f, 0.421800f, 0.405738f, 0.384132f, 0.357002f, 0.324746f, 0.286692f, 0.241881f, 0.191549f, 0.138830f, 0.085942f, + 0.033379f, -0.018269f, -0.067107f, -0.110190f, -0.144170f, -0.166746f, -0.178462f, -0.182052f, -0.179351f, -0.170023f, -0.153643f, -0.131509f, -0.106065f, -0.079941f, -0.055749f, -0.035417f, -0.019431f, -0.007467f, 0.000527f, 0.004427f, 0.004267f, -0.000272f, -0.009744f, -0.023644f, -0.040120f, -0.057414f, -0.074708f, -0.091572f, -0.107804f, -0.123837f, -0.140150f, -0.156409f, -0.172204f, -0.188141f, -0.205108f, -0.223061f, -0.241479f, -0.260269f, -0.279397f, -0.298518f, -0.317733f, -0.337794f, -0.359009f, -0.380830f, -0.402589f, -0.423591f, -0.442671f, -0.458932f, -0.472565f, -0.483822f, -0.492080f, -0.497195f, -0.500388f, -0.502373f, -0.502625f, -0.501972f, -0.501991f, -0.497827f, -0.475773f, -0.426176f, -0.359349f, -0.301285f, -0.269949f, -0.260941f} + }, + { + {0.034883f, -0.021304f, -0.099217f, -0.155447f, -0.151489f, -0.063105f, 0.084405f, 0.197852f, 0.184427f, 0.054626f, -0.080140f, -0.128439f, -0.101272f, -0.058942f, -0.024576f, 0.010034f, 0.029966f, 0.006574f, -0.046713f, -0.077438f, -0.060336f, -0.024821f, -0.006710f, -0.003011f, 0.010365f, 0.039520f, 0.070428f, 0.091979f, 0.102773f, 0.100912f, 0.082516f, 0.050679f, 0.016240f, -0.012503f, -0.036094f, -0.059657f, -0.086598f, -0.117101f, -0.148959f, -0.177814f, -0.198595f, -0.208869f, -0.210421f, -0.206878f, -0.200675f, -0.192862f, -0.184372f, -0.175896f, -0.167141f, -0.157485f, -0.147021f, -0.136095f, -0.124463f, -0.111814f, -0.098518f, -0.085003f, -0.070987f, -0.056168f, -0.041216f, -0.027385f, -0.015470f, -0.005652f, 0.001916f, 0.006935f, 0.009478f, 0.010521f, 0.011559f, 0.013411f, 0.015772f, 0.018478f, 0.022594f, 0.029321f, 0.038477f, 0.049356f, 0.062563f, 0.079569f, 0.100807f, 0.125523f, 0.153141f, 0.183523f, 0.216110f, 0.249764f, 0.283204f, 0.315238f, 0.345212f, 0.373228f, 0.398907f, 0.420315f, 0.435885f, 0.447075f, 0.456792f, 0.464976f, 0.467972f, 0.462757f, 0.449794f, 0.431130f, + 0.407351f, 0.377300f, 0.340016f, 0.296447f, 0.249195f, 0.200303f, 0.149534f, 0.095828f, 0.040211f, -0.014159f, -0.064951f, -0.112404f, -0.158156f, -0.203415f, -0.247903f, -0.289526f, -0.325496f, -0.354702f, -0.378437f, -0.398339f, -0.414695f, -0.427120f, -0.435547f, -0.440095f, -0.441262f, -0.440437f, -0.439004f, -0.437067f, -0.434155f, -0.430566f, -0.426801f, -0.422476f, -0.416824f, -0.409269f, -0.398920f, -0.385068f, -0.368719f, -0.351923f, -0.335312f, -0.317982f, -0.299378f, -0.279225f, -0.256508f, -0.230974f, -0.204681f, -0.179810f, -0.156306f, -0.133463f, -0.111629f, -0.090540f, -0.068716f, -0.046148f, -0.024726f, -0.005073f, 0.013889f, 0.032797f, 0.053548f, 0.080840f, 0.114841f, 0.143935f, 0.153768f, 0.143890f, 0.127871f, 0.117999f}, + {0.034883f, -0.021304f, -0.099217f, -0.155447f, -0.151489f, -0.063105f, 0.084405f, 0.197852f, 0.184427f, 0.054626f, -0.080140f, -0.128439f, -0.101272f, -0.058942f, -0.024576f, 0.010034f, 0.029966f, 0.006574f, -0.046713f, -0.077438f, -0.060336f, -0.024821f, -0.006710f, -0.003011f, 0.010365f, 0.039520f, 0.070428f, 0.091979f, 0.102773f, 0.100912f, 0.082516f, 0.050679f, 0.016240f, -0.012503f, -0.036094f, -0.059657f, -0.086598f, -0.117101f, -0.148959f, -0.177814f, -0.198595f, -0.208869f, -0.210421f, -0.206878f, -0.200675f, -0.192862f, -0.184372f, -0.175896f, -0.167141f, -0.157485f, -0.147021f, -0.136095f, -0.124463f, -0.111814f, -0.098518f, -0.085003f, -0.070987f, -0.056168f, -0.041216f, -0.027385f, -0.015470f, -0.005652f, 0.001916f, 0.006935f, 0.009478f, 0.010521f, 0.011559f, 0.013411f, 0.015772f, 0.018478f, 0.022594f, 0.029321f, 0.038477f, 0.049356f, 0.062563f, 0.079569f, 0.100807f, 0.125523f, 0.153141f, 0.183523f, 0.216110f, 0.249764f, 0.283204f, 0.315238f, 0.345212f, 0.373228f, 0.398907f, 0.420315f, 0.435885f, 0.447075f, 0.456792f, 0.464976f, 0.467972f, 0.462757f, 0.449794f, 0.431130f, + 0.407351f, 0.377300f, 0.340016f, 0.296447f, 0.249195f, 0.200303f, 0.149534f, 0.095828f, 0.040211f, -0.014159f, -0.064951f, -0.112404f, -0.158156f, -0.203415f, -0.247903f, -0.289526f, -0.325496f, -0.354702f, -0.378437f, -0.398339f, -0.414695f, -0.427120f, -0.435547f, -0.440095f, -0.441262f, -0.440437f, -0.439004f, -0.437067f, -0.434155f, -0.430566f, -0.426801f, -0.422476f, -0.416824f, -0.409269f, -0.398920f, -0.385068f, -0.368719f, -0.351923f, -0.335312f, -0.317982f, -0.299378f, -0.279225f, -0.256508f, -0.230974f, -0.204681f, -0.179810f, -0.156306f, -0.133463f, -0.111629f, -0.090540f, -0.068716f, -0.046148f, -0.024726f, -0.005073f, 0.013889f, 0.032797f, 0.053548f, 0.080840f, 0.114841f, 0.143935f, 0.153768f, 0.143890f, 0.127871f, 0.117999f} + }, + { + {-0.042332f, 0.052414f, 0.122641f, 0.100474f, 0.024695f, -0.082326f, -0.258062f, -0.473154f, -0.584763f, -0.487474f, -0.212666f, 0.165870f, 0.573082f, 0.800546f, 0.552655f, -0.151008f, -0.763503f, -0.701266f, -0.031392f, 0.589097f, 0.677353f, 0.375374f, 0.090848f, -0.027580f, -0.096120f, -0.190245f, -0.262825f, -0.288880f, -0.308636f, -0.336497f, -0.340771f, -0.310877f, -0.270106f, -0.228364f, -0.175587f, -0.113432f, -0.055244f, -0.004323f, 0.041799f, 0.077774f, 0.099516f, 0.113909f, 0.127241f, 0.136680f, 0.140063f, 0.140919f, 0.139881f, 0.133490f, 0.123199f, 0.114854f, 0.109677f, 0.104617f, 0.099122f, 0.094046f, 0.087514f, 0.077934f, 0.066999f, 0.055668f, 0.042091f, 0.026045f, 0.009978f, -0.005697f, -0.022928f, -0.041423f, -0.058984f, -0.075713f, -0.092979f, -0.109604f, -0.123430f, -0.134844f, -0.145145f, -0.153781f, -0.160146f, -0.165514f, -0.170954f, -0.175845f, -0.179731f, -0.183079f, -0.185777f, -0.187503f, -0.189345f, -0.192612f, -0.196803f, -0.200916f, -0.205347f, -0.210450f, -0.214889f, -0.217212f, -0.217402f, -0.215743f, -0.212081f, -0.206912f, -0.201289f, -0.195569f, -0.190303f, -0.187905f, + -0.191048f, -0.199781f, -0.212320f, -0.227968f, -0.247295f, -0.270114f, -0.294879f, -0.319422f, -0.341430f, -0.359264f, -0.372895f, -0.382982f, -0.388966f, -0.389475f, -0.384356f, -0.374855f, -0.362171f, -0.347161f, -0.330773f, -0.313405f, -0.294581f, -0.274385f, -0.254316f, -0.235851f, -0.219093f, -0.203275f, -0.187422f, -0.170370f, -0.151593f, -0.132216f, -0.113950f, -0.097152f, -0.081024f, -0.065106f, -0.049246f, -0.032888f, -0.015757f, 0.001405f, 0.017892f, 0.034016f, 0.050243f, 0.066435f, 0.082630f, 0.099397f, 0.116782f, 0.133961f, 0.150320f, 0.165818f, 0.180145f, 0.192646f, 0.203207f, 0.212303f, 0.220145f, 0.226503f, 0.231386f, 0.235453f, 0.239190f, 0.240731f, 0.234694f, 0.216060f, 0.187439f, 0.159993f, 0.143657f, 0.138274f}, + {-0.042332f, 0.052414f, 0.122641f, 0.100474f, 0.024695f, -0.082326f, -0.258062f, -0.473154f, -0.584763f, -0.487474f, -0.212666f, 0.165870f, 0.573082f, 0.800546f, 0.552655f, -0.151008f, -0.763503f, -0.701266f, -0.031392f, 0.589097f, 0.677353f, 0.375374f, 0.090848f, -0.027580f, -0.096120f, -0.190245f, -0.262825f, -0.288880f, -0.308636f, -0.336497f, -0.340771f, -0.310877f, -0.270106f, -0.228364f, -0.175587f, -0.113432f, -0.055244f, -0.004323f, 0.041799f, 0.077774f, 0.099516f, 0.113909f, 0.127241f, 0.136680f, 0.140063f, 0.140919f, 0.139881f, 0.133490f, 0.123199f, 0.114854f, 0.109677f, 0.104617f, 0.099122f, 0.094046f, 0.087514f, 0.077934f, 0.066999f, 0.055668f, 0.042091f, 0.026045f, 0.009978f, -0.005697f, -0.022928f, -0.041423f, -0.058984f, -0.075713f, -0.092979f, -0.109604f, -0.123430f, -0.134844f, -0.145145f, -0.153781f, -0.160146f, -0.165514f, -0.170954f, -0.175845f, -0.179731f, -0.183079f, -0.185777f, -0.187503f, -0.189345f, -0.192612f, -0.196803f, -0.200916f, -0.205347f, -0.210450f, -0.214889f, -0.217212f, -0.217402f, -0.215743f, -0.212081f, -0.206912f, -0.201289f, -0.195569f, -0.190303f, -0.187905f, + -0.191048f, -0.199781f, -0.212320f, -0.227968f, -0.247295f, -0.270114f, -0.294879f, -0.319422f, -0.341430f, -0.359264f, -0.372895f, -0.382982f, -0.388966f, -0.389475f, -0.384356f, -0.374855f, -0.362171f, -0.347161f, -0.330773f, -0.313405f, -0.294581f, -0.274385f, -0.254316f, -0.235851f, -0.219093f, -0.203275f, -0.187422f, -0.170370f, -0.151593f, -0.132216f, -0.113950f, -0.097152f, -0.081024f, -0.065106f, -0.049246f, -0.032888f, -0.015757f, 0.001405f, 0.017892f, 0.034016f, 0.050243f, 0.066435f, 0.082630f, 0.099397f, 0.116782f, 0.133961f, 0.150320f, 0.165818f, 0.180145f, 0.192646f, 0.203207f, 0.212303f, 0.220145f, 0.226503f, 0.231386f, 0.235453f, 0.239190f, 0.240731f, 0.234694f, 0.216060f, 0.187439f, 0.159993f, 0.143657f, 0.138274f} + }, + { + {-0.038707f, -0.040443f, -0.032425f, -0.008667f, 0.039610f, 0.121021f, 0.200841f, 0.209863f, 0.128343f, -0.011854f, -0.222956f, -0.509917f, -0.672944f, -0.397576f, 0.271260f, 0.753657f, 0.530475f, -0.183327f, -0.662957f, -0.535116f, -0.113682f, 0.135696f, 0.139296f, 0.101726f, 0.119927f, 0.126081f, 0.082228f, 0.034341f, 0.008539f, -0.018778f, -0.056453f, -0.082857f, -0.088546f, -0.085336f, -0.080321f, -0.072030f, -0.062931f, -0.055762f, -0.047257f, -0.036657f, -0.029416f, -0.026737f, -0.023178f, -0.017390f, -0.014005f, -0.014139f, -0.014094f, -0.012938f, -0.012763f, -0.012836f, -0.010434f, -0.005527f, 0.000352f, 0.007263f, 0.015320f, 0.022993f, 0.029308f, 0.034837f, 0.039468f, 0.042226f, 0.043473f, 0.044401f, 0.044758f, 0.043609f, 0.041320f, 0.038608f, 0.035016f, 0.030111f, 0.024605f, 0.019016f, 0.012867f, 0.005983f, -0.001177f, -0.008863f, -0.018026f, -0.028938f, -0.041213f, -0.054772f, -0.069509f, -0.084750f, -0.100179f, -0.116316f, -0.133109f, -0.149167f, -0.163209f, -0.175265f, -0.185829f, -0.194738f, -0.201250f, -0.204518f, -0.203992f, -0.199910f, -0.193205f, -0.184582f, -0.174292f, -0.163022f, + -0.152075f, -0.142325f, -0.133856f, -0.126875f, -0.122103f, -0.119943f, -0.119907f, -0.121022f, -0.122534f, -0.124394f, -0.127276f, -0.131743f, -0.137311f, -0.142802f, -0.147553f, -0.151741f, -0.155707f, -0.159595f, -0.163318f, -0.166341f, -0.167867f, -0.167752f, -0.166759f, -0.165644f, -0.164497f, -0.162993f, -0.160544f, -0.156329f, -0.149991f, -0.142138f, -0.133494f, -0.123973f, -0.113132f, -0.100831f, -0.086925f, -0.071241f, -0.054316f, -0.037204f, -0.020348f, -0.003592f, 0.012893f, 0.028859f, 0.044680f, 0.060561f, 0.075703f, 0.089381f, 0.101902f, 0.113636f, 0.124499f, 0.135054f, 0.146443f, 0.158891f, 0.172084f, 0.186647f, 0.203232f, 0.221745f, 0.243776f, 0.271628f, 0.299956f, 0.313432f, 0.301412f, 0.272461f, 0.246103f, 0.233169f}, + {0.038707f, 0.040443f, 0.032425f, 0.008667f, -0.039610f, -0.121021f, -0.200841f, -0.209863f, -0.128343f, 0.011854f, 0.222956f, 0.509917f, 0.672944f, 0.397576f, -0.271260f, -0.753657f, -0.530475f, 0.183327f, 0.662957f, 0.535116f, 0.113682f, -0.135696f, -0.139296f, -0.101726f, -0.119927f, -0.126081f, -0.082228f, -0.034341f, -0.008539f, 0.018778f, 0.056453f, 0.082857f, 0.088546f, 0.085336f, 0.080321f, 0.072030f, 0.062931f, 0.055762f, 0.047257f, 0.036657f, 0.029416f, 0.026737f, 0.023178f, 0.017390f, 0.014005f, 0.014139f, 0.014094f, 0.012938f, 0.012763f, 0.012836f, 0.010434f, 0.005527f, -0.000352f, -0.007263f, -0.015320f, -0.022993f, -0.029308f, -0.034837f, -0.039468f, -0.042226f, -0.043473f, -0.044401f, -0.044758f, -0.043609f, -0.041320f, -0.038608f, -0.035016f, -0.030111f, -0.024605f, -0.019016f, -0.012867f, -0.005983f, 0.001177f, 0.008863f, 0.018026f, 0.028938f, 0.041213f, 0.054772f, 0.069509f, 0.084750f, 0.100179f, 0.116316f, 0.133109f, 0.149167f, 0.163209f, 0.175265f, 0.185829f, 0.194738f, 0.201250f, 0.204518f, 0.203992f, 0.199910f, 0.193205f, 0.184582f, 0.174292f, 0.163022f, + 0.152075f, 0.142325f, 0.133856f, 0.126875f, 0.122103f, 0.119943f, 0.119907f, 0.121022f, 0.122534f, 0.124394f, 0.127276f, 0.131743f, 0.137311f, 0.142802f, 0.147553f, 0.151741f, 0.155707f, 0.159595f, 0.163318f, 0.166341f, 0.167867f, 0.167752f, 0.166759f, 0.165644f, 0.164497f, 0.162993f, 0.160544f, 0.156329f, 0.149991f, 0.142138f, 0.133494f, 0.123973f, 0.113132f, 0.100831f, 0.086925f, 0.071241f, 0.054316f, 0.037204f, 0.020348f, 0.003592f, -0.012893f, -0.028859f, -0.044680f, -0.060561f, -0.075703f, -0.089381f, -0.101902f, -0.113636f, -0.124499f, -0.135054f, -0.146443f, -0.158891f, -0.172084f, -0.186647f, -0.203232f, -0.221745f, -0.243776f, -0.271628f, -0.299956f, -0.313432f, -0.301412f, -0.272461f, -0.246103f, -0.233169f} + }, + { + {-0.011441f, -0.003265f, 0.004011f, -0.000472f, -0.027714f, -0.075629f, -0.102363f, -0.048427f, 0.075716f, 0.158973f, 0.107163f, -0.028068f, -0.105566f, -0.071921f, -0.008203f, 0.005703f, -0.009101f, 0.001108f, 0.026819f, 0.024213f, -0.004533f, -0.019483f, -0.010977f, -0.008220f, -0.025895f, -0.043275f, -0.039729f, -0.021081f, -0.003698f, 0.006641f, 0.011920f, 0.011671f, 0.003832f, -0.010526f, -0.027836f, -0.044363f, -0.057022f, -0.064947f, -0.070367f, -0.075558f, -0.079517f, -0.079629f, -0.075472f, -0.069036f, -0.062356f, -0.056849f, -0.053900f, -0.054130f, -0.056410f, -0.058748f, -0.059818f, -0.059044f, -0.056030f, -0.050751f, -0.043844f, -0.036068f, -0.027766f, -0.019090f, -0.010327f, -0.001711f, 0.006749f, 0.015049f, 0.022944f, 0.029990f, 0.035833f, 0.040478f, 0.044205f, 0.047143f, 0.049179f, 0.050500f, 0.051764f, 0.053342f, 0.054913f, 0.056356f, 0.058453f, 0.062098f, 0.067413f, 0.074374f, 0.083664f, 0.096097f, 0.111651f, 0.129744f, 0.150062f, 0.172637f, 0.197477f, 0.224325f, 0.252295f, 0.279828f, 0.305655f, 0.329617f, 0.351655f, 0.370228f, 0.382750f, 0.387511f, 0.384321f, 0.373523f, + 0.355270f, 0.329788f, 0.297855f, 0.261198f, 0.222427f, 0.183885f, 0.146353f, 0.109686f, 0.074803f, 0.043946f, 0.018611f, -0.002035f, -0.020413f, -0.038698f, -0.057436f, -0.075307f, -0.090415f, -0.102296f, -0.112325f, -0.122030f, -0.131716f, -0.140923f, -0.149260f, -0.156505f, -0.162826f, -0.169104f, -0.176221f, -0.184054f, -0.191847f, -0.199220f, -0.206057f, -0.212014f, -0.216913f, -0.221002f, -0.224224f, -0.226071f, -0.226577f, -0.226473f, -0.226101f, -0.225292f, -0.224225f, -0.223145f, -0.221549f, -0.219033f, -0.216406f, -0.214610f, -0.213404f, -0.212354f, -0.211792f, -0.211513f, -0.210235f, -0.207593f, -0.204699f, -0.201857f, -0.198207f, -0.193847f, -0.188118f, -0.174986f, -0.146065f, -0.102134f, -0.057750f, -0.029670f, -0.021689f, -0.023453f}, + {0.011441f, 0.003265f, -0.004011f, 0.000472f, 0.027714f, 0.075629f, 0.102363f, 0.048427f, -0.075716f, -0.158973f, -0.107163f, 0.028068f, 0.105566f, 0.071921f, 0.008203f, -0.005703f, 0.009101f, -0.001108f, -0.026819f, -0.024213f, 0.004533f, 0.019483f, 0.010977f, 0.008220f, 0.025895f, 0.043275f, 0.039729f, 0.021081f, 0.003698f, -0.006641f, -0.011920f, -0.011671f, -0.003832f, 0.010526f, 0.027836f, 0.044363f, 0.057022f, 0.064947f, 0.070367f, 0.075558f, 0.079517f, 0.079629f, 0.075472f, 0.069036f, 0.062356f, 0.056849f, 0.053900f, 0.054130f, 0.056410f, 0.058748f, 0.059818f, 0.059044f, 0.056030f, 0.050751f, 0.043844f, 0.036068f, 0.027766f, 0.019090f, 0.010327f, 0.001711f, -0.006749f, -0.015049f, -0.022944f, -0.029990f, -0.035833f, -0.040478f, -0.044205f, -0.047143f, -0.049179f, -0.050500f, -0.051764f, -0.053342f, -0.054913f, -0.056356f, -0.058453f, -0.062098f, -0.067413f, -0.074374f, -0.083664f, -0.096097f, -0.111651f, -0.129744f, -0.150062f, -0.172637f, -0.197477f, -0.224325f, -0.252295f, -0.279828f, -0.305655f, -0.329617f, -0.351655f, -0.370228f, -0.382750f, -0.387511f, -0.384321f, -0.373523f, + -0.355270f, -0.329788f, -0.297855f, -0.261198f, -0.222427f, -0.183885f, -0.146353f, -0.109686f, -0.074803f, -0.043946f, -0.018611f, 0.002035f, 0.020413f, 0.038698f, 0.057436f, 0.075307f, 0.090415f, 0.102296f, 0.112325f, 0.122030f, 0.131716f, 0.140923f, 0.149260f, 0.156505f, 0.162826f, 0.169104f, 0.176221f, 0.184054f, 0.191847f, 0.199220f, 0.206057f, 0.212014f, 0.216913f, 0.221002f, 0.224224f, 0.226071f, 0.226577f, 0.226473f, 0.226101f, 0.225292f, 0.224225f, 0.223145f, 0.221549f, 0.219033f, 0.216406f, 0.214610f, 0.213404f, 0.212354f, 0.211792f, 0.211513f, 0.210235f, 0.207593f, 0.204699f, 0.201857f, 0.198207f, 0.193847f, 0.188118f, 0.174986f, 0.146065f, 0.102134f, 0.057750f, 0.029670f, 0.021689f, 0.023453f} + }, + { + {-0.022899f, -0.009050f, 0.021042f, 0.035577f, 0.007193f, -0.010991f, 0.067505f, 0.216765f, 0.271970f, 0.095990f, -0.246846f, -0.502443f, -0.427170f, -0.025043f, 0.395378f, 0.472255f, 0.158557f, -0.215865f, -0.309289f, -0.125601f, 0.071920f, 0.117090f, 0.070896f, 0.036158f, 0.010191f, -0.040842f, -0.086996f, -0.084856f, -0.053104f, -0.038760f, -0.049026f, -0.058734f, -0.055081f, -0.041078f, -0.015513f, 0.023625f, 0.067409f, 0.104226f, 0.131662f, 0.152151f, 0.165968f, 0.173980f, 0.179366f, 0.183056f, 0.183232f, 0.180032f, 0.175450f, 0.169336f, 0.160257f, 0.148803f, 0.135933f, 0.119953f, 0.098677f, 0.072731f, 0.044254f, 0.014523f, -0.015264f, -0.043256f, -0.068768f, -0.092960f, -0.116651f, -0.139142f, -0.159634f, -0.177968f, -0.193495f, -0.204628f, -0.209832f, -0.208176f, -0.199162f, -0.182839f, -0.159769f, -0.130297f, -0.094474f, -0.053153f, -0.008358f, 0.038048f, 0.085319f, 0.132878f, 0.179125f, 0.221960f, 0.260199f, 0.293872f, 0.323183f, 0.347625f, 0.366329f, 0.379015f, 0.386161f, 0.388145f, 0.384647f, 0.375101f, 0.359186f, 0.336465f, 0.306144f, 0.267908f, 0.222716f, 0.172166f, + 0.117452f, 0.059721f, 0.001259f, -0.054522f, -0.104542f, -0.147316f, -0.182857f, -0.211501f, -0.232650f, -0.244662f, -0.246382f, -0.238892f, -0.225272f, -0.208463f, -0.189745f, -0.169228f, -0.147036f, -0.123663f, -0.099806f, -0.076368f, -0.054370f, -0.034613f, -0.017496f, -0.003066f, 0.009127f, 0.020090f, 0.030773f, 0.041240f, 0.050609f, 0.057724f, 0.061768f, 0.062553f, 0.060572f, 0.056607f, 0.051053f, 0.043676f, 0.034051f, 0.022022f, 0.007797f, -0.008087f, -0.024935f, -0.042312f, -0.060172f, -0.078368f, -0.096310f, -0.113326f, -0.129046f, -0.143214f, -0.155555f, -0.166012f, -0.174718f, -0.181676f, -0.186839f, -0.190425f, -0.192896f, -0.195026f, -0.197709f, -0.199950f, -0.196779f, -0.182409f, -0.157947f, -0.133337f, -0.118252f, -0.113142f}, + {0.022899f, 0.009050f, -0.021042f, -0.035577f, -0.007193f, 0.010991f, -0.067505f, -0.216765f, -0.271970f, -0.095990f, 0.246846f, 0.502443f, 0.427170f, 0.025043f, -0.395378f, -0.472255f, -0.158557f, 0.215865f, 0.309289f, 0.125601f, -0.071920f, -0.117090f, -0.070896f, -0.036158f, -0.010191f, 0.040842f, 0.086996f, 0.084856f, 0.053104f, 0.038760f, 0.049026f, 0.058734f, 0.055081f, 0.041078f, 0.015513f, -0.023625f, -0.067409f, -0.104226f, -0.131662f, -0.152151f, -0.165968f, -0.173980f, -0.179366f, -0.183056f, -0.183232f, -0.180032f, -0.175450f, -0.169336f, -0.160257f, -0.148803f, -0.135933f, -0.119953f, -0.098677f, -0.072731f, -0.044254f, -0.014523f, 0.015264f, 0.043256f, 0.068768f, 0.092960f, 0.116651f, 0.139142f, 0.159634f, 0.177968f, 0.193495f, 0.204628f, 0.209832f, 0.208176f, 0.199162f, 0.182839f, 0.159769f, 0.130297f, 0.094474f, 0.053153f, 0.008358f, -0.038048f, -0.085319f, -0.132878f, -0.179125f, -0.221960f, -0.260199f, -0.293872f, -0.323183f, -0.347625f, -0.366329f, -0.379015f, -0.386161f, -0.388145f, -0.384647f, -0.375101f, -0.359186f, -0.336465f, -0.306144f, -0.267908f, -0.222716f, -0.172166f, + -0.117452f, -0.059721f, -0.001259f, 0.054522f, 0.104542f, 0.147316f, 0.182857f, 0.211501f, 0.232650f, 0.244662f, 0.246382f, 0.238892f, 0.225272f, 0.208463f, 0.189745f, 0.169228f, 0.147036f, 0.123663f, 0.099806f, 0.076368f, 0.054370f, 0.034613f, 0.017496f, 0.003066f, -0.009127f, -0.020090f, -0.030773f, -0.041240f, -0.050609f, -0.057724f, -0.061768f, -0.062553f, -0.060572f, -0.056607f, -0.051053f, -0.043676f, -0.034051f, -0.022022f, -0.007797f, 0.008087f, 0.024935f, 0.042312f, 0.060172f, 0.078368f, 0.096310f, 0.113326f, 0.129046f, 0.143214f, 0.155555f, 0.166012f, 0.174718f, 0.181676f, 0.186839f, 0.190425f, 0.192896f, 0.195026f, 0.197709f, 0.199950f, 0.196779f, 0.182409f, 0.157947f, 0.133337f, 0.118252f, 0.113142f} + }, + { + {0.003690f, -0.000917f, -0.000552f, 0.013387f, 0.038725f, 0.063371f, 0.072581f, 0.053190f, 0.000206f, -0.066676f, -0.099074f, -0.058384f, 0.032276f, 0.096933f, 0.084562f, 0.021700f, -0.028770f, -0.041099f, -0.033861f, -0.021573f, 0.003202f, 0.040516f, 0.070416f, 0.080729f, 0.083957f, 0.093969f, 0.102499f, 0.091181f, 0.056136f, 0.010704f, -0.028621f, -0.051424f, -0.055151f, -0.045654f, -0.033912f, -0.027688f, -0.026567f, -0.025373f, -0.020147f, -0.010619f, 0.000563f, 0.010165f, 0.017004f, 0.022350f, 0.027713f, 0.033503f, 0.039956f, 0.047461f, 0.055453f, 0.062514f, 0.067893f, 0.071692f, 0.073779f, 0.073710f, 0.071278f, 0.066153f, 0.057699f, 0.045923f, 0.031751f, 0.015946f, -0.001187f, -0.018979f, -0.036673f, -0.054412f, -0.072597f, -0.090693f, -0.108050f, -0.125117f, -0.142249f, -0.158172f, -0.171068f, -0.180164f, -0.184957f, -0.184167f, -0.176848f, -0.163444f, -0.144732f, -0.120910f, -0.092493f, -0.060834f, -0.026998f, 0.008883f, 0.046658f, 0.085319f, 0.123386f, 0.159725f, 0.194080f, 0.226805f, 0.257478f, 0.283950f, 0.303794f, 0.316528f, 0.323183f, 0.324000f, 0.317919f, 0.304128f, + 0.282929f, 0.255584f, 0.224397f, 0.192192f, 0.160506f, 0.128826f, 0.096337f, 0.063750f, 0.033188f, 0.007192f, -0.012327f, -0.025520f, -0.034813f, -0.042423f, -0.047979f, -0.049630f, -0.046581f, -0.039422f, -0.029192f, -0.017343f, -0.005387f, 0.006553f, 0.019724f, 0.034769f, 0.051053f, 0.067938f, 0.085001f, 0.101175f, 0.115466f, 0.128221f, 0.140146f, 0.150803f, 0.159486f, 0.166332f, 0.171227f, 0.173096f, 0.171443f, 0.166998f, 0.160073f, 0.150144f, 0.137357f, 0.122400f, 0.104972f, 0.084444f, 0.061488f, 0.037087f, 0.011069f, -0.016587f, -0.044718f, -0.072768f, -0.101412f, -0.130304f, -0.157895f, -0.183977f, -0.209630f, -0.235539f, -0.263242f, -0.293940f, -0.320304f, -0.325486f, -0.300786f, -0.260681f, -0.229360f, -0.216143f}, + {0.003690f, -0.000917f, -0.000552f, 0.013387f, 0.038725f, 0.063371f, 0.072581f, 0.053190f, 0.000206f, -0.066676f, -0.099074f, -0.058384f, 0.032276f, 0.096933f, 0.084562f, 0.021700f, -0.028770f, -0.041099f, -0.033861f, -0.021573f, 0.003202f, 0.040516f, 0.070416f, 0.080729f, 0.083957f, 0.093969f, 0.102499f, 0.091181f, 0.056136f, 0.010704f, -0.028621f, -0.051424f, -0.055151f, -0.045654f, -0.033912f, -0.027688f, -0.026567f, -0.025373f, -0.020147f, -0.010619f, 0.000563f, 0.010165f, 0.017004f, 0.022350f, 0.027713f, 0.033503f, 0.039956f, 0.047461f, 0.055453f, 0.062514f, 0.067893f, 0.071692f, 0.073779f, 0.073710f, 0.071278f, 0.066153f, 0.057699f, 0.045923f, 0.031751f, 0.015946f, -0.001187f, -0.018979f, -0.036673f, -0.054412f, -0.072597f, -0.090693f, -0.108050f, -0.125117f, -0.142249f, -0.158172f, -0.171068f, -0.180164f, -0.184957f, -0.184167f, -0.176848f, -0.163444f, -0.144732f, -0.120910f, -0.092493f, -0.060834f, -0.026998f, 0.008883f, 0.046658f, 0.085319f, 0.123386f, 0.159725f, 0.194080f, 0.226805f, 0.257478f, 0.283950f, 0.303794f, 0.316528f, 0.323183f, 0.324000f, 0.317919f, 0.304128f, + 0.282929f, 0.255584f, 0.224397f, 0.192192f, 0.160506f, 0.128826f, 0.096337f, 0.063750f, 0.033188f, 0.007192f, -0.012327f, -0.025520f, -0.034813f, -0.042423f, -0.047979f, -0.049630f, -0.046581f, -0.039422f, -0.029192f, -0.017343f, -0.005387f, 0.006553f, 0.019724f, 0.034769f, 0.051053f, 0.067938f, 0.085001f, 0.101175f, 0.115466f, 0.128221f, 0.140146f, 0.150803f, 0.159486f, 0.166332f, 0.171227f, 0.173096f, 0.171443f, 0.166998f, 0.160073f, 0.150144f, 0.137357f, 0.122400f, 0.104972f, 0.084444f, 0.061488f, 0.037087f, 0.011069f, -0.016587f, -0.044718f, -0.072768f, -0.101412f, -0.130304f, -0.157895f, -0.183977f, -0.209630f, -0.235539f, -0.263242f, -0.293940f, -0.320304f, -0.325486f, -0.300786f, -0.260681f, -0.229360f, -0.216143f} + }, + { + {-0.023394f, -0.027147f, -0.010242f, 0.029995f, 0.067330f, 0.083589f, 0.072936f, 0.017445f, -0.087218f, -0.178937f, -0.163916f, -0.030708f, 0.114394f, 0.155385f, 0.081810f, -0.022358f, -0.073288f, -0.048744f, 0.015279f, 0.058591f, 0.040948f, -0.023886f, -0.081166f, -0.090364f, -0.058651f, -0.017390f, 0.015585f, 0.040163f, 0.058174f, 0.070098f, 0.079819f, 0.090006f, 0.096263f, 0.093268f, 0.082877f, 0.070565f, 0.057790f, 0.042958f, 0.026941f, 0.013256f, 0.004160f, -0.000764f, -0.003251f, -0.005255f, -0.008455f, -0.013944f, -0.022509f, -0.034733f, -0.050017f, -0.066095f, -0.080399f, -0.091534f, -0.099083f, -0.103038f, -0.104204f, -0.104337f, -0.105038f, -0.106888f, -0.109935f, -0.114401f, -0.120510f, -0.128064f, -0.136416f, -0.144519f, -0.150965f, -0.154404f, -0.154060f, -0.149652f, -0.141043f, -0.128490f, -0.113124f, -0.096475f, -0.079332f, -0.061637f, -0.043769f, -0.027117f, -0.012702f, 0.000084f, 0.012241f, 0.023050f, 0.030612f, 0.034541f, 0.036620f, 0.038340f, 0.039247f, 0.038732f, 0.038347f, 0.040934f, 0.047732f, 0.057272f, 0.067154f, 0.076305f, 0.085395f, 0.095550f, 0.107026f, 0.119165f, + 0.131180f, 0.142546f, 0.152838f, 0.162016f, 0.171094f, 0.181783f, 0.194944f, 0.209687f, 0.224276f, 0.237616f, 0.249622f, 0.260452f, 0.269684f, 0.276238f, 0.279096f, 0.278096f, 0.273844f, 0.266767f, 0.256520f, 0.242394f, 0.224039f, 0.201801f, 0.176733f, 0.150267f, 0.123426f, 0.096270f, 0.068346f, 0.039626f, 0.010838f, -0.016846f, -0.042211f, -0.064572f, -0.084386f, -0.102969f, -0.121208f, -0.138666f, -0.153987f, -0.165894f, -0.173880f, -0.178463f, -0.180864f, -0.182167f, -0.182758f, -0.182496f, -0.180928f, -0.177304f, -0.171116f, -0.162770f, -0.153009f, -0.141866f, -0.129175f, -0.115724f, -0.102570f, -0.089658f, -0.076512f, -0.063365f, -0.049691f, -0.033149f, -0.013162f, 0.005394f, 0.015746f, 0.016554f, 0.012768f, 0.009775f}, + {-0.023394f, -0.027147f, -0.010242f, 0.029995f, 0.067330f, 0.083589f, 0.072936f, 0.017445f, -0.087218f, -0.178937f, -0.163916f, -0.030708f, 0.114394f, 0.155385f, 0.081810f, -0.022358f, -0.073288f, -0.048744f, 0.015279f, 0.058591f, 0.040948f, -0.023886f, -0.081166f, -0.090364f, -0.058651f, -0.017390f, 0.015585f, 0.040163f, 0.058174f, 0.070098f, 0.079819f, 0.090006f, 0.096263f, 0.093268f, 0.082877f, 0.070565f, 0.057790f, 0.042958f, 0.026941f, 0.013256f, 0.004160f, -0.000764f, -0.003251f, -0.005255f, -0.008455f, -0.013944f, -0.022509f, -0.034733f, -0.050017f, -0.066095f, -0.080399f, -0.091534f, -0.099083f, -0.103038f, -0.104204f, -0.104337f, -0.105038f, -0.106888f, -0.109935f, -0.114401f, -0.120510f, -0.128064f, -0.136416f, -0.144519f, -0.150965f, -0.154404f, -0.154060f, -0.149652f, -0.141043f, -0.128490f, -0.113124f, -0.096475f, -0.079332f, -0.061637f, -0.043769f, -0.027117f, -0.012702f, 0.000084f, 0.012241f, 0.023050f, 0.030612f, 0.034541f, 0.036620f, 0.038340f, 0.039247f, 0.038732f, 0.038347f, 0.040934f, 0.047732f, 0.057272f, 0.067154f, 0.076305f, 0.085395f, 0.095550f, 0.107026f, 0.119165f, + 0.131180f, 0.142546f, 0.152838f, 0.162016f, 0.171094f, 0.181783f, 0.194944f, 0.209687f, 0.224276f, 0.237616f, 0.249622f, 0.260452f, 0.269684f, 0.276238f, 0.279096f, 0.278096f, 0.273844f, 0.266767f, 0.256520f, 0.242394f, 0.224039f, 0.201801f, 0.176733f, 0.150267f, 0.123426f, 0.096270f, 0.068346f, 0.039626f, 0.010838f, -0.016846f, -0.042211f, -0.064572f, -0.084386f, -0.102969f, -0.121208f, -0.138666f, -0.153987f, -0.165894f, -0.173880f, -0.178463f, -0.180864f, -0.182167f, -0.182758f, -0.182496f, -0.180928f, -0.177304f, -0.171116f, -0.162770f, -0.153009f, -0.141866f, -0.129175f, -0.115724f, -0.102570f, -0.089658f, -0.076512f, -0.063365f, -0.049691f, -0.033149f, -0.013162f, 0.005394f, 0.015746f, 0.016554f, 0.012768f, 0.009775f} + }, + { + {0.002536f, -0.011235f, -0.018343f, -0.017987f, -0.027166f, -0.031117f, 0.014002f, 0.096526f, 0.113126f, -0.016617f, -0.209563f, -0.268875f, -0.109214f, 0.120357f, 0.194165f, 0.064228f, -0.105548f, -0.151938f, -0.085143f, -0.021811f, -0.013168f, -0.007575f, 0.042273f, 0.109306f, 0.142985f, 0.138265f, 0.124567f, 0.114998f, 0.096455f, 0.057758f, 0.004146f, -0.052677f, -0.103477f, -0.141457f, -0.163639f, -0.173107f, -0.175086f, -0.171796f, -0.163515f, -0.151686f, -0.138206f, -0.124227f, -0.111720f, -0.103751f, -0.101586f, -0.103453f, -0.106877f, -0.110322f, -0.112385f, -0.111649f, -0.107834f, -0.101601f, -0.093248f, -0.082860f, -0.071411f, -0.060549f, -0.051523f, -0.045052f, -0.041731f, -0.041860f, -0.045219f, -0.051310f, -0.059514f, -0.069016f, -0.079031f, -0.088966f, -0.098149f, -0.105768f, -0.111299f, -0.114442f, -0.114537f, -0.110675f, -0.102450f, -0.090007f, -0.073514f, -0.053290f, -0.030165f, -0.005135f, 0.020901f, 0.046733f, 0.071073f, 0.093736f, 0.115568f, 0.136842f, 0.156886f, 0.175538f, 0.193455f, 0.210815f, 0.227567f, 0.245363f, 0.267074f, 0.293421f, 0.321639f, 0.348399f, 0.372776f, 0.395534f, + 0.416417f, 0.432977f, 0.441812f, 0.440703f, 0.429686f, 0.410030f, 0.382492f, 0.347214f, 0.305126f, 0.258387f, 0.209075f, 0.158069f, 0.105330f, 0.050877f, -0.004290f, -0.057880f, -0.107405f, -0.152051f, -0.192952f, -0.231334f, -0.267030f, -0.298914f, -0.325959f, -0.347776f, -0.365058f, -0.379559f, -0.392822f, -0.404916f, -0.414926f, -0.422209f, -0.426647f, -0.428320f, -0.427480f, -0.424173f, -0.417634f, -0.406929f, -0.392213f, -0.374383f, -0.353748f, -0.330107f, -0.303575f, -0.274126f, -0.241197f, -0.204995f, -0.167220f, -0.129445f, -0.092017f, -0.055184f, -0.019543f, 0.015178f, 0.049744f, 0.083605f, 0.115480f, 0.145267f, 0.173490f, 0.200772f, 0.229618f, 0.261633f, 0.288462f, 0.292554f, 0.266148f, 0.224956f, 0.193266f, 0.179939f}, + {0.002536f, -0.011235f, -0.018343f, -0.017987f, -0.027166f, -0.031117f, 0.014002f, 0.096526f, 0.113126f, -0.016617f, -0.209563f, -0.268875f, -0.109214f, 0.120357f, 0.194165f, 0.064228f, -0.105548f, -0.151938f, -0.085143f, -0.021811f, -0.013168f, -0.007575f, 0.042273f, 0.109306f, 0.142985f, 0.138265f, 0.124567f, 0.114998f, 0.096455f, 0.057758f, 0.004146f, -0.052677f, -0.103477f, -0.141457f, -0.163639f, -0.173107f, -0.175086f, -0.171796f, -0.163515f, -0.151686f, -0.138206f, -0.124227f, -0.111720f, -0.103751f, -0.101586f, -0.103453f, -0.106877f, -0.110322f, -0.112385f, -0.111649f, -0.107834f, -0.101601f, -0.093248f, -0.082860f, -0.071411f, -0.060549f, -0.051523f, -0.045052f, -0.041731f, -0.041860f, -0.045219f, -0.051310f, -0.059514f, -0.069016f, -0.079031f, -0.088966f, -0.098149f, -0.105768f, -0.111299f, -0.114442f, -0.114537f, -0.110675f, -0.102450f, -0.090007f, -0.073514f, -0.053290f, -0.030165f, -0.005135f, 0.020901f, 0.046733f, 0.071073f, 0.093736f, 0.115568f, 0.136842f, 0.156886f, 0.175538f, 0.193455f, 0.210815f, 0.227567f, 0.245363f, 0.267074f, 0.293421f, 0.321639f, 0.348399f, 0.372776f, 0.395534f, + 0.416417f, 0.432977f, 0.441812f, 0.440703f, 0.429686f, 0.410030f, 0.382492f, 0.347214f, 0.305126f, 0.258387f, 0.209075f, 0.158069f, 0.105330f, 0.050877f, -0.004290f, -0.057880f, -0.107405f, -0.152051f, -0.192952f, -0.231334f, -0.267030f, -0.298914f, -0.325959f, -0.347776f, -0.365058f, -0.379559f, -0.392822f, -0.404916f, -0.414926f, -0.422209f, -0.426647f, -0.428320f, -0.427480f, -0.424173f, -0.417634f, -0.406929f, -0.392213f, -0.374383f, -0.353748f, -0.330107f, -0.303575f, -0.274126f, -0.241197f, -0.204995f, -0.167220f, -0.129445f, -0.092017f, -0.055184f, -0.019543f, 0.015178f, 0.049744f, 0.083605f, 0.115480f, 0.145267f, 0.173490f, 0.200772f, 0.229618f, 0.261633f, 0.288462f, 0.292554f, 0.266148f, 0.224956f, 0.193266f, 0.179939f} + }, + { + {-0.007328f, -0.006633f, -0.005516f, -0.004599f, -0.006212f, -0.012944f, -0.019712f, -0.012267f, 0.011010f, 0.016826f, -0.032596f, -0.108239f, -0.110945f, 0.010212f, 0.155530f, 0.161358f, 0.002569f, -0.158036f, -0.158582f, -0.022168f, 0.096234f, 0.102029f, 0.035418f, -0.022187f, -0.041382f, -0.034394f, -0.010242f, 0.027669f, 0.066023f, 0.089774f, 0.096851f, 0.093676f, 0.085029f, 0.075093f, 0.069304f, 0.068251f, 0.065239f, 0.053828f, 0.033768f, 0.008271f, -0.019582f, -0.046238f, -0.067687f, -0.081975f, -0.089777f, -0.092397f, -0.091138f, -0.088118f, -0.085559f, -0.084325f, -0.084372f, -0.085968f, -0.089285f, -0.093494f, -0.097292f, -0.099890f, -0.100991f, -0.100590f, -0.099298f, -0.098219f, -0.098141f, -0.099359f, -0.102222f, -0.107041f, -0.113405f, -0.120380f, -0.127461f, -0.134664f, -0.141768f, -0.148230f, -0.153822f, -0.158600f, -0.162259f, -0.164282f, -0.164806f, -0.164594f, -0.163969f, -0.162482f, -0.159958f, -0.157223f, -0.155192f, -0.153484f, -0.150650f, -0.145885f, -0.139922f, -0.133722f, -0.126676f, -0.116974f, -0.103893f, -0.088961f, -0.074475f, -0.061464f, -0.049642f, -0.038896f, -0.030151f, -0.024762f, + -0.023313f, -0.025007f, -0.028346f, -0.032647f, -0.038714f, -0.047598f, -0.058798f, -0.070133f, -0.079232f, -0.084838f, -0.087074f, -0.087043f, -0.085895f, -0.083734f, -0.079604f, -0.072780f, -0.063696f, -0.053433f, -0.042909f, -0.032749f, -0.023224f, -0.013965f, -0.004302f, 0.005932f, 0.016369f, 0.026824f, 0.037430f, 0.048223f, 0.059127f, 0.070106f, 0.080829f, 0.090562f, 0.098820f, 0.105730f, 0.111496f, 0.116170f, 0.120110f, 0.123911f, 0.127778f, 0.131714f, 0.136211f, 0.141890f, 0.148771f, 0.156783f, 0.166411f, 0.177897f, 0.190546f, 0.203691f, 0.217322f, 0.230936f, 0.243185f, 0.253500f, 0.262398f, 0.269552f, 0.273836f, 0.275598f, 0.275116f, 0.267347f, 0.243149f, 0.200413f, 0.151683f, 0.115625f, 0.100371f, 0.098325f}, + {-0.007328f, -0.006633f, -0.005516f, -0.004599f, -0.006212f, -0.012944f, -0.019712f, -0.012267f, 0.011010f, 0.016826f, -0.032596f, -0.108239f, -0.110945f, 0.010212f, 0.155530f, 0.161358f, 0.002569f, -0.158036f, -0.158582f, -0.022168f, 0.096234f, 0.102029f, 0.035418f, -0.022187f, -0.041382f, -0.034394f, -0.010242f, 0.027669f, 0.066023f, 0.089774f, 0.096851f, 0.093676f, 0.085029f, 0.075093f, 0.069304f, 0.068251f, 0.065239f, 0.053828f, 0.033768f, 0.008271f, -0.019582f, -0.046238f, -0.067687f, -0.081975f, -0.089777f, -0.092397f, -0.091138f, -0.088118f, -0.085559f, -0.084325f, -0.084372f, -0.085968f, -0.089285f, -0.093494f, -0.097292f, -0.099890f, -0.100991f, -0.100590f, -0.099298f, -0.098219f, -0.098141f, -0.099359f, -0.102222f, -0.107041f, -0.113405f, -0.120380f, -0.127461f, -0.134664f, -0.141768f, -0.148230f, -0.153822f, -0.158600f, -0.162259f, -0.164282f, -0.164806f, -0.164594f, -0.163969f, -0.162482f, -0.159958f, -0.157223f, -0.155192f, -0.153484f, -0.150650f, -0.145885f, -0.139922f, -0.133722f, -0.126676f, -0.116974f, -0.103893f, -0.088961f, -0.074475f, -0.061464f, -0.049642f, -0.038896f, -0.030151f, -0.024762f, + -0.023313f, -0.025007f, -0.028346f, -0.032647f, -0.038714f, -0.047598f, -0.058798f, -0.070133f, -0.079232f, -0.084838f, -0.087074f, -0.087043f, -0.085895f, -0.083734f, -0.079604f, -0.072780f, -0.063696f, -0.053433f, -0.042909f, -0.032749f, -0.023224f, -0.013965f, -0.004302f, 0.005932f, 0.016369f, 0.026824f, 0.037430f, 0.048223f, 0.059127f, 0.070106f, 0.080829f, 0.090562f, 0.098820f, 0.105730f, 0.111496f, 0.116170f, 0.120110f, 0.123911f, 0.127778f, 0.131714f, 0.136211f, 0.141890f, 0.148771f, 0.156783f, 0.166411f, 0.177897f, 0.190546f, 0.203691f, 0.217322f, 0.230936f, 0.243185f, 0.253500f, 0.262398f, 0.269552f, 0.273836f, 0.275598f, 0.275116f, 0.267347f, 0.243149f, 0.200413f, 0.151683f, 0.115625f, 0.100371f, 0.098325f} + } +}; +const float CRendBin_HOA3_HRIR_coeff_im_32kHz[16][BINAURAL_CHANNELS][160]={ + { + {-0.177155f, -0.484920f, -0.682869f, -0.761752f, -0.745718f, -0.674718f, -0.586917f, -0.482404f, -0.323473f, -0.100471f, 0.137830f, 0.347770f, 0.515555f, 0.566254f, 0.359251f, -0.086918f, -0.443496f, -0.353479f, 0.114347f, 0.475511f, 0.361546f, -0.104600f, -0.537424f, -0.735340f, -0.767713f, -0.738461f, -0.652325f, -0.500399f, -0.328661f, -0.180340f, -0.049198f, 0.080145f, 0.196917f, 0.288813f, 0.363706f, 0.431260f, 0.488625f, 0.533226f, 0.570447f, 0.603809f, 0.631651f, 0.654656f, 0.675784f, 0.694117f, 0.707260f, 0.716931f, 0.725662f, 0.732120f, 0.734801f, 0.735754f, 0.736687f, 0.736053f, 0.732755f, 0.728224f, 0.723115f, 0.716287f, 0.707887f, 0.699554f, 0.691466f, 0.682668f, 0.673667f, 0.665599f, 0.657918f, 0.649616f, 0.641313f, 0.633915f, 0.626849f, 0.619441f, 0.612311f, 0.606005f, 0.599945f, 0.593699f, 0.587698f, 0.582110f, 0.576431f, 0.570429f, 0.564305f, 0.558028f, 0.551423f, 0.544461f, 0.536876f, 0.528280f, 0.519027f, 0.509876f, 0.500638f, 0.490479f, 0.479610f, 0.469155f, 0.459295f, 0.449057f, 0.438057f, 0.427113f, 0.417049f, 0.407963f, 0.399612f, 0.391749f, + 0.384343f, 0.377949f, 0.373333f, 0.370329f, 0.367819f, 0.365141f, 0.362755f, 0.361280f, 0.360647f, 0.360347f, 0.359797f, 0.358471f, 0.356317f, 0.353956f, 0.351882f, 0.349712f, 0.346702f, 0.342595f, 0.337552f, 0.331788f, 0.325668f, 0.319629f, 0.313630f, 0.307181f, 0.300093f, 0.292690f, 0.285228f, 0.277698f, 0.270172f, 0.262734f, 0.255155f, 0.247216f, 0.239186f, 0.231499f, 0.224227f, 0.217314f, 0.210913f, 0.205028f, 0.199309f, 0.193614f, 0.188221f, 0.183218f, 0.178349f, 0.173647f, 0.169348f, 0.165068f, 0.160062f, 0.154266f, 0.147958f, 0.140640f, 0.131659f, 0.121348f, 0.109799f, 0.095537f, 0.077450f, 0.055356f, 0.024498f, -0.025904f, -0.097692f, -0.166710f, -0.194224f, -0.163866f, -0.098435f, -0.031004f}, + {-0.177155f, -0.484920f, -0.682869f, -0.761752f, -0.745718f, -0.674718f, -0.586917f, -0.482404f, -0.323473f, -0.100471f, 0.137830f, 0.347770f, 0.515555f, 0.566254f, 0.359251f, -0.086918f, -0.443496f, -0.353479f, 0.114347f, 0.475511f, 0.361546f, -0.104600f, -0.537424f, -0.735340f, -0.767713f, -0.738461f, -0.652325f, -0.500399f, -0.328661f, -0.180340f, -0.049198f, 0.080145f, 0.196917f, 0.288813f, 0.363706f, 0.431260f, 0.488625f, 0.533226f, 0.570447f, 0.603809f, 0.631651f, 0.654656f, 0.675784f, 0.694117f, 0.707260f, 0.716931f, 0.725662f, 0.732120f, 0.734801f, 0.735754f, 0.736687f, 0.736053f, 0.732755f, 0.728224f, 0.723115f, 0.716287f, 0.707887f, 0.699554f, 0.691466f, 0.682668f, 0.673667f, 0.665599f, 0.657918f, 0.649616f, 0.641313f, 0.633915f, 0.626849f, 0.619441f, 0.612311f, 0.606005f, 0.599945f, 0.593699f, 0.587698f, 0.582110f, 0.576431f, 0.570429f, 0.564305f, 0.558028f, 0.551423f, 0.544461f, 0.536876f, 0.528280f, 0.519027f, 0.509876f, 0.500638f, 0.490479f, 0.479610f, 0.469155f, 0.459295f, 0.449057f, 0.438057f, 0.427113f, 0.417049f, 0.407963f, 0.399612f, 0.391749f, + 0.384343f, 0.377949f, 0.373333f, 0.370329f, 0.367819f, 0.365141f, 0.362755f, 0.361280f, 0.360647f, 0.360347f, 0.359797f, 0.358471f, 0.356317f, 0.353956f, 0.351882f, 0.349712f, 0.346702f, 0.342595f, 0.337552f, 0.331788f, 0.325668f, 0.319629f, 0.313630f, 0.307181f, 0.300093f, 0.292690f, 0.285228f, 0.277698f, 0.270172f, 0.262734f, 0.255155f, 0.247216f, 0.239186f, 0.231499f, 0.224227f, 0.217314f, 0.210913f, 0.205028f, 0.199309f, 0.193614f, 0.188221f, 0.183218f, 0.178349f, 0.173647f, 0.169348f, 0.165068f, 0.160062f, 0.154266f, 0.147958f, 0.140640f, 0.131659f, 0.121348f, 0.109799f, 0.095537f, 0.077450f, 0.055356f, 0.024498f, -0.025904f, -0.097692f, -0.166710f, -0.194224f, -0.163866f, -0.098435f, -0.031004f} + }, + { + {0.139549f, 0.336827f, 0.308435f, 0.005808f, -0.462640f, -0.907220f, -1.191107f, -1.249724f, -1.052267f, -0.648374f, -0.184425f, 0.248777f, 0.689047f, 1.057228f, 0.989213f, 0.254777f, -0.678946f, -0.922096f, -0.180074f, 0.815838f, 1.130295f, 0.630480f, -0.085113f, -0.526462f, -0.708792f, -0.811530f, -0.847619f, -0.768858f, -0.635090f, -0.531932f, -0.451007f, -0.348401f, -0.234607f, -0.140241f, -0.058435f, 0.029303f, 0.116774f, 0.194059f, 0.268152f, 0.343788f, 0.412925f, 0.472537f, 0.528731f, 0.581041f, 0.623246f, 0.657416f, 0.689726f, 0.717764f, 0.736441f, 0.749186f, 0.761628f, 0.772404f, 0.779073f, 0.784280f, 0.789592f, 0.791949f, 0.790280f, 0.787315f, 0.783161f, 0.775216f, 0.764362f, 0.753702f, 0.742584f, 0.728749f, 0.713786f, 0.700391f, 0.687515f, 0.673424f, 0.659785f, 0.648526f, 0.638593f, 0.629023f, 0.621278f, 0.616302f, 0.612923f, 0.610405f, 0.609282f, 0.609387f, 0.609910f, 0.610809f, 0.611881f, 0.611943f, 0.610799f, 0.609839f, 0.609254f, 0.607395f, 0.603956f, 0.600774f, 0.598705f, 0.596760f, 0.594697f, 0.593483f, 0.593097f, 0.592548f, 0.591657f, 0.590509f, + 0.588008f, 0.583041f, 0.575878f, 0.566779f, 0.554791f, 0.539385f, 0.521605f, 0.502464f, 0.481918f, 0.460090f, 0.437796f, 0.415604f, 0.394034f, 0.374531f, 0.358494f, 0.345637f, 0.334728f, 0.325270f, 0.317257f, 0.310383f, 0.304694f, 0.300804f, 0.298429f, 0.295932f, 0.292037f, 0.286783f, 0.280539f, 0.273591f, 0.266789f, 0.260976f, 0.255734f, 0.250105f, 0.244196f, 0.238683f, 0.233398f, 0.227855f, 0.222384f, 0.217379f, 0.212359f, 0.206958f, 0.201751f, 0.197057f, 0.192250f, 0.187098f, 0.182271f, 0.177860f, 0.173126f, 0.168131f, 0.163596f, 0.158984f, 0.153008f, 0.145729f, 0.137439f, 0.126380f, 0.110802f, 0.090574f, 0.060909f, 0.008923f, -0.070270f, -0.152060f, -0.192269f, -0.168828f, -0.103696f, -0.033024f}, + {-0.139549f, -0.336827f, -0.308435f, -0.005808f, 0.462640f, 0.907220f, 1.191107f, 1.249724f, 1.052267f, 0.648374f, 0.184425f, -0.248777f, -0.689047f, -1.057228f, -0.989213f, -0.254777f, 0.678946f, 0.922096f, 0.180074f, -0.815838f, -1.130295f, -0.630480f, 0.085113f, 0.526462f, 0.708792f, 0.811530f, 0.847619f, 0.768858f, 0.635090f, 0.531932f, 0.451007f, 0.348401f, 0.234607f, 0.140241f, 0.058435f, -0.029303f, -0.116774f, -0.194059f, -0.268152f, -0.343788f, -0.412925f, -0.472537f, -0.528731f, -0.581041f, -0.623246f, -0.657416f, -0.689726f, -0.717764f, -0.736441f, -0.749186f, -0.761628f, -0.772404f, -0.779073f, -0.784280f, -0.789592f, -0.791949f, -0.790280f, -0.787315f, -0.783161f, -0.775216f, -0.764362f, -0.753702f, -0.742584f, -0.728749f, -0.713786f, -0.700391f, -0.687515f, -0.673424f, -0.659785f, -0.648526f, -0.638593f, -0.629023f, -0.621278f, -0.616302f, -0.612923f, -0.610405f, -0.609282f, -0.609387f, -0.609910f, -0.610809f, -0.611881f, -0.611943f, -0.610799f, -0.609839f, -0.609254f, -0.607395f, -0.603956f, -0.600774f, -0.598705f, -0.596760f, -0.594697f, -0.593483f, -0.593097f, -0.592548f, -0.591657f, -0.590509f, + -0.588008f, -0.583041f, -0.575878f, -0.566779f, -0.554791f, -0.539385f, -0.521605f, -0.502464f, -0.481918f, -0.460090f, -0.437796f, -0.415604f, -0.394034f, -0.374531f, -0.358494f, -0.345637f, -0.334728f, -0.325270f, -0.317257f, -0.310383f, -0.304694f, -0.300804f, -0.298429f, -0.295932f, -0.292037f, -0.286783f, -0.280539f, -0.273591f, -0.266789f, -0.260976f, -0.255734f, -0.250105f, -0.244196f, -0.238683f, -0.233398f, -0.227855f, -0.222384f, -0.217379f, -0.212359f, -0.206958f, -0.201751f, -0.197057f, -0.192250f, -0.187098f, -0.182271f, -0.177860f, -0.173126f, -0.168131f, -0.163596f, -0.158984f, -0.153008f, -0.145729f, -0.137439f, -0.126380f, -0.110802f, -0.090574f, -0.060909f, -0.008923f, 0.070270f, 0.152060f, 0.192269f, 0.168828f, 0.103696f, 0.033024f} + }, + { + {-0.016760f, -0.068127f, -0.130493f, -0.141089f, -0.067185f, 0.038675f, 0.094614f, 0.073852f, 0.012198f, -0.044998f, -0.074922f, -0.067552f, -0.018229f, 0.053871f, 0.096099f, 0.062126f, -0.025556f, -0.075695f, -0.021847f, 0.089982f, 0.140592f, 0.069052f, -0.066385f, -0.166455f, -0.193584f, -0.177205f, -0.151753f, -0.126106f, -0.100111f, -0.076682f, -0.055033f, -0.030919f, -0.006099f, 0.012632f, 0.022449f, 0.025150f, 0.022366f, 0.016890f, 0.015159f, 0.022388f, 0.037604f, 0.057012f, 0.079078f, 0.103587f, 0.129254f, 0.155163f, 0.182207f, 0.211436f, 0.242891f, 0.276638f, 0.312764f, 0.349989f, 0.386121f, 0.419912f, 0.450938f, 0.478114f, 0.499957f, 0.515976f, 0.526465f, 0.531211f, 0.529467f, 0.520866f, 0.505422f, 0.482804f, 0.452352f, 0.413839f, 0.367819f, 0.315251f, 0.257155f, 0.194777f, 0.129844f, 0.064384f, 0.000411f, -0.059995f, -0.114688f, -0.162166f, -0.202053f, -0.234163f, -0.257536f, -0.271541f, -0.277603f, -0.278229f, -0.274214f, -0.264528f, -0.249435f, -0.231884f, -0.214667f, -0.197504f, -0.178344f, -0.156843f, -0.135208f, -0.115847f, -0.099323f, -0.084813f, -0.071766f, -0.060680f, + -0.052653f, -0.048607f, -0.048842f, -0.052934f, -0.059893f, -0.068614f, -0.078462f, -0.089482f, -0.101882f, -0.115125f, -0.127566f, -0.137225f, -0.143085f, -0.145562f, -0.145628f, -0.143674f, -0.139331f, -0.132079f, -0.121698f, -0.108283f, -0.092209f, -0.074130f, -0.054844f, -0.035153f, -0.015868f, 0.002272f, 0.018784f, 0.033372f, 0.045644f, 0.055147f, 0.061721f, 0.065625f, 0.067291f, 0.067129f, 0.065460f, 0.062524f, 0.058672f, 0.054690f, 0.051618f, 0.050121f, 0.050200f, 0.051436f, 0.053045f, 0.053826f, 0.052774f, 0.049901f, 0.045925f, 0.041164f, 0.035363f, 0.028499f, 0.020965f, 0.012908f, 0.004149f, -0.005086f, -0.014196f, -0.023368f, -0.034007f, -0.046830f, -0.059022f, -0.064250f, -0.057433f, -0.040349f, -0.021042f, -0.006032f}, + {-0.016760f, -0.068127f, -0.130493f, -0.141089f, -0.067185f, 0.038675f, 0.094614f, 0.073852f, 0.012198f, -0.044998f, -0.074922f, -0.067552f, -0.018229f, 0.053871f, 0.096099f, 0.062126f, -0.025556f, -0.075695f, -0.021847f, 0.089982f, 0.140592f, 0.069052f, -0.066385f, -0.166455f, -0.193584f, -0.177205f, -0.151753f, -0.126106f, -0.100111f, -0.076682f, -0.055033f, -0.030919f, -0.006099f, 0.012632f, 0.022449f, 0.025150f, 0.022366f, 0.016890f, 0.015159f, 0.022388f, 0.037604f, 0.057012f, 0.079078f, 0.103587f, 0.129254f, 0.155163f, 0.182207f, 0.211436f, 0.242891f, 0.276638f, 0.312764f, 0.349989f, 0.386121f, 0.419912f, 0.450938f, 0.478114f, 0.499957f, 0.515976f, 0.526465f, 0.531211f, 0.529467f, 0.520866f, 0.505422f, 0.482804f, 0.452352f, 0.413839f, 0.367819f, 0.315251f, 0.257155f, 0.194777f, 0.129844f, 0.064384f, 0.000411f, -0.059995f, -0.114688f, -0.162166f, -0.202053f, -0.234163f, -0.257536f, -0.271541f, -0.277603f, -0.278229f, -0.274214f, -0.264528f, -0.249435f, -0.231884f, -0.214667f, -0.197504f, -0.178344f, -0.156843f, -0.135208f, -0.115847f, -0.099323f, -0.084813f, -0.071766f, -0.060680f, + -0.052653f, -0.048607f, -0.048842f, -0.052934f, -0.059893f, -0.068614f, -0.078462f, -0.089482f, -0.101882f, -0.115125f, -0.127566f, -0.137225f, -0.143085f, -0.145562f, -0.145628f, -0.143674f, -0.139331f, -0.132079f, -0.121698f, -0.108283f, -0.092209f, -0.074130f, -0.054844f, -0.035153f, -0.015868f, 0.002272f, 0.018784f, 0.033372f, 0.045644f, 0.055147f, 0.061721f, 0.065625f, 0.067291f, 0.067129f, 0.065460f, 0.062524f, 0.058672f, 0.054690f, 0.051618f, 0.050121f, 0.050200f, 0.051436f, 0.053045f, 0.053826f, 0.052774f, 0.049901f, 0.045925f, 0.041164f, 0.035363f, 0.028499f, 0.020965f, 0.012908f, 0.004149f, -0.005086f, -0.014196f, -0.023368f, -0.034007f, -0.046830f, -0.059022f, -0.064250f, -0.057433f, -0.040349f, -0.021042f, -0.006032f} + }, + { + {0.006216f, -0.000979f, -0.045405f, -0.098459f, -0.108142f, -0.058042f, 0.002286f, 0.006399f, -0.050505f, -0.107869f, -0.115965f, -0.079002f, -0.014058f, 0.076297f, 0.153748f, 0.129221f, -0.022377f, -0.165863f, -0.124719f, 0.094586f, 0.284198f, 0.268252f, 0.080217f, -0.126623f, -0.267666f, -0.362720f, -0.439083f, -0.483302f, -0.481861f, -0.448478f, -0.398948f, -0.332421f, -0.246125f, -0.147271f, -0.044899f, 0.056214f, 0.151234f, 0.234458f, 0.303629f, 0.359457f, 0.402431f, 0.433847f, 0.456921f, 0.473698f, 0.483757f, 0.487573f, 0.487588f, 0.484776f, 0.477584f, 0.465086f, 0.448287f, 0.428309f, 0.406263f, 0.384767f, 0.366877f, 0.353378f, 0.342840f, 0.333747f, 0.325088f, 0.315678f, 0.304608f, 0.292048f, 0.278687f, 0.264811f, 0.250511f, 0.236166f, 0.222031f, 0.207593f, 0.191859f, 0.174275f, 0.155036f, 0.134348f, 0.111748f, 0.086766f, 0.060081f, 0.033085f, 0.006337f, -0.020341f, -0.046077f, -0.068901f, -0.087990f, -0.104276f, -0.118054f, -0.127804f, -0.132542f, -0.133724f, -0.133430f, -0.132008f, -0.128923f, -0.124704f, -0.120371f, -0.115592f, -0.108930f, -0.099692f, -0.088366f, -0.075241f, + -0.059512f, -0.040057f, -0.016699f, 0.009565f, 0.037530f, 0.066848f, 0.097910f, 0.130575f, 0.163378f, 0.194394f, 0.222759f, 0.248920f, 0.273442f, 0.295928f, 0.315131f, 0.329956f, 0.340466f, 0.348121f, 0.354815f, 0.361328f, 0.366754f, 0.369576f, 0.369190f, 0.366386f, 0.362766f, 0.359901f, 0.358565f, 0.358337f, 0.358068f, 0.356967f, 0.355150f, 0.353203f, 0.351625f, 0.350678f, 0.350257f, 0.349702f, 0.348075f, 0.344733f, 0.339480f, 0.332348f, 0.323551f, 0.313435f, 0.302117f, 0.289340f, 0.274852f, 0.258681f, 0.241042f, 0.222363f, 0.203342f, 0.184581f, 0.166338f, 0.148863f, 0.132320f, 0.116204f, 0.099819f, 0.082819f, 0.062865f, 0.033748f, -0.008051f, -0.052501f, -0.078525f, -0.073596f, -0.046585f, -0.015014f}, + {0.006216f, -0.000979f, -0.045405f, -0.098459f, -0.108142f, -0.058042f, 0.002286f, 0.006399f, -0.050505f, -0.107869f, -0.115965f, -0.079002f, -0.014058f, 0.076297f, 0.153748f, 0.129221f, -0.022377f, -0.165863f, -0.124719f, 0.094586f, 0.284198f, 0.268252f, 0.080217f, -0.126623f, -0.267666f, -0.362720f, -0.439083f, -0.483302f, -0.481861f, -0.448478f, -0.398948f, -0.332421f, -0.246125f, -0.147271f, -0.044899f, 0.056214f, 0.151234f, 0.234458f, 0.303629f, 0.359457f, 0.402431f, 0.433847f, 0.456921f, 0.473698f, 0.483757f, 0.487573f, 0.487588f, 0.484776f, 0.477584f, 0.465086f, 0.448287f, 0.428309f, 0.406263f, 0.384767f, 0.366877f, 0.353378f, 0.342840f, 0.333747f, 0.325088f, 0.315678f, 0.304608f, 0.292048f, 0.278687f, 0.264811f, 0.250511f, 0.236166f, 0.222031f, 0.207593f, 0.191859f, 0.174275f, 0.155036f, 0.134348f, 0.111748f, 0.086766f, 0.060081f, 0.033085f, 0.006337f, -0.020341f, -0.046077f, -0.068901f, -0.087990f, -0.104276f, -0.118054f, -0.127804f, -0.132542f, -0.133724f, -0.133430f, -0.132008f, -0.128923f, -0.124704f, -0.120371f, -0.115592f, -0.108930f, -0.099692f, -0.088366f, -0.075241f, + -0.059512f, -0.040057f, -0.016699f, 0.009565f, 0.037530f, 0.066848f, 0.097910f, 0.130575f, 0.163378f, 0.194394f, 0.222759f, 0.248920f, 0.273442f, 0.295928f, 0.315131f, 0.329956f, 0.340466f, 0.348121f, 0.354815f, 0.361328f, 0.366754f, 0.369576f, 0.369190f, 0.366386f, 0.362766f, 0.359901f, 0.358565f, 0.358337f, 0.358068f, 0.356967f, 0.355150f, 0.353203f, 0.351625f, 0.350678f, 0.350257f, 0.349702f, 0.348075f, 0.344733f, 0.339480f, 0.332348f, 0.323551f, 0.313435f, 0.302117f, 0.289340f, 0.274852f, 0.258681f, 0.241042f, 0.222363f, 0.203342f, 0.184581f, 0.166338f, 0.148863f, 0.132320f, 0.116204f, 0.099819f, 0.082819f, 0.062865f, 0.033748f, -0.008051f, -0.052501f, -0.078525f, -0.073596f, -0.046585f, -0.015014f} + }, + { + {-0.004287f, -0.004125f, 0.010669f, 0.024630f, 0.019494f, 0.000957f, -0.007771f, -0.004086f, -0.018999f, -0.078706f, -0.163526f, -0.211376f, -0.156788f, 0.013090f, 0.206855f, 0.257968f, 0.082065f, -0.182440f, -0.272081f, -0.081322f, 0.212807f, 0.354516f, 0.275100f, 0.096863f, -0.061422f, -0.184431f, -0.290052f, -0.362546f, -0.382821f, -0.365049f, -0.332356f, -0.287833f, -0.227815f, -0.159321f, -0.089659f, -0.016005f, 0.063671f, 0.140956f, 0.205111f, 0.252511f, 0.284711f, 0.304370f, 0.315455f, 0.322285f, 0.326832f, 0.329503f, 0.331399f, 0.333108f, 0.333026f, 0.329471f, 0.322961f, 0.314750f, 0.305096f, 0.294458f, 0.284464f, 0.276331f, 0.269753f, 0.264070f, 0.259113f, 0.254491f, 0.249431f, 0.243603f, 0.237011f, 0.229139f, 0.219355f, 0.207972f, 0.195732f, 0.182410f, 0.167075f, 0.149600f, 0.130686f, 0.110376f, 0.087751f, 0.062438f, 0.035361f, 0.007458f, -0.021421f, -0.051426f, -0.081166f, -0.108532f, -0.132991f, -0.155787f, -0.177450f, -0.196472f, -0.211501f, -0.223729f, -0.235413f, -0.246432f, -0.254147f, -0.256866f, -0.255699f, -0.252400f, -0.246930f, -0.238183f, -0.226128f, -0.212153f, + -0.197762f, -0.183576f, -0.169356f, -0.154687f, -0.139838f, -0.125919f, -0.113952f, -0.104109f, -0.096147f, -0.089874f, -0.084624f, -0.079081f, -0.072485f, -0.065470f, -0.059088f, -0.053584f, -0.048459f, -0.042892f, -0.035834f, -0.026742f, -0.016583f, -0.007210f, 0.000460f, 0.006925f, 0.013101f, 0.019829f, 0.027937f, 0.037640f, 0.048171f, 0.058820f, 0.069767f, 0.081298f, 0.093098f, 0.104818f, 0.116218f, 0.126365f, 0.133907f, 0.138397f, 0.140204f, 0.139366f, 0.135883f, 0.130589f, 0.124266f, 0.116642f, 0.107629f, 0.098425f, 0.090176f, 0.083055f, 0.077635f, 0.075176f, 0.075705f, 0.078026f, 0.081969f, 0.088024f, 0.095261f, 0.102733f, 0.111115f, 0.118029f, 0.114164f, 0.091680f, 0.056373f, 0.024417f, 0.006512f, 0.000770f}, + {0.004287f, 0.004125f, -0.010669f, -0.024630f, -0.019494f, -0.000957f, 0.007771f, 0.004086f, 0.018999f, 0.078706f, 0.163526f, 0.211376f, 0.156788f, -0.013090f, -0.206855f, -0.257968f, -0.082065f, 0.182440f, 0.272081f, 0.081322f, -0.212807f, -0.354516f, -0.275100f, -0.096863f, 0.061422f, 0.184431f, 0.290052f, 0.362546f, 0.382821f, 0.365049f, 0.332356f, 0.287833f, 0.227815f, 0.159321f, 0.089659f, 0.016005f, -0.063671f, -0.140956f, -0.205111f, -0.252511f, -0.284711f, -0.304370f, -0.315455f, -0.322285f, -0.326832f, -0.329503f, -0.331399f, -0.333108f, -0.333026f, -0.329471f, -0.322961f, -0.314750f, -0.305096f, -0.294458f, -0.284464f, -0.276331f, -0.269753f, -0.264070f, -0.259113f, -0.254491f, -0.249431f, -0.243603f, -0.237011f, -0.229139f, -0.219355f, -0.207972f, -0.195732f, -0.182410f, -0.167075f, -0.149600f, -0.130686f, -0.110376f, -0.087751f, -0.062438f, -0.035361f, -0.007458f, 0.021421f, 0.051426f, 0.081166f, 0.108532f, 0.132991f, 0.155787f, 0.177450f, 0.196472f, 0.211501f, 0.223729f, 0.235413f, 0.246432f, 0.254147f, 0.256866f, 0.255699f, 0.252400f, 0.246930f, 0.238183f, 0.226128f, 0.212153f, + 0.197762f, 0.183576f, 0.169356f, 0.154687f, 0.139838f, 0.125919f, 0.113952f, 0.104109f, 0.096147f, 0.089874f, 0.084624f, 0.079081f, 0.072485f, 0.065470f, 0.059088f, 0.053584f, 0.048459f, 0.042892f, 0.035834f, 0.026742f, 0.016583f, 0.007210f, -0.000460f, -0.006925f, -0.013101f, -0.019829f, -0.027937f, -0.037640f, -0.048171f, -0.058820f, -0.069767f, -0.081298f, -0.093098f, -0.104818f, -0.116218f, -0.126365f, -0.133907f, -0.138397f, -0.140204f, -0.139366f, -0.135883f, -0.130589f, -0.124266f, -0.116642f, -0.107629f, -0.098425f, -0.090176f, -0.083055f, -0.077635f, -0.075176f, -0.075705f, -0.078026f, -0.081969f, -0.088024f, -0.095261f, -0.102733f, -0.111115f, -0.118029f, -0.114164f, -0.091680f, -0.056373f, -0.024417f, -0.006512f, -0.000770f} + }, + { + {-0.021647f, -0.023586f, 0.024030f, 0.034286f, -0.023210f, -0.048883f, 0.041004f, 0.162430f, 0.151420f, -0.019026f, -0.196878f, -0.228185f, -0.105491f, 0.063785f, 0.163457f, 0.131089f, -0.006547f, -0.126856f, -0.104754f, 0.046404f, 0.175190f, 0.165514f, 0.060007f, -0.021876f, -0.031457f, -0.005672f, 0.019840f, 0.046199f, 0.074668f, 0.089172f, 0.080103f, 0.054860f, 0.022313f, -0.014010f, -0.049302f, -0.079262f, -0.106213f, -0.133194f, -0.155736f, -0.166838f, -0.165427f, -0.154608f, -0.136822f, -0.115133f, -0.094431f, -0.077550f, -0.063253f, -0.049405f, -0.034984f, -0.018856f, -0.000016f, 0.020853f, 0.042649f, 0.066048f, 0.092202f, 0.120165f, 0.147513f, 0.172493f, 0.194076f, 0.210899f, 0.221573f, 0.225505f, 0.222686f, 0.213027f, 0.196166f, 0.171640f, 0.139274f, 0.099475f, 0.052952f, 0.000374f, -0.057162f, -0.117584f, -0.178302f, -0.236900f, -0.291078f, -0.338764f, -0.378809f, -0.410753f, -0.433773f, -0.447178f, -0.452109f, -0.450928f, -0.444375f, -0.431188f, -0.411190f, -0.386779f, -0.360327f, -0.331827f, -0.300282f, -0.265894f, -0.229528f, -0.191072f, -0.149793f, -0.105819f, -0.060219f, -0.013836f, + 0.033000f, 0.079560f, 0.124221f, 0.165296f, 0.202053f, 0.234481f, 0.261993f, 0.282718f, 0.294593f, 0.297426f, 0.293710f, 0.286928f, 0.278788f, 0.268248f, 0.253380f, 0.233961f, 0.212129f, 0.190864f, 0.172155f, 0.156250f, 0.142108f, 0.128607f, 0.115645f, 0.104097f, 0.094743f, 0.087526f, 0.081734f, 0.076398f, 0.070494f, 0.063326f, 0.054855f, 0.045303f, 0.034575f, 0.022541f, 0.009630f, -0.003393f, -0.015973f, -0.027652f, -0.037849f, -0.046228f, -0.052913f, -0.058025f, -0.061573f, -0.063948f, -0.065787f, -0.067201f, -0.067897f, -0.068076f, -0.068265f, -0.068365f, -0.067848f, -0.066716f, -0.065221f, -0.063029f, -0.059813f, -0.056114f, -0.052102f, -0.046012f, -0.035782f, -0.022435f, -0.010202f, -0.002684f, 0.000040f, 0.000220f}, + {0.021647f, 0.023586f, -0.024030f, -0.034286f, 0.023210f, 0.048883f, -0.041004f, -0.162430f, -0.151420f, 0.019026f, 0.196878f, 0.228185f, 0.105491f, -0.063785f, -0.163457f, -0.131089f, 0.006547f, 0.126856f, 0.104754f, -0.046404f, -0.175190f, -0.165514f, -0.060007f, 0.021876f, 0.031457f, 0.005672f, -0.019840f, -0.046199f, -0.074668f, -0.089172f, -0.080103f, -0.054860f, -0.022313f, 0.014010f, 0.049302f, 0.079262f, 0.106213f, 0.133194f, 0.155736f, 0.166838f, 0.165427f, 0.154608f, 0.136822f, 0.115133f, 0.094431f, 0.077550f, 0.063253f, 0.049405f, 0.034984f, 0.018856f, 0.000016f, -0.020853f, -0.042649f, -0.066048f, -0.092202f, -0.120165f, -0.147513f, -0.172493f, -0.194076f, -0.210899f, -0.221573f, -0.225505f, -0.222686f, -0.213027f, -0.196166f, -0.171640f, -0.139274f, -0.099475f, -0.052952f, -0.000374f, 0.057162f, 0.117584f, 0.178302f, 0.236900f, 0.291078f, 0.338764f, 0.378809f, 0.410753f, 0.433773f, 0.447178f, 0.452109f, 0.450928f, 0.444375f, 0.431188f, 0.411190f, 0.386779f, 0.360327f, 0.331827f, 0.300282f, 0.265894f, 0.229528f, 0.191072f, 0.149793f, 0.105819f, 0.060219f, 0.013836f, + -0.033000f, -0.079560f, -0.124221f, -0.165296f, -0.202053f, -0.234481f, -0.261993f, -0.282718f, -0.294593f, -0.297426f, -0.293710f, -0.286928f, -0.278788f, -0.268248f, -0.253380f, -0.233961f, -0.212129f, -0.190864f, -0.172155f, -0.156250f, -0.142108f, -0.128607f, -0.115645f, -0.104097f, -0.094743f, -0.087526f, -0.081734f, -0.076398f, -0.070494f, -0.063326f, -0.054855f, -0.045303f, -0.034575f, -0.022541f, -0.009630f, 0.003393f, 0.015973f, 0.027652f, 0.037849f, 0.046228f, 0.052913f, 0.058025f, 0.061573f, 0.063948f, 0.065787f, 0.067201f, 0.067897f, 0.068076f, 0.068265f, 0.068365f, 0.067848f, 0.066716f, 0.065221f, 0.063029f, 0.059813f, 0.056114f, 0.052102f, 0.046012f, 0.035782f, 0.022435f, 0.010202f, 0.002684f, -0.000040f, -0.000220f} + }, + { + {0.003609f, -0.005875f, -0.035270f, -0.050705f, -0.040591f, -0.034798f, -0.044444f, -0.025022f, 0.068226f, 0.216792f, 0.351580f, 0.390054f, 0.251908f, -0.072078f, -0.407851f, -0.461577f, -0.131618f, 0.295028f, 0.412417f, 0.154332f, -0.160841f, -0.245404f, -0.134932f, -0.021902f, 0.026617f, 0.066919f, 0.111869f, 0.111579f, 0.060602f, 0.013650f, 0.002021f, 0.006513f, 0.007751f, 0.009075f, 0.011723f, 0.007129f, -0.005433f, -0.018170f, -0.029080f, -0.041517f, -0.055476f, -0.069814f, -0.085898f, -0.102492f, -0.114887f, -0.122644f, -0.130213f, -0.138731f, -0.145200f, -0.149398f, -0.153881f, -0.158200f, -0.159672f, -0.158092f, -0.154425f, -0.147404f, -0.135655f, -0.120319f, -0.102543f, -0.081543f, -0.057017f, -0.030152f, -0.001234f, 0.030441f, 0.064037f, 0.097610f, 0.130500f, 0.162490f, 0.191732f, 0.216128f, 0.235437f, 0.249873f, 0.258237f, 0.259193f, 0.252784f, 0.239464f, 0.219178f, 0.192076f, 0.158787f, 0.119949f, 0.076587f, 0.030361f, -0.017694f, -0.067610f, -0.118812f, -0.169500f, -0.218464f, -0.265819f, -0.311413f, -0.354364f, -0.394359f, -0.431201f, -0.462908f, -0.486452f, -0.500620f, -0.506335f, + -0.504246f, -0.493652f, -0.473634f, -0.444204f, -0.407040f, -0.365932f, -0.325349f, -0.287620f, -0.252527f, -0.220028f, -0.191976f, -0.170773f, -0.157796f, -0.153357f, -0.156778f, -0.166233f, -0.179639f, -0.195792f, -0.214111f, -0.233906f, -0.254592f, -0.275719f, -0.296074f, -0.313716f, -0.327512f, -0.337813f, -0.345431f, -0.351001f, -0.355309f, -0.358974f, -0.361805f, -0.363501f, -0.364630f, -0.365878f, -0.366858f, -0.366727f, -0.365312f, -0.362755f, -0.358891f, -0.353770f, -0.347869f, -0.341110f, -0.332548f, -0.321368f, -0.307255f, -0.289895f, -0.269324f, -0.246517f, -0.222440f, -0.197100f, -0.170673f, -0.144380f, -0.118840f, -0.093149f, -0.066936f, -0.040482f, -0.010543f, 0.029314f, 0.077898f, 0.118098f, 0.127883f, 0.102368f, 0.059162f, 0.018211f}, + {0.003609f, -0.005875f, -0.035270f, -0.050705f, -0.040591f, -0.034798f, -0.044444f, -0.025022f, 0.068226f, 0.216792f, 0.351580f, 0.390054f, 0.251908f, -0.072078f, -0.407851f, -0.461577f, -0.131618f, 0.295028f, 0.412417f, 0.154332f, -0.160841f, -0.245404f, -0.134932f, -0.021902f, 0.026617f, 0.066919f, 0.111869f, 0.111579f, 0.060602f, 0.013650f, 0.002021f, 0.006513f, 0.007751f, 0.009075f, 0.011723f, 0.007129f, -0.005433f, -0.018170f, -0.029080f, -0.041517f, -0.055476f, -0.069814f, -0.085898f, -0.102492f, -0.114887f, -0.122644f, -0.130213f, -0.138731f, -0.145200f, -0.149398f, -0.153881f, -0.158200f, -0.159672f, -0.158092f, -0.154425f, -0.147404f, -0.135655f, -0.120319f, -0.102543f, -0.081543f, -0.057017f, -0.030152f, -0.001234f, 0.030441f, 0.064037f, 0.097610f, 0.130500f, 0.162490f, 0.191732f, 0.216128f, 0.235437f, 0.249873f, 0.258237f, 0.259193f, 0.252784f, 0.239464f, 0.219178f, 0.192076f, 0.158787f, 0.119949f, 0.076587f, 0.030361f, -0.017694f, -0.067610f, -0.118812f, -0.169500f, -0.218464f, -0.265819f, -0.311413f, -0.354364f, -0.394359f, -0.431201f, -0.462908f, -0.486452f, -0.500620f, -0.506335f, + -0.504246f, -0.493652f, -0.473634f, -0.444204f, -0.407040f, -0.365932f, -0.325349f, -0.287620f, -0.252527f, -0.220028f, -0.191976f, -0.170773f, -0.157796f, -0.153357f, -0.156778f, -0.166233f, -0.179639f, -0.195792f, -0.214111f, -0.233906f, -0.254592f, -0.275719f, -0.296074f, -0.313716f, -0.327512f, -0.337813f, -0.345431f, -0.351001f, -0.355309f, -0.358974f, -0.361805f, -0.363501f, -0.364630f, -0.365878f, -0.366858f, -0.366727f, -0.365312f, -0.362755f, -0.358891f, -0.353770f, -0.347869f, -0.341110f, -0.332548f, -0.321368f, -0.307255f, -0.289895f, -0.269324f, -0.246517f, -0.222440f, -0.197100f, -0.170673f, -0.144380f, -0.118840f, -0.093149f, -0.066936f, -0.040482f, -0.010543f, 0.029314f, 0.077898f, 0.118098f, 0.127883f, 0.102368f, 0.059162f, 0.018211f} + }, + { + {-0.035571f, -0.082138f, -0.071881f, -0.003092f, 0.101819f, 0.191638f, 0.193745f, 0.076115f, -0.091802f, -0.185433f, -0.151170f, -0.053032f, 0.018984f, 0.043815f, 0.047820f, 0.036034f, -0.003122f, -0.047268f, -0.050528f, -0.006921f, 0.038234f, 0.049115f, 0.039088f, 0.038101f, 0.048336f, 0.050095f, 0.033245f, 0.003517f, -0.032931f, -0.074051f, -0.113659f, -0.141573f, -0.153955f, -0.156842f, -0.158152f, -0.160297f, -0.160824f, -0.156125f, -0.143114f, -0.120343f, -0.089839f, -0.056855f, -0.026374f, -0.000211f, 0.022161f, 0.041369f, 0.057834f, 0.072513f, 0.086354f, 0.099354f, 0.111114f, 0.121809f, 0.131727f, 0.140502f, 0.147687f, 0.153512f, 0.158207f, 0.161156f, 0.161507f, 0.159270f, 0.155236f, 0.150152f, 0.144509f, 0.139018f, 0.134862f, 0.133145f, 0.133984f, 0.136505f, 0.140154f, 0.145498f, 0.153052f, 0.161967f, 0.171013f, 0.180271f, 0.190456f, 0.200982f, 0.210096f, 0.216588f, 0.220074f, 0.219946f, 0.215202f, 0.205145f, 0.189615f, 0.168961f, 0.143969f, 0.114996f, 0.081374f, 0.043024f, 0.002201f, -0.038478f, -0.079680f, -0.124703f, -0.174812f, -0.227318f, -0.278767f, -0.328165f, + -0.376275f, -0.423057f, -0.466602f, -0.504310f, -0.535025f, -0.559812f, -0.579998f, -0.594737f, -0.601786f, -0.600642f, -0.593485f, -0.582907f, -0.569794f, -0.553260f, -0.531574f, -0.503599f, -0.470364f, -0.434785f, -0.399160f, -0.363704f, -0.327884f, -0.291902f, -0.256412f, -0.222128f, -0.190043f, -0.160765f, -0.133592f, -0.107383f, -0.081970f, -0.057569f, -0.033581f, -0.009158f, 0.015876f, 0.041442f, 0.067251f, 0.091897f, 0.113638f, 0.132541f, 0.150206f, 0.167416f, 0.183901f, 0.199680f, 0.214328f, 0.225868f, 0.232832f, 0.236330f, 0.238118f, 0.238385f, 0.237189f, 0.235549f, 0.233292f, 0.228644f, 0.221316f, 0.213017f, 0.204613f, 0.196295f, 0.189029f, 0.180265f, 0.160578f, 0.123113f, 0.075941f, 0.036564f, 0.013988f, 0.003474f}, + {-0.035571f, -0.082138f, -0.071881f, -0.003092f, 0.101819f, 0.191638f, 0.193745f, 0.076115f, -0.091802f, -0.185433f, -0.151170f, -0.053032f, 0.018984f, 0.043815f, 0.047820f, 0.036034f, -0.003122f, -0.047268f, -0.050528f, -0.006921f, 0.038234f, 0.049115f, 0.039088f, 0.038101f, 0.048336f, 0.050095f, 0.033245f, 0.003517f, -0.032931f, -0.074051f, -0.113659f, -0.141573f, -0.153955f, -0.156842f, -0.158152f, -0.160297f, -0.160824f, -0.156125f, -0.143114f, -0.120343f, -0.089839f, -0.056855f, -0.026374f, -0.000211f, 0.022161f, 0.041369f, 0.057834f, 0.072513f, 0.086354f, 0.099354f, 0.111114f, 0.121809f, 0.131727f, 0.140502f, 0.147687f, 0.153512f, 0.158207f, 0.161156f, 0.161507f, 0.159270f, 0.155236f, 0.150152f, 0.144509f, 0.139018f, 0.134862f, 0.133145f, 0.133984f, 0.136505f, 0.140154f, 0.145498f, 0.153052f, 0.161967f, 0.171013f, 0.180271f, 0.190456f, 0.200982f, 0.210096f, 0.216588f, 0.220074f, 0.219946f, 0.215202f, 0.205145f, 0.189615f, 0.168961f, 0.143969f, 0.114996f, 0.081374f, 0.043024f, 0.002201f, -0.038478f, -0.079680f, -0.124703f, -0.174812f, -0.227318f, -0.278767f, -0.328165f, + -0.376275f, -0.423057f, -0.466602f, -0.504310f, -0.535025f, -0.559812f, -0.579998f, -0.594737f, -0.601786f, -0.600642f, -0.593485f, -0.582907f, -0.569794f, -0.553260f, -0.531574f, -0.503599f, -0.470364f, -0.434785f, -0.399160f, -0.363704f, -0.327884f, -0.291902f, -0.256412f, -0.222128f, -0.190043f, -0.160765f, -0.133592f, -0.107383f, -0.081970f, -0.057569f, -0.033581f, -0.009158f, 0.015876f, 0.041442f, 0.067251f, 0.091897f, 0.113638f, 0.132541f, 0.150206f, 0.167416f, 0.183901f, 0.199680f, 0.214328f, 0.225868f, 0.232832f, 0.236330f, 0.238118f, 0.238385f, 0.237189f, 0.235549f, 0.233292f, 0.228644f, 0.221316f, 0.213017f, 0.204613f, 0.196295f, 0.189029f, 0.180265f, 0.160578f, 0.123113f, 0.075941f, 0.036564f, 0.013988f, 0.003474f} + }, + { + {0.042551f, 0.061299f, -0.028672f, -0.144580f, -0.225015f, -0.285627f, -0.304011f, -0.184177f, 0.097749f, 0.418361f, 0.636609f, 0.684969f, 0.487187f, -0.018125f, -0.625221f, -0.833372f, -0.352995f, 0.433022f, 0.798844f, 0.478184f, -0.106003f, -0.434667f, -0.441046f, -0.368821f, -0.347324f, -0.318444f, -0.244373f, -0.171635f, -0.121000f, -0.059037f, 0.023724f, 0.097010f, 0.147728f, 0.189866f, 0.225827f, 0.243381f, 0.241962f, 0.230347f, 0.209235f, 0.177802f, 0.144642f, 0.116772f, 0.090397f, 0.061815f, 0.034477f, 0.010059f, -0.014474f, -0.038175f, -0.056107f, -0.068563f, -0.080545f, -0.093619f, -0.106370f, -0.119695f, -0.134742f, -0.149473f, -0.162326f, -0.174807f, -0.187244f, -0.197268f, -0.204420f, -0.210807f, -0.216408f, -0.219069f, -0.218931f, -0.217754f, -0.214932f, -0.208841f, -0.200539f, -0.192118f, -0.183496f, -0.174075f, -0.165039f, -0.157372f, -0.150168f, -0.142655f, -0.135395f, -0.128631f, -0.122082f, -0.116426f, -0.112435f, -0.109121f, -0.105059f, -0.100419f, -0.095650f, -0.089752f, -0.081852f, -0.072848f, -0.064030f, -0.055849f, -0.048935f, -0.044367f, -0.042466f, -0.043236f, -0.047696f, -0.056506f, + -0.067688f, -0.077997f, -0.086044f, -0.092096f, -0.095584f, -0.094704f, -0.087898f, -0.074555f, -0.055146f, -0.031374f, -0.005109f, 0.023181f, 0.053769f, 0.085647f, 0.116644f, 0.145301f, 0.171246f, 0.194304f, 0.214606f, 0.232833f, 0.249102f, 0.262412f, 0.272200f, 0.279515f, 0.285963f, 0.292502f, 0.299498f, 0.306603f, 0.312397f, 0.315556f, 0.316484f, 0.316658f, 0.316768f, 0.316676f, 0.316453f, 0.316057f, 0.314697f, 0.311795f, 0.307878f, 0.303586f, 0.298738f, 0.293100f, 0.286921f, 0.280025f, 0.271517f, 0.260915f, 0.248546f, 0.234604f, 0.218918f, 0.201792f, 0.184003f, 0.165897f, 0.147257f, 0.128036f, 0.108579f, 0.088849f, 0.067408f, 0.041787f, 0.011933f, -0.015821f, -0.031241f, -0.029810f, -0.017985f, -0.005466f}, + {0.042551f, 0.061299f, -0.028672f, -0.144580f, -0.225015f, -0.285627f, -0.304011f, -0.184177f, 0.097749f, 0.418361f, 0.636609f, 0.684969f, 0.487187f, -0.018125f, -0.625221f, -0.833372f, -0.352995f, 0.433022f, 0.798844f, 0.478184f, -0.106003f, -0.434667f, -0.441046f, -0.368821f, -0.347324f, -0.318444f, -0.244373f, -0.171635f, -0.121000f, -0.059037f, 0.023724f, 0.097010f, 0.147728f, 0.189866f, 0.225827f, 0.243381f, 0.241962f, 0.230347f, 0.209235f, 0.177802f, 0.144642f, 0.116772f, 0.090397f, 0.061815f, 0.034477f, 0.010059f, -0.014474f, -0.038175f, -0.056107f, -0.068563f, -0.080545f, -0.093619f, -0.106370f, -0.119695f, -0.134742f, -0.149473f, -0.162326f, -0.174807f, -0.187244f, -0.197268f, -0.204420f, -0.210807f, -0.216408f, -0.219069f, -0.218931f, -0.217754f, -0.214932f, -0.208841f, -0.200539f, -0.192118f, -0.183496f, -0.174075f, -0.165039f, -0.157372f, -0.150168f, -0.142655f, -0.135395f, -0.128631f, -0.122082f, -0.116426f, -0.112435f, -0.109121f, -0.105059f, -0.100419f, -0.095650f, -0.089752f, -0.081852f, -0.072848f, -0.064030f, -0.055849f, -0.048935f, -0.044367f, -0.042466f, -0.043236f, -0.047696f, -0.056506f, + -0.067688f, -0.077997f, -0.086044f, -0.092096f, -0.095584f, -0.094704f, -0.087898f, -0.074555f, -0.055146f, -0.031374f, -0.005109f, 0.023181f, 0.053769f, 0.085647f, 0.116644f, 0.145301f, 0.171246f, 0.194304f, 0.214606f, 0.232833f, 0.249102f, 0.262412f, 0.272200f, 0.279515f, 0.285963f, 0.292502f, 0.299498f, 0.306603f, 0.312397f, 0.315556f, 0.316484f, 0.316658f, 0.316768f, 0.316676f, 0.316453f, 0.316057f, 0.314697f, 0.311795f, 0.307878f, 0.303586f, 0.298738f, 0.293100f, 0.286921f, 0.280025f, 0.271517f, 0.260915f, 0.248546f, 0.234604f, 0.218918f, 0.201792f, 0.184003f, 0.165897f, 0.147257f, 0.128036f, 0.108579f, 0.088849f, 0.067408f, 0.041787f, 0.011933f, -0.015821f, -0.031241f, -0.029810f, -0.017985f, -0.005466f} + }, + { + {0.005047f, 0.021126f, 0.045009f, 0.070453f, 0.091218f, 0.079137f, -0.005705f, -0.148208f, -0.279248f, -0.366201f, -0.399292f, -0.268604f, 0.145211f, 0.646500f, 0.731126f, 0.172486f, -0.552664f, -0.733258f, -0.260523f, 0.299749f, 0.452278f, 0.272382f, 0.101891f, 0.059461f, 0.035030f, -0.031425f, -0.085084f, -0.094988f, -0.094701f, -0.101435f, -0.094303f, -0.066565f, -0.037269f, -0.017081f, -0.001454f, 0.010929f, 0.018070f, 0.023255f, 0.028455f, 0.029520f, 0.025899f, 0.023522f, 0.023990f, 0.022461f, 0.017906f, 0.014746f, 0.014269f, 0.013796f, 0.013307f, 0.015082f, 0.018457f, 0.020882f, 0.021919f, 0.021991f, 0.020056f, 0.015522f, 0.009547f, 0.002759f, -0.005372f, -0.014351f, -0.022889f, -0.031164f, -0.040159f, -0.049486f, -0.058237f, -0.066734f, -0.075464f, -0.083764f, -0.091121f, -0.098138f, -0.105200f, -0.111892f, -0.118289f, -0.125068f, -0.132105f, -0.138497f, -0.143784f, -0.147831f, -0.150121f, -0.150387f, -0.149069f, -0.146131f, -0.140481f, -0.131487f, -0.119994f, -0.107110f, -0.092969f, -0.077185f, -0.059714f, -0.041087f, -0.022428f, -0.005113f, 0.010051f, 0.022960f, 0.033330f, 0.040497f, + 0.044394f, 0.045809f, 0.045372f, 0.043155f, 0.039528f, 0.035586f, 0.032440f, 0.030494f, 0.029398f, 0.028485f, 0.027544f, 0.027340f, 0.028936f, 0.032511f, 0.037335f, 0.042789f, 0.048810f, 0.055598f, 0.063500f, 0.072809f, 0.083162f, 0.093560f, 0.103403f, 0.113024f, 0.123077f, 0.134014f, 0.146084f, 0.159017f, 0.171851f, 0.183812f, 0.195106f, 0.206245f, 0.217176f, 0.227589f, 0.237250f, 0.245546f, 0.251644f, 0.255500f, 0.257760f, 0.258677f, 0.258173f, 0.256605f, 0.254245f, 0.250550f, 0.245153f, 0.238801f, 0.232311f, 0.225757f, 0.219429f, 0.214026f, 0.209321f, 0.204392f, 0.199161f, 0.193782f, 0.187372f, 0.179378f, 0.169453f, 0.152758f, 0.120530f, 0.072470f, 0.024676f, -0.003666f, -0.009454f, -0.003869f}, + {-0.005047f, -0.021126f, -0.045009f, -0.070453f, -0.091218f, -0.079137f, 0.005705f, 0.148208f, 0.279248f, 0.366201f, 0.399292f, 0.268604f, -0.145211f, -0.646500f, -0.731126f, -0.172486f, 0.552664f, 0.733258f, 0.260523f, -0.299749f, -0.452278f, -0.272382f, -0.101891f, -0.059461f, -0.035030f, 0.031425f, 0.085084f, 0.094988f, 0.094701f, 0.101435f, 0.094303f, 0.066565f, 0.037269f, 0.017081f, 0.001454f, -0.010929f, -0.018070f, -0.023255f, -0.028455f, -0.029520f, -0.025899f, -0.023522f, -0.023990f, -0.022461f, -0.017906f, -0.014746f, -0.014269f, -0.013796f, -0.013307f, -0.015082f, -0.018457f, -0.020882f, -0.021919f, -0.021991f, -0.020056f, -0.015522f, -0.009547f, -0.002759f, 0.005372f, 0.014351f, 0.022889f, 0.031164f, 0.040159f, 0.049486f, 0.058237f, 0.066734f, 0.075464f, 0.083764f, 0.091121f, 0.098138f, 0.105200f, 0.111892f, 0.118289f, 0.125068f, 0.132105f, 0.138497f, 0.143784f, 0.147831f, 0.150121f, 0.150387f, 0.149069f, 0.146131f, 0.140481f, 0.131487f, 0.119994f, 0.107110f, 0.092969f, 0.077185f, 0.059714f, 0.041087f, 0.022428f, 0.005113f, -0.010051f, -0.022960f, -0.033330f, -0.040497f, + -0.044394f, -0.045809f, -0.045372f, -0.043155f, -0.039528f, -0.035586f, -0.032440f, -0.030494f, -0.029398f, -0.028485f, -0.027544f, -0.027340f, -0.028936f, -0.032511f, -0.037335f, -0.042789f, -0.048810f, -0.055598f, -0.063500f, -0.072809f, -0.083162f, -0.093560f, -0.103403f, -0.113024f, -0.123077f, -0.134014f, -0.146084f, -0.159017f, -0.171851f, -0.183812f, -0.195106f, -0.206245f, -0.217176f, -0.227589f, -0.237250f, -0.245546f, -0.251644f, -0.255500f, -0.257760f, -0.258677f, -0.258173f, -0.256605f, -0.254245f, -0.250550f, -0.245153f, -0.238801f, -0.232311f, -0.225757f, -0.219429f, -0.214026f, -0.209321f, -0.204392f, -0.199161f, -0.193782f, -0.187372f, -0.179378f, -0.169453f, -0.152758f, -0.120530f, -0.072470f, -0.024676f, 0.003666f, 0.009454f, 0.003869f} + }, + { + {0.003264f, 0.004318f, -0.005829f, -0.024893f, -0.041105f, -0.025902f, 0.043471f, 0.128408f, 0.134001f, 0.021030f, -0.114589f, -0.139872f, -0.049571f, 0.037102f, 0.041588f, 0.008422f, 0.005052f, 0.019837f, 0.006847f, -0.026552f, -0.037371f, -0.021147f, -0.012506f, -0.023997f, -0.030666f, -0.014881f, 0.008946f, 0.019948f, 0.015955f, 0.005594f, -0.007241f, -0.022512f, -0.037468f, -0.047732f, -0.050991f, -0.047280f, -0.038592f, -0.028517f, -0.019426f, -0.010194f, 0.001263f, 0.014159f, 0.025520f, 0.033481f, 0.038027f, 0.039692f, 0.039526f, 0.039623f, 0.042009f, 0.047181f, 0.054431f, 0.062973f, 0.072033f, 0.080590f, 0.087853f, 0.093716f, 0.098363f, 0.101802f, 0.104025f, 0.105212f, 0.105518f, 0.104869f, 0.103123f, 0.100365f, 0.097014f, 0.093624f, 0.090496f, 0.087654f, 0.085314f, 0.084000f, 0.083899f, 0.084586f, 0.085875f, 0.088367f, 0.092576f, 0.098106f, 0.104335f, 0.111281f, 0.119002f, 0.126690f, 0.133135f, 0.137682f, 0.140158f, 0.140242f, 0.137283f, 0.130334f, 0.118340f, 0.100873f, 0.078543f, 0.051954f, 0.020504f, -0.016782f, -0.059370f, -0.105077f, -0.151633f, -0.197526f, + -0.241483f, -0.281925f, -0.316997f, -0.344975f, -0.365154f, -0.378455f, -0.386389f, -0.389309f, -0.386608f, -0.378830f, -0.368544f, -0.358689f, -0.350553f, -0.343331f, -0.335103f, -0.324515f, -0.312129f, -0.299944f, -0.289316f, -0.279871f, -0.270574f, -0.260978f, -0.251183f, -0.241549f, -0.232707f, -0.224985f, -0.217706f, -0.209798f, -0.200910f, -0.191257f, -0.180862f, -0.169770f, -0.158385f, -0.146895f, -0.135062f, -0.123099f, -0.111787f, -0.101401f, -0.091527f, -0.082057f, -0.073151f, -0.064454f, -0.055670f, -0.047503f, -0.040626f, -0.034415f, -0.027978f, -0.021363f, -0.014489f, -0.006443f, 0.002867f, 0.012203f, 0.021232f, 0.031102f, 0.042272f, 0.054913f, 0.071608f, 0.094348f, 0.116599f, 0.123809f, 0.106728f, 0.072105f, 0.036517f, 0.010336f}, + {-0.003264f, -0.004318f, 0.005829f, 0.024893f, 0.041105f, 0.025902f, -0.043471f, -0.128408f, -0.134001f, -0.021030f, 0.114589f, 0.139872f, 0.049571f, -0.037102f, -0.041588f, -0.008422f, -0.005052f, -0.019837f, -0.006847f, 0.026552f, 0.037371f, 0.021147f, 0.012506f, 0.023997f, 0.030666f, 0.014881f, -0.008946f, -0.019948f, -0.015955f, -0.005594f, 0.007241f, 0.022512f, 0.037468f, 0.047732f, 0.050991f, 0.047280f, 0.038592f, 0.028517f, 0.019426f, 0.010194f, -0.001263f, -0.014159f, -0.025520f, -0.033481f, -0.038027f, -0.039692f, -0.039526f, -0.039623f, -0.042009f, -0.047181f, -0.054431f, -0.062973f, -0.072033f, -0.080590f, -0.087853f, -0.093716f, -0.098363f, -0.101802f, -0.104025f, -0.105212f, -0.105518f, -0.104869f, -0.103123f, -0.100365f, -0.097014f, -0.093624f, -0.090496f, -0.087654f, -0.085314f, -0.084000f, -0.083899f, -0.084586f, -0.085875f, -0.088367f, -0.092576f, -0.098106f, -0.104335f, -0.111281f, -0.119002f, -0.126690f, -0.133135f, -0.137682f, -0.140158f, -0.140242f, -0.137283f, -0.130334f, -0.118340f, -0.100873f, -0.078543f, -0.051954f, -0.020504f, 0.016782f, 0.059370f, 0.105077f, 0.151633f, 0.197526f, + 0.241483f, 0.281925f, 0.316997f, 0.344975f, 0.365154f, 0.378455f, 0.386389f, 0.389309f, 0.386608f, 0.378830f, 0.368544f, 0.358689f, 0.350553f, 0.343331f, 0.335103f, 0.324515f, 0.312129f, 0.299944f, 0.289316f, 0.279871f, 0.270574f, 0.260978f, 0.251183f, 0.241549f, 0.232707f, 0.224985f, 0.217706f, 0.209798f, 0.200910f, 0.191257f, 0.180862f, 0.169770f, 0.158385f, 0.146895f, 0.135062f, 0.123099f, 0.111787f, 0.101401f, 0.091527f, 0.082057f, 0.073151f, 0.064454f, 0.055670f, 0.047503f, 0.040626f, 0.034415f, 0.027978f, 0.021363f, 0.014489f, 0.006443f, -0.002867f, -0.012203f, -0.021232f, -0.031102f, -0.042272f, -0.054913f, -0.071608f, -0.094348f, -0.116599f, -0.123809f, -0.106728f, -0.072105f, -0.036517f, -0.010336f} + }, + { + {0.011217f, 0.032990f, 0.036897f, 0.010621f, -0.001993f, 0.049544f, 0.112830f, 0.056133f, -0.160339f, -0.385630f, -0.392350f, -0.095349f, 0.328404f, 0.542847f, 0.344208f, -0.105590f, -0.399358f, -0.300598f, 0.018016f, 0.214090f, 0.169827f, 0.038946f, -0.027942f, -0.041781f, -0.059684f, -0.065038f, -0.024287f, 0.032375f, 0.055196f, 0.048115f, 0.048570f, 0.069300f, 0.097432f, 0.125436f, 0.152243f, 0.169511f, 0.168791f, 0.153482f, 0.132068f, 0.107982f, 0.082397f, 0.058065f, 0.035645f, 0.012912f, -0.010363f, -0.032150f, -0.052509f, -0.073090f, -0.093478f, -0.112421f, -0.130887f, -0.150015f, -0.167940f, -0.181658f, -0.190093f, -0.193280f, -0.190900f, -0.183505f, -0.172998f, -0.160425f, -0.144966f, -0.125766f, -0.102989f, -0.076649f, -0.046121f, -0.011292f, 0.026894f, 0.067039f, 0.107592f, 0.146900f, 0.183708f, 0.217201f, 0.246116f, 0.268588f, 0.283453f, 0.290932f, 0.291460f, 0.284592f, 0.269758f, 0.247580f, 0.219717f, 0.187538f, 0.151436f, 0.111504f, 0.068474f, 0.023637f, -0.022098f, -0.068620f, -0.115935f, -0.163543f, -0.210736f, -0.256901f, -0.300916f, -0.340700f, -0.374071f, -0.399767f, + -0.417035f, -0.424614f, -0.421054f, -0.406173f, -0.381691f, -0.350278f, -0.314081f, -0.274012f, -0.230338f, -0.184210f, -0.138589f, -0.097123f, -0.061885f, -0.032563f, -0.007863f, 0.012882f, 0.029569f, 0.041935f, 0.049803f, 0.053141f, 0.052307f, 0.048088f, 0.041442f, 0.033372f, 0.024841f, 0.016293f, 0.007207f, -0.003502f, -0.016548f, -0.031791f, -0.048410f, -0.065287f, -0.081508f, -0.096823f, -0.111564f, -0.125991f, -0.139856f, -0.152551f, -0.163405f, -0.171901f, -0.177907f, -0.181647f, -0.183211f, -0.182296f, -0.178654f, -0.172490f, -0.164191f, -0.154059f, -0.142478f, -0.129944f, -0.116760f, -0.103091f, -0.089272f, -0.075716f, -0.062663f, -0.050022f, -0.036539f, -0.019395f, 0.002713f, 0.024763f, 0.036870f, 0.033747f, 0.020633f, 0.006443f}, + {-0.011217f, -0.032990f, -0.036897f, -0.010621f, 0.001993f, -0.049544f, -0.112830f, -0.056133f, 0.160339f, 0.385630f, 0.392350f, 0.095349f, -0.328404f, -0.542847f, -0.344208f, 0.105590f, 0.399358f, 0.300598f, -0.018016f, -0.214090f, -0.169827f, -0.038946f, 0.027942f, 0.041781f, 0.059684f, 0.065038f, 0.024287f, -0.032375f, -0.055196f, -0.048115f, -0.048570f, -0.069300f, -0.097432f, -0.125436f, -0.152243f, -0.169511f, -0.168791f, -0.153482f, -0.132068f, -0.107982f, -0.082397f, -0.058065f, -0.035645f, -0.012912f, 0.010363f, 0.032150f, 0.052509f, 0.073090f, 0.093478f, 0.112421f, 0.130887f, 0.150015f, 0.167940f, 0.181658f, 0.190093f, 0.193280f, 0.190900f, 0.183505f, 0.172998f, 0.160425f, 0.144966f, 0.125766f, 0.102989f, 0.076649f, 0.046121f, 0.011292f, -0.026894f, -0.067039f, -0.107592f, -0.146900f, -0.183708f, -0.217201f, -0.246116f, -0.268588f, -0.283453f, -0.290932f, -0.291460f, -0.284592f, -0.269758f, -0.247580f, -0.219717f, -0.187538f, -0.151436f, -0.111504f, -0.068474f, -0.023637f, 0.022098f, 0.068620f, 0.115935f, 0.163543f, 0.210736f, 0.256901f, 0.300916f, 0.340700f, 0.374071f, 0.399767f, + 0.417035f, 0.424614f, 0.421054f, 0.406173f, 0.381691f, 0.350278f, 0.314081f, 0.274012f, 0.230338f, 0.184210f, 0.138589f, 0.097123f, 0.061885f, 0.032563f, 0.007863f, -0.012882f, -0.029569f, -0.041935f, -0.049803f, -0.053141f, -0.052307f, -0.048088f, -0.041442f, -0.033372f, -0.024841f, -0.016293f, -0.007207f, 0.003502f, 0.016548f, 0.031791f, 0.048410f, 0.065287f, 0.081508f, 0.096823f, 0.111564f, 0.125991f, 0.139856f, 0.152551f, 0.163405f, 0.171901f, 0.177907f, 0.181647f, 0.183211f, 0.182296f, 0.178654f, 0.172490f, 0.164191f, 0.154059f, 0.142478f, 0.129944f, 0.116760f, 0.103091f, 0.089272f, 0.075716f, 0.062663f, 0.050022f, 0.036539f, 0.019395f, -0.002713f, -0.024763f, -0.036870f, -0.033747f, -0.020633f, -0.006443f} + }, + { + {0.000083f, 0.005036f, 0.018377f, 0.032102f, 0.033143f, 0.014136f, -0.022619f, -0.065291f, -0.089673f, -0.066050f, 0.009591f, 0.089794f, 0.106985f, 0.045740f, -0.034502f, -0.065255f, -0.039897f, 0.000078f, 0.028484f, 0.051608f, 0.072366f, 0.075587f, 0.055795f, 0.030842f, 0.015327f, 0.000007f, -0.029864f, -0.069463f, -0.099077f, -0.105101f, -0.088131f, -0.057540f, -0.025793f, -0.003611f, 0.006114f, 0.009267f, 0.013559f, 0.021781f, 0.031617f, 0.039206f, 0.042208f, 0.041252f, 0.038988f, 0.037309f, 0.036122f, 0.034790f, 0.033050f, 0.030156f, 0.024935f, 0.017196f, 0.007780f, -0.002812f, -0.014616f, -0.027403f, -0.040792f, -0.054583f, -0.068097f, -0.080003f, -0.089434f, -0.096351f, -0.100606f, -0.101910f, -0.100671f, -0.097487f, -0.092005f, -0.083641f, -0.072770f, -0.059711f, -0.043405f, -0.022639f, 0.002276f, 0.030372f, 0.061335f, 0.094600f, 0.128377f, 0.160824f, 0.191129f, 0.218597f, 0.241992f, 0.260549f, 0.274515f, 0.284048f, 0.288459f, 0.286928f, 0.279376f, 0.266510f, 0.249197f, 0.227462f, 0.200216f, 0.166835f, 0.128828f, 0.088822f, 0.048134f, 0.006659f, -0.035128f, -0.075405f, + -0.111911f, -0.142566f, -0.165901f, -0.182096f, -0.192944f, -0.199789f, -0.202049f, -0.198236f, -0.187646f, -0.171039f, -0.150806f, -0.130229f, -0.111175f, -0.092669f, -0.072879f, -0.051877f, -0.031403f, -0.013020f, 0.002318f, 0.014147f, 0.023189f, 0.030986f, 0.037985f, 0.043116f, 0.045482f, 0.044959f, 0.041243f, 0.034134f, 0.024551f, 0.013580f, 0.001006f, -0.013772f, -0.030379f, -0.048389f, -0.068202f, -0.089706f, -0.111625f, -0.133172f, -0.154629f, -0.175780f, -0.195743f, -0.214472f, -0.232333f, -0.248520f, -0.261904f, -0.272627f, -0.280980f, -0.286143f, -0.287719f, -0.286566f, -0.282756f, -0.275181f, -0.263986f, -0.250601f, -0.235353f, -0.217748f, -0.196795f, -0.167237f, -0.121073f, -0.061155f, -0.008179f, 0.017190f, 0.016197f, 0.005515f}, + {0.000083f, 0.005036f, 0.018377f, 0.032102f, 0.033143f, 0.014136f, -0.022619f, -0.065291f, -0.089673f, -0.066050f, 0.009591f, 0.089794f, 0.106985f, 0.045740f, -0.034502f, -0.065255f, -0.039897f, 0.000078f, 0.028484f, 0.051608f, 0.072366f, 0.075587f, 0.055795f, 0.030842f, 0.015327f, 0.000007f, -0.029864f, -0.069463f, -0.099077f, -0.105101f, -0.088131f, -0.057540f, -0.025793f, -0.003611f, 0.006114f, 0.009267f, 0.013559f, 0.021781f, 0.031617f, 0.039206f, 0.042208f, 0.041252f, 0.038988f, 0.037309f, 0.036122f, 0.034790f, 0.033050f, 0.030156f, 0.024935f, 0.017196f, 0.007780f, -0.002812f, -0.014616f, -0.027403f, -0.040792f, -0.054583f, -0.068097f, -0.080003f, -0.089434f, -0.096351f, -0.100606f, -0.101910f, -0.100671f, -0.097487f, -0.092005f, -0.083641f, -0.072770f, -0.059711f, -0.043405f, -0.022639f, 0.002276f, 0.030372f, 0.061335f, 0.094600f, 0.128377f, 0.160824f, 0.191129f, 0.218597f, 0.241992f, 0.260549f, 0.274515f, 0.284048f, 0.288459f, 0.286928f, 0.279376f, 0.266510f, 0.249197f, 0.227462f, 0.200216f, 0.166835f, 0.128828f, 0.088822f, 0.048134f, 0.006659f, -0.035128f, -0.075405f, + -0.111911f, -0.142566f, -0.165901f, -0.182096f, -0.192944f, -0.199789f, -0.202049f, -0.198236f, -0.187646f, -0.171039f, -0.150806f, -0.130229f, -0.111175f, -0.092669f, -0.072879f, -0.051877f, -0.031403f, -0.013020f, 0.002318f, 0.014147f, 0.023189f, 0.030986f, 0.037985f, 0.043116f, 0.045482f, 0.044959f, 0.041243f, 0.034134f, 0.024551f, 0.013580f, 0.001006f, -0.013772f, -0.030379f, -0.048389f, -0.068202f, -0.089706f, -0.111625f, -0.133172f, -0.154629f, -0.175780f, -0.195743f, -0.214472f, -0.232333f, -0.248520f, -0.261904f, -0.272627f, -0.280980f, -0.286143f, -0.287719f, -0.286566f, -0.282756f, -0.275181f, -0.263986f, -0.250601f, -0.235353f, -0.217748f, -0.196795f, -0.167237f, -0.121073f, -0.061155f, -0.008179f, 0.017190f, 0.016197f, 0.005515f} + }, + { + {0.003277f, 0.020620f, 0.046924f, 0.053396f, 0.027529f, -0.018184f, -0.075068f, -0.129965f, -0.134034f, -0.041093f, 0.107597f, 0.192042f, 0.138507f, 0.002361f, -0.097386f, -0.097716f, -0.027837f, 0.041165f, 0.055356f, 0.009000f, -0.053914f, -0.075455f, -0.037025f, 0.027229f, 0.073147f, 0.088050f, 0.084707f, 0.074263f, 0.059879f, 0.044753f, 0.030913f, 0.014584f, -0.007652f, -0.031648f, -0.050796f, -0.064274f, -0.075002f, -0.083080f, -0.086106f, -0.083894f, -0.079273f, -0.075317f, -0.073762f, -0.075115f, -0.078933f, -0.084283f, -0.090103f, -0.094754f, -0.095967f, -0.092275f, -0.084148f, -0.073198f, -0.060975f, -0.049003f, -0.038889f, -0.031415f, -0.026007f, -0.021619f, -0.017630f, -0.013612f, -0.008806f, -0.002247f, 0.006927f, 0.019339f, 0.035096f, 0.053529f, 0.073490f, 0.093872f, 0.113559f, 0.131158f, 0.145463f, 0.156306f, 0.164334f, 0.169750f, 0.171955f, 0.170864f, 0.167779f, 0.164008f, 0.159174f, 0.152172f, 0.143633f, 0.135949f, 0.130577f, 0.126799f, 0.123854f, 0.122887f, 0.125529f, 0.131183f, 0.136998f, 0.140478f, 0.141438f, 0.141364f, 0.141457f, 0.141528f, 0.140550f, 0.137820f, + 0.133341f, 0.127425f, 0.120598f, 0.113838f, 0.108067f, 0.102944f, 0.096659f, 0.087377f, 0.074639f, 0.059155f, 0.041597f, 0.021904f, -0.000390f, -0.025326f, -0.052050f, -0.079280f, -0.106273f, -0.133120f, -0.160007f, -0.186459f, -0.211358f, -0.233392f, -0.251545f, -0.265595f, -0.276202f, -0.284154f, -0.289485f, -0.291522f, -0.289603f, -0.283599f, -0.274102f, -0.262440f, -0.250053f, -0.237377f, -0.223517f, -0.207267f, -0.188278f, -0.167320f, -0.145844f, -0.125284f, -0.106307f, -0.088608f, -0.071476f, -0.054349f, -0.036881f, -0.019173f, -0.002062f, 0.013514f, 0.027449f, 0.039974f, 0.050573f, 0.058579f, 0.064464f, 0.069138f, 0.072610f, 0.074870f, 0.076796f, 0.077682f, 0.073281f, 0.059949f, 0.040437f, 0.022196f, 0.009962f, 0.002764f}, + {0.003277f, 0.020620f, 0.046924f, 0.053396f, 0.027529f, -0.018184f, -0.075068f, -0.129965f, -0.134034f, -0.041093f, 0.107597f, 0.192042f, 0.138507f, 0.002361f, -0.097386f, -0.097716f, -0.027837f, 0.041165f, 0.055356f, 0.009000f, -0.053914f, -0.075455f, -0.037025f, 0.027229f, 0.073147f, 0.088050f, 0.084707f, 0.074263f, 0.059879f, 0.044753f, 0.030913f, 0.014584f, -0.007652f, -0.031648f, -0.050796f, -0.064274f, -0.075002f, -0.083080f, -0.086106f, -0.083894f, -0.079273f, -0.075317f, -0.073762f, -0.075115f, -0.078933f, -0.084283f, -0.090103f, -0.094754f, -0.095967f, -0.092275f, -0.084148f, -0.073198f, -0.060975f, -0.049003f, -0.038889f, -0.031415f, -0.026007f, -0.021619f, -0.017630f, -0.013612f, -0.008806f, -0.002247f, 0.006927f, 0.019339f, 0.035096f, 0.053529f, 0.073490f, 0.093872f, 0.113559f, 0.131158f, 0.145463f, 0.156306f, 0.164334f, 0.169750f, 0.171955f, 0.170864f, 0.167779f, 0.164008f, 0.159174f, 0.152172f, 0.143633f, 0.135949f, 0.130577f, 0.126799f, 0.123854f, 0.122887f, 0.125529f, 0.131183f, 0.136998f, 0.140478f, 0.141438f, 0.141364f, 0.141457f, 0.141528f, 0.140550f, 0.137820f, + 0.133341f, 0.127425f, 0.120598f, 0.113838f, 0.108067f, 0.102944f, 0.096659f, 0.087377f, 0.074639f, 0.059155f, 0.041597f, 0.021904f, -0.000390f, -0.025326f, -0.052050f, -0.079280f, -0.106273f, -0.133120f, -0.160007f, -0.186459f, -0.211358f, -0.233392f, -0.251545f, -0.265595f, -0.276202f, -0.284154f, -0.289485f, -0.291522f, -0.289603f, -0.283599f, -0.274102f, -0.262440f, -0.250053f, -0.237377f, -0.223517f, -0.207267f, -0.188278f, -0.167320f, -0.145844f, -0.125284f, -0.106307f, -0.088608f, -0.071476f, -0.054349f, -0.036881f, -0.019173f, -0.002062f, 0.013514f, 0.027449f, 0.039974f, 0.050573f, 0.058579f, 0.064464f, 0.069138f, 0.072610f, 0.074870f, 0.076796f, 0.077682f, 0.073281f, 0.059949f, 0.040437f, 0.022196f, 0.009962f, 0.002764f} + }, + { + {-0.008293f, -0.013970f, -0.006751f, -0.004194f, -0.000967f, 0.027228f, 0.059778f, 0.022682f, -0.106073f, -0.214108f, -0.153498f, 0.064143f, 0.238226f, 0.193438f, -0.014455f, -0.165780f, -0.132467f, 0.001700f, 0.083408f, 0.077007f, 0.060090f, 0.082445f, 0.105818f, 0.080684f, 0.018380f, -0.037842f, -0.074236f, -0.108541f, -0.150869f, -0.190041f, -0.211970f, -0.212547f, -0.194180f, -0.162258f, -0.125194f, -0.090440f, -0.060047f, -0.033077f, -0.010004f, 0.007878f, 0.020452f, 0.027724f, 0.029258f, 0.026432f, 0.022993f, 0.022085f, 0.024478f, 0.029976f, 0.038329f, 0.048433f, 0.058546f, 0.067656f, 0.075393f, 0.080877f, 0.082981f, 0.081487f, 0.077061f, 0.070494f, 0.062643f, 0.054653f, 0.047646f, 0.042468f, 0.039796f, 0.040085f, 0.043440f, 0.049885f, 0.059496f, 0.072069f, 0.087127f, 0.104428f, 0.123856f, 0.144734f, 0.165869f, 0.186238f, 0.205023f, 0.221226f, 0.233959f, 0.242827f, 0.247601f, 0.248219f, 0.245523f, 0.240985f, 0.235213f, 0.227742f, 0.218596f, 0.208683f, 0.198442f, 0.187753f, 0.177376f, 0.168395f, 0.159521f, 0.146885f, 0.127542f, 0.101864f, 0.071685f, 0.037282f, + -0.002911f, -0.050169f, -0.103604f, -0.160216f, -0.216687f, -0.271079f, -0.322554f, -0.369840f, -0.410986f, -0.444781f, -0.471531f, -0.492157f, -0.506979f, -0.515336f, -0.516033f, -0.508542f, -0.494176f, -0.475536f, -0.454382f, -0.430583f, -0.403314f, -0.372531f, -0.339168f, -0.304785f, -0.271079f, -0.238824f, -0.207195f, -0.174785f, -0.141074f, -0.106436f, -0.071329f, -0.036073f, -0.000775f, 0.034934f, 0.071321f, 0.107583f, 0.142393f, 0.175297f, 0.206552f, 0.236016f, 0.263322f, 0.288426f, 0.310739f, 0.328664f, 0.341198f, 0.348940f, 0.352697f, 0.352598f, 0.349143f, 0.343169f, 0.334326f, 0.321627f, 0.305401f, 0.286727f, 0.265938f, 0.243372f, 0.218307f, 0.184517f, 0.133522f, 0.069279f, 0.013554f, -0.013422f, -0.013865f, -0.004732f}, + {-0.008293f, -0.013970f, -0.006751f, -0.004194f, -0.000967f, 0.027228f, 0.059778f, 0.022682f, -0.106073f, -0.214108f, -0.153498f, 0.064143f, 0.238226f, 0.193438f, -0.014455f, -0.165780f, -0.132467f, 0.001700f, 0.083408f, 0.077007f, 0.060090f, 0.082445f, 0.105818f, 0.080684f, 0.018380f, -0.037842f, -0.074236f, -0.108541f, -0.150869f, -0.190041f, -0.211970f, -0.212547f, -0.194180f, -0.162258f, -0.125194f, -0.090440f, -0.060047f, -0.033077f, -0.010004f, 0.007878f, 0.020452f, 0.027724f, 0.029258f, 0.026432f, 0.022993f, 0.022085f, 0.024478f, 0.029976f, 0.038329f, 0.048433f, 0.058546f, 0.067656f, 0.075393f, 0.080877f, 0.082981f, 0.081487f, 0.077061f, 0.070494f, 0.062643f, 0.054653f, 0.047646f, 0.042468f, 0.039796f, 0.040085f, 0.043440f, 0.049885f, 0.059496f, 0.072069f, 0.087127f, 0.104428f, 0.123856f, 0.144734f, 0.165869f, 0.186238f, 0.205023f, 0.221226f, 0.233959f, 0.242827f, 0.247601f, 0.248219f, 0.245523f, 0.240985f, 0.235213f, 0.227742f, 0.218596f, 0.208683f, 0.198442f, 0.187753f, 0.177376f, 0.168395f, 0.159521f, 0.146885f, 0.127542f, 0.101864f, 0.071685f, 0.037282f, + -0.002911f, -0.050169f, -0.103604f, -0.160216f, -0.216687f, -0.271079f, -0.322554f, -0.369840f, -0.410986f, -0.444781f, -0.471531f, -0.492157f, -0.506979f, -0.515336f, -0.516033f, -0.508542f, -0.494176f, -0.475536f, -0.454382f, -0.430583f, -0.403314f, -0.372531f, -0.339168f, -0.304785f, -0.271079f, -0.238824f, -0.207195f, -0.174785f, -0.141074f, -0.106436f, -0.071329f, -0.036073f, -0.000775f, 0.034934f, 0.071321f, 0.107583f, 0.142393f, 0.175297f, 0.206552f, 0.236016f, 0.263322f, 0.288426f, 0.310739f, 0.328664f, 0.341198f, 0.348940f, 0.352697f, 0.352598f, 0.349143f, 0.343169f, 0.334326f, 0.321627f, 0.305401f, 0.286727f, 0.265938f, 0.243372f, 0.218307f, 0.184517f, 0.133522f, 0.069279f, 0.013554f, -0.013422f, -0.013865f, -0.004732f} + }, + { + {0.000177f, 0.000226f, -0.000534f, -0.002844f, -0.006900f, -0.008636f, -0.000913f, 0.012312f, 0.007372f, -0.030503f, -0.063506f, -0.022827f, 0.091931f, 0.166548f, 0.089015f, -0.090455f, -0.187289f, -0.097089f, 0.077605f, 0.157235f, 0.092127f, -0.016472f, -0.065347f, -0.047160f, -0.006944f, 0.028956f, 0.056051f, 0.066667f, 0.053772f, 0.024836f, -0.006025f, -0.031877f, -0.051501f, -0.064067f, -0.072308f, -0.083529f, -0.101732f, -0.122988f, -0.140854f, -0.151866f, -0.154661f, -0.148621f, -0.135381f, -0.118751f, -0.102023f, -0.086997f, -0.075122f, -0.067345f, -0.063027f, -0.060678f, -0.059457f, -0.058879f, -0.057880f, -0.055382f, -0.051316f, -0.046358f, -0.041263f, -0.036901f, -0.034150f, -0.033230f, -0.033646f, -0.034904f, -0.036618f, -0.037981f, -0.037996f, -0.036359f, -0.033414f, -0.029270f, -0.023673f, -0.016686f, -0.008707f, 0.000153f, 0.009974f, 0.020300f, 0.030277f, 0.039653f, 0.048922f, 0.058264f, 0.067028f, 0.074752f, 0.082196f, 0.090675f, 0.100423f, 0.110252f, 0.119144f, 0.127625f, 0.136849f, 0.146460f, 0.154233f, 0.158150f, 0.158200f, 0.155698f, 0.151413f, 0.145018f, 0.136153f, 0.125516f, + 0.114815f, 0.105682f, 0.098486f, 0.092374f, 0.086804f, 0.082876f, 0.082667f, 0.087334f, 0.096215f, 0.107481f, 0.119244f, 0.130421f, 0.141184f, 0.152404f, 0.164286f, 0.175808f, 0.185694f, 0.193429f, 0.199183f, 0.203422f, 0.206875f, 0.210212f, 0.213414f, 0.215952f, 0.217594f, 0.218544f, 0.218872f, 0.218422f, 0.217083f, 0.214671f, 0.210839f, 0.205624f, 0.199681f, 0.193644f, 0.187770f, 0.182378f, 0.177914f, 0.174397f, 0.171558f, 0.169503f, 0.168445f, 0.167984f, 0.167536f, 0.167028f, 0.166265f, 0.164275f, 0.160229f, 0.154156f, 0.145927f, 0.134776f, 0.120686f, 0.104691f, 0.087066f, 0.067093f, 0.045071f, 0.021659f, -0.005316f, -0.038739f, -0.073888f, -0.096316f, -0.093511f, -0.068230f, -0.036309f, -0.010540f}, + {0.000177f, 0.000226f, -0.000534f, -0.002844f, -0.006900f, -0.008636f, -0.000913f, 0.012312f, 0.007372f, -0.030503f, -0.063506f, -0.022827f, 0.091931f, 0.166548f, 0.089015f, -0.090455f, -0.187289f, -0.097089f, 0.077605f, 0.157235f, 0.092127f, -0.016472f, -0.065347f, -0.047160f, -0.006944f, 0.028956f, 0.056051f, 0.066667f, 0.053772f, 0.024836f, -0.006025f, -0.031877f, -0.051501f, -0.064067f, -0.072308f, -0.083529f, -0.101732f, -0.122988f, -0.140854f, -0.151866f, -0.154661f, -0.148621f, -0.135381f, -0.118751f, -0.102023f, -0.086997f, -0.075122f, -0.067345f, -0.063027f, -0.060678f, -0.059457f, -0.058879f, -0.057880f, -0.055382f, -0.051316f, -0.046358f, -0.041263f, -0.036901f, -0.034150f, -0.033230f, -0.033646f, -0.034904f, -0.036618f, -0.037981f, -0.037996f, -0.036359f, -0.033414f, -0.029270f, -0.023673f, -0.016686f, -0.008707f, 0.000153f, 0.009974f, 0.020300f, 0.030277f, 0.039653f, 0.048922f, 0.058264f, 0.067028f, 0.074752f, 0.082196f, 0.090675f, 0.100423f, 0.110252f, 0.119144f, 0.127625f, 0.136849f, 0.146460f, 0.154233f, 0.158150f, 0.158200f, 0.155698f, 0.151413f, 0.145018f, 0.136153f, 0.125516f, + 0.114815f, 0.105682f, 0.098486f, 0.092374f, 0.086804f, 0.082876f, 0.082667f, 0.087334f, 0.096215f, 0.107481f, 0.119244f, 0.130421f, 0.141184f, 0.152404f, 0.164286f, 0.175808f, 0.185694f, 0.193429f, 0.199183f, 0.203422f, 0.206875f, 0.210212f, 0.213414f, 0.215952f, 0.217594f, 0.218544f, 0.218872f, 0.218422f, 0.217083f, 0.214671f, 0.210839f, 0.205624f, 0.199681f, 0.193644f, 0.187770f, 0.182378f, 0.177914f, 0.174397f, 0.171558f, 0.169503f, 0.168445f, 0.167984f, 0.167536f, 0.167028f, 0.166265f, 0.164275f, 0.160229f, 0.154156f, 0.145927f, 0.134776f, 0.120686f, 0.104691f, 0.087066f, 0.067093f, 0.045071f, 0.021659f, -0.005316f, -0.038739f, -0.073888f, -0.096316f, -0.093511f, -0.068230f, -0.036309f, -0.010540f} + } +}; +const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; + +/* Sample Rate = 16000 */ + +const int16_t CRendBin_HOA3_HRIR_max_num_iterations_16kHz = 1; +const uint16_t CRendBin_HOA3_HRIR_num_iterations_16kHz[16][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {0, 0}; +const uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[16][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}}; +const uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz = 0; +const float CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[16]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f}; +const uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float CRendBin_HOA3_HRIR_coeff_re_16kHz[16][BINAURAL_CHANNELS][80]={ + { + { 0.883857f, 0.733415f, 0.488407f, 0.219765f, -0.019522f, -0.206727f, -0.355857f, -0.497398f, -0.626479f, -0.691928f, -0.658239f, -0.535571f, -0.319712f, 0.011730f, 0.358242f, 0.451741f, 0.134258f, -0.340096f, -0.484683f, -0.125786f, 0.390069f, 0.611189f, 0.450608f, 0.138633f, -0.137573f, -0.370128f, -0.584446f, -0.746152f, -0.830104f, -0.865577f, -0.882556f, -0.877705f, -0.846732f, -0.803300f, -0.757904f, -0.709171f, -0.657369f, -0.606374f, -0.556373f, -0.507104f, -0.460955f, -0.416905f, -0.371212f, -0.325363f, -0.282989f, -0.241932f, -0.199475f, -0.158957f, -0.122405f, -0.085805f, -0.048176f, -0.013848f, 0.017815f, 0.051603f, 0.085261f, 0.113579f, 0.139998f, 0.169326f, 0.196673f, 0.218159f, 0.240616f, 0.267320f, 0.290455f, 0.308757f, 0.331756f, 0.358830f, 0.379533f, 0.397779f, 0.425526f, 0.455662f, 0.476389f, 0.501029f, 0.542486f, 0.581357f, 0.609875f, 0.668286f, 0.765750f, 0.813077f, 0.736556f, 0.621909f}, + { 0.883857f, 0.733415f, 0.488407f, 0.219765f, -0.019522f, -0.206727f, -0.355857f, -0.497398f, -0.626479f, -0.691928f, -0.658239f, -0.535571f, -0.319712f, 0.011730f, 0.358242f, 0.451741f, 0.134258f, -0.340096f, -0.484683f, -0.125786f, 0.390069f, 0.611189f, 0.450608f, 0.138633f, -0.137573f, -0.370128f, -0.584446f, -0.746152f, -0.830104f, -0.865577f, -0.882556f, -0.877705f, -0.846732f, -0.803300f, -0.757904f, -0.709171f, -0.657369f, -0.606374f, -0.556373f, -0.507104f, -0.460955f, -0.416905f, -0.371212f, -0.325363f, -0.282989f, -0.241932f, -0.199475f, -0.158957f, -0.122405f, -0.085805f, -0.048176f, -0.013848f, 0.017815f, 0.051603f, 0.085261f, 0.113579f, 0.139998f, 0.169326f, 0.196673f, 0.218159f, 0.240616f, 0.267320f, 0.290455f, 0.308757f, 0.331756f, 0.358830f, 0.379533f, 0.397779f, 0.425526f, 0.455662f, 0.476389f, 0.501029f, 0.542486f, 0.581357f, 0.609875f, 0.668286f, 0.765750f, 0.813077f, 0.736556f, 0.621909f} + }, + { + { -0.027320f, 0.203042f, 0.560441f, 0.855080f, 0.913923f, 0.695595f, 0.275320f, -0.242317f, -0.734864f, -1.060751f, -1.161327f, -1.101927f, -0.890150f, -0.379506f, 0.403667f, 0.941418f, 0.637872f, -0.349883f, -1.070253f, -0.802884f, 0.138395f, 0.872965f, 0.973380f, 0.700130f, 0.411920f, 0.163851f, -0.106361f, -0.348889f, -0.492759f, -0.572846f, -0.652509f, -0.726343f, -0.765973f, -0.782601f, -0.797805f, -0.807837f, -0.804710f, -0.793867f, -0.778506f, -0.754424f, -0.722406f, -0.686425f, -0.645124f, -0.597900f, -0.549560f, -0.501709f, -0.451184f, -0.399036f, -0.349319f, -0.301514f, -0.254382f, -0.210559f, -0.169586f, -0.126625f, -0.082489f, -0.042121f, -0.003063f, 0.039580f, 0.081194f, 0.116558f, 0.151377f, 0.189529f, 0.223338f, 0.250399f, 0.280134f, 0.312833f, 0.337748f, 0.358162f, 0.386893f, 0.417232f, 0.436207f, 0.457643f, 0.496886f, 0.534086f, 0.559077f, 0.615495f, 0.720955f, 0.788091f, 0.733920f, 0.633048f}, + { 0.027320f, -0.203042f, -0.560441f, -0.855080f, -0.913923f, -0.695595f, -0.275320f, 0.242317f, 0.734864f, 1.060751f, 1.161327f, 1.101927f, 0.890150f, 0.379506f, -0.403667f, -0.941418f, -0.637872f, 0.349883f, 1.070253f, 0.802884f, -0.138395f, -0.872965f, -0.973380f, -0.700130f, -0.411920f, -0.163851f, 0.106361f, 0.348889f, 0.492759f, 0.572846f, 0.652509f, 0.726343f, 0.765973f, 0.782601f, 0.797805f, 0.807837f, 0.804710f, 0.793867f, 0.778506f, 0.754424f, 0.722406f, 0.686425f, 0.645124f, 0.597900f, 0.549560f, 0.501709f, 0.451184f, 0.399036f, 0.349319f, 0.301514f, 0.254382f, 0.210559f, 0.169586f, 0.126625f, 0.082489f, 0.042121f, 0.003063f, -0.039580f, -0.081194f, -0.116558f, -0.151377f, -0.189529f, -0.223338f, -0.250399f, -0.280134f, -0.312833f, -0.337748f, -0.358162f, -0.386893f, -0.417232f, -0.436207f, -0.457643f, -0.496886f, -0.534086f, -0.559077f, -0.615495f, -0.720955f, -0.788091f, -0.733920f, -0.633048f} + }, + { + { 0.118436f, 0.115238f, 0.066724f, -0.031005f, -0.110536f, -0.104982f, -0.026119f, 0.054803f, 0.085973f, 0.067873f, 0.022013f, -0.034585f, -0.076928f, -0.068265f, 0.001219f, 0.079759f, 0.089362f, 0.012958f, -0.068933f, -0.055059f, 0.061752f, 0.181176f, 0.204944f, 0.133740f, 0.039616f, -0.026727f, -0.067425f, -0.097358f, -0.117479f, -0.128816f, -0.139106f, -0.148124f, -0.147540f, -0.137735f, -0.127967f, -0.121964f, -0.118868f, -0.123376f, -0.139592f, -0.160579f, -0.177238f, -0.190353f, -0.203239f, -0.212479f, -0.215771f, -0.218017f, -0.221530f, -0.221546f, -0.216582f, -0.210524f, -0.201753f, -0.183921f, -0.158000f, -0.129614f, -0.096841f, -0.054949f, -0.008121f, 0.037786f, 0.086428f, 0.141514f, 0.196865f, 0.248309f, 0.301857f, 0.359085f, 0.410915f, 0.454764f, 0.498103f, 0.538709f, 0.564751f, 0.577927f, 0.589323f, 0.592448f, 0.572721f, 0.540242f, 0.513516f, 0.474346f, 0.385659f, 0.255970f, 0.141241f, 0.082055f}, + { 0.118436f, 0.115238f, 0.066724f, -0.031005f, -0.110536f, -0.104982f, -0.026119f, 0.054803f, 0.085973f, 0.067873f, 0.022013f, -0.034585f, -0.076928f, -0.068265f, 0.001219f, 0.079759f, 0.089362f, 0.012958f, -0.068933f, -0.055059f, 0.061752f, 0.181176f, 0.204944f, 0.133740f, 0.039616f, -0.026727f, -0.067425f, -0.097358f, -0.117479f, -0.128816f, -0.139106f, -0.148124f, -0.147540f, -0.137735f, -0.127967f, -0.121964f, -0.118868f, -0.123376f, -0.139592f, -0.160579f, -0.177238f, -0.190353f, -0.203239f, -0.212479f, -0.215771f, -0.218017f, -0.221530f, -0.221546f, -0.216582f, -0.210524f, -0.201753f, -0.183921f, -0.158000f, -0.129614f, -0.096841f, -0.054949f, -0.008121f, 0.037786f, 0.086428f, 0.141514f, 0.196865f, 0.248309f, 0.301857f, 0.359085f, 0.410915f, 0.454764f, 0.498103f, 0.538709f, 0.564751f, 0.577927f, 0.589323f, 0.592448f, 0.572721f, 0.540242f, 0.513516f, 0.474346f, 0.385659f, 0.255970f, 0.141241f, 0.082055f} + }, + { + { 0.032265f, 0.058092f, 0.073219f, 0.041427f, -0.027377f, -0.074710f, -0.054839f, 0.005525f, 0.033420f, -0.004645f, -0.074163f, -0.131671f, -0.164722f, -0.155087f, -0.066220f, 0.075605f, 0.140276f, 0.027223f, -0.171436f, -0.236113f, -0.070379f, 0.189981f, 0.347922f, 0.350289f, 0.275749f, 0.188927f, 0.086500f, -0.040928f, -0.171421f, -0.284063f, -0.381731f, -0.470062f, -0.541769f, -0.589134f, -0.613034f, -0.615565f, -0.596996f, -0.561345f, -0.515497f, -0.463484f, -0.407689f, -0.352161f, -0.299365f, -0.247826f, -0.196903f, -0.149167f, -0.105444f, -0.063031f, -0.021015f, 0.017920f, 0.052064f, 0.081783f, 0.105940f, 0.122756f, 0.134246f, 0.144836f, 0.156248f, 0.167997f, 0.181050f, 0.196383f, 0.212049f, 0.225943f, 0.239050f, 0.252450f, 0.264499f, 0.274458f, 0.284930f, 0.297257f, 0.308914f, 0.318683f, 0.329107f, 0.340350f, 0.347916f, 0.350893f, 0.354868f, 0.358797f, 0.345304f, 0.296893f, 0.224114f, 0.168317f}, + { 0.032265f, 0.058092f, 0.073219f, 0.041427f, -0.027377f, -0.074710f, -0.054839f, 0.005525f, 0.033420f, -0.004645f, -0.074163f, -0.131671f, -0.164722f, -0.155087f, -0.066220f, 0.075605f, 0.140276f, 0.027223f, -0.171436f, -0.236113f, -0.070379f, 0.189981f, 0.347922f, 0.350289f, 0.275749f, 0.188927f, 0.086500f, -0.040928f, -0.171421f, -0.284063f, -0.381731f, -0.470062f, -0.541769f, -0.589134f, -0.613034f, -0.615565f, -0.596996f, -0.561345f, -0.515497f, -0.463484f, -0.407689f, -0.352161f, -0.299365f, -0.247826f, -0.196903f, -0.149167f, -0.105444f, -0.063031f, -0.021015f, 0.017920f, 0.052064f, 0.081783f, 0.105940f, 0.122756f, 0.134246f, 0.144836f, 0.156248f, 0.167997f, 0.181050f, 0.196383f, 0.212049f, 0.225943f, 0.239050f, 0.252450f, 0.264499f, 0.274458f, 0.284930f, 0.297257f, 0.308914f, 0.318683f, 0.329107f, 0.340350f, 0.347916f, 0.350893f, 0.354868f, 0.358797f, 0.345304f, 0.296893f, 0.224114f, 0.168317f} + }, + { + { 0.011552f, 0.000565f, -0.003312f, 0.012114f, 0.034643f, 0.042894f, 0.038718f, 0.047434f, 0.078185f, 0.098700f, 0.060730f, -0.052718f, -0.197397f, -0.271665f, -0.179838f, 0.052824f, 0.238687f, 0.183493f, -0.084160f, -0.306954f, -0.270000f, -0.022547f, 0.219181f, 0.324412f, 0.323963f, 0.283599f, 0.211949f, 0.102569f, -0.017904f, -0.119553f, -0.202749f, -0.277404f, -0.338929f, -0.381318f, -0.410145f, -0.429239f, -0.431485f, -0.411399f, -0.374227f, -0.328491f, -0.279921f, -0.233766f, -0.193863f, -0.159140f, -0.127047f, -0.098014f, -0.072129f, -0.046232f, -0.018734f, 0.007677f, 0.031175f, 0.053092f, 0.073299f, 0.089460f, 0.102015f, 0.113996f, 0.125945f, 0.136708f, 0.147823f, 0.161322f, 0.175607f, 0.188937f, 0.203404f, 0.220320f, 0.236539f, 0.250298f, 0.264790f, 0.281291f, 0.295883f, 0.307388f, 0.320088f, 0.334110f, 0.343177f, 0.346983f, 0.353477f, 0.359929f, 0.343271f, 0.284042f, 0.198067f, 0.133818f}, + { -0.011552f, -0.000565f, 0.003312f, -0.012114f, -0.034643f, -0.042894f, -0.038718f, -0.047434f, -0.078185f, -0.098700f, -0.060730f, 0.052718f, 0.197397f, 0.271665f, 0.179838f, -0.052824f, -0.238687f, -0.183493f, 0.084160f, 0.306954f, 0.270000f, 0.022547f, -0.219181f, -0.324412f, -0.323963f, -0.283599f, -0.211949f, -0.102569f, 0.017904f, 0.119553f, 0.202749f, 0.277404f, 0.338929f, 0.381318f, 0.410145f, 0.429239f, 0.431485f, 0.411399f, 0.374227f, 0.328491f, 0.279921f, 0.233766f, 0.193863f, 0.159140f, 0.127047f, 0.098014f, 0.072129f, 0.046232f, 0.018734f, -0.007677f, -0.031175f, -0.053092f, -0.073299f, -0.089460f, -0.102015f, -0.113996f, -0.125945f, -0.136708f, -0.147823f, -0.161322f, -0.175607f, -0.188937f, -0.203404f, -0.220320f, -0.236539f, -0.250298f, -0.264790f, -0.281291f, -0.295883f, -0.307388f, -0.320088f, -0.334110f, -0.343177f, -0.346983f, -0.353477f, -0.359929f, -0.343271f, -0.284042f, -0.198067f, -0.133818f} + }, + { + { 0.051162f, 0.004630f, -0.001227f, 0.050366f, 0.063139f, -0.012808f, -0.073989f, 0.003079f, 0.174556f, 0.264299f, 0.172675f, -0.020436f, -0.159153f, -0.156052f, -0.032841f, 0.113831f, 0.167176f, 0.075277f, -0.079544f, -0.141124f, -0.047299f, 0.099392f, 0.161108f, 0.119504f, 0.056727f, 0.028236f, 0.022203f, 0.022582f, 0.040897f, 0.080790f, 0.122332f, 0.151311f, 0.170587f, 0.180438f, 0.176020f, 0.162553f, 0.148761f, 0.129984f, 0.097918f, 0.058507f, 0.022731f, -0.008873f, -0.037674f, -0.057264f, -0.065527f, -0.071491f, -0.080334f, -0.087226f, -0.091495f, -0.098993f, -0.107772f, -0.110111f, -0.108138f, -0.108645f, -0.106898f, -0.094525f, -0.075444f, -0.055728f, -0.029601f, 0.007217f, 0.045808f, 0.081023f, 0.120922f, 0.166769f, 0.206984f, 0.240262f, 0.277196f, 0.313665f, 0.334528f, 0.343916f, 0.355052f, 0.356025f, 0.328945f, 0.289951f, 0.257626f, 0.201059f, 0.086037f, -0.044980f, -0.115572f, -0.123491f}, + { -0.051162f, -0.004630f, 0.001227f, -0.050366f, -0.063139f, 0.012808f, 0.073989f, -0.003079f, -0.174556f, -0.264299f, -0.172675f, 0.020436f, 0.159153f, 0.156052f, 0.032841f, -0.113831f, -0.167176f, -0.075277f, 0.079544f, 0.141124f, 0.047299f, -0.099392f, -0.161108f, -0.119504f, -0.056727f, -0.028236f, -0.022203f, -0.022582f, -0.040897f, -0.080790f, -0.122332f, -0.151311f, -0.170587f, -0.180438f, -0.176020f, -0.162553f, -0.148761f, -0.129984f, -0.097918f, -0.058507f, -0.022731f, 0.008873f, 0.037674f, 0.057264f, 0.065527f, 0.071491f, 0.080334f, 0.087226f, 0.091495f, 0.098993f, 0.107772f, 0.110111f, 0.108138f, 0.108645f, 0.106898f, 0.094525f, 0.075444f, 0.055728f, 0.029601f, -0.007217f, -0.045808f, -0.081023f, -0.120922f, -0.166769f, -0.206984f, -0.240262f, -0.277196f, -0.313665f, -0.334528f, -0.343916f, -0.355052f, -0.356025f, -0.328945f, -0.289951f, -0.257626f, -0.201059f, -0.086037f, 0.044980f, 0.115572f, 0.123491f} + }, + { + { -0.001314f, 0.013986f, 0.009786f, -0.021568f, -0.047753f, -0.057550f, -0.086395f, -0.154169f, -0.215190f, -0.199014f, -0.071655f, 0.152694f, 0.397084f, 0.495990f, 0.293761f, -0.132217f, -0.431993f, -0.318278f, 0.082383f, 0.358067f, 0.288935f, 0.046365f, -0.101534f, -0.106415f, -0.078828f, -0.063480f, -0.018297f, 0.055798f, 0.098862f, 0.089346f, 0.066346f, 0.059485f, 0.060855f, 0.062340f, 0.070487f, 0.084437f, 0.093707f, 0.096733f, 0.099690f, 0.102715f, 0.102674f, 0.100995f, 0.097996f, 0.089458f, 0.075691f, 0.063124f, 0.053174f, 0.040888f, 0.025646f, 0.011582f, -0.001922f, -0.019025f, -0.038853f, -0.058009f, -0.077789f, -0.100164f, -0.121936f, -0.140242f, -0.157366f, -0.174332f, -0.187554f, -0.195964f, -0.202516f, -0.206222f, -0.202547f, -0.192157f, -0.178650f, -0.159543f, -0.131095f, -0.097600f, -0.063527f, -0.024200f, 0.022505f, 0.067763f, 0.110169f, 0.162198f, 0.215318f, 0.224924f, 0.168949f, 0.102011f}, + { -0.001314f, 0.013986f, 0.009786f, -0.021568f, -0.047753f, -0.057550f, -0.086395f, -0.154169f, -0.215190f, -0.199014f, -0.071655f, 0.152694f, 0.397084f, 0.495990f, 0.293761f, -0.132217f, -0.431993f, -0.318278f, 0.082383f, 0.358067f, 0.288935f, 0.046365f, -0.101534f, -0.106415f, -0.078828f, -0.063480f, -0.018297f, 0.055798f, 0.098862f, 0.089346f, 0.066346f, 0.059485f, 0.060855f, 0.062340f, 0.070487f, 0.084437f, 0.093707f, 0.096733f, 0.099690f, 0.102715f, 0.102674f, 0.100995f, 0.097996f, 0.089458f, 0.075691f, 0.063124f, 0.053174f, 0.040888f, 0.025646f, 0.011582f, -0.001922f, -0.019025f, -0.038853f, -0.058009f, -0.077789f, -0.100164f, -0.121936f, -0.140242f, -0.157366f, -0.174332f, -0.187554f, -0.195964f, -0.202516f, -0.206222f, -0.202547f, -0.192157f, -0.178650f, -0.159543f, -0.131095f, -0.097600f, -0.063527f, -0.024200f, 0.022505f, 0.067763f, 0.110169f, 0.162198f, 0.215318f, 0.224924f, 0.168949f, 0.102011f} + }, + { + { 0.042103f, -0.013452f, -0.091487f, -0.148327f, -0.144124f, -0.055175f, 0.091983f, 0.204935f, 0.191965f, 0.062580f, -0.072721f, -0.121327f, -0.093551f, -0.051022f, -0.017300f, 0.017247f, 0.037857f, 0.014410f, -0.039540f, -0.070060f, -0.052305f, -0.017107f, 0.000424f, 0.004587f, 0.018491f, 0.047099f, 0.077608f, 0.099837f, 0.110945f, 0.108370f, 0.089842f, 0.058821f, 0.024413f, -0.005114f, -0.028508f, -0.051222f, -0.078453f, -0.109684f, -0.140991f, -0.169087f, -0.190473f, -0.201281f, -0.201941f, -0.197857f, -0.192519f, -0.184895f, -0.175234f, -0.166555f, -0.158810f, -0.148859f, -0.137050f, -0.126350f, -0.115695f, -0.102138f, -0.087471f, -0.074652f, -0.061324f, -0.044873f, -0.028707f, -0.015999f, -0.004116f, 0.008155f, 0.016586f, 0.020249f, 0.023972f, 0.028420f, 0.029801f, 0.030588f, 0.036368f, 0.043745f, 0.047696f, 0.055248f, 0.072784f, 0.090791f, 0.104872f, 0.134221f, 0.185880f, 0.221150f, 0.203371f, 0.163391f}, + { 0.042103f, -0.013452f, -0.091487f, -0.148327f, -0.144124f, -0.055175f, 0.091983f, 0.204935f, 0.191965f, 0.062580f, -0.072721f, -0.121327f, -0.093551f, -0.051022f, -0.017300f, 0.017247f, 0.037857f, 0.014410f, -0.039540f, -0.070060f, -0.052305f, -0.017107f, 0.000424f, 0.004587f, 0.018491f, 0.047099f, 0.077608f, 0.099837f, 0.110945f, 0.108370f, 0.089842f, 0.058821f, 0.024413f, -0.005114f, -0.028508f, -0.051222f, -0.078453f, -0.109684f, -0.140991f, -0.169087f, -0.190473f, -0.201281f, -0.201941f, -0.197857f, -0.192519f, -0.184895f, -0.175234f, -0.166555f, -0.158810f, -0.148859f, -0.137050f, -0.126350f, -0.115695f, -0.102138f, -0.087471f, -0.074652f, -0.061324f, -0.044873f, -0.028707f, -0.015999f, -0.004116f, 0.008155f, 0.016586f, 0.020249f, 0.023972f, 0.028420f, 0.029801f, 0.030588f, 0.036368f, 0.043745f, 0.047696f, 0.055248f, 0.072784f, 0.090791f, 0.104872f, 0.134221f, 0.185880f, 0.221150f, 0.203371f, 0.163391f} + }, + { + { -0.017545f, 0.076968f, 0.147238f, 0.125289f, 0.049414f, -0.057820f, -0.233434f, -0.448356f, -0.560146f, -0.463019f, -0.188026f, 0.190602f, 0.597571f, 0.824948f, 0.577274f, -0.126396f, -0.739164f, -0.676925f, -0.006837f, 0.613537f, 0.701525f, 0.399638f, 0.115282f, -0.003365f, -0.072131f, -0.166089f, -0.238583f, -0.264945f, -0.284852f, -0.312500f, -0.316805f, -0.287275f, -0.246557f, -0.204600f, -0.151995f, -0.090222f, -0.031983f, 0.019104f, 0.064902f, 0.100523f, 0.122410f, 0.136855f, 0.149719f, 0.158877f, 0.162462f, 0.163196f, 0.161570f, 0.155005f, 0.144910f, 0.136207f, 0.130365f, 0.125254f, 0.119853f, 0.114133f, 0.106910f, 0.097381f, 0.086310f, 0.074005f, 0.059767f, 0.043801f, 0.027185f, 0.010169f, -0.007656f, -0.026211f, -0.045001f, -0.063487f, -0.081298f, -0.098501f, -0.114708f, -0.128404f, -0.139398f, -0.150144f, -0.161200f, -0.169677f, -0.177286f, -0.191238f, -0.207043f, -0.202388f, -0.166936f, -0.129206f}, + { -0.017545f, 0.076968f, 0.147238f, 0.125289f, 0.049414f, -0.057820f, -0.233434f, -0.448356f, -0.560146f, -0.463019f, -0.188026f, 0.190602f, 0.597571f, 0.824948f, 0.577274f, -0.126396f, -0.739164f, -0.676925f, -0.006837f, 0.613537f, 0.701525f, 0.399638f, 0.115282f, -0.003365f, -0.072131f, -0.166089f, -0.238583f, -0.264945f, -0.284852f, -0.312500f, -0.316805f, -0.287275f, -0.246557f, -0.204600f, -0.151995f, -0.090222f, -0.031983f, 0.019104f, 0.064902f, 0.100523f, 0.122410f, 0.136855f, 0.149719f, 0.158877f, 0.162462f, 0.163196f, 0.161570f, 0.155005f, 0.144910f, 0.136207f, 0.130365f, 0.125254f, 0.119853f, 0.114133f, 0.106910f, 0.097381f, 0.086310f, 0.074005f, 0.059767f, 0.043801f, 0.027185f, 0.010169f, -0.007656f, -0.026211f, -0.045001f, -0.063487f, -0.081298f, -0.098501f, -0.114708f, -0.128404f, -0.139398f, -0.150144f, -0.161200f, -0.169677f, -0.177286f, -0.191238f, -0.207043f, -0.202388f, -0.166936f, -0.129206f} + }, + { + { -0.006941f, -0.009137f, -0.001025f, 0.023181f, 0.071280f, 0.152288f, 0.232381f, 0.241767f, 0.159918f, 0.019441f, -0.191250f, -0.477987f, -0.641445f, -0.366185f, 0.303140f, 0.785583f, 0.561935f, -0.151779f, -0.630912f, -0.503217f, -0.082209f, 0.167454f, 0.171480f, 0.133590f, 0.151479f, 0.158082f, 0.114516f, 0.066176f, 0.040238f, 0.013478f, -0.024102f, -0.051025f, -0.056634f, -0.052834f, -0.047949f, -0.040161f, -0.030751f, -0.023050f, -0.014898f, -0.004699f, 0.003065f, 0.006126f, 0.009138f, 0.014713f, 0.018779f, 0.018792f, 0.018156f, 0.019353f, 0.020281f, 0.020049f, 0.021722f, 0.026967f, 0.033551f, 0.039947f, 0.047332f, 0.055643f, 0.062465f, 0.067092f, 0.071222f, 0.074871f, 0.076231f, 0.075857f, 0.075991f, 0.075860f, 0.073017f, 0.068571f, 0.065118f, 0.061079f, 0.053861f, 0.045973f, 0.040311f, 0.033378f, 0.022033f, 0.010850f, 0.001847f, -0.014432f, -0.042350f, -0.064916f, -0.064261f, -0.051262f}, + { 0.006941f, 0.009137f, 0.001025f, -0.023181f, -0.071280f, -0.152288f, -0.232381f, -0.241767f, -0.159918f, -0.019441f, 0.191250f, 0.477987f, 0.641445f, 0.366185f, -0.303140f, -0.785583f, -0.561935f, 0.151779f, 0.630912f, 0.503217f, 0.082209f, -0.167454f, -0.171480f, -0.133590f, -0.151479f, -0.158082f, -0.114516f, -0.066176f, -0.040238f, -0.013478f, 0.024102f, 0.051025f, 0.056634f, 0.052834f, 0.047949f, 0.040161f, 0.030751f, 0.023050f, 0.014898f, 0.004699f, -0.003065f, -0.006126f, -0.009138f, -0.014713f, -0.018779f, -0.018792f, -0.018156f, -0.019353f, -0.020281f, -0.020049f, -0.021722f, -0.026967f, -0.033551f, -0.039947f, -0.047332f, -0.055643f, -0.062465f, -0.067092f, -0.071222f, -0.074871f, -0.076231f, -0.075857f, -0.075991f, -0.075860f, -0.073017f, -0.068571f, -0.065118f, -0.061079f, -0.053861f, -0.045973f, -0.040311f, -0.033378f, -0.022033f, -0.010850f, -0.001847f, 0.014432f, 0.042350f, 0.064916f, 0.064261f, 0.051262f} + }, + { + { -0.009108f, -0.000638f, 0.006579f, 0.001811f, -0.025320f, -0.072975f, -0.099878f, -0.046177f, 0.078173f, 0.161617f, 0.109552f, -0.025830f, -0.103052f, -0.069323f, -0.005915f, 0.007950f, -0.006548f, 0.003625f, 0.029014f, 0.026490f, -0.001964f, -0.017075f, -0.008856f, -0.005898f, -0.023342f, -0.040994f, -0.037654f, -0.018706f, -0.001195f, 0.008790f, 0.013986f, 0.014099f, 0.006255f, -0.008494f, -0.025735f, -0.041885f, -0.054703f, -0.062996f, -0.068182f, -0.073039f, -0.077308f, -0.077697f, -0.073146f, -0.066479f, -0.060233f, -0.054842f, -0.051364f, -0.051522f, -0.054305f, -0.056526f, -0.056981f, -0.056335f, -0.053803f, -0.048110f, -0.040567f, -0.033134f, -0.025166f, -0.015716f, -0.006373f, 0.001714f, 0.010176f, 0.019674f, 0.028014f, 0.034461f, 0.040938f, 0.047298f, 0.051293f, 0.053861f, 0.057721f, 0.061503f, 0.062963f, 0.065308f, 0.071389f, 0.076861f, 0.080196f, 0.090996f, 0.112659f, 0.126656f, 0.115757f, 0.095245f}, + { 0.009108f, 0.000638f, -0.006579f, -0.001811f, 0.025320f, 0.072975f, 0.099878f, 0.046177f, -0.078173f, -0.161617f, -0.109552f, 0.025830f, 0.103052f, 0.069323f, 0.005915f, -0.007950f, 0.006548f, -0.003625f, -0.029014f, -0.026490f, 0.001964f, 0.017075f, 0.008856f, 0.005898f, 0.023342f, 0.040994f, 0.037654f, 0.018706f, 0.001195f, -0.008790f, -0.013986f, -0.014099f, -0.006255f, 0.008494f, 0.025735f, 0.041885f, 0.054703f, 0.062996f, 0.068182f, 0.073039f, 0.077308f, 0.077697f, 0.073146f, 0.066479f, 0.060233f, 0.054842f, 0.051364f, 0.051522f, 0.054305f, 0.056526f, 0.056981f, 0.056335f, 0.053803f, 0.048110f, 0.040567f, 0.033134f, 0.025166f, 0.015716f, 0.006373f, -0.001714f, -0.010176f, -0.019674f, -0.028014f, -0.034461f, -0.040938f, -0.047298f, -0.051293f, -0.053861f, -0.057721f, -0.061503f, -0.062963f, -0.065308f, -0.071389f, -0.076861f, -0.080196f, -0.090996f, -0.112659f, -0.126656f, -0.115757f, -0.095245f} + }, + { + { -0.036299f, -0.021576f, 0.008339f, 0.022024f, -0.006026f, -0.023441f, 0.054545f, 0.203109f, 0.258935f, 0.083497f, -0.260111f, -0.516144f, -0.440053f, -0.037701f, 0.381792f, 0.458565f, 0.145761f, -0.228806f, -0.323180f, -0.139235f, 0.059116f, 0.103770f, 0.056741f, 0.022598f, -0.002741f, -0.054614f, -0.101353f, -0.098354f, -0.066298f, -0.053021f, -0.063515f, -0.072217f, -0.068674f, -0.055829f, -0.030066f, 0.010072f, 0.053291f, 0.089027f, 0.117100f, 0.138411f, 0.151225f, 0.158410f, 0.164831f, 0.168991f, 0.167807f, 0.164211f, 0.160954f, 0.154801f, 0.144154f, 0.132890f, 0.121469f, 0.104824f, 0.081993f, 0.056942f, 0.029818f, -0.001262f, -0.032295f, -0.058604f, -0.083127f, -0.109320f, -0.133549f, -0.153530f, -0.173701f, -0.194504f, -0.209278f, -0.217046f, -0.222920f, -0.223700f, -0.211596f, -0.190929f, -0.169788f, -0.141148f, -0.097122f, -0.049726f, -0.007241f, 0.050044f, 0.129214f, 0.183903f, 0.170356f, 0.125994f}, + { 0.036299f, 0.021576f, -0.008339f, -0.022024f, 0.006026f, 0.023441f, -0.054545f, -0.203109f, -0.258935f, -0.083497f, 0.260111f, 0.516144f, 0.440053f, 0.037701f, -0.381792f, -0.458565f, -0.145761f, 0.228806f, 0.323180f, 0.139235f, -0.059116f, -0.103770f, -0.056741f, -0.022598f, 0.002741f, 0.054614f, 0.101353f, 0.098354f, 0.066298f, 0.053021f, 0.063515f, 0.072217f, 0.068674f, 0.055829f, 0.030066f, -0.010072f, -0.053291f, -0.089027f, -0.117100f, -0.138411f, -0.151225f, -0.158410f, -0.164831f, -0.168991f, -0.167807f, -0.164211f, -0.160954f, -0.154801f, -0.144154f, -0.132890f, -0.121469f, -0.104824f, -0.081993f, -0.056942f, -0.029818f, 0.001262f, 0.032295f, 0.058604f, 0.083127f, 0.109320f, 0.133549f, 0.153530f, 0.173701f, 0.194504f, 0.209278f, 0.217046f, 0.222920f, 0.223700f, 0.211596f, 0.190929f, 0.169788f, 0.141148f, 0.097122f, 0.049726f, 0.007241f, -0.050044f, -0.129214f, -0.183903f, -0.170356f, -0.125994f} + }, + { + { -0.025047f, -0.028754f, -0.028569f, -0.015495f, 0.010196f, 0.035640f, 0.044337f, 0.024249f, -0.028081f, -0.094389f, -0.127559f, -0.087289f, 0.004235f, 0.069146f, 0.055857f, -0.007075f, -0.056597f, -0.069039f, -0.062730f, -0.050133f, -0.024468f, 0.012365f, 0.041470f, 0.052445f, 0.056366f, 0.065583f, 0.073587f, 0.063210f, 0.028539f, -0.017899f, -0.057371f, -0.079077f, -0.082830f, -0.074407f, -0.062370f, -0.055041f, -0.054380f, -0.054159f, -0.048181f, -0.037707f, -0.027394f, -0.018485f, -0.010478f, -0.004506f, -0.000331f, 0.005219f, 0.013155f, 0.020828f, 0.027469f, 0.034894f, 0.041923f, 0.045338f, 0.046128f, 0.047149f, 0.046350f, 0.040257f, 0.030844f, 0.020980f, 0.008220f, -0.009083f, -0.026461f, -0.041430f, -0.058137f, -0.077722f, -0.094897f, -0.109097f, -0.126050f, -0.144888f, -0.158763f, -0.169239f, -0.182316f, -0.191952f, -0.188522f, -0.178697f, -0.171250f, -0.150620f, -0.097096f, -0.027594f, 0.019215f, 0.033651f}, + { -0.025047f, -0.028754f, -0.028569f, -0.015495f, 0.010196f, 0.035640f, 0.044337f, 0.024249f, -0.028081f, -0.094389f, -0.127559f, -0.087289f, 0.004235f, 0.069146f, 0.055857f, -0.007075f, -0.056597f, -0.069039f, -0.062730f, -0.050133f, -0.024468f, 0.012365f, 0.041470f, 0.052445f, 0.056366f, 0.065583f, 0.073587f, 0.063210f, 0.028539f, -0.017899f, -0.057371f, -0.079077f, -0.082830f, -0.074407f, -0.062370f, -0.055041f, -0.054380f, -0.054159f, -0.048181f, -0.037707f, -0.027394f, -0.018485f, -0.010478f, -0.004506f, -0.000331f, 0.005219f, 0.013155f, 0.020828f, 0.027469f, 0.034894f, 0.041923f, 0.045338f, 0.046128f, 0.047149f, 0.046350f, 0.040257f, 0.030844f, 0.020980f, 0.008220f, -0.009083f, -0.026461f, -0.041430f, -0.058137f, -0.077722f, -0.094897f, -0.109097f, -0.126050f, -0.144888f, -0.158763f, -0.169239f, -0.182316f, -0.191952f, -0.188522f, -0.178697f, -0.171250f, -0.150620f, -0.097096f, -0.027594f, 0.019215f, 0.033651f} + }, + { + { -0.033005f, -0.036257f, -0.019445f, 0.020321f, 0.057860f, 0.074577f, 0.063661f, 0.007800f, -0.096480f, -0.187851f, -0.173226f, -0.040226f, 0.105389f, 0.146569f, 0.072525f, -0.031645f, -0.081998f, -0.057456f, 0.006102f, 0.049635f, 0.032558f, -0.032467f, -0.090130f, -0.098890f, -0.066699f, -0.025791f, 0.006963f, 0.032157f, 0.050494f, 0.061958f, 0.071686f, 0.082610f, 0.088992f, 0.085509f, 0.075402f, 0.063868f, 0.050996f, 0.035750f, 0.020313f, 0.007358f, -0.002044f, -0.007197f, -0.008819f, -0.010228f, -0.013890f, -0.019307f, -0.026762f, -0.038606f, -0.054410f, -0.070003f, -0.083022f, -0.094042f, -0.102024f, -0.104979f, -0.104775f, -0.105066f, -0.105910f, -0.106145f, -0.107843f, -0.112681f, -0.118356f, -0.123577f, -0.130694f, -0.139213f, -0.144218f, -0.144444f, -0.143029f, -0.138673f, -0.126828f, -0.109819f, -0.093429f, -0.075360f, -0.051148f, -0.026508f, -0.006566f, 0.019079f, 0.058133f, 0.091618f, 0.096195f, 0.083166f}, + { -0.033005f, -0.036257f, -0.019445f, 0.020321f, 0.057860f, 0.074577f, 0.063661f, 0.007800f, -0.096480f, -0.187851f, -0.173226f, -0.040226f, 0.105389f, 0.146569f, 0.072525f, -0.031645f, -0.081998f, -0.057456f, 0.006102f, 0.049635f, 0.032558f, -0.032467f, -0.090130f, -0.098890f, -0.066699f, -0.025791f, 0.006963f, 0.032157f, 0.050494f, 0.061958f, 0.071686f, 0.082610f, 0.088992f, 0.085509f, 0.075402f, 0.063868f, 0.050996f, 0.035750f, 0.020313f, 0.007358f, -0.002044f, -0.007197f, -0.008819f, -0.010228f, -0.013890f, -0.019307f, -0.026762f, -0.038606f, -0.054410f, -0.070003f, -0.083022f, -0.094042f, -0.102024f, -0.104979f, -0.104775f, -0.105066f, -0.105910f, -0.106145f, -0.107843f, -0.112681f, -0.118356f, -0.123577f, -0.130694f, -0.139213f, -0.144218f, -0.144444f, -0.143029f, -0.138673f, -0.126828f, -0.109819f, -0.093429f, -0.075360f, -0.051148f, -0.026508f, -0.006566f, 0.019079f, 0.058133f, 0.091618f, 0.096195f, 0.083166f} + }, + { + { 0.001244f, -0.011714f, -0.018975f, -0.019388f, -0.028242f, -0.031454f, 0.013230f, 0.095142f, 0.112352f, -0.016836f, -0.210437f, -0.270105f, -0.109627f, 0.120234f, 0.193261f, 0.063294f, -0.105565f, -0.151978f, -0.085969f, -0.022310f, -0.012774f, -0.007520f, 0.041667f, 0.109371f, 0.143796f, 0.138462f, 0.124355f, 0.115741f, 0.097689f, 0.058191f, 0.004528f, -0.051150f, -0.101799f, -0.140639f, -0.162437f, -0.170701f, -0.172906f, -0.170378f, -0.161243f, -0.148300f, -0.135406f, -0.121911f, -0.108101f, -0.099258f, -0.097962f, -0.099850f, -0.101590f, -0.104536f, -0.107601f, -0.106247f, -0.100485f, -0.094225f, -0.086781f, -0.074970f, -0.061475f, -0.051088f, -0.042559f, -0.033713f, -0.028432f, -0.029468f, -0.032466f, -0.035073f, -0.041591f, -0.052187f, -0.060305f, -0.065417f, -0.073316f, -0.081610f, -0.082466f, -0.078897f, -0.077999f, -0.072670f, -0.053724f, -0.030703f, -0.011855f, 0.021724f, 0.084005f, 0.142124f, 0.153989f, 0.135267f}, + { 0.001244f, -0.011714f, -0.018975f, -0.019388f, -0.028242f, -0.031454f, 0.013230f, 0.095142f, 0.112352f, -0.016836f, -0.210437f, -0.270105f, -0.109627f, 0.120234f, 0.193261f, 0.063294f, -0.105565f, -0.151978f, -0.085969f, -0.022310f, -0.012774f, -0.007520f, 0.041667f, 0.109371f, 0.143796f, 0.138462f, 0.124355f, 0.115741f, 0.097689f, 0.058191f, 0.004528f, -0.051150f, -0.101799f, -0.140639f, -0.162437f, -0.170701f, -0.172906f, -0.170378f, -0.161243f, -0.148300f, -0.135406f, -0.121911f, -0.108101f, -0.099258f, -0.097962f, -0.099850f, -0.101590f, -0.104536f, -0.107601f, -0.106247f, -0.100485f, -0.094225f, -0.086781f, -0.074970f, -0.061475f, -0.051088f, -0.042559f, -0.033713f, -0.028432f, -0.029468f, -0.032466f, -0.035073f, -0.041591f, -0.052187f, -0.060305f, -0.065417f, -0.073316f, -0.081610f, -0.082466f, -0.078897f, -0.077999f, -0.072670f, -0.053724f, -0.030703f, -0.011855f, 0.021724f, 0.084005f, 0.142124f, 0.153989f, 0.135267f} + }, + { + { -0.013036f, -0.012005f, -0.010946f, -0.010336f, -0.011806f, -0.018223f, -0.025154f, -0.017942f, 0.005606f, 0.011671f, -0.037994f, -0.113752f, -0.116094f, 0.005214f, 0.150250f, 0.156107f, -0.002268f, -0.162837f, -0.163654f, -0.027056f, 0.091762f, 0.097477f, 0.030660f, -0.026612f, -0.045438f, -0.038626f, -0.014564f, 0.023807f, 0.062441f, 0.085957f, 0.093102f, 0.090477f, 0.081990f, 0.071815f, 0.066281f, 0.065817f, 0.062838f, 0.051246f, 0.031641f, 0.006718f, -0.021218f, -0.047928f, -0.068727f, -0.082506f, -0.090476f, -0.092952f, -0.090869f, -0.087450f, -0.085084f, -0.083439f, -0.082526f, -0.083859f, -0.087311f, -0.090779f, -0.093524f, -0.095999f, -0.097064f, -0.095528f, -0.093135f, -0.092047f, -0.091608f, -0.091215f, -0.092962f, -0.097813f, -0.103266f, -0.108015f, -0.113964f, -0.121091f, -0.126325f, -0.129603f, -0.133962f, -0.138229f, -0.137962f, -0.134611f, -0.133515f, -0.130971f, -0.114570f, -0.080508f, -0.041940f, -0.017332f}, + { -0.013036f, -0.012005f, -0.010946f, -0.010336f, -0.011806f, -0.018223f, -0.025154f, -0.017942f, 0.005606f, 0.011671f, -0.037994f, -0.113752f, -0.116094f, 0.005214f, 0.150250f, 0.156107f, -0.002268f, -0.162837f, -0.163654f, -0.027056f, 0.091762f, 0.097477f, 0.030660f, -0.026612f, -0.045438f, -0.038626f, -0.014564f, 0.023807f, 0.062441f, 0.085957f, 0.093102f, 0.090477f, 0.081990f, 0.071815f, 0.066281f, 0.065817f, 0.062838f, 0.051246f, 0.031641f, 0.006718f, -0.021218f, -0.047928f, -0.068727f, -0.082506f, -0.090476f, -0.092952f, -0.090869f, -0.087450f, -0.085084f, -0.083439f, -0.082526f, -0.083859f, -0.087311f, -0.090779f, -0.093524f, -0.095999f, -0.097064f, -0.095528f, -0.093135f, -0.092047f, -0.091608f, -0.091215f, -0.092962f, -0.097813f, -0.103266f, -0.108015f, -0.113964f, -0.121091f, -0.126325f, -0.129603f, -0.133962f, -0.138229f, -0.137962f, -0.134611f, -0.133515f, -0.130971f, -0.114570f, -0.080508f, -0.041940f, -0.017332f} + } +}; +const float CRendBin_HOA3_HRIR_coeff_im_16kHz[16][BINAURAL_CHANNELS][80]={ + { + { -0.177326f, -0.487059f, -0.688283f, -0.768556f, -0.752979f, -0.684514f, -0.599780f, -0.496150f, -0.338007f, -0.118021f, 0.117601f, 0.327026f, 0.493513f, 0.540869f, 0.331702f, -0.114816f, -0.473318f, -0.386772f, 0.079465f, 0.440207f, 0.323651f, -0.145870f, -0.579736f, -0.778395f, -0.813983f, -0.787794f, -0.702264f, -0.551636f, -0.383614f, -0.237862f, -0.107087f, 0.020217f, 0.132968f, 0.222907f, 0.297407f, 0.362059f, 0.415348f, 0.458635f, 0.495122f, 0.524689f, 0.548673f, 0.570929f, 0.590645f, 0.604357f, 0.614127f, 0.623417f, 0.629725f, 0.630908f, 0.630925f, 0.631539f, 0.628735f, 0.622443f, 0.617331f, 0.612036f, 0.601631f, 0.589119f, 0.579764f, 0.569621f, 0.554496f, 0.540418f, 0.531134f, 0.519368f, 0.502799f, 0.490106f, 0.481669f, 0.467444f, 0.449557f, 0.439167f, 0.430774f, 0.412237f, 0.393245f, 0.385818f, 0.373300f, 0.343565f, 0.321957f, 0.311994f, 0.249042f, 0.099998f, -0.035738f, -0.039462f}, + { -0.177326f, -0.487059f, -0.688283f, -0.768556f, -0.752979f, -0.684514f, -0.599780f, -0.496150f, -0.338007f, -0.118021f, 0.117601f, 0.327026f, 0.493513f, 0.540869f, 0.331702f, -0.114816f, -0.473318f, -0.386772f, 0.079465f, 0.440207f, 0.323651f, -0.145870f, -0.579736f, -0.778395f, -0.813983f, -0.787794f, -0.702264f, -0.551636f, -0.383614f, -0.237862f, -0.107087f, 0.020217f, 0.132968f, 0.222907f, 0.297407f, 0.362059f, 0.415348f, 0.458635f, 0.495122f, 0.524689f, 0.548673f, 0.570929f, 0.590645f, 0.604357f, 0.614127f, 0.623417f, 0.629725f, 0.630908f, 0.630925f, 0.631539f, 0.628735f, 0.622443f, 0.617331f, 0.612036f, 0.601631f, 0.589119f, 0.579764f, 0.569621f, 0.554496f, 0.540418f, 0.531134f, 0.519368f, 0.502799f, 0.490106f, 0.481669f, 0.467444f, 0.449557f, 0.439167f, 0.430774f, 0.412237f, 0.393245f, 0.385818f, 0.373300f, 0.343565f, 0.321957f, 0.311994f, 0.249042f, 0.099998f, -0.035738f, -0.039462f} + }, + { + { 0.139379f, 0.334475f, 0.302418f, -0.001740f, -0.470657f, -0.918060f, -1.205378f, -1.264950f, -1.068335f, -0.667808f, -0.206855f, 0.225808f, 0.664665f, 1.029106f, 0.958676f, 0.223895f, -0.711948f, -0.958987f, -0.218731f, 0.776762f, 1.088344f, 0.584741f, -0.131994f, -0.574116f, -0.760032f, -0.866210f, -0.902940f, -0.825573f, -0.695964f, -0.595691f, -0.515122f, -0.414746f, -0.305467f, -0.213289f, -0.131852f, -0.047320f, 0.035561f, 0.111395f, 0.184753f, 0.256163f, 0.320948f, 0.379770f, 0.434479f, 0.481617f, 0.520017f, 0.553844f, 0.583536f, 0.605648f, 0.621334f, 0.633823f, 0.642170f, 0.646572f, 0.651242f, 0.655765f, 0.655221f, 0.651172f, 0.648535f, 0.643768f, 0.631801f, 0.617925f, 0.606967f, 0.592474f, 0.571477f, 0.552782f, 0.538082f, 0.517509f, 0.492647f, 0.475480f, 0.461290f, 0.437183f, 0.413126f, 0.403158f, 0.390400f, 0.360546f, 0.340803f, 0.339290f, 0.288776f, 0.145051f, -0.000376f, -0.026236f}, + { -0.139379f, -0.334475f, -0.302418f, 0.001740f, 0.470657f, 0.918060f, 1.205378f, 1.264950f, 1.068335f, 0.667808f, 0.206855f, -0.225808f, -0.664665f, -1.029106f, -0.958676f, -0.223895f, 0.711948f, 0.958987f, 0.218731f, -0.776762f, -1.088344f, -0.584741f, 0.131994f, 0.574116f, 0.760032f, 0.866210f, 0.902940f, 0.825573f, 0.695964f, 0.595691f, 0.515122f, 0.414746f, 0.305467f, 0.213289f, 0.131852f, 0.047320f, -0.035561f, -0.111395f, -0.184753f, -0.256163f, -0.320948f, -0.379770f, -0.434479f, -0.481617f, -0.520017f, -0.553844f, -0.583536f, -0.605648f, -0.621334f, -0.633823f, -0.642170f, -0.646572f, -0.651242f, -0.655765f, -0.655221f, -0.651172f, -0.648535f, -0.643768f, -0.631801f, -0.617925f, -0.606967f, -0.592474f, -0.571477f, -0.552782f, -0.538082f, -0.517509f, -0.492647f, -0.475480f, -0.461290f, -0.437183f, -0.413126f, -0.403158f, -0.390400f, -0.360546f, -0.340803f, -0.339290f, -0.288776f, -0.145051f, 0.000376f, 0.026236f} + }, + { + { -0.017355f, -0.068585f, -0.129748f, -0.140677f, -0.067873f, 0.038579f, 0.095547f, 0.074031f, 0.011534f, -0.044693f, -0.073913f, -0.067610f, -0.018737f, 0.054581f, 0.097078f, 0.061877f, -0.025775f, -0.074615f, -0.020989f, 0.089634f, 0.140779f, 0.070434f, -0.065703f, -0.166766f, -0.192897f, -0.175608f, -0.151255f, -0.126215f, -0.098863f, -0.074963f, -0.054673f, -0.030640f, -0.004266f, 0.014389f, 0.022782f, 0.026012f, 0.024773f, 0.018634f, 0.015637f, 0.024021f, 0.040551f, 0.058741f, 0.079941f, 0.106170f, 0.132694f, 0.156946f, 0.183756f, 0.215131f, 0.246786f, 0.278634f, 0.315363f, 0.354946f, 0.390462f, 0.422391f, 0.455016f, 0.484479f, 0.504790f, 0.519338f, 0.532532f, 0.539137f, 0.534904f, 0.525663f, 0.514081f, 0.492430f, 0.458525f, 0.420763f, 0.379757f, 0.326532f, 0.263903f, 0.204445f, 0.145530f, 0.075927f, 0.005235f, -0.048914f, -0.098551f, -0.166600f, -0.231941f, -0.240292f, -0.172726f, -0.060996f}, + { -0.017355f, -0.068585f, -0.129748f, -0.140677f, -0.067873f, 0.038579f, 0.095547f, 0.074031f, 0.011534f, -0.044693f, -0.073913f, -0.067610f, -0.018737f, 0.054581f, 0.097078f, 0.061877f, -0.025775f, -0.074615f, -0.020989f, 0.089634f, 0.140779f, 0.070434f, -0.065703f, -0.166766f, -0.192897f, -0.175608f, -0.151255f, -0.126215f, -0.098863f, -0.074963f, -0.054673f, -0.030640f, -0.004266f, 0.014389f, 0.022782f, 0.026012f, 0.024773f, 0.018634f, 0.015637f, 0.024021f, 0.040551f, 0.058741f, 0.079941f, 0.106170f, 0.132694f, 0.156946f, 0.183756f, 0.215131f, 0.246786f, 0.278634f, 0.315363f, 0.354946f, 0.390462f, 0.422391f, 0.455016f, 0.484479f, 0.504790f, 0.519338f, 0.532532f, 0.539137f, 0.534904f, 0.525663f, 0.514081f, 0.492430f, 0.458525f, 0.420763f, 0.379757f, 0.326532f, 0.263903f, 0.204445f, 0.145530f, 0.075927f, 0.005235f, -0.048914f, -0.098551f, -0.166600f, -0.231941f, -0.240292f, -0.172726f, -0.060996f} + }, + { + { 0.005973f, -0.001416f, -0.045800f, -0.099150f, -0.109299f, -0.059292f, 0.001039f, 0.004764f, -0.052550f, -0.109926f, -0.118088f, -0.081582f, -0.016964f, 0.073434f, 0.150725f, 0.125706f, -0.026114f, -0.169539f, -0.128661f, 0.090155f, 0.279655f, 0.263749f, 0.075346f, -0.131939f, -0.272993f, -0.368065f, -0.444884f, -0.489466f, -0.487957f, -0.454682f, -0.405665f, -0.339390f, -0.252979f, -0.154344f, -0.052502f, 0.048489f, 0.143632f, 0.226516f, 0.295187f, 0.351028f, 0.394089f, 0.425052f, 0.447704f, 0.464623f, 0.474693f, 0.477963f, 0.477681f, 0.475121f, 0.467826f, 0.454724f, 0.437798f, 0.418152f, 0.395857f, 0.373745f, 0.355940f, 0.342815f, 0.331856f, 0.322189f, 0.313867f, 0.304823f, 0.293125f, 0.280092f, 0.267362f, 0.253770f, 0.238552f, 0.223882f, 0.210719f, 0.196308f, 0.179088f, 0.161285f, 0.143372f, 0.121745f, 0.095725f, 0.069936f, 0.044076f, 0.008055f, -0.042005f, -0.085674f, -0.088660f, -0.037890f}, + { 0.005973f, -0.001416f, -0.045800f, -0.099150f, -0.109299f, -0.059292f, 0.001039f, 0.004764f, -0.052550f, -0.109926f, -0.118088f, -0.081582f, -0.016964f, 0.073434f, 0.150725f, 0.125706f, -0.026114f, -0.169539f, -0.128661f, 0.090155f, 0.279655f, 0.263749f, 0.075346f, -0.131939f, -0.272993f, -0.368065f, -0.444884f, -0.489466f, -0.487957f, -0.454682f, -0.405665f, -0.339390f, -0.252979f, -0.154344f, -0.052502f, 0.048489f, 0.143632f, 0.226516f, 0.295187f, 0.351028f, 0.394089f, 0.425052f, 0.447704f, 0.464623f, 0.474693f, 0.477963f, 0.477681f, 0.475121f, 0.467826f, 0.454724f, 0.437798f, 0.418152f, 0.395857f, 0.373745f, 0.355940f, 0.342815f, 0.331856f, 0.322189f, 0.313867f, 0.304823f, 0.293125f, 0.280092f, 0.267362f, 0.253770f, 0.238552f, 0.223882f, 0.210719f, 0.196308f, 0.179088f, 0.161285f, 0.143372f, 0.121745f, 0.095725f, 0.069936f, 0.044076f, 0.008055f, -0.042005f, -0.085674f, -0.088660f, -0.037890f} + }, + { + { -0.004434f, -0.004101f, 0.011236f, 0.025203f, 0.019806f, 0.001597f, -0.006647f, -0.003102f, -0.018186f, -0.077431f, -0.161881f, -0.209978f, -0.155425f, 0.015003f, 0.208989f, 0.259800f, 0.084031f, -0.179896f, -0.269483f, -0.079015f, 0.215424f, 0.357678f, 0.278152f, 0.099699f, -0.058114f, -0.180673f, -0.286537f, -0.359113f, -0.378791f, -0.360714f, -0.328350f, -0.283730f, -0.223043f, -0.154424f, -0.085113f, -0.011153f, 0.069195f, 0.146411f, 0.210268f, 0.258185f, 0.290989f, 0.310397f, 0.321311f, 0.328850f, 0.333862f, 0.336132f, 0.338054f, 0.340622f, 0.340800f, 0.336748f, 0.330523f, 0.323257f, 0.313600f, 0.302440f, 0.293034f, 0.285845f, 0.278952f, 0.272797f, 0.268758f, 0.264967f, 0.259214f, 0.253039f, 0.247703f, 0.240380f, 0.229389f, 0.217820f, 0.207144f, 0.193744f, 0.176271f, 0.158660f, 0.141444f, 0.119286f, 0.091743f, 0.065323f, 0.038472f, -0.002614f, -0.061009f, -0.109488f, -0.108302f, -0.045399f}, + { 0.004434f, 0.004101f, -0.011236f, -0.025203f, -0.019806f, -0.001597f, 0.006647f, 0.003102f, 0.018186f, 0.077431f, 0.161881f, 0.209978f, 0.155425f, -0.015003f, -0.208989f, -0.259800f, -0.084031f, 0.179896f, 0.269483f, 0.079015f, -0.215424f, -0.357678f, -0.278152f, -0.099699f, 0.058114f, 0.180673f, 0.286537f, 0.359113f, 0.378791f, 0.360714f, 0.328350f, 0.283730f, 0.223043f, 0.154424f, 0.085113f, 0.011153f, -0.069195f, -0.146411f, -0.210268f, -0.258185f, -0.290989f, -0.310397f, -0.321311f, -0.328850f, -0.333862f, -0.336132f, -0.338054f, -0.340622f, -0.340800f, -0.336748f, -0.330523f, -0.323257f, -0.313600f, -0.302440f, -0.293034f, -0.285845f, -0.278952f, -0.272797f, -0.268758f, -0.264967f, -0.259214f, -0.253039f, -0.247703f, -0.240380f, -0.229389f, -0.217820f, -0.207144f, -0.193744f, -0.176271f, -0.158660f, -0.141444f, -0.119286f, -0.091743f, -0.065323f, -0.038472f, 0.002614f, 0.061009f, 0.109488f, 0.108302f, 0.045399f} + }, + { + { -0.022223f, -0.023532f, 0.026143f, 0.036395f, -0.022129f, -0.046557f, 0.045156f, 0.166015f, 0.154331f, -0.014356f, -0.190818f, -0.223106f, -0.100545f, 0.070829f, 0.171310f, 0.137761f, 0.000653f, -0.117443f, -0.095181f, 0.054848f, 0.184857f, 0.177260f, 0.071288f, -0.011410f, -0.019128f, 0.008364f, 0.032900f, 0.058999f, 0.089829f, 0.105464f, 0.095113f, 0.070357f, 0.040449f, 0.004549f, -0.032060f, -0.060672f, -0.084976f, -0.112282f, -0.135857f, -0.144728f, -0.140958f, -0.131144f, -0.113768f, -0.089047f, -0.066562f, -0.051180f, -0.036343f, -0.018844f, -0.003461f, 0.010980f, 0.031603f, 0.056462f, 0.078228f, 0.100182f, 0.129600f, 0.161531f, 0.187796f, 0.212133f, 0.238638f, 0.258971f, 0.267587f, 0.272407f, 0.276295f, 0.269169f, 0.249535f, 0.228442f, 0.204681f, 0.165734f, 0.116242f, 0.071322f, 0.024434f, -0.038282f, -0.101208f, -0.144017f, -0.186203f, -0.247657f, -0.284781f, -0.238696f, -0.131685f, -0.036438f}, + { 0.022223f, 0.023532f, -0.026143f, -0.036395f, 0.022129f, 0.046557f, -0.045156f, -0.166015f, -0.154331f, 0.014356f, 0.190818f, 0.223106f, 0.100545f, -0.070829f, -0.171310f, -0.137761f, -0.000653f, 0.117443f, 0.095181f, -0.054848f, -0.184857f, -0.177260f, -0.071288f, 0.011410f, 0.019128f, -0.008364f, -0.032900f, -0.058999f, -0.089829f, -0.105464f, -0.095113f, -0.070357f, -0.040449f, -0.004549f, 0.032060f, 0.060672f, 0.084976f, 0.112282f, 0.135857f, 0.144728f, 0.140958f, 0.131144f, 0.113768f, 0.089047f, 0.066562f, 0.051180f, 0.036343f, 0.018844f, 0.003461f, -0.010980f, -0.031603f, -0.056462f, -0.078228f, -0.100182f, -0.129600f, -0.161531f, -0.187796f, -0.212133f, -0.238638f, -0.258971f, -0.267587f, -0.272407f, -0.276295f, -0.269169f, -0.249535f, -0.228442f, -0.204681f, -0.165734f, -0.116242f, -0.071322f, -0.024434f, 0.038282f, 0.101208f, 0.144017f, 0.186203f, 0.247657f, 0.284781f, 0.238696f, 0.131685f, 0.036438f} + }, + { + { 0.003862f, -0.005550f, -0.035219f, -0.050424f, -0.039835f, -0.034124f, -0.043985f, -0.024194f, 0.069437f, 0.217796f, 0.352478f, 0.391419f, 0.253518f, -0.070759f, -0.406493f, -0.459708f, -0.129673f, 0.296657f, 0.414245f, 0.156646f, -0.158625f, -0.243467f, -0.132649f, -0.019223f, 0.029037f, 0.069156f, 0.114565f, 0.114517f, 0.063159f, 0.016167f, 0.005053f, 0.009585f, 0.010376f, 0.011826f, 0.014968f, 0.010184f, -0.002825f, -0.015268f, -0.025795f, -0.038657f, -0.052993f, -0.066906f, -0.082812f, -0.100047f, -0.112689f, -0.119957f, -0.127651f, -0.136984f, -0.143527f, -0.147285f, -0.152286f, -0.157533f, -0.158902f, -0.157091f, -0.154423f, -0.148374f, -0.136396f, -0.121265f, -0.105059f, -0.085015f, -0.060285f, -0.034399f, -0.007734f, 0.023017f, 0.056440f, 0.087696f, 0.117449f, 0.148415f, 0.176241f, 0.195804f, 0.210603f, 0.223157f, 0.225976f, 0.215951f, 0.201691f, 0.178640f, 0.121187f, 0.030102f, -0.036777f, -0.026855f}, + { 0.003862f, -0.005550f, -0.035219f, -0.050424f, -0.039835f, -0.034124f, -0.043985f, -0.024194f, 0.069437f, 0.217796f, 0.352478f, 0.391419f, 0.253518f, -0.070759f, -0.406493f, -0.459708f, -0.129673f, 0.296657f, 0.414245f, 0.156646f, -0.158625f, -0.243467f, -0.132649f, -0.019223f, 0.029037f, 0.069156f, 0.114565f, 0.114517f, 0.063159f, 0.016167f, 0.005053f, 0.009585f, 0.010376f, 0.011826f, 0.014968f, 0.010184f, -0.002825f, -0.015268f, -0.025795f, -0.038657f, -0.052993f, -0.066906f, -0.082812f, -0.100047f, -0.112689f, -0.119957f, -0.127651f, -0.136984f, -0.143527f, -0.147285f, -0.152286f, -0.157533f, -0.158902f, -0.157091f, -0.154423f, -0.148374f, -0.136396f, -0.121265f, -0.105059f, -0.085015f, -0.060285f, -0.034399f, -0.007734f, 0.023017f, 0.056440f, 0.087696f, 0.117449f, 0.148415f, 0.176241f, 0.195804f, 0.210603f, 0.223157f, 0.225976f, 0.215951f, 0.201691f, 0.178640f, 0.121187f, 0.030102f, -0.036777f, -0.026855f} + }, + { + { -0.035270f, -0.081929f, -0.072328f, -0.003387f, 0.102081f, 0.191567f, 0.193107f, 0.075847f, -0.091649f, -0.185816f, -0.151954f, -0.053283f, 0.018945f, 0.043102f, 0.046927f, 0.035757f, -0.003446f, -0.048321f, -0.051509f, -0.007303f, 0.037527f, 0.047720f, 0.038011f, 0.037503f, 0.047149f, 0.048355f, 0.032027f, 0.002560f, -0.034692f, -0.076149f, -0.115107f, -0.143065f, -0.156385f, -0.159333f, -0.159978f, -0.162529f, -0.164023f, -0.159091f, -0.145532f, -0.123554f, -0.093928f, -0.060439f, -0.029679f, -0.004678f, 0.017022f, 0.036928f, 0.053244f, 0.066453f, 0.079933f, 0.093680f, 0.104712f, 0.113731f, 0.123664f, 0.133021f, 0.138757f, 0.142838f, 0.147926f, 0.150992f, 0.149042f, 0.145156f, 0.141793f, 0.135931f, 0.127005f, 0.120124f, 0.116637f, 0.112583f, 0.108976f, 0.110492f, 0.114119f, 0.114315f, 0.115877f, 0.124115f, 0.130358f, 0.128184f, 0.129646f, 0.137654f, 0.122241f, 0.064040f, 0.002466f, -0.010057f}, + { -0.035270f, -0.081929f, -0.072328f, -0.003387f, 0.102081f, 0.191567f, 0.193107f, 0.075847f, -0.091649f, -0.185816f, -0.151954f, -0.053283f, 0.018945f, 0.043102f, 0.046927f, 0.035757f, -0.003446f, -0.048321f, -0.051509f, -0.007303f, 0.037527f, 0.047720f, 0.038011f, 0.037503f, 0.047149f, 0.048355f, 0.032027f, 0.002560f, -0.034692f, -0.076149f, -0.115107f, -0.143065f, -0.156385f, -0.159333f, -0.159978f, -0.162529f, -0.164023f, -0.159091f, -0.145532f, -0.123554f, -0.093928f, -0.060439f, -0.029679f, -0.004678f, 0.017022f, 0.036928f, 0.053244f, 0.066453f, 0.079933f, 0.093680f, 0.104712f, 0.113731f, 0.123664f, 0.133021f, 0.138757f, 0.142838f, 0.147926f, 0.150992f, 0.149042f, 0.145156f, 0.141793f, 0.135931f, 0.127005f, 0.120124f, 0.116637f, 0.112583f, 0.108976f, 0.110492f, 0.114119f, 0.114315f, 0.115877f, 0.124115f, 0.130358f, 0.128184f, 0.129646f, 0.137654f, 0.122241f, 0.064040f, 0.002466f, -0.010057f} + }, + { + { 0.042625f, 0.061776f, -0.027586f, -0.143182f, -0.223451f, -0.283569f, -0.301376f, -0.181308f, 0.100838f, 0.422023f, 0.640790f, 0.689329f, 0.491852f, -0.012830f, -0.619485f, -0.827479f, -0.346691f, 0.439982f, 0.806159f, 0.485676f, -0.097985f, -0.426002f, -0.432106f, -0.359643f, -0.337508f, -0.308023f, -0.233735f, -0.160655f, -0.109291f, -0.046792f, 0.036163f, 0.109928f, 0.161438f, 0.204028f, 0.240207f, 0.258404f, 0.257802f, 0.246553f, 0.225745f, 0.195126f, 0.162764f, 0.135196f, 0.109277f, 0.081673f, 0.055076f, 0.030942f, 0.007082f, -0.015502f, -0.032778f, -0.044893f, -0.055922f, -0.067781f, -0.079963f, -0.092783f, -0.106544f, -0.120012f, -0.132352f, -0.144019f, -0.154792f, -0.163557f, -0.170153f, -0.175219f, -0.178738f, -0.180172f, -0.179230f, -0.175923f, -0.170545f, -0.163212f, -0.153389f, -0.141450f, -0.129644f, -0.118625f, -0.105868f, -0.091562f, -0.079757f, -0.066681f, -0.038738f, 0.003573f, 0.031128f, 0.017989f}, + { 0.042625f, 0.061776f, -0.027586f, -0.143182f, -0.223451f, -0.283569f, -0.301376f, -0.181308f, 0.100838f, 0.422023f, 0.640790f, 0.689329f, 0.491852f, -0.012830f, -0.619485f, -0.827479f, -0.346691f, 0.439982f, 0.806159f, 0.485676f, -0.097985f, -0.426002f, -0.432106f, -0.359643f, -0.337508f, -0.308023f, -0.233735f, -0.160655f, -0.109291f, -0.046792f, 0.036163f, 0.109928f, 0.161438f, 0.204028f, 0.240207f, 0.258404f, 0.257802f, 0.246553f, 0.225745f, 0.195126f, 0.162764f, 0.135196f, 0.109277f, 0.081673f, 0.055076f, 0.030942f, 0.007082f, -0.015502f, -0.032778f, -0.044893f, -0.055922f, -0.067781f, -0.079963f, -0.092783f, -0.106544f, -0.120012f, -0.132352f, -0.144019f, -0.154792f, -0.163557f, -0.170153f, -0.175219f, -0.178738f, -0.180172f, -0.179230f, -0.175923f, -0.170545f, -0.163212f, -0.153389f, -0.141450f, -0.129644f, -0.118625f, -0.105868f, -0.091562f, -0.079757f, -0.066681f, -0.038738f, 0.003573f, 0.031128f, 0.017989f} + }, + { + { 0.004986f, 0.021455f, 0.046135f, 0.071785f, 0.092466f, 0.080954f, -0.003158f, -0.145617f, -0.276633f, -0.362866f, -0.395355f, -0.264738f, 0.149265f, 0.651373f, 0.736434f, 0.177675f, -0.547090f, -0.726833f, -0.253845f, 0.306337f, 0.459460f, 0.280374f, 0.109965f, 0.067554f, 0.043904f, -0.021849f, -0.075554f, -0.085260f, -0.084048f, -0.090241f, -0.083218f, -0.055049f, -0.024749f, -0.004212f, 0.011330f, 0.024407f, 0.032551f, 0.037896f, 0.043132f, 0.045153f, 0.042454f, 0.040083f, 0.040807f, 0.040467f, 0.036682f, 0.033444f, 0.033537f, 0.034430f, 0.034508f, 0.036228f, 0.040565f, 0.044452f, 0.045834f, 0.046017f, 0.045496f, 0.042430f, 0.036603f, 0.030268f, 0.024047f, 0.016450f, 0.007946f, 0.000698f, -0.005855f, -0.013972f, -0.022632f, -0.029204f, -0.034902f, -0.042227f, -0.049092f, -0.052708f, -0.056008f, -0.061987f, -0.066609f, -0.066985f, -0.069150f, -0.074874f, -0.070084f, -0.044292f, -0.013242f, -0.000130f}, + { -0.004986f, -0.021455f, -0.046135f, -0.071785f, -0.092466f, -0.080954f, 0.003158f, 0.145617f, 0.276633f, 0.362866f, 0.395355f, 0.264738f, -0.149265f, -0.651373f, -0.736434f, -0.177675f, 0.547090f, 0.726833f, 0.253845f, -0.306337f, -0.459460f, -0.280374f, -0.109965f, -0.067554f, -0.043904f, 0.021849f, 0.075554f, 0.085260f, 0.084048f, 0.090241f, 0.083218f, 0.055049f, 0.024749f, 0.004212f, -0.011330f, -0.024407f, -0.032551f, -0.037896f, -0.043132f, -0.045153f, -0.042454f, -0.040083f, -0.040807f, -0.040467f, -0.036682f, -0.033444f, -0.033537f, -0.034430f, -0.034508f, -0.036228f, -0.040565f, -0.044452f, -0.045834f, -0.046017f, -0.045496f, -0.042430f, -0.036603f, -0.030268f, -0.024047f, -0.016450f, -0.007946f, -0.000698f, 0.005855f, 0.013972f, 0.022632f, 0.029204f, 0.034902f, 0.042227f, 0.049092f, 0.052708f, 0.056008f, 0.061987f, 0.066609f, 0.066985f, 0.069150f, 0.074874f, 0.070084f, 0.044292f, 0.013242f, 0.000130f} + }, + { + { 0.003402f, 0.004407f, -0.006051f, -0.025050f, -0.041008f, -0.025966f, 0.043136f, 0.128240f, 0.134022f, 0.020795f, -0.115019f, -0.140061f, -0.049669f, 0.036681f, 0.041074f, 0.008186f, 0.004784f, 0.019218f, 0.006249f, -0.026881f, -0.037864f, -0.021977f, -0.013202f, -0.024484f, -0.031445f, -0.015937f, 0.008115f, 0.019221f, 0.014829f, 0.004287f, -0.008269f, -0.023585f, -0.039009f, -0.049334f, -0.052310f, -0.048822f, -0.040627f, -0.030481f, -0.021172f, -0.012355f, -0.001360f, 0.011724f, 0.023165f, 0.030522f, 0.034690f, 0.036621f, 0.036317f, 0.035645f, 0.037782f, 0.043224f, 0.050040f, 0.057691f, 0.066656f, 0.075380f, 0.081835f, 0.086743f, 0.091441f, 0.094789f, 0.095756f, 0.095987f, 0.096430f, 0.095207f, 0.091675f, 0.088019f, 0.084731f, 0.079935f, 0.074369f, 0.070712f, 0.067983f, 0.063773f, 0.060332f, 0.060178f, 0.059510f, 0.055794f, 0.055006f, 0.058300f, 0.051108f, 0.024257f, -0.003223f, -0.006390f}, + { -0.003402f, -0.004407f, 0.006051f, 0.025050f, 0.041008f, 0.025966f, -0.043136f, -0.128240f, -0.134022f, -0.020795f, 0.115019f, 0.140061f, 0.049669f, -0.036681f, -0.041074f, -0.008186f, -0.004784f, -0.019218f, -0.006249f, 0.026881f, 0.037864f, 0.021977f, 0.013202f, 0.024484f, 0.031445f, 0.015937f, -0.008115f, -0.019221f, -0.014829f, -0.004287f, 0.008269f, 0.023585f, 0.039009f, 0.049334f, 0.052310f, 0.048822f, 0.040627f, 0.030481f, 0.021172f, 0.012355f, 0.001360f, -0.011724f, -0.023165f, -0.030522f, -0.034690f, -0.036621f, -0.036317f, -0.035645f, -0.037782f, -0.043224f, -0.050040f, -0.057691f, -0.066656f, -0.075380f, -0.081835f, -0.086743f, -0.091441f, -0.094789f, -0.095756f, -0.095987f, -0.096430f, -0.095207f, -0.091675f, -0.088019f, -0.084731f, -0.079935f, -0.074369f, -0.070712f, -0.067983f, -0.063773f, -0.060332f, -0.060178f, -0.059510f, -0.055794f, -0.055006f, -0.058300f, -0.051108f, -0.024257f, 0.003223f, 0.006390f} + }, + { + { 0.011580f, 0.033110f, 0.035997f, 0.009825f, -0.002131f, 0.048826f, 0.111220f, 0.054933f, -0.161075f, -0.387225f, -0.394599f, -0.096964f, 0.326957f, 0.540354f, 0.341380f, -0.107676f, -0.401640f, -0.303987f, 0.014646f, 0.211430f, 0.166588f, 0.034676f, -0.031854f, -0.045160f, -0.063992f, -0.070171f, -0.028788f, 0.028095f, 0.049715f, 0.042124f, 0.043372f, 0.063906f, 0.090684f, 0.118564f, 0.146170f, 0.162760f, 0.160684f, 0.145656f, 0.124864f, 0.099606f, 0.072825f, 0.049131f, 0.026964f, 0.002608f, -0.021547f, -0.042454f, -0.063121f, -0.085674f, -0.106502f, -0.124513f, -0.144021f, -0.165318f, -0.183168f, -0.196174f, -0.206536f, -0.211896f, -0.208932f, -0.201414f, -0.193839f, -0.183228f, -0.166803f, -0.148575f, -0.129851f, -0.105037f, -0.073501f, -0.041507f, -0.008652f, 0.030592f, 0.071399f, 0.104577f, 0.134417f, 0.167669f, 0.193709f, 0.202800f, 0.208008f, 0.214079f, 0.187614f, 0.107244f, 0.021441f, -0.005911f}, + { -0.011580f, -0.033110f, -0.035997f, -0.009825f, 0.002131f, -0.048826f, -0.111220f, -0.054933f, 0.161075f, 0.387225f, 0.394599f, 0.096964f, -0.326957f, -0.540354f, -0.341380f, 0.107676f, 0.401640f, 0.303987f, -0.014646f, -0.211430f, -0.166588f, -0.034676f, 0.031854f, 0.045160f, 0.063992f, 0.070171f, 0.028788f, -0.028095f, -0.049715f, -0.042124f, -0.043372f, -0.063906f, -0.090684f, -0.118564f, -0.146170f, -0.162760f, -0.160684f, -0.145656f, -0.124864f, -0.099606f, -0.072825f, -0.049131f, -0.026964f, -0.002608f, 0.021547f, 0.042454f, 0.063121f, 0.085674f, 0.106502f, 0.124513f, 0.144021f, 0.165318f, 0.183168f, 0.196174f, 0.206536f, 0.211896f, 0.208932f, 0.201414f, 0.193839f, 0.183228f, 0.166803f, 0.148575f, 0.129851f, 0.105037f, 0.073501f, 0.041507f, 0.008652f, -0.030592f, -0.071399f, -0.104577f, -0.134417f, -0.167669f, -0.193709f, -0.202800f, -0.208008f, -0.214079f, -0.187614f, -0.107244f, -0.021441f, 0.005911f} + }, + { + { 0.000353f, 0.004850f, 0.016938f, 0.030564f, 0.032073f, 0.012264f, -0.025611f, -0.068068f, -0.092183f, -0.069650f, 0.005117f, 0.085764f, 0.102915f, 0.040391f, -0.040399f, -0.070602f, -0.045658f, -0.007020f, 0.021199f, 0.044834f, 0.064788f, 0.066750f, 0.047115f, 0.022488f, 0.005813f, -0.010554f, -0.039993f, -0.079586f, -0.110633f, -0.117382f, -0.099825f, -0.069651f, -0.039484f, -0.017639f, -0.007327f, -0.005072f, -0.002356f, 0.005931f, 0.016176f, 0.022381f, 0.023972f, 0.023436f, 0.021218f, 0.017720f, 0.015438f, 0.014768f, 0.012536f, 0.007496f, 0.001618f, -0.005392f, -0.015987f, -0.028902f, -0.040848f, -0.053077f, -0.068452f, -0.084551f, -0.097679f, -0.109499f, -0.121805f, -0.130797f, -0.134202f, -0.136272f, -0.138859f, -0.137270f, -0.130628f, -0.124399f, -0.118371f, -0.106102f, -0.088590f, -0.072164f, -0.053226f, -0.024390f, 0.007484f, 0.032334f, 0.059271f, 0.098873f, 0.130378f, 0.121254f, 0.074924f, 0.023150f}, + { 0.000353f, 0.004850f, 0.016938f, 0.030564f, 0.032073f, 0.012264f, -0.025611f, -0.068068f, -0.092183f, -0.069650f, 0.005117f, 0.085764f, 0.102915f, 0.040391f, -0.040399f, -0.070602f, -0.045658f, -0.007020f, 0.021199f, 0.044834f, 0.064788f, 0.066750f, 0.047115f, 0.022488f, 0.005813f, -0.010554f, -0.039993f, -0.079586f, -0.110633f, -0.117382f, -0.099825f, -0.069651f, -0.039484f, -0.017639f, -0.007327f, -0.005072f, -0.002356f, 0.005931f, 0.016176f, 0.022381f, 0.023972f, 0.023436f, 0.021218f, 0.017720f, 0.015438f, 0.014768f, 0.012536f, 0.007496f, 0.001618f, -0.005392f, -0.015987f, -0.028902f, -0.040848f, -0.053077f, -0.068452f, -0.084551f, -0.097679f, -0.109499f, -0.121805f, -0.130797f, -0.134202f, -0.136272f, -0.138859f, -0.137270f, -0.130628f, -0.124399f, -0.118371f, -0.106102f, -0.088590f, -0.072164f, -0.053226f, -0.024390f, 0.007484f, 0.032334f, 0.059271f, 0.098873f, 0.130378f, 0.121254f, 0.074924f, 0.023150f} + }, + { + { 0.003395f, 0.020426f, 0.045976f, 0.052329f, 0.026661f, -0.019555f, -0.077123f, -0.131965f, -0.135946f, -0.043667f, 0.104469f, 0.189095f, 0.135481f, -0.001437f, -0.101563f, -0.101652f, -0.032058f, 0.036129f, 0.050140f, 0.004006f, -0.059414f, -0.081736f, -0.043298f, 0.021078f, 0.066283f, 0.080513f, 0.077331f, 0.066832f, 0.051569f, 0.035939f, 0.022351f, 0.005726f, -0.017489f, -0.041778f, -0.060670f, -0.074727f, -0.086452f, -0.094598f, -0.097466f, -0.096127f, -0.092430f, -0.088340f, -0.086838f, -0.089337f, -0.093915f, -0.098990f, -0.105183f, -0.111202f, -0.112934f, -0.108926f, -0.101596f, -0.092150f, -0.080152f, -0.067970f, -0.059163f, -0.053214f, -0.047722f, -0.043425f, -0.041320f, -0.038708f, -0.033546f, -0.027639f, -0.020974f, -0.009681f, 0.006590f, 0.023443f, 0.040235f, 0.060007f, 0.080112f, 0.094580f, 0.105031f, 0.116178f, 0.123880f, 0.123088f, 0.120984f, 0.122633f, 0.112565f, 0.076090f, 0.030569f, 0.005103f}, + { 0.003395f, 0.020426f, 0.045976f, 0.052329f, 0.026661f, -0.019555f, -0.077123f, -0.131965f, -0.135946f, -0.043667f, 0.104469f, 0.189095f, 0.135481f, -0.001437f, -0.101563f, -0.101652f, -0.032058f, 0.036129f, 0.050140f, 0.004006f, -0.059414f, -0.081736f, -0.043298f, 0.021078f, 0.066283f, 0.080513f, 0.077331f, 0.066832f, 0.051569f, 0.035939f, 0.022351f, 0.005726f, -0.017489f, -0.041778f, -0.060670f, -0.074727f, -0.086452f, -0.094598f, -0.097466f, -0.096127f, -0.092430f, -0.088340f, -0.086838f, -0.089337f, -0.093915f, -0.098990f, -0.105183f, -0.111202f, -0.112934f, -0.108926f, -0.101596f, -0.092150f, -0.080152f, -0.067970f, -0.059163f, -0.053214f, -0.047722f, -0.043425f, -0.041320f, -0.038708f, -0.033546f, -0.027639f, -0.020974f, -0.009681f, 0.006590f, 0.023443f, 0.040235f, 0.060007f, 0.080112f, 0.094580f, 0.105031f, 0.116178f, 0.123880f, 0.123088f, 0.120984f, 0.122633f, 0.112565f, 0.076090f, 0.030569f, 0.005103f} + }, + { + { -0.008000f, -0.013983f, -0.007789f, -0.005223f, -0.001470f, 0.026111f, 0.057750f, 0.020944f, -0.107461f, -0.216369f, -0.156456f, 0.061682f, 0.235845f, 0.190009f, -0.018294f, -0.169020f, -0.135958f, -0.002906f, 0.078713f, 0.072889f, 0.055366f, 0.076663f, 0.100261f, 0.075548f, 0.012307f, -0.044797f, -0.080708f, -0.114873f, -0.158404f, -0.198177f, -0.219465f, -0.220285f, -0.203282f, -0.171611f, -0.133886f, -0.099826f, -0.070822f, -0.043728f, -0.020140f, -0.003424f, 0.007885f, 0.015626f, 0.017347f, 0.012913f, 0.008483f, 0.008293f, 0.010362f, 0.013895f, 0.021659f, 0.032566f, 0.041674f, 0.048599f, 0.056239f, 0.062372f, 0.062643f, 0.058926f, 0.054923f, 0.048525f, 0.037890f, 0.027863f, 0.021734f, 0.015808f, 0.009301f, 0.007997f, 0.012479f, 0.016621f, 0.021242f, 0.032989f, 0.048955f, 0.061284f, 0.074399f, 0.095752f, 0.116342f, 0.126272f, 0.137340f, 0.157260f, 0.157611f, 0.110681f, 0.043883f, 0.006629f}, + { -0.008000f, -0.013983f, -0.007789f, -0.005223f, -0.001470f, 0.026111f, 0.057750f, 0.020944f, -0.107461f, -0.216369f, -0.156456f, 0.061682f, 0.235845f, 0.190009f, -0.018294f, -0.169020f, -0.135958f, -0.002906f, 0.078713f, 0.072889f, 0.055366f, 0.076663f, 0.100261f, 0.075548f, 0.012307f, -0.044797f, -0.080708f, -0.114873f, -0.158404f, -0.198177f, -0.219465f, -0.220285f, -0.203282f, -0.171611f, -0.133886f, -0.099826f, -0.070822f, -0.043728f, -0.020140f, -0.003424f, 0.007885f, 0.015626f, 0.017347f, 0.012913f, 0.008483f, 0.008293f, 0.010362f, 0.013895f, 0.021659f, 0.032566f, 0.041674f, 0.048599f, 0.056239f, 0.062372f, 0.062643f, 0.058926f, 0.054923f, 0.048525f, 0.037890f, 0.027863f, 0.021734f, 0.015808f, 0.009301f, 0.007997f, 0.012479f, 0.016621f, 0.021242f, 0.032989f, 0.048955f, 0.061284f, 0.074399f, 0.095752f, 0.116342f, 0.126272f, 0.137340f, 0.157260f, 0.157611f, 0.110681f, 0.043883f, 0.006629f} + }, + { + { 0.000244f, 0.000061f, -0.001224f, -0.003636f, -0.007582f, -0.009677f, -0.002431f, 0.010807f, 0.005905f, -0.032432f, -0.065824f, -0.025045f, 0.089641f, 0.163727f, 0.085925f, -0.093404f, -0.190444f, -0.100797f, 0.073761f, 0.153524f, 0.088072f, -0.021053f, -0.069934f, -0.051675f, -0.011931f, 0.023520f, 0.050716f, 0.061297f, 0.047832f, 0.018566f, -0.012127f, -0.038159f, -0.058406f, -0.071156f, -0.079212f, -0.090778f, -0.109603f, -0.130885f, -0.148610f, -0.160134f, -0.163490f, -0.157326f, -0.144051f, -0.128082f, -0.111790f, -0.096521f, -0.084775f, -0.077767f, -0.073706f, -0.071042f, -0.070160f, -0.070401f, -0.069434f, -0.066612f, -0.063128f, -0.058957f, -0.053631f, -0.049011f, -0.047099f, -0.046826f, -0.046713f, -0.047859f, -0.050655f, -0.052377f, -0.051505f, -0.049975f, -0.048302f, -0.043964f, -0.036939f, -0.030309f, -0.023615f, -0.013271f, -0.000672f, 0.009320f, 0.019077f, 0.036301f, 0.058484f, 0.069611f, 0.056538f, 0.021593f}, + { 0.000244f, 0.000061f, -0.001224f, -0.003636f, -0.007582f, -0.009677f, -0.002431f, 0.010807f, 0.005905f, -0.032432f, -0.065824f, -0.025045f, 0.089641f, 0.163727f, 0.085925f, -0.093404f, -0.190444f, -0.100797f, 0.073761f, 0.153524f, 0.088072f, -0.021053f, -0.069934f, -0.051675f, -0.011931f, 0.023520f, 0.050716f, 0.061297f, 0.047832f, 0.018566f, -0.012127f, -0.038159f, -0.058406f, -0.071156f, -0.079212f, -0.090778f, -0.109603f, -0.130885f, -0.148610f, -0.160134f, -0.163490f, -0.157326f, -0.144051f, -0.128082f, -0.111790f, -0.096521f, -0.084775f, -0.077767f, -0.073706f, -0.071042f, -0.070160f, -0.070401f, -0.069434f, -0.066612f, -0.063128f, -0.058957f, -0.053631f, -0.049011f, -0.047099f, -0.046826f, -0.046713f, -0.047859f, -0.050655f, -0.052377f, -0.051505f, -0.049975f, -0.048302f, -0.043964f, -0.036939f, -0.030309f, -0.023615f, -0.013271f, -0.000672f, 0.009320f, 0.019077f, 0.036301f, 0.058484f, 0.069611f, 0.056538f, 0.021593f} + } +}; +const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; +#endif /* USE_HRIR_128_48000_DOLBY_SBA3 */ + +#ifdef USE_IIS_BRIR_OFFICIALMPEG_COMBINED + /********************** CRendBin_Combined_BRIR **********************/ -#ifdef FIX_BINAURAL_DELAY_PRECISION -const float CRendBin_Combined_BRIR_latency_s = 0.000145834f; -#else const float CRendBin_Combined_BRIR_latency_s = 0.000145833328133f; -#endif /* Sample Rate = 48000 */ @@ -6923,5 +8133,6 @@ const float CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS][252 0.018358f, -0.020195f, 0.012285f, -0.036205f, -0.000230f, -0.019486f, 0.021761f, -0.002862f, 0.002417f, -0.003265f, -0.021068f, -0.000886f, 0.017137f, 0.047554f, 0.002807f, 0.003558f, 0.009315f, 0.016659f, -0.003390f, -0.003905f, 0.000798f, -0.000180f, 0.040620f, -0.003109f, 0.005685f, 0.017226f, -0.016770f, -0.026851f, -0.000591f, -0.028399f, -0.004244f, -0.014234f, -0.011375f, -0.005117f, -0.012932f, 0.007654f, 0.009595f, -0.016141f, 0.020769f, 0.018611f, -0.003081f, -0.003444f, -0.017888f, 0.013329f, 0.004146f, 0.044256f, 0.048210f, 0.000359f, -0.014792f, -0.011865f, 0.040392f, -0.026530f, -0.030252f, 0.031509f, -0.028569f, 0.018427f, 0.005621f, 0.025515f, 0.023514f, 0.015908f, 0.002584f, -0.016001f, -0.013823f, 0.033133f, -0.013996f, -0.001348f, 0.008121f, 0.028260f, 0.040839f, -0.001144f, 0.027926f, -0.022702f, -0.023750f, 0.002818f, -0.008721f, 0.013302f, 0.008430f, -0.020183f, 0.002868f, 0.013112f, 0.033640f, 0.011641f, 0.013855f, 0.012837f, 0.015118f, 0.004113f, -0.001054f, 0.021560f, 0.003879f, 0.017326f, 0.027403f, 0.006026f, -0.011061f, -0.009150f, 0.024733f, 0.006850f, 0.050578f, 0.012222f, 0.020049f, -0.020057f, -0.032135f, -0.002553f, -0.037541f, -0.023567f, -0.008392f, -0.012215f, 0.001644f, -0.001142f, 0.000540f, 0.001404f, -0.027979f, -0.022362f, -0.012091f, -0.022963f, 0.009075f, 0.010977f, -0.007069f, -0.000183f, -0.022228f, -0.001348f, 0.006548f, -0.003034f} }; +#endif /* USE_IIS_BRIR_OFFICIALMPEG_COMBINED */ + -#undef WMC_TOOL_SKIP diff --git a/lib_rend/ivas_rom_binaural_crend_head.h b/lib_rend/ivas_rom_binaural_crend_head.h index 64582a1672..1f25538eab 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.h +++ b/lib_rend/ivas_rom_binaural_crend_head.h @@ -49,6 +49,8 @@ #include "cnst.h" #include "ivas_cnst.h" +#ifdef USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 + /********************** CRendBin_Combined_HRIR **********************/ @@ -95,6 +97,10 @@ extern float CRendBin_Combined_HRIR_coeff_re_16kHz[15][BINAURAL_CHANNELS][80]; extern float CRendBin_Combined_HRIR_coeff_im_16kHz[15][BINAURAL_CHANNELS][80]; extern float *CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; extern float *CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; +#endif /* USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 */ + +#ifdef USE_ORANGE_HRIR_53_HOA3S_48000 + /********************** CRendBin_HOA3_HRIR **********************/ @@ -141,6 +147,160 @@ extern float CRendBin_HOA3_HRIR_coeff_re_16kHz[16][BINAURAL_CHANNELS][160]; extern float CRendBin_HOA3_HRIR_coeff_im_16kHz[16][BINAURAL_CHANNELS][160]; extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; +#endif /* USE_ORANGE_HRIR_53_HOA3S_48000 */ + +#ifdef USE_HRIR_128_48000_DOLBY_SBA1 + + +/********************** CRendBin_FOA_HRIR **********************/ + +extern float CRendBin_FOA_HRIR_latency_s; + +/* Sample Rate = 48000 */ + +extern int16_t CRendBin_FOA_HRIR_max_num_iterations_48kHz; +extern uint16_t CRendBin_FOA_HRIR_num_iterations_48kHz[4][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[4][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_48kHz; +extern float CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz[4]; +extern uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; +extern float CRendBin_FOA_HRIR_coeff_re_48kHz[4][BINAURAL_CHANNELS][240]; +extern float CRendBin_FOA_HRIR_coeff_im_48kHz[4][BINAURAL_CHANNELS][240]; +extern float *CRendBin_FOA_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_FOA_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]; + +/* Sample Rate = 32000 */ + +extern int16_t CRendBin_FOA_HRIR_max_num_iterations_32kHz; +extern uint16_t CRendBin_FOA_HRIR_num_iterations_32kHz[4][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[4][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_32kHz; +extern float CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz[4]; +extern uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; +extern float CRendBin_FOA_HRIR_coeff_re_32kHz[4][BINAURAL_CHANNELS][160]; +extern float CRendBin_FOA_HRIR_coeff_im_32kHz[4][BINAURAL_CHANNELS][160]; +extern float *CRendBin_FOA_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]; + +/* Sample Rate = 16000 */ + +extern int16_t CRendBin_FOA_HRIR_max_num_iterations_16kHz; +extern uint16_t CRendBin_FOA_HRIR_num_iterations_16kHz[4][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[4][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_16kHz; +extern float CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz[4]; +extern uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; +extern float CRendBin_FOA_HRIR_coeff_re_16kHz[4][BINAURAL_CHANNELS][80]; +extern float CRendBin_FOA_HRIR_coeff_im_16kHz[4][BINAURAL_CHANNELS][80]; +extern float *CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; +#endif /* USE_HRIR_128_48000_DOLBY_SBA1 */ + +#ifdef USE_HRIR_128_48000_DOLBY_SBA2 + + +/********************** CRendBin_HOA2_HRIR **********************/ + +extern float CRendBin_HOA2_HRIR_latency_s; + +/* Sample Rate = 48000 */ + +extern int16_t CRendBin_HOA2_HRIR_max_num_iterations_48kHz; +extern uint16_t CRendBin_HOA2_HRIR_num_iterations_48kHz[9][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[9][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_48kHz; +extern float CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz[9]; +extern uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; +extern float CRendBin_HOA2_HRIR_coeff_re_48kHz[9][BINAURAL_CHANNELS][240]; +extern float CRendBin_HOA2_HRIR_coeff_im_48kHz[9][BINAURAL_CHANNELS][240]; +extern float *CRendBin_HOA2_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_HOA2_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]; + +/* Sample Rate = 32000 */ + +extern int16_t CRendBin_HOA2_HRIR_max_num_iterations_32kHz; +extern uint16_t CRendBin_HOA2_HRIR_num_iterations_32kHz[9][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[9][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_32kHz; +extern float CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz[9]; +extern uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; +extern float CRendBin_HOA2_HRIR_coeff_re_32kHz[9][BINAURAL_CHANNELS][160]; +extern float CRendBin_HOA2_HRIR_coeff_im_32kHz[9][BINAURAL_CHANNELS][160]; +extern float *CRendBin_HOA2_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_HOA2_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]; + +/* Sample Rate = 16000 */ + +extern int16_t CRendBin_HOA2_HRIR_max_num_iterations_16kHz; +extern uint16_t CRendBin_HOA2_HRIR_num_iterations_16kHz[9][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[9][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_16kHz; +extern float CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz[9]; +extern uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; +extern float CRendBin_HOA2_HRIR_coeff_re_16kHz[9][BINAURAL_CHANNELS][80]; +extern float CRendBin_HOA2_HRIR_coeff_im_16kHz[9][BINAURAL_CHANNELS][80]; +extern float *CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; +#endif /* USE_HRIR_128_48000_DOLBY_SBA2 */ + +#ifdef USE_HRIR_128_48000_DOLBY_SBA3 + + +/********************** CRendBin_HOA3_HRIR **********************/ + +extern float CRendBin_HOA3_HRIR_latency_s; + +/* Sample Rate = 48000 */ + +extern int16_t CRendBin_HOA3_HRIR_max_num_iterations_48kHz; +extern uint16_t CRendBin_HOA3_HRIR_num_iterations_48kHz[16][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[16][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz; +extern float CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz[16]; +extern uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; +extern float CRendBin_HOA3_HRIR_coeff_re_48kHz[16][BINAURAL_CHANNELS][240]; +extern float CRendBin_HOA3_HRIR_coeff_im_48kHz[16][BINAURAL_CHANNELS][240]; +extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]; + +/* Sample Rate = 32000 */ + +extern int16_t CRendBin_HOA3_HRIR_max_num_iterations_32kHz; +extern uint16_t CRendBin_HOA3_HRIR_num_iterations_32kHz[16][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[16][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz; +extern float CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz[16]; +extern uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; +extern float CRendBin_HOA3_HRIR_coeff_re_32kHz[16][BINAURAL_CHANNELS][160]; +extern float CRendBin_HOA3_HRIR_coeff_im_32kHz[16][BINAURAL_CHANNELS][160]; +extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]; + +/* Sample Rate = 16000 */ + +extern int16_t CRendBin_HOA3_HRIR_max_num_iterations_16kHz; +extern uint16_t CRendBin_HOA3_HRIR_num_iterations_16kHz[16][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[16][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz; +extern float CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[16]; +extern uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; +extern float CRendBin_HOA3_HRIR_coeff_re_16kHz[16][BINAURAL_CHANNELS][80]; +extern float CRendBin_HOA3_HRIR_coeff_im_16kHz[16][BINAURAL_CHANNELS][80]; +extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; +#endif /* USE_HRIR_128_48000_DOLBY_SBA3 */ + +#ifdef USE_IIS_BRIR_OFFICIALMPEG_COMBINED + /********************** CRendBin_Combined_BRIR **********************/ @@ -187,4 +347,6 @@ extern float CRendBin_Combined_BRIR_coeff_re_16kHz[15][BINAURAL_CHANNELS][1774]; extern float CRendBin_Combined_BRIR_coeff_im_16kHz[15][BINAURAL_CHANNELS][1774]; extern float CRendBin_Combined_BRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS][2522]; extern float CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS][2522]; +#endif /* USE_IIS_BRIR_OFFICIALMPEG_COMBINED */ + #endif /* _IVAS_ROM_BINAURAL_CREND_HEAD_ */ diff --git a/scripts/binauralRenderer_interface/generate_crend_ivas_tables_from_sofa.c b/scripts/binauralRenderer_interface/generate_crend_ivas_tables_from_sofa.c index 3f847f83cf..25aa620edc 100644 --- a/scripts/binauralRenderer_interface/generate_crend_ivas_tables_from_sofa.c +++ b/scripts/binauralRenderer_interface/generate_crend_ivas_tables_from_sofa.c @@ -169,7 +169,9 @@ int main( int argc, char *argv[] ) char *lib_rend_path = NULL; bool no_optim = false; + bool add_define = false; int notEndingWithSeparator = 0; + char *sofa_name = NULL; int i = 1; /* Optional arguments */ @@ -194,6 +196,11 @@ int main( int argc, char *argv[] ) no_optim = true; i++; } + else if ( strcmp( to_upper( argv[i] ), "-ADD_DEFINE" ) == 0 ) + { + add_define = true; + i++; + } else { fprintf( stderr, "Unknown option: %s\n\n", argv[i] ); @@ -389,9 +396,44 @@ int main( int argc, char *argv[] ) int err = 0; for ( ; i < argc; i++ ) { + if ( add_define ) + { + fp = fopen( c_file_path, "a" ); + if ( fp ) + { + sofa_name = strrchr( argv[i], '/' ); + size_t size_path = strlen( sofa_name ); + sofa_name = malloc( sizeof( char ) * size_path - 5 ); + strncpy( sofa_name, strrchr( argv[i], '/' ) + 1, size_path - 5 ); + sofa_name[size_path - 6] = '\0'; + fprintf( fp, "\n#ifdef USE_%s\n", to_upper( sofa_name ) ); + fclose( fp ); + } + fp = fopen( h_file_path, "a" ); + if ( fp ) + { + fprintf( fp, "\n#ifdef USE_%s\n", to_upper( sofa_name ) ); + fclose( fp ); + } + } err = generate_crend_ivas_tables_from_sofa( argv[i], no_optim ); if ( err != 0 ) return err; + if ( add_define ) + { + fp = fopen( c_file_path, "a" ); + if ( fp ) + { + fprintf( fp, "\n#endif /* USE_%s */\n", to_upper( sofa_name ) ); + fclose( fp ); + } + fp = fopen( h_file_path, "a" ); + if ( fp ) + { + fprintf( fp, "\n#endif /* USE_%s */\n", to_upper( sofa_name ) ); + fclose( fp ); + } + } } fp = fopen( h_file_path, "a" ); if ( fp ) -- GitLab From 8a914d64beed2989e87eac543e63903729c1db40 Mon Sep 17 00:00:00 2001 From: emerit Date: Thu, 13 Apr 2023 18:59:48 +0200 Subject: [PATCH 050/331] add sofa for rom generation --- .../HRIRs_sofa/HRIR_128_48000_dolby_SBA1.sofa | 3 +++ .../HRIRs_sofa/HRIR_128_48000_dolby_SBA2.sofa | 3 +++ .../HRIRs_sofa/HRIR_128_48000_dolby_SBA3.sofa | 3 +++ 3 files changed, 9 insertions(+) create mode 100644 scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA1.sofa create mode 100644 scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA2.sofa create mode 100644 scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA3.sofa diff --git a/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA1.sofa b/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA1.sofa new file mode 100644 index 0000000000..d4a21fbd26 --- /dev/null +++ b/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA1.sofa @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:173f5dff170b8876ed6f13059d7494230a552c57759c02b92a3339113e4df30b +size 46947 diff --git a/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA2.sofa b/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA2.sofa new file mode 100644 index 0000000000..f1b84e63c2 --- /dev/null +++ b/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA2.sofa @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a8ab32fec918351acc58fe4170786dbffd4cd2b577cfb54db8f42cc7bac5416f +size 51900 diff --git a/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA3.sofa b/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA3.sofa new file mode 100644 index 0000000000..dd55eeb994 --- /dev/null +++ b/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA3.sofa @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bf608a6f45d8fbeb3fedb0889b8f4cae0ce2f4c3abd2c09829a23ff74a0eea40 +size 58919 -- GitLab From 52dee4615ef44eec099cdb1296baf90a84cc7c9d Mon Sep 17 00:00:00 2001 From: emerit Date: Fri, 14 Apr 2023 13:57:42 +0200 Subject: [PATCH 051/331] fix missing latency estimation --- lib_com/options.h | 1 + lib_rend/ivas_rom_binaural_crend_head.c | 30 +++++++++++++++++-- .../HRIRs_sofa/HRIR_128_48000_dolby_SBA1.sofa | 4 +-- .../HRIRs_sofa/HRIR_128_48000_dolby_SBA2.sofa | 4 +-- .../HRIRs_sofa/HRIR_128_48000_dolby_SBA3.sofa | 4 +-- .../generate_crend_ivas_tables_from_sofa.c | 3 +- 6 files changed, 36 insertions(+), 10 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 3ccd9eead9..f48319fa05 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -169,6 +169,7 @@ #define ISSUE_24_CLEANUP_MCT_LFE /* Issue 24: Cleanup LFE path withing MCT */ +#define FIX_BINAURAL_DELAY_PRECISION #define USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 #define USE_HRIR_128_48000_DOLBY_SBA1 #define USE_HRIR_128_48000_DOLBY_SBA2 diff --git a/lib_rend/ivas_rom_binaural_crend_head.c b/lib_rend/ivas_rom_binaural_crend_head.c index 3c5515db8e..58fe25179f 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.c +++ b/lib_rend/ivas_rom_binaural_crend_head.c @@ -52,7 +52,11 @@ /********************** CRendBin_Combined_HRIR **********************/ +#ifdef FIX_BINAURAL_DELAY_PRECISION +const float CRendBin_Combined_HRIR_latency_s = 0.000020834f; +#else const float CRendBin_Combined_HRIR_latency_s = 0.000020833333110f; +#endif /* Sample Rate = 48000 */ @@ -648,7 +652,11 @@ const float *CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={N /********************** CRendBin_HOA3_HRIR **********************/ +#ifdef FIX_BINAURAL_DELAY_PRECISION +const float CRendBin_HOA3_HRIR_latency_s = 0.001333334f; +#else const float CRendBin_HOA3_HRIR_latency_s = 0.001333333319053f; +#endif /* Sample Rate = 48000 */ @@ -1600,7 +1608,11 @@ const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL, /********************** CRendBin_FOA_HRIR **********************/ -const float CRendBin_FOA_HRIR_latency_s = 0.000000000000000f; +#ifdef FIX_BINAURAL_DELAY_PRECISION +const float CRendBin_FOA_HRIR_latency_s = 0.000020834f; +#else +const float CRendBin_FOA_HRIR_latency_s = 0.000020833333110f; +#endif /* Sample Rate = 48000 */ @@ -1800,7 +1812,11 @@ const float *CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL,N /********************** CRendBin_HOA2_HRIR **********************/ -const float CRendBin_HOA2_HRIR_latency_s = 0.000000000000000f; +#ifdef FIX_BINAURAL_DELAY_PRECISION +const float CRendBin_HOA2_HRIR_latency_s = 0.000020834f; +#else +const float CRendBin_HOA2_HRIR_latency_s = 0.000020833333110f; +#endif /* Sample Rate = 48000 */ @@ -2180,7 +2196,11 @@ const float *CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL, /********************** CRendBin_HOA3_HRIR **********************/ -const float CRendBin_HOA3_HRIR_latency_s = 0.000000000000000f; +#ifdef FIX_BINAURAL_DELAY_PRECISION +const float CRendBin_HOA3_HRIR_latency_s = 0.000020834f; +#else +const float CRendBin_HOA3_HRIR_latency_s = 0.000020833333110f; +#endif /* Sample Rate = 48000 */ @@ -2812,7 +2832,11 @@ const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL, /********************** CRendBin_Combined_BRIR **********************/ +#ifdef FIX_BINAURAL_DELAY_PRECISION +const float CRendBin_Combined_BRIR_latency_s = 0.000145834f; +#else const float CRendBin_Combined_BRIR_latency_s = 0.000145833328133f; +#endif /* Sample Rate = 48000 */ diff --git a/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA1.sofa b/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA1.sofa index d4a21fbd26..7c30b0de53 100644 --- a/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA1.sofa +++ b/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA1.sofa @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:173f5dff170b8876ed6f13059d7494230a552c57759c02b92a3339113e4df30b -size 46947 +oid sha256:be90326a0196b802502d2d93dcaacc2bcec15f6d79f1b8d4c7e69564f32e1132 +size 46952 diff --git a/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA2.sofa b/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA2.sofa index f1b84e63c2..9d91f9a04d 100644 --- a/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA2.sofa +++ b/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA2.sofa @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a8ab32fec918351acc58fe4170786dbffd4cd2b577cfb54db8f42cc7bac5416f -size 51900 +oid sha256:6acd3ec4d8e0d586dac663b53124a90be699244fa21107d553fca00af00fa373 +size 51905 diff --git a/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA3.sofa b/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA3.sofa index dd55eeb994..74e60618a0 100644 --- a/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA3.sofa +++ b/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA3.sofa @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bf608a6f45d8fbeb3fedb0889b8f4cae0ce2f4c3abd2c09829a23ff74a0eea40 -size 58919 +oid sha256:872b1d794d77f1987a38f20cc3cb5627aee67bfd01ed7a50ab3514e0accedea5 +size 58924 diff --git a/scripts/binauralRenderer_interface/generate_crend_ivas_tables_from_sofa.c b/scripts/binauralRenderer_interface/generate_crend_ivas_tables_from_sofa.c index 25aa620edc..d8e15a1a3d 100644 --- a/scripts/binauralRenderer_interface/generate_crend_ivas_tables_from_sofa.c +++ b/scripts/binauralRenderer_interface/generate_crend_ivas_tables_from_sofa.c @@ -1035,7 +1035,8 @@ void update_c_file( HRTFS_DATA *hrtf, struct ivas_layout_config lscfg, const int /* float latency_s; */ fprintf( fp, "\n\n/********************** %s_%s **********************/\n", DECLARATION_NAME, lscfg.name ); #ifdef FIX_BINAURAL_DELAY_PRECISION - fprintf( fp, "\nconst float %s_%s_latency_s = %10.9ff;", DECLARATION_NAME, lscfg.name, hrtf->latency_s ); + fprintf( fp, "\n#ifdef FIX_BINAURAL_DELAY_PRECISION\nconst float %s_%s_latency_s = %10.9ff;\n#else", DECLARATION_NAME, lscfg.name, hrtf->latency_s ); + fprintf( fp, "\nconst float %s_%s_latency_s = %16.15ff;\n#endif", DECLARATION_NAME, lscfg.name, hrtf->latency_s - 0.000000001f ); #else fprintf( fp, "\nconst float %s_%s_latency_s = %16.15ff;", DECLARATION_NAME, lscfg.name, hrtf->latency_s ); #endif -- GitLab From 338cf2167e43d4135404e32b2867519baeefc948 Mon Sep 17 00:00:00 2001 From: emerit Date: Fri, 14 Apr 2023 15:14:17 +0200 Subject: [PATCH 052/331] CRend Enable loading of different tables based on ambisonics order --- lib_rend/ivas_crend.c | 354 ++++++++++++++++++++++++++++++++++++ lib_rend/ivas_hrtf.c | 4 + lib_rend/ivas_stat_rend.h | 4 + lib_util/hrtf_file_reader.c | 4 + 4 files changed, 366 insertions(+) diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index c05ae7c262..883ae92b75 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -447,6 +447,266 @@ static ivas_error ivas_rend_initCrend( } else if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) { +#ifdef UPDATE_SBA_FILTER +#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS + if ( inConfig == IVAS_REND_AUDIO_CONFIG_HOA3 ) + { +#endif + if ( output_Fs == 48000 ) + { + hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s; + hHrtf->max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_48kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_48kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_48kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_48kHz[i][j]; + } + } + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[j]; + } + } + else if ( output_Fs == 32000 ) + { + hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s; + hHrtf->max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_32kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_32kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_32kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_32kHz[i][j]; + } + } + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[j]; + } + } + else if ( output_Fs == 16000 ) + { + hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s; + hHrtf->max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_16kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_16kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_16kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_16kHz[i][j]; + } + } + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[j]; + } + } +#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS + } + else if ( inConfig == IVAS_REND_AUDIO_CONFIG_HOA2 ) + { + if ( output_Fs == 48000 ) + { + hHrtf->latency_s = CRendBin_HOA2_HRIR_latency_s; + hHrtf->max_num_iterations = CRendBin_HOA2_HRIR_max_num_iterations_48kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_HOA2_HRIR_index_frequency_max_diffuse_48kHz; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_HOA2_HRIR_num_iterations_48kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA2_HRIR_coeff_re_48kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA2_HRIR_coeff_im_48kHz[i][j]; + } + } + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_HOA2_HRIR_num_iterations_diffuse_48kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA2_HRIR_coeff_diffuse_re_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA2_HRIR_coeff_diffuse_im_48kHz[j]; + } + } + else if ( output_Fs == 32000 ) + { + hHrtf->latency_s = CRendBin_HOA2_HRIR_latency_s; + hHrtf->max_num_iterations = CRendBin_HOA2_HRIR_max_num_iterations_32kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_HOA2_HRIR_index_frequency_max_diffuse_32kHz; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_HOA2_HRIR_num_iterations_32kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA2_HRIR_coeff_re_32kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA2_HRIR_coeff_im_32kHz[i][j]; + } + } + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_HOA2_HRIR_num_iterations_diffuse_32kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA2_HRIR_coeff_diffuse_re_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA2_HRIR_coeff_diffuse_im_32kHz[j]; + } + } + else if ( output_Fs == 16000 ) + { + hHrtf->latency_s = CRendBin_HOA2_HRIR_latency_s; + hHrtf->max_num_iterations = CRendBin_HOA2_HRIR_max_num_iterations_16kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_HOA2_HRIR_index_frequency_max_diffuse_16kHz; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_HOA2_HRIR_num_iterations_16kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA2_HRIR_coeff_re_16kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA2_HRIR_coeff_im_16kHz[i][j]; + } + } + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_HOA2_HRIR_num_iterations_diffuse_16kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz[j]; + } + } + } + else if ( inConfig == IVAS_REND_AUDIO_CONFIG_FOA ) + { + if ( output_Fs == 48000 ) + { + hHrtf->latency_s = CRendBin_FOA_HRIR_latency_s; + hHrtf->max_num_iterations = CRendBin_FOA_HRIR_max_num_iterations_48kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_FOA_HRIR_index_frequency_max_diffuse_48kHz; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_FOA_HRIR_num_iterations_48kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_FOA_HRIR_coeff_re_48kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_FOA_HRIR_coeff_im_48kHz[i][j]; + } + } + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_FOA_HRIR_num_iterations_diffuse_48kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_FOA_HRIR_coeff_diffuse_re_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_FOA_HRIR_coeff_diffuse_im_48kHz[j]; + } + } + else if ( output_Fs == 32000 ) + { + hHrtf->latency_s = CRendBin_FOA_HRIR_latency_s; + hHrtf->max_num_iterations = CRendBin_FOA_HRIR_max_num_iterations_32kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_FOA_HRIR_index_frequency_max_diffuse_32kHz; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_FOA_HRIR_num_iterations_32kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_FOA_HRIR_coeff_re_32kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_FOA_HRIR_coeff_im_32kHz[i][j]; + } + } + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_FOA_HRIR_num_iterations_diffuse_32kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_FOA_HRIR_coeff_diffuse_re_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz[j]; + } + } + else if ( output_Fs == 16000 ) + { + hHrtf->latency_s = CRendBin_FOA_HRIR_latency_s; + hHrtf->max_num_iterations = CRendBin_FOA_HRIR_max_num_iterations_16kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_FOA_HRIR_index_frequency_max_diffuse_16kHz; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_FOA_HRIR_num_iterations_16kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_FOA_HRIR_coeff_re_16kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_FOA_HRIR_coeff_im_16kHz[i][j]; + } + } + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_FOA_HRIR_num_iterations_diffuse_16kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz[j]; + } + } + } +#endif + else + { + return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" ); + } + +#else if ( output_Fs == 48000 ) { hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s; @@ -531,6 +791,7 @@ static ivas_error ivas_rend_initCrend( { return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" ); } +#endif } else { @@ -632,6 +893,98 @@ static ivas_error ivas_rend_initCrend( } else if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) { + +#ifdef UPDATE_SBA_FILTER +#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS + if ( inConfig == IVAS_REND_AUDIO_CONFIG_HOA3 ) + { +#endif + hHrtf->latency_s = hSetOfHRTF->hHRTF_hrir_hoa3->latency_s; + hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_hoa3->max_num_iterations; + hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_hoa3->index_frequency_max_diffuse; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = hSetOfHRTF->hHRTF_hrir_hoa3->inv_diffuse_weight[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_hrir_hoa3->num_iterations[i][j]; + hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_hrir_hoa3->pIndex_frequency_max[i][j]; + hHrtf->pOut_to_bin_re[i][j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_re[i][j]; + hHrtf->pOut_to_bin_im[i][j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_im[i][j]; + } + } + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = hSetOfHRTF->hHRTF_hrir_hoa3->num_iterations_diffuse[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = hSetOfHRTF->hHRTF_hrir_hoa3->pIndex_frequency_max_diffuse[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_diffuse_re[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_diffuse_im[j]; + } +#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS + } + else if ( inConfig == IVAS_REND_AUDIO_CONFIG_HOA2 ) + { + hHrtf->latency_s = hSetOfHRTF->hHRTF_hrir_hoa2->latency_s; + hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_hoa2->max_num_iterations; + hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_hoa2->index_frequency_max_diffuse; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = hSetOfHRTF->hHRTF_hrir_hoa2->inv_diffuse_weight[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_hrir_hoa2->num_iterations[i][j]; + hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_hrir_hoa2->pIndex_frequency_max[i][j]; + hHrtf->pOut_to_bin_re[i][j] = hSetOfHRTF->hHRTF_hrir_hoa2->pOut_to_bin_re[i][j]; + hHrtf->pOut_to_bin_im[i][j] = hSetOfHRTF->hHRTF_hrir_hoa2->pOut_to_bin_im[i][j]; + } + } + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = hSetOfHRTF->hHRTF_hrir_hoa2->num_iterations_diffuse[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = hSetOfHRTF->hHRTF_hrir_hoa2->pIndex_frequency_max_diffuse[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = hSetOfHRTF->hHRTF_hrir_hoa2->pOut_to_bin_diffuse_re[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = hSetOfHRTF->hHRTF_hrir_hoa2->pOut_to_bin_diffuse_im[j]; + } + } + else if ( inConfig == IVAS_REND_AUDIO_CONFIG_HOA2 ) + { + hHrtf->latency_s = hSetOfHRTF->hHRTF_hrir_foa->latency_s; + hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_foa->max_num_iterations; + hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_foa->index_frequency_max_diffuse; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = hSetOfHRTF->hHRTF_hrir_foa->inv_diffuse_weight[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_hrir_foa->num_iterations[i][j]; + hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_hrir_foa->pIndex_frequency_max[i][j]; + hHrtf->pOut_to_bin_re[i][j] = hSetOfHRTF->hHRTF_hrir_foa->pOut_to_bin_re[i][j]; + hHrtf->pOut_to_bin_im[i][j] = hSetOfHRTF->hHRTF_hrir_foa->pOut_to_bin_im[i][j]; + } + } + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = hSetOfHRTF->hHRTF_hrir_foa->num_iterations_diffuse[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = hSetOfHRTF->hHRTF_hrir_foa->pIndex_frequency_max_diffuse[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = hSetOfHRTF->hHRTF_hrir_foa->pOut_to_bin_diffuse_re[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = hSetOfHRTF->hHRTF_hrir_foa->pOut_to_bin_diffuse_im[j]; + } + } +#endif + else + { + return IVAS_ERROR( IVAS_ERR_INTERNAL, "Unsupported renderer type in Crend" ); + } + } + +#else + hHrtf->latency_s = hSetOfHRTF->hHRTF_hrir_hoa3->latency_s; hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_hoa3->max_num_iterations; hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_hoa3->index_frequency_max_diffuse; @@ -660,6 +1013,7 @@ static ivas_error ivas_rend_initCrend( { return IVAS_ERROR( IVAS_ERR_INTERNAL, "Unsupported renderer type in Crend" ); } +#endif } pCrend->hHrtfCrend = hHrtf; diff --git a/lib_rend/ivas_hrtf.c b/lib_rend/ivas_hrtf.c index 2b1f16d025..f7826698fc 100644 --- a/lib_rend/ivas_hrtf.c +++ b/lib_rend/ivas_hrtf.c @@ -96,6 +96,10 @@ ivas_error ivas_HRTF_CRend_binary_open( ( *hSetOfHRTF )->hHRTF_hrir_combined = NULL; ( *hSetOfHRTF )->hHRTF_hrir_hoa3 = NULL; +#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS + ( *hSetOfHRTF )->hHRTF_hrir_hoa2 = NULL; + ( *hSetOfHRTF )->hHRTF_hrir_foa = NULL; +#endif ( *hSetOfHRTF )->hHRTF_brir_combined = NULL; return IVAS_ERR_OK; diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index e7ff9eb0ba..e82def5847 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -705,6 +705,10 @@ typedef struct ivas_hrtfs_crend_structure { HRTFS_DATA *hHRTF_hrir_combined; HRTFS_DATA *hHRTF_hrir_hoa3; +#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS + HRTFS_DATA *hHRTF_hrir_hoa2; + HRTFS_DATA *hHRTF_hrir_foa; +#endif HRTFS_DATA *hHRTF_brir_combined; } HRTFS_CREND, *HRTFS_CREND_HANDLE; diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index b7ffe81682..7e97d8b164 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -1598,6 +1598,10 @@ ivas_error destroy_SetOfHRTF( { destroy_HRTF( &( hSetOfHRTF->hHRTF_hrir_combined ) ); destroy_HRTF( &( hSetOfHRTF->hHRTF_hrir_hoa3 ) ); +#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS + destroy_HRTF( &( hSetOfHRTF->hHRTF_hrir_hoa2 ) ); + destroy_HRTF( &( hSetOfHRTF->hHRTF_hrir_foa ) ); +#endif destroy_HRTF( &( hSetOfHRTF->hHRTF_brir_combined ) ); } -- GitLab From dab4fae6b0bcf623f1c9cd0b474178a47769ad6f Mon Sep 17 00:00:00 2001 From: emerit Date: Fri, 14 Apr 2023 15:14:39 +0200 Subject: [PATCH 053/331] CRend Enable loading of different tables based on ambisonics order --- lib_com/options.h | 11 +++++++++-- lib_rend/ivas_crend.c | 1 - 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index f48319fa05..fff3321a71 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -171,11 +171,18 @@ #define FIX_BINAURAL_DELAY_PRECISION #define USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 +#define USE_IIS_BRIR_OFFICIALMPEG_COMBINED +//#define UPDATE_SBA_FILTER +#ifdef UPDATE_SBA_FILTER +#define UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS #define USE_HRIR_128_48000_DOLBY_SBA1 #define USE_HRIR_128_48000_DOLBY_SBA2 +#endif #define USE_HRIR_128_48000_DOLBY_SBA3 -//#define USE_ORANGE_HRIR_53_HOA3S_48000 -#define USE_IIS_BRIR_OFFICIALMPEG_COMBINED +#else +#define USE_ORANGE_HRIR_53_HOA3S_48000 +#endif /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index 883ae92b75..faa64518ce 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -893,7 +893,6 @@ static ivas_error ivas_rend_initCrend( } else if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) { - #ifdef UPDATE_SBA_FILTER #ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS if ( inConfig == IVAS_REND_AUDIO_CONFIG_HOA3 ) -- GitLab From 6a19989e13ff7ecfc80e900581a21cb515d997ae Mon Sep 17 00:00:00 2001 From: emerit Date: Fri, 14 Apr 2023 17:56:35 +0200 Subject: [PATCH 054/331] FastConv SBA Rom update --- lib_com/options.h | 2 +- lib_dec/ivas_binRenderer_internal.c | 58 + lib_rend/ivas_rom_binauralRenderer.c | 7068 ++++++++++++++++++++++++++ lib_rend/ivas_rom_binauralRenderer.h | 4 + lib_rend/ivas_stat_rend.h | 13 +- lib_util/hrtf_file_reader.c | 25 + 6 files changed, 7168 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index fff3321a71..f37f09d0cc 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -172,7 +172,7 @@ #define FIX_BINAURAL_DELAY_PRECISION #define USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 #define USE_IIS_BRIR_OFFICIALMPEG_COMBINED -//#define UPDATE_SBA_FILTER +#define UPDATE_SBA_FILTER #ifdef UPDATE_SBA_FILTER #define UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS #ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 2db5602519..a5ce96c585 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -143,7 +143,11 @@ static ivas_error ivas_binRenderer_convModuleOpen( if ( !isLoudspeaker ) { +#ifdef UPDATE_SBA_FILTER + hBinRenderer->nInChannels = audioCfg2channels( input_config ); // TODO maybe an audioCfg2channels_woLFE() function? Works as long as only 1 LFE is present +#else hBinRenderer->nInChannels = 16; +#endif } else { @@ -342,11 +346,42 @@ static ivas_error ivas_binRenderer_convModuleOpen( } else { +#ifdef UPDATE_SBA_FILTER + if ( input_config == IVAS_REND_AUDIO_CONFIG_HOA3 ) + { + /* HOA3 filter coefficients */ + hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftHRIRReal_HOA3[bandIdx][chIdx]; + hBinRenConvModule->filterTapsLeftImag[bandIdx][chIdx] = hHrtf->leftHRIRImag_HOA3[bandIdx][chIdx]; + hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightHRIRReal_HOA3[bandIdx][chIdx]; + hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx] = hHrtf->rightHRIRImag_HOA3[bandIdx][chIdx]; + } + else if ( input_config == IVAS_REND_AUDIO_CONFIG_HOA2 ) + { + /* HOA3 filter coefficients */ + hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftHRIRReal_HOA2[bandIdx][chIdx]; + hBinRenConvModule->filterTapsLeftImag[bandIdx][chIdx] = hHrtf->leftHRIRImag_HOA2[bandIdx][chIdx]; + hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightHRIRReal_HOA2[bandIdx][chIdx]; + hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx] = hHrtf->rightHRIRImag_HOA2[bandIdx][chIdx]; + } + else if ( input_config == IVAS_REND_AUDIO_CONFIG_FOA ) + { + /* HOA3 filter coefficients */ + hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftHRIRReal_FOA[bandIdx][chIdx]; + hBinRenConvModule->filterTapsLeftImag[bandIdx][chIdx] = hHrtf->leftHRIRImag_FOA[bandIdx][chIdx]; + hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightHRIRReal_FOA[bandIdx][chIdx]; + hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx] = hHrtf->rightHRIRImag_FOA[bandIdx][chIdx]; + } + else + { + return IVAS_ERR_INVALID_INPUT_FORMAT; + } +#else /* HOA3 filter coefficients */ hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftHRIRReal_HOA3[bandIdx][chIdx]; hBinRenConvModule->filterTapsLeftImag[bandIdx][chIdx] = hHrtf->leftHRIRImag_HOA3[bandIdx][chIdx]; hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightHRIRReal_HOA3[bandIdx][chIdx]; hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx] = hHrtf->rightHRIRImag_HOA3[bandIdx][chIdx]; +#endif } } } @@ -385,6 +420,10 @@ static ivas_error ivas_binaural_hrtf_open( HrtfFastConv->FASTCONV_HRIR_latency_s = FASTCONV_HRIR_latency_s; HrtfFastConv->FASTCONV_HOA3_latency_s = FASTCONV_HOA3_latency_s; +#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS + HrtfFastConv->FASTCONV_HOA2_latency_s = FASTCONV_HOA2_latency_s; + HrtfFastConv->FASTCONV_FOA_latency_s = FASTCONV_FOA_latency_s; +#endif HrtfFastConv->FASTCONV_BRIR_latency_s = FASTCONV_BRIR_latency_s; for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) @@ -658,7 +697,26 @@ ivas_error ivas_binRenderer_open( } else { +#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS + if ( hBinRenderer->nInChannels == 16 ) + { + st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtfFastConv->FASTCONV_HOA3_latency_s * 1000000000.f ); + } + else if ( hBinRenderer->nInChannels == 9 ) + { + st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtfFastConv->FASTCONV_HOA2_latency_s * 1000000000.f ); + } + else if ( hBinRenderer->nInChannels == 4 ) + { + st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtfFastConv->FASTCONV_FOA_latency_s * 1000000000.f ); + } + else + { + return IVAS_ERR_INVALID_INPUT_FORMAT; + } +#else st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtfFastConv->FASTCONV_HOA3_latency_s * 1000000000.f ); +#endif } } else diff --git a/lib_rend/ivas_rom_binauralRenderer.c b/lib_rend/ivas_rom_binauralRenderer.c index 9708bac83a..571af20b45 100644 --- a/lib_rend/ivas_rom_binauralRenderer.c +++ b/lib_rend/ivas_rom_binauralRenderer.c @@ -53,6 +53,9 @@ /* * Generated with Matlab version 9.3.0.713579 (R2017b) by MUXE6256 */ + +#ifdef USE_ORANGE_HRIR_53_HOA3S_48000 + const float FASTCONV_HOA3_latency_s = 0.001979167f; const float leftHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS]= { @@ -3670,6 +3673,7071 @@ const float rightHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NT } }; +#endif + +#ifdef USE_HRIR_128_48000_DOLBY_SBA3 + +const float FASTCONV_HOA3_latency_s = 0.000666667f; +const float leftHRIRReal_HOA3[BINAURAL_CONVBANDS][16][BINAURAL_NTAPS]= +{ + { + {+0.028305f, +0.686064f, +0.068005f, +0.008358f, +0.000134f}, + {+0.041076f, +0.081510f, -0.101574f, +0.012332f, +0.000133f}, + {+0.004694f, +0.091178f, -0.006019f, -0.000987f, -0.000100f}, + {+0.005000f, +0.062531f, -0.030068f, +0.002120f, -0.000090f}, + {+0.008304f, +0.004854f, +0.003618f, -0.000840f, -0.000150f}, + {+0.005344f, +0.010835f, +0.007864f, +0.004915f, -0.000112f}, + {-0.014194f, +0.005486f, -0.000750f, -0.002195f, +0.000158f}, + {+0.002251f, -0.002762f, +0.046227f, +0.004129f, +0.000004f}, + {-0.024537f, +0.046996f, -0.049712f, -0.006618f, +0.000145f}, + {+0.010068f, -0.052648f, +0.026763f, +0.010223f, +0.000366f}, + {+0.000943f, +0.017480f, -0.020482f, -0.001034f, -0.000058f}, + {+0.002377f, -0.034436f, -0.006489f, +0.012518f, +0.000220f}, + {-0.003606f, -0.027453f, +0.015178f, +0.001090f, -0.000006f}, + {-0.000854f, -0.033509f, +0.016348f, +0.002809f, +0.000078f}, + {+0.001127f, -0.002978f, +0.013287f, +0.005932f, -0.000006f}, + {-0.002728f, -0.006413f, +0.003444f, +0.002047f, +0.000053f} + }, + { + {-0.060981f, +0.539033f, -0.032927f, -0.008925f, -0.000158f}, + {-0.088569f, +0.331317f, +0.135589f, -0.009798f, -0.000139f}, + {-0.006979f, +0.010016f, -0.062582f, +0.002090f, +0.000127f}, + {-0.010389f, +0.024941f, -0.053685f, -0.002256f, +0.000117f}, + {-0.013525f, -0.047393f, -0.001706f, +0.001388f, +0.000191f}, + {-0.006413f, -0.030122f, -0.020701f, -0.011138f, +0.000148f}, + {+0.024834f, +0.109440f, +0.032236f, +0.002032f, -0.000215f}, + {-0.002223f, -0.102504f, -0.064424f, -0.005351f, -0.000007f}, + {+0.037480f, +0.308972f, +0.087606f, +0.006506f, -0.000210f}, + {-0.016939f, -0.106048f, -0.043760f, -0.005027f, -0.000470f}, + {-0.000739f, -0.002371f, -0.021897f, -0.001907f, +0.000076f}, + {-0.005038f, -0.073983f, -0.110448f, -0.018835f, -0.000283f}, + {+0.003491f, -0.004047f, +0.005200f, -0.002767f, +0.000014f}, + {+0.001174f, +0.011186f, +0.026019f, -0.003363f, -0.000098f}, + {-0.002185f, -0.029503f, -0.056810f, -0.012753f, +0.000001f}, + {+0.003633f, +0.007292f, -0.011811f, -0.003296f, -0.000071f} + }, + { + {+0.056640f, +0.424888f, -0.091068f, -0.008146f, -0.000105f}, + {+0.085624f, +0.535380f, -0.135686f, -0.024218f, -0.000137f}, + {+0.000837f, -0.039137f, -0.022512f, -0.003663f, +0.000063f}, + {+0.009275f, -0.013781f, -0.023629f, -0.005508f, +0.000051f}, + {+0.004547f, -0.088202f, +0.042587f, -0.003924f, +0.000093f}, + {-0.003101f, -0.099791f, +0.033209f, +0.007324f, +0.000060f}, + {-0.010598f, +0.183236f, -0.035352f, +0.008713f, -0.000074f}, + {-0.003128f, -0.087287f, -0.092687f, -0.003205f, -0.000001f}, + {-0.002915f, +0.422198f, -0.021401f, +0.017334f, -0.000046f}, + {+0.008367f, -0.030365f, -0.081942f, -0.019445f, -0.000222f}, + {-0.002027f, -0.059247f, +0.024597f, +0.009143f, +0.000033f}, + {+0.005485f, -0.016036f, -0.189920f, +0.005523f, -0.000134f}, + {+0.004590f, +0.043786f, -0.049890f, +0.002054f, -0.000006f}, + {+0.000794f, +0.086150f, -0.052409f, -0.001703f, -0.000051f}, + {+0.002015f, +0.016274f, -0.139462f, +0.010767f, +0.000013f}, + {+0.000980f, +0.021151f, -0.025610f, +0.002927f, -0.000028f} + }, + { + {-0.037044f, +0.299825f, +0.010626f, +0.009027f, +0.000178f}, + {-0.073631f, +0.563948f, +0.256507f, +0.030068f, +0.000165f}, + {+0.001394f, +0.007863f, +0.051772f, +0.005838f, -0.000136f}, + {-0.007311f, +0.033976f, +0.087547f, +0.012955f, -0.000125f}, + {-0.000742f, +0.006564f, +0.155719f, +0.010210f, -0.000207f}, + {+0.003772f, -0.011095f, +0.118202f, +0.002442f, -0.000158f}, + {-0.001621f, -0.014236f, -0.266669f, -0.019686f, +0.000230f}, + {+0.004592f, +0.006155f, +0.002774f, +0.008968f, +0.000009f}, + {-0.017921f, +0.015905f, -0.425734f, -0.038383f, +0.000222f}, + {-0.007216f, +0.258967f, +0.290441f, +0.007092f, +0.000519f}, + {+0.003522f, -0.023316f, +0.032467f, -0.009674f, -0.000084f}, + {-0.006507f, +0.177693f, +0.033997f, -0.006462f, +0.000311f}, + {-0.006842f, +0.024376f, -0.051686f, +0.001498f, -0.000018f}, + {-0.002603f, +0.039216f, -0.091765f, +0.003591f, +0.000108f}, + {-0.003570f, +0.063130f, -0.095408f, -0.005271f, -0.000002f}, + {-0.003443f, +0.045327f, +0.012038f, -0.006717f, +0.000078f} + }, + { + {+0.016927f, -0.038791f, +0.287896f, +0.014303f, +0.000072f}, + {+0.067605f, -0.097306f, +0.721167f, +0.014182f, +0.000134f}, + {+0.004523f, -0.006482f, +0.087578f, -0.003063f, -0.000024f}, + {+0.010963f, -0.024388f, +0.147380f, -0.008366f, -0.000010f}, + {+0.009045f, +0.033260f, +0.131601f, -0.010659f, -0.000033f}, + {+0.006391f, +0.001186f, +0.117010f, -0.003913f, -0.000007f}, + {-0.000206f, -0.124154f, -0.212720f, +0.011624f, -0.000013f}, + {+0.001006f, +0.018224f, +0.038185f, -0.004418f, -0.000004f}, + {+0.005972f, -0.280246f, -0.279425f, +0.024886f, -0.000056f}, + {+0.013866f, +0.056049f, +0.470046f, +0.033031f, +0.000066f}, + {-0.002003f, +0.013997f, -0.006699f, +0.002838f, -0.000007f}, + {+0.005432f, +0.012448f, +0.193385f, +0.021709f, +0.000041f}, + {+0.002080f, -0.035733f, +0.001464f, -0.003877f, +0.000020f}, + {+0.000948f, -0.008178f, -0.047042f, -0.001214f, +0.000022f}, + {+0.008010f, -0.037066f, -0.006003f, +0.001581f, -0.000020f}, + {+0.002016f, -0.033476f, +0.072960f, +0.011160f, +0.000001f} + }, + { + {-0.031783f, -0.056831f, +0.279059f, -0.028993f, -0.000193f}, + {-0.066811f, -0.547107f, +0.401585f, -0.049258f, -0.000209f}, + {-0.014835f, -0.045923f, +0.063394f, -0.003455f, +0.000127f}, + {-0.030703f, -0.186180f, +0.047058f, -0.002768f, +0.000115f}, + {-0.020147f, -0.183472f, -0.029803f, +0.002654f, +0.000199f}, + {-0.004470f, -0.071648f, +0.045482f, -0.003212f, +0.000142f}, + {+0.003858f, +0.057272f, -0.023397f, +0.006911f, -0.000202f}, + {-0.004365f, -0.021410f, +0.013528f, -0.002517f, -0.000010f}, + {-0.011844f, +0.030236f, +0.050498f, +0.004358f, -0.000183f}, + {-0.006262f, -0.197324f, +0.174496f, -0.041478f, -0.000509f}, + {-0.000909f, +0.022088f, -0.010300f, +0.001930f, +0.000082f}, + {+0.000576f, -0.053541f, +0.096593f, -0.021942f, -0.000302f}, + {-0.001649f, -0.054620f, +0.008127f, +0.002136f, +0.000016f}, + {+0.004848f, +0.029592f, +0.000282f, +0.000006f, -0.000106f}, + {-0.010837f, -0.090950f, -0.014402f, -0.000183f, +0.000006f}, + {+0.000125f, -0.021283f, +0.064876f, -0.009148f, -0.000073f} + }, + { + {+0.115524f, -0.001880f, -0.031709f, +0.016815f, -0.000032f}, + {+0.083119f, -0.442745f, -0.062014f, +0.030630f, -0.000109f}, + {+0.026381f, -0.044427f, -0.014701f, +0.004175f, -0.000007f}, + {+0.059970f, -0.279751f, -0.022479f, +0.004671f, -0.000021f}, + {+0.025539f, -0.285695f, -0.030687f, +0.001281f, -0.000018f}, + {-0.015563f, -0.014341f, -0.021407f, +0.004386f, -0.000034f}, + {-0.005271f, +0.080088f, +0.036839f, -0.008678f, +0.000080f}, + {-0.004239f, -0.044848f, +0.005762f, +0.002882f, +0.000009f}, + {+0.051110f, +0.084066f, +0.036589f, -0.007555f, +0.000131f}, + {-0.012587f, -0.147413f, -0.020658f, +0.013969f, +0.000077f}, + {+0.003103f, +0.017462f, -0.008157f, -0.001803f, -0.000018f}, + {-0.001965f, +0.006861f, -0.032042f, +0.005627f, +0.000042f}, + {+0.003954f, -0.069529f, +0.014309f, +0.000469f, -0.000034f}, + {-0.011351f, +0.041303f, +0.021348f, +0.000056f, +0.000005f}, + {+0.003411f, -0.131943f, -0.006306f, -0.000445f, +0.000025f}, + {-0.006265f, +0.023141f, +0.008583f, +0.003180f, +0.000023f} + }, + { + {-0.170064f, -0.305557f, -0.025217f, +0.001133f, +0.000198f}, + {-0.064730f, -0.498651f, -0.047336f, +0.004429f, +0.000255f}, + {-0.023390f, -0.090206f, -0.010300f, +0.000988f, -0.000108f}, + {-0.044740f, -0.402670f, -0.013847f, +0.001569f, -0.000092f}, + {-0.008298f, -0.311166f, -0.004422f, +0.002306f, -0.000173f}, + {+0.024372f, +0.077330f, -0.000442f, +0.001491f, -0.000110f}, + {+0.006327f, +0.051079f, +0.002801f, -0.003002f, +0.000146f}, + {+0.022671f, -0.029757f, -0.017304f, +0.000691f, +0.000009f}, + {-0.067089f, -0.067084f, +0.027632f, -0.007480f, +0.000108f}, + {+0.016067f, -0.071916f, -0.031764f, +0.005887f, +0.000449f}, + {-0.001118f, +0.007300f, -0.004732f, +0.000912f, -0.000072f}, + {-0.012764f, +0.015163f, -0.034285f, +0.004782f, +0.000265f}, + {+0.002476f, -0.078915f, +0.001493f, -0.000518f, -0.000008f}, + {+0.012009f, +0.058211f, +0.005130f, -0.001142f, +0.000096f}, + {+0.017876f, -0.124879f, -0.017363f, +0.001041f, -0.000014f}, + {+0.016489f, +0.044821f, -0.013683f, +0.000199f, +0.000060f} + }, + { + {+0.031523f, -0.568562f, -0.010165f, -0.004741f, -0.000011f}, + {-0.072210f, -0.453377f, -0.012668f, -0.009988f, +0.000056f}, + {-0.013073f, -0.089526f, -0.006790f, -0.002603f, +0.000024f}, + {-0.055858f, -0.385059f, +0.007901f, -0.002683f, +0.000038f}, + {-0.048389f, -0.243348f, +0.011742f, -0.002577f, +0.000053f}, + {-0.000883f, +0.129298f, +0.003415f, -0.002563f, +0.000054f}, + {+0.004842f, +0.028248f, -0.014727f, +0.004067f, -0.000113f}, + {-0.035207f, +0.044693f, -0.000317f, -0.001511f, -0.000014f}, + {+0.027873f, -0.208313f, -0.025747f, +0.006096f, -0.000162f}, + {-0.003882f, -0.022910f, +0.004172f, -0.004195f, -0.000185f}, + {-0.007316f, +0.007332f, +0.005614f, -0.000479f, +0.000037f}, + {+0.030651f, -0.049980f, +0.004306f, -0.003095f, -0.000103f}, + {-0.012670f, -0.046258f, -0.010787f, -0.000294f, +0.000044f}, + {-0.001544f, +0.071605f, -0.001508f, +0.001151f, -0.000025f}, + {-0.039147f, -0.057668f, +0.001114f, -0.001056f, -0.000026f}, + {-0.013243f, +0.076337f, -0.002755f, -0.000535f, -0.000039f} + }, + { + {+0.207932f, -0.287807f, +0.039075f, +0.000182f, -0.000191f}, + {+0.222358f, -0.019823f, +0.045919f, -0.001569f, -0.000284f}, + {+0.051902f, +0.024897f, +0.018540f, -0.000535f, +0.000087f}, + {+0.157008f, -0.084022f, +0.015927f, -0.001511f, +0.000065f}, + {+0.104303f, -0.038679f, +0.004300f, -0.001876f, +0.000138f}, + {-0.031107f, +0.090841f, +0.009802f, -0.001340f, +0.000075f}, + {-0.026573f, -0.012360f, -0.012445f, +0.003442f, -0.000083f}, + {+0.021614f, +0.128929f, +0.008965f, -0.000458f, -0.000006f}, + {+0.022498f, -0.192805f, -0.008217f, +0.005889f, -0.000025f}, + {+0.001966f, -0.020932f, +0.017205f, -0.001490f, -0.000358f}, + {+0.013558f, +0.031486f, +0.001450f, -0.000305f, +0.000057f}, + {-0.020576f, -0.126851f, +0.015311f, -0.000876f, -0.000211f}, + {+0.011427f, -0.005250f, -0.003401f, +0.000196f, -0.000006f}, + {-0.015857f, +0.049501f, -0.003717f, +0.000601f, -0.000080f}, + {+0.034004f, +0.039429f, +0.003524f, -0.000004f, +0.000023f}, + {-0.014818f, +0.079680f, +0.007758f, +0.000184f, -0.000042f} + }, + { + {-0.203020f, +0.343926f, -0.022319f, +0.001551f, +0.000052f}, + {-0.128697f, +0.502946f, -0.012208f, +0.003598f, +0.000018f}, + {-0.021293f, +0.148245f, -0.006309f, +0.001691f, -0.000030f}, + {-0.108184f, +0.296591f, -0.010288f, +0.001875f, -0.000040f}, + {-0.072445f, +0.199735f, -0.008865f, +0.001996f, -0.000070f}, + {+0.035970f, +0.000468f, -0.003327f, +0.001758f, -0.000054f}, + {+0.022536f, -0.076991f, +0.011763f, -0.002716f, +0.000111f}, + {+0.019549f, +0.129451f, +0.001977f, +0.001130f, +0.000018f}, + {-0.040267f, -0.070315f, +0.008077f, -0.004109f, +0.000149f}, + {-0.011400f, -0.010732f, -0.007406f, +0.002026f, +0.000250f}, + {-0.002851f, +0.052737f, -0.000419f, +0.000375f, -0.000049f}, + {-0.020950f, -0.124942f, -0.003929f, +0.001693f, +0.000137f}, + {-0.002830f, +0.012262f, +0.001345f, -0.000201f, -0.000049f}, + {+0.023252f, -0.010554f, +0.006382f, -0.000870f, +0.000037f}, + {+0.002904f, +0.073991f, +0.004806f, +0.000805f, +0.000022f}, + {+0.038844f, +0.012454f, +0.000939f, +0.000294f, +0.000047f} + }, + { + {-0.104978f, +0.491439f, -0.023130f, -0.000395f, +0.000170f}, + {-0.174716f, +0.431741f, -0.037189f, +0.000731f, +0.000283f}, + {-0.071508f, +0.077184f, -0.011405f, +0.000280f, -0.000069f}, + {-0.071830f, +0.341169f, -0.016908f, +0.001162f, -0.000044f}, + {-0.046880f, +0.228632f, -0.012580f, +0.001764f, -0.000105f}, + {-0.015443f, -0.068044f, -0.005570f, +0.000844f, -0.000048f}, + {+0.020736f, -0.083339f, +0.010949f, -0.002791f, +0.000031f}, + {-0.052065f, +0.019705f, -0.009215f, +0.000218f, +0.000001f}, + {+0.033356f, +0.036658f, +0.013911f, -0.004323f, -0.000040f}, + {+0.006601f, +0.021923f, -0.013349f, +0.000309f, +0.000258f}, + {-0.019016f, +0.023410f, -0.005296f, +0.000367f, -0.000039f}, + {+0.051437f, -0.010933f, -0.004546f, -0.000118f, +0.000155f}, + {+0.002536f, +0.019548f, +0.001804f, +0.000278f, +0.000021f}, + {-0.005862f, -0.062421f, -0.001401f, -0.000650f, +0.000064f}, + {-0.033799f, +0.010290f, -0.008108f, -0.000071f, -0.000030f}, + {-0.019280f, -0.065253f, -0.001294f, -0.000391f, +0.000024f} + }, + { + {+0.271163f, -0.091653f, +0.035807f, -0.000730f, -0.000085f}, + {+0.261169f, -0.235971f, +0.033757f, -0.001621f, -0.000093f}, + {+0.095839f, -0.182710f, +0.015397f, -0.001103f, +0.000028f}, + {+0.156712f, -0.007300f, +0.019789f, -0.001371f, +0.000033f}, + {+0.111926f, -0.011250f, +0.016908f, -0.001748f, +0.000072f}, + {-0.005469f, -0.082676f, +0.002169f, -0.001143f, +0.000043f}, + {-0.049695f, +0.016110f, -0.010723f, +0.002011f, -0.000086f}, + {+0.031235f, -0.105162f, +0.004404f, -0.000861f, -0.000020f}, + {-0.012529f, +0.088572f, -0.009833f, +0.002839f, -0.000106f}, + {+0.012620f, +0.018407f, +0.006593f, -0.002080f, -0.000273f}, + {+0.020511f, -0.042167f, +0.004809f, -0.000322f, +0.000054f}, + {-0.032247f, +0.119711f, -0.002446f, -0.001305f, -0.000148f}, + {-0.004589f, +0.033907f, -0.002233f, +0.000259f, +0.000047f}, + {-0.024243f, -0.043735f, -0.001053f, +0.000816f, -0.000043f}, + {+0.018051f, -0.070970f, +0.002759f, -0.000690f, -0.000016f}, + {-0.025928f, -0.049597f, -0.005106f, -0.000174f, -0.000047f} + }, + { + {-0.009292f, -0.523511f, +0.005609f, +0.000701f, -0.000140f}, + {+0.049598f, -0.562660f, +0.018307f, +0.000353f, -0.000250f}, + {+0.026674f, -0.300653f, +0.000453f, -0.000226f, +0.000059f}, + {-0.025200f, -0.281197f, +0.004191f, -0.000792f, +0.000032f}, + {-0.023452f, -0.216602f, +0.003361f, -0.001302f, +0.000079f}, + {+0.022798f, -0.048857f, +0.002028f, -0.000528f, +0.000034f}, + {+0.017850f, +0.123147f, -0.004163f, +0.001736f, -0.000002f}, + {+0.030232f, -0.106769f, +0.006484f, -0.000160f, +0.000004f}, + {-0.027081f, +0.068469f, -0.013975f, +0.002765f, +0.000074f}, + {-0.015824f, -0.032277f, +0.008777f, +0.000341f, -0.000168f}, + {+0.010909f, -0.060681f, +0.000865f, -0.000330f, +0.000023f}, + {-0.018513f, +0.140495f, +0.006788f, +0.000319f, -0.000106f}, + {-0.009128f, +0.032657f, +0.001038f, -0.000299f, -0.000035f}, + {+0.030409f, +0.035966f, +0.000871f, +0.000497f, -0.000049f}, + {+0.024037f, -0.062735f, +0.004854f, -0.000003f, +0.000033f}, + {+0.031906f, +0.040222f, +0.004969f, +0.000300f, -0.000009f} + }, + { + {-0.274242f, -0.111152f, -0.038437f, +0.000541f, +0.000106f}, + {-0.297362f, -0.028772f, -0.040257f, +0.001002f, +0.000153f}, + {-0.157861f, -0.028386f, -0.015885f, +0.000932f, -0.000023f}, + {-0.130190f, -0.116848f, -0.020017f, +0.001091f, -0.000023f}, + {-0.100486f, -0.097500f, -0.017137f, +0.001413f, -0.000066f}, + {-0.042930f, +0.041353f, -0.001818f, +0.000969f, -0.000030f}, + {+0.035539f, +0.107479f, +0.005226f, -0.001521f, +0.000054f}, + {-0.056245f, +0.022881f, -0.006748f, +0.000737f, +0.000020f}, + {+0.051781f, -0.041176f, +0.012387f, -0.002184f, +0.000054f}, + {-0.005351f, -0.056149f, -0.003091f, +0.002220f, +0.000265f}, + {-0.035484f, +0.008203f, -0.004198f, +0.000217f, -0.000054f}, + {+0.049383f, +0.039088f, +0.002024f, +0.001275f, +0.000143f}, + {+0.027963f, -0.019171f, +0.001212f, -0.000337f, -0.000040f}, + {+0.004231f, +0.075991f, +0.001119f, -0.000670f, +0.000043f}, + {-0.028326f, +0.016304f, -0.003947f, +0.000597f, +0.000009f}, + {+0.014165f, +0.065014f, +0.003473f, +0.000208f, +0.000042f} + }, + { + {+0.100761f, +0.468705f, +0.009523f, -0.000855f, +0.000106f}, + {+0.068322f, +0.534398f, -0.000794f, -0.001015f, +0.000195f}, + {+0.100085f, +0.366003f, +0.010962f, +0.000114f, -0.000054f}, + {+0.079789f, +0.208939f, +0.006983f, +0.000516f, -0.000029f}, + {+0.074868f, +0.177414f, +0.007217f, +0.000977f, -0.000063f}, + {+0.040080f, +0.169063f, +0.003424f, +0.000213f, -0.000031f}, + {-0.047852f, -0.014657f, +0.004244f, -0.000996f, -0.000005f}, + {+0.004688f, +0.112753f, -0.003849f, +0.000122f, -0.000008f}, + {-0.009956f, -0.138804f, +0.008769f, -0.001626f, -0.000077f}, + {+0.022634f, -0.009810f, -0.007400f, -0.000511f, +0.000099f}, + {+0.010732f, +0.077733f, +0.000399f, +0.000274f, -0.000009f}, + {-0.039390f, -0.089325f, -0.008313f, -0.000351f, +0.000070f}, + {-0.019067f, -0.090342f, -0.002768f, +0.000205f, +0.000044f}, + {-0.042005f, +0.002738f, -0.004159f, -0.000376f, +0.000037f}, + {-0.016073f, +0.032695f, -0.005232f, +0.000105f, -0.000033f}, + {-0.040117f, -0.022661f, -0.007858f, -0.000231f, -0.000002f} + }, + { + {+0.246756f, +0.241170f, +0.035479f, -0.000554f, -0.000114f}, + {+0.272424f, +0.216540f, +0.039997f, -0.001031f, -0.000186f}, + {+0.100824f, +0.372627f, +0.007492f, -0.000845f, +0.000020f}, + {+0.086728f, +0.200706f, +0.013419f, -0.000947f, +0.000014f}, + {+0.067471f, +0.194793f, +0.010208f, -0.001216f, +0.000058f}, + {+0.018637f, +0.214052f, -0.004837f, -0.000884f, +0.000020f}, + {+0.025584f, -0.127835f, -0.000911f, +0.001401f, -0.000028f}, + {+0.056339f, +0.027855f, +0.010673f, -0.000579f, -0.000019f}, + {-0.060859f, -0.070229f, -0.011217f, +0.002123f, -0.000013f}, + {-0.014798f, +0.052375f, +0.000623f, -0.002191f, -0.000241f}, + {+0.034285f, +0.039743f, +0.005351f, -0.000109f, +0.000050f}, + {+0.007201f, -0.159482f, +0.003886f, -0.001201f, -0.000130f}, + {-0.020187f, -0.092383f, +0.000382f, +0.000354f, +0.000030f}, + {+0.028788f, -0.109693f, +0.004153f, +0.000525f, -0.000041f}, + {+0.036625f, -0.054073f, +0.008577f, -0.000524f, -0.000003f}, + {-0.002610f, -0.084126f, +0.000986f, -0.000174f, -0.000035f} + }, + { + {-0.167535f, -0.399812f, -0.020854f, +0.000806f, -0.000074f}, + {-0.145635f, -0.430918f, -0.013134f, +0.001141f, -0.000134f}, + {-0.184602f, -0.052096f, -0.013909f, -0.000043f, +0.000053f}, + {-0.110131f, -0.103022f, -0.011251f, -0.000423f, +0.000031f}, + {-0.114138f, -0.085208f, -0.011213f, -0.000798f, +0.000055f}, + {-0.095938f, +0.054666f, -0.000697f, -0.000059f, +0.000033f}, + {-0.000204f, -0.169483f, -0.009146f, +0.000575f, -0.000003f}, + {-0.030090f, -0.112432f, -0.004382f, -0.000216f, +0.000011f}, + {+0.053018f, +0.105332f, -0.004066f, +0.000908f, +0.000060f}, + {-0.009119f, +0.057095f, +0.007675f, +0.000456f, -0.000052f}, + {-0.027961f, -0.057568f, -0.003773f, -0.000262f, -0.000002f}, + {+0.030433f, -0.136477f, +0.002756f, +0.000256f, -0.000046f}, + {+0.049955f, +0.009293f, +0.002856f, -0.000133f, -0.000047f}, + {+0.028171f, -0.112646f, +0.000816f, +0.000380f, -0.000028f}, + {+0.014607f, -0.096614f, -0.000430f, -0.000147f, +0.000031f}, + {+0.051182f, -0.003494f, +0.006796f, +0.000143f, +0.000008f} + }, + { + {-0.208650f, -0.335847f, -0.029770f, +0.000608f, +0.000111f}, + {-0.234234f, -0.291735f, -0.035875f, +0.001265f, +0.000192f}, + {+0.043525f, -0.386017f, -0.001141f, +0.000753f, -0.000019f}, + {-0.024332f, -0.238532f, -0.004594f, +0.000982f, -0.000011f}, + {-0.003204f, -0.260777f, -0.001135f, +0.001218f, -0.000051f}, + {+0.094495f, -0.222636f, +0.006686f, +0.000805f, -0.000016f}, + {-0.041620f, -0.113126f, +0.003804f, -0.001425f, +0.000014f}, + {-0.059468f, -0.070637f, -0.008480f, +0.000599f, +0.000018f}, + {+0.037218f, +0.133212f, +0.009087f, -0.002277f, -0.000009f}, + {+0.028004f, -0.004399f, +0.001485f, +0.002043f, +0.000214f}, + {-0.030214f, -0.052517f, -0.005355f, +0.000063f, -0.000045f}, + {-0.064016f, -0.008538f, -0.001790f, +0.001210f, +0.000117f}, + {-0.035765f, +0.136937f, -0.003958f, -0.000288f, -0.000023f}, + {-0.055646f, +0.013868f, -0.004689f, -0.000551f, +0.000038f}, + {-0.069712f, +0.026129f, -0.007603f, +0.000472f, -0.000000f}, + {-0.022298f, +0.108549f, -0.003048f, +0.000134f, +0.000029f} + }, + { + {+0.220027f, +0.326004f, +0.029195f, -0.000639f, +0.000050f}, + {+0.196112f, +0.377527f, +0.024063f, -0.000894f, +0.000082f}, + {+0.120792f, -0.254914f, +0.016146f, +0.000093f, -0.000054f}, + {+0.094942f, -0.058645f, +0.007709f, +0.000309f, -0.000035f}, + {+0.109837f, -0.090094f, +0.008580f, +0.000595f, -0.000051f}, + {+0.015004f, -0.336419f, -0.000747f, +0.000099f, -0.000037f}, + {+0.088851f, +0.073948f, +0.011663f, -0.000480f, +0.000014f}, + {+0.078671f, +0.147609f, +0.010996f, +0.000157f, -0.000013f}, + {-0.073075f, -0.041998f, -0.000840f, -0.000593f, -0.000038f}, + {-0.021795f, -0.078114f, -0.010687f, -0.000406f, +0.000022f}, + {+0.048839f, +0.075397f, +0.009105f, +0.000275f, +0.000010f}, + {+0.060558f, +0.174519f, +0.000133f, -0.000349f, +0.000030f}, + {-0.014867f, +0.171348f, +0.000948f, +0.000119f, +0.000048f}, + {+0.011606f, +0.111954f, +0.001552f, -0.000324f, +0.000023f}, + {+0.032653f, +0.181837f, +0.003210f, +0.000081f, -0.000029f}, + {-0.047749f, +0.068914f, -0.006585f, -0.000128f, -0.000011f} + }, + { + {+0.160319f, +0.417913f, +0.022833f, -0.000655f, -0.000102f}, + {+0.203183f, +0.369192f, +0.029570f, -0.001470f, -0.000179f}, + {-0.099428f, +0.084211f, -0.009701f, -0.000901f, +0.000019f}, + {-0.024797f, +0.121541f, +0.001449f, -0.000997f, +0.000010f}, + {-0.062623f, +0.173224f, -0.004907f, -0.001276f, +0.000047f}, + {-0.122967f, -0.126986f, -0.011441f, -0.000914f, +0.000015f}, + {-0.052738f, +0.283556f, -0.009426f, +0.001548f, -0.000011f}, + {+0.026749f, +0.238083f, -0.000760f, -0.000643f, -0.000018f}, + {-0.009777f, -0.145605f, -0.003329f, +0.002400f, +0.000014f}, + {-0.015861f, -0.086444f, +0.001699f, -0.001895f, -0.000191f}, + {+0.021170f, +0.125446f, -0.000128f, -0.000133f, +0.000040f}, + {+0.009541f, +0.253886f, -0.000901f, -0.000985f, -0.000105f}, + {+0.062589f, +0.060931f, +0.003167f, +0.000273f, +0.000019f}, + {+0.045937f, +0.052228f, +0.008096f, +0.000661f, -0.000035f}, + {+0.065525f, +0.132007f, +0.007909f, -0.000377f, +0.000001f}, + {+0.049219f, -0.081032f, +0.007172f, +0.000024f, -0.000024f} + }, + { + {-0.257389f, -0.225050f, -0.034043f, +0.000536f, -0.000034f}, + {-0.247632f, -0.326555f, -0.030602f, +0.000692f, -0.000048f}, + {-0.031117f, +0.179461f, -0.007189f, +0.000264f, +0.000055f}, + {-0.035804f, +0.099360f, -0.004701f, -0.000140f, +0.000038f}, + {-0.050312f, +0.188989f, -0.003722f, -0.000209f, +0.000050f}, + {+0.100154f, +0.206241f, +0.011197f, +0.000132f, +0.000040f}, + {-0.083770f, +0.242079f, -0.010883f, +0.000381f, -0.000023f}, + {-0.128871f, +0.005839f, -0.011060f, +0.000130f, +0.000016f}, + {+0.079686f, -0.004748f, +0.001794f, +0.000421f, +0.000023f}, + {+0.049708f, +0.006526f, +0.011594f, +0.000511f, -0.000001f}, + {-0.089665f, -0.042291f, -0.010250f, -0.000131f, -0.000016f}, + {-0.097341f, +0.094533f, -0.003394f, +0.000253f, -0.000020f}, + {-0.063601f, -0.124244f, -0.005358f, -0.000329f, -0.000050f}, + {-0.033103f, -0.074639f, -0.008297f, +0.000018f, -0.000018f}, + {-0.088809f, -0.106459f, -0.010306f, +0.000001f, +0.000028f}, + {+0.024983f, -0.120136f, +0.002311f, -0.000104f, +0.000013f} + }, + { + {-0.103698f, -0.459883f, -0.015029f, +0.000609f, +0.000094f}, + {-0.162130f, -0.457377f, -0.023723f, +0.001331f, +0.000162f}, + {+0.064814f, +0.022691f, +0.012901f, +0.000560f, -0.000021f}, + {+0.014719f, +0.018235f, +0.000043f, +0.000822f, -0.000013f}, + {+0.074601f, -0.003099f, +0.007367f, +0.000899f, -0.000047f}, + {+0.032786f, +0.305719f, +0.004336f, +0.000704f, -0.000017f}, + {+0.154173f, -0.111921f, +0.017036f, -0.001496f, +0.000014f}, + {+0.075072f, -0.308164f, +0.011544f, +0.000327f, +0.000019f}, + {-0.016061f, +0.143722f, +0.001013f, -0.002196f, -0.000011f}, + {-0.025959f, +0.115431f, -0.002496f, +0.001721f, +0.000173f}, + {+0.041136f, -0.248497f, +0.009339f, +0.000010f, -0.000035f}, + {+0.096543f, -0.197881f, +0.009153f, +0.000920f, +0.000096f}, + {+0.003482f, -0.225559f, +0.000330f, -0.000071f, -0.000017f}, + {-0.034753f, -0.075563f, -0.003521f, -0.000361f, +0.000033f}, + {-0.012501f, -0.228861f, +0.001789f, +0.000220f, -0.000002f}, + {-0.060118f, +0.006012f, -0.006537f, +0.000205f, +0.000020f} + }, + { + {+0.272901f, +0.120676f, +0.037748f, -0.000537f, +0.000024f}, + {+0.297115f, +0.254096f, +0.039956f, -0.000532f, +0.000029f}, + {+0.012561f, -0.060035f, +0.001952f, -0.000137f, -0.000057f}, + {-0.010704f, -0.021303f, -0.001694f, +0.000133f, -0.000041f}, + {-0.011296f, -0.129516f, -0.000519f, +0.000384f, -0.000049f}, + {-0.122480f, +0.073347f, -0.013051f, -0.000154f, -0.000043f}, + {-0.027641f, -0.385713f, +0.003287f, -0.000254f, +0.000026f}, + {+0.091871f, -0.289596f, +0.005177f, +0.000144f, -0.000020f}, + {-0.076925f, +0.038077f, -0.006550f, -0.000475f, -0.000017f}, + {-0.038364f, +0.096477f, -0.011620f, -0.000633f, -0.000016f}, + {+0.083812f, -0.194659f, +0.004197f, +0.000207f, +0.000021f}, + {+0.014333f, -0.322027f, -0.003857f, -0.000214f, +0.000012f}, + {+0.069724f, -0.130370f, +0.003481f, +0.000262f, +0.000055f}, + {+0.055755f, +0.063207f, +0.009924f, -0.000154f, +0.000014f}, + {+0.116659f, -0.036299f, +0.011120f, +0.000178f, -0.000028f}, + {+0.003252f, +0.097067f, -0.002843f, -0.000113f, -0.000015f} + }, + { + {+0.054050f, +0.455222f, +0.008683f, -0.000439f, -0.000087f}, + {+0.103203f, +0.556970f, +0.012926f, -0.001069f, -0.000150f}, + {-0.045598f, +0.034469f, -0.010843f, -0.000589f, +0.000024f}, + {+0.039968f, -0.100631f, +0.007931f, -0.000653f, +0.000016f}, + {-0.036140f, -0.084377f, -0.005388f, -0.000960f, +0.000048f}, + {+0.073377f, -0.218074f, +0.003890f, -0.000548f, +0.000019f}, + {-0.139694f, -0.217657f, -0.014427f, +0.001226f, -0.000017f}, + {-0.165152f, +0.096949f, -0.015920f, -0.000710f, -0.000018f}, + {+0.031303f, -0.142424f, +0.007473f, +0.002097f, +0.000008f}, + {+0.049659f, -0.036455f, +0.006360f, -0.001588f, -0.000158f}, + {-0.120231f, +0.105131f, -0.009262f, -0.000134f, +0.000029f}, + {-0.112765f, -0.136113f, -0.006454f, -0.000956f, -0.000090f}, + {-0.075212f, +0.079481f, -0.002605f, +0.000191f, +0.000013f}, + {+0.010244f, +0.133401f, +0.001533f, +0.000399f, -0.000031f}, + {-0.084844f, +0.273648f, -0.011540f, -0.000496f, +0.000003f}, + {+0.047604f, +0.022269f, +0.009154f, -0.000024f, -0.000017f} + }, + { + {-0.277495f, -0.057148f, -0.039168f, +0.000475f, -0.000017f}, + {-0.335782f, -0.115073f, -0.042124f, +0.000524f, -0.000017f}, + {-0.014669f, +0.088939f, +0.001371f, +0.000122f, +0.000060f}, + {+0.009872f, -0.151750f, -0.001271f, -0.000309f, +0.000043f}, + {+0.029086f, +0.017821f, +0.006048f, -0.000346f, +0.000049f}, + {+0.042390f, -0.261438f, +0.007011f, -0.000009f, +0.000045f}, + {+0.104924f, +0.146847f, +0.003710f, +0.000271f, -0.000026f}, + {+0.039062f, +0.403951f, +0.006577f, +0.000208f, +0.000025f}, + {+0.091871f, -0.050822f, +0.003447f, +0.000141f, +0.000018f}, + {+0.018408f, -0.085038f, +0.009119f, +0.000628f, +0.000033f}, + {+0.008166f, +0.290055f, -0.001289f, -0.000009f, -0.000025f}, + {+0.083446f, +0.145097f, +0.006817f, +0.000355f, -0.000005f}, + {+0.001946f, +0.186834f, -0.001987f, -0.000254f, -0.000062f}, + {-0.073121f, +0.003981f, -0.011768f, +0.000112f, -0.000011f}, + {-0.055297f, +0.324881f, -0.002032f, +0.000100f, +0.000030f}, + {-0.005812f, -0.063805f, -0.001869f, -0.000040f, +0.000017f} + }, + { + {-0.014583f, -0.461985f, -0.000589f, +0.000415f, +0.000084f}, + {-0.018754f, -0.598224f, -0.004168f, +0.000868f, +0.000145f}, + {+0.055019f, -0.010592f, +0.005290f, +0.000633f, -0.000030f}, + {-0.104242f, +0.017058f, -0.011823f, +0.000782f, -0.000020f}, + {-0.000800f, +0.063354f, -0.000572f, +0.000962f, -0.000051f}, + {-0.090619f, -0.057573f, -0.010215f, +0.000723f, -0.000024f}, + {+0.065017f, +0.191423f, +0.017537f, -0.001148f, +0.000017f}, + {+0.139685f, +0.247968f, +0.017011f, +0.000519f, +0.000015f}, + {-0.081755f, +0.219112f, -0.011774f, -0.001680f, -0.000011f}, + {-0.055793f, +0.030364f, -0.009245f, +0.001646f, +0.000143f}, + {+0.108310f, +0.127663f, +0.016687f, -0.000038f, -0.000024f}, + {+0.021618f, +0.220697f, +0.010039f, +0.000820f, +0.000085f}, + {+0.057142f, +0.095325f, +0.009328f, -0.000335f, -0.000006f}, + {+0.036537f, -0.167818f, +0.005791f, -0.000423f, +0.000028f}, + {+0.142336f, +0.030915f, +0.012827f, +0.000283f, -0.000005f}, + {-0.054469f, +0.008573f, -0.006883f, +0.000115f, +0.000013f} + }, + { + {+0.285346f, -0.000721f, +0.040577f, -0.000527f, +0.000010f}, + {+0.330415f, -0.056420f, +0.045563f, -0.000643f, +0.000004f}, + {-0.012995f, -0.109088f, -0.001469f, -0.000116f, -0.000061f}, + {+0.054559f, +0.256864f, +0.005920f, +0.000204f, -0.000044f}, + {-0.023615f, +0.028111f, -0.005911f, +0.000294f, -0.000047f}, + {+0.037741f, +0.135965f, -0.001385f, -0.000118f, -0.000047f}, + {-0.085123f, -0.059304f, -0.014815f, -0.000093f, +0.000026f}, + {-0.148478f, -0.190646f, -0.017151f, -0.000040f, -0.000030f}, + {-0.071070f, +0.234644f, +0.000090f, +0.000012f, -0.000018f}, + {-0.012169f, +0.103078f, -0.005526f, -0.000708f, -0.000048f}, + {-0.074830f, -0.156990f, -0.009538f, +0.000116f, +0.000028f}, + {-0.062857f, +0.082116f, -0.012816f, -0.000338f, -0.000001f}, + {-0.030566f, -0.039000f, -0.001188f, +0.000200f, +0.000068f}, + {+0.059034f, -0.139462f, +0.005767f, +0.000011f, +0.000009f}, + {-0.076286f, -0.295015f, -0.006131f, +0.000097f, -0.000032f}, + {+0.020240f, +0.124242f, +0.005046f, +0.000022f, -0.000019f} + }, + { + {-0.029891f, +0.483300f, -0.005377f, -0.000391f, -0.000081f}, + {-0.047047f, +0.524471f, -0.005924f, -0.000814f, -0.000145f}, + {-0.033704f, -0.078188f, -0.004373f, -0.000586f, +0.000038f}, + {+0.113469f, +0.163524f, +0.016393f, -0.000689f, +0.000025f}, + {+0.026484f, -0.050686f, +0.004980f, -0.000903f, +0.000054f}, + {+0.034959f, +0.130515f, +0.008100f, -0.000616f, +0.000030f}, + {-0.066335f, -0.098213f, -0.008880f, +0.001011f, -0.000017f}, + {-0.023755f, -0.374088f, -0.006475f, -0.000645f, -0.000010f}, + {+0.134342f, -0.080266f, +0.017137f, +0.001581f, +0.000017f}, + {+0.074905f, -0.029652f, +0.011288f, -0.001578f, -0.000126f}, + {-0.054496f, -0.184572f, -0.009789f, -0.000066f, +0.000019f}, + {+0.016479f, -0.037096f, -0.001911f, -0.000841f, -0.000081f}, + {-0.021095f, -0.045463f, -0.006941f, +0.000367f, -0.000005f}, + {-0.086237f, +0.078591f, -0.009216f, +0.000337f, -0.000026f}, + {-0.069456f, -0.298926f, -0.009331f, -0.000395f, +0.000009f}, + {+0.062149f, +0.062591f, +0.008033f, -0.000068f, -0.000009f} + }, + { + {-0.287720f, +0.086727f, -0.040473f, +0.000543f, -0.000002f}, + {-0.307994f, +0.118968f, -0.043852f, +0.000752f, +0.000013f}, + {+0.022546f, +0.002148f, +0.001070f, +0.000030f, +0.000061f}, + {-0.122549f, -0.198231f, -0.013063f, -0.000256f, +0.000044f}, + {+0.010325f, -0.076779f, +0.004480f, -0.000277f, +0.000045f}, + {-0.047884f, -0.004957f, -0.004446f, +0.000008f, +0.000047f}, + {+0.101276f, +0.163028f, +0.013822f, +0.000017f, -0.000028f}, + {+0.155414f, -0.094864f, +0.020739f, +0.000087f, +0.000033f}, + {+0.000170f, -0.277663f, -0.004084f, -0.000303f, +0.000013f}, + {-0.006631f, -0.159391f, +0.003115f, +0.000670f, +0.000060f}, + {+0.094163f, +0.047695f, +0.013081f, -0.000014f, -0.000031f}, + {+0.015662f, -0.033250f, +0.008826f, +0.000442f, +0.000008f}, + {+0.006909f, +0.002414f, +0.001228f, -0.000038f, -0.000070f}, + {+0.006389f, +0.219286f, -0.001425f, -0.000018f, -0.000007f}, + {+0.134427f, +0.013316f, +0.014160f, -0.000072f, +0.000032f}, + {-0.053148f, -0.113719f, -0.007802f, -0.000103f, +0.000020f} + }, + { + {+0.079885f, -0.476239f, +0.011873f, +0.000403f, +0.000078f}, + {+0.090327f, -0.495394f, +0.013216f, +0.000916f, +0.000142f}, + {+0.000547f, +0.029987f, +0.004365f, +0.000538f, -0.000045f}, + {-0.078456f, -0.260754f, -0.012403f, +0.000685f, -0.000030f}, + {-0.048231f, +0.015397f, -0.007225f, +0.000847f, -0.000058f}, + {+0.004788f, -0.088135f, +0.001735f, +0.000622f, -0.000036f}, + {+0.068597f, +0.218020f, +0.007943f, -0.001019f, +0.000017f}, + {-0.078771f, +0.264267f, -0.009097f, +0.000536f, +0.000005f}, + {-0.131816f, -0.067791f, -0.019315f, -0.001572f, -0.000023f}, + {-0.095197f, -0.024052f, -0.012511f, +0.001509f, +0.000110f}, + {+0.005662f, +0.184911f, +0.000567f, +0.000000f, -0.000014f}, + {+0.009469f, -0.021505f, +0.002081f, +0.000772f, +0.000077f}, + {+0.033042f, -0.040492f, +0.006178f, -0.000358f, +0.000017f}, + {+0.078726f, +0.109328f, +0.007889f, -0.000339f, +0.000024f}, + {-0.046322f, +0.287690f, -0.005571f, +0.000332f, -0.000013f}, + {-0.044568f, -0.127346f, -0.006458f, +0.000067f, +0.000005f} + }, + { + {+0.276202f, -0.173485f, +0.038792f, -0.000516f, -0.000006f}, + {+0.290883f, -0.185607f, +0.040080f, -0.000773f, -0.000032f}, + {+0.006320f, +0.034810f, -0.001793f, -0.000042f, -0.000058f}, + {+0.162615f, +0.113765f, +0.021156f, +0.000233f, -0.000044f}, + {+0.015723f, +0.117462f, +0.000807f, +0.000218f, -0.000042f}, + {+0.035133f, -0.040557f, +0.002714f, -0.000053f, -0.000045f}, + {-0.149176f, -0.117916f, -0.017638f, +0.000076f, +0.000032f}, + {-0.096551f, +0.235346f, -0.015008f, -0.000034f, -0.000033f}, + {+0.060894f, +0.224376f, +0.012831f, +0.000523f, -0.000005f}, + {+0.046438f, +0.197810f, +0.002809f, -0.000665f, -0.000069f}, + {-0.091389f, +0.035774f, -0.012879f, +0.000048f, +0.000034f}, + {-0.015830f, -0.061261f, -0.007852f, -0.000438f, -0.000014f}, + {+0.002026f, -0.092831f, -0.002527f, +0.000001f, +0.000068f}, + {-0.065981f, -0.109512f, -0.004136f, +0.000073f, +0.000006f}, + {-0.096454f, +0.210224f, -0.012022f, +0.000110f, -0.000032f}, + {+0.076635f, +0.057848f, +0.009841f, +0.000158f, -0.000021f} + }, + { + {-0.125058f, +0.440590f, -0.018260f, -0.000430f, -0.000074f}, + {-0.130636f, +0.461671f, -0.019013f, -0.001042f, -0.000135f}, + {-0.005358f, +0.049252f, -0.002302f, -0.000396f, +0.000051f}, + {+0.032652f, +0.314396f, +0.003878f, -0.000647f, +0.000035f}, + {+0.057782f, +0.056244f, +0.005456f, -0.000765f, +0.000061f}, + {-0.029537f, +0.058278f, -0.004239f, -0.000490f, +0.000041f}, + {-0.028429f, -0.304901f, -0.002344f, +0.001021f, -0.000019f}, + {+0.130605f, -0.114123f, +0.015550f, -0.000447f, -0.000002f}, + {+0.097618f, +0.163746f, +0.014826f, +0.001576f, +0.000024f}, + {+0.095269f, +0.125227f, +0.010570f, -0.001415f, -0.000094f}, + {+0.036826f, -0.161036f, +0.004519f, -0.000009f, +0.000008f}, + {-0.033206f, -0.037588f, -0.003181f, -0.000776f, -0.000072f}, + {-0.072280f, +0.019767f, -0.008230f, +0.000211f, -0.000025f}, + {-0.018897f, -0.179348f, -0.001641f, +0.000298f, -0.000022f}, + {+0.125361f, -0.129557f, +0.014806f, -0.000290f, +0.000016f}, + {+0.013372f, +0.152966f, +0.003485f, -0.000081f, -0.000000f} + }, + { + {-0.255232f, +0.238323f, -0.036506f, +0.000482f, +0.000012f}, + {-0.271075f, +0.243750f, -0.037165f, +0.000660f, +0.000051f}, + {-0.023107f, +0.018988f, -0.002567f, +0.000111f, +0.000056f}, + {-0.186496f, -0.022822f, -0.024016f, -0.000167f, +0.000044f}, + {-0.051695f, -0.108630f, -0.002988f, -0.000126f, +0.000040f}, + {-0.009503f, +0.085941f, -0.000815f, +0.000139f, +0.000044f}, + {+0.180203f, +0.018265f, +0.021900f, -0.000114f, -0.000036f}, + {+0.016842f, -0.287897f, +0.004711f, +0.000063f, +0.000033f}, + {-0.099412f, -0.136019f, -0.018932f, -0.000549f, -0.000004f}, + {-0.093434f, -0.165866f, -0.008284f, +0.000735f, +0.000077f}, + {+0.070607f, -0.107384f, +0.011250f, -0.000036f, -0.000037f}, + {+0.051205f, +0.088169f, +0.009120f, +0.000422f, +0.000021f}, + {+0.038077f, +0.190808f, +0.007278f, -0.000071f, -0.000066f}, + {+0.068484f, -0.044857f, +0.006706f, -0.000103f, -0.000005f}, + {+0.001471f, -0.319381f, +0.000965f, -0.000110f, +0.000032f}, + {-0.082910f, +0.001623f, -0.012705f, -0.000176f, +0.000021f} + }, + { + {+0.160937f, -0.399834f, +0.024221f, +0.000432f, +0.000069f}, + {+0.165837f, -0.426649f, +0.024449f, +0.001120f, +0.000123f}, + {+0.023251f, -0.053963f, +0.006296f, +0.000280f, -0.000056f}, + {+0.026012f, -0.349222f, +0.003958f, +0.000583f, -0.000040f}, + {-0.039815f, -0.122590f, -0.005933f, +0.000681f, -0.000065f}, + {+0.034180f, +0.017407f, +0.005868f, +0.000354f, -0.000044f}, + {-0.036119f, +0.354110f, -0.007651f, -0.001004f, +0.000024f}, + {-0.131608f, -0.060108f, -0.015438f, +0.000373f, +0.000002f}, + {-0.047240f, -0.215086f, -0.007922f, -0.001603f, -0.000021f}, + {-0.065165f, -0.208130f, -0.007649f, +0.001302f, +0.000078f}, + {-0.065730f, +0.103768f, -0.008899f, -0.000008f, -0.000000f}, + {+0.017223f, +0.140007f, +0.001227f, +0.000774f, +0.000066f}, + {+0.083700f, +0.123118f, +0.007692f, -0.000085f, +0.000029f}, + {-0.033766f, +0.111436f, -0.004405f, -0.000238f, +0.000019f}, + {-0.130713f, -0.118837f, -0.014005f, +0.000285f, -0.000018f}, + {+0.016465f, -0.154956f, +0.002867f, +0.000097f, -0.000004f} + }, + { + {+0.233948f, -0.286085f, +0.033289f, -0.000467f, -0.000018f}, + {+0.251749f, -0.291487f, +0.034882f, -0.000530f, -0.000064f}, + {+0.025018f, -0.051984f, +0.002062f, -0.000213f, -0.000058f}, + {+0.182278f, -0.109310f, +0.023310f, +0.000129f, -0.000046f}, + {+0.065186f, +0.041803f, +0.007285f, +0.000055f, -0.000040f}, + {-0.015347f, -0.057135f, -0.002287f, -0.000244f, -0.000046f}, + {-0.178612f, +0.136904f, -0.019882f, +0.000114f, +0.000039f}, + {+0.053858f, +0.222770f, +0.004143f, -0.000170f, -0.000036f}, + {+0.110687f, +0.021864f, +0.019313f, +0.000540f, +0.000009f}, + {+0.120059f, +0.080527f, +0.013286f, -0.000793f, -0.000086f}, + {-0.042102f, +0.139525f, -0.007143f, -0.000010f, +0.000040f}, + {-0.075712f, +0.002196f, -0.010631f, -0.000380f, -0.000025f}, + {-0.101650f, -0.158974f, -0.013076f, +0.000245f, +0.000069f}, + {-0.030059f, +0.115541f, -0.003547f, +0.000111f, +0.000004f}, + {+0.094721f, +0.222768f, +0.008889f, +0.000048f, -0.000033f}, + {+0.083573f, -0.053860f, +0.010877f, +0.000192f, -0.000022f} + }, + { + {-0.194975f, +0.371746f, -0.029687f, -0.000407f, -0.000065f}, + {-0.199395f, +0.402227f, -0.030381f, -0.001070f, -0.000111f}, + {-0.043558f, +0.051835f, -0.007510f, -0.000301f, +0.000063f}, + {-0.080069f, +0.290708f, -0.009721f, -0.000585f, +0.000048f}, + {+0.028118f, +0.096712f, +0.004235f, -0.000661f, +0.000071f}, + {-0.020670f, -0.048284f, -0.004447f, -0.000361f, +0.000049f}, + {+0.106751f, -0.298076f, +0.013906f, +0.000980f, -0.000031f}, + {+0.091450f, +0.162172f, +0.012475f, -0.000348f, -0.000002f}, + {-0.007498f, +0.199756f, +0.002586f, +0.001500f, +0.000016f}, + {+0.027250f, +0.222848f, +0.002393f, -0.001277f, -0.000059f}, + {+0.083457f, -0.055583f, +0.011895f, +0.000049f, -0.000010f}, + {+0.023912f, -0.145973f, +0.001523f, -0.000736f, -0.000060f}, + {-0.039347f, -0.252351f, -0.003368f, +0.000088f, -0.000034f}, + {+0.047081f, -0.002879f, +0.005773f, +0.000201f, -0.000016f}, + {+0.061353f, +0.270295f, +0.008425f, -0.000276f, +0.000021f}, + {-0.056743f, +0.162677f, -0.007387f, -0.000128f, +0.000010f} + }, + { + {-0.209644f, +0.348707f, -0.029121f, +0.000472f, +0.000023f}, + {-0.234739f, +0.346303f, -0.031613f, +0.000452f, +0.000075f}, + {-0.012221f, +0.097631f, -0.001448f, +0.000286f, +0.000064f}, + {-0.151155f, +0.176475f, -0.021969f, -0.000127f, +0.000048f}, + {-0.074908f, -0.067483f, -0.011111f, -0.000037f, +0.000040f}, + {+0.024868f, +0.020084f, +0.003583f, +0.000348f, +0.000052f}, + {+0.132213f, -0.252477f, +0.017287f, -0.000139f, -0.000041f}, + {-0.086895f, -0.114633f, -0.010835f, +0.000242f, +0.000044f}, + {-0.087061f, +0.080457f, -0.017193f, -0.000553f, -0.000009f}, + {-0.128529f, -0.021349f, -0.015609f, +0.000805f, +0.000095f}, + {+0.009730f, -0.170684f, +0.001530f, +0.000070f, -0.000041f}, + {+0.063989f, -0.082569f, +0.011861f, +0.000327f, +0.000027f}, + {+0.131743f, +0.010936f, +0.017709f, -0.000376f, -0.000079f}, + {-0.009127f, -0.086499f, -0.000601f, -0.000142f, -0.000005f}, + {-0.128048f, -0.022758f, -0.015753f, -0.000038f, +0.000035f}, + {-0.059404f, +0.160944f, -0.006871f, -0.000228f, +0.000022f} + }, + { + {+0.229440f, -0.322824f, +0.033988f, +0.000389f, +0.000061f}, + {+0.240846f, -0.383749f, +0.036120f, +0.000976f, +0.000103f}, + {+0.056585f, -0.008789f, +0.009971f, +0.000419f, -0.000080f}, + {+0.105118f, -0.219752f, +0.015610f, +0.000635f, -0.000061f}, + {-0.026805f, -0.145169f, -0.000897f, +0.000699f, -0.000083f}, + {+0.004898f, +0.050127f, +0.002984f, +0.000479f, -0.000062f}, + {-0.141946f, +0.172154f, -0.021221f, -0.000916f, +0.000039f}, + {-0.048244f, -0.174628f, -0.006354f, +0.000456f, -0.000003f}, + {+0.037664f, -0.109078f, +0.001169f, -0.001297f, -0.000015f}, + {+0.006723f, -0.230147f, +0.003197f, +0.001300f, +0.000034f}, + {-0.095384f, -0.009012f, -0.012879f, -0.000031f, +0.000023f}, + {-0.048765f, +0.092236f, -0.006693f, +0.000674f, +0.000056f}, + {-0.024712f, +0.249773f, -0.004585f, -0.000253f, +0.000048f}, + {-0.029610f, -0.053064f, -0.004978f, -0.000209f, +0.000011f}, + {+0.020111f, -0.251548f, +0.002558f, +0.000313f, -0.000027f}, + {+0.088864f, -0.064651f, +0.009687f, +0.000147f, -0.000018f} + }, + { + {+0.175493f, -0.403144f, +0.024964f, -0.000494f, -0.000029f}, + {+0.208289f, -0.431823f, +0.027399f, -0.000496f, -0.000086f}, + {-0.008906f, -0.108845f, -0.001685f, -0.000188f, -0.000067f}, + {+0.127825f, -0.183453f, +0.018081f, +0.000198f, -0.000048f}, + {+0.107325f, +0.060873f, +0.013159f, +0.000090f, -0.000038f}, + {-0.020607f, +0.012217f, -0.003265f, -0.000308f, -0.000058f}, + {-0.079060f, +0.266458f, -0.009775f, +0.000157f, +0.000041f}, + {+0.096681f, +0.050055f, +0.012663f, -0.000225f, -0.000055f}, + {+0.051411f, -0.089715f, +0.013539f, +0.000663f, +0.000008f}, + {+0.129678f, -0.037696f, +0.015815f, -0.000703f, -0.000099f}, + {+0.037248f, +0.197082f, +0.005086f, -0.000193f, +0.000037f}, + {-0.043816f, +0.101985f, -0.008254f, -0.000336f, -0.000028f}, + {-0.117065f, +0.106956f, -0.016478f, +0.000283f, +0.000091f}, + {+0.024549f, +0.029471f, +0.003315f, +0.000242f, +0.000008f}, + {+0.102968f, -0.125147f, +0.012245f, +0.000115f, -0.000038f}, + {+0.007500f, -0.187296f, +0.002430f, +0.000314f, -0.000019f} + }, + { + {-0.255049f, +0.256577f, -0.038217f, -0.000401f, -0.000056f}, + {-0.286340f, +0.326727f, -0.042071f, -0.000948f, -0.000098f}, + {-0.058758f, -0.032715f, -0.010103f, -0.000506f, +0.000109f}, + {-0.123738f, +0.204736f, -0.019030f, -0.000624f, +0.000081f}, + {-0.004658f, +0.232611f, -0.002627f, -0.000673f, +0.000101f}, + {+0.001246f, -0.020482f, -0.002726f, -0.000581f, +0.000087f}, + {+0.149860f, -0.087638f, +0.023219f, +0.000836f, -0.000049f}, + {+0.011705f, +0.182241f, +0.000824f, -0.000663f, +0.000015f}, + {-0.036322f, +0.046246f, -0.002434f, +0.001110f, +0.000020f}, + {-0.041445f, +0.225060f, -0.008066f, -0.001247f, -0.000002f}, + {+0.082241f, +0.130716f, +0.009581f, -0.000052f, -0.000037f}, + {+0.061982f, -0.060921f, +0.008434f, -0.000587f, -0.000055f}, + {+0.070313f, -0.179626f, +0.010580f, +0.000496f, -0.000079f}, + {+0.010271f, +0.049933f, +0.003107f, +0.000216f, -0.000007f}, + {-0.072320f, +0.142479f, -0.007956f, -0.000403f, +0.000037f}, + {-0.080097f, -0.050215f, -0.010237f, -0.000128f, +0.000027f} + }, + { + {-0.138659f, +0.433413f, -0.019489f, +0.000507f, +0.000036f}, + {-0.163451f, +0.512532f, -0.021259f, +0.000613f, +0.000105f}, + {+0.031656f, +0.104824f, +0.003994f, -0.000128f, +0.000059f}, + {-0.110770f, +0.224024f, -0.015294f, -0.000397f, +0.000039f}, + {-0.125629f, +0.045496f, -0.015544f, -0.000259f, +0.000027f}, + {+0.013056f, -0.002303f, +0.002874f, +0.000034f, +0.000053f}, + {+0.034706f, -0.263278f, +0.003483f, -0.000141f, -0.000039f}, + {-0.095465f, +0.017678f, -0.011595f, +0.000132f, +0.000064f}, + {-0.033817f, +0.054176f, -0.010428f, -0.000890f, -0.000012f}, + {-0.119869f, +0.100206f, -0.015399f, +0.000474f, +0.000091f}, + {-0.083578f, -0.121580f, -0.008601f, +0.000327f, -0.000026f}, + {+0.021962f, -0.124782f, +0.004983f, +0.000417f, +0.000031f}, + {+0.081591f, -0.160439f, +0.012843f, +0.000024f, -0.000092f}, + {-0.025765f, -0.006872f, -0.004893f, -0.000318f, -0.000015f}, + {-0.048404f, +0.176242f, -0.007439f, -0.000200f, +0.000038f}, + {+0.029349f, +0.118206f, +0.002646f, -0.000434f, +0.000011f} + }, + { + {+0.273332f, -0.197278f, +0.041000f, +0.000427f, +0.000049f}, + {+0.321458f, -0.231555f, +0.047137f, +0.001083f, +0.000091f}, + {+0.051312f, +0.073576f, +0.009852f, +0.000350f, -0.000146f}, + {+0.149316f, -0.177043f, +0.022631f, +0.000468f, -0.000104f}, + {+0.053207f, -0.228176f, +0.008455f, +0.000505f, -0.000122f}, + {+0.006068f, +0.008715f, +0.003223f, +0.000482f, -0.000122f}, + {-0.145901f, +0.015682f, -0.022924f, -0.000759f, +0.000061f}, + {+0.021739f, -0.160951f, +0.002760f, +0.000739f, -0.000036f}, + {+0.029254f, -0.044035f, +0.001822f, -0.001067f, -0.000028f}, + {+0.071428f, -0.194582f, +0.013164f, +0.000987f, -0.000034f}, + {-0.035270f, -0.192622f, -0.005952f, +0.000220f, +0.000050f}, + {-0.068773f, +0.014813f, -0.009109f, +0.000533f, +0.000056f}, + {-0.089870f, +0.103512f, -0.014502f, -0.000459f, +0.000122f}, + {+0.001775f, -0.051927f, +0.000206f, -0.000272f, +0.000005f}, + {+0.077868f, -0.020072f, +0.010512f, +0.000382f, -0.000051f}, + {+0.053027f, +0.078728f, +0.007627f, +0.000029f, -0.000036f} + }, + { + {+0.101834f, -0.458014f, +0.014426f, -0.000475f, -0.000042f}, + {+0.106819f, -0.558024f, +0.013421f, -0.000683f, -0.000132f}, + {-0.052912f, -0.088899f, -0.008225f, +0.000491f, -0.000027f}, + {+0.083094f, -0.280030f, +0.010300f, +0.000632f, -0.000016f}, + {+0.114197f, -0.131784f, +0.014954f, +0.000412f, -0.000002f}, + {-0.019246f, -0.031443f, -0.004356f, +0.000329f, -0.000027f}, + {+0.005316f, +0.248103f, +0.002960f, +0.000118f, +0.000033f}, + {+0.080531f, -0.067083f, +0.011460f, +0.000110f, -0.000064f}, + {+0.031144f, -0.046782f, +0.008670f, +0.001209f, +0.000024f}, + {+0.102756f, -0.143879f, +0.013003f, -0.000283f, -0.000065f}, + {+0.095015f, +0.011155f, +0.012207f, -0.000367f, +0.000008f}, + {+0.004913f, +0.131661f, -0.000343f, -0.000524f, -0.000039f}, + {-0.046459f, +0.170846f, -0.007777f, -0.000479f, +0.000069f}, + {+0.027234f, -0.016428f, +0.003165f, +0.000304f, +0.000026f}, + {+0.005481f, -0.131071f, +0.001565f, +0.000318f, -0.000030f}, + {-0.043474f, -0.073298f, -0.006440f, +0.000550f, +0.000003f} + }, + { + {-0.286640f, +0.137246f, -0.043420f, -0.000432f, -0.000040f}, + {-0.340199f, +0.128020f, -0.049926f, -0.001339f, -0.000072f}, + {-0.035997f, -0.119831f, -0.005662f, +0.000296f, +0.000179f}, + {-0.172429f, +0.110349f, -0.024201f, -0.000100f, +0.000122f}, + {-0.092373f, +0.185204f, -0.014035f, -0.000067f, +0.000138f}, + {-0.010912f, -0.048983f, -0.001816f, +0.000075f, +0.000154f}, + {+0.129079f, +0.059883f, +0.019833f, +0.000637f, -0.000073f}, + {-0.041407f, +0.122204f, -0.006834f, -0.000592f, +0.000062f}, + {-0.030715f, +0.048574f, -0.001376f, +0.001126f, +0.000032f}, + {-0.096213f, +0.160581f, -0.016571f, -0.000370f, +0.000063f}, + {-0.010051f, +0.173763f, -0.000750f, -0.000501f, -0.000056f}, + {+0.062657f, +0.045986f, +0.006800f, -0.000608f, -0.000057f}, + {+0.093242f, -0.041300f, +0.014445f, -0.000123f, -0.000165f}, + {-0.019827f, +0.053398f, -0.000412f, +0.000436f, -0.000009f}, + {-0.057687f, -0.032809f, -0.008352f, -0.000201f, +0.000065f}, + {-0.029198f, -0.096300f, -0.002960f, +0.000112f, +0.000041f} + }, + { + {-0.065817f, +0.474129f, -0.008963f, +0.000406f, +0.000046f}, + {-0.048357f, +0.572445f, -0.005311f, +0.000514f, +0.000163f}, + {+0.075398f, +0.048030f, +0.008271f, -0.000640f, -0.000031f}, + {-0.038405f, +0.313945f, -0.005856f, -0.000669f, -0.000022f}, + {-0.086028f, +0.192206f, -0.012072f, -0.000418f, -0.000038f}, + {+0.040227f, +0.025362f, +0.003912f, -0.000532f, -0.000024f}, + {-0.038209f, -0.193928f, -0.006045f, -0.000139f, -0.000021f}, + {-0.067018f, +0.081277f, -0.009330f, -0.000374f, +0.000051f}, + {-0.028904f, +0.056950f, -0.007486f, -0.001345f, -0.000045f}, + {-0.078983f, +0.183476f, -0.010913f, +0.000304f, +0.000020f}, + {-0.083563f, +0.058421f, -0.010558f, +0.000255f, +0.000015f}, + {-0.030882f, -0.097232f, -0.001515f, +0.000622f, +0.000053f}, + {+0.015685f, -0.158569f, +0.005189f, +0.000820f, -0.000018f}, + {-0.013899f, +0.061952f, -0.002806f, -0.000268f, -0.000038f}, + {+0.012586f, +0.075138f, +0.001144f, -0.000413f, +0.000015f}, + {+0.050911f, +0.027618f, +0.006661f, -0.000507f, -0.000023f} + }, + { + {+0.298262f, -0.083362f, +0.045235f, +0.000350f, +0.000028f}, + {+0.345899f, -0.033997f, +0.051595f, +0.001615f, +0.000035f}, + {-0.000119f, +0.165002f, +0.002953f, -0.001311f, -0.000187f}, + {+0.171388f, -0.008423f, +0.025114f, -0.000464f, -0.000125f}, + {+0.115274f, -0.117327f, +0.017963f, -0.000487f, -0.000138f}, + {-0.008614f, +0.100535f, +0.001469f, -0.001024f, -0.000165f}, + {-0.096130f, -0.104542f, -0.016843f, -0.000419f, +0.000082f}, + {+0.057723f, -0.112429f, +0.010191f, +0.000184f, -0.000084f}, + {+0.036341f, -0.043085f, +0.001450f, -0.001349f, -0.000025f}, + {+0.112953f, -0.110523f, +0.019836f, -0.000405f, -0.000071f}, + {+0.043415f, -0.138944f, +0.005951f, +0.000778f, +0.000051f}, + {-0.038181f, -0.085067f, -0.005138f, +0.000773f, +0.000051f}, + {-0.082623f, -0.007927f, -0.014925f, +0.001161f, +0.000188f}, + {+0.027034f, -0.000974f, +0.001645f, -0.000490f, +0.000020f}, + {+0.035360f, +0.038752f, +0.006345f, -0.000067f, -0.000073f}, + {+0.000083f, +0.105539f, -0.000772f, -0.000317f, -0.000036f} + }, + { + {+0.027126f, -0.497380f, +0.003317f, -0.000351f, -0.000045f}, + {-0.007859f, -0.574645f, -0.003243f, -0.000139f, -0.000188f}, + {-0.075777f, +0.049221f, -0.008353f, -0.000117f, +0.000106f}, + {-0.000094f, -0.270760f, +0.000675f, +0.000190f, +0.000068f}, + {+0.052764f, -0.211602f, +0.007618f, -0.000144f, +0.000084f}, + {-0.046479f, +0.043520f, -0.004619f, -0.000085f, +0.000093f}, + {+0.048000f, +0.115677f, +0.008039f, +0.000243f, +0.000005f}, + {+0.053119f, -0.119462f, +0.006689f, +0.000259f, -0.000024f}, + {+0.023530f, -0.067795f, +0.006354f, +0.001215f, +0.000069f}, + {+0.051960f, -0.201931f, +0.007334f, -0.001040f, +0.000035f}, + {+0.061094f, -0.110021f, +0.007462f, +0.000103f, -0.000039f}, + {+0.036876f, +0.032412f, +0.003266f, -0.000534f, -0.000070f}, + {+0.001902f, +0.122288f, -0.002472f, -0.000241f, -0.000056f}, + {-0.004270f, -0.048829f, +0.000734f, +0.000014f, +0.000048f}, + {-0.012745f, -0.036706f, -0.002273f, +0.000205f, +0.000006f}, + {-0.042314f, +0.038832f, -0.005804f, +0.000347f, +0.000043f} + }, + { + {-0.307088f, +0.013827f, -0.046648f, -0.000063f, -0.000017f}, + {-0.343985f, -0.057778f, -0.051999f, -0.001370f, +0.000021f}, + {+0.039378f, -0.130507f, -0.000123f, +0.002505f, +0.000156f}, + {-0.152973f, -0.035960f, -0.024197f, +0.000907f, +0.000105f}, + {-0.122328f, +0.057169f, -0.020503f, +0.000916f, +0.000113f}, + {+0.036115f, -0.084847f, -0.000437f, +0.002283f, +0.000139f}, + {+0.065884f, +0.089825f, +0.012704f, +0.000253f, -0.000086f}, + {-0.076176f, +0.079461f, -0.013926f, +0.000844f, +0.000095f}, + {-0.041886f, +0.032735f, -0.001798f, +0.001521f, +0.000002f}, + {-0.120605f, +0.060574f, -0.022209f, +0.000951f, +0.000049f}, + {-0.065666f, +0.088077f, -0.009755f, -0.000580f, -0.000035f}, + {+0.014536f, +0.066997f, +0.002290f, -0.001040f, -0.000035f}, + {+0.069578f, +0.020859f, +0.015775f, -0.002732f, -0.000173f}, + {-0.018357f, -0.025356f, -0.001559f, +0.000309f, -0.000039f}, + {-0.021973f, -0.023763f, -0.004557f, +0.000507f, +0.000072f}, + {+0.024594f, -0.064613f, +0.005019f, +0.000113f, +0.000019f} + }, + { + {+0.017452f, +0.509103f, +0.002330f, +0.000354f, +0.000040f}, + {+0.065401f, +0.568079f, +0.010528f, -0.000542f, +0.000194f}, + {+0.050175f, -0.114107f, +0.005162f, +0.003266f, -0.000174f}, + {+0.018374f, +0.227727f, +0.003630f, +0.001902f, -0.000110f}, + {-0.023543f, +0.209166f, -0.002096f, +0.002246f, -0.000125f}, + {+0.031298f, -0.092434f, +0.002541f, +0.002737f, -0.000158f}, + {-0.039294f, -0.069055f, -0.007101f, -0.000802f, +0.000015f}, + {-0.027981f, +0.151965f, -0.004965f, +0.000568f, -0.000008f}, + {-0.016092f, +0.076462f, -0.004970f, -0.000449f, -0.000085f}, + {-0.025683f, +0.205232f, -0.002533f, +0.003878f, -0.000082f}, + {-0.031489f, +0.139294f, -0.004565f, -0.001598f, +0.000056f}, + {-0.026207f, +0.002872f, -0.002107f, +0.000154f, +0.000084f}, + {-0.008497f, -0.098826f, +0.002487f, -0.002569f, +0.000130f}, + {+0.010858f, +0.022687f, +0.002492f, +0.000762f, -0.000051f}, + {+0.007112f, +0.019771f, +0.000809f, +0.000752f, -0.000028f}, + {+0.017429f, -0.074807f, +0.003855f, +0.000473f, -0.000058f} + } +}; + +const float leftHRIRImag_HOA3[BINAURAL_CONVBANDS][16][BINAURAL_NTAPS]= +{ + { + {-0.132965f, +0.086484f, +0.111577f, -0.006297f, -0.000146f}, + {-0.159214f, +0.438495f, -0.131837f, -0.004567f, -0.000134f}, + {-0.006365f, -0.027154f, +0.040068f, -0.008136f, +0.000115f}, + {-0.012177f, +0.011068f, +0.006759f, -0.003623f, +0.000106f}, + {-0.003524f, +0.002365f, -0.008243f, +0.002720f, +0.000173f}, + {+0.001684f, -0.006593f, -0.024280f, +0.012226f, +0.000133f}, + {+0.003794f, -0.002370f, +0.013706f, -0.004985f, -0.000191f}, + {+0.009569f, -0.049227f, +0.045250f, -0.003942f, -0.000006f}, + {-0.015413f, +0.062027f, -0.005814f, -0.010696f, -0.000183f}, + {-0.012650f, +0.030376f, +0.022293f, -0.005058f, -0.000424f}, + {+0.003808f, -0.011707f, -0.008010f, +0.002270f, +0.000068f}, + {-0.003343f, +0.012704f, +0.014571f, -0.003409f, -0.000255f}, + {+0.000428f, +0.007434f, +0.003549f, -0.001445f, +0.000011f}, + {-0.006298f, +0.029469f, -0.007911f, +0.000838f, -0.000089f}, + {-0.003358f, +0.002973f, +0.012948f, -0.001507f, +0.000003f}, + {-0.000168f, +0.002647f, +0.005935f, -0.001295f, -0.000063f} + }, + { + {+0.075202f, +0.228858f, +0.021577f, -0.002573f, -0.000120f}, + {+0.061927f, +0.923113f, -0.018254f, -0.003553f, -0.000135f}, + {+0.002952f, -0.050194f, +0.020301f, -0.000013f, +0.000082f}, + {+0.008722f, +0.019708f, -0.013956f, +0.001282f, +0.000072f}, + {+0.001425f, +0.021365f, -0.019206f, -0.005433f, +0.000123f}, + {-0.004675f, -0.040742f, -0.087083f, -0.008021f, +0.000087f}, + {-0.001220f, -0.034662f, +0.025115f, +0.004561f, -0.000118f}, + {-0.004799f, -0.049232f, +0.074542f, +0.003362f, -0.000003f}, + {+0.011236f, +0.040604f, -0.010517f, +0.002046f, -0.000098f}, + {+0.006435f, +0.139253f, +0.070542f, -0.004148f, -0.000297f}, + {-0.001842f, -0.052892f, -0.056325f, -0.005942f, +0.000046f}, + {+0.004364f, +0.052115f, +0.019067f, -0.000398f, -0.000179f}, + {+0.003644f, +0.037489f, +0.030067f, +0.000286f, +0.000000f}, + {+0.000279f, +0.074681f, +0.035692f, +0.005433f, -0.000065f}, + {+0.001702f, +0.024063f, +0.022013f, +0.000449f, +0.000009f}, + {+0.001629f, +0.004730f, -0.001402f, -0.003756f, -0.000041f} + }, + { + {-0.022776f, +0.213361f, +0.033702f, +0.017530f, +0.000169f}, + {+0.017318f, +0.757708f, +0.032772f, +0.023486f, +0.000150f}, + {-0.000995f, +0.005778f, -0.039399f, +0.003826f, -0.000133f}, + {-0.001086f, +0.066855f, -0.049052f, -0.001880f, -0.000124f}, + {+0.003861f, +0.074613f, -0.059871f, +0.001275f, -0.000202f}, + {+0.004218f, -0.001879f, -0.134238f, -0.000831f, -0.000156f}, + {-0.007011f, -0.156373f, +0.120347f, +0.000348f, +0.000228f}, + {+0.001557f, +0.050757f, -0.023560f, -0.002558f, +0.000008f}, + {-0.014029f, -0.230152f, +0.192472f, +0.009207f, +0.000223f}, + {+0.003304f, +0.293531f, -0.162769f, +0.029563f, +0.000502f}, + {-0.000187f, -0.025533f, -0.089914f, +0.003071f, -0.000081f}, + {-0.001118f, +0.199397f, -0.178948f, +0.009074f, +0.000301f}, + {-0.002128f, +0.041497f, +0.024472f, -0.001412f, -0.000017f}, + {+0.001502f, +0.027123f, +0.081159f, -0.005992f, +0.000104f}, + {+0.000493f, +0.080670f, -0.051505f, -0.003323f, -0.000001f}, + {-0.001770f, +0.022371f, -0.053147f, +0.009257f, +0.000076f} + }, + { + {+0.009638f, -0.020599f, -0.278274f, -0.025390f, +0.000089f}, + {-0.019638f, +0.173586f, -0.454125f, -0.045073f, +0.000138f}, + {+0.001861f, +0.029237f, -0.038358f, -0.002128f, -0.000043f}, + {-0.006025f, +0.060820f, -0.033037f, +0.001020f, -0.000030f}, + {-0.010927f, +0.114232f, +0.022410f, +0.002610f, -0.000063f}, + {-0.001151f, +0.065308f, -0.047475f, +0.003953f, -0.000033f}, + {+0.017565f, -0.230160f, -0.003612f, +0.002199f, +0.000030f}, + {-0.002909f, +0.050062f, -0.035205f, +0.001706f, -0.000001f}, + {+0.028618f, -0.411400f, -0.073259f, -0.001960f, -0.000006f}, + {-0.012397f, +0.141388f, -0.368076f, -0.043941f, +0.000144f}, + {+0.000613f, +0.027917f, -0.038807f, +0.005057f, -0.000020f}, + {-0.005278f, +0.064856f, -0.339877f, -0.008614f, +0.000087f}, + {-0.003908f, -0.015797f, -0.023962f, +0.003729f, +0.000013f}, + {+0.002822f, -0.051424f, +0.011636f, +0.000447f, +0.000037f}, + {-0.001743f, -0.007517f, -0.130092f, +0.010670f, -0.000017f}, + {+0.001199f, -0.016221f, -0.122288f, -0.007685f, +0.000014f} + }, + { + {-0.029178f, -0.030294f, -0.242046f, +0.016235f, -0.000187f}, + {-0.008133f, -0.216891f, -0.173004f, +0.046339f, -0.000186f}, + {-0.004784f, +0.011306f, -0.001565f, +0.002974f, +0.000133f}, + {+0.001643f, -0.028149f, +0.058358f, +0.006461f, +0.000122f}, + {+0.012719f, -0.054617f, +0.162135f, +0.005430f, +0.000206f}, + {+0.004192f, -0.016864f, +0.049221f, +0.004060f, +0.000152f}, + {-0.017065f, +0.041944f, -0.209787f, -0.017496f, -0.000221f}, + {+0.005651f, -0.007117f, +0.010168f, -0.000370f, -0.000010f}, + {-0.040832f, +0.087605f, -0.438294f, -0.024557f, -0.000208f}, + {+0.015743f, -0.224869f, -0.116394f, +0.024045f, -0.000521f}, + {-0.000520f, +0.017676f, -0.001703f, -0.007076f, +0.000085f}, + {+0.005864f, -0.108940f, -0.176379f, -0.006190f, -0.000311f}, + {+0.004834f, -0.026630f, -0.021079f, -0.003057f, +0.000018f}, + {-0.003714f, -0.006337f, -0.039785f, +0.000713f, -0.000108f}, + {+0.003235f, -0.035740f, -0.081406f, -0.014616f, +0.000003f}, + {-0.000931f, -0.029194f, -0.104837f, -0.000498f, -0.000077f} + }, + { + {+0.064069f, +0.415122f, +0.053438f, -0.001987f, -0.000053f}, + {+0.009859f, +0.329919f, +0.267131f, -0.025972f, -0.000125f}, + {+0.007782f, +0.093625f, +0.062218f, -0.005519f, +0.000007f}, + {+0.006679f, +0.087174f, +0.140907f, -0.012343f, -0.000007f}, + {-0.009694f, -0.066480f, +0.161387f, -0.014778f, +0.000006f}, + {-0.011976f, -0.007185f, +0.079605f, -0.010521f, -0.000016f}, + {+0.000557f, +0.101449f, -0.157518f, +0.024682f, +0.000050f}, + {-0.008085f, -0.037335f, +0.019864f, -0.001614f, +0.000006f}, + {+0.030203f, +0.393848f, -0.238529f, +0.036570f, +0.000098f}, + {-0.011087f, -0.102790f, +0.079859f, -0.000351f, +0.000008f}, + {+0.001584f, +0.009914f, +0.007779f, +0.002067f, -0.000006f}, + {+0.003353f, -0.001777f, +0.008005f, +0.013355f, +0.000003f}, + {-0.003172f, -0.008210f, +0.010652f, +0.000223f, -0.000027f}, + {-0.001325f, -0.010307f, -0.051607f, +0.003067f, -0.000008f}, + {-0.010253f, -0.010690f, +0.002393f, +0.009426f, +0.000023f}, + {-0.002525f, +0.029747f, -0.022901f, +0.004832f, +0.000012f} + }, + { + {-0.046682f, +0.646468f, +0.038502f, -0.000394f, +0.000197f}, + {+0.044970f, +0.559290f, +0.057727f, +0.008886f, +0.000233f}, + {+0.000940f, +0.137203f, +0.026727f, +0.004536f, -0.000119f}, + {+0.021842f, +0.212599f, -0.004934f, +0.008826f, -0.000104f}, + {+0.023556f, +0.052508f, -0.021029f, +0.010719f, -0.000188f}, + {+0.008092f, -0.004951f, +0.027003f, +0.006766f, -0.000127f}, + {+0.010424f, -0.025150f, +0.006816f, -0.012676f, +0.000176f}, + {+0.012013f, -0.064462f, +0.013618f, +0.002713f, +0.000010f}, + {+0.003530f, +0.310311f, -0.011616f, -0.019741f, +0.000148f}, + {+0.004678f, -0.016958f, +0.018438f, +0.001910f, +0.000484f}, + {-0.001327f, +0.004928f, +0.011742f, +0.001214f, -0.000078f}, + {-0.013688f, +0.047967f, +0.031851f, -0.002524f, +0.000286f}, + {+0.008554f, -0.003502f, +0.000653f, +0.000953f, -0.000012f}, + {+0.001110f, -0.052143f, -0.004967f, -0.003628f, +0.000102f}, + {+0.024328f, -0.026559f, +0.000732f, -0.001055f, -0.000010f}, + {+0.007177f, -0.017435f, +0.026024f, -0.001281f, +0.000068f} + }, + { + {-0.091452f, +0.552905f, -0.002702f, -0.003959f, +0.000011f}, + {-0.151251f, +0.284723f, -0.015522f, -0.005073f, +0.000086f}, + {-0.028691f, +0.087255f, -0.003554f, -0.001461f, +0.000017f}, + {-0.098620f, +0.103367f, -0.000693f, -0.001510f, +0.000032f}, + {-0.064701f, +0.012013f, -0.004462f, -0.000173f, +0.000038f}, + {+0.014183f, -0.018557f, -0.019481f, -0.000708f, +0.000046f}, + {+0.006021f, -0.064708f, +0.035867f, -0.001201f, -0.000101f}, + {-0.011933f, -0.098741f, -0.004801f, -0.001237f, -0.000012f}, + {-0.036700f, +0.201775f, +0.040310f, -0.000652f, -0.000152f}, + {-0.005765f, +0.013682f, +0.000873f, -0.007110f, -0.000136f}, + {-0.003019f, -0.012643f, -0.006120f, -0.000396f, +0.000028f}, + {+0.011018f, +0.079111f, +0.001161f, -0.005334f, -0.000076f}, + {-0.015223f, -0.010103f, +0.018116f, -0.000552f, +0.000040f}, + {+0.010935f, -0.049744f, +0.004931f, +0.000250f, -0.000016f}, + {-0.032242f, -0.086323f, +0.005558f, -0.001593f, -0.000026f}, + {+0.000743f, -0.058299f, -0.001218f, -0.002067f, -0.000032f} + }, + { + {+0.231005f, +0.048404f, +0.009154f, +0.001498f, -0.000196f}, + {+0.192280f, -0.252895f, -0.010481f, +0.000333f, -0.000272f}, + {+0.043883f, -0.025510f, -0.003790f, -0.000402f, +0.000097f}, + {+0.135351f, -0.212029f, -0.009492f, -0.001960f, +0.000078f}, + {+0.084125f, -0.181115f, -0.006598f, -0.003510f, +0.000156f}, + {-0.033552f, +0.023473f, -0.003836f, -0.001049f, +0.000092f}, + {-0.027732f, +0.007669f, +0.004823f, +0.004147f, -0.000114f}, + {-0.005511f, -0.108447f, -0.007469f, -0.001175f, -0.000008f}, + {+0.049262f, +0.093379f, +0.014337f, +0.006176f, -0.000066f}, + {+0.011588f, -0.007485f, -0.021418f, -0.002195f, -0.000406f}, + {+0.004828f, -0.034802f, +0.002483f, -0.000357f, +0.000065f}, + {+0.010126f, +0.088145f, -0.024313f, -0.000561f, -0.000239f}, + {+0.009822f, -0.024986f, +0.000140f, +0.000383f, +0.000001f}, + {-0.022780f, -0.006413f, +0.006349f, +0.001513f, -0.000089f}, + {+0.014962f, -0.135165f, -0.012780f, -0.000522f, +0.000019f}, + {-0.023635f, -0.027393f, -0.008518f, +0.000542f, -0.000051f} + }, + { + {-0.129287f, -0.488427f, -0.015298f, +0.003330f, +0.000032f}, + {-0.025480f, -0.578744f, -0.004928f, +0.005728f, -0.000021f}, + {-0.001654f, -0.098586f, -0.003334f, +0.000763f, -0.000028f}, + {-0.033875f, -0.443496f, +0.008037f, +0.001296f, -0.000041f}, + {-0.018947f, -0.326335f, +0.012624f, +0.000806f, -0.000063f}, + {+0.025064f, +0.093936f, +0.002533f, +0.000591f, -0.000056f}, + {+0.010694f, +0.085378f, -0.009219f, -0.001445f, +0.000116f}, + {+0.036700f, -0.055426f, -0.001721f, +0.001199f, +0.000016f}, + {-0.043110f, -0.003684f, -0.012692f, -0.002555f, +0.000160f}, + {-0.008512f, -0.041967f, +0.005268f, +0.006560f, +0.000223f}, + {+0.005601f, -0.039303f, +0.001728f, -0.000112f, -0.000044f}, + {-0.035999f, +0.034895f, +0.002757f, +0.004270f, +0.000123f}, + {+0.002203f, -0.033200f, -0.001100f, -0.000045f, -0.000048f}, + {+0.016721f, +0.047214f, -0.004075f, -0.000550f, +0.000032f}, + {+0.021446f, -0.110159f, +0.004884f, +0.001124f, +0.000025f}, + {+0.032915f, +0.061006f, +0.000313f, +0.001075f, +0.000044f} + }, + { + {-0.165686f, -0.410109f, -0.015586f, -0.000896f, +0.000182f}, + {-0.225295f, -0.253817f, -0.010634f, -0.001216f, +0.000288f}, + {-0.066393f, -0.000376f, -0.002622f, -0.000038f, -0.000077f}, + {-0.130423f, -0.277756f, -0.010288f, +0.000606f, -0.000054f}, + {-0.089464f, -0.200814f, -0.007558f, +0.001360f, -0.000121f}, + {+0.004322f, +0.115904f, +0.010769f, +0.000324f, -0.000060f}, + {+0.034499f, +0.049740f, -0.008222f, -0.001335f, +0.000055f}, + {-0.046786f, +0.057680f, +0.004042f, +0.000640f, +0.000003f}, + {+0.024894f, -0.095189f, -0.014289f, -0.002426f, -0.000011f}, + {-0.005629f, -0.034211f, +0.013115f, +0.002185f, +0.000307f}, + {-0.019520f, -0.005119f, +0.001636f, +0.000261f, -0.000048f}, + {+0.038933f, -0.062477f, +0.011725f, +0.001017f, +0.000182f}, + {-0.005035f, -0.021514f, -0.003233f, -0.000466f, +0.000014f}, + {+0.007389f, +0.053217f, -0.000456f, -0.000398f, +0.000072f}, + {-0.037733f, -0.010531f, -0.003329f, +0.000340f, -0.000027f}, + {-0.003757f, +0.111811f, +0.004737f, -0.000075f, +0.000033f} + }, + { + {+0.245533f, +0.226873f, +0.035259f, -0.002770f, -0.000070f}, + {+0.206677f, +0.408421f, +0.026814f, -0.005082f, -0.000056f}, + {+0.053751f, +0.188303f, +0.009769f, -0.000688f, +0.000029f}, + {+0.149357f, +0.154463f, +0.013417f, -0.001098f, +0.000037f}, + {+0.105083f, +0.109018f, +0.007715f, -0.000799f, +0.000072f}, + {-0.025793f, +0.064751f, -0.005742f, -0.000924f, +0.000050f}, + {-0.041996f, -0.072003f, +0.001334f, +0.001959f, -0.000101f}, + {+0.008234f, +0.134619f, -0.001439f, -0.000932f, -0.000019f}, + {+0.007939f, -0.128639f, +0.012917f, +0.003363f, -0.000130f}, + {+0.013715f, +0.007050f, +0.000167f, -0.004932f, -0.000266f}, + {+0.012412f, +0.040469f, -0.000036f, -0.000063f, +0.000052f}, + {-0.005607f, -0.122490f, -0.001069f, -0.003166f, -0.000145f}, + {+0.002475f, -0.010103f, -0.001112f, +0.000172f, +0.000049f}, + {-0.026992f, -0.004924f, -0.001965f, +0.000301f, -0.000041f}, + {+0.008412f, +0.067378f, +0.003334f, -0.000633f, -0.000020f}, + {-0.034796f, +0.054935f, -0.005935f, -0.000590f, -0.000048f} + }, + { + {+0.049172f, +0.518027f, +0.003115f, +0.000335f, -0.000156f}, + {+0.120618f, +0.519623f, +0.008479f, +0.000432f, -0.000270f}, + {+0.062888f, +0.179664f, -0.000296f, +0.000157f, +0.000063f}, + {+0.019992f, +0.341262f, +0.002080f, -0.000355f, +0.000037f}, + {+0.012267f, +0.246756f, -0.001889f, -0.000730f, +0.000091f}, + {+0.028297f, -0.020937f, -0.002730f, -0.000026f, +0.000039f}, + {-0.008636f, -0.121054f, +0.007814f, +0.000720f, -0.000014f}, + {+0.046484f, +0.071961f, +0.002387f, -0.000455f, +0.000002f}, + {-0.042652f, -0.042219f, +0.005353f, +0.001621f, +0.000061f}, + {-0.003781f, +0.030870f, -0.013170f, -0.002144f, -0.000211f}, + {+0.016747f, +0.033277f, +0.000186f, -0.000012f, +0.000031f}, + {-0.038322f, -0.079239f, -0.009485f, -0.001067f, -0.000129f}, + {-0.009213f, +0.006178f, +0.001082f, +0.000202f, -0.000029f}, + {+0.017679f, -0.071909f, +0.003357f, +0.000147f, -0.000056f}, + {+0.031925f, +0.035422f, +0.000231f, -0.000251f, +0.000032f}, + {+0.027629f, -0.047451f, +0.003771f, -0.000092f, -0.000016f} + }, + { + {-0.277356f, +0.009713f, -0.040871f, +0.002128f, +0.000098f}, + {-0.288048f, -0.119309f, -0.040772f, +0.004167f, +0.000126f}, + {-0.135614f, -0.121199f, -0.015970f, +0.000584f, -0.000025f}, + {-0.147900f, +0.068278f, -0.021757f, +0.001011f, -0.000028f}, + {-0.111155f, +0.046512f, -0.012782f, +0.000892f, -0.000069f}, + {-0.020452f, -0.099912f, -0.003632f, +0.000896f, -0.000036f}, + {+0.051789f, -0.026841f, -0.000416f, -0.002061f, +0.000070f}, + {-0.048315f, -0.075067f, -0.004473f, +0.000718f, +0.000020f}, + {+0.038466f, +0.097321f, -0.002604f, -0.003632f, +0.000080f}, + {-0.012250f, +0.014195f, +0.001656f, +0.003568f, +0.000272f}, + {-0.029260f, -0.036443f, -0.002521f, +0.000109f, -0.000054f}, + {+0.049141f, +0.042766f, +0.002001f, +0.002307f, +0.000147f}, + {+0.016365f, +0.045379f, +0.003479f, +0.000052f, -0.000044f}, + {+0.016380f, -0.068248f, +0.002419f, -0.000284f, +0.000043f}, + {-0.026309f, -0.049393f, -0.000660f, +0.000389f, +0.000012f}, + {+0.020013f, -0.061398f, +0.001390f, +0.000285f, +0.000045f} + }, + { + {+0.056395f, -0.497410f, +0.010462f, +0.000112f, +0.000123f}, + {+0.008278f, -0.564708f, +0.007533f, +0.000534f, +0.000224f}, + {+0.029776f, -0.375504f, +0.009908f, -0.000167f, -0.000056f}, + {+0.053843f, -0.247636f, +0.011973f, +0.000305f, -0.000030f}, + {+0.047919f, -0.200610f, +0.011974f, +0.000485f, -0.000070f}, + {-0.001747f, -0.136529f, +0.008548f, -0.000030f, -0.000031f}, + {-0.034659f, +0.098248f, -0.009286f, -0.000733f, -0.000004f}, + {-0.013390f, -0.125590f, +0.000347f, +0.000408f, -0.000006f}, + {+0.018416f, +0.125823f, -0.010099f, -0.001587f, -0.000079f}, + {+0.015670f, -0.020509f, +0.010455f, +0.001886f, +0.000130f}, + {-0.001269f, -0.078191f, +0.000719f, -0.000060f, -0.000015f}, + {-0.015954f, +0.139586f, +0.005155f, +0.000966f, +0.000087f}, + {-0.000690f, +0.074979f, -0.002970f, -0.000046f, +0.000040f}, + {-0.036315f, +0.016998f, -0.007922f, -0.000063f, +0.000042f}, + {-0.017947f, -0.053543f, -0.003628f, +0.000169f, -0.000034f}, + {-0.036250f, +0.025051f, -0.004463f, +0.000134f, +0.000003f} + }, + { + {+0.261565f, -0.175456f, +0.039964f, -0.001605f, -0.000112f}, + {+0.289123f, -0.124032f, +0.042209f, -0.003292f, -0.000173f}, + {+0.147448f, -0.202794f, +0.013343f, -0.000451f, +0.000021f}, + {+0.111431f, -0.158046f, +0.014055f, -0.000866f, +0.000018f}, + {+0.088516f, -0.135597f, +0.008911f, -0.000941f, +0.000062f}, + {+0.046542f, -0.074771f, -0.001267f, -0.000681f, +0.000024f}, + {-0.008851f, +0.134457f, +0.003904f, +0.001907f, -0.000040f}, + {+0.057725f, -0.011782f, +0.007446f, -0.000690f, -0.000019f}, + {-0.064453f, -0.009485f, -0.001505f, +0.003482f, -0.000032f}, + {-0.003750f, -0.043297f, -0.001696f, -0.002710f, -0.000254f}, + {+0.036881f, -0.019154f, +0.003756f, -0.000164f, +0.000052f}, + {-0.028484f, +0.127049f, -0.000373f, -0.001785f, -0.000137f}, + {-0.030494f, +0.034591f, -0.002192f, -0.000165f, +0.000035f}, + {+0.009470f, +0.091778f, +0.004810f, +0.000325f, -0.000042f}, + {+0.029100f, +0.027840f, +0.006520f, -0.000311f, -0.000006f}, + {-0.009135f, +0.066628f, -0.000798f, -0.000116f, -0.000038f} + }, + { + {-0.134646f, +0.431836f, -0.022252f, -0.000261f, -0.000089f}, + {-0.108773f, +0.480556f, -0.020213f, -0.000915f, -0.000164f}, + {-0.157283f, +0.252511f, -0.017953f, +0.000158f, +0.000053f}, + {-0.096912f, +0.162399f, -0.016830f, -0.000259f, +0.000029f}, + {-0.094935f, +0.145981f, -0.017427f, -0.000284f, +0.000058f}, + {-0.078691f, +0.105220f, -0.009040f, -0.000009f, +0.000031f}, + {+0.032041f, +0.084421f, +0.004353f, +0.000773f, +0.000002f}, + {-0.016068f, +0.102075f, -0.005241f, -0.000269f, +0.000010f}, + {+0.027628f, -0.144744f, +0.013233f, +0.001492f, +0.000070f}, + {-0.013497f, -0.033838f, -0.009244f, -0.001447f, -0.000073f}, + {-0.020163f, +0.066780f, -0.002771f, +0.000069f, +0.000003f}, + {+0.051113f, +0.013125f, -0.004746f, -0.000733f, -0.000056f}, + {+0.038408f, -0.068407f, +0.004887f, -0.000113f, -0.000046f}, + {+0.039739f, +0.052992f, +0.003676f, -0.000005f, -0.000032f}, + {+0.019468f, +0.046585f, -0.000417f, -0.000092f, +0.000032f}, + {+0.046026f, -0.019351f, +0.006238f, -0.000147f, +0.000005f} + }, + { + {-0.227969f, +0.284525f, -0.035118f, +0.001170f, +0.000113f}, + {-0.251619f, +0.250783f, -0.039635f, +0.002380f, +0.000192f}, + {-0.028234f, +0.444181f, -0.004258f, +0.000378f, -0.000019f}, + {-0.057970f, +0.223549f, -0.006095f, +0.000655f, -0.000012f}, + {-0.039868f, +0.230386f, -0.002246f, +0.000818f, -0.000054f}, + {+0.036223f, +0.280336f, +0.007555f, +0.000539f, -0.000017f}, + {-0.045995f, -0.019070f, -0.002489f, -0.001639f, +0.000020f}, + {-0.058114f, +0.032997f, -0.008873f, +0.000662f, +0.000018f}, + {+0.053231f, -0.094713f, +0.003411f, -0.002983f, -0.000000f}, + {+0.022768f, +0.016336f, +0.003117f, +0.002216f, +0.000227f}, + {-0.031511f, +0.045619f, -0.004901f, +0.000227f, -0.000048f}, + {-0.045006f, -0.127523f, -0.002107f, +0.001382f, +0.000124f}, + {-0.004533f, -0.139114f, -0.003073f, +0.000203f, -0.000026f}, + {-0.046710f, -0.071863f, -0.004169f, -0.000343f, +0.000040f}, + {-0.053226f, -0.067429f, -0.008363f, +0.000293f, +0.000001f}, + {-0.008131f, -0.104415f, -0.002326f, +0.000063f, +0.000032f} + }, + { + {+0.193626f, -0.362707f, +0.031027f, +0.000215f, +0.000061f}, + {+0.168437f, -0.394610f, +0.030765f, +0.000832f, +0.000106f}, + {+0.166845f, +0.150839f, +0.019333f, -0.000239f, -0.000053f}, + {+0.108632f, -0.026149f, +0.014836f, +0.000210f, -0.000033f}, + {+0.117845f, -0.006812f, +0.017402f, +0.000161f, -0.000052f}, + {+0.070459f, +0.240877f, +0.004084f, -0.000089f, -0.000035f}, + {+0.051571f, -0.166446f, +0.000272f, -0.000594f, +0.000009f}, + {+0.048610f, -0.137567f, +0.012351f, +0.000122f, -0.000012f}, + {-0.060459f, +0.077161f, -0.017457f, -0.001202f, -0.000048f}, + {-0.008901f, +0.071218f, +0.004889f, +0.001056f, +0.000035f}, + {+0.035581f, -0.061262f, +0.007127f, -0.000111f, +0.000006f}, + {+0.009360f, -0.207644f, +0.007254f, +0.000645f, +0.000037f}, + {-0.043066f, -0.091054f, -0.000390f, +0.000159f, +0.000048f}, + {-0.006722f, -0.129159f, -0.003572f, +0.000128f, +0.000025f}, + {+0.002648f, -0.158951f, +0.005371f, +0.000083f, -0.000030f}, + {-0.052294f, -0.037930f, -0.006102f, +0.000171f, -0.000010f} + }, + { + {+0.185388f, -0.373945f, +0.028242f, -0.000870f, -0.000107f}, + {+0.218466f, -0.313607f, +0.033711f, -0.001650f, -0.000187f}, + {-0.089184f, -0.227856f, -0.003013f, -0.000234f, +0.000019f}, + {-0.005910f, -0.195725f, +0.001490f, -0.000426f, +0.000010f}, + {-0.033058f, -0.233100f, -0.003881f, -0.000583f, +0.000049f}, + {-0.128077f, -0.046310f, -0.008240f, -0.000349f, +0.000015f}, + {+0.004052f, -0.247839f, -0.003163f, +0.001295f, -0.000012f}, + {+0.052459f, -0.138631f, +0.002655f, -0.000517f, -0.000018f}, + {-0.024548f, +0.123596f, -0.001667f, +0.002422f, +0.000013f}, + {-0.026309f, +0.052058f, -0.001607f, -0.001982f, -0.000202f}, + {+0.029154f, -0.072410f, +0.002905f, -0.000210f, +0.000043f}, + {+0.051381f, -0.149021f, -0.000115f, -0.001232f, -0.000111f}, + {+0.060324f, +0.057180f, +0.002547f, -0.000144f, +0.000020f}, + {+0.052887f, -0.036634f, +0.006886f, +0.000170f, -0.000037f}, + {+0.075539f, -0.053066f, +0.006319f, -0.000332f, +0.000001f}, + {+0.036656f, +0.098177f, +0.004589f, -0.000133f, -0.000026f} + }, + { + {-0.239844f, +0.276952f, -0.036663f, -0.000075f, -0.000041f}, + {-0.218935f, +0.356480f, -0.037109f, -0.000536f, -0.000063f}, + {-0.067555f, -0.247328f, -0.016085f, +0.000198f, +0.000054f}, + {-0.065557f, -0.103844f, -0.011325f, -0.000270f, +0.000037f}, + {-0.082669f, -0.157628f, -0.013419f, -0.000257f, +0.000050f}, + {+0.051102f, -0.310690f, +0.001856f, +0.000105f, +0.000038f}, + {-0.105915f, -0.086143f, -0.002835f, +0.000369f, -0.000019f}, + {-0.108427f, +0.103999f, -0.015274f, -0.000237f, +0.000014f}, + {+0.072751f, -0.025221f, +0.019360f, +0.000835f, +0.000029f}, + {+0.042856f, -0.056448f, -0.001929f, -0.000741f, -0.000011f}, + {-0.068206f, +0.080584f, -0.011613f, +0.000093f, -0.000013f}, + {-0.091336f, +0.056612f, -0.010772f, -0.000543f, -0.000024f}, + {-0.026414f, +0.186526f, -0.002964f, -0.000133f, -0.000049f}, + {-0.024927f, +0.082144f, -0.001315f, +0.000035f, -0.000020f}, + {-0.062843f, +0.155369f, -0.009444f, -0.000091f, +0.000028f}, + {+0.038812f, +0.095103f, +0.003754f, -0.000076f, +0.000012f} + }, + { + {-0.131680f, +0.440943f, -0.020891f, +0.000627f, +0.000098f}, + {-0.183833f, +0.406966f, -0.027778f, +0.001207f, +0.000171f}, + {+0.086183f, -0.003067f, +0.012386f, +0.000168f, -0.000020f}, + {+0.026332f, +0.035398f, +0.002657f, +0.000383f, -0.000011f}, + {+0.076464f, +0.083380f, +0.010071f, +0.000597f, -0.000047f}, + {+0.086834f, -0.252931f, +0.010256f, +0.000250f, -0.000016f}, + {+0.112579f, +0.244861f, +0.011209f, -0.001100f, +0.000012f}, + {+0.018202f, +0.300605f, +0.006408f, +0.000602f, +0.000018f}, + {-0.003044f, -0.137405f, -0.002719f, -0.002137f, -0.000013f}, + {-0.003641f, -0.131818f, -0.001737f, +0.001737f, +0.000181f}, + {+0.001297f, +0.195950f, +0.005713f, +0.000204f, -0.000037f}, + {+0.045795f, +0.259231f, +0.005407f, +0.001178f, +0.000100f}, + {-0.039454f, +0.170156f, -0.000777f, +0.000115f, -0.000018f}, + {-0.040004f, +0.055755f, -0.008185f, -0.000317f, +0.000034f}, + {-0.043921f, +0.182226f, -0.005163f, +0.000395f, -0.000002f}, + {-0.058367f, -0.053246f, -0.007857f, +0.000065f, +0.000022f} + }, + { + {+0.266519f, -0.168414f, +0.039980f, +0.000112f, +0.000029f}, + {+0.270044f, -0.288912f, +0.044466f, +0.000374f, +0.000037f}, + {+0.013148f, +0.108379f, +0.008696f, -0.000082f, -0.000056f}, + {+0.007547f, +0.066767f, +0.004336f, +0.000293f, -0.000040f}, + {+0.013959f, +0.178267f, +0.007930f, +0.000231f, -0.000050f}, + {-0.126652f, +0.073753f, -0.010940f, -0.000032f, -0.000041f}, + {+0.037971f, +0.357198f, -0.003626f, -0.000116f, +0.000025f}, + {+0.123814f, +0.144678f, +0.015962f, +0.000194f, -0.000018f}, + {-0.073603f, -0.033162f, -0.018399f, -0.000381f, -0.000019f}, + {-0.052463f, -0.055986f, +0.001868f, +0.000682f, -0.000008f}, + {+0.099011f, +0.055743f, +0.009504f, -0.000033f, +0.000019f}, + {+0.066616f, +0.234328f, +0.006904f, +0.000399f, +0.000016f}, + {+0.081064f, -0.004874f, +0.003489f, +0.000036f, +0.000052f}, + {+0.044214f, -0.078007f, +0.004257f, +0.000035f, +0.000016f}, + {+0.107368f, -0.054956f, +0.018386f, -0.000009f, -0.000028f}, + {-0.008996f, -0.126597f, -0.002978f, +0.000081f, -0.000014f} + }, + { + {+0.076584f, -0.456777f, +0.013253f, -0.000677f, -0.000090f}, + {+0.135714f, -0.493797f, +0.019817f, -0.001205f, -0.000155f}, + {-0.049801f, +0.003798f, -0.009316f, -0.000287f, +0.000022f}, + {+0.008289f, +0.072460f, +0.002582f, -0.000487f, +0.000014f}, + {-0.058361f, +0.066933f, -0.007899f, -0.000705f, +0.000047f}, + {+0.024939f, +0.304082f, +0.002238f, -0.000320f, +0.000018f}, + {-0.164640f, +0.054259f, -0.014251f, +0.000972f, -0.000016f}, + {-0.129320f, -0.239583f, -0.014072f, -0.000614f, -0.000019f}, + {+0.023151f, +0.107790f, +0.002402f, +0.001999f, +0.000009f}, + {+0.042244f, +0.087154f, +0.004003f, -0.001651f, -0.000165f}, + {-0.087421f, -0.223827f, -0.009440f, -0.000302f, +0.000032f}, + {-0.123261f, -0.040927f, -0.008130f, -0.001094f, -0.000093f}, + {-0.047678f, -0.191325f, -0.003834f, -0.000119f, +0.000015f}, + {+0.025350f, -0.109559f, +0.002027f, +0.000400f, -0.000032f}, + {-0.031404f, -0.277712f, -0.007376f, -0.000280f, +0.000002f}, + {+0.054594f, -0.026570f, +0.007177f, +0.000010f, -0.000018f} + }, + { + {-0.274121f, +0.081952f, -0.043113f, -0.000004f, -0.000021f}, + {-0.317778f, +0.199223f, -0.049734f, -0.000202f, -0.000022f}, + {-0.015529f, -0.058172f, -0.001453f, +0.000253f, +0.000058f}, + {+0.020112f, +0.056461f, -0.003930f, -0.000113f, +0.000042f}, + {+0.027311f, -0.065956f, -0.001130f, +0.000048f, +0.000049f}, + {+0.092570f, +0.201332f, +0.007025f, +0.000092f, +0.000044f}, + {+0.078874f, -0.299423f, +0.007522f, +0.000058f, -0.000026f}, + {-0.031803f, -0.392121f, -0.002719f, +0.000010f, +0.000023f}, + {+0.078295f, +0.019932f, +0.020674f, +0.000126f, +0.000017f}, + {+0.029291f, +0.096155f, +0.000322f, -0.000490f, +0.000025f}, + {-0.042190f, -0.292546f, -0.004474f, +0.000130f, -0.000023f}, + {+0.047310f, -0.289378f, -0.003082f, -0.000264f, -0.000009f}, + {-0.036042f, -0.202365f, -0.005972f, -0.000021f, -0.000059f}, + {-0.067032f, +0.032496f, -0.007059f, -0.000199f, -0.000013f}, + {-0.101204f, -0.185795f, -0.005848f, +0.000042f, +0.000029f}, + {-0.006759f, +0.066549f, -0.000681f, -0.000136f, +0.000016f} + }, + { + {-0.033486f, +0.450867f, -0.006565f, +0.000576f, +0.000085f}, + {-0.061876f, +0.590080f, -0.009764f, +0.001166f, +0.000147f}, + {+0.051215f, +0.040728f, +0.006725f, +0.000135f, -0.000027f}, + {-0.075886f, -0.090288f, -0.009577f, +0.000383f, -0.000018f}, + {+0.015185f, -0.082124f, +0.005184f, +0.000502f, -0.000049f}, + {-0.096327f, -0.079550f, -0.006514f, +0.000328f, -0.000021f}, + {+0.097424f, -0.250345f, +0.019698f, -0.001078f, +0.000017f}, + {+0.169040f, -0.091237f, +0.017597f, +0.000283f, +0.000017f}, + {-0.049945f, -0.183685f, -0.013171f, -0.002034f, -0.000009f}, + {-0.051580f, -0.036720f, -0.010126f, +0.001380f, +0.000151f}, + {+0.125504f, -0.039269f, +0.013578f, +0.000208f, -0.000027f}, + {+0.070511f, -0.247836f, +0.009393f, +0.000912f, +0.000087f}, + {+0.075408f, -0.033832f, +0.006471f, +0.000223f, -0.000010f}, + {+0.010281f, +0.155017f, +0.004289f, -0.000279f, +0.000029f}, + {+0.128761f, +0.151968f, +0.010917f, +0.000111f, -0.000004f}, + {-0.047805f, -0.002840f, -0.010782f, -0.000029f, +0.000015f} + }, + { + {+0.280158f, -0.030000f, +0.043460f, +0.000075f, +0.000014f}, + {+0.336614f, -0.016258f, +0.050302f, +0.000297f, +0.000011f}, + {+0.002372f, +0.120514f, -0.000413f, -0.000319f, -0.000061f}, + {+0.016063f, -0.229902f, +0.006035f, +0.000097f, -0.000043f}, + {-0.028633f, -0.007390f, -0.002007f, -0.000039f, -0.000048f}, + {+0.005134f, -0.220494f, -0.003892f, -0.000252f, -0.000046f}, + {-0.096636f, +0.051599f, -0.015635f, +0.000127f, +0.000026f}, + {-0.105407f, +0.323356f, -0.007410f, +0.000133f, -0.000028f}, + {-0.087018f, -0.141885f, -0.014985f, +0.000005f, -0.000018f}, + {-0.018235f, -0.085003f, +0.002078f, +0.000390f, -0.000041f}, + {-0.049559f, +0.222425f, -0.001760f, -0.000043f, +0.000027f}, + {-0.087658f, -0.008493f, -0.002149f, +0.000327f, +0.000002f}, + {-0.025991f, +0.110117f, +0.002501f, +0.000106f, +0.000066f}, + {+0.073066f, +0.062410f, +0.006753f, +0.000139f, +0.000010f}, + {-0.012343f, +0.361812f, +0.000879f, +0.000019f, -0.000031f}, + {+0.008849f, -0.097553f, +0.003670f, +0.000140f, -0.000018f} + }, + { + {-0.006954f, -0.470379f, -0.000165f, -0.000551f, -0.000082f}, + {-0.019214f, -0.554319f, +0.001599f, -0.001129f, -0.000145f}, + {-0.050232f, +0.045555f, -0.004649f, -0.000015f, +0.000034f}, + {+0.117286f, -0.075343f, +0.011788f, -0.000390f, +0.000023f}, + {+0.013982f, +0.062149f, +0.000689f, -0.000526f, +0.000053f}, + {+0.064167f, -0.122065f, +0.007764f, -0.000174f, +0.000027f}, + {-0.057456f, +0.102739f, -0.012482f, +0.000929f, -0.000017f}, + {-0.086303f, +0.350740f, -0.008732f, -0.000319f, -0.000013f}, + {+0.114468f, +0.156124f, +0.012352f, +0.002008f, +0.000014f}, + {+0.063324f, +0.045704f, +0.011079f, -0.001189f, -0.000135f}, + {-0.081653f, +0.167815f, -0.010699f, -0.000264f, +0.000021f}, + {+0.009546f, +0.130825f, -0.003286f, -0.000952f, -0.000083f}, + {-0.034292f, +0.088622f, -0.006613f, -0.000382f, +0.000000f}, + {-0.064658f, -0.148003f, -0.007951f, +0.000319f, -0.000027f}, + {-0.118973f, +0.200930f, -0.010476f, -0.000078f, +0.000007f}, + {+0.061648f, -0.019855f, +0.007486f, +0.000045f, -0.000011f} + }, + { + {-0.287193f, -0.042900f, -0.042884f, -0.000074f, -0.000006f}, + {-0.316269f, -0.095647f, -0.050717f, -0.000419f, +0.000004f}, + {+0.024609f, -0.065464f, -0.001044f, +0.000352f, +0.000061f}, + {-0.090934f, +0.238549f, -0.014249f, -0.000001f, +0.000044f}, + {+0.019808f, +0.051257f, -0.001165f, +0.000156f, +0.000046f}, + {-0.048333f, +0.050030f, -0.007461f, +0.000269f, +0.000047f}, + {+0.082327f, -0.120302f, +0.020222f, -0.000034f, -0.000027f}, + {+0.165448f, -0.034472f, +0.017814f, +0.000021f, +0.000032f}, + {+0.033316f, +0.280356f, +0.011492f, -0.000020f, +0.000016f}, + {+0.008225f, +0.128802f, -0.005400f, -0.000223f, +0.000054f}, + {+0.088609f, -0.096391f, +0.012066f, +0.000087f, -0.000030f}, + {+0.036267f, +0.078389f, +0.005104f, -0.000176f, +0.000004f}, + {+0.020864f, +0.001946f, +0.003538f, -0.000159f, -0.000070f}, + {-0.031397f, -0.200648f, -0.000765f, -0.000186f, -0.000008f}, + {+0.119879f, -0.159775f, +0.011369f, +0.000002f, +0.000032f}, + {-0.036654f, +0.129414f, -0.004412f, -0.000114f, +0.000020f} + }, + { + {+0.055358f, +0.480776f, +0.007156f, +0.000440f, +0.000080f}, + {+0.069696f, +0.497403f, +0.009705f, +0.000945f, +0.000144f}, + {+0.014636f, -0.076742f, +0.003268f, +0.000063f, -0.000042f}, + {-0.098616f, +0.221987f, -0.012598f, +0.000348f, -0.000027f}, + {-0.038012f, -0.038810f, -0.004148f, +0.000514f, -0.000056f}, + {-0.010993f, +0.104517f, -0.004208f, +0.000219f, -0.000033f}, + {+0.073401f, -0.141057f, +0.006526f, -0.000916f, +0.000016f}, + {-0.033949f, -0.336614f, -0.001600f, +0.000255f, +0.000007f}, + {-0.139291f, +0.017101f, -0.017309f, -0.001860f, -0.000021f}, + {-0.085604f, -0.017452f, -0.013308f, +0.001048f, +0.000118f}, + {+0.029028f, -0.187952f, +0.005021f, +0.000216f, -0.000016f}, + {-0.006564f, +0.006493f, -0.001419f, +0.000780f, +0.000079f}, + {+0.020490f, +0.003411f, +0.006133f, +0.000307f, +0.000011f}, + {+0.091616f, -0.016927f, +0.008786f, -0.000287f, +0.000025f}, + {+0.009844f, -0.323610f, +0.003492f, +0.000078f, -0.000011f}, + {-0.056286f, +0.097814f, -0.006882f, -0.000079f, +0.000007f} + }, + { + {+0.282827f, +0.133300f, +0.042549f, +0.000086f, -0.000002f}, + {+0.297764f, +0.151816f, +0.046261f, +0.000499f, -0.000022f}, + {-0.010547f, -0.035236f, +0.000498f, -0.000494f, -0.000059f}, + {+0.144406f, -0.152441f, +0.023633f, -0.000028f, -0.000044f}, + {-0.000542f, -0.094714f, +0.004019f, -0.000229f, -0.000043f}, + {+0.041461f, +0.019853f, +0.008957f, -0.000418f, -0.000046f}, + {-0.123943f, +0.154058f, -0.020412f, +0.000069f, +0.000030f}, + {-0.130914f, -0.179670f, -0.017352f, -0.000111f, -0.000033f}, + {+0.036620f, -0.258117f, -0.000481f, +0.000034f, -0.000009f}, + {+0.021657f, -0.180451f, +0.009924f, +0.000053f, -0.000065f}, + {-0.095197f, +0.006584f, -0.013724f, -0.000061f, +0.000032f}, + {-0.011099f, +0.015338f, -0.000599f, +0.000168f, -0.000011f}, + {+0.002807f, +0.034719f, -0.003109f, +0.000353f, +0.000070f}, + {-0.041276f, +0.181885f, -0.005275f, +0.000201f, +0.000007f}, + {-0.125301f, -0.110921f, -0.015164f, -0.000039f, -0.000032f}, + {+0.066993f, -0.092159f, +0.009251f, +0.000136f, -0.000021f} + }, + { + {-0.104112f, -0.458657f, -0.013927f, -0.000353f, -0.000076f}, + {-0.111390f, -0.472799f, -0.015450f, -0.000704f, -0.000139f}, + {+0.000873f, -0.019121f, -0.001169f, -0.000093f, +0.000048f}, + {+0.056615f, -0.285336f, +0.007942f, -0.000391f, +0.000032f}, + {+0.055650f, -0.007065f, +0.007223f, -0.000546f, +0.000060f}, + {-0.018845f, -0.077039f, -0.001923f, -0.000256f, +0.000039f}, + {-0.051977f, +0.260211f, -0.006687f, +0.000819f, -0.000018f}, + {+0.110604f, +0.197201f, +0.015009f, -0.000259f, -0.000003f}, + {+0.118052f, -0.135388f, +0.015667f, +0.001612f, +0.000024f}, + {+0.098237f, -0.061993f, +0.014872f, -0.000974f, -0.000101f}, + {+0.016600f, +0.180900f, +0.001935f, -0.000217f, +0.000011f}, + {-0.024890f, -0.001895f, -0.000719f, -0.000667f, -0.000075f}, + {-0.052001f, -0.047705f, -0.008689f, -0.000203f, -0.000021f}, + {-0.051423f, +0.163687f, -0.007750f, +0.000277f, -0.000023f}, + {+0.092904f, +0.226447f, +0.010447f, -0.000087f, +0.000014f}, + {+0.029788f, -0.148840f, +0.003437f, +0.000063f, -0.000002f} + }, + { + {-0.265513f, -0.211642f, -0.040584f, -0.000055f, +0.000009f}, + {-0.279427f, -0.216928f, -0.044464f, -0.000461f, +0.000042f}, + {-0.017280f, +0.004077f, -0.001930f, +0.000533f, +0.000057f}, + {-0.175703f, +0.073912f, -0.028215f, +0.000106f, +0.000044f}, + {-0.032929f, +0.127864f, -0.007891f, +0.000307f, +0.000041f}, + {-0.023458f, -0.073855f, -0.003516f, +0.000521f, +0.000044f}, + {+0.165507f, -0.073413f, +0.027506f, -0.000119f, -0.000034f}, + {+0.058760f, +0.277549f, +0.005732f, +0.000115f, +0.000033f}, + {-0.086524f, +0.185360f, -0.006494f, -0.000114f, +0.000000f}, + {-0.068563f, +0.191058f, -0.014677f, +0.000094f, +0.000073f}, + {+0.083271f, +0.077777f, +0.010978f, +0.000035f, -0.000035f}, + {+0.032739f, -0.090968f, +0.003108f, -0.000130f, +0.000018f}, + {+0.012042f, -0.148829f, +0.005352f, -0.000453f, -0.000067f}, + {+0.074068f, -0.028523f, +0.009472f, -0.000233f, -0.000006f}, + {+0.054178f, +0.286348f, +0.004315f, +0.000011f, +0.000032f}, + {-0.081317f, +0.023039f, -0.011622f, -0.000155f, +0.000021f} + }, + { + {+0.144447f, +0.416258f, +0.019880f, +0.000298f, +0.000071f}, + {+0.149133f, +0.438088f, +0.020811f, +0.000535f, +0.000129f}, + {+0.015049f, +0.049287f, -0.000123f, +0.000146f, -0.000053f}, + {-0.004923f, +0.337598f, +0.000454f, +0.000368f, -0.000037f}, + {-0.051157f, +0.099533f, -0.006353f, +0.000530f, -0.000063f}, + {+0.036114f, +0.015276f, +0.002183f, +0.000257f, -0.000042f}, + {-0.001423f, -0.329473f, -0.000629f, -0.000758f, +0.000021f}, + {-0.137836f, -0.026570f, -0.019057f, +0.000357f, +0.000002f}, + {-0.074813f, +0.206610f, -0.009222f, -0.001398f, -0.000023f}, + {-0.082213f, +0.168162f, -0.013202f, +0.000891f, +0.000086f}, + {-0.053436f, -0.133406f, -0.007060f, +0.000274f, -0.000004f}, + {+0.031202f, -0.097339f, +0.000600f, +0.000565f, +0.000069f}, + {+0.084087f, -0.042545f, +0.010288f, +0.000114f, +0.000027f}, + {-0.011630f, -0.156396f, +0.002102f, -0.000281f, +0.000021f}, + {-0.139327f, -0.009640f, -0.015858f, +0.000166f, -0.000017f}, + {+0.001227f, +0.149601f, +0.000552f, -0.000041f, -0.000002f} + }, + { + {+0.243657f, +0.264257f, +0.037689f, -0.000001f, -0.000015f}, + {+0.259444f, +0.270037f, +0.041639f, +0.000297f, -0.000058f}, + {+0.024732f, +0.031819f, +0.004944f, -0.000508f, -0.000056f}, + {+0.188302f, +0.043036f, +0.027818f, -0.000121f, -0.000045f}, + {+0.061013f, -0.068025f, +0.009284f, -0.000332f, -0.000040f}, + {-0.005481f, +0.077635f, +0.001849f, -0.000481f, -0.000044f}, + {-0.183484f, -0.052352f, -0.028430f, +0.000255f, +0.000038f}, + {+0.021508f, -0.270954f, +0.003464f, -0.000123f, -0.000034f}, + {+0.112315f, -0.086235f, +0.009937f, +0.000307f, +0.000007f}, + {+0.107969f, -0.120398f, +0.018769f, -0.000181f, -0.000082f}, + {-0.056786f, -0.126822f, -0.007959f, -0.000033f, +0.000039f}, + {-0.069219f, +0.054400f, -0.005730f, +0.000053f, -0.000023f}, + {-0.070651f, +0.193415f, -0.010674f, +0.000389f, +0.000067f}, + {-0.051509f, -0.092171f, -0.007870f, +0.000294f, +0.000005f}, + {+0.051121f, -0.299571f, +0.006590f, -0.000024f, -0.000032f}, + {+0.084035f, +0.019475f, +0.012921f, +0.000164f, -0.000021f} + }, + { + {-0.178130f, -0.383088f, -0.025598f, -0.000261f, -0.000067f}, + {-0.182587f, -0.405974f, -0.025901f, -0.000462f, -0.000117f}, + {-0.033772f, -0.059691f, -0.003877f, -0.000106f, +0.000059f}, + {-0.056171f, -0.329183f, -0.006810f, -0.000311f, +0.000043f}, + {+0.030324f, -0.107424f, +0.007446f, -0.000469f, +0.000068f}, + {-0.029083f, +0.038828f, -0.003047f, -0.000232f, +0.000046f}, + {+0.074081f, +0.341332f, +0.009025f, +0.000675f, -0.000027f}, + {+0.114367f, -0.124510f, +0.017364f, -0.000363f, -0.000002f}, + {+0.019963f, -0.231444f, +0.001211f, +0.001284f, +0.000019f}, + {+0.044510f, -0.213643f, +0.009811f, -0.000749f, -0.000069f}, + {+0.075343f, +0.079800f, +0.011596f, -0.000341f, -0.000004f}, + {+0.002994f, +0.163592f, +0.001034f, -0.000473f, -0.000063f}, + {-0.066930f, +0.201208f, -0.008014f, -0.000114f, -0.000031f}, + {+0.046049f, +0.057169f, +0.003278f, +0.000251f, -0.000018f}, + {+0.102214f, -0.218411f, +0.013142f, -0.000169f, +0.000019f}, + {-0.034525f, -0.167091f, -0.007400f, +0.000056f, +0.000007f} + }, + { + {-0.222238f, -0.317392f, -0.033615f, +0.000033f, +0.000021f}, + {-0.241813f, -0.315693f, -0.038994f, -0.000147f, +0.000070f}, + {-0.020356f, -0.081902f, -0.002758f, +0.000479f, +0.000060f}, + {-0.167023f, -0.157180f, -0.026364f, +0.000127f, +0.000047f}, + {-0.066143f, +0.046203f, -0.014148f, +0.000357f, +0.000040f}, + {+0.022432f, -0.042335f, +0.001522f, +0.000437f, +0.000048f}, + {+0.157680f, +0.214692f, +0.024775f, -0.000379f, -0.000040f}, + {-0.074512f, +0.166548f, -0.010491f, +0.000080f, +0.000039f}, + {-0.105735f, -0.034968f, -0.008768f, -0.000539f, -0.000010f}, + {-0.123458f, +0.044963f, -0.022305f, +0.000260f, +0.000091f}, + {+0.027259f, +0.155333f, +0.002873f, +0.000021f, -0.000041f}, + {+0.074325f, +0.052152f, +0.007210f, +0.000007f, +0.000026f}, + {+0.123302f, -0.087187f, +0.015137f, -0.000263f, -0.000074f}, + {+0.007845f, +0.113256f, +0.003459f, -0.000313f, -0.000004f}, + {-0.120092f, +0.122041f, -0.014660f, +0.000024f, +0.000034f}, + {-0.076429f, -0.107035f, -0.008690f, -0.000173f, +0.000022f} + }, + { + {+0.213344f, +0.349398f, +0.030097f, +0.000237f, +0.000063f}, + {+0.219215f, +0.390772f, +0.031915f, +0.000487f, +0.000107f}, + {+0.052529f, +0.029499f, +0.005648f, -0.000100f, -0.000070f}, + {+0.095709f, +0.245511f, +0.012927f, +0.000199f, -0.000053f}, + {-0.028737f, +0.105483f, -0.003866f, +0.000348f, -0.000076f}, + {+0.013337f, -0.055289f, +0.001002f, +0.000053f, -0.000054f}, + {-0.130180f, -0.225228f, -0.015900f, -0.000591f, +0.000035f}, + {-0.068381f, +0.171403f, -0.012635f, +0.000260f, +0.000000f}, + {+0.025988f, +0.167605f, +0.004069f, -0.001280f, -0.000015f}, + {-0.008972f, +0.221115f, -0.003663f, +0.000531f, +0.000048f}, + {-0.090641f, -0.028424f, -0.013918f, +0.000378f, +0.000016f}, + {-0.038654f, -0.120101f, -0.004990f, +0.000461f, +0.000057f}, + {+0.005905f, -0.263875f, +0.003095f, +0.000269f, +0.000040f}, + {-0.040815f, +0.035273f, -0.004946f, -0.000197f, +0.000014f}, + {-0.018746f, +0.272655f, -0.004798f, +0.000121f, -0.000023f}, + {+0.076538f, +0.124942f, +0.010206f, -0.000084f, -0.000014f} + }, + { + {+0.192920f, +0.381741f, +0.029300f, -0.000048f, -0.000026f}, + {+0.222170f, +0.388402f, +0.034955f, +0.000099f, -0.000080f}, + {+0.001699f, +0.107240f, +0.000947f, -0.000519f, -0.000066f}, + {+0.136658f, +0.180309f, +0.023176f, -0.000174f, -0.000048f}, + {+0.088774f, -0.075575f, +0.016123f, -0.000436f, -0.000040f}, + {-0.024745f, +0.004479f, -0.001974f, -0.000454f, -0.000055f}, + {-0.102774f, -0.266722f, -0.019008f, +0.000449f, +0.000041f}, + {+0.092562f, -0.080882f, +0.015366f, -0.000075f, -0.000049f}, + {+0.070990f, +0.091884f, +0.006305f, +0.000702f, +0.000009f}, + {+0.128422f, +0.011753f, +0.022348f, -0.000409f, -0.000098f}, + {+0.011288f, -0.189192f, +0.003841f, +0.000041f, +0.000039f}, + {-0.054725f, -0.090752f, -0.006454f, -0.000058f, -0.000028f}, + {-0.128788f, -0.054495f, -0.017806f, +0.000292f, +0.000085f}, + {+0.020286f, -0.059861f, +0.001026f, +0.000246f, +0.000006f}, + {+0.120848f, +0.054441f, +0.017027f, -0.000075f, -0.000037f}, + {+0.034321f, +0.188962f, +0.004725f, +0.000162f, -0.000021f} + }, + { + {-0.244141f, -0.287056f, -0.034191f, -0.000192f, -0.000058f}, + {-0.264405f, -0.355877f, -0.037791f, -0.000515f, -0.000101f}, + {-0.059687f, +0.011038f, -0.007243f, +0.000348f, +0.000093f}, + {-0.113575f, -0.207201f, -0.018101f, -0.000078f, +0.000070f}, + {+0.015137f, -0.192002f, -0.000035f, -0.000213f, +0.000092f}, + {-0.000786f, +0.038825f, -0.000032f, +0.000190f, +0.000073f}, + {+0.148464f, +0.121467f, +0.020501f, +0.000551f, -0.000044f}, + {+0.029628f, -0.179066f, +0.005364f, -0.000049f, +0.000007f}, + {-0.038114f, -0.078616f, -0.007491f, +0.001320f, +0.000017f}, + {-0.025506f, -0.225558f, -0.001578f, -0.000313f, -0.000019f}, + {+0.093865f, -0.065189f, +0.011642f, -0.000361f, -0.000030f}, + {+0.055369f, +0.081537f, +0.009138f, -0.000492f, -0.000055f}, + {+0.051502f, +0.222620f, +0.004584f, -0.000598f, -0.000061f}, + {+0.019309f, -0.058544f, +0.003257f, +0.000181f, -0.000009f}, + {-0.051402f, -0.209177f, -0.004739f, -0.000005f, +0.000032f}, + {-0.088918f, +0.001217f, -0.011717f, +0.000085f, +0.000023f} + }, + { + {-0.156411f, -0.421444f, -0.024491f, +0.000067f, +0.000032f}, + {-0.186613f, -0.476552f, -0.029757f, -0.000163f, +0.000095f}, + {+0.020430f, -0.113691f, +0.002893f, +0.000775f, +0.000065f}, + {-0.119151f, -0.201740f, -0.018300f, +0.000297f, +0.000045f}, + {-0.119879f, +0.010231f, -0.016974f, +0.000596f, +0.000034f}, + {+0.016380f, +0.009027f, +0.002417f, +0.000683f, +0.000057f}, + {+0.054627f, +0.269651f, +0.010810f, -0.000526f, -0.000040f}, + {-0.097390f, +0.017005f, -0.015311f, +0.000161f, +0.000060f}, + {-0.042266f, -0.067204f, -0.002884f, -0.000753f, -0.000009f}, + {-0.124653f, -0.076460f, -0.020814f, +0.000683f, +0.000097f}, + {-0.063103f, +0.174209f, -0.008521f, -0.000147f, -0.000032f}, + {+0.034711f, +0.112933f, +0.002461f, +0.000059f, +0.000029f}, + {+0.100579f, +0.144714f, +0.014721f, -0.000551f, -0.000093f}, + {-0.025957f, +0.015194f, -0.003388f, -0.000192f, -0.000011f}, + {-0.076574f, -0.167585f, -0.012107f, +0.000148f, +0.000039f}, + {+0.014876f, -0.155274f, +0.000070f, -0.000119f, +0.000015f} + }, + { + {+0.265430f, +0.225416f, +0.037831f, +0.000115f, +0.000053f}, + {+0.306311f, +0.277325f, +0.043227f, +0.000433f, +0.000096f}, + {+0.056945f, -0.056467f, +0.006568f, -0.000476f, -0.000127f}, + {+0.136114f, +0.189590f, +0.020608f, +0.000082f, -0.000092f}, + {+0.029899f, +0.236698f, +0.003149f, +0.000187f, -0.000112f}, + {+0.002353f, -0.011865f, -0.000725f, -0.000346f, -0.000104f}, + {-0.149926f, -0.044328f, -0.020529f, -0.000533f, +0.000055f}, + {+0.006499f, +0.177667f, -0.000005f, -0.000147f, -0.000024f}, + {+0.030173f, +0.047667f, +0.008504f, -0.001253f, -0.000024f}, + {+0.058868f, +0.204995f, +0.005519f, +0.000216f, -0.000017f}, + {-0.060797f, +0.176638f, -0.008488f, +0.000290f, +0.000044f}, + {-0.066026f, -0.042360f, -0.010165f, +0.000503f, +0.000055f}, + {-0.083588f, -0.140991f, -0.010070f, +0.000860f, +0.000099f}, + {-0.004801f, +0.048462f, -0.000139f, -0.000150f, +0.000006f}, + {+0.080388f, +0.074103f, +0.009601f, -0.000068f, -0.000044f}, + {+0.065811f, -0.073786f, +0.011524f, -0.000018f, -0.000032f} + }, + { + {+0.119762f, +0.449669f, +0.018731f, -0.000115f, -0.000039f}, + {+0.134482f, +0.541069f, +0.022864f, +0.000250f, -0.000117f}, + {-0.042132f, +0.097515f, -0.006293f, -0.001210f, -0.000046f}, + {+0.098328f, +0.249713f, +0.014715f, -0.000530f, -0.000029f}, + {+0.121827f, +0.094517f, +0.018717f, -0.000823f, -0.000016f}, + {-0.013897f, +0.016128f, -0.002834f, -0.001121f, -0.000043f}, + {-0.013035f, -0.259005f, -0.004212f, +0.000650f, +0.000036f}, + {+0.088488f, +0.051805f, +0.014091f, -0.000366f, -0.000066f}, + {+0.034103f, +0.039837f, +0.000657f, +0.000674f, +0.000017f}, + {+0.110624f, +0.126988f, +0.019030f, -0.001012f, -0.000081f}, + {+0.093230f, -0.059767f, +0.012720f, +0.000213f, +0.000018f}, + {-0.010158f, -0.127393f, +0.000864f, +0.000011f, -0.000034f}, + {-0.063926f, -0.170726f, -0.009503f, +0.001011f, +0.000084f}, + {+0.027512f, -0.003892f, +0.003562f, +0.000233f, +0.000020f}, + {+0.023442f, +0.159229f, +0.006050f, -0.000235f, -0.000035f}, + {-0.037775f, +0.088532f, -0.005468f, +0.000062f, -0.000004f} + }, + { + {-0.281213f, -0.164420f, -0.039852f, -0.000042f, -0.000045f}, + {-0.333286f, -0.175696f, -0.047590f, -0.000222f, -0.000083f}, + {-0.046428f, +0.089416f, -0.005265f, +0.000281f, +0.000164f}, + {-0.162498f, -0.149672f, -0.023881f, -0.000229f, +0.000114f}, + {-0.075028f, -0.208672f, -0.010268f, -0.000343f, +0.000132f}, + {-0.011727f, +0.019516f, +0.000540f, +0.000212f, +0.000139f}, + {+0.140528f, -0.025264f, +0.018383f, +0.000497f, -0.000067f}, + {-0.033739f, -0.136327f, -0.003526f, +0.000118f, +0.000049f}, + {-0.027078f, -0.053959f, -0.007554f, +0.001057f, +0.000031f}, + {-0.086060f, -0.177107f, -0.010290f, -0.000364f, +0.000050f}, + {+0.010787f, -0.184727f, +0.002953f, -0.000174f, -0.000054f}, + {+0.067502f, -0.008050f, +0.010245f, -0.000436f, -0.000057f}, + {+0.094254f, +0.075792f, +0.012552f, -0.000706f, -0.000144f}, + {-0.009743f, -0.063892f, -0.003613f, +0.000014f, -0.000006f}, + {-0.069093f, +0.013884f, -0.010485f, -0.000027f, +0.000058f}, + {-0.040587f, +0.086338f, -0.006898f, -0.000093f, +0.000039f} + }, + { + {-0.083222f, -0.468035f, -0.013503f, +0.000232f, +0.000044f}, + {-0.075896f, -0.571385f, -0.014672f, -0.000160f, +0.000148f}, + {+0.064646f, -0.084083f, +0.009714f, +0.001578f, +0.000001f}, + {-0.061670f, -0.306739f, -0.009048f, +0.000650f, -0.000001f}, + {-0.101027f, -0.169945f, -0.015494f, +0.000962f, -0.000016f}, + {+0.029442f, -0.045651f, +0.004343f, +0.001546f, +0.000004f}, + {-0.024934f, +0.231230f, -0.000602f, -0.000728f, -0.000028f}, + {-0.072285f, -0.076179f, -0.012914f, +0.000746f, +0.000059f}, + {-0.032566f, -0.041990f, -0.000543f, -0.000656f, -0.000034f}, + {-0.090764f, -0.173219f, -0.015307f, +0.001207f, +0.000044f}, + {-0.090276f, -0.027741f, -0.013865f, -0.000091f, +0.000003f}, + {-0.018263f, +0.122358f, -0.003953f, -0.000094f, +0.000045f}, + {+0.030642f, +0.175289f, +0.004377f, -0.001562f, -0.000047f}, + {-0.023328f, -0.044760f, -0.001438f, -0.000338f, -0.000032f}, + {+0.006646f, -0.104149f, -0.000978f, +0.000365f, +0.000024f}, + {+0.048240f, -0.050757f, +0.006981f, -0.000141f, -0.000013f} + }, + { + {+0.293187f, +0.109518f, +0.041947f, +0.000007f, +0.000034f}, + {+0.344718f, +0.073613f, +0.049496f, -0.000072f, +0.000056f}, + {+0.021693f, -0.150854f, +0.000496f, +0.000303f, -0.000187f}, + {+0.175693f, +0.054150f, +0.024494f, +0.000572f, -0.000126f}, + {+0.106866f, +0.149507f, +0.014360f, +0.000666f, -0.000140f}, + {+0.005446f, -0.082692f, -0.002403f, +0.000314f, -0.000163f}, + {-0.114767f, +0.094767f, -0.014918f, -0.000548f, +0.000078f}, + {+0.049475f, +0.114052f, +0.007022f, +0.000118f, -0.000074f}, + {+0.031125f, +0.054985f, +0.008404f, -0.000705f, -0.000030f}, + {+0.107661f, +0.132716f, +0.012982f, +0.000706f, -0.000070f}, + {+0.028176f, +0.155327f, +0.002943f, +0.000018f, +0.000055f}, + {-0.051419f, +0.071483f, -0.007973f, +0.000234f, +0.000055f}, + {-0.090400f, -0.012443f, -0.011441f, +0.000118f, +0.000180f}, + {+0.025522f, +0.028081f, +0.003864f, +0.000120f, +0.000013f}, + {+0.045874f, -0.043114f, +0.007466f, +0.000223f, -0.000070f}, + {+0.014499f, -0.105809f, +0.003088f, +0.000276f, -0.000039f} + }, + { + {+0.046789f, +0.488561f, +0.007479f, -0.000388f, -0.000046f}, + {+0.018640f, +0.575973f, +0.005892f, -0.000203f, -0.000177f}, + {-0.079067f, +0.002856f, -0.010533f, -0.001448f, +0.000068f}, + {+0.016267f, +0.296423f, +0.004542f, -0.000403f, +0.000045f}, + {+0.068852f, +0.208415f, +0.010824f, -0.000748f, +0.000061f}, + {-0.046351f, -0.003708f, -0.005559f, -0.001546f, +0.000058f}, + {+0.047339f, -0.155305f, +0.003323f, +0.000760f, +0.000014f}, + {+0.060540f, +0.100086f, +0.009755f, -0.001008f, -0.000039f}, + {+0.028568f, +0.054083f, +0.000810f, +0.000898f, +0.000057f}, + {+0.065074f, +0.200619f, +0.010710f, -0.000928f, +0.000007f}, + {+0.072568f, +0.087920f, +0.011704f, -0.000262f, -0.000027f}, + {+0.035957f, -0.060576f, +0.005664f, +0.000112f, -0.000061f}, + {-0.005716f, -0.143119f, -0.000691f, +0.001673f, -0.000018f}, + {+0.004173f, +0.058408f, +0.000175f, +0.000594f, +0.000044f}, + {-0.014414f, +0.051132f, -0.000839f, -0.000345f, -0.000005f}, + {-0.049091f, -0.010855f, -0.005751f, +0.000426f, +0.000033f} + }, + { + {-0.304340f, -0.049256f, -0.042947f, -0.000088f, -0.000022f}, + {-0.346449f, +0.017003f, -0.049621f, +0.000139f, -0.000009f}, + {+0.019745f, +0.150866f, +0.002851f, -0.000874f, +0.000177f}, + {-0.162730f, +0.020120f, -0.025248f, -0.000808f, +0.000118f}, + {-0.121162f, -0.084738f, -0.017259f, -0.000808f, +0.000129f}, + {+0.021528f, +0.096693f, +0.003962f, -0.000943f, +0.000157f}, + {+0.080586f, -0.103642f, +0.011291f, +0.000589f, -0.000085f}, + {-0.068191f, -0.098030f, -0.009096f, -0.000708f, +0.000092f}, + {-0.036751f, -0.046076f, -0.010119f, +0.000284f, +0.000015f}, + {-0.119856f, -0.085575f, -0.015319f, -0.000749f, +0.000064f}, + {-0.056191f, -0.109851f, -0.006441f, -0.000263f, -0.000045f}, + {+0.024446f, -0.076942f, +0.005466f, +0.000057f, -0.000045f}, + {+0.077086f, -0.012676f, +0.010840f, +0.000676f, -0.000186f}, + {-0.022826f, +0.016537f, -0.004763f, -0.000058f, -0.000029f}, + {-0.027607f, +0.031101f, -0.005172f, -0.000482f, +0.000074f}, + {+0.014855f, +0.087430f, -0.000738f, -0.000308f, +0.000029f} + }, + { + {-0.005004f, -0.508800f, -0.001655f, +0.000570f, +0.000043f}, + {+0.037995f, -0.575156f, +0.001530f, +0.000956f, +0.000194f}, + {+0.063856f, +0.080957f, +0.012812f, -0.000366f, -0.000142f}, + {+0.010948f, -0.247204f, +0.002839f, -0.000988f, -0.000091f}, + {-0.037852f, -0.213873f, -0.003692f, -0.000614f, -0.000107f}, + {+0.039839f, +0.066118f, +0.007988f, +0.000076f, -0.000128f}, + {-0.045977f, +0.093672f, -0.005215f, -0.000506f, +0.000005f}, + {-0.041130f, -0.141991f, -0.007462f, +0.000858f, +0.000008f}, + {-0.021819f, -0.064730f, +0.000517f, -0.001640f, -0.000079f}, + {-0.039217f, -0.211900f, -0.002725f, -0.000921f, -0.000061f}, + {-0.045306f, -0.127706f, -0.011256f, +0.001493f, +0.000048f}, + {-0.032008f, +0.009436f, -0.005842f, +0.000094f, +0.000078f}, + {-0.004712f, +0.114810f, -0.003709f, -0.000227f, +0.000095f}, + {+0.008291f, -0.029832f, +0.002509f, -0.001272f, -0.000051f}, + {+0.010544f, -0.029052f, +0.001437f, -0.000138f, -0.000018f}, + {+0.030918f, +0.063638f, +0.005584f, -0.001227f, -0.000052f} + }, + { + {+0.309505f, -0.026680f, +0.043359f, +0.000419f, +0.000012f}, + {+0.340746f, -0.112091f, +0.048231f, +0.000694f, -0.000055f}, + {-0.050908f, -0.091302f, -0.002377f, +0.001134f, -0.000125f}, + {+0.144586f, -0.040667f, +0.026484f, +0.000403f, -0.000085f}, + {+0.123071f, +0.035557f, +0.020641f, +0.000216f, -0.000092f}, + {-0.043825f, -0.058128f, -0.002805f, +0.001548f, -0.000111f}, + {-0.057009f, +0.077140f, -0.008666f, -0.000464f, +0.000085f}, + {+0.083496f, +0.049994f, +0.012188f, +0.002184f, -0.000094f}, + {+0.041301f, +0.031775f, +0.012825f, +0.000028f, +0.000015f}, + {+0.123609f, +0.042304f, +0.020375f, -0.000225f, -0.000027f}, + {+0.072663f, +0.052460f, +0.006157f, +0.001671f, +0.000023f}, + {-0.007106f, +0.047603f, -0.003493f, -0.000487f, +0.000023f}, + {-0.066995f, +0.014584f, -0.013984f, -0.001717f, +0.000149f}, + {+0.012333f, -0.023056f, +0.004831f, -0.000535f, +0.000051f}, + {+0.018093f, -0.018206f, +0.005001f, +0.000871f, -0.000068f}, + {-0.032484f, -0.034633f, +0.000235f, -0.000375f, -0.000007f} + } +}; + +const float rightHRIRReal_HOA3[BINAURAL_CONVBANDS][16][BINAURAL_NTAPS]= +{ + { + {+0.028305f, +0.686064f, +0.068005f, +0.008358f, +0.000134f}, + {-0.041076f, -0.081510f, +0.101574f, -0.012332f, -0.000133f}, + {+0.004694f, +0.091178f, -0.006019f, -0.000987f, -0.000100f}, + {+0.005000f, +0.062531f, -0.030068f, +0.002120f, -0.000090f}, + {-0.008304f, -0.004854f, -0.003618f, +0.000840f, +0.000150f}, + {-0.005344f, -0.010835f, -0.007864f, -0.004915f, +0.000112f}, + {-0.014194f, +0.005486f, -0.000750f, -0.002195f, +0.000158f}, + {+0.002251f, -0.002762f, +0.046227f, +0.004129f, +0.000004f}, + {-0.024537f, +0.046996f, -0.049712f, -0.006618f, +0.000145f}, + {-0.010068f, +0.052648f, -0.026763f, -0.010223f, -0.000366f}, + {-0.000943f, -0.017480f, +0.020482f, +0.001034f, +0.000058f}, + {-0.002377f, +0.034436f, +0.006489f, -0.012518f, -0.000220f}, + {-0.003606f, -0.027453f, +0.015178f, +0.001090f, -0.000006f}, + {-0.000854f, -0.033509f, +0.016348f, +0.002809f, +0.000078f}, + {+0.001127f, -0.002978f, +0.013287f, +0.005932f, -0.000006f}, + {-0.002728f, -0.006413f, +0.003444f, +0.002047f, +0.000053f} + }, + { + {-0.060981f, +0.539033f, -0.032927f, -0.008925f, -0.000158f}, + {+0.088569f, -0.331317f, -0.135589f, +0.009798f, +0.000139f}, + {-0.006979f, +0.010016f, -0.062582f, +0.002090f, +0.000127f}, + {-0.010389f, +0.024941f, -0.053685f, -0.002256f, +0.000117f}, + {+0.013525f, +0.047393f, +0.001706f, -0.001388f, -0.000191f}, + {+0.006413f, +0.030122f, +0.020701f, +0.011138f, -0.000148f}, + {+0.024834f, +0.109440f, +0.032236f, +0.002032f, -0.000215f}, + {-0.002223f, -0.102504f, -0.064424f, -0.005351f, -0.000007f}, + {+0.037480f, +0.308972f, +0.087606f, +0.006506f, -0.000210f}, + {+0.016939f, +0.106048f, +0.043760f, +0.005027f, +0.000470f}, + {+0.000739f, +0.002371f, +0.021897f, +0.001907f, -0.000076f}, + {+0.005038f, +0.073983f, +0.110448f, +0.018835f, +0.000283f}, + {+0.003491f, -0.004047f, +0.005200f, -0.002767f, +0.000014f}, + {+0.001174f, +0.011186f, +0.026019f, -0.003363f, -0.000098f}, + {-0.002185f, -0.029503f, -0.056810f, -0.012753f, +0.000001f}, + {+0.003633f, +0.007292f, -0.011811f, -0.003296f, -0.000071f} + }, + { + {+0.056640f, +0.424888f, -0.091068f, -0.008146f, -0.000105f}, + {-0.085624f, -0.535380f, +0.135686f, +0.024218f, +0.000137f}, + {+0.000837f, -0.039137f, -0.022512f, -0.003663f, +0.000063f}, + {+0.009275f, -0.013781f, -0.023629f, -0.005508f, +0.000051f}, + {-0.004547f, +0.088202f, -0.042587f, +0.003924f, -0.000093f}, + {+0.003101f, +0.099791f, -0.033209f, -0.007324f, -0.000060f}, + {-0.010598f, +0.183236f, -0.035352f, +0.008713f, -0.000074f}, + {-0.003128f, -0.087287f, -0.092687f, -0.003205f, -0.000001f}, + {-0.002915f, +0.422198f, -0.021401f, +0.017334f, -0.000046f}, + {-0.008367f, +0.030365f, +0.081942f, +0.019445f, +0.000222f}, + {+0.002027f, +0.059247f, -0.024597f, -0.009143f, -0.000033f}, + {-0.005485f, +0.016036f, +0.189920f, -0.005523f, +0.000134f}, + {+0.004590f, +0.043786f, -0.049890f, +0.002054f, -0.000006f}, + {+0.000794f, +0.086150f, -0.052409f, -0.001703f, -0.000051f}, + {+0.002015f, +0.016274f, -0.139462f, +0.010767f, +0.000013f}, + {+0.000980f, +0.021151f, -0.025610f, +0.002927f, -0.000028f} + }, + { + {-0.037044f, +0.299825f, +0.010626f, +0.009027f, +0.000178f}, + {+0.073631f, -0.563948f, -0.256507f, -0.030068f, -0.000165f}, + {+0.001394f, +0.007863f, +0.051772f, +0.005838f, -0.000136f}, + {-0.007311f, +0.033976f, +0.087547f, +0.012955f, -0.000125f}, + {+0.000742f, -0.006564f, -0.155719f, -0.010210f, +0.000207f}, + {-0.003772f, +0.011095f, -0.118202f, -0.002442f, +0.000158f}, + {-0.001621f, -0.014236f, -0.266669f, -0.019686f, +0.000230f}, + {+0.004592f, +0.006155f, +0.002774f, +0.008968f, +0.000009f}, + {-0.017921f, +0.015905f, -0.425734f, -0.038383f, +0.000222f}, + {+0.007216f, -0.258967f, -0.290441f, -0.007092f, -0.000519f}, + {-0.003522f, +0.023316f, -0.032467f, +0.009674f, +0.000084f}, + {+0.006507f, -0.177693f, -0.033997f, +0.006462f, -0.000311f}, + {-0.006842f, +0.024376f, -0.051686f, +0.001498f, -0.000018f}, + {-0.002603f, +0.039216f, -0.091765f, +0.003591f, +0.000108f}, + {-0.003570f, +0.063130f, -0.095408f, -0.005271f, -0.000002f}, + {-0.003443f, +0.045327f, +0.012038f, -0.006717f, +0.000078f} + }, + { + {+0.016927f, -0.038791f, +0.287896f, +0.014303f, +0.000072f}, + {-0.067605f, +0.097306f, -0.721167f, -0.014182f, -0.000134f}, + {+0.004523f, -0.006482f, +0.087578f, -0.003063f, -0.000024f}, + {+0.010963f, -0.024388f, +0.147380f, -0.008366f, -0.000010f}, + {-0.009045f, -0.033260f, -0.131601f, +0.010659f, +0.000033f}, + {-0.006391f, -0.001186f, -0.117010f, +0.003913f, +0.000007f}, + {-0.000206f, -0.124154f, -0.212720f, +0.011624f, -0.000013f}, + {+0.001006f, +0.018224f, +0.038185f, -0.004418f, -0.000004f}, + {+0.005972f, -0.280246f, -0.279425f, +0.024886f, -0.000056f}, + {-0.013866f, -0.056049f, -0.470046f, -0.033031f, -0.000066f}, + {+0.002003f, -0.013997f, +0.006699f, -0.002838f, +0.000007f}, + {-0.005432f, -0.012448f, -0.193385f, -0.021709f, -0.000041f}, + {+0.002080f, -0.035733f, +0.001464f, -0.003877f, +0.000020f}, + {+0.000948f, -0.008178f, -0.047042f, -0.001214f, +0.000022f}, + {+0.008010f, -0.037066f, -0.006003f, +0.001581f, -0.000020f}, + {+0.002016f, -0.033476f, +0.072960f, +0.011160f, +0.000001f} + }, + { + {-0.031783f, -0.056831f, +0.279059f, -0.028993f, -0.000193f}, + {+0.066811f, +0.547107f, -0.401585f, +0.049258f, +0.000209f}, + {-0.014835f, -0.045923f, +0.063394f, -0.003455f, +0.000127f}, + {-0.030703f, -0.186180f, +0.047058f, -0.002768f, +0.000115f}, + {+0.020147f, +0.183472f, +0.029803f, -0.002654f, -0.000199f}, + {+0.004470f, +0.071648f, -0.045482f, +0.003212f, -0.000142f}, + {+0.003858f, +0.057272f, -0.023397f, +0.006911f, -0.000202f}, + {-0.004365f, -0.021410f, +0.013528f, -0.002517f, -0.000010f}, + {-0.011844f, +0.030236f, +0.050498f, +0.004358f, -0.000183f}, + {+0.006262f, +0.197324f, -0.174496f, +0.041478f, +0.000509f}, + {+0.000909f, -0.022088f, +0.010300f, -0.001930f, -0.000082f}, + {-0.000576f, +0.053541f, -0.096593f, +0.021942f, +0.000302f}, + {-0.001649f, -0.054620f, +0.008127f, +0.002136f, +0.000016f}, + {+0.004848f, +0.029592f, +0.000282f, +0.000006f, -0.000106f}, + {-0.010837f, -0.090950f, -0.014402f, -0.000183f, +0.000006f}, + {+0.000125f, -0.021283f, +0.064876f, -0.009148f, -0.000073f} + }, + { + {+0.115524f, -0.001880f, -0.031709f, +0.016815f, -0.000032f}, + {-0.083119f, +0.442745f, +0.062014f, -0.030630f, +0.000109f}, + {+0.026381f, -0.044427f, -0.014701f, +0.004175f, -0.000007f}, + {+0.059970f, -0.279751f, -0.022479f, +0.004671f, -0.000021f}, + {-0.025539f, +0.285695f, +0.030687f, -0.001281f, +0.000018f}, + {+0.015563f, +0.014341f, +0.021407f, -0.004386f, +0.000034f}, + {-0.005271f, +0.080088f, +0.036839f, -0.008678f, +0.000080f}, + {-0.004239f, -0.044848f, +0.005762f, +0.002882f, +0.000009f}, + {+0.051110f, +0.084066f, +0.036589f, -0.007555f, +0.000131f}, + {+0.012587f, +0.147413f, +0.020658f, -0.013969f, -0.000077f}, + {-0.003103f, -0.017462f, +0.008157f, +0.001803f, +0.000018f}, + {+0.001965f, -0.006861f, +0.032042f, -0.005627f, -0.000042f}, + {+0.003954f, -0.069529f, +0.014309f, +0.000469f, -0.000034f}, + {-0.011351f, +0.041303f, +0.021348f, +0.000056f, +0.000005f}, + {+0.003411f, -0.131943f, -0.006306f, -0.000445f, +0.000025f}, + {-0.006265f, +0.023141f, +0.008583f, +0.003180f, +0.000023f} + }, + { + {-0.170064f, -0.305557f, -0.025217f, +0.001133f, +0.000198f}, + {+0.064730f, +0.498651f, +0.047336f, -0.004429f, -0.000255f}, + {-0.023390f, -0.090206f, -0.010300f, +0.000988f, -0.000108f}, + {-0.044740f, -0.402670f, -0.013847f, +0.001569f, -0.000092f}, + {+0.008298f, +0.311166f, +0.004422f, -0.002306f, +0.000173f}, + {-0.024372f, -0.077330f, +0.000442f, -0.001491f, +0.000110f}, + {+0.006327f, +0.051079f, +0.002801f, -0.003002f, +0.000146f}, + {+0.022671f, -0.029757f, -0.017304f, +0.000691f, +0.000009f}, + {-0.067089f, -0.067084f, +0.027632f, -0.007480f, +0.000108f}, + {-0.016067f, +0.071916f, +0.031764f, -0.005887f, -0.000449f}, + {+0.001118f, -0.007300f, +0.004732f, -0.000912f, +0.000072f}, + {+0.012764f, -0.015163f, +0.034285f, -0.004782f, -0.000265f}, + {+0.002476f, -0.078915f, +0.001493f, -0.000518f, -0.000008f}, + {+0.012009f, +0.058211f, +0.005130f, -0.001142f, +0.000096f}, + {+0.017876f, -0.124879f, -0.017363f, +0.001041f, -0.000014f}, + {+0.016489f, +0.044821f, -0.013683f, +0.000199f, +0.000060f} + }, + { + {+0.031523f, -0.568562f, -0.010165f, -0.004741f, -0.000011f}, + {+0.072210f, +0.453377f, +0.012668f, +0.009988f, -0.000056f}, + {-0.013073f, -0.089526f, -0.006790f, -0.002603f, +0.000024f}, + {-0.055858f, -0.385059f, +0.007901f, -0.002683f, +0.000038f}, + {+0.048389f, +0.243348f, -0.011742f, +0.002577f, -0.000053f}, + {+0.000883f, -0.129298f, -0.003415f, +0.002563f, -0.000054f}, + {+0.004842f, +0.028248f, -0.014727f, +0.004067f, -0.000113f}, + {-0.035207f, +0.044693f, -0.000317f, -0.001511f, -0.000014f}, + {+0.027873f, -0.208313f, -0.025747f, +0.006096f, -0.000162f}, + {+0.003882f, +0.022910f, -0.004172f, +0.004195f, +0.000185f}, + {+0.007316f, -0.007332f, -0.005614f, +0.000479f, -0.000037f}, + {-0.030651f, +0.049980f, -0.004306f, +0.003095f, +0.000103f}, + {-0.012670f, -0.046258f, -0.010787f, -0.000294f, +0.000044f}, + {-0.001544f, +0.071605f, -0.001508f, +0.001151f, -0.000025f}, + {-0.039147f, -0.057668f, +0.001114f, -0.001056f, -0.000026f}, + {-0.013243f, +0.076337f, -0.002755f, -0.000535f, -0.000039f} + }, + { + {+0.207932f, -0.287807f, +0.039075f, +0.000182f, -0.000191f}, + {-0.222358f, +0.019823f, -0.045919f, +0.001569f, +0.000284f}, + {+0.051902f, +0.024897f, +0.018540f, -0.000535f, +0.000087f}, + {+0.157008f, -0.084022f, +0.015927f, -0.001511f, +0.000065f}, + {-0.104303f, +0.038679f, -0.004300f, +0.001876f, -0.000138f}, + {+0.031107f, -0.090841f, -0.009802f, +0.001340f, -0.000075f}, + {-0.026573f, -0.012360f, -0.012445f, +0.003442f, -0.000083f}, + {+0.021614f, +0.128929f, +0.008965f, -0.000458f, -0.000006f}, + {+0.022498f, -0.192805f, -0.008217f, +0.005889f, -0.000025f}, + {-0.001966f, +0.020932f, -0.017205f, +0.001490f, +0.000358f}, + {-0.013558f, -0.031486f, -0.001450f, +0.000305f, -0.000057f}, + {+0.020576f, +0.126851f, -0.015311f, +0.000876f, +0.000211f}, + {+0.011427f, -0.005250f, -0.003401f, +0.000196f, -0.000006f}, + {-0.015857f, +0.049501f, -0.003717f, +0.000601f, -0.000080f}, + {+0.034004f, +0.039429f, +0.003524f, -0.000004f, +0.000023f}, + {-0.014818f, +0.079680f, +0.007758f, +0.000184f, -0.000042f} + }, + { + {-0.203020f, +0.343926f, -0.022319f, +0.001551f, +0.000052f}, + {+0.128697f, -0.502946f, +0.012208f, -0.003598f, -0.000018f}, + {-0.021293f, +0.148245f, -0.006309f, +0.001691f, -0.000030f}, + {-0.108184f, +0.296591f, -0.010288f, +0.001875f, -0.000040f}, + {+0.072445f, -0.199735f, +0.008865f, -0.001996f, +0.000070f}, + {-0.035970f, -0.000468f, +0.003327f, -0.001758f, +0.000054f}, + {+0.022536f, -0.076991f, +0.011763f, -0.002716f, +0.000111f}, + {+0.019549f, +0.129451f, +0.001977f, +0.001130f, +0.000018f}, + {-0.040267f, -0.070315f, +0.008077f, -0.004109f, +0.000149f}, + {+0.011400f, +0.010732f, +0.007406f, -0.002026f, -0.000250f}, + {+0.002851f, -0.052737f, +0.000419f, -0.000375f, +0.000049f}, + {+0.020950f, +0.124942f, +0.003929f, -0.001693f, -0.000137f}, + {-0.002830f, +0.012262f, +0.001345f, -0.000201f, -0.000049f}, + {+0.023252f, -0.010554f, +0.006382f, -0.000870f, +0.000037f}, + {+0.002904f, +0.073991f, +0.004806f, +0.000805f, +0.000022f}, + {+0.038844f, +0.012454f, +0.000939f, +0.000294f, +0.000047f} + }, + { + {-0.104978f, +0.491439f, -0.023130f, -0.000395f, +0.000170f}, + {+0.174716f, -0.431741f, +0.037189f, -0.000731f, -0.000283f}, + {-0.071508f, +0.077184f, -0.011405f, +0.000280f, -0.000069f}, + {-0.071830f, +0.341169f, -0.016908f, +0.001162f, -0.000044f}, + {+0.046880f, -0.228632f, +0.012580f, -0.001764f, +0.000105f}, + {+0.015443f, +0.068044f, +0.005570f, -0.000844f, +0.000048f}, + {+0.020736f, -0.083339f, +0.010949f, -0.002791f, +0.000031f}, + {-0.052065f, +0.019705f, -0.009215f, +0.000218f, +0.000001f}, + {+0.033356f, +0.036658f, +0.013911f, -0.004323f, -0.000040f}, + {-0.006601f, -0.021923f, +0.013349f, -0.000309f, -0.000258f}, + {+0.019016f, -0.023410f, +0.005296f, -0.000367f, +0.000039f}, + {-0.051437f, +0.010933f, +0.004546f, +0.000118f, -0.000155f}, + {+0.002536f, +0.019548f, +0.001804f, +0.000278f, +0.000021f}, + {-0.005862f, -0.062421f, -0.001401f, -0.000650f, +0.000064f}, + {-0.033799f, +0.010290f, -0.008108f, -0.000071f, -0.000030f}, + {-0.019280f, -0.065253f, -0.001294f, -0.000391f, +0.000024f} + }, + { + {+0.271163f, -0.091653f, +0.035807f, -0.000730f, -0.000085f}, + {-0.261169f, +0.235971f, -0.033757f, +0.001621f, +0.000093f}, + {+0.095839f, -0.182710f, +0.015397f, -0.001103f, +0.000028f}, + {+0.156712f, -0.007300f, +0.019789f, -0.001371f, +0.000033f}, + {-0.111926f, +0.011250f, -0.016908f, +0.001748f, -0.000072f}, + {+0.005469f, +0.082676f, -0.002169f, +0.001143f, -0.000043f}, + {-0.049695f, +0.016110f, -0.010723f, +0.002011f, -0.000086f}, + {+0.031235f, -0.105162f, +0.004404f, -0.000861f, -0.000020f}, + {-0.012529f, +0.088572f, -0.009833f, +0.002839f, -0.000106f}, + {-0.012620f, -0.018407f, -0.006593f, +0.002080f, +0.000273f}, + {-0.020511f, +0.042167f, -0.004809f, +0.000322f, -0.000054f}, + {+0.032247f, -0.119711f, +0.002446f, +0.001305f, +0.000148f}, + {-0.004589f, +0.033907f, -0.002233f, +0.000259f, +0.000047f}, + {-0.024243f, -0.043735f, -0.001053f, +0.000816f, -0.000043f}, + {+0.018051f, -0.070970f, +0.002759f, -0.000690f, -0.000016f}, + {-0.025928f, -0.049597f, -0.005106f, -0.000174f, -0.000047f} + }, + { + {-0.009292f, -0.523511f, +0.005609f, +0.000701f, -0.000140f}, + {-0.049598f, +0.562660f, -0.018307f, -0.000353f, +0.000250f}, + {+0.026674f, -0.300653f, +0.000453f, -0.000226f, +0.000059f}, + {-0.025200f, -0.281197f, +0.004191f, -0.000792f, +0.000032f}, + {+0.023452f, +0.216602f, -0.003361f, +0.001302f, -0.000079f}, + {-0.022798f, +0.048857f, -0.002028f, +0.000528f, -0.000034f}, + {+0.017850f, +0.123147f, -0.004163f, +0.001736f, -0.000002f}, + {+0.030232f, -0.106769f, +0.006484f, -0.000160f, +0.000004f}, + {-0.027081f, +0.068469f, -0.013975f, +0.002765f, +0.000074f}, + {+0.015824f, +0.032277f, -0.008777f, -0.000341f, +0.000168f}, + {-0.010909f, +0.060681f, -0.000865f, +0.000330f, -0.000023f}, + {+0.018513f, -0.140495f, -0.006788f, -0.000319f, +0.000106f}, + {-0.009128f, +0.032657f, +0.001038f, -0.000299f, -0.000035f}, + {+0.030409f, +0.035966f, +0.000871f, +0.000497f, -0.000049f}, + {+0.024037f, -0.062735f, +0.004854f, -0.000003f, +0.000033f}, + {+0.031906f, +0.040222f, +0.004969f, +0.000300f, -0.000009f} + }, + { + {-0.274242f, -0.111152f, -0.038437f, +0.000541f, +0.000106f}, + {+0.297362f, +0.028772f, +0.040257f, -0.001002f, -0.000153f}, + {-0.157861f, -0.028386f, -0.015885f, +0.000932f, -0.000023f}, + {-0.130190f, -0.116848f, -0.020017f, +0.001091f, -0.000023f}, + {+0.100486f, +0.097500f, +0.017137f, -0.001413f, +0.000066f}, + {+0.042930f, -0.041353f, +0.001818f, -0.000969f, +0.000030f}, + {+0.035539f, +0.107479f, +0.005226f, -0.001521f, +0.000054f}, + {-0.056245f, +0.022881f, -0.006748f, +0.000737f, +0.000020f}, + {+0.051781f, -0.041176f, +0.012387f, -0.002184f, +0.000054f}, + {+0.005351f, +0.056149f, +0.003091f, -0.002220f, -0.000265f}, + {+0.035484f, -0.008203f, +0.004198f, -0.000217f, +0.000054f}, + {-0.049383f, -0.039088f, -0.002024f, -0.001275f, -0.000143f}, + {+0.027963f, -0.019171f, +0.001212f, -0.000337f, -0.000040f}, + {+0.004231f, +0.075991f, +0.001119f, -0.000670f, +0.000043f}, + {-0.028326f, +0.016304f, -0.003947f, +0.000597f, +0.000009f}, + {+0.014165f, +0.065014f, +0.003473f, +0.000208f, +0.000042f} + }, + { + {+0.100761f, +0.468705f, +0.009523f, -0.000855f, +0.000106f}, + {-0.068322f, -0.534398f, +0.000794f, +0.001015f, -0.000195f}, + {+0.100085f, +0.366003f, +0.010962f, +0.000114f, -0.000054f}, + {+0.079789f, +0.208939f, +0.006983f, +0.000516f, -0.000029f}, + {-0.074868f, -0.177414f, -0.007217f, -0.000977f, +0.000063f}, + {-0.040080f, -0.169063f, -0.003424f, -0.000213f, +0.000031f}, + {-0.047852f, -0.014657f, +0.004244f, -0.000996f, -0.000005f}, + {+0.004688f, +0.112753f, -0.003849f, +0.000122f, -0.000008f}, + {-0.009956f, -0.138804f, +0.008769f, -0.001626f, -0.000077f}, + {-0.022634f, +0.009810f, +0.007400f, +0.000511f, -0.000099f}, + {-0.010732f, -0.077733f, -0.000399f, -0.000274f, +0.000009f}, + {+0.039390f, +0.089325f, +0.008313f, +0.000351f, -0.000070f}, + {-0.019067f, -0.090342f, -0.002768f, +0.000205f, +0.000044f}, + {-0.042005f, +0.002738f, -0.004159f, -0.000376f, +0.000037f}, + {-0.016073f, +0.032695f, -0.005232f, +0.000105f, -0.000033f}, + {-0.040117f, -0.022661f, -0.007858f, -0.000231f, -0.000002f} + }, + { + {+0.246756f, +0.241170f, +0.035479f, -0.000554f, -0.000114f}, + {-0.272424f, -0.216540f, -0.039997f, +0.001031f, +0.000186f}, + {+0.100824f, +0.372627f, +0.007492f, -0.000845f, +0.000020f}, + {+0.086728f, +0.200706f, +0.013419f, -0.000947f, +0.000014f}, + {-0.067471f, -0.194793f, -0.010208f, +0.001216f, -0.000058f}, + {-0.018637f, -0.214052f, +0.004837f, +0.000884f, -0.000020f}, + {+0.025584f, -0.127835f, -0.000911f, +0.001401f, -0.000028f}, + {+0.056339f, +0.027855f, +0.010673f, -0.000579f, -0.000019f}, + {-0.060859f, -0.070229f, -0.011217f, +0.002123f, -0.000013f}, + {+0.014798f, -0.052375f, -0.000623f, +0.002191f, +0.000241f}, + {-0.034285f, -0.039743f, -0.005351f, +0.000109f, -0.000050f}, + {-0.007201f, +0.159482f, -0.003886f, +0.001201f, +0.000130f}, + {-0.020187f, -0.092383f, +0.000382f, +0.000354f, +0.000030f}, + {+0.028788f, -0.109693f, +0.004153f, +0.000525f, -0.000041f}, + {+0.036625f, -0.054073f, +0.008577f, -0.000524f, -0.000003f}, + {-0.002610f, -0.084126f, +0.000986f, -0.000174f, -0.000035f} + }, + { + {-0.167535f, -0.399812f, -0.020854f, +0.000806f, -0.000074f}, + {+0.145635f, +0.430918f, +0.013134f, -0.001141f, +0.000134f}, + {-0.184602f, -0.052096f, -0.013909f, -0.000043f, +0.000053f}, + {-0.110131f, -0.103022f, -0.011251f, -0.000423f, +0.000031f}, + {+0.114138f, +0.085208f, +0.011213f, +0.000798f, -0.000055f}, + {+0.095938f, -0.054666f, +0.000697f, +0.000059f, -0.000033f}, + {-0.000204f, -0.169483f, -0.009146f, +0.000575f, -0.000003f}, + {-0.030090f, -0.112432f, -0.004382f, -0.000216f, +0.000011f}, + {+0.053018f, +0.105332f, -0.004066f, +0.000908f, +0.000060f}, + {+0.009119f, -0.057095f, -0.007675f, -0.000456f, +0.000052f}, + {+0.027961f, +0.057568f, +0.003773f, +0.000262f, +0.000002f}, + {-0.030433f, +0.136477f, -0.002756f, -0.000256f, +0.000046f}, + {+0.049955f, +0.009293f, +0.002856f, -0.000133f, -0.000047f}, + {+0.028171f, -0.112646f, +0.000816f, +0.000380f, -0.000028f}, + {+0.014607f, -0.096614f, -0.000430f, -0.000147f, +0.000031f}, + {+0.051182f, -0.003494f, +0.006796f, +0.000143f, +0.000008f} + }, + { + {-0.208650f, -0.335847f, -0.029770f, +0.000608f, +0.000111f}, + {+0.234234f, +0.291735f, +0.035875f, -0.001265f, -0.000192f}, + {+0.043525f, -0.386017f, -0.001141f, +0.000753f, -0.000019f}, + {-0.024332f, -0.238532f, -0.004594f, +0.000982f, -0.000011f}, + {+0.003204f, +0.260777f, +0.001135f, -0.001218f, +0.000051f}, + {-0.094495f, +0.222636f, -0.006686f, -0.000805f, +0.000016f}, + {-0.041620f, -0.113126f, +0.003804f, -0.001425f, +0.000014f}, + {-0.059468f, -0.070637f, -0.008480f, +0.000599f, +0.000018f}, + {+0.037218f, +0.133212f, +0.009087f, -0.002277f, -0.000009f}, + {-0.028004f, +0.004399f, -0.001485f, -0.002043f, -0.000214f}, + {+0.030214f, +0.052517f, +0.005355f, -0.000063f, +0.000045f}, + {+0.064016f, +0.008538f, +0.001790f, -0.001210f, -0.000117f}, + {-0.035765f, +0.136937f, -0.003958f, -0.000288f, -0.000023f}, + {-0.055646f, +0.013868f, -0.004689f, -0.000551f, +0.000038f}, + {-0.069712f, +0.026129f, -0.007603f, +0.000472f, -0.000000f}, + {-0.022298f, +0.108549f, -0.003048f, +0.000134f, +0.000029f} + }, + { + {+0.220027f, +0.326004f, +0.029195f, -0.000639f, +0.000050f}, + {-0.196112f, -0.377527f, -0.024063f, +0.000894f, -0.000082f}, + {+0.120792f, -0.254914f, +0.016146f, +0.000093f, -0.000054f}, + {+0.094942f, -0.058645f, +0.007709f, +0.000309f, -0.000035f}, + {-0.109837f, +0.090094f, -0.008580f, -0.000595f, +0.000051f}, + {-0.015004f, +0.336419f, +0.000747f, -0.000099f, +0.000037f}, + {+0.088851f, +0.073948f, +0.011663f, -0.000480f, +0.000014f}, + {+0.078671f, +0.147609f, +0.010996f, +0.000157f, -0.000013f}, + {-0.073075f, -0.041998f, -0.000840f, -0.000593f, -0.000038f}, + {+0.021795f, +0.078114f, +0.010687f, +0.000406f, -0.000022f}, + {-0.048839f, -0.075397f, -0.009105f, -0.000275f, -0.000010f}, + {-0.060558f, -0.174519f, -0.000133f, +0.000349f, -0.000030f}, + {-0.014867f, +0.171348f, +0.000948f, +0.000119f, +0.000048f}, + {+0.011606f, +0.111954f, +0.001552f, -0.000324f, +0.000023f}, + {+0.032653f, +0.181837f, +0.003210f, +0.000081f, -0.000029f}, + {-0.047749f, +0.068914f, -0.006585f, -0.000128f, -0.000011f} + }, + { + {+0.160319f, +0.417913f, +0.022833f, -0.000655f, -0.000102f}, + {-0.203183f, -0.369192f, -0.029570f, +0.001470f, +0.000179f}, + {-0.099428f, +0.084211f, -0.009701f, -0.000901f, +0.000019f}, + {-0.024797f, +0.121541f, +0.001449f, -0.000997f, +0.000010f}, + {+0.062623f, -0.173224f, +0.004907f, +0.001276f, -0.000047f}, + {+0.122967f, +0.126986f, +0.011441f, +0.000914f, -0.000015f}, + {-0.052738f, +0.283556f, -0.009426f, +0.001548f, -0.000011f}, + {+0.026749f, +0.238083f, -0.000760f, -0.000643f, -0.000018f}, + {-0.009777f, -0.145605f, -0.003329f, +0.002400f, +0.000014f}, + {+0.015861f, +0.086444f, -0.001699f, +0.001895f, +0.000191f}, + {-0.021170f, -0.125446f, +0.000128f, +0.000133f, -0.000040f}, + {-0.009541f, -0.253886f, +0.000901f, +0.000985f, +0.000105f}, + {+0.062589f, +0.060931f, +0.003167f, +0.000273f, +0.000019f}, + {+0.045937f, +0.052228f, +0.008096f, +0.000661f, -0.000035f}, + {+0.065525f, +0.132007f, +0.007909f, -0.000377f, +0.000001f}, + {+0.049219f, -0.081032f, +0.007172f, +0.000024f, -0.000024f} + }, + { + {-0.257389f, -0.225050f, -0.034043f, +0.000536f, -0.000034f}, + {+0.247632f, +0.326555f, +0.030602f, -0.000692f, +0.000048f}, + {-0.031117f, +0.179461f, -0.007189f, +0.000264f, +0.000055f}, + {-0.035804f, +0.099360f, -0.004701f, -0.000140f, +0.000038f}, + {+0.050312f, -0.188989f, +0.003722f, +0.000209f, -0.000050f}, + {-0.100154f, -0.206241f, -0.011197f, -0.000132f, -0.000040f}, + {-0.083770f, +0.242079f, -0.010883f, +0.000381f, -0.000023f}, + {-0.128871f, +0.005839f, -0.011060f, +0.000130f, +0.000016f}, + {+0.079686f, -0.004748f, +0.001794f, +0.000421f, +0.000023f}, + {-0.049708f, -0.006526f, -0.011594f, -0.000511f, +0.000001f}, + {+0.089665f, +0.042291f, +0.010250f, +0.000131f, +0.000016f}, + {+0.097341f, -0.094533f, +0.003394f, -0.000253f, +0.000020f}, + {-0.063601f, -0.124244f, -0.005358f, -0.000329f, -0.000050f}, + {-0.033103f, -0.074639f, -0.008297f, +0.000018f, -0.000018f}, + {-0.088809f, -0.106459f, -0.010306f, +0.000001f, +0.000028f}, + {+0.024983f, -0.120136f, +0.002311f, -0.000104f, +0.000013f} + }, + { + {-0.103698f, -0.459883f, -0.015029f, +0.000609f, +0.000094f}, + {+0.162130f, +0.457377f, +0.023723f, -0.001331f, -0.000162f}, + {+0.064814f, +0.022691f, +0.012901f, +0.000560f, -0.000021f}, + {+0.014719f, +0.018235f, +0.000043f, +0.000822f, -0.000013f}, + {-0.074601f, +0.003099f, -0.007367f, -0.000899f, +0.000047f}, + {-0.032786f, -0.305719f, -0.004336f, -0.000704f, +0.000017f}, + {+0.154173f, -0.111921f, +0.017036f, -0.001496f, +0.000014f}, + {+0.075072f, -0.308164f, +0.011544f, +0.000327f, +0.000019f}, + {-0.016061f, +0.143722f, +0.001013f, -0.002196f, -0.000011f}, + {+0.025959f, -0.115431f, +0.002496f, -0.001721f, -0.000173f}, + {-0.041136f, +0.248497f, -0.009339f, -0.000010f, +0.000035f}, + {-0.096543f, +0.197881f, -0.009153f, -0.000920f, -0.000096f}, + {+0.003482f, -0.225559f, +0.000330f, -0.000071f, -0.000017f}, + {-0.034753f, -0.075563f, -0.003521f, -0.000361f, +0.000033f}, + {-0.012501f, -0.228861f, +0.001789f, +0.000220f, -0.000002f}, + {-0.060118f, +0.006012f, -0.006537f, +0.000205f, +0.000020f} + }, + { + {+0.272901f, +0.120676f, +0.037748f, -0.000537f, +0.000024f}, + {-0.297115f, -0.254096f, -0.039956f, +0.000532f, -0.000029f}, + {+0.012561f, -0.060035f, +0.001952f, -0.000137f, -0.000057f}, + {-0.010704f, -0.021303f, -0.001694f, +0.000133f, -0.000041f}, + {+0.011296f, +0.129516f, +0.000519f, -0.000384f, +0.000049f}, + {+0.122480f, -0.073347f, +0.013051f, +0.000154f, +0.000043f}, + {-0.027641f, -0.385713f, +0.003287f, -0.000254f, +0.000026f}, + {+0.091871f, -0.289596f, +0.005177f, +0.000144f, -0.000020f}, + {-0.076925f, +0.038077f, -0.006550f, -0.000475f, -0.000017f}, + {+0.038364f, -0.096477f, +0.011620f, +0.000633f, +0.000016f}, + {-0.083812f, +0.194659f, -0.004197f, -0.000207f, -0.000021f}, + {-0.014333f, +0.322027f, +0.003857f, +0.000214f, -0.000012f}, + {+0.069724f, -0.130370f, +0.003481f, +0.000262f, +0.000055f}, + {+0.055755f, +0.063207f, +0.009924f, -0.000154f, +0.000014f}, + {+0.116659f, -0.036299f, +0.011120f, +0.000178f, -0.000028f}, + {+0.003252f, +0.097067f, -0.002843f, -0.000113f, -0.000015f} + }, + { + {+0.054050f, +0.455222f, +0.008683f, -0.000439f, -0.000087f}, + {-0.103203f, -0.556970f, -0.012926f, +0.001069f, +0.000150f}, + {-0.045598f, +0.034469f, -0.010843f, -0.000589f, +0.000024f}, + {+0.039968f, -0.100631f, +0.007931f, -0.000653f, +0.000016f}, + {+0.036140f, +0.084377f, +0.005388f, +0.000960f, -0.000048f}, + {-0.073377f, +0.218074f, -0.003890f, +0.000548f, -0.000019f}, + {-0.139694f, -0.217657f, -0.014427f, +0.001226f, -0.000017f}, + {-0.165152f, +0.096949f, -0.015920f, -0.000710f, -0.000018f}, + {+0.031303f, -0.142424f, +0.007473f, +0.002097f, +0.000008f}, + {-0.049659f, +0.036455f, -0.006360f, +0.001588f, +0.000158f}, + {+0.120231f, -0.105131f, +0.009262f, +0.000134f, -0.000029f}, + {+0.112765f, +0.136113f, +0.006454f, +0.000956f, +0.000090f}, + {-0.075212f, +0.079481f, -0.002605f, +0.000191f, +0.000013f}, + {+0.010244f, +0.133401f, +0.001533f, +0.000399f, -0.000031f}, + {-0.084844f, +0.273648f, -0.011540f, -0.000496f, +0.000003f}, + {+0.047604f, +0.022269f, +0.009154f, -0.000024f, -0.000017f} + }, + { + {-0.277495f, -0.057148f, -0.039168f, +0.000475f, -0.000017f}, + {+0.335782f, +0.115073f, +0.042124f, -0.000524f, +0.000017f}, + {-0.014669f, +0.088939f, +0.001371f, +0.000122f, +0.000060f}, + {+0.009872f, -0.151750f, -0.001271f, -0.000309f, +0.000043f}, + {-0.029086f, -0.017821f, -0.006048f, +0.000346f, -0.000049f}, + {-0.042390f, +0.261438f, -0.007011f, +0.000009f, -0.000045f}, + {+0.104924f, +0.146847f, +0.003710f, +0.000271f, -0.000026f}, + {+0.039062f, +0.403951f, +0.006577f, +0.000208f, +0.000025f}, + {+0.091871f, -0.050822f, +0.003447f, +0.000141f, +0.000018f}, + {-0.018408f, +0.085038f, -0.009119f, -0.000628f, -0.000033f}, + {-0.008166f, -0.290055f, +0.001289f, +0.000009f, +0.000025f}, + {-0.083446f, -0.145097f, -0.006817f, -0.000355f, +0.000005f}, + {+0.001946f, +0.186834f, -0.001987f, -0.000254f, -0.000062f}, + {-0.073121f, +0.003981f, -0.011768f, +0.000112f, -0.000011f}, + {-0.055297f, +0.324881f, -0.002032f, +0.000100f, +0.000030f}, + {-0.005812f, -0.063805f, -0.001869f, -0.000040f, +0.000017f} + }, + { + {-0.014583f, -0.461985f, -0.000589f, +0.000415f, +0.000084f}, + {+0.018754f, +0.598224f, +0.004168f, -0.000868f, -0.000145f}, + {+0.055019f, -0.010592f, +0.005290f, +0.000633f, -0.000030f}, + {-0.104242f, +0.017058f, -0.011823f, +0.000782f, -0.000020f}, + {+0.000800f, -0.063354f, +0.000572f, -0.000962f, +0.000051f}, + {+0.090619f, +0.057573f, +0.010215f, -0.000723f, +0.000024f}, + {+0.065017f, +0.191423f, +0.017537f, -0.001148f, +0.000017f}, + {+0.139685f, +0.247968f, +0.017011f, +0.000519f, +0.000015f}, + {-0.081755f, +0.219112f, -0.011774f, -0.001680f, -0.000011f}, + {+0.055793f, -0.030364f, +0.009245f, -0.001646f, -0.000143f}, + {-0.108310f, -0.127663f, -0.016687f, +0.000038f, +0.000024f}, + {-0.021618f, -0.220697f, -0.010039f, -0.000820f, -0.000085f}, + {+0.057142f, +0.095325f, +0.009328f, -0.000335f, -0.000006f}, + {+0.036537f, -0.167818f, +0.005791f, -0.000423f, +0.000028f}, + {+0.142336f, +0.030915f, +0.012827f, +0.000283f, -0.000005f}, + {-0.054469f, +0.008573f, -0.006883f, +0.000115f, +0.000013f} + }, + { + {+0.285346f, -0.000721f, +0.040577f, -0.000527f, +0.000010f}, + {-0.330415f, +0.056420f, -0.045563f, +0.000643f, -0.000004f}, + {-0.012995f, -0.109088f, -0.001469f, -0.000116f, -0.000061f}, + {+0.054559f, +0.256864f, +0.005920f, +0.000204f, -0.000044f}, + {+0.023615f, -0.028111f, +0.005911f, -0.000294f, +0.000047f}, + {-0.037741f, -0.135965f, +0.001385f, +0.000118f, +0.000047f}, + {-0.085123f, -0.059304f, -0.014815f, -0.000093f, +0.000026f}, + {-0.148478f, -0.190646f, -0.017151f, -0.000040f, -0.000030f}, + {-0.071070f, +0.234644f, +0.000090f, +0.000012f, -0.000018f}, + {+0.012169f, -0.103078f, +0.005526f, +0.000708f, +0.000048f}, + {+0.074830f, +0.156990f, +0.009538f, -0.000116f, -0.000028f}, + {+0.062857f, -0.082116f, +0.012816f, +0.000338f, +0.000001f}, + {-0.030566f, -0.039000f, -0.001188f, +0.000200f, +0.000068f}, + {+0.059034f, -0.139462f, +0.005767f, +0.000011f, +0.000009f}, + {-0.076286f, -0.295015f, -0.006131f, +0.000097f, -0.000032f}, + {+0.020240f, +0.124242f, +0.005046f, +0.000022f, -0.000019f} + }, + { + {-0.029891f, +0.483300f, -0.005377f, -0.000391f, -0.000081f}, + {+0.047047f, -0.524471f, +0.005924f, +0.000814f, +0.000145f}, + {-0.033704f, -0.078188f, -0.004373f, -0.000586f, +0.000038f}, + {+0.113469f, +0.163524f, +0.016393f, -0.000689f, +0.000025f}, + {-0.026484f, +0.050686f, -0.004980f, +0.000903f, -0.000054f}, + {-0.034959f, -0.130515f, -0.008100f, +0.000616f, -0.000030f}, + {-0.066335f, -0.098213f, -0.008880f, +0.001011f, -0.000017f}, + {-0.023755f, -0.374088f, -0.006475f, -0.000645f, -0.000010f}, + {+0.134342f, -0.080266f, +0.017137f, +0.001581f, +0.000017f}, + {-0.074905f, +0.029652f, -0.011288f, +0.001578f, +0.000126f}, + {+0.054496f, +0.184572f, +0.009789f, +0.000066f, -0.000019f}, + {-0.016479f, +0.037096f, +0.001911f, +0.000841f, +0.000081f}, + {-0.021095f, -0.045463f, -0.006941f, +0.000367f, -0.000005f}, + {-0.086237f, +0.078591f, -0.009216f, +0.000337f, -0.000026f}, + {-0.069456f, -0.298926f, -0.009331f, -0.000395f, +0.000009f}, + {+0.062149f, +0.062591f, +0.008033f, -0.000068f, -0.000009f} + }, + { + {-0.287720f, +0.086727f, -0.040473f, +0.000543f, -0.000002f}, + {+0.307994f, -0.118968f, +0.043852f, -0.000752f, -0.000013f}, + {+0.022546f, +0.002148f, +0.001070f, +0.000030f, +0.000061f}, + {-0.122549f, -0.198231f, -0.013063f, -0.000256f, +0.000044f}, + {-0.010325f, +0.076779f, -0.004480f, +0.000277f, -0.000045f}, + {+0.047884f, +0.004957f, +0.004446f, -0.000008f, -0.000047f}, + {+0.101276f, +0.163028f, +0.013822f, +0.000017f, -0.000028f}, + {+0.155414f, -0.094864f, +0.020739f, +0.000087f, +0.000033f}, + {+0.000170f, -0.277663f, -0.004084f, -0.000303f, +0.000013f}, + {+0.006631f, +0.159391f, -0.003115f, -0.000670f, -0.000060f}, + {-0.094163f, -0.047695f, -0.013081f, +0.000014f, +0.000031f}, + {-0.015662f, +0.033250f, -0.008826f, -0.000442f, -0.000008f}, + {+0.006909f, +0.002414f, +0.001228f, -0.000038f, -0.000070f}, + {+0.006389f, +0.219286f, -0.001425f, -0.000018f, -0.000007f}, + {+0.134427f, +0.013316f, +0.014160f, -0.000072f, +0.000032f}, + {-0.053148f, -0.113719f, -0.007802f, -0.000103f, +0.000020f} + }, + { + {+0.079885f, -0.476239f, +0.011873f, +0.000403f, +0.000078f}, + {-0.090327f, +0.495394f, -0.013216f, -0.000916f, -0.000142f}, + {+0.000547f, +0.029987f, +0.004365f, +0.000538f, -0.000045f}, + {-0.078456f, -0.260754f, -0.012403f, +0.000685f, -0.000030f}, + {+0.048231f, -0.015397f, +0.007225f, -0.000847f, +0.000058f}, + {-0.004788f, +0.088135f, -0.001735f, -0.000622f, +0.000036f}, + {+0.068597f, +0.218020f, +0.007943f, -0.001019f, +0.000017f}, + {-0.078771f, +0.264267f, -0.009097f, +0.000536f, +0.000005f}, + {-0.131816f, -0.067791f, -0.019315f, -0.001572f, -0.000023f}, + {+0.095197f, +0.024052f, +0.012511f, -0.001509f, -0.000110f}, + {-0.005662f, -0.184911f, -0.000567f, -0.000000f, +0.000014f}, + {-0.009469f, +0.021505f, -0.002081f, -0.000772f, -0.000077f}, + {+0.033042f, -0.040492f, +0.006178f, -0.000358f, +0.000017f}, + {+0.078726f, +0.109328f, +0.007889f, -0.000339f, +0.000024f}, + {-0.046322f, +0.287690f, -0.005571f, +0.000332f, -0.000013f}, + {-0.044568f, -0.127346f, -0.006458f, +0.000067f, +0.000005f} + }, + { + {+0.276202f, -0.173485f, +0.038792f, -0.000516f, -0.000006f}, + {-0.290883f, +0.185607f, -0.040080f, +0.000773f, +0.000032f}, + {+0.006320f, +0.034810f, -0.001793f, -0.000042f, -0.000058f}, + {+0.162615f, +0.113765f, +0.021156f, +0.000233f, -0.000044f}, + {-0.015723f, -0.117462f, -0.000807f, -0.000218f, +0.000042f}, + {-0.035133f, +0.040557f, -0.002714f, +0.000053f, +0.000045f}, + {-0.149176f, -0.117916f, -0.017638f, +0.000076f, +0.000032f}, + {-0.096551f, +0.235346f, -0.015008f, -0.000034f, -0.000033f}, + {+0.060894f, +0.224376f, +0.012831f, +0.000523f, -0.000005f}, + {-0.046438f, -0.197810f, -0.002809f, +0.000665f, +0.000069f}, + {+0.091389f, -0.035774f, +0.012879f, -0.000048f, -0.000034f}, + {+0.015830f, +0.061261f, +0.007852f, +0.000438f, +0.000014f}, + {+0.002026f, -0.092831f, -0.002527f, +0.000001f, +0.000068f}, + {-0.065981f, -0.109512f, -0.004136f, +0.000073f, +0.000006f}, + {-0.096454f, +0.210224f, -0.012022f, +0.000110f, -0.000032f}, + {+0.076635f, +0.057848f, +0.009841f, +0.000158f, -0.000021f} + }, + { + {-0.125058f, +0.440590f, -0.018260f, -0.000430f, -0.000074f}, + {+0.130636f, -0.461671f, +0.019013f, +0.001042f, +0.000135f}, + {-0.005358f, +0.049252f, -0.002302f, -0.000396f, +0.000051f}, + {+0.032652f, +0.314396f, +0.003878f, -0.000647f, +0.000035f}, + {-0.057782f, -0.056244f, -0.005456f, +0.000765f, -0.000061f}, + {+0.029537f, -0.058278f, +0.004239f, +0.000490f, -0.000041f}, + {-0.028429f, -0.304901f, -0.002344f, +0.001021f, -0.000019f}, + {+0.130605f, -0.114123f, +0.015550f, -0.000447f, -0.000002f}, + {+0.097618f, +0.163746f, +0.014826f, +0.001576f, +0.000024f}, + {-0.095269f, -0.125227f, -0.010570f, +0.001415f, +0.000094f}, + {-0.036826f, +0.161036f, -0.004519f, +0.000009f, -0.000008f}, + {+0.033206f, +0.037588f, +0.003181f, +0.000776f, +0.000072f}, + {-0.072280f, +0.019767f, -0.008230f, +0.000211f, -0.000025f}, + {-0.018897f, -0.179348f, -0.001641f, +0.000298f, -0.000022f}, + {+0.125361f, -0.129557f, +0.014806f, -0.000290f, +0.000016f}, + {+0.013372f, +0.152966f, +0.003485f, -0.000081f, -0.000000f} + }, + { + {-0.255232f, +0.238323f, -0.036506f, +0.000482f, +0.000012f}, + {+0.271075f, -0.243750f, +0.037165f, -0.000660f, -0.000051f}, + {-0.023107f, +0.018988f, -0.002567f, +0.000111f, +0.000056f}, + {-0.186496f, -0.022822f, -0.024016f, -0.000167f, +0.000044f}, + {+0.051695f, +0.108630f, +0.002988f, +0.000126f, -0.000040f}, + {+0.009503f, -0.085941f, +0.000815f, -0.000139f, -0.000044f}, + {+0.180203f, +0.018265f, +0.021900f, -0.000114f, -0.000036f}, + {+0.016842f, -0.287897f, +0.004711f, +0.000063f, +0.000033f}, + {-0.099412f, -0.136019f, -0.018932f, -0.000549f, -0.000004f}, + {+0.093434f, +0.165866f, +0.008284f, -0.000735f, -0.000077f}, + {-0.070607f, +0.107384f, -0.011250f, +0.000036f, +0.000037f}, + {-0.051205f, -0.088169f, -0.009120f, -0.000422f, -0.000021f}, + {+0.038077f, +0.190808f, +0.007278f, -0.000071f, -0.000066f}, + {+0.068484f, -0.044857f, +0.006706f, -0.000103f, -0.000005f}, + {+0.001471f, -0.319381f, +0.000965f, -0.000110f, +0.000032f}, + {-0.082910f, +0.001623f, -0.012705f, -0.000176f, +0.000021f} + }, + { + {+0.160937f, -0.399834f, +0.024221f, +0.000432f, +0.000069f}, + {-0.165837f, +0.426649f, -0.024449f, -0.001120f, -0.000123f}, + {+0.023251f, -0.053963f, +0.006296f, +0.000280f, -0.000056f}, + {+0.026012f, -0.349222f, +0.003958f, +0.000583f, -0.000040f}, + {+0.039815f, +0.122590f, +0.005933f, -0.000681f, +0.000065f}, + {-0.034180f, -0.017407f, -0.005868f, -0.000354f, +0.000044f}, + {-0.036119f, +0.354110f, -0.007651f, -0.001004f, +0.000024f}, + {-0.131608f, -0.060108f, -0.015438f, +0.000373f, +0.000002f}, + {-0.047240f, -0.215086f, -0.007922f, -0.001603f, -0.000021f}, + {+0.065165f, +0.208130f, +0.007649f, -0.001302f, -0.000078f}, + {+0.065730f, -0.103768f, +0.008899f, +0.000008f, +0.000000f}, + {-0.017223f, -0.140007f, -0.001227f, -0.000774f, -0.000066f}, + {+0.083700f, +0.123118f, +0.007692f, -0.000085f, +0.000029f}, + {-0.033766f, +0.111436f, -0.004405f, -0.000238f, +0.000019f}, + {-0.130713f, -0.118837f, -0.014005f, +0.000285f, -0.000018f}, + {+0.016465f, -0.154956f, +0.002867f, +0.000097f, -0.000004f} + }, + { + {+0.233948f, -0.286085f, +0.033289f, -0.000467f, -0.000018f}, + {-0.251749f, +0.291487f, -0.034882f, +0.000530f, +0.000064f}, + {+0.025018f, -0.051984f, +0.002062f, -0.000213f, -0.000058f}, + {+0.182278f, -0.109310f, +0.023310f, +0.000129f, -0.000046f}, + {-0.065186f, -0.041803f, -0.007285f, -0.000055f, +0.000040f}, + {+0.015347f, +0.057135f, +0.002287f, +0.000244f, +0.000046f}, + {-0.178612f, +0.136904f, -0.019882f, +0.000114f, +0.000039f}, + {+0.053858f, +0.222770f, +0.004143f, -0.000170f, -0.000036f}, + {+0.110687f, +0.021864f, +0.019313f, +0.000540f, +0.000009f}, + {-0.120059f, -0.080527f, -0.013286f, +0.000793f, +0.000086f}, + {+0.042102f, -0.139525f, +0.007143f, +0.000010f, -0.000040f}, + {+0.075712f, -0.002196f, +0.010631f, +0.000380f, +0.000025f}, + {-0.101650f, -0.158974f, -0.013076f, +0.000245f, +0.000069f}, + {-0.030059f, +0.115541f, -0.003547f, +0.000111f, +0.000004f}, + {+0.094721f, +0.222768f, +0.008889f, +0.000048f, -0.000033f}, + {+0.083573f, -0.053860f, +0.010877f, +0.000192f, -0.000022f} + }, + { + {-0.194975f, +0.371746f, -0.029687f, -0.000407f, -0.000065f}, + {+0.199395f, -0.402227f, +0.030381f, +0.001070f, +0.000111f}, + {-0.043558f, +0.051835f, -0.007510f, -0.000301f, +0.000063f}, + {-0.080069f, +0.290708f, -0.009721f, -0.000585f, +0.000048f}, + {-0.028118f, -0.096712f, -0.004235f, +0.000661f, -0.000071f}, + {+0.020670f, +0.048284f, +0.004447f, +0.000361f, -0.000049f}, + {+0.106751f, -0.298076f, +0.013906f, +0.000980f, -0.000031f}, + {+0.091450f, +0.162172f, +0.012475f, -0.000348f, -0.000002f}, + {-0.007498f, +0.199756f, +0.002586f, +0.001500f, +0.000016f}, + {-0.027250f, -0.222848f, -0.002393f, +0.001277f, +0.000059f}, + {-0.083457f, +0.055583f, -0.011895f, -0.000049f, +0.000010f}, + {-0.023912f, +0.145973f, -0.001523f, +0.000736f, +0.000060f}, + {-0.039347f, -0.252351f, -0.003368f, +0.000088f, -0.000034f}, + {+0.047081f, -0.002879f, +0.005773f, +0.000201f, -0.000016f}, + {+0.061353f, +0.270295f, +0.008425f, -0.000276f, +0.000021f}, + {-0.056743f, +0.162677f, -0.007387f, -0.000128f, +0.000010f} + }, + { + {-0.209644f, +0.348707f, -0.029121f, +0.000472f, +0.000023f}, + {+0.234739f, -0.346303f, +0.031613f, -0.000452f, -0.000075f}, + {-0.012221f, +0.097631f, -0.001448f, +0.000286f, +0.000064f}, + {-0.151155f, +0.176475f, -0.021969f, -0.000127f, +0.000048f}, + {+0.074908f, +0.067483f, +0.011111f, +0.000037f, -0.000040f}, + {-0.024868f, -0.020084f, -0.003583f, -0.000348f, -0.000052f}, + {+0.132213f, -0.252477f, +0.017287f, -0.000139f, -0.000041f}, + {-0.086895f, -0.114633f, -0.010835f, +0.000242f, +0.000044f}, + {-0.087061f, +0.080457f, -0.017193f, -0.000553f, -0.000009f}, + {+0.128529f, +0.021349f, +0.015609f, -0.000805f, -0.000095f}, + {-0.009730f, +0.170684f, -0.001530f, -0.000070f, +0.000041f}, + {-0.063989f, +0.082569f, -0.011861f, -0.000327f, -0.000027f}, + {+0.131743f, +0.010936f, +0.017709f, -0.000376f, -0.000079f}, + {-0.009127f, -0.086499f, -0.000601f, -0.000142f, -0.000005f}, + {-0.128048f, -0.022758f, -0.015753f, -0.000038f, +0.000035f}, + {-0.059404f, +0.160944f, -0.006871f, -0.000228f, +0.000022f} + }, + { + {+0.229440f, -0.322824f, +0.033988f, +0.000389f, +0.000061f}, + {-0.240846f, +0.383749f, -0.036120f, -0.000976f, -0.000103f}, + {+0.056585f, -0.008789f, +0.009971f, +0.000419f, -0.000080f}, + {+0.105118f, -0.219752f, +0.015610f, +0.000635f, -0.000061f}, + {+0.026805f, +0.145169f, +0.000897f, -0.000699f, +0.000083f}, + {-0.004898f, -0.050127f, -0.002984f, -0.000479f, +0.000062f}, + {-0.141946f, +0.172154f, -0.021221f, -0.000916f, +0.000039f}, + {-0.048244f, -0.174628f, -0.006354f, +0.000456f, -0.000003f}, + {+0.037664f, -0.109078f, +0.001169f, -0.001297f, -0.000015f}, + {-0.006723f, +0.230147f, -0.003197f, -0.001300f, -0.000034f}, + {+0.095384f, +0.009012f, +0.012879f, +0.000031f, -0.000023f}, + {+0.048765f, -0.092236f, +0.006693f, -0.000674f, -0.000056f}, + {-0.024712f, +0.249773f, -0.004585f, -0.000253f, +0.000048f}, + {-0.029610f, -0.053064f, -0.004978f, -0.000209f, +0.000011f}, + {+0.020111f, -0.251548f, +0.002558f, +0.000313f, -0.000027f}, + {+0.088864f, -0.064651f, +0.009687f, +0.000147f, -0.000018f} + }, + { + {+0.175493f, -0.403144f, +0.024964f, -0.000494f, -0.000029f}, + {-0.208289f, +0.431823f, -0.027399f, +0.000496f, +0.000086f}, + {-0.008906f, -0.108845f, -0.001685f, -0.000188f, -0.000067f}, + {+0.127825f, -0.183453f, +0.018081f, +0.000198f, -0.000048f}, + {-0.107325f, -0.060873f, -0.013159f, -0.000090f, +0.000038f}, + {+0.020607f, -0.012217f, +0.003265f, +0.000308f, +0.000058f}, + {-0.079060f, +0.266458f, -0.009775f, +0.000157f, +0.000041f}, + {+0.096681f, +0.050055f, +0.012663f, -0.000225f, -0.000055f}, + {+0.051411f, -0.089715f, +0.013539f, +0.000663f, +0.000008f}, + {-0.129678f, +0.037696f, -0.015815f, +0.000703f, +0.000099f}, + {-0.037248f, -0.197082f, -0.005086f, +0.000193f, -0.000037f}, + {+0.043816f, -0.101985f, +0.008254f, +0.000336f, +0.000028f}, + {-0.117065f, +0.106956f, -0.016478f, +0.000283f, +0.000091f}, + {+0.024549f, +0.029471f, +0.003315f, +0.000242f, +0.000008f}, + {+0.102968f, -0.125147f, +0.012245f, +0.000115f, -0.000038f}, + {+0.007500f, -0.187296f, +0.002430f, +0.000314f, -0.000019f} + }, + { + {-0.255049f, +0.256577f, -0.038217f, -0.000401f, -0.000056f}, + {+0.286340f, -0.326727f, +0.042071f, +0.000948f, +0.000098f}, + {-0.058758f, -0.032715f, -0.010103f, -0.000506f, +0.000109f}, + {-0.123738f, +0.204736f, -0.019030f, -0.000624f, +0.000081f}, + {+0.004658f, -0.232611f, +0.002627f, +0.000673f, -0.000101f}, + {-0.001246f, +0.020482f, +0.002726f, +0.000581f, -0.000087f}, + {+0.149860f, -0.087638f, +0.023219f, +0.000836f, -0.000049f}, + {+0.011705f, +0.182241f, +0.000824f, -0.000663f, +0.000015f}, + {-0.036322f, +0.046246f, -0.002434f, +0.001110f, +0.000020f}, + {+0.041445f, -0.225060f, +0.008066f, +0.001247f, +0.000002f}, + {-0.082241f, -0.130716f, -0.009581f, +0.000052f, +0.000037f}, + {-0.061982f, +0.060921f, -0.008434f, +0.000587f, +0.000055f}, + {+0.070313f, -0.179626f, +0.010580f, +0.000496f, -0.000079f}, + {+0.010271f, +0.049933f, +0.003107f, +0.000216f, -0.000007f}, + {-0.072320f, +0.142479f, -0.007956f, -0.000403f, +0.000037f}, + {-0.080097f, -0.050215f, -0.010237f, -0.000128f, +0.000027f} + }, + { + {-0.138659f, +0.433413f, -0.019489f, +0.000507f, +0.000036f}, + {+0.163451f, -0.512532f, +0.021259f, -0.000613f, -0.000105f}, + {+0.031656f, +0.104824f, +0.003994f, -0.000128f, +0.000059f}, + {-0.110770f, +0.224024f, -0.015294f, -0.000397f, +0.000039f}, + {+0.125629f, -0.045496f, +0.015544f, +0.000259f, -0.000027f}, + {-0.013056f, +0.002303f, -0.002874f, -0.000034f, -0.000053f}, + {+0.034706f, -0.263278f, +0.003483f, -0.000141f, -0.000039f}, + {-0.095465f, +0.017678f, -0.011595f, +0.000132f, +0.000064f}, + {-0.033817f, +0.054176f, -0.010428f, -0.000890f, -0.000012f}, + {+0.119869f, -0.100206f, +0.015399f, -0.000474f, -0.000091f}, + {+0.083578f, +0.121580f, +0.008601f, -0.000327f, +0.000026f}, + {-0.021962f, +0.124782f, -0.004983f, -0.000417f, -0.000031f}, + {+0.081591f, -0.160439f, +0.012843f, +0.000024f, -0.000092f}, + {-0.025765f, -0.006872f, -0.004893f, -0.000318f, -0.000015f}, + {-0.048404f, +0.176242f, -0.007439f, -0.000200f, +0.000038f}, + {+0.029349f, +0.118206f, +0.002646f, -0.000434f, +0.000011f} + }, + { + {+0.273332f, -0.197278f, +0.041000f, +0.000427f, +0.000049f}, + {-0.321458f, +0.231555f, -0.047137f, -0.001083f, -0.000091f}, + {+0.051312f, +0.073576f, +0.009852f, +0.000350f, -0.000146f}, + {+0.149316f, -0.177043f, +0.022631f, +0.000468f, -0.000104f}, + {-0.053207f, +0.228176f, -0.008455f, -0.000505f, +0.000122f}, + {-0.006068f, -0.008715f, -0.003223f, -0.000482f, +0.000122f}, + {-0.145901f, +0.015682f, -0.022924f, -0.000759f, +0.000061f}, + {+0.021739f, -0.160951f, +0.002760f, +0.000739f, -0.000036f}, + {+0.029254f, -0.044035f, +0.001822f, -0.001067f, -0.000028f}, + {-0.071428f, +0.194582f, -0.013164f, -0.000987f, +0.000034f}, + {+0.035270f, +0.192622f, +0.005952f, -0.000220f, -0.000050f}, + {+0.068773f, -0.014813f, +0.009109f, -0.000533f, -0.000056f}, + {-0.089870f, +0.103512f, -0.014502f, -0.000459f, +0.000122f}, + {+0.001775f, -0.051927f, +0.000206f, -0.000272f, +0.000005f}, + {+0.077868f, -0.020072f, +0.010512f, +0.000382f, -0.000051f}, + {+0.053027f, +0.078728f, +0.007627f, +0.000029f, -0.000036f} + }, + { + {+0.101834f, -0.458014f, +0.014426f, -0.000475f, -0.000042f}, + {-0.106819f, +0.558024f, -0.013421f, +0.000683f, +0.000132f}, + {-0.052912f, -0.088899f, -0.008225f, +0.000491f, -0.000027f}, + {+0.083094f, -0.280030f, +0.010300f, +0.000632f, -0.000016f}, + {-0.114197f, +0.131784f, -0.014954f, -0.000412f, +0.000002f}, + {+0.019246f, +0.031443f, +0.004356f, -0.000329f, +0.000027f}, + {+0.005316f, +0.248103f, +0.002960f, +0.000118f, +0.000033f}, + {+0.080531f, -0.067083f, +0.011460f, +0.000110f, -0.000064f}, + {+0.031144f, -0.046782f, +0.008670f, +0.001209f, +0.000024f}, + {-0.102756f, +0.143879f, -0.013003f, +0.000283f, +0.000065f}, + {-0.095015f, -0.011155f, -0.012207f, +0.000367f, -0.000008f}, + {-0.004913f, -0.131661f, +0.000343f, +0.000524f, +0.000039f}, + {-0.046459f, +0.170846f, -0.007777f, -0.000479f, +0.000069f}, + {+0.027234f, -0.016428f, +0.003165f, +0.000304f, +0.000026f}, + {+0.005481f, -0.131071f, +0.001565f, +0.000318f, -0.000030f}, + {-0.043474f, -0.073298f, -0.006440f, +0.000550f, +0.000003f} + }, + { + {-0.286640f, +0.137246f, -0.043420f, -0.000432f, -0.000040f}, + {+0.340199f, -0.128020f, +0.049926f, +0.001339f, +0.000072f}, + {-0.035997f, -0.119831f, -0.005662f, +0.000296f, +0.000179f}, + {-0.172429f, +0.110349f, -0.024201f, -0.000100f, +0.000122f}, + {+0.092373f, -0.185204f, +0.014035f, +0.000067f, -0.000138f}, + {+0.010912f, +0.048983f, +0.001816f, -0.000075f, -0.000154f}, + {+0.129079f, +0.059883f, +0.019833f, +0.000637f, -0.000073f}, + {-0.041407f, +0.122204f, -0.006834f, -0.000592f, +0.000062f}, + {-0.030715f, +0.048574f, -0.001376f, +0.001126f, +0.000032f}, + {+0.096213f, -0.160581f, +0.016571f, +0.000370f, -0.000063f}, + {+0.010051f, -0.173763f, +0.000750f, +0.000501f, +0.000056f}, + {-0.062657f, -0.045986f, -0.006800f, +0.000608f, +0.000057f}, + {+0.093242f, -0.041300f, +0.014445f, -0.000123f, -0.000165f}, + {-0.019827f, +0.053398f, -0.000412f, +0.000436f, -0.000009f}, + {-0.057687f, -0.032809f, -0.008352f, -0.000201f, +0.000065f}, + {-0.029198f, -0.096300f, -0.002960f, +0.000112f, +0.000041f} + }, + { + {-0.065817f, +0.474129f, -0.008963f, +0.000406f, +0.000046f}, + {+0.048357f, -0.572445f, +0.005311f, -0.000514f, -0.000163f}, + {+0.075398f, +0.048030f, +0.008271f, -0.000640f, -0.000031f}, + {-0.038405f, +0.313945f, -0.005856f, -0.000669f, -0.000022f}, + {+0.086028f, -0.192206f, +0.012072f, +0.000418f, +0.000038f}, + {-0.040227f, -0.025362f, -0.003912f, +0.000532f, +0.000024f}, + {-0.038209f, -0.193928f, -0.006045f, -0.000139f, -0.000021f}, + {-0.067018f, +0.081277f, -0.009330f, -0.000374f, +0.000051f}, + {-0.028904f, +0.056950f, -0.007486f, -0.001345f, -0.000045f}, + {+0.078983f, -0.183476f, +0.010913f, -0.000304f, -0.000020f}, + {+0.083563f, -0.058421f, +0.010558f, -0.000255f, -0.000015f}, + {+0.030882f, +0.097232f, +0.001515f, -0.000622f, -0.000053f}, + {+0.015685f, -0.158569f, +0.005189f, +0.000820f, -0.000018f}, + {-0.013899f, +0.061952f, -0.002806f, -0.000268f, -0.000038f}, + {+0.012586f, +0.075138f, +0.001144f, -0.000413f, +0.000015f}, + {+0.050911f, +0.027618f, +0.006661f, -0.000507f, -0.000023f} + }, + { + {+0.298262f, -0.083362f, +0.045235f, +0.000350f, +0.000028f}, + {-0.345899f, +0.033997f, -0.051595f, -0.001615f, -0.000035f}, + {-0.000119f, +0.165002f, +0.002953f, -0.001311f, -0.000187f}, + {+0.171388f, -0.008423f, +0.025114f, -0.000464f, -0.000125f}, + {-0.115274f, +0.117327f, -0.017963f, +0.000487f, +0.000138f}, + {+0.008614f, -0.100535f, -0.001469f, +0.001024f, +0.000165f}, + {-0.096130f, -0.104542f, -0.016843f, -0.000419f, +0.000082f}, + {+0.057723f, -0.112429f, +0.010191f, +0.000184f, -0.000084f}, + {+0.036341f, -0.043085f, +0.001450f, -0.001349f, -0.000025f}, + {-0.112953f, +0.110523f, -0.019836f, +0.000405f, +0.000071f}, + {-0.043415f, +0.138944f, -0.005951f, -0.000778f, -0.000051f}, + {+0.038181f, +0.085067f, +0.005138f, -0.000773f, -0.000051f}, + {-0.082623f, -0.007927f, -0.014925f, +0.001161f, +0.000188f}, + {+0.027034f, -0.000974f, +0.001645f, -0.000490f, +0.000020f}, + {+0.035360f, +0.038752f, +0.006345f, -0.000067f, -0.000073f}, + {+0.000083f, +0.105539f, -0.000772f, -0.000317f, -0.000036f} + }, + { + {+0.027126f, -0.497380f, +0.003317f, -0.000351f, -0.000045f}, + {+0.007859f, +0.574645f, +0.003243f, +0.000139f, +0.000188f}, + {-0.075777f, +0.049221f, -0.008353f, -0.000117f, +0.000106f}, + {-0.000094f, -0.270760f, +0.000675f, +0.000190f, +0.000068f}, + {-0.052764f, +0.211602f, -0.007618f, +0.000144f, -0.000084f}, + {+0.046479f, -0.043520f, +0.004619f, +0.000085f, -0.000093f}, + {+0.048000f, +0.115677f, +0.008039f, +0.000243f, +0.000005f}, + {+0.053119f, -0.119462f, +0.006689f, +0.000259f, -0.000024f}, + {+0.023530f, -0.067795f, +0.006354f, +0.001215f, +0.000069f}, + {-0.051960f, +0.201931f, -0.007334f, +0.001040f, -0.000035f}, + {-0.061094f, +0.110021f, -0.007462f, -0.000103f, +0.000039f}, + {-0.036876f, -0.032412f, -0.003266f, +0.000534f, +0.000070f}, + {+0.001902f, +0.122288f, -0.002472f, -0.000241f, -0.000056f}, + {-0.004270f, -0.048829f, +0.000734f, +0.000014f, +0.000048f}, + {-0.012745f, -0.036706f, -0.002273f, +0.000205f, +0.000006f}, + {-0.042314f, +0.038832f, -0.005804f, +0.000347f, +0.000043f} + }, + { + {-0.307088f, +0.013827f, -0.046648f, -0.000063f, -0.000017f}, + {+0.343985f, +0.057778f, +0.051999f, +0.001370f, -0.000021f}, + {+0.039378f, -0.130507f, -0.000123f, +0.002505f, +0.000156f}, + {-0.152973f, -0.035960f, -0.024197f, +0.000907f, +0.000105f}, + {+0.122328f, -0.057169f, +0.020503f, -0.000916f, -0.000113f}, + {-0.036115f, +0.084847f, +0.000437f, -0.002283f, -0.000139f}, + {+0.065884f, +0.089825f, +0.012704f, +0.000253f, -0.000086f}, + {-0.076176f, +0.079461f, -0.013926f, +0.000844f, +0.000095f}, + {-0.041886f, +0.032735f, -0.001798f, +0.001521f, +0.000002f}, + {+0.120605f, -0.060574f, +0.022209f, -0.000951f, -0.000049f}, + {+0.065666f, -0.088077f, +0.009755f, +0.000580f, +0.000035f}, + {-0.014536f, -0.066997f, -0.002290f, +0.001040f, +0.000035f}, + {+0.069578f, +0.020859f, +0.015775f, -0.002732f, -0.000173f}, + {-0.018357f, -0.025356f, -0.001559f, +0.000309f, -0.000039f}, + {-0.021973f, -0.023763f, -0.004557f, +0.000507f, +0.000072f}, + {+0.024594f, -0.064613f, +0.005019f, +0.000113f, +0.000019f} + }, + { + {+0.017452f, +0.509103f, +0.002330f, +0.000354f, +0.000040f}, + {-0.065401f, -0.568079f, -0.010528f, +0.000542f, -0.000194f}, + {+0.050175f, -0.114107f, +0.005162f, +0.003266f, -0.000174f}, + {+0.018374f, +0.227727f, +0.003630f, +0.001902f, -0.000110f}, + {+0.023543f, -0.209166f, +0.002096f, -0.002246f, +0.000125f}, + {-0.031298f, +0.092434f, -0.002541f, -0.002737f, +0.000158f}, + {-0.039294f, -0.069055f, -0.007101f, -0.000802f, +0.000015f}, + {-0.027981f, +0.151965f, -0.004965f, +0.000568f, -0.000008f}, + {-0.016092f, +0.076462f, -0.004970f, -0.000449f, -0.000085f}, + {+0.025683f, -0.205232f, +0.002533f, -0.003878f, +0.000082f}, + {+0.031489f, -0.139294f, +0.004565f, +0.001598f, -0.000056f}, + {+0.026207f, -0.002872f, +0.002107f, -0.000154f, -0.000084f}, + {-0.008497f, -0.098826f, +0.002487f, -0.002569f, +0.000130f}, + {+0.010858f, +0.022687f, +0.002492f, +0.000762f, -0.000051f}, + {+0.007112f, +0.019771f, +0.000809f, +0.000752f, -0.000028f}, + {+0.017429f, -0.074807f, +0.003855f, +0.000473f, -0.000058f} + } +}; + +const float rightHRIRImag_HOA3[BINAURAL_CONVBANDS][16][BINAURAL_NTAPS]= +{ + { + {-0.132965f, +0.086484f, +0.111577f, -0.006297f, -0.000146f}, + {+0.159214f, -0.438495f, +0.131837f, +0.004567f, +0.000134f}, + {-0.006365f, -0.027154f, +0.040068f, -0.008136f, +0.000115f}, + {-0.012177f, +0.011068f, +0.006759f, -0.003623f, +0.000106f}, + {+0.003524f, -0.002365f, +0.008243f, -0.002720f, -0.000173f}, + {-0.001684f, +0.006593f, +0.024280f, -0.012226f, -0.000133f}, + {+0.003794f, -0.002370f, +0.013706f, -0.004985f, -0.000191f}, + {+0.009569f, -0.049227f, +0.045250f, -0.003942f, -0.000006f}, + {-0.015413f, +0.062027f, -0.005814f, -0.010696f, -0.000183f}, + {+0.012650f, -0.030376f, -0.022293f, +0.005058f, +0.000424f}, + {-0.003808f, +0.011707f, +0.008010f, -0.002270f, -0.000068f}, + {+0.003343f, -0.012704f, -0.014571f, +0.003409f, +0.000255f}, + {+0.000428f, +0.007434f, +0.003549f, -0.001445f, +0.000011f}, + {-0.006298f, +0.029469f, -0.007911f, +0.000838f, -0.000089f}, + {-0.003358f, +0.002973f, +0.012948f, -0.001507f, +0.000003f}, + {-0.000168f, +0.002647f, +0.005935f, -0.001295f, -0.000063f} + }, + { + {+0.075202f, +0.228858f, +0.021577f, -0.002573f, -0.000120f}, + {-0.061927f, -0.923113f, +0.018254f, +0.003553f, +0.000135f}, + {+0.002952f, -0.050194f, +0.020301f, -0.000013f, +0.000082f}, + {+0.008722f, +0.019708f, -0.013956f, +0.001282f, +0.000072f}, + {-0.001425f, -0.021365f, +0.019206f, +0.005433f, -0.000123f}, + {+0.004675f, +0.040742f, +0.087083f, +0.008021f, -0.000087f}, + {-0.001220f, -0.034662f, +0.025115f, +0.004561f, -0.000118f}, + {-0.004799f, -0.049232f, +0.074542f, +0.003362f, -0.000003f}, + {+0.011236f, +0.040604f, -0.010517f, +0.002046f, -0.000098f}, + {-0.006435f, -0.139253f, -0.070542f, +0.004148f, +0.000297f}, + {+0.001842f, +0.052892f, +0.056325f, +0.005942f, -0.000046f}, + {-0.004364f, -0.052115f, -0.019067f, +0.000398f, +0.000179f}, + {+0.003644f, +0.037489f, +0.030067f, +0.000286f, +0.000000f}, + {+0.000279f, +0.074681f, +0.035692f, +0.005433f, -0.000065f}, + {+0.001702f, +0.024063f, +0.022013f, +0.000449f, +0.000009f}, + {+0.001629f, +0.004730f, -0.001402f, -0.003756f, -0.000041f} + }, + { + {-0.022776f, +0.213361f, +0.033702f, +0.017530f, +0.000169f}, + {-0.017318f, -0.757708f, -0.032772f, -0.023486f, -0.000150f}, + {-0.000995f, +0.005778f, -0.039399f, +0.003826f, -0.000133f}, + {-0.001086f, +0.066855f, -0.049052f, -0.001880f, -0.000124f}, + {-0.003861f, -0.074613f, +0.059871f, -0.001275f, +0.000202f}, + {-0.004218f, +0.001879f, +0.134238f, +0.000831f, +0.000156f}, + {-0.007011f, -0.156373f, +0.120347f, +0.000348f, +0.000228f}, + {+0.001557f, +0.050757f, -0.023560f, -0.002558f, +0.000008f}, + {-0.014029f, -0.230152f, +0.192472f, +0.009207f, +0.000223f}, + {-0.003304f, -0.293531f, +0.162769f, -0.029563f, -0.000502f}, + {+0.000187f, +0.025533f, +0.089914f, -0.003071f, +0.000081f}, + {+0.001118f, -0.199397f, +0.178948f, -0.009074f, -0.000301f}, + {-0.002128f, +0.041497f, +0.024472f, -0.001412f, -0.000017f}, + {+0.001502f, +0.027123f, +0.081159f, -0.005992f, +0.000104f}, + {+0.000493f, +0.080670f, -0.051505f, -0.003323f, -0.000001f}, + {-0.001770f, +0.022371f, -0.053147f, +0.009257f, +0.000076f} + }, + { + {+0.009638f, -0.020599f, -0.278274f, -0.025390f, +0.000089f}, + {+0.019638f, -0.173586f, +0.454125f, +0.045073f, -0.000138f}, + {+0.001861f, +0.029237f, -0.038358f, -0.002128f, -0.000043f}, + {-0.006025f, +0.060820f, -0.033037f, +0.001020f, -0.000030f}, + {+0.010927f, -0.114232f, -0.022410f, -0.002610f, +0.000063f}, + {+0.001151f, -0.065308f, +0.047475f, -0.003953f, +0.000033f}, + {+0.017565f, -0.230160f, -0.003612f, +0.002199f, +0.000030f}, + {-0.002909f, +0.050062f, -0.035205f, +0.001706f, -0.000001f}, + {+0.028618f, -0.411400f, -0.073259f, -0.001960f, -0.000006f}, + {+0.012397f, -0.141388f, +0.368076f, +0.043941f, -0.000144f}, + {-0.000613f, -0.027917f, +0.038807f, -0.005057f, +0.000020f}, + {+0.005278f, -0.064856f, +0.339877f, +0.008614f, -0.000087f}, + {-0.003908f, -0.015797f, -0.023962f, +0.003729f, +0.000013f}, + {+0.002822f, -0.051424f, +0.011636f, +0.000447f, +0.000037f}, + {-0.001743f, -0.007517f, -0.130092f, +0.010670f, -0.000017f}, + {+0.001199f, -0.016221f, -0.122288f, -0.007685f, +0.000014f} + }, + { + {-0.029178f, -0.030294f, -0.242046f, +0.016235f, -0.000187f}, + {+0.008133f, +0.216891f, +0.173004f, -0.046339f, +0.000186f}, + {-0.004784f, +0.011306f, -0.001565f, +0.002974f, +0.000133f}, + {+0.001643f, -0.028149f, +0.058358f, +0.006461f, +0.000122f}, + {-0.012719f, +0.054617f, -0.162135f, -0.005430f, -0.000206f}, + {-0.004192f, +0.016864f, -0.049221f, -0.004060f, -0.000152f}, + {-0.017065f, +0.041944f, -0.209787f, -0.017496f, -0.000221f}, + {+0.005651f, -0.007117f, +0.010168f, -0.000370f, -0.000010f}, + {-0.040832f, +0.087605f, -0.438294f, -0.024557f, -0.000208f}, + {-0.015743f, +0.224869f, +0.116394f, -0.024045f, +0.000521f}, + {+0.000520f, -0.017676f, +0.001703f, +0.007076f, -0.000085f}, + {-0.005864f, +0.108940f, +0.176379f, +0.006190f, +0.000311f}, + {+0.004834f, -0.026630f, -0.021079f, -0.003057f, +0.000018f}, + {-0.003714f, -0.006337f, -0.039785f, +0.000713f, -0.000108f}, + {+0.003235f, -0.035740f, -0.081406f, -0.014616f, +0.000003f}, + {-0.000931f, -0.029194f, -0.104837f, -0.000498f, -0.000077f} + }, + { + {+0.064069f, +0.415122f, +0.053438f, -0.001987f, -0.000053f}, + {-0.009859f, -0.329919f, -0.267131f, +0.025972f, +0.000125f}, + {+0.007782f, +0.093625f, +0.062218f, -0.005519f, +0.000007f}, + {+0.006679f, +0.087174f, +0.140907f, -0.012343f, -0.000007f}, + {+0.009694f, +0.066480f, -0.161387f, +0.014778f, -0.000006f}, + {+0.011976f, +0.007185f, -0.079605f, +0.010521f, +0.000016f}, + {+0.000557f, +0.101449f, -0.157518f, +0.024682f, +0.000050f}, + {-0.008085f, -0.037335f, +0.019864f, -0.001614f, +0.000006f}, + {+0.030203f, +0.393848f, -0.238529f, +0.036570f, +0.000098f}, + {+0.011087f, +0.102790f, -0.079859f, +0.000351f, -0.000008f}, + {-0.001584f, -0.009914f, -0.007779f, -0.002067f, +0.000006f}, + {-0.003353f, +0.001777f, -0.008005f, -0.013355f, -0.000003f}, + {-0.003172f, -0.008210f, +0.010652f, +0.000223f, -0.000027f}, + {-0.001325f, -0.010307f, -0.051607f, +0.003067f, -0.000008f}, + {-0.010253f, -0.010690f, +0.002393f, +0.009426f, +0.000023f}, + {-0.002525f, +0.029747f, -0.022901f, +0.004832f, +0.000012f} + }, + { + {-0.046682f, +0.646468f, +0.038502f, -0.000394f, +0.000197f}, + {-0.044970f, -0.559290f, -0.057727f, -0.008886f, -0.000233f}, + {+0.000940f, +0.137203f, +0.026727f, +0.004536f, -0.000119f}, + {+0.021842f, +0.212599f, -0.004934f, +0.008826f, -0.000104f}, + {-0.023556f, -0.052508f, +0.021029f, -0.010719f, +0.000188f}, + {-0.008092f, +0.004951f, -0.027003f, -0.006766f, +0.000127f}, + {+0.010424f, -0.025150f, +0.006816f, -0.012676f, +0.000176f}, + {+0.012013f, -0.064462f, +0.013618f, +0.002713f, +0.000010f}, + {+0.003530f, +0.310311f, -0.011616f, -0.019741f, +0.000148f}, + {-0.004678f, +0.016958f, -0.018438f, -0.001910f, -0.000484f}, + {+0.001327f, -0.004928f, -0.011742f, -0.001214f, +0.000078f}, + {+0.013688f, -0.047967f, -0.031851f, +0.002524f, -0.000286f}, + {+0.008554f, -0.003502f, +0.000653f, +0.000953f, -0.000012f}, + {+0.001110f, -0.052143f, -0.004967f, -0.003628f, +0.000102f}, + {+0.024328f, -0.026559f, +0.000732f, -0.001055f, -0.000010f}, + {+0.007177f, -0.017435f, +0.026024f, -0.001281f, +0.000068f} + }, + { + {-0.091452f, +0.552905f, -0.002702f, -0.003959f, +0.000011f}, + {+0.151251f, -0.284723f, +0.015522f, +0.005073f, -0.000086f}, + {-0.028691f, +0.087255f, -0.003554f, -0.001461f, +0.000017f}, + {-0.098620f, +0.103367f, -0.000693f, -0.001510f, +0.000032f}, + {+0.064701f, -0.012013f, +0.004462f, +0.000173f, -0.000038f}, + {-0.014183f, +0.018557f, +0.019481f, +0.000708f, -0.000046f}, + {+0.006021f, -0.064708f, +0.035867f, -0.001201f, -0.000101f}, + {-0.011933f, -0.098741f, -0.004801f, -0.001237f, -0.000012f}, + {-0.036700f, +0.201775f, +0.040310f, -0.000652f, -0.000152f}, + {+0.005765f, -0.013682f, -0.000873f, +0.007110f, +0.000136f}, + {+0.003019f, +0.012643f, +0.006120f, +0.000396f, -0.000028f}, + {-0.011018f, -0.079111f, -0.001161f, +0.005334f, +0.000076f}, + {-0.015223f, -0.010103f, +0.018116f, -0.000552f, +0.000040f}, + {+0.010935f, -0.049744f, +0.004931f, +0.000250f, -0.000016f}, + {-0.032242f, -0.086323f, +0.005558f, -0.001593f, -0.000026f}, + {+0.000743f, -0.058299f, -0.001218f, -0.002067f, -0.000032f} + }, + { + {+0.231005f, +0.048404f, +0.009154f, +0.001498f, -0.000196f}, + {-0.192280f, +0.252895f, +0.010481f, -0.000333f, +0.000272f}, + {+0.043883f, -0.025510f, -0.003790f, -0.000402f, +0.000097f}, + {+0.135351f, -0.212029f, -0.009492f, -0.001960f, +0.000078f}, + {-0.084125f, +0.181115f, +0.006598f, +0.003510f, -0.000156f}, + {+0.033552f, -0.023473f, +0.003836f, +0.001049f, -0.000092f}, + {-0.027732f, +0.007669f, +0.004823f, +0.004147f, -0.000114f}, + {-0.005511f, -0.108447f, -0.007469f, -0.001175f, -0.000008f}, + {+0.049262f, +0.093379f, +0.014337f, +0.006176f, -0.000066f}, + {-0.011588f, +0.007485f, +0.021418f, +0.002195f, +0.000406f}, + {-0.004828f, +0.034802f, -0.002483f, +0.000357f, -0.000065f}, + {-0.010126f, -0.088145f, +0.024313f, +0.000561f, +0.000239f}, + {+0.009822f, -0.024986f, +0.000140f, +0.000383f, +0.000001f}, + {-0.022780f, -0.006413f, +0.006349f, +0.001513f, -0.000089f}, + {+0.014962f, -0.135165f, -0.012780f, -0.000522f, +0.000019f}, + {-0.023635f, -0.027393f, -0.008518f, +0.000542f, -0.000051f} + }, + { + {-0.129287f, -0.488427f, -0.015298f, +0.003330f, +0.000032f}, + {+0.025480f, +0.578744f, +0.004928f, -0.005728f, +0.000021f}, + {-0.001654f, -0.098586f, -0.003334f, +0.000763f, -0.000028f}, + {-0.033875f, -0.443496f, +0.008037f, +0.001296f, -0.000041f}, + {+0.018947f, +0.326335f, -0.012624f, -0.000806f, +0.000063f}, + {-0.025064f, -0.093936f, -0.002533f, -0.000591f, +0.000056f}, + {+0.010694f, +0.085378f, -0.009219f, -0.001445f, +0.000116f}, + {+0.036700f, -0.055426f, -0.001721f, +0.001199f, +0.000016f}, + {-0.043110f, -0.003684f, -0.012692f, -0.002555f, +0.000160f}, + {+0.008512f, +0.041967f, -0.005268f, -0.006560f, -0.000223f}, + {-0.005601f, +0.039303f, -0.001728f, +0.000112f, +0.000044f}, + {+0.035999f, -0.034895f, -0.002757f, -0.004270f, -0.000123f}, + {+0.002203f, -0.033200f, -0.001100f, -0.000045f, -0.000048f}, + {+0.016721f, +0.047214f, -0.004075f, -0.000550f, +0.000032f}, + {+0.021446f, -0.110159f, +0.004884f, +0.001124f, +0.000025f}, + {+0.032915f, +0.061006f, +0.000313f, +0.001075f, +0.000044f} + }, + { + {-0.165686f, -0.410109f, -0.015586f, -0.000896f, +0.000182f}, + {+0.225295f, +0.253817f, +0.010634f, +0.001216f, -0.000288f}, + {-0.066393f, -0.000376f, -0.002622f, -0.000038f, -0.000077f}, + {-0.130423f, -0.277756f, -0.010288f, +0.000606f, -0.000054f}, + {+0.089464f, +0.200814f, +0.007558f, -0.001360f, +0.000121f}, + {-0.004322f, -0.115904f, -0.010769f, -0.000324f, +0.000060f}, + {+0.034499f, +0.049740f, -0.008222f, -0.001335f, +0.000055f}, + {-0.046786f, +0.057680f, +0.004042f, +0.000640f, +0.000003f}, + {+0.024894f, -0.095189f, -0.014289f, -0.002426f, -0.000011f}, + {+0.005629f, +0.034211f, -0.013115f, -0.002185f, -0.000307f}, + {+0.019520f, +0.005119f, -0.001636f, -0.000261f, +0.000048f}, + {-0.038933f, +0.062477f, -0.011725f, -0.001017f, -0.000182f}, + {-0.005035f, -0.021514f, -0.003233f, -0.000466f, +0.000014f}, + {+0.007389f, +0.053217f, -0.000456f, -0.000398f, +0.000072f}, + {-0.037733f, -0.010531f, -0.003329f, +0.000340f, -0.000027f}, + {-0.003757f, +0.111811f, +0.004737f, -0.000075f, +0.000033f} + }, + { + {+0.245533f, +0.226873f, +0.035259f, -0.002770f, -0.000070f}, + {-0.206677f, -0.408421f, -0.026814f, +0.005082f, +0.000056f}, + {+0.053751f, +0.188303f, +0.009769f, -0.000688f, +0.000029f}, + {+0.149357f, +0.154463f, +0.013417f, -0.001098f, +0.000037f}, + {-0.105083f, -0.109018f, -0.007715f, +0.000799f, -0.000072f}, + {+0.025793f, -0.064751f, +0.005742f, +0.000924f, -0.000050f}, + {-0.041996f, -0.072003f, +0.001334f, +0.001959f, -0.000101f}, + {+0.008234f, +0.134619f, -0.001439f, -0.000932f, -0.000019f}, + {+0.007939f, -0.128639f, +0.012917f, +0.003363f, -0.000130f}, + {-0.013715f, -0.007050f, -0.000167f, +0.004932f, +0.000266f}, + {-0.012412f, -0.040469f, +0.000036f, +0.000063f, -0.000052f}, + {+0.005607f, +0.122490f, +0.001069f, +0.003166f, +0.000145f}, + {+0.002475f, -0.010103f, -0.001112f, +0.000172f, +0.000049f}, + {-0.026992f, -0.004924f, -0.001965f, +0.000301f, -0.000041f}, + {+0.008412f, +0.067378f, +0.003334f, -0.000633f, -0.000020f}, + {-0.034796f, +0.054935f, -0.005935f, -0.000590f, -0.000048f} + }, + { + {+0.049172f, +0.518027f, +0.003115f, +0.000335f, -0.000156f}, + {-0.120618f, -0.519623f, -0.008479f, -0.000432f, +0.000270f}, + {+0.062888f, +0.179664f, -0.000296f, +0.000157f, +0.000063f}, + {+0.019992f, +0.341262f, +0.002080f, -0.000355f, +0.000037f}, + {-0.012267f, -0.246756f, +0.001889f, +0.000730f, -0.000091f}, + {-0.028297f, +0.020937f, +0.002730f, +0.000026f, -0.000039f}, + {-0.008636f, -0.121054f, +0.007814f, +0.000720f, -0.000014f}, + {+0.046484f, +0.071961f, +0.002387f, -0.000455f, +0.000002f}, + {-0.042652f, -0.042219f, +0.005353f, +0.001621f, +0.000061f}, + {+0.003781f, -0.030870f, +0.013170f, +0.002144f, +0.000211f}, + {-0.016747f, -0.033277f, -0.000186f, +0.000012f, -0.000031f}, + {+0.038322f, +0.079239f, +0.009485f, +0.001067f, +0.000129f}, + {-0.009213f, +0.006178f, +0.001082f, +0.000202f, -0.000029f}, + {+0.017679f, -0.071909f, +0.003357f, +0.000147f, -0.000056f}, + {+0.031925f, +0.035422f, +0.000231f, -0.000251f, +0.000032f}, + {+0.027629f, -0.047451f, +0.003771f, -0.000092f, -0.000016f} + }, + { + {-0.277356f, +0.009713f, -0.040871f, +0.002128f, +0.000098f}, + {+0.288048f, +0.119309f, +0.040772f, -0.004167f, -0.000126f}, + {-0.135614f, -0.121199f, -0.015970f, +0.000584f, -0.000025f}, + {-0.147900f, +0.068278f, -0.021757f, +0.001011f, -0.000028f}, + {+0.111155f, -0.046512f, +0.012782f, -0.000892f, +0.000069f}, + {+0.020452f, +0.099912f, +0.003632f, -0.000896f, +0.000036f}, + {+0.051789f, -0.026841f, -0.000416f, -0.002061f, +0.000070f}, + {-0.048315f, -0.075067f, -0.004473f, +0.000718f, +0.000020f}, + {+0.038466f, +0.097321f, -0.002604f, -0.003632f, +0.000080f}, + {+0.012250f, -0.014195f, -0.001656f, -0.003568f, -0.000272f}, + {+0.029260f, +0.036443f, +0.002521f, -0.000109f, +0.000054f}, + {-0.049141f, -0.042766f, -0.002001f, -0.002307f, -0.000147f}, + {+0.016365f, +0.045379f, +0.003479f, +0.000052f, -0.000044f}, + {+0.016380f, -0.068248f, +0.002419f, -0.000284f, +0.000043f}, + {-0.026309f, -0.049393f, -0.000660f, +0.000389f, +0.000012f}, + {+0.020013f, -0.061398f, +0.001390f, +0.000285f, +0.000045f} + }, + { + {+0.056395f, -0.497410f, +0.010462f, +0.000112f, +0.000123f}, + {-0.008278f, +0.564708f, -0.007533f, -0.000534f, -0.000224f}, + {+0.029776f, -0.375504f, +0.009908f, -0.000167f, -0.000056f}, + {+0.053843f, -0.247636f, +0.011973f, +0.000305f, -0.000030f}, + {-0.047919f, +0.200610f, -0.011974f, -0.000485f, +0.000070f}, + {+0.001747f, +0.136529f, -0.008548f, +0.000030f, +0.000031f}, + {-0.034659f, +0.098248f, -0.009286f, -0.000733f, -0.000004f}, + {-0.013390f, -0.125590f, +0.000347f, +0.000408f, -0.000006f}, + {+0.018416f, +0.125823f, -0.010099f, -0.001587f, -0.000079f}, + {-0.015670f, +0.020509f, -0.010455f, -0.001886f, -0.000130f}, + {+0.001269f, +0.078191f, -0.000719f, +0.000060f, +0.000015f}, + {+0.015954f, -0.139586f, -0.005155f, -0.000966f, -0.000087f}, + {-0.000690f, +0.074979f, -0.002970f, -0.000046f, +0.000040f}, + {-0.036315f, +0.016998f, -0.007922f, -0.000063f, +0.000042f}, + {-0.017947f, -0.053543f, -0.003628f, +0.000169f, -0.000034f}, + {-0.036250f, +0.025051f, -0.004463f, +0.000134f, +0.000003f} + }, + { + {+0.261565f, -0.175456f, +0.039964f, -0.001605f, -0.000112f}, + {-0.289123f, +0.124032f, -0.042209f, +0.003292f, +0.000173f}, + {+0.147448f, -0.202794f, +0.013343f, -0.000451f, +0.000021f}, + {+0.111431f, -0.158046f, +0.014055f, -0.000866f, +0.000018f}, + {-0.088516f, +0.135597f, -0.008911f, +0.000941f, -0.000062f}, + {-0.046542f, +0.074771f, +0.001267f, +0.000681f, -0.000024f}, + {-0.008851f, +0.134457f, +0.003904f, +0.001907f, -0.000040f}, + {+0.057725f, -0.011782f, +0.007446f, -0.000690f, -0.000019f}, + {-0.064453f, -0.009485f, -0.001505f, +0.003482f, -0.000032f}, + {+0.003750f, +0.043297f, +0.001696f, +0.002710f, +0.000254f}, + {-0.036881f, +0.019154f, -0.003756f, +0.000164f, -0.000052f}, + {+0.028484f, -0.127049f, +0.000373f, +0.001785f, +0.000137f}, + {-0.030494f, +0.034591f, -0.002192f, -0.000165f, +0.000035f}, + {+0.009470f, +0.091778f, +0.004810f, +0.000325f, -0.000042f}, + {+0.029100f, +0.027840f, +0.006520f, -0.000311f, -0.000006f}, + {-0.009135f, +0.066628f, -0.000798f, -0.000116f, -0.000038f} + }, + { + {-0.134646f, +0.431836f, -0.022252f, -0.000261f, -0.000089f}, + {+0.108773f, -0.480556f, +0.020213f, +0.000915f, +0.000164f}, + {-0.157283f, +0.252511f, -0.017953f, +0.000158f, +0.000053f}, + {-0.096912f, +0.162399f, -0.016830f, -0.000259f, +0.000029f}, + {+0.094935f, -0.145981f, +0.017427f, +0.000284f, -0.000058f}, + {+0.078691f, -0.105220f, +0.009040f, +0.000009f, -0.000031f}, + {+0.032041f, +0.084421f, +0.004353f, +0.000773f, +0.000002f}, + {-0.016068f, +0.102075f, -0.005241f, -0.000269f, +0.000010f}, + {+0.027628f, -0.144744f, +0.013233f, +0.001492f, +0.000070f}, + {+0.013497f, +0.033838f, +0.009244f, +0.001447f, +0.000073f}, + {+0.020163f, -0.066780f, +0.002771f, -0.000069f, -0.000003f}, + {-0.051113f, -0.013125f, +0.004746f, +0.000733f, +0.000056f}, + {+0.038408f, -0.068407f, +0.004887f, -0.000113f, -0.000046f}, + {+0.039739f, +0.052992f, +0.003676f, -0.000005f, -0.000032f}, + {+0.019468f, +0.046585f, -0.000417f, -0.000092f, +0.000032f}, + {+0.046026f, -0.019351f, +0.006238f, -0.000147f, +0.000005f} + }, + { + {-0.227969f, +0.284525f, -0.035118f, +0.001170f, +0.000113f}, + {+0.251619f, -0.250783f, +0.039635f, -0.002380f, -0.000192f}, + {-0.028234f, +0.444181f, -0.004258f, +0.000378f, -0.000019f}, + {-0.057970f, +0.223549f, -0.006095f, +0.000655f, -0.000012f}, + {+0.039868f, -0.230386f, +0.002246f, -0.000818f, +0.000054f}, + {-0.036223f, -0.280336f, -0.007555f, -0.000539f, +0.000017f}, + {-0.045995f, -0.019070f, -0.002489f, -0.001639f, +0.000020f}, + {-0.058114f, +0.032997f, -0.008873f, +0.000662f, +0.000018f}, + {+0.053231f, -0.094713f, +0.003411f, -0.002983f, -0.000000f}, + {-0.022768f, -0.016336f, -0.003117f, -0.002216f, -0.000227f}, + {+0.031511f, -0.045619f, +0.004901f, -0.000227f, +0.000048f}, + {+0.045006f, +0.127523f, +0.002107f, -0.001382f, -0.000124f}, + {-0.004533f, -0.139114f, -0.003073f, +0.000203f, -0.000026f}, + {-0.046710f, -0.071863f, -0.004169f, -0.000343f, +0.000040f}, + {-0.053226f, -0.067429f, -0.008363f, +0.000293f, +0.000001f}, + {-0.008131f, -0.104415f, -0.002326f, +0.000063f, +0.000032f} + }, + { + {+0.193626f, -0.362707f, +0.031027f, +0.000215f, +0.000061f}, + {-0.168437f, +0.394610f, -0.030765f, -0.000832f, -0.000106f}, + {+0.166845f, +0.150839f, +0.019333f, -0.000239f, -0.000053f}, + {+0.108632f, -0.026149f, +0.014836f, +0.000210f, -0.000033f}, + {-0.117845f, +0.006812f, -0.017402f, -0.000161f, +0.000052f}, + {-0.070459f, -0.240877f, -0.004084f, +0.000089f, +0.000035f}, + {+0.051571f, -0.166446f, +0.000272f, -0.000594f, +0.000009f}, + {+0.048610f, -0.137567f, +0.012351f, +0.000122f, -0.000012f}, + {-0.060459f, +0.077161f, -0.017457f, -0.001202f, -0.000048f}, + {+0.008901f, -0.071218f, -0.004889f, -0.001056f, -0.000035f}, + {-0.035581f, +0.061262f, -0.007127f, +0.000111f, -0.000006f}, + {-0.009360f, +0.207644f, -0.007254f, -0.000645f, -0.000037f}, + {-0.043066f, -0.091054f, -0.000390f, +0.000159f, +0.000048f}, + {-0.006722f, -0.129159f, -0.003572f, +0.000128f, +0.000025f}, + {+0.002648f, -0.158951f, +0.005371f, +0.000083f, -0.000030f}, + {-0.052294f, -0.037930f, -0.006102f, +0.000171f, -0.000010f} + }, + { + {+0.185388f, -0.373945f, +0.028242f, -0.000870f, -0.000107f}, + {-0.218466f, +0.313607f, -0.033711f, +0.001650f, +0.000187f}, + {-0.089184f, -0.227856f, -0.003013f, -0.000234f, +0.000019f}, + {-0.005910f, -0.195725f, +0.001490f, -0.000426f, +0.000010f}, + {+0.033058f, +0.233100f, +0.003881f, +0.000583f, -0.000049f}, + {+0.128077f, +0.046310f, +0.008240f, +0.000349f, -0.000015f}, + {+0.004052f, -0.247839f, -0.003163f, +0.001295f, -0.000012f}, + {+0.052459f, -0.138631f, +0.002655f, -0.000517f, -0.000018f}, + {-0.024548f, +0.123596f, -0.001667f, +0.002422f, +0.000013f}, + {+0.026309f, -0.052058f, +0.001607f, +0.001982f, +0.000202f}, + {-0.029154f, +0.072410f, -0.002905f, +0.000210f, -0.000043f}, + {-0.051381f, +0.149021f, +0.000115f, +0.001232f, +0.000111f}, + {+0.060324f, +0.057180f, +0.002547f, -0.000144f, +0.000020f}, + {+0.052887f, -0.036634f, +0.006886f, +0.000170f, -0.000037f}, + {+0.075539f, -0.053066f, +0.006319f, -0.000332f, +0.000001f}, + {+0.036656f, +0.098177f, +0.004589f, -0.000133f, -0.000026f} + }, + { + {-0.239844f, +0.276952f, -0.036663f, -0.000075f, -0.000041f}, + {+0.218935f, -0.356480f, +0.037109f, +0.000536f, +0.000063f}, + {-0.067555f, -0.247328f, -0.016085f, +0.000198f, +0.000054f}, + {-0.065557f, -0.103844f, -0.011325f, -0.000270f, +0.000037f}, + {+0.082669f, +0.157628f, +0.013419f, +0.000257f, -0.000050f}, + {-0.051102f, +0.310690f, -0.001856f, -0.000105f, -0.000038f}, + {-0.105915f, -0.086143f, -0.002835f, +0.000369f, -0.000019f}, + {-0.108427f, +0.103999f, -0.015274f, -0.000237f, +0.000014f}, + {+0.072751f, -0.025221f, +0.019360f, +0.000835f, +0.000029f}, + {-0.042856f, +0.056448f, +0.001929f, +0.000741f, +0.000011f}, + {+0.068206f, -0.080584f, +0.011613f, -0.000093f, +0.000013f}, + {+0.091336f, -0.056612f, +0.010772f, +0.000543f, +0.000024f}, + {-0.026414f, +0.186526f, -0.002964f, -0.000133f, -0.000049f}, + {-0.024927f, +0.082144f, -0.001315f, +0.000035f, -0.000020f}, + {-0.062843f, +0.155369f, -0.009444f, -0.000091f, +0.000028f}, + {+0.038812f, +0.095103f, +0.003754f, -0.000076f, +0.000012f} + }, + { + {-0.131680f, +0.440943f, -0.020891f, +0.000627f, +0.000098f}, + {+0.183833f, -0.406966f, +0.027778f, -0.001207f, -0.000171f}, + {+0.086183f, -0.003067f, +0.012386f, +0.000168f, -0.000020f}, + {+0.026332f, +0.035398f, +0.002657f, +0.000383f, -0.000011f}, + {-0.076464f, -0.083380f, -0.010071f, -0.000597f, +0.000047f}, + {-0.086834f, +0.252931f, -0.010256f, -0.000250f, +0.000016f}, + {+0.112579f, +0.244861f, +0.011209f, -0.001100f, +0.000012f}, + {+0.018202f, +0.300605f, +0.006408f, +0.000602f, +0.000018f}, + {-0.003044f, -0.137405f, -0.002719f, -0.002137f, -0.000013f}, + {+0.003641f, +0.131818f, +0.001737f, -0.001737f, -0.000181f}, + {-0.001297f, -0.195950f, -0.005713f, -0.000204f, +0.000037f}, + {-0.045795f, -0.259231f, -0.005407f, -0.001178f, -0.000100f}, + {-0.039454f, +0.170156f, -0.000777f, +0.000115f, -0.000018f}, + {-0.040004f, +0.055755f, -0.008185f, -0.000317f, +0.000034f}, + {-0.043921f, +0.182226f, -0.005163f, +0.000395f, -0.000002f}, + {-0.058367f, -0.053246f, -0.007857f, +0.000065f, +0.000022f} + }, + { + {+0.266519f, -0.168414f, +0.039980f, +0.000112f, +0.000029f}, + {-0.270044f, +0.288912f, -0.044466f, -0.000374f, -0.000037f}, + {+0.013148f, +0.108379f, +0.008696f, -0.000082f, -0.000056f}, + {+0.007547f, +0.066767f, +0.004336f, +0.000293f, -0.000040f}, + {-0.013959f, -0.178267f, -0.007930f, -0.000231f, +0.000050f}, + {+0.126652f, -0.073753f, +0.010940f, +0.000032f, +0.000041f}, + {+0.037971f, +0.357198f, -0.003626f, -0.000116f, +0.000025f}, + {+0.123814f, +0.144678f, +0.015962f, +0.000194f, -0.000018f}, + {-0.073603f, -0.033162f, -0.018399f, -0.000381f, -0.000019f}, + {+0.052463f, +0.055986f, -0.001868f, -0.000682f, +0.000008f}, + {-0.099011f, -0.055743f, -0.009504f, +0.000033f, -0.000019f}, + {-0.066616f, -0.234328f, -0.006904f, -0.000399f, -0.000016f}, + {+0.081064f, -0.004874f, +0.003489f, +0.000036f, +0.000052f}, + {+0.044214f, -0.078007f, +0.004257f, +0.000035f, +0.000016f}, + {+0.107368f, -0.054956f, +0.018386f, -0.000009f, -0.000028f}, + {-0.008996f, -0.126597f, -0.002978f, +0.000081f, -0.000014f} + }, + { + {+0.076584f, -0.456777f, +0.013253f, -0.000677f, -0.000090f}, + {-0.135714f, +0.493797f, -0.019817f, +0.001205f, +0.000155f}, + {-0.049801f, +0.003798f, -0.009316f, -0.000287f, +0.000022f}, + {+0.008289f, +0.072460f, +0.002582f, -0.000487f, +0.000014f}, + {+0.058361f, -0.066933f, +0.007899f, +0.000705f, -0.000047f}, + {-0.024939f, -0.304082f, -0.002238f, +0.000320f, -0.000018f}, + {-0.164640f, +0.054259f, -0.014251f, +0.000972f, -0.000016f}, + {-0.129320f, -0.239583f, -0.014072f, -0.000614f, -0.000019f}, + {+0.023151f, +0.107790f, +0.002402f, +0.001999f, +0.000009f}, + {-0.042244f, -0.087154f, -0.004003f, +0.001651f, +0.000165f}, + {+0.087421f, +0.223827f, +0.009440f, +0.000302f, -0.000032f}, + {+0.123261f, +0.040927f, +0.008130f, +0.001094f, +0.000093f}, + {-0.047678f, -0.191325f, -0.003834f, -0.000119f, +0.000015f}, + {+0.025350f, -0.109559f, +0.002027f, +0.000400f, -0.000032f}, + {-0.031404f, -0.277712f, -0.007376f, -0.000280f, +0.000002f}, + {+0.054594f, -0.026570f, +0.007177f, +0.000010f, -0.000018f} + }, + { + {-0.274121f, +0.081952f, -0.043113f, -0.000004f, -0.000021f}, + {+0.317778f, -0.199223f, +0.049734f, +0.000202f, +0.000022f}, + {-0.015529f, -0.058172f, -0.001453f, +0.000253f, +0.000058f}, + {+0.020112f, +0.056461f, -0.003930f, -0.000113f, +0.000042f}, + {-0.027311f, +0.065956f, +0.001130f, -0.000048f, -0.000049f}, + {-0.092570f, -0.201332f, -0.007025f, -0.000092f, -0.000044f}, + {+0.078874f, -0.299423f, +0.007522f, +0.000058f, -0.000026f}, + {-0.031803f, -0.392121f, -0.002719f, +0.000010f, +0.000023f}, + {+0.078295f, +0.019932f, +0.020674f, +0.000126f, +0.000017f}, + {-0.029291f, -0.096155f, -0.000322f, +0.000490f, -0.000025f}, + {+0.042190f, +0.292546f, +0.004474f, -0.000130f, +0.000023f}, + {-0.047310f, +0.289378f, +0.003082f, +0.000264f, +0.000009f}, + {-0.036042f, -0.202365f, -0.005972f, -0.000021f, -0.000059f}, + {-0.067032f, +0.032496f, -0.007059f, -0.000199f, -0.000013f}, + {-0.101204f, -0.185795f, -0.005848f, +0.000042f, +0.000029f}, + {-0.006759f, +0.066549f, -0.000681f, -0.000136f, +0.000016f} + }, + { + {-0.033486f, +0.450867f, -0.006565f, +0.000576f, +0.000085f}, + {+0.061876f, -0.590080f, +0.009764f, -0.001166f, -0.000147f}, + {+0.051215f, +0.040728f, +0.006725f, +0.000135f, -0.000027f}, + {-0.075886f, -0.090288f, -0.009577f, +0.000383f, -0.000018f}, + {-0.015185f, +0.082124f, -0.005184f, -0.000502f, +0.000049f}, + {+0.096327f, +0.079550f, +0.006514f, -0.000328f, +0.000021f}, + {+0.097424f, -0.250345f, +0.019698f, -0.001078f, +0.000017f}, + {+0.169040f, -0.091237f, +0.017597f, +0.000283f, +0.000017f}, + {-0.049945f, -0.183685f, -0.013171f, -0.002034f, -0.000009f}, + {+0.051580f, +0.036720f, +0.010126f, -0.001380f, -0.000151f}, + {-0.125504f, +0.039269f, -0.013578f, -0.000208f, +0.000027f}, + {-0.070511f, +0.247836f, -0.009393f, -0.000912f, -0.000087f}, + {+0.075408f, -0.033832f, +0.006471f, +0.000223f, -0.000010f}, + {+0.010281f, +0.155017f, +0.004289f, -0.000279f, +0.000029f}, + {+0.128761f, +0.151968f, +0.010917f, +0.000111f, -0.000004f}, + {-0.047805f, -0.002840f, -0.010782f, -0.000029f, +0.000015f} + }, + { + {+0.280158f, -0.030000f, +0.043460f, +0.000075f, +0.000014f}, + {-0.336614f, +0.016258f, -0.050302f, -0.000297f, -0.000011f}, + {+0.002372f, +0.120514f, -0.000413f, -0.000319f, -0.000061f}, + {+0.016063f, -0.229902f, +0.006035f, +0.000097f, -0.000043f}, + {+0.028633f, +0.007390f, +0.002007f, +0.000039f, +0.000048f}, + {-0.005134f, +0.220494f, +0.003892f, +0.000252f, +0.000046f}, + {-0.096636f, +0.051599f, -0.015635f, +0.000127f, +0.000026f}, + {-0.105407f, +0.323356f, -0.007410f, +0.000133f, -0.000028f}, + {-0.087018f, -0.141885f, -0.014985f, +0.000005f, -0.000018f}, + {+0.018235f, +0.085003f, -0.002078f, -0.000390f, +0.000041f}, + {+0.049559f, -0.222425f, +0.001760f, +0.000043f, -0.000027f}, + {+0.087658f, +0.008493f, +0.002149f, -0.000327f, -0.000002f}, + {-0.025991f, +0.110117f, +0.002501f, +0.000106f, +0.000066f}, + {+0.073066f, +0.062410f, +0.006753f, +0.000139f, +0.000010f}, + {-0.012343f, +0.361812f, +0.000879f, +0.000019f, -0.000031f}, + {+0.008849f, -0.097553f, +0.003670f, +0.000140f, -0.000018f} + }, + { + {-0.006954f, -0.470379f, -0.000165f, -0.000551f, -0.000082f}, + {+0.019214f, +0.554319f, -0.001599f, +0.001129f, +0.000145f}, + {-0.050232f, +0.045555f, -0.004649f, -0.000015f, +0.000034f}, + {+0.117286f, -0.075343f, +0.011788f, -0.000390f, +0.000023f}, + {-0.013982f, -0.062149f, -0.000689f, +0.000526f, -0.000053f}, + {-0.064167f, +0.122065f, -0.007764f, +0.000174f, -0.000027f}, + {-0.057456f, +0.102739f, -0.012482f, +0.000929f, -0.000017f}, + {-0.086303f, +0.350740f, -0.008732f, -0.000319f, -0.000013f}, + {+0.114468f, +0.156124f, +0.012352f, +0.002008f, +0.000014f}, + {-0.063324f, -0.045704f, -0.011079f, +0.001189f, +0.000135f}, + {+0.081653f, -0.167815f, +0.010699f, +0.000264f, -0.000021f}, + {-0.009546f, -0.130825f, +0.003286f, +0.000952f, +0.000083f}, + {-0.034292f, +0.088622f, -0.006613f, -0.000382f, +0.000000f}, + {-0.064658f, -0.148003f, -0.007951f, +0.000319f, -0.000027f}, + {-0.118973f, +0.200930f, -0.010476f, -0.000078f, +0.000007f}, + {+0.061648f, -0.019855f, +0.007486f, +0.000045f, -0.000011f} + }, + { + {-0.287193f, -0.042900f, -0.042884f, -0.000074f, -0.000006f}, + {+0.316269f, +0.095647f, +0.050717f, +0.000419f, -0.000004f}, + {+0.024609f, -0.065464f, -0.001044f, +0.000352f, +0.000061f}, + {-0.090934f, +0.238549f, -0.014249f, -0.000001f, +0.000044f}, + {-0.019808f, -0.051257f, +0.001165f, -0.000156f, -0.000046f}, + {+0.048333f, -0.050030f, +0.007461f, -0.000269f, -0.000047f}, + {+0.082327f, -0.120302f, +0.020222f, -0.000034f, -0.000027f}, + {+0.165448f, -0.034472f, +0.017814f, +0.000021f, +0.000032f}, + {+0.033316f, +0.280356f, +0.011492f, -0.000020f, +0.000016f}, + {-0.008225f, -0.128802f, +0.005400f, +0.000223f, -0.000054f}, + {-0.088609f, +0.096391f, -0.012066f, -0.000087f, +0.000030f}, + {-0.036267f, -0.078389f, -0.005104f, +0.000176f, -0.000004f}, + {+0.020864f, +0.001946f, +0.003538f, -0.000159f, -0.000070f}, + {-0.031397f, -0.200648f, -0.000765f, -0.000186f, -0.000008f}, + {+0.119879f, -0.159775f, +0.011369f, +0.000002f, +0.000032f}, + {-0.036654f, +0.129414f, -0.004412f, -0.000114f, +0.000020f} + }, + { + {+0.055358f, +0.480776f, +0.007156f, +0.000440f, +0.000080f}, + {-0.069696f, -0.497403f, -0.009705f, -0.000945f, -0.000144f}, + {+0.014636f, -0.076742f, +0.003268f, +0.000063f, -0.000042f}, + {-0.098616f, +0.221987f, -0.012598f, +0.000348f, -0.000027f}, + {+0.038012f, +0.038810f, +0.004148f, -0.000514f, +0.000056f}, + {+0.010993f, -0.104517f, +0.004208f, -0.000219f, +0.000033f}, + {+0.073401f, -0.141057f, +0.006526f, -0.000916f, +0.000016f}, + {-0.033949f, -0.336614f, -0.001600f, +0.000255f, +0.000007f}, + {-0.139291f, +0.017101f, -0.017309f, -0.001860f, -0.000021f}, + {+0.085604f, +0.017452f, +0.013308f, -0.001048f, -0.000118f}, + {-0.029028f, +0.187952f, -0.005021f, -0.000216f, +0.000016f}, + {+0.006564f, -0.006493f, +0.001419f, -0.000780f, -0.000079f}, + {+0.020490f, +0.003411f, +0.006133f, +0.000307f, +0.000011f}, + {+0.091616f, -0.016927f, +0.008786f, -0.000287f, +0.000025f}, + {+0.009844f, -0.323610f, +0.003492f, +0.000078f, -0.000011f}, + {-0.056286f, +0.097814f, -0.006882f, -0.000079f, +0.000007f} + }, + { + {+0.282827f, +0.133300f, +0.042549f, +0.000086f, -0.000002f}, + {-0.297764f, -0.151816f, -0.046261f, -0.000499f, +0.000022f}, + {-0.010547f, -0.035236f, +0.000498f, -0.000494f, -0.000059f}, + {+0.144406f, -0.152441f, +0.023633f, -0.000028f, -0.000044f}, + {+0.000542f, +0.094714f, -0.004019f, +0.000229f, +0.000043f}, + {-0.041461f, -0.019853f, -0.008957f, +0.000418f, +0.000046f}, + {-0.123943f, +0.154058f, -0.020412f, +0.000069f, +0.000030f}, + {-0.130914f, -0.179670f, -0.017352f, -0.000111f, -0.000033f}, + {+0.036620f, -0.258117f, -0.000481f, +0.000034f, -0.000009f}, + {-0.021657f, +0.180451f, -0.009924f, -0.000053f, +0.000065f}, + {+0.095197f, -0.006584f, +0.013724f, +0.000061f, -0.000032f}, + {+0.011099f, -0.015338f, +0.000599f, -0.000168f, +0.000011f}, + {+0.002807f, +0.034719f, -0.003109f, +0.000353f, +0.000070f}, + {-0.041276f, +0.181885f, -0.005275f, +0.000201f, +0.000007f}, + {-0.125301f, -0.110921f, -0.015164f, -0.000039f, -0.000032f}, + {+0.066993f, -0.092159f, +0.009251f, +0.000136f, -0.000021f} + }, + { + {-0.104112f, -0.458657f, -0.013927f, -0.000353f, -0.000076f}, + {+0.111390f, +0.472799f, +0.015450f, +0.000704f, +0.000139f}, + {+0.000873f, -0.019121f, -0.001169f, -0.000093f, +0.000048f}, + {+0.056615f, -0.285336f, +0.007942f, -0.000391f, +0.000032f}, + {-0.055650f, +0.007065f, -0.007223f, +0.000546f, -0.000060f}, + {+0.018845f, +0.077039f, +0.001923f, +0.000256f, -0.000039f}, + {-0.051977f, +0.260211f, -0.006687f, +0.000819f, -0.000018f}, + {+0.110604f, +0.197201f, +0.015009f, -0.000259f, -0.000003f}, + {+0.118052f, -0.135388f, +0.015667f, +0.001612f, +0.000024f}, + {-0.098237f, +0.061993f, -0.014872f, +0.000974f, +0.000101f}, + {-0.016600f, -0.180900f, -0.001935f, +0.000217f, -0.000011f}, + {+0.024890f, +0.001895f, +0.000719f, +0.000667f, +0.000075f}, + {-0.052001f, -0.047705f, -0.008689f, -0.000203f, -0.000021f}, + {-0.051423f, +0.163687f, -0.007750f, +0.000277f, -0.000023f}, + {+0.092904f, +0.226447f, +0.010447f, -0.000087f, +0.000014f}, + {+0.029788f, -0.148840f, +0.003437f, +0.000063f, -0.000002f} + }, + { + {-0.265513f, -0.211642f, -0.040584f, -0.000055f, +0.000009f}, + {+0.279427f, +0.216928f, +0.044464f, +0.000461f, -0.000042f}, + {-0.017280f, +0.004077f, -0.001930f, +0.000533f, +0.000057f}, + {-0.175703f, +0.073912f, -0.028215f, +0.000106f, +0.000044f}, + {+0.032929f, -0.127864f, +0.007891f, -0.000307f, -0.000041f}, + {+0.023458f, +0.073855f, +0.003516f, -0.000521f, -0.000044f}, + {+0.165507f, -0.073413f, +0.027506f, -0.000119f, -0.000034f}, + {+0.058760f, +0.277549f, +0.005732f, +0.000115f, +0.000033f}, + {-0.086524f, +0.185360f, -0.006494f, -0.000114f, +0.000000f}, + {+0.068563f, -0.191058f, +0.014677f, -0.000094f, -0.000073f}, + {-0.083271f, -0.077777f, -0.010978f, -0.000035f, +0.000035f}, + {-0.032739f, +0.090968f, -0.003108f, +0.000130f, -0.000018f}, + {+0.012042f, -0.148829f, +0.005352f, -0.000453f, -0.000067f}, + {+0.074068f, -0.028523f, +0.009472f, -0.000233f, -0.000006f}, + {+0.054178f, +0.286348f, +0.004315f, +0.000011f, +0.000032f}, + {-0.081317f, +0.023039f, -0.011622f, -0.000155f, +0.000021f} + }, + { + {+0.144447f, +0.416258f, +0.019880f, +0.000298f, +0.000071f}, + {-0.149133f, -0.438088f, -0.020811f, -0.000535f, -0.000129f}, + {+0.015049f, +0.049287f, -0.000123f, +0.000146f, -0.000053f}, + {-0.004923f, +0.337598f, +0.000454f, +0.000368f, -0.000037f}, + {+0.051157f, -0.099533f, +0.006353f, -0.000530f, +0.000063f}, + {-0.036114f, -0.015276f, -0.002183f, -0.000257f, +0.000042f}, + {-0.001423f, -0.329473f, -0.000629f, -0.000758f, +0.000021f}, + {-0.137836f, -0.026570f, -0.019057f, +0.000357f, +0.000002f}, + {-0.074813f, +0.206610f, -0.009222f, -0.001398f, -0.000023f}, + {+0.082213f, -0.168162f, +0.013202f, -0.000891f, -0.000086f}, + {+0.053436f, +0.133406f, +0.007060f, -0.000274f, +0.000004f}, + {-0.031202f, +0.097339f, -0.000600f, -0.000565f, -0.000069f}, + {+0.084087f, -0.042545f, +0.010288f, +0.000114f, +0.000027f}, + {-0.011630f, -0.156396f, +0.002102f, -0.000281f, +0.000021f}, + {-0.139327f, -0.009640f, -0.015858f, +0.000166f, -0.000017f}, + {+0.001227f, +0.149601f, +0.000552f, -0.000041f, -0.000002f} + }, + { + {+0.243657f, +0.264257f, +0.037689f, -0.000001f, -0.000015f}, + {-0.259444f, -0.270037f, -0.041639f, -0.000297f, +0.000058f}, + {+0.024732f, +0.031819f, +0.004944f, -0.000508f, -0.000056f}, + {+0.188302f, +0.043036f, +0.027818f, -0.000121f, -0.000045f}, + {-0.061013f, +0.068025f, -0.009284f, +0.000332f, +0.000040f}, + {+0.005481f, -0.077635f, -0.001849f, +0.000481f, +0.000044f}, + {-0.183484f, -0.052352f, -0.028430f, +0.000255f, +0.000038f}, + {+0.021508f, -0.270954f, +0.003464f, -0.000123f, -0.000034f}, + {+0.112315f, -0.086235f, +0.009937f, +0.000307f, +0.000007f}, + {-0.107969f, +0.120398f, -0.018769f, +0.000181f, +0.000082f}, + {+0.056786f, +0.126822f, +0.007959f, +0.000033f, -0.000039f}, + {+0.069219f, -0.054400f, +0.005730f, -0.000053f, +0.000023f}, + {-0.070651f, +0.193415f, -0.010674f, +0.000389f, +0.000067f}, + {-0.051509f, -0.092171f, -0.007870f, +0.000294f, +0.000005f}, + {+0.051121f, -0.299571f, +0.006590f, -0.000024f, -0.000032f}, + {+0.084035f, +0.019475f, +0.012921f, +0.000164f, -0.000021f} + }, + { + {-0.178130f, -0.383088f, -0.025598f, -0.000261f, -0.000067f}, + {+0.182587f, +0.405974f, +0.025901f, +0.000462f, +0.000117f}, + {-0.033772f, -0.059691f, -0.003877f, -0.000106f, +0.000059f}, + {-0.056171f, -0.329183f, -0.006810f, -0.000311f, +0.000043f}, + {-0.030324f, +0.107424f, -0.007446f, +0.000469f, -0.000068f}, + {+0.029083f, -0.038828f, +0.003047f, +0.000232f, -0.000046f}, + {+0.074081f, +0.341332f, +0.009025f, +0.000675f, -0.000027f}, + {+0.114367f, -0.124510f, +0.017364f, -0.000363f, -0.000002f}, + {+0.019963f, -0.231444f, +0.001211f, +0.001284f, +0.000019f}, + {-0.044510f, +0.213643f, -0.009811f, +0.000749f, +0.000069f}, + {-0.075343f, -0.079800f, -0.011596f, +0.000341f, +0.000004f}, + {-0.002994f, -0.163592f, -0.001034f, +0.000473f, +0.000063f}, + {-0.066930f, +0.201208f, -0.008014f, -0.000114f, -0.000031f}, + {+0.046049f, +0.057169f, +0.003278f, +0.000251f, -0.000018f}, + {+0.102214f, -0.218411f, +0.013142f, -0.000169f, +0.000019f}, + {-0.034525f, -0.167091f, -0.007400f, +0.000056f, +0.000007f} + }, + { + {-0.222238f, -0.317392f, -0.033615f, +0.000033f, +0.000021f}, + {+0.241813f, +0.315693f, +0.038994f, +0.000147f, -0.000070f}, + {-0.020356f, -0.081902f, -0.002758f, +0.000479f, +0.000060f}, + {-0.167023f, -0.157180f, -0.026364f, +0.000127f, +0.000047f}, + {+0.066143f, -0.046203f, +0.014148f, -0.000357f, -0.000040f}, + {-0.022432f, +0.042335f, -0.001522f, -0.000437f, -0.000048f}, + {+0.157680f, +0.214692f, +0.024775f, -0.000379f, -0.000040f}, + {-0.074512f, +0.166548f, -0.010491f, +0.000080f, +0.000039f}, + {-0.105735f, -0.034968f, -0.008768f, -0.000539f, -0.000010f}, + {+0.123458f, -0.044963f, +0.022305f, -0.000260f, -0.000091f}, + {-0.027259f, -0.155333f, -0.002873f, -0.000021f, +0.000041f}, + {-0.074325f, -0.052152f, -0.007210f, -0.000007f, -0.000026f}, + {+0.123302f, -0.087187f, +0.015137f, -0.000263f, -0.000074f}, + {+0.007845f, +0.113256f, +0.003459f, -0.000313f, -0.000004f}, + {-0.120092f, +0.122041f, -0.014660f, +0.000024f, +0.000034f}, + {-0.076429f, -0.107035f, -0.008690f, -0.000173f, +0.000022f} + }, + { + {+0.213344f, +0.349398f, +0.030097f, +0.000237f, +0.000063f}, + {-0.219215f, -0.390772f, -0.031915f, -0.000487f, -0.000107f}, + {+0.052529f, +0.029499f, +0.005648f, -0.000100f, -0.000070f}, + {+0.095709f, +0.245511f, +0.012927f, +0.000199f, -0.000053f}, + {+0.028737f, -0.105483f, +0.003866f, -0.000348f, +0.000076f}, + {-0.013337f, +0.055289f, -0.001002f, -0.000053f, +0.000054f}, + {-0.130180f, -0.225228f, -0.015900f, -0.000591f, +0.000035f}, + {-0.068381f, +0.171403f, -0.012635f, +0.000260f, +0.000000f}, + {+0.025988f, +0.167605f, +0.004069f, -0.001280f, -0.000015f}, + {+0.008972f, -0.221115f, +0.003663f, -0.000531f, -0.000048f}, + {+0.090641f, +0.028424f, +0.013918f, -0.000378f, -0.000016f}, + {+0.038654f, +0.120101f, +0.004990f, -0.000461f, -0.000057f}, + {+0.005905f, -0.263875f, +0.003095f, +0.000269f, +0.000040f}, + {-0.040815f, +0.035273f, -0.004946f, -0.000197f, +0.000014f}, + {-0.018746f, +0.272655f, -0.004798f, +0.000121f, -0.000023f}, + {+0.076538f, +0.124942f, +0.010206f, -0.000084f, -0.000014f} + }, + { + {+0.192920f, +0.381741f, +0.029300f, -0.000048f, -0.000026f}, + {-0.222170f, -0.388402f, -0.034955f, -0.000099f, +0.000080f}, + {+0.001699f, +0.107240f, +0.000947f, -0.000519f, -0.000066f}, + {+0.136658f, +0.180309f, +0.023176f, -0.000174f, -0.000048f}, + {-0.088774f, +0.075575f, -0.016123f, +0.000436f, +0.000040f}, + {+0.024745f, -0.004479f, +0.001974f, +0.000454f, +0.000055f}, + {-0.102774f, -0.266722f, -0.019008f, +0.000449f, +0.000041f}, + {+0.092562f, -0.080882f, +0.015366f, -0.000075f, -0.000049f}, + {+0.070990f, +0.091884f, +0.006305f, +0.000702f, +0.000009f}, + {-0.128422f, -0.011753f, -0.022348f, +0.000409f, +0.000098f}, + {-0.011288f, +0.189192f, -0.003841f, -0.000041f, -0.000039f}, + {+0.054725f, +0.090752f, +0.006454f, +0.000058f, +0.000028f}, + {-0.128788f, -0.054495f, -0.017806f, +0.000292f, +0.000085f}, + {+0.020286f, -0.059861f, +0.001026f, +0.000246f, +0.000006f}, + {+0.120848f, +0.054441f, +0.017027f, -0.000075f, -0.000037f}, + {+0.034321f, +0.188962f, +0.004725f, +0.000162f, -0.000021f} + }, + { + {-0.244141f, -0.287056f, -0.034191f, -0.000192f, -0.000058f}, + {+0.264405f, +0.355877f, +0.037791f, +0.000515f, +0.000101f}, + {-0.059687f, +0.011038f, -0.007243f, +0.000348f, +0.000093f}, + {-0.113575f, -0.207201f, -0.018101f, -0.000078f, +0.000070f}, + {-0.015137f, +0.192002f, +0.000035f, +0.000213f, -0.000092f}, + {+0.000786f, -0.038825f, +0.000032f, -0.000190f, -0.000073f}, + {+0.148464f, +0.121467f, +0.020501f, +0.000551f, -0.000044f}, + {+0.029628f, -0.179066f, +0.005364f, -0.000049f, +0.000007f}, + {-0.038114f, -0.078616f, -0.007491f, +0.001320f, +0.000017f}, + {+0.025506f, +0.225558f, +0.001578f, +0.000313f, +0.000019f}, + {-0.093865f, +0.065189f, -0.011642f, +0.000361f, +0.000030f}, + {-0.055369f, -0.081537f, -0.009138f, +0.000492f, +0.000055f}, + {+0.051502f, +0.222620f, +0.004584f, -0.000598f, -0.000061f}, + {+0.019309f, -0.058544f, +0.003257f, +0.000181f, -0.000009f}, + {-0.051402f, -0.209177f, -0.004739f, -0.000005f, +0.000032f}, + {-0.088918f, +0.001217f, -0.011717f, +0.000085f, +0.000023f} + }, + { + {-0.156411f, -0.421444f, -0.024491f, +0.000067f, +0.000032f}, + {+0.186613f, +0.476552f, +0.029757f, +0.000163f, -0.000095f}, + {+0.020430f, -0.113691f, +0.002893f, +0.000775f, +0.000065f}, + {-0.119151f, -0.201740f, -0.018300f, +0.000297f, +0.000045f}, + {+0.119879f, -0.010231f, +0.016974f, -0.000596f, -0.000034f}, + {-0.016380f, -0.009027f, -0.002417f, -0.000683f, -0.000057f}, + {+0.054627f, +0.269651f, +0.010810f, -0.000526f, -0.000040f}, + {-0.097390f, +0.017005f, -0.015311f, +0.000161f, +0.000060f}, + {-0.042266f, -0.067204f, -0.002884f, -0.000753f, -0.000009f}, + {+0.124653f, +0.076460f, +0.020814f, -0.000683f, -0.000097f}, + {+0.063103f, -0.174209f, +0.008521f, +0.000147f, +0.000032f}, + {-0.034711f, -0.112933f, -0.002461f, -0.000059f, -0.000029f}, + {+0.100579f, +0.144714f, +0.014721f, -0.000551f, -0.000093f}, + {-0.025957f, +0.015194f, -0.003388f, -0.000192f, -0.000011f}, + {-0.076574f, -0.167585f, -0.012107f, +0.000148f, +0.000039f}, + {+0.014876f, -0.155274f, +0.000070f, -0.000119f, +0.000015f} + }, + { + {+0.265430f, +0.225416f, +0.037831f, +0.000115f, +0.000053f}, + {-0.306311f, -0.277325f, -0.043227f, -0.000433f, -0.000096f}, + {+0.056945f, -0.056467f, +0.006568f, -0.000476f, -0.000127f}, + {+0.136114f, +0.189590f, +0.020608f, +0.000082f, -0.000092f}, + {-0.029899f, -0.236698f, -0.003149f, -0.000187f, +0.000112f}, + {-0.002353f, +0.011865f, +0.000725f, +0.000346f, +0.000104f}, + {-0.149926f, -0.044328f, -0.020529f, -0.000533f, +0.000055f}, + {+0.006499f, +0.177667f, -0.000005f, -0.000147f, -0.000024f}, + {+0.030173f, +0.047667f, +0.008504f, -0.001253f, -0.000024f}, + {-0.058868f, -0.204995f, -0.005519f, -0.000216f, +0.000017f}, + {+0.060797f, -0.176638f, +0.008488f, -0.000290f, -0.000044f}, + {+0.066026f, +0.042360f, +0.010165f, -0.000503f, -0.000055f}, + {-0.083588f, -0.140991f, -0.010070f, +0.000860f, +0.000099f}, + {-0.004801f, +0.048462f, -0.000139f, -0.000150f, +0.000006f}, + {+0.080388f, +0.074103f, +0.009601f, -0.000068f, -0.000044f}, + {+0.065811f, -0.073786f, +0.011524f, -0.000018f, -0.000032f} + }, + { + {+0.119762f, +0.449669f, +0.018731f, -0.000115f, -0.000039f}, + {-0.134482f, -0.541069f, -0.022864f, -0.000250f, +0.000117f}, + {-0.042132f, +0.097515f, -0.006293f, -0.001210f, -0.000046f}, + {+0.098328f, +0.249713f, +0.014715f, -0.000530f, -0.000029f}, + {-0.121827f, -0.094517f, -0.018717f, +0.000823f, +0.000016f}, + {+0.013897f, -0.016128f, +0.002834f, +0.001121f, +0.000043f}, + {-0.013035f, -0.259005f, -0.004212f, +0.000650f, +0.000036f}, + {+0.088488f, +0.051805f, +0.014091f, -0.000366f, -0.000066f}, + {+0.034103f, +0.039837f, +0.000657f, +0.000674f, +0.000017f}, + {-0.110624f, -0.126988f, -0.019030f, +0.001012f, +0.000081f}, + {-0.093230f, +0.059767f, -0.012720f, -0.000213f, -0.000018f}, + {+0.010158f, +0.127393f, -0.000864f, -0.000011f, +0.000034f}, + {-0.063926f, -0.170726f, -0.009503f, +0.001011f, +0.000084f}, + {+0.027512f, -0.003892f, +0.003562f, +0.000233f, +0.000020f}, + {+0.023442f, +0.159229f, +0.006050f, -0.000235f, -0.000035f}, + {-0.037775f, +0.088532f, -0.005468f, +0.000062f, -0.000004f} + }, + { + {-0.281213f, -0.164420f, -0.039852f, -0.000042f, -0.000045f}, + {+0.333286f, +0.175696f, +0.047590f, +0.000222f, +0.000083f}, + {-0.046428f, +0.089416f, -0.005265f, +0.000281f, +0.000164f}, + {-0.162498f, -0.149672f, -0.023881f, -0.000229f, +0.000114f}, + {+0.075028f, +0.208672f, +0.010268f, +0.000343f, -0.000132f}, + {+0.011727f, -0.019516f, -0.000540f, -0.000212f, -0.000139f}, + {+0.140528f, -0.025264f, +0.018383f, +0.000497f, -0.000067f}, + {-0.033739f, -0.136327f, -0.003526f, +0.000118f, +0.000049f}, + {-0.027078f, -0.053959f, -0.007554f, +0.001057f, +0.000031f}, + {+0.086060f, +0.177107f, +0.010290f, +0.000364f, -0.000050f}, + {-0.010787f, +0.184727f, -0.002953f, +0.000174f, +0.000054f}, + {-0.067502f, +0.008050f, -0.010245f, +0.000436f, +0.000057f}, + {+0.094254f, +0.075792f, +0.012552f, -0.000706f, -0.000144f}, + {-0.009743f, -0.063892f, -0.003613f, +0.000014f, -0.000006f}, + {-0.069093f, +0.013884f, -0.010485f, -0.000027f, +0.000058f}, + {-0.040587f, +0.086338f, -0.006898f, -0.000093f, +0.000039f} + }, + { + {-0.083222f, -0.468035f, -0.013503f, +0.000232f, +0.000044f}, + {+0.075896f, +0.571385f, +0.014672f, +0.000160f, -0.000148f}, + {+0.064646f, -0.084083f, +0.009714f, +0.001578f, +0.000001f}, + {-0.061670f, -0.306739f, -0.009048f, +0.000650f, -0.000001f}, + {+0.101027f, +0.169945f, +0.015494f, -0.000962f, +0.000016f}, + {-0.029442f, +0.045651f, -0.004343f, -0.001546f, -0.000004f}, + {-0.024934f, +0.231230f, -0.000602f, -0.000728f, -0.000028f}, + {-0.072285f, -0.076179f, -0.012914f, +0.000746f, +0.000059f}, + {-0.032566f, -0.041990f, -0.000543f, -0.000656f, -0.000034f}, + {+0.090764f, +0.173219f, +0.015307f, -0.001207f, -0.000044f}, + {+0.090276f, +0.027741f, +0.013865f, +0.000091f, -0.000003f}, + {+0.018263f, -0.122358f, +0.003953f, +0.000094f, -0.000045f}, + {+0.030642f, +0.175289f, +0.004377f, -0.001562f, -0.000047f}, + {-0.023328f, -0.044760f, -0.001438f, -0.000338f, -0.000032f}, + {+0.006646f, -0.104149f, -0.000978f, +0.000365f, +0.000024f}, + {+0.048240f, -0.050757f, +0.006981f, -0.000141f, -0.000013f} + }, + { + {+0.293187f, +0.109518f, +0.041947f, +0.000007f, +0.000034f}, + {-0.344718f, -0.073613f, -0.049496f, +0.000072f, -0.000056f}, + {+0.021693f, -0.150854f, +0.000496f, +0.000303f, -0.000187f}, + {+0.175693f, +0.054150f, +0.024494f, +0.000572f, -0.000126f}, + {-0.106866f, -0.149507f, -0.014360f, -0.000666f, +0.000140f}, + {-0.005446f, +0.082692f, +0.002403f, -0.000314f, +0.000163f}, + {-0.114767f, +0.094767f, -0.014918f, -0.000548f, +0.000078f}, + {+0.049475f, +0.114052f, +0.007022f, +0.000118f, -0.000074f}, + {+0.031125f, +0.054985f, +0.008404f, -0.000705f, -0.000030f}, + {-0.107661f, -0.132716f, -0.012982f, -0.000706f, +0.000070f}, + {-0.028176f, -0.155327f, -0.002943f, -0.000018f, -0.000055f}, + {+0.051419f, -0.071483f, +0.007973f, -0.000234f, -0.000055f}, + {-0.090400f, -0.012443f, -0.011441f, +0.000118f, +0.000180f}, + {+0.025522f, +0.028081f, +0.003864f, +0.000120f, +0.000013f}, + {+0.045874f, -0.043114f, +0.007466f, +0.000223f, -0.000070f}, + {+0.014499f, -0.105809f, +0.003088f, +0.000276f, -0.000039f} + }, + { + {+0.046789f, +0.488561f, +0.007479f, -0.000388f, -0.000046f}, + {-0.018640f, -0.575973f, -0.005892f, +0.000203f, +0.000177f}, + {-0.079067f, +0.002856f, -0.010533f, -0.001448f, +0.000068f}, + {+0.016267f, +0.296423f, +0.004542f, -0.000403f, +0.000045f}, + {-0.068852f, -0.208415f, -0.010824f, +0.000748f, -0.000061f}, + {+0.046351f, +0.003708f, +0.005559f, +0.001546f, -0.000058f}, + {+0.047339f, -0.155305f, +0.003323f, +0.000760f, +0.000014f}, + {+0.060540f, +0.100086f, +0.009755f, -0.001008f, -0.000039f}, + {+0.028568f, +0.054083f, +0.000810f, +0.000898f, +0.000057f}, + {-0.065074f, -0.200619f, -0.010710f, +0.000928f, -0.000007f}, + {-0.072568f, -0.087920f, -0.011704f, +0.000262f, +0.000027f}, + {-0.035957f, +0.060576f, -0.005664f, -0.000112f, +0.000061f}, + {-0.005716f, -0.143119f, -0.000691f, +0.001673f, -0.000018f}, + {+0.004173f, +0.058408f, +0.000175f, +0.000594f, +0.000044f}, + {-0.014414f, +0.051132f, -0.000839f, -0.000345f, -0.000005f}, + {-0.049091f, -0.010855f, -0.005751f, +0.000426f, +0.000033f} + }, + { + {-0.304340f, -0.049256f, -0.042947f, -0.000088f, -0.000022f}, + {+0.346449f, -0.017003f, +0.049621f, -0.000139f, +0.000009f}, + {+0.019745f, +0.150866f, +0.002851f, -0.000874f, +0.000177f}, + {-0.162730f, +0.020120f, -0.025248f, -0.000808f, +0.000118f}, + {+0.121162f, +0.084738f, +0.017259f, +0.000808f, -0.000129f}, + {-0.021528f, -0.096693f, -0.003962f, +0.000943f, -0.000157f}, + {+0.080586f, -0.103642f, +0.011291f, +0.000589f, -0.000085f}, + {-0.068191f, -0.098030f, -0.009096f, -0.000708f, +0.000092f}, + {-0.036751f, -0.046076f, -0.010119f, +0.000284f, +0.000015f}, + {+0.119856f, +0.085575f, +0.015319f, +0.000749f, -0.000064f}, + {+0.056191f, +0.109851f, +0.006441f, +0.000263f, +0.000045f}, + {-0.024446f, +0.076942f, -0.005466f, -0.000057f, +0.000045f}, + {+0.077086f, -0.012676f, +0.010840f, +0.000676f, -0.000186f}, + {-0.022826f, +0.016537f, -0.004763f, -0.000058f, -0.000029f}, + {-0.027607f, +0.031101f, -0.005172f, -0.000482f, +0.000074f}, + {+0.014855f, +0.087430f, -0.000738f, -0.000308f, +0.000029f} + }, + { + {-0.005004f, -0.508800f, -0.001655f, +0.000570f, +0.000043f}, + {-0.037995f, +0.575156f, -0.001530f, -0.000956f, -0.000194f}, + {+0.063856f, +0.080957f, +0.012812f, -0.000366f, -0.000142f}, + {+0.010948f, -0.247204f, +0.002839f, -0.000988f, -0.000091f}, + {+0.037852f, +0.213873f, +0.003692f, +0.000614f, +0.000107f}, + {-0.039839f, -0.066118f, -0.007988f, -0.000076f, +0.000128f}, + {-0.045977f, +0.093672f, -0.005215f, -0.000506f, +0.000005f}, + {-0.041130f, -0.141991f, -0.007462f, +0.000858f, +0.000008f}, + {-0.021819f, -0.064730f, +0.000517f, -0.001640f, -0.000079f}, + {+0.039217f, +0.211900f, +0.002725f, +0.000921f, +0.000061f}, + {+0.045306f, +0.127706f, +0.011256f, -0.001493f, -0.000048f}, + {+0.032008f, -0.009436f, +0.005842f, -0.000094f, -0.000078f}, + {-0.004712f, +0.114810f, -0.003709f, -0.000227f, +0.000095f}, + {+0.008291f, -0.029832f, +0.002509f, -0.001272f, -0.000051f}, + {+0.010544f, -0.029052f, +0.001437f, -0.000138f, -0.000018f}, + {+0.030918f, +0.063638f, +0.005584f, -0.001227f, -0.000052f} + }, + { + {+0.309505f, -0.026680f, +0.043359f, +0.000419f, +0.000012f}, + {-0.340746f, +0.112091f, -0.048231f, -0.000694f, +0.000055f}, + {-0.050908f, -0.091302f, -0.002377f, +0.001134f, -0.000125f}, + {+0.144586f, -0.040667f, +0.026484f, +0.000403f, -0.000085f}, + {-0.123071f, -0.035557f, -0.020641f, -0.000216f, +0.000092f}, + {+0.043825f, +0.058128f, +0.002805f, -0.001548f, +0.000111f}, + {-0.057009f, +0.077140f, -0.008666f, -0.000464f, +0.000085f}, + {+0.083496f, +0.049994f, +0.012188f, +0.002184f, -0.000094f}, + {+0.041301f, +0.031775f, +0.012825f, +0.000028f, +0.000015f}, + {-0.123609f, -0.042304f, -0.020375f, +0.000225f, +0.000027f}, + {-0.072663f, -0.052460f, -0.006157f, -0.001671f, -0.000023f}, + {+0.007106f, -0.047603f, +0.003493f, +0.000487f, -0.000023f}, + {-0.066995f, +0.014584f, -0.013984f, -0.001717f, +0.000149f}, + {+0.012333f, -0.023056f, +0.004831f, -0.000535f, +0.000051f}, + {+0.018093f, -0.018206f, +0.005001f, +0.000871f, -0.000068f}, + {-0.032484f, -0.034633f, +0.000235f, -0.000375f, -0.000007f} + } +}; + +#endif + +#ifdef USE_HRIR_128_48000_DOLBY_SBA2 + +const float FASTCONV_HOA2_latency_s = 0.000666667f; +const float leftHRIRReal_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]= +{ + { + {-0.005335f, +0.653226f, +0.143797f, +0.002456f, -0.000002f}, + {-0.013208f, +0.379140f, -0.322559f, -0.004978f, -0.000009f}, + {+0.001925f, +0.054222f, +0.043071f, -0.002449f, -0.000110f}, + {-0.000927f, +0.060176f, -0.015580f, -0.001281f, -0.000042f}, + {+0.003471f, +0.011471f, +0.002826f, +0.001074f, -0.000026f}, + {+0.003706f, -0.001098f, -0.005680f, +0.008863f, +0.000084f}, + {-0.005326f, -0.000766f, -0.002007f, -0.003072f, +0.000014f}, + {+0.001747f, -0.039662f, +0.085770f, +0.000859f, +0.000050f}, + {-0.009494f, +0.084274f, -0.084910f, -0.005996f, -0.000078f} + }, + { + {+0.020549f, +0.471556f, -0.054545f, -0.003976f, +0.000002f}, + {+0.031621f, +0.813566f, +0.056755f, +0.007166f, +0.000006f}, + {-0.002271f, -0.021372f, -0.026223f, +0.003087f, +0.000136f}, + {+0.000511f, +0.035700f, -0.040529f, +0.002564f, +0.000048f}, + {-0.007142f, -0.001751f, -0.001329f, -0.002743f, +0.000028f}, + {-0.006527f, -0.051957f, -0.070578f, -0.014200f, -0.000113f}, + {+0.014135f, +0.025109f, +0.015403f, +0.005652f, -0.000015f}, + {-0.003291f, -0.069019f, +0.036066f, +0.001141f, -0.000069f}, + {+0.028061f, +0.152663f, -0.025603f, +0.008277f, +0.000102f} + }, + { + {-0.039663f, +0.412008f, +0.017452f, +0.000445f, +0.000002f}, + {-0.026960f, +0.962971f, +0.087407f, +0.001953f, +0.000014f}, + {-0.001486f, -0.002955f, -0.054042f, +0.000085f, +0.000075f}, + {+0.003107f, +0.048844f, -0.051503f, -0.002108f, +0.000034f}, + {+0.009864f, -0.005169f, -0.019159f, +0.003128f, +0.000025f}, + {+0.004987f, -0.054770f, -0.099413f, +0.003316f, -0.000044f}, + {-0.024855f, +0.021795f, +0.065786f, -0.002538f, -0.000013f}, + {+0.003623f, +0.018186f, -0.058320f, -0.005763f, -0.000022f}, + {-0.055010f, +0.126807f, +0.109029f, +0.001546f, +0.000045f} + }, + { + {+0.043174f, +0.455537f, -0.027678f, +0.002529f, -0.000002f}, + {-0.025122f, +0.922813f, +0.028063f, -0.008613f, -0.000006f}, + {+0.002020f, +0.051124f, -0.010761f, +0.000153f, -0.000146f}, + {-0.010597f, +0.081732f, -0.001493f, +0.001479f, -0.000051f}, + {-0.024810f, +0.014152f, +0.030508f, -0.002185f, -0.000029f}, + {-0.011648f, +0.040215f, +0.008697f, +0.003893f, +0.000125f}, + {+0.043616f, -0.007408f, -0.035355f, -0.000987f, +0.000015f}, + {-0.007698f, +0.031375f, -0.028885f, +0.004919f, +0.000076f}, + {+0.093586f, +0.162669f, -0.029770f, -0.007128f, -0.000112f} + }, + { + {-0.001041f, +0.494032f, +0.005715f, -0.001108f, -0.000002f}, + {+0.143821f, +0.682007f, -0.029450f, +0.003481f, -0.000019f}, + {+0.006306f, +0.070613f, -0.011179f, -0.001860f, -0.000038f}, + {+0.031146f, +0.059515f, -0.014381f, -0.000905f, -0.000027f}, + {+0.052905f, -0.051459f, -0.001250f, +0.000868f, -0.000023f}, + {+0.029241f, +0.030800f, +0.000944f, -0.000488f, -0.000000f}, + {-0.055716f, +0.063529f, +0.002159f, +0.000641f, +0.000013f}, + {+0.013468f, -0.008041f, -0.000774f, +0.000134f, -0.000007f}, + {-0.101473f, +0.336570f, +0.012535f, +0.003233f, -0.000009f} + }, + { + {-0.092816f, +0.358882f, +0.002536f, -0.001449f, +0.000001f}, + {-0.262828f, +0.127251f, -0.020151f, +0.004341f, +0.000009f}, + {-0.022963f, +0.059857f, +0.016901f, +0.000212f, +0.000141f}, + {-0.064426f, -0.041934f, +0.012804f, -0.000049f, +0.000052f}, + {-0.064139f, -0.206373f, +0.000508f, -0.000138f, +0.000031f}, + {-0.035857f, -0.035091f, +0.016850f, -0.002300f, -0.000120f}, + {+0.032908f, +0.170386f, -0.004178f, +0.001249f, -0.000015f}, + {-0.010158f, -0.037569f, +0.007236f, -0.002146f, -0.000070f}, + {+0.021780f, +0.486360f, -0.004267f, +0.000644f, +0.000106f} + }, + { + {+0.166528f, -0.018320f, +0.002944f, +0.001057f, +0.000002f}, + {+0.217141f, -0.537828f, +0.015478f, -0.003353f, +0.000022f}, + {+0.036889f, -0.008294f, -0.001367f, +0.001254f, +0.000008f}, + {+0.069514f, -0.229400f, +0.010249f, +0.000566f, +0.000020f}, + {+0.019714f, -0.330742f, +0.003692f, -0.000002f, +0.000022f}, + {+0.010625f, -0.080582f, -0.010145f, +0.000258f, +0.000041f}, + {+0.022526f, +0.170893f, +0.014154f, -0.001025f, -0.000013f}, + {-0.007441f, -0.048091f, +0.004112f, +0.000974f, +0.000032f}, + {+0.115639f, +0.344255f, +0.014295f, -0.000177f, -0.000021f} + }, + { + {-0.099909f, -0.399087f, -0.008044f, +0.000848f, -0.000001f}, + {+0.054243f, -0.757012f, +0.020850f, -0.002283f, -0.000013f}, + {-0.025209f, -0.091980f, -0.004347f, +0.000486f, -0.000127f}, + {+0.003575f, -0.340857f, -0.007962f, -0.000163f, -0.000051f}, + {+0.071769f, -0.265803f, -0.002595f, +0.000097f, -0.000034f}, + {+0.026489f, -0.035458f, +0.005585f, +0.001110f, +0.000100f}, + {-0.060623f, +0.023422f, -0.010689f, -0.000403f, +0.000015f}, + {+0.027371f, -0.008448f, -0.007673f, -0.000192f, +0.000053f}, + {-0.176311f, -0.087697f, -0.004740f, -0.000958f, -0.000089f} + }, + { + {-0.098192f, -0.380559f, -0.012062f, -0.000872f, -0.000003f}, + {-0.307522f, -0.201411f, -0.041908f, +0.002386f, -0.000023f}, + {-0.016794f, -0.090327f, -0.008151f, -0.001481f, +0.000012f}, + {-0.117497f, -0.178818f, -0.001213f, -0.000161f, -0.000015f}, + {-0.130667f, +0.017905f, -0.002862f, -0.000224f, -0.000021f}, + {-0.026816f, +0.061563f, -0.002730f, -0.000500f, -0.000070f}, + {+0.035111f, -0.133808f, +0.000916f, +0.000421f, +0.000014f}, + {-0.028071f, +0.069426f, -0.005372f, -0.000149f, -0.000048f}, + {+0.069362f, -0.446237f, -0.000098f, +0.000728f, +0.000041f} + }, + { + {+0.200424f, +0.084933f, +0.029127f, -0.000528f, +0.000002f}, + {+0.208158f, +0.589613f, +0.015424f, +0.001691f, +0.000018f}, + {+0.041516f, +0.016661f, +0.015205f, -0.000153f, +0.000109f}, + {+0.138467f, +0.186187f, +0.007440f, -0.000185f, +0.000051f}, + {+0.077086f, +0.303705f, -0.003329f, +0.000036f, +0.000037f}, + {-0.020310f, +0.080808f, +0.007043f, -0.000054f, -0.000070f}, + {+0.031948f, -0.141008f, -0.000818f, +0.000548f, -0.000016f}, + {+0.000366f, +0.119534f, +0.006275f, +0.000355f, -0.000032f}, + {+0.109021f, -0.372983f, +0.009320f, +0.000129f, +0.000067f} + }, + { + {-0.031292f, +0.437887f, -0.005797f, +0.000706f, +0.000004f}, + {+0.174454f, +0.640794f, +0.027817f, -0.001980f, +0.000023f}, + {+0.003185f, +0.089160f, -0.003572f, +0.001064f, -0.000021f}, + {-0.004179f, +0.383165f, +0.003748f, +0.000389f, +0.000011f}, + {+0.056596f, +0.310132f, +0.010567f, +0.000223f, +0.000018f}, + {+0.057823f, -0.028077f, +0.000893f, +0.000451f, +0.000085f}, + {-0.063559f, +0.001711f, -0.003009f, -0.000543f, -0.000016f}, + {+0.035766f, +0.073579f, +0.002518f, +0.000224f, +0.000053f}, + {-0.161175f, +0.042780f, -0.016398f, -0.000634f, -0.000050f} + }, + { + {-0.205155f, +0.167329f, -0.030119f, +0.000379f, -0.000002f}, + {-0.339082f, -0.153701f, -0.034923f, -0.001267f, -0.000022f}, + {-0.072520f, -0.022480f, -0.011077f, +0.000072f, -0.000094f}, + {-0.141121f, +0.163887f, -0.018765f, +0.000088f, -0.000051f}, + {-0.127275f, +0.020840f, -0.015322f, +0.000034f, -0.000041f}, + {-0.027665f, -0.152414f, -0.006975f, -0.000222f, +0.000038f}, + {+0.020531f, +0.124947f, +0.003832f, -0.000374f, +0.000019f}, + {-0.042138f, -0.039811f, -0.003937f, -0.000440f, +0.000012f}, + {+0.031495f, +0.327305f, +0.001379f, +0.000105f, -0.000048f} + }, + { + {+0.145847f, -0.370580f, +0.020419f, -0.000633f, -0.000004f}, + {+0.026755f, -0.715695f, -0.002721f, +0.001713f, -0.000021f}, + {+0.048263f, -0.214620f, +0.011454f, -0.000799f, +0.000024f}, + {+0.105105f, -0.209642f, +0.009809f, -0.000393f, -0.000007f}, + {+0.046673f, -0.240709f, +0.003039f, -0.000354f, -0.000014f}, + {-0.046604f, -0.126235f, -0.001254f, -0.000637f, -0.000087f}, + {+0.040919f, +0.089993f, +0.004646f, +0.000614f, +0.000016f}, + {+0.003849f, -0.106327f, -0.000606f, -0.000255f, -0.000050f}, + {+0.114169f, +0.187796f, +0.016720f, +0.000604f, +0.000050f} + }, + { + {+0.151563f, -0.357850f, +0.023901f, -0.000267f, +0.000003f}, + {+0.329416f, -0.240852f, +0.037687f, +0.000972f, +0.000025f}, + {+0.079637f, -0.178703f, +0.006277f, -0.000085f, +0.000084f}, + {+0.067743f, -0.255542f, +0.013928f, -0.000093f, +0.000052f}, + {+0.085616f, -0.171409f, +0.015038f, -0.000016f, +0.000044f}, + {+0.080584f, +0.060419f, +0.009795f, +0.000260f, -0.000011f}, + {-0.039270f, -0.029107f, -0.004384f, +0.000149f, -0.000022f}, + {+0.040700f, -0.048532f, +0.005694f, +0.000308f, +0.000003f}, + {-0.100428f, -0.143102f, -0.013507f, -0.000175f, +0.000032f} + }, + { + {-0.221520f, +0.217382f, -0.031802f, +0.000571f, +0.000004f}, + {-0.191369f, +0.563524f, -0.020930f, -0.001563f, +0.000018f}, + {-0.142768f, +0.156236f, -0.016728f, +0.000768f, -0.000025f}, + {-0.131233f, +0.058224f, -0.018961f, +0.000413f, +0.000003f}, + {-0.094869f, +0.113180f, -0.014106f, +0.000387f, +0.000009f}, + {-0.032009f, +0.229593f, -0.004382f, +0.000814f, +0.000078f}, + {-0.014026f, -0.058166f, -0.005170f, -0.000559f, -0.000016f}, + {-0.035069f, +0.066238f, -0.003175f, +0.000270f, +0.000041f}, + {-0.032944f, -0.241581f, -0.006363f, -0.000531f, -0.000047f} + }, + { + {-0.072792f, +0.444420f, -0.012987f, +0.000205f, -0.000004f}, + {-0.237324f, +0.482374f, -0.029199f, -0.000704f, -0.000027f}, + {+0.015060f, +0.403253f, +0.004767f, +0.000016f, -0.000078f}, + {-0.002750f, +0.257555f, -0.001283f, +0.000101f, -0.000052f}, + {-0.029761f, +0.216925f, -0.003727f, +0.000037f, -0.000045f}, + {-0.050908f, +0.208738f, -0.003838f, -0.000287f, -0.000007f}, + {+0.026158f, +0.010072f, +0.007655f, -0.000049f, +0.000026f}, + {-0.018378f, +0.087639f, -0.004770f, -0.000153f, -0.000011f}, + {+0.100406f, -0.034654f, +0.015514f, +0.000140f, -0.000022f} + }, + { + {+0.257437f, -0.065717f, +0.037575f, -0.000530f, -0.000004f}, + {+0.281553f, -0.324420f, +0.036967f, +0.001412f, -0.000017f}, + {+0.165202f, +0.184739f, +0.014027f, -0.000709f, +0.000026f}, + {+0.125102f, +0.059915f, +0.017871f, -0.000393f, +0.000001f}, + {+0.112292f, -0.000623f, +0.014750f, -0.000389f, -0.000004f}, + {+0.090463f, +0.007129f, +0.003581f, -0.000747f, -0.000067f}, + {+0.027231f, +0.007327f, +0.004513f, +0.000487f, +0.000014f}, + {+0.046307f, -0.017672f, +0.008365f, -0.000175f, -0.000032f}, + {-0.028415f, +0.161325f, -0.001715f, +0.000514f, +0.000043f} + }, + { + {-0.007526f, -0.473436f, +0.001022f, -0.000153f, +0.000005f}, + {+0.129889f, -0.550582f, +0.015713f, +0.000496f, +0.000029f}, + {-0.152654f, -0.291103f, -0.013185f, -0.000005f, +0.000074f}, + {-0.054068f, -0.217748f, -0.007018f, -0.000142f, +0.000051f}, + {-0.037999f, -0.233960f, -0.005179f, -0.000063f, +0.000045f}, + {-0.058157f, -0.208550f, -0.000279f, +0.000232f, +0.000018f}, + {-0.043982f, -0.108725f, -0.011637f, +0.000065f, -0.000029f}, + {+0.000177f, -0.092885f, -0.000896f, -0.000064f, +0.000013f}, + {-0.062887f, +0.105831f, -0.012283f, -0.000152f, +0.000016f} + }, + { + {-0.267052f, -0.072481f, -0.039143f, +0.000481f, +0.000004f}, + {-0.316645f, +0.147998f, -0.045958f, -0.001265f, +0.000015f}, + {-0.048560f, -0.443085f, -0.007515f, +0.000666f, -0.000028f}, + {-0.086419f, -0.172339f, -0.010499f, +0.000432f, -0.000005f}, + {-0.085408f, -0.166595f, -0.008605f, +0.000440f, +0.000000f}, + {-0.015618f, -0.269874f, -0.001215f, +0.000625f, +0.000057f}, + {-0.041006f, -0.120930f, -0.000588f, -0.000488f, -0.000012f}, + {-0.062603f, +0.004952f, -0.009992f, +0.000232f, +0.000027f}, + {+0.049095f, -0.068280f, +0.006362f, -0.000520f, -0.000040f} + }, + { + {+0.085562f, +0.471449f, +0.011009f, +0.000129f, -0.000005f}, + {-0.040209f, +0.573378f, -0.000615f, -0.000315f, -0.000031f}, + {+0.171918f, -0.105151f, +0.017403f, +0.000004f, -0.000072f}, + {+0.084128f, +0.083375f, +0.007231f, +0.000038f, -0.000051f}, + {+0.092144f, +0.099172f, +0.007312f, -0.000077f, -0.000045f}, + {+0.077363f, -0.132678f, +0.001733f, -0.000235f, -0.000023f}, + {+0.111219f, +0.109132f, +0.015848f, -0.000079f, +0.000032f}, + {+0.040923f, +0.172426f, +0.008798f, -0.000008f, -0.000013f}, + {+0.029588f, -0.098729f, +0.007764f, +0.000221f, -0.000011f} + }, + { + {+0.254737f, +0.211411f, +0.036795f, -0.000484f, -0.000003f}, + {+0.338234f, -0.015114f, +0.048846f, +0.001053f, -0.000013f}, + {-0.069108f, +0.254859f, -0.003290f, -0.000753f, +0.000029f}, + {+0.023788f, +0.170361f, +0.006488f, -0.000354f, +0.000008f}, + {+0.008393f, +0.222503f, +0.002681f, -0.000354f, +0.000003f}, + {-0.081171f, +0.098496f, -0.004558f, -0.000585f, -0.000051f}, + {-0.022336f, +0.317809f, -0.007308f, +0.000546f, +0.000009f}, + {+0.059371f, +0.155239f, +0.002593f, -0.000198f, -0.000025f}, + {-0.050719f, +0.026919f, -0.006976f, +0.000534f, +0.000037f} + }, + { + {-0.158995f, -0.424829f, -0.020702f, -0.000042f, +0.000006f}, + {-0.052902f, -0.616966f, -0.013055f, +0.000306f, +0.000032f}, + {-0.087152f, +0.213242f, -0.015296f, +0.000352f, +0.000070f}, + {-0.054260f, +0.047270f, -0.008042f, +0.000061f, +0.000051f}, + {-0.073970f, +0.094701f, -0.008512f, +0.000228f, +0.000046f}, + {+0.017462f, +0.238223f, +0.000790f, +0.000485f, +0.000029f}, + {-0.138534f, +0.148762f, -0.014349f, -0.000008f, -0.000034f}, + {-0.109919f, -0.097327f, -0.010882f, +0.000233f, +0.000014f}, + {-0.006806f, +0.096529f, -0.003657f, -0.000365f, +0.000007f} + }, + { + {-0.218541f, -0.332409f, -0.031504f, +0.000445f, +0.000003f}, + {-0.344919f, -0.163301f, -0.048934f, -0.001021f, +0.000012f}, + {+0.081260f, -0.052733f, +0.012413f, +0.000334f, -0.000031f}, + {+0.001753f, -0.039186f, -0.002593f, +0.000192f, -0.000011f}, + {+0.044437f, -0.083315f, +0.002185f, +0.000075f, -0.000005f}, + {+0.063695f, +0.165969f, +0.005598f, +0.000350f, +0.000048f}, + {+0.133966f, -0.261153f, +0.015377f, -0.000538f, -0.000006f}, + {+0.023795f, -0.302979f, +0.005384f, -0.000124f, +0.000025f}, + {+0.048328f, +0.008375f, +0.007723f, -0.000384f, -0.000035f} + }, + { + {+0.215234f, +0.334693f, +0.029335f, -0.000032f, -0.000006f}, + {+0.163645f, +0.620258f, +0.029442f, -0.000199f, -0.000034f}, + {+0.033793f, -0.124345f, +0.006813f, -0.000105f, -0.000071f}, + {+0.000974f, -0.040313f, +0.001531f, +0.000006f, -0.000052f}, + {+0.011132f, -0.127973f, +0.004627f, +0.000028f, -0.000047f}, + {-0.084325f, -0.052788f, -0.007351f, -0.000453f, -0.000037f}, + {+0.056743f, -0.375950f, +0.009997f, +0.000141f, +0.000035f}, + {+0.111528f, -0.176673f, +0.008510f, +0.000146f, -0.000018f}, + {-0.011877f, -0.092945f, -0.003074f, +0.000266f, -0.000004f} + }, + { + {+0.170586f, +0.400778f, +0.026157f, -0.000380f, -0.000003f}, + {+0.309161f, +0.398764f, +0.040718f, +0.000943f, -0.000011f}, + {-0.062016f, +0.029728f, -0.012911f, -0.000459f, +0.000035f}, + {+0.031810f, -0.090010f, +0.007426f, -0.000129f, +0.000014f}, + {-0.032063f, -0.056196f, -0.004324f, -0.000244f, +0.000009f}, + {+0.022806f, -0.208884f, -0.000856f, -0.000371f, -0.000043f}, + {-0.165081f, -0.039385f, -0.016746f, +0.000367f, +0.000003f}, + {-0.128190f, +0.183103f, -0.012188f, -0.000425f, -0.000025f}, + {-0.049731f, -0.043210f, -0.002580f, +0.000500f, +0.000034f} + }, + { + {-0.253118f, -0.253855f, -0.036031f, +0.000022f, +0.000008f}, + {-0.270280f, -0.483591f, -0.039528f, +0.000153f, +0.000036f}, + {-0.018783f, +0.101617f, -0.001693f, +0.000100f, +0.000073f}, + {+0.020506f, -0.111990f, -0.001982f, -0.000215f, +0.000054f}, + {+0.026438f, +0.035500f, +0.002626f, -0.000034f, +0.000050f}, + {+0.052495f, -0.162509f, +0.005782f, +0.000307f, +0.000047f}, + {+0.034503f, +0.254582f, -0.002428f, -0.000029f, -0.000037f}, + {-0.007059f, +0.365527f, +0.000861f, +0.000308f, +0.000024f}, + {+0.051840f, +0.110577f, +0.004579f, -0.000471f, +0.000002f} + }, + { + {-0.123354f, -0.454617f, -0.017101f, +0.000408f, +0.000003f}, + {-0.216188f, -0.557670f, -0.033272f, -0.000921f, +0.000010f}, + {+0.060077f, -0.016368f, +0.008130f, +0.000544f, -0.000041f}, + {-0.097698f, +0.063611f, -0.011314f, +0.000334f, -0.000020f}, + {-0.004155f, +0.082194f, -0.000724f, +0.000315f, -0.000015f}, + {-0.061885f, +0.007918f, -0.004267f, +0.000661f, +0.000034f}, + {+0.120251f, +0.108336f, +0.021527f, -0.000454f, +0.000001f}, + {+0.138249f, +0.145446f, +0.014907f, +0.000187f, +0.000021f}, + {+0.010129f, +0.174821f, +0.000225f, -0.000291f, -0.000033f} + }, + { + {+0.286163f, +0.175080f, +0.040522f, -0.000072f, -0.000009f}, + {+0.316113f, +0.262138f, +0.049307f, -0.000066f, -0.000038f}, + {-0.006202f, -0.116156f, -0.000344f, -0.000116f, -0.000074f}, + {+0.026045f, +0.250354f, +0.005697f, +0.000168f, -0.000055f}, + {-0.033061f, +0.037487f, -0.003086f, +0.000057f, -0.000051f}, + {+0.009161f, +0.111428f, -0.002750f, -0.000407f, -0.000055f}, + {-0.050197f, -0.166126f, -0.010372f, +0.000135f, +0.000039f}, + {-0.108124f, -0.227657f, -0.011340f, -0.000057f, -0.000029f}, + {-0.062623f, +0.065189f, -0.003295f, +0.000387f, +0.000001f} + }, + { + {+0.066678f, +0.512159f, +0.009358f, -0.000375f, -0.000002f}, + {+0.128892f, +0.546911f, +0.020182f, +0.000837f, -0.000009f}, + {-0.041244f, -0.065432f, -0.004659f, -0.000466f, +0.000049f}, + {+0.124448f, +0.097696f, +0.018095f, -0.000283f, +0.000027f}, + {+0.039700f, -0.075487f, +0.006824f, -0.000303f, +0.000022f}, + {+0.033671f, +0.064807f, +0.008036f, -0.000540f, -0.000022f}, + {-0.115666f, -0.069551f, -0.016489f, +0.000343f, -0.000004f}, + {-0.044678f, -0.318287f, -0.008724f, -0.000374f, -0.000016f}, + {+0.045915f, -0.096744f, +0.005450f, +0.000336f, +0.000032f} + }, + { + {-0.306654f, -0.062299f, -0.043370f, +0.000070f, +0.000010f}, + {-0.327815f, -0.157084f, -0.053522f, +0.000024f, +0.000042f}, + {+0.020545f, +0.022620f, -0.000196f, -0.000030f, +0.000072f}, + {-0.093582f, -0.234733f, -0.010882f, -0.000285f, +0.000055f}, + {+0.018657f, -0.107686f, +0.002873f, -0.000136f, +0.000051f}, + {-0.022629f, -0.029525f, -0.002254f, +0.000156f, +0.000058f}, + {+0.080228f, +0.235900f, +0.013683f, -0.000069f, -0.000040f}, + {+0.131827f, -0.044535f, +0.015502f, +0.000103f, +0.000031f}, + {+0.019414f, -0.130958f, +0.003490f, -0.000488f, -0.000004f} + }, + { + {-0.003446f, -0.527577f, -0.000418f, +0.000351f, +0.000001f}, + {-0.063671f, -0.564794f, -0.009104f, -0.000762f, +0.000008f}, + {+0.005424f, +0.040112f, +0.004744f, +0.000443f, -0.000057f}, + {-0.104226f, -0.211764f, -0.016606f, +0.000287f, -0.000034f}, + {-0.067397f, +0.027841f, -0.010395f, +0.000286f, -0.000029f}, + {-0.014235f, -0.044128f, -0.001136f, +0.000560f, +0.000010f}, + {+0.112939f, +0.189986f, +0.013999f, -0.000350f, +0.000008f}, + {-0.051770f, +0.234766f, -0.004628f, +0.000261f, +0.000010f}, + {-0.057159f, -0.008653f, -0.009510f, -0.000310f, -0.000032f} + }, + { + {+0.309125f, -0.046398f, +0.043868f, -0.000070f, -0.000010f}, + {+0.337900f, +0.049301f, +0.053004f, +0.000032f, -0.000046f}, + {+0.006452f, +0.038403f, -0.000549f, +0.000028f, -0.000068f}, + {+0.142396f, +0.170693f, +0.019921f, +0.000322f, -0.000053f}, + {+0.012544f, +0.153200f, +0.002399f, +0.000157f, -0.000049f}, + {+0.026935f, +0.020769f, +0.002517f, -0.000142f, -0.000057f}, + {-0.135188f, -0.190554f, -0.017975f, +0.000073f, +0.000042f}, + {-0.083199f, +0.182605f, -0.012518f, -0.000033f, -0.000031f}, + {+0.022452f, +0.113080f, +0.002881f, +0.000561f, +0.000007f} + }, + { + {-0.056550f, +0.514353f, -0.008128f, -0.000326f, +0.000000f}, + {-0.002761f, +0.570850f, +0.000438f, +0.000698f, -0.000005f}, + {-0.005763f, +0.055193f, -0.003144f, -0.000303f, +0.000064f}, + {+0.066858f, +0.287146f, +0.008674f, -0.000271f, +0.000039f}, + {+0.079593f, +0.051699f, +0.009265f, -0.000243f, +0.000035f}, + {-0.004491f, +0.069814f, -0.001757f, -0.000412f, -0.000001f}, + {-0.070466f, -0.289680f, -0.008846f, +0.000325f, -0.000013f}, + {+0.096678f, -0.094366f, +0.010661f, -0.000155f, -0.000007f}, + {+0.041572f, +0.082696f, +0.006577f, +0.000266f, +0.000031f} + }, + { + {-0.298262f, +0.141215f, -0.042908f, +0.000091f, +0.000010f}, + {-0.335616f, +0.061120f, -0.052587f, -0.000136f, +0.000050f}, + {-0.028168f, +0.019948f, -0.003001f, +0.000044f, +0.000065f}, + {-0.179347f, -0.090626f, -0.024448f, -0.000251f, +0.000051f}, + {-0.055697f, -0.153136f, -0.006127f, -0.000099f, +0.000047f}, + {-0.022758f, +0.040841f, -0.001974f, +0.000245f, +0.000056f}, + {+0.171241f, +0.083402f, +0.023385f, -0.000076f, -0.000043f}, + {+0.018087f, -0.211528f, +0.004820f, +0.000028f, +0.000030f}, + {-0.051883f, -0.059963f, -0.007202f, -0.000532f, -0.000011f} + }, + { + {+0.109668f, -0.485328f, +0.016423f, +0.000299f, -0.000001f}, + {+0.064276f, -0.551492f, +0.008554f, -0.000611f, +0.000002f}, + {+0.027762f, -0.066226f, +0.006657f, +0.000180f, -0.000068f}, + {-0.008606f, -0.352413f, -0.000966f, +0.000207f, -0.000045f}, + {-0.061405f, -0.140795f, -0.008634f, +0.000186f, -0.000040f}, + {+0.022602f, -0.028596f, +0.003958f, +0.000252f, -0.000003f}, + {+0.006333f, +0.339254f, -0.001045f, -0.000313f, +0.000017f}, + {-0.095236f, -0.035271f, -0.011532f, +0.000098f, +0.000006f}, + {-0.006892f, -0.129936f, -0.001855f, -0.000288f, -0.000028f} + }, + { + {+0.280162f, -0.222327f, +0.040172f, -0.000132f, -0.000011f}, + {+0.325666f, -0.150573f, +0.051593f, +0.000209f, -0.000054f}, + {+0.028869f, -0.065199f, +0.002958f, -0.000146f, -0.000066f}, + {+0.187456f, -0.052621f, +0.025102f, +0.000202f, -0.000052f}, + {+0.080571f, +0.077938f, +0.010648f, +0.000040f, -0.000047f}, + {+0.004481f, -0.054774f, +0.000402f, -0.000382f, -0.000060f}, + {-0.176395f, +0.061006f, -0.022445f, +0.000083f, +0.000045f}, + {+0.032007f, +0.158843f, +0.002664f, -0.000125f, -0.000033f}, + {+0.057225f, -0.034866f, +0.006728f, +0.000520f, +0.000013f} + }, + { + {-0.158921f, +0.451848f, -0.023918f, -0.000281f, +0.000001f}, + {-0.121553f, +0.536831f, -0.017942f, +0.000578f, +0.000001f}, + {-0.050855f, +0.055529f, -0.008445f, -0.000215f, +0.000075f}, + {-0.052686f, +0.312195f, -0.005219f, -0.000224f, +0.000052f}, + {+0.037110f, +0.141320f, +0.006102f, -0.000195f, +0.000048f}, + {-0.024782f, -0.009783f, -0.004483f, -0.000288f, +0.000009f}, + {+0.063910f, -0.304697f, +0.007623f, +0.000328f, -0.000023f}, + {+0.068609f, +0.100384f, +0.009341f, -0.000091f, -0.000007f}, + {-0.033166f, +0.101342f, -0.001173f, +0.000251f, +0.000026f} + }, + { + {-0.254134f, +0.305063f, -0.036122f, +0.000175f, +0.000012f}, + {-0.313748f, +0.244268f, -0.048706f, -0.000275f, +0.000058f}, + {-0.012267f, +0.112660f, -0.001928f, +0.000238f, +0.000072f}, + {-0.161165f, +0.140763f, -0.024820f, -0.000200f, +0.000054f}, + {-0.090126f, -0.058592f, -0.014503f, -0.000035f, +0.000049f}, + {+0.010917f, +0.042825f, +0.001085f, +0.000524f, +0.000070f}, + {+0.139731f, -0.183781f, +0.020533f, -0.000104f, -0.000047f}, + {-0.056473f, -0.093013f, -0.007395f, +0.000190f, +0.000040f}, + {-0.028362f, +0.108300f, -0.004536f, -0.000507f, -0.000014f} + }, + { + {+0.204108f, -0.397468f, +0.030234f, +0.000284f, -0.000002f}, + {+0.186187f, -0.523327f, +0.027065f, -0.000548f, -0.000002f}, + {+0.063644f, -0.004588f, +0.010914f, +0.000342f, -0.000092f}, + {+0.084172f, -0.238464f, +0.012067f, +0.000307f, -0.000066f}, + {-0.023241f, -0.163547f, -0.001737f, +0.000268f, -0.000061f}, + {+0.017633f, +0.031273f, +0.004558f, +0.000453f, -0.000024f}, + {-0.103701f, +0.192462f, -0.015036f, -0.000326f, +0.000032f}, + {-0.040508f, -0.117502f, -0.005435f, +0.000218f, +0.000003f}, + {+0.044739f, -0.003358f, +0.002673f, -0.000166f, -0.000026f} + }, + { + {+0.217925f, -0.374764f, +0.031310f, -0.000194f, -0.000015f}, + {+0.287194f, -0.371793f, +0.043606f, +0.000298f, -0.000065f}, + {-0.012378f, -0.121133f, -0.001692f, -0.000139f, -0.000076f}, + {+0.138854f, -0.153518f, +0.021173f, +0.000296f, -0.000054f}, + {+0.110078f, +0.041091f, +0.015691f, +0.000117f, -0.000048f}, + {-0.016824f, -0.020994f, -0.002433f, -0.000470f, -0.000080f}, + {-0.093179f, +0.207425f, -0.014155f, +0.000078f, +0.000048f}, + {+0.066586f, +0.047692f, +0.008958f, -0.000170f, -0.000050f}, + {-0.006034f, -0.079321f, +0.001680f, +0.000546f, +0.000014f} + }, + { + {-0.239100f, +0.326388f, -0.035676f, -0.000310f, +0.000005f}, + {-0.254019f, +0.457019f, -0.035395f, +0.000472f, +0.000004f}, + {-0.063172f, -0.043743f, -0.010677f, -0.000446f, +0.000122f}, + {-0.106250f, +0.224976f, -0.016160f, -0.000331f, +0.000087f}, + {-0.006588f, +0.220018f, -0.002089f, -0.000280f, +0.000081f}, + {-0.012847f, -0.026665f, -0.004159f, -0.000613f, +0.000053f}, + {+0.116434f, -0.116659f, +0.017836f, +0.000308f, -0.000043f}, + {+0.014851f, +0.127471f, +0.001839f, -0.000426f, +0.000008f}, + {-0.024363f, -0.047415f, -0.002156f, +0.000076f, +0.000029f} + }, + { + {-0.177651f, +0.419626f, -0.025372f, +0.000189f, +0.000018f}, + {-0.234856f, +0.487730f, -0.036693f, -0.000275f, +0.000076f}, + {+0.036507f, +0.108100f, +0.004077f, -0.000196f, +0.000068f}, + {-0.123472f, +0.198845f, -0.018454f, -0.000539f, +0.000045f}, + {-0.120851f, +0.044023f, -0.017124f, -0.000326f, +0.000038f}, + {+0.019744f, +0.023127f, +0.003003f, +0.000144f, +0.000080f}, + {+0.054985f, -0.211321f, +0.008525f, +0.000002f, -0.000046f}, + {-0.067840f, +0.000644f, -0.008680f, +0.000062f, +0.000059f}, + {+0.013438f, +0.012637f, +0.000624f, -0.000676f, -0.000018f} + }, + { + {+0.265046f, -0.258984f, +0.039613f, +0.000315f, -0.000010f}, + {+0.305263f, -0.341002f, +0.042929f, -0.000320f, -0.000009f}, + {+0.052493f, +0.082191f, +0.010230f, +0.000306f, -0.000162f}, + {+0.135578f, -0.200816f, +0.020288f, +0.000195f, -0.000112f}, + {+0.047909f, -0.214878f, +0.007490f, +0.000138f, -0.000104f}, + {+0.013632f, +0.032324f, +0.004221f, +0.000548f, -0.000093f}, + {-0.118924f, +0.057091f, -0.018445f, -0.000261f, +0.000056f}, + {+0.008331f, -0.114878f, +0.000663f, +0.000507f, -0.000028f}, + {+0.005413f, +0.022808f, -0.000439f, -0.000059f, -0.000035f} + }, + { + {+0.136435f, -0.454829f, +0.019582f, -0.000149f, -0.000018f}, + {+0.168461f, -0.553033f, +0.027068f, +0.000281f, -0.000094f}, + {-0.056383f, -0.088168f, -0.008472f, +0.000590f, -0.000037f}, + {+0.096992f, -0.262712f, +0.013318f, +0.000816f, -0.000021f}, + {+0.110234f, -0.118824f, +0.015813f, +0.000528f, -0.000014f}, + {-0.029948f, -0.036351f, -0.005263f, +0.000282f, -0.000056f}, + {-0.020326f, +0.210405f, -0.002631f, -0.000079f, +0.000039f}, + {+0.060030f, -0.032820f, +0.009213f, +0.000193f, -0.000059f}, + {-0.003943f, +0.005977f, -0.000375f, +0.000898f, +0.000028f} + }, + { + {-0.284355f, +0.190433f, -0.042800f, -0.000266f, +0.000017f}, + {-0.335277f, +0.219226f, -0.046865f, +0.000105f, +0.000022f}, + {-0.036478f, -0.124061f, -0.005694f, +0.000344f, +0.000198f}, + {-0.163243f, +0.134561f, -0.022257f, +0.000183f, +0.000132f}, + {-0.083868f, +0.178051f, -0.011964f, +0.000280f, +0.000122f}, + {-0.010723f, -0.070555f, -0.001815f, +0.000022f, +0.000132f}, + {+0.111861f, +0.009495f, +0.016549f, +0.000135f, -0.000069f}, + {-0.022143f, +0.095016f, -0.003757f, -0.000379f, +0.000052f}, + {-0.000565f, +0.002446f, +0.001442f, +0.000102f, +0.000039f} + }, + { + {-0.095291f, +0.479278f, -0.013467f, +0.000098f, +0.000016f}, + {-0.099306f, +0.582261f, -0.017486f, -0.000468f, +0.000116f}, + {+0.078355f, +0.049439f, +0.008412f, -0.000772f, -0.000023f}, + {-0.051414f, +0.305039f, -0.008849f, -0.000882f, -0.000019f}, + {-0.082995f, +0.177822f, -0.013237f, -0.000567f, -0.000026f}, + {+0.049222f, +0.017872f, +0.004795f, -0.000539f, +0.000005f}, + {-0.011696f, -0.179076f, -0.000545f, +0.000092f, -0.000026f}, + {-0.054786f, +0.044185f, -0.008075f, -0.000456f, +0.000046f}, + {-0.005431f, -0.002236f, -0.000119f, -0.000987f, -0.000046f} + }, + { + {+0.300035f, -0.126686f, +0.045279f, +0.000141f, -0.000023f}, + {+0.347527f, -0.104803f, +0.049661f, +0.000162f, -0.000050f}, + {+0.000140f, +0.170954f, +0.002869f, -0.001398f, -0.000210f}, + {+0.165631f, -0.028348f, +0.023643f, -0.000777f, -0.000136f}, + {+0.103480f, -0.108513f, +0.015479f, -0.000834f, -0.000124f}, + {-0.013480f, +0.114650f, +0.000763f, -0.001025f, -0.000149f}, + {-0.089040f, -0.060481f, -0.014574f, +0.000082f, +0.000079f}, + {+0.036486f, -0.097396f, +0.006421f, +0.000002f, -0.000073f}, + {+0.003333f, -0.016091f, -0.002020f, -0.000329f, -0.000034f} + }, + { + {+0.051566f, -0.506796f, +0.007039f, -0.000099f, -0.000010f}, + {+0.033731f, -0.589122f, +0.007210f, +0.000795f, -0.000134f}, + {-0.079279f, +0.049325f, -0.008393f, +0.000023f, +0.000100f}, + {+0.010994f, -0.265800f, +0.003418f, +0.000397f, +0.000069f}, + {+0.052364f, -0.186418f, +0.009164f, +0.000026f, +0.000073f}, + {-0.052053f, +0.056265f, -0.005015f, -0.000066f, +0.000065f}, + {+0.026200f, +0.116741f, +0.002983f, +0.000008f, +0.000008f}, + {+0.048119f, -0.079713f, +0.006644f, +0.000374f, -0.000021f}, + {+0.010900f, -0.005754f, +0.000987f, +0.000869f, +0.000068f} + }, + { + {-0.311437f, +0.048951f, -0.046976f, +0.000118f, +0.000027f}, + {-0.349598f, -0.000051f, -0.050374f, -0.000038f, +0.000095f}, + {+0.040613f, -0.137831f, -0.000066f, +0.002700f, +0.000181f}, + {-0.149052f, -0.019968f, -0.023093f, +0.001262f, +0.000115f}, + {-0.107473f, +0.058841f, -0.017699f, +0.001256f, +0.000101f}, + {+0.043140f, -0.091871f, +0.000478f, +0.002412f, +0.000129f}, + {+0.064483f, +0.059569f, +0.011301f, -0.000210f, -0.000082f}, + {-0.054255f, +0.077805f, -0.009915f, +0.000915f, +0.000081f}, + {-0.008263f, +0.025078f, +0.001271f, +0.000578f, +0.000014f} + }, + { + {-0.002478f, +0.521278f, -0.000544f, +0.000189f, +0.000002f}, + {+0.031629f, +0.587979f, +0.001886f, -0.001424f, +0.000137f}, + {+0.053320f, -0.118505f, +0.004875f, +0.003174f, -0.000173f}, + {+0.008995f, +0.224389f, +0.001153f, +0.001756f, -0.000113f}, + {-0.029482f, +0.180110f, -0.004281f, +0.002087f, -0.000115f}, + {+0.033134f, -0.107741f, +0.001943f, +0.002753f, -0.000132f}, + {-0.023463f, -0.074570f, -0.002999f, -0.000562f, +0.000011f}, + {-0.031477f, +0.111590f, -0.005933f, +0.000350f, -0.000010f}, + {-0.015016f, +0.015277f, -0.001484f, -0.000128f, -0.000086f} + } +}; + +const float leftHRIRImag_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]= +{ + { + {-0.036807f, -0.174045f, +0.179146f, +0.002758f, +0.000002f}, + {-0.081675f, +0.202936f, -0.124120f, -0.000184f, +0.000007f}, + {-0.000843f, -0.038970f, +0.052716f, -0.008143f, +0.000125f}, + {-0.004478f, -0.013122f, +0.028558f, -0.008290f, +0.000045f}, + {-0.006316f, +0.012132f, -0.006515f, +0.002119f, +0.000027f}, + {+0.000794f, -0.004296f, -0.005127f, +0.004942f, -0.000100f}, + {+0.010293f, -0.025048f, +0.008939f, -0.001610f, -0.000015f}, + {-0.001111f, -0.008117f, +0.033872f, -0.002789f, -0.000061f}, + {+0.009292f, -0.031334f, +0.001941f, -0.005137f, +0.000092f} + }, + { + {+0.046648f, -0.328217f, -0.004769f, -0.004729f, +0.000002f}, + {+0.078219f, +0.186706f, -0.335495f, +0.010505f, +0.000011f}, + {+0.003389f, -0.028871f, +0.074809f, -0.001736f, +0.000093f}, + {+0.011160f, -0.006841f, +0.031676f, +0.003121f, +0.000038f}, + {+0.007422f, +0.043414f, -0.006982f, -0.001963f, +0.000025f}, + {+0.003254f, +0.003751f, -0.013792f, +0.005415f, -0.000065f}, + {-0.015187f, -0.099887f, -0.012484f, -0.000245f, -0.000014f}, + {-0.000628f, +0.067594f, +0.116266f, +0.000062f, -0.000037f}, + {-0.017876f, -0.212825f, -0.109502f, -0.000434f, +0.000062f} + }, + { + {-0.062391f, -0.298587f, +0.055506f, +0.004604f, -0.000002f}, + {-0.110139f, -0.008656f, +0.076872f, -0.013912f, -0.000006f}, + {-0.006661f, +0.041459f, +0.008680f, +0.005198f, -0.000143f}, + {-0.017346f, +0.064502f, -0.000311f, +0.000229f, -0.000050f}, + {-0.012574f, +0.112476f, -0.042863f, +0.000548f, -0.000028f}, + {-0.008554f, +0.117685f, -0.085746f, -0.010222f, +0.000121f}, + {+0.018386f, -0.231260f, +0.055470f, +0.002605f, +0.000015f}, + {-0.000043f, +0.098076f, +0.074022f, +0.004739f, +0.000074f}, + {+0.020228f, -0.438516f, +0.026318f, +0.002404f, -0.000109f} + }, + { + {+0.087093f, -0.185047f, -0.039795f, -0.001148f, -0.000002f}, + {+0.179442f, +0.138305f, -0.024941f, +0.004193f, -0.000016f}, + {+0.010153f, +0.053373f, -0.028050f, +0.000631f, -0.000056f}, + {+0.022351f, +0.115243f, -0.015706f, +0.000824f, -0.000030f}, + {+0.016881f, +0.188764f, -0.015179f, +0.001478f, -0.000024f}, + {+0.011436f, +0.169671f, -0.055918f, +0.006134f, +0.000022f}, + {-0.007516f, -0.296099f, +0.030173f, -0.003476f, +0.000013f}, + {+0.001835f, +0.047910f, -0.004611f, -0.005834f, +0.000008f}, + {+0.012183f, -0.522145f, -0.012957f, -0.000556f, -0.000026f} + }, + { + {-0.118429f, +0.036347f, +0.008994f, -0.001813f, +0.000002f}, + {-0.195669f, +0.557237f, +0.044782f, +0.005092f, +0.000007f}, + {-0.015263f, +0.077237f, -0.016810f, -0.004030f, +0.000145f}, + {-0.025184f, +0.187315f, -0.016739f, -0.002009f, +0.000052f}, + {-0.002368f, +0.225780f, -0.012360f, -0.001921f, +0.000030f}, + {-0.004974f, +0.160969f, -0.009969f, -0.002830f, -0.000125f}, + {-0.023306f, -0.243341f, -0.007075f, +0.002049f, -0.000015f}, + {+0.002539f, +0.043064f, -0.021665f, +0.000872f, -0.000074f}, + {-0.088704f, -0.392340f, -0.007003f, +0.000682f, +0.000110f} + }, + { + {+0.111405f, +0.324593f, -0.000106f, +0.001284f, +0.000002f}, + {+0.051589f, +0.868735f, -0.017996f, -0.003263f, +0.000021f}, + {+0.016644f, +0.116184f, -0.001320f, +0.001603f, +0.000021f}, + {+0.004222f, +0.242602f, +0.004139f, +0.000694f, +0.000023f}, + {-0.043767f, +0.191695f, +0.013679f, +0.000447f, +0.000023f}, + {-0.015164f, +0.134423f, +0.000808f, +0.001816f, +0.000022f}, + {+0.056350f, -0.114712f, -0.004403f, +0.000262f, -0.000013f}, + {-0.013985f, +0.017892f, -0.014819f, +0.002850f, +0.000020f}, + {+0.155162f, -0.041775f, -0.009744f, -0.001067f, -0.000007f} + }, + { + {-0.005031f, +0.479299f, +0.003719f, +0.000668f, -0.000001f}, + {+0.200078f, +0.617927f, +0.007665f, -0.002820f, -0.000011f}, + {-0.000023f, +0.128657f, +0.013087f, +0.000664f, -0.000135f}, + {+0.058851f, +0.171528f, +0.001838f, +0.000874f, -0.000052f}, + {+0.096474f, +0.013567f, +0.000492f, +0.000745f, -0.000033f}, + {+0.033027f, +0.054815f, +0.011873f, +0.000718f, +0.000112f}, + {-0.056173f, +0.039930f, +0.001299f, -0.001259f, +0.000015f}, + {+0.020372f, -0.043296f, +0.005705f, -0.001029f, +0.000062f}, + {-0.120615f, +0.346286f, -0.013057f, -0.000997f, -0.000098f} + }, + { + {-0.150793f, +0.255763f, -0.018096f, -0.000700f, -0.000003f}, + {-0.305707f, -0.158732f, -0.020717f, +0.002646f, -0.000023f}, + {-0.031522f, +0.078751f, +0.001465f, -0.000649f, +0.000004f}, + {-0.117107f, -0.077176f, -0.004724f, -0.000677f, -0.000018f}, + {-0.093448f, -0.250387f, -0.003900f, -0.000293f, -0.000021f}, + {-0.019351f, -0.028793f, -0.005286f, -0.001746f, -0.000057f}, + {+0.008202f, +0.128064f, +0.008788f, +0.000321f, +0.000014f}, + {-0.007910f, -0.090056f, -0.001122f, -0.000874f, -0.000041f}, + {-0.028598f, +0.475838f, +0.000814f, +0.001596f, +0.000033f} + }, + { + {+0.168446f, -0.229619f, +0.014684f, -0.000669f, +0.000001f}, + {+0.083028f, -0.735157f, +0.014942f, +0.001813f, +0.000016f}, + {+0.038009f, -0.019540f, -0.002379f, +0.000167f, +0.000118f}, + {+0.076227f, -0.357687f, +0.003886f, -0.000171f, +0.000051f}, + {+0.001844f, -0.389834f, +0.002086f, -0.000484f, +0.000036f}, + {-0.023047f, -0.027798f, -0.004234f, -0.000497f, -0.000086f}, + {+0.049557f, +0.071524f, +0.006302f, +0.000906f, -0.000015f}, + {-0.020459f, -0.071010f, -0.006011f, -0.000277f, -0.000043f}, + {+0.164709f, +0.192774f, +0.015494f, +0.000611f, +0.000078f} + }, + { + {+0.032104f, -0.431950f, +0.008160f, +0.000726f, +0.000004f}, + {+0.260971f, -0.444113f, +0.025794f, -0.002256f, +0.000023f}, + {+0.008385f, -0.056100f, +0.003103f, +0.000095f, -0.000018f}, + {+0.067113f, -0.367438f, +0.006254f, +0.000198f, +0.000013f}, + {+0.110994f, -0.232179f, +0.008226f, +0.000230f, +0.000019f}, + {+0.042146f, +0.074633f, +0.011186f, +0.001034f, +0.000080f}, + {-0.054919f, -0.080526f, -0.007215f, -0.000649f, -0.000015f}, + {+0.040307f, +0.016321f, -0.001764f, +0.000829f, +0.000052f}, + {-0.137526f, -0.246324f, -0.007988f, -0.001200f, -0.000047f} + }, + { + {-0.213011f, -0.046980f, -0.025382f, +0.000494f, -0.000002f}, + {-0.288608f, +0.395114f, -0.041290f, -0.001283f, -0.000020f}, + {-0.054132f, +0.049386f, -0.007328f, -0.000057f, -0.000101f}, + {-0.158872f, -0.025219f, -0.014949f, +0.000114f, -0.000051f}, + {-0.121403f, +0.113923f, -0.010204f, +0.000233f, -0.000039f}, + {-0.000083f, +0.147208f, +0.001729f, +0.000936f, +0.000054f}, + {-0.003048f, -0.154788f, -0.006001f, -0.000457f, +0.000017f}, + {-0.025771f, +0.106681f, +0.002198f, +0.000260f, +0.000022f}, + {-0.031294f, -0.392095f, -0.012018f, -0.000574f, -0.000057f} + }, + { + {+0.092561f, +0.424974f, +0.010810f, -0.000681f, -0.000004f}, + {-0.075902f, +0.706014f, -0.007828f, +0.002003f, -0.000022f}, + {+0.013154f, +0.161409f, +0.005603f, -0.000211f, +0.000023f}, + {+0.066254f, +0.312283f, +0.004744f, +0.000026f, -0.000009f}, + {+0.002036f, +0.295824f, -0.002824f, +0.000014f, -0.000016f}, + {-0.060712f, +0.057606f, -0.008012f, -0.000958f, -0.000087f}, + {+0.056082f, -0.061636f, +0.008052f, +0.000524f, +0.000016f}, + {-0.017683f, +0.111805f, -0.002642f, -0.000403f, -0.000052f}, + {+0.146777f, -0.113700f, +0.017959f, +0.001010f, +0.000051f} + }, + { + {+0.185320f, +0.277358f, +0.022712f, -0.000351f, +0.000003f}, + {+0.344646f, +0.053912f, +0.053141f, +0.000939f, +0.000024f}, + {+0.086838f, +0.051841f, +0.006637f, +0.000180f, +0.000089f}, + {+0.105953f, +0.243944f, +0.014187f, -0.000146f, +0.000052f}, + {+0.111669f, +0.123210f, +0.013173f, -0.000233f, +0.000042f}, + {+0.059758f, -0.131270f, +0.005702f, -0.000643f, -0.000024f}, + {-0.036902f, +0.080134f, -0.000673f, +0.000325f, -0.000020f}, + {+0.046052f, +0.010828f, +0.004846f, -0.000246f, -0.000004f}, + {-0.077354f, +0.231910f, -0.006126f, +0.000362f, +0.000039f} + }, + { + {-0.189874f, -0.302002f, -0.024437f, +0.000614f, +0.000004f}, + {-0.115695f, -0.648554f, -0.017187f, -0.001787f, +0.000020f}, + {-0.095557f, -0.230274f, -0.014609f, +0.000114f, -0.000025f}, + {-0.124579f, -0.115101f, -0.017138f, -0.000088f, +0.000005f}, + {-0.076830f, -0.166427f, -0.008366f, -0.000057f, +0.000012f}, + {+0.014099f, -0.211406f, -0.003003f, +0.000568f, +0.000083f}, + {-0.023815f, +0.096932f, -0.005676f, -0.000440f, -0.000016f}, + {-0.021782f, -0.093860f, -0.002871f, +0.000144f, +0.000046f}, + {-0.073734f, +0.238033f, -0.010094f, -0.000798f, -0.000049f} + }, + { + {-0.114426f, -0.412169f, -0.014852f, +0.000236f, -0.000004f}, + {-0.286060f, -0.383093f, -0.046192f, -0.000709f, -0.000026f}, + {-0.046449f, -0.312275f, +0.001217f, -0.000173f, -0.000081f}, + {-0.033813f, -0.256375f, -0.003843f, +0.000097f, -0.000052f}, + {-0.058368f, -0.191934f, -0.007694f, +0.000156f, -0.000044f}, + {-0.082552f, -0.075789f, -0.001514f, +0.000419f, +0.000001f}, + {+0.034473f, +0.003962f, +0.003250f, -0.000222f, +0.000024f}, + {-0.030695f, -0.079541f, -0.002956f, +0.000205f, -0.000008f}, + {+0.109333f, -0.044153f, +0.010252f, -0.000221f, -0.000027f} + }, + { + {+0.243812f, +0.144409f, +0.034010f, -0.000542f, -0.000004f}, + {+0.244934f, +0.430481f, +0.034506f, +0.001609f, -0.000017f}, + {+0.170812f, +0.012823f, +0.017960f, -0.000055f, +0.000026f}, + {+0.131633f, -0.001407f, +0.017629f, +0.000130f, -0.000001f}, + {+0.106876f, +0.065820f, +0.014688f, +0.000058f, -0.000007f}, + {+0.074279f, +0.153828f, +0.004932f, -0.000344f, -0.000072f}, + {+0.015569f, -0.022714f, +0.005207f, +0.000342f, +0.000015f}, + {+0.042274f, +0.032502f, +0.005140f, -0.000141f, -0.000036f}, + {-0.002837f, -0.214678f, +0.001786f, +0.000703f, +0.000045f} + }, + { + {+0.033445f, +0.465385f, +0.003356f, -0.000154f, +0.000005f}, + {+0.178742f, +0.528051f, +0.033152f, +0.000550f, +0.000028f}, + {-0.087971f, +0.405281f, -0.012908f, +0.000193f, +0.000076f}, + {-0.026721f, +0.243121f, -0.004203f, -0.000014f, +0.000052f}, + {-0.002076f, +0.236562f, -0.002162f, -0.000025f, +0.000045f}, + {-0.002032f, +0.267039f, -0.003164f, -0.000247f, +0.000013f}, + {-0.028517f, +0.053584f, -0.006240f, +0.000168f, -0.000027f}, + {+0.008947f, +0.081105f, +0.001162f, -0.000039f, +0.000013f}, + {-0.084445f, -0.084241f, -0.009779f, +0.000091f, +0.000019f} + }, + { + {-0.265151f, +0.001033f, -0.038066f, +0.000492f, +0.000004f}, + {-0.302075f, -0.213979f, -0.045228f, -0.001475f, +0.000016f}, + {-0.119858f, +0.361574f, -0.010750f, +0.000044f, -0.000027f}, + {-0.110652f, +0.115838f, -0.014030f, -0.000216f, -0.000003f}, + {-0.106693f, +0.078792f, -0.012412f, -0.000130f, +0.000002f}, + {-0.068216f, +0.174315f, -0.001858f, +0.000344f, +0.000061f}, + {-0.039397f, +0.042700f, -0.003620f, -0.000322f, -0.000013f}, + {-0.052577f, -0.019393f, -0.009859f, +0.000138f, +0.000029f}, + {+0.042907f, +0.113552f, +0.005000f, -0.000638f, -0.000041f} + }, + { + {+0.045692f, -0.476580f, +0.008546f, +0.000086f, -0.000005f}, + {-0.080587f, -0.555433f, -0.017854f, -0.000450f, -0.000030f}, + {+0.182440f, -0.087182f, +0.017382f, -0.000294f, -0.000073f}, + {+0.075234f, -0.167476f, +0.008676f, +0.000034f, -0.000051f}, + {+0.071029f, -0.192007f, +0.008454f, +0.000011f, -0.000045f}, + {+0.086510f, -0.044174f, +0.003825f, +0.000041f, -0.000021f}, + {+0.075632f, -0.138240f, +0.011735f, -0.000028f, +0.000030f}, + {+0.013949f, -0.129305f, +0.005892f, -0.000040f, -0.000013f}, + {+0.045386f, +0.105892f, +0.005725f, +0.000024f, -0.000013f} + }, + { + {+0.264038f, -0.137768f, +0.037820f, -0.000452f, -0.000003f}, + {+0.327432f, +0.075214f, +0.050477f, +0.001428f, -0.000014f}, + {-0.022770f, -0.385123f, +0.004729f, +0.000100f, +0.000029f}, + {+0.054670f, -0.198426f, +0.007785f, +0.000271f, +0.000006f}, + {+0.049580f, -0.225410f, +0.005863f, +0.000204f, +0.000001f}, + {-0.043237f, -0.226727f, +0.000581f, -0.000235f, -0.000054f}, + {+0.021121f, -0.232475f, -0.003318f, +0.000194f, +0.000010f}, + {+0.068959f, -0.050792f, +0.006419f, -0.000075f, -0.000026f}, + {-0.050269f, -0.045913f, -0.008553f, +0.000508f, +0.000038f} + }, + { + {-0.122605f, +0.455832f, -0.019204f, -0.000024f, +0.000005f}, + {-0.006912f, +0.595107f, +0.002722f, +0.000314f, +0.000031f}, + {-0.131648f, -0.207572f, -0.020072f, +0.000119f, +0.000071f}, + {-0.075587f, -0.001389f, -0.007880f, -0.000200f, +0.000051f}, + {-0.092628f, -0.010795f, -0.009442f, -0.000210f, +0.000045f}, + {-0.034470f, -0.235595f, -0.004153f, -0.000184f, +0.000026f}, + {-0.138101f, +0.003560f, -0.013139f, +0.000044f, -0.000033f}, + {-0.076887f, +0.172735f, -0.011353f, -0.000186f, +0.000014f}, + {-0.018601f, -0.096133f, -0.000488f, -0.000002f, +0.000009f} + }, + { + {-0.239360f, +0.273817f, -0.034391f, +0.000359f, +0.000003f}, + {-0.344438f, +0.077598f, -0.050391f, -0.001368f, +0.000013f}, + {+0.085915f, +0.127791f, +0.009171f, +0.000053f, -0.000030f}, + {-0.003884f, +0.104668f, -0.002926f, -0.000117f, -0.000009f}, + {+0.025938f, +0.166624f, +0.001223f, +0.000030f, -0.000004f}, + {+0.087357f, -0.053855f, +0.006567f, +0.000375f, +0.000050f}, + {+0.079989f, +0.335328f, +0.010537f, -0.000213f, -0.000007f}, + {-0.027119f, +0.254717f, +0.001273f, +0.000328f, +0.000025f}, + {+0.049245f, +0.007836f, +0.007008f, -0.000515f, -0.000036f} + }, + { + {+0.189098f, -0.383414f, +0.028124f, +0.000092f, -0.000006f}, + {+0.108559f, -0.623832f, +0.013156f, -0.000170f, -0.000033f}, + {+0.052357f, +0.172914f, +0.014590f, -0.000154f, -0.000071f}, + {+0.027066f, +0.057228f, +0.004014f, +0.000183f, -0.000051f}, + {+0.042915f, +0.138441f, +0.007131f, +0.000079f, -0.000046f}, + {-0.062416f, +0.169373f, -0.002459f, +0.000150f, -0.000033f}, + {+0.109725f, +0.292825f, +0.008449f, +0.000038f, +0.000034f}, + {+0.124357f, +0.027929f, +0.015491f, +0.000061f, -0.000016f}, + {-0.001095f, +0.082699f, -0.001391f, +0.000112f, -0.000006f} + }, + { + {+0.194740f, -0.370983f, +0.028830f, -0.000424f, -0.000003f}, + {+0.334444f, -0.280705f, +0.047056f, +0.001250f, -0.000011f}, + {-0.070560f, -0.024714f, -0.010185f, -0.000110f, +0.000033f}, + {+0.007889f, +0.031645f, +0.004166f, +0.000046f, +0.000012f}, + {-0.044996f, +0.004394f, -0.003024f, -0.000024f, +0.000007f}, + {-0.022525f, +0.227369f, -0.001642f, -0.000313f, -0.000046f}, + {-0.165185f, -0.117904f, -0.015701f, +0.000142f, +0.000004f}, + {-0.080987f, -0.285489f, -0.008434f, -0.000232f, -0.000025f}, + {-0.049085f, +0.003557f, -0.010651f, +0.000401f, +0.000034f} + }, + { + {-0.234674f, +0.289561f, -0.036001f, +0.000013f, +0.000007f}, + {-0.223672f, +0.578241f, -0.027233f, +0.000092f, +0.000035f}, + {-0.024623f, -0.100323f, -0.004564f, +0.000328f, +0.000072f}, + {+0.017801f, +0.020633f, -0.002076f, -0.000042f, +0.000053f}, + {+0.013115f, -0.081785f, -0.000959f, +0.000079f, +0.000049f}, + {+0.080738f, +0.072886f, +0.004201f, -0.000076f, +0.000042f}, + {-0.002607f, -0.352196f, -0.003911f, -0.000017f, -0.000036f}, + {-0.069172f, -0.307620f, -0.004866f, -0.000006f, +0.000021f}, + {+0.028180f, -0.122432f, +0.007621f, -0.000085f, +0.000003f} + }, + { + {-0.147199f, +0.422160f, -0.022071f, +0.000321f, +0.000003f}, + {-0.267023f, +0.513414f, -0.037707f, -0.001150f, +0.000010f}, + {+0.060495f, +0.031583f, +0.008763f, -0.000093f, -0.000037f}, + {-0.065578f, -0.105960f, -0.010002f, -0.000209f, -0.000017f}, + {+0.014195f, -0.075807f, +0.002631f, -0.000201f, -0.000012f}, + {-0.053647f, -0.122427f, -0.002638f, +0.000093f, +0.000039f}, + {+0.142781f, -0.115711f, +0.024592f, -0.000188f, -0.000001f}, + {+0.149590f, +0.020216f, +0.015264f, -0.000015f, +0.000023f}, + {+0.037239f, -0.118872f, +0.000382f, -0.000458f, -0.000033f} + }, + { + {+0.269441f, -0.218896f, +0.041241f, +0.000004f, -0.000008f}, + {+0.303693f, -0.362352f, +0.037014f, -0.000053f, -0.000037f}, + {+0.007833f, +0.119694f, -0.000960f, -0.000345f, -0.000073f}, + {-0.004355f, -0.200633f, +0.001490f, +0.000103f, -0.000055f}, + {-0.032562f, +0.000305f, -0.004514f, +0.000019f, -0.000051f}, + {-0.017941f, -0.163230f, -0.007036f, +0.000034f, -0.000051f}, + {-0.046904f, +0.177005f, -0.004300f, +0.000147f, +0.000038f}, + {-0.058069f, +0.331227f, -0.002327f, +0.000118f, -0.000026f}, + {-0.065673f, +0.027120f, -0.006378f, +0.000220f, -0.000001f} + }, + { + {+0.096520f, -0.484461f, +0.013741f, -0.000314f, -0.000002f}, + {+0.168182f, -0.564851f, +0.028399f, +0.001136f, -0.000010f}, + {-0.055680f, +0.028246f, -0.005855f, +0.000184f, +0.000045f}, + {+0.118738f, -0.014371f, +0.012220f, +0.000155f, +0.000023f}, + {+0.022063f, +0.085271f, +0.002211f, +0.000137f, +0.000019f}, + {+0.049978f, -0.052230f, +0.005756f, +0.000013f, -0.000028f}, + {-0.111748f, +0.067754f, -0.020811f, +0.000056f, -0.000003f}, + {-0.098929f, +0.266647f, -0.009254f, +0.000013f, -0.000019f}, + {+0.022954f, +0.155435f, -0.001383f, +0.000344f, +0.000033f} + }, + { + {-0.298102f, +0.119927f, -0.044074f, +0.000054f, +0.000009f}, + {-0.324241f, +0.201048f, -0.044886f, -0.000061f, +0.000040f}, + {+0.018875f, -0.083814f, -0.000418f, +0.000398f, +0.000073f}, + {-0.061162f, +0.256472f, -0.008387f, +0.000024f, +0.000055f}, + {+0.028563f, +0.073381f, +0.002819f, +0.000106f, +0.000051f}, + {-0.019828f, +0.052279f, -0.002320f, +0.000130f, +0.000057f}, + {+0.058477f, -0.203321f, +0.012650f, -0.000104f, -0.000040f}, + {+0.133242f, -0.084836f, +0.013242f, -0.000015f, +0.000030f}, + {+0.042678f, +0.121577f, +0.007398f, -0.000185f, -0.000002f} + }, + { + {-0.034897f, +0.521904f, -0.005636f, +0.000275f, +0.000001f}, + {-0.096022f, +0.555951f, -0.014099f, -0.001080f, +0.000009f}, + {+0.022232f, -0.076542f, +0.003659f, -0.000139f, -0.000053f}, + {-0.117964f, +0.166708f, -0.014124f, -0.000190f, -0.000030f}, + {-0.054876f, -0.054232f, -0.005942f, -0.000155f, -0.000026f}, + {-0.020865f, +0.046834f, -0.005114f, -0.000034f, +0.000016f}, + {+0.119090f, -0.116285f, +0.014688f, -0.000066f, +0.000006f}, + {-0.009162f, -0.296851f, +0.001585f, -0.000015f, +0.000013f}, + {-0.057034f, -0.032243f, -0.004358f, -0.000329f, -0.000032f} + }, + { + {+0.309227f, -0.006599f, +0.046261f, -0.000088f, -0.000010f}, + {+0.335689f, -0.108899f, +0.045170f, +0.000116f, -0.000044f}, + {-0.010768f, -0.025357f, +0.000938f, -0.000529f, -0.000070f}, + {+0.120101f, -0.199389f, +0.018645f, -0.000027f, -0.000054f}, + {-0.005167f, -0.128785f, +0.000940f, -0.000138f, -0.000050f}, + {+0.023264f, -0.025419f, +0.006527f, -0.000284f, -0.000058f}, + {-0.107846f, +0.228561f, -0.015701f, +0.000136f, +0.000041f}, + {-0.112356f, -0.131761f, -0.015190f, -0.000104f, -0.000031f}, + {+0.003668f, -0.126548f, +0.000034f, +0.000218f, +0.000005f} + }, + { + {-0.027502f, -0.522603f, -0.003411f, -0.000264f, -0.000000f}, + {+0.030738f, -0.578245f, +0.004213f, +0.001069f, -0.000007f}, + {-0.000609f, -0.013454f, -0.002363f, +0.000076f, +0.000061f}, + {+0.087398f, -0.248212f, +0.011938f, +0.000075f, +0.000037f}, + {+0.076224f, -0.003106f, +0.010057f, +0.000063f, +0.000032f}, + {+0.005937f, -0.057510f, +0.000360f, -0.000077f, -0.000005f}, + {-0.095342f, +0.246056f, -0.013136f, +0.000057f, -0.000011f}, + {+0.080706f, +0.167833f, +0.010054f, +0.000007f, -0.000008f}, + {+0.052615f, -0.051218f, +0.005205f, +0.000238f, +0.000032f} + }, + { + {-0.304352f, -0.097670f, -0.045722f, +0.000119f, +0.000010f}, + {-0.340086f, -0.006265f, -0.046602f, -0.000169f, +0.000048f}, + {-0.020424f, +0.011099f, -0.001667f, +0.000571f, +0.000066f}, + {-0.162423f, +0.138866f, -0.025027f, +0.000093f, +0.000052f}, + {-0.033809f, +0.166438f, -0.006399f, +0.000195f, +0.000048f}, + {-0.027146f, -0.011761f, -0.003177f, +0.000395f, +0.000056f}, + {+0.155957f, -0.140724f, +0.023139f, -0.000149f, -0.000042f}, + {+0.050658f, +0.213522f, +0.006115f, +0.000088f, +0.000030f}, + {-0.039762f, +0.093271f, -0.004720f, -0.000234f, -0.000009f} + }, + { + {+0.084174f, +0.498153f, +0.011738f, +0.000258f, -0.000001f}, + {+0.034060f, +0.568731f, +0.004971f, -0.001035f, +0.000004f}, + {+0.017008f, +0.063888f, +0.000389f, +0.000004f, -0.000066f}, + {-0.040634f, +0.328420f, -0.004057f, -0.000038f, -0.000042f}, + {-0.073934f, +0.106271f, -0.009079f, -0.000021f, -0.000038f}, + {+0.016227f, +0.051899f, -0.000373f, +0.000148f, -0.000001f}, + {+0.040260f, -0.318605f, +0.006025f, -0.000077f, +0.000015f}, + {-0.100959f, -0.021877f, -0.014425f, +0.000114f, +0.000006f}, + {-0.027106f, +0.113757f, -0.001462f, -0.000158f, -0.000030f} + }, + { + {+0.289347f, +0.183367f, +0.043677f, -0.000132f, -0.000010f}, + {+0.332610f, +0.106477f, +0.046382f, +0.000181f, -0.000052f}, + {+0.030172f, +0.040872f, +0.005239f, -0.000542f, -0.000065f}, + {+0.188712f, -0.022024f, +0.026128f, -0.000084f, -0.000051f}, + {+0.071871f, -0.114351f, +0.009162f, -0.000197f, -0.000047f}, + {+0.013433f, +0.054663f, +0.003535f, -0.000343f, -0.000057f}, + {-0.178475f, +0.017894f, -0.025738f, +0.000205f, +0.000044f}, + {+0.010117f, -0.193309f, +0.001195f, -0.000079f, -0.000031f}, + {+0.059297f, -0.019649f, +0.006335f, +0.000285f, +0.000013f} + }, + { + {-0.134846f, -0.467842f, -0.019524f, -0.000244f, +0.000001f}, + {-0.092222f, -0.547291f, -0.014252f, +0.000986f, -0.000001f}, + {-0.040107f, -0.068680f, -0.004663f, +0.000023f, +0.000071f}, + {-0.024493f, -0.346874f, -0.002774f, +0.000070f, +0.000048f}, + {+0.047272f, -0.147189f, +0.008626f, +0.000053f, +0.000044f}, + {-0.026008f, -0.007599f, -0.001975f, -0.000132f, +0.000005f}, + {+0.030534f, +0.339732f, +0.003406f, +0.000035f, -0.000020f}, + {+0.083347f, -0.077557f, +0.013266f, -0.000128f, -0.000007f}, + {-0.013672f, -0.131388f, -0.003403f, +0.000118f, +0.000027f} + }, + { + {-0.267902f, -0.264872f, -0.040046f, +0.000129f, +0.000011f}, + {-0.321912f, -0.191063f, -0.044992f, -0.000193f, +0.000056f}, + {-0.022572f, -0.096725f, -0.002705f, +0.000503f, +0.000069f}, + {-0.176343f, -0.111752f, -0.025706f, +0.000048f, +0.000053f}, + {-0.084811f, +0.059741f, -0.013684f, +0.000183f, +0.000048f}, + {+0.004452f, -0.055305f, -0.000514f, +0.000261f, +0.000064f}, + {+0.161895f, +0.139155f, +0.022695f, -0.000241f, -0.000046f}, + {-0.046966f, +0.125238f, -0.006695f, +0.000013f, +0.000036f}, + {-0.046666f, -0.080465f, -0.004500f, -0.000378f, -0.000014f} + }, + { + {+0.182763f, +0.425959f, +0.026111f, +0.000216f, -0.000001f}, + {+0.151967f, +0.538951f, +0.023953f, -0.000917f, -0.000002f}, + {+0.059967f, +0.029780f, +0.006750f, -0.000233f, -0.000082f}, + {+0.071926f, +0.268254f, +0.009365f, -0.000173f, -0.000058f}, + {-0.030147f, +0.144364f, -0.004637f, -0.000155f, -0.000054f}, + {+0.022610f, -0.026139f, +0.001896f, -0.000081f, -0.000015f}, + {-0.089140f, -0.244883f, -0.010242f, +0.000037f, +0.000027f}, + {-0.053982f, +0.112441f, -0.009466f, +0.000027f, +0.000006f}, + {+0.043125f, +0.054784f, +0.006054f, -0.000118f, -0.000026f} + }, + { + {+0.236555f, +0.344253f, +0.035451f, -0.000140f, -0.000014f}, + {+0.305017f, +0.302445f, +0.041503f, +0.000225f, -0.000061f}, + {+0.000099f, +0.121249f, +0.000347f, -0.000531f, -0.000075f}, + {+0.147839f, +0.147624f, +0.023593f, -0.000074f, -0.000055f}, + {+0.099074f, -0.056676f, +0.015836f, -0.000238f, -0.000049f}, + {-0.015365f, +0.033058f, -0.001023f, -0.000263f, -0.000075f}, + {-0.115117f, -0.202631f, -0.018500f, +0.000266f, +0.000048f}, + {+0.062522f, -0.070317f, +0.009998f, +0.000023f, -0.000045f}, + {+0.009357f, +0.103095f, +0.001665f, +0.000461f, +0.000014f} + }, + { + {-0.223414f, -0.360443f, -0.031653f, -0.000161f, +0.000003f}, + {-0.220330f, -0.504684f, -0.033230f, +0.000874f, +0.000003f}, + {-0.065668f, +0.018345f, -0.008069f, +0.000490f, +0.000105f}, + {-0.094224f, -0.228227f, -0.015610f, +0.000296f, +0.000075f}, + {+0.011044f, -0.195618f, -0.000221f, +0.000284f, +0.000070f}, + {-0.015206f, +0.030774f, -0.001584f, +0.000377f, +0.000037f}, + {+0.112319f, +0.149909f, +0.015570f, -0.000082f, -0.000037f}, + {+0.027593f, -0.125221f, +0.004605f, +0.000167f, +0.000001f}, + {-0.035657f, +0.033761f, -0.006506f, +0.000132f, +0.000027f} + }, + { + {-0.197435f, -0.400152f, -0.030189f, +0.000183f, +0.000017f}, + {-0.265346f, -0.433349f, -0.035911f, -0.000309f, +0.000070f}, + {+0.024825f, -0.121781f, +0.003662f, +0.000791f, +0.000075f}, + {-0.131639f, -0.172895f, -0.018896f, +0.000200f, +0.000051f}, + {-0.118431f, +0.000422f, -0.015867f, +0.000387f, +0.000045f}, + {+0.018068f, -0.023258f, +0.002724f, +0.000522f, +0.000082f}, + {+0.072974f, +0.212278f, +0.011511f, -0.000340f, -0.000047f}, + {-0.068530f, +0.023641f, -0.010358f, +0.000042f, +0.000055f}, + {+0.013236f, -0.038962f, +0.000910f, -0.000477f, -0.000015f} + }, + { + {+0.253363f, +0.291660f, +0.036499f, +0.000094f, -0.000007f}, + {+0.281798f, +0.406628f, +0.041589f, -0.000891f, -0.000005f}, + {+0.059479f, -0.066959f, +0.007177f, -0.000628f, -0.000142f}, + {+0.120109f, +0.213729f, +0.018705f, -0.000288f, -0.000099f}, + {+0.027666f, +0.223189f, +0.003521f, -0.000300f, -0.000093f}, + {+0.013844f, -0.028875f, +0.000557f, -0.000575f, -0.000072f}, + {-0.118976f, -0.083818f, -0.016708f, +0.000094f, +0.000049f}, + {-0.002209f, +0.126405f, -0.000845f, -0.000338f, -0.000017f}, + {+0.011760f, -0.039638f, +0.005259f, -0.000091f, -0.000032f} + }, + { + {+0.156753f, +0.440657f, +0.023910f, -0.000253f, -0.000018f}, + {+0.203795f, +0.522732f, +0.028158f, +0.000411f, -0.000085f}, + {-0.046218f, +0.097129f, -0.007205f, -0.001249f, -0.000056f}, + {+0.112467f, +0.226687f, +0.015571f, -0.000451f, -0.000035f}, + {+0.117838f, +0.083303f, +0.016703f, -0.000616f, -0.000028f}, + {-0.023412f, +0.030837f, -0.004021f, -0.001018f, -0.000071f}, + {-0.037437f, -0.211830f, -0.005723f, +0.000467f, +0.000043f}, + {+0.064323f, +0.023579f, +0.009934f, -0.000232f, -0.000060f}, + {-0.009156f, -0.006104f, -0.001969f, +0.000387f, +0.000022f} + }, + { + {-0.275944f, -0.222761f, -0.039627f, -0.000066f, +0.000013f}, + {-0.322019f, -0.286370f, -0.048482f, +0.000959f, +0.000014f}, + {-0.046923f, +0.094317f, -0.005599f, +0.000435f, +0.000182f}, + {-0.150750f, -0.177020f, -0.022662f, +0.000117f, +0.000123f}, + {-0.067347f, -0.202691f, -0.009894f, +0.000124f, +0.000115f}, + {-0.015081f, +0.042971f, -0.000082f, +0.000445f, +0.000114f}, + {+0.117640f, +0.025700f, +0.015946f, -0.000085f, -0.000063f}, + {-0.016418f, -0.100980f, -0.001676f, +0.000298f, +0.000040f}, + {-0.000250f, +0.010429f, -0.002435f, -0.000017f, +0.000037f} + }, + { + {-0.115447f, -0.469158f, -0.017950f, +0.000366f, +0.000017f}, + {-0.134884f, -0.571706f, -0.018454f, -0.000373f, +0.000105f}, + {+0.067420f, -0.084270f, +0.010575f, +0.001650f, +0.000010f}, + {-0.076003f, -0.293259f, -0.009993f, +0.000579f, +0.000003f}, + {-0.098520f, -0.155744f, -0.013412f, +0.000754f, -0.000004f}, + {+0.039536f, -0.043110f, +0.005899f, +0.001509f, +0.000034f}, + {+0.003041f, +0.203039f, +0.001212f, -0.000536f, -0.000033f}, + {-0.056528f, -0.038194f, -0.009590f, +0.000577f, +0.000054f}, + {-0.001245f, +0.013315f, +0.000319f, -0.000346f, -0.000036f} + }, + { + {+0.292999f, +0.157930f, +0.042403f, +0.000087f, -0.000020f}, + {+0.342354f, +0.162255f, +0.051635f, -0.001110f, -0.000034f}, + {+0.022156f, -0.154740f, +0.000608f, +0.000173f, -0.000208f}, + {+0.168151f, +0.078549f, +0.023857f, +0.000280f, -0.000137f}, + {+0.096594f, +0.143573f, +0.013193f, +0.000234f, -0.000126f}, + {+0.002506f, -0.100103f, -0.002757f, +0.000120f, -0.000144f}, + {-0.102496f, +0.041774f, -0.013753f, -0.000024f, +0.000074f}, + {+0.028733f, +0.095250f, +0.004398f, -0.000056f, -0.000064f}, + {-0.000053f, +0.012400f, +0.002539f, +0.000289f, -0.000038f} + }, + { + {+0.073802f, +0.495430f, +0.011185f, -0.000471f, -0.000013f}, + {+0.067107f, +0.583553f, +0.008494f, +0.000150f, -0.000126f}, + {-0.082122f, +0.004027f, -0.011237f, -0.001551f, +0.000060f}, + {+0.028928f, +0.288941f, +0.005398f, -0.000320f, +0.000043f}, + {+0.067365f, +0.187138f, +0.009613f, -0.000522f, +0.000049f}, + {-0.053548f, -0.014546f, -0.006738f, -0.001557f, +0.000028f}, + {+0.021691f, -0.148588f, +0.001549f, +0.000530f, +0.000018f}, + {+0.052283f, +0.060853f, +0.007887f, -0.000799f, -0.000034f}, + {+0.008489f, -0.003383f, +0.001566f, +0.000494f, +0.000057f} + }, + { + {-0.307330f, -0.088798f, -0.043952f, -0.000185f, +0.000025f}, + {-0.348741f, -0.055377f, -0.052852f, +0.001109f, +0.000070f}, + {+0.020133f, +0.157206f, +0.002804f, -0.000807f, +0.000201f}, + {-0.157718f, +0.000354f, -0.025108f, -0.000577f, +0.000129f}, + {-0.107002f, -0.082667f, -0.016074f, -0.000429f, +0.000116f}, + {+0.027699f, +0.106463f, +0.004855f, -0.000830f, +0.000144f}, + {+0.076446f, -0.063154f, +0.011339f, +0.000105f, -0.000081f}, + {-0.046001f, -0.090381f, -0.006439f, -0.000517f, +0.000079f}, + {-0.003916f, -0.020923f, -0.003928f, -0.000676f, +0.000026f} + }, + { + {-0.027283f, -0.518967f, -0.004482f, +0.000531f, +0.000006f}, + {-0.002104f, -0.586753f, +0.000310f, +0.000388f, +0.000138f}, + {+0.067195f, +0.083021f, +0.013467f, -0.000261f, -0.000139f}, + {+0.000203f, -0.242050f, +0.002218f, -0.001130f, -0.000092f}, + {-0.041057f, -0.183900f, -0.003084f, -0.000869f, -0.000096f}, + {+0.043480f, +0.079977f, +0.008525f, +0.000104f, -0.000100f}, + {-0.026266f, +0.096019f, -0.004003f, -0.000222f, +0.000001f}, + {-0.040550f, -0.099815f, -0.006813f, +0.000626f, +0.000005f}, + {-0.012858f, -0.005094f, -0.001938f, -0.001102f, -0.000079f} + }, + { + {+0.314481f, +0.005188f, +0.044811f, +0.000426f, -0.000028f}, + {+0.346528f, -0.051746f, +0.052277f, -0.000401f, -0.000122f}, + {-0.053118f, -0.097595f, -0.002410f, +0.001225f, -0.000151f}, + {+0.140849f, -0.024347f, +0.026727f, +0.000253f, -0.000095f}, + {+0.107847f, +0.047702f, +0.019644f, -0.000097f, -0.000079f}, + {-0.051228f, -0.061068f, -0.003689f, +0.001630f, -0.000102f}, + {-0.056164f, +0.049815f, -0.009319f, +0.000032f, +0.000080f}, + {+0.061891f, +0.058300f, +0.009871f, +0.001903f, -0.000079f}, + {+0.009880f, +0.028684f, +0.006879f, +0.001108f, +0.000001f} + } +}; + +const float rightHRIRReal_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]= +{ + { + {-0.005335f, +0.653226f, +0.143797f, +0.002456f, -0.000002f}, + {+0.013208f, -0.379140f, +0.322559f, +0.004978f, +0.000009f}, + {+0.001925f, +0.054222f, +0.043071f, -0.002449f, -0.000110f}, + {-0.000927f, +0.060176f, -0.015580f, -0.001281f, -0.000042f}, + {-0.003471f, -0.011471f, -0.002826f, -0.001074f, +0.000026f}, + {-0.003706f, +0.001098f, +0.005680f, -0.008863f, -0.000084f}, + {-0.005326f, -0.000766f, -0.002007f, -0.003072f, +0.000014f}, + {+0.001747f, -0.039662f, +0.085770f, +0.000859f, +0.000050f}, + {-0.009494f, +0.084274f, -0.084910f, -0.005996f, -0.000078f} + }, + { + {+0.020549f, +0.471556f, -0.054545f, -0.003976f, +0.000002f}, + {-0.031621f, -0.813566f, -0.056755f, -0.007166f, -0.000006f}, + {-0.002271f, -0.021372f, -0.026223f, +0.003087f, +0.000136f}, + {+0.000511f, +0.035700f, -0.040529f, +0.002564f, +0.000048f}, + {+0.007142f, +0.001751f, +0.001329f, +0.002743f, -0.000028f}, + {+0.006527f, +0.051957f, +0.070578f, +0.014200f, +0.000113f}, + {+0.014135f, +0.025109f, +0.015403f, +0.005652f, -0.000015f}, + {-0.003291f, -0.069019f, +0.036066f, +0.001141f, -0.000069f}, + {+0.028061f, +0.152663f, -0.025603f, +0.008277f, +0.000102f} + }, + { + {-0.039663f, +0.412008f, +0.017452f, +0.000445f, +0.000002f}, + {+0.026960f, -0.962971f, -0.087407f, -0.001953f, -0.000014f}, + {-0.001486f, -0.002955f, -0.054042f, +0.000085f, +0.000075f}, + {+0.003107f, +0.048844f, -0.051503f, -0.002108f, +0.000034f}, + {-0.009864f, +0.005169f, +0.019159f, -0.003128f, -0.000025f}, + {-0.004987f, +0.054770f, +0.099413f, -0.003316f, +0.000044f}, + {-0.024855f, +0.021795f, +0.065786f, -0.002538f, -0.000013f}, + {+0.003623f, +0.018186f, -0.058320f, -0.005763f, -0.000022f}, + {-0.055010f, +0.126807f, +0.109029f, +0.001546f, +0.000045f} + }, + { + {+0.043174f, +0.455537f, -0.027678f, +0.002529f, -0.000002f}, + {+0.025122f, -0.922813f, -0.028063f, +0.008613f, +0.000006f}, + {+0.002020f, +0.051124f, -0.010761f, +0.000153f, -0.000146f}, + {-0.010597f, +0.081732f, -0.001493f, +0.001479f, -0.000051f}, + {+0.024810f, -0.014152f, -0.030508f, +0.002185f, +0.000029f}, + {+0.011648f, -0.040215f, -0.008697f, -0.003893f, -0.000125f}, + {+0.043616f, -0.007408f, -0.035355f, -0.000987f, +0.000015f}, + {-0.007698f, +0.031375f, -0.028885f, +0.004919f, +0.000076f}, + {+0.093586f, +0.162669f, -0.029770f, -0.007128f, -0.000112f} + }, + { + {-0.001041f, +0.494032f, +0.005715f, -0.001108f, -0.000002f}, + {-0.143821f, -0.682007f, +0.029450f, -0.003481f, +0.000019f}, + {+0.006306f, +0.070613f, -0.011179f, -0.001860f, -0.000038f}, + {+0.031146f, +0.059515f, -0.014381f, -0.000905f, -0.000027f}, + {-0.052905f, +0.051459f, +0.001250f, -0.000868f, +0.000023f}, + {-0.029241f, -0.030800f, -0.000944f, +0.000488f, +0.000000f}, + {-0.055716f, +0.063529f, +0.002159f, +0.000641f, +0.000013f}, + {+0.013468f, -0.008041f, -0.000774f, +0.000134f, -0.000007f}, + {-0.101473f, +0.336570f, +0.012535f, +0.003233f, -0.000009f} + }, + { + {-0.092816f, +0.358882f, +0.002536f, -0.001449f, +0.000001f}, + {+0.262828f, -0.127251f, +0.020151f, -0.004341f, -0.000009f}, + {-0.022963f, +0.059857f, +0.016901f, +0.000212f, +0.000141f}, + {-0.064426f, -0.041934f, +0.012804f, -0.000049f, +0.000052f}, + {+0.064139f, +0.206373f, -0.000508f, +0.000138f, -0.000031f}, + {+0.035857f, +0.035091f, -0.016850f, +0.002300f, +0.000120f}, + {+0.032908f, +0.170386f, -0.004178f, +0.001249f, -0.000015f}, + {-0.010158f, -0.037569f, +0.007236f, -0.002146f, -0.000070f}, + {+0.021780f, +0.486360f, -0.004267f, +0.000644f, +0.000106f} + }, + { + {+0.166528f, -0.018320f, +0.002944f, +0.001057f, +0.000002f}, + {-0.217141f, +0.537828f, -0.015478f, +0.003353f, -0.000022f}, + {+0.036889f, -0.008294f, -0.001367f, +0.001254f, +0.000008f}, + {+0.069514f, -0.229400f, +0.010249f, +0.000566f, +0.000020f}, + {-0.019714f, +0.330742f, -0.003692f, +0.000002f, -0.000022f}, + {-0.010625f, +0.080582f, +0.010145f, -0.000258f, -0.000041f}, + {+0.022526f, +0.170893f, +0.014154f, -0.001025f, -0.000013f}, + {-0.007441f, -0.048091f, +0.004112f, +0.000974f, +0.000032f}, + {+0.115639f, +0.344255f, +0.014295f, -0.000177f, -0.000021f} + }, + { + {-0.099909f, -0.399087f, -0.008044f, +0.000848f, -0.000001f}, + {-0.054243f, +0.757012f, -0.020850f, +0.002283f, +0.000013f}, + {-0.025209f, -0.091980f, -0.004347f, +0.000486f, -0.000127f}, + {+0.003575f, -0.340857f, -0.007962f, -0.000163f, -0.000051f}, + {-0.071769f, +0.265803f, +0.002595f, -0.000097f, +0.000034f}, + {-0.026489f, +0.035458f, -0.005585f, -0.001110f, -0.000100f}, + {-0.060623f, +0.023422f, -0.010689f, -0.000403f, +0.000015f}, + {+0.027371f, -0.008448f, -0.007673f, -0.000192f, +0.000053f}, + {-0.176311f, -0.087697f, -0.004740f, -0.000958f, -0.000089f} + }, + { + {-0.098192f, -0.380559f, -0.012062f, -0.000872f, -0.000003f}, + {+0.307522f, +0.201411f, +0.041908f, -0.002386f, +0.000023f}, + {-0.016794f, -0.090327f, -0.008151f, -0.001481f, +0.000012f}, + {-0.117497f, -0.178818f, -0.001213f, -0.000161f, -0.000015f}, + {+0.130667f, -0.017905f, +0.002862f, +0.000224f, +0.000021f}, + {+0.026816f, -0.061563f, +0.002730f, +0.000500f, +0.000070f}, + {+0.035111f, -0.133808f, +0.000916f, +0.000421f, +0.000014f}, + {-0.028071f, +0.069426f, -0.005372f, -0.000149f, -0.000048f}, + {+0.069362f, -0.446237f, -0.000098f, +0.000728f, +0.000041f} + }, + { + {+0.200424f, +0.084933f, +0.029127f, -0.000528f, +0.000002f}, + {-0.208158f, -0.589613f, -0.015424f, -0.001691f, -0.000018f}, + {+0.041516f, +0.016661f, +0.015205f, -0.000153f, +0.000109f}, + {+0.138467f, +0.186187f, +0.007440f, -0.000185f, +0.000051f}, + {-0.077086f, -0.303705f, +0.003329f, -0.000036f, -0.000037f}, + {+0.020310f, -0.080808f, -0.007043f, +0.000054f, +0.000070f}, + {+0.031948f, -0.141008f, -0.000818f, +0.000548f, -0.000016f}, + {+0.000366f, +0.119534f, +0.006275f, +0.000355f, -0.000032f}, + {+0.109021f, -0.372983f, +0.009320f, +0.000129f, +0.000067f} + }, + { + {-0.031292f, +0.437887f, -0.005797f, +0.000706f, +0.000004f}, + {-0.174454f, -0.640794f, -0.027817f, +0.001980f, -0.000023f}, + {+0.003185f, +0.089160f, -0.003572f, +0.001064f, -0.000021f}, + {-0.004179f, +0.383165f, +0.003748f, +0.000389f, +0.000011f}, + {-0.056596f, -0.310132f, -0.010567f, -0.000223f, -0.000018f}, + {-0.057823f, +0.028077f, -0.000893f, -0.000451f, -0.000085f}, + {-0.063559f, +0.001711f, -0.003009f, -0.000543f, -0.000016f}, + {+0.035766f, +0.073579f, +0.002518f, +0.000224f, +0.000053f}, + {-0.161175f, +0.042780f, -0.016398f, -0.000634f, -0.000050f} + }, + { + {-0.205155f, +0.167329f, -0.030119f, +0.000379f, -0.000002f}, + {+0.339082f, +0.153701f, +0.034923f, +0.001267f, +0.000022f}, + {-0.072520f, -0.022480f, -0.011077f, +0.000072f, -0.000094f}, + {-0.141121f, +0.163887f, -0.018765f, +0.000088f, -0.000051f}, + {+0.127275f, -0.020840f, +0.015322f, -0.000034f, +0.000041f}, + {+0.027665f, +0.152414f, +0.006975f, +0.000222f, -0.000038f}, + {+0.020531f, +0.124947f, +0.003832f, -0.000374f, +0.000019f}, + {-0.042138f, -0.039811f, -0.003937f, -0.000440f, +0.000012f}, + {+0.031495f, +0.327305f, +0.001379f, +0.000105f, -0.000048f} + }, + { + {+0.145847f, -0.370580f, +0.020419f, -0.000633f, -0.000004f}, + {-0.026755f, +0.715695f, +0.002721f, -0.001713f, +0.000021f}, + {+0.048263f, -0.214620f, +0.011454f, -0.000799f, +0.000024f}, + {+0.105105f, -0.209642f, +0.009809f, -0.000393f, -0.000007f}, + {-0.046673f, +0.240709f, -0.003039f, +0.000354f, +0.000014f}, + {+0.046604f, +0.126235f, +0.001254f, +0.000637f, +0.000087f}, + {+0.040919f, +0.089993f, +0.004646f, +0.000614f, +0.000016f}, + {+0.003849f, -0.106327f, -0.000606f, -0.000255f, -0.000050f}, + {+0.114169f, +0.187796f, +0.016720f, +0.000604f, +0.000050f} + }, + { + {+0.151563f, -0.357850f, +0.023901f, -0.000267f, +0.000003f}, + {-0.329416f, +0.240852f, -0.037687f, -0.000972f, -0.000025f}, + {+0.079637f, -0.178703f, +0.006277f, -0.000085f, +0.000084f}, + {+0.067743f, -0.255542f, +0.013928f, -0.000093f, +0.000052f}, + {-0.085616f, +0.171409f, -0.015038f, +0.000016f, -0.000044f}, + {-0.080584f, -0.060419f, -0.009795f, -0.000260f, +0.000011f}, + {-0.039270f, -0.029107f, -0.004384f, +0.000149f, -0.000022f}, + {+0.040700f, -0.048532f, +0.005694f, +0.000308f, +0.000003f}, + {-0.100428f, -0.143102f, -0.013507f, -0.000175f, +0.000032f} + }, + { + {-0.221520f, +0.217382f, -0.031802f, +0.000571f, +0.000004f}, + {+0.191369f, -0.563524f, +0.020930f, +0.001563f, -0.000018f}, + {-0.142768f, +0.156236f, -0.016728f, +0.000768f, -0.000025f}, + {-0.131233f, +0.058224f, -0.018961f, +0.000413f, +0.000003f}, + {+0.094869f, -0.113180f, +0.014106f, -0.000387f, -0.000009f}, + {+0.032009f, -0.229593f, +0.004382f, -0.000814f, -0.000078f}, + {-0.014026f, -0.058166f, -0.005170f, -0.000559f, -0.000016f}, + {-0.035069f, +0.066238f, -0.003175f, +0.000270f, +0.000041f}, + {-0.032944f, -0.241581f, -0.006363f, -0.000531f, -0.000047f} + }, + { + {-0.072792f, +0.444420f, -0.012987f, +0.000205f, -0.000004f}, + {+0.237324f, -0.482374f, +0.029199f, +0.000704f, +0.000027f}, + {+0.015060f, +0.403253f, +0.004767f, +0.000016f, -0.000078f}, + {-0.002750f, +0.257555f, -0.001283f, +0.000101f, -0.000052f}, + {+0.029761f, -0.216925f, +0.003727f, -0.000037f, +0.000045f}, + {+0.050908f, -0.208738f, +0.003838f, +0.000287f, +0.000007f}, + {+0.026158f, +0.010072f, +0.007655f, -0.000049f, +0.000026f}, + {-0.018378f, +0.087639f, -0.004770f, -0.000153f, -0.000011f}, + {+0.100406f, -0.034654f, +0.015514f, +0.000140f, -0.000022f} + }, + { + {+0.257437f, -0.065717f, +0.037575f, -0.000530f, -0.000004f}, + {-0.281553f, +0.324420f, -0.036967f, -0.001412f, +0.000017f}, + {+0.165202f, +0.184739f, +0.014027f, -0.000709f, +0.000026f}, + {+0.125102f, +0.059915f, +0.017871f, -0.000393f, +0.000001f}, + {-0.112292f, +0.000623f, -0.014750f, +0.000389f, +0.000004f}, + {-0.090463f, -0.007129f, -0.003581f, +0.000747f, +0.000067f}, + {+0.027231f, +0.007327f, +0.004513f, +0.000487f, +0.000014f}, + {+0.046307f, -0.017672f, +0.008365f, -0.000175f, -0.000032f}, + {-0.028415f, +0.161325f, -0.001715f, +0.000514f, +0.000043f} + }, + { + {-0.007526f, -0.473436f, +0.001022f, -0.000153f, +0.000005f}, + {-0.129889f, +0.550582f, -0.015713f, -0.000496f, -0.000029f}, + {-0.152654f, -0.291103f, -0.013185f, -0.000005f, +0.000074f}, + {-0.054068f, -0.217748f, -0.007018f, -0.000142f, +0.000051f}, + {+0.037999f, +0.233960f, +0.005179f, +0.000063f, -0.000045f}, + {+0.058157f, +0.208550f, +0.000279f, -0.000232f, -0.000018f}, + {-0.043982f, -0.108725f, -0.011637f, +0.000065f, -0.000029f}, + {+0.000177f, -0.092885f, -0.000896f, -0.000064f, +0.000013f}, + {-0.062887f, +0.105831f, -0.012283f, -0.000152f, +0.000016f} + }, + { + {-0.267052f, -0.072481f, -0.039143f, +0.000481f, +0.000004f}, + {+0.316645f, -0.147998f, +0.045958f, +0.001265f, -0.000015f}, + {-0.048560f, -0.443085f, -0.007515f, +0.000666f, -0.000028f}, + {-0.086419f, -0.172339f, -0.010499f, +0.000432f, -0.000005f}, + {+0.085408f, +0.166595f, +0.008605f, -0.000440f, -0.000000f}, + {+0.015618f, +0.269874f, +0.001215f, -0.000625f, -0.000057f}, + {-0.041006f, -0.120930f, -0.000588f, -0.000488f, -0.000012f}, + {-0.062603f, +0.004952f, -0.009992f, +0.000232f, +0.000027f}, + {+0.049095f, -0.068280f, +0.006362f, -0.000520f, -0.000040f} + }, + { + {+0.085562f, +0.471449f, +0.011009f, +0.000129f, -0.000005f}, + {+0.040209f, -0.573378f, +0.000615f, +0.000315f, +0.000031f}, + {+0.171918f, -0.105151f, +0.017403f, +0.000004f, -0.000072f}, + {+0.084128f, +0.083375f, +0.007231f, +0.000038f, -0.000051f}, + {-0.092144f, -0.099172f, -0.007312f, +0.000077f, +0.000045f}, + {-0.077363f, +0.132678f, -0.001733f, +0.000235f, +0.000023f}, + {+0.111219f, +0.109132f, +0.015848f, -0.000079f, +0.000032f}, + {+0.040923f, +0.172426f, +0.008798f, -0.000008f, -0.000013f}, + {+0.029588f, -0.098729f, +0.007764f, +0.000221f, -0.000011f} + }, + { + {+0.254737f, +0.211411f, +0.036795f, -0.000484f, -0.000003f}, + {-0.338234f, +0.015114f, -0.048846f, -0.001053f, +0.000013f}, + {-0.069108f, +0.254859f, -0.003290f, -0.000753f, +0.000029f}, + {+0.023788f, +0.170361f, +0.006488f, -0.000354f, +0.000008f}, + {-0.008393f, -0.222503f, -0.002681f, +0.000354f, -0.000003f}, + {+0.081171f, -0.098496f, +0.004558f, +0.000585f, +0.000051f}, + {-0.022336f, +0.317809f, -0.007308f, +0.000546f, +0.000009f}, + {+0.059371f, +0.155239f, +0.002593f, -0.000198f, -0.000025f}, + {-0.050719f, +0.026919f, -0.006976f, +0.000534f, +0.000037f} + }, + { + {-0.158995f, -0.424829f, -0.020702f, -0.000042f, +0.000006f}, + {+0.052902f, +0.616966f, +0.013055f, -0.000306f, -0.000032f}, + {-0.087152f, +0.213242f, -0.015296f, +0.000352f, +0.000070f}, + {-0.054260f, +0.047270f, -0.008042f, +0.000061f, +0.000051f}, + {+0.073970f, -0.094701f, +0.008512f, -0.000228f, -0.000046f}, + {-0.017462f, -0.238223f, -0.000790f, -0.000485f, -0.000029f}, + {-0.138534f, +0.148762f, -0.014349f, -0.000008f, -0.000034f}, + {-0.109919f, -0.097327f, -0.010882f, +0.000233f, +0.000014f}, + {-0.006806f, +0.096529f, -0.003657f, -0.000365f, +0.000007f} + }, + { + {-0.218541f, -0.332409f, -0.031504f, +0.000445f, +0.000003f}, + {+0.344919f, +0.163301f, +0.048934f, +0.001021f, -0.000012f}, + {+0.081260f, -0.052733f, +0.012413f, +0.000334f, -0.000031f}, + {+0.001753f, -0.039186f, -0.002593f, +0.000192f, -0.000011f}, + {-0.044437f, +0.083315f, -0.002185f, -0.000075f, +0.000005f}, + {-0.063695f, -0.165969f, -0.005598f, -0.000350f, -0.000048f}, + {+0.133966f, -0.261153f, +0.015377f, -0.000538f, -0.000006f}, + {+0.023795f, -0.302979f, +0.005384f, -0.000124f, +0.000025f}, + {+0.048328f, +0.008375f, +0.007723f, -0.000384f, -0.000035f} + }, + { + {+0.215234f, +0.334693f, +0.029335f, -0.000032f, -0.000006f}, + {-0.163645f, -0.620258f, -0.029442f, +0.000199f, +0.000034f}, + {+0.033793f, -0.124345f, +0.006813f, -0.000105f, -0.000071f}, + {+0.000974f, -0.040313f, +0.001531f, +0.000006f, -0.000052f}, + {-0.011132f, +0.127973f, -0.004627f, -0.000028f, +0.000047f}, + {+0.084325f, +0.052788f, +0.007351f, +0.000453f, +0.000037f}, + {+0.056743f, -0.375950f, +0.009997f, +0.000141f, +0.000035f}, + {+0.111528f, -0.176673f, +0.008510f, +0.000146f, -0.000018f}, + {-0.011877f, -0.092945f, -0.003074f, +0.000266f, -0.000004f} + }, + { + {+0.170586f, +0.400778f, +0.026157f, -0.000380f, -0.000003f}, + {-0.309161f, -0.398764f, -0.040718f, -0.000943f, +0.000011f}, + {-0.062016f, +0.029728f, -0.012911f, -0.000459f, +0.000035f}, + {+0.031810f, -0.090010f, +0.007426f, -0.000129f, +0.000014f}, + {+0.032063f, +0.056196f, +0.004324f, +0.000244f, -0.000009f}, + {-0.022806f, +0.208884f, +0.000856f, +0.000371f, +0.000043f}, + {-0.165081f, -0.039385f, -0.016746f, +0.000367f, +0.000003f}, + {-0.128190f, +0.183103f, -0.012188f, -0.000425f, -0.000025f}, + {-0.049731f, -0.043210f, -0.002580f, +0.000500f, +0.000034f} + }, + { + {-0.253118f, -0.253855f, -0.036031f, +0.000022f, +0.000008f}, + {+0.270280f, +0.483591f, +0.039528f, -0.000153f, -0.000036f}, + {-0.018783f, +0.101617f, -0.001693f, +0.000100f, +0.000073f}, + {+0.020506f, -0.111990f, -0.001982f, -0.000215f, +0.000054f}, + {-0.026438f, -0.035500f, -0.002626f, +0.000034f, -0.000050f}, + {-0.052495f, +0.162509f, -0.005782f, -0.000307f, -0.000047f}, + {+0.034503f, +0.254582f, -0.002428f, -0.000029f, -0.000037f}, + {-0.007059f, +0.365527f, +0.000861f, +0.000308f, +0.000024f}, + {+0.051840f, +0.110577f, +0.004579f, -0.000471f, +0.000002f} + }, + { + {-0.123354f, -0.454617f, -0.017101f, +0.000408f, +0.000003f}, + {+0.216188f, +0.557670f, +0.033272f, +0.000921f, -0.000010f}, + {+0.060077f, -0.016368f, +0.008130f, +0.000544f, -0.000041f}, + {-0.097698f, +0.063611f, -0.011314f, +0.000334f, -0.000020f}, + {+0.004155f, -0.082194f, +0.000724f, -0.000315f, +0.000015f}, + {+0.061885f, -0.007918f, +0.004267f, -0.000661f, -0.000034f}, + {+0.120251f, +0.108336f, +0.021527f, -0.000454f, +0.000001f}, + {+0.138249f, +0.145446f, +0.014907f, +0.000187f, +0.000021f}, + {+0.010129f, +0.174821f, +0.000225f, -0.000291f, -0.000033f} + }, + { + {+0.286163f, +0.175080f, +0.040522f, -0.000072f, -0.000009f}, + {-0.316113f, -0.262138f, -0.049307f, +0.000066f, +0.000038f}, + {-0.006202f, -0.116156f, -0.000344f, -0.000116f, -0.000074f}, + {+0.026045f, +0.250354f, +0.005697f, +0.000168f, -0.000055f}, + {+0.033061f, -0.037487f, +0.003086f, -0.000057f, +0.000051f}, + {-0.009161f, -0.111428f, +0.002750f, +0.000407f, +0.000055f}, + {-0.050197f, -0.166126f, -0.010372f, +0.000135f, +0.000039f}, + {-0.108124f, -0.227657f, -0.011340f, -0.000057f, -0.000029f}, + {-0.062623f, +0.065189f, -0.003295f, +0.000387f, +0.000001f} + }, + { + {+0.066678f, +0.512159f, +0.009358f, -0.000375f, -0.000002f}, + {-0.128892f, -0.546911f, -0.020182f, -0.000837f, +0.000009f}, + {-0.041244f, -0.065432f, -0.004659f, -0.000466f, +0.000049f}, + {+0.124448f, +0.097696f, +0.018095f, -0.000283f, +0.000027f}, + {-0.039700f, +0.075487f, -0.006824f, +0.000303f, -0.000022f}, + {-0.033671f, -0.064807f, -0.008036f, +0.000540f, +0.000022f}, + {-0.115666f, -0.069551f, -0.016489f, +0.000343f, -0.000004f}, + {-0.044678f, -0.318287f, -0.008724f, -0.000374f, -0.000016f}, + {+0.045915f, -0.096744f, +0.005450f, +0.000336f, +0.000032f} + }, + { + {-0.306654f, -0.062299f, -0.043370f, +0.000070f, +0.000010f}, + {+0.327815f, +0.157084f, +0.053522f, -0.000024f, -0.000042f}, + {+0.020545f, +0.022620f, -0.000196f, -0.000030f, +0.000072f}, + {-0.093582f, -0.234733f, -0.010882f, -0.000285f, +0.000055f}, + {-0.018657f, +0.107686f, -0.002873f, +0.000136f, -0.000051f}, + {+0.022629f, +0.029525f, +0.002254f, -0.000156f, -0.000058f}, + {+0.080228f, +0.235900f, +0.013683f, -0.000069f, -0.000040f}, + {+0.131827f, -0.044535f, +0.015502f, +0.000103f, +0.000031f}, + {+0.019414f, -0.130958f, +0.003490f, -0.000488f, -0.000004f} + }, + { + {-0.003446f, -0.527577f, -0.000418f, +0.000351f, +0.000001f}, + {+0.063671f, +0.564794f, +0.009104f, +0.000762f, -0.000008f}, + {+0.005424f, +0.040112f, +0.004744f, +0.000443f, -0.000057f}, + {-0.104226f, -0.211764f, -0.016606f, +0.000287f, -0.000034f}, + {+0.067397f, -0.027841f, +0.010395f, -0.000286f, +0.000029f}, + {+0.014235f, +0.044128f, +0.001136f, -0.000560f, -0.000010f}, + {+0.112939f, +0.189986f, +0.013999f, -0.000350f, +0.000008f}, + {-0.051770f, +0.234766f, -0.004628f, +0.000261f, +0.000010f}, + {-0.057159f, -0.008653f, -0.009510f, -0.000310f, -0.000032f} + }, + { + {+0.309125f, -0.046398f, +0.043868f, -0.000070f, -0.000010f}, + {-0.337900f, -0.049301f, -0.053004f, -0.000032f, +0.000046f}, + {+0.006452f, +0.038403f, -0.000549f, +0.000028f, -0.000068f}, + {+0.142396f, +0.170693f, +0.019921f, +0.000322f, -0.000053f}, + {-0.012544f, -0.153200f, -0.002399f, -0.000157f, +0.000049f}, + {-0.026935f, -0.020769f, -0.002517f, +0.000142f, +0.000057f}, + {-0.135188f, -0.190554f, -0.017975f, +0.000073f, +0.000042f}, + {-0.083199f, +0.182605f, -0.012518f, -0.000033f, -0.000031f}, + {+0.022452f, +0.113080f, +0.002881f, +0.000561f, +0.000007f} + }, + { + {-0.056550f, +0.514353f, -0.008128f, -0.000326f, +0.000000f}, + {+0.002761f, -0.570850f, -0.000438f, -0.000698f, +0.000005f}, + {-0.005763f, +0.055193f, -0.003144f, -0.000303f, +0.000064f}, + {+0.066858f, +0.287146f, +0.008674f, -0.000271f, +0.000039f}, + {-0.079593f, -0.051699f, -0.009265f, +0.000243f, -0.000035f}, + {+0.004491f, -0.069814f, +0.001757f, +0.000412f, +0.000001f}, + {-0.070466f, -0.289680f, -0.008846f, +0.000325f, -0.000013f}, + {+0.096678f, -0.094366f, +0.010661f, -0.000155f, -0.000007f}, + {+0.041572f, +0.082696f, +0.006577f, +0.000266f, +0.000031f} + }, + { + {-0.298262f, +0.141215f, -0.042908f, +0.000091f, +0.000010f}, + {+0.335616f, -0.061120f, +0.052587f, +0.000136f, -0.000050f}, + {-0.028168f, +0.019948f, -0.003001f, +0.000044f, +0.000065f}, + {-0.179347f, -0.090626f, -0.024448f, -0.000251f, +0.000051f}, + {+0.055697f, +0.153136f, +0.006127f, +0.000099f, -0.000047f}, + {+0.022758f, -0.040841f, +0.001974f, -0.000245f, -0.000056f}, + {+0.171241f, +0.083402f, +0.023385f, -0.000076f, -0.000043f}, + {+0.018087f, -0.211528f, +0.004820f, +0.000028f, +0.000030f}, + {-0.051883f, -0.059963f, -0.007202f, -0.000532f, -0.000011f} + }, + { + {+0.109668f, -0.485328f, +0.016423f, +0.000299f, -0.000001f}, + {-0.064276f, +0.551492f, -0.008554f, +0.000611f, -0.000002f}, + {+0.027762f, -0.066226f, +0.006657f, +0.000180f, -0.000068f}, + {-0.008606f, -0.352413f, -0.000966f, +0.000207f, -0.000045f}, + {+0.061405f, +0.140795f, +0.008634f, -0.000186f, +0.000040f}, + {-0.022602f, +0.028596f, -0.003958f, -0.000252f, +0.000003f}, + {+0.006333f, +0.339254f, -0.001045f, -0.000313f, +0.000017f}, + {-0.095236f, -0.035271f, -0.011532f, +0.000098f, +0.000006f}, + {-0.006892f, -0.129936f, -0.001855f, -0.000288f, -0.000028f} + }, + { + {+0.280162f, -0.222327f, +0.040172f, -0.000132f, -0.000011f}, + {-0.325666f, +0.150573f, -0.051593f, -0.000209f, +0.000054f}, + {+0.028869f, -0.065199f, +0.002958f, -0.000146f, -0.000066f}, + {+0.187456f, -0.052621f, +0.025102f, +0.000202f, -0.000052f}, + {-0.080571f, -0.077938f, -0.010648f, -0.000040f, +0.000047f}, + {-0.004481f, +0.054774f, -0.000402f, +0.000382f, +0.000060f}, + {-0.176395f, +0.061006f, -0.022445f, +0.000083f, +0.000045f}, + {+0.032007f, +0.158843f, +0.002664f, -0.000125f, -0.000033f}, + {+0.057225f, -0.034866f, +0.006728f, +0.000520f, +0.000013f} + }, + { + {-0.158921f, +0.451848f, -0.023918f, -0.000281f, +0.000001f}, + {+0.121553f, -0.536831f, +0.017942f, -0.000578f, -0.000001f}, + {-0.050855f, +0.055529f, -0.008445f, -0.000215f, +0.000075f}, + {-0.052686f, +0.312195f, -0.005219f, -0.000224f, +0.000052f}, + {-0.037110f, -0.141320f, -0.006102f, +0.000195f, -0.000048f}, + {+0.024782f, +0.009783f, +0.004483f, +0.000288f, -0.000009f}, + {+0.063910f, -0.304697f, +0.007623f, +0.000328f, -0.000023f}, + {+0.068609f, +0.100384f, +0.009341f, -0.000091f, -0.000007f}, + {-0.033166f, +0.101342f, -0.001173f, +0.000251f, +0.000026f} + }, + { + {-0.254134f, +0.305063f, -0.036122f, +0.000175f, +0.000012f}, + {+0.313748f, -0.244268f, +0.048706f, +0.000275f, -0.000058f}, + {-0.012267f, +0.112660f, -0.001928f, +0.000238f, +0.000072f}, + {-0.161165f, +0.140763f, -0.024820f, -0.000200f, +0.000054f}, + {+0.090126f, +0.058592f, +0.014503f, +0.000035f, -0.000049f}, + {-0.010917f, -0.042825f, -0.001085f, -0.000524f, -0.000070f}, + {+0.139731f, -0.183781f, +0.020533f, -0.000104f, -0.000047f}, + {-0.056473f, -0.093013f, -0.007395f, +0.000190f, +0.000040f}, + {-0.028362f, +0.108300f, -0.004536f, -0.000507f, -0.000014f} + }, + { + {+0.204108f, -0.397468f, +0.030234f, +0.000284f, -0.000002f}, + {-0.186187f, +0.523327f, -0.027065f, +0.000548f, +0.000002f}, + {+0.063644f, -0.004588f, +0.010914f, +0.000342f, -0.000092f}, + {+0.084172f, -0.238464f, +0.012067f, +0.000307f, -0.000066f}, + {+0.023241f, +0.163547f, +0.001737f, -0.000268f, +0.000061f}, + {-0.017633f, -0.031273f, -0.004558f, -0.000453f, +0.000024f}, + {-0.103701f, +0.192462f, -0.015036f, -0.000326f, +0.000032f}, + {-0.040508f, -0.117502f, -0.005435f, +0.000218f, +0.000003f}, + {+0.044739f, -0.003358f, +0.002673f, -0.000166f, -0.000026f} + }, + { + {+0.217925f, -0.374764f, +0.031310f, -0.000194f, -0.000015f}, + {-0.287194f, +0.371793f, -0.043606f, -0.000298f, +0.000065f}, + {-0.012378f, -0.121133f, -0.001692f, -0.000139f, -0.000076f}, + {+0.138854f, -0.153518f, +0.021173f, +0.000296f, -0.000054f}, + {-0.110078f, -0.041091f, -0.015691f, -0.000117f, +0.000048f}, + {+0.016824f, +0.020994f, +0.002433f, +0.000470f, +0.000080f}, + {-0.093179f, +0.207425f, -0.014155f, +0.000078f, +0.000048f}, + {+0.066586f, +0.047692f, +0.008958f, -0.000170f, -0.000050f}, + {-0.006034f, -0.079321f, +0.001680f, +0.000546f, +0.000014f} + }, + { + {-0.239100f, +0.326388f, -0.035676f, -0.000310f, +0.000005f}, + {+0.254019f, -0.457019f, +0.035395f, -0.000472f, -0.000004f}, + {-0.063172f, -0.043743f, -0.010677f, -0.000446f, +0.000122f}, + {-0.106250f, +0.224976f, -0.016160f, -0.000331f, +0.000087f}, + {+0.006588f, -0.220018f, +0.002089f, +0.000280f, -0.000081f}, + {+0.012847f, +0.026665f, +0.004159f, +0.000613f, -0.000053f}, + {+0.116434f, -0.116659f, +0.017836f, +0.000308f, -0.000043f}, + {+0.014851f, +0.127471f, +0.001839f, -0.000426f, +0.000008f}, + {-0.024363f, -0.047415f, -0.002156f, +0.000076f, +0.000029f} + }, + { + {-0.177651f, +0.419626f, -0.025372f, +0.000189f, +0.000018f}, + {+0.234856f, -0.487730f, +0.036693f, +0.000275f, -0.000076f}, + {+0.036507f, +0.108100f, +0.004077f, -0.000196f, +0.000068f}, + {-0.123472f, +0.198845f, -0.018454f, -0.000539f, +0.000045f}, + {+0.120851f, -0.044023f, +0.017124f, +0.000326f, -0.000038f}, + {-0.019744f, -0.023127f, -0.003003f, -0.000144f, -0.000080f}, + {+0.054985f, -0.211321f, +0.008525f, +0.000002f, -0.000046f}, + {-0.067840f, +0.000644f, -0.008680f, +0.000062f, +0.000059f}, + {+0.013438f, +0.012637f, +0.000624f, -0.000676f, -0.000018f} + }, + { + {+0.265046f, -0.258984f, +0.039613f, +0.000315f, -0.000010f}, + {-0.305263f, +0.341002f, -0.042929f, +0.000320f, +0.000009f}, + {+0.052493f, +0.082191f, +0.010230f, +0.000306f, -0.000162f}, + {+0.135578f, -0.200816f, +0.020288f, +0.000195f, -0.000112f}, + {-0.047909f, +0.214878f, -0.007490f, -0.000138f, +0.000104f}, + {-0.013632f, -0.032324f, -0.004221f, -0.000548f, +0.000093f}, + {-0.118924f, +0.057091f, -0.018445f, -0.000261f, +0.000056f}, + {+0.008331f, -0.114878f, +0.000663f, +0.000507f, -0.000028f}, + {+0.005413f, +0.022808f, -0.000439f, -0.000059f, -0.000035f} + }, + { + {+0.136435f, -0.454829f, +0.019582f, -0.000149f, -0.000018f}, + {-0.168461f, +0.553033f, -0.027068f, -0.000281f, +0.000094f}, + {-0.056383f, -0.088168f, -0.008472f, +0.000590f, -0.000037f}, + {+0.096992f, -0.262712f, +0.013318f, +0.000816f, -0.000021f}, + {-0.110234f, +0.118824f, -0.015813f, -0.000528f, +0.000014f}, + {+0.029948f, +0.036351f, +0.005263f, -0.000282f, +0.000056f}, + {-0.020326f, +0.210405f, -0.002631f, -0.000079f, +0.000039f}, + {+0.060030f, -0.032820f, +0.009213f, +0.000193f, -0.000059f}, + {-0.003943f, +0.005977f, -0.000375f, +0.000898f, +0.000028f} + }, + { + {-0.284355f, +0.190433f, -0.042800f, -0.000266f, +0.000017f}, + {+0.335277f, -0.219226f, +0.046865f, -0.000105f, -0.000022f}, + {-0.036478f, -0.124061f, -0.005694f, +0.000344f, +0.000198f}, + {-0.163243f, +0.134561f, -0.022257f, +0.000183f, +0.000132f}, + {+0.083868f, -0.178051f, +0.011964f, -0.000280f, -0.000122f}, + {+0.010723f, +0.070555f, +0.001815f, -0.000022f, -0.000132f}, + {+0.111861f, +0.009495f, +0.016549f, +0.000135f, -0.000069f}, + {-0.022143f, +0.095016f, -0.003757f, -0.000379f, +0.000052f}, + {-0.000565f, +0.002446f, +0.001442f, +0.000102f, +0.000039f} + }, + { + {-0.095291f, +0.479278f, -0.013467f, +0.000098f, +0.000016f}, + {+0.099306f, -0.582261f, +0.017486f, +0.000468f, -0.000116f}, + {+0.078355f, +0.049439f, +0.008412f, -0.000772f, -0.000023f}, + {-0.051414f, +0.305039f, -0.008849f, -0.000882f, -0.000019f}, + {+0.082995f, -0.177822f, +0.013237f, +0.000567f, +0.000026f}, + {-0.049222f, -0.017872f, -0.004795f, +0.000539f, -0.000005f}, + {-0.011696f, -0.179076f, -0.000545f, +0.000092f, -0.000026f}, + {-0.054786f, +0.044185f, -0.008075f, -0.000456f, +0.000046f}, + {-0.005431f, -0.002236f, -0.000119f, -0.000987f, -0.000046f} + }, + { + {+0.300035f, -0.126686f, +0.045279f, +0.000141f, -0.000023f}, + {-0.347527f, +0.104803f, -0.049661f, -0.000162f, +0.000050f}, + {+0.000140f, +0.170954f, +0.002869f, -0.001398f, -0.000210f}, + {+0.165631f, -0.028348f, +0.023643f, -0.000777f, -0.000136f}, + {-0.103480f, +0.108513f, -0.015479f, +0.000834f, +0.000124f}, + {+0.013480f, -0.114650f, -0.000763f, +0.001025f, +0.000149f}, + {-0.089040f, -0.060481f, -0.014574f, +0.000082f, +0.000079f}, + {+0.036486f, -0.097396f, +0.006421f, +0.000002f, -0.000073f}, + {+0.003333f, -0.016091f, -0.002020f, -0.000329f, -0.000034f} + }, + { + {+0.051566f, -0.506796f, +0.007039f, -0.000099f, -0.000010f}, + {-0.033731f, +0.589122f, -0.007210f, -0.000795f, +0.000134f}, + {-0.079279f, +0.049325f, -0.008393f, +0.000023f, +0.000100f}, + {+0.010994f, -0.265800f, +0.003418f, +0.000397f, +0.000069f}, + {-0.052364f, +0.186418f, -0.009164f, -0.000026f, -0.000073f}, + {+0.052053f, -0.056265f, +0.005015f, +0.000066f, -0.000065f}, + {+0.026200f, +0.116741f, +0.002983f, +0.000008f, +0.000008f}, + {+0.048119f, -0.079713f, +0.006644f, +0.000374f, -0.000021f}, + {+0.010900f, -0.005754f, +0.000987f, +0.000869f, +0.000068f} + }, + { + {-0.311437f, +0.048951f, -0.046976f, +0.000118f, +0.000027f}, + {+0.349598f, +0.000051f, +0.050374f, +0.000038f, -0.000095f}, + {+0.040613f, -0.137831f, -0.000066f, +0.002700f, +0.000181f}, + {-0.149052f, -0.019968f, -0.023093f, +0.001262f, +0.000115f}, + {+0.107473f, -0.058841f, +0.017699f, -0.001256f, -0.000101f}, + {-0.043140f, +0.091871f, -0.000478f, -0.002412f, -0.000129f}, + {+0.064483f, +0.059569f, +0.011301f, -0.000210f, -0.000082f}, + {-0.054255f, +0.077805f, -0.009915f, +0.000915f, +0.000081f}, + {-0.008263f, +0.025078f, +0.001271f, +0.000578f, +0.000014f} + }, + { + {-0.002478f, +0.521278f, -0.000544f, +0.000189f, +0.000002f}, + {-0.031629f, -0.587979f, -0.001886f, +0.001424f, -0.000137f}, + {+0.053320f, -0.118505f, +0.004875f, +0.003174f, -0.000173f}, + {+0.008995f, +0.224389f, +0.001153f, +0.001756f, -0.000113f}, + {+0.029482f, -0.180110f, +0.004281f, -0.002087f, +0.000115f}, + {-0.033134f, +0.107741f, -0.001943f, -0.002753f, +0.000132f}, + {-0.023463f, -0.074570f, -0.002999f, -0.000562f, +0.000011f}, + {-0.031477f, +0.111590f, -0.005933f, +0.000350f, -0.000010f}, + {-0.015016f, +0.015277f, -0.001484f, -0.000128f, -0.000086f} + } +}; + +const float rightHRIRImag_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]= +{ + { + {-0.036807f, -0.174045f, +0.179146f, +0.002758f, +0.000002f}, + {+0.081675f, -0.202936f, +0.124120f, +0.000184f, -0.000007f}, + {-0.000843f, -0.038970f, +0.052716f, -0.008143f, +0.000125f}, + {-0.004478f, -0.013122f, +0.028558f, -0.008290f, +0.000045f}, + {+0.006316f, -0.012132f, +0.006515f, -0.002119f, -0.000027f}, + {-0.000794f, +0.004296f, +0.005127f, -0.004942f, +0.000100f}, + {+0.010293f, -0.025048f, +0.008939f, -0.001610f, -0.000015f}, + {-0.001111f, -0.008117f, +0.033872f, -0.002789f, -0.000061f}, + {+0.009292f, -0.031334f, +0.001941f, -0.005137f, +0.000092f} + }, + { + {+0.046648f, -0.328217f, -0.004769f, -0.004729f, +0.000002f}, + {-0.078219f, -0.186706f, +0.335495f, -0.010505f, -0.000011f}, + {+0.003389f, -0.028871f, +0.074809f, -0.001736f, +0.000093f}, + {+0.011160f, -0.006841f, +0.031676f, +0.003121f, +0.000038f}, + {-0.007422f, -0.043414f, +0.006982f, +0.001963f, -0.000025f}, + {-0.003254f, -0.003751f, +0.013792f, -0.005415f, +0.000065f}, + {-0.015187f, -0.099887f, -0.012484f, -0.000245f, -0.000014f}, + {-0.000628f, +0.067594f, +0.116266f, +0.000062f, -0.000037f}, + {-0.017876f, -0.212825f, -0.109502f, -0.000434f, +0.000062f} + }, + { + {-0.062391f, -0.298587f, +0.055506f, +0.004604f, -0.000002f}, + {+0.110139f, +0.008656f, -0.076872f, +0.013912f, +0.000006f}, + {-0.006661f, +0.041459f, +0.008680f, +0.005198f, -0.000143f}, + {-0.017346f, +0.064502f, -0.000311f, +0.000229f, -0.000050f}, + {+0.012574f, -0.112476f, +0.042863f, -0.000548f, +0.000028f}, + {+0.008554f, -0.117685f, +0.085746f, +0.010222f, -0.000121f}, + {+0.018386f, -0.231260f, +0.055470f, +0.002605f, +0.000015f}, + {-0.000043f, +0.098076f, +0.074022f, +0.004739f, +0.000074f}, + {+0.020228f, -0.438516f, +0.026318f, +0.002404f, -0.000109f} + }, + { + {+0.087093f, -0.185047f, -0.039795f, -0.001148f, -0.000002f}, + {-0.179442f, -0.138305f, +0.024941f, -0.004193f, +0.000016f}, + {+0.010153f, +0.053373f, -0.028050f, +0.000631f, -0.000056f}, + {+0.022351f, +0.115243f, -0.015706f, +0.000824f, -0.000030f}, + {-0.016881f, -0.188764f, +0.015179f, -0.001478f, +0.000024f}, + {-0.011436f, -0.169671f, +0.055918f, -0.006134f, -0.000022f}, + {-0.007516f, -0.296099f, +0.030173f, -0.003476f, +0.000013f}, + {+0.001835f, +0.047910f, -0.004611f, -0.005834f, +0.000008f}, + {+0.012183f, -0.522145f, -0.012957f, -0.000556f, -0.000026f} + }, + { + {-0.118429f, +0.036347f, +0.008994f, -0.001813f, +0.000002f}, + {+0.195669f, -0.557237f, -0.044782f, -0.005092f, -0.000007f}, + {-0.015263f, +0.077237f, -0.016810f, -0.004030f, +0.000145f}, + {-0.025184f, +0.187315f, -0.016739f, -0.002009f, +0.000052f}, + {+0.002368f, -0.225780f, +0.012360f, +0.001921f, -0.000030f}, + {+0.004974f, -0.160969f, +0.009969f, +0.002830f, +0.000125f}, + {-0.023306f, -0.243341f, -0.007075f, +0.002049f, -0.000015f}, + {+0.002539f, +0.043064f, -0.021665f, +0.000872f, -0.000074f}, + {-0.088704f, -0.392340f, -0.007003f, +0.000682f, +0.000110f} + }, + { + {+0.111405f, +0.324593f, -0.000106f, +0.001284f, +0.000002f}, + {-0.051589f, -0.868735f, +0.017996f, +0.003263f, -0.000021f}, + {+0.016644f, +0.116184f, -0.001320f, +0.001603f, +0.000021f}, + {+0.004222f, +0.242602f, +0.004139f, +0.000694f, +0.000023f}, + {+0.043767f, -0.191695f, -0.013679f, -0.000447f, -0.000023f}, + {+0.015164f, -0.134423f, -0.000808f, -0.001816f, -0.000022f}, + {+0.056350f, -0.114712f, -0.004403f, +0.000262f, -0.000013f}, + {-0.013985f, +0.017892f, -0.014819f, +0.002850f, +0.000020f}, + {+0.155162f, -0.041775f, -0.009744f, -0.001067f, -0.000007f} + }, + { + {-0.005031f, +0.479299f, +0.003719f, +0.000668f, -0.000001f}, + {-0.200078f, -0.617927f, -0.007665f, +0.002820f, +0.000011f}, + {-0.000023f, +0.128657f, +0.013087f, +0.000664f, -0.000135f}, + {+0.058851f, +0.171528f, +0.001838f, +0.000874f, -0.000052f}, + {-0.096474f, -0.013567f, -0.000492f, -0.000745f, +0.000033f}, + {-0.033027f, -0.054815f, -0.011873f, -0.000718f, -0.000112f}, + {-0.056173f, +0.039930f, +0.001299f, -0.001259f, +0.000015f}, + {+0.020372f, -0.043296f, +0.005705f, -0.001029f, +0.000062f}, + {-0.120615f, +0.346286f, -0.013057f, -0.000997f, -0.000098f} + }, + { + {-0.150793f, +0.255763f, -0.018096f, -0.000700f, -0.000003f}, + {+0.305707f, +0.158732f, +0.020717f, -0.002646f, +0.000023f}, + {-0.031522f, +0.078751f, +0.001465f, -0.000649f, +0.000004f}, + {-0.117107f, -0.077176f, -0.004724f, -0.000677f, -0.000018f}, + {+0.093448f, +0.250387f, +0.003900f, +0.000293f, +0.000021f}, + {+0.019351f, +0.028793f, +0.005286f, +0.001746f, +0.000057f}, + {+0.008202f, +0.128064f, +0.008788f, +0.000321f, +0.000014f}, + {-0.007910f, -0.090056f, -0.001122f, -0.000874f, -0.000041f}, + {-0.028598f, +0.475838f, +0.000814f, +0.001596f, +0.000033f} + }, + { + {+0.168446f, -0.229619f, +0.014684f, -0.000669f, +0.000001f}, + {-0.083028f, +0.735157f, -0.014942f, -0.001813f, -0.000016f}, + {+0.038009f, -0.019540f, -0.002379f, +0.000167f, +0.000118f}, + {+0.076227f, -0.357687f, +0.003886f, -0.000171f, +0.000051f}, + {-0.001844f, +0.389834f, -0.002086f, +0.000484f, -0.000036f}, + {+0.023047f, +0.027798f, +0.004234f, +0.000497f, +0.000086f}, + {+0.049557f, +0.071524f, +0.006302f, +0.000906f, -0.000015f}, + {-0.020459f, -0.071010f, -0.006011f, -0.000277f, -0.000043f}, + {+0.164709f, +0.192774f, +0.015494f, +0.000611f, +0.000078f} + }, + { + {+0.032104f, -0.431950f, +0.008160f, +0.000726f, +0.000004f}, + {-0.260971f, +0.444113f, -0.025794f, +0.002256f, -0.000023f}, + {+0.008385f, -0.056100f, +0.003103f, +0.000095f, -0.000018f}, + {+0.067113f, -0.367438f, +0.006254f, +0.000198f, +0.000013f}, + {-0.110994f, +0.232179f, -0.008226f, -0.000230f, -0.000019f}, + {-0.042146f, -0.074633f, -0.011186f, -0.001034f, -0.000080f}, + {-0.054919f, -0.080526f, -0.007215f, -0.000649f, -0.000015f}, + {+0.040307f, +0.016321f, -0.001764f, +0.000829f, +0.000052f}, + {-0.137526f, -0.246324f, -0.007988f, -0.001200f, -0.000047f} + }, + { + {-0.213011f, -0.046980f, -0.025382f, +0.000494f, -0.000002f}, + {+0.288608f, -0.395114f, +0.041290f, +0.001283f, +0.000020f}, + {-0.054132f, +0.049386f, -0.007328f, -0.000057f, -0.000101f}, + {-0.158872f, -0.025219f, -0.014949f, +0.000114f, -0.000051f}, + {+0.121403f, -0.113923f, +0.010204f, -0.000233f, +0.000039f}, + {+0.000083f, -0.147208f, -0.001729f, -0.000936f, -0.000054f}, + {-0.003048f, -0.154788f, -0.006001f, -0.000457f, +0.000017f}, + {-0.025771f, +0.106681f, +0.002198f, +0.000260f, +0.000022f}, + {-0.031294f, -0.392095f, -0.012018f, -0.000574f, -0.000057f} + }, + { + {+0.092561f, +0.424974f, +0.010810f, -0.000681f, -0.000004f}, + {+0.075902f, -0.706014f, +0.007828f, -0.002003f, +0.000022f}, + {+0.013154f, +0.161409f, +0.005603f, -0.000211f, +0.000023f}, + {+0.066254f, +0.312283f, +0.004744f, +0.000026f, -0.000009f}, + {-0.002036f, -0.295824f, +0.002824f, -0.000014f, +0.000016f}, + {+0.060712f, -0.057606f, +0.008012f, +0.000958f, +0.000087f}, + {+0.056082f, -0.061636f, +0.008052f, +0.000524f, +0.000016f}, + {-0.017683f, +0.111805f, -0.002642f, -0.000403f, -0.000052f}, + {+0.146777f, -0.113700f, +0.017959f, +0.001010f, +0.000051f} + }, + { + {+0.185320f, +0.277358f, +0.022712f, -0.000351f, +0.000003f}, + {-0.344646f, -0.053912f, -0.053141f, -0.000939f, -0.000024f}, + {+0.086838f, +0.051841f, +0.006637f, +0.000180f, +0.000089f}, + {+0.105953f, +0.243944f, +0.014187f, -0.000146f, +0.000052f}, + {-0.111669f, -0.123210f, -0.013173f, +0.000233f, -0.000042f}, + {-0.059758f, +0.131270f, -0.005702f, +0.000643f, +0.000024f}, + {-0.036902f, +0.080134f, -0.000673f, +0.000325f, -0.000020f}, + {+0.046052f, +0.010828f, +0.004846f, -0.000246f, -0.000004f}, + {-0.077354f, +0.231910f, -0.006126f, +0.000362f, +0.000039f} + }, + { + {-0.189874f, -0.302002f, -0.024437f, +0.000614f, +0.000004f}, + {+0.115695f, +0.648554f, +0.017187f, +0.001787f, -0.000020f}, + {-0.095557f, -0.230274f, -0.014609f, +0.000114f, -0.000025f}, + {-0.124579f, -0.115101f, -0.017138f, -0.000088f, +0.000005f}, + {+0.076830f, +0.166427f, +0.008366f, +0.000057f, -0.000012f}, + {-0.014099f, +0.211406f, +0.003003f, -0.000568f, -0.000083f}, + {-0.023815f, +0.096932f, -0.005676f, -0.000440f, -0.000016f}, + {-0.021782f, -0.093860f, -0.002871f, +0.000144f, +0.000046f}, + {-0.073734f, +0.238033f, -0.010094f, -0.000798f, -0.000049f} + }, + { + {-0.114426f, -0.412169f, -0.014852f, +0.000236f, -0.000004f}, + {+0.286060f, +0.383093f, +0.046192f, +0.000709f, +0.000026f}, + {-0.046449f, -0.312275f, +0.001217f, -0.000173f, -0.000081f}, + {-0.033813f, -0.256375f, -0.003843f, +0.000097f, -0.000052f}, + {+0.058368f, +0.191934f, +0.007694f, -0.000156f, +0.000044f}, + {+0.082552f, +0.075789f, +0.001514f, -0.000419f, -0.000001f}, + {+0.034473f, +0.003962f, +0.003250f, -0.000222f, +0.000024f}, + {-0.030695f, -0.079541f, -0.002956f, +0.000205f, -0.000008f}, + {+0.109333f, -0.044153f, +0.010252f, -0.000221f, -0.000027f} + }, + { + {+0.243812f, +0.144409f, +0.034010f, -0.000542f, -0.000004f}, + {-0.244934f, -0.430481f, -0.034506f, -0.001609f, +0.000017f}, + {+0.170812f, +0.012823f, +0.017960f, -0.000055f, +0.000026f}, + {+0.131633f, -0.001407f, +0.017629f, +0.000130f, -0.000001f}, + {-0.106876f, -0.065820f, -0.014688f, -0.000058f, +0.000007f}, + {-0.074279f, -0.153828f, -0.004932f, +0.000344f, +0.000072f}, + {+0.015569f, -0.022714f, +0.005207f, +0.000342f, +0.000015f}, + {+0.042274f, +0.032502f, +0.005140f, -0.000141f, -0.000036f}, + {-0.002837f, -0.214678f, +0.001786f, +0.000703f, +0.000045f} + }, + { + {+0.033445f, +0.465385f, +0.003356f, -0.000154f, +0.000005f}, + {-0.178742f, -0.528051f, -0.033152f, -0.000550f, -0.000028f}, + {-0.087971f, +0.405281f, -0.012908f, +0.000193f, +0.000076f}, + {-0.026721f, +0.243121f, -0.004203f, -0.000014f, +0.000052f}, + {+0.002076f, -0.236562f, +0.002162f, +0.000025f, -0.000045f}, + {+0.002032f, -0.267039f, +0.003164f, +0.000247f, -0.000013f}, + {-0.028517f, +0.053584f, -0.006240f, +0.000168f, -0.000027f}, + {+0.008947f, +0.081105f, +0.001162f, -0.000039f, +0.000013f}, + {-0.084445f, -0.084241f, -0.009779f, +0.000091f, +0.000019f} + }, + { + {-0.265151f, +0.001033f, -0.038066f, +0.000492f, +0.000004f}, + {+0.302075f, +0.213979f, +0.045228f, +0.001475f, -0.000016f}, + {-0.119858f, +0.361574f, -0.010750f, +0.000044f, -0.000027f}, + {-0.110652f, +0.115838f, -0.014030f, -0.000216f, -0.000003f}, + {+0.106693f, -0.078792f, +0.012412f, +0.000130f, -0.000002f}, + {+0.068216f, -0.174315f, +0.001858f, -0.000344f, -0.000061f}, + {-0.039397f, +0.042700f, -0.003620f, -0.000322f, -0.000013f}, + {-0.052577f, -0.019393f, -0.009859f, +0.000138f, +0.000029f}, + {+0.042907f, +0.113552f, +0.005000f, -0.000638f, -0.000041f} + }, + { + {+0.045692f, -0.476580f, +0.008546f, +0.000086f, -0.000005f}, + {+0.080587f, +0.555433f, +0.017854f, +0.000450f, +0.000030f}, + {+0.182440f, -0.087182f, +0.017382f, -0.000294f, -0.000073f}, + {+0.075234f, -0.167476f, +0.008676f, +0.000034f, -0.000051f}, + {-0.071029f, +0.192007f, -0.008454f, -0.000011f, +0.000045f}, + {-0.086510f, +0.044174f, -0.003825f, -0.000041f, +0.000021f}, + {+0.075632f, -0.138240f, +0.011735f, -0.000028f, +0.000030f}, + {+0.013949f, -0.129305f, +0.005892f, -0.000040f, -0.000013f}, + {+0.045386f, +0.105892f, +0.005725f, +0.000024f, -0.000013f} + }, + { + {+0.264038f, -0.137768f, +0.037820f, -0.000452f, -0.000003f}, + {-0.327432f, -0.075214f, -0.050477f, -0.001428f, +0.000014f}, + {-0.022770f, -0.385123f, +0.004729f, +0.000100f, +0.000029f}, + {+0.054670f, -0.198426f, +0.007785f, +0.000271f, +0.000006f}, + {-0.049580f, +0.225410f, -0.005863f, -0.000204f, -0.000001f}, + {+0.043237f, +0.226727f, -0.000581f, +0.000235f, +0.000054f}, + {+0.021121f, -0.232475f, -0.003318f, +0.000194f, +0.000010f}, + {+0.068959f, -0.050792f, +0.006419f, -0.000075f, -0.000026f}, + {-0.050269f, -0.045913f, -0.008553f, +0.000508f, +0.000038f} + }, + { + {-0.122605f, +0.455832f, -0.019204f, -0.000024f, +0.000005f}, + {+0.006912f, -0.595107f, -0.002722f, -0.000314f, -0.000031f}, + {-0.131648f, -0.207572f, -0.020072f, +0.000119f, +0.000071f}, + {-0.075587f, -0.001389f, -0.007880f, -0.000200f, +0.000051f}, + {+0.092628f, +0.010795f, +0.009442f, +0.000210f, -0.000045f}, + {+0.034470f, +0.235595f, +0.004153f, +0.000184f, -0.000026f}, + {-0.138101f, +0.003560f, -0.013139f, +0.000044f, -0.000033f}, + {-0.076887f, +0.172735f, -0.011353f, -0.000186f, +0.000014f}, + {-0.018601f, -0.096133f, -0.000488f, -0.000002f, +0.000009f} + }, + { + {-0.239360f, +0.273817f, -0.034391f, +0.000359f, +0.000003f}, + {+0.344438f, -0.077598f, +0.050391f, +0.001368f, -0.000013f}, + {+0.085915f, +0.127791f, +0.009171f, +0.000053f, -0.000030f}, + {-0.003884f, +0.104668f, -0.002926f, -0.000117f, -0.000009f}, + {-0.025938f, -0.166624f, -0.001223f, -0.000030f, +0.000004f}, + {-0.087357f, +0.053855f, -0.006567f, -0.000375f, -0.000050f}, + {+0.079989f, +0.335328f, +0.010537f, -0.000213f, -0.000007f}, + {-0.027119f, +0.254717f, +0.001273f, +0.000328f, +0.000025f}, + {+0.049245f, +0.007836f, +0.007008f, -0.000515f, -0.000036f} + }, + { + {+0.189098f, -0.383414f, +0.028124f, +0.000092f, -0.000006f}, + {-0.108559f, +0.623832f, -0.013156f, +0.000170f, +0.000033f}, + {+0.052357f, +0.172914f, +0.014590f, -0.000154f, -0.000071f}, + {+0.027066f, +0.057228f, +0.004014f, +0.000183f, -0.000051f}, + {-0.042915f, -0.138441f, -0.007131f, -0.000079f, +0.000046f}, + {+0.062416f, -0.169373f, +0.002459f, -0.000150f, +0.000033f}, + {+0.109725f, +0.292825f, +0.008449f, +0.000038f, +0.000034f}, + {+0.124357f, +0.027929f, +0.015491f, +0.000061f, -0.000016f}, + {-0.001095f, +0.082699f, -0.001391f, +0.000112f, -0.000006f} + }, + { + {+0.194740f, -0.370983f, +0.028830f, -0.000424f, -0.000003f}, + {-0.334444f, +0.280705f, -0.047056f, -0.001250f, +0.000011f}, + {-0.070560f, -0.024714f, -0.010185f, -0.000110f, +0.000033f}, + {+0.007889f, +0.031645f, +0.004166f, +0.000046f, +0.000012f}, + {+0.044996f, -0.004394f, +0.003024f, +0.000024f, -0.000007f}, + {+0.022525f, -0.227369f, +0.001642f, +0.000313f, +0.000046f}, + {-0.165185f, -0.117904f, -0.015701f, +0.000142f, +0.000004f}, + {-0.080987f, -0.285489f, -0.008434f, -0.000232f, -0.000025f}, + {-0.049085f, +0.003557f, -0.010651f, +0.000401f, +0.000034f} + }, + { + {-0.234674f, +0.289561f, -0.036001f, +0.000013f, +0.000007f}, + {+0.223672f, -0.578241f, +0.027233f, -0.000092f, -0.000035f}, + {-0.024623f, -0.100323f, -0.004564f, +0.000328f, +0.000072f}, + {+0.017801f, +0.020633f, -0.002076f, -0.000042f, +0.000053f}, + {-0.013115f, +0.081785f, +0.000959f, -0.000079f, -0.000049f}, + {-0.080738f, -0.072886f, -0.004201f, +0.000076f, -0.000042f}, + {-0.002607f, -0.352196f, -0.003911f, -0.000017f, -0.000036f}, + {-0.069172f, -0.307620f, -0.004866f, -0.000006f, +0.000021f}, + {+0.028180f, -0.122432f, +0.007621f, -0.000085f, +0.000003f} + }, + { + {-0.147199f, +0.422160f, -0.022071f, +0.000321f, +0.000003f}, + {+0.267023f, -0.513414f, +0.037707f, +0.001150f, -0.000010f}, + {+0.060495f, +0.031583f, +0.008763f, -0.000093f, -0.000037f}, + {-0.065578f, -0.105960f, -0.010002f, -0.000209f, -0.000017f}, + {-0.014195f, +0.075807f, -0.002631f, +0.000201f, +0.000012f}, + {+0.053647f, +0.122427f, +0.002638f, -0.000093f, -0.000039f}, + {+0.142781f, -0.115711f, +0.024592f, -0.000188f, -0.000001f}, + {+0.149590f, +0.020216f, +0.015264f, -0.000015f, +0.000023f}, + {+0.037239f, -0.118872f, +0.000382f, -0.000458f, -0.000033f} + }, + { + {+0.269441f, -0.218896f, +0.041241f, +0.000004f, -0.000008f}, + {-0.303693f, +0.362352f, -0.037014f, +0.000053f, +0.000037f}, + {+0.007833f, +0.119694f, -0.000960f, -0.000345f, -0.000073f}, + {-0.004355f, -0.200633f, +0.001490f, +0.000103f, -0.000055f}, + {+0.032562f, -0.000305f, +0.004514f, -0.000019f, +0.000051f}, + {+0.017941f, +0.163230f, +0.007036f, -0.000034f, +0.000051f}, + {-0.046904f, +0.177005f, -0.004300f, +0.000147f, +0.000038f}, + {-0.058069f, +0.331227f, -0.002327f, +0.000118f, -0.000026f}, + {-0.065673f, +0.027120f, -0.006378f, +0.000220f, -0.000001f} + }, + { + {+0.096520f, -0.484461f, +0.013741f, -0.000314f, -0.000002f}, + {-0.168182f, +0.564851f, -0.028399f, -0.001136f, +0.000010f}, + {-0.055680f, +0.028246f, -0.005855f, +0.000184f, +0.000045f}, + {+0.118738f, -0.014371f, +0.012220f, +0.000155f, +0.000023f}, + {-0.022063f, -0.085271f, -0.002211f, -0.000137f, -0.000019f}, + {-0.049978f, +0.052230f, -0.005756f, -0.000013f, +0.000028f}, + {-0.111748f, +0.067754f, -0.020811f, +0.000056f, -0.000003f}, + {-0.098929f, +0.266647f, -0.009254f, +0.000013f, -0.000019f}, + {+0.022954f, +0.155435f, -0.001383f, +0.000344f, +0.000033f} + }, + { + {-0.298102f, +0.119927f, -0.044074f, +0.000054f, +0.000009f}, + {+0.324241f, -0.201048f, +0.044886f, +0.000061f, -0.000040f}, + {+0.018875f, -0.083814f, -0.000418f, +0.000398f, +0.000073f}, + {-0.061162f, +0.256472f, -0.008387f, +0.000024f, +0.000055f}, + {-0.028563f, -0.073381f, -0.002819f, -0.000106f, -0.000051f}, + {+0.019828f, -0.052279f, +0.002320f, -0.000130f, -0.000057f}, + {+0.058477f, -0.203321f, +0.012650f, -0.000104f, -0.000040f}, + {+0.133242f, -0.084836f, +0.013242f, -0.000015f, +0.000030f}, + {+0.042678f, +0.121577f, +0.007398f, -0.000185f, -0.000002f} + }, + { + {-0.034897f, +0.521904f, -0.005636f, +0.000275f, +0.000001f}, + {+0.096022f, -0.555951f, +0.014099f, +0.001080f, -0.000009f}, + {+0.022232f, -0.076542f, +0.003659f, -0.000139f, -0.000053f}, + {-0.117964f, +0.166708f, -0.014124f, -0.000190f, -0.000030f}, + {+0.054876f, +0.054232f, +0.005942f, +0.000155f, +0.000026f}, + {+0.020865f, -0.046834f, +0.005114f, +0.000034f, -0.000016f}, + {+0.119090f, -0.116285f, +0.014688f, -0.000066f, +0.000006f}, + {-0.009162f, -0.296851f, +0.001585f, -0.000015f, +0.000013f}, + {-0.057034f, -0.032243f, -0.004358f, -0.000329f, -0.000032f} + }, + { + {+0.309227f, -0.006599f, +0.046261f, -0.000088f, -0.000010f}, + {-0.335689f, +0.108899f, -0.045170f, -0.000116f, +0.000044f}, + {-0.010768f, -0.025357f, +0.000938f, -0.000529f, -0.000070f}, + {+0.120101f, -0.199389f, +0.018645f, -0.000027f, -0.000054f}, + {+0.005167f, +0.128785f, -0.000940f, +0.000138f, +0.000050f}, + {-0.023264f, +0.025419f, -0.006527f, +0.000284f, +0.000058f}, + {-0.107846f, +0.228561f, -0.015701f, +0.000136f, +0.000041f}, + {-0.112356f, -0.131761f, -0.015190f, -0.000104f, -0.000031f}, + {+0.003668f, -0.126548f, +0.000034f, +0.000218f, +0.000005f} + }, + { + {-0.027502f, -0.522603f, -0.003411f, -0.000264f, -0.000000f}, + {-0.030738f, +0.578245f, -0.004213f, -0.001069f, +0.000007f}, + {-0.000609f, -0.013454f, -0.002363f, +0.000076f, +0.000061f}, + {+0.087398f, -0.248212f, +0.011938f, +0.000075f, +0.000037f}, + {-0.076224f, +0.003106f, -0.010057f, -0.000063f, -0.000032f}, + {-0.005937f, +0.057510f, -0.000360f, +0.000077f, +0.000005f}, + {-0.095342f, +0.246056f, -0.013136f, +0.000057f, -0.000011f}, + {+0.080706f, +0.167833f, +0.010054f, +0.000007f, -0.000008f}, + {+0.052615f, -0.051218f, +0.005205f, +0.000238f, +0.000032f} + }, + { + {-0.304352f, -0.097670f, -0.045722f, +0.000119f, +0.000010f}, + {+0.340086f, +0.006265f, +0.046602f, +0.000169f, -0.000048f}, + {-0.020424f, +0.011099f, -0.001667f, +0.000571f, +0.000066f}, + {-0.162423f, +0.138866f, -0.025027f, +0.000093f, +0.000052f}, + {+0.033809f, -0.166438f, +0.006399f, -0.000195f, -0.000048f}, + {+0.027146f, +0.011761f, +0.003177f, -0.000395f, -0.000056f}, + {+0.155957f, -0.140724f, +0.023139f, -0.000149f, -0.000042f}, + {+0.050658f, +0.213522f, +0.006115f, +0.000088f, +0.000030f}, + {-0.039762f, +0.093271f, -0.004720f, -0.000234f, -0.000009f} + }, + { + {+0.084174f, +0.498153f, +0.011738f, +0.000258f, -0.000001f}, + {-0.034060f, -0.568731f, -0.004971f, +0.001035f, -0.000004f}, + {+0.017008f, +0.063888f, +0.000389f, +0.000004f, -0.000066f}, + {-0.040634f, +0.328420f, -0.004057f, -0.000038f, -0.000042f}, + {+0.073934f, -0.106271f, +0.009079f, +0.000021f, +0.000038f}, + {-0.016227f, -0.051899f, +0.000373f, -0.000148f, +0.000001f}, + {+0.040260f, -0.318605f, +0.006025f, -0.000077f, +0.000015f}, + {-0.100959f, -0.021877f, -0.014425f, +0.000114f, +0.000006f}, + {-0.027106f, +0.113757f, -0.001462f, -0.000158f, -0.000030f} + }, + { + {+0.289347f, +0.183367f, +0.043677f, -0.000132f, -0.000010f}, + {-0.332610f, -0.106477f, -0.046382f, -0.000181f, +0.000052f}, + {+0.030172f, +0.040872f, +0.005239f, -0.000542f, -0.000065f}, + {+0.188712f, -0.022024f, +0.026128f, -0.000084f, -0.000051f}, + {-0.071871f, +0.114351f, -0.009162f, +0.000197f, +0.000047f}, + {-0.013433f, -0.054663f, -0.003535f, +0.000343f, +0.000057f}, + {-0.178475f, +0.017894f, -0.025738f, +0.000205f, +0.000044f}, + {+0.010117f, -0.193309f, +0.001195f, -0.000079f, -0.000031f}, + {+0.059297f, -0.019649f, +0.006335f, +0.000285f, +0.000013f} + }, + { + {-0.134846f, -0.467842f, -0.019524f, -0.000244f, +0.000001f}, + {+0.092222f, +0.547291f, +0.014252f, -0.000986f, +0.000001f}, + {-0.040107f, -0.068680f, -0.004663f, +0.000023f, +0.000071f}, + {-0.024493f, -0.346874f, -0.002774f, +0.000070f, +0.000048f}, + {-0.047272f, +0.147189f, -0.008626f, -0.000053f, -0.000044f}, + {+0.026008f, +0.007599f, +0.001975f, +0.000132f, -0.000005f}, + {+0.030534f, +0.339732f, +0.003406f, +0.000035f, -0.000020f}, + {+0.083347f, -0.077557f, +0.013266f, -0.000128f, -0.000007f}, + {-0.013672f, -0.131388f, -0.003403f, +0.000118f, +0.000027f} + }, + { + {-0.267902f, -0.264872f, -0.040046f, +0.000129f, +0.000011f}, + {+0.321912f, +0.191063f, +0.044992f, +0.000193f, -0.000056f}, + {-0.022572f, -0.096725f, -0.002705f, +0.000503f, +0.000069f}, + {-0.176343f, -0.111752f, -0.025706f, +0.000048f, +0.000053f}, + {+0.084811f, -0.059741f, +0.013684f, -0.000183f, -0.000048f}, + {-0.004452f, +0.055305f, +0.000514f, -0.000261f, -0.000064f}, + {+0.161895f, +0.139155f, +0.022695f, -0.000241f, -0.000046f}, + {-0.046966f, +0.125238f, -0.006695f, +0.000013f, +0.000036f}, + {-0.046666f, -0.080465f, -0.004500f, -0.000378f, -0.000014f} + }, + { + {+0.182763f, +0.425959f, +0.026111f, +0.000216f, -0.000001f}, + {-0.151967f, -0.538951f, -0.023953f, +0.000917f, +0.000002f}, + {+0.059967f, +0.029780f, +0.006750f, -0.000233f, -0.000082f}, + {+0.071926f, +0.268254f, +0.009365f, -0.000173f, -0.000058f}, + {+0.030147f, -0.144364f, +0.004637f, +0.000155f, +0.000054f}, + {-0.022610f, +0.026139f, -0.001896f, +0.000081f, +0.000015f}, + {-0.089140f, -0.244883f, -0.010242f, +0.000037f, +0.000027f}, + {-0.053982f, +0.112441f, -0.009466f, +0.000027f, +0.000006f}, + {+0.043125f, +0.054784f, +0.006054f, -0.000118f, -0.000026f} + }, + { + {+0.236555f, +0.344253f, +0.035451f, -0.000140f, -0.000014f}, + {-0.305017f, -0.302445f, -0.041503f, -0.000225f, +0.000061f}, + {+0.000099f, +0.121249f, +0.000347f, -0.000531f, -0.000075f}, + {+0.147839f, +0.147624f, +0.023593f, -0.000074f, -0.000055f}, + {-0.099074f, +0.056676f, -0.015836f, +0.000238f, +0.000049f}, + {+0.015365f, -0.033058f, +0.001023f, +0.000263f, +0.000075f}, + {-0.115117f, -0.202631f, -0.018500f, +0.000266f, +0.000048f}, + {+0.062522f, -0.070317f, +0.009998f, +0.000023f, -0.000045f}, + {+0.009357f, +0.103095f, +0.001665f, +0.000461f, +0.000014f} + }, + { + {-0.223414f, -0.360443f, -0.031653f, -0.000161f, +0.000003f}, + {+0.220330f, +0.504684f, +0.033230f, -0.000874f, -0.000003f}, + {-0.065668f, +0.018345f, -0.008069f, +0.000490f, +0.000105f}, + {-0.094224f, -0.228227f, -0.015610f, +0.000296f, +0.000075f}, + {-0.011044f, +0.195618f, +0.000221f, -0.000284f, -0.000070f}, + {+0.015206f, -0.030774f, +0.001584f, -0.000377f, -0.000037f}, + {+0.112319f, +0.149909f, +0.015570f, -0.000082f, -0.000037f}, + {+0.027593f, -0.125221f, +0.004605f, +0.000167f, +0.000001f}, + {-0.035657f, +0.033761f, -0.006506f, +0.000132f, +0.000027f} + }, + { + {-0.197435f, -0.400152f, -0.030189f, +0.000183f, +0.000017f}, + {+0.265346f, +0.433349f, +0.035911f, +0.000309f, -0.000070f}, + {+0.024825f, -0.121781f, +0.003662f, +0.000791f, +0.000075f}, + {-0.131639f, -0.172895f, -0.018896f, +0.000200f, +0.000051f}, + {+0.118431f, -0.000422f, +0.015867f, -0.000387f, -0.000045f}, + {-0.018068f, +0.023258f, -0.002724f, -0.000522f, -0.000082f}, + {+0.072974f, +0.212278f, +0.011511f, -0.000340f, -0.000047f}, + {-0.068530f, +0.023641f, -0.010358f, +0.000042f, +0.000055f}, + {+0.013236f, -0.038962f, +0.000910f, -0.000477f, -0.000015f} + }, + { + {+0.253363f, +0.291660f, +0.036499f, +0.000094f, -0.000007f}, + {-0.281798f, -0.406628f, -0.041589f, +0.000891f, +0.000005f}, + {+0.059479f, -0.066959f, +0.007177f, -0.000628f, -0.000142f}, + {+0.120109f, +0.213729f, +0.018705f, -0.000288f, -0.000099f}, + {-0.027666f, -0.223189f, -0.003521f, +0.000300f, +0.000093f}, + {-0.013844f, +0.028875f, -0.000557f, +0.000575f, +0.000072f}, + {-0.118976f, -0.083818f, -0.016708f, +0.000094f, +0.000049f}, + {-0.002209f, +0.126405f, -0.000845f, -0.000338f, -0.000017f}, + {+0.011760f, -0.039638f, +0.005259f, -0.000091f, -0.000032f} + }, + { + {+0.156753f, +0.440657f, +0.023910f, -0.000253f, -0.000018f}, + {-0.203795f, -0.522732f, -0.028158f, -0.000411f, +0.000085f}, + {-0.046218f, +0.097129f, -0.007205f, -0.001249f, -0.000056f}, + {+0.112467f, +0.226687f, +0.015571f, -0.000451f, -0.000035f}, + {-0.117838f, -0.083303f, -0.016703f, +0.000616f, +0.000028f}, + {+0.023412f, -0.030837f, +0.004021f, +0.001018f, +0.000071f}, + {-0.037437f, -0.211830f, -0.005723f, +0.000467f, +0.000043f}, + {+0.064323f, +0.023579f, +0.009934f, -0.000232f, -0.000060f}, + {-0.009156f, -0.006104f, -0.001969f, +0.000387f, +0.000022f} + }, + { + {-0.275944f, -0.222761f, -0.039627f, -0.000066f, +0.000013f}, + {+0.322019f, +0.286370f, +0.048482f, -0.000959f, -0.000014f}, + {-0.046923f, +0.094317f, -0.005599f, +0.000435f, +0.000182f}, + {-0.150750f, -0.177020f, -0.022662f, +0.000117f, +0.000123f}, + {+0.067347f, +0.202691f, +0.009894f, -0.000124f, -0.000115f}, + {+0.015081f, -0.042971f, +0.000082f, -0.000445f, -0.000114f}, + {+0.117640f, +0.025700f, +0.015946f, -0.000085f, -0.000063f}, + {-0.016418f, -0.100980f, -0.001676f, +0.000298f, +0.000040f}, + {-0.000250f, +0.010429f, -0.002435f, -0.000017f, +0.000037f} + }, + { + {-0.115447f, -0.469158f, -0.017950f, +0.000366f, +0.000017f}, + {+0.134884f, +0.571706f, +0.018454f, +0.000373f, -0.000105f}, + {+0.067420f, -0.084270f, +0.010575f, +0.001650f, +0.000010f}, + {-0.076003f, -0.293259f, -0.009993f, +0.000579f, +0.000003f}, + {+0.098520f, +0.155744f, +0.013412f, -0.000754f, +0.000004f}, + {-0.039536f, +0.043110f, -0.005899f, -0.001509f, -0.000034f}, + {+0.003041f, +0.203039f, +0.001212f, -0.000536f, -0.000033f}, + {-0.056528f, -0.038194f, -0.009590f, +0.000577f, +0.000054f}, + {-0.001245f, +0.013315f, +0.000319f, -0.000346f, -0.000036f} + }, + { + {+0.292999f, +0.157930f, +0.042403f, +0.000087f, -0.000020f}, + {-0.342354f, -0.162255f, -0.051635f, +0.001110f, +0.000034f}, + {+0.022156f, -0.154740f, +0.000608f, +0.000173f, -0.000208f}, + {+0.168151f, +0.078549f, +0.023857f, +0.000280f, -0.000137f}, + {-0.096594f, -0.143573f, -0.013193f, -0.000234f, +0.000126f}, + {-0.002506f, +0.100103f, +0.002757f, -0.000120f, +0.000144f}, + {-0.102496f, +0.041774f, -0.013753f, -0.000024f, +0.000074f}, + {+0.028733f, +0.095250f, +0.004398f, -0.000056f, -0.000064f}, + {-0.000053f, +0.012400f, +0.002539f, +0.000289f, -0.000038f} + }, + { + {+0.073802f, +0.495430f, +0.011185f, -0.000471f, -0.000013f}, + {-0.067107f, -0.583553f, -0.008494f, -0.000150f, +0.000126f}, + {-0.082122f, +0.004027f, -0.011237f, -0.001551f, +0.000060f}, + {+0.028928f, +0.288941f, +0.005398f, -0.000320f, +0.000043f}, + {-0.067365f, -0.187138f, -0.009613f, +0.000522f, -0.000049f}, + {+0.053548f, +0.014546f, +0.006738f, +0.001557f, -0.000028f}, + {+0.021691f, -0.148588f, +0.001549f, +0.000530f, +0.000018f}, + {+0.052283f, +0.060853f, +0.007887f, -0.000799f, -0.000034f}, + {+0.008489f, -0.003383f, +0.001566f, +0.000494f, +0.000057f} + }, + { + {-0.307330f, -0.088798f, -0.043952f, -0.000185f, +0.000025f}, + {+0.348741f, +0.055377f, +0.052852f, -0.001109f, -0.000070f}, + {+0.020133f, +0.157206f, +0.002804f, -0.000807f, +0.000201f}, + {-0.157718f, +0.000354f, -0.025108f, -0.000577f, +0.000129f}, + {+0.107002f, +0.082667f, +0.016074f, +0.000429f, -0.000116f}, + {-0.027699f, -0.106463f, -0.004855f, +0.000830f, -0.000144f}, + {+0.076446f, -0.063154f, +0.011339f, +0.000105f, -0.000081f}, + {-0.046001f, -0.090381f, -0.006439f, -0.000517f, +0.000079f}, + {-0.003916f, -0.020923f, -0.003928f, -0.000676f, +0.000026f} + }, + { + {-0.027283f, -0.518967f, -0.004482f, +0.000531f, +0.000006f}, + {+0.002104f, +0.586753f, -0.000310f, -0.000388f, -0.000138f}, + {+0.067195f, +0.083021f, +0.013467f, -0.000261f, -0.000139f}, + {+0.000203f, -0.242050f, +0.002218f, -0.001130f, -0.000092f}, + {+0.041057f, +0.183900f, +0.003084f, +0.000869f, +0.000096f}, + {-0.043480f, -0.079977f, -0.008525f, -0.000104f, +0.000100f}, + {-0.026266f, +0.096019f, -0.004003f, -0.000222f, +0.000001f}, + {-0.040550f, -0.099815f, -0.006813f, +0.000626f, +0.000005f}, + {-0.012858f, -0.005094f, -0.001938f, -0.001102f, -0.000079f} + }, + { + {+0.314481f, +0.005188f, +0.044811f, +0.000426f, -0.000028f}, + {-0.346528f, +0.051746f, -0.052277f, +0.000401f, +0.000122f}, + {-0.053118f, -0.097595f, -0.002410f, +0.001225f, -0.000151f}, + {+0.140849f, -0.024347f, +0.026727f, +0.000253f, -0.000095f}, + {-0.107847f, -0.047702f, -0.019644f, +0.000097f, +0.000079f}, + {+0.051228f, +0.061068f, +0.003689f, -0.001630f, +0.000102f}, + {-0.056164f, +0.049815f, -0.009319f, +0.000032f, +0.000080f}, + {+0.061891f, +0.058300f, +0.009871f, +0.001903f, -0.000079f}, + {+0.009880f, +0.028684f, +0.006879f, +0.001108f, +0.000001f} + } +}; + +#endif + +#ifdef USE_HRIR_128_48000_DOLBY_SBA1 + +const float FASTCONV_FOA_latency_s = 0.000666667f; +const float leftHRIRReal_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]= +{ + { + {+0.001139f, +0.701381f, +0.088362f, +0.001507f, +0.000002f}, + {+0.000414f, +0.262095f, -0.237214f, -0.003224f, +0.000036f}, + {+0.002081f, +0.073269f, +0.016442f, -0.002305f, -0.000016f}, + {+0.003374f, +0.067272f, -0.027345f, -0.000156f, +0.000027f} + }, + { + {-0.006858f, +0.573976f, -0.025590f, -0.002173f, -0.000001f}, + {-0.018683f, +0.673324f, +0.155049f, +0.004529f, -0.000042f}, + {-0.004167f, -0.005579f, -0.043222f, +0.004198f, +0.000026f}, + {-0.007696f, +0.026588f, -0.047141f, +0.000930f, -0.000031f} + }, + { + {+0.022690f, +0.504423f, -0.025668f, -0.000505f, -0.000002f}, + {+0.098922f, +0.785742f, +0.002391f, +0.001725f, -0.000029f}, + {+0.001996f, -0.028688f, -0.031830f, -0.002187f, +0.000003f}, + {+0.012563f, -0.012620f, -0.033386f, -0.001639f, -0.000022f} + }, + { + {-0.068470f, +0.403356f, +0.003719f, +0.002403f, +0.000001f}, + {-0.238766f, +0.395418f, +0.032160f, -0.006283f, +0.000045f}, + {-0.003715f, -0.000119f, +0.009760f, -0.000148f, -0.000031f}, + {-0.028559f, -0.040197f, +0.002155f, +0.000892f, +0.000033f} + }, + { + {+0.145134f, +0.119557f, +0.007639f, -0.000923f, +0.000003f}, + {+0.294065f, -0.334693f, -0.019103f, +0.002511f, +0.000020f}, + {+0.020226f, -0.024338f, +0.012605f, +0.001278f, +0.000012f}, + {+0.043958f, -0.145428f, +0.013697f, +0.000566f, +0.000018f} + }, + { + {-0.153301f, -0.308264f, -0.003171f, -0.001265f, -0.000001f}, + {-0.095935f, -0.863498f, -0.010369f, +0.003299f, -0.000045f}, + {-0.032438f, -0.100491f, +0.003144f, -0.001769f, +0.000029f}, + {-0.013113f, -0.237010f, +0.000894f, -0.000875f, -0.000033f} + }, + { + {-0.012428f, -0.509031f, -0.004688f, +0.000988f, -0.000003f}, + {-0.244664f, -0.595158f, -0.023888f, -0.002491f, -0.000012f}, + {+0.002609f, -0.144907f, -0.010043f, +0.000781f, -0.000027f}, + {-0.074154f, -0.145409f, -0.008757f, -0.000058f, -0.000014f} + }, + { + {+0.212788f, -0.155514f, +0.023333f, +0.000561f, +0.000002f}, + {+0.330585f, +0.291160f, +0.047010f, -0.002016f, +0.000043f}, + {+0.050155f, -0.068056f, -0.001580f, +0.001116f, -0.000021f}, + {+0.122861f, +0.153186f, +0.009329f, +0.000801f, +0.000032f} + }, + { + {-0.148866f, +0.399380f, -0.016077f, -0.000584f, +0.000004f}, + {+0.007222f, +0.769639f, -0.001057f, +0.002043f, +0.000007f}, + {-0.045137f, +0.068695f, +0.001800f, -0.000989f, +0.000039f}, + {-0.030243f, +0.388427f, -0.005358f, -0.000487f, +0.000012f} + }, + { + {-0.148858f, +0.389050f, -0.019934f, -0.000504f, -0.000003f}, + {-0.349211f, +0.214703f, -0.051501f, +0.001478f, -0.000039f}, + {-0.029971f, +0.074752f, -0.006844f, -0.000679f, +0.000009f}, + {-0.127591f, +0.245277f, -0.008622f, -0.000243f, -0.000032f} + }, + { + {+0.239012f, -0.214946f, +0.031611f, +0.000498f, -0.000004f}, + {+0.196316f, -0.613847f, +0.027133f, -0.001726f, -0.000004f}, + {+0.059322f, -0.077618f, +0.010338f, +0.000544f, -0.000046f}, + {+0.142102f, -0.158560f, +0.013819f, +0.000336f, -0.000011f} + }, + { + {+0.056721f, -0.491541f, +0.006821f, +0.000413f, +0.000004f}, + {+0.248916f, -0.524024f, +0.041690f, -0.001135f, +0.000035f}, + {+0.029432f, -0.129169f, -0.000386f, +0.000757f, +0.000007f}, + {+0.025409f, -0.327769f, +0.004549f, +0.000075f, +0.000034f} + }, + { + {-0.277481f, +0.028032f, -0.037920f, -0.000438f, +0.000003f}, + {-0.308141f, +0.332951f, -0.045686f, +0.001496f, +0.000003f}, + {-0.108659f, +0.087169f, -0.015132f, -0.000418f, +0.000046f}, + {-0.144191f, -0.063507f, -0.018317f, -0.000173f, +0.000009f} + }, + { + {+0.037467f, +0.509783f, +0.006165f, -0.000331f, -0.000005f}, + {-0.118379f, +0.623008f, -0.023288f, +0.000858f, -0.000032f}, + {+0.020828f, +0.293771f, +0.009322f, -0.000570f, -0.000020f}, + {+0.044708f, +0.223468f, +0.005411f, -0.000025f, -0.000036f} + }, + { + {+0.276681f, +0.136508f, +0.039053f, +0.000399f, -0.000002f}, + {+0.342800f, -0.086499f, +0.051427f, -0.001312f, -0.000004f}, + {+0.141529f, +0.115364f, +0.013240f, +0.000205f, -0.000040f}, + {+0.110040f, +0.119206f, +0.016186f, +0.000083f, -0.000006f} + }, + { + {-0.117783f, -0.468960f, -0.017913f, +0.000250f, +0.000005f}, + {+0.005671f, -0.604318f, +0.007143f, -0.000660f, +0.000031f}, + {-0.130049f, -0.297226f, -0.017966f, +0.000439f, +0.000030f}, + {-0.077788f, -0.170577f, -0.011766f, -0.000035f, +0.000037f} + }, + { + {-0.252966f, -0.256306f, -0.036605f, -0.000365f, +0.000002f}, + {-0.337478f, -0.074281f, -0.052432f, +0.001197f, +0.000005f}, + {-0.072906f, -0.386255f, -0.005369f, -0.000119f, +0.000033f}, + {-0.075520f, -0.174614f, -0.010607f, -0.000037f, +0.000003f} + }, + { + {+0.180447f, +0.410401f, +0.027706f, -0.000193f, -0.000005f}, + {+0.079743f, +0.570802f, +0.007521f, +0.000528f, -0.000032f}, + {+0.189755f, +0.008151f, +0.021117f, -0.000340f, -0.000036f}, + {+0.097648f, +0.090203f, +0.013931f, +0.000113f, -0.000038f} + }, + { + {+0.221150f, +0.344584f, +0.031954f, +0.000342f, -0.000001f}, + {+0.324392f, +0.195009f, +0.049761f, -0.001141f, -0.000005f}, + {-0.055564f, +0.372598f, -0.003229f, +0.000147f, -0.000026f}, + {+0.029197f, +0.196512f, +0.004268f, -0.000027f, +0.000001f} + }, + { + {-0.234543f, -0.356749f, -0.036109f, +0.000161f, +0.000005f}, + {-0.158828f, -0.551737f, -0.020300f, -0.000447f, +0.000034f}, + {-0.128996f, +0.253163f, -0.019502f, +0.000205f, +0.000038f}, + {-0.086326f, +0.024093f, -0.010653f, -0.000104f, +0.000038f} + }, + { + {-0.180736f, -0.438688f, -0.025011f, -0.000324f, +0.000001f}, + {-0.301948f, -0.334020f, -0.045105f, +0.001128f, +0.000004f}, + {+0.108851f, -0.109590f, +0.011684f, +0.000065f, +0.000022f}, + {+0.007794f, -0.114979f, -0.002557f, +0.000055f, -0.000004f} + }, + { + {+0.283619f, +0.272902f, +0.041849f, -0.000148f, -0.000005f}, + {+0.241474f, +0.503493f, +0.031717f, +0.000352f, -0.000035f}, + {+0.045390f, -0.198917f, +0.011556f, -0.000593f, -0.000041f}, + {+0.041019f, -0.061071f, +0.008824f, +0.000017f, -0.000039f} + }, + { + {+0.123506f, +0.516214f, +0.017365f, +0.000301f, -0.000001f}, + {+0.256327f, +0.482583f, +0.037542f, -0.001057f, -0.000002f}, + {-0.083839f, +0.008074f, -0.016916f, +0.000282f, -0.000018f}, + {+0.003422f, -0.003727f, +0.003177f, -0.000000f, +0.000006f} + }, + { + {-0.313797f, -0.154486f, -0.046391f, +0.000147f, +0.000005f}, + {-0.319981f, -0.404727f, -0.042569f, -0.000317f, +0.000036f}, + {-0.021107f, +0.110660f, -0.004978f, +0.000416f, +0.000047f}, + {-0.008153f, -0.022716f, -0.004670f, +0.000045f, +0.000040f} + }, + { + {-0.061089f, -0.539358f, -0.009248f, -0.000286f, +0.000001f}, + {-0.177073f, -0.627220f, -0.025260f, +0.001022f, +0.000001f}, + {+0.071424f, -0.032340f, +0.013321f, -0.000179f, +0.000014f}, + {-0.053388f, +0.046353f, -0.007111f, -0.000176f, -0.000010f} + }, + { + {+0.324287f, +0.053524f, +0.049068f, -0.000116f, -0.000006f}, + {+0.369344f, +0.211212f, +0.048775f, +0.000225f, -0.000037f}, + {+0.008002f, -0.135643f, +0.001207f, -0.000329f, -0.000053f}, + {+0.026056f, +0.169088f, +0.008645f, +0.000250f, -0.000042f} + }, + { + {+0.005776f, +0.541579f, +0.000581f, +0.000240f, -0.000000f}, + {+0.077934f, +0.656141f, +0.014760f, -0.000940f, -0.000001f}, + {-0.071537f, -0.021095f, -0.007901f, +0.000019f, -0.000006f}, + {+0.095328f, +0.067372f, +0.010448f, -0.000101f, +0.000015f} + }, + { + {-0.328162f, +0.029093f, -0.049230f, +0.000107f, +0.000007f}, + {-0.369662f, -0.037217f, -0.051825f, -0.000167f, +0.000038f}, + {+0.023527f, +0.120022f, -0.000102f, +0.000278f, +0.000058f}, + {-0.090284f, -0.212186f, -0.013169f, -0.000132f, +0.000043f} + }, + { + {+0.048978f, -0.548479f, +0.007485f, -0.000233f, -0.000001f}, + {-0.003228f, -0.602938f, -0.001617f, +0.000911f, +0.000001f}, + {+0.040104f, +0.095644f, +0.005888f, -0.000009f, -0.000005f}, + {-0.081710f, -0.220378f, -0.013048f, -0.000016f, -0.000021f} + }, + { + {+0.324250f, -0.126479f, +0.048291f, -0.000066f, -0.000007f}, + {+0.357292f, -0.046143f, +0.050921f, +0.000098f, -0.000041f}, + {-0.027149f, -0.003860f, +0.000272f, -0.000124f, -0.000060f}, + {+0.141329f, +0.121139f, +0.018219f, +0.000314f, -0.000043f} + }, + { + {-0.104734f, +0.530347f, -0.015582f, +0.000224f, +0.000002f}, + {-0.054628f, +0.590170f, -0.008056f, -0.000909f, +0.000000f}, + {-0.005584f, -0.032979f, -0.004816f, +0.000029f, +0.000015f}, + {+0.037866f, +0.274890f, +0.006759f, -0.000046f, +0.000027f} + }, + { + {-0.308177f, +0.218644f, -0.045991f, +0.000043f, +0.000007f}, + {-0.346201f, +0.142031f, -0.048180f, -0.000046f, +0.000045f}, + {-0.007019f, -0.030662f, -0.000480f, +0.000081f, +0.000058f}, + {-0.162861f, -0.035781f, -0.023778f, -0.000324f, +0.000041f} + }, + { + {+0.155747f, -0.491433f, +0.022764f, -0.000231f, -0.000003f}, + {+0.112390f, -0.563014f, +0.016093f, +0.000905f, -0.000002f}, + {+0.014636f, -0.060316f, +0.003797f, -0.000151f, -0.000023f}, + {+0.007188f, -0.297579f, +0.001361f, +0.000018f, -0.000032f} + }, + { + {+0.282333f, -0.296973f, +0.042631f, -0.000038f, -0.000007f}, + {+0.325943f, -0.233378f, +0.045604f, +0.000052f, -0.000049f}, + {+0.025539f, -0.043016f, +0.004050f, -0.000129f, -0.000057f}, + {+0.170600f, -0.047495f, +0.024487f, +0.000283f, -0.000040f} + }, + { + {-0.198966f, +0.440444f, -0.029339f, +0.000240f, +0.000003f}, + {-0.163937f, +0.519986f, -0.024102f, -0.000910f, +0.000006f}, + {-0.041643f, +0.059924f, -0.008056f, +0.000252f, +0.000028f}, + {-0.058279f, +0.303786f, -0.008000f, +0.000033f, +0.000037f} + }, + { + {-0.251233f, +0.360645f, -0.037855f, +0.000048f, +0.000007f}, + {-0.301209f, +0.307267f, -0.042244f, -0.000061f, +0.000052f}, + {-0.017898f, +0.097992f, -0.002832f, +0.000217f, +0.000060f}, + {-0.154977f, +0.157077f, -0.021873f, -0.000264f, +0.000040f} + }, + { + {+0.235922f, -0.385212f, +0.034692f, -0.000230f, -0.000003f}, + {+0.211902f, -0.482439f, +0.031812f, +0.000875f, -0.000009f}, + {+0.062526f, -0.022786f, +0.009165f, -0.000192f, -0.000037f}, + {+0.100642f, -0.232077f, +0.012026f, +0.000003f, -0.000044f} + }, + { + {+0.215580f, -0.416556f, +0.032649f, -0.000062f, -0.000008f}, + {+0.273278f, -0.387323f, +0.037577f, +0.000065f, -0.000055f}, + {-0.005939f, -0.125998f, +0.001105f, -0.000285f, -0.000067f}, + {+0.119018f, -0.200389f, +0.019595f, +0.000282f, -0.000042f} + }, + { + {-0.266556f, +0.321627f, -0.039270f, +0.000204f, +0.000005f}, + {-0.262381f, +0.436199f, -0.039035f, -0.000825f, +0.000011f}, + {-0.067202f, -0.031111f, -0.011093f, +0.000033f, +0.000054f}, + {-0.114634f, +0.160892f, -0.016486f, -0.000093f, +0.000057f} + }, + { + {-0.175988f, +0.460735f, -0.026828f, +0.000048f, +0.000010f}, + {-0.233172f, +0.480676f, -0.031122f, -0.000031f, +0.000060f}, + {+0.031548f, +0.122002f, +0.003267f, +0.000158f, +0.000072f}, + {-0.094567f, +0.192621f, -0.015001f, -0.000394f, +0.000041f} + }, + { + {+0.289864f, -0.252340f, +0.042717f, -0.000164f, -0.000008f}, + {+0.309890f, -0.352443f, +0.045041f, +0.000820f, -0.000012f}, + {+0.059594f, +0.080834f, +0.009319f, +0.000095f, -0.000085f}, + {+0.123492f, -0.142957f, +0.017979f, +0.000125f, -0.000076f} + }, + { + {+0.134575f, -0.490695f, +0.020657f, -0.000008f, -0.000011f}, + {+0.176248f, -0.555316f, +0.023664f, -0.000054f, -0.000070f}, + {-0.054408f, -0.093413f, -0.005141f, +0.000202f, -0.000064f}, + {+0.078026f, -0.213530f, +0.012432f, +0.000637f, -0.000030f} + }, + { + {-0.306423f, +0.183981f, -0.045149f, +0.000152f, +0.000012f}, + {-0.341487f, +0.240296f, -0.050133f, -0.000895f, +0.000016f}, + {-0.041086f, -0.112975f, -0.007981f, +0.000040f, +0.000125f}, + {-0.138721f, +0.120523f, -0.020161f, +0.000004f, +0.000099f} + }, + { + {-0.092719f, +0.511558f, -0.014604f, -0.000050f, +0.000009f}, + {-0.112835f, +0.589997f, -0.014321f, +0.000122f, +0.000086f}, + {+0.068469f, +0.059054f, +0.008838f, -0.000612f, +0.000032f}, + {-0.054382f, +0.253255f, -0.007586f, -0.000904f, +0.000005f} + }, + { + {+0.317269f, -0.115684f, +0.046850f, -0.000208f, -0.000018f}, + {+0.356933f, -0.130812f, +0.052103f, +0.001044f, -0.000027f}, + {+0.019507f, +0.139642f, +0.002950f, -0.000683f, -0.000159f}, + {+0.152449f, -0.061207f, +0.020045f, -0.000364f, -0.000115f} + }, + { + {+0.051096f, -0.523693f, +0.008474f, +0.000105f, -0.000004f}, + {+0.049349f, -0.600329f, +0.005605f, -0.000022f, -0.000106f}, + {-0.079985f, -0.011392f, -0.007657f, +0.000780f, +0.000028f}, + {+0.017397f, -0.267260f, +0.004496f, +0.000957f, +0.000035f} + }, + { + {-0.323905f, +0.049833f, -0.047865f, +0.000329f, +0.000021f}, + {-0.358893f, +0.027640f, -0.053272f, -0.001258f, +0.000053f}, + {+0.015053f, -0.158953f, -0.000193f, +0.001713f, +0.000167f}, + {-0.144359f, -0.018540f, -0.020249f, +0.000901f, +0.000114f} + }, + { + {-0.008373f, +0.533499f, -0.002225f, -0.000084f, -0.000004f}, + {+0.010355f, +0.593074f, +0.003536f, -0.000223f, +0.000122f}, + {+0.071969f, -0.070538f, +0.006817f, -0.000021f, -0.000104f}, + {+0.009075f, +0.217846f, -0.000438f, -0.000486f, -0.000083f} + }, + { + {+0.325536f, +0.023312f, +0.048108f, -0.000519f, -0.000020f}, + {+0.352731f, +0.066640f, +0.052836f, +0.001159f, -0.000094f}, + {-0.047485f, +0.116702f, -0.002224f, -0.002868f, -0.000134f}, + {+0.125804f, +0.038871f, +0.018687f, -0.001207f, -0.000088f} + }, + { + {-0.036324f, -0.531073f, -0.003989f, -0.000084f, +0.000013f}, + {-0.069318f, -0.580051f, -0.011694f, +0.000718f, -0.000126f}, + {-0.044835f, +0.120121f, -0.003388f, -0.003194f, +0.000173f}, + {-0.016464f, -0.181504f, -0.002802f, -0.001577f, +0.000124f} + } +}; + +const float leftHRIRImag_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]= +{ + { + {-0.075561f, -0.068517f, +0.140821f, -0.000006f, -0.000001f}, + {-0.113351f, +0.312423f, -0.154809f, +0.003274f, -0.000040f}, + {-0.002167f, -0.037131f, +0.050206f, -0.009097f, +0.000022f}, + {-0.008959f, -0.001538f, +0.017300f, -0.005827f, -0.000030f} + }, + { + {+0.088726f, -0.056723f, -0.005193f, -0.002691f, -0.000002f}, + {+0.119871f, +0.624601f, -0.192908f, +0.005870f, -0.000033f}, + {+0.004166f, -0.045506f, +0.052787f, -0.000546f, +0.000010f}, + {+0.009543f, +0.003765f, +0.008451f, +0.003327f, -0.000025f} + }, + { + {-0.102143f, +0.113338f, +0.041532f, +0.003556f, +0.000001f}, + {-0.144265f, +0.722990f, +0.063761f, -0.009098f, +0.000044f}, + {-0.005127f, +0.024047f, -0.013948f, +0.005687f, -0.000029f}, + {-0.011405f, +0.075487f, -0.028027f, -0.000790f, +0.000032f} + }, + { + {+0.102256f, +0.332031f, -0.028467f, -0.000969f, +0.000002f}, + {+0.105041f, +0.913298f, +0.007994f, +0.001561f, +0.000024f}, + {+0.007491f, +0.060974f, -0.023635f, -0.001357f, +0.000004f}, + {+0.005542f, +0.127425f, -0.011646f, +0.000496f, +0.000020f} + }, + { + {-0.044065f, +0.500826f, -0.002410f, -0.001370f, -0.000001f}, + {+0.092604f, +0.883373f, +0.024383f, +0.004737f, -0.000046f}, + {-0.004561f, +0.083819f, -0.019790f, -0.002951f, +0.000031f}, + {+0.027047f, +0.113206f, -0.016192f, -0.001506f, -0.000033f} + }, + { + {-0.101331f, +0.396216f, -0.004920f, +0.000653f, -0.000003f}, + {-0.315234f, +0.274804f, -0.039014f, -0.001908f, -0.000016f}, + {-0.020480f, +0.081227f, +0.012774f, +0.001524f, -0.000020f}, + {-0.075525f, -0.016066f, +0.005310f, +0.001230f, -0.000016f} + }, + { + {+0.205124f, -0.066361f, +0.022115f, +0.000986f, +0.000002f}, + {+0.252202f, -0.571430f, +0.010069f, -0.002911f, +0.000045f}, + {+0.049641f, -0.008053f, +0.006538f, +0.000795f, -0.000026f}, + {+0.069872f, -0.229431f, +0.016281f, +0.000270f, +0.000032f} + }, + { + {-0.075366f, -0.478001f, -0.007669f, -0.000701f, +0.000003f}, + {+0.124742f, -0.753308f, +0.025384f, +0.001863f, +0.000009f}, + {-0.028983f, -0.121665f, -0.007415f, -0.000267f, +0.000034f}, + {+0.036071f, -0.292663f, -0.003455f, -0.000819f, +0.000013f} + }, + { + {-0.186385f, -0.294120f, -0.028378f, -0.000604f, -0.000002f}, + {-0.364681f, +0.008978f, -0.038744f, +0.001757f, -0.000041f}, + {-0.036441f, -0.104767f, -0.010428f, -0.000824f, +0.000015f}, + {-0.145432f, -0.035047f, -0.010123f, +0.000064f, -0.000032f} + }, + { + {+0.200759f, +0.301898f, +0.028191f, +0.000609f, -0.000004f}, + {+0.106790f, +0.737079f, +0.007371f, -0.001552f, -0.000005f}, + {+0.050065f, +0.035831f, +0.013930f, +0.000498f, -0.000043f}, + {+0.098812f, +0.316605f, +0.005024f, +0.000388f, -0.000012f} + }, + { + {+0.102918f, +0.447646f, +0.016687f, +0.000392f, +0.000003f}, + {+0.311637f, +0.412036f, +0.037367f, -0.001208f, +0.000037f}, + {+0.029150f, +0.073712f, +0.005390f, +0.000373f, -0.000001f}, + {+0.078159f, +0.331302f, +0.015024f, +0.000096f, +0.000033f} + }, + { + {-0.263157f, -0.117240f, -0.038079f, -0.000498f, +0.000003f}, + {-0.266046f, -0.483755f, -0.030591f, +0.001325f, +0.000003f}, + {-0.079262f, -0.094840f, -0.015385f, -0.000509f, +0.000047f}, + {-0.153547f, -0.029982f, -0.019729f, -0.000450f, +0.000010f} + }, + { + {-0.007705f, -0.507985f, -0.003383f, -0.000318f, -0.000004f}, + {-0.186453f, -0.597236f, -0.023398f, +0.000963f, -0.000033f}, + {-0.013117f, -0.205170f, +0.001765f, -0.000228f, -0.000014f}, + {+0.017314f, -0.287283f, -0.002959f, -0.000038f, -0.000035f} + }, + { + {+0.280521f, -0.062761f, +0.041073f, +0.000449f, -0.000003f}, + {+0.334574f, +0.214167f, +0.043236f, -0.001215f, -0.000003f}, + {+0.133038f, +0.011844f, +0.017286f, +0.000551f, -0.000044f}, + {+0.127101f, -0.107475f, +0.022000f, +0.000440f, -0.000008f} + }, + { + {-0.080859f, +0.491833f, -0.009289f, +0.000270f, +0.000005f}, + {+0.060956f, +0.629530f, +0.006506f, -0.000817f, +0.000032f}, + {-0.073930f, +0.331264f, -0.010959f, +0.000254f, +0.000026f}, + {-0.063542f, +0.194964f, -0.009265f, +0.000065f, +0.000037f} + }, + { + {-0.266097f, +0.204693f, -0.039752f, -0.000407f, +0.000002f}, + {-0.343709f, -0.003857f, -0.048079f, +0.001153f, +0.000004f}, + {-0.120675f, +0.268205f, -0.012518f, -0.000600f, +0.000037f}, + {-0.094236f, +0.151237f, -0.013332f, -0.000477f, +0.000005f} + }, + { + {+0.151764f, -0.437914f, +0.020131f, -0.000242f, -0.000005f}, + {+0.036841f, -0.588874f, +0.009139f, +0.000664f, -0.000032f}, + {+0.174802f, -0.176925f, +0.017691f, -0.000280f, -0.000033f}, + {+0.090868f, -0.134423f, +0.011793f, -0.000076f, -0.000038f} + }, + { + {+0.237215f, -0.304481f, +0.035938f, +0.000373f, -0.000001f}, + {+0.332318f, -0.127083f, +0.047424f, -0.001052f, -0.000005f}, + {+0.006779f, -0.431468f, +0.002691f, +0.000532f, -0.000029f}, + {+0.053552f, -0.194194f, +0.007469f, +0.000494f, -0.000001f} + }, + { + {-0.208558f, +0.382505f, -0.029564f, +0.000207f, +0.000005f}, + {-0.116623f, +0.564310f, -0.021854f, -0.000528f, +0.000033f}, + {-0.172351f, -0.159278f, -0.018428f, +0.000360f, +0.000037f}, + {-0.097811f, +0.036173f, -0.011033f, +0.000077f, +0.000038f} + }, + { + {-0.202490f, +0.392017f, -0.029907f, -0.000333f, +0.000001f}, + {-0.316139f, +0.253384f, -0.044455f, +0.000945f, +0.000004f}, + {+0.097332f, +0.245644f, +0.004917f, -0.000556f, +0.000023f}, + {-0.006532f, +0.174857f, -0.002876f, -0.000550f, -0.000002f} + }, + { + {+0.261135f, -0.320885f, +0.037011f, -0.000181f, -0.000005f}, + {+0.197969f, -0.536807f, +0.033309f, +0.000398f, -0.000034f}, + {+0.081783f, +0.256891f, +0.014473f, -0.000242f, -0.000040f}, + {+0.065893f, +0.064104f, +0.007328f, +0.000082f, -0.000039f} + }, + { + {+0.153724f, -0.486020f, +0.022676f, +0.000325f, -0.000001f}, + {+0.283217f, -0.402227f, +0.039413f, -0.000851f, -0.000003f}, + {-0.100031f, -0.031468f, -0.013972f, +0.000537f, -0.000020f}, + {-0.008541f, -0.048318f, +0.000499f, +0.000444f, +0.000005f} + }, + { + {-0.302384f, +0.214214f, -0.042285f, +0.000129f, +0.000005f}, + {-0.280104f, +0.464455f, -0.045587f, -0.000282f, +0.000035f}, + {-0.027898f, -0.140901f, -0.007378f, +0.000003f, +0.000044f}, + {-0.020559f, -0.029800f, -0.003256f, -0.000145f, +0.000040f} + }, + { + {-0.091526f, +0.536382f, -0.014577f, -0.000305f, +0.000001f}, + {-0.221871f, +0.553999f, -0.029769f, +0.000764f, +0.000002f}, + {+0.073977f, +0.023109f, +0.011231f, -0.000304f, +0.000016f}, + {-0.025756f, -0.040011f, -0.004558f, -0.000368f, -0.000008f} + }, + { + {+0.321259f, -0.098962f, +0.045846f, -0.000108f, -0.000006f}, + {+0.348987f, -0.318713f, +0.051856f, +0.000239f, -0.000036f}, + {+0.017761f, +0.116280f, -0.000624f, -0.000200f, -0.000050f}, + {+0.009582f, -0.098230f, +0.005306f, +0.000144f, -0.000041f} + }, + { + {+0.032445f, -0.541906f, +0.005704f, +0.000315f, -0.000001f}, + {+0.127167f, -0.654253f, +0.018462f, -0.000765f, -0.000001f}, + {-0.073982f, -0.022018f, -0.008993f, +0.000517f, -0.000010f}, + {+0.079904f, +0.007744f, +0.010527f, +0.000350f, +0.000012f} + }, + { + {-0.327237f, +0.011995f, -0.047308f, +0.000087f, +0.000007f}, + {-0.372361f, +0.111338f, -0.055931f, -0.000147f, +0.000037f}, + {+0.006939f, -0.148510f, +0.003422f, +0.000212f, +0.000056f}, + {-0.056276f, +0.216052f, -0.007073f, -0.000104f, +0.000043f} + }, + { + {+0.021322f, +0.548401f, +0.003440f, -0.000317f, -0.000000f}, + {-0.036763f, +0.621232f, -0.007074f, +0.000670f, +0.000001f}, + {+0.060591f, -0.069431f, +0.006623f, -0.000636f, +0.000001f}, + {-0.095686f, +0.156364f, -0.008769f, -0.000353f, -0.000018f} + }, + { + {+0.328267f, +0.077867f, +0.046857f, -0.000082f, -0.000007f}, + {+0.361014f, +0.007604f, +0.057275f, +0.000179f, -0.000039f}, + {-0.031203f, +0.067398f, -0.002430f, -0.000232f, -0.000059f}, + {+0.120666f, -0.172404f, +0.015941f, +0.000046f, -0.000043f} + }, + { + {-0.077320f, -0.544064f, -0.010931f, +0.000301f, +0.000001f}, + {-0.025615f, -0.586847f, -0.004514f, -0.000654f, -0.000000f}, + {-0.019503f, +0.080767f, -0.004247f, +0.000554f, +0.000010f}, + {+0.060877f, -0.260909f, +0.007725f, +0.000342f, +0.000024f} + }, + { + {-0.318158f, -0.173881f, -0.045614f, +0.000092f, +0.000007f}, + {-0.350970f, -0.090433f, -0.053929f, -0.000134f, +0.000043f}, + {+0.011187f, +0.032303f, +0.001760f, +0.000373f, +0.000059f}, + {-0.154877f, +0.074143f, -0.023096f, -0.000037f, +0.000042f} + }, + { + {+0.131227f, +0.515417f, +0.018725f, -0.000280f, -0.000002f}, + {+0.083743f, +0.574149f, +0.012466f, +0.000576f, -0.000001f}, + {+0.005315f, +0.026215f, +0.002698f, -0.000477f, -0.000019f}, + {-0.015816f, +0.287949f, -0.001995f, -0.000235f, -0.000030f} + }, + { + {+0.296693f, +0.260934f, +0.042541f, -0.000091f, -0.000007f}, + {+0.335556f, +0.189122f, +0.052026f, +0.000094f, -0.000047f}, + {+0.020995f, +0.006183f, -0.000036f, -0.000396f, -0.000057f}, + {+0.168822f, +0.001307f, +0.024594f, -0.000017f, -0.000040f} + }, + { + {-0.178422f, -0.467768f, -0.025765f, +0.000259f, +0.000003f}, + {-0.138949f, -0.536439f, -0.020095f, -0.000522f, +0.000004f}, + {-0.028752f, -0.066596f, -0.002138f, +0.000378f, +0.000026f}, + {-0.031690f, -0.308623f, -0.005893f, +0.000213f, +0.000034f} + }, + { + {-0.267781f, -0.330036f, -0.038496f, +0.000071f, +0.000007f}, + {-0.312281f, -0.270728f, -0.048992f, -0.000017f, +0.000050f}, + {-0.024788f, -0.069674f, -0.002302f, +0.000335f, +0.000057f}, + {-0.167013f, -0.101727f, -0.022607f, -0.000026f, +0.000040f} + }, + { + {+0.218246f, +0.415608f, +0.031895f, -0.000250f, -0.000003f}, + {+0.187767f, +0.495269f, +0.027755f, +0.000490f, -0.000007f}, + {+0.054038f, +0.052249f, +0.006077f, -0.000385f, -0.000032f}, + {+0.082423f, +0.279154f, +0.011379f, -0.000228f, -0.000040f} + }, + { + {+0.234462f, +0.390517f, +0.033506f, -0.000040f, -0.000008f}, + {+0.286682f, +0.344540f, +0.044785f, -0.000053f, -0.000053f}, + {+0.007799f, +0.121924f, -0.000254f, -0.000274f, -0.000063f}, + {+0.137635f, +0.191812f, +0.020083f, +0.000078f, -0.000041f} + }, + { + {-0.252188f, -0.355561f, -0.036817f, +0.000259f, +0.000004f}, + {-0.236813f, -0.457491f, -0.035054f, -0.000497f, +0.000010f}, + {-0.067322f, +0.004912f, -0.008444f, +0.000591f, +0.000044f}, + {-0.110001f, -0.188497f, -0.016071f, +0.000306f, +0.000049f} + }, + { + {-0.196649f, -0.440315f, -0.028013f, +0.000028f, +0.000009f}, + {-0.254039f, -0.432758f, -0.039405f, +0.000094f, +0.000057f}, + {+0.018169f, -0.125990f, +0.003787f, +0.000283f, +0.000070f}, + {-0.104872f, -0.193750f, -0.016320f, -0.000067f, +0.000042f} + }, + { + {+0.279232f, +0.288906f, +0.040649f, -0.000288f, -0.000006f}, + {+0.287453f, +0.396154f, +0.041796f, +0.000496f, -0.000012f}, + {+0.065516f, -0.051533f, +0.008251f, -0.000833f, -0.000068f}, + {+0.117846f, +0.150938f, +0.019317f, -0.000398f, -0.000066f} + }, + { + {+0.155838f, +0.477142f, +0.022236f, -0.000054f, -0.000011f}, + {+0.205090f, +0.523697f, +0.032347f, -0.000074f, -0.000064f}, + {-0.043133f, +0.115358f, -0.007458f, -0.000536f, -0.000071f}, + {+0.086685f, +0.200152f, +0.011885f, -0.000042f, -0.000037f} + }, + { + {-0.298969f, -0.220193f, -0.043767f, +0.000325f, +0.000010f}, + {-0.328142f, -0.292452f, -0.047271f, -0.000442f, +0.000014f}, + {-0.051610f, +0.100445f, -0.006535f, +0.000948f, +0.000105f}, + {-0.130003f, -0.132255f, -0.020754f, +0.000362f, +0.000088f} + }, + { + {-0.114168f, -0.502804f, -0.016020f, +0.000104f, +0.000010f}, + {-0.143455f, -0.576024f, -0.024058f, +0.000023f, +0.000077f}, + {+0.061115f, -0.073546f, +0.010498f, +0.000984f, +0.000052f}, + {-0.068233f, -0.228084f, -0.008576f, +0.000257f, +0.000020f} + }, + { + {+0.312611f, +0.151372f, +0.045798f, -0.000314f, -0.000015f}, + {+0.351200f, +0.182575f, +0.051390f, +0.000326f, -0.000020f}, + {+0.031920f, -0.116916f, +0.003818f, -0.000728f, -0.000144f}, + {+0.146596f, +0.100142f, +0.022461f, -0.000165f, -0.000108f} + }, + { + {+0.072361f, +0.518728f, +0.009942f, -0.000175f, -0.000007f}, + {+0.079531f, +0.601014f, +0.014699f, -0.000081f, -0.000095f}, + {-0.074110f, +0.046958f, -0.012342f, -0.001344f, -0.000005f}, + {+0.036969f, +0.268420f, +0.004301f, -0.000333f, +0.000013f} + }, + { + {-0.321149f, -0.084827f, -0.047210f, +0.000251f, +0.000020f}, + {-0.359514f, -0.071785f, -0.052488f, -0.000127f, +0.000038f}, + {-0.004461f, +0.153778f, +0.000819f, +0.000092f, +0.000168f}, + {-0.150780f, -0.016846f, -0.022402f, -0.000246f, +0.000118f} + }, + { + {-0.030564f, -0.529872f, -0.003428f, +0.000214f, -0.000000f}, + {-0.017715f, -0.598148f, -0.005426f, +0.000313f, +0.000115f}, + {+0.077791f, +0.029195f, +0.012192f, +0.001184f, -0.000065f}, + {-0.001917f, -0.241534f, -0.000982f, +0.000017f, -0.000059f} + }, + { + {+0.325748f, +0.016029f, +0.047602f, -0.000149f, -0.000021f}, + {+0.356902f, -0.024523f, +0.052188f, +0.000031f, -0.000071f}, + {-0.031837f, -0.135684f, -0.003925f, +0.000518f, -0.000157f}, + {+0.134040f, -0.031563f, +0.022612f, +0.000523f, -0.000105f} + }, + { + {-0.013284f, +0.534819f, -0.003031f, -0.000141f, +0.000009f}, + {-0.041065f, +0.588511f, -0.002930f, -0.000807f, -0.000127f}, + {-0.057814f, -0.095156f, -0.013622f, +0.000710f, +0.000141f}, + {-0.013462f, +0.193769f, -0.004638f, +0.001465f, +0.000106f} + }, + { + {-0.323552f, +0.059375f, -0.047359f, +0.000017f, +0.000018f}, + {-0.347235f, +0.120486f, -0.050411f, -0.000521f, +0.000120f}, + {+0.056648f, +0.076781f, +0.002619f, -0.000739f, +0.000101f}, + {-0.118370f, +0.031720f, -0.024225f, -0.000048f, +0.000065f} + } +}; + +const float rightHRIRReal_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]= +{ + { + {+0.001139f, +0.701381f, +0.088362f, +0.001507f, +0.000002f}, + {-0.000414f, -0.262095f, +0.237214f, +0.003224f, -0.000036f}, + {+0.002081f, +0.073269f, +0.016442f, -0.002305f, -0.000016f}, + {+0.003374f, +0.067272f, -0.027345f, -0.000156f, +0.000027f} + }, + { + {-0.006858f, +0.573976f, -0.025590f, -0.002173f, -0.000001f}, + {+0.018683f, -0.673324f, -0.155049f, -0.004529f, +0.000042f}, + {-0.004167f, -0.005579f, -0.043222f, +0.004198f, +0.000026f}, + {-0.007696f, +0.026588f, -0.047141f, +0.000930f, -0.000031f} + }, + { + {+0.022690f, +0.504423f, -0.025668f, -0.000505f, -0.000002f}, + {-0.098922f, -0.785742f, -0.002391f, -0.001725f, +0.000029f}, + {+0.001996f, -0.028688f, -0.031830f, -0.002187f, +0.000003f}, + {+0.012563f, -0.012620f, -0.033386f, -0.001639f, -0.000022f} + }, + { + {-0.068470f, +0.403356f, +0.003719f, +0.002403f, +0.000001f}, + {+0.238766f, -0.395418f, -0.032160f, +0.006283f, -0.000045f}, + {-0.003715f, -0.000119f, +0.009760f, -0.000148f, -0.000031f}, + {-0.028559f, -0.040197f, +0.002155f, +0.000892f, +0.000033f} + }, + { + {+0.145134f, +0.119557f, +0.007639f, -0.000923f, +0.000003f}, + {-0.294065f, +0.334693f, +0.019103f, -0.002511f, -0.000020f}, + {+0.020226f, -0.024338f, +0.012605f, +0.001278f, +0.000012f}, + {+0.043958f, -0.145428f, +0.013697f, +0.000566f, +0.000018f} + }, + { + {-0.153301f, -0.308264f, -0.003171f, -0.001265f, -0.000001f}, + {+0.095935f, +0.863498f, +0.010369f, -0.003299f, +0.000045f}, + {-0.032438f, -0.100491f, +0.003144f, -0.001769f, +0.000029f}, + {-0.013113f, -0.237010f, +0.000894f, -0.000875f, -0.000033f} + }, + { + {-0.012428f, -0.509031f, -0.004688f, +0.000988f, -0.000003f}, + {+0.244664f, +0.595158f, +0.023888f, +0.002491f, +0.000012f}, + {+0.002609f, -0.144907f, -0.010043f, +0.000781f, -0.000027f}, + {-0.074154f, -0.145409f, -0.008757f, -0.000058f, -0.000014f} + }, + { + {+0.212788f, -0.155514f, +0.023333f, +0.000561f, +0.000002f}, + {-0.330585f, -0.291160f, -0.047010f, +0.002016f, -0.000043f}, + {+0.050155f, -0.068056f, -0.001580f, +0.001116f, -0.000021f}, + {+0.122861f, +0.153186f, +0.009329f, +0.000801f, +0.000032f} + }, + { + {-0.148866f, +0.399380f, -0.016077f, -0.000584f, +0.000004f}, + {-0.007222f, -0.769639f, +0.001057f, -0.002043f, -0.000007f}, + {-0.045137f, +0.068695f, +0.001800f, -0.000989f, +0.000039f}, + {-0.030243f, +0.388427f, -0.005358f, -0.000487f, +0.000012f} + }, + { + {-0.148858f, +0.389050f, -0.019934f, -0.000504f, -0.000003f}, + {+0.349211f, -0.214703f, +0.051501f, -0.001478f, +0.000039f}, + {-0.029971f, +0.074752f, -0.006844f, -0.000679f, +0.000009f}, + {-0.127591f, +0.245277f, -0.008622f, -0.000243f, -0.000032f} + }, + { + {+0.239012f, -0.214946f, +0.031611f, +0.000498f, -0.000004f}, + {-0.196316f, +0.613847f, -0.027133f, +0.001726f, +0.000004f}, + {+0.059322f, -0.077618f, +0.010338f, +0.000544f, -0.000046f}, + {+0.142102f, -0.158560f, +0.013819f, +0.000336f, -0.000011f} + }, + { + {+0.056721f, -0.491541f, +0.006821f, +0.000413f, +0.000004f}, + {-0.248916f, +0.524024f, -0.041690f, +0.001135f, -0.000035f}, + {+0.029432f, -0.129169f, -0.000386f, +0.000757f, +0.000007f}, + {+0.025409f, -0.327769f, +0.004549f, +0.000075f, +0.000034f} + }, + { + {-0.277481f, +0.028032f, -0.037920f, -0.000438f, +0.000003f}, + {+0.308141f, -0.332951f, +0.045686f, -0.001496f, -0.000003f}, + {-0.108659f, +0.087169f, -0.015132f, -0.000418f, +0.000046f}, + {-0.144191f, -0.063507f, -0.018317f, -0.000173f, +0.000009f} + }, + { + {+0.037467f, +0.509783f, +0.006165f, -0.000331f, -0.000005f}, + {+0.118379f, -0.623008f, +0.023288f, -0.000858f, +0.000032f}, + {+0.020828f, +0.293771f, +0.009322f, -0.000570f, -0.000020f}, + {+0.044708f, +0.223468f, +0.005411f, -0.000025f, -0.000036f} + }, + { + {+0.276681f, +0.136508f, +0.039053f, +0.000399f, -0.000002f}, + {-0.342800f, +0.086499f, -0.051427f, +0.001312f, +0.000004f}, + {+0.141529f, +0.115364f, +0.013240f, +0.000205f, -0.000040f}, + {+0.110040f, +0.119206f, +0.016186f, +0.000083f, -0.000006f} + }, + { + {-0.117783f, -0.468960f, -0.017913f, +0.000250f, +0.000005f}, + {-0.005671f, +0.604318f, -0.007143f, +0.000660f, -0.000031f}, + {-0.130049f, -0.297226f, -0.017966f, +0.000439f, +0.000030f}, + {-0.077788f, -0.170577f, -0.011766f, -0.000035f, +0.000037f} + }, + { + {-0.252966f, -0.256306f, -0.036605f, -0.000365f, +0.000002f}, + {+0.337478f, +0.074281f, +0.052432f, -0.001197f, -0.000005f}, + {-0.072906f, -0.386255f, -0.005369f, -0.000119f, +0.000033f}, + {-0.075520f, -0.174614f, -0.010607f, -0.000037f, +0.000003f} + }, + { + {+0.180447f, +0.410401f, +0.027706f, -0.000193f, -0.000005f}, + {-0.079743f, -0.570802f, -0.007521f, -0.000528f, +0.000032f}, + {+0.189755f, +0.008151f, +0.021117f, -0.000340f, -0.000036f}, + {+0.097648f, +0.090203f, +0.013931f, +0.000113f, -0.000038f} + }, + { + {+0.221150f, +0.344584f, +0.031954f, +0.000342f, -0.000001f}, + {-0.324392f, -0.195009f, -0.049761f, +0.001141f, +0.000005f}, + {-0.055564f, +0.372598f, -0.003229f, +0.000147f, -0.000026f}, + {+0.029197f, +0.196512f, +0.004268f, -0.000027f, +0.000001f} + }, + { + {-0.234543f, -0.356749f, -0.036109f, +0.000161f, +0.000005f}, + {+0.158828f, +0.551737f, +0.020300f, +0.000447f, -0.000034f}, + {-0.128996f, +0.253163f, -0.019502f, +0.000205f, +0.000038f}, + {-0.086326f, +0.024093f, -0.010653f, -0.000104f, +0.000038f} + }, + { + {-0.180736f, -0.438688f, -0.025011f, -0.000324f, +0.000001f}, + {+0.301948f, +0.334020f, +0.045105f, -0.001128f, -0.000004f}, + {+0.108851f, -0.109590f, +0.011684f, +0.000065f, +0.000022f}, + {+0.007794f, -0.114979f, -0.002557f, +0.000055f, -0.000004f} + }, + { + {+0.283619f, +0.272902f, +0.041849f, -0.000148f, -0.000005f}, + {-0.241474f, -0.503493f, -0.031717f, -0.000352f, +0.000035f}, + {+0.045390f, -0.198917f, +0.011556f, -0.000593f, -0.000041f}, + {+0.041019f, -0.061071f, +0.008824f, +0.000017f, -0.000039f} + }, + { + {+0.123506f, +0.516214f, +0.017365f, +0.000301f, -0.000001f}, + {-0.256327f, -0.482583f, -0.037542f, +0.001057f, +0.000002f}, + {-0.083839f, +0.008074f, -0.016916f, +0.000282f, -0.000018f}, + {+0.003422f, -0.003727f, +0.003177f, -0.000000f, +0.000006f} + }, + { + {-0.313797f, -0.154486f, -0.046391f, +0.000147f, +0.000005f}, + {+0.319981f, +0.404727f, +0.042569f, +0.000317f, -0.000036f}, + {-0.021107f, +0.110660f, -0.004978f, +0.000416f, +0.000047f}, + {-0.008153f, -0.022716f, -0.004670f, +0.000045f, +0.000040f} + }, + { + {-0.061089f, -0.539358f, -0.009248f, -0.000286f, +0.000001f}, + {+0.177073f, +0.627220f, +0.025260f, -0.001022f, -0.000001f}, + {+0.071424f, -0.032340f, +0.013321f, -0.000179f, +0.000014f}, + {-0.053388f, +0.046353f, -0.007111f, -0.000176f, -0.000010f} + }, + { + {+0.324287f, +0.053524f, +0.049068f, -0.000116f, -0.000006f}, + {-0.369344f, -0.211212f, -0.048775f, -0.000225f, +0.000037f}, + {+0.008002f, -0.135643f, +0.001207f, -0.000329f, -0.000053f}, + {+0.026056f, +0.169088f, +0.008645f, +0.000250f, -0.000042f} + }, + { + {+0.005776f, +0.541579f, +0.000581f, +0.000240f, -0.000000f}, + {-0.077934f, -0.656141f, -0.014760f, +0.000940f, +0.000001f}, + {-0.071537f, -0.021095f, -0.007901f, +0.000019f, -0.000006f}, + {+0.095328f, +0.067372f, +0.010448f, -0.000101f, +0.000015f} + }, + { + {-0.328162f, +0.029093f, -0.049230f, +0.000107f, +0.000007f}, + {+0.369662f, +0.037217f, +0.051825f, +0.000167f, -0.000038f}, + {+0.023527f, +0.120022f, -0.000102f, +0.000278f, +0.000058f}, + {-0.090284f, -0.212186f, -0.013169f, -0.000132f, +0.000043f} + }, + { + {+0.048978f, -0.548479f, +0.007485f, -0.000233f, -0.000001f}, + {+0.003228f, +0.602938f, +0.001617f, -0.000911f, -0.000001f}, + {+0.040104f, +0.095644f, +0.005888f, -0.000009f, -0.000005f}, + {-0.081710f, -0.220378f, -0.013048f, -0.000016f, -0.000021f} + }, + { + {+0.324250f, -0.126479f, +0.048291f, -0.000066f, -0.000007f}, + {-0.357292f, +0.046143f, -0.050921f, -0.000098f, +0.000041f}, + {-0.027149f, -0.003860f, +0.000272f, -0.000124f, -0.000060f}, + {+0.141329f, +0.121139f, +0.018219f, +0.000314f, -0.000043f} + }, + { + {-0.104734f, +0.530347f, -0.015582f, +0.000224f, +0.000002f}, + {+0.054628f, -0.590170f, +0.008056f, +0.000909f, -0.000000f}, + {-0.005584f, -0.032979f, -0.004816f, +0.000029f, +0.000015f}, + {+0.037866f, +0.274890f, +0.006759f, -0.000046f, +0.000027f} + }, + { + {-0.308177f, +0.218644f, -0.045991f, +0.000043f, +0.000007f}, + {+0.346201f, -0.142031f, +0.048180f, +0.000046f, -0.000045f}, + {-0.007019f, -0.030662f, -0.000480f, +0.000081f, +0.000058f}, + {-0.162861f, -0.035781f, -0.023778f, -0.000324f, +0.000041f} + }, + { + {+0.155747f, -0.491433f, +0.022764f, -0.000231f, -0.000003f}, + {-0.112390f, +0.563014f, -0.016093f, -0.000905f, +0.000002f}, + {+0.014636f, -0.060316f, +0.003797f, -0.000151f, -0.000023f}, + {+0.007188f, -0.297579f, +0.001361f, +0.000018f, -0.000032f} + }, + { + {+0.282333f, -0.296973f, +0.042631f, -0.000038f, -0.000007f}, + {-0.325943f, +0.233378f, -0.045604f, -0.000052f, +0.000049f}, + {+0.025539f, -0.043016f, +0.004050f, -0.000129f, -0.000057f}, + {+0.170600f, -0.047495f, +0.024487f, +0.000283f, -0.000040f} + }, + { + {-0.198966f, +0.440444f, -0.029339f, +0.000240f, +0.000003f}, + {+0.163937f, -0.519986f, +0.024102f, +0.000910f, -0.000006f}, + {-0.041643f, +0.059924f, -0.008056f, +0.000252f, +0.000028f}, + {-0.058279f, +0.303786f, -0.008000f, +0.000033f, +0.000037f} + }, + { + {-0.251233f, +0.360645f, -0.037855f, +0.000048f, +0.000007f}, + {+0.301209f, -0.307267f, +0.042244f, +0.000061f, -0.000052f}, + {-0.017898f, +0.097992f, -0.002832f, +0.000217f, +0.000060f}, + {-0.154977f, +0.157077f, -0.021873f, -0.000264f, +0.000040f} + }, + { + {+0.235922f, -0.385212f, +0.034692f, -0.000230f, -0.000003f}, + {-0.211902f, +0.482439f, -0.031812f, -0.000875f, +0.000009f}, + {+0.062526f, -0.022786f, +0.009165f, -0.000192f, -0.000037f}, + {+0.100642f, -0.232077f, +0.012026f, +0.000003f, -0.000044f} + }, + { + {+0.215580f, -0.416556f, +0.032649f, -0.000062f, -0.000008f}, + {-0.273278f, +0.387323f, -0.037577f, -0.000065f, +0.000055f}, + {-0.005939f, -0.125998f, +0.001105f, -0.000285f, -0.000067f}, + {+0.119018f, -0.200389f, +0.019595f, +0.000282f, -0.000042f} + }, + { + {-0.266556f, +0.321627f, -0.039270f, +0.000204f, +0.000005f}, + {+0.262381f, -0.436199f, +0.039035f, +0.000825f, -0.000011f}, + {-0.067202f, -0.031111f, -0.011093f, +0.000033f, +0.000054f}, + {-0.114634f, +0.160892f, -0.016486f, -0.000093f, +0.000057f} + }, + { + {-0.175988f, +0.460735f, -0.026828f, +0.000048f, +0.000010f}, + {+0.233172f, -0.480676f, +0.031122f, +0.000031f, -0.000060f}, + {+0.031548f, +0.122002f, +0.003267f, +0.000158f, +0.000072f}, + {-0.094567f, +0.192621f, -0.015001f, -0.000394f, +0.000041f} + }, + { + {+0.289864f, -0.252340f, +0.042717f, -0.000164f, -0.000008f}, + {-0.309890f, +0.352443f, -0.045041f, -0.000820f, +0.000012f}, + {+0.059594f, +0.080834f, +0.009319f, +0.000095f, -0.000085f}, + {+0.123492f, -0.142957f, +0.017979f, +0.000125f, -0.000076f} + }, + { + {+0.134575f, -0.490695f, +0.020657f, -0.000008f, -0.000011f}, + {-0.176248f, +0.555316f, -0.023664f, +0.000054f, +0.000070f}, + {-0.054408f, -0.093413f, -0.005141f, +0.000202f, -0.000064f}, + {+0.078026f, -0.213530f, +0.012432f, +0.000637f, -0.000030f} + }, + { + {-0.306423f, +0.183981f, -0.045149f, +0.000152f, +0.000012f}, + {+0.341487f, -0.240296f, +0.050133f, +0.000895f, -0.000016f}, + {-0.041086f, -0.112975f, -0.007981f, +0.000040f, +0.000125f}, + {-0.138721f, +0.120523f, -0.020161f, +0.000004f, +0.000099f} + }, + { + {-0.092719f, +0.511558f, -0.014604f, -0.000050f, +0.000009f}, + {+0.112835f, -0.589997f, +0.014321f, -0.000122f, -0.000086f}, + {+0.068469f, +0.059054f, +0.008838f, -0.000612f, +0.000032f}, + {-0.054382f, +0.253255f, -0.007586f, -0.000904f, +0.000005f} + }, + { + {+0.317269f, -0.115684f, +0.046850f, -0.000208f, -0.000018f}, + {-0.356933f, +0.130812f, -0.052103f, -0.001044f, +0.000027f}, + {+0.019507f, +0.139642f, +0.002950f, -0.000683f, -0.000159f}, + {+0.152449f, -0.061207f, +0.020045f, -0.000364f, -0.000115f} + }, + { + {+0.051096f, -0.523693f, +0.008474f, +0.000105f, -0.000004f}, + {-0.049349f, +0.600329f, -0.005605f, +0.000022f, +0.000106f}, + {-0.079985f, -0.011392f, -0.007657f, +0.000780f, +0.000028f}, + {+0.017397f, -0.267260f, +0.004496f, +0.000957f, +0.000035f} + }, + { + {-0.323905f, +0.049833f, -0.047865f, +0.000329f, +0.000021f}, + {+0.358893f, -0.027640f, +0.053272f, +0.001258f, -0.000053f}, + {+0.015053f, -0.158953f, -0.000193f, +0.001713f, +0.000167f}, + {-0.144359f, -0.018540f, -0.020249f, +0.000901f, +0.000114f} + }, + { + {-0.008373f, +0.533499f, -0.002225f, -0.000084f, -0.000004f}, + {-0.010355f, -0.593074f, -0.003536f, +0.000223f, -0.000122f}, + {+0.071969f, -0.070538f, +0.006817f, -0.000021f, -0.000104f}, + {+0.009075f, +0.217846f, -0.000438f, -0.000486f, -0.000083f} + }, + { + {+0.325536f, +0.023312f, +0.048108f, -0.000519f, -0.000020f}, + {-0.352731f, -0.066640f, -0.052836f, -0.001159f, +0.000094f}, + {-0.047485f, +0.116702f, -0.002224f, -0.002868f, -0.000134f}, + {+0.125804f, +0.038871f, +0.018687f, -0.001207f, -0.000088f} + }, + { + {-0.036324f, -0.531073f, -0.003989f, -0.000084f, +0.000013f}, + {+0.069318f, +0.580051f, +0.011694f, -0.000718f, +0.000126f}, + {-0.044835f, +0.120121f, -0.003388f, -0.003194f, +0.000173f}, + {-0.016464f, -0.181504f, -0.002802f, -0.001577f, +0.000124f} + } +}; + +const float rightHRIRImag_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]= +{ + { + {-0.075561f, -0.068517f, +0.140821f, -0.000006f, -0.000001f}, + {+0.113351f, -0.312423f, +0.154809f, -0.003274f, +0.000040f}, + {-0.002167f, -0.037131f, +0.050206f, -0.009097f, +0.000022f}, + {-0.008959f, -0.001538f, +0.017300f, -0.005827f, -0.000030f} + }, + { + {+0.088726f, -0.056723f, -0.005193f, -0.002691f, -0.000002f}, + {-0.119871f, -0.624601f, +0.192908f, -0.005870f, +0.000033f}, + {+0.004166f, -0.045506f, +0.052787f, -0.000546f, +0.000010f}, + {+0.009543f, +0.003765f, +0.008451f, +0.003327f, -0.000025f} + }, + { + {-0.102143f, +0.113338f, +0.041532f, +0.003556f, +0.000001f}, + {+0.144265f, -0.722990f, -0.063761f, +0.009098f, -0.000044f}, + {-0.005127f, +0.024047f, -0.013948f, +0.005687f, -0.000029f}, + {-0.011405f, +0.075487f, -0.028027f, -0.000790f, +0.000032f} + }, + { + {+0.102256f, +0.332031f, -0.028467f, -0.000969f, +0.000002f}, + {-0.105041f, -0.913298f, -0.007994f, -0.001561f, -0.000024f}, + {+0.007491f, +0.060974f, -0.023635f, -0.001357f, +0.000004f}, + {+0.005542f, +0.127425f, -0.011646f, +0.000496f, +0.000020f} + }, + { + {-0.044065f, +0.500826f, -0.002410f, -0.001370f, -0.000001f}, + {-0.092604f, -0.883373f, -0.024383f, -0.004737f, +0.000046f}, + {-0.004561f, +0.083819f, -0.019790f, -0.002951f, +0.000031f}, + {+0.027047f, +0.113206f, -0.016192f, -0.001506f, -0.000033f} + }, + { + {-0.101331f, +0.396216f, -0.004920f, +0.000653f, -0.000003f}, + {+0.315234f, -0.274804f, +0.039014f, +0.001908f, +0.000016f}, + {-0.020480f, +0.081227f, +0.012774f, +0.001524f, -0.000020f}, + {-0.075525f, -0.016066f, +0.005310f, +0.001230f, -0.000016f} + }, + { + {+0.205124f, -0.066361f, +0.022115f, +0.000986f, +0.000002f}, + {-0.252202f, +0.571430f, -0.010069f, +0.002911f, -0.000045f}, + {+0.049641f, -0.008053f, +0.006538f, +0.000795f, -0.000026f}, + {+0.069872f, -0.229431f, +0.016281f, +0.000270f, +0.000032f} + }, + { + {-0.075366f, -0.478001f, -0.007669f, -0.000701f, +0.000003f}, + {-0.124742f, +0.753308f, -0.025384f, -0.001863f, -0.000009f}, + {-0.028983f, -0.121665f, -0.007415f, -0.000267f, +0.000034f}, + {+0.036071f, -0.292663f, -0.003455f, -0.000819f, +0.000013f} + }, + { + {-0.186385f, -0.294120f, -0.028378f, -0.000604f, -0.000002f}, + {+0.364681f, -0.008978f, +0.038744f, -0.001757f, +0.000041f}, + {-0.036441f, -0.104767f, -0.010428f, -0.000824f, +0.000015f}, + {-0.145432f, -0.035047f, -0.010123f, +0.000064f, -0.000032f} + }, + { + {+0.200759f, +0.301898f, +0.028191f, +0.000609f, -0.000004f}, + {-0.106790f, -0.737079f, -0.007371f, +0.001552f, +0.000005f}, + {+0.050065f, +0.035831f, +0.013930f, +0.000498f, -0.000043f}, + {+0.098812f, +0.316605f, +0.005024f, +0.000388f, -0.000012f} + }, + { + {+0.102918f, +0.447646f, +0.016687f, +0.000392f, +0.000003f}, + {-0.311637f, -0.412036f, -0.037367f, +0.001208f, -0.000037f}, + {+0.029150f, +0.073712f, +0.005390f, +0.000373f, -0.000001f}, + {+0.078159f, +0.331302f, +0.015024f, +0.000096f, +0.000033f} + }, + { + {-0.263157f, -0.117240f, -0.038079f, -0.000498f, +0.000003f}, + {+0.266046f, +0.483755f, +0.030591f, -0.001325f, -0.000003f}, + {-0.079262f, -0.094840f, -0.015385f, -0.000509f, +0.000047f}, + {-0.153547f, -0.029982f, -0.019729f, -0.000450f, +0.000010f} + }, + { + {-0.007705f, -0.507985f, -0.003383f, -0.000318f, -0.000004f}, + {+0.186453f, +0.597236f, +0.023398f, -0.000963f, +0.000033f}, + {-0.013117f, -0.205170f, +0.001765f, -0.000228f, -0.000014f}, + {+0.017314f, -0.287283f, -0.002959f, -0.000038f, -0.000035f} + }, + { + {+0.280521f, -0.062761f, +0.041073f, +0.000449f, -0.000003f}, + {-0.334574f, -0.214167f, -0.043236f, +0.001215f, +0.000003f}, + {+0.133038f, +0.011844f, +0.017286f, +0.000551f, -0.000044f}, + {+0.127101f, -0.107475f, +0.022000f, +0.000440f, -0.000008f} + }, + { + {-0.080859f, +0.491833f, -0.009289f, +0.000270f, +0.000005f}, + {-0.060956f, -0.629530f, -0.006506f, +0.000817f, -0.000032f}, + {-0.073930f, +0.331264f, -0.010959f, +0.000254f, +0.000026f}, + {-0.063542f, +0.194964f, -0.009265f, +0.000065f, +0.000037f} + }, + { + {-0.266097f, +0.204693f, -0.039752f, -0.000407f, +0.000002f}, + {+0.343709f, +0.003857f, +0.048079f, -0.001153f, -0.000004f}, + {-0.120675f, +0.268205f, -0.012518f, -0.000600f, +0.000037f}, + {-0.094236f, +0.151237f, -0.013332f, -0.000477f, +0.000005f} + }, + { + {+0.151764f, -0.437914f, +0.020131f, -0.000242f, -0.000005f}, + {-0.036841f, +0.588874f, -0.009139f, -0.000664f, +0.000032f}, + {+0.174802f, -0.176925f, +0.017691f, -0.000280f, -0.000033f}, + {+0.090868f, -0.134423f, +0.011793f, -0.000076f, -0.000038f} + }, + { + {+0.237215f, -0.304481f, +0.035938f, +0.000373f, -0.000001f}, + {-0.332318f, +0.127083f, -0.047424f, +0.001052f, +0.000005f}, + {+0.006779f, -0.431468f, +0.002691f, +0.000532f, -0.000029f}, + {+0.053552f, -0.194194f, +0.007469f, +0.000494f, -0.000001f} + }, + { + {-0.208558f, +0.382505f, -0.029564f, +0.000207f, +0.000005f}, + {+0.116623f, -0.564310f, +0.021854f, +0.000528f, -0.000033f}, + {-0.172351f, -0.159278f, -0.018428f, +0.000360f, +0.000037f}, + {-0.097811f, +0.036173f, -0.011033f, +0.000077f, +0.000038f} + }, + { + {-0.202490f, +0.392017f, -0.029907f, -0.000333f, +0.000001f}, + {+0.316139f, -0.253384f, +0.044455f, -0.000945f, -0.000004f}, + {+0.097332f, +0.245644f, +0.004917f, -0.000556f, +0.000023f}, + {-0.006532f, +0.174857f, -0.002876f, -0.000550f, -0.000002f} + }, + { + {+0.261135f, -0.320885f, +0.037011f, -0.000181f, -0.000005f}, + {-0.197969f, +0.536807f, -0.033309f, -0.000398f, +0.000034f}, + {+0.081783f, +0.256891f, +0.014473f, -0.000242f, -0.000040f}, + {+0.065893f, +0.064104f, +0.007328f, +0.000082f, -0.000039f} + }, + { + {+0.153724f, -0.486020f, +0.022676f, +0.000325f, -0.000001f}, + {-0.283217f, +0.402227f, -0.039413f, +0.000851f, +0.000003f}, + {-0.100031f, -0.031468f, -0.013972f, +0.000537f, -0.000020f}, + {-0.008541f, -0.048318f, +0.000499f, +0.000444f, +0.000005f} + }, + { + {-0.302384f, +0.214214f, -0.042285f, +0.000129f, +0.000005f}, + {+0.280104f, -0.464455f, +0.045587f, +0.000282f, -0.000035f}, + {-0.027898f, -0.140901f, -0.007378f, +0.000003f, +0.000044f}, + {-0.020559f, -0.029800f, -0.003256f, -0.000145f, +0.000040f} + }, + { + {-0.091526f, +0.536382f, -0.014577f, -0.000305f, +0.000001f}, + {+0.221871f, -0.553999f, +0.029769f, -0.000764f, -0.000002f}, + {+0.073977f, +0.023109f, +0.011231f, -0.000304f, +0.000016f}, + {-0.025756f, -0.040011f, -0.004558f, -0.000368f, -0.000008f} + }, + { + {+0.321259f, -0.098962f, +0.045846f, -0.000108f, -0.000006f}, + {-0.348987f, +0.318713f, -0.051856f, -0.000239f, +0.000036f}, + {+0.017761f, +0.116280f, -0.000624f, -0.000200f, -0.000050f}, + {+0.009582f, -0.098230f, +0.005306f, +0.000144f, -0.000041f} + }, + { + {+0.032445f, -0.541906f, +0.005704f, +0.000315f, -0.000001f}, + {-0.127167f, +0.654253f, -0.018462f, +0.000765f, +0.000001f}, + {-0.073982f, -0.022018f, -0.008993f, +0.000517f, -0.000010f}, + {+0.079904f, +0.007744f, +0.010527f, +0.000350f, +0.000012f} + }, + { + {-0.327237f, +0.011995f, -0.047308f, +0.000087f, +0.000007f}, + {+0.372361f, -0.111338f, +0.055931f, +0.000147f, -0.000037f}, + {+0.006939f, -0.148510f, +0.003422f, +0.000212f, +0.000056f}, + {-0.056276f, +0.216052f, -0.007073f, -0.000104f, +0.000043f} + }, + { + {+0.021322f, +0.548401f, +0.003440f, -0.000317f, -0.000000f}, + {+0.036763f, -0.621232f, +0.007074f, -0.000670f, -0.000001f}, + {+0.060591f, -0.069431f, +0.006623f, -0.000636f, +0.000001f}, + {-0.095686f, +0.156364f, -0.008769f, -0.000353f, -0.000018f} + }, + { + {+0.328267f, +0.077867f, +0.046857f, -0.000082f, -0.000007f}, + {-0.361014f, -0.007604f, -0.057275f, -0.000179f, +0.000039f}, + {-0.031203f, +0.067398f, -0.002430f, -0.000232f, -0.000059f}, + {+0.120666f, -0.172404f, +0.015941f, +0.000046f, -0.000043f} + }, + { + {-0.077320f, -0.544064f, -0.010931f, +0.000301f, +0.000001f}, + {+0.025615f, +0.586847f, +0.004514f, +0.000654f, +0.000000f}, + {-0.019503f, +0.080767f, -0.004247f, +0.000554f, +0.000010f}, + {+0.060877f, -0.260909f, +0.007725f, +0.000342f, +0.000024f} + }, + { + {-0.318158f, -0.173881f, -0.045614f, +0.000092f, +0.000007f}, + {+0.350970f, +0.090433f, +0.053929f, +0.000134f, -0.000043f}, + {+0.011187f, +0.032303f, +0.001760f, +0.000373f, +0.000059f}, + {-0.154877f, +0.074143f, -0.023096f, -0.000037f, +0.000042f} + }, + { + {+0.131227f, +0.515417f, +0.018725f, -0.000280f, -0.000002f}, + {-0.083743f, -0.574149f, -0.012466f, -0.000576f, +0.000001f}, + {+0.005315f, +0.026215f, +0.002698f, -0.000477f, -0.000019f}, + {-0.015816f, +0.287949f, -0.001995f, -0.000235f, -0.000030f} + }, + { + {+0.296693f, +0.260934f, +0.042541f, -0.000091f, -0.000007f}, + {-0.335556f, -0.189122f, -0.052026f, -0.000094f, +0.000047f}, + {+0.020995f, +0.006183f, -0.000036f, -0.000396f, -0.000057f}, + {+0.168822f, +0.001307f, +0.024594f, -0.000017f, -0.000040f} + }, + { + {-0.178422f, -0.467768f, -0.025765f, +0.000259f, +0.000003f}, + {+0.138949f, +0.536439f, +0.020095f, +0.000522f, -0.000004f}, + {-0.028752f, -0.066596f, -0.002138f, +0.000378f, +0.000026f}, + {-0.031690f, -0.308623f, -0.005893f, +0.000213f, +0.000034f} + }, + { + {-0.267781f, -0.330036f, -0.038496f, +0.000071f, +0.000007f}, + {+0.312281f, +0.270728f, +0.048992f, +0.000017f, -0.000050f}, + {-0.024788f, -0.069674f, -0.002302f, +0.000335f, +0.000057f}, + {-0.167013f, -0.101727f, -0.022607f, -0.000026f, +0.000040f} + }, + { + {+0.218246f, +0.415608f, +0.031895f, -0.000250f, -0.000003f}, + {-0.187767f, -0.495269f, -0.027755f, -0.000490f, +0.000007f}, + {+0.054038f, +0.052249f, +0.006077f, -0.000385f, -0.000032f}, + {+0.082423f, +0.279154f, +0.011379f, -0.000228f, -0.000040f} + }, + { + {+0.234462f, +0.390517f, +0.033506f, -0.000040f, -0.000008f}, + {-0.286682f, -0.344540f, -0.044785f, +0.000053f, +0.000053f}, + {+0.007799f, +0.121924f, -0.000254f, -0.000274f, -0.000063f}, + {+0.137635f, +0.191812f, +0.020083f, +0.000078f, -0.000041f} + }, + { + {-0.252188f, -0.355561f, -0.036817f, +0.000259f, +0.000004f}, + {+0.236813f, +0.457491f, +0.035054f, +0.000497f, -0.000010f}, + {-0.067322f, +0.004912f, -0.008444f, +0.000591f, +0.000044f}, + {-0.110001f, -0.188497f, -0.016071f, +0.000306f, +0.000049f} + }, + { + {-0.196649f, -0.440315f, -0.028013f, +0.000028f, +0.000009f}, + {+0.254039f, +0.432758f, +0.039405f, -0.000094f, -0.000057f}, + {+0.018169f, -0.125990f, +0.003787f, +0.000283f, +0.000070f}, + {-0.104872f, -0.193750f, -0.016320f, -0.000067f, +0.000042f} + }, + { + {+0.279232f, +0.288906f, +0.040649f, -0.000288f, -0.000006f}, + {-0.287453f, -0.396154f, -0.041796f, -0.000496f, +0.000012f}, + {+0.065516f, -0.051533f, +0.008251f, -0.000833f, -0.000068f}, + {+0.117846f, +0.150938f, +0.019317f, -0.000398f, -0.000066f} + }, + { + {+0.155838f, +0.477142f, +0.022236f, -0.000054f, -0.000011f}, + {-0.205090f, -0.523697f, -0.032347f, +0.000074f, +0.000064f}, + {-0.043133f, +0.115358f, -0.007458f, -0.000536f, -0.000071f}, + {+0.086685f, +0.200152f, +0.011885f, -0.000042f, -0.000037f} + }, + { + {-0.298969f, -0.220193f, -0.043767f, +0.000325f, +0.000010f}, + {+0.328142f, +0.292452f, +0.047271f, +0.000442f, -0.000014f}, + {-0.051610f, +0.100445f, -0.006535f, +0.000948f, +0.000105f}, + {-0.130003f, -0.132255f, -0.020754f, +0.000362f, +0.000088f} + }, + { + {-0.114168f, -0.502804f, -0.016020f, +0.000104f, +0.000010f}, + {+0.143455f, +0.576024f, +0.024058f, -0.000023f, -0.000077f}, + {+0.061115f, -0.073546f, +0.010498f, +0.000984f, +0.000052f}, + {-0.068233f, -0.228084f, -0.008576f, +0.000257f, +0.000020f} + }, + { + {+0.312611f, +0.151372f, +0.045798f, -0.000314f, -0.000015f}, + {-0.351200f, -0.182575f, -0.051390f, -0.000326f, +0.000020f}, + {+0.031920f, -0.116916f, +0.003818f, -0.000728f, -0.000144f}, + {+0.146596f, +0.100142f, +0.022461f, -0.000165f, -0.000108f} + }, + { + {+0.072361f, +0.518728f, +0.009942f, -0.000175f, -0.000007f}, + {-0.079531f, -0.601014f, -0.014699f, +0.000081f, +0.000095f}, + {-0.074110f, +0.046958f, -0.012342f, -0.001344f, -0.000005f}, + {+0.036969f, +0.268420f, +0.004301f, -0.000333f, +0.000013f} + }, + { + {-0.321149f, -0.084827f, -0.047210f, +0.000251f, +0.000020f}, + {+0.359514f, +0.071785f, +0.052488f, +0.000127f, -0.000038f}, + {-0.004461f, +0.153778f, +0.000819f, +0.000092f, +0.000168f}, + {-0.150780f, -0.016846f, -0.022402f, -0.000246f, +0.000118f} + }, + { + {-0.030564f, -0.529872f, -0.003428f, +0.000214f, -0.000000f}, + {+0.017715f, +0.598148f, +0.005426f, -0.000313f, -0.000115f}, + {+0.077791f, +0.029195f, +0.012192f, +0.001184f, -0.000065f}, + {-0.001917f, -0.241534f, -0.000982f, +0.000017f, -0.000059f} + }, + { + {+0.325748f, +0.016029f, +0.047602f, -0.000149f, -0.000021f}, + {-0.356902f, +0.024523f, -0.052188f, -0.000031f, +0.000071f}, + {-0.031837f, -0.135684f, -0.003925f, +0.000518f, -0.000157f}, + {+0.134040f, -0.031563f, +0.022612f, +0.000523f, -0.000105f} + }, + { + {-0.013284f, +0.534819f, -0.003031f, -0.000141f, +0.000009f}, + {+0.041065f, -0.588511f, +0.002930f, +0.000807f, +0.000127f}, + {-0.057814f, -0.095156f, -0.013622f, +0.000710f, +0.000141f}, + {-0.013462f, +0.193769f, -0.004638f, +0.001465f, +0.000106f} + }, + { + {-0.323552f, +0.059375f, -0.047359f, +0.000017f, +0.000018f}, + {+0.347235f, -0.120486f, +0.050411f, +0.000521f, -0.000120f}, + {+0.056648f, +0.076781f, +0.002619f, -0.000739f, +0.000101f}, + {-0.118370f, +0.031720f, -0.024225f, -0.000048f, +0.000065f} + } +}; + +#endif + const float FASTCONV_HRIR_latency_s = 0.000666667f; const float leftHRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]= { diff --git a/lib_rend/ivas_rom_binauralRenderer.h b/lib_rend/ivas_rom_binauralRenderer.h index 939f6ef78f..8d4a60d6d9 100644 --- a/lib_rend/ivas_rom_binauralRenderer.h +++ b/lib_rend/ivas_rom_binauralRenderer.h @@ -55,6 +55,10 @@ extern float rightHRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS] extern float rightHRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]; extern float FASTCONV_HOA3_latency_s; +#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +extern float FASTCONV_HOA2_latency_s; +extern float FASTCONV_FOA_latency_s; +#endif extern float hrtfShCoeffsRe[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; extern float hrtfShCoeffsIm[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index e82def5847..da6320d526 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -729,7 +729,18 @@ typedef struct ivas_hrtfs_fastconv_struct float leftHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][7]; float rightHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][7]; float rightHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][7]; - +#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS + float FASTCONV_HOA2_latency_s; + float leftHRIRReal_HOA2[BINAURAL_CONVBANDS][9][7]; + float leftHRIRImag_HOA2[BINAURAL_CONVBANDS][9][7]; + float rightHRIRReal_HOA2[BINAURAL_CONVBANDS][9][7]; + float rightHRIRImag_HOA2[BINAURAL_CONVBANDS][9][7]; + float FASTCONV_FOA_latency_s; + float leftHRIRReal_FOA[BINAURAL_CONVBANDS][4][7]; + float leftHRIRImag_FOA[BINAURAL_CONVBANDS][4][7]; + float rightHRIRReal_FOA[BINAURAL_CONVBANDS][4][7]; + float rightHRIRImag_FOA[BINAURAL_CONVBANDS][4][7]; +#endif float FASTCONV_BRIR_latency_s; float leftBRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS_MAX]; float leftBRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS_MAX]; diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index 7e97d8b164..d0999be43c 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -974,6 +974,31 @@ static ivas_error init_fastconv_HRTF_handle( set_zero( hHrtf->rightHRIRImag_HOA3[i][j], BINAURAL_NTAPS ); } } +#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS + hHrtf->FASTCONV_HOA2_latency_s = 0; + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < 9; j++ ) + { + set_zero( hHrtf->leftHRIRReal_HOA2[i][j], BINAURAL_NTAPS ); + set_zero( hHrtf->leftHRIRImag_HOA2[i][j], BINAURAL_NTAPS ); + set_zero( hHrtf->rightHRIRReal_HOA2[i][j], BINAURAL_NTAPS ); + set_zero( hHrtf->rightHRIRImag_HOA2[i][j], BINAURAL_NTAPS ); + } + } + hHrtf->FASTCONV_FOA_latency_s = 0; + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < 4; j++ ) + { + set_zero( hHrtf->leftHRIRReal_FOA[i][j], BINAURAL_NTAPS ); + set_zero( hHrtf->leftHRIRImag_FOA[i][j], BINAURAL_NTAPS ); + set_zero( hHrtf->rightHRIRReal_FOA[i][j], BINAURAL_NTAPS ); + set_zero( hHrtf->rightHRIRImag_FOA[i][j], BINAURAL_NTAPS ); + } + } +#endif + hHrtf->FASTCONV_BRIR_latency_s = 0; for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) -- GitLab From 62ea7e0c40512d74ddd485099d2332b15ea5be65 Mon Sep 17 00:00:00 2001 From: emerit Date: Fri, 14 Apr 2023 20:01:00 +0200 Subject: [PATCH 055/331] bugs fixs linked to BINAURAL_NTAPS --- lib_com/ivas_cnst.h | 4 ++++ lib_dec/ivas_binRenderer_internal.c | 23 ++++++++++++++++++++++ lib_rend/ivas_crend.c | 2 +- lib_rend/ivas_stat_rend.h | 30 +++++++++++++++++++++-------- 4 files changed, 50 insertions(+), 9 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 0b326ba8a5..064900e337 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1426,7 +1426,11 @@ typedef enum #define BINAURAL_MAXBANDS 60 /* Max number of bands */ #define BINAURAL_CONVBANDS 50 /* Bands upto which convolution is performed */ +#ifdef UPDATE_SBA_FILTER +#define BINAURAL_NTAPS 5 +#else #define BINAURAL_NTAPS 7 +#endif #define BINAURAL_NTAPS_MAX 96 #define HRTF_SH_ORDER 3 diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index a5ce96c585..e41e73d50e 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -183,7 +183,11 @@ static ivas_error ivas_binRenderer_convModuleOpen( } else { +#ifdef UPDATE_SBA_FILTER + hBinRenConvModule->numTaps = BINAURAL_NTAPS; +#else hBinRenConvModule->numTaps = 7; +#endif /* Use fixed order filtering */ bandIdx = 0; @@ -347,13 +351,16 @@ static ivas_error ivas_binRenderer_convModuleOpen( else { #ifdef UPDATE_SBA_FILTER +#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS if ( input_config == IVAS_REND_AUDIO_CONFIG_HOA3 ) { +#endif /* HOA3 filter coefficients */ hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftHRIRReal_HOA3[bandIdx][chIdx]; hBinRenConvModule->filterTapsLeftImag[bandIdx][chIdx] = hHrtf->leftHRIRImag_HOA3[bandIdx][chIdx]; hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightHRIRReal_HOA3[bandIdx][chIdx]; hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx] = hHrtf->rightHRIRImag_HOA3[bandIdx][chIdx]; +#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS } else if ( input_config == IVAS_REND_AUDIO_CONFIG_HOA2 ) { @@ -375,6 +382,7 @@ static ivas_error ivas_binRenderer_convModuleOpen( { return IVAS_ERR_INVALID_INPUT_FORMAT; } +#endif #else /* HOA3 filter coefficients */ hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftHRIRReal_HOA3[bandIdx][chIdx]; @@ -430,10 +438,18 @@ static ivas_error ivas_binaural_hrtf_open( { for ( j = 0; j < HRTF_LS_CHANNELS; j++ ) { +#ifdef UPDATE_SBA_FILTER + mvr2r( leftHRIRReal[i][j], HrtfFastConv->leftHRIRReal[i][j], BINAURAL_NTAPS ); + mvr2r( leftHRIRImag[i][j], HrtfFastConv->leftHRIRImag[i][j], BINAURAL_NTAPS ); + mvr2r( rightHRIRReal[i][j], HrtfFastConv->rightHRIRReal[i][j], BINAURAL_NTAPS ); + mvr2r( rightHRIRImag[i][j], HrtfFastConv->rightHRIRImag[i][j], BINAURAL_NTAPS ); +#else mvr2r( leftHRIRReal[i][j], HrtfFastConv->leftHRIRReal[i][j], 7 ); mvr2r( leftHRIRImag[i][j], HrtfFastConv->leftHRIRImag[i][j], 7 ); mvr2r( rightHRIRReal[i][j], HrtfFastConv->rightHRIRReal[i][j], 7 ); mvr2r( rightHRIRImag[i][j], HrtfFastConv->rightHRIRImag[i][j], 7 ); +#endif + mvr2r( leftBRIRReal[i][j], HrtfFastConv->leftBRIRReal[i][j], BINAURAL_NTAPS_MAX ); mvr2r( leftBRIRImag[i][j], HrtfFastConv->leftBRIRImag[i][j], BINAURAL_NTAPS_MAX ); @@ -443,10 +459,17 @@ static ivas_error ivas_binaural_hrtf_open( for ( j = 0; j < HRTF_SH_CHANNELS; j++ ) { +#ifdef UPDATE_SBA_FILTER + mvr2r( leftHRIRReal_HOA3[i][j], HrtfFastConv->leftHRIRReal_HOA3[i][j], BINAURAL_NTAPS ); + mvr2r( leftHRIRImag_HOA3[i][j], HrtfFastConv->leftHRIRImag_HOA3[i][j], BINAURAL_NTAPS ); + mvr2r( rightHRIRReal_HOA3[i][j], HrtfFastConv->rightHRIRReal_HOA3[i][j], BINAURAL_NTAPS ); + mvr2r( rightHRIRImag_HOA3[i][j], HrtfFastConv->rightHRIRImag_HOA3[i][j], BINAURAL_NTAPS ); +#else mvr2r( leftHRIRReal_HOA3[i][j], HrtfFastConv->leftHRIRReal_HOA3[i][j], 7 ); mvr2r( leftHRIRImag_HOA3[i][j], HrtfFastConv->leftHRIRImag_HOA3[i][j], 7 ); mvr2r( rightHRIRReal_HOA3[i][j], HrtfFastConv->rightHRIRReal_HOA3[i][j], 7 ); mvr2r( rightHRIRImag_HOA3[i][j], HrtfFastConv->rightHRIRImag_HOA3[i][j], 7 ); +#endif } } diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index faa64518ce..f4bee9b6d7 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -975,11 +975,11 @@ static ivas_error ivas_rend_initCrend( hHrtf->pOut_to_bin_diffuse_im[j] = hSetOfHRTF->hHRTF_hrir_foa->pOut_to_bin_diffuse_im[j]; } } -#endif else { return IVAS_ERROR( IVAS_ERR_INTERNAL, "Unsupported renderer type in Crend" ); } +#endif } #else diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index da6320d526..97b371b581 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -719,27 +719,41 @@ typedef struct ivas_hrtfs_crend_structure typedef struct ivas_hrtfs_fastconv_struct { float FASTCONV_HRIR_latency_s; +#ifdef UPDATE_SBA_FILTER + float leftHRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]; + float leftHRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]; + float rightHRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]; + float rightHRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]; +#else float leftHRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][7]; float leftHRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][7]; float rightHRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][7]; float rightHRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][7]; +#endif float FASTCONV_HOA3_latency_s; +#ifdef UPDATE_SBA_FILTER + float leftHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS]; + float leftHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS]; + float rightHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS]; + float rightHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS]; +#else float leftHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][7]; float leftHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][7]; float rightHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][7]; float rightHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][7]; +#endif #ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS float FASTCONV_HOA2_latency_s; - float leftHRIRReal_HOA2[BINAURAL_CONVBANDS][9][7]; - float leftHRIRImag_HOA2[BINAURAL_CONVBANDS][9][7]; - float rightHRIRReal_HOA2[BINAURAL_CONVBANDS][9][7]; - float rightHRIRImag_HOA2[BINAURAL_CONVBANDS][9][7]; + float leftHRIRReal_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]; + float leftHRIRImag_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]; + float rightHRIRReal_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]; + float rightHRIRImag_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]; float FASTCONV_FOA_latency_s; - float leftHRIRReal_FOA[BINAURAL_CONVBANDS][4][7]; - float leftHRIRImag_FOA[BINAURAL_CONVBANDS][4][7]; - float rightHRIRReal_FOA[BINAURAL_CONVBANDS][4][7]; - float rightHRIRImag_FOA[BINAURAL_CONVBANDS][4][7]; + float leftHRIRReal_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]; + float leftHRIRImag_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]; + float rightHRIRReal_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]; + float rightHRIRImag_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]; #endif float FASTCONV_BRIR_latency_s; float leftBRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS_MAX]; -- GitLab From d36fff344f0fa1a14da623c10aa96fefdddd70c8 Mon Sep 17 00:00:00 2001 From: emerit Date: Fri, 14 Apr 2023 21:28:11 +0200 Subject: [PATCH 056/331] bug fix --- lib_dec/ivas_binRenderer_internal.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index e41e73d50e..7fb11170f5 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -352,7 +352,7 @@ static ivas_error ivas_binRenderer_convModuleOpen( { #ifdef UPDATE_SBA_FILTER #ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS - if ( input_config == IVAS_REND_AUDIO_CONFIG_HOA3 ) + if ( input_config == AUDIO_CONFIG_HOA3 ) { #endif /* HOA3 filter coefficients */ @@ -362,7 +362,7 @@ static ivas_error ivas_binRenderer_convModuleOpen( hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx] = hHrtf->rightHRIRImag_HOA3[bandIdx][chIdx]; #ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS } - else if ( input_config == IVAS_REND_AUDIO_CONFIG_HOA2 ) + else if ( input_config == AUDIO_CONFIG_HOA2 ) { /* HOA3 filter coefficients */ hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftHRIRReal_HOA2[bandIdx][chIdx]; @@ -370,7 +370,7 @@ static ivas_error ivas_binRenderer_convModuleOpen( hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightHRIRReal_HOA2[bandIdx][chIdx]; hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx] = hHrtf->rightHRIRImag_HOA2[bandIdx][chIdx]; } - else if ( input_config == IVAS_REND_AUDIO_CONFIG_FOA ) + else if ( input_config == AUDIO_CONFIG_FOA ) { /* HOA3 filter coefficients */ hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftHRIRReal_FOA[bandIdx][chIdx]; -- GitLab From 75d9b99fe9ea309aa128b0f979c01513cd7ed1a3 Mon Sep 17 00:00:00 2001 From: emerit Date: Mon, 17 Apr 2023 11:43:03 +0200 Subject: [PATCH 057/331] update ivas binaural bin files --- ...onverter_readme.txt => tables_format_converter_readme.txt} | 2 +- .../binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin | 4 ++-- .../binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin | 4 ++-- .../binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) rename scripts/binauralRenderer_interface/Table_Format_Converter/{table_format_converter_readme.txt => tables_format_converter_readme.txt} (95%) diff --git a/scripts/binauralRenderer_interface/Table_Format_Converter/table_format_converter_readme.txt b/scripts/binauralRenderer_interface/Table_Format_Converter/tables_format_converter_readme.txt similarity index 95% rename from scripts/binauralRenderer_interface/Table_Format_Converter/table_format_converter_readme.txt rename to scripts/binauralRenderer_interface/Table_Format_Converter/tables_format_converter_readme.txt index dda6738a9a..8648ecb2e6 100644 --- a/scripts/binauralRenderer_interface/Table_Format_Converter/table_format_converter_readme.txt +++ b/scripts/binauralRenderer_interface/Table_Format_Converter/tables_format_converter_readme.txt @@ -57,4 +57,4 @@ Options : -input_td_file_name : Name of input td file (without extension .bin, default = 'hrfilter_model'). For example : -table_format_converter(.exe) -output_file_path './' -48 -input_td_file_path './../../../td_object_renderer/hrtf_data/Orange_53/' -input_td_file_name 'hrfilter_model_v002' \ No newline at end of file +tables_format_converter(.exe) -output_file_path './' -48 -input_td_file_path './../../../td_object_renderer/hrtf_data/Orange_53/' -input_td_file_name 'hrfilter_model_v002' \ No newline at end of file diff --git a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin index b9a35aa26b..72f9aaaf96 100644 --- a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin +++ b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:81d8c14bf10697a0353c15986fde3432df1b6909ea2d122ce3599b3655237d71 -size 2074176 +oid sha256:16c94bb55e2f0ba5501a40adc0fcc299ec5c999f4dec5177ad583f1ebbbaef28 +size 2004032 diff --git a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin index 992a1c61fa..42a9a2a64f 100644 --- a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin +++ b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:16b993a0af01bf8b8289e554452e6d2c98e7b977bf2a40f0afd3ca7498d39f8b -size 2578388 +oid sha256:8891e9c37c2ec47736758e36b7d7e910049f72485f47c1bd666eab4671d8fd36 +size 2487764 diff --git a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin index eaf5d445fe..4affa3fed2 100644 --- a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin +++ b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1a29e9692bd5be5e93358db63159f55851d12f66c0382ff14afb642090427685 -size 2860964 +oid sha256:b98959daea3f7a4da0e9a74fb7129bf199f650ae5d04227808cdb5bbdc39852c +size 2749860 -- GitLab From b50ec4068ded9003f0517826102b1a3efdb3bd50 Mon Sep 17 00:00:00 2001 From: emerit Date: Mon, 17 Apr 2023 14:43:52 +0200 Subject: [PATCH 058/331] merge with branch FhG/hrtf_binary_fasct_conf --- lib_com/ivas_cnst.h | 6 ++++++ lib_rend/ivas_rom_binauralRenderer.h | 10 ++++++++++ .../ivas_binaural_16kHz.bin | 4 ++-- .../ivas_binaural_32kHz.bin | 3 --- .../ivas_binaural_48kHz.bin | 4 ++-- 5 files changed, 20 insertions(+), 7 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 064900e337..f13e0e898e 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1448,7 +1448,13 @@ typedef enum { BINAURAL_INPUT_AUDIO_CONFIG_INVALID, BINAURAL_INPUT_AUDIO_CONFIG_COMBINED, /* 5_1, 5_1_2, 5_1_4, 7_1, 7_1_4 */ +#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS + BINAURAL_INPUT_AUDIO_CONFIG_HOA3, /* HOA3 */ + BINAURAL_INPUT_AUDIO_CONFIG_HOA2, /* HOA2 */ + BINAURAL_INPUT_AUDIO_CONFIG_FOA, /* FOA */ +#else BINAURAL_INPUT_AUDIO_CONFIG_HOA, /* FOA, HOA2, HOA3 */ +#endif BINAURAL_INPUT_AUDIO_CONFIG_UNDEFINED /* Not used */ } BINAURAL_INPUT_AUDIO_CONFIG; diff --git a/lib_rend/ivas_rom_binauralRenderer.h b/lib_rend/ivas_rom_binauralRenderer.h index 8d4a60d6d9..dc65c72807 100644 --- a/lib_rend/ivas_rom_binauralRenderer.h +++ b/lib_rend/ivas_rom_binauralRenderer.h @@ -48,6 +48,16 @@ extern float leftHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NT extern float leftHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS]; extern float rightHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS]; extern float rightHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS]; +#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +extern float leftHRIRReal_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]; +extern float leftHRIRImag_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]; +extern float rightHRIRReal_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]; +extern float rightHRIRImag_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]; +extern float leftHRIRReal_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]; +extern float leftHRIRImag_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]; +extern float rightHRIRReal_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]; +extern float rightHRIRImag_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]; +#endif extern float leftHRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]; extern float leftHRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]; diff --git a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin index 72f9aaaf96..c109231d4e 100644 --- a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin +++ b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:16c94bb55e2f0ba5501a40adc0fcc299ec5c999f4dec5177ad583f1ebbbaef28 -size 2004032 +oid sha256:785dcace3f77a235921d90804c70ddc32ab60bc8888b3d2d3296b6067e8ad49a +size 2056084 diff --git a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin index 42a9a2a64f..e69de29bb2 100644 --- a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin +++ b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8891e9c37c2ec47736758e36b7d7e910049f72485f47c1bd666eab4671d8fd36 -size 2487764 diff --git a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin index 4affa3fed2..ff6adceb6b 100644 --- a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin +++ b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b98959daea3f7a4da0e9a74fb7129bf199f650ae5d04227808cdb5bbdc39852c -size 2749860 +oid sha256:3da65cdd565eb303dcd387d424421598d0e01a9227eaebb14a03cd0d0a94b4b3 +size 2801912 -- GitLab From c9d0da0452524c675343ef324e1e64d53cc754aa Mon Sep 17 00:00:00 2001 From: emerit Date: Mon, 17 Apr 2023 14:55:48 +0200 Subject: [PATCH 059/331] add support of multiple HOA order in hrtf binary file and bug fix --- lib_util/hrtf_file_reader.c | 131 ++++++++- .../generate_tables_from_rom_to_bin.c | 261 +++++++++++++++++- 2 files changed, 388 insertions(+), 4 deletions(-) diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index d0999be43c..45f3a6d894 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -195,7 +195,12 @@ static ivas_error check_hrtf_binary_header( } /* Check the output format of the decoder */ + +#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS + if ( ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_FOA ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_UNDEFINED ) ) +#else if ( ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_HOA ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_UNDEFINED ) ) +#endif { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Header of HRTF binary file not compliant (input audio configuration)" ); } @@ -1103,7 +1108,11 @@ static ivas_error create_fastconv_HRTF_from_rawdata( } } } - if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA ) +#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS + else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) +#else + else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA ) +#endif { /* HRIR_HOA3 */ ( *hHRTF )->FASTCONV_HOA3_latency_s = *( (float *) ( hrtf_data_rptr ) ); @@ -1154,8 +1163,112 @@ static ivas_error create_fastconv_HRTF_from_rawdata( } } } +#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS + else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) + { + /* HRIR_HOA2 */ + ( *hHRTF )->FASTCONV_HOA2_latency_s = *( (float *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( float ); + + if ( HRTF_SH_CHANNELS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (HRTF_SH_CHANNELS)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); + + if ( BINAURAL_NTAPS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_NTAPS)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); + + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HRTF_SH_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->leftHRIRReal_HOA2[i][j], hrtf_data_rptr, BINAURAL_NTAPS * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS * sizeof( float ); + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HRTF_SH_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->leftHRIRImag_HOA2[i][j], hrtf_data_rptr, BINAURAL_NTAPS * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS * sizeof( float ); + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HRTF_SH_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->rightHRIRReal_HOA2[i][j], hrtf_data_rptr, BINAURAL_NTAPS * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS * sizeof( float ); + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HRTF_SH_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->rightHRIRImag_HOA2[i][j], hrtf_data_rptr, BINAURAL_NTAPS * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS * sizeof( float ); + } + } + } + else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) + { + /* HRIR_HOA2 */ + ( *hHRTF )->FASTCONV_FOA_latency_s = *( (float *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( float ); + + if ( HRTF_SH_CHANNELS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (HRTF_SH_CHANNELS)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); + + if ( BINAURAL_NTAPS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_NTAPS)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); + + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HRTF_SH_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->leftHRIRReal_FOA[i][j], hrtf_data_rptr, BINAURAL_NTAPS * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS * sizeof( float ); + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HRTF_SH_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->leftHRIRImag_FOA[i][j], hrtf_data_rptr, BINAURAL_NTAPS * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS * sizeof( float ); + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HRTF_SH_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->rightHRIRReal_FOA[i][j], hrtf_data_rptr, BINAURAL_NTAPS * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS * sizeof( float ); + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HRTF_SH_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->rightHRIRImag_FOA[i][j], hrtf_data_rptr, BINAURAL_NTAPS * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS * sizeof( float ); + } + } + } +#endif /* BRIR */ - if ( rend_type == RENDERER_BINAURAL_FASTCONV_ROOM && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) + else if ( rend_type == RENDERER_BINAURAL_FASTCONV_ROOM && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) { ( *hHRTF )->FASTCONV_BRIR_latency_s = *( (float *) ( hrtf_data_rptr ) ); hrtf_data_rptr += sizeof( float ); @@ -1513,10 +1626,24 @@ ivas_error create_SetOfHRTF_from_binary( { hHRTF = &( ( *hSetOfHRTF ).hHRTF_hrir_combined ); } +#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS + else if ( hrtf_header.input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) +#else else if ( hrtf_header.input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA ) +#endif { hHRTF = &( ( *hSetOfHRTF ).hHRTF_hrir_hoa3 ); } +#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS + else if ( hrtf_header.input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) + { + hHRTF = &( ( *hSetOfHRTF ).hHRTF_hrir_hoa2 ); + } + else if ( hrtf_header.input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) + { + hHRTF = &( ( *hSetOfHRTF ).hHRTF_hrir_foa ); + } +#endif } else if ( hrtf_header.rend_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { diff --git a/scripts/binauralRenderer_interface/Table_Format_Converter/generate_tables_from_rom_to_bin.c b/scripts/binauralRenderer_interface/Table_Format_Converter/generate_tables_from_rom_to_bin.c index a7d4391c75..ebbd22f578 100644 --- a/scripts/binauralRenderer_interface/Table_Format_Converter/generate_tables_from_rom_to_bin.c +++ b/scripts/binauralRenderer_interface/Table_Format_Converter/generate_tables_from_rom_to_bin.c @@ -58,8 +58,12 @@ #define DEFAULT_BIN_FILE_EXT ".bin" #define IVAS_NB_RENDERER_TYPE 7 -#define IVAS_NB_AUDIO_CONFIG 2 -#define IVAS_NB_SAMPLERATE 3 +#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +#define IVAS_NB_AUDIO_CONFIG 4 +#else +#define IVAS_NB_AUDIO_CONFIG 2 +#endif +#define IVAS_NB_SAMPLERATE 3 const RENDERER_TYPE rend_types[IVAS_NB_RENDERER_TYPE] = { RENDERER_BINAURAL_FASTCONV, @@ -72,8 +76,15 @@ const RENDERER_TYPE rend_types[IVAS_NB_RENDERER_TYPE] = { }; const BINAURAL_INPUT_AUDIO_CONFIG input_cfgs[IVAS_NB_AUDIO_CONFIG] = { BINAURAL_INPUT_AUDIO_CONFIG_COMBINED, +#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS + BINAURAL_INPUT_AUDIO_CONFIG_HOA3, + BINAURAL_INPUT_AUDIO_CONFIG_HOA2, + BINAURAL_INPUT_AUDIO_CONFIG_FOA +#else BINAURAL_INPUT_AUDIO_CONFIG_HOA +#endif }; + const int32_t sample_rates[IVAS_NB_SAMPLERATE] = { 48000, 32000, 16000 }; /* Hz */ /* 8000 Hz not supported by mdft */ #ifdef FILE_HEADER @@ -820,7 +831,11 @@ char *create_hrtf_fastconv( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CONFIG cldfb_nchan_max = CLDFB_NO_CHANNELS_MAX; } } +#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS + else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) +#else else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA ) +#endif { if ( rend_type == RENDERER_BINAURAL_FASTCONV_ROOM ) { @@ -832,6 +847,32 @@ char *create_hrtf_fastconv( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CONFIG hrtf_channels = HRTF_SH_CHANNELS; num_taps = BINAURAL_NTAPS; } +#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS + else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) + { + if ( rend_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + /* No HOA2 BRIRs */ + return NULL; + } + + latency_s = FASTCONV_HOA2_latency_s; + hrtf_channels = 9; + num_taps = BINAURAL_NTAPS; + } + else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) + { + if ( rend_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + /* No HOA2 BRIRs */ + return NULL; + } + + latency_s = FASTCONV_FOA_latency_s; + hrtf_channels = 4; + num_taps = BINAURAL_NTAPS; + } +#endif else { fprintf( stderr, "Unsupported renderer type in create_hrtf_fastconv()\n\n" ); @@ -943,7 +984,11 @@ char *create_hrtf_fastconv( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CONFIG } } // HRIR_HOA3 +#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS + else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) +#else else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA ) +#endif { memcpy( hrtf_wptr, &( latency_s ), sizeof( float ) ); // latency_s => float hrtf_wptr += sizeof( float ); @@ -988,6 +1033,99 @@ char *create_hrtf_fastconv( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CONFIG } } } +#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS + else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) + { + memcpy( hrtf_wptr, &( latency_s ), sizeof( float ) ); // latency_s => float + hrtf_wptr += sizeof( float ); + + memcpy( hrtf_wptr, &( hrtf_channels ), sizeof( uint16_t ) ); // hrtf_channels => uint16_t + hrtf_wptr += sizeof( uint16_t ); + + memcpy( hrtf_wptr, &( num_taps ), sizeof( uint16_t ) ); // num_taps => uint16_t + hrtf_wptr += sizeof( uint16_t ); + + data_size_tmp = num_taps * sizeof( float ); + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < hrtf_channels; j++ ) + { + memcpy( hrtf_wptr, &leftHRIRReal_HOA2[i][j], data_size_tmp ); + hrtf_wptr += data_size_tmp; + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < hrtf_channels; j++ ) + { + memcpy( hrtf_wptr, &leftHRIRImag_HOA2[i][j], data_size_tmp ); + hrtf_wptr += data_size_tmp; + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < hrtf_channels; j++ ) + { + memcpy( hrtf_wptr, &rightHRIRReal_HOA2[i][j], data_size_tmp ); + hrtf_wptr += data_size_tmp; + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < hrtf_channels; j++ ) + { + memcpy( hrtf_wptr, &rightHRIRImag_HOA2[i][j], data_size_tmp ); + hrtf_wptr += data_size_tmp; + } + } + } + // FOA + else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) + { + memcpy( hrtf_wptr, &( latency_s ), sizeof( float ) ); // latency_s => float + hrtf_wptr += sizeof( float ); + + memcpy( hrtf_wptr, &( hrtf_channels ), sizeof( uint16_t ) ); // hrtf_channels => uint16_t + hrtf_wptr += sizeof( uint16_t ); + + memcpy( hrtf_wptr, &( num_taps ), sizeof( uint16_t ) ); // num_taps => uint16_t + hrtf_wptr += sizeof( uint16_t ); + + data_size_tmp = num_taps * sizeof( float ); + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < hrtf_channels; j++ ) + { + memcpy( hrtf_wptr, &leftHRIRReal_FOA[i][j], data_size_tmp ); + hrtf_wptr += data_size_tmp; + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < hrtf_channels; j++ ) + { + memcpy( hrtf_wptr, &leftHRIRImag_FOA[i][j], data_size_tmp ); + hrtf_wptr += data_size_tmp; + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < hrtf_channels; j++ ) + { + memcpy( hrtf_wptr, &rightHRIRReal_FOA[i][j], data_size_tmp ); + hrtf_wptr += data_size_tmp; + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < hrtf_channels; j++ ) + { + memcpy( hrtf_wptr, &rightHRIRImag_FOA[i][j], data_size_tmp ); + hrtf_wptr += data_size_tmp; + } + } + } +#endif // BRIR else if ( rend_type == RENDERER_BINAURAL_FASTCONV_ROOM && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) { @@ -1251,7 +1389,11 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON hrtf_table_dims_out.max_num_iterations_diffuse = 0; hrtf_table_dims_out.max_total_num_fsamp_per_iteration_diff = 0;*/ } +#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS + else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) +#else else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA ) +#endif { if ( frequency == 48000 ) { @@ -1269,6 +1411,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON hrtf_table_dims_out.max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_48kHz; + result = 0; } else if ( frequency == 32000 ) @@ -1315,6 +1458,115 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON hrtf_table_dims_out.max_num_iterations_diffuse = 0; hrtf_table_dims_out.max_total_num_fsamp_per_iteration_diff = 0;*/ } +#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS + else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) + { + if ( frequency == 48000 ) + { + hrtf_table_ptrs_out.latency_s = &CRendBin_HOA2_HRIR_latency_s; + hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_HOA2_HRIR_num_iterations_48kHz ); + hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz ); + hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_HOA2_HRIR_num_iterations_diffuse_48kHz ); + hrtf_table_ptrs_out.pIndex_frequency_max_diffuse = (uint16_t *) ( &CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz ); + hrtf_table_ptrs_out.index_frequency_max_diffuse = (uint16_t *) ( &CRendBin_HOA2_HRIR_index_frequency_max_diffuse_48kHz ); + hrtf_table_ptrs_out.inv_diffuse_weight = (float *) ( &CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz ); + hrtf_table_ptrs_out.coeff_re = (float *) ( &CRendBin_HOA2_HRIR_coeff_re_48kHz ); + hrtf_table_ptrs_out.coeff_im = (float *) ( &CRendBin_HOA2_HRIR_coeff_im_48kHz ); + hrtf_table_ptrs_out.coeff_diffuse_re = (float *) ( &CRendBin_HOA2_HRIR_coeff_diffuse_re_48kHz ); + hrtf_table_ptrs_out.coeff_diffuse_im = (float *) ( &CRendBin_HOA2_HRIR_coeff_diffuse_im_48kHz ); + + hrtf_table_dims_out.max_num_iterations = CRendBin_HOA2_HRIR_max_num_iterations_48kHz; + result = 0; + } + else if ( frequency == 32000 ) + { + hrtf_table_ptrs_out.latency_s = &CRendBin_HOA2_HRIR_latency_s; + hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_HOA2_HRIR_num_iterations_32kHz ); + hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz ); + hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_HOA2_HRIR_num_iterations_diffuse_32kHz ); + hrtf_table_ptrs_out.pIndex_frequency_max_diffuse = (uint16_t *) ( &CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz ); + hrtf_table_ptrs_out.index_frequency_max_diffuse = (uint16_t *) ( &CRendBin_HOA2_HRIR_index_frequency_max_diffuse_32kHz ); + hrtf_table_ptrs_out.inv_diffuse_weight = (float *) ( &CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz ); + hrtf_table_ptrs_out.coeff_re = (float *) ( &CRendBin_HOA2_HRIR_coeff_re_32kHz ); + hrtf_table_ptrs_out.coeff_im = (float *) ( &CRendBin_HOA2_HRIR_coeff_im_32kHz ); + hrtf_table_ptrs_out.coeff_diffuse_re = (float *) ( &CRendBin_HOA2_HRIR_coeff_diffuse_re_32kHz ); + hrtf_table_ptrs_out.coeff_diffuse_im = (float *) ( &CRendBin_HOA2_HRIR_coeff_diffuse_im_32kHz ); + + hrtf_table_dims_out.max_num_iterations = CRendBin_HOA2_HRIR_max_num_iterations_32kHz; + result = 0; + } + else if ( frequency == 16000 ) + { + hrtf_table_ptrs_out.latency_s = &CRendBin_HOA2_HRIR_latency_s; + hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_HOA2_HRIR_num_iterations_16kHz ); + hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz ); + hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_HOA2_HRIR_num_iterations_diffuse_16kHz ); + hrtf_table_ptrs_out.pIndex_frequency_max_diffuse = (uint16_t *) ( &CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz ); + hrtf_table_ptrs_out.index_frequency_max_diffuse = (uint16_t *) ( &CRendBin_HOA2_HRIR_index_frequency_max_diffuse_16kHz ); + hrtf_table_ptrs_out.inv_diffuse_weight = (float *) ( &CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz ); + hrtf_table_ptrs_out.coeff_re = (float *) ( &CRendBin_HOA2_HRIR_coeff_re_16kHz ); + hrtf_table_ptrs_out.coeff_im = (float *) ( &CRendBin_HOA2_HRIR_coeff_im_16kHz ); + hrtf_table_ptrs_out.coeff_diffuse_re = (float *) ( &CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz ); + hrtf_table_ptrs_out.coeff_diffuse_im = (float *) ( &CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz ); + + hrtf_table_dims_out.max_num_iterations = CRendBin_HOA2_HRIR_max_num_iterations_16kHz; + result = 0; + } + } + else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) + { + if ( frequency == 48000 ) + { + hrtf_table_ptrs_out.latency_s = &CRendBin_FOA_HRIR_latency_s; + hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_FOA_HRIR_num_iterations_48kHz ); + hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz ); + hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_FOA_HRIR_num_iterations_diffuse_48kHz ); + hrtf_table_ptrs_out.pIndex_frequency_max_diffuse = (uint16_t *) ( &CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz ); + hrtf_table_ptrs_out.index_frequency_max_diffuse = (uint16_t *) ( &CRendBin_FOA_HRIR_index_frequency_max_diffuse_48kHz ); + hrtf_table_ptrs_out.inv_diffuse_weight = (float *) ( &CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz ); + hrtf_table_ptrs_out.coeff_re = (float *) ( &CRendBin_FOA_HRIR_coeff_re_48kHz ); + hrtf_table_ptrs_out.coeff_im = (float *) ( &CRendBin_FOA_HRIR_coeff_im_48kHz ); + hrtf_table_ptrs_out.coeff_diffuse_re = (float *) ( &CRendBin_FOA_HRIR_coeff_diffuse_re_48kHz ); + hrtf_table_ptrs_out.coeff_diffuse_im = (float *) ( &CRendBin_FOA_HRIR_coeff_diffuse_im_48kHz ); + + hrtf_table_dims_out.max_num_iterations = CRendBin_FOA_HRIR_max_num_iterations_48kHz; + result = 0; + } + else if ( frequency == 32000 ) + { + hrtf_table_ptrs_out.latency_s = &CRendBin_FOA_HRIR_latency_s; + hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_FOA_HRIR_num_iterations_32kHz ); + hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz ); + hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_FOA_HRIR_num_iterations_diffuse_32kHz ); + hrtf_table_ptrs_out.pIndex_frequency_max_diffuse = (uint16_t *) ( &CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz ); + hrtf_table_ptrs_out.index_frequency_max_diffuse = (uint16_t *) ( &CRendBin_FOA_HRIR_index_frequency_max_diffuse_32kHz ); + hrtf_table_ptrs_out.inv_diffuse_weight = (float *) ( &CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz ); + hrtf_table_ptrs_out.coeff_re = (float *) ( &CRendBin_FOA_HRIR_coeff_re_32kHz ); + hrtf_table_ptrs_out.coeff_im = (float *) ( &CRendBin_FOA_HRIR_coeff_im_32kHz ); + hrtf_table_ptrs_out.coeff_diffuse_re = (float *) ( &CRendBin_FOA_HRIR_coeff_diffuse_re_32kHz ); + hrtf_table_ptrs_out.coeff_diffuse_im = (float *) ( &CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz ); + + hrtf_table_dims_out.max_num_iterations = CRendBin_FOA_HRIR_max_num_iterations_32kHz; + } + else if ( frequency == 16000 ) + { + hrtf_table_ptrs_out.latency_s = &CRendBin_FOA_HRIR_latency_s; + hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_FOA_HRIR_num_iterations_16kHz ); + hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz ); + hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_FOA_HRIR_num_iterations_diffuse_16kHz ); + hrtf_table_ptrs_out.pIndex_frequency_max_diffuse = (uint16_t *) ( &CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz ); + hrtf_table_ptrs_out.index_frequency_max_diffuse = (uint16_t *) ( &CRendBin_FOA_HRIR_index_frequency_max_diffuse_16kHz ); + hrtf_table_ptrs_out.inv_diffuse_weight = (float *) ( &CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz ); + hrtf_table_ptrs_out.coeff_re = (float *) ( &CRendBin_FOA_HRIR_coeff_re_16kHz ); + hrtf_table_ptrs_out.coeff_im = (float *) ( &CRendBin_FOA_HRIR_coeff_im_16kHz ); + hrtf_table_ptrs_out.coeff_diffuse_re = (float *) ( &CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz ); + hrtf_table_ptrs_out.coeff_diffuse_im = (float *) ( &CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz ); + + hrtf_table_dims_out.max_num_iterations = CRendBin_FOA_HRIR_max_num_iterations_16kHz; + result = 0; + } + } +#endif } else if ( rend_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { @@ -1382,7 +1634,11 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON hrtf_table_dims_out.max_num_iterations_diffuse = 0; hrtf_table_dims_out.max_total_num_fsamp_per_iteration_diff = 0;*/ } +#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS + else if ( ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) || ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) || ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) ) +#else else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA ) +#endif { result = 0; } @@ -1458,6 +1714,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON } } + // Copy the results if ( ( result == 0 ) && ( hrtf_table_ptrs != NULL ) ) { -- GitLab From 5954ba4e813653f985ce55845df6a05ba4c40a4e Mon Sep 17 00:00:00 2001 From: emerit Date: Mon, 17 Apr 2023 15:26:47 +0200 Subject: [PATCH 060/331] bugs fix --- apps/decoder.c | 24 +++++++++++++++++++ .../generate_tables_from_rom_to_bin.c | 3 +++ .../ivas_binaural_16kHz.bin | 4 ++-- .../ivas_binaural_32kHz.bin | 3 +++ .../ivas_binaural_48kHz.bin | 4 ++-- 5 files changed, 34 insertions(+), 4 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index d2260713c2..80823f5290 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -514,7 +514,11 @@ int main( if ( arg.hrtfReaderEnabled ) { +#ifdef UPDATE_SBA_FILTER + IVAS_DEC_HRTF_HANDLE hHrtfTD = NULL; +#else IVAS_DEC_HRTF_HANDLE hHrtfTD; +#endif IVAS_DEC_GetHrtfHandle( hIvasDec, &hHrtfTD ); @@ -525,7 +529,11 @@ int main( } +#ifdef UPDATE_SBA_FILTER + IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF = NULL; +#else IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF; +#endif IVAS_DEC_GetHrtfCRendHandle( hIvasDec, &hSetOfHRTF ); if ( ( error = create_SetOfHRTF_from_binary( hSetOfHRTF, hrtfReader, arg.output_Fs ) ) != IVAS_ERR_OK ) @@ -533,14 +541,22 @@ int main( fprintf( stderr, "\nError in loading HRTF binary file %s for CRend \n\n", arg.hrtfCRendFileName ); goto cleanup; } +#ifdef UPDATE_SBA_FILTER + IVAS_DEC_HRTF_FASTCONV_HANDLE hHrtfFastConv = NULL; +#else IVAS_DEC_HRTF_FASTCONV_HANDLE hHrtfFastConv; +#endif IVAS_DEC_GetHrtfFastConvHandle( hIvasDec, &hHrtfFastConv ); if ( ( error = load_fastconv_HRTF_from_binary( hHrtfFastConv, hrtfReader ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError in loading HRTF binary file %s for FastConv \n\n", arg.hrtfCRendFileName ); } +#ifdef UPDATE_SBA_FILTER + IVAS_DEC_HRTF_PARAMBIN_HANDLE hHrtfParambin = NULL; +#else IVAS_DEC_HRTF_PARAMBIN_HANDLE hHrtfParambin; +#endif IVAS_DEC_GetHrtfParamBinHandle( hIvasDec, &hHrtfParambin ); if ( ( error = load_parambin_HRTF_from_binary( hHrtfParambin, hrtfReader ) ) != IVAS_ERR_OK ) @@ -611,10 +627,18 @@ cleanup: if ( arg.hrtfReaderEnabled ) { +#ifdef UPDATE_SBA_FILTER + IVAS_DEC_HRTF_HANDLE hHrtfTD = NULL; +#else IVAS_DEC_HRTF_HANDLE hHrtfTD; +#endif IVAS_DEC_GetHrtfHandle( hIvasDec, &hHrtfTD ); dealloc_HRTF_binary( hHrtfTD ); +#ifdef UPDATE_SBA_FILTER + IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF = NULL; +#else IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF; +#endif IVAS_DEC_GetHrtfCRendHandle( hIvasDec, &hSetOfHRTF ); destroy_SetOfHRTF( hSetOfHRTF ); } diff --git a/scripts/binauralRenderer_interface/Table_Format_Converter/generate_tables_from_rom_to_bin.c b/scripts/binauralRenderer_interface/Table_Format_Converter/generate_tables_from_rom_to_bin.c index ebbd22f578..8ed2ed3711 100644 --- a/scripts/binauralRenderer_interface/Table_Format_Converter/generate_tables_from_rom_to_bin.c +++ b/scripts/binauralRenderer_interface/Table_Format_Converter/generate_tables_from_rom_to_bin.c @@ -1512,6 +1512,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON hrtf_table_dims_out.max_num_iterations = CRendBin_HOA2_HRIR_max_num_iterations_16kHz; result = 0; } + hrtf_table_dims_out.max_num_ir = 9; } else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) { @@ -1547,6 +1548,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON hrtf_table_ptrs_out.coeff_diffuse_im = (float *) ( &CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz ); hrtf_table_dims_out.max_num_iterations = CRendBin_FOA_HRIR_max_num_iterations_32kHz; + result = 0; } else if ( frequency == 16000 ) { @@ -1565,6 +1567,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON hrtf_table_dims_out.max_num_iterations = CRendBin_FOA_HRIR_max_num_iterations_16kHz; result = 0; } + hrtf_table_dims_out.max_num_ir = 4; } #endif } diff --git a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin index c109231d4e..980668c27e 100644 --- a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin +++ b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:785dcace3f77a235921d90804c70ddc32ab60bc8888b3d2d3296b6067e8ad49a -size 2056084 +oid sha256:07d2de62c345650f19a404001c5502e64f72277e6c689064e204a7031779bc0e +size 2072948 diff --git a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin index e69de29bb2..9659006ef6 100644 --- a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin +++ b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2c8461458ca23f86f592acf102edfec4eb80bbb935bb324e04ab1c535d0dd94 +size 2573320 diff --git a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin index ff6adceb6b..d2dee97c34 100644 --- a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin +++ b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3da65cdd565eb303dcd387d424421598d0e01a9227eaebb14a03cd0d0a94b4b3 -size 2801912 +oid sha256:80043c85556218c5444c87aa2a86498ab4158fc40c6f4c3190caa182af1553e5 +size 2852056 -- GitLab From a0cc623d72dd6d55acc8315d7e724dc44fd924df Mon Sep 17 00:00:00 2001 From: emerit Date: Mon, 17 Apr 2023 15:55:06 +0200 Subject: [PATCH 061/331] fix crend rom declarations --- lib_rend/ivas_crend.c | 216 ++++++------- lib_rend/ivas_rom_binaural_crend_head.c | 5 +- lib_rend/ivas_rom_binaural_crend_head.h | 409 ++++++++++++------------ 3 files changed, 313 insertions(+), 317 deletions(-) diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index f4bee9b6d7..3e14ccb125 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -241,16 +241,16 @@ static ivas_error ivas_rend_initCrend( if ( use_brir ) { hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_BRIR_num_iterations_diffuse_48kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_BRIR_coeff_diffuse_re_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_BRIR_coeff_diffuse_im_48kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_Combined_BRIR_coeff_diffuse_re_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_Combined_BRIR_coeff_diffuse_im_48kHz[j]; } else { hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_HRIR_num_iterations_diffuse_48kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_HRIR_coeff_diffuse_re_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_HRIR_coeff_diffuse_im_48kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_Combined_HRIR_coeff_diffuse_re_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_Combined_HRIR_coeff_diffuse_im_48kHz[j]; } } } @@ -274,16 +274,16 @@ static ivas_error ivas_rend_initCrend( if ( use_brir ) { hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_BRIR_num_iterations_diffuse_32kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_BRIR_coeff_diffuse_re_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_BRIR_coeff_diffuse_im_32kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_Combined_BRIR_coeff_diffuse_re_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_Combined_BRIR_coeff_diffuse_im_32kHz[j]; } else { hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_HRIR_num_iterations_diffuse_32kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_HRIR_coeff_diffuse_re_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_HRIR_coeff_diffuse_im_32kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_Combined_HRIR_coeff_diffuse_re_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_Combined_HRIR_coeff_diffuse_im_32kHz[j]; } } } @@ -307,16 +307,16 @@ static ivas_error ivas_rend_initCrend( if ( use_brir ) { hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_BRIR_num_iterations_diffuse_16kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_BRIR_coeff_diffuse_re_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_Combined_BRIR_coeff_diffuse_re_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz[j]; } else { hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_HRIR_num_iterations_diffuse_16kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz[j]; } } } @@ -368,16 +368,16 @@ static ivas_error ivas_rend_initCrend( if ( use_brir ) { hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_48kHz[tmp][j]; - hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz[tmp][j]; - hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_BRIR_coeff_re_48kHz[tmp][j]; - hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_BRIR_coeff_im_48kHz[tmp][j]; + hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz[tmp][j]; + hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_Combined_BRIR_coeff_re_48kHz[tmp][j]; + hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_Combined_BRIR_coeff_im_48kHz[tmp][j]; } else { hHrtf->num_iterations[i][j] = CRendBin_Combined_HRIR_num_iterations_48kHz[tmp][j]; - hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_HRIR_pIndex_frequency_max_48kHz[tmp][j]; - hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_HRIR_coeff_re_48kHz[tmp][j]; - hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_HRIR_coeff_im_48kHz[tmp][j]; + hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_Combined_HRIR_pIndex_frequency_max_48kHz[tmp][j]; + hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_Combined_HRIR_coeff_re_48kHz[tmp][j]; + hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_Combined_HRIR_coeff_im_48kHz[tmp][j]; } } } @@ -397,16 +397,16 @@ static ivas_error ivas_rend_initCrend( if ( use_brir ) { hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_32kHz[tmp][j]; - hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz[tmp][j]; - hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_BRIR_coeff_re_32kHz[tmp][j]; - hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_BRIR_coeff_im_32kHz[tmp][j]; + hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz[tmp][j]; + hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_Combined_BRIR_coeff_re_32kHz[tmp][j]; + hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_Combined_BRIR_coeff_im_32kHz[tmp][j]; } else { hHrtf->num_iterations[i][j] = CRendBin_Combined_HRIR_num_iterations_32kHz[tmp][j]; - hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_HRIR_pIndex_frequency_max_32kHz[tmp][j]; - hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_HRIR_coeff_re_32kHz[tmp][j]; - hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_HRIR_coeff_im_32kHz[tmp][j]; + hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_Combined_HRIR_pIndex_frequency_max_32kHz[tmp][j]; + hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_Combined_HRIR_coeff_re_32kHz[tmp][j]; + hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_Combined_HRIR_coeff_im_32kHz[tmp][j]; } } } @@ -426,16 +426,16 @@ static ivas_error ivas_rend_initCrend( if ( use_brir ) { hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_16kHz[tmp][j]; - hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz[tmp][j]; - hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_BRIR_coeff_re_16kHz[tmp][j]; - hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_BRIR_coeff_im_16kHz[tmp][j]; + hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz[tmp][j]; + hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_Combined_BRIR_coeff_re_16kHz[tmp][j]; + hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_Combined_BRIR_coeff_im_16kHz[tmp][j]; } else { hHrtf->num_iterations[i][j] = CRendBin_Combined_HRIR_num_iterations_16kHz[tmp][j]; - hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_HRIR_pIndex_frequency_max_16kHz[tmp][j]; - hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_HRIR_coeff_re_16kHz[tmp][j]; - hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_HRIR_coeff_im_16kHz[tmp][j]; + hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_Combined_HRIR_pIndex_frequency_max_16kHz[tmp][j]; + hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_Combined_HRIR_coeff_re_16kHz[tmp][j]; + hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_Combined_HRIR_coeff_im_16kHz[tmp][j]; } } } @@ -465,17 +465,17 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_48kHz[i][j]; - hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[i][j]; - hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_48kHz[i][j]; - hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_48kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_HOA3_HRIR_coeff_re_48kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_HOA3_HRIR_coeff_im_48kHz[i][j]; } } for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[j]; } } else if ( output_Fs == 32000 ) @@ -491,18 +491,18 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_32kHz[i][j]; - hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[i][j]; - hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_32kHz[i][j]; - hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_32kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_HOA3_HRIR_coeff_re_32kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_HOA3_HRIR_coeff_im_32kHz[i][j]; } } for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[j]; } } else if ( output_Fs == 16000 ) @@ -518,18 +518,18 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_16kHz[i][j]; - hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[i][j]; - hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_16kHz[i][j]; - hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_16kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_HOA3_HRIR_coeff_re_16kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_HOA3_HRIR_coeff_im_16kHz[i][j]; } } for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[j]; } } #ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS @@ -549,17 +549,17 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations[i][j] = CRendBin_HOA2_HRIR_num_iterations_48kHz[i][j]; - hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[i][j]; - hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA2_HRIR_coeff_re_48kHz[i][j]; - hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA2_HRIR_coeff_im_48kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_HOA2_HRIR_coeff_re_48kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_HOA2_HRIR_coeff_im_48kHz[i][j]; } } for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations_diffuse[j] = CRendBin_HOA2_HRIR_num_iterations_diffuse_48kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA2_HRIR_coeff_diffuse_re_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA2_HRIR_coeff_diffuse_im_48kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_HOA2_HRIR_coeff_diffuse_re_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_HOA2_HRIR_coeff_diffuse_im_48kHz[j]; } } else if ( output_Fs == 32000 ) @@ -575,18 +575,18 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations[i][j] = CRendBin_HOA2_HRIR_num_iterations_32kHz[i][j]; - hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[i][j]; - hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA2_HRIR_coeff_re_32kHz[i][j]; - hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA2_HRIR_coeff_im_32kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_HOA2_HRIR_coeff_re_32kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_HOA2_HRIR_coeff_im_32kHz[i][j]; } } for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations_diffuse[j] = CRendBin_HOA2_HRIR_num_iterations_diffuse_32kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA2_HRIR_coeff_diffuse_re_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA2_HRIR_coeff_diffuse_im_32kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_HOA2_HRIR_coeff_diffuse_re_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_HOA2_HRIR_coeff_diffuse_im_32kHz[j]; } } else if ( output_Fs == 16000 ) @@ -602,18 +602,18 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations[i][j] = CRendBin_HOA2_HRIR_num_iterations_16kHz[i][j]; - hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[i][j]; - hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA2_HRIR_coeff_re_16kHz[i][j]; - hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA2_HRIR_coeff_im_16kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_HOA2_HRIR_coeff_re_16kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_HOA2_HRIR_coeff_im_16kHz[i][j]; } } for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations_diffuse[j] = CRendBin_HOA2_HRIR_num_iterations_diffuse_16kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz[j]; } } } @@ -632,17 +632,17 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations[i][j] = CRendBin_FOA_HRIR_num_iterations_48kHz[i][j]; - hHrtf->pIndex_frequency_max[i][j] = CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[i][j]; - hHrtf->pOut_to_bin_re[i][j] = CRendBin_FOA_HRIR_coeff_re_48kHz[i][j]; - hHrtf->pOut_to_bin_im[i][j] = CRendBin_FOA_HRIR_coeff_im_48kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_FOA_HRIR_coeff_re_48kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_FOA_HRIR_coeff_im_48kHz[i][j]; } } for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations_diffuse[j] = CRendBin_FOA_HRIR_num_iterations_diffuse_48kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_FOA_HRIR_coeff_diffuse_re_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_FOA_HRIR_coeff_diffuse_im_48kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_FOA_HRIR_coeff_diffuse_re_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_FOA_HRIR_coeff_diffuse_im_48kHz[j]; } } else if ( output_Fs == 32000 ) @@ -658,18 +658,18 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations[i][j] = CRendBin_FOA_HRIR_num_iterations_32kHz[i][j]; - hHrtf->pIndex_frequency_max[i][j] = CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[i][j]; - hHrtf->pOut_to_bin_re[i][j] = CRendBin_FOA_HRIR_coeff_re_32kHz[i][j]; - hHrtf->pOut_to_bin_im[i][j] = CRendBin_FOA_HRIR_coeff_im_32kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_FOA_HRIR_coeff_re_32kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_FOA_HRIR_coeff_im_32kHz[i][j]; } } for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations_diffuse[j] = CRendBin_FOA_HRIR_num_iterations_diffuse_32kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_FOA_HRIR_coeff_diffuse_re_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_FOA_HRIR_coeff_diffuse_re_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz[j]; } } else if ( output_Fs == 16000 ) @@ -685,18 +685,18 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations[i][j] = CRendBin_FOA_HRIR_num_iterations_16kHz[i][j]; - hHrtf->pIndex_frequency_max[i][j] = CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[i][j]; - hHrtf->pOut_to_bin_re[i][j] = CRendBin_FOA_HRIR_coeff_re_16kHz[i][j]; - hHrtf->pOut_to_bin_im[i][j] = CRendBin_FOA_HRIR_coeff_im_16kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_FOA_HRIR_coeff_re_16kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_FOA_HRIR_coeff_im_16kHz[i][j]; } } for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations_diffuse[j] = CRendBin_FOA_HRIR_num_iterations_diffuse_16kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz[j]; } } } @@ -720,17 +720,17 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_48kHz[i][j]; - hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[i][j]; - hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_48kHz[i][j]; - hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_48kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_HOA3_HRIR_coeff_re_48kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_HOA3_HRIR_coeff_im_48kHz[i][j]; } } for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[j]; } } else if ( output_Fs == 32000 ) @@ -746,18 +746,18 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_32kHz[i][j]; - hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[i][j]; - hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_32kHz[i][j]; - hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_32kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_HOA3_HRIR_coeff_re_32kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_HOA3_HRIR_coeff_im_32kHz[i][j]; } } for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[j]; } } else if ( output_Fs == 16000 ) @@ -773,18 +773,18 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_16kHz[i][j]; - hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[i][j]; - hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_16kHz[i][j]; - hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_16kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_HOA3_HRIR_coeff_re_16kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_HOA3_HRIR_coeff_im_16kHz[i][j]; } } for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[j]; } } else diff --git a/lib_rend/ivas_rom_binaural_crend_head.c b/lib_rend/ivas_rom_binaural_crend_head.c index 58fe25179f..23382578a1 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.c +++ b/lib_rend/ivas_rom_binaural_crend_head.c @@ -42,10 +42,7 @@ -#include -#include -#include "cnst.h" -#include "ivas_cnst.h" +#include "ivas_rom_binaural_crend_head.h" #ifdef USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 diff --git a/lib_rend/ivas_rom_binaural_crend_head.h b/lib_rend/ivas_rom_binaural_crend_head.h index 1f25538eab..cbcf0a8b02 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.h +++ b/lib_rend/ivas_rom_binaural_crend_head.h @@ -46,7 +46,6 @@ #define _IVAS_ROM_BINAURAL_CREND_HEAD_ #include -#include "cnst.h" #include "ivas_cnst.h" #ifdef USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 @@ -54,49 +53,49 @@ /********************** CRendBin_Combined_HRIR **********************/ -extern float CRendBin_Combined_HRIR_latency_s; +extern const float CRendBin_Combined_HRIR_latency_s; /* Sample Rate = 48000 */ -extern int16_t CRendBin_Combined_HRIR_max_num_iterations_48kHz; -extern uint16_t CRendBin_Combined_HRIR_num_iterations_48kHz[15][BINAURAL_CHANNELS]; -extern uint16_t CRendBin_Combined_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; -extern uint16_t CRendBin_Combined_HRIR_pIndex_frequency_max_48kHz[15][BINAURAL_CHANNELS][1]; -extern uint16_t CRendBin_Combined_HRIR_index_frequency_max_diffuse_48kHz; -extern float CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz[15]; -extern uint16_t *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; -extern float CRendBin_Combined_HRIR_coeff_re_48kHz[15][BINAURAL_CHANNELS][240]; -extern float CRendBin_Combined_HRIR_coeff_im_48kHz[15][BINAURAL_CHANNELS][240]; -extern float *CRendBin_Combined_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]; -extern float *CRendBin_Combined_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]; +extern const int16_t CRendBin_Combined_HRIR_max_num_iterations_48kHz; +extern const uint16_t CRendBin_Combined_HRIR_num_iterations_48kHz[15][BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_Combined_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_Combined_HRIR_pIndex_frequency_max_48kHz[15][BINAURAL_CHANNELS][1]; +extern const uint16_t CRendBin_Combined_HRIR_index_frequency_max_diffuse_48kHz; +extern const float CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz[15]; +extern const uint16_t *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; +extern const float CRendBin_Combined_HRIR_coeff_re_48kHz[15][BINAURAL_CHANNELS][240]; +extern const float CRendBin_Combined_HRIR_coeff_im_48kHz[15][BINAURAL_CHANNELS][240]; +extern const float *CRendBin_Combined_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]; +extern const float *CRendBin_Combined_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]; /* Sample Rate = 32000 */ -extern int16_t CRendBin_Combined_HRIR_max_num_iterations_32kHz; -extern uint16_t CRendBin_Combined_HRIR_num_iterations_32kHz[15][BINAURAL_CHANNELS]; -extern uint16_t CRendBin_Combined_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; -extern uint16_t CRendBin_Combined_HRIR_pIndex_frequency_max_32kHz[15][BINAURAL_CHANNELS][1]; -extern uint16_t CRendBin_Combined_HRIR_index_frequency_max_diffuse_32kHz; -extern float CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz[15]; -extern uint16_t *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; -extern float CRendBin_Combined_HRIR_coeff_re_32kHz[15][BINAURAL_CHANNELS][160]; -extern float CRendBin_Combined_HRIR_coeff_im_32kHz[15][BINAURAL_CHANNELS][160]; -extern float *CRendBin_Combined_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]; -extern float *CRendBin_Combined_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]; +extern const int16_t CRendBin_Combined_HRIR_max_num_iterations_32kHz; +extern const uint16_t CRendBin_Combined_HRIR_num_iterations_32kHz[15][BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_Combined_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_Combined_HRIR_pIndex_frequency_max_32kHz[15][BINAURAL_CHANNELS][1]; +extern const uint16_t CRendBin_Combined_HRIR_index_frequency_max_diffuse_32kHz; +extern const float CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz[15]; +extern const uint16_t *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; +extern const float CRendBin_Combined_HRIR_coeff_re_32kHz[15][BINAURAL_CHANNELS][160]; +extern const float CRendBin_Combined_HRIR_coeff_im_32kHz[15][BINAURAL_CHANNELS][160]; +extern const float *CRendBin_Combined_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]; +extern const float *CRendBin_Combined_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]; /* Sample Rate = 16000 */ -extern int16_t CRendBin_Combined_HRIR_max_num_iterations_16kHz; -extern uint16_t CRendBin_Combined_HRIR_num_iterations_16kHz[15][BINAURAL_CHANNELS]; -extern uint16_t CRendBin_Combined_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; -extern uint16_t CRendBin_Combined_HRIR_pIndex_frequency_max_16kHz[15][BINAURAL_CHANNELS][1]; -extern uint16_t CRendBin_Combined_HRIR_index_frequency_max_diffuse_16kHz; -extern float CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz[15]; -extern uint16_t *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; -extern float CRendBin_Combined_HRIR_coeff_re_16kHz[15][BINAURAL_CHANNELS][80]; -extern float CRendBin_Combined_HRIR_coeff_im_16kHz[15][BINAURAL_CHANNELS][80]; -extern float *CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; -extern float *CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; +extern const int16_t CRendBin_Combined_HRIR_max_num_iterations_16kHz; +extern const uint16_t CRendBin_Combined_HRIR_num_iterations_16kHz[15][BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_Combined_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_Combined_HRIR_pIndex_frequency_max_16kHz[15][BINAURAL_CHANNELS][1]; +extern const uint16_t CRendBin_Combined_HRIR_index_frequency_max_diffuse_16kHz; +extern const float CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz[15]; +extern const uint16_t *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; +extern const float CRendBin_Combined_HRIR_coeff_re_16kHz[15][BINAURAL_CHANNELS][80]; +extern const float CRendBin_Combined_HRIR_coeff_im_16kHz[15][BINAURAL_CHANNELS][80]; +extern const float *CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; +extern const float *CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; #endif /* USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 */ #ifdef USE_ORANGE_HRIR_53_HOA3S_48000 @@ -104,49 +103,49 @@ extern float *CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; /********************** CRendBin_HOA3_HRIR **********************/ -extern float CRendBin_HOA3_HRIR_latency_s; +extern const float CRendBin_HOA3_HRIR_latency_s; /* Sample Rate = 48000 */ -extern int16_t CRendBin_HOA3_HRIR_max_num_iterations_48kHz; -extern uint16_t CRendBin_HOA3_HRIR_num_iterations_48kHz[16][BINAURAL_CHANNELS]; -extern uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; -extern uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[16][BINAURAL_CHANNELS][2]; -extern uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz; -extern float CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz[16]; -extern uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; -extern float CRendBin_HOA3_HRIR_coeff_re_48kHz[16][BINAURAL_CHANNELS][480]; -extern float CRendBin_HOA3_HRIR_coeff_im_48kHz[16][BINAURAL_CHANNELS][480]; -extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]; -extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]; +extern const int16_t CRendBin_HOA3_HRIR_max_num_iterations_48kHz; +extern const uint16_t CRendBin_HOA3_HRIR_num_iterations_48kHz[16][BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[16][BINAURAL_CHANNELS][2]; +extern const uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz; +extern const float CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz[16]; +extern const uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; +extern const float CRendBin_HOA3_HRIR_coeff_re_48kHz[16][BINAURAL_CHANNELS][480]; +extern const float CRendBin_HOA3_HRIR_coeff_im_48kHz[16][BINAURAL_CHANNELS][480]; +extern const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]; +extern const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]; /* Sample Rate = 32000 */ -extern int16_t CRendBin_HOA3_HRIR_max_num_iterations_32kHz; -extern uint16_t CRendBin_HOA3_HRIR_num_iterations_32kHz[16][BINAURAL_CHANNELS]; -extern uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; -extern uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[16][BINAURAL_CHANNELS][2]; -extern uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz; -extern float CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz[16]; -extern uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; -extern float CRendBin_HOA3_HRIR_coeff_re_32kHz[16][BINAURAL_CHANNELS][320]; -extern float CRendBin_HOA3_HRIR_coeff_im_32kHz[16][BINAURAL_CHANNELS][320]; -extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]; -extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]; +extern const int16_t CRendBin_HOA3_HRIR_max_num_iterations_32kHz; +extern const uint16_t CRendBin_HOA3_HRIR_num_iterations_32kHz[16][BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[16][BINAURAL_CHANNELS][2]; +extern const uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz; +extern const float CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz[16]; +extern const uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; +extern const float CRendBin_HOA3_HRIR_coeff_re_32kHz[16][BINAURAL_CHANNELS][320]; +extern const float CRendBin_HOA3_HRIR_coeff_im_32kHz[16][BINAURAL_CHANNELS][320]; +extern const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]; +extern const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]; /* Sample Rate = 16000 */ -extern int16_t CRendBin_HOA3_HRIR_max_num_iterations_16kHz; -extern uint16_t CRendBin_HOA3_HRIR_num_iterations_16kHz[16][BINAURAL_CHANNELS]; -extern uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; -extern uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[16][BINAURAL_CHANNELS][2]; -extern uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz; -extern float CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[16]; -extern uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; -extern float CRendBin_HOA3_HRIR_coeff_re_16kHz[16][BINAURAL_CHANNELS][160]; -extern float CRendBin_HOA3_HRIR_coeff_im_16kHz[16][BINAURAL_CHANNELS][160]; -extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; -extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; +extern const int16_t CRendBin_HOA3_HRIR_max_num_iterations_16kHz; +extern const uint16_t CRendBin_HOA3_HRIR_num_iterations_16kHz[16][BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[16][BINAURAL_CHANNELS][2]; +extern const uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz; +extern const float CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[16]; +extern const uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; +extern const float CRendBin_HOA3_HRIR_coeff_re_16kHz[16][BINAURAL_CHANNELS][160]; +extern const float CRendBin_HOA3_HRIR_coeff_im_16kHz[16][BINAURAL_CHANNELS][160]; +extern const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; +extern const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; #endif /* USE_ORANGE_HRIR_53_HOA3S_48000 */ #ifdef USE_HRIR_128_48000_DOLBY_SBA1 @@ -154,49 +153,49 @@ extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; /********************** CRendBin_FOA_HRIR **********************/ -extern float CRendBin_FOA_HRIR_latency_s; +extern const float CRendBin_FOA_HRIR_latency_s; /* Sample Rate = 48000 */ -extern int16_t CRendBin_FOA_HRIR_max_num_iterations_48kHz; -extern uint16_t CRendBin_FOA_HRIR_num_iterations_48kHz[4][BINAURAL_CHANNELS]; -extern uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; -extern uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[4][BINAURAL_CHANNELS][1]; -extern uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_48kHz; -extern float CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz[4]; -extern uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; -extern float CRendBin_FOA_HRIR_coeff_re_48kHz[4][BINAURAL_CHANNELS][240]; -extern float CRendBin_FOA_HRIR_coeff_im_48kHz[4][BINAURAL_CHANNELS][240]; -extern float *CRendBin_FOA_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]; -extern float *CRendBin_FOA_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]; +extern const int16_t CRendBin_FOA_HRIR_max_num_iterations_48kHz; +extern const uint16_t CRendBin_FOA_HRIR_num_iterations_48kHz[4][BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[4][BINAURAL_CHANNELS][1]; +extern const uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_48kHz; +extern const float CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz[4]; +extern const uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; +extern const float CRendBin_FOA_HRIR_coeff_re_48kHz[4][BINAURAL_CHANNELS][240]; +extern const float CRendBin_FOA_HRIR_coeff_im_48kHz[4][BINAURAL_CHANNELS][240]; +extern const float *CRendBin_FOA_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]; +extern const float *CRendBin_FOA_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]; /* Sample Rate = 32000 */ -extern int16_t CRendBin_FOA_HRIR_max_num_iterations_32kHz; -extern uint16_t CRendBin_FOA_HRIR_num_iterations_32kHz[4][BINAURAL_CHANNELS]; -extern uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; -extern uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[4][BINAURAL_CHANNELS][1]; -extern uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_32kHz; -extern float CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz[4]; -extern uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; -extern float CRendBin_FOA_HRIR_coeff_re_32kHz[4][BINAURAL_CHANNELS][160]; -extern float CRendBin_FOA_HRIR_coeff_im_32kHz[4][BINAURAL_CHANNELS][160]; -extern float *CRendBin_FOA_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]; -extern float *CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]; +extern const int16_t CRendBin_FOA_HRIR_max_num_iterations_32kHz; +extern const uint16_t CRendBin_FOA_HRIR_num_iterations_32kHz[4][BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[4][BINAURAL_CHANNELS][1]; +extern const uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_32kHz; +extern const float CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz[4]; +extern const uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; +extern const float CRendBin_FOA_HRIR_coeff_re_32kHz[4][BINAURAL_CHANNELS][160]; +extern const float CRendBin_FOA_HRIR_coeff_im_32kHz[4][BINAURAL_CHANNELS][160]; +extern const float *CRendBin_FOA_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]; +extern const float *CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]; /* Sample Rate = 16000 */ -extern int16_t CRendBin_FOA_HRIR_max_num_iterations_16kHz; -extern uint16_t CRendBin_FOA_HRIR_num_iterations_16kHz[4][BINAURAL_CHANNELS]; -extern uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; -extern uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[4][BINAURAL_CHANNELS][1]; -extern uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_16kHz; -extern float CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz[4]; -extern uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; -extern float CRendBin_FOA_HRIR_coeff_re_16kHz[4][BINAURAL_CHANNELS][80]; -extern float CRendBin_FOA_HRIR_coeff_im_16kHz[4][BINAURAL_CHANNELS][80]; -extern float *CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; -extern float *CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; +extern const int16_t CRendBin_FOA_HRIR_max_num_iterations_16kHz; +extern const uint16_t CRendBin_FOA_HRIR_num_iterations_16kHz[4][BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[4][BINAURAL_CHANNELS][1]; +extern const uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_16kHz; +extern const float CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz[4]; +extern const uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; +extern const float CRendBin_FOA_HRIR_coeff_re_16kHz[4][BINAURAL_CHANNELS][80]; +extern const float CRendBin_FOA_HRIR_coeff_im_16kHz[4][BINAURAL_CHANNELS][80]; +extern const float *CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; +extern const float *CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; #endif /* USE_HRIR_128_48000_DOLBY_SBA1 */ #ifdef USE_HRIR_128_48000_DOLBY_SBA2 @@ -204,49 +203,49 @@ extern float *CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; /********************** CRendBin_HOA2_HRIR **********************/ -extern float CRendBin_HOA2_HRIR_latency_s; +extern const float CRendBin_HOA2_HRIR_latency_s; /* Sample Rate = 48000 */ -extern int16_t CRendBin_HOA2_HRIR_max_num_iterations_48kHz; -extern uint16_t CRendBin_HOA2_HRIR_num_iterations_48kHz[9][BINAURAL_CHANNELS]; -extern uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; -extern uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[9][BINAURAL_CHANNELS][1]; -extern uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_48kHz; -extern float CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz[9]; -extern uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; -extern float CRendBin_HOA2_HRIR_coeff_re_48kHz[9][BINAURAL_CHANNELS][240]; -extern float CRendBin_HOA2_HRIR_coeff_im_48kHz[9][BINAURAL_CHANNELS][240]; -extern float *CRendBin_HOA2_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]; -extern float *CRendBin_HOA2_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]; +extern const int16_t CRendBin_HOA2_HRIR_max_num_iterations_48kHz; +extern const uint16_t CRendBin_HOA2_HRIR_num_iterations_48kHz[9][BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[9][BINAURAL_CHANNELS][1]; +extern const uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_48kHz; +extern const float CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz[9]; +extern const uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; +extern const float CRendBin_HOA2_HRIR_coeff_re_48kHz[9][BINAURAL_CHANNELS][240]; +extern const float CRendBin_HOA2_HRIR_coeff_im_48kHz[9][BINAURAL_CHANNELS][240]; +extern const float *CRendBin_HOA2_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]; +extern const float *CRendBin_HOA2_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]; /* Sample Rate = 32000 */ -extern int16_t CRendBin_HOA2_HRIR_max_num_iterations_32kHz; -extern uint16_t CRendBin_HOA2_HRIR_num_iterations_32kHz[9][BINAURAL_CHANNELS]; -extern uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; -extern uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[9][BINAURAL_CHANNELS][1]; -extern uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_32kHz; -extern float CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz[9]; -extern uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; -extern float CRendBin_HOA2_HRIR_coeff_re_32kHz[9][BINAURAL_CHANNELS][160]; -extern float CRendBin_HOA2_HRIR_coeff_im_32kHz[9][BINAURAL_CHANNELS][160]; -extern float *CRendBin_HOA2_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]; -extern float *CRendBin_HOA2_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]; +extern const int16_t CRendBin_HOA2_HRIR_max_num_iterations_32kHz; +extern const uint16_t CRendBin_HOA2_HRIR_num_iterations_32kHz[9][BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[9][BINAURAL_CHANNELS][1]; +extern const uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_32kHz; +extern const float CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz[9]; +extern const uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; +extern const float CRendBin_HOA2_HRIR_coeff_re_32kHz[9][BINAURAL_CHANNELS][160]; +extern const float CRendBin_HOA2_HRIR_coeff_im_32kHz[9][BINAURAL_CHANNELS][160]; +extern const float *CRendBin_HOA2_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]; +extern const float *CRendBin_HOA2_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]; /* Sample Rate = 16000 */ -extern int16_t CRendBin_HOA2_HRIR_max_num_iterations_16kHz; -extern uint16_t CRendBin_HOA2_HRIR_num_iterations_16kHz[9][BINAURAL_CHANNELS]; -extern uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; -extern uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[9][BINAURAL_CHANNELS][1]; -extern uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_16kHz; -extern float CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz[9]; -extern uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; -extern float CRendBin_HOA2_HRIR_coeff_re_16kHz[9][BINAURAL_CHANNELS][80]; -extern float CRendBin_HOA2_HRIR_coeff_im_16kHz[9][BINAURAL_CHANNELS][80]; -extern float *CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; -extern float *CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; +extern const int16_t CRendBin_HOA2_HRIR_max_num_iterations_16kHz; +extern const uint16_t CRendBin_HOA2_HRIR_num_iterations_16kHz[9][BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[9][BINAURAL_CHANNELS][1]; +extern const uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_16kHz; +extern const float CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz[9]; +extern const uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; +extern const float CRendBin_HOA2_HRIR_coeff_re_16kHz[9][BINAURAL_CHANNELS][80]; +extern const float CRendBin_HOA2_HRIR_coeff_im_16kHz[9][BINAURAL_CHANNELS][80]; +extern const float *CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; +extern const float *CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; #endif /* USE_HRIR_128_48000_DOLBY_SBA2 */ #ifdef USE_HRIR_128_48000_DOLBY_SBA3 @@ -254,49 +253,49 @@ extern float *CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; /********************** CRendBin_HOA3_HRIR **********************/ -extern float CRendBin_HOA3_HRIR_latency_s; +extern const float CRendBin_HOA3_HRIR_latency_s; /* Sample Rate = 48000 */ -extern int16_t CRendBin_HOA3_HRIR_max_num_iterations_48kHz; -extern uint16_t CRendBin_HOA3_HRIR_num_iterations_48kHz[16][BINAURAL_CHANNELS]; -extern uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; -extern uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[16][BINAURAL_CHANNELS][1]; -extern uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz; -extern float CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz[16]; -extern uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; -extern float CRendBin_HOA3_HRIR_coeff_re_48kHz[16][BINAURAL_CHANNELS][240]; -extern float CRendBin_HOA3_HRIR_coeff_im_48kHz[16][BINAURAL_CHANNELS][240]; -extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]; -extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]; +extern const int16_t CRendBin_HOA3_HRIR_max_num_iterations_48kHz; +extern const uint16_t CRendBin_HOA3_HRIR_num_iterations_48kHz[16][BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[16][BINAURAL_CHANNELS][1]; +extern const uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz; +extern const float CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz[16]; +extern const uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; +extern const float CRendBin_HOA3_HRIR_coeff_re_48kHz[16][BINAURAL_CHANNELS][240]; +extern const float CRendBin_HOA3_HRIR_coeff_im_48kHz[16][BINAURAL_CHANNELS][240]; +extern const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]; +extern const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]; /* Sample Rate = 32000 */ -extern int16_t CRendBin_HOA3_HRIR_max_num_iterations_32kHz; -extern uint16_t CRendBin_HOA3_HRIR_num_iterations_32kHz[16][BINAURAL_CHANNELS]; -extern uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; -extern uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[16][BINAURAL_CHANNELS][1]; -extern uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz; -extern float CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz[16]; -extern uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; -extern float CRendBin_HOA3_HRIR_coeff_re_32kHz[16][BINAURAL_CHANNELS][160]; -extern float CRendBin_HOA3_HRIR_coeff_im_32kHz[16][BINAURAL_CHANNELS][160]; -extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]; -extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]; +extern const int16_t CRendBin_HOA3_HRIR_max_num_iterations_32kHz; +extern const uint16_t CRendBin_HOA3_HRIR_num_iterations_32kHz[16][BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[16][BINAURAL_CHANNELS][1]; +extern const uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz; +extern const float CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz[16]; +extern const uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; +extern const float CRendBin_HOA3_HRIR_coeff_re_32kHz[16][BINAURAL_CHANNELS][160]; +extern const float CRendBin_HOA3_HRIR_coeff_im_32kHz[16][BINAURAL_CHANNELS][160]; +extern const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]; +extern const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]; /* Sample Rate = 16000 */ -extern int16_t CRendBin_HOA3_HRIR_max_num_iterations_16kHz; -extern uint16_t CRendBin_HOA3_HRIR_num_iterations_16kHz[16][BINAURAL_CHANNELS]; -extern uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; -extern uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[16][BINAURAL_CHANNELS][1]; -extern uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz; -extern float CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[16]; -extern uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; -extern float CRendBin_HOA3_HRIR_coeff_re_16kHz[16][BINAURAL_CHANNELS][80]; -extern float CRendBin_HOA3_HRIR_coeff_im_16kHz[16][BINAURAL_CHANNELS][80]; -extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; -extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; +extern const int16_t CRendBin_HOA3_HRIR_max_num_iterations_16kHz; +extern const uint16_t CRendBin_HOA3_HRIR_num_iterations_16kHz[16][BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[16][BINAURAL_CHANNELS][1]; +extern const uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz; +extern const float CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[16]; +extern const uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; +extern const float CRendBin_HOA3_HRIR_coeff_re_16kHz[16][BINAURAL_CHANNELS][80]; +extern const float CRendBin_HOA3_HRIR_coeff_im_16kHz[16][BINAURAL_CHANNELS][80]; +extern const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; +extern const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; #endif /* USE_HRIR_128_48000_DOLBY_SBA3 */ #ifdef USE_IIS_BRIR_OFFICIALMPEG_COMBINED @@ -304,49 +303,49 @@ extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; /********************** CRendBin_Combined_BRIR **********************/ -extern float CRendBin_Combined_BRIR_latency_s; +extern const float CRendBin_Combined_BRIR_latency_s; /* Sample Rate = 48000 */ -extern int16_t CRendBin_Combined_BRIR_max_num_iterations_48kHz; -extern uint16_t CRendBin_Combined_BRIR_num_iterations_48kHz[15][BINAURAL_CHANNELS]; -extern uint16_t CRendBin_Combined_BRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; -extern uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz[15][BINAURAL_CHANNELS][22]; -extern uint16_t CRendBin_Combined_BRIR_index_frequency_max_diffuse_48kHz; -extern float CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz[15]; -extern uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS][40]; -extern float CRendBin_Combined_BRIR_coeff_re_48kHz[15][BINAURAL_CHANNELS][2955]; -extern float CRendBin_Combined_BRIR_coeff_im_48kHz[15][BINAURAL_CHANNELS][2955]; -extern float CRendBin_Combined_BRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS][2885]; -extern float CRendBin_Combined_BRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS][2885]; +extern const int16_t CRendBin_Combined_BRIR_max_num_iterations_48kHz; +extern const uint16_t CRendBin_Combined_BRIR_num_iterations_48kHz[15][BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_Combined_BRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz[15][BINAURAL_CHANNELS][22]; +extern const uint16_t CRendBin_Combined_BRIR_index_frequency_max_diffuse_48kHz; +extern const float CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz[15]; +extern const uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS][40]; +extern const float CRendBin_Combined_BRIR_coeff_re_48kHz[15][BINAURAL_CHANNELS][2955]; +extern const float CRendBin_Combined_BRIR_coeff_im_48kHz[15][BINAURAL_CHANNELS][2955]; +extern const float CRendBin_Combined_BRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS][2885]; +extern const float CRendBin_Combined_BRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS][2885]; /* Sample Rate = 32000 */ -extern int16_t CRendBin_Combined_BRIR_max_num_iterations_32kHz; -extern uint16_t CRendBin_Combined_BRIR_num_iterations_32kHz[15][BINAURAL_CHANNELS]; -extern uint16_t CRendBin_Combined_BRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; -extern uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz[15][BINAURAL_CHANNELS][22]; -extern uint16_t CRendBin_Combined_BRIR_index_frequency_max_diffuse_32kHz; -extern float CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz[15]; -extern uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS][40]; -extern float CRendBin_Combined_BRIR_coeff_re_32kHz[15][BINAURAL_CHANNELS][2819]; -extern float CRendBin_Combined_BRIR_coeff_im_32kHz[15][BINAURAL_CHANNELS][2819]; -extern float CRendBin_Combined_BRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS][2870]; -extern float CRendBin_Combined_BRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS][2870]; +extern const int16_t CRendBin_Combined_BRIR_max_num_iterations_32kHz; +extern const uint16_t CRendBin_Combined_BRIR_num_iterations_32kHz[15][BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_Combined_BRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz[15][BINAURAL_CHANNELS][22]; +extern const uint16_t CRendBin_Combined_BRIR_index_frequency_max_diffuse_32kHz; +extern const float CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz[15]; +extern const uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS][40]; +extern const float CRendBin_Combined_BRIR_coeff_re_32kHz[15][BINAURAL_CHANNELS][2819]; +extern const float CRendBin_Combined_BRIR_coeff_im_32kHz[15][BINAURAL_CHANNELS][2819]; +extern const float CRendBin_Combined_BRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS][2870]; +extern const float CRendBin_Combined_BRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS][2870]; /* Sample Rate = 16000 */ -extern int16_t CRendBin_Combined_BRIR_max_num_iterations_16kHz; -extern uint16_t CRendBin_Combined_BRIR_num_iterations_16kHz[15][BINAURAL_CHANNELS]; -extern uint16_t CRendBin_Combined_BRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; -extern uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz[15][BINAURAL_CHANNELS][23]; -extern uint16_t CRendBin_Combined_BRIR_index_frequency_max_diffuse_16kHz; -extern float CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz[15]; -extern uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS][40]; -extern float CRendBin_Combined_BRIR_coeff_re_16kHz[15][BINAURAL_CHANNELS][1774]; -extern float CRendBin_Combined_BRIR_coeff_im_16kHz[15][BINAURAL_CHANNELS][1774]; -extern float CRendBin_Combined_BRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS][2522]; -extern float CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS][2522]; +extern const int16_t CRendBin_Combined_BRIR_max_num_iterations_16kHz; +extern const uint16_t CRendBin_Combined_BRIR_num_iterations_16kHz[15][BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_Combined_BRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; +extern const uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz[15][BINAURAL_CHANNELS][23]; +extern const uint16_t CRendBin_Combined_BRIR_index_frequency_max_diffuse_16kHz; +extern const float CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz[15]; +extern const uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS][40]; +extern const float CRendBin_Combined_BRIR_coeff_re_16kHz[15][BINAURAL_CHANNELS][1774]; +extern const float CRendBin_Combined_BRIR_coeff_im_16kHz[15][BINAURAL_CHANNELS][1774]; +extern const float CRendBin_Combined_BRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS][2522]; +extern const float CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS][2522]; #endif /* USE_IIS_BRIR_OFFICIALMPEG_COMBINED */ #endif /* _IVAS_ROM_BINAURAL_CREND_HEAD_ */ -- GitLab From 4a234cd54d6b43f145f62736fad2e8dfd3aad031 Mon Sep 17 00:00:00 2001 From: emerit Date: Mon, 17 Apr 2023 16:02:40 +0200 Subject: [PATCH 062/331] fix larency_s warning --- .../generate_tables_from_rom_to_bin.c | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/scripts/binauralRenderer_interface/Table_Format_Converter/generate_tables_from_rom_to_bin.c b/scripts/binauralRenderer_interface/Table_Format_Converter/generate_tables_from_rom_to_bin.c index 8ed2ed3711..c2559aa679 100644 --- a/scripts/binauralRenderer_interface/Table_Format_Converter/generate_tables_from_rom_to_bin.c +++ b/scripts/binauralRenderer_interface/Table_Format_Converter/generate_tables_from_rom_to_bin.c @@ -334,7 +334,7 @@ int main( int argc, char *argv[] ) setOfHRTF[nbHRTF] = create_hrtf_tdrend( freq_ptr[k], &hrtf_size ); if ( hrtf_size == -1 ) { - fprintf( stderr, "Creation of HRTF (%d, %d, %d) failed!\n\n", rend_types[i], input_cfgs[j], freq_ptr[k] ); + fprintf( stderr, "Creation of HRTF (%d, %d) failed!\n\n", rend_types[i], freq_ptr[k] ); for ( l = 0; l < nbHRTF; l++ ) { free( setOfHRTF[l] ); @@ -1329,7 +1329,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON { if ( frequency == 48000 ) { - hrtf_table_ptrs_out.latency_s = &CRendBin_Combined_HRIR_latency_s; + hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_Combined_HRIR_latency_s; hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_Combined_HRIR_num_iterations_48kHz ); hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_Combined_HRIR_pIndex_frequency_max_48kHz ); hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_Combined_HRIR_num_iterations_diffuse_48kHz ); @@ -1347,7 +1347,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON } else if ( frequency == 32000 ) { - hrtf_table_ptrs_out.latency_s = &CRendBin_Combined_HRIR_latency_s; + hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_Combined_HRIR_latency_s; hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_Combined_HRIR_num_iterations_32kHz ); hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_Combined_HRIR_pIndex_frequency_max_32kHz ); hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_Combined_HRIR_num_iterations_diffuse_32kHz ); @@ -1365,7 +1365,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON } else if ( frequency == 16000 ) { - hrtf_table_ptrs_out.latency_s = &CRendBin_Combined_HRIR_latency_s; + hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_Combined_HRIR_latency_s; hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_Combined_HRIR_num_iterations_16kHz ); hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_Combined_HRIR_pIndex_frequency_max_16kHz ); hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_Combined_HRIR_num_iterations_diffuse_16kHz ); @@ -1397,7 +1397,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON { if ( frequency == 48000 ) { - hrtf_table_ptrs_out.latency_s = &CRendBin_HOA3_HRIR_latency_s; + hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_HOA3_HRIR_latency_s; hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_HOA3_HRIR_num_iterations_48kHz ); hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz ); hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz ); @@ -1416,7 +1416,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON } else if ( frequency == 32000 ) { - hrtf_table_ptrs_out.latency_s = &CRendBin_HOA3_HRIR_latency_s; + hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_HOA3_HRIR_latency_s; hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_HOA3_HRIR_num_iterations_32kHz ); hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz ); hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz ); @@ -1434,7 +1434,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON } else if ( frequency == 16000 ) { - hrtf_table_ptrs_out.latency_s = &CRendBin_HOA3_HRIR_latency_s; + hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_HOA3_HRIR_latency_s; hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_HOA3_HRIR_num_iterations_16kHz ); hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz ); hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz ); @@ -1463,7 +1463,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON { if ( frequency == 48000 ) { - hrtf_table_ptrs_out.latency_s = &CRendBin_HOA2_HRIR_latency_s; + hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_HOA2_HRIR_latency_s; hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_HOA2_HRIR_num_iterations_48kHz ); hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz ); hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_HOA2_HRIR_num_iterations_diffuse_48kHz ); @@ -1480,7 +1480,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON } else if ( frequency == 32000 ) { - hrtf_table_ptrs_out.latency_s = &CRendBin_HOA2_HRIR_latency_s; + hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_HOA2_HRIR_latency_s; hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_HOA2_HRIR_num_iterations_32kHz ); hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz ); hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_HOA2_HRIR_num_iterations_diffuse_32kHz ); @@ -1497,7 +1497,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON } else if ( frequency == 16000 ) { - hrtf_table_ptrs_out.latency_s = &CRendBin_HOA2_HRIR_latency_s; + hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_HOA2_HRIR_latency_s; hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_HOA2_HRIR_num_iterations_16kHz ); hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz ); hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_HOA2_HRIR_num_iterations_diffuse_16kHz ); @@ -1518,7 +1518,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON { if ( frequency == 48000 ) { - hrtf_table_ptrs_out.latency_s = &CRendBin_FOA_HRIR_latency_s; + hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_FOA_HRIR_latency_s; hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_FOA_HRIR_num_iterations_48kHz ); hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz ); hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_FOA_HRIR_num_iterations_diffuse_48kHz ); @@ -1535,7 +1535,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON } else if ( frequency == 32000 ) { - hrtf_table_ptrs_out.latency_s = &CRendBin_FOA_HRIR_latency_s; + hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_FOA_HRIR_latency_s; hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_FOA_HRIR_num_iterations_32kHz ); hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz ); hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_FOA_HRIR_num_iterations_diffuse_32kHz ); @@ -1552,7 +1552,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON } else if ( frequency == 16000 ) { - hrtf_table_ptrs_out.latency_s = &CRendBin_FOA_HRIR_latency_s; + hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_FOA_HRIR_latency_s; hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_FOA_HRIR_num_iterations_16kHz ); hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz ); hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_FOA_HRIR_num_iterations_diffuse_16kHz ); @@ -1577,7 +1577,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON { if ( frequency == 48000 ) { - hrtf_table_ptrs_out.latency_s = &CRendBin_Combined_BRIR_latency_s; + hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_Combined_BRIR_latency_s; hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_Combined_BRIR_num_iterations_48kHz ); hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz ); hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_Combined_BRIR_num_iterations_diffuse_48kHz ); @@ -1595,7 +1595,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON } else if ( frequency == 32000 ) { - hrtf_table_ptrs_out.latency_s = &CRendBin_Combined_BRIR_latency_s; + hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_Combined_BRIR_latency_s; hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_Combined_BRIR_num_iterations_32kHz ); hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz ); hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_Combined_BRIR_num_iterations_diffuse_32kHz ); @@ -1613,7 +1613,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON } else if ( frequency == 16000 ) { - hrtf_table_ptrs_out.latency_s = &CRendBin_Combined_BRIR_latency_s; + hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_Combined_BRIR_latency_s; hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_Combined_BRIR_num_iterations_16kHz ); hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz ); hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_Combined_BRIR_num_iterations_diffuse_16kHz ); -- GitLab From 3c59bbd17d9a5cb49414cdbbc7b7072ece4c1006 Mon Sep 17 00:00:00 2001 From: emerit Date: Mon, 17 Apr 2023 17:54:18 +0200 Subject: [PATCH 063/331] fix const declaration in crend rom --- lib_rend/ivas_crend.c | 220 ++++++------- lib_rend/ivas_rom_binaural_crend_head.c | 9 +- lib_rend/ivas_rom_binaural_crend_head.h | 408 ++++++++++++------------ 3 files changed, 322 insertions(+), 315 deletions(-) diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index 3e14ccb125..6395565cfb 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -241,16 +241,16 @@ static ivas_error ivas_rend_initCrend( if ( use_brir ) { hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_BRIR_num_iterations_diffuse_48kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_Combined_BRIR_coeff_diffuse_re_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_Combined_BRIR_coeff_diffuse_im_48kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_BRIR_coeff_diffuse_re_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_BRIR_coeff_diffuse_im_48kHz[j]; } else { hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_HRIR_num_iterations_diffuse_48kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_Combined_HRIR_coeff_diffuse_re_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_Combined_HRIR_coeff_diffuse_im_48kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_HRIR_coeff_diffuse_re_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_HRIR_coeff_diffuse_im_48kHz[j]; } } } @@ -274,16 +274,16 @@ static ivas_error ivas_rend_initCrend( if ( use_brir ) { hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_BRIR_num_iterations_diffuse_32kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_Combined_BRIR_coeff_diffuse_re_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_Combined_BRIR_coeff_diffuse_im_32kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_BRIR_coeff_diffuse_re_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_BRIR_coeff_diffuse_im_32kHz[j]; } else { hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_HRIR_num_iterations_diffuse_32kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_Combined_HRIR_coeff_diffuse_re_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_Combined_HRIR_coeff_diffuse_im_32kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_HRIR_coeff_diffuse_re_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_HRIR_coeff_diffuse_im_32kHz[j]; } } } @@ -307,16 +307,16 @@ static ivas_error ivas_rend_initCrend( if ( use_brir ) { hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_BRIR_num_iterations_diffuse_16kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_Combined_BRIR_coeff_diffuse_re_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_BRIR_coeff_diffuse_re_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz[j]; } else { hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_HRIR_num_iterations_diffuse_16kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz[j]; } } } @@ -368,16 +368,16 @@ static ivas_error ivas_rend_initCrend( if ( use_brir ) { hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_48kHz[tmp][j]; - hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz[tmp][j]; - hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_Combined_BRIR_coeff_re_48kHz[tmp][j]; - hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_Combined_BRIR_coeff_im_48kHz[tmp][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz[tmp][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_BRIR_coeff_re_48kHz[tmp][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_BRIR_coeff_im_48kHz[tmp][j]; } else { hHrtf->num_iterations[i][j] = CRendBin_Combined_HRIR_num_iterations_48kHz[tmp][j]; - hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_Combined_HRIR_pIndex_frequency_max_48kHz[tmp][j]; - hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_Combined_HRIR_coeff_re_48kHz[tmp][j]; - hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_Combined_HRIR_coeff_im_48kHz[tmp][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_HRIR_pIndex_frequency_max_48kHz[tmp][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_HRIR_coeff_re_48kHz[tmp][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_HRIR_coeff_im_48kHz[tmp][j]; } } } @@ -397,16 +397,16 @@ static ivas_error ivas_rend_initCrend( if ( use_brir ) { hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_32kHz[tmp][j]; - hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz[tmp][j]; - hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_Combined_BRIR_coeff_re_32kHz[tmp][j]; - hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_Combined_BRIR_coeff_im_32kHz[tmp][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz[tmp][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_BRIR_coeff_re_32kHz[tmp][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_BRIR_coeff_im_32kHz[tmp][j]; } else { hHrtf->num_iterations[i][j] = CRendBin_Combined_HRIR_num_iterations_32kHz[tmp][j]; - hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_Combined_HRIR_pIndex_frequency_max_32kHz[tmp][j]; - hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_Combined_HRIR_coeff_re_32kHz[tmp][j]; - hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_Combined_HRIR_coeff_im_32kHz[tmp][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_HRIR_pIndex_frequency_max_32kHz[tmp][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_HRIR_coeff_re_32kHz[tmp][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_HRIR_coeff_im_32kHz[tmp][j]; } } } @@ -426,16 +426,16 @@ static ivas_error ivas_rend_initCrend( if ( use_brir ) { hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_16kHz[tmp][j]; - hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz[tmp][j]; - hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_Combined_BRIR_coeff_re_16kHz[tmp][j]; - hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_Combined_BRIR_coeff_im_16kHz[tmp][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz[tmp][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_BRIR_coeff_re_16kHz[tmp][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_BRIR_coeff_im_16kHz[tmp][j]; } else { hHrtf->num_iterations[i][j] = CRendBin_Combined_HRIR_num_iterations_16kHz[tmp][j]; - hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_Combined_HRIR_pIndex_frequency_max_16kHz[tmp][j]; - hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_Combined_HRIR_coeff_re_16kHz[tmp][j]; - hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_Combined_HRIR_coeff_im_16kHz[tmp][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_HRIR_pIndex_frequency_max_16kHz[tmp][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_HRIR_coeff_re_16kHz[tmp][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_HRIR_coeff_im_16kHz[tmp][j]; } } } @@ -465,17 +465,17 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_48kHz[i][j]; - hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[i][j]; - hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_HOA3_HRIR_coeff_re_48kHz[i][j]; - hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_HOA3_HRIR_coeff_im_48kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_48kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_48kHz[i][j]; } } for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[j]; } } else if ( output_Fs == 32000 ) @@ -491,18 +491,18 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_32kHz[i][j]; - hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[i][j]; - hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_HOA3_HRIR_coeff_re_32kHz[i][j]; - hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_HOA3_HRIR_coeff_im_32kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_32kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_32kHz[i][j]; } } for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[j]; } } else if ( output_Fs == 16000 ) @@ -518,18 +518,18 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_16kHz[i][j]; - hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[i][j]; - hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_HOA3_HRIR_coeff_re_16kHz[i][j]; - hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_HOA3_HRIR_coeff_im_16kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_16kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_16kHz[i][j]; } } for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[j]; } } #ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS @@ -549,17 +549,17 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations[i][j] = CRendBin_HOA2_HRIR_num_iterations_48kHz[i][j]; - hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[i][j]; - hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_HOA2_HRIR_coeff_re_48kHz[i][j]; - hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_HOA2_HRIR_coeff_im_48kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA2_HRIR_coeff_re_48kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA2_HRIR_coeff_im_48kHz[i][j]; } } for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations_diffuse[j] = CRendBin_HOA2_HRIR_num_iterations_diffuse_48kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_HOA2_HRIR_coeff_diffuse_re_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_HOA2_HRIR_coeff_diffuse_im_48kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA2_HRIR_coeff_diffuse_re_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA2_HRIR_coeff_diffuse_im_48kHz[j]; } } else if ( output_Fs == 32000 ) @@ -575,18 +575,18 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations[i][j] = CRendBin_HOA2_HRIR_num_iterations_32kHz[i][j]; - hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[i][j]; - hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_HOA2_HRIR_coeff_re_32kHz[i][j]; - hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_HOA2_HRIR_coeff_im_32kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA2_HRIR_coeff_re_32kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA2_HRIR_coeff_im_32kHz[i][j]; } } for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations_diffuse[j] = CRendBin_HOA2_HRIR_num_iterations_diffuse_32kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_HOA2_HRIR_coeff_diffuse_re_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_HOA2_HRIR_coeff_diffuse_im_32kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA2_HRIR_coeff_diffuse_re_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA2_HRIR_coeff_diffuse_im_32kHz[j]; } } else if ( output_Fs == 16000 ) @@ -602,18 +602,18 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations[i][j] = CRendBin_HOA2_HRIR_num_iterations_16kHz[i][j]; - hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[i][j]; - hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_HOA2_HRIR_coeff_re_16kHz[i][j]; - hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_HOA2_HRIR_coeff_im_16kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA2_HRIR_coeff_re_16kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA2_HRIR_coeff_im_16kHz[i][j]; } } for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations_diffuse[j] = CRendBin_HOA2_HRIR_num_iterations_diffuse_16kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz[j]; } } } @@ -632,17 +632,17 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations[i][j] = CRendBin_FOA_HRIR_num_iterations_48kHz[i][j]; - hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[i][j]; - hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_FOA_HRIR_coeff_re_48kHz[i][j]; - hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_FOA_HRIR_coeff_im_48kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_FOA_HRIR_coeff_re_48kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_FOA_HRIR_coeff_im_48kHz[i][j]; } } for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations_diffuse[j] = CRendBin_FOA_HRIR_num_iterations_diffuse_48kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_FOA_HRIR_coeff_diffuse_re_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_FOA_HRIR_coeff_diffuse_im_48kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_FOA_HRIR_coeff_diffuse_re_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_FOA_HRIR_coeff_diffuse_im_48kHz[j]; } } else if ( output_Fs == 32000 ) @@ -658,18 +658,18 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations[i][j] = CRendBin_FOA_HRIR_num_iterations_32kHz[i][j]; - hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[i][j]; - hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_FOA_HRIR_coeff_re_32kHz[i][j]; - hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_FOA_HRIR_coeff_im_32kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_FOA_HRIR_coeff_re_32kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_FOA_HRIR_coeff_im_32kHz[i][j]; } } for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations_diffuse[j] = CRendBin_FOA_HRIR_num_iterations_diffuse_32kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_FOA_HRIR_coeff_diffuse_re_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_FOA_HRIR_coeff_diffuse_re_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz[j]; } } else if ( output_Fs == 16000 ) @@ -685,18 +685,18 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations[i][j] = CRendBin_FOA_HRIR_num_iterations_16kHz[i][j]; - hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[i][j]; - hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_FOA_HRIR_coeff_re_16kHz[i][j]; - hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_FOA_HRIR_coeff_im_16kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_FOA_HRIR_coeff_re_16kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_FOA_HRIR_coeff_im_16kHz[i][j]; } } for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations_diffuse[j] = CRendBin_FOA_HRIR_num_iterations_diffuse_16kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz[j]; } } } @@ -720,17 +720,17 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_48kHz[i][j]; - hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[i][j]; - hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_HOA3_HRIR_coeff_re_48kHz[i][j]; - hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_HOA3_HRIR_coeff_im_48kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_48kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_48kHz[i][j]; } } for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[j]; } } else if ( output_Fs == 32000 ) @@ -746,18 +746,18 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_32kHz[i][j]; - hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[i][j]; - hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_HOA3_HRIR_coeff_re_32kHz[i][j]; - hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_HOA3_HRIR_coeff_im_32kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_32kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_32kHz[i][j]; } } for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[j]; } } else if ( output_Fs == 16000 ) @@ -773,18 +773,18 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_16kHz[i][j]; - hHrtf->pIndex_frequency_max[i][j] = (uint16_t *) CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[i][j]; - hHrtf->pOut_to_bin_re[i][j] = (float *) CRendBin_HOA3_HRIR_coeff_re_16kHz[i][j]; - hHrtf->pOut_to_bin_im[i][j] = (float *) CRendBin_HOA3_HRIR_coeff_im_16kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_16kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_16kHz[i][j]; } } for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = (uint16_t *) CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = (float *) CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = (float *) CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[j]; } } else @@ -1302,9 +1302,9 @@ static ivas_error ivas_rend_crendConvolver( int16_t lfe_idx_in; int16_t offset, offset_in, offset_diffuse; int16_t nchan_in, nchan_out; - float *pIn; + const float *pIn; float *pFreq_buf_re, *pFreq_buf_im; - float *pFreq_filt_re, *pFreq_filt_im; + const float *pFreq_filt_re, *pFreq_filt_im; float pOut[L_FRAME48k * 2]; float tmp_out_re[L_FRAME48k], tmp_out_im[L_FRAME48k]; ivas_error error; diff --git a/lib_rend/ivas_rom_binaural_crend_head.c b/lib_rend/ivas_rom_binaural_crend_head.c index 23382578a1..ba086d3ea8 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.c +++ b/lib_rend/ivas_rom_binaural_crend_head.c @@ -42,7 +42,14 @@ -#include "ivas_rom_binaural_crend_head.h" +#include +#include +#ifdef DEBUGGING +#include "debug.h" +#endif +#include "cnst.h" +#include "ivas_cnst.h" + #ifdef USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 diff --git a/lib_rend/ivas_rom_binaural_crend_head.h b/lib_rend/ivas_rom_binaural_crend_head.h index cbcf0a8b02..8e9fd68f38 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.h +++ b/lib_rend/ivas_rom_binaural_crend_head.h @@ -53,49 +53,49 @@ /********************** CRendBin_Combined_HRIR **********************/ -extern const float CRendBin_Combined_HRIR_latency_s; +extern float CRendBin_Combined_HRIR_latency_s; /* Sample Rate = 48000 */ -extern const int16_t CRendBin_Combined_HRIR_max_num_iterations_48kHz; -extern const uint16_t CRendBin_Combined_HRIR_num_iterations_48kHz[15][BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_Combined_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_Combined_HRIR_pIndex_frequency_max_48kHz[15][BINAURAL_CHANNELS][1]; -extern const uint16_t CRendBin_Combined_HRIR_index_frequency_max_diffuse_48kHz; -extern const float CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz[15]; -extern const uint16_t *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; -extern const float CRendBin_Combined_HRIR_coeff_re_48kHz[15][BINAURAL_CHANNELS][240]; -extern const float CRendBin_Combined_HRIR_coeff_im_48kHz[15][BINAURAL_CHANNELS][240]; -extern const float *CRendBin_Combined_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]; -extern const float *CRendBin_Combined_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]; +extern int16_t CRendBin_Combined_HRIR_max_num_iterations_48kHz; +extern uint16_t CRendBin_Combined_HRIR_num_iterations_48kHz[15][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_Combined_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_Combined_HRIR_pIndex_frequency_max_48kHz[15][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_Combined_HRIR_index_frequency_max_diffuse_48kHz; +extern float CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz[15]; +extern uint16_t *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; +extern float CRendBin_Combined_HRIR_coeff_re_48kHz[15][BINAURAL_CHANNELS][240]; +extern float CRendBin_Combined_HRIR_coeff_im_48kHz[15][BINAURAL_CHANNELS][240]; +extern float *CRendBin_Combined_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_Combined_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]; /* Sample Rate = 32000 */ -extern const int16_t CRendBin_Combined_HRIR_max_num_iterations_32kHz; -extern const uint16_t CRendBin_Combined_HRIR_num_iterations_32kHz[15][BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_Combined_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_Combined_HRIR_pIndex_frequency_max_32kHz[15][BINAURAL_CHANNELS][1]; -extern const uint16_t CRendBin_Combined_HRIR_index_frequency_max_diffuse_32kHz; -extern const float CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz[15]; -extern const uint16_t *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; -extern const float CRendBin_Combined_HRIR_coeff_re_32kHz[15][BINAURAL_CHANNELS][160]; -extern const float CRendBin_Combined_HRIR_coeff_im_32kHz[15][BINAURAL_CHANNELS][160]; -extern const float *CRendBin_Combined_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]; -extern const float *CRendBin_Combined_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]; +extern int16_t CRendBin_Combined_HRIR_max_num_iterations_32kHz; +extern uint16_t CRendBin_Combined_HRIR_num_iterations_32kHz[15][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_Combined_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_Combined_HRIR_pIndex_frequency_max_32kHz[15][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_Combined_HRIR_index_frequency_max_diffuse_32kHz; +extern float CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz[15]; +extern uint16_t *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; +extern float CRendBin_Combined_HRIR_coeff_re_32kHz[15][BINAURAL_CHANNELS][160]; +extern float CRendBin_Combined_HRIR_coeff_im_32kHz[15][BINAURAL_CHANNELS][160]; +extern float *CRendBin_Combined_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_Combined_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]; /* Sample Rate = 16000 */ -extern const int16_t CRendBin_Combined_HRIR_max_num_iterations_16kHz; -extern const uint16_t CRendBin_Combined_HRIR_num_iterations_16kHz[15][BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_Combined_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_Combined_HRIR_pIndex_frequency_max_16kHz[15][BINAURAL_CHANNELS][1]; -extern const uint16_t CRendBin_Combined_HRIR_index_frequency_max_diffuse_16kHz; -extern const float CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz[15]; -extern const uint16_t *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; -extern const float CRendBin_Combined_HRIR_coeff_re_16kHz[15][BINAURAL_CHANNELS][80]; -extern const float CRendBin_Combined_HRIR_coeff_im_16kHz[15][BINAURAL_CHANNELS][80]; -extern const float *CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; -extern const float *CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; +extern int16_t CRendBin_Combined_HRIR_max_num_iterations_16kHz; +extern uint16_t CRendBin_Combined_HRIR_num_iterations_16kHz[15][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_Combined_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_Combined_HRIR_pIndex_frequency_max_16kHz[15][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_Combined_HRIR_index_frequency_max_diffuse_16kHz; +extern float CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz[15]; +extern uint16_t *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; +extern float CRendBin_Combined_HRIR_coeff_re_16kHz[15][BINAURAL_CHANNELS][80]; +extern float CRendBin_Combined_HRIR_coeff_im_16kHz[15][BINAURAL_CHANNELS][80]; +extern float *CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; #endif /* USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 */ #ifdef USE_ORANGE_HRIR_53_HOA3S_48000 @@ -103,49 +103,49 @@ extern const float *CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANN /********************** CRendBin_HOA3_HRIR **********************/ -extern const float CRendBin_HOA3_HRIR_latency_s; +extern float CRendBin_HOA3_HRIR_latency_s; /* Sample Rate = 48000 */ -extern const int16_t CRendBin_HOA3_HRIR_max_num_iterations_48kHz; -extern const uint16_t CRendBin_HOA3_HRIR_num_iterations_48kHz[16][BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[16][BINAURAL_CHANNELS][2]; -extern const uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz; -extern const float CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz[16]; -extern const uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; -extern const float CRendBin_HOA3_HRIR_coeff_re_48kHz[16][BINAURAL_CHANNELS][480]; -extern const float CRendBin_HOA3_HRIR_coeff_im_48kHz[16][BINAURAL_CHANNELS][480]; -extern const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]; -extern const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]; +extern int16_t CRendBin_HOA3_HRIR_max_num_iterations_48kHz; +extern uint16_t CRendBin_HOA3_HRIR_num_iterations_48kHz[16][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[16][BINAURAL_CHANNELS][2]; +extern uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz; +extern float CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz[16]; +extern uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; +extern float CRendBin_HOA3_HRIR_coeff_re_48kHz[16][BINAURAL_CHANNELS][480]; +extern float CRendBin_HOA3_HRIR_coeff_im_48kHz[16][BINAURAL_CHANNELS][480]; +extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]; /* Sample Rate = 32000 */ -extern const int16_t CRendBin_HOA3_HRIR_max_num_iterations_32kHz; -extern const uint16_t CRendBin_HOA3_HRIR_num_iterations_32kHz[16][BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[16][BINAURAL_CHANNELS][2]; -extern const uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz; -extern const float CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz[16]; -extern const uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; -extern const float CRendBin_HOA3_HRIR_coeff_re_32kHz[16][BINAURAL_CHANNELS][320]; -extern const float CRendBin_HOA3_HRIR_coeff_im_32kHz[16][BINAURAL_CHANNELS][320]; -extern const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]; -extern const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]; +extern int16_t CRendBin_HOA3_HRIR_max_num_iterations_32kHz; +extern uint16_t CRendBin_HOA3_HRIR_num_iterations_32kHz[16][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[16][BINAURAL_CHANNELS][2]; +extern uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz; +extern float CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz[16]; +extern uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; +extern float CRendBin_HOA3_HRIR_coeff_re_32kHz[16][BINAURAL_CHANNELS][320]; +extern float CRendBin_HOA3_HRIR_coeff_im_32kHz[16][BINAURAL_CHANNELS][320]; +extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]; /* Sample Rate = 16000 */ -extern const int16_t CRendBin_HOA3_HRIR_max_num_iterations_16kHz; -extern const uint16_t CRendBin_HOA3_HRIR_num_iterations_16kHz[16][BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[16][BINAURAL_CHANNELS][2]; -extern const uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz; -extern const float CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[16]; -extern const uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; -extern const float CRendBin_HOA3_HRIR_coeff_re_16kHz[16][BINAURAL_CHANNELS][160]; -extern const float CRendBin_HOA3_HRIR_coeff_im_16kHz[16][BINAURAL_CHANNELS][160]; -extern const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; -extern const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; +extern int16_t CRendBin_HOA3_HRIR_max_num_iterations_16kHz; +extern uint16_t CRendBin_HOA3_HRIR_num_iterations_16kHz[16][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[16][BINAURAL_CHANNELS][2]; +extern uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz; +extern float CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[16]; +extern uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; +extern float CRendBin_HOA3_HRIR_coeff_re_16kHz[16][BINAURAL_CHANNELS][160]; +extern float CRendBin_HOA3_HRIR_coeff_im_16kHz[16][BINAURAL_CHANNELS][160]; +extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; #endif /* USE_ORANGE_HRIR_53_HOA3S_48000 */ #ifdef USE_HRIR_128_48000_DOLBY_SBA1 @@ -153,49 +153,49 @@ extern const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS] /********************** CRendBin_FOA_HRIR **********************/ -extern const float CRendBin_FOA_HRIR_latency_s; +extern float CRendBin_FOA_HRIR_latency_s; /* Sample Rate = 48000 */ -extern const int16_t CRendBin_FOA_HRIR_max_num_iterations_48kHz; -extern const uint16_t CRendBin_FOA_HRIR_num_iterations_48kHz[4][BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[4][BINAURAL_CHANNELS][1]; -extern const uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_48kHz; -extern const float CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz[4]; -extern const uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; -extern const float CRendBin_FOA_HRIR_coeff_re_48kHz[4][BINAURAL_CHANNELS][240]; -extern const float CRendBin_FOA_HRIR_coeff_im_48kHz[4][BINAURAL_CHANNELS][240]; -extern const float *CRendBin_FOA_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]; -extern const float *CRendBin_FOA_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]; +extern int16_t CRendBin_FOA_HRIR_max_num_iterations_48kHz; +extern uint16_t CRendBin_FOA_HRIR_num_iterations_48kHz[4][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[4][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_48kHz; +extern float CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz[4]; +extern uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; +extern float CRendBin_FOA_HRIR_coeff_re_48kHz[4][BINAURAL_CHANNELS][240]; +extern float CRendBin_FOA_HRIR_coeff_im_48kHz[4][BINAURAL_CHANNELS][240]; +extern float *CRendBin_FOA_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_FOA_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]; /* Sample Rate = 32000 */ -extern const int16_t CRendBin_FOA_HRIR_max_num_iterations_32kHz; -extern const uint16_t CRendBin_FOA_HRIR_num_iterations_32kHz[4][BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[4][BINAURAL_CHANNELS][1]; -extern const uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_32kHz; -extern const float CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz[4]; -extern const uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; -extern const float CRendBin_FOA_HRIR_coeff_re_32kHz[4][BINAURAL_CHANNELS][160]; -extern const float CRendBin_FOA_HRIR_coeff_im_32kHz[4][BINAURAL_CHANNELS][160]; -extern const float *CRendBin_FOA_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]; -extern const float *CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]; +extern int16_t CRendBin_FOA_HRIR_max_num_iterations_32kHz; +extern uint16_t CRendBin_FOA_HRIR_num_iterations_32kHz[4][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[4][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_32kHz; +extern float CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz[4]; +extern uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; +extern float CRendBin_FOA_HRIR_coeff_re_32kHz[4][BINAURAL_CHANNELS][160]; +extern float CRendBin_FOA_HRIR_coeff_im_32kHz[4][BINAURAL_CHANNELS][160]; +extern float *CRendBin_FOA_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]; /* Sample Rate = 16000 */ -extern const int16_t CRendBin_FOA_HRIR_max_num_iterations_16kHz; -extern const uint16_t CRendBin_FOA_HRIR_num_iterations_16kHz[4][BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[4][BINAURAL_CHANNELS][1]; -extern const uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_16kHz; -extern const float CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz[4]; -extern const uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; -extern const float CRendBin_FOA_HRIR_coeff_re_16kHz[4][BINAURAL_CHANNELS][80]; -extern const float CRendBin_FOA_HRIR_coeff_im_16kHz[4][BINAURAL_CHANNELS][80]; -extern const float *CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; -extern const float *CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; +extern int16_t CRendBin_FOA_HRIR_max_num_iterations_16kHz; +extern uint16_t CRendBin_FOA_HRIR_num_iterations_16kHz[4][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[4][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_16kHz; +extern float CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz[4]; +extern uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; +extern float CRendBin_FOA_HRIR_coeff_re_16kHz[4][BINAURAL_CHANNELS][80]; +extern float CRendBin_FOA_HRIR_coeff_im_16kHz[4][BINAURAL_CHANNELS][80]; +extern float *CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; #endif /* USE_HRIR_128_48000_DOLBY_SBA1 */ #ifdef USE_HRIR_128_48000_DOLBY_SBA2 @@ -203,49 +203,49 @@ extern const float *CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; /********************** CRendBin_HOA2_HRIR **********************/ -extern const float CRendBin_HOA2_HRIR_latency_s; +extern float CRendBin_HOA2_HRIR_latency_s; /* Sample Rate = 48000 */ -extern const int16_t CRendBin_HOA2_HRIR_max_num_iterations_48kHz; -extern const uint16_t CRendBin_HOA2_HRIR_num_iterations_48kHz[9][BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[9][BINAURAL_CHANNELS][1]; -extern const uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_48kHz; -extern const float CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz[9]; -extern const uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; -extern const float CRendBin_HOA2_HRIR_coeff_re_48kHz[9][BINAURAL_CHANNELS][240]; -extern const float CRendBin_HOA2_HRIR_coeff_im_48kHz[9][BINAURAL_CHANNELS][240]; -extern const float *CRendBin_HOA2_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]; -extern const float *CRendBin_HOA2_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]; +extern int16_t CRendBin_HOA2_HRIR_max_num_iterations_48kHz; +extern uint16_t CRendBin_HOA2_HRIR_num_iterations_48kHz[9][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[9][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_48kHz; +extern float CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz[9]; +extern uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; +extern float CRendBin_HOA2_HRIR_coeff_re_48kHz[9][BINAURAL_CHANNELS][240]; +extern float CRendBin_HOA2_HRIR_coeff_im_48kHz[9][BINAURAL_CHANNELS][240]; +extern float *CRendBin_HOA2_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_HOA2_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]; /* Sample Rate = 32000 */ -extern const int16_t CRendBin_HOA2_HRIR_max_num_iterations_32kHz; -extern const uint16_t CRendBin_HOA2_HRIR_num_iterations_32kHz[9][BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[9][BINAURAL_CHANNELS][1]; -extern const uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_32kHz; -extern const float CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz[9]; -extern const uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; -extern const float CRendBin_HOA2_HRIR_coeff_re_32kHz[9][BINAURAL_CHANNELS][160]; -extern const float CRendBin_HOA2_HRIR_coeff_im_32kHz[9][BINAURAL_CHANNELS][160]; -extern const float *CRendBin_HOA2_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]; -extern const float *CRendBin_HOA2_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]; +extern int16_t CRendBin_HOA2_HRIR_max_num_iterations_32kHz; +extern uint16_t CRendBin_HOA2_HRIR_num_iterations_32kHz[9][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[9][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_32kHz; +extern float CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz[9]; +extern uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; +extern float CRendBin_HOA2_HRIR_coeff_re_32kHz[9][BINAURAL_CHANNELS][160]; +extern float CRendBin_HOA2_HRIR_coeff_im_32kHz[9][BINAURAL_CHANNELS][160]; +extern float *CRendBin_HOA2_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_HOA2_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]; /* Sample Rate = 16000 */ -extern const int16_t CRendBin_HOA2_HRIR_max_num_iterations_16kHz; -extern const uint16_t CRendBin_HOA2_HRIR_num_iterations_16kHz[9][BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[9][BINAURAL_CHANNELS][1]; -extern const uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_16kHz; -extern const float CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz[9]; -extern const uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; -extern const float CRendBin_HOA2_HRIR_coeff_re_16kHz[9][BINAURAL_CHANNELS][80]; -extern const float CRendBin_HOA2_HRIR_coeff_im_16kHz[9][BINAURAL_CHANNELS][80]; -extern const float *CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; -extern const float *CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; +extern int16_t CRendBin_HOA2_HRIR_max_num_iterations_16kHz; +extern uint16_t CRendBin_HOA2_HRIR_num_iterations_16kHz[9][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[9][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_16kHz; +extern float CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz[9]; +extern uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; +extern float CRendBin_HOA2_HRIR_coeff_re_16kHz[9][BINAURAL_CHANNELS][80]; +extern float CRendBin_HOA2_HRIR_coeff_im_16kHz[9][BINAURAL_CHANNELS][80]; +extern float *CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; #endif /* USE_HRIR_128_48000_DOLBY_SBA2 */ #ifdef USE_HRIR_128_48000_DOLBY_SBA3 @@ -253,49 +253,49 @@ extern const float *CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS] /********************** CRendBin_HOA3_HRIR **********************/ -extern const float CRendBin_HOA3_HRIR_latency_s; +extern float CRendBin_HOA3_HRIR_latency_s; /* Sample Rate = 48000 */ -extern const int16_t CRendBin_HOA3_HRIR_max_num_iterations_48kHz; -extern const uint16_t CRendBin_HOA3_HRIR_num_iterations_48kHz[16][BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[16][BINAURAL_CHANNELS][1]; -extern const uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz; -extern const float CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz[16]; -extern const uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; -extern const float CRendBin_HOA3_HRIR_coeff_re_48kHz[16][BINAURAL_CHANNELS][240]; -extern const float CRendBin_HOA3_HRIR_coeff_im_48kHz[16][BINAURAL_CHANNELS][240]; -extern const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]; -extern const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]; +extern int16_t CRendBin_HOA3_HRIR_max_num_iterations_48kHz; +extern uint16_t CRendBin_HOA3_HRIR_num_iterations_48kHz[16][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[16][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz; +extern float CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz[16]; +extern uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; +extern float CRendBin_HOA3_HRIR_coeff_re_48kHz[16][BINAURAL_CHANNELS][240]; +extern float CRendBin_HOA3_HRIR_coeff_im_48kHz[16][BINAURAL_CHANNELS][240]; +extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]; /* Sample Rate = 32000 */ -extern const int16_t CRendBin_HOA3_HRIR_max_num_iterations_32kHz; -extern const uint16_t CRendBin_HOA3_HRIR_num_iterations_32kHz[16][BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[16][BINAURAL_CHANNELS][1]; -extern const uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz; -extern const float CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz[16]; -extern const uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; -extern const float CRendBin_HOA3_HRIR_coeff_re_32kHz[16][BINAURAL_CHANNELS][160]; -extern const float CRendBin_HOA3_HRIR_coeff_im_32kHz[16][BINAURAL_CHANNELS][160]; -extern const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]; -extern const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]; +extern int16_t CRendBin_HOA3_HRIR_max_num_iterations_32kHz; +extern uint16_t CRendBin_HOA3_HRIR_num_iterations_32kHz[16][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[16][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz; +extern float CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz[16]; +extern uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; +extern float CRendBin_HOA3_HRIR_coeff_re_32kHz[16][BINAURAL_CHANNELS][160]; +extern float CRendBin_HOA3_HRIR_coeff_im_32kHz[16][BINAURAL_CHANNELS][160]; +extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]; /* Sample Rate = 16000 */ -extern const int16_t CRendBin_HOA3_HRIR_max_num_iterations_16kHz; -extern const uint16_t CRendBin_HOA3_HRIR_num_iterations_16kHz[16][BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[16][BINAURAL_CHANNELS][1]; -extern const uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz; -extern const float CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[16]; -extern const uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; -extern const float CRendBin_HOA3_HRIR_coeff_re_16kHz[16][BINAURAL_CHANNELS][80]; -extern const float CRendBin_HOA3_HRIR_coeff_im_16kHz[16][BINAURAL_CHANNELS][80]; -extern const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; -extern const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; +extern int16_t CRendBin_HOA3_HRIR_max_num_iterations_16kHz; +extern uint16_t CRendBin_HOA3_HRIR_num_iterations_16kHz[16][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[16][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz; +extern float CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[16]; +extern uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; +extern float CRendBin_HOA3_HRIR_coeff_re_16kHz[16][BINAURAL_CHANNELS][80]; +extern float CRendBin_HOA3_HRIR_coeff_im_16kHz[16][BINAURAL_CHANNELS][80]; +extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; #endif /* USE_HRIR_128_48000_DOLBY_SBA3 */ #ifdef USE_IIS_BRIR_OFFICIALMPEG_COMBINED @@ -303,49 +303,49 @@ extern const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS] /********************** CRendBin_Combined_BRIR **********************/ -extern const float CRendBin_Combined_BRIR_latency_s; +extern float CRendBin_Combined_BRIR_latency_s; /* Sample Rate = 48000 */ -extern const int16_t CRendBin_Combined_BRIR_max_num_iterations_48kHz; -extern const uint16_t CRendBin_Combined_BRIR_num_iterations_48kHz[15][BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_Combined_BRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz[15][BINAURAL_CHANNELS][22]; -extern const uint16_t CRendBin_Combined_BRIR_index_frequency_max_diffuse_48kHz; -extern const float CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz[15]; -extern const uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS][40]; -extern const float CRendBin_Combined_BRIR_coeff_re_48kHz[15][BINAURAL_CHANNELS][2955]; -extern const float CRendBin_Combined_BRIR_coeff_im_48kHz[15][BINAURAL_CHANNELS][2955]; -extern const float CRendBin_Combined_BRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS][2885]; -extern const float CRendBin_Combined_BRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS][2885]; +extern int16_t CRendBin_Combined_BRIR_max_num_iterations_48kHz; +extern uint16_t CRendBin_Combined_BRIR_num_iterations_48kHz[15][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_Combined_BRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz[15][BINAURAL_CHANNELS][22]; +extern uint16_t CRendBin_Combined_BRIR_index_frequency_max_diffuse_48kHz; +extern float CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz[15]; +extern uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS][40]; +extern float CRendBin_Combined_BRIR_coeff_re_48kHz[15][BINAURAL_CHANNELS][2955]; +extern float CRendBin_Combined_BRIR_coeff_im_48kHz[15][BINAURAL_CHANNELS][2955]; +extern float CRendBin_Combined_BRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS][2885]; +extern float CRendBin_Combined_BRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS][2885]; /* Sample Rate = 32000 */ -extern const int16_t CRendBin_Combined_BRIR_max_num_iterations_32kHz; -extern const uint16_t CRendBin_Combined_BRIR_num_iterations_32kHz[15][BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_Combined_BRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz[15][BINAURAL_CHANNELS][22]; -extern const uint16_t CRendBin_Combined_BRIR_index_frequency_max_diffuse_32kHz; -extern const float CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz[15]; -extern const uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS][40]; -extern const float CRendBin_Combined_BRIR_coeff_re_32kHz[15][BINAURAL_CHANNELS][2819]; -extern const float CRendBin_Combined_BRIR_coeff_im_32kHz[15][BINAURAL_CHANNELS][2819]; -extern const float CRendBin_Combined_BRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS][2870]; -extern const float CRendBin_Combined_BRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS][2870]; +extern int16_t CRendBin_Combined_BRIR_max_num_iterations_32kHz; +extern uint16_t CRendBin_Combined_BRIR_num_iterations_32kHz[15][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_Combined_BRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz[15][BINAURAL_CHANNELS][22]; +extern uint16_t CRendBin_Combined_BRIR_index_frequency_max_diffuse_32kHz; +extern float CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz[15]; +extern uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS][40]; +extern float CRendBin_Combined_BRIR_coeff_re_32kHz[15][BINAURAL_CHANNELS][2819]; +extern float CRendBin_Combined_BRIR_coeff_im_32kHz[15][BINAURAL_CHANNELS][2819]; +extern float CRendBin_Combined_BRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS][2870]; +extern float CRendBin_Combined_BRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS][2870]; /* Sample Rate = 16000 */ -extern const int16_t CRendBin_Combined_BRIR_max_num_iterations_16kHz; -extern const uint16_t CRendBin_Combined_BRIR_num_iterations_16kHz[15][BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_Combined_BRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; -extern const uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz[15][BINAURAL_CHANNELS][23]; -extern const uint16_t CRendBin_Combined_BRIR_index_frequency_max_diffuse_16kHz; -extern const float CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz[15]; -extern const uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS][40]; -extern const float CRendBin_Combined_BRIR_coeff_re_16kHz[15][BINAURAL_CHANNELS][1774]; -extern const float CRendBin_Combined_BRIR_coeff_im_16kHz[15][BINAURAL_CHANNELS][1774]; -extern const float CRendBin_Combined_BRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS][2522]; -extern const float CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS][2522]; +extern int16_t CRendBin_Combined_BRIR_max_num_iterations_16kHz; +extern uint16_t CRendBin_Combined_BRIR_num_iterations_16kHz[15][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_Combined_BRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz[15][BINAURAL_CHANNELS][23]; +extern uint16_t CRendBin_Combined_BRIR_index_frequency_max_diffuse_16kHz; +extern float CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz[15]; +extern uint16_t CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS][40]; +extern float CRendBin_Combined_BRIR_coeff_re_16kHz[15][BINAURAL_CHANNELS][1774]; +extern float CRendBin_Combined_BRIR_coeff_im_16kHz[15][BINAURAL_CHANNELS][1774]; +extern float CRendBin_Combined_BRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS][2522]; +extern float CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS][2522]; #endif /* USE_IIS_BRIR_OFFICIALMPEG_COMBINED */ #endif /* _IVAS_ROM_BINAURAL_CREND_HEAD_ */ -- GitLab From 13945324a8f2de3c1dde34c1e67650268db50730 Mon Sep 17 00:00:00 2001 From: emerit Date: Mon, 17 Apr 2023 18:13:35 +0200 Subject: [PATCH 064/331] fix crend rom header --- lib_rend/ivas_rom_binaural_crend_head.c | 8 +++----- lib_rend/ivas_rom_binaural_crend_head.h | 1 - 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/lib_rend/ivas_rom_binaural_crend_head.c b/lib_rend/ivas_rom_binaural_crend_head.c index ba086d3ea8..9fd1ee3ebc 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.c +++ b/lib_rend/ivas_rom_binaural_crend_head.c @@ -42,14 +42,12 @@ -#include #include -#ifdef DEBUGGING -#include "debug.h" -#endif -#include "cnst.h" #include "ivas_cnst.h" +/* clang-format off */ + +#define WMC_TOOL_SKIP #ifdef USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 diff --git a/lib_rend/ivas_rom_binaural_crend_head.h b/lib_rend/ivas_rom_binaural_crend_head.h index 8e9fd68f38..7b97c24add 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.h +++ b/lib_rend/ivas_rom_binaural_crend_head.h @@ -45,7 +45,6 @@ #ifndef _IVAS_ROM_BINAURAL_CREND_HEAD_ #define _IVAS_ROM_BINAURAL_CREND_HEAD_ -#include #include "ivas_cnst.h" #ifdef USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 -- GitLab From ac70361b33cede8aebe75a95dd2f370b657ac8be Mon Sep 17 00:00:00 2001 From: emerit Date: Mon, 17 Apr 2023 18:21:28 +0200 Subject: [PATCH 065/331] simplify option.h for ci instrumentation --- lib_com/options.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index f37f09d0cc..53c919b03f 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -173,16 +173,16 @@ #define USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 #define USE_IIS_BRIR_OFFICIALMPEG_COMBINED #define UPDATE_SBA_FILTER -#ifdef UPDATE_SBA_FILTER +//#ifdef UPDATE_SBA_FILTER #define UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS -#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +//#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS #define USE_HRIR_128_48000_DOLBY_SBA1 #define USE_HRIR_128_48000_DOLBY_SBA2 -#endif +//#endif #define USE_HRIR_128_48000_DOLBY_SBA3 -#else -#define USE_ORANGE_HRIR_53_HOA3S_48000 -#endif +//#else +//#define USE_ORANGE_HRIR_53_HOA3S_48000 +//#endif /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ -- GitLab From 3270643e7a795de06a1db6db2b113cbbd572d40e Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Fri, 21 Apr 2023 11:10:46 +0200 Subject: [PATCH 066/331] whitespace + update comments --- lib_dec/ivas_binRenderer_internal.c | 4 ++-- lib_rend/ivas_crend.c | 2 -- lib_util/hrtf_file_reader.c | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 7fb11170f5..4cf0af58e0 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -364,7 +364,7 @@ static ivas_error ivas_binRenderer_convModuleOpen( } else if ( input_config == AUDIO_CONFIG_HOA2 ) { - /* HOA3 filter coefficients */ + /* HOA2 filter coefficients */ hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftHRIRReal_HOA2[bandIdx][chIdx]; hBinRenConvModule->filterTapsLeftImag[bandIdx][chIdx] = hHrtf->leftHRIRImag_HOA2[bandIdx][chIdx]; hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightHRIRReal_HOA2[bandIdx][chIdx]; @@ -372,7 +372,7 @@ static ivas_error ivas_binRenderer_convModuleOpen( } else if ( input_config == AUDIO_CONFIG_FOA ) { - /* HOA3 filter coefficients */ + /* FOA filter coefficients */ hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftHRIRReal_FOA[bandIdx][chIdx]; hBinRenConvModule->filterTapsLeftImag[bandIdx][chIdx] = hHrtf->leftHRIRImag_FOA[bandIdx][chIdx]; hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightHRIRReal_FOA[bandIdx][chIdx]; diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index 6395565cfb..11ff339849 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -981,9 +981,7 @@ static ivas_error ivas_rend_initCrend( } #endif } - #else - hHrtf->latency_s = hSetOfHRTF->hHRTF_hrir_hoa3->latency_s; hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_hoa3->max_num_iterations; hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_hoa3->index_frequency_max_diffuse; diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index 45f3a6d894..16b2ce779d 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -1217,7 +1217,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( } else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) { - /* HRIR_HOA2 */ + /* HRIR_FOA */ ( *hHRTF )->FASTCONV_FOA_latency_s = *( (float *) ( hrtf_data_rptr ) ); hrtf_data_rptr += sizeof( float ); -- GitLab From e8af297dd8bec0b47ecb276979d53288a321a7b1 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Fri, 21 Apr 2023 15:52:01 +0200 Subject: [PATCH 067/331] [cleanup] strip USE_IIS_BRIR_OFFICIALMPEG_COMBINED (redundant) + reorganize options.h --- lib_com/options.h | 6 ------ lib_rend/ivas_rom_binaural_crend_head.c | 4 +--- lib_rend/ivas_rom_binaural_crend_head.h | 3 --- 3 files changed, 1 insertion(+), 12 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 09c5c9c6d4..8c5e7e4fa8 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -174,18 +174,12 @@ #define FIX_BINAURAL_DELAY_PRECISION #define USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 -#define USE_IIS_BRIR_OFFICIALMPEG_COMBINED #define UPDATE_SBA_FILTER -//#ifdef UPDATE_SBA_FILTER #define UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS -//#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS #define USE_HRIR_128_48000_DOLBY_SBA1 #define USE_HRIR_128_48000_DOLBY_SBA2 -//#endif #define USE_HRIR_128_48000_DOLBY_SBA3 -//#else //#define USE_ORANGE_HRIR_53_HOA3S_48000 -//#endif /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_rend/ivas_rom_binaural_crend_head.c b/lib_rend/ivas_rom_binaural_crend_head.c index 9fd1ee3ebc..4ec9182296 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.c +++ b/lib_rend/ivas_rom_binaural_crend_head.c @@ -2829,7 +2829,6 @@ const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]={NULL, const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; #endif /* USE_HRIR_128_48000_DOLBY_SBA3 */ -#ifdef USE_IIS_BRIR_OFFICIALMPEG_COMBINED /********************** CRendBin_Combined_BRIR **********************/ @@ -8159,6 +8158,5 @@ const float CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS][252 0.018358f, -0.020195f, 0.012285f, -0.036205f, -0.000230f, -0.019486f, 0.021761f, -0.002862f, 0.002417f, -0.003265f, -0.021068f, -0.000886f, 0.017137f, 0.047554f, 0.002807f, 0.003558f, 0.009315f, 0.016659f, -0.003390f, -0.003905f, 0.000798f, -0.000180f, 0.040620f, -0.003109f, 0.005685f, 0.017226f, -0.016770f, -0.026851f, -0.000591f, -0.028399f, -0.004244f, -0.014234f, -0.011375f, -0.005117f, -0.012932f, 0.007654f, 0.009595f, -0.016141f, 0.020769f, 0.018611f, -0.003081f, -0.003444f, -0.017888f, 0.013329f, 0.004146f, 0.044256f, 0.048210f, 0.000359f, -0.014792f, -0.011865f, 0.040392f, -0.026530f, -0.030252f, 0.031509f, -0.028569f, 0.018427f, 0.005621f, 0.025515f, 0.023514f, 0.015908f, 0.002584f, -0.016001f, -0.013823f, 0.033133f, -0.013996f, -0.001348f, 0.008121f, 0.028260f, 0.040839f, -0.001144f, 0.027926f, -0.022702f, -0.023750f, 0.002818f, -0.008721f, 0.013302f, 0.008430f, -0.020183f, 0.002868f, 0.013112f, 0.033640f, 0.011641f, 0.013855f, 0.012837f, 0.015118f, 0.004113f, -0.001054f, 0.021560f, 0.003879f, 0.017326f, 0.027403f, 0.006026f, -0.011061f, -0.009150f, 0.024733f, 0.006850f, 0.050578f, 0.012222f, 0.020049f, -0.020057f, -0.032135f, -0.002553f, -0.037541f, -0.023567f, -0.008392f, -0.012215f, 0.001644f, -0.001142f, 0.000540f, 0.001404f, -0.027979f, -0.022362f, -0.012091f, -0.022963f, 0.009075f, 0.010977f, -0.007069f, -0.000183f, -0.022228f, -0.001348f, 0.006548f, -0.003034f} }; -#endif /* USE_IIS_BRIR_OFFICIALMPEG_COMBINED */ - +#undef WMC_TOOL_SKIP diff --git a/lib_rend/ivas_rom_binaural_crend_head.h b/lib_rend/ivas_rom_binaural_crend_head.h index 7b97c24add..5325fbc2f4 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.h +++ b/lib_rend/ivas_rom_binaural_crend_head.h @@ -297,7 +297,6 @@ extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; #endif /* USE_HRIR_128_48000_DOLBY_SBA3 */ -#ifdef USE_IIS_BRIR_OFFICIALMPEG_COMBINED /********************** CRendBin_Combined_BRIR **********************/ @@ -345,6 +344,4 @@ extern float CRendBin_Combined_BRIR_coeff_re_16kHz[15][BINAURAL_CHANNELS][1774]; extern float CRendBin_Combined_BRIR_coeff_im_16kHz[15][BINAURAL_CHANNELS][1774]; extern float CRendBin_Combined_BRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS][2522]; extern float CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS][2522]; -#endif /* USE_IIS_BRIR_OFFICIALMPEG_COMBINED */ - #endif /* _IVAS_ROM_BINAURAL_CREND_HEAD_ */ -- GitLab From 2a60633a165aa9f7a1da16396c45b7987fc1a7e0 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Fri, 21 Apr 2023 15:54:25 +0200 Subject: [PATCH 068/331] [cleanup] convert #ifdef USE_ORANGE_HRIR_53_HOA3S_48000 to #ifndef UPDATE_SBA_FILTER --- lib_com/options.h | 1 - lib_rend/ivas_rom_binauralRenderer.c | 2 +- lib_rend/ivas_rom_binaural_crend_head.c | 4 ++-- lib_rend/ivas_rom_binaural_crend_head.h | 4 ++-- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 8c5e7e4fa8..0a00e275f5 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -179,7 +179,6 @@ #define USE_HRIR_128_48000_DOLBY_SBA1 #define USE_HRIR_128_48000_DOLBY_SBA2 #define USE_HRIR_128_48000_DOLBY_SBA3 -//#define USE_ORANGE_HRIR_53_HOA3S_48000 /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_rend/ivas_rom_binauralRenderer.c b/lib_rend/ivas_rom_binauralRenderer.c index 571af20b45..312b450b49 100644 --- a/lib_rend/ivas_rom_binauralRenderer.c +++ b/lib_rend/ivas_rom_binauralRenderer.c @@ -54,7 +54,7 @@ * Generated with Matlab version 9.3.0.713579 (R2017b) by MUXE6256 */ -#ifdef USE_ORANGE_HRIR_53_HOA3S_48000 +#ifndef UPDATE_SBA_FILTER const float FASTCONV_HOA3_latency_s = 0.001979167f; const float leftHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS]= diff --git a/lib_rend/ivas_rom_binaural_crend_head.c b/lib_rend/ivas_rom_binaural_crend_head.c index 4ec9182296..c0ef27c45a 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.c +++ b/lib_rend/ivas_rom_binaural_crend_head.c @@ -649,7 +649,7 @@ const float *CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]={N const float *CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; #endif /* USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 */ -#ifdef USE_ORANGE_HRIR_53_HOA3S_48000 +#ifndef UPDATE_SBA_FILTER /********************** CRendBin_HOA3_HRIR **********************/ @@ -1603,7 +1603,7 @@ const float CRendBin_HOA3_HRIR_coeff_im_16kHz[16][BINAURAL_CHANNELS][160]={ }; const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; -#endif /* USE_ORANGE_HRIR_53_HOA3S_48000 */ +#endif /* UPDATE_SBA_FILTER */ #ifdef USE_HRIR_128_48000_DOLBY_SBA1 diff --git a/lib_rend/ivas_rom_binaural_crend_head.h b/lib_rend/ivas_rom_binaural_crend_head.h index 5325fbc2f4..447635c33b 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.h +++ b/lib_rend/ivas_rom_binaural_crend_head.h @@ -97,7 +97,7 @@ extern float *CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; extern float *CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; #endif /* USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 */ -#ifdef USE_ORANGE_HRIR_53_HOA3S_48000 +#ifndef UPDATE_SBA_FILTER /********************** CRendBin_HOA3_HRIR **********************/ @@ -145,7 +145,7 @@ extern float CRendBin_HOA3_HRIR_coeff_re_16kHz[16][BINAURAL_CHANNELS][160]; extern float CRendBin_HOA3_HRIR_coeff_im_16kHz[16][BINAURAL_CHANNELS][160]; extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; -#endif /* USE_ORANGE_HRIR_53_HOA3S_48000 */ +#endif /* UPDATE_SBA_FILTER */ #ifdef USE_HRIR_128_48000_DOLBY_SBA1 -- GitLab From 7799edff99449cdbaedf9ab3a9b39bc22cf5b4a5 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Fri, 21 Apr 2023 15:55:58 +0200 Subject: [PATCH 069/331] [cleanup] merge FIX_BINAURAL_DELAY_PRECISION into UPDATE_SBA_FILTER --- lib_com/options.h | 1 - lib_rend/ivas_rom_binaural_crend_head.c | 12 ++++++------ .../generate_crend_ivas_tables_from_sofa.c | 4 ++-- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 0a00e275f5..25895e4c6b 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -172,7 +172,6 @@ #define REND_DEBUGGING_REVISION /* VA: encapsulate rendering debugging options with DEBUGGING */ -#define FIX_BINAURAL_DELAY_PRECISION #define USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 #define UPDATE_SBA_FILTER #define UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS diff --git a/lib_rend/ivas_rom_binaural_crend_head.c b/lib_rend/ivas_rom_binaural_crend_head.c index c0ef27c45a..8c43e25f51 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.c +++ b/lib_rend/ivas_rom_binaural_crend_head.c @@ -54,7 +54,7 @@ /********************** CRendBin_Combined_HRIR **********************/ -#ifdef FIX_BINAURAL_DELAY_PRECISION +#ifdef UPDATE_SBA_FILTER const float CRendBin_Combined_HRIR_latency_s = 0.000020834f; #else const float CRendBin_Combined_HRIR_latency_s = 0.000020833333110f; @@ -654,7 +654,7 @@ const float *CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={N /********************** CRendBin_HOA3_HRIR **********************/ -#ifdef FIX_BINAURAL_DELAY_PRECISION +#ifdef UPDATE_SBA_FILTER const float CRendBin_HOA3_HRIR_latency_s = 0.001333334f; #else const float CRendBin_HOA3_HRIR_latency_s = 0.001333333319053f; @@ -1610,7 +1610,7 @@ const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL, /********************** CRendBin_FOA_HRIR **********************/ -#ifdef FIX_BINAURAL_DELAY_PRECISION +#ifdef UPDATE_SBA_FILTER const float CRendBin_FOA_HRIR_latency_s = 0.000020834f; #else const float CRendBin_FOA_HRIR_latency_s = 0.000020833333110f; @@ -1814,7 +1814,7 @@ const float *CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL,N /********************** CRendBin_HOA2_HRIR **********************/ -#ifdef FIX_BINAURAL_DELAY_PRECISION +#ifdef UPDATE_SBA_FILTER const float CRendBin_HOA2_HRIR_latency_s = 0.000020834f; #else const float CRendBin_HOA2_HRIR_latency_s = 0.000020833333110f; @@ -2198,7 +2198,7 @@ const float *CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL, /********************** CRendBin_HOA3_HRIR **********************/ -#ifdef FIX_BINAURAL_DELAY_PRECISION +#ifdef UPDATE_SBA_FILTER const float CRendBin_HOA3_HRIR_latency_s = 0.000020834f; #else const float CRendBin_HOA3_HRIR_latency_s = 0.000020833333110f; @@ -2833,7 +2833,7 @@ const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL, /********************** CRendBin_Combined_BRIR **********************/ -#ifdef FIX_BINAURAL_DELAY_PRECISION +#ifdef UPDATE_SBA_FILTER const float CRendBin_Combined_BRIR_latency_s = 0.000145834f; #else const float CRendBin_Combined_BRIR_latency_s = 0.000145833328133f; diff --git a/scripts/binauralRenderer_interface/generate_crend_ivas_tables_from_sofa.c b/scripts/binauralRenderer_interface/generate_crend_ivas_tables_from_sofa.c index d8e15a1a3d..5858b430d9 100644 --- a/scripts/binauralRenderer_interface/generate_crend_ivas_tables_from_sofa.c +++ b/scripts/binauralRenderer_interface/generate_crend_ivas_tables_from_sofa.c @@ -854,7 +854,7 @@ int generate_crend_ivas_tables_from_sofa( const char *file_path, bool no_optim ) ivas_set_hrtf_fr( &hrtf_data, ivas_hrtf, frame_len ); } -#ifdef FIX_BINAURAL_DELAY_PRECISION +#ifdef UPDATE_SBA_FILTER hrtf_data.latency_s += 0.000000001f; #endif @@ -1034,7 +1034,7 @@ void update_c_file( HRTFS_DATA *hrtf, struct ivas_layout_config lscfg, const int { /* float latency_s; */ fprintf( fp, "\n\n/********************** %s_%s **********************/\n", DECLARATION_NAME, lscfg.name ); -#ifdef FIX_BINAURAL_DELAY_PRECISION +#ifdef UPDATE_SBA_FILTER fprintf( fp, "\n#ifdef FIX_BINAURAL_DELAY_PRECISION\nconst float %s_%s_latency_s = %10.9ff;\n#else", DECLARATION_NAME, lscfg.name, hrtf->latency_s ); fprintf( fp, "\nconst float %s_%s_latency_s = %16.15ff;\n#endif", DECLARATION_NAME, lscfg.name, hrtf->latency_s - 0.000000001f ); #else -- GitLab From bf7a438380b31bc26f757497c0959fc8dff4a1d8 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Fri, 21 Apr 2023 18:33:01 +0200 Subject: [PATCH 070/331] [cleanup] merge USE_HRIR_128_48000_DOLBY_SBA{1,2,3} into UPDATE_SBA_FILTER --- lib_com/options.h | 3 --- lib_rend/ivas_rom_binauralRenderer.c | 6 +++--- lib_rend/ivas_rom_binaural_crend_head.c | 12 ++++++------ lib_rend/ivas_rom_binaural_crend_head.h | 12 ++++++------ 4 files changed, 15 insertions(+), 18 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 25895e4c6b..ff77ab281f 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -175,9 +175,6 @@ #define USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 #define UPDATE_SBA_FILTER #define UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS -#define USE_HRIR_128_48000_DOLBY_SBA1 -#define USE_HRIR_128_48000_DOLBY_SBA2 -#define USE_HRIR_128_48000_DOLBY_SBA3 /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_rend/ivas_rom_binauralRenderer.c b/lib_rend/ivas_rom_binauralRenderer.c index 312b450b49..560a1382d4 100644 --- a/lib_rend/ivas_rom_binauralRenderer.c +++ b/lib_rend/ivas_rom_binauralRenderer.c @@ -3675,7 +3675,7 @@ const float rightHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NT #endif -#ifdef USE_HRIR_128_48000_DOLBY_SBA3 +#ifdef UPDATE_SBA_FILTER const float FASTCONV_HOA3_latency_s = 0.000666667f; const float leftHRIRReal_HOA3[BINAURAL_CONVBANDS][16][BINAURAL_NTAPS]= @@ -7296,7 +7296,7 @@ const float rightHRIRImag_HOA3[BINAURAL_CONVBANDS][16][BINAURAL_NTAPS]= #endif -#ifdef USE_HRIR_128_48000_DOLBY_SBA2 +#ifdef UPDATE_SBA_FILTER const float FASTCONV_HOA2_latency_s = 0.000666667f; const float leftHRIRReal_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]= @@ -9517,7 +9517,7 @@ const float rightHRIRImag_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]= #endif -#ifdef USE_HRIR_128_48000_DOLBY_SBA1 +#ifdef UPDATE_SBA_FILTER const float FASTCONV_FOA_latency_s = 0.000666667f; const float leftHRIRReal_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]= diff --git a/lib_rend/ivas_rom_binaural_crend_head.c b/lib_rend/ivas_rom_binaural_crend_head.c index 8c43e25f51..15afa75b87 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.c +++ b/lib_rend/ivas_rom_binaural_crend_head.c @@ -1605,7 +1605,7 @@ const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]={NULL, const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; #endif /* UPDATE_SBA_FILTER */ -#ifdef USE_HRIR_128_48000_DOLBY_SBA1 +#ifdef UPDATE_SBA_FILTER /********************** CRendBin_FOA_HRIR **********************/ @@ -1807,9 +1807,9 @@ const float CRendBin_FOA_HRIR_coeff_im_16kHz[4][BINAURAL_CHANNELS][80]={ }; const float *CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; const float *CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; -#endif /* USE_HRIR_128_48000_DOLBY_SBA1 */ +#endif /* UPDATE_SBA_FILTER */ -#ifdef USE_HRIR_128_48000_DOLBY_SBA2 +#ifdef UPDATE_SBA_FILTER /********************** CRendBin_HOA2_HRIR **********************/ @@ -2191,9 +2191,9 @@ const float CRendBin_HOA2_HRIR_coeff_im_16kHz[9][BINAURAL_CHANNELS][80]={ }; const float *CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; const float *CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; -#endif /* USE_HRIR_128_48000_DOLBY_SBA2 */ +#endif /* UPDATE_SBA_FILTER */ -#ifdef USE_HRIR_128_48000_DOLBY_SBA3 +#ifdef UPDATE_SBA_FILTER /********************** CRendBin_HOA3_HRIR **********************/ @@ -2827,7 +2827,7 @@ const float CRendBin_HOA3_HRIR_coeff_im_16kHz[16][BINAURAL_CHANNELS][80]={ }; const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; -#endif /* USE_HRIR_128_48000_DOLBY_SBA3 */ +#endif /* UPDATE_SBA_FILTER */ diff --git a/lib_rend/ivas_rom_binaural_crend_head.h b/lib_rend/ivas_rom_binaural_crend_head.h index 447635c33b..6aced8fa92 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.h +++ b/lib_rend/ivas_rom_binaural_crend_head.h @@ -147,7 +147,7 @@ extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; #endif /* UPDATE_SBA_FILTER */ -#ifdef USE_HRIR_128_48000_DOLBY_SBA1 +#ifdef UPDATE_SBA_FILTER /********************** CRendBin_FOA_HRIR **********************/ @@ -195,9 +195,9 @@ extern float CRendBin_FOA_HRIR_coeff_re_16kHz[4][BINAURAL_CHANNELS][80]; extern float CRendBin_FOA_HRIR_coeff_im_16kHz[4][BINAURAL_CHANNELS][80]; extern float *CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; extern float *CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; -#endif /* USE_HRIR_128_48000_DOLBY_SBA1 */ +#endif /* UPDATE_SBA_FILTER */ -#ifdef USE_HRIR_128_48000_DOLBY_SBA2 +#ifdef UPDATE_SBA_FILTER /********************** CRendBin_HOA2_HRIR **********************/ @@ -245,9 +245,9 @@ extern float CRendBin_HOA2_HRIR_coeff_re_16kHz[9][BINAURAL_CHANNELS][80]; extern float CRendBin_HOA2_HRIR_coeff_im_16kHz[9][BINAURAL_CHANNELS][80]; extern float *CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; extern float *CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; -#endif /* USE_HRIR_128_48000_DOLBY_SBA2 */ +#endif /* UPDATE_SBA_FILTER */ -#ifdef USE_HRIR_128_48000_DOLBY_SBA3 +#ifdef UPDATE_SBA_FILTER /********************** CRendBin_HOA3_HRIR **********************/ @@ -295,7 +295,7 @@ extern float CRendBin_HOA3_HRIR_coeff_re_16kHz[16][BINAURAL_CHANNELS][80]; extern float CRendBin_HOA3_HRIR_coeff_im_16kHz[16][BINAURAL_CHANNELS][80]; extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; -#endif /* USE_HRIR_128_48000_DOLBY_SBA3 */ +#endif /* UPDATE_SBA_FILTER */ -- GitLab From 45b3a4325ada80fb3ea30b0655f1a8857d32b0b2 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Fri, 21 Apr 2023 18:33:50 +0200 Subject: [PATCH 071/331] [cleanup] merge UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS into UPDATE_SBA_FILTER --- lib_com/ivas_cnst.h | 2 +- lib_com/options.h | 1 - lib_dec/ivas_binRenderer_internal.c | 8 ++++---- lib_rend/ivas_crend.c | 8 ++++---- lib_rend/ivas_hrtf.c | 2 +- lib_rend/ivas_rom_binauralRenderer.h | 4 ++-- lib_rend/ivas_stat_rend.h | 4 ++-- lib_util/hrtf_file_reader.c | 14 +++++++------- .../generate_tables_from_rom_to_bin.c | 18 +++++++++--------- 9 files changed, 30 insertions(+), 31 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index f13e0e898e..e5bd555e81 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1448,7 +1448,7 @@ typedef enum { BINAURAL_INPUT_AUDIO_CONFIG_INVALID, BINAURAL_INPUT_AUDIO_CONFIG_COMBINED, /* 5_1, 5_1_2, 5_1_4, 7_1, 7_1_4 */ -#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +#ifdef UPDATE_SBA_FILTER BINAURAL_INPUT_AUDIO_CONFIG_HOA3, /* HOA3 */ BINAURAL_INPUT_AUDIO_CONFIG_HOA2, /* HOA2 */ BINAURAL_INPUT_AUDIO_CONFIG_FOA, /* FOA */ diff --git a/lib_com/options.h b/lib_com/options.h index ff77ab281f..eb28fa7f65 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -174,7 +174,6 @@ #define USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 #define UPDATE_SBA_FILTER -#define UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 4cf0af58e0..ae3a7064eb 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -351,7 +351,7 @@ static ivas_error ivas_binRenderer_convModuleOpen( else { #ifdef UPDATE_SBA_FILTER -#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +#ifdef UPDATE_SBA_FILTER if ( input_config == AUDIO_CONFIG_HOA3 ) { #endif @@ -360,7 +360,7 @@ static ivas_error ivas_binRenderer_convModuleOpen( hBinRenConvModule->filterTapsLeftImag[bandIdx][chIdx] = hHrtf->leftHRIRImag_HOA3[bandIdx][chIdx]; hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightHRIRReal_HOA3[bandIdx][chIdx]; hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx] = hHrtf->rightHRIRImag_HOA3[bandIdx][chIdx]; -#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +#ifdef UPDATE_SBA_FILTER } else if ( input_config == AUDIO_CONFIG_HOA2 ) { @@ -428,7 +428,7 @@ static ivas_error ivas_binaural_hrtf_open( HrtfFastConv->FASTCONV_HRIR_latency_s = FASTCONV_HRIR_latency_s; HrtfFastConv->FASTCONV_HOA3_latency_s = FASTCONV_HOA3_latency_s; -#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +#ifdef UPDATE_SBA_FILTER HrtfFastConv->FASTCONV_HOA2_latency_s = FASTCONV_HOA2_latency_s; HrtfFastConv->FASTCONV_FOA_latency_s = FASTCONV_FOA_latency_s; #endif @@ -720,7 +720,7 @@ ivas_error ivas_binRenderer_open( } else { -#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +#ifdef UPDATE_SBA_FILTER if ( hBinRenderer->nInChannels == 16 ) { st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtfFastConv->FASTCONV_HOA3_latency_s * 1000000000.f ); diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index 11ff339849..a41375b63a 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -448,7 +448,7 @@ static ivas_error ivas_rend_initCrend( else if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) { #ifdef UPDATE_SBA_FILTER -#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +#ifdef UPDATE_SBA_FILTER if ( inConfig == IVAS_REND_AUDIO_CONFIG_HOA3 ) { #endif @@ -532,7 +532,7 @@ static ivas_error ivas_rend_initCrend( hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[j]; } } -#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +#ifdef UPDATE_SBA_FILTER } else if ( inConfig == IVAS_REND_AUDIO_CONFIG_HOA2 ) { @@ -894,7 +894,7 @@ static ivas_error ivas_rend_initCrend( else if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) { #ifdef UPDATE_SBA_FILTER -#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +#ifdef UPDATE_SBA_FILTER if ( inConfig == IVAS_REND_AUDIO_CONFIG_HOA3 ) { #endif @@ -921,7 +921,7 @@ static ivas_error ivas_rend_initCrend( hHrtf->pOut_to_bin_diffuse_re[j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_diffuse_re[j]; hHrtf->pOut_to_bin_diffuse_im[j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_diffuse_im[j]; } -#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +#ifdef UPDATE_SBA_FILTER } else if ( inConfig == IVAS_REND_AUDIO_CONFIG_HOA2 ) { diff --git a/lib_rend/ivas_hrtf.c b/lib_rend/ivas_hrtf.c index f7826698fc..3616bd6c93 100644 --- a/lib_rend/ivas_hrtf.c +++ b/lib_rend/ivas_hrtf.c @@ -96,7 +96,7 @@ ivas_error ivas_HRTF_CRend_binary_open( ( *hSetOfHRTF )->hHRTF_hrir_combined = NULL; ( *hSetOfHRTF )->hHRTF_hrir_hoa3 = NULL; -#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +#ifdef UPDATE_SBA_FILTER ( *hSetOfHRTF )->hHRTF_hrir_hoa2 = NULL; ( *hSetOfHRTF )->hHRTF_hrir_foa = NULL; #endif diff --git a/lib_rend/ivas_rom_binauralRenderer.h b/lib_rend/ivas_rom_binauralRenderer.h index dc65c72807..26aae29319 100644 --- a/lib_rend/ivas_rom_binauralRenderer.h +++ b/lib_rend/ivas_rom_binauralRenderer.h @@ -48,7 +48,7 @@ extern float leftHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NT extern float leftHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS]; extern float rightHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS]; extern float rightHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS]; -#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +#ifdef UPDATE_SBA_FILTER extern float leftHRIRReal_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]; extern float leftHRIRImag_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]; extern float rightHRIRReal_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]; @@ -65,7 +65,7 @@ extern float rightHRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS] extern float rightHRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]; extern float FASTCONV_HOA3_latency_s; -#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +#ifdef UPDATE_SBA_FILTER extern float FASTCONV_HOA2_latency_s; extern float FASTCONV_FOA_latency_s; #endif diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 194d97e865..82c006c0c7 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -713,7 +713,7 @@ typedef struct ivas_hrtfs_crend_structure { HRTFS_DATA *hHRTF_hrir_combined; HRTFS_DATA *hHRTF_hrir_hoa3; -#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +#ifdef UPDATE_SBA_FILTER HRTFS_DATA *hHRTF_hrir_hoa2; HRTFS_DATA *hHRTF_hrir_foa; #endif @@ -751,7 +751,7 @@ typedef struct ivas_hrtfs_fastconv_struct float rightHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][7]; float rightHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][7]; #endif -#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +#ifdef UPDATE_SBA_FILTER float FASTCONV_HOA2_latency_s; float leftHRIRReal_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]; float leftHRIRImag_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]; diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index 16b2ce779d..1f5b0b9cae 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -196,7 +196,7 @@ static ivas_error check_hrtf_binary_header( /* Check the output format of the decoder */ -#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +#ifdef UPDATE_SBA_FILTER if ( ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_FOA ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_UNDEFINED ) ) #else if ( ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_HOA ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_UNDEFINED ) ) @@ -979,7 +979,7 @@ static ivas_error init_fastconv_HRTF_handle( set_zero( hHrtf->rightHRIRImag_HOA3[i][j], BINAURAL_NTAPS ); } } -#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +#ifdef UPDATE_SBA_FILTER hHrtf->FASTCONV_HOA2_latency_s = 0; for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) { @@ -1108,7 +1108,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( } } } -#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +#ifdef UPDATE_SBA_FILTER else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) #else else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA ) @@ -1163,7 +1163,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( } } } -#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +#ifdef UPDATE_SBA_FILTER else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) { /* HRIR_HOA2 */ @@ -1626,7 +1626,7 @@ ivas_error create_SetOfHRTF_from_binary( { hHRTF = &( ( *hSetOfHRTF ).hHRTF_hrir_combined ); } -#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +#ifdef UPDATE_SBA_FILTER else if ( hrtf_header.input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) #else else if ( hrtf_header.input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA ) @@ -1634,7 +1634,7 @@ ivas_error create_SetOfHRTF_from_binary( { hHRTF = &( ( *hSetOfHRTF ).hHRTF_hrir_hoa3 ); } -#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +#ifdef UPDATE_SBA_FILTER else if ( hrtf_header.input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) { hHRTF = &( ( *hSetOfHRTF ).hHRTF_hrir_hoa2 ); @@ -1750,7 +1750,7 @@ ivas_error destroy_SetOfHRTF( { destroy_HRTF( &( hSetOfHRTF->hHRTF_hrir_combined ) ); destroy_HRTF( &( hSetOfHRTF->hHRTF_hrir_hoa3 ) ); -#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +#ifdef UPDATE_SBA_FILTER destroy_HRTF( &( hSetOfHRTF->hHRTF_hrir_hoa2 ) ); destroy_HRTF( &( hSetOfHRTF->hHRTF_hrir_foa ) ); #endif diff --git a/scripts/binauralRenderer_interface/Table_Format_Converter/generate_tables_from_rom_to_bin.c b/scripts/binauralRenderer_interface/Table_Format_Converter/generate_tables_from_rom_to_bin.c index c2559aa679..6c0054ff6b 100644 --- a/scripts/binauralRenderer_interface/Table_Format_Converter/generate_tables_from_rom_to_bin.c +++ b/scripts/binauralRenderer_interface/Table_Format_Converter/generate_tables_from_rom_to_bin.c @@ -58,7 +58,7 @@ #define DEFAULT_BIN_FILE_EXT ".bin" #define IVAS_NB_RENDERER_TYPE 7 -#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +#ifdef UPDATE_SBA_FILTER #define IVAS_NB_AUDIO_CONFIG 4 #else #define IVAS_NB_AUDIO_CONFIG 2 @@ -76,7 +76,7 @@ const RENDERER_TYPE rend_types[IVAS_NB_RENDERER_TYPE] = { }; const BINAURAL_INPUT_AUDIO_CONFIG input_cfgs[IVAS_NB_AUDIO_CONFIG] = { BINAURAL_INPUT_AUDIO_CONFIG_COMBINED, -#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +#ifdef UPDATE_SBA_FILTER BINAURAL_INPUT_AUDIO_CONFIG_HOA3, BINAURAL_INPUT_AUDIO_CONFIG_HOA2, BINAURAL_INPUT_AUDIO_CONFIG_FOA @@ -831,7 +831,7 @@ char *create_hrtf_fastconv( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CONFIG cldfb_nchan_max = CLDFB_NO_CHANNELS_MAX; } } -#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +#ifdef UPDATE_SBA_FILTER else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) #else else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA ) @@ -847,7 +847,7 @@ char *create_hrtf_fastconv( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CONFIG hrtf_channels = HRTF_SH_CHANNELS; num_taps = BINAURAL_NTAPS; } -#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +#ifdef UPDATE_SBA_FILTER else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) { if ( rend_type == RENDERER_BINAURAL_FASTCONV_ROOM ) @@ -984,7 +984,7 @@ char *create_hrtf_fastconv( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CONFIG } } // HRIR_HOA3 -#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +#ifdef UPDATE_SBA_FILTER else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) #else else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA ) @@ -1033,7 +1033,7 @@ char *create_hrtf_fastconv( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CONFIG } } } -#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +#ifdef UPDATE_SBA_FILTER else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) { memcpy( hrtf_wptr, &( latency_s ), sizeof( float ) ); // latency_s => float @@ -1389,7 +1389,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON hrtf_table_dims_out.max_num_iterations_diffuse = 0; hrtf_table_dims_out.max_total_num_fsamp_per_iteration_diff = 0;*/ } -#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +#ifdef UPDATE_SBA_FILTER else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) #else else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA ) @@ -1458,7 +1458,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON hrtf_table_dims_out.max_num_iterations_diffuse = 0; hrtf_table_dims_out.max_total_num_fsamp_per_iteration_diff = 0;*/ } -#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +#ifdef UPDATE_SBA_FILTER else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) { if ( frequency == 48000 ) @@ -1637,7 +1637,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON hrtf_table_dims_out.max_num_iterations_diffuse = 0; hrtf_table_dims_out.max_total_num_fsamp_per_iteration_diff = 0;*/ } -#ifdef UPDATE_SBA_FILTER_WITH_SUPPORT_FOA_HOA2_FILTERS +#ifdef UPDATE_SBA_FILTER else if ( ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) || ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) || ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) ) #else else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA ) -- GitLab From c4a5465f152a7f1d8c6508c3f5ba6d751dd56407 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Tue, 25 Apr 2023 13:24:41 +0200 Subject: [PATCH 072/331] merged main and jitter dev branch, self_test runs through but not yet BE Squashed commit of the following: commit 2f8090f5da66a661a8716d84066f0556fc0e54d9 Author: Stefan Bayer Date: Mon Apr 24 07:15:05 2023 +0200 cleanup commit 9562e73adf70f41c8c4685a19c294778e9c057ae Author: Stefan Bayer Date: Fri Apr 21 06:31:29 2023 +0200 added bit rate switching, also added missing bit rate switching modes for MASA and ISM to ivas_modes.json commit 8f85e52948ee7667cfdddca0f9ac1c93563dfba5 Author: Stefan Bayer Date: Tue Apr 18 14:33:22 2023 +0200 fix bug in udpating of the JBM TC buffers, wrong offset into copying old samples due to prematurely resetting n_samples_rendered commit a0d60297f265bccfb317941387da9ef1841a6ec8 Author: Stefan Bayer Date: Mon Apr 17 13:24:44 2023 +0200 WSOLA TSM is now working with float in/out buffers (internally it was always float anyway), fixed a few rendering paths commit ababf3f40fb62deb98bab9a19975aa3bb11d1f0a Author: Stefan Bayer Date: Sun Apr 16 20:12:02 2023 +0200 fixed several renderer paths commit e51bd2e2d98aa7a1accd5872e6c286ab883b636a Author: Stefan Bayer Date: Fri Apr 14 16:51:22 2023 +0200 all possible render paths run now with variable speed decoding, audio quality only sparsely checked commit 6b919859ca8a5ec93818970ad29877e4885a9659 Author: Stefan Bayer Date: Tue Apr 11 09:36:06 2023 +0200 some cleanup, removed duplication of transport channel buffering commit 2c794eb6aa0bb814bec983fe7c1f4cfead1029f5 Author: Stefan Bayer Date: Thu Apr 6 09:45:51 2023 +0200 JITTER (work in progress) --- Workspace_msvc/lib_com.vcxproj | 2 +- Workspace_msvc/lib_debug.vcxproj | 2 +- Workspace_msvc/lib_dec.vcxproj | 3 +- Workspace_msvc/lib_enc.vcxproj | 2 +- Workspace_msvc/lib_rend.vcxproj | 2 +- Workspace_msvc/lib_util.vcxproj | 2 + apps/decoder.c | 712 +++++++- lib_com/fd_cng_com.c | 68 + lib_com/ivas_cnst.h | 23 + lib_com/ivas_error.h | 3 + lib_com/ivas_prot.h | 500 ++++- lib_com/ivas_stat_com.h | 6 +- lib_com/ivas_td_decorr.c | 22 +- lib_com/ivas_tools.c | 54 +- lib_com/options.h | 15 +- lib_com/prot.h | 17 +- lib_com/tools.c | 8 + lib_debug/debug.c | 105 +- lib_debug/debug.h | 15 + lib_debug/sba_debug.c | 26 +- lib_debug/sba_debug.h | 3 +- lib_dec/fd_cng_dec.c | 166 +- lib_dec/ivas_binRenderer_internal.c | 158 +- lib_dec/ivas_dec.c | 137 +- lib_dec/ivas_dirac_dec.c | 1479 ++++++++++----- lib_dec/ivas_dirac_output_synthesis_cov.c | 109 +- lib_dec/ivas_dirac_output_synthesis_dec.c | 377 +++- lib_dec/ivas_init_dec.c | 78 + lib_dec/ivas_ism_dec.c | 130 +- lib_dec/ivas_ism_dtx_dec.c | 5 +- lib_dec/ivas_ism_param_dec.c | 675 ++++++- lib_dec/ivas_ism_renderer.c | 114 +- lib_dec/ivas_jbm_dec.c | 1716 ++++++++++++++++++ lib_dec/ivas_masa_dec.c | 293 ++- lib_dec/ivas_mc_param_dec.c | 622 ++++++- lib_dec/ivas_mct_dec.c | 143 +- lib_dec/ivas_objectRenderer_internal.c | 90 + lib_dec/ivas_out_setup_conversion.c | 26 +- lib_dec/ivas_sba_dec.c | 199 +- lib_dec/ivas_sba_rendering_internal.c | 109 +- lib_dec/ivas_spar_decoder.c | 510 +++++- lib_dec/ivas_spar_md_dec.c | 5 + lib_dec/ivas_stat_dec.h | 74 +- lib_dec/jbm_jb4sb.h | 8 + lib_dec/jbm_pcmdsp_apa.c | 209 ++- lib_dec/jbm_pcmdsp_apa.h | 12 + lib_dec/jbm_pcmdsp_fifo.c | 52 + lib_dec/jbm_pcmdsp_fifo.h | 3 + lib_dec/jbm_pcmdsp_similarityestimation.c | 42 + lib_dec/jbm_pcmdsp_similarityestimation.h | 46 +- lib_dec/jbm_pcmdsp_window.c | 17 +- lib_dec/jbm_pcmdsp_window.h | 5 +- lib_dec/lib_dec.c | 968 +++++++++- lib_dec/lib_dec.h | 39 + lib_rend/ivas_crend.c | 154 ++ lib_rend/ivas_dirac_dec_binaural_functions.c | 1178 +++++++++++- lib_rend/ivas_limiter.c | 4 + lib_rend/ivas_objectRenderer.c | 54 +- lib_rend/ivas_prot_rend.h | 84 +- lib_rend/ivas_reverb.c | 175 ++ lib_rend/ivas_rotation.c | 36 +- lib_rend/ivas_sba_rendering.c | 156 ++ lib_rend/lib_rend.c | 97 + lib_util/tinywaveout_c.h | 43 + lib_util/tsm_scale_file_reader.c | 148 ++ lib_util/tsm_scale_file_reader.h | 67 + scripts/batch_comp_audio.py | 13 +- scripts/config/ivas_modes.json | 210 +++ scripts/runIvasCodec.py | 15 + 69 files changed, 11810 insertions(+), 830 deletions(-) create mode 100644 lib_dec/ivas_jbm_dec.c create mode 100644 lib_util/tsm_scale_file_reader.c create mode 100644 lib_util/tsm_scale_file_reader.h diff --git a/Workspace_msvc/lib_com.vcxproj b/Workspace_msvc/lib_com.vcxproj index 23aa2ae3f0..bfe36b1f48 100644 --- a/Workspace_msvc/lib_com.vcxproj +++ b/Workspace_msvc/lib_com.vcxproj @@ -78,7 +78,7 @@ Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;%(AdditionalIncludeDirectories) + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) EnableFastChecks diff --git a/Workspace_msvc/lib_debug.vcxproj b/Workspace_msvc/lib_debug.vcxproj index 3b648fae04..9b7b580661 100644 --- a/Workspace_msvc/lib_debug.vcxproj +++ b/Workspace_msvc/lib_debug.vcxproj @@ -73,7 +73,7 @@ Disabled - ..\lib_com;..\lib_debug;%(AdditionalIncludeDirectories) + ..\lib_com;..\lib_debug;..\lib_util;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) false diff --git a/Workspace_msvc/lib_dec.vcxproj b/Workspace_msvc/lib_dec.vcxproj index e1c0f9ead1..1a1b8c26cf 100644 --- a/Workspace_msvc/lib_dec.vcxproj +++ b/Workspace_msvc/lib_dec.vcxproj @@ -89,7 +89,7 @@ Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;%(AdditionalIncludeDirectories) + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_util;..\lib_rend;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) EnableFastChecks @@ -282,6 +282,7 @@ + diff --git a/Workspace_msvc/lib_enc.vcxproj b/Workspace_msvc/lib_enc.vcxproj index 15f0d53574..92aa6de4ce 100644 --- a/Workspace_msvc/lib_enc.vcxproj +++ b/Workspace_msvc/lib_enc.vcxproj @@ -89,7 +89,7 @@ Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;%(AdditionalIncludeDirectories) + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) EnableFastChecks diff --git a/Workspace_msvc/lib_rend.vcxproj b/Workspace_msvc/lib_rend.vcxproj index 865652649a..4bd0ca9a93 100644 --- a/Workspace_msvc/lib_rend.vcxproj +++ b/Workspace_msvc/lib_rend.vcxproj @@ -89,7 +89,7 @@ Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;%(AdditionalIncludeDirectories) + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_util;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) EnableFastChecks diff --git a/Workspace_msvc/lib_util.vcxproj b/Workspace_msvc/lib_util.vcxproj index 5b5e5f30cc..72ff2dfe61 100644 --- a/Workspace_msvc/lib_util.vcxproj +++ b/Workspace_msvc/lib_util.vcxproj @@ -158,6 +158,7 @@ + @@ -183,6 +184,7 @@ + diff --git a/apps/decoder.c b/apps/decoder.c index 22dc235fff..4b09ce7d36 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -45,6 +45,9 @@ #include "vector3_pair_file_reader.h" #include "jbm_file_writer.h" #include "evs_rtp_payload.h" +#ifdef VARIABLE_SPEED_DECODING +#include "tsm_scale_file_reader.h" +#endif #ifdef DEBUGGING #include "debug.h" #endif @@ -76,6 +79,14 @@ static #define IVAS_PUBLIC_ORIENT_TRK_REF_VEC ( 3 ) #define IVAS_PUBLIC_ORIENT_TRK_REF_VEC_LEV ( 4 ) +#ifdef VARIABLE_SPEED_DECODING +#define VARIABLE_SPEED_FETCH_FRAMESIZE_MS 20 +#endif +#ifdef JBM_TSM_ON_TCS +#define JBM_FRONTEND_FETCH_FRAMESIZE_MS 5 +#define FRAME_SIZE_NS 20000000L +#endif + typedef struct { char *inputBitstreamFilename; @@ -116,6 +127,20 @@ typedef struct FILE *agcBitstream; /* temporary */ #endif +#endif +#ifdef DEBUG_JBM_CMD_OPTION + bool noBadFrameDelay; +#endif +#ifdef VARIABLE_SPEED_DECODING + bool variableSpeedMode; + bool tsmScaleFileEnabled; + char *tsmScaleFileName; + uint16_t tsmScale; +#endif +#ifdef JBM_TSM_ON_TCS +#ifdef DEBUG_JBM_CMD_OPTION + uint16_t frontendFetchSizeMs; +#endif #endif } DecArguments; @@ -129,6 +154,9 @@ static bool parseCmdlIVAS_dec( int16_t argc, char **argv, DecArguments *arg ); static void usage_dec( void ); static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, HeadRotFileReader *headRotReader, HeadRotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); static ivas_error decodeVoIP( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HANDLE hIvasDec ); +#ifdef VARIABLE_SPEED_DECODING +static ivas_error decodeVariableSpeed( DecArguments arg, BS_READER_HANDLE hBsReader, HeadRotFileReader *headRotReader, HeadRotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, IVAS_DEC_HANDLE hIvasDec ); +#endif #ifdef DEBUGGING static ivas_error printBitstreamInfoVoip( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HANDLE hIvasDec ); static int16_t app_own_random( int16_t *seed ); @@ -555,8 +583,15 @@ int main( if ( arg.voipMode ) { - +#ifdef JBM_TSM_ON_TCS + if ( ( error = IVAS_DEC_EnableVoIP( hIvasDec, IVAS_DEC_VOIP_MODE_VOIP, 100, 60, arg.inputFormat ) ) != IVAS_ERR_OK ) +#else +#ifdef VARIABLE_SPEED_DECODING + if ( ( error = IVAS_DEC_EnableVoIP( hIvasDec, IVAS_DEC_VOIP_MODE_VOIP, 100, 60, arg.inputFormat ) ) != IVAS_ERR_OK ) +#else if ( ( error = IVAS_DEC_EnableVoIP( hIvasDec, 60, arg.inputFormat ) ) != IVAS_ERR_OK ) +#endif +#endif { fprintf( stderr, "\nCould not enable VOIP: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; @@ -564,6 +599,17 @@ int main( error = decodeVoIP( arg, hBsReader, hIvasDec ); } +#ifdef VARIABLE_SPEED_DECODING + else if ( arg.variableSpeedMode ) + { + if ( ( error = IVAS_DEC_EnableVoIP( hIvasDec, IVAS_DEC_VOIP_MODE_VARIABLE_SPEED, arg.tsmScale, 60, arg.inputFormat ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nCould not enable Variable Play Speed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + error = decodeVariableSpeed( arg, hBsReader, headRotReader, refRotReader, referenceVectorReader, hIvasDec ); + } +#endif else { error = decodeG192( arg, hBsReader, headRotReader, refRotReader, referenceVectorReader, hIvasDec, pcmBuf ); @@ -788,6 +834,20 @@ static bool parseCmdlIVAS_dec( arg->inputFormat = IVAS_DEC_INPUT_FORMAT_G192; arg->no_diegetic_pan = 0.f; +#ifdef VARIABLE_SPEED_DECODING + arg->variableSpeedMode = 0; + arg->tsmScale = 100; + arg->tsmScaleFileEnabled = false; + arg->tsmScaleFileName = NULL; +#endif +#ifdef JBM_TSM_ON_TCS +#ifdef DEBUG_JBM_CMD_OPTION + arg->frontendFetchSizeMs = JBM_FRONTEND_FETCH_FRAMESIZE_MS; +#endif +#endif +#ifdef DEBUG_JBM_CMD_OPTION + arg->noBadFrameDelay = false; +#endif /*-----------------------------------------------------------------* * Initialization @@ -914,6 +974,62 @@ static bool parseCmdlIVAS_dec( #endif /* #ifdef DEBUG_MODE_INFO_TWEAK */ #endif /* #ifdef DEBUG_MODE_INFO */ #endif /* #ifdef DEBUGGING */ +#ifdef DEBUG_JBM_CMD_OPTION + else if ( strcmp( argv_to_upper, "-VOIP_NO_BAD_FRAME" ) == 0 ) + { + arg->noBadFrameDelay = true; + i++; + } +#endif +#ifdef VARIABLE_SPEED_DECODING + + else if ( strcmp( argv_to_upper, "-VS" ) == 0 ) + { + i++; + int tmp = 100; + arg->variableSpeedMode = true; + if ( i < argc - 3 ) + { + if ( !is_digits_only( argv[i] ) ) + { + arg->tsmScaleFileEnabled = true; + arg->tsmScaleFileName = argv[i]; + i++; + } + + else + { + if ( ( sscanf( argv[i], "%d", &tmp ) > 0 ) ) + { + i++; + } + } + arg->tsmScale = (uint16_t) tmp; + } + } +#endif +#ifdef JBM_TSM_ON_TCS +#ifdef DEBUG_JBM_CMD_OPTION + else if ( strcmp( argv_to_upper, "-VOIP_FRAMESIZE" ) == 0 ) + { + i++; + int tmp; + if ( i < argc - 3 ) + { + if ( !is_digits_only( argv[i] ) ) + { + return false; + } + + if ( sscanf( argv[i], "%d", &tmp ) > 0 ) + { + i++; + } + arg->frontendFetchSizeMs = (uint16_t) tmp; + } + } +#endif +#endif else if ( strcmp( argv_to_upper, "-MIME" ) == 0 ) { @@ -1166,6 +1282,18 @@ static void usage_dec( void ) fprintf( stdout, "-VOIP : VoIP mode: RTP in G192\n" ); fprintf( stdout, "-VOIP_hf_only=0 : VoIP mode: EVS RTP Payload Format hf_only=0 in rtpdump\n" ); fprintf( stdout, "-VOIP_hf_only=1 : VoIP mode: EVS RTP Payload Format hf_only=1 in rtpdump\n" ); +#ifdef DEBUG_JBM_CMD_OPTION + fprintf( stdout, "-VOIP_no_bad_frame : VoIP mode: do not put out bad frames in the beginning as silence \n" ); +#endif +#ifdef VARIABLE_SPEED_DECODING + fprintf( stdout, "-VS fac : Varaible Speed mode: change speed of playout fac as integer in percent. fac<100 faster, fac>100 slower\n" ); +#endif +#ifdef JBM_TSM_ON_TCS +#ifdef DEBUG_JBM_CMD_OPTION + fprintf( stdout, "-VOIP_framesize : VoIP mode: acoustic frontend fetch frame size (must be multiples of 5!)\n" ); +#endif + +#endif fprintf( stdout, " The decoder may read rtpdump files containing TS26.445 Annex A.2.2\n" ); fprintf( stdout, " EVS RTP Payload Format. The SDP parameter hf_only is required.\n" ); fprintf( stdout, " Reading RFC4867 AMR/AMR-WB RTP payload format is not supported.\n" ); @@ -1853,8 +1981,14 @@ static ivas_error decodeVoIP( uint32_t nextPacketRcvTime_ms = 0; uint32_t systemTime_ms = 0; +#ifdef JBM_TSM_ON_TCS + uint32_t systemTimeInc_ms = (uint32_t) JBM_FRONTEND_FETCH_FRAMESIZE_MS; + int32_t nFramesWritten = 0; + int32_t nFrontendFramesPerIvasFrame = 0; +#endif int32_t nFramesFed = 0; + uint8_t au[( IVAS_MAX_BITS_PER_FRAME + 7 ) >> 3]; int16_t auSize; uint16_t rtpSequenceNumber; @@ -1987,10 +2121,30 @@ static ivas_error decodeVoIP( * Main receiving/decoding loop *------------------------------------------------------------------------------------------*/ +#ifdef JBM_TSM_ON_TCS +#ifdef DEBUG_JBM_CMD_OPTION + nFrontendFramesPerIvasFrame = FRAME_SIZE_NS / ( 1000L * arg.frontendFetchSizeMs ); + systemTimeInc_ms = arg.frontendFetchSizeMs; +#else + nFrontendFramesPerIvasFrame = FRAME_SIZE_NS / ( 1000L * JBM_FRONTEND_FETCH_FRAMESIZE_MS ); +#endif +#endif + while ( 1 ) { int16_t nOutSamples = 0; - +#if defined( JBM_TSM_ON_TCS ) || defined( VARIABLE_SPEED_DECODING ) + uint16_t nSamplesAvailableNext = 0; +#endif +#ifdef JBM_TSM_ON_TCS +#ifdef DEBUG_JBM_CMD_OPTION + nOutSamples = (int16_t) ( arg.output_Fs / 1000 * arg.frontendFetchSizeMs ); +#else + nOutSamples = (int16_t) ( arg.output_Fs / 1000 * JBM_FRONTEND_FETCH_FRAMESIZE_MS ); +#endif +#else + nOutSamples = (int16_t) ( arg.output_Fs / 50 ); +#endif /* read all packets with a receive time smaller than the system time */ while ( nextPacketRcvTime_ms <= systemTime_ms ) { @@ -2034,15 +2188,24 @@ static ivas_error decodeVoIP( /* we are finished when all packets have been received and jitter buffer is empty */ /* also stop when the input file contains less than two frames, because JBM cannot calculate a delay value and won't start decoding */ +#ifdef JBM_TSM_ON_TCS + /* last clause should make sure that for BE tests we end up with the same number of samples...*/ + if ( nextPacketRcvTime_ms == (uint32_t) ( -1 ) && ( IVAS_DEC_VoIP_IsEmpty( hIvasDec, nOutSamples ) || nFramesFed < 2 || ( nFramesWritten % nFrontendFramesPerIvasFrame == 0 ) ) ) +#else if ( nextPacketRcvTime_ms == (uint32_t) ( -1 ) && ( IVAS_DEC_VoIP_IsEmpty( hIvasDec ) || nFramesFed < 2 ) ) +#endif { break; } - nOutSamples = (int16_t) ( arg.output_Fs / 50 ); /* decode and get samples */ - if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, pcmBuf, systemTime_ms + if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, + pcmBuf, systemTime_ms +#if defined( JBM_TSM_ON_TCS ) || defined( VARIABLE_SPEED_DECODING ) + , + &nSamplesAvailableNext +#endif #ifdef SUPPORT_JBM_TRACEFILE , writeJbmTraceFileFrameWrapper, @@ -2104,7 +2267,11 @@ static ivas_error decodeVoIP( goto cleanup; } } +#ifdef DEBUG_JBM_CMD_OPTION + else if ( arg.noBadFrameDelay == false ) +#else else +#endif { ++numInitialBadFrames; } @@ -2135,7 +2302,12 @@ static ivas_error decodeVoIP( } frame++; +#ifdef JBM_TSM_ON_TCS + systemTime_ms += systemTimeInc_ms; + nFramesWritten++; +#else systemTime_ms += 20; +#endif #ifdef WMOPS update_mem(); @@ -2193,6 +2365,538 @@ cleanup: } +#ifdef VARIABLE_SPEED_DECODING +/*---------------------------------------------------------------------* + * decodeVariableSpeed() + * + * Read G.192 or decode with variable Speed + *---------------------------------------------------------------------*/ + +static ivas_error decodeVariableSpeed( + DecArguments arg, + BS_READER_HANDLE hBsReader, + HeadRotFileReader *headRotReader, + HeadRotFileReader *refRotReader, + Vector3PairFileReader *referenceVectorReader, + IVAS_DEC_HANDLE hIvasDec ) + +{ + bool decodingFailed = true; /* Assume failure until cleanup is reached without errors */ + uint16_t bit_stream[IVAS_MAX_BITS_PER_FRAME + 4 * 8]; + int16_t i, num_bits; + int16_t bfi = 0; +#ifdef DEBUGGING + int16_t fec_seed = 12558; /* FEC_SEED */ +#endif + AudioFileWriter *afWriter = NULL; + MasaFileWriter *masaWriter = NULL; + bool decodedGoodFrame = false; + int16_t numInitialBadFrames = 0; /* Number of bad frames received until first good frame is decoded */ + int16_t nOutChannels = 0; + int16_t delayNumSamples = -1; + int16_t delayNumSamples_orig = 0; + int16_t nOutSamples = 0; + int32_t delayTimeScale = 0; + ivas_error error = IVAS_ERR_UNKNOWN; + uint16_t numObj = 0; + IVAS_DEC_BS_FORMAT bsFormat = IVAS_DEC_BS_UNKOWN; + uint16_t nSamplesAvailableNext; + int16_t pcmBuf[MAX_OUTPUT_PCM_BUFFER_SIZE]; +#ifdef SUPPORT_JBM_TRACEFILE + JbmTraceFileWriter *jbmTraceWriter = NULL; +#endif + TsmScaleFileReader *tsmScaleFileReader = NULL; + IsmFileWriter *ismWriters[IVAS_MAX_NUM_OBJECTS]; + IVAS_VECTOR3 Pos[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + int16_t scale; + for ( i = 0; i < IVAS_MAX_NUM_OBJECTS; ++i ) + { + ismWriters[i] = NULL; + } + + /*------------------------------------------------------------------------------------------* + * Open TSM scale file + *------------------------------------------------------------------------------------------*/ + + if ( arg.tsmScaleFileEnabled ) + { + if ( ( tsmScaleFileReader = TsmScaleFileReader_open( arg.tsmScaleFileName ) ) == NULL ) + { + fprintf( stderr, "\nError: Can't open TSM scale file %s \n\n", arg.tsmScaleFileName ); + goto cleanup; + } + } + + if ( !arg.quietModeEnabled ) + { + fprintf( stdout, "\n------ Running the decoder ------\n\n" ); + fprintf( stdout, "Frames processed: " ); + } + else + { + fprintf( stdout, "\n-- Start the decoder (quiet mode) --\n\n" ); + } + +#ifdef WMOPS + reset_stack(); + reset_wmops(); +#endif + nSamplesAvailableNext = 0; + nOutSamples = (int16_t) ( arg.output_Fs / 1000 * VARIABLE_SPEED_FETCH_FRAMESIZE_MS ); + /*------------------------------------------------------------------------------------------* + * Loop for every packet (frame) of bitstream data + * - Read the bitstream packet + * - Run the decoder + * - Write the synthesized signal into output file + *------------------------------------------------------------------------------------------*/ + + while ( 1 ) + { + /* Read next frame if not enough samples availble */ + + /* reference vector */ + if ( arg.enableReferenceVectorTracking ) + { + IVAS_VECTOR3 listenerPosition, referencePosition; + if ( ( error = Vector3PairFileReader_read( referenceVectorReader, &listenerPosition, &referencePosition ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading listener and reference positions from %s\n", IVAS_DEC_GetErrorMessage( error ), Vector3PairFileReader_getFilePath( referenceVectorReader ) ); + goto cleanup; + } + + if ( ( error = IVAS_DEC_FeedRefVectorData( hIvasDec, listenerPosition, referencePosition ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedRefVectorData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + /* Reference rotation */ + if ( arg.enableReferenceRotation ) + { + IVAS_QUATERNION quaternion; + if ( ( error = HeadRotationFileReading( refRotReader, &quaternion, NULL ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading reference rotation from %s\n", IVAS_DEC_GetErrorMessage( error ), HeadRotationFileReader_getFilePath( refRotReader ) ); + goto cleanup; + } + + if ( ( error = IVAS_DEC_FeedRefRotData( hIvasDec, quaternion ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedRefRotData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + /* Head-tracking input simulation */ + if ( arg.enableHeadRotation ) + { + IVAS_QUATERNION Quaternions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + + for ( i = 0; i < IVAS_MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + if ( ( error = HeadRotationFileReading( headRotReader, &Quaternions[i], &Pos[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), HeadRotationFileReader_getFilePath( headRotReader ) ); + goto cleanup; + } + } + + if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternions, Pos ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedHeadTrackData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + /* decode and get samples */ + do + { + error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, + pcmBuf, 0, + &nSamplesAvailableNext +#ifdef SUPPORT_JBM_TRACEFILE + , + writeJbmTraceFileFrameWrapper, + jbmTraceWriter +#endif + ); + if ( error != IVAS_ERR_OK && error != IVAS_ERR_VS_FRAME_NEEDED ) + + { + fprintf( stderr, "\nError in IVAS_DEC_VoIP_GetSamples: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + if ( error == IVAS_ERR_VS_FRAME_NEEDED ) + { + if ( arg.tsmScaleFileEnabled ) + { + if ( ( error = TsmScaleFileReader_readScale( tsmScaleFileReader, &scale ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: input bitstream file couldn't be read: %s \n\n", arg.inputBitstreamFilename ); + goto cleanup; + } + IVAS_DEC_VoIP_SetScale( hIvasDec, scale ); + } + + if ( ( error = BS_Reader_ReadFrame_short( hBsReader, bit_stream, &num_bits, &bfi ) ) != IVAS_ERR_OK ) + { + if ( error == IVAS_ERR_END_OF_FILE ) + { + break; + } + fprintf( stderr, "\nError: input bitstream file couldn't be read: %s \n\n", arg.inputBitstreamFilename ); + goto cleanup; + } + +#ifdef DEBUGGING + /* Random FEC simulation */ + if ( arg.FER > 0.0f ) + { + float ftmp = (float) app_own_random( &fec_seed ) + 32768.0f; + if ( ftmp <= arg.FER / 100.0f * 65535.0f ) + { + bfi = 1; + } + else + { + bfi = 0; + } + } +#endif + + /* Feed into decoder */ + if ( ( error = IVAS_DEC_FeedFrame_Serial( hIvasDec, bit_stream, num_bits, bfi ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: could not feed frame to decoder: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + error = IVAS_ERR_VS_FRAME_NEEDED; + } + } while ( error != IVAS_ERR_OK ); + + if ( error == IVAS_ERR_END_OF_FILE ) + { + break; + } + + /* Continue checking for first good frame until it is found */ + if ( !decodedGoodFrame ) + { + if ( ( error = IVAS_DEC_HasDecodedFirstGoodFrame( hIvasDec, &decodedGoodFrame ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_HasDecodedFirstGoodFrame, code: %d\n", error ); + goto cleanup; + } + + /* Once good frame decoded, catch up */ + if ( decodedGoodFrame ) + { + error = initOnFirstGoodFrame( + hIvasDec, + arg, + numInitialBadFrames, + nOutSamples, + &delayNumSamples_orig, + &delayNumSamples, + &delayTimeScale, + &bsFormat, + &afWriter, + &masaWriter, + ismWriters, + &nOutChannels, + &numObj ); + if ( error != IVAS_ERR_OK ) + { + goto cleanup; + } + } + else + { + ++numInitialBadFrames; + } + } + + + /* Write current frame */ + if ( decodedGoodFrame ) + { + if ( delayNumSamples < nOutSamples ) + { + if ( ( error = AudioFileWriter_write( afWriter, &pcmBuf[delayNumSamples * nOutChannels], nOutSamples * nOutChannels - ( delayNumSamples * nOutChannels ) ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nOutput audio file writer error\n" ); + goto cleanup; + } + delayNumSamples = 0; + } + else + { + delayNumSamples -= nOutSamples; + } + } + + /* Write ISm metadata to external file(s) */ + if ( decodedGoodFrame && arg.outputFormat == IVAS_DEC_OUTPUT_EXT ) + { + if ( bsFormat == IVAS_DEC_BS_OBJ ) + { + if ( ( error = IVAS_DEC_GetNumObjects( hIvasDec, &numObj ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetNumObjects: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + for ( i = 0; i < numObj; ++i ) + { + IVAS_ISM_METADATA IsmMetadata; + + if ( ( error = IVAS_DEC_GetObjectMetadata( hIvasDec, &IsmMetadata, 0, i ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetObjectMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( ( IsmFileWriter_writeFrame( IsmMetadata, ismWriters[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing ISM metadata to file %s\n", IsmFileWriter_getFilePath( ismWriters[i] ) ); + goto cleanup; + } + } + } + else if ( bsFormat == IVAS_DEC_BS_MASA ) + { + MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta; + if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); + goto cleanup; + } + } + } + + frame++; + if ( !arg.quietModeEnabled ) + { + fprintf( stdout, "%-8d\b\b\b\b\b\b\b\b", frame ); +#ifdef DEBUGGING + if ( IVAS_DEC_GetBerDetectFlag( hIvasDec ) ) + { + fprintf( stdout, "\n Decoding error: BER detected in frame %d !!!!!\n", frame - 1 ); + } +#endif + } +#ifdef WMOPS + update_wmops(); +#ifdef MEM_COUNT_DETAILS + export_mem( "mem_analysis.csv" ); +#endif +#endif + } + + + /*------------------------------------------------------------------------------------------* + * Flush what is still left in the VoIP Buffers.... + *------------------------------------------------------------------------------------------*/ + while ( nSamplesAvailableNext > 0 ) + { + int16_t nSamplesFlushed; + + /* Feed into decoder */ + + /* reference vector */ + if ( arg.enableReferenceVectorTracking ) + { + IVAS_VECTOR3 listenerPosition, referencePosition; + if ( ( error = Vector3PairFileReader_read( referenceVectorReader, &listenerPosition, &referencePosition ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading listener and reference positions from %s\n", IVAS_DEC_GetErrorMessage( error ), Vector3PairFileReader_getFilePath( referenceVectorReader ) ); + goto cleanup; + } + + if ( ( error = IVAS_DEC_FeedRefVectorData( hIvasDec, listenerPosition, referencePosition ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedRefVectorData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + /* Reference rotation */ + if ( arg.enableReferenceRotation ) + { + IVAS_QUATERNION quaternion; + if ( ( error = HeadRotationFileReading( refRotReader, &quaternion, NULL ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading reference rotation from %s\n", IVAS_DEC_GetErrorMessage( error ), HeadRotationFileReader_getFilePath( refRotReader ) ); + goto cleanup; + } + + if ( ( error = IVAS_DEC_FeedRefRotData( hIvasDec, quaternion ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedRefRotData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + /* Head-tracking input simulation */ + if ( arg.enableHeadRotation ) + { + IVAS_QUATERNION Quaternions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + + for ( i = 0; i < IVAS_MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + if ( ( error = HeadRotationFileReading( headRotReader, &Quaternions[i], &Pos[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), HeadRotationFileReader_getFilePath( headRotReader ) ); + goto cleanup; + } + } + + if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternions, Pos ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedHeadTrackData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + /* decode and get samples */ + if ( ( error = IVAS_DEC_VoIP_Flush( hIvasDec, nOutSamples, + pcmBuf, + &nSamplesAvailableNext, + &nSamplesFlushed ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_VoIP_Flush: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + + /* Write current frame */ + + if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, nSamplesFlushed * nOutChannels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nOutput audio file writer error\n" ); + goto cleanup; + } + + + /* Write ISm metadata to external file(s) */ + if ( decodedGoodFrame && arg.outputFormat == IVAS_DEC_OUTPUT_EXT ) + { + if ( bsFormat == IVAS_DEC_BS_OBJ ) + { + if ( ( error = IVAS_DEC_GetNumObjects( hIvasDec, &numObj ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetNumObjects: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + for ( i = 0; i < numObj; ++i ) + { + IVAS_ISM_METADATA IsmMetadata; + + if ( ( error = IVAS_DEC_GetObjectMetadata( hIvasDec, &IsmMetadata, 0, i ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetObjectMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( ( IsmFileWriter_writeFrame( IsmMetadata, ismWriters[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing ISM metadata to file %s\n", IsmFileWriter_getFilePath( ismWriters[i] ) ); + goto cleanup; + } + } + } + else if ( bsFormat == IVAS_DEC_BS_MASA ) + { + MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta; + if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); + goto cleanup; + } + } + } + + frame++; + if ( !arg.quietModeEnabled ) + { + fprintf( stdout, "%-8d\b\b\b\b\b\b\b\b", frame ); +#ifdef DEBUGGING + if ( IVAS_DEC_GetBerDetectFlag( hIvasDec ) ) + { + fprintf( stdout, "\n Decoding error: BER detected in frame %d !!!!!\n", frame - 1 ); + } +#endif + } + } + /*------------------------------------------------------------------------------------------* + * Printouts after decoding has finished + *------------------------------------------------------------------------------------------*/ + + if ( !arg.quietModeEnabled ) + { + fprintf( stdout, "\nDecoder delay: %-5u [samples] - Timescale: %5u\n", delayNumSamples_orig, delayTimeScale ); + } + + /* Print output metadata file name(s) */ + if ( arg.outputFormat == IVAS_DEC_OUTPUT_EXT ) + { + if ( bsFormat == IVAS_DEC_BS_OBJ ) + { + for ( i = 0; i < numObj; i++ ) + { + fprintf( stdout, "\nOutput metadata file: %s", IsmFileWriter_getFilePath( ismWriters[i] ) ); + } + fprintf( stdout, "\n" ); + } + else if ( bsFormat == IVAS_DEC_BS_MASA ) + { + fprintf( stdout, "\nOutput metadata file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); + } + } + + /* add zeros at the end to have equal length of synthesized signals */ + memset( pcmBuf, 0, delayNumSamples_orig * nOutChannels * sizeof( int16_t ) ); + if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, delayNumSamples_orig * nOutChannels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing output file: %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } + + /*------------------------------------------------------------------------------------------* + * Close files and deallocate resources + *------------------------------------------------------------------------------------------*/ + + decodingFailed = false; /* This will stay set to true if cleanup is reached via a goto due to an error */ + +cleanup: + + AudioFileWriter_close( &afWriter ); + MasaFileWriter_close( &masaWriter ); + for ( i = 0; i < IVAS_MAX_NUM_OBJECTS; i++ ) + { + IsmFileWriter_close( &ismWriters[i] ); + } + + if ( decodingFailed && error == IVAS_ERR_OK ) + { + return IVAS_ERR_UNKNOWN; + } + + return error; +} + +#endif + #ifdef DEBUGGING /*---------------------------------------------------------------------* * parseForcedRendModeDec() diff --git a/lib_com/fd_cng_com.c b/lib_com/fd_cng_com.c index f2dbf746b6..6cb2e014ba 100644 --- a/lib_com/fd_cng_com.c +++ b/lib_com/fd_cng_com.c @@ -940,6 +940,74 @@ void SynthesisSTFT( return; } +#ifdef JBM_TSM_ON_TCS +/*------------------------------------------------------------------- + * SynthesisSTFT_dirac() + * + * STFT synthesis filterbank + *-------------------------------------------------------------------*/ + +void SynthesisSTFT_dirac( + float *fftBuffer, /* i : FFT bins */ + float *timeDomainOutput, + float *olapBuffer, + const float *olapWin, + const int16_t samples_out, + HANDLE_FD_CNG_COM hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */ +) +{ + int16_t i; + float buf[M + 1 + 320], tmp; + + /* Perform IFFT */ + RFFTN( fftBuffer, hFdCngCom->fftSineTab, hFdCngCom->fftlen, 1 ); + + /* Handle overlap in P/S domain for stereo */ + mvr2r( olapBuffer + hFdCngCom->frameSize, olapBuffer, hFdCngCom->frameSize ); + set_f( olapBuffer + hFdCngCom->frameSize, 0.0f, hFdCngCom->frameSize ); /*olapBuffer, fftBuffer, olapWin*/ + + + for ( i = hFdCngCom->frameSize / 4; i < 3 * hFdCngCom->frameSize / 4; i++ ) + { + olapBuffer[i] += fftBuffer[i] * olapWin[i - hFdCngCom->frameSize / 4]; + } + for ( ; i < 5 * hFdCngCom->frameSize / 4; i++ ) + { + olapBuffer[i] = fftBuffer[i]; + } + + for ( ; i < 7 * hFdCngCom->frameSize / 4; i++ ) + { + olapBuffer[i] = fftBuffer[i]; + } + + for ( ; i < hFdCngCom->fftlen; i++ ) + { + olapBuffer[i] = 0; + } + + /* Get time-domain signal */ + v_multc( olapBuffer + hFdCngCom->frameSize / 4, (float) ( hFdCngCom->fftlen / 2 ), timeDomainOutput, samples_out ); + + /* Get excitation */ + v_multc( olapBuffer + hFdCngCom->frameSize / 4 - ( M + 1 ), (float) ( hFdCngCom->fftlen / 2 ), buf, M + 1 + hFdCngCom->frameSize ); + tmp = buf[0]; + preemph( buf + 1, PREEMPH_FAC, M + hFdCngCom->frameSize, &tmp ); + residu( hFdCngCom->A_cng, M, buf + 1 + M, hFdCngCom->exc_cng, hFdCngCom->frameSize ); + + /* update and window olapBuf if we have a output frame that is shorter than the default frame size...*/ + if ( samples_out < hFdCngCom->frameSize ) + { + mvr2r( olapBuffer + samples_out, olapBuffer + hFdCngCom->frameSize, 3 * hFdCngCom->frameSize / 4 ); + } + for ( i = 5 * hFdCngCom->frameSize / 4; i < 7 * hFdCngCom->frameSize / 4; i++ ) + { + olapBuffer[i] *= olapWin[i - 3 * hFdCngCom->frameSize / 4]; + } + + return; +} +#endif /*------------------------------------------------------------------- * mhvals() diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index ec806148b2..496f1fd86c 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -192,6 +192,25 @@ typedef enum #define IVAS_NUM_SUPPORTED_FS 3 /* number of supported sampling-rates in IVAS */ +#ifdef JBM_TSM_ON_TCS +#define CLDFB_SLOT_NS 1250000L /* 1.25ms: CLDFB slot length */ +#define MAX_JBM_SUBFRAMES_5MS 8 +#define DEFAULT_JBM_SUBFRAMES_5MS 4 +#define JBM_CLDFB_SLOTS_IN_SUBFRAME 4 +#define MAX_JBM_CLDFB_TIMESLOTS 32 +#define DEFAULT_JBM_CLDFB_TIMESLOTS 16 +#define MAX_JBM_L_FRAME48k 1920 +#define MAX_JBM_L_FRAME_NS 40000000L +#define MAX_SPAR_INTERNAL_CHANNELS FOA_CHANNELS + 2* ( IVAS_MAX_SBA_ORDER -1 ) +#define MAX_CLDFB_DIGEST_CHANNELS 4 +typedef enum +{ + TC_BUFFER_MODE_NONE = 0, + TC_BUFFER_MODE_RENDERER, + TC_BUFFER_MODE_BUFFER +} TC_BUFFER_MODE; +#endif + /*----------------------------------------------------------------------------------* * IVAS Bitrates *----------------------------------------------------------------------------------*/ @@ -1280,7 +1299,11 @@ typedef enum #define PARAM_MC_REG_GHAT (0.001f) /* Regularization factor for mixing matrix calculation */ #define PARAM_MC_MAX_PARAMETER_BANDS 20 /* Maximum number of parameter bands */ #define PARAM_MC_MAX_PARAMETER_BANDS_RES 14 /* Maximum number of parameter bands with decorrelation */ +#ifdef JBM_TSM_ON_TCS +#define PARAM_MC_MAX_NSLOTS MAX_JBM_CLDFB_TIMESLOTS /* Maximum number of CLDFB slots in a frame */ +#else #define PARAM_MC_MAX_NSLOTS 16 /* Maximum number of CLDFB slots in a frame */ +#endif #define PARAM_MC_MAX_NSLOTS_IN_SUBFRAME 4 /* Maximum number of CLDFB slots in a subframe */ #define PARAM_MC_NSUBFRAMES_DEC 4 /* Number of subframes for the synthesis in the decoder */ #define PARAM_MC_MAX_BANDS_IN_PARAMETER_BAND 30 /* Maximum number of CLDFB frequency bands within a parameter band */ diff --git a/lib_com/ivas_error.h b/lib_com/ivas_error.h index 9438ad44a1..ce51109207 100644 --- a/lib_com/ivas_error.h +++ b/lib_com/ivas_error.h @@ -87,6 +87,9 @@ typedef enum IVAS_ERR_ISM_INVALID_METADATA_VALUE, IVAS_ERR_INVALID_MASA_FORMAT_METADATA_FILE, IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED, +#ifdef VARIABLE_SPEED_DECODING + IVAS_ERR_VS_FRAME_NEEDED, +#endif #ifdef DEBUGGING IVAS_ERR_INVALID_FORCE_MODE, #ifdef DEBUG_AGC_ENCODER_CMD_OPTION diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 41d406ed1f..9869218a23 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -251,12 +251,25 @@ ivas_error ivas_compute_core_buffers( /*! r: number of clipped samples */ uint32_t ivas_syn_output( - float synth[][L_FRAME48k], /* i/o: float synthesis signal */ +#ifdef JBM_TSM_ON_TCS + float *synth[], /* i/o: float synthesis signal */ +#else + float synth[][L_FRAME48k], /* i/o: float synthesis signal */ +#endif const int16_t output_frame, /* i : output frame length (one channel) */ const int16_t n_channels, /* i : number of output channels */ int16_t *synth_out /* o : integer 16 bits synthesis signal */ ); +#ifdef JBM_TSM_ON_TCS +void ivas_syn_output_f( + float *synth[], /* i/o: float synthesis signal */ + const int16_t output_frame, /* i : output frame length (one channel) */ + const int16_t n_channels, /* i : number of output channels */ + float *synth_out /* o : integer 16 bits synthesis signal */ + ); +#endif + void ivas_initialize_handles_enc( Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ); @@ -299,6 +312,11 @@ ivas_error ivas_dec( ivas_error ivas_dec_setup( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ + #ifdef JBM_TSM_ON_TCS + , + uint16_t *nSamplesRendered, /* o : number of samples flushed from the previous frame (JBM) */ + int16_t *data /* o : flushed PCM samples */ +#endif ); ivas_error create_sce_dec( @@ -637,6 +655,11 @@ ivas_error ivas_mc_enc_config( ivas_error ivas_mc_dec_config( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const int16_t idx /* i : LS config. index */ + #ifdef JBM_TSM_ON_TCS + , + uint16_t *nSamplesRendered, /* o : samples flushed from last frame (JBM) */ + int16_t *data /* o : flushed samples (JBM) */ +#endif ); /*! r: MC format mode (MCT, McMASA, ParamMC) */ @@ -736,6 +759,104 @@ void dtx_read_padding_bits( const int16_t num_bits ); +#ifdef JBM_TSM_ON_TCS +/*----------------------------------------------------------------------------------* + * JBM prototypes + *----------------------------------------------------------------------------------*/ + +ivas_error ivas_jbm_dec_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *data /* o : output synthesis signal */ +); + +ivas_error ivas_jbm_dec_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const uint16_t nSamplesAsked, /* i : number of samples wanted */ + uint16_t *nSamplesRendered, /* o : number of samples rendered */ + uint16_t *nSamplesAvailableNext, /* o : number of samples still available in the rendering pipeline */ + int16_t *data /* o : output synthesis signal */ +); + +ivas_error ivas_jbm_dec_flush_renderer( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t tc_granularity_new, /* i : new renderer granularity */ + const RENDERER_TYPE renderer_type_old, /* i : old renderer type */ + const AUDIO_CONFIG intern_config_old, /* i : old internal config */ + const IVAS_OUTPUT_SETUP_HANDLE hIntSetupOld, /* i : old internal output setup */ + const MC_MODE mc_mode_old, /* i : old MC mode */ + const ISM_MODE ism_mode_old, /* i : old ISM mode */ + uint16_t *nSamplesRendered, /* o : number of samples flushed */ + int16_t *data /* o : rendered samples */ +); + +ivas_error ivas_jbm_dec_feed_tc_to_renderer( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t nSamplesForRendering, /* i: : number of TC samples available for rendering */ + int16_t *nSamplesResidual, /* o: : number of samples not fitting into the renderer grid and buffer for the next call*/ + float *data /* i/o: transport channels/output synthesis signal */ +); + +ivas_error ivas_jbm_dec_set_discard_samples( + Decoder_Struct *st_ivas /* i/o: main IVAS decoder structre */ +); + +void ivas_jbm_dec_get_adapted_linear_interpolator( + const int16_t default_interp_length, /* i : default length of the (full-frame) interpolator */ + const int16_t interp_length, /* i : length of the interpolator to be created */ + float *interpolator /* o : the interpolator */ +); + +void ivas_jbm_dec_get_adapted_subframes( + const int16_t nCldfbTs, /* i : number of time slots in the current frame */ + int16_t *subframe_nbslots, /* i/o: subframe grid */ + int16_t *nb_subframes /* i/o: number of subframes in the frame */ +); + +void ivas_jbm_dec_get_md_map( + const int16_t default_len, /* i : default frame length in metadata slots */ + const int16_t len, /* i : length of the modfied frames in metadata slots */ + const int16_t subframe_len, /* i : default length of a subframe */ + const int16_t offset, /* i : current read offset into the md buffer */ + const int16_t buf_len, /* i : length of the metadata buffer */ + int16_t *map /* o : metadata index map */ +); + +int16_t ivas_jbm_dec_get_num_tc_channels( Decoder_Struct *st_ivas ); /* i : IVAS decoder handle */ + +TC_BUFFER_MODE ivas_jbm_dec_get_tc_buffer_mode( + Decoder_Struct *st_ivas /* i : IVAS decoder handle */ +); + +int16_t ivas_jbm_dec_get_render_granularity( /* o : render granularity */ + const RENDERER_TYPE rendererType, /* i : renderer type */ + const int32_t output_Fs /* i : sampling rate */ +); + +ivas_error ivas_jbm_dec_tc_buffer_open( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const TC_BUFFER_MODE tc_buffer_mode, /* i : buffer mode */ + const int16_t nchan_transport_jbm, /* i : number of real transport channels */ + const int16_t nchan_transport_internal, /* i : number of totally buffered channels */ + const int16_t nchan_full, /* i : nubmer of channels to fully store */ + const int16_t n_samples_granularity /* i : granularity of the renderer/buffer */ +); + +ivas_error ivas_jbm_dec_tc_buffer_reconfigure( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const TC_BUFFER_MODE tc_buffer_mode, /* i : new buffer mode */ + const int16_t nchan_transport_jbm, /* i : new number of real transport channels */ + const int16_t nchan_transport_internal, /* i : new number of totally buffered channels */ + const int16_t nchan_full, /* i : new number of channels to fully store */ + const int16_t n_samples_granularity /* i : new granularity of the renderer/buffer */ +); + +void ivas_jbm_dec_tc_buffer_close( + DECODER_TC_BUFFER_HANDLE *phTcBuffer /* i/o: TC buffer handle */ +); +void ivas_jbm_dec_td_renderers_adapt_subframes( + Decoder_Struct *st_ivas +); +#endif /*----------------------------------------------------------------------------------* * ISM prototypes @@ -887,6 +1008,11 @@ ivas_error ivas_ism_dec_config( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ , const ISM_MODE last_ism_mode /* i/o: last ISM mode */ +#ifdef JBM_TSM_ON_TCS + , + uint16_t *nSamplesRendered, /* o : number of samples flushed on renderer change */ + int16_t *data /* o : flushed PCM samples */ +#endif ); ivas_error ivas_param_ism_dec_open( @@ -903,6 +1029,26 @@ void ivas_param_ism_dec( float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */ ); +#ifdef JBM_TSM_ON_TCS +void ivas_ism_dec_digest_tc( + Decoder_Struct *st_ivas +); + +void ivas_param_ism_dec_digest_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ + float *transport_channels_f[] /* i : synthesized core-coder transport channels/DirAC output */ +); + +void ivas_param_ism_dec_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ +); +#endif + void ivas_param_ism_params_to_masa_param_mapping( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); @@ -2622,7 +2768,11 @@ float sumAbs( void mvc2c( const uint8_t x[], /* i : input vector */ uint8_t y[], /* o : output vector */ +#ifdef FIX_XXX_JBM_FIFO_BUFFER + const int32_t n +#else const int16_t n /* i : vector size */ +#endif ); /*! r: the dot product x'*A*A'*x */ @@ -3185,6 +3335,16 @@ ivas_error ivas_sba_dec_reconfigure( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); +#ifdef JBM_TSM_ON_TCS +ivas_error ivas_sba_digest_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int16_t nCldfbSlots, /* i : number of CLDFB slots */ + const int16_t nSamplesForRendering, /* i : number of samples provided */ + float *data[] /* i : transport channel samples */ + ); +#endif + void ivas_init_dec_get_num_cldfb_instances( Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ int16_t *numCldfbAnalyses, /* o : number of CLDFB analysis instances */ @@ -3274,6 +3434,9 @@ void ivas_sba2mc_cldfb( float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: cldfb imag part */ const int16_t nb_channels_out, /* i : nb of output channels */ const int16_t nb_bands, /* i : nb of CLDFB bands to process */ +#ifdef JBM_TSM_ON_TCS + const int16_t nb_timeslots, /* i : number of time slots to process */ +#endif const float *hoa_dec_mtx /* i : HOA decoding mtx */ ); @@ -3356,13 +3519,54 @@ void ivas_dirac_dec_read_BS( int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ); +#ifdef JBM_TSM_ON_TCS +void generate_masking_noise_lb_dirac( + HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ + float *tdBuffer, /* i/o: time-domain signal, if NULL no LB-CNA */ + const int16_t nCldfbTs, /* i : number of CLDFB slots that will be rendered */ + const int16_t cna_flag /* i : CNA flag for LB and HB */ +); + +void ivas_dirac_dec_set_md_map( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + int16_t nCldfbTs ); + void ivas_dirac_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ + const int16_t nchan_transport /* i : number of transport channels */ +); +#endif + +#ifdef JBM_TSM_ON_TCS +void ivas_dirac_dec_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t nchan_transport, /* i : number of transport channels */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ +); +#endif + +#ifndef JBM_TSM_ON_TCS +void ivas_dirac_dec( +#else +void ivas_dirac_dec_render_sf( +#endif Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ +#ifdef JBM_TSM_ON_TCS + float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ +#else + float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ +#endif const int16_t nchan_transport, /* i : number of transport channels */ float *pppQMfFrame_ts_re[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX], - float *pppQMfFrame_ts_im[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX], + float *pppQMfFrame_ts_im[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX] +#ifndef JBM_TSM_ON_TCS + , const int16_t i_sf +#endif ); ivas_error ivas_dirac_dec_init_binaural_data( @@ -3462,13 +3666,26 @@ void ivas_dirac_dec_output_synthesis_close( ); void ivas_dirac_dec_output_synthesis_process_slot( - const float *reference_power, /* i : Estimated power */ - const float *onset, /* i : onset filter */ - DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ - const float *p_Rmat, /* i : rotation matrix */ - const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ - const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ - const int16_t nchan_transport /* i : number of transport channels */ + const float *reference_power, /* i : Estimated power */ + const float *onset, /* i : onset filter */ +#ifdef JBM_TSM_ON_TCS + const int16_t *azimuth, + const int16_t *elevation, + const float *diffuseness, + const uint16_t coherence_flag, +#endif + DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ +#ifdef JBM_TSM_ON_TCS + MASA_DECODER_HANDLE hMasa, + const int16_t sh_rot_max_order, +#endif + const float *p_Rmat, /* i : rotation matrix */ + const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ + const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ + const int16_t nchan_transport /* i : number of transport channels */ +#ifdef JBM_TSM_ON_TCS + ,const int16_t index_slot /* i : absolute slot index in the frame to process */ +#endif ); void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( @@ -3476,13 +3693,20 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX],/* i : LS signals */ DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ const int16_t nchan_transport, /* i : number of transport channels */ +#ifdef JBM_TSM_ON_TCS + const int16_t nbslots, /* i : number of slots to process */ +#endif const float *onset_filter ); void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( - float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX],/* i : LS signals */ - float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX],/* i : LS signals */ - DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ + float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX],/* i : LS signals */ + float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX],/* i : LS signals */ + DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ +#ifdef JBM_TSM_ON_TCS + const int16_t nbslots, /* i : number of slots to process */ + const int16_t diff_md_idx, /* i : md slot idx of diffuseness to use */ +#endif float *reference_power_smooth, float qualityBasedSmFactor ); @@ -3521,9 +3745,14 @@ void ivas_dirac_dec_compute_directional_responses( DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ const MASA_DECODER_HANDLE hMasa, /* i : MASA decoder structure */ +#ifdef JBM_TSM_ON_TCS + const int16_t *azimuth, + const int16_t *elevation, + const int16_t md_idx, +#endif const float *surCohRatio, - const int16_t shd_rot_max_order, /* i : split-order rotation method */ - const float *p_Rmat /* i : rotation matrix */ + const int16_t shd_rot_max_order, /* i : split-order rotation method */ + const float *p_Rmat /* i : rotation matrix */ ); void ivas_dirac_dec_get_frequency_axis( @@ -3598,9 +3827,29 @@ void ivas_param_mc_dec_read_BS( int16_t *nb_bits /* o : number of bits written */ ); +#ifdef JBM_TSM_ON_TCS +void ivas_param_mc_dec_digest_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint8_t nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ + float *transport_channels_f[] /* i : synthesized core-coder transport channels/DirAC output */ +); + +void ivas_param_mc_dec_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ +); +#endif + void ivas_param_mc_dec( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */ +#ifdef JBM_TSM_ON_TCS + float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ +#else + float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */ +#endif ); void ivas_param_mc_default_icc_map( @@ -3731,6 +3980,12 @@ ivas_error ivas_dirac_dec_output_synthesis_cov_open( const float *proto_matrix /* i : the prototype (upmix) matrix (only used if mode == 1) */ ); +#ifdef JBM_TSM_ON_TCS +void ivas_dirac_dec_output_synthesis_get_interpolator( + DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params, /* i/o: handle for the covariance synthesis parameters */ + const uint16_t interp_length ); +#endif + void ivas_dirac_dec_output_synthesis_cov_init( DIRAC_OUTPUT_SYNTHESIS_COV_STATE *h_dirac_output_synthesis_state, /* i/o: pointer to the state of the covariance synthesis */ const int16_t nchan_in, /* i : number of input (tranport) channels */ @@ -3745,27 +4000,45 @@ void ivas_dirac_dec_output_synthesis_cov_close( ); void ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot( - float RealBuffer[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (real part) */ - float ImagBuffer[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (imaginary part */ - float cx[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : accumulated input covariance (real part) */ - float cx_imag[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : accumulated input covariance (imaginary part) */ - PARAM_MC_DEC_HANDLE hParamMC, /* i : handle to Parametric MC state */ - const int16_t nchan_in, /* i : number of input channels */ - const int16_t idx_slot /* i : index of the slot to be added to the input covariance */ -); - +#ifdef JBM_TSM_ON_TCS + float *RealBuffer, /* i : input channel filter bank samples (real part) */ + float *ImagBuffer, /* i : input channel filter bank samples (imaginary part */ +#else + float RealBuffer[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (real part) */ + float ImagBuffer[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (imaginary part */ +#endif + float cx[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : accumulated input covariance (real part) */ + float cx_imag[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : accumulated input covariance (imaginary part) */ + PARAM_MC_DEC_HANDLE hParamMC, /* i : handle to Parametric MC state */ + const int16_t nchan_in /* i : number of input channels */ +#ifndef JBM_TSM_ON_TCS + , + const int16_t idx_slot /* i : index of the slot to be added to the input covariance */ +#endif +); + void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot( - float Cldfb_RealBuffer_in[][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (real part) */ - float Cldfb_ImagBuffer_in[][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (imaginary part) */ - float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (real part) */ - float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (imaginary part) */ - float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], /* i : parameter band wise mixing matrices (direct part) */ - float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], /* i : parameter band wise mixing matrices (residual part) */ - const uint16_t slot_idx_sfr, /* i : time slot index for the current slot within the current subframe */ - const uint16_t slot_idx_tot, /* i : time slot index for the current slot within the frame */ - const int16_t nX, /* i : number of input channels */ - const int16_t nY, /* i : number of output channels */ - PARAM_MC_DEC_HANDLE hMetadataPMC /* i : handle to the Parametric MC decoder state */ +#ifdef JBM_TSM_ON_TCS + float *Cldfb_RealBuffer_in, /* i : input channel filter bank samples (real part) */ + float *Cldfb_ImagBuffer_in, /* i : input channel filter bank samples (imaginary part) */ +#else + float Cldfb_RealBuffer_in[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : CLDFB samples of the transport channels (real part) */ + float Cldfb_ImagBuffer_in[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : CLDFB samples of the transport channels (imaginary part) */ +#endif + float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (real part) */ + float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (imaginary part) */ +#ifdef JBM_TSM_ON_TCS + float *mixing_matrix[], /* i : parameter band wise mixing matrices (direct part) */ + float *mixing_matrix_res[], /* i : parameter band wise mixing matrices (residual part) */ +#else + float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], /* i : parameter band wise mixing matrices (direct part) */ + float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], /* i : parameter band wise mixing matrices (residual part) */ +#endif + const uint16_t slot_idx_sfr, /* i : time slot index for the current slot within the current subframe */ + const uint16_t slot_idx_tot, /* i : time slot index for the current slot within the frame */ + const int16_t nX, /* i : number of input channels */ + const int16_t nY, /* i : number of output channels */ + PARAM_MC_DEC_HANDLE hParamMC /* i : handle to the Parametric MC decoder state */ ); int16_t computeMixingMatricesISM( @@ -3849,7 +4122,11 @@ void ivas_sba_upmixer_renderer( ); ivas_error ivas_sba_linear_renderer( +#ifdef JBM_TSM_ON_TCS + float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ +#else float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ +#endif const int16_t output_frame, /* i : output frame length per channel */ const int16_t nchan_in, /* i : number of input ambisonics channels */ const AUDIO_CONFIG output_config, /* i : output audio configuration */ @@ -3865,6 +4142,14 @@ void ivas_sba_mix_matrix_determiner( const int16_t output_frame /* i : output frame length */ ); +#ifdef JBM_TSM_ON_TCS +void ivas_sba_prototype_renderer_sf( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ + float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ + float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /* i : Input audio in CLDFB domain, imag */ +); +#endif + /* AGC */ /*! r: AGC enable flag */ int16_t ivas_agc_enc_get_flag( @@ -4021,6 +4306,51 @@ int16_t ivas_is_res_channel( const int16_t nchan_transport /* i : number of transport channels (1-4) */ ); +#ifdef JBM_TSM_ON_TCS +void ivas_spar_dec_agc_pca( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float output[][L_FRAME48k], /* i/o: input/output audio channels */ + const int16_t output_frame /* i : output frame length */ +); + +void ivas_spar_dec_set_render_map( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + int16_t nCldfbTs +); + +void ivas_spar_dec_set_render_params( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t n_cldfb_slots /* i : number of cldfb slots in this frame */ +); + +void ivas_spar_dec_digest_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int16_t nCldfbSlots, /* i : number of CLDFB slots */ + const int16_t nSamplesForRendering /* i : number of samples provided */ +); + +ivas_error ivas_sba_dec_digest_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t nCldfbSlots, /* i : number of CLDFB slots */ + const int16_t nSamplesForRendering /* i : number of samples provided */ +); + +void ivas_sba_dec_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ +); + +void ivas_spar_dec_upmixer_sf( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float *output[], /* o : output audio channels */ + const int16_t nchan_internal /* i : number of internal channels */ +); +#endif + void ivas_spar_dec_upmixer( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ float output[][L_FRAME48k], /* i/o: input/output audio channels */ @@ -4258,7 +4588,11 @@ void ivas_td_decorr_dec_close( void ivas_td_decorr_process( ivas_td_decorr_state_t *hTdDecorr, /* i/o: SPAR Covar. decoder handle */ +#ifdef JBM_TSM_ON_TCS + float *pcm_in[], /* i : input audio channels */ +#else float pcm_in[][L_FRAME48k], /* i : input audio channels */ +#endif float **ppOut_pcm, /* o : output audio channels */ const int16_t output_frame /* i : output frame length */ ); @@ -4593,6 +4927,19 @@ void ivas_masa_prerender( const int16_t output_frame /* i : output frame length per channel */ ); +#ifdef JBM_TSM_ON_TCS +void ivas_spar_param_to_masa_param_mapping_sf( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ + int16_t azimuth[][CLDFB_NO_CHANNELS_MAX], + int16_t elevation[][CLDFB_NO_CHANNELS_MAX], + float energy_ratio1[][CLDFB_NO_CHANNELS_MAX], + float spreadCoherence[][CLDFB_NO_CHANNELS_MAX], + float surroundingCoherence[][CLDFB_NO_CHANNELS_MAX], + float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ + float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /* i : Input audio in CLDFB domain, imag */ +); +#endif + void ivas_spar_param_to_masa_param_mapping( Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ @@ -4617,12 +4964,28 @@ void ivas_binRenderer_close( #ifdef DEBUGGING void ivas_binaural_cldfb( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ +#ifdef JBM_TSM_ON_TCS + float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ +#else float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */ +#endif +); + +#ifdef JBM_TSM_ON_TCS +void ivas_binaural_cldfb_sf( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t n_samples_to_render, + float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ ); +#endif + #endif void ivas_binRenderer( BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: fastconv binaural renderer handle */ HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i/o: head track handle */ +#ifdef JBM_TSM_ON_TCS + const int16_t numTimeSlots, /* i: : number of time slots to process */ +#endif float Cldfb_RealBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ float Cldfb_ImagBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ @@ -4632,7 +4995,12 @@ void ivas_binRenderer( void ivas_binaural_add_LFE( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ int16_t output_frame, /* i : length of input frame */ +#ifdef JBM_TSM_ON_TCS + float *input_f[], /* i : transport channels */ + float *output_f[] /* o : synthesized core-coder transport channels/DirAC output */ +#else float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */ +#endif ); @@ -4646,10 +5014,22 @@ ivas_error ivas_ism_renderer_open( void ivas_ism_render( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ +#ifdef JBM_TSM_ON_TCS + float *output_f[], /* i/o: core-coder transport channels/object output */ +#else float output_f[][L_FRAME48k], /* i/o: core-coder transport channels/object output */ +#endif const int16_t output_frame /* i : output frame length per channel */ ); +#ifdef JBM_TSM_ON_TCS +void ivas_ism_render_sf( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output_f[], /* i/o: core-coder transport channels/object output */ + const int16_t n_samples_to_render /* i : output frame length per channel */ +); +#endif + void ivas_ism_get_stereo_gains( const float azimuth, /* i : object azimuth */ const float elevation, /* i : object elevation */ @@ -4659,14 +5039,23 @@ void ivas_ism_get_stereo_gains( void ivas_mc2sba( IVAS_OUTPUT_SETUP hIntSetup, /* i : Format of decoder output */ - float buffer_td[][L_FRAME48k], /* i/o: MC signals (on input) and the HOA3 (on output) */ +#ifdef JBM_TSM_ON_TCS + float *in_buffer_td[], /* i : MC signals (on input) and the HOA3 (on output) */ + float *buffer_td[], /* o : MC signals (on input) and the HOA3 (on output) */ +#else + float buffer_td[][L_FRAME48k], /* i/o: MC signals (on input) and the HOA3 (on output) */ +#endif const int16_t output_frame, /* i : output frame length per channel */ const int16_t sba_order, /* i : SBA order */ const float gain_lfe /* i : gain for LFE, 0=ignore LFE */ ); void ivas_ism2sba( - float buffer_td[][L_FRAME48k], /* i/o: TD signal buffers */ +#ifdef JBM_TSM_ON_TCS + float *buffer_td[], /* i/o: TD signal buffers */ +#else + float buffer_td[][L_FRAME48k], /* i/o: TD signal buffers */ +#endif ISM_RENDERER_HANDLE hIsmRendererData, /* i/o: renderer data */ const ISM_METADATA_HANDLE hIsmMetaData[], /* i : object metadata */ const int16_t nchan_ism, /* i : number of objects */ @@ -4674,7 +5063,17 @@ void ivas_ism2sba( const int16_t sba_order /* i : SBA order */ ); - +#ifdef JBM_TSM_ON_TCS +void ivas_ism2sba_sf( + float *buffer_in[], /* i : TC buffer */ + float *buffer_out[], /* o : TD signal buffers */ + ISM_RENDERER_HANDLE hIsmRendererData, /* i/o: renderer data */ + const int16_t num_objects, /* i : number of objects */ + const int16_t n_samples_to_render, /* i : output frame length per channel */ + const int16_t offset, /* i : offset for the interpolatr */ + const int16_t sba_order /* i : Ambisonic (SBA) order */ +); +#endif /*----------------------------------------------------------------------------------* * Amplitude Panning VBAP prototypes *----------------------------------------------------------------------------------*/ @@ -4725,7 +5124,12 @@ void ivas_ls_setup_conversion_close( void ivas_ls_setup_conversion( Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ const int16_t output_frame, /* i : frame length */ - float output[][L_FRAME48k] /* i/o: LS input/output synthesis signal */ +#ifdef JBM_TSM_ON_TCS + float *input[], /* i : LS input/output synthesis signal */ + float *output[] /* i/o: LS input/output synthesis signal */ +#else + float output[][L_FRAME48k] /* i/o: LS input/output synthesis signal */ +#endif ); void ivas_ls_setup_conversion_process_mdct( @@ -4740,6 +5144,9 @@ void ivas_ls_setup_conversion_process_mdct_param_mc( void ivas_lssetupconversion_process_param_mc( Decoder_Struct *st_ivas, /* i/o: LS setup conversion renderer handle */ +#ifdef JBM_TSM_ON_TCS + int16_t num_timeslots, /* i : number of time slots to process */ +#endif float Cldfb_RealBuffer_InOut[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals */ float Cldfb_ImagBuffer_InOut[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals */ int16_t channel_active[MAX_CICP_CHANNELS] /* i : bitmap indicating which output channels are active */ @@ -4966,10 +5373,21 @@ ivas_error ivas_td_binaural_open( ivas_error ivas_td_binaural_renderer( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ +#ifdef JBM_TSM_ON_TCS + float *output[], /* i/o: SCE channels / Binaural synthesis */ +#else + float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ +#endif const int16_t output_frame /* i : output frame length */ ); +#ifdef JBM_TSM_ON_TCS +void ObjRenderIVASSubframe( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output[], /* i/o: SCE channels / Binaural synthesis */ + const int16_t output_frame /* i : output frame length */ +); +#endif /*----------------------------------------------------------------------------------* * Filter-bank (FB) Mixer diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index 7fceb7941f..80f564e54a 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -335,7 +335,7 @@ typedef struct ivas_agc_chan_data_t typedef struct ivas_agc_com_state_t { float *winFunc; - int16_t in_delay; + int16_t in_delay; /* TODO: JBM check if this needs to be adjusted in the dec */ uint16_t absEmin; uint16_t betaE; uint16_t maxAttExp; @@ -689,6 +689,10 @@ typedef struct ivas_td_decorr_state_t int16_t num_apd_outputs; int16_t num_apd_sections; int16_t ducking_flag; + +#ifdef JBM_TSM_ON_TCS + int16_t offset; +#endif } ivas_td_decorr_state_t; diff --git a/lib_com/ivas_td_decorr.c b/lib_com/ivas_td_decorr.c index 23620b3b2d..59db50c443 100644 --- a/lib_com/ivas_td_decorr.c +++ b/lib_com/ivas_td_decorr.c @@ -127,7 +127,9 @@ ivas_error ivas_td_decorr_dec_open( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV decoder" ); } set_f( hTdDecorr_loc->look_ahead_buf, 0, (int16_t) ( output_Fs * IVAS_DECORR_PARM_LOOKAHEAD_TAU ) ); - +#ifdef JBM_TSM_ON_TCS + hTdDecorr_loc->offset = (int16_t) ( output_Fs * IVAS_DECORR_PARM_LOOKAHEAD_TAU ); +#endif hTdDecorr_loc->num_apd_sections = ivas_get_APD_filt_orders( num_out_chans, output_Fs, hTdDecorr_loc->APD_filt_state[0].order ); for ( j = 0; j < num_out_chans; j++ ) @@ -375,20 +377,32 @@ static void ivas_td_decorr_APD_sections( void ivas_td_decorr_process( ivas_td_decorr_state_t *hTdDecorr, /* i/o: SPAR Covar. decoder handle */ - float pcm_in[][L_FRAME48k], /* i : input audio channels */ - float **ppOut_pcm, /* o : output audio channels */ - const int16_t output_frame /* i : output frame length */ +#ifdef JBM_TSM_ON_TCS + float *pcm_in[], +#else + float pcm_in[][L_FRAME48k], /* i : input audio channels */ +#endif + float **ppOut_pcm, /* o : output audio channels */ + const int16_t output_frame /* i : output frame length */ ) { int16_t i, j; +#ifndef JBM_TSM_ON_TCS int16_t offset; +#endif float in_duck_gain[L_FRAME48k], out_duck_gain[L_FRAME48k]; +#ifndef JBM_TSM_ON_TCS offset = (int16_t) ( output_frame * FRAMES_PER_SEC * IVAS_DECORR_PARM_LOOKAHEAD_TAU ); +#endif /* Look-ahead delay */ mvr2r( pcm_in[0], ppOut_pcm[0], output_frame ); +#ifdef JBM_TSM_ON_TCS + delay_signal( ppOut_pcm[0], output_frame, hTdDecorr->look_ahead_buf, hTdDecorr->offset ); +#else delay_signal( ppOut_pcm[0], output_frame, hTdDecorr->look_ahead_buf, offset ); +#endif /* In ducking gains */ if ( hTdDecorr->ducking_flag ) diff --git a/lib_com/ivas_tools.c b/lib_com/ivas_tools.c index b75c083791..e348d8a241 100644 --- a/lib_com/ivas_tools.c +++ b/lib_com/ivas_tools.c @@ -75,10 +75,18 @@ float sumAbs( void mvc2c( const uint8_t x[], /* i : input vector */ uint8_t y[], /* o : output vector */ - const int16_t n /* i : vector size */ +#ifdef FIX_XXX_JBM_FIFO_BUFFER + const int32_t n +#else + const int16_t n /* i : vector size */ +#endif ) { +#ifdef FIX_XXX_JBM_FIFO_BUFFER + int32_t i; +#else int16_t i; +#endif if ( n <= 0 ) { @@ -114,14 +122,22 @@ void mvc2c( /*! r: number of clipped samples */ uint32_t ivas_syn_output( - float synth[][L_FRAME48k], /* i/o: float synthesis signal */ +#ifdef JBM_TSM_ON_TCS + float *synth[], /* i/o: float synthesis signal */ +#else + float synth[][L_FRAME48k], /* i/o: float synthesis signal */ +#endif const int16_t output_frame, /* i : output frame length (one channel) */ const int16_t n_channels, /* i : number of output channels */ int16_t *synth_out /* o : integer 16 bits synthesis signal */ ) { int16_t i, n; +#ifdef JBM_TSM_ON_TCS + int16_t synth_loc[MAX_JBM_L_FRAME48k]; +#else int16_t synth_loc[L_FRAME48k]; +#endif uint32_t noClipping = 0; /*-----------------------------------------------------------------* @@ -147,6 +163,40 @@ uint32_t ivas_syn_output( return noClipping; } +#ifdef JBM_TSM_ON_TCS +/*-------------------------------------------------------------------* + * ivas_syn_output_f() + * + * Output ivas synthesis signal with compensation for saturation + * returns number of clipped samples + *-------------------------------------------------------------------*/ + +/*! r: number of clipped samples */ +void ivas_syn_output_f( + float *synth[], /* i/o: float synthesis signal */ + const int16_t output_frame, /* i : output frame length (one channel) */ + const int16_t n_channels, /* i : number of output channels */ + float *synth_out /* o : integer 16 bits synthesis signal */ +) +{ + int16_t i, n; + + /*-----------------------------------------------------------------* + * float to integer conversion with saturation control + *-----------------------------------------------------------------*/ + + for ( n = 0; n < n_channels; n++ ) + { + for ( i = 0; i < output_frame; i++ ) + { + synth_out[i * n_channels + n] = synth[n][i]; + } + } + + return; +} +#endif + /*-------------------------------------------------------------------* * mvr2r_inc() * diff --git a/lib_com/options.h b/lib_com/options.h index c4ecc904db..e7ffeb2b7a 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -72,6 +72,7 @@ /*#define DEBUG_MODE_INFO_PLC */ /* define to output PLC related parameters */ /*#define DEBUG_MODE_INFO_ALLRAD*/ /* define to output generated HOA decoding mtx */ /*#define DEBUG_MODE_LFE */ /* define to output LFE relevant parameters */ +/*#define DEBUG_MODE_JBM */ /* define to output import JBM parameters */ #endif #ifdef DEBUG_MODE_MDCT @@ -112,9 +113,9 @@ /*#define TDREND_HRTF_TABLE_METHODS*/ /* Enable HRTF lookup from tables, for testing & evaluation. Supply file in table format to use. Note that a suitable HR filter lookup method should be written if the filters sample point grids are not in the formats. */ /*#define TDREND_STANDALONE*/ /* Used when renderer is built in standalone form, without IVAS encoding/decoding (see scripts/object_renderer_standalone). This is just here to ensure this is cleaned out by prepare_instrumentation.sh */ -/*#define DEBUG_SBA*/ /* debug DIRAC/SPAR in-out */ +#define DEBUG_SBA /* debug DIRAC/SPAR in-out */ #ifdef DEBUG_SBA -/*#define DEBUG_SBA_AUDIO_DUMP*/ /* SBA intermediate audio wav file dumping */ +/*#define DEBUG_SBA_AUDIO_DUMP */ /* SBA intermediate audio wav file dumping */ /*#define DEBUG_SBA_MD_DUMP*/ /* SBA metadata and variable file dumping */ /*#define DEBUG_SPAR_MD_TARGET_TUNING*/ /* SPAR MD target bitrate tuning debug code */ /*#define DEBUG_SPAR_BYPASS_EVS_CODEC*/ /* bypass EVS coding in float precision, emulating EVS encoder/decoder delay */ @@ -125,6 +126,8 @@ /*#define SPAR_HOA_DBG*/ /* SPAR HOA debug statements */ /*#define DEBUG_BINAURAL_FILTER_DESIGN*/ /* debugging of Crend binaural filter design */ #define DEBUG_AGC_ENCODER_CMD_OPTION /* Ability to force enable or disable AGC behaviour in DIRAC/SPAR via command line option */ +/*#define DEBUG_JBM*/ +#define DEBUG_JBM_CMD_OPTION /* ability for telling the decoder the frontend fetch size and to not delay compensate for bad frames at the beginning */ #endif /* #################### End DEBUGGING switches ############################ */ @@ -146,7 +149,15 @@ #define REND_DEBUGGING_REVISION /* VA: encapsulate rendering debugging options with DEBUGGING */ #define FIX_419_ISM_MD_FIX /* VA: Issue 419: fix the upper value limitation for parameter angle1_diff_cnt */ +#define FIX_XXX_JBM_FIFO_BUFFER /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ +#define VARIABLE_SPEED_DECODING /* FhG: variable speed decoding employing the JBM functioniality */ +#define JBM_TSM_ON_TCS /* FhG: run the TSM part of JBM on the TCs instead of the final output pcm waveforms */ +#ifdef JBM_TSM_ON_TCS +#define TEST_BIN_RENDERER_BE +#define TMP_FIX_ISM_BR_SWITCHING /* */ +/*#define JBM_DIRAC_DEBUG_BE*/ +#endif /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ #endif diff --git a/lib_com/prot.h b/lib_com/prot.h index 65f821e5fb..40e84a72ca 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -177,7 +177,11 @@ float sum2_f( void set_c( int8_t y[], /* i/o: Vector to set */ const int8_t a, /* i : Value to set the vector to */ - const int16_t N /* i : Lenght of the vector */ +#ifdef JBM_TSM_ON_TCS + const int32_t N /* i : Length of the vector */ +#else + const int16_t N /* i : Length of the vector */ +#endif ); void set_s( @@ -8543,6 +8547,17 @@ void generate_masking_noise_mdct( HANDLE_FD_CNG_COM hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */ ); +#ifdef JBM_TSM_ON_TCS +void SynthesisSTFT_dirac( + float *fftBuffer, /* i : FFT bins */ + float *timeDomainOutput, + float *olapBuffer, + const float *olapWin, + const int16_t samples_out, + HANDLE_FD_CNG_COM hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */ +); +#endif + void generate_masking_noise_dirac( HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i : filterbank state */ diff --git a/lib_com/tools.c b/lib_com/tools.c index db7c5a3f8e..b9b8428a06 100644 --- a/lib_com/tools.c +++ b/lib_com/tools.c @@ -210,7 +210,11 @@ float sum2_f( void set_c( int8_t y[], /* i/o: Vector to set */ const int8_t a, /* i : Value to set the vector to */ +#ifdef JBM_TSM_ON_TCS + const int32_t N /* i : Length of the vector */ +#else const int16_t N /* i : Length of the vector */ +#endif ) { int16_t i; @@ -387,7 +391,11 @@ uint32_t mvr2s( return 0; } +#ifdef JBM_TSM_ON_TCS + if ( (void *) y <= (const void *) x ) +#else if ( (void *) y < (const void *) x ) +#endif { for ( i = 0; i < n; i++ ) { diff --git a/lib_debug/debug.c b/lib_debug/debug.c index 85e48e8bae..4e4cf1cf8b 100644 --- a/lib_debug/debug.c +++ b/lib_debug/debug.c @@ -54,6 +54,9 @@ #else #endif #include "wmc_auto.h" +#ifdef DEBUG_JBM +#include "tinywaveout_c.h" +#endif /*-------------------------------------------------------------------* @@ -93,6 +96,12 @@ static FILE *out_fileptr[N_FILEPTR]; static char *in_filename[N_FILEPTR]; static char *out_filename[N_FILEPTR]; +#ifdef DEBUG_MODE_JBM +static char *wav_out_filename[N_FILEPTR]; +static WAVEFILEOUT *wav_out_fileptr[N_FILEPTR]; +static int16_t wav_count; +#endif + static int16_t in_count = 0; static int16_t out_count = 0; @@ -201,6 +210,93 @@ int16_t dbgwrite( return 0; } +#ifdef DEBUG_MODE_JBM +/*-------------------------------------------------------------------* + * dbgwritewav() + * + * Writes the buffer content to the specified file. If the file is not in the + * debug file list, it is opened before write. + *--------------------------------------------------------------------*/ + +int16_t dbgwritewav( + const int16_t input_frame, + float **ppPcm, + float pcm_array[MAX_OUTPUT_CHANNELS][L_FRAME48k], + const int16_t no_channel, + const int32_t fs, +#ifdef DEBUG_MODE_INFO_TWEAK + const char *filename /* i : Output file name */ +#else + const char *const filename +#endif +) +{ + int16_t index, i; + +#ifdef DEBUG_MODE_INFO +#ifdef DEBUG_MODE_INFO_TWEAK + char filename_mod[FILENAME_MAX]; + int16_t textmode = 0; + memset( filename_mod, 0, FILENAME_MAX ); + tweakdbgfolder( filename, filename_mod, &textmode ); + if ( filename_mod[0] != 0 ) + { + filename = filename_mod; + } +#endif +#endif + + index = lookup( filename, (const char *const *) wav_out_filename, wav_count ); + + if ( index == -1 ) + { + if ( make_dirs( filename ) != 0 ) + { + fprintf( stderr, "dbgwrite: Could not create directory structure for %s. Exiting..\n", filename ); + exit( -1 ); + } + + index = wav_count; + wav_out_filename[index] = malloc( sizeof( char ) * ( strlen( filename ) + 1 ) ); + strcpy( wav_out_filename[index], filename ); + wav_out_fileptr[index] = CreateWav( (const char *) wav_out_filename[index], fs, no_channel, 32 /* const uint32_t writeWaveExt */ ); + + wav_count++; + } + + if ( wav_out_fileptr[index] != NULL ) + { + float debug_tmp[IVAS_SPAR_MAX_CH * L_FRAME48k * 2]; + int32_t j, k; + k = 0; + for ( j = 0; j < input_frame; j++ ) + { + for ( i = 0; i < no_channel; i++, k++ ) + { + float tmp_value; + if ( ppPcm ) + { + tmp_value = ppPcm[i][j]; + } + else + { + tmp_value = pcm_array[i][j]; + } + debug_tmp[k] = tmp_value; + } + } + WriteWavFloat( wav_out_fileptr[index], debug_tmp, ( no_channel * input_frame ) ); + } + else + { + fprintf( stderr, "dbgwrite: Could not write to file: %s. Exiting..\n", filename ); + exit( -1 ); + } + + return 0; +} +#endif + /*-------------------------------------------------------------------* * dbgwrite_mat_repeat() * @@ -406,7 +502,14 @@ void dbgclose() free( val_name[i] ); free( val[i] ); } - +#ifdef DEBUG_MODE_JBM + for ( i = 0; i < wav_count; i++ ) + { + CloseWav( wav_out_fileptr[i] ); + wav_out_fileptr[i] = NULL; + free( wav_out_filename[i] ); + } +#endif return; } diff --git a/lib_debug/debug.h b/lib_debug/debug.h index 3d59cb00a0..c89f245af6 100644 --- a/lib_debug/debug.h +++ b/lib_debug/debug.h @@ -98,6 +98,21 @@ int16_t dbgwrite( #endif ); +#ifdef DEBUG_MODE_JBM +int16_t dbgwritewav( + const int16_t input_frame, + float **ppPcm, + float pcm_array[MAX_OUTPUT_CHANNELS][L_FRAME48k], + const int16_t no_channel, + const int32_t fs, +#ifdef DEBUG_MODE_INFO_TWEAK + const char *filename /* i : Output file name */ +#else + const char *const filename +#endif +); +#endif + void dbgwrite_mat_repeat( float *buffer, /* i : write buffer */ int16_t nRow, /* i : matrix size (rows) */ diff --git a/lib_debug/sba_debug.c b/lib_debug/sba_debug.c index 040cadf887..3f9138e47f 100644 --- a/lib_debug/sba_debug.c +++ b/lib_debug/sba_debug.c @@ -51,11 +51,11 @@ #define MAX_IN_FILE_LEN ( 1000 ) #define MAX_PLUG_IN_FILE_LEN ( MAX_IN_FILE_LEN ) #define MAX_DEBUG_TAG_LEN ( 50 ) -#define NUM_DEBUG_FILES ( 4 ) +#define NUM_DEBUG_FILES ( 5 ) #define MAX_TAG_LEN ( 200 ) WAVEFILEOUT *spar_foa_enc_wav[3]; -WAVEFILEOUT *spar_foa_dec_wav[4]; +WAVEFILEOUT *spar_foa_dec_wav[NUM_DEBUG_FILES]; float max_diff = 0; int32_t dbg_frm_num; int32_t dbg_band; @@ -202,6 +202,7 @@ void ivas_spar_dump_signal_wav( { for ( i = 0; i < no_channel; i++, k++ ) { +#if 0 if ( ppPcm ) { tmp_value = roundf( ppPcm[i][j] * PCM16_TO_FLT_FAC ); @@ -210,6 +211,16 @@ void ivas_spar_dump_signal_wav( { tmp_value = roundf( pcm_array[i][j] * PCM16_TO_FLT_FAC ); } +#else + if ( ppPcm ) + { + tmp_value = roundf(ppPcm[i][j]); + } + else + { + tmp_value = roundf(pcm_array[i][j]); + } +#endif if ( tmp_value > MAX16B_FLT ) { largest_value = (float) fabs( tmp_value ) > largest_value ? (float) fabs( tmp_value ) : largest_value; @@ -272,6 +283,12 @@ void ivas_close_sba_decoder_debug_files( CloseWav( spar_foa_dec_wav[3] ); } + if ( spar_foa_dec_wav[4] != NULL ) + { + UpdateWave( fs, n_ch, 16, spar_foa_dec_wav[4] ); + CloseWav( spar_foa_dec_wav[4] ); + } + return; } @@ -315,7 +332,7 @@ void ivas_open_sba_decoder_debug_files( const int16_t n_ch, const int16_t n_transport ) { - int8_t fb_wav_dump_path[4][MAX_PLUG_IN_FILE_LEN] = { "", "", "", "" }; + int8_t fb_wav_dump_path[NUM_DEBUG_FILES][MAX_PLUG_IN_FILE_LEN] = { "", "", "", "", "" }; cstrcat( (char *) fb_wav_dump_path[0], sizeof( fb_wav_dump_path[0] ), "dec_out.wav" ); spar_foa_dec_wav[0] = CreateWav( (const char *) fb_wav_dump_path[0], fs, n_ch, 32 /* const uint32_t writeWaveExt */ ); @@ -329,6 +346,9 @@ void ivas_open_sba_decoder_debug_files( cstrcat( (char *) fb_wav_dump_path[3], sizeof( fb_wav_dump_path[3] ), "cldfbSynthesis.wav" ); spar_foa_dec_wav[3] = CreateWav( (const char *) fb_wav_dump_path[3], fs, n_transport, 16 /* const uint32_t writeWaveExt */ ); + cstrcat( (char *) fb_wav_dump_path[4], sizeof( fb_wav_dump_path[4] ), "cldfbAnalysis.wav" ); + spar_foa_dec_wav[4] = CreateWav( (const char *) fb_wav_dump_path[4], fs, n_transport, 16 /* const uint32_t writeWaveExt */ ); + return; } diff --git a/lib_debug/sba_debug.h b/lib_debug/sba_debug.h index cd4fd58c11..a314d1568c 100644 --- a/lib_debug/sba_debug.h +++ b/lib_debug/sba_debug.h @@ -41,9 +41,10 @@ #include "ivas_cnst.h" #include "tinywaveout_c.h" + #ifdef DEBUG_SBA_AUDIO_DUMP extern WAVEFILEOUT *spar_foa_enc_wav[3]; -extern WAVEFILEOUT *spar_foa_dec_wav[4]; +extern WAVEFILEOUT *spar_foa_dec_wav[5]; #endif #ifdef DEBUG_AGC diff --git a/lib_dec/fd_cng_dec.c b/lib_dec/fd_cng_dec.c index c75bc60f8e..bcf374382d 100644 --- a/lib_dec/fd_cng_dec.c +++ b/lib_dec/fd_cng_dec.c @@ -1780,6 +1780,163 @@ void generate_stereo_masking_noise( return; } +#ifdef JBM_TSM_ON_TCS +/*------------------------------------------------------------------- + * generate_masking_noise_hf_cldfb() + * + * Generate additional comfort noise (kind of noise filling) + *-------------------------------------------------------------------*/ + +void generate_masking_noise_lb_dirac( + HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ + float *tdBuffer, /* i/o: time-domain signal, if NULL no LB-CNA */ + const int16_t nCldfbTs, /* i : number of CLDFB slots that will be rendered */ + const int16_t cna_flag /* i : CNA flag for LB and HB */ +) +{ + int16_t i; + float *cngNoiseLevel = hFdCngCom->cngNoiseLevel; + float *fftBuffer = hFdCngCom->fftBuffer; + float *ptr_r; + float *ptr_i; + float *ptr_level; + int16_t *seed = &( hFdCngCom->seed ); + float scale; + int16_t n_samples_out, n_samples_start, n_samples_out_loop; + + push_wmops( "fd_cng_dirac" ); + + /* Init */ + scale = 0.f; + n_samples_out = hFdCngCom->frameSize / DEFAULT_JBM_CLDFB_TIMESLOTS * nCldfbTs; + n_samples_start = 0; + + + /*LB CLDFB - CNA from STFT*/ +#ifdef DEBUG_MODE_DIRAC + { + int16_t tmp_s; + tmp_s = (int16_t) ( 32768.f * 0.5f * hFdCngCom->likelihood_noisy_speech * cna_flag + 0.5f ); + dbgwrite( &tmp_s, sizeof( int16_t ), 1, hFdCngCom->frameSize / 16, "./res/ivas_dirac_likelihood_noisy.pcm" ); + } +#endif + if ( cna_flag ) + { + /* skip noise generating if level is very low, to avoid problems with possibly running into denormals */ + if ( hFdCngCom->likelihood_noisy_speech > DELTA_MASKING_NOISE ) + { + /* Compute additional CN level */ + for ( i = 0; i < 15; i++ ) + { + if ( ( hFdCngCom->CngBandwidth == scaleTable_cn_dirac[i].bwmode ) && + ( hFdCngCom->CngBitrate >= scaleTable_cn_dirac[i].bitrateFrom ) && + ( hFdCngCom->CngBitrate < scaleTable_cn_dirac[i].bitrateTo ) ) + { + break; + } + } + + scale = (float) pow( 10.f, -scaleTable_cn_dirac[i].scale / 10.f ) - 1.f; + scale *= hFdCngCom->likelihood_noisy_speech; + } + } + + /* LB CLDFB - CNA from STFT: CNA applied only in channel 0*/ + if ( cna_flag && tdBuffer != NULL ) + { + while ( n_samples_out > 0 ) + { + n_samples_out_loop = min( hFdCngCom->frameSize, n_samples_out ); + if ( scale != 0 ) + { + /*Generate LF comfort noise only at first slot, for the whole frame*/ + ptr_level = cngNoiseLevel; + + /* Generate Gaussian random noise in real and imaginary parts of the FFT bins + Amplitudes are adjusted to the estimated noise level cngNoiseLevel in each bin */ + if ( hFdCngCom->startBand == 0 ) + { + rand_gauss( &fftBuffer[0], seed ); + ptr_r = fftBuffer + 2; + fftBuffer[0] *= (float) sqrt( scale * *ptr_level ); /* DC component in FFT */ + ptr_level++; + } + else + { + fftBuffer[0] = 0.f; + set_f( fftBuffer + 2, 0.0f, 2 * ( hFdCngCom->startBand - 1 ) ); + ptr_r = fftBuffer + 2 * hFdCngCom->startBand; + } + ptr_i = ptr_r + 1; + + for ( ; ptr_level < cngNoiseLevel + hFdCngCom->stopFFTbin - hFdCngCom->startBand; ptr_level++ ) + { + /* Real part in FFT bins */ + rand_gauss( ptr_r, seed ); + ( *ptr_r ) *= (float) sqrt( ( scale * *ptr_level ) * 0.5f ); + ptr_r += 2; + /* Imaginary part in FFT bins */ + rand_gauss( ptr_i, seed ); + ( *ptr_i ) *= (float) sqrt( ( scale * *ptr_level ) * 0.5f ); + ptr_i += 2; + } + + /* Remaining FFT bins are set to zero */ + set_f( fftBuffer + 2 * hFdCngCom->stopFFTbin, 0.0f, hFdCngCom->fftlen - 2 * hFdCngCom->stopFFTbin ); + /* Nyquist frequency is discarded */ + fftBuffer[1] = 0.f; + + /* Perform STFT synthesis */ + SynthesisSTFT_dirac( fftBuffer, tdBuffer + n_samples_start, hFdCngCom->olapBufferSynth2, hFdCngCom->olapWinSyn, n_samples_out_loop, hFdCngCom ); + +#ifdef DEBUG_MODE_DIRAC + { + int16_t tmp[1000]; + + for ( i = 0; i < hFdCngCom->frameSize; i++ ) + { + tmp[i] = (int16_t) ( tdBuffer[i] + 0.5f ); + } + dbgwrite( tmp, sizeof( int16_t ), hFdCngCom->frameSize, 1, "./res/ivas_dirac_cna_fft.pcm" ); + } +#endif + } + + else + { + /* very low level case - update random seeds */ + generate_masking_noise_update_seed( hFdCngCom ); + + set_f( fftBuffer, 0.f, hFdCngCom->fftlen ); + + /* Perform STFT synthesis */ + SynthesisSTFT_dirac( fftBuffer, tdBuffer + n_samples_start, hFdCngCom->olapBufferSynth2, hFdCngCom->olapWinSyn, n_samples_out_loop, hFdCngCom ); + +#ifdef DEBUG_MODE_DIRAC + { + int16_t tmp[1000]; + + for ( i = 0; i < hFdCngCom->frameSize; i++ ) + { + tmp[i] = (int16_t) ( tdBuffer[i] + 0.5f ); + } + dbgwrite( tmp, sizeof( int16_t ), hFdCngCom->frameSize, 1, "./res/ivas_dirac_cna_fft.pcm" ); + } +#endif + } + n_samples_out -= hFdCngCom->frameSize; + n_samples_start += hFdCngCom->frameSize; + + } + } + + pop_wmops(); + + return; +} + +#endif + /*------------------------------------------------------------------- * generate_masking_noise_hf_cldfb() @@ -1799,10 +1956,12 @@ void generate_masking_noise_dirac( ) { int16_t i; +#ifndef JBM_TSM_ON_TCS float *cngNoiseLevel = hFdCngCom->cngNoiseLevel; float *fftBuffer = hFdCngCom->fftBuffer; float *ptr_r; float *ptr_i; +#endif float *ptr_level; int16_t *seed = &( hFdCngCom->seed ); float scale; @@ -1849,12 +2008,12 @@ void generate_masking_noise_dirac( scale *= hFdCngCom->likelihood_noisy_speech; } } - /* LB CLDFB - CNA from STFT: CNA applied only in channel 0*/ if ( cna_flag && tdBuffer != NULL ) { if ( scale != 0 ) { +#ifndef JBM_TSM_ON_TCS /*Generate LF comfort noise only at first slot, for the whole frame*/ if ( slot_index == 0 ) { @@ -1909,12 +2068,13 @@ void generate_masking_noise_dirac( } #endif } - +#endif /* LF CLDFB*/ cldfbAnalysis_ts( &( tdBuffer[hFdCngCom->numCoreBands * slot_index] ), Cldfb_RealBuffer, Cldfb_ImagBuffer, hFdCngCom->numCoreBands, h_cldfb ); } else { +#ifndef JBM_TSM_ON_TCS if ( slot_index == 0 ) { /* very low level case - update random seeds */ @@ -1937,7 +2097,7 @@ void generate_masking_noise_dirac( } #endif } - +#endif /* LB ana CLDFB*/ cldfbAnalysis_ts( &( tdBuffer[hFdCngCom->numCoreBands * slot_index] ), Cldfb_RealBuffer, Cldfb_ImagBuffer, hFdCngCom->numCoreBands, h_cldfb ); } diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 2db5602519..7e023fcaa6 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -59,7 +59,10 @@ static void ivas_binRenderer_filterModule( float out_Conv_CLDFB_imag[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : imag part of Binaural signals */ float CLDFB_real[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : real part of LS signals */ float CLDFB_imag[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : imag part of LS signals */ - BINAURAL_RENDERER_HANDLE hBinRenderer /* i/o: fastconv binaural renderer handle */ +#ifdef JBM_TSM_ON_TCS + const int16_t numTimeSlots, /* i : number of time slots to process */ +#endif + BINAURAL_RENDERER_HANDLE hBinRenderer /* i/o: fastconv binaural renderer handle */ ) { int16_t bandIdx, k, chIdx, tapIdx; @@ -78,7 +81,11 @@ static void ivas_binRenderer_filterModule( filterTapsRightRealPtr = hBinRenderer->hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx]; filterTapsRightImagPtr = hBinRenderer->hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx]; +#ifdef JBM_TSM_ON_TCS + for ( k = 0; k < numTimeSlots; k++ ) +#else for ( k = 0; k < MAX_PARAM_SPATIAL_SUBFRAMES; k++ ) +#endif { float outRealLeft = 0.0f, outRealRight = 0.0f, outImagLeft = 0.0f, outImagRight = 0.0f; @@ -847,9 +854,14 @@ void ivas_binRenderer_close( *-------------------------------------------------------------------------*/ void ivas_binaural_add_LFE( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - int16_t output_frame, /* i : length of input frame */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + int16_t output_frame, /* i : length of input frame */ +#ifdef JBM_TSM_ON_TCS + float *input_f[], /* i : transport channels */ + float *output_f[] /* o : synthesized core-coder transport channels/DirAC output */ +#else float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */ +#endif ) { int16_t render_lfe, idx_lfe; @@ -876,10 +888,17 @@ void ivas_binaural_add_LFE( } for ( idx_lfe = 0; idx_lfe < st_ivas->hIntSetup.num_lfe; idx_lfe++ ) { +#ifdef JBM_TSM_ON_TCS + v_multc( input_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], gain, input_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], output_frame ); + /* copy LFE to left and right channels */ + v_add( output_f[0], input_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], output_f[0], output_frame ); + v_add( output_f[1], input_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], output_f[1], output_frame ); +#else v_multc( output_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], gain, output_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], output_frame ); /* copy LFE to left and right channels */ v_add( output_f[0], output_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], output_f[0], output_frame ); v_add( output_f[1], output_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], output_f[1], output_frame ); +#endif } } @@ -895,8 +914,12 @@ void ivas_binaural_add_LFE( *-------------------------------------------------------------------------*/ void ivas_binaural_cldfb( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ +#ifdef JBM_TSM_ON_TCS + float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ +#else float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */ +#endif ) { float Cldfb_RealBuffer[MAX_INTERN_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; @@ -939,8 +962,11 @@ void ivas_binaural_cldfb( } /* Implement binaural rendering */ +#ifdef JBM_TSM_ON_TCS + ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, JBM_CLDFB_SLOTS_IN_SUBFRAME, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); +#else ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); - +#endif /* Implement CLDFB synthesis */ for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { @@ -961,6 +987,99 @@ void ivas_binaural_cldfb( return; } +#ifdef JBM_TSM_ON_TCS +/*-------------------------------------------------------------------------* + * ivas_binaural_cldfb() + * + * Perform CLDFB analysis, fastconv binaural rendering and CLDFB synthesis + *-------------------------------------------------------------------------*/ + +void ivas_binaural_cldfb_sf( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t n_samples_to_render, + float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ +) +{ + float Cldfb_RealBuffer[MAX_INTERN_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer[MAX_INTERN_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + int16_t slot_idx, subframeIdx, index_slot, idx_in, idx_lfe, maxBand, ch; + int16_t slot_size, slots_to_render, first_sf, last_sf; + int16_t slot_index_start, slot_index_start_cldfb; + + /* Implement a 5 msec loops */ + maxBand = (int16_t) ( ( CLDFB_NO_CHANNELS_MAX * st_ivas->hDecoderConfig->output_Fs ) / 48000 ); + slot_size = st_ivas->hTcBuffer->nb_subframes; + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + slots_to_render = min( st_ivas->hTcBuffer->num_slots - st_ivas->hTcBuffer->slots_rendered, n_samples_to_render / slot_size ); + first_sf = st_ivas->hTcBuffer->subframes_rendered; + last_sf = first_sf; + slot_index_start = st_ivas->hTcBuffer->slots_rendered; + slot_index_start_cldfb = 0; + st_ivas->hTcBuffer->slots_rendered += slots_to_render; + while ( slots_to_render > 0 ) + { + slots_to_render -= st_ivas->hTcBuffer->subframe_nbslots[last_sf]; + last_sf++; + } + for ( subframeIdx = first_sf; subframeIdx < last_sf; subframeIdx++ ) + { + for ( slot_idx = 0; slot_idx < st_ivas->hTcBuffer->subframe_nbslots[subframeIdx]; slot_idx++ ) + { + index_slot = slot_index_start + slot_idx; + + /* Implement CLDFB analysis */ + idx_in = 0; + idx_lfe = 0; + + for ( ch = 0; ch < ( st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe ); ch++ ) + { + if ( ( st_ivas->hIntSetup.num_lfe > 0 ) && ( st_ivas->hIntSetup.index_lfe[idx_lfe] == ch ) ) + { + if ( idx_lfe < ( st_ivas->hIntSetup.num_lfe - 1 ) ) + { + idx_lfe++; + } + } + else + { + cldfbAnalysis_ts( &( st_ivas->hTcBuffer->tc[ch][maxBand * index_slot] ), + Cldfb_RealBuffer[idx_in][slot_idx], + Cldfb_ImagBuffer[idx_in][slot_idx], + maxBand, st_ivas->cldfbAnaDec[idx_in] ); + idx_in++; + } + } + } + + /* Implement binaural rendering */ +#ifdef JBM_TSM_ON_TCS + ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, st_ivas->hTcBuffer->subframe_nbslots[subframeIdx], Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); +#else + ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); +#endif + /* Implement CLDFB synthesis */ + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + float *RealBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; + float *ImagBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; + + for ( slot_idx = 0; slot_idx < st_ivas->hTcBuffer->subframe_nbslots[subframeIdx]; slot_idx++ ) + { + RealBuffer[slot_idx] = Cldfb_RealBuffer_Binaural[ch][slot_idx]; + ImagBuffer[slot_idx] = Cldfb_ImagBuffer_Binaural[ch][slot_idx]; + } + + cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][slot_index_start_cldfb * maxBand] ), maxBand * st_ivas->hTcBuffer->subframe_nbslots[subframeIdx], st_ivas->cldfbSynDec[ch] ); + } + slot_index_start += st_ivas->hTcBuffer->subframe_nbslots[subframeIdx]; + slot_index_start_cldfb += st_ivas->hTcBuffer->subframe_nbslots[subframeIdx]; + } + st_ivas->hTcBuffer->subframes_rendered = last_sf; + return; +} +#endif #endif @@ -971,8 +1090,11 @@ void ivas_binaural_cldfb( *-------------------------------------------------------------------------*/ void ivas_binRenderer( - BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: binaural renderer handle */ - HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i/o: head track handle */ + BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: binaural renderer handle */ + HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i/o: head track handle */ +#ifdef JBM_TSM_ON_TCS + const int16_t numTimeSlots, /* i : number of time slots to render*/ +#endif float Cldfb_RealBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ float Cldfb_ImagBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ @@ -980,7 +1102,9 @@ void ivas_binRenderer( ) { int16_t chIdx, k; +#ifndef JBM_TSM_ON_TCS int16_t numTimeSlots = MAX_PARAM_SPATIAL_SUBFRAMES; +#endif push_wmops( "fastconv_binaural_rendering" ); @@ -1004,27 +1128,47 @@ void ivas_binRenderer( if ( hHeadTrackData->shd_rot_max_order == -1 ) { QuatToRotMat( hHeadTrackData->Quaternions[hHeadTrackData->num_quaternions++], hHeadTrackData->Rmat ); +#ifdef JBM_TSM_ON_TCS + rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hHeadTrackData->Rmat, hBinRenderer->hInputSetup->nchan_out_woLFE, numTimeSlots, 3 ); +#else rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hHeadTrackData->Rmat, hBinRenderer->hInputSetup->nchan_out_woLFE, 3 ); +#endif } else if ( hHeadTrackData->shd_rot_max_order > 0 ) { +#ifdef JBM_TSM_ON_TCS + rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hHeadTrackData->Rmat, hBinRenderer->hInputSetup->nchan_out_woLFE, numTimeSlots, hHeadTrackData->shd_rot_max_order ); +#else rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hHeadTrackData->Rmat, hBinRenderer->hInputSetup->nchan_out_woLFE, hHeadTrackData->shd_rot_max_order ); +#endif } } else { /* Rotation in SD (CICPx) */ +#ifdef JBM_TSM_ON_TCS + rotateFrame_sd_cldfb( hHeadTrackData, RealBuffer, ImagBuffer, hBinRenderer->hInputSetup, hBinRenderer->hEFAPdata, numTimeSlots, hBinRenderer->conv_band ); +#else rotateFrame_sd_cldfb( hHeadTrackData, RealBuffer, ImagBuffer, hBinRenderer->hInputSetup, hBinRenderer->hEFAPdata, hBinRenderer->conv_band ); +#endif } } /* HOA decoding to CICP19 if needed*/ if ( hBinRenderer->hInputSetup->is_loudspeaker_setup == 0 && hBinRenderer->nInChannels != 16 ) { +#ifdef JBM_TSM_ON_TCS + ivas_sba2mc_cldfb( *( hBinRenderer->hInputSetup ), RealBuffer, ImagBuffer, hBinRenderer->nInChannels, hBinRenderer->conv_band, numTimeSlots, hBinRenderer->hoa_dec_mtx ); +#else ivas_sba2mc_cldfb( *( hBinRenderer->hInputSetup ), RealBuffer, ImagBuffer, hBinRenderer->nInChannels, hBinRenderer->conv_band, hBinRenderer->hoa_dec_mtx ); +#endif } +#ifdef JBM_TSM_ON_TCS + ivas_binRenderer_filterModule( Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, RealBuffer, ImagBuffer, numTimeSlots, hBinRenderer ); +#else ivas_binRenderer_filterModule( Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, RealBuffer, ImagBuffer, hBinRenderer ); +#endif /* Obtain the binaural dmx and compute the reverb */ if ( hBinRenderer->hReverb != NULL ) diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index 88e631908c..98490a2ace 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -65,6 +65,9 @@ ivas_error ivas_dec( int32_t output_Fs, ivas_total_brate; AUDIO_CONFIG output_config; ivas_error error; +#ifdef JBM_TSM_ON_TCS + float *p_output[MAX_OUTPUT_CHANNELS]; +#endif error = IVAS_ERR_OK; @@ -80,7 +83,11 @@ ivas_error ivas_dec( if ( st_ivas->bfi == 0 ) { +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_dec_setup( st_ivas, NULL, NULL ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_dec_setup( st_ivas ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -97,6 +104,13 @@ ivas_error ivas_dec( output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC ); +#ifdef JBM_TSM_ON_TCS + for ( n = 0; n < MAX_OUTPUT_CHANNELS; n++ ) + { + p_output[n] = &output[n][0]; + } +#endif + /*----------------------------------------------------------------* * Decoding + Rendering *----------------------------------------------------------------*/ @@ -134,7 +148,11 @@ ivas_error ivas_dec( /* Rendering */ if ( st_ivas->renderer_type == RENDERER_MC ) { +#ifdef JBM_TSM_ON_TCS + ivas_ls_setup_conversion( st_ivas, output_frame, p_output, p_output ); +#else ivas_ls_setup_conversion( st_ivas, output_frame, output ); +#endif } } else if ( st_ivas->ivas_format == ISM_FORMAT ) @@ -194,7 +212,11 @@ ivas_error ivas_dec( if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) { /* Convert CICP19 -> Ambisonics */ +#ifdef JBM_TSM_ON_TCS + ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f ); +#else ivas_mc2sba( st_ivas->hIntSetup, output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f ); +#endif } } } @@ -208,7 +230,11 @@ ivas_error ivas_dec( else if ( st_ivas->renderer_type == RENDERER_TD_PANNING || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */ +#ifdef JBM_TSM_ON_TCS + ivas_ism_render( st_ivas, p_output, output_frame ); +#else ivas_ism_render( st_ivas, output, output_frame ); +#endif } #ifdef REND_DEBUGGING_REVISION #ifdef DEBUGGING @@ -221,29 +247,57 @@ ivas_error ivas_dec( #endif { /* Convert to Ambisonics; used also for ISM->HOA3->binaural rendering */ +#ifdef JBM_TSM_ON_TCS + ivas_ism2sba( p_output, st_ivas->hIsmRendererData, st_ivas->hIsmMetaData, st_ivas->nchan_ism, output_frame, st_ivas->hIntSetup.ambisonics_order ); +#else ivas_ism2sba( output, st_ivas->hIsmRendererData, st_ivas->hIsmMetaData, st_ivas->nchan_ism, output_frame, st_ivas->hIntSetup.ambisonics_order ); +#endif } /* Binaural rendering */ if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) { +#ifdef JBM_TSM_ON_TCS + if ( ( ivas_td_binaural_renderer( st_ivas, p_output, output_frame ) ) != IVAS_ERR_OK ) +#else if ( ( ivas_td_binaural_renderer( st_ivas, output, output_frame ) ) != IVAS_ERR_OK ) +#endif { return error; } } else if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { - if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, NULL, NULL, NULL, NULL, output, output_Fs ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, + AUDIO_CONFIG_7_1_4, + AUDIO_CONFIG_BINAURAL_ROOM, + NULL, + NULL, + NULL, + NULL, +#ifdef JBM_TSM_ON_TCS + p_output, +#else + output, +#endif + output_Fs ) ) != IVAS_ERR_OK ) { return error; } +#ifdef JBM_TSM_ON_TCS + ivas_binaural_add_LFE( st_ivas, output_frame, p_output, p_output ); +#else ivas_binaural_add_LFE( st_ivas, output_frame, output ); +#endif } #ifdef DEBUGGING else if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) { +#ifdef JBM_TSM_ON_TCS + ivas_binaural_cldfb( st_ivas, p_output ); +#else ivas_binaural_cldfb( st_ivas, output ); +#endif } #endif } @@ -314,6 +368,9 @@ ivas_error ivas_dec( #ifdef DEBUG_SBA_AUDIO_DUMP /* Dump audio signal after core-decoding */ ivas_spar_dump_signal_wav( output_frame, NULL, output, st_ivas->nchan_transport, spar_foa_dec_wav[0], "core-decoding" ); +#endif +#ifdef DEBUG_MODE_JBM + dbgwritewav( output_frame, NULL, output, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, "res/sba_tc.wav" ); #endif /* TCs remapping */ nchan_remapped = st_ivas->nchan_transport; @@ -355,6 +412,12 @@ ivas_error ivas_dec( { ivas_sba_mix_matrix_determiner( st_ivas->hSpar, output, st_ivas->bfi, nchan_remapped, output_frame ); } +#ifdef JBM_TSM_ON_TCS + else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) + { + ivas_spar_dec_agc_pca( st_ivas, output, output_frame ); + } +#endif } if ( st_ivas->ivas_format == MASA_FORMAT ) @@ -380,14 +443,22 @@ ivas_error ivas_dec( { if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC ) { +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_sba_linear_renderer( p_output, output_frame, nchan_remapped, output_config, st_ivas->hOutSetup, st_ivas->hoa_dec_mtx ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_sba_linear_renderer( output, output_frame, nchan_remapped, output_config, st_ivas->hOutSetup, st_ivas->hoa_dec_mtx ) ) != IVAS_ERR_OK ) +#endif { return error; } } else if ( st_ivas->renderer_type == RENDERER_DIRAC ) { +#ifdef JBM_TSM_ON_TCS + ivas_dirac_dec( st_ivas, output, nchan_remapped ); +#else ivas_dirac_dec( st_ivas, output, nchan_remapped, NULL, NULL, -1 ); +#endif } } else if ( !st_ivas->sba_dirac_stereo_flag && nchan_out != 1 ) @@ -425,35 +496,70 @@ ivas_error ivas_dec( if ( st_ivas->transport_config != st_ivas->intern_config && ( st_ivas->intern_config == AUDIO_CONFIG_FOA || st_ivas->intern_config == AUDIO_CONFIG_HOA2 || st_ivas->intern_config == AUDIO_CONFIG_HOA3 ) ) { +#ifdef JBM_TSM_ON_TCS + ivas_mc2sba( st_ivas->hTransSetup, p_output, p_output, output_frame, st_ivas->hIntSetup.ambisonics_order, GAIN_LFE ); +#else ivas_mc2sba( st_ivas->hTransSetup, output, output_frame, st_ivas->hIntSetup.ambisonics_order, GAIN_LFE ); +#endif } /* Rendering */ if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { - if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hHeadTrackData, &st_ivas->hIntSetup, st_ivas->hEFAPdata, output, output_Fs ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, + st_ivas->intern_config, + st_ivas->hOutSetup.output_config, + st_ivas->hDecoderConfig, + st_ivas->hHeadTrackData, + &st_ivas->hIntSetup, + st_ivas->hEFAPdata, +#ifdef JBM_TSM_ON_TCS + p_output, +#else + output, +#endif + output_Fs ) ) != IVAS_ERR_OK ) { return error; } +#ifdef JBM_TSM_ON_TCS + ivas_binaural_add_LFE( st_ivas, output_frame, p_output, p_output ); +#else ivas_binaural_add_LFE( st_ivas, output_frame, output ); +#endif } else if ( st_ivas->renderer_type == RENDERER_MC ) { +#ifdef JBM_TSM_ON_TCS + ivas_ls_setup_conversion( st_ivas, output_frame, p_output, p_output ); +#else ivas_ls_setup_conversion( st_ivas, output_frame, output ); +#endif } else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) { +#ifdef JBM_TSM_ON_TCS + ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f ); +#else ivas_mc2sba( st_ivas->hIntSetup, output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f ); +#endif } else if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) { +#ifdef JBM_TSM_ON_TCS + if ( ( ivas_td_binaural_renderer( st_ivas, p_output, output_frame ) ) != IVAS_ERR_OK ) + { + return error; + } + ivas_binaural_add_LFE( st_ivas, output_frame, p_output, p_output ); +#else if ( ( ivas_td_binaural_renderer( st_ivas, output, output_frame ) ) != IVAS_ERR_OK ) { return error; } - ivas_binaural_add_LFE( st_ivas, output_frame, output ); +#endif } } else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) @@ -485,11 +591,19 @@ ivas_error ivas_dec( /* Rendering */ if ( output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) { +#ifdef JBM_TSM_ON_TCS + ivas_ls_setup_conversion( st_ivas, output_frame, p_output, p_output ); +#else ivas_ls_setup_conversion( st_ivas, output_frame, output ); +#endif } else { +#ifdef JBM_TSM_ON_TCS + ivas_param_mc_dec( st_ivas, p_output ); +#else ivas_param_mc_dec( st_ivas, output ); +#endif } } else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) @@ -571,11 +685,19 @@ ivas_error ivas_dec( } else if ( st_ivas->renderer_type == RENDERER_DIRAC || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) /* rendering to CICPxx and Ambisonics */ { +#ifdef JBM_TSM_ON_TCS + ivas_dirac_dec( st_ivas, output, st_ivas->nchan_transport ); +#else ivas_dirac_dec( st_ivas, output, st_ivas->nchan_transport, NULL, NULL, -1 ); +#endif if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) { +#ifdef JBM_TSM_ON_TCS + ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f ); +#else ivas_mc2sba( st_ivas->hIntSetup, output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f ); +#endif } else if ( st_ivas->intern_config == AUDIO_CONFIG_5_1 && ( output_config == AUDIO_CONFIG_5_1_2 || output_config == AUDIO_CONFIG_5_1_4 || output_config == AUDIO_CONFIG_7_1 ) ) { @@ -598,14 +720,21 @@ ivas_error ivas_dec( * - compensation for saturation * - float to integer conversion *----------------------------------------------------------------*/ +#ifdef JBM_TSM_ON_TCS + ivas_limiter_dec( st_ivas->hLimiter, p_output, nchan_out, output_frame, st_ivas->BER_detect ); +#ifdef DEBUGGING + st_ivas->noClipping += +#endif + ivas_syn_output( p_output, output_frame, nchan_out, data ); +#else ivas_limiter_dec( st_ivas->hLimiter, output, nchan_out, output_frame, st_ivas->BER_detect ); #ifdef DEBUGGING st_ivas->noClipping += #endif ivas_syn_output( output, output_frame, nchan_out, data ); - +#endif /*----------------------------------------------------------------* * Common updates *----------------------------------------------------------------*/ diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index dfeb946a02..9bb43b39c9 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -139,6 +139,7 @@ ivas_error ivas_dirac_dec_config( output_Fs = st_ivas->hDecoderConfig->output_Fs; ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + if ( flag_config == DIRAC_RECONFIGURE ) { hDirAC = st_ivas->hDirAC; @@ -159,7 +160,10 @@ ivas_error ivas_dirac_dec_config( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC Config\n" ) ); } nchan_transport_old = 0; - +#ifdef JBM_TSM_ON_TCS + hDirAC->hParamIsm = NULL; + hDirAC->hParamIsmRendering = NULL; +#endif st_ivas->hDirAC = hDirAC; } @@ -169,6 +173,10 @@ ivas_error ivas_dirac_dec_config( num_outputs_diff_old = 0; num_protos_diff_old = 0; +#ifdef JBM_DIRAC_DEBUG_BE + hDirAC->voip_active = st_ivas->hDecoderConfig->voip_active; +#endif + nchan_transport_orig = st_ivas->nchan_transport; if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && !( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) { @@ -250,9 +258,18 @@ ivas_error ivas_dirac_dec_config( if ( flag_config == DIRAC_OPEN ) { hDirAC->slot_size = (int16_t) ( ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX ); +#ifdef JBM_TSM_ON_TCS + set_s( hDirAC->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); + set_s( hDirAC->subframe_nbslots, JBM_CLDFB_SLOTS_IN_SUBFRAME, DEFAULT_JBM_SUBFRAMES_5MS ); + hDirAC->nb_subframes = DEFAULT_JBM_SUBFRAMES_5MS; + hDirAC->subframes_rendered = 0; + hDirAC->slots_rendered = 0; + hDirAC->num_slots = DEFAULT_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME; +#else hDirAC->subframe_nbslots = (int16_t) ( CLDFB_NO_COL_MAX * 5.f / 20.f + 0.5f ); hDirAC->nb_subframes = CLDFB_NO_COL_MAX / hDirAC->subframe_nbslots; assert( hDirAC->nb_subframes <= MAX_PARAM_SPATIAL_SUBFRAMES ); +#endif } /* band config needed only for SPAR with FOA output */ @@ -824,6 +841,16 @@ ivas_error ivas_dirac_dec_config( if ( st_ivas->mc_mode == MC_MODE_MCMASA ) { hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES; +#ifdef JBM_TSM_ON_TCS + { + int16_t map_idx; + set_s( hDirAC->render_to_md_slot_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); + for ( map_idx = 0; map_idx < DEFAULT_JBM_CLDFB_TIMESLOTS; map_idx++ ) + { + hDirAC->render_to_md_slot_map[map_idx] = map_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME; + } + } +#endif } else if ( st_ivas->ivas_format == MASA_FORMAT ) { @@ -851,6 +878,16 @@ ivas_error ivas_dirac_dec_config( hDirAC->dirac_read_idx = 0; hDirAC->dirac_estimator_idx = 0; } +#ifdef JBM_TSM_ON_TCS + { + int16_t map_idx; + set_s( hDirAC->render_to_md_slot_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); + for ( map_idx = 0; map_idx < DEFAULT_JBM_CLDFB_TIMESLOTS; map_idx++ ) + { + hDirAC->render_to_md_slot_map[map_idx] = hDirAC->dirac_read_idx + map_idx * num_slots_in_subfr / JBM_CLDFB_SLOTS_IN_SUBFRAME; + } + } +#endif } if ( ( hDirAC->azimuth = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) @@ -985,7 +1022,31 @@ ivas_error ivas_dirac_dec_config( st_ivas->hDirAC = hDirAC; } - return error; +#ifdef JBM_TSM_ON_TCS + /* allocate transport channels*/ + if ( flag_config == DIRAC_OPEN ) + { + if ( st_ivas->hDecoderConfig->voip_active == 1 && st_ivas->hTcBuffer == NULL && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && st_ivas->renderer_type != RENDERER_STEREO_PARAMETRIC ) + { + if ( st_ivas->sba_mode == SBA_MODE_DIRAC ) + { + int16_t nchan_to_allocate; + nchan_to_allocate = nchan_transport; + if ( st_ivas->nchan_transport == 1 && ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) || ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) ) + { + nchan_to_allocate++; /* we need a channel for the CNG in this case*/ + } + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, nchan_transport, nchan_to_allocate, nchan_to_allocate, hDirAC->slot_size ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + } + +#endif /* JBM_TMS_ON_TCS*/ + + return error; } @@ -1510,7 +1571,6 @@ void ivas_dirac_dec_read_BS( { int16_t i, j, b, dir, orig_dirac_bands; int16_t next_bit_pos_orig; - *nb_bits = 0; if ( !st->bfi && ivas_total_brate > IVAS_SID_5k2 ) { @@ -1793,6 +1853,7 @@ void ivas_qmetadata_to_dirac( int16_t tmp_write_idx_band; num_slots_in_subfr = hDirAC->hConfig->dec_param_estim ? CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES : 1; + /* ungroup */ seed_ptr = &hDirAC->dithering_seed; nblocks = q_direction->cfg.nblocks; @@ -1837,12 +1898,50 @@ void ivas_qmetadata_to_dirac( { band_start = band_grouping[band]; band_end = band_grouping[band + 1]; +#ifdef JBM_TSM_ON_TCS + tmp_write_idx_param_band = hDirAC->dirac_bs_md_write_idx; + for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) +#else for ( block = 0; block < hDirAC->nb_subframes; block++ ) +#endif { +#ifdef JBM_TSM_ON_TCS + ts_start = hDirAC->block_grouping[block]; + ts_end = hDirAC->block_grouping[block + 1]; +#endif for ( b = band_start; b < band_end; b++ ) { +#ifdef JBM_TSM_ON_TCS + tmp_write_idx_band = tmp_write_idx_param_band; +#endif hDirAC->spreadCoherence[block][b] = 0.0f; hDirAC->surroundingCoherence[block][b] = 0.0f; +#ifdef JBM_TSM_ON_TCS + if ( hDirAC->hConfig->dec_param_estim == FALSE ) + { + hDirAC->elevation[tmp_write_idx_band][b] = 0; + hDirAC->azimuth[tmp_write_idx_band][b] = 0; + hDirAC->diffuseness_vector[tmp_write_idx_band][b] = 0.f; + + hDirAC->spreadCoherence[tmp_write_idx_band][b] = 0.0f; + hDirAC->surroundingCoherence[tmp_write_idx_band][b] = 0.0f; + hDirAC->energy_ratio1[tmp_write_idx_band][b] = 0; + tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length; + } + else + { + for ( ts = ts_start; ts < ts_end; ts++ ) + { + hDirAC->elevation[tmp_write_idx_band][b] = 0; + hDirAC->azimuth[tmp_write_idx_band][b] = 0; + hDirAC->diffuseness_vector[tmp_write_idx_band][b] = 0.f; + hDirAC->spreadCoherence[tmp_write_idx_band][b] = 0.0f; + hDirAC->surroundingCoherence[tmp_write_idx_band][b] = 0.0f; + hDirAC->energy_ratio1[tmp_write_idx_band][b] = 0; + tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length; + } + } +#endif } } } @@ -1869,7 +1968,11 @@ void ivas_qmetadata_to_dirac( #endif diff_idx = q_direction->band_data[qBand_idx].energy_ratio_index[0]; +#ifdef JBM_TSM_ON_TCS + for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) +#else for ( block = 0; block < hDirAC->nb_subframes; block++ ) +#endif { int16_t block_qmetadata; @@ -1958,7 +2061,11 @@ void ivas_qmetadata_to_dirac( for ( b = band_grouping[band]; b < hDirAC->num_freq_bands; b++ ) { tmp_write_idx_band = hDirAC->dirac_bs_md_write_idx; +#ifdef JBM_TSM_ON_TCS + for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) +#else for ( block = 0; block < hDirAC->nb_subframes; block++ ) +#endif { ts_start = hDirAC->block_grouping[block]; ts_end = hDirAC->block_grouping[block + 1]; @@ -1972,6 +2079,11 @@ void ivas_qmetadata_to_dirac( hDirAC->elevation[tmp_write_idx_band][b] = 0; hDirAC->azimuth[tmp_write_idx_band][b] = 0; hDirAC->diffuseness_vector[tmp_write_idx_band][b] = 0.f; +#ifdef JBM_TSM_ON_TCS + hDirAC->spreadCoherence[tmp_write_idx_band][b] = 0.0f; + hDirAC->surroundingCoherence[tmp_write_idx_band][b] = 0.0f; + hDirAC->energy_ratio1[tmp_write_idx_band][b] = 0; +#endif tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length; } else @@ -1981,6 +2093,11 @@ void ivas_qmetadata_to_dirac( hDirAC->elevation[tmp_write_idx_band][b] = 0; hDirAC->azimuth[tmp_write_idx_band][b] = 0; hDirAC->diffuseness_vector[tmp_write_idx_band][b] = 0.f; +#ifdef JBM_TSM_ON_TCS + hDirAC->spreadCoherence[tmp_write_idx_band][b] = 0.0f; + hDirAC->surroundingCoherence[tmp_write_idx_band][b] = 0.0f; + hDirAC->energy_ratio1[tmp_write_idx_band][b] = 0; +#endif tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length; } } @@ -2002,29 +2119,209 @@ void ivas_qmetadata_to_dirac( } +#ifdef JBM_TSM_ON_TCS +void ivas_dirac_dec_set_md_map( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + int16_t nCldfbTs ) +{ + int16_t num_slots_in_subfr; + DIRAC_DEC_HANDLE hDirAC; + + hDirAC = st_ivas->hDirAC; +#ifdef DEBUGGING + assert( hDirAC ); +#endif + + /* adapt subframes */ + hDirAC->num_slots = nCldfbTs; + hDirAC->slots_rendered = 0; + if ( hDirAC->hParamIsm != NULL || hDirAC->hConfig->dec_param_estim == 0 ) + { + num_slots_in_subfr = CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; + } + else + { + num_slots_in_subfr = 1; + } + hDirAC->subframes_rendered = 0; + + ivas_jbm_dec_get_adapted_subframes( nCldfbTs, hDirAC->subframe_nbslots, &hDirAC->nb_subframes ); + + /* set mapping according to dirac_read_idx */ + + set_s( hDirAC->render_to_md_slot_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); + + ivas_jbm_dec_get_md_map( DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbTs, num_slots_in_subfr, hDirAC->dirac_read_idx, hDirAC->dirac_md_buffer_length, hDirAC->render_to_md_slot_map ); + + + return; +} /*------------------------------------------------------------------------- * ivas_dirac_dec() * * DirAC decoding process *------------------------------------------------------------------------*/ +void ivas_dirac_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ + const int16_t nchan_transport /* i : number of transport channels */ +) +{ + int16_t subframe_idx; + float *output_f_local[MAX_OUTPUT_CHANNELS]; + float cng_td_buffer[L_FRAME16k]; + int16_t nchan_out, n, n_samples_sf; + nchan_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; + + n_samples_sf = JBM_CLDFB_SLOTS_IN_SUBFRAME * st_ivas->hDirAC->slot_size; + for ( n = 0; n < nchan_out; n++ ) + { + output_f_local[n] = &output_f[n][0]; + } + for ( n = 0; n < nchan_transport; n++ ) + { + st_ivas->hTcBuffer->tc[n] = output_f[n]; + } + if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->sba_mode != SBA_MODE_SPAR ) + { + Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; + st_ivas->hTcBuffer->tc[nchan_transport] = &cng_td_buffer[0]; + generate_masking_noise_lb_dirac( st->hFdCngDec->hFdCngCom, st_ivas->hTcBuffer->tc[1], DEFAULT_JBM_CLDFB_TIMESLOTS, st->cna_dirac_flag && st->flag_cna ); + } + ivas_dirac_dec_set_md_map( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS ); + for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) + { + ivas_dirac_dec_render_sf( st_ivas, output_f_local, nchan_transport, NULL, NULL ); + for ( n = 0; n < nchan_out; n++ ) + { + output_f_local[n] += n_samples_sf; + } + } + if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 ) + { + st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_CLDFB_TIMESLOTS ) % st_ivas->hDirAC->dirac_md_buffer_length; + } + else + { + st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % st_ivas->hDirAC->dirac_md_buffer_length; + } + for ( n = 0; n < nchan_transport; n++ ) + { + st_ivas->hTcBuffer->tc[n] = NULL; + } + if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->sba_mode != SBA_MODE_SPAR ) + { + st_ivas->hTcBuffer->tc[nchan_transport] = NULL; + } + + return; +} + +void ivas_dirac_dec_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t nchan_transport, /* i : number of transport channels */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ +) +{ + int16_t slots_to_render, first_sf, last_sf, subframe_idx; + uint16_t slot_size, n_samples_sf, ch, nchan_intern; + DIRAC_DEC_HANDLE hDirAC; + float *output_f_local[MAX_OUTPUT_CHANNELS]; + + hDirAC = st_ivas->hDirAC; + + nchan_intern = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; +#ifdef DEBUGGING + assert( hDirAC ); +#endif + for ( ch = 0; ch < nchan_intern; ch++ ) + { + output_f_local[ch] = output_f[ch]; + } + slot_size = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + slots_to_render = min( hDirAC->num_slots - hDirAC->slots_rendered, nSamplesAsked / slot_size ); + *nSamplesRendered = slots_to_render * slot_size; + first_sf = hDirAC->subframes_rendered; + last_sf = first_sf; + while ( slots_to_render > 0 ) + { + slots_to_render -= hDirAC->subframe_nbslots[last_sf]; + last_sf++; + } +#ifdef DEBUGGING + assert( slots_to_render == 0 ); +#endif + for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) + { + ivas_dirac_dec_render_sf( st_ivas, output_f_local, nchan_transport, NULL, NULL ); + n_samples_sf = hDirAC->subframe_nbslots[subframe_idx] * st_ivas->hDirAC->slot_size; + for ( ch = 0; ch < nchan_intern; ch++ ) + { + output_f_local[ch] += n_samples_sf; + } + } + if ( hDirAC->slots_rendered == hDirAC->num_slots ) + { + if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 ) + { + st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_CLDFB_TIMESLOTS ) % st_ivas->hDirAC->dirac_md_buffer_length; + } + else + { + st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % st_ivas->hDirAC->dirac_md_buffer_length; + } + } + *nSamplesAvailable = ( hDirAC->num_slots - hDirAC->slots_rendered ) * slot_size; + return; +} +#endif + +/*------------------------------------------------------------------------- + * ivas_dirac_dec() + * + * DirAC decoding process + *------------------------------------------------------------------------*/ +#ifndef JBM_TSM_ON_TCS void ivas_dirac_dec( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ +#else +void ivas_dirac_dec_render_sf( +#endif + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ +#ifdef JBM_TSM_ON_TCS + float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ +#else + float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ +#endif const int16_t nchan_transport, /* i : number of transport channels */ float *pppQMfFrame_ts_re[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX], - float *pppQMfFrame_ts_im[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX], - const int16_t i_sf ) + float *pppQMfFrame_ts_im[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX] +#ifndef JBM_TSM_ON_TCS + , + const int16_t i_sf +#endif +) { int16_t i, ch, idx_in, idx_lfe; DIRAC_DEC_HANDLE hDirAC; +#if defined( JBM_DIRAC_DEBUG_BE ) || !defined( JBM_TSM_ON_TCS ) float dirEne; float surCohEner; float surCohRatio[CLDFB_NO_CHANNELS_MAX]; +#endif int16_t subframe_idx; +#ifndef JBM_TSM_ON_TCS int16_t sf1, sf2; +#endif int16_t slot_idx, index_slot; float *p_Rmat; +#ifdef JBM_TSM_ON_TCS + int16_t slot_idx_start, slot_idx_start_cldfb_synth; +#endif /*CLDFB: last output channels reserved to LFT for CICPx*/ float Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; @@ -2033,12 +2330,23 @@ void ivas_dirac_dec( float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; int16_t index, num_freq_bands; +#ifdef JBM_TSM_ON_TCS + /* local copies of azi, ele, diffuseness */ + int16_t azimuth[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + int16_t elevation[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float diffuseness_vector[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; +#endif + DIRAC_DEC_STACK_MEM DirAC_mem; float *reference_power, *reference_power_smooth; float *onset_filter, *onset_filter_subframe, *p_onset_filter = NULL; uint16_t coherence_flag; +#ifndef JBM_TSM_ON_TCS push_wmops( "ivas_dirac_dec" ); +#else + push_wmops( "ivas_dirac_dec_render" ); +#endif /* Initialize aux buffers */ hDirAC = st_ivas->hDirAC; @@ -2078,7 +2386,7 @@ void ivas_dirac_dec( #endif /* Subframe loop */ - +#ifndef JBM_TSM_ON_TCS if ( i_sf == -1 ) { sf1 = 0; @@ -2089,86 +2397,164 @@ void ivas_dirac_dec( sf1 = i_sf; sf2 = i_sf + 1; } +#endif +#ifdef JBM_TSM_ON_TCS + slot_idx_start = hDirAC->slots_rendered; + slot_idx_start_cldfb_synth = 0; +#endif +#ifdef JBM_TSM_ON_TCS + subframe_idx = hDirAC->subframes_rendered; +#else for ( subframe_idx = sf1; subframe_idx < sf2; subframe_idx++ ) { - if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) - { - set_zero( reference_power_smooth, hDirAC->num_freq_bands ); - } - else +#endif +#ifdef JBM_TSM_ON_TCS + + /* Another workaround for self test BE */ + if ( st_ivas->hHeadTrackData && st_ivas->hDecoderConfig->voip_active == 0 ) + { + QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[st_ivas->hHeadTrackData->num_quaternions++], st_ivas->hHeadTrackData->Rmat ); + + p_Rmat = &st_ivas->hHeadTrackData->Rmat[0][0]; + + if ( st_ivas->hHeadTrackData->shd_rot_max_order == 0 ) { - set_zero( onset_filter_subframe, hDirAC->num_freq_bands ); + num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) + { + index_slot = slot_idx_start + slot_idx; + rotateAziEle_DirAC( hDirAC->azimuth[index_slot], hDirAC->elevation[index_slot], num_freq_bands, hDirAC->num_freq_bands, p_Rmat ); + } } + } + else + { + p_Rmat = 0; + } + /* copy parameters into local buffers*/ + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) + { + mvs2s( hDirAC->azimuth[hDirAC->render_to_md_slot_map[slot_idx + slot_idx_start]], azimuth[slot_idx], hDirAC->num_freq_bands ); + mvs2s( hDirAC->elevation[hDirAC->render_to_md_slot_map[slot_idx + slot_idx_start]], elevation[slot_idx], hDirAC->num_freq_bands ); + mvr2r( hDirAC->diffuseness_vector[hDirAC->render_to_md_slot_map[slot_idx + slot_idx_start]], diffuseness_vector[slot_idx], hDirAC->num_freq_bands ); + } +#endif + if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) + { + set_zero( reference_power_smooth, hDirAC->num_freq_bands ); + } + else + { + set_zero( onset_filter_subframe, hDirAC->num_freq_bands ); + } + +#ifdef JBM_TSM_ON_TCS + if ( st_ivas->hHeadTrackData && st_ivas->hDecoderConfig->voip_active == 1 ) +#else if ( st_ivas->hHeadTrackData ) - { - QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[st_ivas->hHeadTrackData->num_quaternions++], st_ivas->hHeadTrackData->Rmat ); +#endif + { + QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[st_ivas->hHeadTrackData->num_quaternions++], st_ivas->hHeadTrackData->Rmat ); - p_Rmat = &st_ivas->hHeadTrackData->Rmat[0][0]; + p_Rmat = &st_ivas->hHeadTrackData->Rmat[0][0]; - if ( st_ivas->hHeadTrackData->shd_rot_max_order == 0 ) - { - num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; + if ( st_ivas->hHeadTrackData->shd_rot_max_order == 0 ) + { + num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; +#ifdef JBM_TSM_ON_TCS + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) +#else for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ ) - { +#endif + { +#ifdef JBM_TSM_ON_TCS + rotateAziEle_DirAC( azimuth[slot_idx], elevation[slot_idx], num_freq_bands, hDirAC->num_freq_bands, p_Rmat ); + +#else + /* note, this seems wrong since it does not take the dirac read ptr into account */ index_slot = subframe_idx * hDirAC->subframe_nbslots + slot_idx; /* Todo: This access to azimuth & elevation may use wrong indices as access should probably be based on hDirAC->dirac_read_idx */ rotateAziEle_DirAC( hDirAC->azimuth[index_slot], hDirAC->elevation[index_slot], num_freq_bands, hDirAC->num_freq_bands, p_Rmat ); - } +#endif } } + } +#ifdef JBM_TSM_ON_TCS + else if ( !st_ivas->hHeadTrackData ) +#else else - { - p_Rmat = 0; - } +#endif + { + p_Rmat = 0; + } - if ( hDirAC->hConfig->dec_param_estim == FALSE ) +#if defined( JBM_DIRAC_DEBUG_BE ) || !defined( JBM_TSM_ON_TCS ) +#ifdef JBM_DIRAC_DEBUG_BE + if ( st_ivas->hDecoderConfig->voip_active == 0 && hDirAC->hConfig->dec_param_estim == FALSE ) +#else + if ( hDirAC->hConfig->dec_param_estim == FALSE ) +#endif + { +#ifdef JBM_TSM_ON_TCS + int16_t md_idx = hDirAC->render_to_md_slot_map[slot_idx_start]; +#endif + /* compute response */ + if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) { - /* compute response */ - if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) - { - ivas_dirac_dec_compute_power_factors( hDirAC->num_freq_bands, - hDirAC->diffuseness_vector[hDirAC->dirac_read_idx], - hDirAC->h_output_synthesis_psd_params.max_band_decorr, - hDirAC->h_output_synthesis_psd_state.direct_power_factor, - hDirAC->h_output_synthesis_psd_state.diffuse_power_factor ); + ivas_dirac_dec_compute_power_factors( hDirAC->num_freq_bands, +#ifdef JBM_TSM_ON_TCS + diffuseness_vector[0], +#else + hDirAC->diffuseness_vector[hDirAC->dirac_read_idx], +#endif + hDirAC->h_output_synthesis_psd_params.max_band_decorr, + hDirAC->h_output_synthesis_psd_state.direct_power_factor, + hDirAC->h_output_synthesis_psd_state.diffuse_power_factor ); - if ( coherence_flag ) + if ( coherence_flag ) + { + for ( i = 0; i < hDirAC->num_freq_bands; i++ ) { - for ( i = 0; i < hDirAC->num_freq_bands; i++ ) - { - dirEne = hDirAC->h_output_synthesis_psd_state.direct_power_factor[i]; - surCohEner = hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] * hDirAC->surroundingCoherence[hDirAC->dirac_read_idx][i]; - hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] -= surCohEner; - hDirAC->h_output_synthesis_psd_state.direct_power_factor[i] += surCohEner; + dirEne = hDirAC->h_output_synthesis_psd_state.direct_power_factor[i]; +#ifdef JBM_TSM_ON_TCS + surCohEner = hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] * hDirAC->surroundingCoherence[md_idx][i]; +#else + surCohEner = hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] * hDirAC->surroundingCoherence[hDirAC->dirac_read_idx][i]; +#endif + hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] -= surCohEner; + hDirAC->h_output_synthesis_psd_state.direct_power_factor[i] += surCohEner; - surCohRatio[i] = surCohEner / ( 1e-12f + dirEne + surCohEner ); - } - } - else - { - set_zero( surCohRatio, hDirAC->num_freq_bands ); + surCohRatio[i] = surCohEner / ( 1e-12f + dirEne + surCohEner ); } } else { - ivas_dirac_dec_compute_gain_factors( hDirAC->num_freq_bands, - hDirAC->diffuseness_vector[hDirAC->dirac_read_idx], - hDirAC->h_output_synthesis_psd_params.max_band_decorr, - hDirAC->h_output_synthesis_psd_state.direct_power_factor, - hDirAC->h_output_synthesis_psd_state.diffuse_power_factor ); + set_zero( surCohRatio, hDirAC->num_freq_bands ); + } + } + else + { + ivas_dirac_dec_compute_gain_factors( hDirAC->num_freq_bands, +#ifdef JBM_TSM_ON_TCS + diffuseness_vector[0], +#else + hDirAC->diffuseness_vector[hDirAC->dirac_read_idx], +#endif + hDirAC->h_output_synthesis_psd_params.max_band_decorr, + hDirAC->h_output_synthesis_psd_state.direct_power_factor, + hDirAC->h_output_synthesis_psd_state.diffuse_power_factor ); - if ( coherence_flag ) - { - for ( i = 0; i < hDirAC->num_freq_bands; i++ ) - { - surCohRatio[i] = hDirAC->surroundingCoherence[hDirAC->dirac_read_idx][i]; - } - } - else + if ( coherence_flag ) + { + for ( i = 0; i < hDirAC->num_freq_bands; i++ ) { - set_zero( surCohRatio, hDirAC->num_freq_bands ); +#ifdef JBM_TSM_ON_TCS + surCohRatio[i] = hDirAC->surroundingCoherence[md_idx][i]; +#else + surCohRatio[i] = hDirAC->surroundingCoherence[hDirAC->dirac_read_idx][i]; +#endif } } @@ -2192,521 +2578,736 @@ void ivas_dirac_dec( } } - for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ ) + if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 1 ) + { + ivas_dirac_dec_compute_directional_responses( hDirAC, + st_ivas->hVBAPdata, + st_ivas->hMasa, +#ifdef JBM_TSM_ON_TCS + azimuth[0], + elevation[0], + md_idx, +#else + subframe_idx, + subframe_idx, +#endif + surCohRatio, + st_ivas->hHeadTrackData->shd_rot_max_order, + p_Rmat ); + } + else { + ivas_dirac_dec_compute_directional_responses( hDirAC, + st_ivas->hVBAPdata, + st_ivas->hMasa, +#ifdef JBM_TSM_ON_TCS + azimuth[0], + elevation[0], + md_idx, +#else + subframe_idx, + subframe_idx, +#endif + surCohRatio, + 0, + 0 ); + } + } +#endif + +#ifdef JBM_TSM_ON_TCS + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) +#else + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ ) +#endif + { +#ifdef JBM_TSM_ON_TCS + index_slot = slot_idx_start + slot_idx; +#else index_slot = subframe_idx * hDirAC->subframe_nbslots + slot_idx; +#endif - if ( st_ivas->sba_mode == SBA_MODE_SPAR ) + if ( st_ivas->sba_mode == SBA_MODE_SPAR ) + { + for ( ch = 0; ch < nchan_transport; ch++ ) { - for ( ch = 0; ch < nchan_transport; ch++ ) - { - mvr2r( pppQMfFrame_ts_re[ch][slot_idx], Cldfb_RealBuffer[ch][0], hDirAC->num_freq_bands ); - mvr2r( pppQMfFrame_ts_im[ch][slot_idx], Cldfb_ImagBuffer[ch][0], hDirAC->num_freq_bands ); - } + mvr2r( pppQMfFrame_ts_re[ch][slot_idx], Cldfb_RealBuffer[ch][0], hDirAC->num_freq_bands ); + mvr2r( pppQMfFrame_ts_im[ch][slot_idx], Cldfb_ImagBuffer[ch][0], hDirAC->num_freq_bands ); } - else + } + else + { + /* CLDFB Analysis*/ + for ( ch = 0; ch < nchan_transport; ch++ ) { - /* CLDFB Analysis*/ - for ( ch = 0; ch < nchan_transport; ch++ ) - { +#ifdef JBM_TSM_ON_TCS + cldfbAnalysis_ts( &( st_ivas->hTcBuffer->tc[sba_map_tc[ch]][hDirAC->num_freq_bands * index_slot] ), + Cldfb_RealBuffer[ch][0], + Cldfb_ImagBuffer[ch][0], + hDirAC->num_freq_bands, + st_ivas->cldfbAnaDec[ch] ); +#else cldfbAnalysis_ts( &( output_f[sba_map_tc[ch]][hDirAC->num_freq_bands * index_slot] ), Cldfb_RealBuffer[ch][0], Cldfb_ImagBuffer[ch][0], hDirAC->num_freq_bands, st_ivas->cldfbAnaDec[ch] ); - } +#endif } + } - /* CNG in DirAC, extra CLDFB ana for CNA*/ - if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->sba_mode != SBA_MODE_SPAR ) - { - Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; + /* CNG in DirAC, extra CLDFB ana for CNA*/ + if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->sba_mode != SBA_MODE_SPAR ) + { + Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; - generate_masking_noise_dirac( st->hFdCngDec->hFdCngCom, - st_ivas->cldfbAnaDec[1], + generate_masking_noise_dirac( st->hFdCngDec->hFdCngCom, + st_ivas->cldfbAnaDec[1], +#ifdef JBM_TSM_ON_TCS + st_ivas->hTcBuffer->tc[1], +#else &( output_f[1][L_FRAME48k - L_FRAME16k] ), - Cldfb_RealBuffer[1][0], - Cldfb_ImagBuffer[1][0], - index_slot, - st->cna_dirac_flag && st->flag_cna, - ( st->core_brate == FRAME_NO_DATA || st->core_brate == SID_2k40 ) && st->cng_type == FD_CNG && st->cng_sba_flag ); - } - - /* LFE synthesis */ - if ( st_ivas->mc_mode == MC_MODE_MCMASA && !hDirAC->hOutSetup.separateChannelEnabled && !( hDirAC->hOutSetup.output_config == AUDIO_CONFIG_LS_CUSTOM && hDirAC->hOutSetup.num_lfe == 0 ) ) - { - ivas_lfe_synth_with_cldfb( st_ivas->hMasa->hMasaLfeSynth, - Cldfb_RealBuffer, Cldfb_ImagBuffer, - Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS - 1], Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS - 1], - slot_idx, +#endif + Cldfb_RealBuffer[1][0], + Cldfb_ImagBuffer[1][0], + index_slot, + st->cna_dirac_flag && st->flag_cna, + ( st->core_brate == FRAME_NO_DATA || st->core_brate == SID_2k40 ) && st->cng_type == FD_CNG && st->cng_sba_flag ); + } + + /* LFE synthesis */ + if ( st_ivas->mc_mode == MC_MODE_MCMASA && !hDirAC->hOutSetup.separateChannelEnabled && !( hDirAC->hOutSetup.output_config == AUDIO_CONFIG_LS_CUSTOM && hDirAC->hOutSetup.num_lfe == 0 ) ) + { + ivas_lfe_synth_with_cldfb( st_ivas->hMasa->hMasaLfeSynth, + Cldfb_RealBuffer, Cldfb_ImagBuffer, + Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS - 1], Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS - 1], + slot_idx, +#ifdef JBM_TSM_ON_TCS + hDirAC->render_to_md_slot_map[index_slot], +#else subframe_idx, - nchan_transport ); - } +#endif + nchan_transport ); + } - /*-----------------------------------------------------------------* - * protoype signal computation - *-----------------------------------------------------------------*/ + /*-----------------------------------------------------------------* + * protoype signal computation + *-----------------------------------------------------------------*/ - if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 0 ) { - if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 0 ) - { - protoSignalComputation_shd( Cldfb_RealBuffer, Cldfb_ImagBuffer, - hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f, - hDirAC->h_output_synthesis_psd_state.proto_diffuse_buffer_f, - reference_power, slot_idx, nchan_transport, - hDirAC->num_outputs_diff, - hDirAC->num_freq_bands, - p_Rmat ); - } - else - { - protoSignalComputation_shd( Cldfb_RealBuffer, Cldfb_ImagBuffer, - hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f, - hDirAC->h_output_synthesis_psd_state.proto_diffuse_buffer_f, - reference_power, slot_idx, nchan_transport, - hDirAC->num_outputs_diff, - hDirAC->num_freq_bands, - 0 ); - } + protoSignalComputation_shd( Cldfb_RealBuffer, Cldfb_ImagBuffer, + hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f, + hDirAC->h_output_synthesis_psd_state.proto_diffuse_buffer_f, + reference_power, slot_idx, nchan_transport, + hDirAC->num_outputs_diff, + hDirAC->num_freq_bands, + p_Rmat ); } - else if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_MONO ) + else { - protoSignalComputation2( Cldfb_RealBuffer, Cldfb_ImagBuffer, hDirAC->proto_frame_f, - hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f, - reference_power, hDirAC->h_output_synthesis_psd_state.proto_power_smooth, - 0, slot_idx, hDirAC->num_freq_bands, hDirAC->masa_stereo_type_detect ); + protoSignalComputation_shd( Cldfb_RealBuffer, Cldfb_ImagBuffer, + hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f, + hDirAC->h_output_synthesis_psd_state.proto_diffuse_buffer_f, + reference_power, slot_idx, nchan_transport, + hDirAC->num_outputs_diff, + hDirAC->num_freq_bands, + 0 ); } - else + } + else if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_MONO ) + { + protoSignalComputation2( Cldfb_RealBuffer, Cldfb_ImagBuffer, hDirAC->proto_frame_f, + hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f, + reference_power, hDirAC->h_output_synthesis_psd_state.proto_power_smooth, + 0, slot_idx, hDirAC->num_freq_bands, hDirAC->masa_stereo_type_detect ); + } + else + { + switch ( nchan_transport ) { - switch ( nchan_transport ) - { - case 8: - case 6: - case 4: - protoSignalComputation4( Cldfb_RealBuffer, Cldfb_ImagBuffer, - hDirAC->proto_frame_f, - hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f, - reference_power, - hDirAC->h_output_synthesis_psd_state.proto_power_smooth, - slot_idx, hDirAC->num_outputs_diff, - hDirAC->num_freq_bands, - hDirAC->hoa_decoder, - nchan_transport ); - break; - case 2: - protoSignalComputation2( Cldfb_RealBuffer, Cldfb_ImagBuffer, - hDirAC->proto_frame_f, - hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f, - reference_power, - hDirAC->h_output_synthesis_psd_state.proto_power_smooth, - hDirAC->hOutSetup.is_loudspeaker_setup, - slot_idx, - hDirAC->num_freq_bands, - hDirAC->masa_stereo_type_detect ); - break; - case 1: - protoSignalComputation1( Cldfb_RealBuffer, Cldfb_ImagBuffer, - hDirAC->proto_frame_f, - hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f, - reference_power, - hDirAC->h_output_synthesis_psd_state.proto_power_smooth, - slot_idx, - hDirAC->num_protos_diff, - hDirAC->num_freq_bands ); - break; - default: - return; - } + case 8: + case 6: + case 4: + protoSignalComputation4( Cldfb_RealBuffer, Cldfb_ImagBuffer, + hDirAC->proto_frame_f, + hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f, + reference_power, + hDirAC->h_output_synthesis_psd_state.proto_power_smooth, + slot_idx, hDirAC->num_outputs_diff, + hDirAC->num_freq_bands, + hDirAC->hoa_decoder, + nchan_transport ); + break; + case 2: + protoSignalComputation2( Cldfb_RealBuffer, Cldfb_ImagBuffer, + hDirAC->proto_frame_f, + hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f, + reference_power, + hDirAC->h_output_synthesis_psd_state.proto_power_smooth, + hDirAC->hOutSetup.is_loudspeaker_setup, + slot_idx, + hDirAC->num_freq_bands, + hDirAC->masa_stereo_type_detect ); + break; + case 1: + protoSignalComputation1( Cldfb_RealBuffer, Cldfb_ImagBuffer, + hDirAC->proto_frame_f, + hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f, + reference_power, + hDirAC->h_output_synthesis_psd_state.proto_power_smooth, + slot_idx, + hDirAC->num_protos_diff, + hDirAC->num_freq_bands ); + break; + default: + return; } + } - /*-----------------------------------------------------------------* - * Compute DirAC parameters at decoder side - *-----------------------------------------------------------------*/ - - if ( hDirAC->hConfig->dec_param_estim == TRUE ) - { - hDirAC->index_buffer_intensity = ( hDirAC->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ) + 1; /* averaging_length = 32 */ + /*-----------------------------------------------------------------* + * Compute DirAC parameters at decoder side + *-----------------------------------------------------------------*/ - index = hDirAC->index_buffer_intensity; + if ( hDirAC->hConfig->dec_param_estim == TRUE ) + { + hDirAC->index_buffer_intensity = ( hDirAC->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ) + 1; /* averaging_length = 32 */ - num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; + index = hDirAC->index_buffer_intensity; - computeIntensityVector_dec( Cldfb_RealBuffer, - Cldfb_ImagBuffer, - num_freq_bands, - hDirAC->buffer_intensity_real[0][index - 1], - hDirAC->buffer_intensity_real[1][index - 1], - hDirAC->buffer_intensity_real[2][index - 1] ); + num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; - computeDirectionAngles( hDirAC->buffer_intensity_real[0][index - 1], - hDirAC->buffer_intensity_real[1][index - 1], - hDirAC->buffer_intensity_real[2][index - 1], + computeIntensityVector_dec( Cldfb_RealBuffer, + Cldfb_ImagBuffer, num_freq_bands, + hDirAC->buffer_intensity_real[0][index - 1], + hDirAC->buffer_intensity_real[1][index - 1], + hDirAC->buffer_intensity_real[2][index - 1] ); + computeDirectionAngles( hDirAC->buffer_intensity_real[0][index - 1], + hDirAC->buffer_intensity_real[1][index - 1], + hDirAC->buffer_intensity_real[2][index - 1], + num_freq_bands, +#ifdef JBM_TSM_ON_TCS + azimuth[slot_idx], + elevation[slot_idx] +#else hDirAC->azimuth[hDirAC->dirac_estimator_idx], - hDirAC->elevation[hDirAC->dirac_estimator_idx] ); + hDirAC->elevation[hDirAC->dirac_estimator_idx] +#endif + ); - mvr2r( reference_power, &( hDirAC->buffer_energy[( index - 1 ) * num_freq_bands] ), num_freq_bands ); + mvr2r( reference_power, &( hDirAC->buffer_energy[( index - 1 ) * num_freq_bands] ), num_freq_bands ); - computeDiffuseness( hDirAC->buffer_intensity_real, - hDirAC->buffer_energy, - num_freq_bands, - hDirAC->diffuseness_vector[hDirAC->dirac_estimator_idx] ); + computeDiffuseness( hDirAC->buffer_intensity_real, + hDirAC->buffer_energy, + num_freq_bands, +#ifdef JBM_TSM_ON_TCS + diffuseness_vector[slot_idx] +#else + hDirAC->diffuseness_vector[hDirAC->dirac_estimator_idx] +#endif + ); - hDirAC->dirac_estimator_idx = ( hDirAC->dirac_estimator_idx + 1 ) % hDirAC->dirac_md_buffer_length; - } +#ifndef JBM_TSM_ON_TCS + hDirAC->dirac_estimator_idx = ( hDirAC->dirac_estimator_idx + 1 ) % hDirAC->dirac_md_buffer_length; +#endif + } #ifdef DEBUG_MODE_DIRAC - { - static FILE *fp_direction_vector = NULL, *fp_diffuseness = NULL, *fp_referencePower = NULL; + { + static FILE *fp_direction_vector = NULL, *fp_diffuseness = NULL, *fp_referencePower = NULL; - if ( fp_direction_vector == NULL ) - fp_direction_vector = fopen( "./res/dbg_direction_vector_C_dec.bin", "wb" ); - if ( fp_diffuseness == NULL ) - fp_diffuseness = fopen( "./res/dbg_diffuseness_C_dec.bin", "wb" ); - if ( fp_referencePower == NULL ) - fp_referencePower = fopen( "./res/dbg_reference_power_C_dec.bin", "wb" ); + if ( fp_direction_vector == NULL ) + fp_direction_vector = fopen( "./res/dbg_direction_vector_C_dec.bin", "wb" ); + if ( fp_diffuseness == NULL ) + fp_diffuseness = fopen( "./res/dbg_diffuseness_C_dec.bin", "wb" ); + if ( fp_referencePower == NULL ) + fp_referencePower = fopen( "./res/dbg_reference_power_C_dec.bin", "wb" ); - for ( i = 0; i < hDirAC->num_freq_bands; i++ ) - { - float radius_length; - float dv[3]; + for ( i = 0; i < hDirAC->num_freq_bands; i++ ) + { + float radius_length; + float dv[3]; - if ( hDirAC->hConfig->dec_param_estim == FALSE ) - { - radius_length = cos( hDirAC->elevation[subframe_idx][i] * PI_OVER_180 ); - dv[0] = radius_length * cos( hDirAC->azimuth[subframe_idx][i] * PI_OVER_180 ); - dv[1] = radius_length * sin( hDirAC->azimuth[subframe_idx][i] * PI_OVER_180 ); - dv[2] = sin( hDirAC->elevation[subframe_idx][i] * PI_OVER_180 ); - - fwrite( dv, sizeof( float ), 3, fp_direction_vector ); - fwrite( &( hDirAC->diffuseness_vector[0][i] ), sizeof( float ), 1, fp_diffuseness ); - if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) - { - reference_power[i] = Cldfb_RealBuffer[0][0][i] * Cldfb_RealBuffer[0][0][i] + Cldfb_ImagBuffer[0][0][i] * Cldfb_ImagBuffer[0][0][i]; - } - fwrite( &( reference_power[i] ), sizeof( float ), 1, fp_referencePower ); - } - else + if ( hDirAC->hConfig->dec_param_estim == FALSE ) + { + radius_length = cos( hDirAC->elevation[subframe_idx][i] * PI_OVER_180 ); + dv[0] = radius_length * cos( hDirAC->azimuth[subframe_idx][i] * PI_OVER_180 ); + dv[1] = radius_length * sin( hDirAC->azimuth[subframe_idx][i] * PI_OVER_180 ); + dv[2] = sin( hDirAC->elevation[subframe_idx][i] * PI_OVER_180 ); + + fwrite( dv, sizeof( float ), 3, fp_direction_vector ); + fwrite( &( hDirAC->diffuseness_vector[0][i] ), sizeof( float ), 1, fp_diffuseness ); + if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { - radius_length = cos( hDirAC->elevation[index_slot][i] * PI_OVER_180 ); - dv[0] = radius_length * cos( hDirAC->azimuth[index_slot][i] * PI_OVER_180 ); - dv[1] = radius_length * sin( hDirAC->azimuth[index_slot][i] * PI_OVER_180 ); - dv[2] = sin( hDirAC->elevation[index_slot][i] * PI_OVER_180 ); - - fwrite( dv, sizeof( float ), 3, fp_direction_vector ); - fwrite( &( hDirAC->diffuseness_vector[index_slot][i] ), sizeof( float ), 1, fp_diffuseness ); - fwrite( &( reference_power[i] ), sizeof( float ), 1, fp_referencePower ); + reference_power[i] = Cldfb_RealBuffer[0][0][i] * Cldfb_RealBuffer[0][0][i] + Cldfb_ImagBuffer[0][0][i] * Cldfb_ImagBuffer[0][0][i]; } + fwrite( &( reference_power[i] ), sizeof( float ), 1, fp_referencePower ); + } + else + { + radius_length = cos( hDirAC->elevation[index_slot][i] * PI_OVER_180 ); + dv[0] = radius_length * cos( hDirAC->azimuth[index_slot][i] * PI_OVER_180 ); + dv[1] = radius_length * sin( hDirAC->azimuth[index_slot][i] * PI_OVER_180 ); + dv[2] = sin( hDirAC->elevation[index_slot][i] * PI_OVER_180 ); + + fwrite( dv, sizeof( float ), 3, fp_direction_vector ); + fwrite( &( hDirAC->diffuseness_vector[index_slot][i] ), sizeof( float ), 1, fp_diffuseness ); + fwrite( &( reference_power[i] ), sizeof( float ), 1, fp_referencePower ); } } + } #endif - /*-----------------------------------------------------------------* - * frequency domain decorrelation - *-----------------------------------------------------------------*/ + /*-----------------------------------------------------------------* + * frequency domain decorrelation + *-----------------------------------------------------------------*/ - if ( hDirAC->proto_signal_decorr_on == 1 ) + if ( hDirAC->proto_signal_decorr_on == 1 ) + { + /* decorrelate prototype frame */ + if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { - /* decorrelate prototype frame */ - if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) - { - ivas_dirac_dec_decorr_process( hDirAC->num_freq_bands, - hDirAC->num_outputs_diff, - hDirAC->num_protos_diff, - hDirAC->synthesisConf, - nchan_transport, - hDirAC->h_output_synthesis_psd_state.proto_diffuse_buffer_f + slot_idx * 2 * hDirAC->num_freq_bands * hDirAC->num_outputs_diff, - hDirAC->num_protos_diff, - hDirAC->proto_index_diff, - hDirAC->h_output_synthesis_psd_state.proto_diffuse_buffer_f + slot_idx * 2 * hDirAC->num_freq_bands * hDirAC->num_outputs_diff + 2 * hDirAC->num_freq_bands * min( 4, nchan_transport ), - onset_filter, - hDirAC->h_freq_domain_decorr_ap_params, - hDirAC->h_freq_domain_decorr_ap_state ); - - v_multc( onset_filter, 0.25f, onset_filter, hDirAC->num_freq_bands ); - v_add( onset_filter, onset_filter_subframe, onset_filter_subframe, hDirAC->num_freq_bands ); - p_onset_filter = onset_filter_subframe; - } - else - { - ivas_dirac_dec_decorr_process( hDirAC->num_freq_bands, - hDirAC->num_outputs_diff, - hDirAC->num_protos_diff, - hDirAC->synthesisConf, - nchan_transport, - hDirAC->proto_frame_f, - hDirAC->num_protos_diff, - hDirAC->proto_index_diff, - DirAC_mem.frame_dec_f, - onset_filter, - hDirAC->h_freq_domain_decorr_ap_params, - hDirAC->h_freq_domain_decorr_ap_state ); - - hDirAC->proto_frame_dec_f = DirAC_mem.frame_dec_f; - p_onset_filter = onset_filter; - } + ivas_dirac_dec_decorr_process( hDirAC->num_freq_bands, + hDirAC->num_outputs_diff, + hDirAC->num_protos_diff, + hDirAC->synthesisConf, + nchan_transport, + hDirAC->h_output_synthesis_psd_state.proto_diffuse_buffer_f + slot_idx * 2 * hDirAC->num_freq_bands * hDirAC->num_outputs_diff, + hDirAC->num_protos_diff, + hDirAC->proto_index_diff, + hDirAC->h_output_synthesis_psd_state.proto_diffuse_buffer_f + slot_idx * 2 * hDirAC->num_freq_bands * hDirAC->num_outputs_diff + 2 * hDirAC->num_freq_bands * min( 4, nchan_transport ), + onset_filter, + hDirAC->h_freq_domain_decorr_ap_params, + hDirAC->h_freq_domain_decorr_ap_state ); + + v_multc( onset_filter, 0.25f, onset_filter, hDirAC->num_freq_bands ); + v_add( onset_filter, onset_filter_subframe, onset_filter_subframe, hDirAC->num_freq_bands ); + p_onset_filter = onset_filter_subframe; } else { - if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) - { - set_f( onset_filter_subframe, 1.f, hDirAC->num_freq_bands ); - p_onset_filter = onset_filter_subframe; - } - else - { - /* no frequency domain decorrelation: use prototype frame */ - hDirAC->proto_frame_dec_f = hDirAC->proto_frame_f; - p_onset_filter = NULL; - } + ivas_dirac_dec_decorr_process( hDirAC->num_freq_bands, + hDirAC->num_outputs_diff, + hDirAC->num_protos_diff, + hDirAC->synthesisConf, + nchan_transport, + hDirAC->proto_frame_f, + hDirAC->num_protos_diff, + hDirAC->proto_index_diff, + DirAC_mem.frame_dec_f, + onset_filter, + hDirAC->h_freq_domain_decorr_ap_params, + hDirAC->h_freq_domain_decorr_ap_state ); + + hDirAC->proto_frame_dec_f = DirAC_mem.frame_dec_f; + p_onset_filter = onset_filter; } - - /*-----------------------------------------------------------------* - * output synthesis - *-----------------------------------------------------------------*/ - - if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_PSD_LS || hDirAC->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD ) + } + else + { + if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + set_f( onset_filter_subframe, 1.f, hDirAC->num_freq_bands ); + p_onset_filter = onset_filter_subframe; + } + else { - /*Compute diffuse prototypes*/ - ivas_dirac_dec_compute_diffuse_proto( hDirAC, slot_idx ); + /* no frequency domain decorrelation: use prototype frame */ + hDirAC->proto_frame_dec_f = hDirAC->proto_frame_f; + p_onset_filter = NULL; } + } - /*Compute PSDs*/ - if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 2 ) + /*-----------------------------------------------------------------* + * output synthesis + *-----------------------------------------------------------------*/ + + if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_PSD_LS || hDirAC->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD ) + { + /*Compute diffuse prototypes*/ + ivas_dirac_dec_compute_diffuse_proto( hDirAC, slot_idx ); + } + + /*Compute PSDs*/ +#ifndef JBM_TSM_ON_TCS + if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 2 ) + { + ivas_dirac_dec_output_synthesis_process_slot( reference_power, + p_onset_filter, + hDirAC, + p_Rmat, + st_ivas->hVBAPdata, + hDirAC->hOutSetup, + nchan_transport, + index_slot ); + } + else + { + ivas_dirac_dec_output_synthesis_process_slot( reference_power, + p_onset_filter, + hDirAC, + 0, + st_ivas->hVBAPdata, + hDirAC->hOutSetup, + nchan_transport, + index_slot ); + } +#else + if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order > 0 ) { ivas_dirac_dec_output_synthesis_process_slot( reference_power, p_onset_filter, + azimuth[slot_idx], + elevation[slot_idx], + diffuseness_vector[slot_idx], + coherence_flag, hDirAC, + st_ivas->hMasa, + st_ivas->hHeadTrackData->shd_rot_max_order, p_Rmat, st_ivas->hVBAPdata, hDirAC->hOutSetup, - nchan_transport ); + nchan_transport, + hDirAC->render_to_md_slot_map[index_slot] ); } else { ivas_dirac_dec_output_synthesis_process_slot( reference_power, p_onset_filter, + azimuth[slot_idx], + elevation[slot_idx], + diffuseness_vector[slot_idx], + coherence_flag, hDirAC, + st_ivas->hMasa, 0, + p_Rmat, st_ivas->hVBAPdata, hDirAC->hOutSetup, - nchan_transport ); - } - - if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) - { - v_add( reference_power, reference_power_smooth, reference_power_smooth, hDirAC->num_freq_bands ); + nchan_transport, + hDirAC->render_to_md_slot_map[index_slot] ); } +#endif - if ( hDirAC->hConfig->dec_param_estim ) - { - hDirAC->dirac_read_idx = ( hDirAC->dirac_read_idx + 1 ) % hDirAC->dirac_md_buffer_length; - } + if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) + { + v_add( reference_power, reference_power_smooth, reference_power_smooth, hDirAC->num_freq_bands ); } - if ( hDirAC->hConfig->dec_param_estim == 0 ) +#ifndef JBM_TSM_ON_TCS + if ( hDirAC->hConfig->dec_param_estim ) { hDirAC->dirac_read_idx = ( hDirAC->dirac_read_idx + 1 ) % hDirAC->dirac_md_buffer_length; } - - if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) +#endif + } +#ifndef JBM_TSM_ON_TCS + if ( hDirAC->hConfig->dec_param_estim == 0 ) + { + hDirAC->dirac_read_idx = ( hDirAC->dirac_read_idx + 1 ) % hDirAC->dirac_md_buffer_length; + } +#endif +#ifdef JBM_TSM_ON_TCS + ivas_dirac_dec_output_synthesis_get_interpolator( &hDirAC->h_output_synthesis_psd_params, hDirAC->subframe_nbslots[subframe_idx] ); +#endif + if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( Cldfb_RealBuffer, + Cldfb_ImagBuffer, + hDirAC, + nchan_transport, +#ifdef JBM_TSM_ON_TCS + hDirAC->subframe_nbslots[subframe_idx], +#endif + p_onset_filter ); + } + else + { + /* Determine encoding quality based additional smoothing factor */ + float qualityBasedSmFactor = 1.0f; +#ifdef JBM_TSM_ON_TCS + int16_t diff_md_idx; +#endif + if ( st_ivas->hMasa != NULL ) { - ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( Cldfb_RealBuffer, - Cldfb_ImagBuffer, - hDirAC, - nchan_transport, - p_onset_filter ); + qualityBasedSmFactor = st_ivas->hMasa->data.dir_decode_quality; + qualityBasedSmFactor *= qualityBasedSmFactor; } - else +#ifdef JBM_TSM_ON_TCS + /* Workaround for BE */ + if ( hDirAC->hConfig->dec_param_estim == 1 ) { - /* Determine encoding quality based additional smoothing factor */ - float qualityBasedSmFactor = 1.0f; - if ( st_ivas->hMasa != NULL ) + num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) { - qualityBasedSmFactor = st_ivas->hMasa->data.dir_decode_quality; - qualityBasedSmFactor *= qualityBasedSmFactor; + mvs2s( azimuth[slot_idx], hDirAC->azimuth[hDirAC->render_to_md_slot_map[slot_idx + slot_idx_start]], num_freq_bands ); + mvs2s( elevation[slot_idx], hDirAC->elevation[hDirAC->render_to_md_slot_map[slot_idx + slot_idx_start]], num_freq_bands ); + mvr2r( diffuseness_vector[slot_idx], hDirAC->diffuseness_vector[hDirAC->render_to_md_slot_map[slot_idx + slot_idx_start]], num_freq_bands ); } - - ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( Cldfb_RealBuffer, - Cldfb_ImagBuffer, - hDirAC, - reference_power_smooth, - qualityBasedSmFactor ); + } + /* get the correct md index for the direction smoothing, it is always the first slot of the next subframe*/ + if ( slot_idx_start + hDirAC->subframe_nbslots[subframe_idx] == hDirAC->num_slots ) + { + /* we are at the end, get the next one using the normal dirac read idx...*/ + if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 ) + { + diff_md_idx = ( hDirAC->dirac_read_idx + DEFAULT_JBM_CLDFB_TIMESLOTS + 1 ) % hDirAC->dirac_md_buffer_length; + } + else + { + diff_md_idx = ( hDirAC->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS + 1 ) % hDirAC->dirac_md_buffer_length; + } + } + else + { + diff_md_idx = hDirAC->render_to_md_slot_map[slot_idx_start + hDirAC->subframe_nbslots[subframe_idx]]; } - /*-----------------------------------------------------------------* - * CLDFB synthesis (and binaural rendering) - *-----------------------------------------------------------------*/ +#endif + ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( Cldfb_RealBuffer, + Cldfb_ImagBuffer, + hDirAC, +#ifdef JBM_TSM_ON_TCS + hDirAC->subframe_nbslots[subframe_idx], + diff_md_idx, +#endif + reference_power_smooth, + qualityBasedSmFactor ); + } + + /*-----------------------------------------------------------------* + * CLDFB synthesis (and binaural rendering) + *-----------------------------------------------------------------*/ +#ifdef JBM_TSM_ON_TCS + index_slot = slot_idx_start_cldfb_synth; +#else index_slot = subframe_idx * hDirAC->subframe_nbslots; +#endif - if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) - { - /* Perform binaural rendering */ - ivas_binRenderer( st_ivas->hBinRenderer, - st_ivas->hHeadTrackData, - Cldfb_RealBuffer_Binaural, - Cldfb_ImagBuffer_Binaural, - Cldfb_RealBuffer, - Cldfb_ImagBuffer ); + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + /* Perform binaural rendering */ + ivas_binRenderer( st_ivas->hBinRenderer, + st_ivas->hHeadTrackData, +#ifdef JBM_TSM_ON_TCS + hDirAC->subframe_nbslots[subframe_idx], +#endif + Cldfb_RealBuffer_Binaural, + Cldfb_ImagBuffer_Binaural, + Cldfb_RealBuffer, + Cldfb_ImagBuffer ); - /* Inverse CLDFB*/ - for ( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ ) - { - /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ - float *RealBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; - float *ImagBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; + /* Inverse CLDFB*/ + for ( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ ) + { + /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ + float *RealBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; + float *ImagBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; +#ifdef JBM_TSM_ON_TCS + for ( i = 0; i < hDirAC->subframe_nbslots[subframe_idx]; i++ ) +#else for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) - { - RealBuffer[i] = Cldfb_RealBuffer_Binaural[ch][i]; - ImagBuffer[i] = Cldfb_ImagBuffer_Binaural[ch][i]; - } +#endif + { + RealBuffer[i] = Cldfb_RealBuffer_Binaural[ch][i]; + ImagBuffer[i] = Cldfb_ImagBuffer_Binaural[ch][i]; + } +#ifdef JBM_TSM_ON_TCS + cldfbSynthesis( RealBuffer, + ImagBuffer, + &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), + hDirAC->num_freq_bands * hDirAC->subframe_nbslots[subframe_idx], + st_ivas->cldfbSynDec[ch] ); +#else cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots, st_ivas->cldfbSynDec[ch] ); - } +#endif } - else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) + } + else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) + { + for ( ch = 0; ch < hDirAC->hOutSetup.nchan_out_woLFE; ch++ ) { - for ( ch = 0; ch < hDirAC->hOutSetup.nchan_out_woLFE; ch++ ) - { +#ifdef JBM_TSM_ON_TCS + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) +#else for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ ) - { - mvr2r( Cldfb_RealBuffer[ch][slot_idx], pppQMfFrame_ts_re[ch][slot_idx], hDirAC->num_freq_bands ); - mvr2r( Cldfb_ImagBuffer[ch][slot_idx], pppQMfFrame_ts_im[ch][slot_idx], hDirAC->num_freq_bands ); - } +#endif + { + mvr2r( Cldfb_RealBuffer[ch][slot_idx], pppQMfFrame_ts_re[ch][slot_idx], hDirAC->num_freq_bands ); + mvr2r( Cldfb_ImagBuffer[ch][slot_idx], pppQMfFrame_ts_im[ch][slot_idx], hDirAC->num_freq_bands ); } } - else - { - float *RealBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; - float *ImagBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; - int16_t outchannels; + } + else + { + float *RealBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; + float *ImagBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; + int16_t outchannels; - idx_in = 0; - idx_lfe = 0; + idx_in = 0; + idx_lfe = 0; - outchannels = hDirAC->hOutSetup.nchan_out_woLFE + hDirAC->hOutSetup.num_lfe; - if ( hDirAC->hOutSetup.separateChannelEnabled && ( hDirAC->hOutSetup.output_config == AUDIO_CONFIG_5_1 || - hDirAC->hOutSetup.output_config == AUDIO_CONFIG_7_1 || - hDirAC->hOutSetup.output_config == AUDIO_CONFIG_5_1_2 || - hDirAC->hOutSetup.output_config == AUDIO_CONFIG_5_1_4 || - hDirAC->hOutSetup.output_config == AUDIO_CONFIG_7_1_4 || - ( hDirAC->hOutSetup.output_config == AUDIO_CONFIG_LS_CUSTOM && st_ivas->hLsSetupCustom->separate_ch_found ) ) ) - { - outchannels++; - } + outchannels = hDirAC->hOutSetup.nchan_out_woLFE + hDirAC->hOutSetup.num_lfe; + if ( hDirAC->hOutSetup.separateChannelEnabled && ( hDirAC->hOutSetup.output_config == AUDIO_CONFIG_5_1 || + hDirAC->hOutSetup.output_config == AUDIO_CONFIG_7_1 || + hDirAC->hOutSetup.output_config == AUDIO_CONFIG_5_1_2 || + hDirAC->hOutSetup.output_config == AUDIO_CONFIG_5_1_4 || + hDirAC->hOutSetup.output_config == AUDIO_CONFIG_7_1_4 || + ( hDirAC->hOutSetup.output_config == AUDIO_CONFIG_LS_CUSTOM && st_ivas->hLsSetupCustom->separate_ch_found ) ) ) + { + outchannels++; + } - if ( hDirAC->hOutSetup.separateChannelEnabled && hDirAC->hOutSetup.output_config == AUDIO_CONFIG_LS_CUSTOM ) - { - float tmp_separated[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; - float tmp_lfe[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; - const int16_t subframe_start_sample = index_slot * hDirAC->num_freq_bands; + if ( hDirAC->hOutSetup.separateChannelEnabled && hDirAC->hOutSetup.output_config == AUDIO_CONFIG_LS_CUSTOM ) + { + float tmp_separated[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; + float tmp_lfe[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; + const int16_t subframe_start_sample = index_slot * hDirAC->num_freq_bands; +#ifdef JBM_TSM_ON_TCS + const int16_t num_samples_subframe = hDirAC->num_freq_bands * hDirAC->subframe_nbslots[subframe_idx]; +#else const int16_t num_samples_subframe = hDirAC->num_freq_bands * hDirAC->subframe_nbslots; +#endif - /* Move the separated and the LFE channels to temporary variables as spatial synthesis may overwrite current channels */ - mvr2r( &( output_f[st_ivas->hOutSetup.separateChannelIndex][subframe_start_sample] ), tmp_separated, num_samples_subframe ); - mvr2r( &( output_f[LFE_CHANNEL][subframe_start_sample] ), tmp_lfe, num_samples_subframe ); + /* Move the separated and the LFE channels to temporary variables as spatial synthesis may overwrite current channels */ + mvr2r( &( output_f[st_ivas->hOutSetup.separateChannelIndex][subframe_start_sample] ), tmp_separated, num_samples_subframe ); + mvr2r( &( output_f[LFE_CHANNEL][subframe_start_sample] ), tmp_lfe, num_samples_subframe ); - for ( ch = 0; ch < outchannels; ch++ ) + for ( ch = 0; ch < outchannels; ch++ ) + { + if ( ( hDirAC->hOutSetup.num_lfe > 0 ) && ( hDirAC->hOutSetup.index_lfe[idx_lfe] == ch ) ) { - if ( ( hDirAC->hOutSetup.num_lfe > 0 ) && ( hDirAC->hOutSetup.index_lfe[idx_lfe] == ch ) ) - { - /* Move the LFE channel to the correct place */ - mvr2r( tmp_lfe, &( output_f[ch][subframe_start_sample] ), num_samples_subframe ); + /* Move the LFE channel to the correct place */ + mvr2r( tmp_lfe, &( output_f[ch][subframe_start_sample] ), num_samples_subframe ); - if ( idx_lfe < ( hDirAC->hOutSetup.num_lfe - 1 ) ) - { - idx_lfe++; - } - } - else if ( ( st_ivas->hLsSetupCustom->separate_ch_found ) && ( hDirAC->hOutSetup.separateChannelIndex == ch ) ) + if ( idx_lfe < ( hDirAC->hOutSetup.num_lfe - 1 ) ) { - /* Move the separated channel to the correct place. Thus, the separated channel is - * combined with the synthesized channels here when there is a matching channel. */ - mvr2r( tmp_separated, &( output_f[ch][subframe_start_sample] ), num_samples_subframe ); + idx_lfe++; } - else - { - /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ + } + else if ( ( st_ivas->hLsSetupCustom->separate_ch_found ) && ( hDirAC->hOutSetup.separateChannelIndex == ch ) ) + { + /* Move the separated channel to the correct place. Thus, the separated channel is + * combined with the synthesized channels here when there is a matching channel. */ + mvr2r( tmp_separated, &( output_f[ch][subframe_start_sample] ), num_samples_subframe ); + } + else + { + /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ +#ifdef JBM_TSM_ON_TCS + for ( i = 0; i < hDirAC->subframe_nbslots[subframe_idx]; i++ ) +#else for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) - { - RealBuffer[i] = Cldfb_RealBuffer[idx_in][i]; - ImagBuffer[i] = Cldfb_ImagBuffer[idx_in][i]; - } - cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][subframe_start_sample] ), num_samples_subframe, st_ivas->cldfbSynDec[idx_in] ); - - if ( !st_ivas->hLsSetupCustom->separate_ch_found ) - { - /* Pan the separated channel and mix with the synthesized channels. Thus, the separated channel - * is combined with the synthesized channels here when there is no matching channel. */ - v_multc_acc( tmp_separated, st_ivas->hLsSetupCustom->separate_ch_gains[idx_in], &( output_f[ch][subframe_start_sample] ), num_samples_subframe ); - } +#endif + { + RealBuffer[i] = Cldfb_RealBuffer[idx_in][i]; + ImagBuffer[i] = Cldfb_ImagBuffer[idx_in][i]; + } + cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][subframe_start_sample] ), num_samples_subframe, st_ivas->cldfbSynDec[idx_in] ); - idx_in++; + if ( !st_ivas->hLsSetupCustom->separate_ch_found ) + { + /* Pan the separated channel and mix with the synthesized channels. Thus, the separated channel + * is combined with the synthesized channels here when there is no matching channel. */ + v_multc_acc( tmp_separated, st_ivas->hLsSetupCustom->separate_ch_gains[idx_in], &( output_f[ch][subframe_start_sample] ), num_samples_subframe ); } + + idx_in++; } } - else + } + else + { + for ( ch = 0; ch < outchannels; ch++ ) { - for ( ch = 0; ch < outchannels; ch++ ) + if ( ( hDirAC->hOutSetup.num_lfe > 0 ) && ( hDirAC->hOutSetup.index_lfe[idx_lfe] == ch ) ) { - if ( ( hDirAC->hOutSetup.num_lfe > 0 ) && ( hDirAC->hOutSetup.index_lfe[idx_lfe] == ch ) ) + if ( st_ivas->mc_mode == MC_MODE_MCMASA && !hDirAC->hOutSetup.separateChannelEnabled ) { - if ( st_ivas->mc_mode == MC_MODE_MCMASA && !hDirAC->hOutSetup.separateChannelEnabled ) - { +#ifdef JBM_TSM_ON_TCS + for ( i = 0; i < hDirAC->subframe_nbslots[subframe_idx]; i++ ) +#else for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) - { - RealBuffer[i] = Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS - 1][i]; - ImagBuffer[i] = Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS - 1][i]; - } - cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots, st_ivas->cldfbSynDec[hDirAC->hOutSetup.nchan_out_woLFE + idx_lfe] ); - } - else if ( st_ivas->mc_mode == MC_MODE_MCMASA && hDirAC->hOutSetup.separateChannelEnabled ) - { - /* LFE has been synthesized in the time domain, do nothing. */ - } - else - { - set_zero( &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->subframe_nbslots * hDirAC->num_freq_bands ); - } - - if ( idx_lfe < ( hDirAC->hOutSetup.num_lfe - 1 ) ) +#endif { - idx_lfe++; + RealBuffer[i] = Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS - 1][i]; + ImagBuffer[i] = Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS - 1][i]; } +#ifdef JBM_TSM_ON_TCS + cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[hDirAC->hOutSetup.nchan_out_woLFE + idx_lfe] ); +#else + cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots, st_ivas->cldfbSynDec[hDirAC->hOutSetup.nchan_out_woLFE + idx_lfe] ); +#endif } - else if ( ( hDirAC->hOutSetup.separateChannelEnabled ) && ( hDirAC->hOutSetup.separateChannelIndex == ch ) ) + else if ( st_ivas->mc_mode == MC_MODE_MCMASA && hDirAC->hOutSetup.separateChannelEnabled ) { - /* The separated channel is already set to output_f[hOutSetup.separateChannelIndex]. Thus, the separated - * channel is combined with the synthesized channels here. */ + /* LFE has been synthesized in the time domain, do nothing. */ } else { - /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ +#ifdef JBM_TSM_ON_TCS + set_zero( &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->subframe_nbslots[subframe_idx] * hDirAC->num_freq_bands ); +#else + set_zero( &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->subframe_nbslots * hDirAC->num_freq_bands ); +#endif + } + + if ( idx_lfe < ( hDirAC->hOutSetup.num_lfe - 1 ) ) + { + idx_lfe++; + } + } + else if ( ( hDirAC->hOutSetup.separateChannelEnabled ) && ( hDirAC->hOutSetup.separateChannelIndex == ch ) ) + { + /* The separated channel is already set to output_f[hOutSetup.separateChannelIndex]. Thus, the separated + * channel is combined with the synthesized channels here. */ + } + else + { + /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ +#ifdef JBM_TSM_ON_TCS + for ( i = 0; i < hDirAC->subframe_nbslots[subframe_idx]; i++ ) +#else for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) - { - RealBuffer[i] = Cldfb_RealBuffer[idx_in][i]; - ImagBuffer[i] = Cldfb_ImagBuffer[idx_in][i]; - } - cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots, st_ivas->cldfbSynDec[idx_in] ); - idx_in++; +#endif + { + RealBuffer[i] = Cldfb_RealBuffer[idx_in][i]; + ImagBuffer[i] = Cldfb_ImagBuffer[idx_in][i]; } +#ifdef JBM_TSM_ON_TCS + cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[idx_in] ); +#else + cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots, st_ivas->cldfbSynDec[idx_in] ); +#endif + idx_in++; } } } } +#ifdef JBM_TSM_ON_TCS + hDirAC->slots_rendered += hDirAC->subframe_nbslots[subframe_idx]; + hDirAC->subframes_rendered++; +#endif +#ifndef JBM_TSM_ON_TCS +} +#endif - pop_wmops(); - return; +pop_wmops(); + +return; } diff --git a/lib_dec/ivas_dirac_output_synthesis_cov.c b/lib_dec/ivas_dirac_output_synthesis_cov.c index a2fc9ee821..892cfe4acb 100644 --- a/lib_dec/ivas_dirac_output_synthesis_cov.c +++ b/lib_dec/ivas_dirac_output_synthesis_cov.c @@ -104,12 +104,19 @@ ivas_error ivas_dirac_dec_output_synthesis_cov_open( set_zero( h_dirac_output_synthesis_state->cx_old[idx], nchan_in * nchan_in ); set_zero( h_dirac_output_synthesis_state->cy_old[idx], nchan_out * nchan_out ); set_zero( h_dirac_output_synthesis_state->mixing_matrix_old[idx], nchan_out * nchan_in ); +#ifdef JBM_TSM_ON_TCS + h_dirac_output_synthesis_state->mixing_matrix[idx] = (float *) malloc( nchan_out * nchan_in * sizeof( float ) ); + set_zero( h_dirac_output_synthesis_state->mixing_matrix[idx], nchan_out * nchan_in ); +#endif } for ( ; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) { h_dirac_output_synthesis_state->cx_old[idx] = NULL; h_dirac_output_synthesis_state->cy_old[idx] = NULL; h_dirac_output_synthesis_state->mixing_matrix_old[idx] = NULL; +#ifdef JBM_TSM_ON_TCS + h_dirac_output_synthesis_state->mixing_matrix[idx] = NULL; +#endif } for ( idx = 0; idx < num_param_bands_residual; idx++ ) { @@ -118,10 +125,17 @@ ivas_error ivas_dirac_dec_output_synthesis_cov_open( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis covariance\n" ) ); } set_zero( h_dirac_output_synthesis_state->mixing_matrix_res_old[idx], nchan_out * nchan_out ); +#ifdef JBM_TSM_ON_TCS + h_dirac_output_synthesis_state->mixing_matrix_res[idx] = (float *) malloc( nchan_out * nchan_out * sizeof( float ) ); + set_zero( h_dirac_output_synthesis_state->mixing_matrix_res[idx], nchan_out * nchan_out ); +#endif } for ( ; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) { h_dirac_output_synthesis_state->mixing_matrix_res_old[idx] = NULL; +#ifdef JBM_TSM_ON_TCS + h_dirac_output_synthesis_state->mixing_matrix_res[idx] = NULL; +#endif } /*-----------------------------------------------------------------* @@ -144,6 +158,28 @@ ivas_error ivas_dirac_dec_output_synthesis_cov_open( return IVAS_ERR_OK; } +#ifdef JBM_TSM_ON_TCS +/*-------------------------------------------------------------------* + * ivas_dirac_dec_output_synthesis_cov_open() + * + * Sets up the state and parameters for the Covariance Synthesis + *-------------------------------------------------------------------*/ + +void ivas_dirac_dec_output_synthesis_get_interpolator( + DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params, /* i/o: handle for the covariance synthesis parameters */ + const uint16_t interp_length ) +{ + int16_t idx; + + for ( idx = 1; idx <= interp_length; ++idx ) + { + h_dirac_output_synthesis_params->interpolator[idx - 1] = (float) idx / (float) interp_length; + } + + return; +} +#endif + /*-------------------------------------------------------------------* * ivas_dirac_dec_output_synthesis_cov_init() @@ -168,11 +204,17 @@ void ivas_dirac_dec_output_synthesis_cov_init( set_zero( h_dirac_output_synthesis_state->cx_old[idx], nchan_in * nchan_in ); set_zero( h_dirac_output_synthesis_state->cy_old[idx], nchan_out * nchan_out ); set_zero( h_dirac_output_synthesis_state->mixing_matrix_old[idx], nchan_out * nchan_in ); +#ifdef JBM_TSM_ON_TCS + set_zero( h_dirac_output_synthesis_state->mixing_matrix[idx], nchan_out * nchan_in ); +#endif } for ( idx = 0; idx < n_param_bands_res; idx++ ) { set_zero( h_dirac_output_synthesis_state->mixing_matrix_res_old[idx], nchan_out * nchan_out ); +#ifdef JBM_TSM_ON_TCS + set_zero( h_dirac_output_synthesis_state->mixing_matrix_res[idx], nchan_out * nchan_out ); +#endif } return; @@ -243,6 +285,19 @@ void ivas_dirac_dec_output_synthesis_cov_close( free( h_dirac_output_synthesis_state->mixing_matrix_res_old[idx] ); h_dirac_output_synthesis_state->mixing_matrix_res_old[idx] = NULL; } +#ifdef JBM_TSM_ON_TCS + if ( h_dirac_output_synthesis_state->mixing_matrix[idx] != NULL ) + { + free( h_dirac_output_synthesis_state->mixing_matrix[idx] ); + h_dirac_output_synthesis_state->mixing_matrix[idx] = NULL; + } + + if ( h_dirac_output_synthesis_state->mixing_matrix_res[idx] != NULL ) + { + free( h_dirac_output_synthesis_state->mixing_matrix_res[idx] ); + h_dirac_output_synthesis_state->mixing_matrix_res[idx] = NULL; + } +#endif } return; @@ -256,13 +311,21 @@ void ivas_dirac_dec_output_synthesis_cov_close( *-------------------------------------------------------------------*/ void ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot( - float RealBuffer[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (real part) */ - float ImagBuffer[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (imaginary part */ +#ifdef JBM_TSM_ON_TCS + float *RealBuffer, /* i : input channel filter bank samples (real part) */ + float *ImagBuffer, /* i : input channel filter bank samples (imaginary part */ +#else + float RealBuffer[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (real part) */ + float ImagBuffer[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (imaginary part */ +#endif float cx[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : accumulated input covariance (real part) */ float cx_imag[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : accumulated input covariance (imaginary part) */ PARAM_MC_DEC_HANDLE hParamMC, /* i : handle to Parametric MC state */ - const int16_t nchan_in, /* i : number of input channels */ - const int16_t idx_slot /* i : index of the slot to be added to the input covariance */ + const int16_t nchan_in /* i : number of input channels */ +#ifndef JBM_TSM_ON_TCS + , + const int16_t idx_slot /* i : index of the slot to be added to the input covariance */ +#endif ) { int16_t param_band, band_idx, ch_idx; @@ -288,8 +351,13 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot( int16_t band = brange[0] + band_idx; for ( ch_idx = 0; ch_idx < nchan_in; ch_idx++ ) { +#ifdef JBM_TSM_ON_TCS + real_in_buffer[band_idx + num_bands * ch_idx] = RealBuffer[ch_idx * hParamMC->num_freq_bands + band]; + imag_in_buffer[band_idx + num_bands * ch_idx] = ImagBuffer[ch_idx * hParamMC->num_freq_bands + band]; +#else real_in_buffer[band_idx + num_bands * ch_idx] = RealBuffer[ch_idx][idx_slot][band]; imag_in_buffer[band_idx + num_bands * ch_idx] = ImagBuffer[ch_idx][idx_slot][band]; +#endif } } @@ -312,17 +380,27 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot( *-------------------------------------------------------------------*/ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot( - float Cldfb_RealBuffer_in[][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (real part) */ - float Cldfb_ImagBuffer_in[][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (imaginary part) */ - float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (real part) */ - float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (imaginary part) */ +#ifdef JBM_TSM_ON_TCS + float *Cldfb_RealBuffer_in, /* i : input channel filter bank samples (real part) */ + float *Cldfb_ImagBuffer_in, /* i : input channel filter bank samples (imaginary part) */ +#else + float Cldfb_RealBuffer_in[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : CLDFB samples of the transport channels (real part) */ + float Cldfb_ImagBuffer_in[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : CLDFB samples of the transport channels (imaginary part) */ +#endif + float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (real part) */ + float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (imaginary part) */ +#ifdef JBM_TSM_ON_TCS + float *mixing_matrix[], /* i : parameter band wise mixing matrices (direct part) */ + float *mixing_matrix_res[], /* i : parameter band wise mixing matrices (residual part) */ +#else float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], /* i : parameter band wise mixing matrices (direct part) */ float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], /* i : parameter band wise mixing matrices (residual part) */ - const uint16_t slot_idx_sfr, /* i : time slot index for the current slot within the current subframe */ - const uint16_t slot_idx_tot, /* i : time slot index for the current slot within the frame */ - const int16_t nX, /* i : number of input channels */ - const int16_t nY, /* i : number of output channels */ - PARAM_MC_DEC_HANDLE hParamMC /* i : handle to the Parametric MC decoder state */ +#endif + const uint16_t slot_idx_sfr, /* i : time slot index for the current slot within the current subframe */ + const uint16_t slot_idx_tot, /* i : time slot index for the current slot within the frame */ + const int16_t nX, /* i : number of input channels */ + const int16_t nY, /* i : number of output channels */ + PARAM_MC_DEC_HANDLE hParamMC /* i : handle to the Parametric MC decoder state */ ) { int16_t param_band_idx, band, ch_idx; @@ -407,8 +485,13 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot( /* collect input signals, still in cldfb buffers */ for ( ch_idx = 0; ch_idx < nX; ch_idx++ ) { +#ifdef JBM_TSM_ON_TCS + input_f_real[ch_idx] = Cldfb_RealBuffer_in[ch_idx * hParamMC->num_freq_bands + band]; + input_f_imag[ch_idx] = Cldfb_ImagBuffer_in[ch_idx * hParamMC->num_freq_bands + band]; +#else input_f_real[ch_idx] = Cldfb_RealBuffer_in[ch_idx][slot_idx_tot][band]; input_f_imag[ch_idx] = Cldfb_ImagBuffer_in[ch_idx][slot_idx_tot][band]; +#endif } /* apply mixing matrix */ diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c index 362b63c04b..ffbff9014a 100644 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -161,7 +161,11 @@ ivas_error ivas_dirac_dec_output_synthesis_open( } /* buffer length and interpolator */ +#ifdef JBM_TSM_ON_TCS + if ( ( dirac_output_synthesis_params->interpolator = (float *) malloc( JBM_CLDFB_SLOTS_IN_SUBFRAME * sizeof( float ) ) ) == NULL ) +#else if ( ( dirac_output_synthesis_params->interpolator = (float *) malloc( hDirAC->subframe_nbslots * sizeof( float ) ) ) == NULL ) +#endif { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); } @@ -272,9 +276,17 @@ ivas_error ivas_dirac_dec_output_synthesis_open( } /* compute interpolator */ +#ifdef JBM_TSM_ON_TCS + for ( idx = 1; idx <= JBM_CLDFB_SLOTS_IN_SUBFRAME; ++idx ) +#else for ( idx = 1; idx <= hDirAC->subframe_nbslots; ++idx ) +#endif { +#ifdef JBM_TSM_ON_TCS + dirac_output_synthesis_params->interpolator[idx - 1] = (float) idx / (float) JBM_CLDFB_SLOTS_IN_SUBFRAME; +#else dirac_output_synthesis_params->interpolator[idx - 1] = (float) idx / (float) hDirAC->subframe_nbslots; +#endif } /* prepare diffuse response function */ @@ -511,13 +523,27 @@ void ivas_dirac_dec_output_synthesis_close( *------------------------------------------------------------------------*/ void ivas_dirac_dec_output_synthesis_process_slot( - const float *reference_power, /* i : Estimated power */ - const float *onset, /* i : onset filter */ - DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ - const float *p_Rmat, /* i : rotation matrix */ - const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ - const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ - const int16_t nchan_transport /* i : number of transport channels*/ + const float *reference_power, /* i : Estimated power */ + const float *onset, /* i : onset filter */ +#ifdef JBM_TSM_ON_TCS + const int16_t *azimuth, + const int16_t *elevation, + const float *diffuseness, + const uint16_t coherence_flag, +#endif + DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ +#ifdef JBM_TSM_ON_TCS + MASA_DECODER_HANDLE hMasa, + const int16_t sh_rot_max_order, +#endif + const float *p_Rmat, /* i : rotation matrix */ + const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ + const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ + const int16_t nchan_transport /* i : number of transport channels */ +#ifdef JBM_TSM_ON_TCS + , + const int16_t index_slot /* i : absolute slot index in the frame to process */ +#endif ) { int16_t num_freq_bands, num_channels_dir; @@ -525,11 +551,21 @@ void ivas_dirac_dec_output_synthesis_process_slot( int16_t ch_idx; float aux_buf[CLDFB_NO_CHANNELS_MAX]; int16_t diff_start_band; +#ifndef JBM_TSM_ON_TCS const float *diffuseness; +#endif +#ifdef JBM_TSM_ON_TCS + float dirEne; + float surCohEner; + float surCohRatio[CLDFB_NO_CHANNELS_MAX]; + int16_t i, l; +#endif DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params; DIRAC_OUTPUT_SYNTHESIS_STATE *h_dirac_output_synthesis_state; +#ifndef JBM_TSM_ON_TCS diffuseness = hDirAC->diffuseness_vector[hDirAC->dirac_read_idx]; +#endif h_dirac_output_synthesis_params = &( hDirAC->h_output_synthesis_psd_params ); h_dirac_output_synthesis_state = &( hDirAC->h_output_synthesis_psd_state ); @@ -550,71 +586,198 @@ void ivas_dirac_dec_output_synthesis_process_slot( num_channels_dir = hOutSetup.nchan_out_woLFE; } +#if defined( JBM_DIRAC_DEBUG_BE ) || !defined( JBM_TSM_ON_TCS ) +#ifdef JBM_DIRAC_DEBUG_BE + if ( hDirAC->hConfig->dec_param_estim == TRUE || hDirAC->voip_active == 1 ) +#else if ( hDirAC->hConfig->dec_param_estim == TRUE ) +#endif +#endif { + +#ifdef JBM_TSM_ON_TCS +#ifdef JBM_DIRAC_DEBUG_BE + if ( hDirAC->voip_active == 1 ) + { +#endif + if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + ivas_dirac_dec_compute_gain_factors( num_freq_bands, + diffuseness, + h_dirac_output_synthesis_params->max_band_decorr, + h_dirac_output_synthesis_state->direct_power_factor, + h_dirac_output_synthesis_state->diffuse_power_factor ); + + v_multc( h_dirac_output_synthesis_state->direct_power_factor, + 0.25f, + h_dirac_output_synthesis_state->direct_power_factor, + num_freq_bands ); + v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, + 0.25f, + h_dirac_output_synthesis_state->diffuse_power_factor, + num_freq_bands ); + if ( coherence_flag ) + { + for ( i = 0; i < hDirAC->num_freq_bands; i++ ) + { + surCohRatio[i] = hDirAC->surroundingCoherence[index_slot][i]; + } + } + else + { + set_zero( surCohRatio, hDirAC->num_freq_bands ); + } + } + else + { + + + /* compute reference and diffuse power factor for this frame */ + + ivas_dirac_dec_compute_power_factors( num_freq_bands, + diffuseness, + h_dirac_output_synthesis_params->max_band_decorr, + h_dirac_output_synthesis_state->direct_power_factor, + h_dirac_output_synthesis_state->diffuse_power_factor ); + + if ( coherence_flag ) + { + for ( i = 0; i < hDirAC->num_freq_bands; i++ ) + { + dirEne = hDirAC->h_output_synthesis_psd_state.direct_power_factor[i]; + surCohEner = hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] * hDirAC->surroundingCoherence[index_slot][i]; + hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] -= surCohEner; + hDirAC->h_output_synthesis_psd_state.direct_power_factor[i] += surCohEner; + + surCohRatio[i] = surCohEner / ( 1e-12f + dirEne + surCohEner ); + } + } + else + { + set_zero( surCohRatio, hDirAC->num_freq_bands ); + } + } +#ifdef JBM_DIRAC_DEBUG_BE + } +#endif +#endif /* compute direct responses */ +#ifdef JBM_TSM_ON_TCS + ivas_dirac_dec_compute_directional_responses( hDirAC, + hVBAPdata, + hMasa, + azimuth, + elevation, + index_slot, + coherence_flag ? surCohRatio : NULL, + sh_rot_max_order, + p_Rmat ); +#else ivas_dirac_dec_compute_directional_responses( hDirAC, hVBAPdata, NULL, NULL, 2, p_Rmat ); +#endif if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { - ivas_dirac_dec_compute_gain_factors( num_freq_bands, - diffuseness, - h_dirac_output_synthesis_params->max_band_decorr, - h_dirac_output_synthesis_state->direct_power_factor, - h_dirac_output_synthesis_state->diffuse_power_factor ); - - v_multc( h_dirac_output_synthesis_state->direct_power_factor, - 0.25f, - h_dirac_output_synthesis_state->direct_power_factor, - num_freq_bands ); - v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, - 0.25f, - h_dirac_output_synthesis_state->diffuse_power_factor, - num_freq_bands ); +#if !defined( JBM_TSM_ON_TCS ) || defined( JBM_DIRAC_DEBUG_BE ) +#ifdef JBM_DIRAC_DEBUG_BE + if ( hDirAC->voip_active == 0 ) + { +#endif + ivas_dirac_dec_compute_gain_factors( num_freq_bands, + diffuseness, + h_dirac_output_synthesis_params->max_band_decorr, + h_dirac_output_synthesis_state->direct_power_factor, + h_dirac_output_synthesis_state->diffuse_power_factor ); + + + v_multc( h_dirac_output_synthesis_state->direct_power_factor, + 0.25f, + h_dirac_output_synthesis_state->direct_power_factor, + num_freq_bands ); + v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, + 0.25f, + h_dirac_output_synthesis_state->diffuse_power_factor, + num_freq_bands ); +#ifdef JBM_DIRAC_DEBUG_BE + } +#endif +#endif /*Direct gain*/ - for ( ch_idx = 0; ch_idx < min( 4, nchan_transport ); ch_idx++ ) +#ifdef JBM_TSM_ON_TCS + if ( hDirAC->hConfig->dec_param_estim == TRUE ) { - int16_t k; - if ( ch_idx != 0 ) +#endif + for ( ch_idx = 0; ch_idx < min( 4, nchan_transport ); ch_idx++ ) { - float a, b, c; - - /*Directonal sound gain nrg compensation*/ - for ( k = 0; k < num_freq_bands_diff; k++ ) + int16_t k; + if ( ch_idx != 0 ) { - a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; - b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); - c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ); /*Diffuseness modellling nrg compensation*/ - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); + float a, b, c; + + /*Directonal sound gain nrg compensation*/ + for ( k = 0; k < num_freq_bands_diff; k++ ) + { + a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; + b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); + c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ); /*Diffuseness modellling nrg compensation*/ + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); + } + for ( ; k < num_freq_bands; k++ ) + { + a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; + b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); + c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ); /*Diffuseness modellling nrg compensation*/ + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); + } } - for ( ; k < num_freq_bands; k++ ) + else { - a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; - b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); - c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ); /*Diffuseness modellling nrg compensation*/ - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); + /*Diffuseness modellling nrg compensation*/ + for ( k = 0; k < num_freq_bands_diff; k++ ) + { + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ) ); + } + for ( ; k < num_freq_bands; k++ ) + { + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ) ); + } } } - else +#ifdef JBM_TSM_ON_TCS + } + else + { + for ( ch_idx = 0; ch_idx < min( 4, nchan_transport ); ch_idx++ ) { - /*Diffuseness modellling nrg compensation*/ - for ( k = 0; k < num_freq_bands_diff; k++ ) - { - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ) ); - } - for ( ; k < num_freq_bands; k++ ) + v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, 4.0f, aux_buf, num_freq_bands ); + v_mult( aux_buf, + aux_buf, + aux_buf, + num_freq_bands ); + v_multc( aux_buf, + h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f, + aux_buf, + num_freq_bands_diff ); + v_multc( &aux_buf[num_freq_bands_diff], + h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f, + &aux_buf[num_freq_bands_diff], + num_freq_bands - num_freq_bands_diff ); + + for ( l = 0; l < num_freq_bands; l++ ) { - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ) ); + aux_buf[l] = 0.25f * sqrtf( 1.f + aux_buf[l] ); } + v_add( aux_buf, &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands], &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands], num_freq_bands ); } } +#endif /*Directional gain (panning)*/ for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_dir; ch_idx++ ) { @@ -645,16 +808,25 @@ void ivas_dirac_dec_output_synthesis_process_slot( return; } +#if !defined( JBM_TSM_ON_TCS ) || defined( JBM_DIRAC_DEBUG_BE ) else { /* compute reference and diffuse power factor for this frame */ +#ifdef JBM_DIRAC_DEBUG_BE + if ( hDirAC->voip_active == 0 ) + { - ivas_dirac_dec_compute_power_factors( num_freq_bands, - diffuseness, - h_dirac_output_synthesis_params->max_band_decorr, - h_dirac_output_synthesis_state->direct_power_factor, - h_dirac_output_synthesis_state->diffuse_power_factor ); +#endif + ivas_dirac_dec_compute_power_factors( num_freq_bands, + diffuseness, + h_dirac_output_synthesis_params->max_band_decorr, + h_dirac_output_synthesis_state->direct_power_factor, + h_dirac_output_synthesis_state->diffuse_power_factor ); +#ifdef JBM_DIRAC_DEBUG_BE + } +#endif } +#endif } diff_start_band = 0; @@ -673,7 +845,9 @@ void ivas_dirac_dec_output_synthesis_process_slot( } /* process other PSDs only slot wise for 4 transport channels */ +#if !defined( JBM_TSM_ON_TCS ) || defined( JBM_DIRAC_DEBUG_BE ) if ( hDirAC->hConfig->dec_param_estim == TRUE ) +#endif { computeTargetPSDs_direct( num_channels_dir, num_freq_bands, h_dirac_output_synthesis_state->direct_power_factor, reference_power, h_dirac_output_synthesis_state->direct_responses, h_dirac_output_synthesis_state->direct_responses_square, h_dirac_output_synthesis_state->cy_auto_dir_smooth, h_dirac_output_synthesis_state->cy_cross_dir_smooth ); @@ -695,6 +869,9 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ const int16_t nchan_transport, /* i : number of transport channels */ +#ifdef JBM_TSM_ON_TCS + const int16_t nbslots, /* i : number of slots to process */ +#endif const float *onset_filter ) { int16_t buf_idx, ch_idx, i, l; @@ -731,7 +908,12 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( * comput target Gains *-----------------------------------------------------------------*/ +#if !defined( JBM_TSM_ON_TCS ) || defined( JBM_DIRAC_DEBUG_BE ) +#ifdef JBM_DIRAC_DEBUG_BE + if ( hDirAC->voip_active == 0 && hDirAC->hConfig->dec_param_estim == FALSE ) +#else if ( hDirAC->hConfig->dec_param_estim == FALSE ) +#endif { /*Direct gain*/ for ( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ ) @@ -769,6 +951,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( v_multc( h_dirac_output_synthesis_state.diffuse_power_factor, hDirAC->diffuse_response_function[ch_idx], &h_dirac_output_synthesis_state.cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], num_freq_bands_diff ); } } +#endif /*-----------------------------------------------------------------* * compute gains @@ -825,7 +1008,11 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( * gain interpolation and output streams *-----------------------------------------------------------------*/ +#ifdef JBM_TSM_ON_TCS + for ( buf_idx = 0; buf_idx < nbslots; ++buf_idx ) +#else for ( buf_idx = 0; buf_idx < hDirAC->subframe_nbslots; ++buf_idx ) +#endif { g1 = h_dirac_output_synthesis_params.interpolator[buf_idx]; g2 = 1.f - g1; @@ -970,10 +1157,17 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ +#ifdef JBM_TSM_ON_TCS + const int16_t nbslots, /* i : number of slots to process */ + const int16_t diff_md_idx, /* i : md slot idx of diffuseness to use */ +#endif float *reference_power_smooth, float qualityBasedSmFactor ) { - int16_t buf_idx, num_freq_bands, diff_start_band; + int16_t buf_idx, num_freq_bands; +#ifndef JBM_TSM_ON_TCS + int16_t diff_start_band; +#endif int16_t k, l; int16_t nchan_out_woLFE; float *p_power_smooth_prev, *p_power_diff_smooth_prev; @@ -994,7 +1188,9 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( float subtract_target_ratio; float subtract_target_ratio_db; float a, b; +#ifndef JBM_TSM_ON_TCS uint16_t nchan_target_psds; +#endif float alpha[CLDFB_NO_CHANNELS_MAX]; float *alpha_synthesis; float *alpha_synthesis_fast; @@ -1015,7 +1211,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( /*-----------------------------------------------------------------* * compute target PSDs *-----------------------------------------------------------------*/ - +#ifndef JBM_TSM_ON_TCS if ( hDirAC->hConfig->enc_param_start_band == 0 ) { diff_start_band = h_dirac_output_synthesis_params->use_onset_filters == 1 ? h_dirac_output_synthesis_params->max_band_decorr : 0; @@ -1043,7 +1239,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( h_dirac_output_synthesis_state->diffuse_responses_square, h_dirac_output_synthesis_state->cy_auto_diff_smooth ); } - +#endif /*-----------------------------------------------------------------* * compute variables for stereo transport signal type detection *-----------------------------------------------------------------*/ @@ -1096,7 +1292,14 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( indexFast = min( l, alphaMaxBinFast ); /* Estimate the smoothness of the directions based on the diffuseness parameter */ + /* TODO: check this, seems buggy in the case of parame estim on the decoder side, + because the pointer here points already to the following subframe, ist this intended?*/ +#ifdef JBM_TSM_ON_TCS + /* Workaround for BE */ + instDirectionSmoothness = 1.0f - hDirAC->diffuseness_vector[diff_md_idx][l]; /* Currently, all subframes have same energy ratio value. */ +#else instDirectionSmoothness = 1.0f - hDirAC->diffuseness_vector[hDirAC->dirac_read_idx][l]; /* Currently, all subframes have same energy ratio value. */ +#endif instDirectionSmoothness = min( max( instDirectionSmoothness, 0.0f ), 1.0f ); /* Average the direction smoothness parameter over time */ @@ -1240,8 +1443,11 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( /*-----------------------------------------------------------------* * gain interpolation and output streams *-----------------------------------------------------------------*/ - +#ifdef JBM_TSM_ON_TCS + for ( buf_idx = 0; buf_idx < nbslots; ++buf_idx ) +#else for ( buf_idx = 0; buf_idx < hDirAC->subframe_nbslots; ++buf_idx ) +#endif { g1 = h_dirac_output_synthesis_params->interpolator[buf_idx]; g2 = 1.f - g1; @@ -1483,6 +1689,11 @@ void ivas_dirac_dec_compute_directional_responses( DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ const MASA_DECODER_HANDLE hMasa, /* i : MASA decoder structure */ +#ifdef JBM_TSM_ON_TCS + const int16_t *azimuth, + const int16_t *elevation, + const int16_t md_idx, +#endif const float *surCohRatio, const int16_t shd_rot_max_order, /* i : split-order rotation method */ const float *p_Rmat /* i : rotation matrix */ @@ -1494,7 +1705,9 @@ void ivas_dirac_dec_compute_directional_responses( float direct_response_ls[MAX_OUTPUT_CHANNELS]; float direct_response_square[MAX_OUTPUT_CHANNELS]; float *direct_response; +#ifndef JBM_TSM_ON_TCS const int16_t *azimuth, *elevation; +#endif const int16_t *azimuth2, *elevation2; float direct_response_dir2[MAX_OUTPUT_CHANNELS]; float directRatio[MASA_MAXIMUM_DIRECTIONS]; @@ -1515,6 +1728,13 @@ void ivas_dirac_dec_compute_directional_responses( } num_channels_dir = hDirAC->num_outputs_dir; +#ifdef JBM_TSM_ON_TCS + if ( hDirAC->numSimultaneousDirections == 2 ) + { + azimuth2 = hDirAC->azimuth2[md_idx]; + elevation2 = hDirAC->elevation2[md_idx]; + } +#else azimuth = hDirAC->azimuth[hDirAC->dirac_read_idx]; elevation = hDirAC->elevation[hDirAC->dirac_read_idx]; if ( hDirAC->numSimultaneousDirections == 2 ) @@ -1522,6 +1742,7 @@ void ivas_dirac_dec_compute_directional_responses( azimuth2 = hDirAC->azimuth2[hDirAC->dirac_read_idx]; elevation2 = hDirAC->elevation2[hDirAC->dirac_read_idx]; } +#endif codingBand = -1; assert( num_channels_dir <= MAX_OUTPUT_CHANNELS && "Number of channels is too high" ); @@ -1572,18 +1793,29 @@ void ivas_dirac_dec_compute_directional_responses( hDirAC->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD || hDirAC->synthesisConf == DIRAC_SYNTHESIS_MONO ) { /* Synthesize the first direction */ +#ifdef JBM_TSM_ON_TCS + spreadCoherencePanningHoa( azimuth[k], elevation[k], hDirAC->spreadCoherence[md_idx][k], direct_response_hoa, num_channels_dir, hDirAC->hOutSetup.ambisonics_order ); +#else spreadCoherencePanningHoa( azimuth[k], elevation[k], hDirAC->spreadCoherence[hDirAC->dirac_read_idx][k], direct_response_hoa, num_channels_dir, hDirAC->hOutSetup.ambisonics_order ); - +#endif /* Synthesize the second direction and combine the gains */ if ( hDirAC->numSimultaneousDirections == 2 ) { +#ifdef JBM_TSM_ON_TCS + spreadCoherencePanningHoa( azimuth2[k], elevation2[k], hDirAC->spreadCoherence2[md_idx][k], direct_response_dir2, num_channels_dir, hDirAC->hOutSetup.ambisonics_order ); +#else spreadCoherencePanningHoa( azimuth2[k], elevation2[k], hDirAC->spreadCoherence2[hDirAC->dirac_read_idx][k], direct_response_dir2, num_channels_dir, hDirAC->hOutSetup.ambisonics_order ); - +#endif /* Combine gains from the two directions */ - totalDirect = hDirAC->energy_ratio1[hDirAC->dirac_read_idx][k] + hDirAC->energy_ratio2[hDirAC->dirac_read_idx][k] + EPSILON; - directRatio[0] = hDirAC->energy_ratio1[hDirAC->dirac_read_idx][k] / totalDirect; - directRatio[1] = hDirAC->energy_ratio2[hDirAC->dirac_read_idx][k] / totalDirect; - +#ifdef JBM_TSM_ON_TCS + totalDirect = hDirAC->energy_ratio1[md_idx][k] + hDirAC->energy_ratio2[md_idx][k] + EPSILON; + directRatio[0] = hDirAC->energy_ratio1[md_idx][k] / totalDirect; + directRatio[1] = hDirAC->energy_ratio2[md_idx][k] / totalDirect; +#else + totalDirect = hDirAC->energy_ratio1[hDirAC->dirac_read_idx]][k] + hDirAC->energy_ratio2[hDirAC->dirac_read_idx]][k] + EPSILON; + directRatio[0] = hDirAC->energy_ratio1[hDirAC->dirac_read_idx]][k] / totalDirect; + directRatio[1] = hDirAC->energy_ratio2[hDirAC->dirac_read_idx]][k] / totalDirect; +#endif for ( l = 0; l < num_channels_dir; l++ ) { direct_response_hoa[l] *= directRatio[0]; @@ -1631,20 +1863,33 @@ void ivas_dirac_dec_compute_directional_responses( else if ( hDirAC->panningConf == DIRAC_PANNING_VBAP ) /*VBAP*/ { /* Synthesize the first direction */ - spreadCoherencePanningVbap( azimuth[k], elevation[k], hDirAC->spreadCoherence[hDirAC->dirac_read_idx][k], direct_response_ls, num_channels_dir, hVBAPdata ); +#ifdef JBM_TSM_ON_TCS + spreadCoherencePanningVbap( azimuth[k], elevation[k], hDirAC->spreadCoherence[md_idx][k], direct_response_ls, num_channels_dir, hVBAPdata ); +#else + spreadCoherencePanningVbap( azimuth[k], elevation[k], hDirAC->spreadCoherence[hDirAC->dirac_read_idx]][k], direct_response_ls, num_channels_dir, hVBAPdata ); +#endif normalizePanningGains( direct_response_ls, num_channels_dir ); /* Synthesize the second direction and combine the gains */ if ( hDirAC->numSimultaneousDirections == 2 ) { - spreadCoherencePanningVbap( azimuth2[k], elevation2[k], hDirAC->spreadCoherence2[hDirAC->dirac_read_idx][k], direct_response_dir2, num_channels_dir, hVBAPdata ); - +#ifdef JBM_TSM_ON_TCS + spreadCoherencePanningVbap( azimuth2[k], elevation2[k], hDirAC->spreadCoherence2[md_idx][k], direct_response_dir2, num_channels_dir, hVBAPdata ); +#else + spreadCoherencePanningVbap( azimuth2[k], elevation2[k], hDirAC->spreadCoherence2[hDirAC->dirac_read_idx]][k], direct_response_dir2, num_channels_dir, hVBAPdata ); +#endif normalizePanningGains( direct_response_dir2, num_channels_dir ); /* Combine gains from the two directions */ - totalDirect = hDirAC->energy_ratio1[hDirAC->dirac_read_idx][k] + hDirAC->energy_ratio2[hDirAC->dirac_read_idx][k] + EPSILON; - directRatio[0] = hDirAC->energy_ratio1[hDirAC->dirac_read_idx][k] / totalDirect; - directRatio[1] = hDirAC->energy_ratio2[hDirAC->dirac_read_idx][k] / totalDirect; +#ifdef JBM_TSM_ON_TCS + totalDirect = hDirAC->energy_ratio1[md_idx][k] + hDirAC->energy_ratio2[md_idx][k] + EPSILON; + directRatio[0] = hDirAC->energy_ratio1[md_idx][k] / totalDirect; + directRatio[1] = hDirAC->energy_ratio2[md_idx][k] / totalDirect; +#else + totalDirect = hDirAC->energy_ratio1[hDirAC->dirac_read_idx]][k] + hDirAC->energy_ratio2[hDirAC->dirac_read_idx]][k] + EPSILON; + directRatio[0] = hDirAC->energy_ratio1[hDirAC->dirac_read_idx]][k] / totalDirect; + directRatio[1] = hDirAC->energy_ratio2[hDirAC->dirac_read_idx]][k] / totalDirect; +#endif for ( l = 0; l < num_channels_dir; l++ ) { direct_response_ls[l] *= directRatio[0]; diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 3f3080c8f8..288e308619 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -63,6 +63,11 @@ static ivas_error doSanityChecks_IVAS( Decoder_Struct *st_ivas ); ivas_error ivas_dec_setup( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +#ifdef JBM_TSM_ON_TCS + , + uint16_t *nSamplesRendered, /* o : number of samples flushed from the previous frame (JBM) */ + int16_t *data /* o : flushed PCM samples */ +#endif ) { int16_t k, idx, num_bits_read; @@ -112,10 +117,17 @@ ivas_error ivas_dec_setup( st_ivas->nchan_ism = nchan_ism; +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_ism_dec_config( st_ivas, st_ivas->ism_mode, nSamplesRendered, data ) ) != IVAS_ERR_OK ) + { + return error; + } +#else if ( ( error = ivas_ism_dec_config( st_ivas, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) { return error; } +#endif } else if ( st_ivas->ivas_format == SBA_FORMAT ) { @@ -189,7 +201,11 @@ ivas_error ivas_dec_setup( num_bits_read += MC_LS_SETUP_BITS; /* select MC format mode; reconfigure the MC format decoder */ +#ifdef JBM_TSM_ON_TCS + ivas_mc_dec_config( st_ivas, idx, nSamplesRendered, data ); +#else ivas_mc_dec_config( st_ivas, idx ); +#endif } /*-------------------------------------------------------------------* @@ -410,6 +426,7 @@ static ivas_error ivas_read_format( break; case SID_ISM: st_ivas->ivas_format = ISM_FORMAT; + break; case SID_MULTICHANNEL: st_ivas->ivas_format = MC_FORMAT; @@ -1223,6 +1240,7 @@ ivas_error ivas_init_decoder( } else if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) { + if ( ( error = ivas_td_binaural_open( st_ivas ) ) != IVAS_ERR_OK ) { return error; @@ -1235,6 +1253,19 @@ ivas_error ivas_init_decoder( return error; } } +#ifdef JBM_TSM_ON_TCS + if ( st_ivas->hDecoderConfig->voip_active ) + { + int16_t granularity; + int16_t n_channels_transport_jbm; + granularity = NS2SA( st_ivas->hDecoderConfig->output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ); + n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, n_channels_transport_jbm, n_channels_transport_jbm, n_channels_transport_jbm, granularity ) ) != IVAS_ERR_OK ) + { + return error; + } + } +#endif } else if ( st_ivas->renderer_type == RENDERER_MC ) { @@ -1267,6 +1298,19 @@ ivas_error ivas_init_decoder( } st_ivas->binaural_latency_ns = st_ivas->hCrendWrapper->binaural_latency_ns; +#ifdef JBM_TSM_ON_TCS + if ( st_ivas->hDecoderConfig->voip_active ) + { + int16_t granularity; + int16_t n_channels_transport_jbm; + granularity = NS2SA( st_ivas->hDecoderConfig->output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ); + n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, n_channels_transport_jbm, n_channels_transport_jbm, n_channels_transport_jbm, granularity ) ) != IVAS_ERR_OK ) + { + return error; + } + } +#endif } if ( st_ivas->ivas_format == ISM_FORMAT && @@ -1357,9 +1401,32 @@ ivas_error ivas_init_decoder( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Failed to open limiter handle" ); } +#ifdef JBM_TSM_ON_TCS + if ( st_ivas->hDecoderConfig->voip_active && st_ivas->hTcBuffer == NULL ) + { + /* no module has yet open the TC buffer, open a default one */ + int16_t n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, ivas_jbm_dec_get_tc_buffer_mode( st_ivas ), n_channels_transport_jbm, n_channels_transport_jbm, n_channels_transport_jbm, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + if ( st_ivas->hTcBuffer == NULL ) + { + /* we need the handle anyway, but without the buffer*/ + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_NONE, 0, 0, 0, 1 ) ) != IVAS_ERR_OK ) + { + return error; + } + } +#endif + return error; } +#ifdef JBM_TSM_ON_TCS + +#endif /*------------------------------------------------------------------------- * destroy_core_dec() @@ -1577,6 +1644,10 @@ void ivas_initialize_handles_dec( st_ivas->hLsSetupCustom = NULL; st_ivas->hRenderConfig = NULL; +#ifdef JBM_TSM_ON_TCS + st_ivas->hTcBuffer = NULL; +#endif + return; } @@ -1654,6 +1725,9 @@ void ivas_destroy_dec( /* ISM renderer handle */ if ( st_ivas->hIsmRendererData != NULL ) { +#ifdef JBM_TSM_ON_TCS + free( st_ivas->hIsmRendererData->interpolator ); +#endif free( st_ivas->hIsmRendererData ); st_ivas->hIsmRendererData = NULL; } @@ -1764,6 +1838,10 @@ void ivas_destroy_dec( st_ivas->hDecoderConfig = NULL; } +#ifdef JBM_TSM_ON_TCS + ivas_jbm_dec_tc_buffer_close( &st_ivas->hTcBuffer ); +#endif + /* main IVAS handle */ free( st_ivas ); diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index f50200e50f..15bdc3de97 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -32,6 +32,9 @@ #include #include "options.h" +#ifdef JBM_TSM_ON_TCS +#include "prot.h" +#endif #include "ivas_prot.h" #include "ivas_prot_rend.h" #ifdef DEBUGGING @@ -50,17 +53,37 @@ static ivas_error ivas_ism_bitrate_switching( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const int16_t nchan_transport_old, /* i : last number of transport channels */ const ISM_MODE last_ism_mode /* i : last ISM mode */ +#ifdef JBM_TSM_ON_TCS + , + uint16_t *nSamplesRendered, + int16_t *data +#endif ) { ivas_error error; int32_t element_brate_tmp[MAX_NUM_OBJECTS]; int16_t nSCE_old, nCPE_old; - +#ifdef JBM_TSM_ON_TCS + TC_BUFFER_MODE tc_buffer_mode_new; + int16_t tc_nchan_tc_new; + int16_t tc_nchan_allocate_new; + int16_t tc_granularity_new; + AUDIO_CONFIG intern_config_old; + IVAS_OUTPUT_SETUP hIntSetupOld; + RENDERER_TYPE renderer_type_old; +#endif +#ifdef TMP_FIX_ISM_BR_SWITCHING + int16_t numCldfbAnalyses_old, numCldfbSyntheses_old; +#endif error = IVAS_ERR_OK; nCPE_old = st_ivas->nCPE; nSCE_old = st_ivas->nSCE; +#ifdef TMP_FIX_ISM_BR_SWITCHING + ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); +#endif + if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->nchan_ism, NULL, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) { return error; @@ -86,6 +109,14 @@ static ivas_error ivas_ism_bitrate_switching( return error; } +#ifdef JBM_TSM_ON_TCS + /* save old IntSetup, might be needed for JBM flushing...*/ + intern_config_old = st_ivas->intern_config; + hIntSetupOld = st_ivas->hIntSetup; + tc_granularity_new = 1; + renderer_type_old = st_ivas->renderer_type; +#endif + /*-----------------------------------------------------------------* * Initialize the needed renderer struct and destroy the unnecessary renderer struct *-----------------------------------------------------------------*/ @@ -98,6 +129,39 @@ static ivas_error ivas_ism_bitrate_switching( ivas_output_init( &( st_ivas->hIntSetup ), st_ivas->hDecoderConfig->output_config ); } +#ifdef JBM_TSM_ON_TCS + if ( st_ivas->hDecoderConfig->voip_active ) + { + /* transfer subframe info from DirAC or ParamMC to central tc buffer */ + if ( last_ism_mode == ISM_MODE_PARAM && st_ivas->hDirAC != NULL ) + { + st_ivas->hTcBuffer->nb_subframes = st_ivas->hDirAC->nb_subframes; + st_ivas->hTcBuffer->subframes_rendered = st_ivas->hDirAC->subframes_rendered; + st_ivas->hTcBuffer->num_slots = st_ivas->hDirAC->num_slots; + st_ivas->hTcBuffer->slots_rendered = st_ivas->hDirAC->slots_rendered; + mvs2s( st_ivas->hDirAC->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } + /* JBM: when granularity goes down (e.g. Discrete ISM with TD Obj Renderer -> ParamISM with binaural fastconv + render what still fits in the new granularity */ + tc_granularity_new = ivas_jbm_dec_get_render_granularity( st_ivas->renderer_type, st_ivas->hDecoderConfig->output_Fs ); + if ( tc_granularity_new < st_ivas->hTcBuffer->n_samples_granularity ) + { + if ( ( error = ivas_jbm_dec_flush_renderer( st_ivas, tc_granularity_new, renderer_type_old, intern_config_old, &hIntSetupOld, MC_MODE_NONE, last_ism_mode, nSamplesRendered, data ) ) != IVAS_ERR_OK ) + { + return error; + } + } + /* JBM: when granularity goes up set samples to discard at the beginning of the frame */ + else if ( tc_granularity_new > st_ivas->hTcBuffer->n_samples_granularity ) + { + if ( ( error = ivas_jbm_dec_set_discard_samples( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } +#endif + if ( st_ivas->ism_mode != last_ism_mode ) { /* EFAP handle */ @@ -221,6 +285,57 @@ static ivas_error ivas_ism_bitrate_switching( } } +#ifdef TMP_FIX_ISM_BR_SWITCHING + /*-----------------------------------------------------------------* + * CLDFB instances + *-----------------------------------------------------------------*/ + + ivas_cldfb_dec_reconfig( st_ivas, nchan_transport_old, numCldfbAnalyses_old, numCldfbSyntheses_old ); +#endif +#ifdef JBM_TSM_ON_TCS + /*-----------------------------------------------------------------* + * Reconfigure TC buffer + *-----------------------------------------------------------------*/ + if ( st_ivas->hDecoderConfig->voip_active == 1 ) + { + int16_t tc_nchan_full_new; + DECODER_TC_BUFFER_HANDLE hTcBuffer; + + hTcBuffer = st_ivas->hTcBuffer; + tc_buffer_mode_new = ivas_jbm_dec_get_tc_buffer_mode( st_ivas ); + tc_nchan_tc_new = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + tc_nchan_allocate_new = tc_nchan_tc_new; + tc_nchan_full_new = tc_nchan_tc_new; + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + tc_nchan_allocate_new = 2 * BINAURAL_CHANNELS; + tc_nchan_full_new = tc_nchan_allocate_new; + } + if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + tc_nchan_full_new = 0; + } + /* reconfigure buffer */ + if ( hTcBuffer->tc_buffer_mode != tc_buffer_mode_new || hTcBuffer->nchan_transport_jbm != tc_nchan_tc_new || + hTcBuffer->nchan_buffer_full != tc_nchan_full_new || hTcBuffer->nchan_transport_internal != tc_nchan_allocate_new ) + { + if ( ( error = ivas_jbm_dec_tc_buffer_reconfigure( st_ivas, tc_buffer_mode_new, tc_nchan_tc_new, tc_nchan_allocate_new, tc_nchan_full_new, tc_granularity_new ) ) != IVAS_ERR_OK ) + { + return error; + } + } + /* transfer subframe info from central tc buffer to ParamMC or McMASA (DirAC) */ + if ( st_ivas->hDirAC != NULL ) + { + st_ivas->hDirAC->nb_subframes = st_ivas->hTcBuffer->nb_subframes; + st_ivas->hDirAC->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered; + st_ivas->hDirAC->num_slots = st_ivas->hTcBuffer->num_slots; + st_ivas->hDirAC->slots_rendered = st_ivas->hTcBuffer->slots_rendered; + mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hDirAC->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } + } +#endif + return error; } @@ -236,6 +351,11 @@ ivas_error ivas_ism_dec_config( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ , const ISM_MODE last_ism_mode /* i/o: last ISM mode */ +#ifdef JBM_TSM_ON_TCS + , + uint16_t *nSamplesRendered, /* o : number of samples flushed when the renderer granularity changes */ + int16_t *data +#endif ) { int32_t ivas_total_brate; @@ -276,7 +396,11 @@ ivas_error ivas_ism_dec_config( { if ( ( st_ivas->ism_mode != last_ism_mode ) || ( st_ivas->hDecoderConfig->ivas_total_brate != st_ivas->hDecoderConfig->last_ivas_total_brate ) ) { +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_ism_bitrate_switching( st_ivas, nchan_transport_old, last_ism_mode, nSamplesRendered, data ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_ism_bitrate_switching( st_ivas, nchan_transport_old, last_ism_mode ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -299,7 +423,11 @@ ivas_error ivas_ism_dec_config( /* ISM mode switching */ if ( st_ivas->ism_mode != last_ism_mode ) { +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_ism_bitrate_switching( st_ivas, nchan_transport_old, last_ism_mode, nSamplesRendered, data ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_ism_bitrate_switching( st_ivas, nchan_transport_old, last_ism_mode ) ) != IVAS_ERR_OK ) +#endif { return error; } diff --git a/lib_dec/ivas_ism_dtx_dec.c b/lib_dec/ivas_ism_dtx_dec.c index 4e987c2920..da697aa8b2 100644 --- a/lib_dec/ivas_ism_dtx_dec.c +++ b/lib_dec/ivas_ism_dtx_dec.c @@ -130,8 +130,11 @@ ivas_error ivas_ism_dtx_dec( ism_mode_bstr = (ISM_MODE) ( idx + 1 ); st_ivas->ism_mode = ism_mode_bstr; } - +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_ism_dec_config( st_ivas, last_ism_mode, NULL, NULL ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_ism_dec_config( st_ivas, last_ism_mode ) ) != IVAS_ERR_OK ) +#endif { return error; } diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index 244bf1f398..16988f05aa 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -157,7 +157,133 @@ static void ivas_ism_get_proto_matrix( return; } +#ifdef JBM_TSM_ON_TCS +static void ivas_param_ism_collect_slot( + DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ + float *Cldfb_RealBuffer_in, + float *Cldfb_ImagBuffer_in, + const int16_t ch, + float ref_power[], + float cx_diag[][PARAM_ISM_MAX_DMX] ) +{ + + int16_t band_idx, bin_idx; + int16_t brange[2]; + float tmp; + + /* loop over parameter bands to collect transport channel energies */ + for ( band_idx = 0; band_idx < hDirAC->hParamIsm->nbands; band_idx++ ) + { + brange[0] = hDirAC->hParamIsm->band_grouping[band_idx]; + brange[1] = hDirAC->hParamIsm->band_grouping[band_idx + 1]; + for ( bin_idx = brange[0]; bin_idx < brange[1]; bin_idx++ ) + { + tmp = 0.0f; + tmp += ( Cldfb_RealBuffer_in[bin_idx] * Cldfb_RealBuffer_in[bin_idx] ); + tmp += ( Cldfb_ImagBuffer_in[bin_idx] * Cldfb_ImagBuffer_in[bin_idx] ); + cx_diag[bin_idx][ch] += tmp; + ref_power[bin_idx] += tmp; + } + } + return; +} +static void ivas_param_ism_compute_mixing_matrix( + const int16_t nchan_ism, /* i : number of ISM channels */ + DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ + ISM_DTX_DATA_DEC hISMDTX, /* i : ISM DTX handle */ + float direct_response[MAX_NUM_OBJECTS][PARAM_ISM_MAX_CHAN], + const int16_t nchan_transport, + const int16_t nchan_out_woLFE, + const float cx_diag[][PARAM_ISM_MAX_DMX], + const float ref_power[], + float mixing_matrix[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_CHAN * PARAM_ISM_MAX_DMX] ) +{ + int16_t band_idx, bin_idx; + int16_t i, w, obj_indx; + int16_t brange[2]; + float direct_power[MAX_NUM_OBJECTS]; + float cy_diag[PARAM_ISM_MAX_CHAN]; + float cy_diag_tmp[MAX_NUM_OBJECTS][PARAM_ISM_MAX_CHAN]; + float *dir_res_ptr; + float *proto_matrix; + float response_matrix[PARAM_ISM_MAX_CHAN * MAX_NUM_OBJECTS]; + int16_t num_wave; + + proto_matrix = hDirAC->hParamIsmRendering->proto_matrix; + + assert( ( nchan_ism == 3 ) || ( nchan_ism == 4 ) ); + assert( nchan_transport == 2 ); + + if ( hDirAC->hParamIsm->flag_noisy_speech || hISMDTX.dtx_flag ) + { + num_wave = nchan_ism; + } + else + { + num_wave = MAX_PARAM_ISM_WAVE; + } + set_zero( response_matrix, PARAM_ISM_MAX_CHAN * MAX_NUM_OBJECTS ); + + /* loop over parameter bands to compute the mixing matrix */ + for ( band_idx = 0; band_idx < hDirAC->hParamIsm->nbands; band_idx++ ) + { + brange[0] = hDirAC->hParamIsm->band_grouping[band_idx]; + brange[1] = hDirAC->hParamIsm->band_grouping[band_idx + 1]; + + /* Compute covaraince matrix from direct response*/ + for ( w = 0; w < num_wave; w++ ) + { + set_zero( cy_diag_tmp[w], nchan_out_woLFE ); + + if ( hDirAC->hParamIsm->flag_noisy_speech || hISMDTX.dtx_flag ) + { + dir_res_ptr = direct_response[w]; + } + else + { + obj_indx = hDirAC->hParamIsm->obj_indices[band_idx][0][w]; + dir_res_ptr = direct_response[obj_indx]; + } + mvr2r( dir_res_ptr, response_matrix + w * nchan_out_woLFE, nchan_out_woLFE ); + /* we only need the diagonal of Cy*/ + matrix_product_diag( dir_res_ptr, nchan_out_woLFE, 1, 0, dir_res_ptr, 1, nchan_out_woLFE, 0, cy_diag_tmp[w] ); + } + + for ( bin_idx = brange[0]; bin_idx < brange[1]; bin_idx++ ) + { + + set_zero( cy_diag, nchan_out_woLFE ); + for ( w = 0; w < num_wave; w++ ) + { + if ( hDirAC->hParamIsm->flag_noisy_speech || hISMDTX.dtx_flag ) + { + direct_power[w] = ( 1.0f / nchan_ism ) * ref_power[bin_idx]; + } + else + { + direct_power[w] = hDirAC->power_ratios[band_idx][0][w] * ref_power[bin_idx]; + } + + if ( direct_power[w] != 0.f ) + { + for ( i = 0; i < nchan_out_woLFE; i++ ) + { + cy_diag[i] += direct_power[w] * cy_diag_tmp[w][i]; + } + } + direct_power[w] = sqrtf( direct_power[w] ); + } + /* Compute mixing matrix */ + computeMixingMatricesISM( nchan_transport, num_wave, nchan_out_woLFE, response_matrix, direct_power, cx_diag[bin_idx], cy_diag, proto_matrix, 1, + PARAM_MC_REG_SX, PARAM_MC_REG_GHAT, mixing_matrix[bin_idx] ); + } + } + + return; +} + +#else static void ivas_param_ism_compute_mixing_matrix( const int16_t nchan_ism, /* i : number of ISM channels */ DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ @@ -276,7 +402,45 @@ static void ivas_param_ism_compute_mixing_matrix( return; } +#endif + +#ifdef JBM_TSM_ON_TCS +static void ivas_param_ism_render_slot( + DIRAC_DEC_HANDLE hDirAC, + float *Cldfb_RealBuffer_in[PARAM_ISM_MAX_DMX], + float *Cldfb_ImagBuffer_in[PARAM_ISM_MAX_DMX], + float Cldfb_RealBuffer[PARAM_ISM_MAX_CHAN][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float Cldfb_ImagBuffer[PARAM_ISM_MAX_CHAN][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float mixing_matrix[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_CHAN * PARAM_ISM_MAX_DMX], + const int16_t interpolator_idx, + const int16_t out_slot_idx, + const int16_t num_ch_LS, + const int16_t nchan_transport ) +{ + int16_t outchIdx, inchIdx, bin_idx; + float tmp_1, mixing_matrix_smooth; + tmp_1 = hDirAC->hParamIsmRendering->interpolator[interpolator_idx]; + + for ( bin_idx = 0; bin_idx < hDirAC->num_freq_bands; bin_idx++ ) + { + /* smooth the mixing matrix */ + for ( outchIdx = 0; outchIdx < num_ch_LS; outchIdx++ ) + { + for ( inchIdx = 0; inchIdx < nchan_transport; inchIdx++ ) + { + mixing_matrix_smooth = tmp_1 * mixing_matrix[bin_idx][outchIdx + inchIdx * num_ch_LS] + + ( 1 - tmp_1 ) * hDirAC->hParamIsmRendering->mixing_matrix_lin_old[bin_idx][outchIdx + inchIdx * num_ch_LS]; + + Cldfb_RealBuffer[outchIdx][out_slot_idx][bin_idx] += mixing_matrix_smooth * Cldfb_RealBuffer_in[inchIdx][bin_idx]; + Cldfb_ImagBuffer[outchIdx][out_slot_idx][bin_idx] += mixing_matrix_smooth * Cldfb_ImagBuffer_in[inchIdx][bin_idx]; + } + } + } + + return; +} +#endif static void ivas_param_ism_rendering( DIRAC_DEC_HANDLE hDirAC, @@ -434,9 +598,19 @@ ivas_error ivas_param_ism_dec_open( *-----------------------------------------------------------------*/ hDirAC->slot_size = (int16_t) ( ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX ); +#ifdef JBM_TSM_ON_TCS + hDirAC->hConfig = NULL; + set_s( hDirAC->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); + set_s( hDirAC->subframe_nbslots, JBM_CLDFB_SLOTS_IN_SUBFRAME, DEFAULT_JBM_SUBFRAMES_5MS ); + hDirAC->nb_subframes = DEFAULT_JBM_SUBFRAMES_5MS; + hDirAC->subframes_rendered = 0; + hDirAC->slots_rendered = 0; + hDirAC->num_slots = DEFAULT_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME; +#else hDirAC->subframe_nbslots = (int16_t) ( CLDFB_NO_COL_MAX * 5.f / 20.f + 0.5f ); hDirAC->nb_subframes = CLDFB_NO_COL_MAX / hDirAC->subframe_nbslots; assert( hDirAC->nb_subframes <= MAX_PARAM_SPATIAL_SUBFRAMES ); +#endif hDirAC->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); hDirAC->hParamIsm->nbands = MAX_PARAM_ISM_NBANDS; @@ -468,10 +642,24 @@ ivas_error ivas_param_ism_dec_open( if ( !( output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) ) { /* Initialize Param ISM Rendering handle */ - if ( ( error = ivas_param_ism_rendering_init( hDirAC->hParamIsmRendering, hOutSetup, st_ivas->nchan_transport, CLDFB_NO_COL_MAX, output_config ) ) != IVAS_ERR_OK ) +#ifdef JBM_TSM_ON_TCS + if ( st_ivas->hDecoderConfig->voip_active ) { - return error; + if ( ( error = ivas_param_ism_rendering_init( hDirAC->hParamIsmRendering, hOutSetup, st_ivas->nchan_transport, MAX_JBM_CLDFB_TIMESLOTS, output_config ) ) != IVAS_ERR_OK ) + { + return error; + } } + else + { +#endif + if ( ( error = ivas_param_ism_rendering_init( hDirAC->hParamIsmRendering, hOutSetup, st_ivas->nchan_transport, CLDFB_NO_COL_MAX, output_config ) ) != IVAS_ERR_OK ) + { + return error; + } +#ifdef JBM_TSM_ON_TCS + } +#endif } if ( !( output_config == AUDIO_CONFIG_EXTERNAL || output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM || output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) ) @@ -487,14 +675,20 @@ ivas_error ivas_param_ism_dec_open( set_zero( hDirAC->azimuth_values, MAX_NUM_OBJECTS ); set_zero( hDirAC->elevation_values, MAX_NUM_OBJECTS ); +#ifdef JBM_TSM_ON_TCS + hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES; +#else hDirAC->dirac_md_buffer_length = 0; +#endif hDirAC->dirac_bs_md_write_idx = 0; hDirAC->dirac_read_idx = 0; hDirAC->spar_to_dirac_write_idx = 0; if ( ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) { +#ifndef JBM_TSM_ON_TCS hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES; +#endif if ( ( hDirAC->azimuth = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); @@ -602,6 +796,29 @@ ivas_error ivas_param_ism_dec_open( st_ivas->hDirAC = hDirAC; +#ifdef JBM_TSM_ON_TCS + if ( st_ivas->hDecoderConfig->voip_active && st_ivas->renderer_type != RENDERER_MONO_DOWNMIX ) + { + int16_t nchan_transport = st_ivas->nchan_transport; + hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc = (float *) malloc( MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hDirAC->num_freq_bands * sizeof( float ) ); + set_zero( hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc, MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hDirAC->num_freq_bands ); + hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc = (float *) malloc( MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hDirAC->num_freq_bands * sizeof( float ) ); + set_zero( hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc, MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hDirAC->num_freq_bands ); + if ( st_ivas->hTcBuffer == NULL ) + { + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, nchan_transport, nchan_transport, 0, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else + { + hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc = NULL; + hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc = NULL; + } +#endif + pop_wmops(); return error; } @@ -777,6 +994,19 @@ void ivas_param_ism_dec_close( } } +#ifdef JBM_TSM_ON_TCS + if ( hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc != NULL ) + { + free( hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc ); + hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc = NULL; + } + if ( hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc != NULL ) + { + free( hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc ); + hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc = NULL; + } +#endif + if ( hDirAC->hParamIsmRendering != NULL ) { free( hDirAC->hParamIsmRendering ); @@ -804,7 +1034,10 @@ void ivas_param_ism_dec( int16_t ch, nchan_transport, nchan_out, nchan_out_woLFE, i; int16_t subframe_idx, slot_idx, index_slot, bin_idx; int32_t ivas_total_brate; - +#ifdef JBM_TSM_ON_TCS + float ref_power[CLDFB_NO_CHANNELS_MAX]; + float cx_diag[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_DMX]; +#endif /* CLDFB Input Buffers */ float Cldfb_RealBuffer_in[PARAM_ISM_MAX_DMX][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; float Cldfb_ImagBuffer_in[PARAM_ISM_MAX_DMX][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; @@ -846,6 +1079,15 @@ void ivas_param_ism_dec( push_wmops( "ivas_param_ism_dec" ); +#ifdef JBM_TSM_ON_TCS + /* set buffers to zero */ + for ( bin_idx = 0; bin_idx < CLDFB_NO_CHANNELS_MAX; bin_idx++ ) + { + set_zero( cx_diag[bin_idx], PARAM_ISM_MAX_DMX ); + } + set_zero( ref_power, CLDFB_NO_CHANNELS_MAX ); +#endif + /* Frame-level Processing */ /* De-quantization */ if ( !( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) ) @@ -910,6 +1152,10 @@ void ivas_param_ism_dec( for ( slot_idx = 0; slot_idx < CLDFB_NO_COL_MAX; slot_idx++ ) { cldfbAnalysis_ts( &( output_f[ch][hDirAC->num_freq_bands * slot_idx] ), Cldfb_RealBuffer_in[ch][slot_idx], Cldfb_ImagBuffer_in[ch][slot_idx], hDirAC->num_freq_bands, st_ivas->cldfbAnaDec[ch] ); + +#ifdef JBM_TSM_ON_TCS + ivas_param_ism_collect_slot( hDirAC, Cldfb_RealBuffer_in[ch][slot_idx], Cldfb_ImagBuffer_in[ch][slot_idx], ch, ref_power, cx_diag ); +#endif } } @@ -920,26 +1166,42 @@ void ivas_param_ism_dec( } /* Compute mixing matrix */ +#ifdef JBM_TSM_ON_TCS + ivas_param_ism_compute_mixing_matrix( st_ivas->nchan_ism,hDirAC, st_ivas->hISMDTX, direct_response, nchan_transport, nchan_out_woLFE, cx_diag, ref_power, mixing_matrix ); +#else ivas_param_ism_compute_mixing_matrix( st_ivas->nchan_ism, hDirAC, st_ivas->hISMDTX, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, direct_response, nchan_transport, nchan_out_woLFE, 0, CLDFB_NO_COL_MAX, mixing_matrix ); - +#endif /* subframe loop for synthesis*/ for ( subframe_idx = 0; subframe_idx < hDirAC->nb_subframes; subframe_idx++ ) { +#ifdef JBM_TSM_ON_TCS + /* TODO: JBM just a quick fix to gewt SBA running, change to the right thing later...*/ + uint16_t slot_idx_start = subframe_idx * hDirAC->subframe_nbslots[subframe_idx]; +#else uint16_t slot_idx_start = subframe_idx * hDirAC->subframe_nbslots; +#endif uint16_t idx_in; uint16_t idx_lfe; /* Set some memories to zero */ for ( ch = 0; ch < nchan_out_woLFE; ch++ ) { +#ifdef JBM_TSM_ON_TCS + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) +#else for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ ) +#endif { set_f( Cldfb_RealBuffer[ch][slot_idx], 0.0f, hDirAC->num_freq_bands ); set_f( Cldfb_ImagBuffer[ch][slot_idx], 0.0f, hDirAC->num_freq_bands ); } } +#ifdef JBM_TSM_ON_TCS + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) +#else for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ ) +#endif { index_slot = slot_idx_start + slot_idx; @@ -957,8 +1219,11 @@ void ivas_param_ism_dec( { if ( ( hSetup.num_lfe > 0 ) && ( hSetup.index_lfe[idx_lfe] == ch ) ) { +#ifdef JBM_TSM_ON_TCS + set_zero( &( output_f[ch][slot_idx_start * hDirAC->num_freq_bands] ), hDirAC->subframe_nbslots[subframe_idx] * hDirAC->num_freq_bands ); +#else set_zero( &( output_f[ch][slot_idx_start * hDirAC->num_freq_bands] ), hDirAC->subframe_nbslots * hDirAC->num_freq_bands ); - +#endif if ( idx_lfe < ( hSetup.num_lfe - 1 ) ) { idx_lfe++; @@ -970,14 +1235,22 @@ void ivas_param_ism_dec( float *ImagBuffer[16]; /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ +#ifdef JBM_TSM_ON_TCS + for ( i = 0; i < hDirAC->subframe_nbslots[subframe_idx]; i++ ) +#else for ( i = 0; i < hDirAC->subframe_nbslots; i++ ) +#endif { RealBuffer[i] = Cldfb_RealBuffer[idx_in][i]; ImagBuffer[i] = Cldfb_ImagBuffer[idx_in][i]; } - +#ifdef JBM_TSM_ON_TCS + cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][slot_idx_start * hDirAC->num_freq_bands] ), + hDirAC->num_freq_bands * hDirAC->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[ch] ); +#else cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][slot_idx_start * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots, st_ivas->cldfbSynDec[ch] ); +#endif idx_in++; } @@ -1008,6 +1281,396 @@ void ivas_param_ism_dec( return; } +#ifdef JBM_TSM_ON_TCS +void ivas_ism_dec_digest_tc( + Decoder_Struct *st_ivas ) +{ + + ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); + + if ( + st_ivas->renderer_type == RENDERER_TD_PANNING || + st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || + st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || + st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || + ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM && st_ivas->hDecoderConfig->Opt_Headrotation == 0 ) ) + { + int16_t i, num_objects; + int16_t azimuth, elevation; + /* we have a full frame interpolator, adapt it */ + /* for BE testing */ + if ( ( st_ivas->hDecoderConfig->output_Fs / (int32_t) FRAMES_PER_SECOND ) == st_ivas->hTcBuffer->n_samples_available ) + { + int16_t interpolator_length = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / (int32_t) FRAMES_PER_SECOND ); + for ( i = 0; i < interpolator_length; i++ ) + { + st_ivas->hIsmRendererData->interpolator[i] = (float) i / ( (float) interpolator_length - 1 ); + } + } + else + { + ivas_jbm_dec_get_adapted_linear_interpolator( (int16_t) ( st_ivas->hDecoderConfig->output_Fs / (int32_t) FRAMES_PER_SECOND ), + st_ivas->hTcBuffer->n_samples_available, + st_ivas->hIsmRendererData->interpolator ); + } + /* also get the gains here */ + num_objects = st_ivas->nchan_transport; + for ( i = 0; i < num_objects; i++ ) + { + mvr2r( st_ivas->hIsmRendererData->gains[i], st_ivas->hIsmRendererData->prev_gains[i], MAX_OUTPUT_CHANNELS ); + if ( st_ivas->intern_config == AUDIO_CONFIG_STEREO ) + { + ivas_ism_get_stereo_gains( st_ivas->hIsmMetaData[i]->azimuth, + st_ivas->hIsmMetaData[i]->elevation, + &st_ivas->hIsmRendererData->gains[i][0], + &st_ivas->hIsmRendererData->gains[i][1] ); + } + else + { + // TODO tmu review when #215 is resolved + azimuth = (int16_t) floorf( st_ivas->hIsmMetaData[i]->azimuth + 0.5f ); + elevation = (int16_t) floorf( st_ivas->hIsmMetaData[i]->elevation + 0.5f ); + if ( ( st_ivas->renderer_type == RENDERER_TD_PANNING || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) && st_ivas->hHeadTrackData == NULL ) + { + + + if ( st_ivas->hIntSetup.is_planar_setup ) + { + /* If no elevation support in output format, then rendering should be done with zero elevation */ + elevation = 0; + } + if ( st_ivas->hEFAPdata != NULL ) + { + efap_determine_gains( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains[i], azimuth, elevation, EFAP_MODE_EFAP ); + } + } + else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) + { + /*get HOA gets for direction (ACN/SN3D)*/ + ivas_dirac_dec_get_response( azimuth, elevation, st_ivas->hIsmRendererData->gains[i], st_ivas->hIntSetup.ambisonics_order ); + } + } + } + } + return; +} + +void ivas_param_ism_dec_digest_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ + float *transport_channels_f[] /* i : synthesized core-coder transport channels/DirAC output */ +) +{ + int16_t ch, nchan_transport, nchan_out, nchan_out_woLFE, i; + int16_t slot_idx, bin_idx; + int32_t ivas_total_brate; + float ref_power[CLDFB_NO_CHANNELS_MAX]; + float cx_diag[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_DMX]; + /* Direct Response/EFAP Gains */ + float direct_response[MAX_NUM_OBJECTS][PARAM_ISM_MAX_CHAN]; + + DIRAC_DEC_HANDLE hDirAC; + + IVAS_OUTPUT_SETUP hSetup; + + /* Initialization */ + hDirAC = st_ivas->hDirAC; + assert( hDirAC ); + + nchan_transport = st_ivas->nchan_transport; + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + + if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL ) + { + nchan_out = st_ivas->nchan_ism; + nchan_out_woLFE = nchan_out; + st_ivas->hDecoderConfig->nchan_out = nchan_out; + } + else + { + nchan_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; + nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; + } + + hSetup = st_ivas->hIntSetup; + + push_wmops( "ivas_param_ism_dec" ); + + /* general setup */ + ivas_jbm_dec_get_adapted_linear_interpolator( DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbSlots, hDirAC->hParamIsmRendering->interpolator ); + + ivas_dirac_dec_set_md_map( st_ivas, nCldfbSlots ); + + /* set buffers to zero */ + for ( bin_idx = 0; bin_idx < CLDFB_NO_CHANNELS_MAX; bin_idx++ ) + { + set_zero( cx_diag[bin_idx], PARAM_ISM_MAX_DMX ); + } + set_zero( ref_power, CLDFB_NO_CHANNELS_MAX ); + + /* Frame-level Processing */ + /* De-quantization */ + if ( !( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) ) + { + ivas_param_ism_dec_dequant_DOA( hDirAC, st_ivas->nchan_ism ); + ivas_param_ism_dec_dequant_powrat( hDirAC ); + st_ivas->hISMDTX.dtx_flag = 0; + } + else + { + st_ivas->hISMDTX.dtx_flag = 1; + } + + /* obtain the direct response using EFAP */ + if ( !( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL ) ) + { + for ( i = 0; i < st_ivas->nchan_ism; i++ ) + { + efap_determine_gains( st_ivas->hEFAPdata, direct_response[i], hDirAC->azimuth_values[i], hDirAC->elevation_values[i], EFAP_MODE_EFAP ); + } + } + else + { + int16_t j; + + for ( i = 0; i < st_ivas->nchan_ism; i++ ) + { + for ( j = 0; j < nchan_out_woLFE; j++ ) + { + if ( i == j ) + { + direct_response[i][j] = 1.0f; + } + else + { + direct_response[i][j] = 0.0f; + } + } + } + + for ( i = 0; i < nchan_transport; i++ ) + { + for ( j = 0; j < nchan_out_woLFE; j++ ) + { + if ( i == j ) + { + hDirAC->hParamIsmRendering->proto_matrix[( i * nchan_out_woLFE ) + j] = 1.0f; + } + else + { + hDirAC->hParamIsmRendering->proto_matrix[( i * nchan_out_woLFE ) + j] = 0.0f; + } + } + } + } + + for ( ch = 0; ch < nchan_transport; ch++ ) + { + /*-----------------------------------------------------------------* + * CLDFB Analysis + *-----------------------------------------------------------------*/ + for ( slot_idx = 0; slot_idx < nCldfbSlots; slot_idx++ ) + { + float RealBuffer[CLDFB_NO_CHANNELS_MAX]; + float ImagBuffer[CLDFB_NO_CHANNELS_MAX]; + + cldfbAnalysis_ts( &( transport_channels_f[ch][hDirAC->num_freq_bands * slot_idx] ), RealBuffer, ImagBuffer, hDirAC->num_freq_bands, st_ivas->cldfbAnaDec[ch] ); + mvr2r( RealBuffer, &hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc[slot_idx * hDirAC->num_freq_bands * nchan_transport + ch * hDirAC->num_freq_bands], hDirAC->num_freq_bands ); + mvr2r( ImagBuffer, &hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc[slot_idx * hDirAC->num_freq_bands * nchan_transport + ch * hDirAC->num_freq_bands], hDirAC->num_freq_bands ); + + ivas_param_ism_collect_slot( hDirAC, RealBuffer, ImagBuffer, ch, ref_power, cx_diag ); + } + } + + /* Obtain Mixing Matrix on a frame-level */ + for ( bin_idx = 0; bin_idx < hDirAC->num_freq_bands; bin_idx++ ) + { + set_f( hDirAC->hParamIsmRendering->mixing_matrix_lin[bin_idx], 0.0f, nchan_transport * nchan_out_woLFE ); + } + + /* Compute mixing matrix */ + ivas_param_ism_compute_mixing_matrix( st_ivas->nchan_ism, hDirAC, st_ivas->hISMDTX, direct_response, nchan_transport, nchan_out_woLFE, cx_diag, ref_power, hDirAC->hParamIsmRendering->mixing_matrix_lin ); + + + pop_wmops(); + + return; +} + +static void ivas_ism_param_dec_render_sf( Decoder_Struct *st_ivas, + IVAS_OUTPUT_SETUP hSetup, + const int16_t nchan_transport, + const int16_t nchan_out, + const int16_t nchan_out_woLFE, + float *output_f[] /* o : rendered time signal */ +) +{ + + int16_t ch, slot_idx, i, index_slot; + /* CLDFB Output Buffers */ + float Cldfb_RealBuffer[PARAM_ISM_MAX_CHAN][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer[PARAM_ISM_MAX_CHAN][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float *Cldfb_RealBuffer_in[PARAM_ISM_MAX_DMX]; + float *Cldfb_ImagBuffer_in[PARAM_ISM_MAX_DMX]; + DIRAC_DEC_HANDLE hDirAC; + + /* TODO: JBM just a quick fix to gewt SBA running, change to the right thing later...*/ + int16_t slot_idx_start; + int16_t idx_in; + int16_t idx_lfe; + int16_t subframe_idx; + + hDirAC = st_ivas->hDirAC; + slot_idx_start = hDirAC->slots_rendered; + subframe_idx = hDirAC->subframes_rendered; + + /* Set some memories to zero */ + for ( ch = 0; ch < nchan_out_woLFE; ch++ ) + { + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) + { + set_f( Cldfb_RealBuffer[ch][slot_idx], 0.0f, hDirAC->num_freq_bands ); + set_f( Cldfb_ImagBuffer[ch][slot_idx], 0.0f, hDirAC->num_freq_bands ); + } + } + + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) + { + index_slot = slot_idx_start + slot_idx; + + for ( ch = 0; ch < nchan_transport; ch++ ) + { + Cldfb_RealBuffer_in[ch] = &hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc[index_slot * hDirAC->num_freq_bands * nchan_transport + ch * hDirAC->num_freq_bands]; + Cldfb_ImagBuffer_in[ch] = &hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc[index_slot * hDirAC->num_freq_bands * nchan_transport + ch * hDirAC->num_freq_bands]; + } + + + /* Compute bandwise rendering to target LS using covariance rendering */ + ivas_param_ism_render_slot( hDirAC, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, + Cldfb_RealBuffer, Cldfb_ImagBuffer, hDirAC->hParamIsmRendering->mixing_matrix_lin, index_slot, slot_idx, + nchan_out_woLFE, nchan_transport ); + } + + /* CLDFB Synthesis */ + idx_in = 0; + idx_lfe = 0; + + for ( ch = 0; ch < nchan_out; ch++ ) + { + if ( ( hSetup.num_lfe > 0 ) && ( hSetup.index_lfe[idx_lfe] == ch ) ) + { + set_zero( output_f[ch], hDirAC->subframe_nbslots[subframe_idx] * hDirAC->num_freq_bands ); + if ( idx_lfe < ( hSetup.num_lfe - 1 ) ) + { + idx_lfe++; + } + } + else + { + float *RealBuffer[16]; + float *ImagBuffer[16]; + + /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ + for ( i = 0; i < hDirAC->subframe_nbslots[subframe_idx]; i++ ) + { + RealBuffer[i] = Cldfb_RealBuffer[idx_in][i]; + ImagBuffer[i] = Cldfb_ImagBuffer[idx_in][i]; + } + cldfbSynthesis( RealBuffer, ImagBuffer, output_f[ch], + hDirAC->num_freq_bands * hDirAC->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[ch] ); + idx_in++; + } + } + hDirAC->slots_rendered += hDirAC->subframe_nbslots[subframe_idx]; + hDirAC->subframes_rendered++; +} + +void ivas_param_ism_dec_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ +) +{ + int16_t ch, slots_to_render, first_sf, last_sf, subframe_idx; + uint16_t slot_size, n_samples_sf; + DIRAC_DEC_HANDLE hDirAC; + IVAS_OUTPUT_SETUP hSetup; + int16_t nchan_transport, nchan_out, nchan_out_woLFE; + float *output_f_local[MAX_OUTPUT_CHANNELS]; + + hDirAC = st_ivas->hDirAC; + hSetup = st_ivas->hIntSetup; +#ifdef DEBUGGING + assert( hDirAC ); +#endif + nchan_transport = st_ivas->nchan_transport; + if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL ) + { + nchan_out = st_ivas->nchan_ism; + nchan_out_woLFE = nchan_out; + st_ivas->hDecoderConfig->nchan_out = nchan_out; + } + else + { + nchan_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; + nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; + } + slot_size = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + slots_to_render = min( hDirAC->num_slots - hDirAC->slots_rendered, nSamplesAsked / slot_size ); + *nSamplesRendered = slots_to_render * slot_size; + first_sf = hDirAC->subframes_rendered; + last_sf = first_sf; + while ( slots_to_render > 0 ) + { + slots_to_render -= hDirAC->subframe_nbslots[last_sf]; + last_sf++; + } +#ifdef DEBUGGING + assert( slots_to_render == 0 ); +#endif + for ( ch = 0; ch < nchan_out; ch++ ) + { + output_f_local[ch] = &output_f[ch][0]; + } + for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) + { + ivas_ism_param_dec_render_sf( st_ivas, hSetup, nchan_transport, nchan_out, nchan_out_woLFE, output_f_local ); + n_samples_sf = hDirAC->subframe_nbslots[subframe_idx] * st_ivas->hDirAC->slot_size; + for ( ch = 0; ch < nchan_out; ch++ ) + { + output_f_local[ch] += n_samples_sf; + } + } + if ( hDirAC->slots_rendered == hDirAC->num_slots ) + { + /* copy the memories */ + /* store mixing matrix for next subframe */ + ivas_param_ism_update_mixing_matrix( hDirAC, hDirAC->hParamIsmRendering->mixing_matrix_lin, nchan_transport, nchan_out_woLFE ); + + /* store MetaData parameters */ + for ( ch = 0; ch < st_ivas->nchan_ism; ch++ ) + { + if ( st_ivas->hDirAC->azimuth_values[ch] > 180.0f ) + { + st_ivas->hIsmMetaData[ch]->azimuth = st_ivas->hDirAC->azimuth_values[ch] - 360.0f; + } + else + { + st_ivas->hIsmMetaData[ch]->azimuth = st_ivas->hDirAC->azimuth_values[ch]; + } + + st_ivas->hIsmMetaData[ch]->elevation = st_ivas->hDirAC->elevation_values[ch]; + } + } + *nSamplesAvailable = ( hDirAC->num_slots - hDirAC->slots_rendered ) * slot_size; + return; +} + +#endif + /*-------------------------------------------------------------------------* * ivas_param_ism_params_to_masa_param_mapping() diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index 1e60143cb4..3882f656b7 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -58,6 +58,9 @@ ivas_error ivas_ism_renderer_open( { int16_t i; uint16_t interpolator_length; +#ifdef JBM_TSM_ON_TCS + uint16_t init_interpolator_length; +#endif ivas_error error; error = IVAS_ERR_OK; @@ -78,14 +81,34 @@ ivas_error ivas_ism_renderer_open( for ( i = 0; i < MAX_NUM_OBJECTS; i++ ) { set_f( st_ivas->hIsmRendererData->prev_gains[i], 0.0f, MAX_OUTPUT_CHANNELS ); +#ifdef JBM_TSM_ON_TCS + set_f( st_ivas->hIsmRendererData->gains[i], 0.0f, MAX_OUTPUT_CHANNELS ); +#endif } +#ifdef JBM_TSM_ON_TCS + if ( st_ivas->hDecoderConfig->voip_active ) + { + init_interpolator_length = NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_CLDFB_TIMESLOTS * CLDFB_SLOT_NS ); + interpolator_length = (uint16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + } + else + { + init_interpolator_length = (uint16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + interpolator_length = init_interpolator_length; + } + st_ivas->hIsmRendererData->interpolator = (float *) malloc( sizeof( float ) * init_interpolator_length ); + for ( i = 0; i < interpolator_length; i++ ) + { + st_ivas->hIsmRendererData->interpolator[i] = (float) i / ( (float) interpolator_length - 1 ); + } +#else interpolator_length = (uint16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); for ( i = 0; i < interpolator_length; i++ ) { st_ivas->hIsmRendererData->interpolator[i] = (float) i / ( (float) interpolator_length - 1 ); } - +#endif return error; } @@ -97,9 +120,13 @@ ivas_error ivas_ism_renderer_open( *-------------------------------------------------------------------------*/ void ivas_ism_render( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ +#ifdef JBM_TSM_ON_TCS + float *output_f[], /* i/o: core-coder transport channels/object output */ +#else float output_f[][L_FRAME48k], /* i/o: core-coder transport channels/object output */ - const int16_t output_frame /* i : output frame length per channel */ +#endif + const int16_t output_frame /* i : output frame length per channel */ ) { int16_t i, j, k, j2; @@ -201,6 +228,87 @@ void ivas_ism_render( return; } +#ifdef JBM_TSM_ON_TCS +void ivas_ism_render_sf( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output_f[], /* i/o: core-coder transport channels/object output */ + const int16_t n_samples_to_render /* i : output frame length per channel */ +) +{ + int16_t i, j, k, j2; + float *g1, g2, *tc; + int16_t num_objects, nchan_out_woLFE, lfe_index; + int16_t azimuth, elevation; + int16_t tc_offset; + int16_t interp_offset; + float Rmat[3][3]; + float gain, prev_gain; + + num_objects = st_ivas->nchan_transport; + nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; + + tc_offset = st_ivas->hTcBuffer->n_samples_rendered; + interp_offset = st_ivas->hTcBuffer->n_samples_rendered; + + for ( i = 0; i < nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; i++ ) + { + set_f( output_f[i], 0.0f, n_samples_to_render ); + } + + if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 ) + { + /* Calculate rotation matrix from the quaternion */ + QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[st_ivas->hHeadTrackData->num_quaternions++], Rmat ); + ivas_jbm_dec_get_adapted_linear_interpolator( n_samples_to_render, + n_samples_to_render, + st_ivas->hIsmRendererData->interpolator ); + interp_offset = 0; + } + + for ( i = 0; i < num_objects; i++ ) + { + + /* Head rotation: rotate the object positions depending the head's orientation */ + if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 ) + { + rotateAziEle( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &azimuth, &elevation, Rmat, st_ivas->hIntSetup.is_planar_setup ); + if ( st_ivas->hEFAPdata != NULL ) + { + efap_determine_gains( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains[i], azimuth, elevation, EFAP_MODE_EFAP ); + } + } + + lfe_index = 0; + for ( j = 0, j2 = 0; j < nchan_out_woLFE; j++, j2++ ) + { + if ( ( st_ivas->hIntSetup.num_lfe > 0 ) && ( st_ivas->hIntSetup.index_lfe[lfe_index] == j ) ) + { + ( lfe_index < ( st_ivas->hIntSetup.num_lfe - 1 ) ) ? ( lfe_index++, j2++ ) : j2++; + } + + gain = st_ivas->hIsmRendererData->gains[i][j]; + prev_gain = st_ivas->hIsmRendererData->prev_gains[i][j]; + if ( fabsf( gain ) > 0.0f || fabsf( prev_gain ) > 0.0f ) + { + g1 = &st_ivas->hIsmRendererData->interpolator[interp_offset]; + tc = &st_ivas->hTcBuffer->tc[i][tc_offset]; + for ( k = 0; k < n_samples_to_render; k++ ) + { + g2 = 1.0f - *g1; + output_f[j2][k] += ( *( g1++ ) * gain + g2 * prev_gain ) * *( tc++ ); + } + } + /* update here only in case of head rotation */ + if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 ) + { + st_ivas->hIsmRendererData->prev_gains[i][j] = gain; + } + } + } + return; +} +#endif + /*-------------------------------------------------------------------------* * ivas_ism_get_stereo_gains() diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c new file mode 100644 index 0000000000..b579c10c96 --- /dev/null +++ b/lib_dec/ivas_jbm_dec.c @@ -0,0 +1,1716 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "cnst.h" +#include "ivas_cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_prot_rend.h" +#include "ivas_rom_com.h" +#include +#ifdef DEBUGGING +#include "debug.h" +#endif +#include "wmc_auto.h" + + +#ifdef JBM_TSM_ON_TCS + +/*-----------------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------------*/ +static void ivas_jbm_dec_copy_tc( Decoder_Struct *st_ivas, const int16_t nSamplesForRendering, int16_t *nSamplesResidual, float *data, float *tc_digest_f[] ); +static void ivas_jbm_dec_tc_buffer_playout( Decoder_Struct *st_ivas, const uint16_t nSamplesAsked, uint16_t *nSamplesRendered, float *output[] ); + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_tc() + * + * Principal IVAS decoder routine, decoding of metadata and transport channels + *--------------------------------------------------------------------------*/ +ivas_error ivas_jbm_dec_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *data /* o : transport channel signal */ +) +{ + int16_t n, output_frame, nchan_out; + Decoder_State *st; /* used for bitstream handling */ + float output[MAX_TRANSPORT_CHANNELS][L_FRAME48k]; /* 'float' buffer for transport channels, MAX_TRANSPORT_CHANNELS channels */ /* IVAS_fmToDo: buffer can be allocated dynamically based on the actual number of output channels */ + int16_t nchan_remapped; + float output_lfe_ch[L_FRAME48k]; + int16_t nb_bits_metadata[MAX_SCE]; + int32_t output_Fs, ivas_total_brate; + AUDIO_CONFIG output_config; + ivas_error error; + float *p_output[MAX_TRANSPORT_CHANNELS]; + + error = IVAS_ERR_OK; + + push_wmops( "ivas_jbm_dec_tc" ); + + /*----------------------------------------------------------------* + * Initialization of local vars after struct has been set + *----------------------------------------------------------------*/ + + output_Fs = st_ivas->hDecoderConfig->output_Fs; + nchan_out = st_ivas->hTcBuffer->nchan_transport_jbm; + output_config = st_ivas->hDecoderConfig->output_config; + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + + output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC ); + + for ( n = 0; n < MAX_TRANSPORT_CHANNELS; n++ ) + { + p_output[n] = &output[n][0]; + } + + /*----------------------------------------------------------------* + * Decoding + Rendering + *----------------------------------------------------------------*/ + + if ( st_ivas->bfi && st_ivas->ini_frame == 0 ) + { + /* zero output when first frame(s) is lost */ + for ( n = 0; n < nchan_out; n++ ) + { + set_f( output[n], 0.0f, output_frame ); + } + +#ifdef DEBUG_MODE_INFO + create_sce_dec( st_ivas, 0, ivas_total_brate ); + output_debug_mode_info_dec( st_ivas->hSCE[0]->hCoreCoder, 1, output_frame, NULL ); + destroy_sce_dec( st_ivas->hSCE[0] ); + st_ivas->hSCE[0] = NULL; +#endif + } + else if ( st_ivas->ivas_format == STEREO_FORMAT ) + { + st_ivas->hCPE[0]->element_brate = ivas_total_brate; + + if ( ( error = ivas_cpe_dec( st_ivas, 0, output, output_frame, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* HP filtering */ + for ( n = 0; n < min( nchan_out, st_ivas->nchan_transport ); n++ ) + { + hp20( output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } + if ( st_ivas->renderer_type == RENDERER_MC && st_ivas->hDecoderConfig->nchan_out == 1 ) + { + ivas_ls_setup_conversion( st_ivas, output_frame, p_output, p_output ); + } + } + else if ( st_ivas->ivas_format == ISM_FORMAT ) + { + /* Metadata decoding and configuration */ + if ( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) + { + if ( ( error = ivas_ism_dtx_dec( st_ivas, nb_bits_metadata ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + // VE: call ivas_ism_metadata_dec() with 'st_ivas' - TBD + if ( ( error = ivas_ism_metadata_dec( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, st_ivas->hDirAC->hParamIsm, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else /* ISM_MODE_DISC */ + { + if ( ( error = ivas_ism_metadata_dec( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), 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; + } + } + + for ( n = 0; n < st_ivas->nchan_transport; n++ ) + { + if ( ( error = ivas_sce_dec( st_ivas, n, &output[n], output_frame, nb_bits_metadata[n] ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* HP filtering */ + hp20( output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } + if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX ) + { + ivas_mono_downmix_render_passive( st_ivas, output, output_frame ); + } + } + else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) + { + set_s( nb_bits_metadata, 0, MAX_SCE ); + + /* read parameters from the bitstream */ + if ( st_ivas->hQMetaData != NULL && st_ivas->sba_mode != SBA_MODE_SPAR ) + { + st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; + + if ( st_ivas->ivas_format == SBA_FORMAT ) + { + ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, 0 ); + } + else + { + if ( ( error = ivas_masa_decode( st_ivas, st, &nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) + { + if ( st_ivas->hQMetaData != NULL ) + { + st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; + ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, st_ivas->hSpar->dirac_to_spar_md_bands ); + } + + if ( ( error = ivas_spar_dec( st_ivas, nb_bits_metadata ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( st_ivas->nchan_transport == CPE_CHANNELS && st_ivas->nCPE >= 1 ) + { + st_ivas->hCPE[0]->element_brate = ivas_total_brate; + } + + /* core-decoding of transport channels */ + if ( st_ivas->nSCE == 1 ) + { + if ( ( error = ivas_sce_dec( st_ivas, 0, &output[0], output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->nCPE == 1 ) + { + if ( ( error = ivas_cpe_dec( st_ivas, 0, output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->nCPE > 1 ) + { + if ( ( error = ivas_mct_dec( st_ivas, output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + +#ifdef DEBUG_SBA_AUDIO_DUMP + /* Dump audio signal after core-decoding */ + ivas_spar_dump_signal_wav( output_frame, NULL, output, st_ivas->nchan_transport, spar_foa_dec_wav[0], "core-decoding" ); +#endif + /* TCs remapping */ + nchan_remapped = st_ivas->nchan_transport; + if ( st_ivas->sba_dirac_stereo_flag ) + { + nchan_remapped = nchan_out; + + if ( st_ivas->sba_mode == SBA_MODE_SPAR ) + { + ivas_agc_dec_process( st_ivas->hSpar->hAgcDec, output, output, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, output_frame ); + + if ( st_ivas->hSpar->hPCA != NULL ) + { + ivas_pca_dec( st_ivas->hSpar->hPCA, output_frame, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate, st_ivas->bfi, output ); + } + + ivas_spar_dec_gen_umx_mat( st_ivas->hSpar->hMdDec, st_ivas->nchan_transport, IVAS_MAX_NUM_BANDS, st_ivas->bfi ); + } + + ivas_sba_dirac_stereo_dec( st_ivas, output, output_frame, st_ivas->ivas_format == MC_FORMAT ); + } + else if ( st_ivas->ivas_format == MASA_FORMAT && ivas_total_brate < MASA_STEREO_MIN_BITRATE && ( ivas_total_brate > IVAS_SID_5k2 || ( ivas_total_brate <= IVAS_SID_5k2 && st_ivas->nCPE > 0 && st_ivas->hCPE[0]->nchan_out == 1 ) ) ) + { + nchan_remapped = 1; /* Only one channel transported */ + } + + /* HP filtering */ +#ifndef DEBUG_SPAR_BYPASS_EVS_CODEC + for ( n = 0; n < nchan_remapped; n++ ) + { + hp20( output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } +#endif + if ( st_ivas->ivas_format == SBA_FORMAT ) + { + nchan_remapped = ivas_sba_remapTCs( output, st_ivas, output_frame ); + + if ( st_ivas->sba_mode == SBA_MODE_SPAR && ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) + { + ivas_sba_mix_matrix_determiner( st_ivas->hSpar, output, st_ivas->bfi, nchan_remapped, output_frame ); + } + else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) + { + ivas_spar_dec_agc_pca( st_ivas, output, output_frame ); + } + } + + if ( st_ivas->ivas_format == MASA_FORMAT ) + { + ivas_masa_prerender( st_ivas, output, output_frame ); + } + else if ( st_ivas->ivas_format == SBA_FORMAT && ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) + { + float gain = 0.8414f; /* Todo: Temporary gain for roughly matching the loudness. To be tuned later together with other outputs. */ + + for ( n = 0; n < nchan_remapped; n++ ) + { + v_multc( output[n], gain, output[n], output_frame ); + } + } + } + else if ( st_ivas->ivas_format == MC_FORMAT ) + { + st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; + + /* LFE channel decoder */ + if ( st_ivas->mc_mode == MC_MODE_MCT ) + { + if ( st_ivas->hCPE[1]->hCoreCoder[1]->hTcxCfg == NULL ) + { + st_ivas->hCPE[1]->hCoreCoder[1]->hTcxCfg = st_ivas->hCPE[1]->hCoreCoder[0]->hTcxCfg; + } + ivas_lfe_dec( st_ivas->hLFE, st, output_frame, st_ivas->bfi, output_lfe_ch ); + } + + if ( st_ivas->mc_mode == MC_MODE_MCT ) + { + if ( ( error = ivas_mct_dec( st_ivas, output, output_frame, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + mvr2r( output_lfe_ch, output[LFE_CHANNEL], output_frame ); + + /* HP filtering */ + for ( n = 0; n < st_ivas->nchan_transport; n++ ) + { + if ( n != LFE_CHANNEL ) + { + hp20( output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } + } + if ( st_ivas->transport_config != st_ivas->intern_config && ( st_ivas->intern_config == AUDIO_CONFIG_FOA || st_ivas->intern_config == AUDIO_CONFIG_HOA2 || st_ivas->intern_config == AUDIO_CONFIG_HOA3 ) ) + { + if ( ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) <= ( st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe ) ) + { + ivas_mc2sba( st_ivas->hTransSetup, p_output, p_output, output_frame, st_ivas->hIntSetup.ambisonics_order, GAIN_LFE ); + } + } + if ( ( st_ivas->renderer_type == RENDERER_MC || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) && ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) >= ( st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe ) ) + { + if ( st_ivas->renderer_type == RENDERER_MC ) + { + ivas_ls_setup_conversion( st_ivas, output_frame, p_output, p_output ); + } + else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f ); + } + } + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) + { + /* read Parametric MC parameters from the bitstream */ + ivas_param_mc_dec_read_BS( ivas_total_brate, st, st_ivas->hParamMC, &nb_bits_metadata[0] ); + + if ( st_ivas->nCPE == 1 ) + { + if ( ( error = ivas_cpe_dec( st_ivas, 0, output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->nCPE > 1 ) + { + if ( ( error = ivas_mct_dec( st_ivas, output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* HP filtering */ + for ( n = 0; n < st_ivas->nchan_transport; n++ ) + { + hp20( output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } + + /* Rendering */ + if ( output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) + { + ivas_ls_setup_conversion( st_ivas, output_frame, p_output, p_output ); + } + } + else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) + { + if ( st_ivas->hOutSetup.separateChannelEnabled ) + { + st = st_ivas->hCPE[0]->hCoreCoder[0]; /* Metadata is always with CPE in the case of separated channel */ + } + + /* read McMASA parameters from the bitstream */ + if ( ( error = ivas_masa_decode( st_ivas, st, &nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->hOutSetup.separateChannelEnabled ) + { + /* Decode the transport audio signals */ + if ( ( error = ivas_cpe_dec( st_ivas, 0, output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Identify the index of the separated channel, always LFE_CHANNEL-1 here */ + n = LFE_CHANNEL - 1; + + /* Decode the separated channel to output[n] to be combined with the synthesized channels */ + if ( ( error = ivas_sce_dec( st_ivas, 0, &output[n], output_frame, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Delay the separated channel to sync with CLDFB delay of the DirAC synthesis, and synthesize the LFE signal. */ + if ( output_config == AUDIO_CONFIG_5_1 || output_config == AUDIO_CONFIG_7_1 || + output_config == AUDIO_CONFIG_5_1_4 || output_config == AUDIO_CONFIG_7_1_4 || + output_config == AUDIO_CONFIG_5_1_2 || ( output_config == AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe > 0 ) ) + { + ivas_lfe_synth_with_filters( st_ivas->hMasa->hMasaLfeSynth, output, output_frame, n, LFE_CHANNEL ); + } + else if ( output_config == AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe == 0 ) + { + /* Delay the separated channel to sync with the DirAC rendering */ + delay_signal( output[n], output_frame, st_ivas->hMasa->hMasaLfeSynth->delayBuffer_syncDirAC, st_ivas->hMasa->hMasaLfeSynth->delayBuffer_syncDirAC_size ); + } + } + else + { + if ( st_ivas->nSCE == 1 ) + { + if ( ( error = ivas_sce_dec( st_ivas, 0, output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->nCPE == 1 ) + { + if ( ( error = ivas_cpe_dec( st_ivas, 0, output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + if ( st_ivas->sba_dirac_stereo_flag ) /* use the flag to trigger the DFT upmix */ + { + ivas_sba_dirac_stereo_dec( st_ivas, output, output_frame, 1 ); + } + + /* HP filtering */ + for ( n = 0; n < getNumChanSynthesis( st_ivas ); n++ ) + { + hp20( output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } + + if ( st_ivas->renderer_type == RENDERER_MCMASA_MONO_STEREO ) + { + ivas_mono_stereo_downmix_mcmasa( st_ivas, output, output_frame ); + } + } + } + + + /*----------------------------------------------------------------* + * Write IVAS transport channels + *----------------------------------------------------------------*/ + + ivas_syn_output_f( p_output, output_frame, st_ivas->hTcBuffer->nchan_transport_jbm, data ); + + + /*----------------------------------------------------------------* + * Common updates + *----------------------------------------------------------------*/ + + if ( !st_ivas->bfi ) /* do not update if first frame(s) are lost or NO_DATA */ + { + st_ivas->hDecoderConfig->last_ivas_total_brate = ivas_total_brate; +#ifdef SBA_BR_SWITCHING + st_ivas->last_active_ivas_total_brate = ( ivas_total_brate <= IVAS_SID_5k2 ) ? st_ivas->last_active_ivas_total_brate : ivas_total_brate; +#endif + } + + if ( st_ivas->ini_frame < MAX_FRAME_COUNTER && !( st_ivas->bfi && st_ivas->ini_frame == 0 ) ) /* keep "st_ivas->ini_frame = 0" until first good received frame */ + { + st_ivas->ini_frame++; + } + + if ( st_ivas->ini_active_frame < MAX_FRAME_COUNTER && !( st_ivas->bfi && st_ivas->ini_frame == 0 ) && ivas_total_brate > IVAS_SID_5k2 ) /* needed in MASA decoder in case the first active frame is BFI, and there were SID-frames decoded before */ + { + st_ivas->ini_active_frame++; + } + +#ifdef DEBUG_MODE_INFO + dbgwrite( &st_ivas->bfi, sizeof( int16_t ), 1, output_frame, "res/bfi" ); + dbgwrite( &st_ivas->BER_detect, sizeof( int16_t ), 1, output_frame, "res/BER_detect" ); + { + float tmpF = ivas_total_brate / 1000.0f; + dbgwrite( &tmpF, sizeof( float ), 1, output_frame, "res/ivas_total_brate.dec" ); + } +#endif + + pop_wmops(); + return error; +} + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_feed_tc_to_renderer() + * + * Feed decoded transport channels and metadata to the IVAS renderer routine + *--------------------------------------------------------------------------*/ + +ivas_error ivas_jbm_dec_feed_tc_to_renderer( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t nSamplesForRendering, /* i: : number of TC samples available for rendering */ + int16_t *nSamplesResidual, /* o: : number of samples not fitting into the renderer grid and buffer for the next call*/ + float *data /* i : transport channels */ +) +{ + + float data_f[MAX_CLDFB_DIGEST_CHANNELS][MAX_JBM_L_FRAME48k]; /* 'float' buffer for transport channels that will be directly converted with the CLDFB */ + float *p_data_f[MAX_CLDFB_DIGEST_CHANNELS]; + int16_t nCldfbTs; + int16_t n; + int16_t nchan_transport; + int32_t ivas_total_brate; + int32_t output_Fs; + ivas_error error; + AUDIO_CONFIG output_config; + + error = IVAS_ERR_OK; + + push_wmops( "ivas_jbm_dec_feed_tc_to_rendererer" ); + output_Fs = st_ivas->hDecoderConfig->output_Fs; + output_config = st_ivas->hDecoderConfig->output_config; + nchan_transport = st_ivas->hTcBuffer->nchan_transport_jbm; + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + + for ( n = 0; n < MAX_CLDFB_DIGEST_CHANNELS; n++ ) + { + p_data_f[n] = &data_f[n][0]; + } + ivas_jbm_dec_copy_tc( st_ivas, nSamplesForRendering, nSamplesResidual, data, p_data_f ); + nCldfbTs = st_ivas->hTcBuffer->n_samples_available / st_ivas->hTcBuffer->n_samples_granularity; + + if ( st_ivas->hTcBuffer->tc_buffer_mode == TC_BUFFER_MODE_BUFFER ) + { + ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); + } + else if ( st_ivas->ivas_format == STEREO_FORMAT ) + { + ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); + } + else if ( st_ivas->ivas_format == ISM_FORMAT ) + { + /* Rendering */ + if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + ivas_dirac_dec_set_md_map( st_ivas, nCldfbTs ); + ivas_param_ism_params_to_masa_param_mapping( st_ivas ); + } + else if ( st_ivas->renderer_type == RENDERER_PARAM_ISM || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + ivas_param_ism_dec_digest_tc( st_ivas, nCldfbTs, p_data_f ); + } + } + else /* ISM_MODE_DISC */ + { + ivas_ism_dec_digest_tc( st_ivas ); + } + } + else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) + { + ivas_sba_dec_digest_tc( st_ivas, nCldfbTs, st_ivas->hTcBuffer->n_samples_available ); + } + else if ( st_ivas->ivas_format == MC_FORMAT ) + { + if ( st_ivas->mc_mode == MC_MODE_MCT ) + { + ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) + { + ivas_param_mc_dec_digest_tc( st_ivas, (uint8_t) nCldfbTs, p_data_f ); + } + else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) + { + ivas_sba_dec_digest_tc( st_ivas, nCldfbTs, st_ivas->hTcBuffer->n_samples_available ); + } + } + + pop_wmops(); + + return error; +} + + +/*--------------------------------------------------------------------------* + * ivas_dec_render() + * + * Principal IVAS rendering routine + *--------------------------------------------------------------------------*/ +ivas_error ivas_jbm_dec_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const uint16_t nSamplesAsked, /* i : number of samples wanted */ + uint16_t *nSamplesRendered, /* o : number of samples rendered */ + uint16_t *nSamplesAvailableNext, /* o : number of samples still available in the rendering pipeline */ + int16_t *data /* o : output synthesis signal */ +) +{ + + int16_t n, nchan_out; + int16_t nchan_transport; + float output[MAX_OUTPUT_CHANNELS][L_FRAME48k]; /* 'float' buffer for output synthesis, MAX_OUTPUT_CHANNELS channels */ /* IVAS_fmToDo: buffer can be allocated dynamically based on the actual number of output channels */ + int16_t nchan_remapped; + int32_t output_Fs, ivas_total_brate; + AUDIO_CONFIG output_config; + int16_t nCldfbTs; + int16_t nSamplesAskedLocal; + ivas_error error; + float *p_output[MAX_OUTPUT_CHANNELS]; + float *p_tc[MAX_TRANSPORT_CHANNELS]; + + error = IVAS_ERR_OK; + + push_wmops( "ivas_dec_render" ); + + /*----------------------------------------------------------------* + * Initialization of local vars after struct has been set + *----------------------------------------------------------------*/ + + output_Fs = st_ivas->hDecoderConfig->output_Fs; + nchan_out = st_ivas->hDecoderConfig->nchan_out; + nchan_transport = st_ivas->hTcBuffer->nchan_transport_jbm; + output_config = st_ivas->hDecoderConfig->output_config; + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + nSamplesAskedLocal = nSamplesAsked + st_ivas->hTcBuffer->n_samples_discard; + nCldfbTs = nSamplesAskedLocal / NS2SA( output_Fs, CLDFB_SLOT_NS ); + for ( n = 0; n < MAX_OUTPUT_CHANNELS; n++ ) + { + p_output[n] = &output[n][0]; + } + + for ( n = 0; n < st_ivas->hTcBuffer->nchan_transport_internal; n++ ) + { + p_tc[n] = &st_ivas->hTcBuffer->tc[n][st_ivas->hTcBuffer->n_samples_rendered]; + } + + /*----------------------------------------------------------------* + * Rendering + *----------------------------------------------------------------*/ + + if ( st_ivas->ivas_format == UNDEFINED_FORMAT ) + { + assert( 0 ); + } + else if ( st_ivas->hTcBuffer->tc_buffer_mode == TC_BUFFER_MODE_BUFFER ) + { + ivas_jbm_dec_tc_buffer_playout( st_ivas, nSamplesAskedLocal, nSamplesRendered, p_output ); + } + else if ( st_ivas->ivas_format == STEREO_FORMAT ) + { + /* Rendering */ + if ( st_ivas->renderer_type == RENDERER_MC ) + { + *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); + ivas_ls_setup_conversion( st_ivas, *nSamplesRendered, p_tc, p_output ); + } + } + else if ( st_ivas->ivas_format == ISM_FORMAT ) + { + /* Rendering */ + if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, st_ivas->nchan_transport, p_output ); + } + else if ( st_ivas->renderer_type == RENDERER_PARAM_ISM || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + ivas_param_ism_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ); + + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + /* Convert CICP19 -> Ambisonics */ + ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, *nSamplesRendered, st_ivas->hOutSetup.ambisonics_order, 0.f ); + } + } + } + else /* ISM_MODE_DISC */ + { + *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); + /* Loudspeaker or Ambisonics rendering */ + if ( st_ivas->renderer_type == RENDERER_TD_PANNING || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + { + /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */ + ivas_ism_render_sf( st_ivas, p_output, *nSamplesRendered ); + } + else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) + { + /* Convert to Ambisonics; used also for ISM->HOA3->binaural rendering */ + ivas_ism2sba_sf( st_ivas->hTcBuffer->tc, p_output, st_ivas->hIsmRendererData, st_ivas->nchan_transport, *nSamplesRendered, st_ivas->hTcBuffer->n_samples_rendered, st_ivas->hIntSetup.ambisonics_order ); + } + + /* Binaural rendering */ + if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) + { + ObjRenderIVASSubframe( st_ivas, p_output, *nSamplesRendered ); + } + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + { + if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, + AUDIO_CONFIG_7_1_4, + AUDIO_CONFIG_BINAURAL_ROOM, + st_ivas->hDecoderConfig, + NULL, + NULL, + NULL, + st_ivas->hTcBuffer, + p_output, + p_output, + *nSamplesRendered, + output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + ivas_binaural_add_LFE( st_ivas, *nSamplesRendered, p_output, p_output ); + } +#ifdef DEBUGGING + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + ivas_binaural_cldfb_sf( st_ivas, *nSamplesRendered, p_output ); + } +#endif + } + } + else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) + { + nchan_remapped = nchan_transport; + /* Loudspeakers, Ambisonics or Binaural rendering */ + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output ); + } + else if ( st_ivas->sba_mode == SBA_MODE_DIRAC || st_ivas->ivas_format == MASA_FORMAT ) + { + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC ) + { + *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); + for ( n = 0; n < nchan_remapped; n++ ) + { + mvr2r( st_ivas->hTcBuffer->tc[n] + st_ivas->hTcBuffer->n_samples_rendered, p_output[n], *nSamplesRendered ); + } + ivas_sba_linear_renderer( p_output, *nSamplesRendered, nchan_remapped, output_config, st_ivas->hOutSetup, st_ivas->hoa_dec_mtx ); + } + else if ( st_ivas->renderer_type == RENDERER_DIRAC ) + { + ivas_dirac_dec_render( st_ivas, nchan_remapped, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ); + } + } + else /* SBA_MODE_SPAR */ + { + ivas_sba_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ); + } + } + else if ( st_ivas->ivas_format == MC_FORMAT ) + { + if ( st_ivas->mc_mode == MC_MODE_MCT ) + { + *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); + if ( st_ivas->transport_config != st_ivas->intern_config && ( st_ivas->intern_config == AUDIO_CONFIG_FOA || st_ivas->intern_config == AUDIO_CONFIG_HOA2 || st_ivas->intern_config == AUDIO_CONFIG_HOA3 ) ) + { + ivas_mc2sba( st_ivas->hTransSetup, p_tc, p_output, *nSamplesRendered, st_ivas->hIntSetup.ambisonics_order, GAIN_LFE ); + } + + /* Rendering */ + if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + { + if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, + st_ivas->intern_config, + st_ivas->hOutSetup.output_config, + st_ivas->hDecoderConfig, + st_ivas->hHeadTrackData, + &st_ivas->hIntSetup, + st_ivas->hEFAPdata, + st_ivas->hTcBuffer, + p_tc, + p_output, + *nSamplesRendered, + output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + ivas_binaural_add_LFE( st_ivas, *nSamplesRendered, st_ivas->hTcBuffer->tc, p_output ); + } + else if ( st_ivas->renderer_type == RENDERER_MC ) + { + *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); + ivas_ls_setup_conversion( st_ivas, *nSamplesRendered, p_tc, p_output ); + } + else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + ivas_mc2sba( st_ivas->hIntSetup, p_tc, p_output, *nSamplesRendered, st_ivas->hOutSetup.ambisonics_order, 0.f ); + } + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) + { + ObjRenderIVASSubframe( st_ivas, p_output, *nSamplesRendered ); + ivas_binaural_add_LFE( st_ivas, *nSamplesRendered, st_ivas->hTcBuffer->tc, p_output ); + } + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) + { + ivas_param_mc_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ); + } + else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) + { + + /* Rendering */ + int16_t offset = st_ivas->hDirAC->slots_rendered * st_ivas->hDirAC->slot_size; + nchan_remapped = st_ivas->nchan_transport; + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output ); + } + else if ( st_ivas->renderer_type == RENDERER_DIRAC || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) /* rendering to CICPxx and Ambisonics */ + { + ivas_dirac_dec_render( st_ivas, nchan_remapped, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ); + + + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + /* we still need to copy the separate channel if available */ + if ( st_ivas->hOutSetup.separateChannelEnabled ) + { + mvr2r( st_ivas->hTcBuffer->tc[LFE_CHANNEL - 1] + offset, output[st_ivas->hOutSetup.separateChannelIndex], *nSamplesRendered ); + } + ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, *nSamplesRendered, st_ivas->hOutSetup.ambisonics_order, 0.f ); + } + else if ( st_ivas->intern_config == AUDIO_CONFIG_5_1 && ( output_config == AUDIO_CONFIG_5_1_2 || output_config == AUDIO_CONFIG_5_1_4 || output_config == AUDIO_CONFIG_7_1 ) ) + { + for ( n = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; n < st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; n++ ) + { + set_zero( output[n], *nSamplesRendered ); + } + } + } + /* copy discrete C and TD LFE from internal TC to output */ + if ( st_ivas->hOutSetup.separateChannelEnabled ) + { + if ( output_config == AUDIO_CONFIG_5_1 || output_config == AUDIO_CONFIG_7_1 || + output_config == AUDIO_CONFIG_5_1_4 || output_config == AUDIO_CONFIG_7_1_4 || + output_config == AUDIO_CONFIG_5_1_2 || ( output_config == AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe > 0 ) ) + { + mvr2r( st_ivas->hTcBuffer->tc[LFE_CHANNEL] + offset, output[LFE_CHANNEL], *nSamplesRendered ); + mvr2r( st_ivas->hTcBuffer->tc[LFE_CHANNEL - 1] + offset, output[st_ivas->hOutSetup.separateChannelIndex], *nSamplesRendered ); + } + else if ( output_config == AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe == 0 ) + { + /* Delay the separated channel to sync with the DirAC rendering */ + mvr2r( st_ivas->hTcBuffer->tc[LFE_CHANNEL - 1] + offset, output[st_ivas->hOutSetup.separateChannelIndex], *nSamplesRendered ); + } + } + } + } + + /*----------------------------------------------------------------* + * Write IVAS output channels + * - compensation for saturation + * - float to integer conversion + *----------------------------------------------------------------*/ + st_ivas->hTcBuffer->n_samples_available -= *nSamplesRendered; + st_ivas->hTcBuffer->n_samples_rendered += *nSamplesRendered; + if ( st_ivas->hTcBuffer->n_samples_discard > 0 ) + { + for ( n = 0; n < MAX_OUTPUT_CHANNELS; n++ ) + { + p_output[n] += st_ivas->hTcBuffer->n_samples_discard; + } + *nSamplesRendered -= st_ivas->hTcBuffer->n_samples_discard; + st_ivas->hTcBuffer->n_samples_discard = 0; + } + + ivas_limiter_dec( st_ivas->hLimiter, p_output, nchan_out, *nSamplesRendered, st_ivas->BER_detect ); + +#ifdef DEBUGGING + st_ivas->noClipping += +#endif + ivas_syn_output( p_output, *nSamplesRendered, nchan_out, data ); + + *nSamplesAvailableNext = st_ivas->hTcBuffer->n_samples_available; + + pop_wmops(); + return error; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_dec_flush_renderer() + * + * Flush samples if renderer granularity changes on a bitrate change + *--------------------------------------------------------------------------*/ +ivas_error ivas_jbm_dec_flush_renderer( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t tc_granularity_new, /* i : new renderer granularity */ + const RENDERER_TYPE renderer_type_old, /* i : old renderer type */ + const AUDIO_CONFIG intern_config_old, /* i : old internal config */ + const IVAS_OUTPUT_SETUP_HANDLE hIntSetupOld, /* i : old internal output setup */ + const MC_MODE mc_mode_old, /* i : old MC mode */ + const ISM_MODE ism_mode_old, /* i : old ISM mode */ + uint16_t *nSamplesRendered, /* o : number of samples flushed */ + int16_t *data /* o : rendered samples */ +) +{ + ivas_error error; + int16_t n_samples_still_available; + int16_t n_slots_still_available; + int16_t n_samples_to_render; + DECODER_TC_BUFFER_HANDLE hTcBuffer; + float output[MAX_CICP_CHANNELS][L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; + float *p_output[MAX_CICP_CHANNELS]; + + error = IVAS_ERR_OK; + + *nSamplesRendered = 0; + hTcBuffer = st_ivas->hTcBuffer; + /* get number of possible slots in new granularity */ + n_samples_still_available = hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered; + n_slots_still_available = n_samples_still_available / tc_granularity_new; + *nSamplesRendered = n_slots_still_available * tc_granularity_new; + n_samples_to_render = *nSamplesRendered; + n_samples_still_available -= n_samples_to_render; + assert( n_samples_still_available < tc_granularity_new ); + if ( n_slots_still_available ) + { + int ch_idx; + /* render what is still there with zero padding */ + for ( ch_idx = 0; ch_idx < hTcBuffer->nchan_buffer_full; ch_idx++ ) + { + /* move it at the beginning of the TC buffer with zero padding */ + mvr2r( hTcBuffer->tc[ch_idx] + hTcBuffer->n_samples_rendered, hTcBuffer->tc[ch_idx], n_samples_to_render ); + set_zero( hTcBuffer->tc[ch_idx] + n_samples_to_render, hTcBuffer->n_samples_granularity - n_samples_to_render ); + mvr2r( hTcBuffer->tc[ch_idx] + hTcBuffer->n_samples_rendered + n_samples_to_render, hTcBuffer->tc[ch_idx] + hTcBuffer->n_samples_granularity, n_samples_still_available ); + } + /* simple change of the slot info */ + hTcBuffer->num_slots = 1; + hTcBuffer->nb_subframes = 1; + hTcBuffer->subframes_rendered = 0; + hTcBuffer->slots_rendered = 0; + hTcBuffer->subframe_nbslots[0] = 1; + hTcBuffer->n_samples_buffered = hTcBuffer->n_samples_granularity + n_samples_still_available; + hTcBuffer->n_samples_available = 0; + hTcBuffer->n_samples_flushed = n_samples_to_render; + hTcBuffer->n_samples_rendered = hTcBuffer->n_samples_granularity; + + for ( ch_idx = 0; ch_idx < MAX_CICP_CHANNELS; ch_idx++ ) + { + p_output[ch_idx] = output[ch_idx]; + } + + if ( st_ivas->ivas_format == ISM_FORMAT ) + { + if ( ism_mode_old == ISM_MODE_DISC ) + { + /* Binaural rendering */ + if ( renderer_type_old == RENDERER_BINAURAL_OBJECTS_TD ) + { + ObjRenderIVASSubframe( st_ivas, p_output, hTcBuffer->n_samples_granularity ); + } + else if ( renderer_type_old == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + { + /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */ + set_f( st_ivas->hIsmRendererData->interpolator, 1.0f, hTcBuffer->n_samples_granularity ); + ivas_ism_render_sf( st_ivas, p_output, hTcBuffer->n_samples_granularity ); + if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, + AUDIO_CONFIG_7_1_4, + AUDIO_CONFIG_BINAURAL_ROOM, + st_ivas->hDecoderConfig, + NULL, + NULL, + NULL, + st_ivas->hTcBuffer, + p_output, + p_output, + hTcBuffer->n_samples_granularity, + st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + ivas_binaural_add_LFE( st_ivas, hTcBuffer->n_samples_granularity, p_output, p_output ); + } + } + else + { + return IVAS_ERROR( IVAS_ERR_WRONG_MODE, "Wrong ISM_MODE in VoIP renderer flushing!" ); + } + } + else if ( st_ivas->ivas_format == MC_FORMAT ) + { + if ( mc_mode_old == MC_MODE_MCT ) + { + if ( renderer_type_old == RENDERER_BINAURAL_MIXER_CONV || renderer_type_old == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + { + if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, + intern_config_old, + st_ivas->hOutSetup.output_config, + st_ivas->hDecoderConfig, + st_ivas->hHeadTrackData, + hIntSetupOld, + st_ivas->hEFAPdata, + st_ivas->hTcBuffer, + hTcBuffer->tc, + p_output, + hTcBuffer->n_samples_granularity, + st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + ivas_binaural_add_LFE( st_ivas, hTcBuffer->n_samples_granularity, st_ivas->hTcBuffer->tc, p_output ); + } + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) + { + ObjRenderIVASSubframe( st_ivas, p_output, hTcBuffer->n_samples_granularity ); + ivas_binaural_add_LFE( st_ivas, hTcBuffer->n_samples_granularity, st_ivas->hTcBuffer->tc, p_output ); + } + } + else + { + return IVAS_ERROR( IVAS_ERR_WRONG_MODE, "Wrong MC_MODE in VoIP renderer flushing!" ); + } + } + else + { + return IVAS_ERROR( IVAS_ERR_WRONG_MODE, "Wrong IVAS format in VoIP renderer flushing!" ); + } + } + + /* Only write out the valid data*/ + ivas_limiter_dec( st_ivas->hLimiter, p_output, st_ivas->hDecoderConfig->nchan_out, *nSamplesRendered, st_ivas->BER_detect ); + +#ifdef DEBUGGING + st_ivas->noClipping += +#endif + ivas_syn_output( p_output, *nSamplesRendered, st_ivas->hDecoderConfig->nchan_out, data ); + + + return error; +} + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_set_discard_samples() + * + * Set number of samples to discard in the first subframe if the renderer granularity changes on a bitrate change + *--------------------------------------------------------------------------*/ +ivas_error ivas_jbm_dec_set_discard_samples( + Decoder_Struct *st_ivas /* i/o: main IVAS decoder structre */ +) +{ + int16_t nMaxSlotsPerSubframe, nSlotsInFirstSubframe; + ivas_error error; + + error = IVAS_ERR_OK; + + /* render first frame with front zero padding and discarding those samples */ + nMaxSlotsPerSubframe = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / st_ivas->hTcBuffer->n_samples_granularity; + nSlotsInFirstSubframe = nMaxSlotsPerSubframe - st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->nb_subframes - 1]; + if ( nSlotsInFirstSubframe > 0 ) + { + st_ivas->hTcBuffer->n_samples_discard = ( nMaxSlotsPerSubframe - nSlotsInFirstSubframe ) * st_ivas->hTcBuffer->n_samples_granularity; + /* set last subframes number to max to ensure correct continuation */ + st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->nb_subframes - 1] = nMaxSlotsPerSubframe; + } + return error; +} + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_get_adapted_linear_interpolator() + * + * Get an interpolator that is adapted to time scale modified IVAS frame + *--------------------------------------------------------------------------*/ + +void ivas_jbm_dec_get_adapted_linear_interpolator( + const int16_t default_interp_length, /* i : default length of the (full-frame) interpolator */ + const int16_t interp_length, /* i : length of the interpolator to be created */ + float *interpolator /* o : the interpolator */ +) +{ + int16_t jbm_segment_len, idx; + float dec; +#ifdef DEBUGGING + assert( default_interp_length % 2 == 0 ); +#endif + + jbm_segment_len = ( default_interp_length >> 1 ); + dec = 1.0f / default_interp_length; + + interpolator[interp_length - 1] = 1.0f; + for ( idx = interp_length - 2; idx >= jbm_segment_len; idx-- ) + { + interpolator[idx] = max( 0.0f, interpolator[idx + 1] - dec ); + } + if ( interpolator[idx + 1] > 0.0f ) + { + dec = interpolator[idx + 1] / ( jbm_segment_len + 1 ); + for ( ; idx >= 0; idx-- ) + { + interpolator[idx] = interpolator[idx + 1] - dec; + } + } + else + { + set_f( interpolator, 0.0f, idx + 1 ); + } +} + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_get_adapted_subframes() + * + * Get an interpolator that is adapted to time scale modified IVAS frame + *--------------------------------------------------------------------------*/ +void ivas_jbm_dec_get_adapted_subframes( + const int16_t nCldfbTs, /* i : number of time slots in the current frame */ + int16_t *subframe_nbslots, /* i/o: subframe grid */ + int16_t *nb_subframes /* i/o: number of subframes in the frame */ +) +{ + uint16_t nSlotsInLastSubframe, nSlotsInFirstSubframe; + uint16_t nCldfbSlotsLocal = nCldfbTs; + /* get last subframe size from previous frame, determine how many slots have to be processed + in the first subframe (i.e. potential leftover of a 5ms subframe) */ + nSlotsInFirstSubframe = ( PARAM_MC_MAX_NSLOTS_IN_SUBFRAME - subframe_nbslots[*nb_subframes - 1] ); + *nb_subframes = 0; + if ( nSlotsInFirstSubframe > 0 ) + { + *nb_subframes = 1; + nCldfbSlotsLocal -= nSlotsInFirstSubframe; + } + *nb_subframes += (int16_t) ceilf( (float) nCldfbSlotsLocal / (float) PARAM_MC_MAX_NSLOTS_IN_SUBFRAME ); + nSlotsInLastSubframe = nCldfbSlotsLocal % PARAM_MC_MAX_NSLOTS_IN_SUBFRAME; + set_s( subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); + set_s( subframe_nbslots, PARAM_MC_MAX_NSLOTS_IN_SUBFRAME, *nb_subframes ); + if ( nSlotsInFirstSubframe > 0 ) + { + subframe_nbslots[0] = nSlotsInFirstSubframe; + } + if ( nSlotsInLastSubframe > 0 ) + { + subframe_nbslots[*nb_subframes - 1] = nSlotsInLastSubframe; + } + return; +} + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_get_adapted_linear_interpolator() + * + * Get an meta data map adapted to a time scale modified IVAS frame + *--------------------------------------------------------------------------*/ +void ivas_jbm_dec_get_md_map( + const int16_t default_len, /* i : default frame length in metadata slots */ + const int16_t len, /* i : length of the modfied frames in metadata slots */ + const int16_t subframe_len, /* i : default length of a subframe */ + const int16_t offset, /* i : current read offset into the md buffer */ + const int16_t buf_len, /* i : length of the metadata buffer */ + int16_t *map /* o : metadata index map */ +) +{ + int16_t jbm_segment_len, map_idx, src_idx, src_idx_map; + float dec, src_idx_f; +#ifdef DEBUGGING + assert( default_len % 2 == 0 ); +#endif + + jbm_segment_len = ( default_len >> 1 ); + dec = 1.0f / default_len; + + + for ( map_idx = len - 1, src_idx = default_len - 1; map_idx >= jbm_segment_len; map_idx--, src_idx-- ) + { + src_idx_map = max( 0, src_idx / subframe_len ); + map[map_idx] = ( offset + src_idx_map ) % buf_len; + } + /* changed part (first segment), interpolate index to parameters + (we do not want to interpolate and smooth acutal direction/diffuseness values even more) */ + if ( src_idx >= 0 ) + { + dec = ( (float) ( src_idx + 1 ) ) / ( (float) jbm_segment_len ); + src_idx_f = (float) ( src_idx + 1 ) - dec; + for ( ; map_idx >= 0; map_idx-- ) + { + src_idx = max( 0, ( (int16_t) round_f( src_idx_f ) ) / subframe_len ); + map[map_idx] = ( offset + src_idx ) % buf_len; + src_idx_f -= dec; + } + } + else + { + set_s( map, offset, map_idx + 1 ); + } +} + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_get_num_tc_channels() + * + * Get the number of transport channels provided by the JBM transport channel decode function + *--------------------------------------------------------------------------*/ +int16_t ivas_jbm_dec_get_num_tc_channels( Decoder_Struct *st_ivas ) /* i : IVAS decoder handle */ +{ + int16_t num_tc; + int32_t ivas_total_brate; + AUDIO_CONFIG output_config; + + if ( st_ivas->renderer_type == RENDERER_DISABLE ) + { + num_tc = st_ivas->hDecoderConfig->nchan_out; + } + else + { + num_tc = st_ivas->nchan_transport; + } + output_config = st_ivas->hDecoderConfig->output_config; + + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + if ( st_ivas->ivas_format == STEREO_FORMAT && st_ivas->hDecoderConfig->nchan_out == 1 ) + { + num_tc = 1; + } + else if ( st_ivas->ivas_format == ISM_FORMAT ) + { + if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX ) + { + num_tc = 1; + } + } + else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) + { + if ( st_ivas->sba_dirac_stereo_flag ) + { + num_tc = CPE_CHANNELS; + } + else if ( st_ivas->ivas_format == MASA_FORMAT && ivas_total_brate < MASA_STEREO_MIN_BITRATE && ( ivas_total_brate > IVAS_SID_5k2 || ( ivas_total_brate <= IVAS_SID_5k2 && st_ivas->nCPE > 0 && st_ivas->hCPE[0]->nchan_out == 1 ) ) ) + { + num_tc = 1; /* Only one channel transported */ + } + + if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL && st_ivas->nchan_transport == 2 && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_SID_5k2 ) + { + num_tc = CPE_CHANNELS; + } + if ( st_ivas->ivas_format == SBA_FORMAT ) + { + if ( ( st_ivas->sba_mode != SBA_MODE_SPAR && st_ivas->sba_planar && num_tc >= 3 ) || + ( ( st_ivas->sba_mode == SBA_MODE_SPAR ) && num_tc == 3 ) ) + { + num_tc++; + } + } + } + else if ( st_ivas->ivas_format == MC_FORMAT ) + { + if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO ) + { + num_tc = 1; + } + else if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) + { + num_tc = 2; + } + else if ( st_ivas->mc_mode == MC_MODE_MCT ) + { + /* do all static dmx already in the TC decoder if less channels than transported... */ + if ( st_ivas->transport_config != st_ivas->intern_config && ( st_ivas->intern_config == AUDIO_CONFIG_FOA || st_ivas->intern_config == AUDIO_CONFIG_HOA2 || st_ivas->intern_config == AUDIO_CONFIG_HOA3 ) ) + { + if ( ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) > ( st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe ) ) + { + num_tc = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; + } + } + else if ( ( st_ivas->renderer_type == RENDERER_MC || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) && ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) >= ( st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe ) ) + { + num_tc = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + } + } + else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) + { + if ( st_ivas->hOutSetup.separateChannelEnabled ) + { + num_tc++; + } + if ( st_ivas->hOutSetup.separateChannelEnabled && ( output_config == AUDIO_CONFIG_5_1 || output_config == AUDIO_CONFIG_7_1 || + output_config == AUDIO_CONFIG_5_1_4 || output_config == AUDIO_CONFIG_7_1_4 || + output_config == AUDIO_CONFIG_5_1_2 || ( output_config == AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe > 0 ) ) ) + { + /* LFE is synthesized in TD with the TCs*/ + num_tc++; + } + } + } + + return num_tc; +} + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_copy_tc() + * + * Copy interleaved transport chnannels to the correct buffers, update the TC + * buffer handle + *--------------------------------------------------------------------------*/ +void ivas_jbm_dec_copy_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t nSamplesForRendering, /* i : number of samples to digest */ + int16_t *nSamplesResidual, /* o : number of samples that will be left for the next frame */ + float *data, /* i : (interleaved) transport channel samples */ + float *tc_digest_f[] /* o : samples that will be directly digestest (eg. by CLDFB) */ +) +{ + int16_t ch; + DECODER_TC_BUFFER_HANDLE hTcBuffer; + int16_t n_samples_still_available, m; + int16_t n_ch_full_copy; + int16_t n_ch_res_copy; + + + hTcBuffer = st_ivas->hTcBuffer; + n_samples_still_available = hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered; + hTcBuffer->n_samples_buffered = n_samples_still_available + nSamplesForRendering + hTcBuffer->n_samples_discard; + hTcBuffer->n_samples_available = hTcBuffer->n_samples_granularity * ( hTcBuffer->n_samples_buffered / hTcBuffer->n_samples_granularity ); + *nSamplesResidual = hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_available; + n_ch_full_copy = min( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); + n_ch_res_copy = hTcBuffer->nchan_transport_jbm - hTcBuffer->nchan_buffer_full; + + for ( ch = 0; ch < n_ch_full_copy; ch++ ) + { + set_zero( hTcBuffer->tc[ch], hTcBuffer->n_samples_discard ); + mvr2r( hTcBuffer->tc[ch] + hTcBuffer->n_samples_rendered, hTcBuffer->tc[ch] + hTcBuffer->n_samples_discard, n_samples_still_available ); + for ( m = 0; m < nSamplesForRendering; m++ ) + { + hTcBuffer->tc[ch][n_samples_still_available + hTcBuffer->n_samples_discard + m] = data[m * st_ivas->hTcBuffer->nchan_transport_jbm + ch]; + } + } + if ( n_ch_res_copy > 0 ) + { + for ( ; ch < hTcBuffer->nchan_transport_jbm; ch++ ) + { + mvr2r( hTcBuffer->tc[ch], tc_digest_f[ch], n_samples_still_available ); + for ( m = 0; m < nSamplesForRendering; m++ ) + { + tc_digest_f[ch][n_samples_still_available + m] = data[m * st_ivas->hTcBuffer->nchan_transport_jbm + ch]; + } + mvr2r( tc_digest_f[ch] + hTcBuffer->n_samples_available, hTcBuffer->tc[ch], *nSamplesResidual ); + } + } + hTcBuffer->n_samples_rendered = 0; + return; +} + + +int16_t ivas_jbm_dec_get_render_granularity( const RENDERER_TYPE rendererType, + const int32_t output_Fs ) +{ + int16_t render_granularity; + + if ( rendererType == RENDERER_BINAURAL_OBJECTS_TD || rendererType == RENDERER_BINAURAL_MIXER_CONV || rendererType == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + { + render_granularity = NS2SA( output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ); + } + else + { + render_granularity = NS2SA( output_Fs, CLDFB_SLOT_NS ); + } + + return render_granularity; +} + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_tc_buffer_open() + * + * open and initialize the transport channel buffer + *--------------------------------------------------------------------------*/ +ivas_error ivas_jbm_dec_tc_buffer_open( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const TC_BUFFER_MODE tc_buffer_mode, /* i : buffer mode */ + const int16_t nchan_transport_jbm, /* i : number of real transport channels */ + const int16_t nchan_transport_internal, /* i : number of totally buffered channels */ + const int16_t nchan_full, /* i : nubmer of channels to fully store */ + const int16_t n_samples_granularity /* i : granularity of the renderer/buffer */ +) +{ + int16_t nsamp_to_allocate; + DECODER_TC_BUFFER_HANDLE hTcBuffer; + ivas_error error; + int16_t nMaxSlotsPerSubframe; + int16_t nchan_residual; + int16_t ch_idx; + + error = IVAS_ERR_OK; + + /*-----------------------------------------------------------------* + * prepare library opening + *-----------------------------------------------------------------*/ + + if ( ( hTcBuffer = (DECODER_TC_BUFFER_HANDLE) malloc( sizeof( DECODER_TC_BUFFER ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TC Buffer\n" ) ); + } + hTcBuffer->tc_buffer_mode = tc_buffer_mode; + hTcBuffer->nchan_transport_jbm = nchan_transport_jbm; + hTcBuffer->nchan_transport_internal = nchan_transport_internal; + hTcBuffer->nchan_buffer_full = nchan_full; + nchan_residual = nchan_transport_internal - nchan_full; + hTcBuffer->n_samples_granularity = n_samples_granularity; + hTcBuffer->n_samples_available = 0; + hTcBuffer->n_samples_buffered = 0; + hTcBuffer->n_samples_rendered = 0; + hTcBuffer->slots_rendered = 0; + hTcBuffer->subframes_rendered = 0; + hTcBuffer->n_samples_discard = 0; + hTcBuffer->n_samples_flushed = 0; + hTcBuffer->nb_subframes = MAX_PARAM_SPATIAL_SUBFRAMES; + nsamp_to_allocate = 0; + nMaxSlotsPerSubframe = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / hTcBuffer->n_samples_granularity; + hTcBuffer->num_slots = nMaxSlotsPerSubframe * MAX_PARAM_SPATIAL_SUBFRAMES; + set_s( hTcBuffer->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); + set_s( hTcBuffer->subframe_nbslots, nMaxSlotsPerSubframe, MAX_PARAM_SPATIAL_SUBFRAMES ); + + if ( hTcBuffer->tc_buffer_mode == TC_BUFFER_MODE_NONE ) + { + hTcBuffer->tc_buffer = NULL; + for ( ch_idx = 0; ch_idx < MAX_TRANSPORT_CHANNELS; ch_idx++ ) + { + hTcBuffer->tc[ch_idx] = NULL; + } + } + else + { + int16_t n_samp_full = ( NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) + hTcBuffer->n_samples_granularity - 1 ); + int16_t n_samp_residual = hTcBuffer->n_samples_granularity - 1; + int32_t offset; + nsamp_to_allocate = hTcBuffer->nchan_buffer_full * n_samp_full; + nsamp_to_allocate += nchan_residual * n_samp_residual; + hTcBuffer->tc_buffer = (float *) malloc( nsamp_to_allocate * sizeof( float ) ); + set_zero( hTcBuffer->tc_buffer, nsamp_to_allocate ); + offset = 0; + for ( ch_idx = 0; ch_idx < hTcBuffer->nchan_buffer_full; ch_idx++ ) + { + hTcBuffer->tc[ch_idx] = &hTcBuffer->tc_buffer[offset]; + offset += n_samp_full; + } + for ( ; ch_idx < hTcBuffer->nchan_transport_internal; ch_idx++ ) + { + hTcBuffer->tc[ch_idx] = &hTcBuffer->tc_buffer[offset]; + offset += n_samp_residual; + } + for ( ; ch_idx < MAX_TRANSPORT_CHANNELS; ch_idx++ ) + { + hTcBuffer->tc[ch_idx] = NULL; + } + } + + st_ivas->hTcBuffer = hTcBuffer; + return error; +} + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_tc_buffer_reconfigure() + * + * open and initialize the transport channel buffer + *--------------------------------------------------------------------------*/ +ivas_error ivas_jbm_dec_tc_buffer_reconfigure( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const TC_BUFFER_MODE tc_buffer_mode, /* i : new buffer mode */ + const int16_t nchan_transport_jbm, /* i : new number of real transport channels */ + const int16_t nchan_transport_internal, /* i : new number of totally buffered channels */ + const int16_t nchan_full, /* i : new number of channels to fully store */ + const int16_t n_samples_granularity /* i : new granularity of the renderer/buffer */ +) +{ + ivas_error error; + int16_t nsamp_to_allocate, n_samp_full, n_samp_residual, offset, nchan_residual; + int16_t ch_idx; + DECODER_TC_BUFFER_HANDLE hTcBuffer; + + error = IVAS_ERR_OK; + + hTcBuffer = st_ivas->hTcBuffer; + + /* if granularity changes, adapt subframe_nb_slots */ + if ( n_samples_granularity != hTcBuffer->n_samples_granularity ) + { +#ifdef DEBUGGING + int16_t nMaxSlotsPerSubframeOld; +#endif + int16_t nMaxSlotsPerSubframeNew; + + nMaxSlotsPerSubframeNew = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / n_samples_granularity; +#ifdef DEBUGGING + nMaxSlotsPerSubframeOld = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / st_ivas->hTcBuffer->n_samples_granularity; + assert( hTcBuffer->subframe_nbslots[hTcBuffer->subframes_rendered - 1] == nMaxSlotsPerSubframeOld ); + if ( n_samples_granularity < hTcBuffer->n_samples_granularity ) + { + assert( ( hTcBuffer->n_samples_granularity % n_samples_granularity ) == 0 ); + } + else + { + assert( ( n_samples_granularity % hTcBuffer->n_samples_granularity ) == 0 ); + } +#endif + /* if samples were flushed, take that into account here */ + if ( n_samples_granularity < hTcBuffer->n_samples_granularity && hTcBuffer->n_samples_flushed > 0 ) + { + hTcBuffer->subframe_nbslots[hTcBuffer->subframes_rendered - 1] = hTcBuffer->n_samples_flushed / n_samples_granularity; + hTcBuffer->n_samples_flushed = 0; + } + else + { + hTcBuffer->subframe_nbslots[hTcBuffer->subframes_rendered - 1] = nMaxSlotsPerSubframeNew; + } + } + + hTcBuffer->tc_buffer_mode = tc_buffer_mode; + hTcBuffer->nchan_transport_jbm = nchan_transport_jbm; + hTcBuffer->nchan_transport_internal = nchan_transport_internal; + hTcBuffer->nchan_buffer_full = nchan_full; + nchan_residual = nchan_transport_internal - nchan_full; + hTcBuffer->n_samples_granularity = n_samples_granularity; + /* what is remaining from last frames needs always be smaller than n_samples_granularity */ + assert( ( hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered ) < n_samples_granularity ); + + /* realloc buffers */ + free( hTcBuffer->tc_buffer ); + n_samp_full = ( NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) + hTcBuffer->n_samples_granularity - 1 ); + n_samp_residual = hTcBuffer->n_samples_granularity - 1; + nsamp_to_allocate = hTcBuffer->nchan_buffer_full * n_samp_full; + nsamp_to_allocate += nchan_residual * n_samp_residual; + hTcBuffer->tc_buffer = (float *) malloc( nsamp_to_allocate * sizeof( float ) ); + set_zero( hTcBuffer->tc_buffer, nsamp_to_allocate ); + offset = 0; + for ( ch_idx = 0; ch_idx < hTcBuffer->nchan_buffer_full; ch_idx++ ) + { + hTcBuffer->tc[ch_idx] = &hTcBuffer->tc_buffer[offset]; + offset += n_samp_full; + } + for ( ; ch_idx < hTcBuffer->nchan_transport_internal; ch_idx++ ) + { + hTcBuffer->tc[ch_idx] = &hTcBuffer->tc_buffer[offset]; + offset += n_samp_residual; + } + for ( ; ch_idx < MAX_TRANSPORT_CHANNELS; ch_idx++ ) + { + hTcBuffer->tc[ch_idx] = NULL; + } + + return error; +} + +void ivas_jbm_dec_tc_buffer_playout( + Decoder_Struct *st_ivas, + const uint16_t nSamplesAsked, + uint16_t *nSamplesRendered, + float *output[] ) +{ + + int16_t ch_idx, slot_size, slots_to_render, first_sf, last_sf; + + slot_size = st_ivas->hTcBuffer->n_samples_granularity; + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + slots_to_render = min( st_ivas->hTcBuffer->num_slots - st_ivas->hTcBuffer->slots_rendered, nSamplesAsked / slot_size ); + st_ivas->hTcBuffer->slots_rendered += slots_to_render; + *nSamplesRendered = (uint16_t) slots_to_render * slot_size; + first_sf = st_ivas->hTcBuffer->subframes_rendered; + last_sf = first_sf; + while ( slots_to_render > 0 ) + { + slots_to_render -= st_ivas->hTcBuffer->subframe_nbslots[last_sf]; + last_sf++; + } + for ( ch_idx = 0; ch_idx < st_ivas->hTcBuffer->nchan_transport_jbm; ch_idx++ ) + { + mvr2r( st_ivas->hTcBuffer->tc[ch_idx] + st_ivas->hTcBuffer->n_samples_rendered, output[ch_idx], *nSamplesRendered ); + } + + st_ivas->hTcBuffer->subframes_rendered = last_sf; +} + +void ivas_jbm_dec_tc_buffer_close( + DECODER_TC_BUFFER_HANDLE *phTcBuffer /* i/o: TC buffer handle */ +) +{ + int16_t i; + + if ( *phTcBuffer != NULL ) + { + for ( i = 0; i < MAX_TRANSPORT_CHANNELS; i++ ) + { + ( *phTcBuffer )->tc[i] = NULL; + } + if ( ( *phTcBuffer )->tc_buffer != NULL ) + { + free( ( *phTcBuffer )->tc_buffer ); + ( *phTcBuffer )->tc_buffer = NULL; + } + + free( *phTcBuffer ); + *phTcBuffer = NULL; + } + return; +} + +void ivas_jbm_dec_td_renderers_adapt_subframes( + Decoder_Struct *st_ivas ) +{ + int16_t nMaxSlotsPerSubframe, nSlotsAvailable; + uint16_t nSlotsInLastSubframe, nSlotsInFirstSubframe; + nMaxSlotsPerSubframe = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / st_ivas->hTcBuffer->n_samples_granularity; + nSlotsAvailable = st_ivas->hTcBuffer->n_samples_available / st_ivas->hTcBuffer->n_samples_granularity; + st_ivas->hTcBuffer->num_slots = nSlotsAvailable; + st_ivas->hTcBuffer->n_samples_available = nSlotsAvailable * st_ivas->hTcBuffer->n_samples_granularity; + nSlotsInFirstSubframe = nMaxSlotsPerSubframe - st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->nb_subframes - 1]; + st_ivas->hTcBuffer->nb_subframes = 0; + if ( nSlotsInFirstSubframe > 0 ) + { + st_ivas->hTcBuffer->nb_subframes = 1; + nSlotsAvailable -= nSlotsInFirstSubframe; + } + st_ivas->hTcBuffer->nb_subframes += (int16_t) ceilf( (float) nSlotsAvailable / (float) nMaxSlotsPerSubframe ); + nSlotsInLastSubframe = nSlotsAvailable % nMaxSlotsPerSubframe; + set_s( st_ivas->hTcBuffer->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); + set_s( st_ivas->hTcBuffer->subframe_nbslots, nMaxSlotsPerSubframe, st_ivas->hTcBuffer->nb_subframes ); + if ( nSlotsInFirstSubframe > 0 ) + { + st_ivas->hTcBuffer->subframe_nbslots[0] = nSlotsInFirstSubframe; + } + if ( nSlotsInLastSubframe > 0 ) + { + st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->nb_subframes - 1] = nSlotsInLastSubframe; + } + st_ivas->hTcBuffer->slots_rendered = 0; + st_ivas->hTcBuffer->subframes_rendered = 0; +} + +TC_BUFFER_MODE ivas_jbm_dec_get_tc_buffer_mode( Decoder_Struct *st_ivas ) +{ + TC_BUFFER_MODE buffer_mode; + buffer_mode = TC_BUFFER_MODE_BUFFER; + + /*:TODO: wrap this maybe nicer without directly accessing the st_ivas struct...*/ + switch ( st_ivas->renderer_type ) + { + /* all renderers where we are done after TC decoding (might include DMX to mono/stereo */ + case RENDERER_DISABLE: + case RENDERER_MCMASA_MONO_STEREO: + case RENDERER_MONO_DOWNMIX: + buffer_mode = TC_BUFFER_MODE_BUFFER; + break; + case RENDERER_TD_PANNING: + case RENDERER_BINAURAL_OBJECTS_TD: + case RENDERER_BINAURAL_FASTCONV: + case RENDERER_BINAURAL_FASTCONV_ROOM: + case RENDERER_BINAURAL_PARAMETRIC: + case RENDERER_BINAURAL_PARAMETRIC_ROOM: + case RENDERER_STEREO_PARAMETRIC: + case RENDERER_DIRAC: + case RENDERER_PARAM_ISM: + case RENDERER_BINAURAL_MIXER_CONV: + case RENDERER_BINAURAL_MIXER_CONV_ROOM: + buffer_mode = TC_BUFFER_MODE_RENDERER; + break; + case RENDERER_MC_PARAMMC: + if ( st_ivas->hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { + buffer_mode = TC_BUFFER_MODE_BUFFER; /* TCs are already the DMX to mono or stereo */ + } + else + { + buffer_mode = TC_BUFFER_MODE_RENDERER; + } + break; + case RENDERER_MC: + if ( ivas_jbm_dec_get_num_tc_channels( st_ivas ) != st_ivas->hDecoderConfig->nchan_out ) + { + buffer_mode = TC_BUFFER_MODE_RENDERER; + } + break; + case RENDERER_SBA_LINEAR_ENC: + if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT && ( st_ivas->renderer_type == RENDERER_MC || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) && ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) >= ( st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe ) ) + { + buffer_mode = TC_BUFFER_MODE_BUFFER; + } + else + { + buffer_mode = TC_BUFFER_MODE_RENDERER; + } + break; + case RENDERER_SBA_LINEAR_DEC: + if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) ) + { + buffer_mode = TC_BUFFER_MODE_BUFFER; + } + else + { + buffer_mode = TC_BUFFER_MODE_RENDERER; + } + break; +#ifdef DEBUGGING + default: + assert( 0 ); +#endif + } + + + return buffer_mode; +} +#endif diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 9cadbcc4fc..549cf48932 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -371,6 +371,21 @@ ivas_error ivas_masa_dec_open( st_ivas->hMasa = hMasa; +#ifdef JBM_TSM_ON_TCS + /* allocate transport channels*/ + if ( st_ivas->hDecoderConfig->voip_active == 1 && st_ivas->hTcBuffer == NULL && st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && st_ivas->renderer_type != RENDERER_STEREO_PARAMETRIC ) + { + int16_t nchan_to_allocate; + error; + + nchan_to_allocate = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, nchan_to_allocate, nchan_to_allocate, nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } +#endif /* JBM_TMS_ON_TCS*/ + return error; } @@ -1143,6 +1158,17 @@ ivas_error ivas_masa_dec_reconfigure( ivas_masa_set_elements( ivas_total_brate, st_ivas->mc_mode, st_ivas->nchan_transport, st_ivas->hQMetaData, &tmp, &tmp, &tmp ); + if ( st_ivas->hDecoderConfig->voip_active == 1 && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && st_ivas->renderer_type != RENDERER_STEREO_PARAMETRIC ) + { + int16_t nchan_to_allocate = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + if ( nchan_to_allocate != st_ivas->hTcBuffer->nchan_transport_jbm ) + { + if ( ( error = ivas_jbm_dec_tc_buffer_reconfigure( st_ivas, TC_BUFFER_MODE_RENDERER, nchan_to_allocate, nchan_to_allocate, nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + { + } + } + } + return error; } @@ -1152,6 +1178,252 @@ ivas_error ivas_masa_dec_reconfigure( * * Determine MASA metadata from the SPAR metadata *-------------------------------------------------------------------*/ +#ifdef JBM_TSM_ON_TCS +void ivas_spar_param_to_masa_param_mapping_sf( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ + int16_t azimuth[][CLDFB_NO_CHANNELS_MAX], + int16_t elevation[][CLDFB_NO_CHANNELS_MAX], + float energy_ratio1[][CLDFB_NO_CHANNELS_MAX], + float spreadCoherence[][CLDFB_NO_CHANNELS_MAX], + float surroundingCoherence[][CLDFB_NO_CHANNELS_MAX], + float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ + float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /* i : Input audio in CLDFB domain, imag */ +) +{ + int16_t i, j, sf, band, bin, slot, ch, nBins, nchan_transport; + int16_t mixer_mat_index; + DIRAC_DEC_HANDLE hDirAC; + SPAR_DEC_HANDLE hSpar; + DIFFUSE_DISTRIBUTION_HANDLE hDiffuseDist; + float mixer_mat_sf_bands_real[SPAR_DIRAC_SPLIT_START_BAND][FOA_CHANNELS][FOA_CHANNELS]; + float mixer_mat_sf_bins_real[CLDFB_NO_CHANNELS_MAX][FOA_CHANNELS][FOA_CHANNELS]; + int16_t *band_grouping; + int16_t band_start, band_end; + float transportSignalEnergies[2][CLDFB_NO_CHANNELS_MAX]; + float transportSignalCrossCorrelation[CLDFB_NO_CHANNELS_MAX]; + float instEne; + float inCovarianceMtx[FOA_CHANNELS][FOA_CHANNELS]; + float foaCovarianceMtx[FOA_CHANNELS][FOA_CHANNELS]; + float Iy, Iz, Ix, E, azi, ele, I, ratio; + float diffuseGainX, diffuseGainY, diffuseGainZ, diffuseGainSum; + int16_t slot_idx_start; + int16_t slot_idx; + float slot_fac; + int16_t subframe_idx; + + + /* Set values */ + hDirAC = st_ivas->hDirAC; + hSpar = st_ivas->hSpar; + hDirAC->numSimultaneousDirections = 1; + hDiffuseDist = st_ivas->hDirAC->hDiffuseDist; + nchan_transport = st_ivas->nchan_transport; + band_grouping = hDirAC->band_grouping; + subframe_idx = hSpar->subframes_rendered; + slot_idx_start = hSpar->slots_rendered; + + /* Init arrays */ + for ( i = 0; i < FOA_CHANNELS; i++ ) + { + set_zero( inCovarianceMtx[i], FOA_CHANNELS ); + } + for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ ) + { + for ( i = 0; i < FOA_CHANNELS; i++ ) + { + for ( j = 0; j < FOA_CHANNELS; j++ ) + { + mixer_mat_sf_bands_real[band][i][j] = 0.0f; + } + } + } + + slot_fac = 1.0f / (float) hSpar->subframe_nbslots[subframe_idx]; + + /* Delay the SPAR mixing matrices to have them synced with the audio */ + for ( slot_idx = 0; slot_idx < hSpar->subframe_nbslots[subframe_idx]; slot_idx++ ) + { + sf = hSpar->render_to_md_slot_map[slot_idx + slot_idx_start] / JBM_CLDFB_SLOTS_IN_SUBFRAME; + if ( sf < SPAR_META_DELAY_SUBFRAMES ) + { + mixer_mat_index = sf + MAX_PARAM_SPATIAL_SUBFRAMES - SPAR_META_DELAY_SUBFRAMES + 1; + for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ ) + { + for ( i = 0; i < FOA_CHANNELS; i++ ) + { + for ( j = 0; j < FOA_CHANNELS; j++ ) + { + mixer_mat_sf_bands_real[band][i][j] += slot_fac * st_ivas->hSpar->hMdDec->mixer_mat_prev[mixer_mat_index][i][j][band]; + } + } + } + } + else + { + mixer_mat_index = sf - SPAR_META_DELAY_SUBFRAMES; + for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ ) + { + for ( i = 0; i < FOA_CHANNELS; i++ ) + { + for ( j = 0; j < FOA_CHANNELS; j++ ) + { + mixer_mat_sf_bands_real[band][i][j] += slot_fac * st_ivas->hSpar->hMdDec->mixer_mat[i][j][band + mixer_mat_index * IVAS_MAX_NUM_BANDS]; + } + } + } + } + } + + /* Map the mixing matrices from the frequency bands to frequency bins */ + bin = 0; + + for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ ) + { + band_start = band_grouping[band]; + band_end = band_grouping[band + 1]; + for ( bin = band_start; bin < band_end; bin++ ) + { + for ( i = 0; i < FOA_CHANNELS; i++ ) + { + for ( j = 0; j < FOA_CHANNELS; j++ ) + { + mixer_mat_sf_bins_real[bin][i][j] = mixer_mat_sf_bands_real[band][i][j]; + } + } + } + } + + nBins = bin; + + + /* Determine MASA metadata */ + + /* Determine transport signal energies and cross correlations when more than 1 TC */ + if ( nchan_transport == 2 ) + { + set_zero( transportSignalEnergies[0], nBins ); + set_zero( transportSignalEnergies[1], nBins ); + set_zero( transportSignalCrossCorrelation, nBins ); + for ( slot = 0; slot < hDirAC->subframe_nbslots[subframe_idx]; slot++ ) + + { + for ( bin = 0; bin < nBins; bin++ ) + { + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + instEne = ( inRe[ch][slot][bin] * inRe[ch][slot][bin] ); + instEne += ( inIm[ch][slot][bin] * inIm[ch][slot][bin] ); + transportSignalEnergies[ch][bin] += instEne; + } + transportSignalCrossCorrelation[bin] += inRe[0][slot][bin] * inRe[1][slot][bin]; + transportSignalCrossCorrelation[bin] += inIm[0][slot][bin] * inIm[1][slot][bin]; + } + } + } + + if ( hDiffuseDist != NULL ) + { + set_zero( hDiffuseDist->diffuseRatioX[0], CLDFB_NO_CHANNELS_MAX ); + set_zero( hDiffuseDist->diffuseRatioY[0], CLDFB_NO_CHANNELS_MAX ); + set_zero( hDiffuseDist->diffuseRatioZ[0], CLDFB_NO_CHANNELS_MAX ); + } + + for ( bin = 0; bin < nBins; bin++ ) + { + /* Set the energy of the first transport signal */ + if ( nchan_transport == 1 ) + { + inCovarianceMtx[0][0] = 1.0f; /* In case of 1TC, fixed value can be used */ + } + else + { + inCovarianceMtx[0][0] = transportSignalEnergies[0][bin]; /* In case of 2TC, use actual energies */ + } + /* Decorrelated channels assumed to have the same energy as the source channel */ + inCovarianceMtx[1][1] = inCovarianceMtx[0][0]; + inCovarianceMtx[2][2] = inCovarianceMtx[0][0]; + inCovarianceMtx[3][3] = inCovarianceMtx[0][0]; + + /* In case residuals were transmitted, use their actual energies and cross correlations */ + if ( nchan_transport == 2 ) + { + inCovarianceMtx[1][1] = transportSignalEnergies[1][bin]; + inCovarianceMtx[0][1] = transportSignalCrossCorrelation[bin]; + inCovarianceMtx[1][0] = inCovarianceMtx[0][1]; + } + + compute_foa_cov_matrix( foaCovarianceMtx, inCovarianceMtx, mixer_mat_sf_bins_real[bin] ); + + /* Estimate MASA metadata */ + Iy = foaCovarianceMtx[0][1]; /* Intensity in Y direction */ + Iz = foaCovarianceMtx[0][2]; /* Intensity in Z direction */ + Ix = foaCovarianceMtx[0][3]; /* Intensity in X direction */ + I = sqrtf( Ix * Ix + Iy * Iy + Iz * Iz ); /* Intensity vector length */ + E = ( foaCovarianceMtx[0][0] + foaCovarianceMtx[1][1] + foaCovarianceMtx[2][2] + foaCovarianceMtx[3][3] ) / 2.0f; /* Overall energy */ + azi = atan2f( Iy, Ix ); /* Azimuth */ + ele = atan2f( Iz, sqrtf( Ix * Ix + Iy * Iy ) ); /* Elevation */ + ratio = I / fmaxf( 1e-12f, E ); /* Energy ratio */ + ratio = fmaxf( 0.0f, fminf( 1.0f, ratio ) ); + + azimuth[0][bin] = (int16_t) roundf( azi / PI_OVER_180 ); + elevation[0][bin] = (int16_t) roundf( ele / PI_OVER_180 ); + energy_ratio1[0][bin] = ratio; + + spreadCoherence[0][bin] = 0.0f; + surroundingCoherence[0][bin] = 0.0f; + + /* Determine directional distribution of the indirect audio based on the SPAR mixing matrices (and the transport audio signals when 2 TC) */ + if ( hDiffuseDist != NULL ) + { + if ( nchan_transport == 1 ) + { + diffuseGainY = fabsf( mixer_mat_sf_bins_real[bin][1][1] ); + diffuseGainX = fabsf( mixer_mat_sf_bins_real[bin][3][2] ); + diffuseGainZ = fabsf( mixer_mat_sf_bins_real[bin][2][3] ); + } + else if ( nchan_transport == 2 ) + { + diffuseGainY = fabsf( mixer_mat_sf_bins_real[bin][1][1] * transportSignalEnergies[1][bin] ); + diffuseGainX = fabsf( mixer_mat_sf_bins_real[bin][3][2] * transportSignalEnergies[0][bin] ) + fabsf( mixer_mat_sf_bins_real[bin][3][1] * transportSignalEnergies[1][bin] ); + diffuseGainZ = fabsf( mixer_mat_sf_bins_real[bin][2][3] * transportSignalEnergies[0][bin] ) + fabsf( mixer_mat_sf_bins_real[bin][2][1] * transportSignalEnergies[1][bin] ); + } + else + { + diffuseGainY = 1.0f; + diffuseGainX = 1.0f; + diffuseGainZ = 1.0f; + } + + diffuseGainSum = diffuseGainY + diffuseGainX + diffuseGainZ; + + if ( diffuseGainSum == 0.0f ) + { + hDiffuseDist->diffuseRatioX[0][bin] = 1.0f / 3.0f; + hDiffuseDist->diffuseRatioY[0][bin] = 1.0f / 3.0f; + hDiffuseDist->diffuseRatioZ[0][bin] = 1.0f / 3.0f; + } + else + { + hDiffuseDist->diffuseRatioX[0][bin] = diffuseGainX / ( diffuseGainSum + EPSILON ); + hDiffuseDist->diffuseRatioY[0][bin] = diffuseGainY / ( diffuseGainSum + EPSILON ); + hDiffuseDist->diffuseRatioZ[0][bin] = diffuseGainZ / ( diffuseGainSum + EPSILON ); + } + } + } + + for ( slot_idx = 1; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) + { + mvs2s( azimuth[0], azimuth[slot_idx], nBins ); + mvs2s( elevation[0], elevation[slot_idx], nBins ); + mvr2r( spreadCoherence[0], spreadCoherence[slot_idx], nBins ); + mvr2r( surroundingCoherence[0], surroundingCoherence[slot_idx], nBins ); + mvr2r( energy_ratio1[0], energy_ratio1[slot_idx], nBins ); + } + + + return; +} +#endif void ivas_spar_param_to_masa_param_mapping( Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ @@ -1177,6 +1449,9 @@ void ivas_spar_param_to_masa_param_mapping( float foaCovarianceMtx[FOA_CHANNELS][FOA_CHANNELS]; float Iy, Iz, Ix, E, azi, ele, I, ratio; float diffuseGainX, diffuseGainY, diffuseGainZ, diffuseGainSum; +#ifdef JBM_TSM_ON_TCS + int16_t slot_idx_start; +#endif /* Set values */ hDirAC = st_ivas->hDirAC; @@ -1247,6 +1522,10 @@ void ivas_spar_param_to_masa_param_mapping( } nBins = bin; +#ifdef JBM_TSM_ON_TCS + slot_idx_start = st_ivas->hSpar->slots_rendered; +#endif + /* Determine MASA metadata */ for ( sf = firstSubframe; sf < ( firstSubframe + nSubframes ); sf++ ) { @@ -1256,10 +1535,17 @@ void ivas_spar_param_to_masa_param_mapping( set_zero( transportSignalEnergies[0], nBins ); set_zero( transportSignalEnergies[1], nBins ); set_zero( transportSignalCrossCorrelation, nBins ); - - for ( slot = 0; slot < hDirAC->subframe_nbslots; slot++ ) +#ifdef JBM_TSM_ON_TCS + for ( slot = 0; slot < (uint8_t) hDirAC->subframe_nbslots[sf]; slot++ ) +#else + for ( slot = 0; slot < (uint8_t) hDirAC->subframe_nbslots; slot++ ) +#endif { +#ifdef JBM_TSM_ON_TCS + int16_t slotThis = slot + slot_idx_start; +#else int16_t slotThis = slot + ( hDirAC->subframe_nbslots * sf ); +#endif for ( bin = 0; bin < nBins; bin++ ) { @@ -1367,6 +1653,9 @@ void ivas_spar_param_to_masa_param_mapping( } dirac_write_idx = ( dirac_write_idx + 1 ) % hDirAC->dirac_md_buffer_length; +#ifdef JBM_TSM_ON_TCS + slot_idx_start += st_ivas->hSpar->subframe_nbslots[sf]; +#endif } return; diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index a6637ed1f2..f75c5fa830 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -76,7 +76,11 @@ typedef struct parameter_band_mapping_struct static void ivas_param_mc_dec_init( PARAM_MC_DEC_HANDLE hParamMC, const int16_t nchan_in, const int16_t nchan_out ); +#ifdef JBM_TSM_ON_TCS +static void param_mc_protoSignalComputation( float *RealBuffer, float *ImagBuffer, float *proto_frame_f, const PARAM_MC_DIFF_PROTO_INFO *diff_proto_info, const int16_t num_freq_bands ); +#else static void param_mc_protoSignalComputation( float RealBuffer[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], float ImagBuffer[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], float *proto_frame_f, const PARAM_MC_DIFF_PROTO_INFO *diff_proto_info, const int16_t slot_index, const int16_t num_freq_bands ); +#endif static void ivas_param_mc_dec_copy_diffuse_proto( PARAM_MC_DEC_HANDLE hParamMC, float Cldfb_buffer_real[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float Cldfb_buffer_imag[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nY, const int16_t slot_idx ); @@ -86,13 +90,23 @@ static int16_t ivas_param_mc_uniform_decoder( float *seq, const int16_t sz_seq, static void ivas_param_mc_dequantize_cov( PARAM_MC_DEC_HANDLE hDirAC, float *ild_q, float *icc_q, const int16_t param_band_index, const int16_t nY_int, const PARAM_MC_SYNTHESIS_CONF synth_conf, const int16_t nY, const int16_t nX, float *Cx_state, float *Cproto, float *Cy_state ); +#ifdef JBM_TSM_ON_TCS +static void ivas_param_mc_get_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, IVAS_OUTPUT_SETUP *hSynthesisOutputSetup, float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], float *mixing_matrix[], float *mixing_matrix_res[], const int16_t nY_int, const PARAM_MC_SYNTHESIS_CONF synth_conf, const int16_t nX, const int16_t nY ); + +static void ivas_param_mc_get_mono_stereo_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], float *mixing_matrix[], float *mixing_matrix_res[], const int16_t nY_intern, const int16_t nX, const int16_t nY_cov ); +#else static void ivas_param_mc_get_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, IVAS_OUTPUT_SETUP *hSynthesisOutputSetup, float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], const int16_t nY_int, const PARAM_MC_SYNTHESIS_CONF synth_conf, const int16_t nX, const int16_t nY ); static void ivas_param_mc_get_mono_stereo_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], const int16_t nY_intern, const int16_t nX, const int16_t nY_cov ); +#endif +#ifdef JBM_TSM_ON_TCS +static void param_mc_update_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, float *mixing_matrix[], float *mixing_matrix_res[], const uint16_t nX, const uint16_t nY ); +#else static void param_mc_update_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], const uint16_t nX, const uint16_t nY ); +#endif -static void param_mc_compute_interpolator( const uint16_t bAttackPresent, const uint16_t attackPos, const uint16_t interp_length, float *interpolator ); +static void ivas_param_mc_dec_compute_interpolator( const uint16_t bAttackPresent, const uint16_t attackPos, const uint16_t interp_length, float *interpolator ); static void param_mc_set_num_synth_bands( const int32_t output_Fs, PARAM_MC_DEC_HANDLE hParamMC ); @@ -224,7 +238,13 @@ ivas_error ivas_param_mc_dec_open( *-----------------------------------------------------------------*/ hParamMC->slot_size = (int16_t) ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX; +#ifdef JBM_TSM_ON_TCS + set_s( hParamMC->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); + set_s( hParamMC->subframe_nbslots, PARAM_MC_MAX_NSLOTS_IN_SUBFRAME, DEFAULT_JBM_SUBFRAMES_5MS ); + hParamMC->nb_subframes = DEFAULT_JBM_SUBFRAMES_5MS; +#else hParamMC->subframe_nbslots = CLDFB_NO_COL_MAX / PARAM_MC_NSUBFRAMES_DEC; +#endif hParamMC->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); hParamMC->max_band_energy_compensation = hParamMC->num_freq_bands; @@ -455,6 +475,30 @@ ivas_error ivas_param_mc_dec_open( ivas_param_mc_dec_init( hParamMC, nchan_transport, nchan_out_cov ); +#ifdef JBM_TSM_ON_TCS + if ( st_ivas->hDecoderConfig->voip_active && hParamMC->synthesis_conf != PARAM_MC_SYNTH_MONO_STEREO ) + { + hParamMC->Cldfb_RealBuffer_tc = (float *) malloc( MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hParamMC->num_freq_bands * sizeof( float ) ); + set_zero( hParamMC->Cldfb_RealBuffer_tc, MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hParamMC->num_freq_bands ); + hParamMC->Cldfb_ImagBuffer_tc = (float *) malloc( MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hParamMC->num_freq_bands * sizeof( float ) ); + set_zero( hParamMC->Cldfb_ImagBuffer_tc, MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hParamMC->num_freq_bands ); + if ( st_ivas->hTcBuffer == NULL ) + { + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, nchan_transport, nchan_transport, 0, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else + { + hParamMC->Cldfb_RealBuffer_tc = NULL; + hParamMC->Cldfb_ImagBuffer_tc = NULL; + } + hParamMC->subframes_rendered = 0; + hParamMC->slots_rendered = 0; +#endif + st_ivas->hParamMC = hParamMC; return error; @@ -597,12 +641,14 @@ ivas_error ivas_param_mc_dec_reconfig( #endif } - /*-----------------------------------------------------------------* - * set input parameters - *-----------------------------------------------------------------*/ + /*-----------------------------------------------------------------* + * set input parameters + *-----------------------------------------------------------------*/ +#ifndef JBM_TSM_ON_TCS hParamMC->slot_size = (int16_t) ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX; hParamMC->subframe_nbslots = CLDFB_NO_COL_MAX / PARAM_MC_NSUBFRAMES_DEC; +#endif hParamMC->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); hParamMC->max_band_energy_compensation = hParamMC->num_freq_bands; @@ -1124,6 +1170,19 @@ void ivas_param_mc_dec_close( hParamMC->hoa_encoder = NULL; } +#ifdef JBM_TSM_ON_TCS + if ( hParamMC->Cldfb_RealBuffer_tc != NULL ) + { + free( hParamMC->Cldfb_RealBuffer_tc ); + hParamMC->Cldfb_RealBuffer_tc = NULL; + } + if ( hParamMC->Cldfb_ImagBuffer_tc != NULL ) + { + free( hParamMC->Cldfb_ImagBuffer_tc ); + hParamMC->Cldfb_ImagBuffer_tc = NULL; + } +#endif + free( *hParamMC_out ); *hParamMC_out = NULL; @@ -1241,7 +1300,9 @@ void ivas_param_mc_dec_read_BS( num_lfe_bands = 0; } - param_mc_compute_interpolator( hMetadataPMC->bAttackPresent, hMetadataPMC->attackIndex, PARAM_MC_MAX_NSLOTS, hParamMC->h_output_synthesis_params.interpolator ); +#ifndef JBM_TSM_ON_TCS + ivas_param_mc_dec_compute_interpolator( hMetadataPMC->bAttackPresent, hMetadataPMC->attackIndex, PARAM_MC_MAX_NSLOTS, hParamMC->h_output_synthesis_params.interpolator ); +#endif if ( hMetadataPMC->flag_use_adaptive_icc_map == 1 ) { @@ -1335,6 +1396,150 @@ void ivas_param_mc_dec_read_BS( return; } +#ifdef JBM_TSM_ON_TCS +void ivas_param_mc_dec_digest_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint8_t nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ + float *transport_channels_f[] /* i : synthesized core-coder transport channels/DirAC output */ +) +{ + PARAM_MC_DEC_HANDLE hParamMC; + int16_t i, ch; + int16_t slot_idx, param_band_idx; + int16_t nchan_transport, nchan_out_transport, nchan_out_cldfb; + int16_t nchan_out_cov; + /*CLDFB*/ + float cx[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; + float cx_imag[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; + float real_part, imag_part; + /* format converter */ + int16_t channel_active[MAX_OUTPUT_CHANNELS]; + uint16_t nchan_out_init; + IVAS_OUTPUT_SETUP *hSynthesisOutputSetup; + + hParamMC = st_ivas->hParamMC; + assert( hParamMC ); + + push_wmops( "param_mc_dec_digest_tc" ); + + set_s( channel_active, 0, MAX_CICP_CHANNELS ); + nchan_transport = st_ivas->nchan_transport; + nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + nchan_out_init = nchan_out_transport; + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + nchan_out_cldfb = BINAURAL_CHANNELS; + set_s( channel_active, 1, nchan_out_cldfb ); + if ( st_ivas->hHeadTrackData ) + { + nchan_out_init = MAX_INTERN_CHANNELS; + } + nchan_out_cov = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + hSynthesisOutputSetup = &st_ivas->hTransSetup; + } + else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_CLDFB ) + { + nchan_out_cov = nchan_out_transport; + nchan_out_cldfb = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + hSynthesisOutputSetup = &st_ivas->hTransSetup; + } + else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { + nchan_out_cov = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + nchan_out_cldfb = nchan_out_cov; + set_s( channel_active, 1, nchan_out_cov ); + hSynthesisOutputSetup = &st_ivas->hOutSetup; + } + else + { + nchan_out_cov = nchan_out_transport; + nchan_out_cldfb = nchan_out_transport; + set_s( channel_active, 1, nchan_out_cov ); + hSynthesisOutputSetup = &st_ivas->hTransSetup; + } + + /* adapt transient position */ + if ( hParamMC->hMetadataPMC->bAttackPresent ) + { + hParamMC->hMetadataPMC->attackIndex = (int16_t) max( 0, hParamMC->hMetadataPMC->attackIndex + ( ( nCldfbSlots - DEFAULT_JBM_CLDFB_TIMESLOTS ) / 2 ) ); + } + /* adapt subframes */ + hParamMC->num_slots = nCldfbSlots; + hParamMC->slots_rendered = 0; + hParamMC->subframes_rendered = 0; + ivas_jbm_dec_get_adapted_subframes( nCldfbSlots, hParamMC->subframe_nbslots, &hParamMC->nb_subframes ); + ivas_param_mc_dec_compute_interpolator( hParamMC->hMetadataPMC->bAttackPresent, hParamMC->hMetadataPMC->attackIndex, nCldfbSlots, hParamMC->h_output_synthesis_params.interpolator ); + + for ( param_band_idx = 0; param_band_idx < PARAM_MC_MAX_PARAMETER_BANDS; param_band_idx++ ) + { + set_zero( cx[param_band_idx], PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); + set_zero( cx_imag[param_band_idx], PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); + } + + /* slot loop for gathering the input data */ + for ( slot_idx = 0; slot_idx < nCldfbSlots; slot_idx++ ) + { + float RealBuffer[CLDFB_NO_CHANNELS_MAX]; + float ImagBuffer[CLDFB_NO_CHANNELS_MAX]; + + /* CLDFB Analysis*/ + for ( ch = 0; ch < nchan_transport; ch++ ) + { + cldfbAnalysis_ts( &( transport_channels_f[ch][hParamMC->num_freq_bands * slot_idx] ), RealBuffer, ImagBuffer, hParamMC->num_freq_bands, st_ivas->cldfbAnaDec[ch] ); + + mvr2r( RealBuffer, &hParamMC->Cldfb_RealBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport + ch * hParamMC->num_freq_bands], hParamMC->num_freq_bands ); + mvr2r( ImagBuffer, &hParamMC->Cldfb_ImagBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport + ch * hParamMC->num_freq_bands], hParamMC->num_freq_bands ); + } + + if ( slot_idx >= 2 * hParamMC->hMetadataPMC->attackIndex ) + { + ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot( &hParamMC->Cldfb_RealBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport], &hParamMC->Cldfb_ImagBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport], cx, cx_imag, hParamMC, nchan_transport ); + } + } + + /* map from complex input covariance to real values */ + for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx++ ) + { + /* Cx for transport channels */ + for ( i = 0; i < nchan_transport * nchan_transport; i++ ) + { + real_part = cx[param_band_idx][i]; + imag_part = cx_imag[param_band_idx][i]; + + /* (a-ib)(c+id) = ac + bd + i(ad-bc) */ + if ( param_band_idx < hParamMC->max_param_band_abs_cov ) + { + cx[param_band_idx][i] = sqrtf( real_part * real_part + imag_part * imag_part ); + } + else + { + cx[param_band_idx][i] = real_part; + } + } + } + + /* we have to do it similar to the encoder in case of attacks (i.e. accumulate two bands) to ensure correct DMX of the target covariance*/ + if ( hParamMC->hMetadataPMC->bAttackPresent && ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) ) + { + for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx += 2 ) + { + v_add( cx[param_band_idx], cx[param_band_idx + 1], cx[param_band_idx], nchan_transport * nchan_transport ); + mvr2r( cx[param_band_idx], cx[param_band_idx + 1], nchan_transport * nchan_transport ); + } + } + + + if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { + ivas_param_mc_get_mono_stereo_mixing_matrices( hParamMC, cx, hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, nchan_out_transport, nchan_transport, nchan_out_cov ); + } + else + { + /* generate mixing matrices */ + ivas_param_mc_get_mixing_matrices( hParamMC, hSynthesisOutputSetup, cx, hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, nchan_out_transport, hParamMC->synthesis_conf, nchan_transport, nchan_out_cov ); + } +} /*------------------------------------------------------------------------- * ivas_param_mc_dec() @@ -1342,6 +1547,326 @@ void ivas_param_mc_dec_read_BS( * Parametric MC decoding process *------------------------------------------------------------------------*/ +void ivas_param_mc_dec_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ +) +{ + PARAM_MC_DEC_HANDLE hParamMC; + int16_t i, ch; + int16_t subframe_idx; + int16_t slot_idx, slot_idx_start, slot_idx_start_cldfb_synth, first_sf, last_sf, slots_to_render; + int16_t nchan_transport, nchan_out_transport, nchan_out_cldfb; + int16_t nchan_out_cov; + /*CLDFB*/ + float Cldfb_RealBuffer[MAX_INTERN_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer[MAX_INTERN_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + /*Decorrelator*/ + float onset_filter[MAX_CICP_CHANNELS * CLDFB_NO_CHANNELS_MAX]; + /* format converter */ + int16_t channel_active[MAX_OUTPUT_CHANNELS]; + uint16_t nband_synth, nbands_to_zero; + uint16_t nchan_out_init; + uint32_t output_Fs; + IVAS_OUTPUT_SETUP *hSynthesisOutputSetup; + + hParamMC = st_ivas->hParamMC; + assert( hParamMC ); + + push_wmops( "param_mc_dec_render" ); + + set_s( channel_active, 0, MAX_CICP_CHANNELS ); + nchan_transport = st_ivas->nchan_transport; + nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + nchan_out_init = nchan_out_transport; + output_Fs = st_ivas->hDecoderConfig->output_Fs; + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + nchan_out_cldfb = BINAURAL_CHANNELS; + set_s( channel_active, 1, nchan_out_cldfb ); + if ( st_ivas->hHeadTrackData ) + { + nchan_out_init = MAX_INTERN_CHANNELS; + } + nchan_out_cov = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + hSynthesisOutputSetup = &st_ivas->hTransSetup; + } + else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_CLDFB ) + { + nchan_out_cov = nchan_out_transport; + nchan_out_cldfb = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + hSynthesisOutputSetup = &st_ivas->hTransSetup; + } + else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { + nchan_out_cov = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + nchan_out_cldfb = nchan_out_cov; + set_s( channel_active, 1, nchan_out_cov ); + hSynthesisOutputSetup = &st_ivas->hOutSetup; + } + else + { + nchan_out_cov = nchan_out_transport; + nchan_out_cldfb = nchan_out_transport; + set_s( channel_active, 1, nchan_out_cov ); + hSynthesisOutputSetup = &st_ivas->hTransSetup; + } + + /* set everything to zero that will not be decoded */ + nband_synth = hParamMC->band_grouping[hParamMC->num_param_bands_synth]; + nbands_to_zero = hParamMC->num_freq_bands - nband_synth; + for ( ch = 0; ch < nchan_out_init; ch++ ) + { + for ( slot_idx = 0; slot_idx < JBM_CLDFB_SLOTS_IN_SUBFRAME; slot_idx++ ) + { + set_zero( &( Cldfb_RealBuffer[ch][slot_idx][nband_synth] ), nbands_to_zero ); + set_zero( &( Cldfb_ImagBuffer[ch][slot_idx][nband_synth] ), nbands_to_zero ); + } + } + + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + slots_to_render = min( hParamMC->num_slots - hParamMC->slots_rendered, nSamplesAsked / NS2SA( output_Fs, CLDFB_SLOT_NS ) ); + *nSamplesRendered = slots_to_render * NS2SA( output_Fs, CLDFB_SLOT_NS ); + first_sf = hParamMC->subframes_rendered; + last_sf = first_sf; + while ( slots_to_render > 0 ) + { + slots_to_render -= hParamMC->subframe_nbslots[last_sf]; + last_sf++; + } +#ifdef DEBUGGING + assert( slots_to_render == 0 ); +#endif + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) + { + slots_to_render += hParamMC->subframe_nbslots[subframe_idx]; + } + } + slot_idx_start = hParamMC->slots_rendered; + slot_idx_start_cldfb_synth = 0; + for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) + { + for ( slot_idx = 0; slot_idx < hParamMC->subframe_nbslots[subframe_idx]; slot_idx++, hParamMC->slots_rendered++ ) + { + + if ( hParamMC->max_band_decorr > 0 ) + { + /*-----------------------------------------------------------------* + * protoype signal computation + *-----------------------------------------------------------------*/ + + param_mc_protoSignalComputation( &hParamMC->Cldfb_RealBuffer_tc[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands], + &hParamMC->Cldfb_ImagBuffer_tc[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands], + hParamMC->proto_frame_f, hParamMC->diff_proto_info, + hParamMC->num_freq_bands ); + + /*-----------------------------------------------------------------* + * frequency domain decorrelation + *-----------------------------------------------------------------*/ + + /* decorrelate prototype frame */ + ivas_dirac_dec_decorr_process( hParamMC->num_freq_bands, + hParamMC->num_outputs_diff, + hParamMC->diff_proto_info->num_protos_diff, + DIRAC_SYNTHESIS_COV_MC_LS, + nchan_transport, + hParamMC->proto_frame_f, + hParamMC->diff_proto_info->num_protos_diff, + hParamMC->diff_proto_info->proto_index_diff, + hParamMC->proto_frame_dec_f, + onset_filter, + hParamMC->h_freq_domain_decorr_ap_params, + hParamMC->h_freq_domain_decorr_ap_state ); + + /* copy decorrelated frame directly to output CLDFB buffer, acts also as intermediate */ + /* memory for the decorrelated signal */ + ivas_param_mc_dec_copy_diffuse_proto( hParamMC, Cldfb_RealBuffer, Cldfb_ImagBuffer, nchan_out_cov, slot_idx ); + } + + /*-----------------------------------------------------------------* + * output synthesis + *-----------------------------------------------------------------*/ + + ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot( &hParamMC->Cldfb_RealBuffer_tc[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands], + &hParamMC->Cldfb_ImagBuffer_tc[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands], + Cldfb_RealBuffer, Cldfb_ImagBuffer, + hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, slot_idx, slot_idx + slot_idx_start, + nchan_transport, nchan_out_cov, hParamMC ); + + if ( ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) ) + { + if ( st_ivas->hHeadTrackData && st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) + { + ivas_param_mc_mc2sba_cldfb( st_ivas->hTransSetup, hParamMC->hoa_encoder, slot_idx, Cldfb_RealBuffer, Cldfb_ImagBuffer, nband_synth, GAIN_LFE ); + } + else + { + /* remove LFE */ + uint16_t idx_out; + uint16_t idx_lfe; + IVAS_OUTPUT_SETUP hLsSetup; + + hLsSetup = st_ivas->hTransSetup; + + /* If LFE should be rendered, add it to other channels before removing */ + if ( st_ivas->hBinRenderer->render_lfe ) + { + for ( idx_lfe = 0; idx_lfe < hLsSetup.num_lfe; idx_lfe++ ) + { + /* Copy just the first band of LFE*/ + v_multc( Cldfb_RealBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], ( GAIN_LFE / hLsSetup.nchan_out_woLFE ), Cldfb_RealBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], 1 ); + v_multc( Cldfb_ImagBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], ( GAIN_LFE / hLsSetup.nchan_out_woLFE ), Cldfb_ImagBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], 1 ); + + for ( ch = 0; ch < ( hLsSetup.nchan_out_woLFE + hLsSetup.num_lfe ); ch++ ) + { + if ( hLsSetup.index_lfe[idx_lfe] != ch ) + { + v_add( Cldfb_RealBuffer[ch][slot_idx], Cldfb_RealBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], Cldfb_RealBuffer[ch][slot_idx], 1 ); + v_add( Cldfb_ImagBuffer[ch][slot_idx], Cldfb_ImagBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], Cldfb_ImagBuffer[ch][slot_idx], 1 ); + } + } + } + } + + idx_out = 0; + idx_lfe = 0; + + for ( ch = 0; ch < ( hLsSetup.nchan_out_woLFE + hLsSetup.num_lfe ); ch++ ) + { + if ( ( hLsSetup.num_lfe > 0 ) && ( hLsSetup.index_lfe[idx_lfe] == ch ) ) + { + if ( idx_lfe < ( hLsSetup.num_lfe - 1 ) ) + { + idx_lfe++; + } + } + else if ( ch != idx_out ) + { + mvr2r( Cldfb_RealBuffer[ch][slot_idx], Cldfb_RealBuffer[idx_out][slot_idx], nband_synth ); + mvr2r( Cldfb_ImagBuffer[ch][slot_idx], Cldfb_ImagBuffer[idx_out][slot_idx], nband_synth ); + idx_out++; + } + else + { + idx_out++; + } + } + } + } + } + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, hParamMC->subframe_nbslots[subframe_idx], + Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); + } + else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_CLDFB ) + { + /* format conversion*/ + ivas_lssetupconversion_process_param_mc( st_ivas, hParamMC->subframe_nbslots[subframe_idx], Cldfb_RealBuffer, Cldfb_ImagBuffer, channel_active ); + } + + /* CLDFB synthesis */ + for ( ch = 0; ch < nchan_out_cldfb; ch++ ) + { + float *RealBuffer[16]; + float *ImagBuffer[16]; + + if ( channel_active[ch] ) + { + /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ + for ( i = 0; i < hParamMC->subframe_nbslots[subframe_idx]; i++ ) + { + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + RealBuffer[i] = Cldfb_RealBuffer_Binaural[ch][i]; + ImagBuffer[i] = Cldfb_ImagBuffer_Binaural[ch][i]; + } + else + { + RealBuffer[i] = Cldfb_RealBuffer[ch][i]; + ImagBuffer[i] = Cldfb_ImagBuffer[ch][i]; + } + } + cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][slot_idx_start_cldfb_synth * hParamMC->num_freq_bands] ), + hParamMC->num_freq_bands * hParamMC->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[ch] ); + } + else + { + set_f( &( output_f[ch][slot_idx_start_cldfb_synth * hParamMC->num_freq_bands] ), 0.0f, hParamMC->num_freq_bands * hParamMC->subframe_nbslots[subframe_idx] ); + } + } + slot_idx_start += hParamMC->subframe_nbslots[subframe_idx]; + slot_idx_start_cldfb_synth += hParamMC->subframe_nbslots[subframe_idx]; + } + + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + ivas_mc2sba( st_ivas->hIntSetup, output_f, output_f, hParamMC->num_freq_bands * slots_to_render, st_ivas->hOutSetup.ambisonics_order, 0.f ); + } + + /* update */ + if ( hParamMC->slots_rendered == hParamMC->num_slots ) + { + hParamMC->hMetadataPMC->last_coded_bwidth = hParamMC->hMetadataPMC->coded_bwidth; + param_mc_update_mixing_matrices( hParamMC, hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, nchan_transport, nchan_out_cov ); + } + hParamMC->subframes_rendered = last_sf; + *nSamplesAvailable = ( hParamMC->num_slots - hParamMC->slots_rendered ) * NS2SA( output_Fs, CLDFB_SLOT_NS ); + pop_wmops(); + + return; +} +#endif + +/*------------------------------------------------------------------------- + * ivas_param_mc_dec() + * + * Parametric MC decoding process + *------------------------------------------------------------------------*/ +#ifdef JBM_TSM_ON_TCS +void ivas_param_mc_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ +) +{ + PARAM_MC_DEC_HANDLE hParamMC; + float Cldfb_RealBuffer_in[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_NSLOTS * CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer_in[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_NSLOTS * CLDFB_NO_CHANNELS_MAX]; + uint16_t nSamplesAsked, nSamplesAvailable, nSamplesRendered; + + hParamMC = st_ivas->hParamMC; + assert( hParamMC ); + push_wmops( "param_mc_dec" ); + + /* set some handle pointers to the stack buffers */ + hParamMC->Cldfb_RealBuffer_tc = Cldfb_RealBuffer_in; + hParamMC->Cldfb_ImagBuffer_tc = Cldfb_ImagBuffer_in; + + nSamplesAsked = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + ivas_param_mc_dec_digest_tc( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS, output_f ); + ivas_param_mc_dec_render( st_ivas, nSamplesAsked, &nSamplesRendered, &nSamplesAvailable, output_f ); +#ifdef DEBUGGING + assert( nSamplesRendered == nSamplesAsked ); + assert( nSamplesAvailable == 0 ); +#endif + + /* set handle pointers back to NULL */ + hParamMC->Cldfb_RealBuffer_tc = NULL; + hParamMC->Cldfb_ImagBuffer_tc = NULL; + + pop_wmops(); + return; +} +#else void ivas_param_mc_dec( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */ @@ -1349,7 +1874,8 @@ void ivas_param_mc_dec( { PARAM_MC_DEC_HANDLE hParamMC; int16_t i, ch; - int16_t subframe_idx, num_subframes; + int16_t subframe_idx; + int16_t nb_subframes; int16_t slot_idx, param_band_idx, slot_idx_start; int16_t nchan_transport, nchan_out_transport, nchan_out_cldfb; int16_t nchan_out_cov; @@ -1496,12 +2022,13 @@ void ivas_param_mc_dec( ivas_param_mc_get_mixing_matrices( hParamMC, hSynthesisOutputSetup, cx, mixing_matrix, mixing_matrix_res, nchan_out_transport, hParamMC->synthesis_conf, nchan_transport, nchan_out_cov ); } + /*** split here... ***/ + /* subframe loop for synthesis*/ - num_subframes = CLDFB_NO_COL_MAX / hParamMC->subframe_nbslots; - for ( subframe_idx = 0; subframe_idx < num_subframes; subframe_idx++ ) + nb_subframes = CLDFB_NO_COL_MAX / hParamMC->subframe_nbslots; + for ( subframe_idx = 0; subframe_idx < nb_subframes; subframe_idx++ ) { slot_idx_start = subframe_idx * hParamMC->subframe_nbslots; - for ( slot_idx = 0; slot_idx < hParamMC->subframe_nbslots; slot_idx++ ) { @@ -1640,7 +2167,6 @@ void ivas_param_mc_dec( ImagBuffer[i] = Cldfb_ImagBuffer[ch][i]; } } - cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][slot_idx_start * hParamMC->num_freq_bands] ), hParamMC->num_freq_bands * hParamMC->subframe_nbslots, st_ivas->cldfbSynDec[ch] ); } @@ -1663,6 +2189,7 @@ void ivas_param_mc_dec( return; } +#endif /*------------------------------------------------------------------------- @@ -1737,12 +2264,19 @@ static void ivas_param_mc_dec_init( *------------------------------------------------------------------------*/ static void param_mc_protoSignalComputation( +#ifdef JBM_TSM_ON_TCS + float *RealBuffer, /* i : CLDFB samples of the transport channels (real part) */ + float *ImagBuffer, /* i : CLDFB samples of the transport channels (imaginary part) */ +#else float RealBuffer[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : CLDFB samples of the transport channels (real part) */ float ImagBuffer[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : CLDFB samples of the transport channels (imaginary part) */ - float *proto_frame_f, /* o : interleaved complex prototype CLDFB samples */ - const PARAM_MC_DIFF_PROTO_INFO *diff_proto_info, /* i : prototype generation information */ - const int16_t slot_index, /* i : current slot index */ - const int16_t num_freq_bands /* i : number of frequency bands for the prototypes */ +#endif + float *proto_frame_f, /* o : interleaved complex prototype CLDFB samples */ + const PARAM_MC_DIFF_PROTO_INFO *diff_proto_info, /* i : prototype generation information */ +#ifndef JBM_TSM_ON_TCS + const int16_t slot_index, /* i : current slot index */ +#endif + const int16_t num_freq_bands /* i : number of frequency bands for the prototypes */ ) { int16_t band; @@ -1763,8 +2297,13 @@ static void param_mc_protoSignalComputation( int16_t source_ch_idx = diff_proto_info->source_chan_idx[proto_ch_idx][source_ch_cnt]; p_proto_frame = &proto_frame_f[proto_ch_idx * num_freq_bands * 2]; +#ifdef JBM_TSM_ON_TCS + p_real_buffer = &RealBuffer[source_ch_idx * num_freq_bands]; + p_imag_buffer = &ImagBuffer[source_ch_idx * num_freq_bands]; +#else p_real_buffer = &RealBuffer[source_ch_idx][slot_index][0]; p_imag_buffer = &ImagBuffer[source_ch_idx][slot_index][0]; +#endif for ( band = 0; band < num_freq_bands; band++ ) { @@ -1936,15 +2475,18 @@ static int16_t ivas_param_mc_range_decoder_LC( * * compute the interpolator used in the final synthesis *------------------------------------------------------------------------*/ - -static void param_mc_compute_interpolator( +static void ivas_param_mc_dec_compute_interpolator( const uint16_t bAttackPresent, /* i : flag indicating if we have a transient in the current frame */ const uint16_t attackPos, /* i : position of the transient */ const uint16_t interp_length, /* i : number of interpolation values to be calculated */ float *interpolator /* o : interpolator */ ) { +#ifdef JBM_TSM_ON_TCS + int16_t idx; +#else uint16_t idx; +#endif if ( bAttackPresent ) { @@ -1959,10 +2501,14 @@ static void param_mc_compute_interpolator( } else { +#ifdef JBM_TSM_ON_TCS + ivas_jbm_dec_get_adapted_linear_interpolator( DEFAULT_JBM_CLDFB_TIMESLOTS, interp_length, interpolator ); +#else for ( idx = 1; idx <= interp_length; ++idx ) { interpolator[idx - 1] = (float) idx / (float) interp_length; } +#endif } return; @@ -2022,12 +2568,17 @@ static void ivas_param_mc_get_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, /* i : Parametric MC handle */ IVAS_OUTPUT_SETUP *hSynthesisOutputSetup, float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* i : input covariance for all parameter bands */ - float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : direct mixing matrices for all parameter bands */ - float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], /* o : residual mixing matrices for all parameter bands */ - const int16_t nY_intern, /* i : number of channels in the transported format */ - const PARAM_MC_SYNTHESIS_CONF synth_config, /* i : Parametric MC synthesis config */ - const int16_t nX, /* i : number of transport channels */ - const int16_t nY_cov /* i : number of covariance synthesis output channels */ +#ifdef JBM_TSM_ON_TCS + float *mixing_matrix[], /* o : direct mixing matrices for all parameter bands */ + float *mixing_matrix_res[], /* o : residual mixing matrices for all parameter bands */ +#else + float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : direct mixing matrices for all parameter bands */ + float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], /* o : residual mixing matrices for all parameter bands */ +#endif + const int16_t nY_intern, /* i : number of channels in the transported format */ + const PARAM_MC_SYNTHESIS_CONF synth_config, /* i : Parametric MC synthesis config */ + const int16_t nX, /* i : number of transport channels */ + const int16_t nY_cov /* i : number of covariance synthesis output channels */ ) { int16_t param_band_idx; @@ -2276,11 +2827,16 @@ static void ivas_param_mc_get_mixing_matrices( static void ivas_param_mc_get_mono_stereo_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, /* i : Parametric MC handle */ float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* i : transport channel covariance for all parameter bands */ - float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : direct mixing matrix */ - float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], /* o : residual mixing matrix (set to zero) */ - const int16_t nY_intern, /* i : number of channels of the transport format */ - const int16_t nX, /* i : number of transport channels */ - const int16_t nY_cov ) /* i : number of output channels */ +#ifdef JBM_TSM_ON_TCS + float *mixing_matrix[], /* o : direct mixing matrices for all parameter bands */ + float *mixing_matrix_res[], /* o : residual mixing matrices for all parameter bands */ +#else + float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : direct mixing matrix */ + float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], /* o : residual mixing matrix (set to zero) */ +#endif + const int16_t nY_intern, /* i : number of channels of the transport format */ + const int16_t nX, /* i : number of transport channels */ + const int16_t nY_cov ) /* i : number of output channels */ { int16_t param_band_idx; float Cx[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; @@ -2395,17 +2951,21 @@ static void ivas_param_mc_get_mono_stereo_mixing_matrices( *------------------------------------------------------------------------*/ static void param_mc_update_mixing_matrices( - PARAM_MC_DEC_HANDLE hParamMC, /* i/o: Parametric MC handle */ + PARAM_MC_DEC_HANDLE hParamMC, /* i/o: Parametric MC handle */ +#ifdef JBM_TSM_ON_TCS + float *mixing_matrix[], /* i : direct mixing matrices for the frame just processed */ + float *mixing_matrix_res[], /* i : residual mixing matrices for the frame just processed */ +#else float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], /* i : direct mixing matrices for the frame just processed */ float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], /* i : residual mixing matrices for the frame just processed */ - const uint16_t nX, /* i : number of transport channels */ - const uint16_t nY ) /* i : number of synthesis channels */ +#endif + const uint16_t nX, /* i : number of transport channels */ + const uint16_t nY ) /* i : number of synthesis channels */ { uint16_t param_band_idx; for ( param_band_idx = 0; param_band_idx < hParamMC->hMetadataPMC->nbands_coded; param_band_idx++ ) { - /* final mixing */ int16_t brange[2]; brange[0] = hParamMC->band_grouping[param_band_idx]; diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index 1ad01239cb..55a68c4475 100644 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -54,8 +54,11 @@ * Local function prototypes *-----------------------------------------------------------------------*/ +#ifdef JBM_TSM_ON_TCS +static ivas_error ivas_mc_dec_reconfig( Decoder_Struct *st_ivas, uint16_t *nSamplesRendered, int16_t *data ); +#else static ivas_error ivas_mc_dec_reconfig( Decoder_Struct *st_ivas ); - +#endif /*--------------------------------------------------------------------------* * ivas_mct_dec() @@ -613,6 +616,11 @@ void ivas_mct_dec_close( ivas_error ivas_mc_dec_config( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const int16_t idx /* i : LS config. index */ +#ifdef JBM_TSM_ON_TCS + , + uint16_t *nSamplesRendered, /* o : samples flushed from last frame (JBM) */ + int16_t *data /* o : flushed samples (JBM) */ +#endif ) { AUDIO_CONFIG signaled_config; @@ -642,7 +650,11 @@ ivas_error ivas_mc_dec_config( { if ( st_ivas->hDecoderConfig->last_ivas_total_brate != st_ivas->hDecoderConfig->ivas_total_brate || st_ivas->transport_config != signaled_config || last_mc_mode != st_ivas->mc_mode ) { +#ifdef JBM_TSM_ON_TCS + ivas_mc_dec_reconfig( st_ivas, nSamplesRendered, data ); +#else ivas_mc_dec_reconfig( st_ivas ); +#endif } } @@ -661,6 +673,11 @@ ivas_error ivas_mc_dec_config( static ivas_error ivas_mc_dec_reconfig( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +#ifdef JBM_TSM_ON_TCS + , + uint16_t *nSamplesRendered, /* o : number of samples flushed from the last frame (JBM) */ + int16_t *data /* o : flushed samples (JBM) */ +#endif ) { int16_t nchan_transport_old, nSCE_old, nCPE_old, sba_dirac_stereo_flag_old, nchan_hp20_old; @@ -670,6 +687,14 @@ static ivas_error ivas_mc_dec_reconfig( Decoder_State *st; ivas_error error; MC_MODE mc_mode, last_mc_mode; +#ifdef JBM_TSM_ON_TCS + TC_BUFFER_MODE tc_buffer_mode_new; + int16_t tc_nchan_tc_new; + int16_t tc_nchan_allocate_new; + int16_t tc_granularity_new; + AUDIO_CONFIG intern_config_old; + IVAS_OUTPUT_SETUP hIntSetupOld; +#endif error = IVAS_ERR_OK; @@ -700,13 +725,63 @@ static ivas_error ivas_mc_dec_reconfig( } st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); +#ifdef JBM_TSM_ON_TCS + /* save old IntSetup, might be needed for JBM flushing...*/ + intern_config_old = st_ivas->intern_config; + hIntSetupOld = st_ivas->hIntSetup; + tc_granularity_new = 1; +#endif + /* renderer might have changed, reselect */ renderer_type_old = st_ivas->renderer_type; ivas_renderer_select( st_ivas ); + /* side effect of the renderer selection can be a changed internal config */ ivas_output_init( &( st_ivas->hIntSetup ), st_ivas->intern_config ); +#ifdef JBM_TSM_ON_TCS + if ( st_ivas->hDecoderConfig->voip_active ) + { + /* transfer subframe info from DirAC or ParamMC to central tc buffer */ + if ( last_mc_mode == MC_MODE_PARAMMC ) + { + st_ivas->hTcBuffer->nb_subframes = st_ivas->hParamMC->nb_subframes; + st_ivas->hTcBuffer->subframes_rendered = st_ivas->hParamMC->subframes_rendered; + st_ivas->hTcBuffer->num_slots = st_ivas->hParamMC->num_slots; + st_ivas->hTcBuffer->slots_rendered = st_ivas->hParamMC->slots_rendered; + mvs2s( st_ivas->hParamMC->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } + else if ( last_mc_mode == MC_MODE_MCMASA && st_ivas->hDirAC != NULL ) + { + st_ivas->hTcBuffer->nb_subframes = st_ivas->hDirAC->nb_subframes; + st_ivas->hTcBuffer->subframes_rendered = st_ivas->hDirAC->subframes_rendered; + st_ivas->hTcBuffer->num_slots = st_ivas->hDirAC->num_slots; + st_ivas->hTcBuffer->slots_rendered = st_ivas->hDirAC->slots_rendered; + mvs2s( st_ivas->hDirAC->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } + /* JBM: when granularity goes down (e.g. MCT with CREND -> ParamMC with binaural fastconv + render what still fits in the new granularity */ + tc_granularity_new = ivas_jbm_dec_get_render_granularity( st_ivas->renderer_type, st_ivas->hDecoderConfig->output_Fs ); + if ( tc_granularity_new < st_ivas->hTcBuffer->n_samples_granularity ) + { + if ( ( error = ivas_jbm_dec_flush_renderer( st_ivas, tc_granularity_new, renderer_type_old, intern_config_old, &hIntSetupOld, last_mc_mode, ISM_MODE_NONE, nSamplesRendered, data ) ) != IVAS_ERR_OK ) + { + return error; + } + } + /* JBM: when granularity goes up set samples to discard at the beginning of the frame */ + else if ( tc_granularity_new > st_ivas->hTcBuffer->n_samples_granularity ) + { + if ( ( error = ivas_jbm_dec_set_discard_samples( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } +#endif + + if ( st_ivas->mc_mode == MC_MODE_MCT ) { st_ivas->nchan_transport = ivas_mc_ls_setup_get_num_channels( ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ) ); @@ -728,6 +803,13 @@ static ivas_error ivas_mc_dec_reconfig( ivas_masa_dec_close( &( st_ivas->hMasa ) ); ivas_qmetadata_close( &st_ivas->hQMetaData ); +#ifdef JBM_TSM_ON_TCS + if ( st_ivas->hDirAC != NULL ) + { + ivas_dirac_dec_close( &st_ivas->hDirAC ); + } +#endif + /* init LS conversion if the renderer type asks for it */ if ( st_ivas->renderer_type == RENDERER_MC && st_ivas->hLsSetUpConversion == NULL ) { @@ -765,6 +847,14 @@ static ivas_error ivas_mc_dec_reconfig( ivas_masa_dec_close( &( st_ivas->hMasa ) ); ivas_qmetadata_close( &st_ivas->hQMetaData ); +#ifdef JBM_TSM_ON_TCS + if ( st_ivas->hDirAC != NULL ) + { + ivas_dirac_dec_close( &st_ivas->hDirAC ); + } +#endif + + if ( last_mc_mode == MC_MODE_MCT ) { if ( st_ivas->hMCT != NULL && st_ivas->nchan_transport <= CPE_CHANNELS ) @@ -1121,5 +1211,56 @@ static ivas_error ivas_mc_dec_reconfig( #endif } +#ifdef JBM_TSM_ON_TCS + /*-----------------------------------------------------------------* + * Reconfigure TC buffer + *-----------------------------------------------------------------*/ + if ( st_ivas->hDecoderConfig->voip_active == 1 ) + { + int16_t tc_nchan_full_new; + DECODER_TC_BUFFER_HANDLE hTcBuffer; + + hTcBuffer = st_ivas->hTcBuffer; + tc_buffer_mode_new = ivas_jbm_dec_get_tc_buffer_mode( st_ivas ); + tc_nchan_tc_new = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + tc_nchan_allocate_new = tc_nchan_tc_new; + tc_nchan_full_new = tc_nchan_tc_new; + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + tc_nchan_allocate_new = 2 * BINAURAL_CHANNELS; + tc_nchan_full_new = tc_nchan_allocate_new; + } + if ( st_ivas->mc_mode == MC_MODE_PARAMMC && st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_MONO && st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_STEREO ) + { + tc_nchan_full_new = 0; + } + /* reconfigure buffer */ + if ( hTcBuffer->tc_buffer_mode != tc_buffer_mode_new || hTcBuffer->nchan_transport_jbm != tc_nchan_tc_new || + hTcBuffer->nchan_buffer_full != tc_nchan_full_new || hTcBuffer->nchan_transport_internal != tc_nchan_allocate_new ) + { + if ( ( error = ivas_jbm_dec_tc_buffer_reconfigure( st_ivas, tc_buffer_mode_new, tc_nchan_tc_new, tc_nchan_allocate_new, tc_nchan_full_new, tc_granularity_new ) ) != IVAS_ERR_OK ) + { + return error; + } + } + /* transfer subframe info from central tc buffer to ParamMC or McMASA (DirAC) */ + if ( st_ivas->hDirAC != NULL ) + { + st_ivas->hDirAC->nb_subframes = st_ivas->hTcBuffer->nb_subframes; + st_ivas->hDirAC->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered; + st_ivas->hDirAC->num_slots = st_ivas->hTcBuffer->num_slots; + st_ivas->hDirAC->slots_rendered = st_ivas->hTcBuffer->slots_rendered; + mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hDirAC->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } + else if ( st_ivas->hParamMC != NULL ) + { + st_ivas->hParamMC->nb_subframes = st_ivas->hTcBuffer->nb_subframes; + st_ivas->hParamMC->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered; + st_ivas->hParamMC->num_slots = st_ivas->hTcBuffer->num_slots; + st_ivas->hParamMC->slots_rendered = st_ivas->hTcBuffer->slots_rendered; + mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hParamMC->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } + } +#endif return error; } diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index f1c1fc04f2..a7c804007d 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -67,7 +67,11 @@ ivas_error ivas_td_binaural_open( ivas_error ivas_td_binaural_renderer( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ +#ifdef JBM_TSM_ON_TCS + float *output[], /* i/o: SCE channels / Binaural synthesis */ +#else float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ +#endif const int16_t output_frame /* i : output frame length */ ) { @@ -78,3 +82,89 @@ ivas_error ivas_td_binaural_renderer( st_ivas->hIsmMetaData, st_ivas->hDecoderConfig->Opt_Headrotation, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Quaternions : NULL, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Pos : NULL, output, output_frame ); } + +#ifdef JBM_TSM_ON_TCS +/*---------------------------------------------------------------------* + * ObjRenderIVASFrame() + * + * Receives the current frames for the object streams, updates metadata + * and renders the current frame. + *---------------------------------------------------------------------*/ + +void ObjRenderIVASSubframe( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output[], /* i/o: SCE channels / Binaural synthesis */ + const int16_t n_samples_asked ) +{ + int16_t first_sf, last_sf, subframe_idx; + float reverb_signal[BINAURAL_CHANNELS][L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; + float *p_reverb_signal[BINAURAL_CHANNELS]; + float *output_f_local[BINAURAL_CHANNELS]; + float *tc_local[MAX_TRANSPORT_CHANNELS]; + int16_t ch, slot_size, slots_to_render, output_frame; + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + p_reverb_signal[ch] = reverb_signal[ch]; + } + for ( ch = 0; ch < st_ivas->hTcBuffer->nchan_transport_internal; ch++ ) + { + tc_local[ch] = st_ivas->hTcBuffer->tc[ch] + st_ivas->hTcBuffer->n_samples_rendered; + } + for ( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ ) + { + output_f_local[ch] = output[ch]; + } + slot_size = st_ivas->hTcBuffer->n_samples_granularity; + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + slots_to_render = min( st_ivas->hTcBuffer->num_slots - st_ivas->hTcBuffer->slots_rendered, n_samples_asked / slot_size ); + first_sf = st_ivas->hTcBuffer->subframes_rendered; + last_sf = first_sf; + st_ivas->hTcBuffer->slots_rendered += slots_to_render; + while ( slots_to_render > 0 ) + { + slots_to_render -= st_ivas->hTcBuffer->subframe_nbslots[last_sf]; + last_sf++; + } + + for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) + { + output_frame = st_ivas->hTcBuffer->subframe_nbslots[subframe_idx] * st_ivas->hTcBuffer->n_samples_granularity; + /* Update object position(s) */ + TDREND_Update_object_positions( st_ivas->hBinRendererTd, st_ivas->nchan_transport, LFE_CHANNEL, st_ivas->ivas_format, st_ivas->hIsmMetaData, tc_local ); + + /* Update the listener's location/orientation */ + TDREND_Update_listener_orientation( st_ivas->hBinRendererTd, + st_ivas->hDecoderConfig->Opt_Headrotation, + ( st_ivas->hHeadTrackData != NULL ) ? &st_ivas->hHeadTrackData->Quaternions[0] : NULL, + ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Pos : NULL ); + + if ( ( st_ivas->hRenderConfig != NULL ) && ( st_ivas->hRenderConfig->roomAcoustics.late_reverb_on ) ) + { + ivas_reverb_process( st_ivas->hReverb, st_ivas->transport_config, 0, tc_local, p_reverb_signal, 0 ); + } + + /* Render subframe */ + TDREND_GetMix( st_ivas->hBinRendererTd, output_f_local, output_frame, 0 ); + + if ( st_ivas->hRenderConfig != NULL ) /* Renderer Configuration not enabled in TD standalone renderer */ + { + if ( st_ivas->hRenderConfig->roomAcoustics.late_reverb_on ) + { + /* add reverb to rendered signals */ + v_add( reverb_signal[0], output_f_local[0], output_f_local[0], output_frame ); + v_add( reverb_signal[1], output_f_local[1], output_f_local[1], output_frame ); + } + } + for ( ch = 0; ch < st_ivas->hTcBuffer->nchan_transport_internal; ch++ ) + { + tc_local[ch] += output_frame; + } + for ( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ ) + { + output_f_local[ch] += output_frame; + } + } + st_ivas->hTcBuffer->subframes_rendered = last_sf; + return; +} +#endif \ No newline at end of file diff --git a/lib_dec/ivas_out_setup_conversion.c b/lib_dec/ivas_out_setup_conversion.c index 2fb04af8d7..71b85a1dc9 100644 --- a/lib_dec/ivas_out_setup_conversion.c +++ b/lib_dec/ivas_out_setup_conversion.c @@ -466,7 +466,12 @@ void ivas_ls_setup_conversion_close( void ivas_ls_setup_conversion( Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ const int16_t output_frame, /* i : frame length */ - float output[][L_FRAME48k] /* i/o: LS input/output synthesis signal */ +#ifdef JBM_TSM_ON_TCS + float *input[], /* i : LS input/output synthesis signal */ + float *output[] /* i/o: LS input/output synthesis signal */ +#else + float output[][L_FRAME48k] /* i/o: LS input/output synthesis signal */ +#endif ) { int16_t chInIdx, chOutIdx, idx; @@ -493,14 +498,22 @@ void ivas_ls_setup_conversion( { for ( idx = 0; idx < output_frame; idx++ ) { +#ifdef JBM_TSM_ON_TCS + output_tmp[chOutIdx][idx] += input[chInIdx][idx]; +#else output_tmp[chOutIdx][idx] += output[chInIdx][idx]; +#endif } } else { for ( idx = 0; idx < output_frame; idx++ ) { +#ifdef JBM_TSM_ON_TCS + tmpVal = dmxCoeff * input[chInIdx][idx]; +#else tmpVal = dmxCoeff * output[chInIdx][idx]; +#endif output_tmp[chOutIdx][idx] += tmpVal; } } @@ -1098,7 +1111,10 @@ void ivas_ls_setup_conversion_process_mdct_param_mc( *-------------------------------------------------------------------------*/ void ivas_lssetupconversion_process_param_mc( - Decoder_Struct *st_ivas, /* i/o: LS setup conversion renderer handle */ + Decoder_Struct *st_ivas, /* i/o: LS setup conversion renderer handle */ +#ifdef JBM_TSM_ON_TCS + int16_t num_timeslots, +#endif float Cldfb_RealBuffer_InOut[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals */ float Cldfb_ImagBuffer_InOut[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals */ int16_t channel_active[MAX_CICP_CHANNELS] /* i : bitmap indicating which output channels are active */ @@ -1125,8 +1141,12 @@ void ivas_lssetupconversion_process_param_mc( set_s( channel_active, 0, outChannels ); - /* Loop over each time slots and compute dmx for each time slot */ +/* Loop over each time slots and compute dmx for each time slot */ +#ifdef JBM_TSM_ON_TCS + for ( slotIdx = 0; slotIdx < num_timeslots; slotIdx++ ) +#else for ( slotIdx = 0; slotIdx < st_ivas->hParamMC->subframe_nbslots; slotIdx++ ) +#endif { /* copy buffers */ for ( chInIdx = 0; chInIdx < inChannels; chInIdx++ ) diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index af7281a578..098a90aed7 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -111,6 +111,7 @@ ivas_error ivas_sba_dec_reconfigure( SBA_MODE sba_mode_old; int32_t ivas_total_brate, last_ivas_total_brate; RENDERER_TYPE old_renderer_type; + DECODER_CONFIG_HANDLE hDecoderConfig; ivas_error error; int16_t band_grouping[IVAS_MAX_NUM_BANDS + 1]; @@ -128,7 +129,6 @@ ivas_error ivas_sba_dec_reconfigure( * Set SBA high-level parameters * Save old SBA high-level parameters *-----------------------------------------------------------------*/ - ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); nchan_hp20_old = getNumChanSynthesis( st_ivas ); nSCE_old = st_ivas->nSCE; @@ -139,19 +139,39 @@ ivas_error ivas_sba_dec_reconfigure( st_ivas->sba_analysis_order = ivas_sba_get_analysis_order( ivas_total_brate, st_ivas->sba_order ); st_ivas->sba_mode = ivas_sba_mode_select( ivas_total_brate ); +#ifdef JBM_TSM_ON_TCS + /* save old */ + if ( st_ivas->hDirAC == NULL && st_ivas->hSpar != NULL ) + { + st_ivas->hTcBuffer->num_slots = st_ivas->hSpar->num_slots; + st_ivas->hTcBuffer->nb_subframes = st_ivas->hSpar->nb_subframes; + st_ivas->hTcBuffer->slots_rendered = st_ivas->hSpar->slots_rendered; + st_ivas->hTcBuffer->subframes_rendered = st_ivas->hSpar->subframes_rendered; + mvs2s( st_ivas->hSpar->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } + else if ( st_ivas->hDirAC != NULL ) + { + st_ivas->hTcBuffer->num_slots = st_ivas->hDirAC->num_slots; + st_ivas->hTcBuffer->nb_subframes = st_ivas->hDirAC->nb_subframes; + st_ivas->hTcBuffer->slots_rendered = st_ivas->hDirAC->slots_rendered; + st_ivas->hTcBuffer->subframes_rendered = st_ivas->hDirAC->subframes_rendered; + mvs2s( st_ivas->hDirAC->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } +#endif + /*-----------------------------------------------------------------* * Allocate, initialize, and configure SBA handles *-----------------------------------------------------------------*/ if ( st_ivas->sba_mode != SBA_MODE_SPAR ) { + ivas_spar_dec_close( &( st_ivas->hSpar ), hDecoderConfig->output_Fs, 0 ); if ( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, st_ivas->sba_mode, -1 ) ) != IVAS_ERR_OK ) { return error; } - st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); } else @@ -163,6 +183,7 @@ ivas_error ivas_sba_dec_reconfigure( if ( hSpar != NULL ) { + if ( ( hSpar->hPCA != NULL ) && ( ( hDecoderConfig->ivas_total_brate != PCA_BRATE ) || ( sba_order_internal != 1 ) ) ) { free( st_ivas->hSpar->hPCA ); @@ -171,7 +192,6 @@ ivas_error ivas_sba_dec_reconfigure( if ( nchan_transport_old != ivas_get_sba_num_TCs( ivas_total_brate, sba_order_internal ) ) { - ivas_spar_dec_close( &( st_ivas->hSpar ), hDecoderConfig->output_Fs, 1 ); if ( ( error = ivas_spar_dec_open( st_ivas, 1 ) ) != IVAS_ERR_OK ) @@ -192,6 +212,14 @@ ivas_error ivas_sba_dec_reconfigure( hSpar = st_ivas->hSpar; st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); +#ifdef JBM_TSM_ON_TCS + /* synchronize subframe info */ + st_ivas->hSpar->num_slots = st_ivas->hTcBuffer->num_slots; + st_ivas->hSpar->nb_subframes = st_ivas->hTcBuffer->nb_subframes; + st_ivas->hSpar->slots_rendered = st_ivas->hTcBuffer->slots_rendered; + st_ivas->hSpar->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered; + mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hSpar->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); +#endif } if ( st_ivas->nchan_transport == 1 ) @@ -276,6 +304,14 @@ ivas_error ivas_sba_dec_reconfigure( { return error; } +#ifdef JBM_TSM_ON_TCS + /* synchronize subframe info */ + st_ivas->hDirAC->num_slots = st_ivas->hTcBuffer->num_slots; + st_ivas->hDirAC->nb_subframes = st_ivas->hTcBuffer->nb_subframes; + st_ivas->hDirAC->slots_rendered = st_ivas->hTcBuffer->slots_rendered; + st_ivas->hDirAC->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered; + mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hDirAC->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); +#endif } if ( st_ivas->sba_mode == SBA_MODE_SPAR ) @@ -336,5 +372,162 @@ ivas_error ivas_sba_dec_reconfigure( return error; } +#ifdef JBM_TSM_ON_TCS + /*-----------------------------------------------------------------* + * TC buffer + *-----------------------------------------------------------------*/ + if ( st_ivas->hDecoderConfig->voip_active == 1 && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && st_ivas->renderer_type != RENDERER_STEREO_PARAMETRIC ) + { + int16_t tc_nchan_to_allocate; + int16_t tc_nchan_tc; + TC_BUFFER_MODE tc_buffer_mode; + int16_t sba_order_internal; + + sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); + + tc_buffer_mode = TC_BUFFER_MODE_RENDERER; + tc_nchan_tc = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + + tc_nchan_to_allocate = ivas_sba_get_nchan_metadata( sba_order_internal ); + tc_nchan_tc = st_ivas->nchan_transport; + tc_nchan_to_allocate = tc_nchan_tc; + if ( st_ivas->nchan_transport == 1 && ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) || ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) ) + { + tc_nchan_to_allocate++; /* we need a channel for the CNG in this case*/ + } + if ( tc_nchan_tc != st_ivas->hTcBuffer->nchan_transport_jbm || tc_nchan_to_allocate != st_ivas->hTcBuffer->nchan_transport_internal || tc_buffer_mode != st_ivas->hTcBuffer->tc_buffer_mode ) + { + if ( ( error = ivas_jbm_dec_tc_buffer_reconfigure( st_ivas, tc_buffer_mode, tc_nchan_tc, tc_nchan_to_allocate, tc_nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } +#endif return error; } + +#ifdef JBM_TSM_ON_TCS +ivas_error ivas_sba_dec_digest_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t nCldfbSlots, /* i : number of CLDFB slots */ + const int16_t nSamplesForRendering /* i : number of samples provided */ +) +{ + + int16_t ch_idx; + ivas_error error; + + error = IVAS_ERR_OK; + + /* set the md map */ + if ( st_ivas->hDirAC && !( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC && st_ivas->sba_mode == SBA_MODE_DIRAC ) ) + { + ivas_dirac_dec_set_md_map( st_ivas, nCldfbSlots ); + } + if ( st_ivas->sba_mode == SBA_MODE_SPAR ) + { + ivas_spar_dec_digest_tc( st_ivas, st_ivas->nchan_transport, nCldfbSlots, nSamplesForRendering ); + } + if ( st_ivas->hDiracDecBin != NULL && ( st_ivas->hDiracDecBin->useTdDecorr ) ) + { + int16_t nSamplesLeftForTD, default_frame; + float *decorr_signal[BINAURAL_CHANNELS]; + float *p_tc[2 * BINAURAL_CHANNELS]; + default_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + nSamplesLeftForTD = nSamplesForRendering; + for ( ch_idx = 0; ch_idx < BINAURAL_CHANNELS; ch_idx++ ) + { + decorr_signal[ch_idx] = st_ivas->hTcBuffer->tc[ch_idx + BINAURAL_CHANNELS]; + p_tc[ch_idx] = st_ivas->hTcBuffer->tc[ch_idx]; + } + while ( nSamplesLeftForTD ) + { + int16_t nSamplesToDecorr = min( nSamplesLeftForTD, default_frame ); + ivas_td_decorr_process( st_ivas->hDiracDecBin->hTdDecorr, p_tc, decorr_signal, nSamplesToDecorr ); + for ( ch_idx = 0; ch_idx < BINAURAL_CHANNELS; ch_idx++ ) + { + decorr_signal[ch_idx] += nSamplesToDecorr; + p_tc[ch_idx] += nSamplesToDecorr; + } + nSamplesLeftForTD -= nSamplesToDecorr; + } + } + /* if we have a late CNG generation, do it here */ + if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->sba_mode != SBA_MODE_SPAR ) + { + Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; + generate_masking_noise_lb_dirac( st->hFdCngDec->hFdCngCom, st_ivas->hTcBuffer->tc[1], nCldfbSlots, st->cna_dirac_flag && st->flag_cna ); + } + return error; +} + +void ivas_sba_dec_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ +) +{ + int16_t slots_to_render, first_sf, last_sf, subframe_idx; + uint16_t slot_size, ch; + uint16_t nchan_internal, sba_order_internal, nchan_out; + SPAR_DEC_HANDLE hSpar; + float *output_f_local[MAX_OUTPUT_CHANNELS]; + + hSpar = st_ivas->hSpar; + sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); + nchan_internal = ivas_sba_get_nchan_metadata( sba_order_internal ); + nchan_out = nchan_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; +#ifdef DEBUGGING + assert( hSpar ); +#endif + for ( ch = 0; ch < nchan_out; ch++ ) + { + output_f_local[ch] = output_f[ch]; + } + slot_size = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + slots_to_render = min( hSpar->num_slots - hSpar->slots_rendered, nSamplesAsked / slot_size ); + *nSamplesRendered = slots_to_render * slot_size; + first_sf = hSpar->subframes_rendered; + last_sf = first_sf; + while ( slots_to_render > 0 ) + { + slots_to_render -= hSpar->subframe_nbslots[last_sf]; + last_sf++; + } +#ifdef DEBUGGING + assert( slots_to_render == 0 ); +#endif + for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) + { + int16_t n_samples_sf = slot_size * hSpar->subframe_nbslots[subframe_idx]; + ivas_spar_dec_upmixer_sf( st_ivas, output_f_local, nchan_internal ); + for ( ch = 0; ch < nchan_out; ch++ ) + { + output_f_local[ch] += n_samples_sf; + } + } + + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC ) + { + ivas_sba_linear_renderer( output_f, *nSamplesRendered, st_ivas->hIntSetup.nchan_out_woLFE, st_ivas->hDecoderConfig->output_config, st_ivas->hOutSetup, st_ivas->hoa_dec_mtx ); + } + if ( st_ivas->hDirAC != NULL && hSpar->slots_rendered == hSpar->num_slots ) + { + if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 ) + { + st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_CLDFB_TIMESLOTS ) % st_ivas->hDirAC->dirac_md_buffer_length; + } + else + { + st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % st_ivas->hDirAC->dirac_md_buffer_length; + } + } + *nSamplesAvailable = ( hSpar->num_slots - hSpar->slots_rendered ) * slot_size; + + return; +} +#endif diff --git a/lib_dec/ivas_sba_rendering_internal.c b/lib_dec/ivas_sba_rendering_internal.c index a80986b39e..bc9b4cb7cb 100644 --- a/lib_dec/ivas_sba_rendering_internal.c +++ b/lib_dec/ivas_sba_rendering_internal.c @@ -65,6 +65,9 @@ void ivas_sba2mc_cldfb( float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: cldfb imag part */ const int16_t nb_channels_out, /* i : nb of output channels */ const int16_t nb_bands, /* i : nb of CLDFB bands to process */ +#ifdef JBM_TSM_ON_TCS + const int16_t nb_timeslots, /* i : number of time slots to process */ +#endif const float *hoa_dec_mtx /* i : HOA decoding mtx */ ) { @@ -89,7 +92,11 @@ void ivas_sba2mc_cldfb( g = hoa_dec_mtx[SBA_NHARM_HOA3 * n + m]; p_realOut = realOut[n]; p_imagOut = imagOut[n]; +#ifdef JBM_TSM_ON_TCS + for ( iBlock = 0; iBlock < nb_timeslots; iBlock++ ) +#else for ( iBlock = 0; iBlock < MAX_PARAM_SPATIAL_SUBFRAMES; iBlock++ ) +#endif { p_real = RealBuffer[m][iBlock]; p_imag = ImagBuffer[m][iBlock]; @@ -108,7 +115,11 @@ void ivas_sba2mc_cldfb( { p_realOut = realOut[n]; p_imagOut = imagOut[n]; +#ifdef JBM_TSM_ON_TCS + for ( iBlock = 0; iBlock < nb_timeslots; iBlock++ ) +#else for ( iBlock = 0; iBlock < MAX_PARAM_SPATIAL_SUBFRAMES; iBlock++ ) +#endif { p_real = RealBuffer[n][iBlock]; p_imag = ImagBuffer[n][iBlock]; @@ -134,7 +145,12 @@ void ivas_sba2mc_cldfb( void ivas_mc2sba( IVAS_OUTPUT_SETUP hIntSetup, /* i : Format of decoder output */ +#ifdef JBM_TSM_ON_TCS + float *in_buffer_td[], /* i : MC signals (on input) and the HOA3 (on output) */ + float *buffer_td[], /* i/o: MC signals (on input) and the HOA3 (on output) */ +#else float buffer_td[][L_FRAME48k], /* i/o: MC signals (on input) and the HOA3 (on output) */ +#endif const int16_t output_frame, /* i : output frame length per channel */ const int16_t sba_order, /* i : Ambisonic (SBA) order */ const float gain_lfe /* i : gain for LFE, 0 = ignore LFE */ @@ -168,7 +184,11 @@ void ivas_mc2sba( /* Add LFE to omni W with gain*/ for ( k = 0; k < output_frame; k++ ) { +#ifdef JBM_TSM_ON_TCS + buffer_tmp[0][k] += gain_lfe * in_buffer_td[i][k]; +#else buffer_tmp[0][k] += gain_lfe * buffer_td[i][k]; +#endif } } @@ -194,7 +214,11 @@ void ivas_mc2sba( { for ( k = 0; k < output_frame; k++ ) { +#ifdef JBM_TSM_ON_TCS + buffer_tmp[j][k] += gains[j] * in_buffer_td[i][k]; +#else buffer_tmp[j][k] += gains[j] * buffer_td[i][k]; +#endif } } } @@ -279,7 +303,11 @@ int16_t ivas_sba_remapTCs( *-------------------------------------------------------------------------*/ void ivas_ism2sba( - float buffer_td[][L_FRAME48k], /* i/o: TD signal buffers */ +#ifdef JBM_TSM_ON_TCS + float *buffer_td[], /* i/o: TD signal buffers */ +#else + float buffer_td[][L_FRAME48k], /* i/o: TD signal buffers */ +#endif ISM_RENDERER_HANDLE hIsmRendererData, /* i/o: renderer data */ const ISM_METADATA_HANDLE hIsmMetaData[], /* i : object metadata */ const int16_t nchan_ism, /* i : number of objects */ @@ -335,6 +363,59 @@ void ivas_ism2sba( return; } +#ifdef JBM_TSM_ON_TCS +/*-------------------------------------------------------------------------* + * ivas_ism2sba() + * + * ISM transformed into SBA in TD domain. + *-------------------------------------------------------------------------*/ + +void ivas_ism2sba_sf( + float *buffer_in[], /* i : TC buffer */ + float *buffer_out[], /* o : TD signal buffers */ + ISM_RENDERER_HANDLE hIsmRendererData, /* i/o: renderer data */ + const int16_t num_objects, /* i : number of objects */ + const int16_t n_samples_to_render, /* i : output frame length per channel */ + const int16_t offset, /* i : offset for the interpolatr */ + const int16_t sba_order /* i : Ambisonic (SBA) order */ +) +{ + int16_t i, j, k; + float g1, *g2, *tc, *out, gain, prev_gain; + int16_t sba_num_chans; + + assert( ( sba_order <= 3 ) && "Only order up to 3 is supported!" ); + assert( hIsmRendererData != NULL && "hIsmRendererData not allocated!" ); + + + /* Init*/ + sba_num_chans = ( sba_order + 1 ) * ( sba_order + 1 ); + for ( j = 0; j < sba_num_chans; j++ ) + { + set_zero( buffer_out[j], n_samples_to_render ); + } + + for ( i = 0; i < num_objects; i++ ) + { + for ( j = 0; j < sba_num_chans; j++ ) + { + g2 = hIsmRendererData->interpolator + offset; + g1 = 1 - *g2; + tc = buffer_in[i] + offset; + out = buffer_out[j]; + gain = hIsmRendererData->gains[i][j]; + prev_gain = hIsmRendererData->prev_gains[i][j]; + for ( k = 0; k < n_samples_to_render; k++ ) + { + *( out++ ) += ( ( *( g2++ ) ) * gain + g1 * prev_gain ) * ( *( tc++ ) ); + g1 = 1.0f - *g2; + } + } + } + + return; +} +#endif /*-------------------------------------------------------------------* * ivas_sba_upmixer_renderer() @@ -348,6 +429,7 @@ void ivas_sba_upmixer_renderer( const int16_t output_frame /* i : output frame length */ ) { + int16_t i, nchan_internal; float temp; @@ -369,10 +451,17 @@ void ivas_sba_upmixer_renderer( /* Upmixer + Renderer */ ivas_spar_dec_upmixer( st_ivas, output, nchan_internal, output_frame ); - if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC ) - { +#ifdef JBM_TSM_ON_TCS + float *output_f[MAX_OUTPUT_CHANNELS]; + int16_t ch; + for (ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++) + { + output_f[ch] = output[ch]; + } + ivas_sba_linear_renderer( output_f, output_frame, st_ivas->hIntSetup.nchan_out_woLFE, st_ivas->hDecoderConfig->output_config, st_ivas->hOutSetup, st_ivas->hoa_dec_mtx ); +#else ivas_sba_linear_renderer( output, output_frame, st_ivas->hIntSetup.nchan_out_woLFE, st_ivas->hDecoderConfig->output_config, st_ivas->hOutSetup, st_ivas->hoa_dec_mtx ); - } +#endif pop_wmops(); @@ -387,7 +476,11 @@ void ivas_sba_upmixer_renderer( *-------------------------------------------------------------------*/ static void ivas_sba_mtx_mult( - float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ +#ifdef JBM_TSM_ON_TCS + float *output_f[], /* i/o: synthesized core-corder transport channels/DirAC output */ +#else + float output_f[][L_FRAME48k], /* i/o: synthesized core-corder transport channels/DirAC output */ +#endif const int16_t output_frame, /* i : output frame length per channel */ const int16_t nchan_in, /* i : Number of ambisonic channels */ const IVAS_OUTPUT_SETUP output_setup, /* i : Output configuration */ @@ -447,7 +540,11 @@ static void ivas_sba_mtx_mult( *-------------------------------------------------------------------*/ ivas_error ivas_sba_linear_renderer( - float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ +#ifdef JBM_TSM_ON_TCS + float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ +#else + float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ +#endif const int16_t output_frame, /* i : output frame length per channel */ const int16_t nchan_in, /* i : number of input ambisonics channels */ const AUDIO_CONFIG output_config, /* i : output audio configuration */ diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 01e4db2ed4..4f74ae0c7a 100644 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -173,6 +173,34 @@ ivas_error ivas_spar_dec_open( ivas_output_init( &( st_ivas->hTransSetup ), st_ivas->transport_config ); +#ifdef JBM_TSM_ON_TCS + set_s( hSpar->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); + set_s( hSpar->subframe_nbslots, JBM_CLDFB_SLOTS_IN_SUBFRAME, DEFAULT_JBM_SUBFRAMES_5MS ); + hSpar->nb_subframes = DEFAULT_JBM_SUBFRAMES_5MS; + hSpar->subframes_rendered = 0; + hSpar->slots_rendered = 0; + hSpar->num_slots = DEFAULT_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME; + /* init render timeslot mapping */ + { + int16_t map_idx; + set_s( hSpar->render_to_md_slot_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); + for ( map_idx = 0; map_idx < DEFAULT_JBM_CLDFB_TIMESLOTS; map_idx++ ) + { + hSpar->render_to_md_slot_map[map_idx] = map_idx; + } + } + /* allocate transport channels*/ + if ( st_ivas->hDecoderConfig->voip_active == 1 && st_ivas->hTcBuffer == NULL && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && st_ivas->renderer_type != RENDERER_STEREO_PARAMETRIC ) + { + int16_t nchan_to_allocate; + nchan_to_allocate = num_channels_internal; /*st_ivas->nchan_transport;*/ + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, ivas_jbm_dec_get_num_tc_channels( st_ivas ), nchan_to_allocate,nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } +#endif + st_ivas->hSpar = hSpar; return error; @@ -891,19 +919,306 @@ static void ivas_spar_get_skip_mat( return; } +#ifdef JBM_TSM_ON_TCS +void ivas_spar_dec_agc_pca( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float output[][L_FRAME48k], /* i/o: input/output audio channels */ + const int16_t output_frame /* i : output frame length */ +) + +{ + + int16_t nchan_transport; + int16_t num_in_ingest; + DECODER_CONFIG_HANDLE hDecoderConfig; + SPAR_DEC_HANDLE hSpar; + + push_wmops( "ivas_spar_dec_agc_pca" ); + + hSpar = st_ivas->hSpar; + hDecoderConfig = st_ivas->hDecoderConfig; + nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; + + if ( st_ivas->nchan_transport >= 3 ) + { + float temp; + int16_t i; + /*convert WYZX downmix to WYXZ*/ + for ( i = 0; i < output_frame; i++ ) + { + temp = output[2][i]; + output[2][i] = output[3][i]; + output[3][i] = temp; + } + } + + if ( hSpar->hMdDec->td_decorr_flag ) + { + num_in_ingest = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order ); + } + else + { + num_in_ingest = nchan_transport; + } + /*---------------------------------------------------------------------* + * AGC + *---------------------------------------------------------------------*/ + + ivas_agc_dec_process( hSpar->hAgcDec, output, output, nchan_transport, output_frame ); +#ifdef DEBUG_SBA_AUDIO_DUMP + /* Dump audio signal after ivas_agc_dec_process */ + ivas_spar_dump_signal_wav( output_frame, NULL, output, st_ivas->nchan_transport, spar_foa_dec_wav[1], "ivas_agc_dec_process()" ); +#endif +#ifdef DEBUG_MODE_JBM + { + int k; + dbgwritewav( output_frame, NULL, output, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, "res/spar_dec_agc_process.wav" ); + for ( k = 0; k < st_ivas->nchan_transport; k++ ) + { + char filename[100]; + sprintf( filename, "res/spar_dec_agc_process_%d.dat", k ); + dbgwrite( output[k], sizeof( float ), output_frame, 1, filename ); + } + } +#endif + if ( hSpar->hPCA != NULL ) + { + ivas_pca_dec( hSpar->hPCA, output_frame, num_in_ingest, hDecoderConfig->ivas_total_brate, hDecoderConfig->last_ivas_total_brate, st_ivas->bfi, output ); +#ifdef DEBUG_SBA_AUDIO_DUMP + /* Dump audio signal after ivas_pca_dec */ + ivas_spar_dump_signal_wav( output_frame, NULL, output, num_in_ingest, spar_foa_dec_wav[2], "ivas_pca_dec()" ); +#endif +#ifdef DEBUG_MODE_JBM + { + int k; + dbgwritewav( output_frame, NULL, output, num_in_ingest, st_ivas->hDecoderConfig->output_Fs, "res/spar_pca_dec.wav" ); + for ( k = 0; k < num_in_ingest; k++ ) + { + char filename[100]; + sprintf( filename, "res/spar_pca_dec_%d.dat", k ); + dbgwrite( output[k], sizeof( float ), output_frame, 1, filename ); + } + } +#endif + } + pop_wmops(); + return; +} +void ivas_spar_dec_set_render_map( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + int16_t nCldfbTs ) +{ + SPAR_DEC_HANDLE hSpar; + + hSpar = st_ivas->hSpar; +#ifdef DEBUGGING + assert( hSpar ); +#endif + + /* adapt subframes */ + hSpar->num_slots = nCldfbTs; + hSpar->slots_rendered = 0; + hSpar->subframes_rendered = 0; + set_s( hSpar->render_to_md_slot_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); + ivas_jbm_dec_get_adapted_subframes( nCldfbTs, hSpar->subframe_nbslots, &hSpar->nb_subframes ); + ivas_jbm_dec_get_md_map( DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbTs, 1, 0, DEFAULT_JBM_CLDFB_TIMESLOTS, hSpar->render_to_md_slot_map ); + + return; +} /*-------------------------------------------------------------------* * ivas_spar_dec_upmixer() * * IVAS SPAR upmixer *-------------------------------------------------------------------*/ +void ivas_spar_dec_set_render_params( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t n_cldfb_slots /* i : number of cldfb slots in this frame */ +) +{ + SPAR_DEC_HANDLE hSpar; + int16_t nchan_transport; + int16_t num_bands_out; + + hSpar = st_ivas->hSpar; + /*---------------------------------------------------------------------* + * Gen umx mat + *---------------------------------------------------------------------*/ + nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; + num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; + ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, st_ivas->bfi ); + + ivas_spar_dec_set_render_map( st_ivas, n_cldfb_slots ); + + return; +} + +void ivas_spar_dec_digest_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int16_t nCldfbSlots, /* i : number of CLDFB slots */ + const int16_t nSamplesForRendering /* i : number of samples provided */ +) +{ + SPAR_DEC_HANDLE hSpar; + + hSpar = st_ivas->hSpar; + if ( hSpar->hMdDec->td_decorr_flag && !( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) + { + float Pcm_tmp[MAX_SPAR_INTERNAL_CHANNELS][L_FRAME48k]; + float *pPcm_tmp[MAX_SPAR_INTERNAL_CHANNELS]; + float *p_tc[MAX_SPAR_INTERNAL_CHANNELS]; + int16_t nchan_internal, ch, sba_order_internal; + int16_t nSamplesLeftForTD, default_frame; + /* TD decorrelator */ + default_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + nSamplesLeftForTD = nSamplesForRendering; + sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); + nchan_internal = ivas_sba_get_nchan_metadata( sba_order_internal ); + for ( ch = 0; ch < nchan_internal; ch++ ) + { + pPcm_tmp[ch] = Pcm_tmp[ch]; + p_tc[ch] = st_ivas->hTcBuffer->tc[ch]; + } + + while ( nSamplesLeftForTD ) + { + int16_t nSamplesToDecorr = min( nSamplesLeftForTD, default_frame ); + ivas_td_decorr_process( hSpar->hTdDecorr, p_tc, pPcm_tmp, nSamplesToDecorr ); + for ( ch = 0; ch < nchan_internal - nchan_transport; ch++ ) + { + mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - ch], p_tc[nchan_internal - 1 - ch], nSamplesToDecorr ); + } + for ( ch = 0; ch < nchan_internal; ch++ ) + { + p_tc[ch] += nSamplesToDecorr; + } + nSamplesLeftForTD -= nSamplesToDecorr; + } +#ifdef DEBUG_MODE_JBM + dbgwritewav( nSamplesForRendering, st_ivas->tc, NULL, nchan_internal, st_ivas->hDecoderConfig->output_Fs, "res/spar_dec_td_decorr.wav" ); +#endif + } + + ivas_spar_dec_set_render_params( st_ivas, nCldfbSlots ); + + + return; +} + +void ivas_spar_dec_upmixer( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float output[][L_FRAME48k], /* i/o: input/output audio channels */ + const int16_t nchan_internal, /* i : number of internal channels */ + const int16_t output_frame /* i : output frame length */ +) +{ + SPAR_DEC_HANDLE hSpar; + int16_t nchan_transport, nchan_out; + int16_t subframe_idx, n, i; + int16_t n_samples_sf; + float *output_f_local[MAX_OUTPUT_CHANNELS]; + float Pcm_tmp[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + float *pPcm_tmp[MAX_OUTPUT_CHANNELS]; + + hSpar = st_ivas->hSpar; + nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; + nchan_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; + n_samples_sf = JBM_CLDFB_SLOTS_IN_SUBFRAME * NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + for ( n = 0; n < MAX_OUTPUT_CHANNELS; n++ ) + { + output_f_local[n] = &output[n][0]; + } + for ( n = 0; n < nchan_internal; n++ ) + { + st_ivas->hTcBuffer->tc[n] = output[n]; + } + + /*---------------------------------------------------------------------* + * TD decorrelation + *---------------------------------------------------------------------*/ + for ( i = 0; i < nchan_internal; i++ ) + { + pPcm_tmp[i] = Pcm_tmp[i]; + } + if ( hSpar->hMdDec->td_decorr_flag ) + { + ivas_td_decorr_process( hSpar->hTdDecorr, st_ivas->hTcBuffer->tc, pPcm_tmp, output_frame ); + for ( i = 0; i < nchan_internal - nchan_transport; i++ ) + { + mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], st_ivas->hTcBuffer->tc[nchan_internal - 1 - i], output_frame ); + } +#ifdef DEBUG_MODE_JBM + { + int k; + dbgwritewav( output_frame, st_ivas->tc, output, nchan_internal, st_ivas->hDecoderConfig->output_Fs, "res/spar_dec_td_decorr.wav" ); + for ( k = 0; k < nchan_internal; k++ ) + { + char filename[100]; + sprintf( filename, "res/spar_dec__tdcorr_%d.dat", k ); + dbgwrite( st_ivas->tc[k], sizeof( float ), output_frame, 1, filename ); + } + } +#endif + } + + + ivas_spar_dec_set_render_params( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS ); + + if ( st_ivas->hDirAC != 0 ) + { + ivas_dirac_dec_set_md_map( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS ); + } + + for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) + { + ivas_spar_dec_upmixer_sf( st_ivas, output_f_local, nchan_internal ); + for ( n = 0; n < nchan_out; n++ ) + { + output_f_local[n] += n_samples_sf; + } + } + for ( n = 0; n < nchan_internal; n++ ) + { + st_ivas->hTcBuffer->tc[n] = NULL; + } + if ( st_ivas->hDirAC != 0 ) + { + if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 ) + { + st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_CLDFB_TIMESLOTS ) % st_ivas->hDirAC->dirac_md_buffer_length; + } + else + { + st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % st_ivas->hDirAC->dirac_md_buffer_length; + } + } + return; +} +#endif + + +#ifdef JBM_TSM_ON_TCS +/*-------------------------------------------------------------------* + * ivas_spar_dec_upmixer_sf() + * + * IVAS SPAR upmixer + *-------------------------------------------------------------------*/ +void ivas_spar_dec_upmixer_sf( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float *output[], /* o : output audio channels */ + const int16_t nchan_internal /* i : number of internal channels */ +) +#else void ivas_spar_dec_upmixer( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ float output[][L_FRAME48k], /* i/o: input/output audio channels */ const int16_t nchan_internal, /* i : number of internal channels */ const int16_t output_frame /* i : output frame length */ ) +#endif { int16_t cldfb_band, num_cldfb_bands, numch_in, numch_out; float *cldfb_in_ts_re[MAX_OUTPUT_CHANNELS][CLDFB_NO_COL_MAX]; @@ -911,6 +1226,11 @@ void ivas_spar_dec_upmixer( int16_t i, b, ts, out_ch, in_ch; int16_t num_spar_bands, spar_band, nchan_transport; int16_t num_in_ingest, num_bands_out, split_band; +#ifdef JBM_TSM_ON_TCS + int16_t output_frame, slot_size, slot_idx_start, slot_idx_start_cldfb; + float *p_tc[MAX_OUTPUT_CHANNELS]; + int16_t md_idx; +#endif float Pcm_tmp[MAX_OUTPUT_CHANNELS][L_FRAME48k]; int16_t numch_out_dirac; float *pPcm_tmp[MAX_OUTPUT_CHANNELS]; @@ -919,7 +1239,11 @@ void ivas_spar_dec_upmixer( DECODER_CONFIG_HANDLE hDecoderConfig; SPAR_DEC_HANDLE hSpar; +#ifdef JBM_TSM_ON_TCS + push_wmops( "ivas_spar_dec_upmixer_sf" ); +#else push_wmops( "ivas_spar_dec_upmixer" ); +#endif hSpar = st_ivas->hSpar; hDecoderConfig = st_ivas->hDecoderConfig; @@ -930,6 +1254,17 @@ void ivas_spar_dec_upmixer( numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; numch_out = hSpar->hFbMixer->fb_cfg->num_out_chans; +#ifdef JBM_TSM_ON_TCS + slot_size = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + output_frame = hSpar->subframe_nbslots[hSpar->subframes_rendered] * slot_size; + slot_idx_start = hSpar->slots_rendered; + slot_idx_start_cldfb = 0; + for ( i = 0; i < nchan_internal; i++ ) + { + p_tc[i] = st_ivas->hTcBuffer->tc[i] + slot_idx_start * slot_size; + } +#endif + #ifdef DEBUG_SPAR_BYPASS_EVS_CODEC /* by-pass core-coder */ /*write the core coder output to a file for debugging*/ @@ -967,17 +1302,22 @@ void ivas_spar_dec_upmixer( } #endif +#ifndef JBM_TSM_ON_TCS /*---------------------------------------------------------------------* * AGC *---------------------------------------------------------------------*/ ivas_agc_dec_process( hSpar->hAgcDec, output, output, nchan_transport, output_frame ); + #ifdef DEBUG_SBA_AUDIO_DUMP /* Dump audio signal after ivas_agc_dec_process */ ivas_spar_dump_signal_wav( output_frame, NULL, output, st_ivas->nchan_transport, spar_foa_dec_wav[1], "ivas_agc_dec_process()" ); #endif - +#ifdef DEBUG_MODE_JBM + dbgwritewav( output_frame, NULL, output, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, "res/spar_dec_agc_process.wav" ); +#endif +#endif /*---------------------------------------------------------------------* * TD Decorr and pcm ingest *---------------------------------------------------------------------*/ @@ -1003,16 +1343,30 @@ void ivas_spar_dec_upmixer( hSpar->pca_ingest_channels = num_in_ingest; #endif +#ifndef JBM_TSM_ON_TCS /* will already happen in the TC decoding */ if ( hSpar->hPCA != NULL ) { ivas_pca_dec( hSpar->hPCA, output_frame, num_in_ingest, hDecoderConfig->ivas_total_brate, hDecoderConfig->last_ivas_total_brate, st_ivas->bfi, output ); #ifdef DEBUG_SBA_AUDIO_DUMP /* Dump audio signal after ivas_pca_dec */ ivas_spar_dump_signal_wav( output_frame, NULL, output, num_in_ingest, spar_foa_dec_wav[2], "ivas_pca_dec()" ); +#endif +#ifdef DEBUG_MODE_JBM + dbgwritewav( output_frame, NULL, output, num_in_ingest, st_ivas->hDecoderConfig->output_Fs, "res/spar_pca_dec.wav" ); + { + int k; + for ( k = 0; k < num_in_ingest; k++ ) + { + char filename[100]; + sprintf( filename, "res/spar_pca_dec_%d.dat", k ); + dbgwrite( output[k], sizeof( float ), output_frame, 1, filename ); + } + } #endif } +#endif - +#ifndef JBM_TSM_ON_TCS /*---------------------------------------------------------------------* * TD decorrelation *---------------------------------------------------------------------*/ @@ -1020,13 +1374,24 @@ void ivas_spar_dec_upmixer( if ( hSpar->hMdDec->td_decorr_flag ) { ivas_td_decorr_process( hSpar->hTdDecorr, output, pPcm_tmp, output_frame ); - for ( i = 0; i < nchan_internal - nchan_transport; i++ ) { mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], output[nchan_internal - 1 - i], output_frame ); } +#ifdef DEBUG_MODE_JBM + dbgwritewav( output_frame, NULL, output, nchan_internal, st_ivas->hDecoderConfig->output_Fs, "res/spar_dec_td_decorr.wav" ); + { + int k; + for ( k = 0; k < nchan_internal; k++ ) + { + char filename[100]; + sprintf( filename, "res/spar_dec__tdcorr_%d.dat", k ); + dbgwrite( output[k], sizeof( float ), output_frame, 1, filename ); + } + } +#endif } - +#endif hSpar->hFbMixer->fb_cfg->num_in_chans = num_in_ingest; @@ -1059,12 +1424,13 @@ void ivas_spar_dec_upmixer( } } +#ifndef JBM_TSM_ON_TCS /*---------------------------------------------------------------------* * Gen umx mat *---------------------------------------------------------------------*/ ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, st_ivas->bfi ); - +#endif /*---------------------------------------------------------------------* * CLDFB Processing and Synthesis @@ -1078,15 +1444,55 @@ void ivas_spar_dec_upmixer( numch_out_dirac = hDecoderConfig->nchan_out; +#ifdef DEBUG_SBA_AUDIO_DUMP + /* Dump audio signal after ivas_agc_dec_process */ +#ifdef JBM_TSM_ON_TCS + ivas_spar_dump_signal_wav( output_frame, p_tc, NULL, numch_in, spar_foa_dec_wav[4], "ivas_spar_upmixer()" ); +#else + ivas_spar_dump_signal_wav( output_frame, NULL, output, numch_in, spar_foa_dec_wav[4], "ivas_spar_upmixer()" ); +#endif +#endif +#ifdef DEBUG_MODE_JBM + { + + int k; +#ifdef JBM_TSM_ON_TCS + dbgwritewav( output_frame, p_tc, output, numch_in, st_ivas->hDecoderConfig->output_Fs, "res/spar_cldfb_input.wav" ); +#else + dbgwritewav( output_frame, NULL, output, numch_in, st_ivas->hDecoderConfig->output_Fs, "res/spar_cldfb_input.wav" ); +#endif + for ( k = 0; k < numch_in; k++ ) + { + char filename[100]; + sprintf( filename, "res/spar_upmixer_in_%d.dat", k ); +#ifdef JBM_TSM_ON_TCS + dbgwrite( p_tc[k], sizeof( float ), output_frame, 1, filename ); +#else + dbgwrite( output[k], sizeof( float ), output_frame, 1, filename ); +#endif + } + } +#endif + +#ifndef JBM_TSM_ON_TCS for ( int16_t i_sf = 0; i_sf < MAX_PARAM_SPATIAL_SUBFRAMES; i_sf++ ) { +#endif /* CLDFB analysis of incoming frame */ for ( in_ch = 0; in_ch < numch_in; in_ch++ ) { - for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) +#ifdef JBM_TSM_ON_TCS + for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) +#else + for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) +#endif { cldfbAnalysis_ts( - &output[in_ch][( ts + i_sf * MAX_PARAM_SPATIAL_SUBFRAMES ) * num_cldfb_bands], +#ifdef JBM_TSM_ON_TCS + &p_tc[in_ch][ts * num_cldfb_bands], +#else + &output[in_ch][( ts + i_sf * MAX_PARAM_SPATIAL_SUBFRAMES ) * num_cldfb_bands], +#endif cldfb_in_ts_re[in_ch][ts], cldfb_in_ts_im[in_ch][ts], num_cldfb_bands, @@ -1094,11 +1500,19 @@ void ivas_spar_dec_upmixer( } } - for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) +#ifdef JBM_TSM_ON_TCS + for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) +#else + for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) +#endif { - /* determine SPAR parameters for this time slots */ - ivas_spar_get_parameters( hSpar, hDecoderConfig, ts + i_sf * MAX_PARAM_SPATIAL_SUBFRAMES, numch_out, numch_in, num_spar_bands, mixer_mat ); - +#ifdef JBM_TSM_ON_TCS + md_idx = hSpar->render_to_md_slot_map[ts + slot_idx_start]; + ivas_spar_get_parameters( hSpar, hDecoderConfig, md_idx, numch_out, numch_in, num_spar_bands, mixer_mat ); +#else + /* determine SPAR parameters for this time slots */ + ivas_spar_get_parameters( hSpar, hDecoderConfig, ts + i_sf * MAX_PARAM_SPATIAL_SUBFRAMES, numch_out, numch_in, num_spar_bands, mixer_mat ); +#endif for ( cldfb_band = 0; cldfb_band < num_cldfb_bands; cldfb_band++ ) { float out_re[IVAS_SPAR_MAX_CH]; @@ -1144,11 +1558,43 @@ void ivas_spar_dec_upmixer( cldfb_in_ts_im[out_ch][ts][cldfb_band] = out_im[out_ch]; } } +#ifdef JBM_TSM_ON_TCS + if ( ( ( slot_idx_start + ts + 1 ) == hSpar->num_slots ) || ( ( md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME ) != ( hSpar->render_to_md_slot_map[ts + slot_idx_start + 1] / JBM_CLDFB_SLOTS_IN_SUBFRAME ) ) ) + { + /* we have crossed an unadapted parameter sf border, update previous mixing matrices */ + int16_t md_sf = md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME; + split_band = SPAR_DIRAC_SPLIT_START_BAND; + if ( split_band < IVAS_MAX_NUM_BANDS ) + { + mvr2r( hSpar->hMdDec->mixer_mat_prev[1][0][0], hSpar->hMdDec->mixer_mat_prev[0][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + mvr2r( hSpar->hMdDec->mixer_mat_prev[2][0][0], hSpar->hMdDec->mixer_mat_prev[1][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + mvr2r( hSpar->hMdDec->mixer_mat_prev[3][0][0], hSpar->hMdDec->mixer_mat_prev[2][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + mvr2r( hSpar->hMdDec->mixer_mat_prev[4][0][0], hSpar->hMdDec->mixer_mat_prev[3][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + + for ( out_ch = 0; out_ch < numch_out; out_ch++ ) + { + for ( in_ch = 0; in_ch < numch_in; in_ch++ ) + { + for ( b = 0; b < num_spar_bands; b++ ) + { + hSpar->hMdDec->mixer_mat_prev[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][b + md_sf * IVAS_MAX_NUM_BANDS]; + } + } + } + hSpar->i_subframe++; + hSpar->i_subframe = min( hSpar->i_subframe, MAX_PARAM_SPATIAL_SUBFRAMES ); + } + } +#endif } if ( hDecoderConfig->output_config != AUDIO_CONFIG_FOA && hDecoderConfig->output_config != AUDIO_CONFIG_STEREO && hDecoderConfig->output_config != AUDIO_CONFIG_MONO ) { - ivas_dirac_dec( st_ivas, output, nchan_internal, cldfb_in_ts_re, cldfb_in_ts_im, i_sf ); +#ifdef JBM_TSM_ON_TCS + ivas_dirac_dec_render_sf( st_ivas, output, nchan_internal, cldfb_in_ts_re, cldfb_in_ts_im ); +#else + ivas_dirac_dec( st_ivas, output, nchan_internal, cldfb_in_ts_re, cldfb_in_ts_im, i_sf ); +#endif } if ( st_ivas->hDirAC != NULL ) @@ -1162,8 +1608,11 @@ void ivas_spar_dec_upmixer( { if ( ( st_ivas->hOutSetup.num_lfe > 0 ) && ( st_ivas->hOutSetup.index_lfe[idx_lfe] == ch ) ) { - set_zero( &( output[ch][i_sf * MAX_PARAM_SPATIAL_SUBFRAMES * num_cldfb_bands] ), MAX_PARAM_SPATIAL_SUBFRAMES * num_cldfb_bands ); - +#ifdef JBM_TSM_ON_TCS + set_zero( output[ch], hSpar->subframe_nbslots[hSpar->subframes_rendered] * num_cldfb_bands ); +#else + set_zero( &( output[ch][i_sf * MAX_PARAM_SPATIAL_SUBFRAMES * num_cldfb_bands] ), MAX_PARAM_SPATIAL_SUBFRAMES * num_cldfb_bands ); +#endif if ( idx_lfe < ( st_ivas->hDirAC->hOutSetup.num_lfe - 1 ) ) { idx_lfe++; @@ -1173,12 +1622,20 @@ void ivas_spar_dec_upmixer( { if ( hDecoderConfig->output_config == AUDIO_CONFIG_FOA || !( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) { - for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) +#ifdef JBM_TSM_ON_TCS + for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) +#else + for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) +#endif { cldfbSynthesis( &cldfb_in_ts_re[idx_in][ts], &cldfb_in_ts_im[idx_in][ts], - &output[ch][( ts + i_sf * MAX_PARAM_SPATIAL_SUBFRAMES ) * num_cldfb_bands], +#ifdef JBM_TSM_ON_TCS + &output[ch][ts * num_cldfb_bands], +#else + &output[ch][( ts + i_sf * MAX_PARAM_SPATIAL_SUBFRAMES ) * num_cldfb_bands], +#endif num_cldfb_bands, st_ivas->cldfbSynDec[idx_in] ); } @@ -1195,12 +1652,20 @@ void ivas_spar_dec_upmixer( /* CLDFB to time synthesis (overwrite mixer output) */ for ( out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) { - for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) +#ifdef JBM_TSM_ON_TCS + for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) +#else + for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) +#endif { cldfbSynthesis( &cldfb_in_ts_re[out_ch][ts], &cldfb_in_ts_im[out_ch][ts], - &output[out_ch][( ts + i_sf * MAX_PARAM_SPATIAL_SUBFRAMES ) * num_cldfb_bands], +#ifdef JBM_TSM_ON_TCS + &output[out_ch][ts * num_cldfb_bands], +#else + &output[out_ch][( ts + i_sf * MAX_PARAM_SPATIAL_SUBFRAMES ) * num_cldfb_bands], +#endif num_cldfb_bands, st_ivas->cldfbSynDec[out_ch] ); } @@ -1214,6 +1679,7 @@ void ivas_spar_dec_upmixer( ivas_spar_dump_signal_wav( output_frame, NULL, output, hSpar->numOutChannels, spar_foa_dec_wav[3], "cldfbSynthesis()" ); #endif +#ifndef JBM_TSM_ON_TCS split_band = SPAR_DIRAC_SPLIT_START_BAND; if ( split_band < IVAS_MAX_NUM_BANDS ) { @@ -1235,8 +1701,14 @@ void ivas_spar_dec_upmixer( } } } +#endif +#ifndef JBM_TSM_ON_TCS } - +#endif +#ifdef JBM_TSM_ON_TCS + hSpar->slots_rendered += hSpar->subframe_nbslots[hSpar->subframes_rendered]; + hSpar->subframes_rendered++; +#endif pop_wmops(); return; diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index 3b47d6500e..7f5d51f582 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -2661,7 +2661,11 @@ void ivas_spar_to_dirac( qmf_band_start = band_grouping[band]; qmf_band_end = band_grouping[band + 1]; +#ifdef JBM_TSM_ON_TCS + for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) +#else for ( block = 0; block < hDirAC->nb_subframes; block++ ) +#endif { int16_t ts_start, ts_end, ts; @@ -2683,6 +2687,7 @@ void ivas_spar_to_dirac( hDirAC->energy_ratio1[block][b] = en_ratio; tmp_write_idx_band = tmp_write_idx_param_band; + /* TODO: JBM */ if ( hDirAC->hConfig->dec_param_estim == FALSE ) { hDirAC->elevation[tmp_write_idx_band][b] = ele_dith; diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 4a17c75dda..276959a03b 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -435,7 +435,11 @@ typedef struct param_ism_rendering float *proto_matrix; float *interpolator; float mixing_matrix_lin_old[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_CHAN * PARAM_ISM_MAX_DMX]; - +#ifdef JBM_TSM_ON_TCS + float mixing_matrix_lin[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_CHAN * PARAM_ISM_MAX_DMX]; + float *Cldfb_RealBuffer_tc; + float *Cldfb_ImagBuffer_tc; +#endif } PARAM_ISM_RENDERING_DATA, *PARAM_ISM_RENDERING_HANDLE; @@ -571,6 +575,10 @@ typedef struct dirac_output_synthesis_cov_state_structure float *cy_old[CLDFB_NO_CHANNELS_MAX]; float *mixing_matrix_old[CLDFB_NO_CHANNELS_MAX]; float *mixing_matrix_res_old[CLDFB_NO_CHANNELS_MAX]; +#ifdef JBM_TSM_ON_TCS + float *mixing_matrix[CLDFB_NO_CHANNELS_MAX]; + float *mixing_matrix_res[CLDFB_NO_CHANNELS_MAX]; +#endif } DIRAC_OUTPUT_SYNTHESIS_COV_STATE; @@ -626,7 +634,18 @@ typedef struct ivas_dirac_dec_data_structure IVAS_OUTPUT_SETUP hOutSetup; int16_t slot_size; +#ifdef JBM_TSM_ON_TCS + int16_t subframe_nbslots[MAX_JBM_SUBFRAMES_5MS]; + int16_t subframes_rendered; + int16_t slots_rendered; + int16_t num_slots; + int16_t render_to_md_slot_map[MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME]; +#ifdef JBM_DIRAC_DEBUG_BE + int16_t voip_active; +#endif +#else int16_t subframe_nbslots; +#endif int16_t nb_subframes; int16_t num_freq_bands; @@ -734,7 +753,17 @@ typedef struct ivas_param_mc_dec_data_structure { int16_t slot_size; +#ifdef JBM_TSM_ON_TCS + float *Cldfb_RealBuffer_tc; + float *Cldfb_ImagBuffer_tc; + int16_t subframe_nbslots[MAX_JBM_SUBFRAMES_5MS]; + int16_t nb_subframes; + int16_t subframes_rendered; + int16_t slots_rendered; + int16_t num_slots; +#else int16_t subframe_nbslots; +#endif int16_t num_freq_bands; int16_t num_param_bands_synth; @@ -858,6 +887,14 @@ typedef struct ivas_spar_dec_lib_t int16_t numOutChannels; int16_t pca_ingest_channels; #endif +#ifdef JBM_TSM_ON_TCS + int16_t subframe_nbslots[MAX_JBM_SUBFRAMES_5MS]; + int16_t render_to_md_slot_map[MAX_JBM_CLDFB_TIMESLOTS]; + int16_t nb_subframes; + int16_t subframes_rendered; + int16_t slots_rendered; + int16_t num_slots; +#endif } SPAR_DEC_DATA, *SPAR_DEC_HANDLE; @@ -1027,7 +1064,12 @@ typedef struct vbap_data_structure typedef struct renderer_struct { float prev_gains[MAX_CICP_CHANNELS - 1][MAX_OUTPUT_CHANNELS]; +#ifdef JBM_TSM_ON_TCS + float *interpolator; + float gains[MAX_CICP_CHANNELS - 1][MAX_OUTPUT_CHANNELS]; +#else float interpolator[L_FRAME48k]; +#endif } ISM_RENDERER_DATA, *ISM_RENDERER_HANDLE; @@ -1148,9 +1190,35 @@ typedef struct decoder_config_structure #ifdef DEBUGGING int16_t force_rend; /* forced TD/CLDFB binaural renderer (for ISM and MC) */ #endif +#ifdef JBM_TSM_ON_TCS + int16_t voip_active; +#endif } DECODER_CONFIG, *DECODER_CONFIG_HANDLE; + +#ifdef JBM_TSM_ON_TCS +typedef struct decoder_tc_buffer_structure +{ + float *tc_buffer; /* the buffer itself */ + float *tc[MAX_TRANSPORT_CHANNELS]; /* pointers into the buffer to the beginning of each tc */ + TC_BUFFER_MODE tc_buffer_mode; /* mode of the buffer (no buffering, render buffering, out buffering) */ + int16_t nchan_transport_jbm; /* number of TCs after TC decoding */ + int16_t nchan_transport_internal; /* total number of TC buffer channels, can include e.g. TD decorr data */ + int16_t nchan_buffer_full; /* number of channels to be fully buffered */ + int16_t n_samples_available; /* samples still available for rendering in the current frame */ + int16_t n_samples_buffered; /* full number of samples in the buffer (including spill to next frame) */ + int16_t n_samples_rendered; /* samples already rendered in the current frame */ + int16_t n_samples_granularity; /* render granularity */ + int16_t n_samples_flushed; + int16_t subframe_nbslots[MAX_JBM_SUBFRAMES_5MS]; + int16_t nb_subframes; + int16_t subframes_rendered; + int16_t slots_rendered; + int16_t num_slots; + int16_t n_samples_discard; /* number of samples to discard from the beginning of the output */ +} DECODER_TC_BUFFER, *DECODER_TC_BUFFER_HANDLE; +#endif /*----------------------------------------------------------------------------------* * * Main IVAS decoder structure @@ -1244,6 +1312,10 @@ typedef struct Decoder_Struct int16_t ism_extmeta_active; /* Extended metadata active in decoder */ int16_t ism_extmeta_cnt; /* Change frame counter for extended metadata */ + +#ifdef JBM_TSM_ON_TCS + DECODER_TC_BUFFER_HANDLE hTcBuffer; +#endif } Decoder_Struct; /* clang-format on */ diff --git a/lib_dec/jbm_jb4sb.h b/lib_dec/jbm_jb4sb.h index 54b873b006..a2d85eddb6 100644 --- a/lib_dec/jbm_jb4sb.h +++ b/lib_dec/jbm_jb4sb.h @@ -78,6 +78,14 @@ struct JB4_DATAUNIT int16_t nextCoderType; }; +#ifdef JBM_TSM_ON_TCS +typedef enum +{ + JBM_RENDERER_NONE, + JBM_RENDERER_IVAS, +} JBM_RENDERER_TYPE; +#endif + typedef struct JB4_DATAUNIT *JB4_DATAUNIT_HANDLE; diff --git a/lib_dec/jbm_pcmdsp_apa.c b/lib_dec/jbm_pcmdsp_apa.c index c816a9d9c8..61b3256d58 100644 --- a/lib_dec/jbm_pcmdsp_apa.c +++ b/lib_dec/jbm_pcmdsp_apa.c @@ -66,7 +66,11 @@ struct apa_state_t { /* output buffer */ +#ifdef JBM_TSM_ON_TCS + float *buf_out; +#else int16_t *buf_out; +#endif uint16_t buf_out_capacity; uint16_t l_buf_out; @@ -86,6 +90,14 @@ struct apa_state_t /* total number of processed input samples since apa_reset() */ uint32_t l_in_total; +#ifdef JBM_TSM_ON_TCS + /* time resolution in samples of the IVAS renderer*/ + uint16_t l_ts; + + /* samples already available in the renderer buffer */ + uint16_t l_r_buf; +#endif + /* sum of inserted/removed samples since last apa_set_scale() */ int32_t diffSinceSetScale; /* number of input frames since last apa_set_scale() */ @@ -123,6 +135,17 @@ static float apa_corrEnergy2dB( float energy, uint16_t corr_len ); static float apa_getQualityIncreaseForLowEnergy( float energydB ); +#ifdef JBM_TSM_ON_TCS +static bool logarithmic_search( const apa_state_t *ps, const float *signal, int16_t s_start, uint16_t inlen, uint16_t offset, uint16_t fixed_pos, uint16_t corr_len, uint16_t wss, uint16_t css, int16_t *synchpos ); + +static bool find_synch( apa_state_t *ps, const float *in, uint16_t l_in, int16_t s_start, uint16_t s_len, int16_t fixed_pos, uint16_t corr_len, uint16_t offset, float *energy, float *quality, int16_t *synch_pos ); + +static bool copy_frm( apa_state_t *ps, const float frm_in[], float frm_out[], uint16_t *l_frm_out ); + +static bool shrink_frm( apa_state_t *ps, const float frm_in[], uint16_t maxScaling, float frm_out[], uint16_t *l_frm_out ); + +static bool extend_frm( apa_state_t *ps, const float frm_in[], float frm_out[], uint16_t *l_frm_out ); +#else static bool logarithmic_search( const apa_state_t *ps, const int16_t *signal, int16_t s_start, uint16_t inlen, uint16_t offset, uint16_t fixed_pos, uint16_t corr_len, uint16_t wss, uint16_t css, int16_t *synchpos ); static bool find_synch( apa_state_t *ps, const int16_t *in, uint16_t l_in, int16_t s_start, uint16_t s_len, int16_t fixed_pos, uint16_t corr_len, uint16_t offset, float *energy, float *quality, int16_t *synch_pos ); @@ -132,7 +155,7 @@ static bool copy_frm( apa_state_t *ps, const int16_t frm_in[], int16_t frm_out[] static bool shrink_frm( apa_state_t *ps, const int16_t frm_in[], uint16_t maxScaling, int16_t frm_out[], uint16_t *l_frm_out ); static bool extend_frm( apa_state_t *ps, const int16_t frm_in[], int16_t frm_out[], uint16_t *l_frm_out ); - +#endif /*---------------------------------------------------------------------* * Public functions @@ -196,9 +219,58 @@ void apa_reset( ps->bad_frame_count = 0; ps->good_frame_count = 0; +#ifdef JBM_TSM_ON_TCS + ps->l_ts = 1; + ps->l_r_buf = 0; +#endif return; } +#ifdef JBM_TSM_ON_TCS +uint8_t apa_reconfigure( + apa_state_t *ps, + uint16_t num_channels, + uint16_t l_ts ) +{ + + /* realloc buffer */ + free( ps->buf_out ); + ps->num_channels = (uint16_t) num_channels; + ps->buf_out_capacity = (uint16_t) ( APA_BUF_PER_CHANNEL * num_channels ); + ps->buf_out = (float *) malloc( sizeof( float ) * ps->buf_out_capacity ); + if ( !ps->buf_out ) + { + return 2; + } + ps->l_buf_out = 0; + ps->l_in_total = 0; + ps->l_ts = ps->num_channels * l_ts; + + /* set everything else dependent on the number of channels */ + /* set segment size */ + /* in the order of a pitch, set to 160 samples at 16 kHz */ + /* used for windowing and as the correlation length, i.e., */ + /* the size of the template segment. */ + ps->l_seg = ( ps->rate / 100 ) * ps->num_channels; + + /* set frame size */ + /* set to 320 samples at 16 kHz */ + ps->l_frm = ( ps->rate / FRAMES_PER_SEC ) * ps->num_channels; + + /* set minimum pitch */ + /* set to 40 samples at 16 kHz */ + /* (defines min change in number of samples, i.e., abs(l_in-l_out) >= p_min) */ + ps->p_min = ( ps->rate / 400 ) * ps->num_channels; + + /* set search length */ + /* must cover one pitch, set to 200 samples at 16 kHz */ + /* (the resulting maximum pitch is then p_min+l_search = 240 samples at 16 kHz) */ + ps->l_search = ( ps->rate / 80 ) * ps->num_channels; + + return 0; +} + +#endif /* Sets the audio configuration. */ bool apa_set_rate( @@ -302,6 +374,39 @@ bool apa_set_scale( return 0; } +#ifdef JBM_TSM_ON_TCS +bool apa_set_renderer_granularity( + apa_state_t *ps, + uint16_t l_ts ) +{ + /* make sure pointer is valid */ + if ( ps == NULL ) + { + return 1; + } + + + /* copy to state struct */ + ps->l_ts = l_ts * ps->num_channels; + return 0; +} + +bool apa_set_renderer_residual_samples( + apa_state_t *ps, + uint16_t l_r_buf ) +{ + /* make sure pointer is valid */ + if ( ps == NULL ) + { + return 1; + } + + + /* copy to state struct */ + ps->l_r_buf = l_r_buf * ps->num_channels; + return 0; +} +#endif /* ******************************************************************************** @@ -454,16 +559,28 @@ bool apa_exit( ******************************************************************************** */ uint8_t apa_exec( - apa_state_t *ps, /* i/o: state struct */ - const int16_t a_in[], /* i : input samples */ - uint16_t l_in, /* i : number of input samples */ - uint16_t maxScaling, /* i : allowed number of inserted/removed samples */ - int16_t a_out[], /* o : output samples */ - uint16_t *l_out /* o : number of output samples */ + apa_state_t *ps, /* i/o: state struct */ +#ifdef JBM_TSM_ON_TCS + const float a_in[], /* i : input samples */ +#else + const int16_t a_in[], /* i : input samples */ +#endif + uint16_t l_in, /* i : number of input samples */ + uint16_t maxScaling, /* i : allowed number of inserted/removed samples */ +#ifdef JBM_TSM_ON_TCS + float a_out[], /* o : output samples */ +#else + int16_t a_out[], /* o : output samples */ +#endif + uint16_t *l_out /* o : number of output samples */ ) { uint16_t i; +#ifdef JBM_TSM_ON_TCS + float frm_in[APA_BUF]; /* TODO(mcjbm): this buffer could be smaller - always allocates space for 16 channels */ +#else int16_t frm_in[APA_BUF]; /* TODO(mcjbm): this buffer could be smaller - always allocates space for 16 channels */ +#endif uint16_t l_frm_out; int16_t l_rem; int32_t dl_scaled, dl_copied, l_frm_out_target; @@ -525,8 +642,13 @@ uint8_t apa_exec( } else { +#ifdef JBM_TSM_ON_TCS + float *buf_out_ptr = &( ps->buf_out[ps->l_buf_out - ps->l_frm] ); + float *frm_in_ptr = &( frm_in[ps->l_frm] ); +#else int16_t *buf_out_ptr = &( ps->buf_out[ps->l_buf_out - ps->l_frm] ); int16_t *frm_in_ptr = &( frm_in[ps->l_frm] ); +#endif /* fill input frame */ /* 1st input frame: previous output samples */ @@ -581,8 +703,13 @@ uint8_t apa_exec( /* discard old samples; always keep at least most recent l_frm samples */ if ( ( ps->l_buf_out + l_frm_out ) > ps->buf_out_capacity ) { +#ifdef JBM_TSM_ON_TCS + float *buf_out_ptr1 = ps->buf_out; + float *buf_out_ptr2; +#else int16_t *buf_out_ptr1 = ps->buf_out; int16_t *buf_out_ptr2; +#endif l_rem = ( ps->l_frm - l_frm_out ); if ( l_rem < 0 ) @@ -602,7 +729,11 @@ uint8_t apa_exec( return 5; } { +#ifdef JBM_TSM_ON_TCS + float *buf_out_ptr = &( ps->buf_out[ps->l_buf_out] ); +#else int16_t *buf_out_ptr = &( ps->buf_out[ps->l_buf_out] ); +#endif for ( i = 0; i < l_frm_out; i++ ) { buf_out_ptr[i] = a_out[i]; @@ -660,7 +791,11 @@ uint8_t apa_exec( */ static void get_scaling_quality( const apa_state_t *ps, +#ifdef JBM_TSM_ON_TCS + const float *signal, +#else const int16_t *signal, +#endif uint16_t s_len, uint16_t offset, uint16_t corr_len, @@ -813,7 +948,11 @@ static float apa_getQualityIncreaseForLowEnergy( */ static bool logarithmic_search( const apa_state_t *ps, +#ifdef JBM_TSM_ON_TCS + const float *signal, +#else const int16_t *signal, +#endif int16_t s_start, uint16_t inlen, uint16_t offset, @@ -926,7 +1065,11 @@ static bool logarithmic_search( */ static bool find_synch( apa_state_t *ps, +#ifdef JBM_TSM_ON_TCS + const float *in, +#else const int16_t *in, +#endif uint16_t l_in, int16_t s_start, uint16_t s_len, @@ -981,8 +1124,13 @@ static bool find_synch( */ static bool copy_frm( apa_state_t *ps, +#ifdef JBM_TSM_ON_TCS + const float frm_in[], + float frm_out[], +#else const int16_t frm_in[], int16_t frm_out[], +#endif uint16_t *l_frm_out ) { uint16_t i; @@ -1029,9 +1177,17 @@ static bool copy_frm( */ static bool shrink_frm( apa_state_t *ps, +#ifdef JBM_TSM_ON_TCS + const float frm_in[], +#else const int16_t frm_in[], +#endif uint16_t maxScaling, +#ifdef JBM_TSM_ON_TCS + float frm_out[], +#else int16_t frm_out[], +#endif uint16_t *l_frm_out ) { bool findSynchResult = 0; @@ -1062,6 +1218,22 @@ static bool shrink_frm( /* maximum scaling */ energy = -65; quality = 5; +#ifdef JBM_TSM_ON_TCS + xtract = maxScaling; + /* take samples already in the renderer buf into account */ + xtract += ps->l_r_buf; + /* snap to renderer time slot borders */ + xtract -= ( ps->l_ts - ( l_frm - xtract + ps->l_r_buf ) % ps->l_ts ); + while ( xtract < 0 ) + { + xtract += ps->l_ts; + } + while ( xtract > ( s_end - ps->num_channels ) ) + { + /* exceeded the possible shrinking, go back one renderer ts*/ + xtract -= ps->l_ts; + } +#else if ( maxScaling != 0U && s_end > maxScaling + 1 ) { xtract = maxScaling; @@ -1071,6 +1243,7 @@ static bool shrink_frm( /* set to last valid element (i.e. element[len - 1] but note for stereo last element is last pair of samples) */ xtract = s_end - ps->num_channels; } +#endif } else { @@ -1165,8 +1338,13 @@ static bool shrink_frm( */ static bool extend_frm( apa_state_t *ps, +#ifdef JBM_TSM_ON_TCS + const float frm_in[], + float frm_out[], +#else const int16_t frm_in[], int16_t frm_out[], +#endif uint16_t *l_frm_out ) { bool findSynchResult = 0; @@ -1180,8 +1358,14 @@ static bool extend_frm( int16_t s_start = 0; float energy, quality = 0.0f; uint16_t l_frm, l_seg; +#ifdef JBM_TSM_ON_TCS + const float *fadeOut, *fadeIn; + float *out; +#else const int16_t *fadeOut, *fadeIn; int16_t *out; +#endif + l_frm = ps->l_frm; l_seg = ps->l_seg; @@ -1271,6 +1455,12 @@ static bool extend_frm( energy = -65; quality = 5; xtract[n] = s_start + ps->num_channels; +#ifdef JBM_TSM_ON_TCS + /* take renderer buffer samples into accout */ + xtract[n] += ps->l_r_buf; + /* snap to next renderer time slot border to resynchronize */ + xtract[n] -= ( ( N - 1 ) * l_seg - xtract[n] + ps->l_r_buf ) % ps->l_ts; +#endif } else { @@ -1332,8 +1522,13 @@ static bool extend_frm( else { /* just copy down 1st half of current segment (= 2nd half of previous segment) */ +#ifdef JBM_TSM_ON_TCS + float *frm_out_ptr; + const float *frm_in_ptr; +#else int16_t *frm_out_ptr; const int16_t *frm_in_ptr; +#endif frm_out_ptr = &( frm_out[( n - 2 ) * l_seg] ); frm_in_ptr = &( frm_in[l_frm + xtract[n]] ); for ( i = 0; i < l_seg; i++ ) diff --git a/lib_dec/jbm_pcmdsp_apa.h b/lib_dec/jbm_pcmdsp_apa.h index 543042f53b..6a2b02e13c 100644 --- a/lib_dec/jbm_pcmdsp_apa.h +++ b/lib_dec/jbm_pcmdsp_apa.h @@ -114,12 +114,24 @@ bool apa_set_rate( apa_state_t *ps, const int32_t output_Fs ); * @return 0 on success, 1 on failure */ bool apa_set_scale( apa_state_t *s, uint16_t scale ); +#ifdef JBM_TSM_ON_TCS +bool apa_set_renderer_granularity( apa_state_t *ps, uint16_t l_ts ); + +bool apa_set_renderer_residual_samples( apa_state_t *ps, uint16_t l_r_buf ); + +uint8_t apa_reconfigure( apa_state_t *ps, uint16_t num_channels, uint16_t l_ts ); +#endif + bool apa_set_complexity_options( apa_state_t *s, uint16_t wss, uint16_t css ); bool apa_set_quality( apa_state_t *s, float quality, uint16_t qualityred, uint16_t qualityrise ); bool apa_exit( apa_state_t **s ); +#ifdef JBM_TSM_ON_TCS +uint8_t apa_exec( apa_state_t *s, const float a_in[], uint16_t l_in, uint16_t maxScaling, float a_out[], uint16_t *l_out ); +#else uint8_t apa_exec( apa_state_t *s, const int16_t a_in[], uint16_t l_in, uint16_t maxScaling, int16_t a_out[], uint16_t *l_out ); +#endif #endif /* JBM_PCMDSP_APA_H */ diff --git a/lib_dec/jbm_pcmdsp_fifo.c b/lib_dec/jbm_pcmdsp_fifo.c index 81e833e5e5..fd0df04ca8 100644 --- a/lib_dec/jbm_pcmdsp_fifo.c +++ b/lib_dec/jbm_pcmdsp_fifo.c @@ -116,6 +116,15 @@ ivas_error pcmdsp_fifo_init( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM\n" ) ); } +#ifdef DEBUGGING + { + uint32_t i; + for ( i = 0; i < nDataBytes; i++ ) + { + h->dataBegin[i] = 0; + } + } +#endif h->dataEnd = h->dataBegin + nDataBytes; h->dataWriteIterator = h->dataBegin; h->dataReadIterator = h->dataBegin; @@ -166,6 +175,49 @@ int16_t pcmdsp_fifo_write( return 0; } +#ifdef JBM_TSM_ON_TCS +/* Writes the given audio data to the FIFO. */ +int16_t pcmdsp_fifo_write_zero( + PCMDSP_FIFO_HANDLE h, + uint16_t nSamplesPerChannel ) +{ + uint16_t nBytesToWrite; + + /* check for empty input buffer */ + if ( nSamplesPerChannel == 0U ) + { + return 0; + } + + /* check, if enough space left */ + if ( nSamplesPerChannel > h->capacity - h->size ) + { + return -1; + } + + nBytesToWrite = nSamplesPerChannel * h->nBytesPerSampleSet; + if ( h->dataWriteIterator + nBytesToWrite > h->dataEnd ) + { + /* wrap around: writing two parts */ + uint16_t bytesOfFirstPart, secondSize; + bytesOfFirstPart = (uint16_t) ( h->dataEnd - h->dataWriteIterator ); + secondSize = nBytesToWrite - bytesOfFirstPart; + set_c( (int8_t *) h->dataWriteIterator, 0, bytesOfFirstPart ); + set_c( (int8_t *) h->dataBegin, 0, secondSize ); + h->dataWriteIterator = h->dataBegin + secondSize; + } + else + { + /* no wrap around: simple write */ + set_c( (int8_t *) h->dataWriteIterator, 0, nBytesToWrite ); + h->dataWriteIterator += nBytesToWrite; + } + h->size += nSamplesPerChannel; + + return 0; +} +#endif + /* Reads the given number of audio samples from the FIFO. */ int16_t pcmdsp_fifo_read( PCMDSP_FIFO_HANDLE h, diff --git a/lib_dec/jbm_pcmdsp_fifo.h b/lib_dec/jbm_pcmdsp_fifo.h index 13ffd146f8..e6c64dc9e8 100644 --- a/lib_dec/jbm_pcmdsp_fifo.h +++ b/lib_dec/jbm_pcmdsp_fifo.h @@ -73,6 +73,9 @@ void pcmdsp_fifo_destroy( PCMDSP_FIFO_HANDLE *ph ); ivas_error pcmdsp_fifo_init( PCMDSP_FIFO_HANDLE h, uint16_t nSamplesPerChannel, uint16_t nChannels, uint16_t nBytesPerSample ); int16_t pcmdsp_fifo_write( PCMDSP_FIFO_HANDLE h, const uint8_t *samples, uint16_t nSamplesPerChannel ); +#ifdef JBM_TSM_ON_TCS +int16_t pcmdsp_fifo_write_zero( PCMDSP_FIFO_HANDLE h, uint16_t nSamplesPerChannel ); +#endif int16_t pcmdsp_fifo_read( PCMDSP_FIFO_HANDLE h, uint16_t nSamplesPerChannel, uint8_t *samples ); diff --git a/lib_dec/jbm_pcmdsp_similarityestimation.c b/lib_dec/jbm_pcmdsp_similarityestimation.c index f575acc7ad..e83d1f7c37 100644 --- a/lib_dec/jbm_pcmdsp_similarityestimation.c +++ b/lib_dec/jbm_pcmdsp_similarityestimation.c @@ -52,7 +52,11 @@ /* Calculates cross correlation coefficient for template segment. */ float cross_correlation_self( +#ifdef JBM_TSM_ON_TCS + const float *signal, +#else const int16_t *signal, +#endif uint16_t x, uint16_t y, uint16_t corr_len ) @@ -63,7 +67,11 @@ float cross_correlation_self( c_c = 0.0f; for ( j = 0; j < corr_len; j++ ) { +#ifdef JBM_TSM_ON_TCS + c_c += ( signal[j + x] * signal[j + y] ); +#else c_c += ( (float) signal[j + x] * (float) signal[j + y] ); +#endif } return c_c; @@ -71,7 +79,11 @@ float cross_correlation_self( /* Calculates cross correlation coefficient for template segment. */ float cross_correlation_subsampled_self( +#ifdef JBM_TSM_ON_TCS + const float *signal, +#else const int16_t *signal, +#endif uint16_t x, uint16_t y, uint16_t corr_len, @@ -83,7 +95,11 @@ float cross_correlation_subsampled_self( c_c = 0.0f; for ( j = 0; j < corr_len; j += subsampling ) { +#ifdef JBM_TSM_ON_TCS + c_c += ( signal[j + x] * signal[j + y] ); +#else c_c += ( (float) signal[j + x] * (float) signal[j + y] ); +#endif } return c_c; @@ -92,7 +108,11 @@ float cross_correlation_subsampled_self( /* Calculates normalized cross correlation coefficient for template segment. */ float normalized_cross_correlation_self( +#ifdef JBM_TSM_ON_TCS + const float *signal, +#else const int16_t *signal, +#endif uint16_t x, uint16_t y, uint16_t corr_len, @@ -102,7 +122,11 @@ float normalized_cross_correlation_self( float c_c; float energy_xy, energy_x, energy_y; uint16_t j; +#ifdef JBM_TSM_ON_TCS + const float *signal_a, *signal_b; +#else const int16_t *signal_a, *signal_b; +#endif c_c = 0.0f; energy_x = 0.0f; @@ -111,11 +135,21 @@ float normalized_cross_correlation_self( signal_b = &signal[y]; for ( j = 0; j < corr_len; j += subsampling ) { +#ifdef JBM_TSM_ON_TCS + c_c += ( signal_a[j] * signal_b[j] ); + energy_x += ( signal_a[j] ) * ( signal_a[j] ); + energy_y += ( signal_b[j] ) * ( signal_b[j] ); +#else c_c += ( (float) signal_a[j] * (float) signal_b[j] ); energy_x += ( (float) signal_a[j] ) * ( (float) signal_a[j] ); energy_y += ( (float) signal_b[j] ) * ( (float) signal_b[j] ); +#endif } +#ifdef JBM_TSM_ON_TCS + energy_xy = sqrtf( energy_x * energy_y ); +#else energy_xy = (float) sqrt( (float) energy_x * (float) energy_y ); +#endif if ( energy_xy < 1.0f ) { energy_xy = 1.0f; /* conceal silent frames */ @@ -130,7 +164,11 @@ float normalized_cross_correlation_self( /* Splits the signal into segments and checks if all of them have very low energy. */ bool isSilence( +#ifdef JBM_TSM_ON_TCS + const float *signal, +#else const int16_t *signal, +#endif uint32_t len, uint32_t segments ) { @@ -145,7 +183,11 @@ bool isSilence( if ( ( i != 0U && i % samplesPerSegment == 0U ) || i + 1 == len ) { /* check energy of current segment */ +#ifdef JBM_TSM_ON_TCS + energy = 10 * log10f( energy / (float) samplesPerSegment ); +#else energy = 10 * (float) log10( energy / samplesPerSegment ); +#endif if ( energy > -65 ) { return false; diff --git a/lib_dec/jbm_pcmdsp_similarityestimation.h b/lib_dec/jbm_pcmdsp_similarityestimation.h index 4dc92f27b7..7078580047 100644 --- a/lib_dec/jbm_pcmdsp_similarityestimation.h +++ b/lib_dec/jbm_pcmdsp_similarityestimation.h @@ -67,7 +67,16 @@ * ******************************************************************************** */ -float cross_correlation_self( const int16_t *signal, uint16_t x, uint16_t y, uint16_t corr_len ); +float cross_correlation_self( +#ifdef JBM_TSM_ON_TCS + const float *signal, +#else + const int16_t *signal, +#endif + uint16_t x, + uint16_t y, + uint16_t corr_len +); /* ******************************************************************************** @@ -94,7 +103,17 @@ float cross_correlation_self( const int16_t *signal, uint16_t x, uint16_t y, uin * ******************************************************************************** */ -float cross_correlation_subsampled_self( const int16_t *signal, uint16_t x, uint16_t y, uint16_t corr_len, uint16_t subsampling ); +float cross_correlation_subsampled_self( +#ifdef JBM_TSM_ON_TCS + const float *signal, +#else + const int16_t *signal, +#endif + uint16_t x, + uint16_t y, + uint16_t corr_len, + uint16_t subsampling +); /* ******************************************************************************** @@ -132,9 +151,28 @@ float cross_correlation_subsampled_self( const int16_t *signal, uint16_t x, uint * ******************************************************************************** */ -float normalized_cross_correlation_self( const int16_t *signal, uint16_t x, uint16_t y, uint16_t corr_len, uint16_t subsampling, float *energy ); +float normalized_cross_correlation_self( +#ifdef JBM_TSM_ON_TCS + const float *signal, +#else + const int16_t *signal, +#endif + uint16_t x, + uint16_t y, + uint16_t corr_len, + uint16_t subsampling, + float *energy +); /* Splits the signal into segments and checks if all of them have very low energy. */ -bool isSilence( const int16_t *signal, uint32_t len, uint32_t segments ); +bool isSilence( +#ifdef JBM_TSM_ON_TCS + const float *signal, +#else + const int16_t *signal, +#endif + uint32_t len, + uint32_t segments +); #endif /* JBM_PCMDSP_SIMILARITYESTIMATION_H */ diff --git a/lib_dec/jbm_pcmdsp_window.c b/lib_dec/jbm_pcmdsp_window.c index f9f71ac802..fa0ea6f724 100644 --- a/lib_dec/jbm_pcmdsp_window.c +++ b/lib_dec/jbm_pcmdsp_window.c @@ -80,9 +80,15 @@ void hannWindow( *-----------------------------------------------------------------------*/ void overlapAdd( +#ifdef JBM_TSM_ON_TCS + const float *fadeOut, + const float *fadeIn, + float *out, +#else const int16_t *fadeOut, const int16_t *fadeIn, int16_t *out, +#endif uint16_t n, uint16_t nChannels, const float *fadeOutWin, @@ -90,7 +96,11 @@ void overlapAdd( { float fdOutVal, fdInVal; int16_t i, j, hannIter; +#ifdef JBM_TSM_ON_TCS + float combinedVal; +#else int32_t combinedVal; +#endif for ( j = 0; j < nChannels; j++ ) { @@ -101,8 +111,11 @@ void overlapAdd( fdOutVal = fadeOut[i] * fadeOutWin[hannIter]; fdInVal = fadeIn[i] * fadeInWin[hannIter]; /* round combinedVal value (taking care of sign) */ +#ifdef JBM_TSM_ON_TCS + combinedVal = fdInVal + fdOutVal; + out[i] = combinedVal; +#else combinedVal = (int32_t) ( ( fdInVal + fdOutVal ) + 0.5 ); - if ( fdInVal + fdOutVal < 0.0 ) { combinedVal = (int32_t) ( ( fdInVal + fdOutVal ) - 0.5 ); @@ -117,7 +130,9 @@ void overlapAdd( { combinedVal = MIN16B; } + out[i] = (int16_t) combinedVal; +#endif hannIter++; } } diff --git a/lib_dec/jbm_pcmdsp_window.h b/lib_dec/jbm_pcmdsp_window.h index 67759e9738..2f8cd462b5 100644 --- a/lib_dec/jbm_pcmdsp_window.h +++ b/lib_dec/jbm_pcmdsp_window.h @@ -61,6 +61,9 @@ void hannWindow( uint16_t n, float *w ); * @param[in] nChannels number of channels * @param[in] fadeOutWin window for fade out * @param[in] fadeInWin window for fade in */ +#ifdef JBM_TSM_ON_TCS +void overlapAdd( const float *fadeOut, const float *fadeIn, float *out, uint16_t n, uint16_t nChannels, const float *fadeOutWin, const float *fadeInWin ); +#else void overlapAdd( const int16_t *fadeOut, const int16_t *fadeIn, int16_t *out, uint16_t n, uint16_t nChannels, const float *fadeOutWin, const float *fadeInWin ); - +#endif #endif /* JBM_PCMDSP_WINDOW_H */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index ee315bf399..b3767b3556 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -54,11 +54,27 @@ struct IVAS_DEC_VOIP uint16_t nSamplesFrame; /* Total number of samples in a frame (includes number of channels) */ JB4_HANDLE hJBM; PCMDSP_APA_HANDLE hTimeScaler; - PCMDSP_FIFO_HANDLE hFifoAfterTimeScaler; uint16_t lastDecodedWasActive; - int16_t *apaExecBuffer; /* Buffer for APA scaling */ +#ifdef JBM_TSM_ON_TCS + float *apaExecBuffer; /* Buffer for APA scaling */ +#else + int16_t *apaExecBuffer; /* Buffer for APA scaling */ +#endif JB4_DATAUNIT_HANDLE hCurrentDataUnit; /* Points to the currently processed data unit */ uint16_t *bs_conversion_buf; /* Buffer for bitstream conversion from packed to serial */ +#ifdef VARIABLE_SPEED_DECODING + uint8_t mode; + uint16_t speedFac; + bool needNewFrame; +#endif +#ifdef JBM_TSM_ON_TCS + JBM_RENDERER_TYPE rendererType; + PCMDSP_FIFO_HANDLE hFifoOut; + uint8_t nTransportChannelsOld; + uint16_t nSamplesAvailableNext; +#else + PCMDSP_FIFO_HANDLE hFifoAfterTimeScaler; +#endif #ifdef SUPPORT_JBM_TRACEFILE IVAS_JBM_TRACE_DATA JbmTraceData; #endif @@ -93,10 +109,22 @@ static void IVAS_DEC_Close_VoIP( IVAS_DEC_VOIP *hVoIP ); #ifdef SUPPORT_JBM_TRACEFILE static void store_JbmData( IVAS_DEC_VOIP *hVoIP, JB4_DATAUNIT_HANDLE dataUnit, const uint32_t systemTimestamp_ms, const uint16_t extBufferedSamples, const int32_t output_Fs ); #endif +#ifdef JBM_TSM_ON_TCS +static ivas_error evs_dec_main( Decoder_Struct *st_ivas, const int16_t nOutSamples, float *floatBuf, int16_t *pcmBuf ); +#else static ivas_error evs_dec_main( Decoder_Struct *st_ivas, const int16_t nOutSamples, int16_t *pcmBuf ); +#endif static ivas_error input_format_API_to_internal( IVAS_DEC_INPUT_FORMAT input_format, int16_t *bitstream_format_internal, int16_t *sdp_hf_only, const bool is_voip_enabled ); static void init_decoder_config( DECODER_CONFIG_HANDLE hDecoderConfig, const int16_t orientation_tracking, const float no_diegetic_pan ); - +#ifdef JBM_TSM_ON_TCS +static int16_t IVAS_DEC_VoIP_GetRenderGranularity( Decoder_Struct *st_ivas ); +static JBM_RENDERER_TYPE IVAS_DEC_VoIP_GetRendererConfig( IVAS_DEC_HANDLE hIvasDec ); +static ivas_error IVAS_DEC_VoIP_reconfigure( IVAS_DEC_HANDLE hIvasDec, const uint16_t nTransportChannels, const uint16_t l_ts ); +static ivas_error IVAS_DEC_Setup( IVAS_DEC_HANDLE hIvasDec, uint16_t *nTcBufferGranularity, uint8_t *nTransportChannels, uint8_t *nOutChannels, uint16_t *nSamplesRendered, int16_t *data ); +static ivas_error IVAS_DEC_GetTcSamples( IVAS_DEC_HANDLE hIvasDec, float *pcmBuf, int16_t *nOutSamples ); +static ivas_error IVAS_DEC_RendererFeedTcSamples( IVAS_DEC_HANDLE hIvasDec, const int16_t nSamplesForRendering, int16_t *nSamplesResidual, float *pcmBuf ); +static ivas_error IVAS_DEC_GetRenderedSamples( IVAS_DEC_HANDLE hIvasDec, const uint16_t nSamplesForRendering, uint16_t *nSamplesRendered, uint16_t *nSamplesAvailableNext, int16_t *pcmBuf ); +#endif /*---------------------------------------------------------------------* * IVAS_DEC_Open() @@ -226,7 +254,9 @@ static void init_decoder_config( hDecoderConfig->Opt_RendConfigCustom = 0; hDecoderConfig->orientation_tracking = orientation_tracking; hDecoderConfig->no_diegetic_pan = no_diegetic_pan; - +#ifdef JBM_TSM_ON_TCS + hDecoderConfig->voip_active = 0; +#endif return; } @@ -463,7 +493,11 @@ ivas_error IVAS_DEC_Configure( *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_EnableVoIP( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ +#ifdef VARIABLE_SPEED_DECODING + const IVAS_DEC_VOIP_MODE voipMode, /* i : VoIP or varable speed */ + const uint16_t speedFac, /* i : speed factor for varable speed */ +#endif const int16_t jbmSafetyMargin, /* i : allowed delay reserve for JBM, in milliseconds */ const IVAS_DEC_INPUT_FORMAT inputFormat /* i : format of the input bitstream */ ) @@ -473,8 +507,10 @@ ivas_error IVAS_DEC_EnableVoIP( error = IVAS_ERR_OK; +#ifndef JBM_TSM_ON_TCS /* initialize time scaler and FIFO after time scaler */ uint16_t wss, css; +#endif if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) { @@ -486,7 +522,12 @@ ivas_error IVAS_DEC_EnableVoIP( hIvasDec->Opt_VOIP = 1; +#ifdef JBM_TSM_ON_TCS + hDecoderConfig->voip_active = 1; +#endif + hDecoderConfig->nchan_out = audioCfg2channels( hDecoderConfig->output_config ); + assert( hDecoderConfig->nchan_out > 0 && "EXT output not yet supported in VoIP mode" ); if ( ( error = input_format_API_to_internal( inputFormat, &hIvasDec->bitstreamformat, &hIvasDec->sdp_hf_only, true ) ) != IVAS_ERR_OK ) @@ -501,13 +542,31 @@ ivas_error IVAS_DEC_EnableVoIP( hIvasDec->hVoIP->lastDecodedWasActive = 0; hIvasDec->hVoIP->hCurrentDataUnit = NULL; +#ifdef VARIABLE_SPEED_DECODING + hIvasDec->hVoIP->mode = voipMode; + hIvasDec->hVoIP->speedFac = speedFac; + hIvasDec->hVoIP->needNewFrame = false; +#endif +#ifdef JBM_TSM_ON_TCS + hIvasDec->hVoIP->nSamplesFrame = (uint16_t) ( hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + hIvasDec->hVoIP->nSamplesAvailableNext = 0; + hIvasDec->hVoIP->rendererType = JBM_RENDERER_NONE; + hIvasDec->hVoIP->hFifoOut = NULL; +#else hIvasDec->hVoIP->nSamplesFrame = (uint16_t) ( hDecoderConfig->output_Fs * hDecoderConfig->nchan_out / FRAMES_PER_SEC ); +#endif +#ifdef JBM_TSM_ON_TCS + /* postpone init of the buffers until we know the real number of TCs*/ + hIvasDec->hVoIP->apaExecBuffer = NULL; + hIvasDec->hVoIP->nTransportChannelsOld = 0; +#else hIvasDec->hVoIP->apaExecBuffer = malloc( sizeof( int16_t ) * APA_BUF_PER_CHANNEL * hDecoderConfig->nchan_out ); if ( hIvasDec->hVoIP->apaExecBuffer == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate VoIP handle" ); } +#endif #define WMC_TOOL_SKIP /* Bitstream conversion is not counted towards complexity and memory usage */ @@ -520,15 +579,27 @@ ivas_error IVAS_DEC_EnableVoIP( } /* initialize JBM */ - if ( ( error = JB4_Create( &hIvasDec->hVoIP->hJBM ) != IVAS_ERR_OK ) != IVAS_ERR_OK ) +#ifdef VARIABLE_SPEED_DECODING + hIvasDec->hVoIP->hJBM = NULL; + if ( hIvasDec->hVoIP->mode == IVAS_DEC_VOIP_MODE_VOIP ) { - return error; +#endif + if ( ( error = JB4_Create( &hIvasDec->hVoIP->hJBM ) != IVAS_ERR_OK ) != IVAS_ERR_OK ) + { + return error; + } + if ( JB4_Init( hIvasDec->hVoIP->hJBM, jbmSafetyMargin ) != 0 ) + { + return IVAS_ERR_FAILED_ALLOC; + } +#ifdef VARIABLE_SPEED_DECODING } if ( ( error = JB4_Init( hIvasDec->hVoIP->hJBM, jbmSafetyMargin ) ) != IVAS_ERR_OK ) { return error; } - +#endif +#ifndef JBM_TSM_ON_TCS if ( hDecoderConfig->output_Fs == 8000 ) { wss = 1; @@ -553,8 +624,41 @@ ivas_error IVAS_DEC_EnableVoIP( { return IVAS_ERR_INIT_ERROR; } +#endif + +#ifdef JBM_TSM_ON_TCS + + /* postpone init of time scaler until we know the real number of TCs */ + hIvasDec->hVoIP->hTimeScaler = NULL; + /* create output pcm fifo*/ + /* :TODO: also provide CLDFB output FIFO if things work out */ + if ( hIvasDec->hVoIP->mode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED ) + { + if ( pcmdsp_fifo_create( &hIvasDec->hVoIP->hFifoOut ) != 0 || + pcmdsp_fifo_init( hIvasDec->hVoIP->hFifoOut, (uint16_t) ( hDecoderConfig->output_Fs * 4 / FRAMES_PER_SEC ) /* 4 frames */, hDecoderConfig->nchan_out, sizeof( int16_t ) ) != 0 ) + { + return IVAS_ERR_INIT_ERROR; + } + } - if ( apa_init( &hIvasDec->hVoIP->hTimeScaler, hDecoderConfig->nchan_out ) != IVAS_ERR_OK || +#else +#ifdef VARIABLE_SPEED_DECODING + { + float startQuality = hIvasDec->hVoIP->mode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED ? -2.0f : 1.0f; + if ( apa_init( &hIvasDec->hVoIP->hTimeScaler, + hDecoderConfig->nchan_out ) != IVAS_ERR_OK || + apa_set_rate( hIvasDec->hVoIP->hTimeScaler, hDecoderConfig->output_Fs ) != 0 || + apa_set_complexity_options( hIvasDec->hVoIP->hTimeScaler, wss, css ) != 0 || + apa_set_quality( hIvasDec->hVoIP->hTimeScaler, startQuality, 4, 4 ) != 0 || + pcmdsp_fifo_create( &hIvasDec->hVoIP->hFifoAfterTimeScaler ) != 0 || + pcmdsp_fifo_init( hIvasDec->hVoIP->hFifoAfterTimeScaler, (uint16_t) ( hDecoderConfig->output_Fs * 4 / FRAMES_PER_SEC ) /* 4 frames */, hDecoderConfig->nchan_out, sizeof( int16_t ) ) != 0 ) + { + return IVAS_ERR_INIT_ERROR; + } + } +#else + if ( apa_init( &hIvasDec->hVoIP->hTimeScaler, + hDecoderConfig->nchan_out ) !=IVAS_ERR_OK || apa_set_rate( hIvasDec->hVoIP->hTimeScaler, hDecoderConfig->output_Fs ) != 0 || apa_set_complexity_options( hIvasDec->hVoIP->hTimeScaler, wss, css ) != 0 || apa_set_quality( hIvasDec->hVoIP->hTimeScaler, 1, 4, 4 ) != 0 || @@ -563,6 +667,8 @@ ivas_error IVAS_DEC_EnableVoIP( { return IVAS_ERR_INIT_ERROR; } +#endif +#endif return error; } @@ -651,6 +757,13 @@ ivas_error IVAS_DEC_FeedFrame_Serial( st->use_partial_copy = 1; } +#ifdef VARIABLE_SPEED_DECODING + if ( hIvasDec->hVoIP != NULL && hIvasDec->hVoIP->mode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED ) + { + hIvasDec->hVoIP->needNewFrame = false; + } +#endif + return error; } @@ -683,7 +796,11 @@ ivas_error IVAS_DEC_GetSamples( if ( hIvasDec->mode == IVAS_DEC_MODE_EVS ) { +#ifdef JBM_TSM_ON_TCS + if ( ( error = evs_dec_main( st_ivas, *nOutSamples, NULL, pcmBuf ) ) != IVAS_ERR_OK ) +#else if ( ( error = evs_dec_main( st_ivas, *nOutSamples, pcmBuf ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -708,6 +825,188 @@ ivas_error IVAS_DEC_GetSamples( } +#ifdef JBM_TSM_ON_TCS +/*---------------------------------------------------------------------* + * IVAS_DEC_Setup( ) + * + * Main function to decode to PCM data of the transport channels + *---------------------------------------------------------------------*/ + +static ivas_error IVAS_DEC_Setup( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + uint16_t *nTcBufferGranularity, /* o : granularity of the TC Buffer */ + uint8_t *nTransportChannels, /* o : number of decoded transport PCM channels */ + uint8_t *nOutChannels, /* o : number of decoded out channels (PCM or CLDFB) */ + uint16_t *nSamplesRendered, /* o : number of samples flushed from the last frame */ + int16_t *data /* o : flushed samples */ +) +{ + ivas_error error; + + error = IVAS_ERR_OK; + + *nSamplesRendered = 0; + + if ( hIvasDec->mode == IVAS_DEC_MODE_EVS ) + { + *nTransportChannels = 1; + *nOutChannels = 1; + } + else + { + Decoder_Struct *st_ivas; + + st_ivas = hIvasDec->st_ivas; + /*----------------------------------------------------------------* + * IVAS decoder setup + * - read IVAS format signaling + * - read IVAS format specific signaling + * - initialize decoder in the first frame based on IVAS format and number of transport channels + * - reconfigure the decoder when the number of TC or IVAS total bitrate change + *----------------------------------------------------------------*/ + + if ( st_ivas->bfi == 0 ) + { + if ( ( error = ivas_dec_setup( st_ivas, nSamplesRendered, data ) ) != IVAS_ERR_OK ) + { + return error; + } + } + /* TODO: JBM replace with a function that gets the real number of TCs generated, + depending of remapping, td rendering already done in the TC decoding part, ....*/ + *nTransportChannels = (uint8_t) st_ivas->hTcBuffer->nchan_transport_jbm; + *nTcBufferGranularity = (uint16_t) st_ivas->hTcBuffer->n_samples_granularity; + *nOutChannels = (uint8_t) st_ivas->hDecoderConfig->nchan_out; + } + + return error; +} + +/*---------------------------------------------------------------------* + * IVAS_DEC_GetTcSamples( ) + * + * Main function to decode to PCM data of the transport channels + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_GetTcSamples( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + float *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */ + int16_t *nOutSamples /* o : number of samples per channel written to output buffer */ +) +{ + Decoder_Struct *st_ivas; + ivas_error error; + + error = IVAS_ERR_OK; + + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + st_ivas = hIvasDec->st_ivas; + + *nOutSamples = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + + if ( hIvasDec->mode == IVAS_DEC_MODE_EVS ) + { + if ( ( error = evs_dec_main( st_ivas, *nOutSamples, pcmBuf, NULL ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( hIvasDec->mode == IVAS_DEC_MODE_IVAS ) + { + /* run the main IVAS decoding routine */ + if ( ( error = ivas_jbm_dec_tc( st_ivas, pcmBuf ) ) != IVAS_ERR_OK ) + { + return error; + } + + hIvasDec->isInitialized = true; /* Initialization done in ivas_dec() */ + } + + if ( hIvasDec->hasBeenFedFirstGoodFrame ) + { + hIvasDec->hasDecodedFirstGoodFrame = true; + } + + return error; +} + +/*---------------------------------------------------------------------* + * IVAS_DEC_Rendered_FeedTcSamples( ) + * + * Main function to decode to PCM data of the transport channels + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_RendererFeedTcSamples( + IVAS_DEC_HANDLE hIvasDec, /* i/o : IVAS decoder handle */ + const int16_t nSamplesForRendering, /* i: : number of TC samples wanted from the renderer */ + int16_t *nSamplesResidual, /* o: : number of samples not fitting into the renderer grid and buffer for the next call*/ + float *pcmBuf /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */ +) +{ + Decoder_Struct *st_ivas; + + ivas_error error; + + error = IVAS_ERR_OK; + + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + st_ivas = hIvasDec->st_ivas; + + /* feed the TCs to the IVAS renderer */ + if ( ( error = ivas_jbm_dec_feed_tc_to_renderer( st_ivas, nSamplesForRendering, nSamplesResidual, pcmBuf ) ) != IVAS_ERR_OK ) + { + return error; + } + + return error; +} + +/*---------------------------------------------------------------------* + * IVAS_DEC_GetRenderedSamples( ) + * + * Main function to decode to PCM data of the transport channels + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_GetRenderedSamples( + IVAS_DEC_HANDLE hIvasDec, /* i/o : IVAS decoder handle */ + const uint16_t nSamplesForRendering, /* i: : number of TC samples wanted from the renderer */ + uint16_t *nSamplesRendered, /* o : number of samples rendered */ + uint16_t *nSamplesAvailableNext, /* o : number of samples still available in the renerer pipeline */ + int16_t *pcmBuf /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */ +) +{ + Decoder_Struct *st_ivas; + ivas_error error; + + error = IVAS_ERR_OK; + + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + st_ivas = hIvasDec->st_ivas; + + /* run the main IVAS decoding routine */ + if ( ( error = ivas_jbm_dec_render( st_ivas, nSamplesForRendering, nSamplesRendered, nSamplesAvailableNext, pcmBuf ) ) != IVAS_ERR_OK ) + { + return error; + } + + + return error; +} +#endif + + /*---------------------------------------------------------------------* * IVAS_DEC_GetNumObjects( ) * @@ -1429,6 +1728,27 @@ ivas_error IVAS_DEC_VoIP_FeedFrame( return IVAS_ERR_OK; } +#ifdef VARIABLE_SPEED_DECODING +/*---------------------------------------------------------------------* + * IVAS_DEC_VoIP_SetScale( ) + * + * Set the TSM scale + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_VoIP_SetScale( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const int16_t scale /* i : TSM scale to set */ +) +{ + ivas_error error; + + error = IVAS_ERR_OK; + + hIvasDec->hVoIP->speedFac = scale; + + return error; +} +#endif /*---------------------------------------------------------------------* * IVAS_DEC_VoIP_GetSamples( ) @@ -1441,11 +1761,16 @@ ivas_error IVAS_DEC_VoIP_GetSamples( uint16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ int16_t *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */ const uint32_t systemTimestamp_ms /* i : current system timestamp */ +#if defined( JBM_TSM_ON_TCS ) || defined( VARIABLE_SPEED_DECODING ) + , + uint16_t *sampleAvailableNext /* o : samples available for the next call */ +#endif #ifdef SUPPORT_JBM_TRACEFILE , JbmTraceFileWriterFn jbmWriterFn, void *jbmWriter #endif + ) { Decoder_Struct *st_ivas; @@ -1459,6 +1784,12 @@ ivas_error IVAS_DEC_VoIP_GetSamples( int16_t timeScalingDone; int16_t result; ivas_error error; +#ifdef JBM_TSM_ON_TCS + int16_t nSamplesRendered; + uint16_t nSamplesTcsScaled; + uint8_t nTransportChannels; + uint8_t nOutChannels; +#endif error = IVAS_ERR_OK; @@ -1467,133 +1798,454 @@ ivas_error IVAS_DEC_VoIP_GetSamples( hVoIP = hIvasDec->hVoIP; timeScalingDone = 0; +#ifdef JBM_TSM_ON_TCS + nOutChannels = (uint8_t) st_ivas->hDecoderConfig->nchan_out; + nTransportChannels = 0; + nSamplesTcsScaled = hVoIP->nSamplesFrame; + nSamplesRendered = 0; +#endif +#ifdef VARIABLE_SPEED_DECODING + scale = hVoIP->speedFac; + maxScaling = hVoIP->speedFac; +#endif + /* TODO(mcjbm): ringbuffer capacity should be configurable by user */ +#ifdef JBM_TSM_ON_TCS + if ( ( hVoIP->hFifoOut != NULL && nSamplesPerChannel > hVoIP->hFifoOut->capacity ) || nSamplesPerChannel == 0 ) +#else if ( nSamplesPerChannel > hVoIP->hFifoAfterTimeScaler->capacity || nSamplesPerChannel == 0 ) +#endif { return IVAS_ERR_WRONG_PARAMS; } /* make sure that the FIFO after decoder/scaler contains at least one sound card frame (i.e. 20ms) */ +#ifdef JBM_TSM_ON_TCS + while ( ( hVoIP->hFifoOut != NULL && pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoOut ) < nSamplesPerChannel ) || ( hVoIP->hFifoOut == NULL && nSamplesRendered < nSamplesPerChannel ) ) +#else while ( pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoAfterTimeScaler ) < nSamplesPerChannel ) +#endif { - extBufferedSamples = pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoAfterTimeScaler ); - extBufferedTime_ms = extBufferedSamples * 1000 / hDecoderConfig->output_Fs; - dataUnit = NULL; - /* pop one access unit from the jitter buffer */ - result = JB4_PopDataUnit( hVoIP->hJBM, systemTimestamp_ms, extBufferedTime_ms, &dataUnit, &scale, &maxScaling ); - if ( result != 0 ) +#ifdef VARIABLE_SPEED_DECODING + if ( hVoIP->mode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED && hVoIP->needNewFrame ) { - return IVAS_ERR_UNKNOWN; + /* we need another bs frame fed into the decoder...*/ + *sampleAvailableNext = 0; + return IVAS_ERR_VS_FRAME_NEEDED; } - - maxScaling = maxScaling * hDecoderConfig->output_Fs / 1000; - /* avoid time scaling multiple times in one sound card slot */ - if ( scale != 100U ) +#endif +#ifdef JBM_TSM_ON_TCS + if ( hVoIP->nSamplesAvailableNext == 0 ) { - if ( timeScalingDone ) + if ( hVoIP->hFifoOut ) { - scale = 100; + extBufferedSamples = pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoOut ); + nSamplesRendered = extBufferedSamples; } else { - timeScalingDone = 1; + extBufferedSamples = nSamplesRendered; /* TODO: JBM use renderer residual samples here */ } - } +#else + extBufferedSamples = pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoAfterTimeScaler ); +#endif + extBufferedTime_ms = extBufferedSamples * 1000 / hDecoderConfig->output_Fs; - /* copy bitstream into decoder state */ - if ( dataUnit ) - { - hIvasDec->hVoIP->hCurrentDataUnit = dataUnit; + dataUnit = NULL; +#ifdef VARIABLE_SPEED_DECODING + if ( hVoIP->mode == IVAS_DEC_VOIP_MODE_VOIP ) + { +#endif + /* pop one access unit from the jitter buffer */ + result = JB4_PopDataUnit( hVoIP->hJBM, systemTimestamp_ms, extBufferedTime_ms, &dataUnit, &scale, &maxScaling ); + if ( result != 0 ) + { + return IVAS_ERR_UNKNOWN; + } +#ifdef VARIABLE_SPEED_DECODING + } + else if ( hVoIP->mode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED ) + { + scale = hVoIP->speedFac; + maxScaling = hVoIP->speedFac; + } +#ifdef DEBUGGING + else + { + assert( "Wrong VoIP mode!\n" && 0 ); + } +#endif +#endif - bsCompactToSerial( dataUnit->data, hIvasDec->hVoIP->bs_conversion_buf, dataUnit->dataSize ); - IVAS_DEC_FeedFrame_Serial( hIvasDec, hIvasDec->hVoIP->bs_conversion_buf, dataUnit->dataSize, 0 ); - } - else if ( hIvasDec->hasDecodedFirstGoodFrame ) - { - /* Decoder has been initialized with first good frame - do PLC */ - IVAS_DEC_FeedFrame_Serial( hIvasDec, hIvasDec->hVoIP->bs_conversion_buf, 0, 1 ); - } + maxScaling = maxScaling * hDecoderConfig->output_Fs / 1000; + /* avoid time scaling multiple times in one sound card slot */ + if ( scale != 100U ) + { + if ( timeScalingDone ) + { + scale = 100; + } + else + { + timeScalingDone = 1; + } + } - /* decode */ - if ( !hIvasDec->hasBeenFedFirstGoodFrame ) - { - /* codec mode to use not known yet - simply output silence */ +#ifdef VARIABLE_SPEED_DECODING + if ( hVoIP->mode == IVAS_DEC_VOIP_MODE_VOIP ) + { +#endif + /* copy bitstream into decoder state */ + if ( dataUnit ) + { + hIvasDec->hVoIP->hCurrentDataUnit = dataUnit; + + bsCompactToSerial( dataUnit->data, hIvasDec->hVoIP->bs_conversion_buf, dataUnit->dataSize ); + IVAS_DEC_FeedFrame_Serial( hIvasDec, hIvasDec->hVoIP->bs_conversion_buf, dataUnit->dataSize, 0 ); + } + else if ( hIvasDec->hasDecodedFirstGoodFrame ) + { + /* Decoder has been initialized with first good frame - do PLC */ + IVAS_DEC_FeedFrame_Serial( hIvasDec, hIvasDec->hVoIP->bs_conversion_buf, 0, 1 ); + } +#ifdef VARIABLE_SPEED_DECODING + } +#endif + /* decode */ + if ( !hIvasDec->hasBeenFedFirstGoodFrame ) + { + /* codec mode to use not known yet - simply output silence */ +#ifdef JBM_TSM_ON_TCS + nSamplesTcsScaled = hVoIP->nSamplesFrame; + if ( hVoIP->hFifoOut != NULL ) + { + /* feed zeros to FIFO */ + if ( pcmdsp_fifo_write_zero( hVoIP->hFifoOut, nSamplesTcsScaled ) != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + } + else + { + /* directly set output zero */ + set_s( pcmBuf, 0, nSamplesPerChannel * nOutChannels ); + } + nSamplesRendered = nSamplesTcsScaled; +#else set_s( hVoIP->apaExecBuffer, 0, hVoIP->nSamplesFrame ); /* TODO(mcjbm): Could be optimized: just write directly to output buffer */ - } - else - { +#endif + } + else + { + +#ifdef JBM_TSM_ON_TCS + uint16_t l_ts = 1; + uint16_t nSamplesRendered_loop; + /* setup ivas decoder and get the number of TCs */ + /* might render some remaining samples from the previous frame too if the renderer granularity changed */ + if ( hVoIP->hFifoOut ) + { + int16_t rendererPcmBuf[( MAX_OUTPUT_CHANNELS * L_FRAME_MAX * APA_MAX_SCALE ) / 100]; + if ( ( error = IVAS_DEC_Setup( hIvasDec, &l_ts, &nTransportChannels, &nOutChannels, &nSamplesRendered_loop, rendererPcmBuf ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( pcmdsp_fifo_write( hVoIP->hFifoOut, (uint8_t *) rendererPcmBuf, nSamplesRendered_loop ) != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + } + else + { + if ( ( error = IVAS_DEC_Setup( hIvasDec, &l_ts, &nTransportChannels, &nOutChannels, &nSamplesRendered_loop, pcmBuf + nSamplesRendered * nOutChannels ) ) != IVAS_ERR_OK ) + { + return error; + } + } + nSamplesRendered += nSamplesRendered_loop; + if ( nTransportChannels != hVoIP->nTransportChannelsOld ) + { + IVAS_DEC_VoIP_reconfigure( hIvasDec, nTransportChannels, l_ts ); + } + /* decode TCs only */ + if ( ( error = IVAS_DEC_GetTcSamples( hIvasDec, hVoIP->apaExecBuffer, &nOutSamplesElse ) ) != IVAS_ERR_OK ) + { + return error; + } +#else if ( ( error = IVAS_DEC_GetSamples( hIvasDec, hVoIP->apaExecBuffer, &nOutSamplesElse ) ) != IVAS_ERR_OK ) { return error; } - } +#endif + } - if ( dataUnit ) - { - if ( dataUnit->partial_frame != 0 ) +#ifdef VARIABLE_SPEED_DECODING + if ( hVoIP->mode == IVAS_DEC_VOIP_MODE_VOIP ) { - hVoIP->lastDecodedWasActive = 1; +#endif + if ( dataUnit ) + { + if ( dataUnit->partial_frame != 0 ) + { + hVoIP->lastDecodedWasActive = 1; + } + else + { + hVoIP->lastDecodedWasActive = !dataUnit->silenceIndicator; + } + /* data unit memory is no longer used */ + JB4_FreeDataUnit( hVoIP->hJBM, dataUnit ); + } +#ifdef VARIABLE_SPEED_DECODING } else { - hVoIP->lastDecodedWasActive = !dataUnit->silenceIndicator; + hVoIP->lastDecodedWasActive = 1; + } +#endif + /* limit scale to range supported by time scaler */ + if ( scale < APA_MIN_SCALE ) + { + scale = APA_MIN_SCALE; + } + else if ( scale > APA_MAX_SCALE ) + { + scale = APA_MAX_SCALE; } - /* data unit memory is no longer used */ - JB4_FreeDataUnit( hVoIP->hJBM, dataUnit ); - } - - /* limit scale to range supported by time scaler */ - if ( scale < APA_MIN_SCALE ) - { - scale = APA_MIN_SCALE; - } - else if ( scale > APA_MAX_SCALE ) - { - scale = APA_MAX_SCALE; - } - /* apply time scaling on decoded/concealed samples */ - if ( apa_set_scale( hVoIP->hTimeScaler, (uint16_t) scale ) != 0 ) - { - return IVAS_ERR_UNKNOWN; - } + /* apply time scaling on decoded/concealed samples */ +#ifdef JBM_TSM_ON_TCS + if ( hIvasDec->hasBeenFedFirstGoodFrame ) + { +#endif + if ( apa_set_scale( hVoIP->hTimeScaler, (uint16_t) scale ) != 0 ) + { + return IVAS_ERR_UNKNOWN; + } +#ifdef JBM_TSM_ON_TCS + result = apa_exec( hVoIP->hTimeScaler, hVoIP->apaExecBuffer, hVoIP->nSamplesFrame * nTransportChannels, (uint16_t) maxScaling, hVoIP->apaExecBuffer, &nTimeScalerOutSamples ); +#else result = apa_exec( hVoIP->hTimeScaler, hVoIP->apaExecBuffer, hVoIP->nSamplesFrame, (uint16_t) maxScaling, hVoIP->apaExecBuffer, &nTimeScalerOutSamples ); - if ( result != 0 ) - { - return IVAS_ERR_UNKNOWN; - } - assert( nTimeScalerOutSamples <= APA_BUF ); +#endif + if ( result != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + assert( nTimeScalerOutSamples <= APA_BUF ); +#ifdef JBM_TSM_ON_TCS + nSamplesTcsScaled = nTimeScalerOutSamples / nTransportChannels; +#else /* append scaled samples to FIFO */ if ( pcmdsp_fifo_write( hVoIP->hFifoAfterTimeScaler, (uint8_t *) hVoIP->apaExecBuffer, (uint16_t) ( nTimeScalerOutSamples / hDecoderConfig->nchan_out ) ) != 0 ) { return IVAS_ERR_UNKNOWN; } +#endif +#ifdef JBM_TSM_ON_TCS + if ( hIvasDec->hasBeenFedFirstGoodFrame && hVoIP->rendererType != JBM_RENDERER_NONE ) + { + /* render IVAS frames */ + int16_t nResidualSamples; + if ( ( error = IVAS_DEC_RendererFeedTcSamples( hIvasDec, nSamplesTcsScaled, &nResidualSamples, hVoIP->apaExecBuffer ) ) != IVAS_ERR_OK ) + { + return error; + } + /* feed residual samples to TSM for the next call */ + if ( apa_set_renderer_residual_samples( hVoIP->hTimeScaler, (uint16_t) nResidualSamples ) != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + } + else + { + /* inplace float->int16_t conversion*/ +#ifdef DEBUGGING + st_ivas->noClipping += +#endif + syn_output( hVoIP->apaExecBuffer, nTimeScalerOutSamples, (int16_t *) hVoIP->apaExecBuffer ); +#endif + if ( pcmdsp_fifo_write( hVoIP->hFifoOut, (uint8_t *) hVoIP->apaExecBuffer, nSamplesTcsScaled ) != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + nSamplesRendered = nSamplesTcsScaled; + } + } #ifdef SUPPORT_JBM_TRACEFILE - /* jbmWriterFn and jbmWriter may be NULL if tracefile writing was not requested on CLI */ - if ( jbmWriterFn != NULL && jbmWriter != NULL ) + /* jbmWriterFn and jbmWriter may be NULL if tracefile writing was not requested on CLI */ + if ( jbmWriterFn != NULL && jbmWriter != NULL ) + { + /* write JBM trace data entry */ + store_JbmData( hVoIP, dataUnit, systemTimestamp_ms, extBufferedSamples, hDecoderConfig->output_Fs ); + if ( ( jbmWriterFn( &hVoIP->JbmTraceData, jbmWriter ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing JBM Trace data to file\n" ); + return IVAS_ERR_UNKNOWN; + } + } +#endif +#ifdef JBM_TSM_ON_TCS + } + if ( hIvasDec->hasBeenFedFirstGoodFrame && hVoIP->rendererType != JBM_RENDERER_NONE ) + { + uint16_t nSamplesRendered_loop; + int16_t nSamplesToRender; + if ( hVoIP->hFifoOut ) + { + int16_t rendererPcmBuf[( MAX_OUTPUT_CHANNELS * L_FRAME_MAX * APA_MAX_SCALE ) / 100]; + nSamplesToRender = nSamplesPerChannel - pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoOut ); + /* render IVAS frames */ + if ( ( error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesRendered_loop, &hVoIP->nSamplesAvailableNext, rendererPcmBuf ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( pcmdsp_fifo_write( hVoIP->hFifoOut, (uint8_t *) rendererPcmBuf, nSamplesRendered_loop ) != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + } + else + { + nSamplesToRender = nSamplesPerChannel - nSamplesRendered; + /* render IVAS frames directly to the output buffer */ + if ( ( error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesRendered_loop, &hVoIP->nSamplesAvailableNext, pcmBuf + nSamplesRendered * nOutChannels ) ) != IVAS_ERR_OK ) + { + return error; + } + } + nSamplesRendered += nSamplesRendered_loop; +#ifdef VARIABLE_SPEED_DECODING + if ( hVoIP->mode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED && hVoIP->nSamplesAvailableNext == 0 ) + { + hVoIP->needNewFrame = true; + } +#endif + } + else if ( !hIvasDec->hasBeenFedFirstGoodFrame && hVoIP->hFifoOut == NULL ) { - /* write JBM trace data entry */ - store_JbmData( hVoIP, dataUnit, systemTimestamp_ms, extBufferedSamples, hDecoderConfig->output_Fs ); - if ( ( jbmWriterFn( &hVoIP->JbmTraceData, jbmWriter ) ) != IVAS_ERR_OK ) + hVoIP->nSamplesAvailableNext = 0; + } + else + { + hVoIP->nSamplesAvailableNext = max( 0, pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoOut ) - nSamplesPerChannel ); +#ifdef VARIABLE_SPEED_DECODING + if ( hVoIP->mode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED && hVoIP->nSamplesAvailableNext < nSamplesPerChannel ) { - fprintf( stderr, "\nError writing JBM Trace data to file\n" ); - return IVAS_ERR_UNKNOWN; + hVoIP->needNewFrame = true; } +#endif + hVoIP->nSamplesAvailableNext = 0; } #endif } /* fetch a user-specified number of samples from FIFO */ +#if defined( JBM_TSM_ON_TCS ) + if ( hVoIP->hFifoOut ) + { + if ( pcmdsp_fifo_read( hVoIP->hFifoOut, nSamplesPerChannel, (uint8_t *) pcmBuf ) != 0 ) +#else if ( pcmdsp_fifo_read( hVoIP->hFifoAfterTimeScaler, nSamplesPerChannel, (uint8_t *) pcmBuf ) != 0 ) +#endif + { + return IVAS_ERR_UNKNOWN; + } +#ifdef JBM_TSM_ON_TCS + } +#endif + +#if defined( JBM_TSM_ON_TCS ) || defined( VARIABLE_SPEED_DECODING ) +#ifdef JBM_TSM_ON_TCS + *sampleAvailableNext = hVoIP->nSamplesAvailableNext; +#else + *sampleAvailableNext = max( 0, pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoAfterTimeScaler ) ); +#endif +#endif + + return error; +} + +/*---------------------------------------------------------------------* + * IVAS_DEC_VoIP_Flush( ) + * + * Function to flush remaining audio in VoIP + *---------------------------------------------------------------------*/ + +#if defined( VARIABLE_SPEED_DECODING ) || defined( JBM_TSM_ON_TCS ) +ivas_error IVAS_DEC_VoIP_Flush( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const int16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ + int16_t *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */ + uint16_t *nSamplesAvailableNext, /* o : number of samples still available */ + int16_t *nSamplesFlushed /* o : number of samples flushed */ +) +{ + ivas_error error; + Decoder_Struct *st_ivas; + DECODER_CONFIG_HANDLE hDecoderConfig; + IVAS_DEC_VOIP *hVoIP; + int16_t rendererPcmBuf[( MAX_OUTPUT_CHANNELS * L_FRAME_MAX * APA_MAX_SCALE ) / 100]; + uint16_t nSamplesToRender; + uint16_t nSamplesFlushedLocal; + error = IVAS_ERR_OK; + + st_ivas = hIvasDec->st_ivas; + hDecoderConfig = st_ivas->hDecoderConfig; + hVoIP = hIvasDec->hVoIP; +#if defined( JBM_TSM_ON_TCS ) + *nSamplesFlushed = min( nSamplesPerChannel, hVoIP->nSamplesAvailableNext ); +#else + *nSamplesFlushed = min( nSamplesPerChannel, pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoAfterTimeScaler ) ); +#endif +#ifdef JBM_TSM_ON_TCS + if ( hVoIP->rendererType == JBM_RENDERER_NONE ) { - return IVAS_ERR_UNKNOWN; +#endif + /* fetch a user-specified number of samples from FIFO */ +#if defined( JBM_TSM_ON_TCS ) + if ( pcmdsp_fifo_read( hVoIP->hFifoOut, *nSamplesFlushed, (uint8_t *) pcmBuf ) != 0 ) +#else + if ( pcmdsp_fifo_read( hVoIP->hFifoAfterTimeScaler, *nSamplesFlushed, (uint8_t *) pcmBuf ) != 0 ) +#endif + { + return IVAS_ERR_UNKNOWN; + } +#if defined( JBM_TSM_ON_TCS ) + hVoIP->nSamplesAvailableNext -= *nSamplesFlushed; + *nSamplesAvailableNext = hVoIP->nSamplesAvailableNext; +#else + *nSamplesAvailableNext = pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoAfterTimeScaler ); +#endif +#ifdef JBM_TSM_ON_TCS } + else + { + nSamplesToRender = (uint16_t) *nSamplesFlushed; + /* render IVAS frames */ + if ( ( error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesFlushedLocal, &hVoIP->nSamplesAvailableNext, rendererPcmBuf ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( pcmdsp_fifo_write( hVoIP->hFifoOut, (uint8_t *) rendererPcmBuf, nSamplesFlushedLocal ) != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + if ( pcmdsp_fifo_read( hVoIP->hFifoOut, nSamplesFlushedLocal, (uint8_t *) pcmBuf ) != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + *nSamplesAvailableNext = hVoIP->nSamplesAvailableNext; + *nSamplesFlushed = (int16_t) nSamplesFlushedLocal; + } +#endif return error; } +#endif /*---------------------------------------------------------------------* @@ -1604,9 +2256,17 @@ ivas_error IVAS_DEC_VoIP_GetSamples( bool IVAS_DEC_VoIP_IsEmpty( IVAS_DEC_HANDLE hIvasDec /* i/o: IVAS decoder handle */ +#ifdef JBM_TSM_ON_TCS + , + int16_t nSamplesAsked +#endif ) { +#ifdef JBM_TSM_ON_TCS + return ( ( JB4_bufferedDataUnits( hIvasDec->hVoIP->hJBM ) == 0 ) && ( hIvasDec->hVoIP->nSamplesAvailableNext < nSamplesAsked ) ); +#else return JB4_bufferedDataUnits( hIvasDec->hVoIP->hJBM ) == 0; +#endif } @@ -1647,8 +2307,11 @@ static void IVAS_DEC_Close_VoIP( apa_exit( &hVoIP->hTimeScaler ); +#ifdef JBM_TSM_ON_TCS + pcmdsp_fifo_destroy( &hVoIP->hFifoOut ); +#else pcmdsp_fifo_destroy( &hVoIP->hFifoAfterTimeScaler ); - +#endif if ( hVoIP->apaExecBuffer != NULL ) { free( hVoIP->apaExecBuffer ); @@ -2103,6 +2766,9 @@ void IVAS_DEC_PrintDisclaimer( void ) static ivas_error evs_dec_main( Decoder_Struct *st_ivas, const int16_t nOutSamples, +#ifdef JBM_TSM_ON_TCS + float *floatBuf, +#endif int16_t *pcmBuf ) { DEC_CORE_HANDLE *hCoreCoder; @@ -2161,12 +2827,23 @@ static ivas_error evs_dec_main( st_ivas->BER_detect = hCoreCoder[0]->BER_detect; - /* convert 'float' output data to 'short' */ +#ifdef JBM_TSM_ON_TCS + if ( floatBuf != NULL ) + { + mvr2r( output, floatBuf, nOutSamples ); + } + else + { + +#endif + /* convert 'float' output data to 'short' */ #ifdef DEBUGGING - st_ivas->noClipping += + st_ivas->noClipping += +#endif + syn_output( output, nOutSamples, pcmBuf ); +#ifdef JBM_TSM_ON_TCS + } #endif - syn_output( output, nOutSamples, pcmBuf ); - return error; } @@ -2357,3 +3034,124 @@ static ivas_error input_format_API_to_internal( return IVAS_ERR_OK; } + +#ifdef JBM_TSM_ON_TCS +static int16_t IVAS_DEC_VoIP_GetRenderGranularity( Decoder_Struct *st_ivas ) +{ + + return st_ivas->hTcBuffer->n_samples_granularity; +} + +static JBM_RENDERER_TYPE IVAS_DEC_VoIP_GetRendererConfig( IVAS_DEC_HANDLE hIvasDec ) +{ + JBM_RENDERER_TYPE rendererType; + rendererType = JBM_RENDERER_NONE; + + if ( hIvasDec->mode == IVAS_DEC_MODE_EVS ) + { + rendererType = JBM_RENDERER_NONE; + } + else + { + rendererType = JBM_RENDERER_IVAS; + } + + return rendererType; +} + +ivas_error IVAS_DEC_VoIP_reconfigure( IVAS_DEC_HANDLE hIvasDec, const uint16_t nTransportChannels, const uint16_t l_ts ) +{ + + IVAS_DEC_VOIP *hVoIP; + ivas_error error; + + + hVoIP = hIvasDec->hVoIP; + + if ( hIvasDec->hVoIP->hTimeScaler == NULL ) + { + + uint16_t wss, css; + float startQuality; + DECODER_CONFIG_HANDLE hDecoderConfig; + +#ifdef VARIABLE_SPEED_DECODING + startQuality = hVoIP->mode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED ? -2.0f : 1.0f; +#else + startQuality = 1.0f; +#endif + /* get current renderer type*/ + hVoIP->rendererType = IVAS_DEC_VoIP_GetRendererConfig( hIvasDec ); + hDecoderConfig = hIvasDec->st_ivas->hDecoderConfig; + if ( hDecoderConfig->output_Fs == 8000 ) + { + wss = 1; + css = 1; + } + else if ( hDecoderConfig->output_Fs == 16000 ) + { + wss = 2; + css = 1; + } + else if ( hDecoderConfig->output_Fs == 32000 ) + { + wss = 4; + css = 2; + } + else if ( hDecoderConfig->output_Fs == 48000 ) + { + wss = 6; + css = 3; + } + else + { + return IVAS_ERR_INIT_ERROR; + } + hIvasDec->hVoIP->apaExecBuffer = malloc( sizeof( float ) * APA_BUF_PER_CHANNEL * nTransportChannels ); + set_zero( hIvasDec->hVoIP->apaExecBuffer, APA_BUF_PER_CHANNEL * nTransportChannels ); + if ( hIvasDec->hVoIP->apaExecBuffer == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate VoIP handle" ); + } + if ( apa_init( &hIvasDec->hVoIP->hTimeScaler, + nTransportChannels ) != IVAS_ERR_OK || + apa_set_rate( hIvasDec->hVoIP->hTimeScaler, hDecoderConfig->output_Fs ) != 0 || + apa_set_complexity_options( hIvasDec->hVoIP->hTimeScaler, wss, css ) != 0 || + apa_set_quality( hIvasDec->hVoIP->hTimeScaler, startQuality, 4, 4 ) != 0 || + apa_set_renderer_granularity( hIvasDec->hVoIP->hTimeScaler, l_ts ) != 0 ) + { + return IVAS_ERR_INIT_ERROR; + } + if ( hVoIP->hFifoOut == NULL && hVoIP->rendererType == JBM_RENDERER_NONE ) + { + /* we still need the FIFO out buffer */ + if ( pcmdsp_fifo_create( &hIvasDec->hVoIP->hFifoOut ) != 0 || + pcmdsp_fifo_init( hIvasDec->hVoIP->hFifoOut, (uint16_t) ( hDecoderConfig->output_Fs * 4 / FRAMES_PER_SEC ) /* 4 frames */, hDecoderConfig->nchan_out, sizeof( int16_t ) ) != 0 ) + { + return IVAS_ERR_INIT_ERROR; + } + } + } + else + { + if ( apa_reconfigure( hVoIP->hTimeScaler, nTransportChannels, l_ts ) != 0 ) + { + return IVAS_ERR_INIT_ERROR; + } + + /* realloc apa_exe_buffer */ + free( hIvasDec->hVoIP->apaExecBuffer ); + hIvasDec->hVoIP->apaExecBuffer = malloc( sizeof( float ) * APA_BUF_PER_CHANNEL * nTransportChannels ); + set_zero( hIvasDec->hVoIP->apaExecBuffer, APA_BUF_PER_CHANNEL * nTransportChannels ); + if ( hIvasDec->hVoIP->apaExecBuffer == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate VoIP handle" ); + } + } + hIvasDec->hVoIP->nTransportChannelsOld = (uint8_t) nTransportChannels; + + error = IVAS_ERR_OK; + + return error; +} +#endif diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index 17af564295..8178aa6262 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -77,6 +77,15 @@ typedef enum IVAS_DEC_INPUT_FORMAT_RTPDUMP_HF = 4, /* RTP payload: only Header-Full format without zero padding for size collision avoidance */ } IVAS_DEC_INPUT_FORMAT; + +#ifdef VARIABLE_SPEED_DECODING +typedef enum +{ + IVAS_DEC_VOIP_MODE_VOIP = 0, + IVAS_DEC_VOIP_MODE_VARIABLE_SPEED = 1 +} IVAS_DEC_VOIP_MODE; +#endif + #ifdef DEBUGGING typedef enum _IVAS_DEC_FORCED_REND_MODE { @@ -199,23 +208,49 @@ ivas_error IVAS_DEC_VoIP_FeedFrame( const bool qBit /* i : Q bit for AMR-WB IO */ ); +#ifdef VARIABLE_SPEED_DECODING +/*! r: error code */ +ivas_error IVAS_DEC_VoIP_SetScale( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const int16_t scale /* i : TSM scale to set */ +); +#endif + /*! r: error code */ ivas_error IVAS_DEC_VoIP_GetSamples( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ uint16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ int16_t *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */ const uint32_t systemTimestamp_ms /* i : current system timestamp */ +#if defined( JBM_TSM_ON_TCS ) || defined(VARIABLE_SPEED_DECODING ) + , + uint16_t *sampleAvailableNext /* o : samples available for the next call */ +#endif #ifdef SUPPORT_JBM_TRACEFILE , JbmTraceFileWriterFn jbmWriterFn, void* jbmWriter #endif ); +#if defined( JBM_TSM_ON_TCS ) || defined(VARIABLE_SPEED_DECODING ) +ivas_error IVAS_DEC_VoIP_Flush( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const int16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ + int16_t *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */ + uint16_t *nSamplesAvailableNext, /* o : number of samples still available */ + int16_t *nSamplesFlushed /* o : number of samples flushed */ +); +#endif + /* Setter functions - apply changes to decoder configuration */ /*! r: error code */ ivas_error IVAS_DEC_EnableVoIP( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ +#ifdef VARIABLE_SPEED_DECODING + const IVAS_DEC_VOIP_MODE voipMode, /* i : VoIP or varable speed */ + const uint16_t speedFac, /* i : speed factor for varable speed */ +#endif const int16_t jbmSafetyMargin, /* i : allowed delay reserve for JBM, in milliseconds */ const IVAS_DEC_INPUT_FORMAT inputFormat /* i : format of the input bitstream */ ); @@ -331,6 +366,10 @@ ivas_error IVAS_DEC_GetPcmFrameSize( /*! r: true if decoder has no data in VoIP jitter buffer */ bool IVAS_DEC_VoIP_IsEmpty( IVAS_DEC_HANDLE hIvasDec /* i/o: IVAS decoder handle */ +#ifdef JBM_TSM_ON_TCS + , + int16_t nSamplesAsked +#endif ); ivas_error IVAS_DEC_VoIP_Get_CA_offset( diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index c05ae7c262..8dc6fa6783 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -939,8 +939,13 @@ static ivas_error ivas_rend_crendConvolver( const CREND_WRAPPER *pCrend, IVAS_REND_AudioConfig inConfig, IVAS_REND_AudioConfig outConfig, +#ifdef JBM_TSM_ON_TCS + float *pcm_in[], + float *pcm_out[], +#else float pcm_in[][L_FRAME48k], float pcm_out[][L_FRAME48k], +#endif const int32_t output_Fs, const int16_t i_ts ) { @@ -1105,12 +1110,19 @@ ivas_error ivas_rend_crendProcess( HEAD_TRACK_DATA_HANDLE hHeadTrackData, IVAS_OUTPUT_SETUP_HANDLE hIntSetup, EFAP_HANDLE hEFAPdata, +#ifdef JBM_TSM_ON_TCS + float *output[], /* i/o: input/output audio channels */ +#else float output[][L_FRAME48k], /* i/o: input/output audio channels */ +#endif const int32_t output_Fs ) { int16_t i, subframe_idx, output_frame, subframe_len; int16_t nchan_out; float pcm_tmp[BINAURAL_CHANNELS][L_FRAME48k]; +#ifdef JBM_TSM_ON_TCS + float *p_pcm_tmp[BINAURAL_CHANNELS]; +#endif AUDIO_CONFIG in_config; IVAS_REND_AudioConfigType inConfigType; ivas_error error; @@ -1133,6 +1145,12 @@ ivas_error ivas_rend_crendProcess( output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC ); subframe_len = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES; +#ifdef JBM_TSM_ON_TCS + for ( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + p_pcm_tmp[i] = pcm_tmp[i]; + } +#endif for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) { if ( hDecoderConfig && hDecoderConfig->Opt_Headrotation && hHeadTrackData && hHeadTrackData->num_quaternions >= 0 ) @@ -1156,14 +1174,22 @@ ivas_error ivas_rend_crendProcess( if ( ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) || ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) ) { +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_rend_crendConvolver( pCrend, inRendConfig, outRendConfig, output, p_pcm_tmp, output_Fs, subframe_idx ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_rend_crendConvolver( pCrend, inRendConfig, outRendConfig, output, pcm_tmp, output_Fs, subframe_idx ) ) != IVAS_ERR_OK ) +#endif { return error; } if ( pCrend->hCrend->hReverb != NULL ) { +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_reverb_process( pCrend->hCrend->hReverb, in_config, 1, output, p_pcm_tmp, subframe_idx ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_reverb_process( pCrend->hCrend->hReverb, in_config, 1, output, pcm_tmp, subframe_idx ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -1185,3 +1211,131 @@ ivas_error ivas_rend_crendProcess( return IVAS_ERR_OK; } + +#ifdef JBM_TSM_ON_TCS +ivas_error ivas_rend_crendProcessSubframe( + const CREND_WRAPPER *pCrend, + const AUDIO_CONFIG inConfig, + const AUDIO_CONFIG outConfig, + DECODER_CONFIG_HANDLE hDecoderConfig, + HEAD_TRACK_DATA_HANDLE hHeadTrackData, + IVAS_OUTPUT_SETUP_HANDLE hIntSetup, + EFAP_HANDLE hEFAPdata, + DECODER_TC_BUFFER_HANDLE hTcBuffer, + float *input_f[], + float *output[], /* i/o: input/output audio channels */ + const int16_t n_samples_to_render, + const int32_t output_Fs ) +{ + int16_t subframe_idx, subframe_len; + int16_t nchan_out, nchan_in, ch, first_sf, last_sf, slot_size, slots_to_render; + float *tc_local[MAX_TRANSPORT_CHANNELS]; + float pcm_tmp[BINAURAL_CHANNELS][L_FRAME48k]; + float *p_pcm_tmp[BINAURAL_CHANNELS]; + AUDIO_CONFIG in_config; + IVAS_REND_AudioConfigType inConfigType; + ivas_error error; + IVAS_REND_AudioConfig inRendConfig; + IVAS_REND_AudioConfig outRendConfig; + + push_wmops( "ivas_rend_crendProcessSubframe" ); + + inRendConfig = getRendAudioConfigFromIvasAudioConfig( inConfig ); + outRendConfig = getRendAudioConfigFromIvasAudioConfig( outConfig ); + + in_config = getIvasAudioConfigFromRendAudioConfig( inRendConfig ); + inConfigType = getAudioConfigType( inRendConfig ); + if ( ( error = getAudioConfigNumChannels( outRendConfig, &nchan_out ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( ( error = getAudioConfigNumChannels( inRendConfig, &nchan_in ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( ch = 0; ch < nchan_in; ch++ ) + { + tc_local[ch] = input_f[ch]; + } + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + p_pcm_tmp[ch] = pcm_tmp[ch]; + } + + slot_size = hTcBuffer->n_samples_granularity; + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + slots_to_render = min( hTcBuffer->num_slots - hTcBuffer->slots_rendered, n_samples_to_render / slot_size ); + first_sf = hTcBuffer->subframes_rendered; + last_sf = first_sf; + hTcBuffer->slots_rendered += slots_to_render; + while ( slots_to_render > 0 ) + { + slots_to_render -= hTcBuffer->subframe_nbslots[last_sf]; + last_sf++; + } + + for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) + { + subframe_len = hTcBuffer->subframe_nbslots[subframe_idx] * hTcBuffer->n_samples_granularity; + if ( hDecoderConfig && hDecoderConfig->Opt_Headrotation && hHeadTrackData && hHeadTrackData->num_quaternions >= 0 ) + { + + /* Rotation in SHD for: + MC with elevation (5_1_2 / 5_1_4 / 7_1_4) -> BINAURAL + SBA SPAR -> BINAURAL or BINAURAL_ROOM + */ + if ( in_config == AUDIO_CONFIG_FOA || in_config == AUDIO_CONFIG_HOA2 || in_config == AUDIO_CONFIG_HOA3 ) + { + rotateFrame_shd( hHeadTrackData, tc_local, subframe_len, *hIntSetup, 0 ); + } + /* Rotation in SD for MC -> BINAURAL_ROOM */ + else if ( ( hIntSetup != NULL ) && hIntSetup->is_loudspeaker_setup ) + { + rotateFrame_sd( hHeadTrackData, tc_local, subframe_len, *hIntSetup, hEFAPdata, 0 ); + } + } + + if ( ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) || ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) ) + { + if ( ( error = ivas_rend_crendConvolver( pCrend, inRendConfig, outRendConfig, tc_local, p_pcm_tmp, output_Fs, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( pCrend->hCrend->hReverb != NULL ) + { + if ( ( error = ivas_reverb_process( pCrend->hCrend->hReverb, in_config, 1, tc_local, p_pcm_tmp, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + for ( ch = 0; ch < nchan_in; ch++ ) + { + tc_local[ch] += subframe_len; + } + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + p_pcm_tmp[ch] += subframe_len; + } + } + else + { + return IVAS_ERR_INVALID_INPUT_FORMAT; + } + } + + /* move to output */ + for ( ch = 0; ch < nchan_out; ch++ ) + { + mvr2r( pcm_tmp[ch], output[ch], n_samples_to_render ); + } + + + hTcBuffer->subframes_rendered = last_sf; + pop_wmops(); + + return IVAS_ERR_OK; +} +#endif + diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 35819cf8cb..17969865e9 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -94,6 +94,17 @@ static void matrixTransp2Mul( float Are[BINAURAL_CHANNELS][BINAURAL_CHANNELS], f static float configure_reqularization_factor( const IVAS_FORMAT ivas_format, const int32_t ivas_brate ); +#ifdef JBM_TSM_ON_TCS +static void ivas_dirac_dec_binaural_process_output_sf( Decoder_Struct *st_ivas, float *output_f[], float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t max_band_decorr, const uint8_t numInChannels ); + +static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked_sf( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const uint8_t slotEnd, const uint8_t nBins, float Rmat[3][3] ); + +static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices_sf( Decoder_Struct *st_ivas, float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], int16_t azimuth[][CLDFB_NO_CHANNELS_MAX], int16_t elevation[][CLDFB_NO_CHANNELS_MAX], float energy_ratio1[][CLDFB_NO_CHANNELS_MAX], float spreadCoherence[][CLDFB_NO_CHANNELS_MAX], float surroundingCoherence[][CLDFB_NO_CHANNELS_MAX], float Rmat[3][3] ); + +static void ivas_dirac_dec_binaural_internal_sf( Decoder_Struct *st_ivas, float *output_f[], const int16_t nchan_transport ); + +static void ivas_dirac_dec_decorrelate_slot_sf( DIRAC_DEC_HANDLE hDirAC, const int8_t slot, float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float decRe[][CLDFB_NO_CHANNELS_MAX], float decIm[][CLDFB_NO_CHANNELS_MAX] ); +#endif /*------------------------------------------------------------------------- * ivas_dirac_dec_init_binaural_data() * @@ -112,6 +123,9 @@ ivas_error ivas_dirac_dec_init_binaural_data( int16_t j, k, bin; float binCenterFreq, tmpFloat; ivas_error error; +#ifdef JBM_TSM_ON_TCS + int16_t reverbBlockSize; +#endif hBinaural = st_ivas->hDiracDecBin; @@ -213,6 +227,18 @@ ivas_error ivas_dirac_dec_init_binaural_data( { if ( hBinaural->useSubframeMode ) { +#ifdef JBM_TSM_ON_TCS + reverbBlockSize = st_ivas->hDecoderConfig->voip_active ? 1 : CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; + if ( ( error = ivas_binaural_reverb_open( &hBinaural->hReverb, + nBins, + reverbBlockSize, NULL, + st_ivas->hIntSetup.output_config, + output_Fs, + RENDERER_BINAURAL_PARAMETRIC_ROOM, + st_ivas->hHrtfFastConv, + st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) + +#else if ( ( error = ivas_binaural_reverb_open( &hBinaural->hReverb, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, NULL, @@ -221,6 +247,7 @@ ivas_error ivas_dirac_dec_init_binaural_data( RENDERER_BINAURAL_PARAMETRIC_ROOM, st_ivas->hHrtfFastConv, st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -285,6 +312,21 @@ ivas_error ivas_dirac_dec_init_binaural_data( st_ivas->hDiracDecBin = hBinaural; +#ifdef JBM_TSM_ON_TCS + /* allocate transport channels*/ + if ( st_ivas->hDecoderConfig->voip_active == 1 && st_ivas->hTcBuffer == NULL ) + { + int16_t nchan_to_allocate; + + nchan_to_allocate = 2 * BINAURAL_CHANNELS; + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, ivas_jbm_dec_get_num_tc_channels( st_ivas ), nchan_to_allocate, nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + +#endif /* JBM_TMS_ON_TCS*/ + return IVAS_ERR_OK; } @@ -363,6 +405,71 @@ ivas_error ivas_dirac_dec_binaural_copy_hrtfs( return IVAS_ERR_OK; } +#ifdef JBM_TSM_ON_TCS +void ivas_dirac_dec_binaural_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + const int16_t nchan_transport, + float *output_f[] /* o : rendered time signal */ +) +{ + int16_t slots_to_render, first_sf, last_sf, subframe_idx; + uint16_t slot_size, ch; + uint16_t nchan_out; + DIRAC_DEC_HANDLE hDirAC; + float *output_f_local[MAX_OUTPUT_CHANNELS]; + + hDirAC = st_ivas->hDirAC; + nchan_out = BINAURAL_CHANNELS; +#ifdef DEBUGGING + assert( hDirAC ); +#endif + for ( ch = 0; ch < nchan_out; ch++ ) + { + output_f_local[ch] = output_f[ch]; + } + slot_size = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + slots_to_render = min( hDirAC->num_slots - hDirAC->slots_rendered, nSamplesAsked / slot_size ); + *nSamplesRendered = slots_to_render * slot_size; + first_sf = hDirAC->subframes_rendered; + last_sf = first_sf; + while ( slots_to_render > 0 ) + { + slots_to_render -= hDirAC->subframe_nbslots[last_sf]; + last_sf++; + } +#ifdef DEBUGGING + assert( slots_to_render == 0 ); +#endif + for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) + { + int16_t n_samples_sf = slot_size * hDirAC->subframe_nbslots[subframe_idx]; + ivas_dirac_dec_binaural_internal_sf( st_ivas, output_f_local, nchan_transport ); + for ( ch = 0; ch < nchan_out; ch++ ) + { + output_f_local[ch] += n_samples_sf; + } + } + if ( hDirAC->slots_rendered == hDirAC->num_slots ) + { + if ( st_ivas->hDirAC->hConfig != NULL && st_ivas->hDirAC->hConfig->dec_param_estim == 1 ) + { + st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_CLDFB_TIMESLOTS ) % st_ivas->hDirAC->dirac_md_buffer_length; + } + else + { + st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % st_ivas->hDirAC->dirac_md_buffer_length; + } + } + *nSamplesAvailable = ( hDirAC->num_slots - hDirAC->slots_rendered ) * slot_size; + + return; +} +#endif + /*------------------------------------------------------------------------- * ivas_dirac_dec_binaural() * @@ -375,34 +482,96 @@ void ivas_dirac_dec_binaural( const int16_t nchan_transport /* i : number of transport channels */ ) { +#ifdef JBM_TSM_ON_TCS + float cng_td_buffer[L_FRAME16k]; + float *p_output[MAX_OUTPUT_CHANNELS]; + int16_t ch, n_samples_sf; + + n_samples_sf = JBM_CLDFB_SLOTS_IN_SUBFRAME * st_ivas->hDirAC->slot_size; + + for ( ch = 0; ch < 2 * BINAURAL_CHANNELS; ch++ ) + { + p_output[ch] = &output_f[ch][0]; + } + for ( ch = 0; ch < nchan_transport; ch++ ) + { + st_ivas->hTcBuffer->tc[ch] = &output_f[ch][0]; + } + ivas_dirac_dec_set_md_map( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS ); + if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR ) + { + ivas_spar_dec_set_render_map( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS ); + } + +#endif +#ifdef DEBUG_MODE_JBM + dbgwritewav( st_ivas->hDirAC->slot_size * 16, NULL, output_f, nchan_transport, st_ivas->hDecoderConfig->output_Fs, "res/dirac_dec_binaural_tc.wav" ); +#endif if ( st_ivas->hDiracDecBin->useTdDecorr ) { float *decorr_signal[BINAURAL_CHANNELS]; +#ifndef JBM_TSM_ON_TCS int16_t ch; +#endif int16_t output_frame; for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { decorr_signal[ch] = (float *) &( output_f[ch + BINAURAL_CHANNELS][0] ); +#ifdef JBM_TSM_ON_TCS + st_ivas->hTcBuffer->tc[ch + BINAURAL_CHANNELS] = decorr_signal[ch]; +#endif } output_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); - +#ifdef JBM_TSM_ON_TCS + { + ivas_td_decorr_process( st_ivas->hDiracDecBin->hTdDecorr, p_output, decorr_signal, output_frame ); + } +#else ivas_td_decorr_process( st_ivas->hDiracDecBin->hTdDecorr, output_f, decorr_signal, output_frame ); +#endif +#ifdef DEBUG_MODE_JBM + dbgwritewav( st_ivas->hDirAC->slot_size * 16, decorr_signal, output_f, BINAURAL_CHANNELS, st_ivas->hDecoderConfig->output_Fs, "res/dirac_dec_binaural_tddecorr.wav" ); +#endif + } +#ifdef JBM_TSM_ON_TCS + if ( nchan_transport == 1 && st_ivas->nchan_transport != 2 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ) + { + Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; + st_ivas->hTcBuffer->tc[nchan_transport] = &cng_td_buffer[0]; + generate_masking_noise_lb_dirac( st->hFdCngDec->hFdCngCom, st_ivas->hTcBuffer->tc[nchan_transport], DEFAULT_JBM_CLDFB_TIMESLOTS, st->cna_dirac_flag && st->flag_cna ); +#ifdef DEBUG_MODE_JBM + dbgwritewav( st->hFdCngDec->hFdCngCom->frameSize, &( st_ivas->hTcBuffer->tc[nchan_transport] ), output_f, 1, st->hFdCngDec->hFdCngCom->frameSize * FRAMES_PER_SEC, "res/dirac_dec_binaural_cng.wav" ); +#endif } +#endif if ( st_ivas->hDiracDecBin->useSubframeMode ) { uint8_t subframe; for ( subframe = 0; subframe < MAX_PARAM_SPATIAL_SUBFRAMES; subframe++ ) { +#ifdef DEBUG_JBM + ivas_dirac_dec_binaural_internal_sf( st_ivas, p_output, nchan_transport ); + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + p_output[ch] += n_samples_sf; + } +#else ivas_dirac_dec_binaural_internal( st_ivas, output_f, nchan_transport, subframe, 1u ); +#endif } } else { ivas_dirac_dec_binaural_internal( st_ivas, output_f, nchan_transport, 0u, (uint8_t) MAX_PARAM_SPATIAL_SUBFRAMES ); } - +#ifdef JBM_TSM_ON_TCS + for ( ch = 0; ch < 2 * BINAURAL_CHANNELS; ch++ ) + { + st_ivas->hTcBuffer->tc[ch] = NULL; + } +#endif return; } @@ -410,6 +579,209 @@ void ivas_dirac_dec_binaural( /*------------------------------------------------------------------------- * Local functions *------------------------------------------------------------------------*/ +#ifdef JBM_TSM_ON_TCS +static void ivas_dirac_dec_binaural_internal_sf( + Decoder_Struct *st_ivas, + float *output_f[], + const int16_t nchan_transport ) +{ + DIRAC_DEC_HANDLE hDirAC; + uint8_t slot, ch, nBins, numInChannels; + float Cldfb_RealBuffer_in[2 * BINAURAL_CHANNELS][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer_in[2 * BINAURAL_CHANNELS][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + /* local copies of azi, ele, diffuseness */ + int16_t azimuth[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + int16_t elevation[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float spreadCoherence[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float surroundingCoherence[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float energy_ratio1[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float Rmat[3][3]; + uint16_t slot_idx, slot_idx_start, subframe_idx; + int16_t max_band_decorr; + DIFFUSE_DISTRIBUTION_DATA diffuseDistData; + + + hDirAC = st_ivas->hDirAC; + nBins = (uint8_t) hDirAC->num_freq_bands; + + /* The input channel number at this processing function (not nchan_transport) */ + numInChannels = BINAURAL_CHANNELS; + if ( st_ivas->hOutSetup.separateChannelEnabled ) + { + numInChannels++; + } + + Rmat[0][0] = 1.0f; + Rmat[0][1] = 0.0f; + Rmat[0][2] = 0.0f; + + Rmat[1][0] = 0.0f; + Rmat[1][1] = 1.0f; + Rmat[1][2] = 0.0f; + + Rmat[2][0] = 0.0f; + Rmat[2][1] = 0.0f; + Rmat[2][2] = 1.0f; + + slot_idx_start = hDirAC->slots_rendered; + subframe_idx = hDirAC->subframes_rendered; + + /* copy parameters into local buffers*/ + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) + { + mvs2s( hDirAC->azimuth[hDirAC->render_to_md_slot_map[slot_idx + slot_idx_start]], azimuth[slot_idx], hDirAC->num_freq_bands ); + mvs2s( hDirAC->elevation[hDirAC->render_to_md_slot_map[slot_idx + slot_idx_start]], elevation[slot_idx], hDirAC->num_freq_bands ); + mvr2r( hDirAC->spreadCoherence[hDirAC->render_to_md_slot_map[slot_idx + slot_idx_start]], spreadCoherence[slot_idx], hDirAC->num_freq_bands ); + mvr2r( hDirAC->surroundingCoherence[hDirAC->render_to_md_slot_map[slot_idx + slot_idx_start]], surroundingCoherence[slot_idx], hDirAC->num_freq_bands ); + mvr2r( hDirAC->energy_ratio1[hDirAC->render_to_md_slot_map[slot_idx + slot_idx_start]], energy_ratio1[slot_idx], hDirAC->num_freq_bands ); + } + + /* CLDFB Analysis of input */ + for ( slot = 0; slot < hDirAC->subframe_nbslots[hDirAC->subframes_rendered]; slot++ ) + { + for ( ch = 0; ch < numInChannels; ch++ ) + { + if ( ch == 0 || nchan_transport == 2 ) + { + cldfbAnalysis_ts( &( st_ivas->hTcBuffer->tc[ch][nBins * ( slot + slot_idx_start )] ), + Cldfb_RealBuffer_in[ch][slot], + Cldfb_ImagBuffer_in[ch][slot], + nBins, st_ivas->cldfbAnaDec[ch] ); + } + else if ( st_ivas->nchan_transport == 2 ) /* Stereo signal transmitted as mono with DFT stereo */ + { + /* At mono input duplicate the channel to dual-mono */ + mvr2r( Cldfb_RealBuffer_in[0][slot], Cldfb_RealBuffer_in[1][slot], nBins ); + mvr2r( Cldfb_ImagBuffer_in[0][slot], Cldfb_ImagBuffer_in[1][slot], nBins ); + } + else /* when nchan_transport == 1 and ch == 1 */ + { + /* CNA and HB FD-CNG*/ + if ( st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ) + { + int16_t numCoreBands, b; + + numCoreBands = st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->numCoreBands; + + + generate_masking_noise_dirac( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom, + st_ivas->cldfbAnaDec[1], + st_ivas->hTcBuffer->tc[nchan_transport], + Cldfb_RealBuffer_in[2][slot], Cldfb_ImagBuffer_in[2][slot], + slot + slot_idx_start, + st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->hSCE[0]->hCoreCoder[0]->flag_cna, + ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA || st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 ) && ( st_ivas->hSCE[0]->hCoreCoder[0]->cng_type == FD_CNG ) && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ); + + generate_masking_noise_dirac( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom, + st_ivas->cldfbAnaDec[1], /*nothing will be analyzed, just get cnst*/ + NULL, + Cldfb_RealBuffer_in[1][slot], Cldfb_ImagBuffer_in[1][slot], + slot + slot_idx_start, + st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->hSCE[0]->hCoreCoder[0]->flag_cna, + ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA || st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 ) && ( st_ivas->hSCE[0]->hCoreCoder[0]->cng_type == FD_CNG ) && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ); + + /* LB: Copy first channel + LB-CNG to first and second channels with same scaling (dual-mono)*/ + for ( b = 0; b < numCoreBands; b++ ) + { + Cldfb_RealBuffer_in[0][slot][b] = INV_SQRT2 * ( Cldfb_RealBuffer_in[0][slot][b] + Cldfb_RealBuffer_in[2][slot][b] ); + Cldfb_RealBuffer_in[1][slot][b] = Cldfb_RealBuffer_in[0][slot][b]; + Cldfb_ImagBuffer_in[0][slot][b] = INV_SQRT2 * ( Cldfb_ImagBuffer_in[0][slot][b] + Cldfb_ImagBuffer_in[2][slot][b] ); + Cldfb_ImagBuffer_in[1][slot][b] = Cldfb_ImagBuffer_in[0][slot][b]; + } + + /* HB: Copy first channel to second channel and add HB-CNGs with different scalings*/ + for ( ; b < nBins; b++ ) + { + Cldfb_RealBuffer_in[0][slot][b] *= INV_SQRT2; + Cldfb_RealBuffer_in[1][slot][b] = Cldfb_RealBuffer_in[0][slot][b] + 0.5f * Cldfb_RealBuffer_in[1][slot][b] + Cldfb_RealBuffer_in[0][slot][b]; + Cldfb_RealBuffer_in[0][slot][b] += 0.5f * Cldfb_RealBuffer_in[2][slot][b]; + + Cldfb_ImagBuffer_in[0][slot][b] *= INV_SQRT2; + Cldfb_ImagBuffer_in[1][slot][b] = Cldfb_ImagBuffer_in[0][slot][b] + 0.5f * Cldfb_ImagBuffer_in[1][slot][b]; + Cldfb_ImagBuffer_in[0][slot][b] += 0.5f * Cldfb_ImagBuffer_in[2][slot][b]; + } + } + else + { + /* At mono input duplicate the channel to dual-mono, and apply gain + correction to ensure same overall level as in stereo mode */ + v_multc( Cldfb_RealBuffer_in[0][slot], INV_SQRT_2, Cldfb_RealBuffer_in[0][slot], nBins ); + v_multc( Cldfb_ImagBuffer_in[0][slot], INV_SQRT_2, Cldfb_ImagBuffer_in[0][slot], nBins ); + + mvr2r( Cldfb_RealBuffer_in[0][slot], Cldfb_RealBuffer_in[1][slot], nBins ); + mvr2r( Cldfb_ImagBuffer_in[0][slot], Cldfb_ImagBuffer_in[1][slot], nBins ); + } + } + } + + if ( st_ivas->hDiracDecBin->useTdDecorr ) + { + for ( ch = BINAURAL_CHANNELS; ch < ( 2 * BINAURAL_CHANNELS ); ch++ ) + { + cldfbAnalysis_ts( &( st_ivas->hTcBuffer->tc[ch][nBins * ( slot + slot_idx_start )] ), + Cldfb_RealBuffer_in[ch][slot], + Cldfb_ImagBuffer_in[ch][slot], + nBins, st_ivas->cldfbAnaDec[ch] ); + + if ( st_ivas->nchan_transport == 1 && st_ivas->ivas_format == SBA_FORMAT ) + { + v_multc( Cldfb_RealBuffer_in[ch][slot], INV_SQRT_2, Cldfb_RealBuffer_in[ch][slot], nBins ); + v_multc( Cldfb_ImagBuffer_in[ch][slot], INV_SQRT_2, Cldfb_ImagBuffer_in[ch][slot], nBins ); + } + } + } + } + + if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR ) + { + st_ivas->hDirAC->hDiffuseDist = &diffuseDistData; + ivas_spar_param_to_masa_param_mapping_sf( st_ivas, azimuth, elevation, energy_ratio1, spreadCoherence, surroundingCoherence, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in ); + + ivas_sba_prototype_renderer_sf( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in ); + + /* we are done with SPAR, update SPAR info*/ + st_ivas->hSpar->slots_rendered += st_ivas->hSpar->subframe_nbslots[st_ivas->hSpar->subframes_rendered]; + st_ivas->hSpar->subframes_rendered++; + } + + if ( st_ivas->hHeadTrackData && st_ivas->hHeadTrackData->num_quaternions >= 0 ) + { + QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[subframe_idx], Rmat ); + + if ( nchan_transport == 2 ) + { + ivas_dirac_dec_binaural_check_and_switch_transports_headtracked_sf( st_ivas->hHeadTrackData, Cldfb_ImagBuffer_in, Cldfb_RealBuffer_in, (uint8_t) hDirAC->subframe_nbslots[subframe_idx], nBins, Rmat ); + } + } + + ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices_sf( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, azimuth, elevation, energy_ratio1, spreadCoherence, surroundingCoherence, Rmat ); + + if ( st_ivas->ivas_format == ISM_FORMAT ) + { + max_band_decorr = 0; + } + else if ( st_ivas->hDiracDecBin->useTdDecorr ) + { + max_band_decorr = CLDFB_NO_CHANNELS_MAX; + } + else + { + max_band_decorr = st_ivas->hDirAC->h_freq_domain_decorr_ap_params->max_band_decorr; + } + + ivas_dirac_dec_binaural_determine_processing_matrices( st_ivas, max_band_decorr, Rmat ); + + ivas_dirac_dec_binaural_process_output_sf( st_ivas, output_f, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, max_band_decorr, numInChannels ); + + /* we are done with DirAC, update DirAC info*/ + st_ivas->hDirAC->slots_rendered += st_ivas->hDirAC->subframe_nbslots[st_ivas->hDirAC->subframes_rendered]; + st_ivas->hDirAC->subframes_rendered++; + + st_ivas->hDirAC->hDiffuseDist = NULL; + + return; +} +#endif static void ivas_dirac_dec_binaural_internal( Decoder_Struct *st_ivas, @@ -481,7 +853,11 @@ static void ivas_dirac_dec_binaural_internal( generate_masking_noise_dirac( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom, st_ivas->cldfbAnaDec[1], +#ifdef JBM_TSM_ON_TCS + st_ivas->hTcBuffer->tc[1], +#else &( output_f[1][L_FRAME48k - L_FRAME16k] ), /*used as temporary static buffer for the whole frame*/ +#endif Cldfb_RealBuffer_in[2][slot], Cldfb_ImagBuffer_in[2][slot], slot, st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->hSCE[0]->hCoreCoder[0]->flag_cna, @@ -494,7 +870,18 @@ static void ivas_dirac_dec_binaural_internal( slot, st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->hSCE[0]->hCoreCoder[0]->flag_cna, ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA || st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 ) && ( st_ivas->hSCE[0]->hCoreCoder[0]->cng_type == FD_CNG ) && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ); - +#ifdef DEBUG_MODE_JBM + if ( slot == 0 ) + { +#ifdef JBM_TSM_ON_TCS + dbgwritewav( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->frameSize, &( st_ivas->tc[nchan_transport] ), output_f, 1, st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->frameSize * FRAMES_PER_SEC, "res/dirac_dec_binaural_cng.wav" ); +#else + float *tc[1]; + tc[0] = &( output_f[1][L_FRAME48k - L_FRAME16k] ); + dbgwritewav( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->frameSize, tc, output_f, 1, st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->frameSize * FRAMES_PER_SEC, "res/dirac_dec_binaural_cng.wav" ); +#endif + } +#endif /* LB: Copy first channel + LB-CNG to first and second channels with same scaling (dual-mono)*/ for ( b = 0; b < numCoreBands; b++ ) { @@ -533,10 +920,15 @@ static void ivas_dirac_dec_binaural_internal( { for ( ch = BINAURAL_CHANNELS; ch < ( 2 * BINAURAL_CHANNELS ); ch++ ) { - cldfbAnalysis_ts( &( output_f[ch][nBins * slot] ), - Cldfb_RealBuffer_in[ch][slot], - Cldfb_ImagBuffer_in[ch][slot], - nBins, st_ivas->cldfbAnaDec[ch] ); + cldfbAnalysis_ts( +#ifdef JBM_TSM_ON_TCS + &( st_ivas->hTcBuffer->tc[ch][nBins * slot] ), +#else + &( output_f[ch][nBins * slot] ), +#endif + Cldfb_RealBuffer_in[ch][slot], + Cldfb_ImagBuffer_in[ch][slot], + nBins, st_ivas->cldfbAnaDec[ch] ); if ( st_ivas->nchan_transport == 1 && st_ivas->ivas_format == SBA_FORMAT ) { @@ -589,6 +981,11 @@ static void ivas_dirac_dec_binaural_internal( st_ivas->hDirAC->hDiffuseDist = NULL; +#ifdef JBM_TSM_ON_TCS + st_ivas->hDirAC->slots_rendered += ( slotEnd - firstSlot ); + st_ivas->hDirAC->subframes_rendered += nSubframes; +#endif + return; } @@ -605,44 +1002,513 @@ static void ivas_dirac_dec_decorrelate_slot( float onset_filter[BINAURAL_CHANNELS * CLDFB_NO_CHANNELS_MAX]; /* 2 ch, 60 bins */ float decorrelatedFrameInterleaved[2 * BINAURAL_CHANNELS * CLDFB_NO_CHANNELS_MAX]; /* 2 ch, real + imag, 60 bins */ - /* Decorrelation needs interleaved data. Copy left and right signals to proto_frame_f */ - for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - offset = hDirAC->num_freq_bands * BINAURAL_CHANNELS * ch; - for ( bin = 0; bin < hDirAC->num_freq_bands; bin++ ) + /* Decorrelation needs interleaved data. Copy left and right signals to proto_frame_f */ + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + offset = hDirAC->num_freq_bands * BINAURAL_CHANNELS * ch; + for ( bin = 0; bin < hDirAC->num_freq_bands; bin++ ) + { + hDirAC->proto_frame_f[( bin * BINAURAL_CHANNELS ) + offset] = inRe[ch][slot][bin]; + hDirAC->proto_frame_f[( bin * BINAURAL_CHANNELS ) + offset + 1] = inIm[ch][slot][bin]; + } + } + + /* Decorrelate proto signal to decorrelatedFrameInterleaved */ + ivas_dirac_dec_decorr_process( hDirAC->num_freq_bands, + hDirAC->num_outputs_diff, + hDirAC->num_protos_diff, + hDirAC->synthesisConf, + BINAURAL_CHANNELS, + hDirAC->proto_frame_f, + hDirAC->num_protos_diff, + hDirAC->proto_index_diff, + decorrelatedFrameInterleaved, + onset_filter, + hDirAC->h_freq_domain_decorr_ap_params, + hDirAC->h_freq_domain_decorr_ap_state ); + + /* De-interleave decorrelated signals*/ + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + offset = hDirAC->num_freq_bands * BINAURAL_CHANNELS * ch; + for ( bin = 0; bin < hDirAC->num_freq_bands; bin++ ) + { + decRe[ch][bin] = decorrelatedFrameInterleaved[( bin * BINAURAL_CHANNELS ) + offset]; + decIm[ch][bin] = decorrelatedFrameInterleaved[( bin * BINAURAL_CHANNELS ) + offset + 1]; + } + } + + return; +} + +#ifdef JBM_TSM_ON_TCS +static void ivas_dirac_dec_decorrelate_slot_sf( + DIRAC_DEC_HANDLE hDirAC, + const int8_t slot, + float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float decRe[][CLDFB_NO_CHANNELS_MAX], + float decIm[][CLDFB_NO_CHANNELS_MAX] ) +{ + int16_t offset, ch, bin; + float onset_filter[BINAURAL_CHANNELS * CLDFB_NO_CHANNELS_MAX]; /* 2 ch, 60 bins */ + float decorrelatedFrameInterleaved[2 * BINAURAL_CHANNELS * CLDFB_NO_CHANNELS_MAX]; /* 2 ch, real + imag, 60 bins */ + + /* Decorrelation needs interleaved data. Copy left and right signals to proto_frame_f */ + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + offset = hDirAC->num_freq_bands * BINAURAL_CHANNELS * ch; + for ( bin = 0; bin < hDirAC->num_freq_bands; bin++ ) + { + hDirAC->proto_frame_f[( bin * BINAURAL_CHANNELS ) + offset] = inRe[ch][slot][bin]; + hDirAC->proto_frame_f[( bin * BINAURAL_CHANNELS ) + offset + 1] = inIm[ch][slot][bin]; + } + } + + /* Decorrelate proto signal to decorrelatedFrameInterleaved */ + ivas_dirac_dec_decorr_process( hDirAC->num_freq_bands, + hDirAC->num_outputs_diff, + hDirAC->num_protos_diff, + hDirAC->synthesisConf, + BINAURAL_CHANNELS, + hDirAC->proto_frame_f, + hDirAC->num_protos_diff, + hDirAC->proto_index_diff, + decorrelatedFrameInterleaved, + onset_filter, + hDirAC->h_freq_domain_decorr_ap_params, + hDirAC->h_freq_domain_decorr_ap_state ); + + /* De-interleave decorrelated signals*/ + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + offset = hDirAC->num_freq_bands * BINAURAL_CHANNELS * ch; + for ( bin = 0; bin < hDirAC->num_freq_bands; bin++ ) + { + decRe[ch][bin] = decorrelatedFrameInterleaved[( bin * BINAURAL_CHANNELS ) + offset]; + decIm[ch][bin] = decorrelatedFrameInterleaved[( bin * BINAURAL_CHANNELS ) + offset + 1]; + } + } + + return; +} + + +static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices_sf( + Decoder_Struct *st_ivas, + float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + int16_t azimuth[][CLDFB_NO_CHANNELS_MAX], + int16_t elevation[][CLDFB_NO_CHANNELS_MAX], + float energy_ratio1[][CLDFB_NO_CHANNELS_MAX], + float spreadCoherence[][CLDFB_NO_CHANNELS_MAX], + float surroundingCoherence[][CLDFB_NO_CHANNELS_MAX], + float Rmat[3][3] ) +{ + uint8_t ch, bin; + uint8_t separateCenterChannelRendering; + int16_t nBins, idx; + float frameMeanDiffusenessEneWeight[CLDFB_NO_CHANNELS_MAX]; + DIRAC_DEC_HANDLE hDirAC; + DIRAC_DEC_BIN_HANDLE h; + float IIReneLimiterFactor; + float qualityBasedSmFactor; + float lowBitRateEQ[CLDFB_NO_CHANNELS_MAX]; + uint8_t applyLowBitRateEQ; + int16_t slot_idx_start, slot_idx, subframe_idx; + float subFrameTotalEne[CLDFB_NO_CHANNELS_MAX]; + int16_t md_idx; + float slot_ratio; + + hDirAC = st_ivas->hDirAC; + h = st_ivas->hDiracDecBin; + separateCenterChannelRendering = st_ivas->hOutSetup.separateChannelEnabled; + nBins = hDirAC->num_freq_bands; /* Actually bins */ + slot_idx_start = hDirAC->slots_rendered; + subframe_idx = hDirAC->subframes_rendered; + slot_ratio = 1.0f / (float) hDirAC->subframe_nbslots[subframe_idx]; + + set_zero( h->ChCrossRe, nBins ); + set_zero( h->ChCrossIm, nBins ); + set_zero( h->ChCrossReOut, nBins ); + set_zero( h->ChCrossImOut, nBins ); + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + set_zero( h->ChEne[ch], nBins ); + set_zero( h->ChEneOut[ch], nBins ); + } + set_zero( h->frameMeanDiffuseness, nBins ); + + set_zero( frameMeanDiffusenessEneWeight, CLDFB_NO_CHANNELS_MAX ); + + /* Determine EQ for low bit rates (13.2 and 16.4 kbps) */ + applyLowBitRateEQ = 0; + if ( ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == MC_FORMAT ) && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE ) + { + applyLowBitRateEQ = 1; + if ( st_ivas->hDecoderConfig->ivas_total_brate == IVAS_16k4 ) + { + for ( bin = 0; bin < LOW_BIT_RATE_BINAURAL_EQ_BINS; bin++ ) + { + lowBitRateEQ[bin + LOW_BIT_RATE_BINAURAL_EQ_OFFSET] = lowBitRateBinauralEQ[bin] * 0.5f + 0.5f; + } + } + else + { + for ( bin = 0; bin < LOW_BIT_RATE_BINAURAL_EQ_BINS; bin++ ) + { + lowBitRateEQ[bin + LOW_BIT_RATE_BINAURAL_EQ_OFFSET] = lowBitRateBinauralEQ[bin]; + } + } + } + + + set_zero( subFrameTotalEne, CLDFB_NO_CHANNELS_MAX ); + /* Formulate input and target covariance matrices combining all subframes */ + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) + { + + + /* Calculate input covariance matrix */ + + + for ( bin = 0; bin < nBins; bin++ ) + { + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + float instEne; + + instEne = ( inRe[ch][slot_idx][bin] * inRe[ch][slot_idx][bin] ); + instEne += ( inIm[ch][slot_idx][bin] * inIm[ch][slot_idx][bin] ); + h->ChEne[ch][bin] += instEne; + subFrameTotalEne[bin] += instEne; + } + h->ChCrossRe[bin] += inRe[0][slot_idx][bin] * inRe[1][slot_idx][bin]; + h->ChCrossRe[bin] += inIm[0][slot_idx][bin] * inIm[1][slot_idx][bin]; + h->ChCrossIm[bin] += inRe[0][slot_idx][bin] * inIm[1][slot_idx][bin]; + h->ChCrossIm[bin] -= inIm[0][slot_idx][bin] * inRe[1][slot_idx][bin]; + } + } + + /* Apply EQ at low bit rates */ + if ( applyLowBitRateEQ ) + { + int16_t lastEqBin = LOW_BIT_RATE_BINAURAL_EQ_OFFSET + LOW_BIT_RATE_BINAURAL_EQ_BINS - 1; + + for ( bin = LOW_BIT_RATE_BINAURAL_EQ_OFFSET; bin < lastEqBin; bin++ ) + { + subFrameTotalEne[bin] *= lowBitRateEQ[bin]; + } + for ( ; bin < nBins; bin++ ) + { + subFrameTotalEne[bin] *= lowBitRateEQ[lastEqBin]; + } + } + + if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->nchan_transport == 2 ) + { + float tempRe, tempIm; + + set_zero( subFrameTotalEne, CLDFB_NO_CHANNELS_MAX ); + + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) + { + + + for ( bin = 0; bin < nBins; bin++ ) + { + tempRe = inRe[0][slot_idx][bin] + inRe[1][slot_idx][bin]; + tempIm = inIm[0][slot_idx][bin] + inIm[1][slot_idx][bin]; + subFrameTotalEne[bin] += tempRe * tempRe + tempIm * tempIm; + } + } + } + + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) + { + md_idx = hDirAC->render_to_md_slot_map[slot_idx + slot_idx_start]; + /* Determine target covariance matrix containing target binaural properties */ + for ( bin = 0; bin < nBins; bin++ ) + { + float diffuseness = 1.0f; /* ratio1 and ratio2 are subtracted from diffuseness further below */ + float surCoh = 0.0f, spreadCoh = 0.0f; /* Default values if spreadSurroundCoherenceApplied == false */ + float diffEne, dirEne, meanEnePerCh; + uint16_t dirIndex; + + /* When BINAURAL_ROOM is not indicated, hBinaural->earlyPartEneCorrection[bin] values are all 1.0f. + * When BINAURAL_ROOM is indicated, the binaural audio output is based on combined use of the + * HRTF data set and a BRIR-based data set. The HRTF data set is spectrally corrected to match + * the early spectrum of the BRIR data, using the spectral correction data in + * hBinaural->earlyPartEneCorrection[bin], based on the BRIR set. */ + meanEnePerCh = h->earlyPartEneCorrection[bin] * subFrameTotalEne[bin] / 2.0f; + + /* Determine direct part target covariance matrix (for 1 or 2 directions) */ + for ( dirIndex = 0; dirIndex < hDirAC->numSimultaneousDirections; dirIndex++ ) + { + int16_t aziDeg, eleDeg; + float lRealp, lImagp, rRealp, rImagp; + float lRealpTmp, lImagpTmp, rRealpTmp, rImagpTmp; + float hrtfEne[BINAURAL_CHANNELS], hrtfCrossRe, hrtfCrossIm, ratio; + + if ( dirIndex == 0 ) /* For first of the two simultaneous directions */ + { + aziDeg = azimuth[slot_idx][bin]; + eleDeg = elevation[slot_idx][bin]; + ratio = energy_ratio1[slot_idx][bin]; + spreadCoh = spreadCoherence[slot_idx][bin]; + } + else /* For second of the two simultaneous directions */ + { + aziDeg = hDirAC->azimuth2[md_idx][bin]; + eleDeg = hDirAC->elevation2[md_idx][bin]; + ratio = hDirAC->energy_ratio2[md_idx][bin]; + spreadCoh = hDirAC->spreadCoherence2[md_idx][bin]; + } + diffuseness -= ratio; /* diffuseness = 1 - ratio1 - ratio2 */ + + if ( separateCenterChannelRendering ) + { + /* In masa + mono rendering mode, the center directions originate from phantom sources, so the + * spread coherence is increased */ + float aziRad, eleRad, doaVectorX, spatialAngleDeg, altSpreadCoh; + + aziRad = (float) aziDeg * PI_OVER_180; + eleRad = (float) eleDeg * PI_OVER_180; + doaVectorX = cosf( aziRad ) * cosf( eleRad ); + spatialAngleDeg = acosf( doaVectorX ) * _180_OVER_PI; + altSpreadCoh = 1.0f - ( spatialAngleDeg / 30.0f ); + spreadCoh = max( spreadCoh, altSpreadCoh ); + } + + getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, h->renderStereoOutputInsteadOfBinaural, Rmat ); + + if ( h->renderStereoOutputInsteadOfBinaural ) + { + /* Synthesizing spread coherence is not needed for stereo loudspeaker output, + * as directional sound is reproduced with two loudspeakers in any case */ + spreadCoh = 0.0f; + } + + if ( spreadCoh > 0.0f ) + { + float centerMul, sidesMul; + float hrtfEneCenter, hrtfEneSides, hrtfEneRealized, eneCorrectionFactor; + float w1, w2, w3, eq; + + hrtfEneCenter = ( lRealp * lRealp ) + ( lImagp * lImagp ) + ( rRealp * rRealp ) + ( rImagp * rImagp ); + + /* Spread coherence is synthesized as coherent sources at 30 degree horizontal spacing. + * The following formulas determine the gains for these sources. + * spreadCoh = 0: Only panning + * spreadCoh = 0.5: Three sources coherent panning (e.g. 30 0 -30 deg azi) + * spreadCoh = 1.0: Two sources coherent panning with gap (as above, but center is silent) */ + if ( spreadCoh < 0.5f ) + { + /* 0.0f < spreadCoh < 0.5f */ + sidesMul = 0.5774f * spreadCoh * 2.0f; /* sqrt(1/3) = 0.5774f */ + centerMul = 1.0f - ( spreadCoh * 2.0f ) + sidesMul; + } + else + { + /* 0.5f <= spreadCoh < 1.0f */ + centerMul = 2.0f - ( 2.0f * spreadCoh ); + sidesMul = inv_sqrt( centerMul + 2.0f ); + centerMul *= sidesMul; + } + + /* Apply the gain for the center source of the three coherent sources */ + lRealp *= centerMul; + lImagp *= centerMul; + rRealp *= centerMul; + rImagp *= centerMul; + + /* Apply the gain for the left source of the three coherent sources */ + getDirectPartGains( bin, aziDeg + 30, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat ); + + hrtfEneSides = ( lRealpTmp * lRealpTmp ) + ( lImagpTmp * lImagpTmp ) + ( rRealpTmp * rRealpTmp ) + ( rImagpTmp * rImagpTmp ); + lRealp += sidesMul * lRealpTmp; + lImagp += sidesMul * lImagpTmp; + rRealp += sidesMul * rRealpTmp; + rImagp += sidesMul * rImagpTmp; + + /* Apply the gain for the right source of the three coherent sources. + * -30 degrees to 330 wrapping due to internal functions. */ + getDirectPartGains( bin, aziDeg + 330, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat ); + + hrtfEneSides += ( lRealpTmp * lRealpTmp ) + ( lImagpTmp * lImagpTmp ) + ( rRealpTmp * rRealpTmp ) + ( rImagpTmp * rImagpTmp ); + lRealp += sidesMul * lRealpTmp; + lImagp += sidesMul * lImagpTmp; + rRealp += sidesMul * rRealpTmp; + rImagp += sidesMul * rImagpTmp; + + /* Formulate an eneCorrectionFactor that compensates for the coherent summation of the HRTFs */ + hrtfEneRealized = ( lRealp * lRealp ) + ( lImagp * lImagp ) + ( rRealp * rRealp ) + ( rImagp * rImagp ); + eneCorrectionFactor = ( ( hrtfEneSides * sidesMul * sidesMul ) + + ( hrtfEneCenter * centerMul * centerMul ) ) / + max( 1e-12f, hrtfEneRealized ); + + /* Weighting factors to determine appropriate target spectrum for spread coherent sound */ + if ( spreadCoh < 0.5 ) + { + w1 = 1.0f - 2.0f * spreadCoh; + w2 = 2.0f * spreadCoh; + w3 = 0.0f; + } + else + { + w1 = 0.0f; + w2 = 2.0f - 2.0f * spreadCoh; + w3 = 2.0f * spreadCoh - 1.0f; + } + + if ( ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) ) + { + idx = min( bin, MASA_NUM_DEFINED_SUR_SPR_COH_ENE_BINS - 1 ); + + /* Apply the target spectrum to the eneCorrectionFactor */ + if ( separateCenterChannelRendering ) /* spreadCoh mostly originates from phantom sources in separate channel rendering mode */ + { + eneCorrectionFactor *= w1 * 1.0f + ( w2 + w3 ) * spreadCohEne1[idx]; + } + else + { + eneCorrectionFactor *= w1 * 1.0f + w2 * spreadCohEne05[idx] + w3 * spreadCohEne1[idx]; + } + } + + /* Equalize the spread coherent combined HRTFs */ + eq = min( 4.0f, sqrtf( eneCorrectionFactor ) ); + lRealp *= eq; + lImagp *= eq; + rRealp *= eq; + rImagp *= eq; + } + + hrtfEne[0] = ( lRealp * lRealp ) + ( lImagp * lImagp ); + hrtfEne[1] = ( rRealp * rRealp ) + ( rImagp * rImagp ); + hrtfCrossRe = ( lRealp * rRealp ) + ( lImagp * rImagp ); + hrtfCrossIm = ( -lImagp * rRealp ) + ( lRealp * rImagp ); + + /* Add direct part (1 or 2) covariance matrix */ + dirEne = slot_ratio * ratio * meanEnePerCh; + h->ChEneOut[0][bin] += dirEne * hrtfEne[0]; /* Dir ene part*/ + h->ChEneOut[1][bin] += dirEne * hrtfEne[1]; + h->ChCrossReOut[bin] += dirEne * hrtfCrossRe; /* Dir cross re */ + h->ChCrossImOut[bin] += dirEne * hrtfCrossIm; /* Dir cross im */ + } + + /* Add diffuse / ambient part covariance matrix */ + diffuseness = max( 0.0f, diffuseness ); + diffEne = slot_ratio * diffuseness * meanEnePerCh; + surCoh = surroundingCoherence[slot_idx][bin]; + if ( ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) ) + { + if ( !h->renderStereoOutputInsteadOfBinaural ) + { + idx = min( bin, MASA_NUM_DEFINED_SUR_SPR_COH_ENE_BINS - 1 ); + /* Apply target spectrum that emphasizes low frequencies when the sound is surround coherent */ + diffEne *= ( 1.0f - surCoh ) + surCoh * surCohEne[idx]; + } + } + h->ChEneOut[0][bin] += diffEne; /* Diff ene part*/ + h->ChEneOut[1][bin] += diffEne; + + if ( h->renderStereoOutputInsteadOfBinaural ) + { + /* When rendering stereo, ambience (except for surround coherent sound) has zero ICC. */ + h->ChCrossReOut[bin] += surCoh * diffEne; + } + else /* When rendering binaural, ambience has frequency dependent ICC. */ + { + if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && bin < BINAURAL_COHERENCE_DIFFERENCE_BINS ) + { + float diffuseFieldCoherence; + diffuseFieldCoherence = hDirAC->hDiffuseDist->diffuseRatioX[0][bin] * h->diffuseFieldCoherenceX[bin] + hDirAC->hDiffuseDist->diffuseRatioY[0][bin] * h->diffuseFieldCoherenceY[bin] + hDirAC->hDiffuseDist->diffuseRatioZ[0][bin] * h->diffuseFieldCoherenceZ[bin]; + h->ChCrossReOut[bin] += ( ( 1.0f - surCoh ) * diffuseFieldCoherence + surCoh ) * diffEne; + } + else + { + h->ChCrossReOut[bin] += ( ( 1.0f - surCoh ) * h->diffuseFieldCoherence[bin] + surCoh ) * diffEne; + } + } + + /* Store parameters for formulating average diffuseness over frame */ + h->frameMeanDiffuseness[bin] += diffEne; + frameMeanDiffusenessEneWeight[bin] += slot_ratio * meanEnePerCh; + } + } + + /* Formulate average diffuseness over frame */ + for ( bin = 0; bin < nBins; bin++ ) + { + h->frameMeanDiffuseness[bin] /= fmaxf( 1e-12f, frameMeanDiffusenessEneWeight[bin] ); + } + + /* Determine encoding quality based additional smoothing factor */ + qualityBasedSmFactor = 1.0f; + if ( st_ivas->hMasa != NULL ) + { + qualityBasedSmFactor = st_ivas->hMasa->data.dir_decode_quality; + qualityBasedSmFactor *= qualityBasedSmFactor; + } + + /* Temporal IIR-type smoothing of covariance matrices */ + if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE ) + { + IIReneLimiterFactor = 16.0f + ( 1.0f - qualityBasedSmFactor ); + } + else + { + IIReneLimiterFactor = 8.0f + ( 1.0f - qualityBasedSmFactor ); + } + for ( bin = 0; bin < nBins; bin++ ) + { + float eneRatio, IIReneLimiter; + + /* Temporally smooth cov mtx estimates for resulting mixing matrix stability. The design principle is that + * the energy history (IIR) must not be more than double of the current frame energy. This provides more + * robust performance at energy offsets when compared to typical IIR averaging. */ + eneRatio = ( h->ChEne[0][bin] + h->ChEne[1][bin] ) / fmaxf( 1e-12f, ( h->ChEnePrev[0][bin] + h->ChEnePrev[1][bin] ) ); + IIReneLimiter = fminf( 1.0f, eneRatio * IIReneLimiterFactor ); + + h->ChCrossRe[bin] *= qualityBasedSmFactor; + h->ChCrossIm[bin] *= qualityBasedSmFactor; + h->ChCrossReOut[bin] *= qualityBasedSmFactor; + h->ChCrossImOut[bin] *= qualityBasedSmFactor; + + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { - hDirAC->proto_frame_f[( bin * BINAURAL_CHANNELS ) + offset] = inRe[ch][slot][bin]; - hDirAC->proto_frame_f[( bin * BINAURAL_CHANNELS ) + offset + 1] = inIm[ch][slot][bin]; + h->ChEne[ch][bin] *= qualityBasedSmFactor; + h->ChEneOut[ch][bin] *= qualityBasedSmFactor; } - } - /* Decorrelate proto signal to decorrelatedFrameInterleaved */ - ivas_dirac_dec_decorr_process( hDirAC->num_freq_bands, - hDirAC->num_outputs_diff, - hDirAC->num_protos_diff, - hDirAC->synthesisConf, - BINAURAL_CHANNELS, - hDirAC->proto_frame_f, - hDirAC->num_protos_diff, - hDirAC->proto_index_diff, - decorrelatedFrameInterleaved, - onset_filter, - hDirAC->h_freq_domain_decorr_ap_params, - hDirAC->h_freq_domain_decorr_ap_state ); + h->ChCrossRe[bin] += IIReneLimiter * h->ChCrossRePrev[bin]; + h->ChCrossIm[bin] += IIReneLimiter * h->ChCrossImPrev[bin]; + h->ChCrossReOut[bin] += IIReneLimiter * h->ChCrossReOutPrev[bin]; + h->ChCrossImOut[bin] += IIReneLimiter * h->ChCrossImOutPrev[bin]; - /* De-interleave decorrelated signals*/ - for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - offset = hDirAC->num_freq_bands * BINAURAL_CHANNELS * ch; - for ( bin = 0; bin < hDirAC->num_freq_bands; bin++ ) + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { - decRe[ch][bin] = decorrelatedFrameInterleaved[( bin * BINAURAL_CHANNELS ) + offset]; - decIm[ch][bin] = decorrelatedFrameInterleaved[( bin * BINAURAL_CHANNELS ) + offset + 1]; + h->ChEne[ch][bin] += IIReneLimiter * h->ChEnePrev[ch][bin]; + h->ChEneOut[ch][bin] += IIReneLimiter * h->ChEneOutPrev[ch][bin]; + } + + /* Store energy values and coefficients for next round */ + h->ChCrossRePrev[bin] = h->ChCrossRe[bin]; + h->ChCrossImPrev[bin] = h->ChCrossIm[bin]; + h->ChCrossReOutPrev[bin] = h->ChCrossReOut[bin]; + h->ChCrossImOutPrev[bin] = h->ChCrossImOut[bin]; + + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + h->ChEnePrev[ch][bin] = h->ChEne[ch][bin]; + h->ChEneOutPrev[ch][bin] = h->ChEneOut[ch][bin]; } } return; } +#endif static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( @@ -664,6 +1530,9 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric float lowBitRateEQ[CLDFB_NO_CHANNELS_MAX]; uint8_t applyLowBitRateEQ; int16_t dirac_read_idx; +#ifdef JBM_TSM_ON_TCS + int16_t slot_idx_start; +#endif hDirAC = st_ivas->hDirAC; h = st_ivas->hDiracDecBin; @@ -704,18 +1573,32 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric } } +#ifdef JBM_TSM_ON_TCS + slot_idx_start = hDirAC->slots_rendered; +#endif + /* Formulate input and target covariance matrices combining all subframes */ for ( subframe = firstSubframe; subframe < ( firstSubframe + nSubframes ); subframe++ ) { float subFrameTotalEne[CLDFB_NO_CHANNELS_MAX]; set_zero( subFrameTotalEne, CLDFB_NO_CHANNELS_MAX ); + dirac_read_idx = hDirAC->dirac_read_idx; /* Calculate input covariance matrix */ +#ifdef JBM_TSM_ON_TCS + for ( slot = 0; slot < (uint8_t) hDirAC->subframe_nbslots[subframe]; slot++ ) +#else for ( slot = 0; slot < (uint8_t) hDirAC->subframe_nbslots; slot++ ) +#endif { +#ifdef JBM_TSM_ON_TCS + /* TODO: JBM this needs to be adapted to the variable size subframes */ + int16_t slotThis = slot + slot_idx_start; +#else int16_t slotThis = slot + ( hDirAC->subframe_nbslots * subframe ); +#endif for ( bin = 0; bin < nBins; bin++ ) { @@ -756,9 +1639,17 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric set_zero( subFrameTotalEne, CLDFB_NO_CHANNELS_MAX ); +#ifdef JBM_TSM_ON_TCS + for ( slot = 0; slot < (uint8_t) hDirAC->subframe_nbslots[subframe]; slot++ ) +#else for ( slot = 0; slot < (uint8_t) hDirAC->subframe_nbslots; slot++ ) +#endif { +#ifdef JBM_TSM_ON_TCS + int16_t slotThis = slot + slot_idx_start; +#else int16_t slotThis = slot + ( hDirAC->subframe_nbslots * subframe ); +#endif for ( bin = 0; bin < nBins; bin++ ) { @@ -978,8 +1869,10 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric h->frameMeanDiffuseness[bin] += diffEne; frameMeanDiffusenessEneWeight[bin] += meanEnePerCh; } - hDirAC->dirac_read_idx = ( hDirAC->dirac_read_idx + 1 ) % hDirAC->dirac_md_buffer_length; +#ifdef JBM_TSM_ON_TCS + slot_idx_start += hDirAC->subframe_nbslots[subframe]; +#endif } /* Formulate average diffuseness over frame */ @@ -1221,6 +2114,117 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices( return; } +#ifdef JBM_TSM_ON_TCS +static void ivas_dirac_dec_binaural_process_output_sf( + Decoder_Struct *st_ivas, + float *output_f[], + float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + const int16_t max_band_decorr, + const uint8_t numInChannels ) +{ + uint8_t slot, bin, chA, chB; + int16_t nBins; + float outSlotRe[CLDFB_NO_CHANNELS_MAX], outSlotIm[CLDFB_NO_CHANNELS_MAX]; + float decSlotRe[BINAURAL_CHANNELS][CLDFB_NO_CHANNELS_MAX], decSlotIm[BINAURAL_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + float reverbRe[BINAURAL_CHANNELS][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float reverbIm[BINAURAL_CHANNELS][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + uint16_t numSlots; + DIRAC_DEC_BIN_HANDLE h; + float interpVal; + float *decSlotRePointer; + float *decSlotImPointer; + + numSlots = st_ivas->hDirAC->subframe_nbslots[st_ivas->hDirAC->subframes_rendered]; + h = st_ivas->hDiracDecBin; + nBins = st_ivas->hDirAC->num_freq_bands; + + + interpVal = 0.0f; + for ( slot = 0; slot < numSlots; slot++ ) + { + interpVal += 1.0f / (float) numSlots; + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) + { + /* Process second / room effect part of binaural output when needed */ + ivas_binaural_reverb_processSlot( st_ivas->hDiracDecBin->hReverb, numInChannels, inRe, inIm, reverbRe, reverbIm, slot ); + } + if ( !st_ivas->hDiracDecBin->useTdDecorr && max_band_decorr > 0 ) + { + ivas_dirac_dec_decorrelate_slot_sf( st_ivas->hDirAC, slot, inRe, inIm, decSlotRe, decSlotIm ); + } + + for ( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) + { + float *outSlotRePr, *outSlotImPr; /* Pointers needed for function call compatibility */ + + set_zero( outSlotRe, CLDFB_NO_CHANNELS_MAX ); + set_zero( outSlotIm, CLDFB_NO_CHANNELS_MAX ); + + /* Processing of the first / HRTF part of the binaural output. */ + for ( chB = 0; chB < numInChannels; chB++ ) + { + if ( st_ivas->hDiracDecBin->useTdDecorr ) + { + decSlotRePointer = inRe[chB + 2][slot]; + decSlotImPointer = inIm[chB + 2][slot]; + } + else + { + decSlotRePointer = decSlotRe[chB]; + decSlotImPointer = decSlotIm[chB]; + } + + for ( bin = 0; bin < nBins; bin++ ) + { + float gain; + + /* Mixing using the formulated processing matrix M */ + gain = ( 1.0f - interpVal ) * h->processMtxRePrev[chA][chB][bin] + + interpVal * h->processMtxRe[chA][chB][bin]; + outSlotRe[bin] += gain * inRe[chB][slot][bin]; + outSlotIm[bin] += gain * inIm[chB][slot][bin]; + + gain = ( 1.0f - interpVal ) * h->processMtxImPrev[chA][chB][bin] + + interpVal * h->processMtxIm[chA][chB][bin]; + outSlotRe[bin] -= gain * inIm[chB][slot][bin]; + outSlotIm[bin] += gain * inRe[chB][slot][bin]; + + /* Mixing decorrelated signals using the formulated residual processing matrix Mdec */ + if ( bin < max_band_decorr && chB < 2 ) + { + gain = ( 1.0f - interpVal ) * h->processMtxDecRePrev[chA][chB][bin] + + interpVal * h->processMtxDecRe[chA][chB][bin]; + outSlotRe[bin] += gain * decSlotRePointer[bin]; + outSlotIm[bin] += gain * decSlotImPointer[bin]; + + gain = ( 1.0f - interpVal ) * h->processMtxDecImPrev[chA][chB][bin] + + interpVal * h->processMtxDecIm[chA][chB][bin]; + outSlotRe[bin] -= gain * decSlotImPointer[bin]; + outSlotIm[bin] += gain * decSlotRePointer[bin]; + } + } + } + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) + { + /* Combine second (reverb) part with the first (HRTF) part to obtain binaural output signal with room effect */ + v_add( outSlotRe, reverbRe[chA][slot], outSlotRe, CLDFB_NO_CHANNELS_MAX ); + v_add( outSlotIm, reverbIm[chA][slot], outSlotIm, CLDFB_NO_CHANNELS_MAX ); + } + + outSlotRePr = &( outSlotRe[0] ); + outSlotImPr = &( outSlotIm[0] ); + + /* Inverse filter bank */ + cldfbSynthesis( &outSlotRePr, &outSlotImPr, &( output_f[chA][nBins * slot] ), nBins, st_ivas->cldfbSynDec[chA] ); + } + } + + return; +} +#endif static void ivas_dirac_dec_binaural_process_output( Decoder_Struct *st_ivas, @@ -1333,7 +2337,109 @@ static void ivas_dirac_dec_binaural_process_output( return; } +#ifdef JBM_TSM_ON_TCS +static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked_sf( + HEAD_TRACK_DATA_HANDLE hHeadTrackData, + float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + const uint8_t slotEnd, + const uint8_t nBins, + float Rmat[3][3] ) +{ + uint8_t slot, bin, ch; + float tmpVal; + + /* When not currently in prototype signal left-right switching procedure, check if such switching is needed */ + if ( hHeadTrackData->lrSwitchedNext == hHeadTrackData->lrSwitchedCurrent ) + { + float thresholdDotProduct = 0.17f; /* Corresponds to 10-degree switching threshold */ + if ( ( hHeadTrackData->lrSwitchedCurrent == 0 ) && ( Rmat[1][1] < -thresholdDotProduct ) ) + { + hHeadTrackData->lrSwitchedNext = 1; + } + if ( ( hHeadTrackData->lrSwitchedCurrent == 1 ) && ( Rmat[1][1] > thresholdDotProduct ) ) + { + hHeadTrackData->lrSwitchedNext = 0; + } + } + + /* When currently in interpolation */ + if ( hHeadTrackData->lrSwitchedNext != hHeadTrackData->lrSwitchedCurrent ) + { + for ( slot = 0; slot < slotEnd; slot++ ) + { + float switchOrderFactor, origOrderFactor; + + hHeadTrackData->lrSwitchInterpVal += 0.0025f; /* Corresponds to 0.5 seconds interpolation time */ + + if ( hHeadTrackData->lrSwitchInterpVal > 0.999f ) + { + /* Stop interpolation, reset values */ + hHeadTrackData->lrSwitchInterpVal = 0.0f; + hHeadTrackData->lrSwitchedCurrent = hHeadTrackData->lrSwitchedNext; + } + + /* Gains for determining portion of switched channel order and original channel order */ + tmpVal = (float) hHeadTrackData->lrSwitchedNext * hHeadTrackData->lrSwitchInterpVal; + tmpVal += (float) hHeadTrackData->lrSwitchedCurrent * ( 1.0f - hHeadTrackData->lrSwitchInterpVal ); + switchOrderFactor = sqrtf( tmpVal ); + origOrderFactor = sqrtf( 1.0f - tmpVal ); + + for ( bin = 0; bin < nBins; bin++ ) + { + /* determine original order (1) signals and switched order (2) signals */ + float re1[BINAURAL_CHANNELS], re2[BINAURAL_CHANNELS], im1[BINAURAL_CHANNELS], im2[BINAURAL_CHANNELS]; + + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + re1[ch] = inRe[ch][slot][bin] * origOrderFactor; + re2[ch] = inRe[1 - ch][slot][bin] * switchOrderFactor; + im1[ch] = inIm[ch][slot][bin] * origOrderFactor; + im2[ch] = inIm[1 - ch][slot][bin] * switchOrderFactor; + } + + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + float eneRef, ene, eq; + + /* Interpolate / mix original and switched order signals */ + inRe[ch][slot][bin] = re1[ch] + re2[ch]; + inIm[ch][slot][bin] = im1[ch] + im2[ch]; + + /* Equalize interpolated signals to preserve energy per bin */ + eneRef = ( re1[ch] * re1[ch] ) + ( re2[ch] * re2[ch] ) + ( im1[ch] * im1[ch] ) + ( im2[ch] * im2[ch] ); + ene = ( inRe[ch][slot][bin] * inRe[ch][slot][bin] ) + ( inIm[ch][slot][bin] * inIm[ch][slot][bin] ); + eq = sqrtf( eneRef / fmaxf( 1e-12f, ene ) ); + eq = fminf( 4.0f, eq ); + inRe[ch][slot][bin] *= eq; + inIm[ch][slot][bin] *= eq; + } + } + } + } + else + { + /* If not in interpolation, but in switched prototype situation, then switch left and right channels */ + if ( hHeadTrackData->lrSwitchedCurrent == 1 ) + { + for ( slot = 0; slot < slotEnd; slot++ ) + { + for ( bin = 0; bin < nBins; bin++ ) + { + tmpVal = inRe[0][slot][bin]; + inRe[0][slot][bin] = inRe[1][slot][bin]; + inRe[1][slot][bin] = tmpVal; + tmpVal = inIm[0][slot][bin]; + inIm[0][slot][bin] = inIm[1][slot][bin]; + inIm[1][slot][bin] = tmpVal; + } + } + } + } + return; +} +#endif static void adaptTransportSignalsHeadtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], diff --git a/lib_rend/ivas_limiter.c b/lib_rend/ivas_limiter.c index 28c272bc0c..17c5a94ff8 100644 --- a/lib_rend/ivas_limiter.c +++ b/lib_rend/ivas_limiter.c @@ -172,7 +172,11 @@ void ivas_limiter_close( void ivas_limiter_dec( IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ +#ifdef JBM_TSM_ON_TCS + float *output[MAX_OUTPUT_CHANNELS], /* i/o: input/output buffer */ +#else float output[MAX_OUTPUT_CHANNELS][L_FRAME48k], /* i/o: input/output buffer */ +#endif const int16_t num_channels, /* i : number of channels to be processed */ const int16_t output_frame, /* i : number of samples per channel in the buffer */ const int16_t BER_detect /* i : BER detect flag */ diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 0618534448..bf167259f3 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -47,6 +47,7 @@ * Local function prototypes *---------------------------------------------------------------------*/ + static void TDREND_Clear_Update_flags( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd ); static void angles_to_vec( const float radius, const float azimuth, const float elevation, float *vec ); @@ -259,14 +260,27 @@ ivas_error ivas_td_binaural_renderer_unwrap( const int16_t Opt_Headrotation, /* i : Head rotation flag */ const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ - float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ - const int16_t output_frame /* i : output frame length */ +#ifdef JBM_TSM_ON_TCS + float *output[], /* i/o: SCE channels / Binaural synthesis */ +#else + float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ +#endif + const int16_t output_frame /* i : output frame length */ ) { int16_t subframe_length; int16_t subframe_idx; float reverb_signal[BINAURAL_CHANNELS][L_FRAME48k]; ivas_error error; +#ifdef JBM_TSM_ON_TCS + float *p_reverb_signal[BINAURAL_CHANNELS]; + int16_t ch; + + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + p_reverb_signal[ch] = reverb_signal[ch]; + } +#endif subframe_length = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES; @@ -280,7 +294,11 @@ ivas_error ivas_td_binaural_renderer_unwrap( if ( hReverb != NULL && hReverb->pConfig.roomAcoustics.late_reverb_on ) { +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_reverb_process( hReverb, transport_config, 0, output, p_reverb_signal, subframe_idx ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_reverb_process( hReverb, transport_config, 0, output, reverb_signal, subframe_idx ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -313,9 +331,13 @@ ivas_error ivas_td_binaural_renderer_unwrap( ivas_error TDREND_GetMix( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ - float output[][L_FRAME48k], /* i/o: ISM object synth / rendered output in 0,1 */ - const int16_t subframe_length, /* i/o: subframe length */ - const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ +#ifdef JBM_TSM_ON_TCS + float *output[], /* i/o: ISM object synth / rendered output in 0,1 */ +#else + float output[][L_FRAME48k], /* i/o: ISM object synth / rendered output in 0,1 */ +#endif + const int16_t subframe_length, /* i/o: subframe length */ + const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ ) { int16_t i; @@ -406,7 +428,11 @@ void TDREND_Update_object_positions( const int16_t lfe_idx, /* i : Input LFE index */ const IVAS_FORMAT in_format, /* i : Format of input sources */ const ISM_METADATA_HANDLE *hIsmMetaData, /* i : Input metadata for ISM objects */ - float output[][L_FRAME48k] /* i/o: SCE/MC channels */ +#ifdef JBM_TSM_ON_TCS + float *output[] +#else + float output[][L_FRAME48k] /* i/o: SCE/MC channels */ +#endif ) { TDREND_DirAtten_t *DirAtten_p; @@ -583,6 +609,15 @@ ivas_error ivas_td_binaural_renderer_ext( IVAS_REND_AudioConfigType inConfigType; AUDIO_CONFIG transport_config; ivas_error error; +#ifdef JBM_TSM_ON_TCS + float *p_output[MAX_OUTPUT_CHANNELS]; + int16_t ch; + + for ( ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++ ) + { + p_output[ch] = output[ch]; + } +#endif push_wmops( "ivas_td_binaural_renderer_ext" ); @@ -620,9 +655,16 @@ ivas_error ivas_td_binaural_renderer_ext( hIsmMetaData[0]->radius = currentPos->radius; } +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, + ( headRotData != NULL ) ? headRotData->headPositions : NULL, + ( headRotData != NULL ) ? headRotData->Pos : NULL, p_output, output_frame ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, ( headRotData != NULL ) ? headRotData->headPositions : NULL, ( headRotData != NULL ) ? headRotData->Pos : NULL, output, output_frame ) ) != IVAS_ERR_OK ) + +#endif { return error; } diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index b810ed09d8..21a31f529a 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -92,7 +92,11 @@ void ivas_limiter_close( void ivas_limiter_dec ( IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ +#ifdef JBM_TSM_ON_TCS + float *output[MAX_OUTPUT_CHANNELS], /* i/o: input/output buffer */ +#else float output[MAX_OUTPUT_CHANNELS][L_FRAME48k], /* i/o: input/output buffer */ +#endif const int16_t num_channels, /* i : number of channels to be processed */ const int16_t output_frame, /* i : number of samples per channel in the buffer */ const int16_t BER_detect /* i : BER detect flag */ @@ -156,6 +160,17 @@ void ivas_dirac_dec_binaural( const int16_t nchan_transport /* i : number of transport channels */ ); +#ifdef JBM_TSM_ON_TCS +void ivas_dirac_dec_binaural_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + const int16_t nchan_transport, + float *output_f[] /* o : rendered time signal */ +); +#endif + ivas_error ivas_dirac_dec_init_binaural_data( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ HRTFS_PARAMBIN_HANDLE hHrtfParambin /* i : HRTF structure for rendering */ @@ -222,7 +237,11 @@ ivas_error ivas_td_binaural_renderer_unwrap( const int16_t Opt_Headrotation, /* i : Head rotation flag */ const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ - float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ +#ifdef JBM_TSM_ON_TCS + float *output[], /* i/o: SCE channels / Binaural synthesis */ +#else + float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ +#endif const int16_t output_frame /* i : output frame length */ ); @@ -264,7 +283,11 @@ void ivas_td_binaural_close( ivas_error TDREND_GetMix( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ +#ifdef JBM_TSM_ON_TCS + float *output[], /* i/o: ISM object synth / rendered output in 0,1 */ +#else float output[][L_FRAME48k], /* i/o: ISM object synth / rendered output in 0,1 */ +#endif const int16_t subframe_length, /* i/o: subframe length */ const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ ); @@ -282,7 +305,11 @@ void TDREND_Update_object_positions( const int16_t lfe_idx, /* i : Input LFE index */ const IVAS_FORMAT in_format, /* i : Format of input sources */ const ISM_METADATA_HANDLE *hIsmMetaData, /* i : Input metadata for ISM objects */ +#ifdef JBM_TSM_ON_TCS + float *output[] /* i/o: SCE/MC channels */ +#else float output[][L_FRAME48k] /* i/o: SCE/MC channels */ +#endif ); void BSplineModelEvalDealloc( @@ -493,11 +520,29 @@ ivas_error ivas_rend_crendProcess( HEAD_TRACK_DATA_HANDLE hHeadTrackData, IVAS_OUTPUT_SETUP_HANDLE hIntSetup, EFAP_HANDLE hEFAPdata, +#ifdef JBM_TSM_ON_TCS + float *output[], /* i/o: input/output audio channels */ +#else float output[][L_FRAME48k], /* i/o: input/output audio channels */ +#endif const int32_t output_Fs ); - +#ifdef JBM_TSM_ON_TCS +ivas_error ivas_rend_crendProcessSubframe( + const CREND_WRAPPER *pCrend, + const AUDIO_CONFIG inConfig, + const AUDIO_CONFIG outConfig, + DECODER_CONFIG_HANDLE hDecoderConfig, + HEAD_TRACK_DATA_HANDLE hHeadTrackData, + IVAS_OUTPUT_SETUP_HANDLE hIntSetup, + EFAP_HANDLE hEFAPdata, + DECODER_TC_BUFFER_HANDLE hTcBuffer, + float *input_f[], + float *output[], /* i/o: input/output audio channels */ + const int16_t n_samples_to_render, + const int32_t output_Fs ); +#endif ivas_error ivas_crend_init_from_rom( @@ -547,6 +592,18 @@ void ivas_binaural_reverb_processFrame( const uint8_t offsetSamplesIO /* i : number of offset samples */ ); +#ifdef JBM_TSM_ON_TCS +void ivas_binaural_reverb_processSlot( + REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */ + const int16_t numInChannels, /* i : num inputs to be processed */ + float inReal[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data real, Comment: This change swaps two first dimensions as first dimension is not constant. */ + float inImag[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data imag */ + float outReal[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data real */ + float outImag[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data imag */ + const uint8_t offsetSamplesIO /* i : number of offset samples */ +); +#endif + ivas_error ivas_reverb_open( REVERB_HANDLE *hReverb, /* i/o: Reverberator handle */ const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */ @@ -563,8 +620,13 @@ ivas_error ivas_reverb_process( const REVERB_HANDLE hReverb, /* i : Reverberator handle */ const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */ const int16_t mix_signals, /* i : add reverb to output signal */ +#ifdef JBM_TSM_ON_TCS + float *pcm_in[], /* i : the PCM audio to apply reverb on */ + float *pcm_out[], /* o : the PCM audio with reverb applied */ +#else float pcm_in[][L_FRAME48k], /* i : the PCM audio to apply reverb on */ float pcm_out[][L_FRAME48k], /* o : the PCM audio with reverb applied */ +#endif const int16_t i_ts /* i : subframe index */ ); @@ -787,7 +849,11 @@ void SHrotmatgen( void rotateFrame_shd( HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ - float output[][L_FRAME48k], /* i/o: unrotated HOA3 signal buffer in TD */ +#ifdef JBM_TSM_ON_TCS + float *output[], /* i/o: unrotated HOA3 signal buffer in TD */ +#else + float output[][L_FRAME48k], /* i/o: unrotated HOA3 signal buffer in TD */ +#endif const int16_t subframe_len, /* i : subframe length per channel */ const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ const int16_t subframe_idx /* i : subframe index */ @@ -795,7 +861,11 @@ void rotateFrame_shd( void rotateFrame_sd( HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ - float output[][L_FRAME48k], /* i/o: unrotated SD signal buffer in TD */ +#ifdef JBM_TSM_ON_TCS + float *output[], /* i/o: unrotated SD signal buffer in TD */ +#else + float output[][L_FRAME48k], /* i/o: unrotated SD signal buffer in TD */ +#endif const int16_t subframe_len, /* i : subframe length per channel */ const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ @@ -807,6 +877,9 @@ void rotateFrame_shd_cldfb( float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain imag part */ float Rmat[3][3], /* i : real-space rotation matrix */ const int16_t nInChannels, /* i : number of channels */ +#ifdef JBM_TSM_ON_TCS + const int16_t numTimeSlots, /* i : number of time slots to process */ +#endif const int16_t shd_rot_max_order /* i : split-order rotation method */ ); @@ -816,6 +889,9 @@ void rotateFrame_sd_cldfb( float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain imag part */ const IVAS_OUTPUT_SETUP_HANDLE hOutputSetup, /* i : output format setup number of channels */ const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ +#ifdef JBM_TSM_ON_TCS + const int16_t numTimeSlots, /* i : number of time slots to process */ +#endif const int16_t nb_band /* i : number of CLDFB bands to process */ ); diff --git a/lib_rend/ivas_reverb.c b/lib_rend/ivas_reverb.c index 65a7c60ed9..7239f4825b 100644 --- a/lib_rend/ivas_reverb.c +++ b/lib_rend/ivas_reverb.c @@ -1437,7 +1437,11 @@ static void reverb_block( static ivas_error downmix_input_block( const REVERB_HANDLE hReverb, +#ifdef JBM_TSM_ON_TCS + float *pcm_in[], +#else float pcm_in[][L_FRAME48k], +#endif const AUDIO_CONFIG input_audio_config, float *pPcm_out, const int16_t input_offset ) @@ -1579,8 +1583,13 @@ ivas_error ivas_reverb_process( const REVERB_HANDLE hReverb, /* i : Reverberator handle */ const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */ const int16_t mix_signals, /* i : add reverb to output signal */ +#ifdef JBM_TSM_ON_TCS + float *pcm_in[], /* i : the PCM audio to apply reverb on */ + float *pcm_out[], /* o : the PCM audio with reverb applied */ +#else float pcm_in[][L_FRAME48k], /* i : the PCM audio to apply reverb on */ float pcm_out[][L_FRAME48k], /* o : the PCM audio with reverb applied */ +#endif const int16_t i_ts /* i : subframe index */ ) { @@ -1771,6 +1780,172 @@ void ivas_binaural_reverb_processFrame( return; } +#ifdef JBM_TSM_ON_TCS +/*------------------------------------------------------------------------- + * ivas_binaural_reverb_processSlot() + * + * Compute the reverberation - room effect + *------------------------------------------------------------------------*/ + +void ivas_binaural_reverb_processSlot( + REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */ + const int16_t numInChannels, /* i : num inputs to be processed */ + float inReal[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data real, Comment: This change swaps two first dimensions as first dimension is not constant. */ + float inImag[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data imag */ + float outReal[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data real */ + float outImag[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data imag */ + const uint8_t offsetSamplesIO /* i : number of offset samples */ +) +{ + /* Declare the required variables */ + int16_t idx, bin, ch, sample, invertSampleIndex, tapIdx, *phaseShiftTypePr; + float **tapRealPr, **tapImagPr; + +#ifdef DEBUGGING + assert( hReverb->blockSize == 1 ); +#endif + + /* 1) Rotate the data in the loop buffer of the reverberator. + * Notice that the audio at the loop buffers is at time-inverted order + * for convolution purposes later on. */ + for ( bin = 0; bin < hReverb->numBins; bin++ ) + { + /* Move the data forwards by blockSize (i.e. by the frame size of 16 CLDFB slots) */ + mvr2r( hReverb->loopBufReal[bin], hReverb->loopBufReal[bin] + hReverb->blockSize, hReverb->loopBufLength[bin] ); + mvr2r( hReverb->loopBufImag[bin], hReverb->loopBufImag[bin] + hReverb->blockSize, hReverb->loopBufLength[bin] ); + + /* Add the data from the end of the loop to the beginning, with an attenuation factor + * according to RT60. This procedure generates an IIR decaying response. The response + * is decorrelated later on. */ + v_multc( hReverb->loopBufReal[bin] + hReverb->loopBufLength[bin], hReverb->loopAttenuationFactor[bin], hReverb->loopBufReal[bin], hReverb->blockSize ); + v_multc( hReverb->loopBufImag[bin] + hReverb->loopBufLength[bin], hReverb->loopAttenuationFactor[bin], hReverb->loopBufImag[bin], hReverb->blockSize ); + } + + /* 2) Apply the determined pre-delay to the input audio, and add the delayed audio to the loop. */ + idx = hReverb->preDelayBufferIndex; + for ( sample = 0; sample < hReverb->blockSize; sample++ ) + { + uint16_t sampleWithOffset; + sampleWithOffset = sample + offsetSamplesIO; + invertSampleIndex = hReverb->blockSize - sample - 1; + for ( bin = 0; bin < hReverb->numBins; bin++ ) + { + /* Add from pre-delay buffer a sample to the loop buffer, in a time-inverted order. + * Also apply the spectral gains determined for the reverberation */ + hReverb->loopBufReal[bin][invertSampleIndex] += hReverb->preDelayBufferReal[idx][bin] * hReverb->reverbEqGains[bin]; + hReverb->loopBufImag[bin][invertSampleIndex] += hReverb->preDelayBufferImag[idx][bin] * hReverb->reverbEqGains[bin]; + hReverb->preDelayBufferReal[idx][bin] = 0.0f; + hReverb->preDelayBufferImag[idx][bin] = 0.0f; + } + + /* Add every second input channel as is to the pre-delay buffer, and every second input channel with + * 90 degrees phase shift to reduce energy imbalances between coherent and incoherent sounds */ + for ( ch = 0; ch < numInChannels; ch++ ) + { + if ( ch % 2 ) + { + v_add( hReverb->preDelayBufferReal[idx], inReal[ch][sampleWithOffset], hReverb->preDelayBufferReal[idx], hReverb->numBins ); + v_add( hReverb->preDelayBufferImag[idx], inImag[ch][sampleWithOffset], hReverb->preDelayBufferImag[idx], hReverb->numBins ); + } + else + { + v_sub( hReverb->preDelayBufferReal[idx], inImag[ch][sampleWithOffset], hReverb->preDelayBufferReal[idx], hReverb->numBins ); + v_add( hReverb->preDelayBufferImag[idx], inReal[ch][sampleWithOffset], hReverb->preDelayBufferImag[idx], hReverb->numBins ); + } + } + idx = ( idx + 1 ) % hReverb->preDelayBufferLength; + } + hReverb->preDelayBufferIndex = idx; + + /* 3) Perform the filtering/decorrelating, using complex and sparse FIR filtering */ + for ( bin = 0; bin < hReverb->numBins; bin++ ) + { + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + /* These tap pointers have been determined to point to the loop buffer at sparse locations */ + tapRealPr = hReverb->tapPointersReal[bin][ch]; + tapImagPr = hReverb->tapPointersImag[bin][ch]; + phaseShiftTypePr = hReverb->tapPhaseShiftType[bin][ch]; + + /* Flush output */ + set_f( hReverb->outputBufferReal[bin][ch], 0.0f, hReverb->blockSize ); + set_f( hReverb->outputBufferImag[bin][ch], 0.0f, hReverb->blockSize ); + + /* Add from temporally decaying sparse tap locations the audio to the output. */ + for ( tapIdx = 0; tapIdx < hReverb->taps[bin][ch]; tapIdx++ ) + { + switch ( phaseShiftTypePr[tapIdx] ) + { + case 0: /* 0 degrees phase */ + v_add( hReverb->outputBufferReal[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferReal[bin][ch], hReverb->blockSize ); + v_add( hReverb->outputBufferImag[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferImag[bin][ch], hReverb->blockSize ); + break; + case 1: /* 90 degrees phase */ + v_sub( hReverb->outputBufferReal[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferReal[bin][ch], hReverb->blockSize ); + v_add( hReverb->outputBufferImag[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferImag[bin][ch], hReverb->blockSize ); + break; + case 2: /* 180 degrees phase */ + v_sub( hReverb->outputBufferReal[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferReal[bin][ch], hReverb->blockSize ); + v_sub( hReverb->outputBufferImag[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferImag[bin][ch], hReverb->blockSize ); + break; + default: /* 270 degrees phase */ + v_add( hReverb->outputBufferReal[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferReal[bin][ch], hReverb->blockSize ); + v_sub( hReverb->outputBufferImag[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferImag[bin][ch], hReverb->blockSize ); + break; + } + } + } + + /* Generate diffuse field binaural coherence by mixing the incoherent reverberated channels with pre-defined gains */ + if ( bin <= hReverb->highestBinauralCoherenceBin ) + { + if ( hReverb->useBinauralCoherence ) + { + for ( sample = 0; sample < hReverb->blockSize; sample++ ) + { + float leftRe, rightRe, leftIm, rightIm; + + leftRe = hReverb->binauralCoherenceDirectGains[bin] * hReverb->outputBufferReal[bin][0][sample] + hReverb->binauralCoherenceCrossmixGains[bin] * hReverb->outputBufferReal[bin][1][sample]; + rightRe = hReverb->binauralCoherenceDirectGains[bin] * hReverb->outputBufferReal[bin][1][sample] + hReverb->binauralCoherenceCrossmixGains[bin] * hReverb->outputBufferReal[bin][0][sample]; + leftIm = hReverb->binauralCoherenceDirectGains[bin] * hReverb->outputBufferImag[bin][0][sample] + hReverb->binauralCoherenceCrossmixGains[bin] * hReverb->outputBufferImag[bin][1][sample]; + rightIm = hReverb->binauralCoherenceDirectGains[bin] * hReverb->outputBufferImag[bin][1][sample] + hReverb->binauralCoherenceCrossmixGains[bin] * hReverb->outputBufferImag[bin][0][sample]; + + hReverb->outputBufferReal[bin][0][sample] = leftRe; + hReverb->outputBufferReal[bin][1][sample] = rightRe; + hReverb->outputBufferImag[bin][0][sample] = leftIm; + hReverb->outputBufferImag[bin][1][sample] = rightIm; + } + } + } + } + + /* 4) Write data to output */ + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + for ( sample = 0; sample < hReverb->blockSize; sample++ ) + { + uint16_t sampleWithOffset; + + sampleWithOffset = sample + offsetSamplesIO; + /* Audio was in the temporally inverted order for convolution, re-invert audio to output */ + invertSampleIndex = hReverb->blockSize - sample - 1; + + for ( bin = 0; bin < hReverb->numBins; bin++ ) + { + outReal[ch][sampleWithOffset][bin] = hReverb->outputBufferReal[bin][ch][invertSampleIndex]; + outImag[ch][sampleWithOffset][bin] = hReverb->outputBufferImag[bin][ch][invertSampleIndex]; + } + for ( ; bin < CLDFB_NO_CHANNELS_MAX; bin++ ) + { + outReal[ch][sampleWithOffset][bin] = 0.0f; + outImag[ch][sampleWithOffset][bin] = 0.0f; + } + } + } + + return; +} +#endif /*------------------------------------------------------------------------- * ivas_binaural_reverb_open() diff --git a/lib_rend/ivas_rotation.c b/lib_rend/ivas_rotation.c index ddfdcb6763..0736bd4003 100644 --- a/lib_rend/ivas_rotation.c +++ b/lib_rend/ivas_rotation.c @@ -251,10 +251,14 @@ void rotateAziEle( void rotateFrame_shd( HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ - float output[][L_FRAME48k], /* i/o: unrotated HOA3 signal buffer in TD */ - const int16_t subframe_len, /* i : subframe length per channel */ - const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ - const int16_t subframe_idx /* i : subframe index */ +#ifdef JBM_TSM_ON_TCS + float *output[], /* i/o: unrotated HOA3 signal buffer in TD */ +#else + float output[][L_FRAME48k], /* i/o: unrotated HOA3 signal buffer in TD */ +#endif + const int16_t subframe_len, /* i : subframe length per channel */ + const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ + const int16_t subframe_idx /* i : subframe index */ ) { int16_t i, l, n, m; @@ -354,7 +358,11 @@ void rotateFrame_shd( void rotateFrame_sd( HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ +#ifdef JBM_TSM_ON_TCS + float *output[], /* i/o: unrotated SD signal buffer in TD */ +#else float output[][L_FRAME48k], /* i/o: unrotated SD signal buffer in TD */ +#endif const int16_t subframe_len, /* i : subframe length per channel */ const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ @@ -492,7 +500,10 @@ void rotateFrame_shd_cldfb( float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain imag part */ float Rmat[3][3], /* i : real-space rotation matrix */ const int16_t nInChannels, /* i : number of channels */ - const int16_t shd_rot_max_order /* i : split-order rotation method */ +#ifdef JBM_TSM_ON_TCS + const int16_t numTimeSlots, +#endif + const int16_t shd_rot_max_order /* i : split-order rotation method */ ) { int16_t n = 0; @@ -515,7 +526,11 @@ void rotateFrame_shd_cldfb( SHrotmatgen( SHrotmat, Rmat, shd_rot_max_order ); /* rotation by mtx multiplication */ +#ifdef JBM_TSM_ON_TCS + for ( i = 0; i < numTimeSlots; i++ ) +#else for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) +#endif { for ( iBand = 0; iBand < CLDFB_NO_CHANNELS_MAX; iBand++ ) { @@ -586,6 +601,9 @@ void rotateFrame_sd_cldfb( float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain imag part */ const IVAS_OUTPUT_SETUP_HANDLE hOutputSetup, /* i : output format setup number of channels */ const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ +#ifdef JBM_TSM_ON_TCS + const int16_t numTimeSlots, /* i : number of time slots to process */ +#endif const int16_t nb_band /* i : number of CLDFB bands to process */ ) { @@ -644,7 +662,11 @@ void rotateFrame_sd_cldfb( p_imagRot = imagRot[n]; if ( g1 > 0.f ) { +#ifdef JBM_TSM_ON_TCS + for ( iBlock = 0; iBlock < numTimeSlots; iBlock++ ) +#else for ( iBlock = 0; iBlock < MAX_PARAM_SPATIAL_SUBFRAMES; iBlock++ ) +#endif { p_real = Cldfb_RealBuffer[m][iBlock]; p_imag = Cldfb_ImagBuffer[m][iBlock]; @@ -664,7 +686,11 @@ void rotateFrame_sd_cldfb( { p_realRot = realRot[n]; p_imagRot = imagRot[n]; +#ifdef JBM_TSM_ON_TCS + for ( iBlock = 0; iBlock < numTimeSlots; iBlock++ ) +#else for ( iBlock = 0; iBlock < MAX_PARAM_SPATIAL_SUBFRAMES; iBlock++ ) +#endif { p_real = Cldfb_RealBuffer[n][iBlock]; p_imag = Cldfb_ImagBuffer[n][iBlock]; diff --git a/lib_rend/ivas_sba_rendering.c b/lib_rend/ivas_sba_rendering.c index 8fd10d83ba..f316f2885f 100644 --- a/lib_rend/ivas_sba_rendering.c +++ b/lib_rend/ivas_sba_rendering.c @@ -50,6 +50,158 @@ * Render prototype audio signals using SBA mixing matrices *-------------------------------------------------------------------*/ +#ifdef JBM_TSM_ON_TCS +void ivas_sba_prototype_renderer_sf( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ + float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ + float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /* i : Input audio in CLDFB domain, imag */ +) +{ + float mixer_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; + SPAR_DEC_HANDLE hSpar; + DECODER_CONFIG_HANDLE hDecoderConfig; + int16_t num_spar_bands, spar_band; + int16_t b, ts; + int16_t num_cldfb_bands, numch_in, numch_out; + int16_t cldfb_band; + int16_t out_ch, in_ch; + int16_t firstInCh, inChEnd, firstOutCh, outChEnd; + int16_t slot_idx_start; + + push_wmops( "ivas_sba_prototype_renderer" ); + + hSpar = st_ivas->hSpar; + hDecoderConfig = st_ivas->hDecoderConfig; + num_spar_bands = hSpar->hFbMixer->pFb->filterbank_num_bands; + + num_cldfb_bands = hSpar->hFbMixer->pFb->fb_bin_to_band.num_cldfb_bands; + numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; + numch_out = hSpar->hFbMixer->fb_cfg->num_out_chans; + + if ( st_ivas->nchan_transport == 1 ) + { + firstInCh = 0; + inChEnd = 1; + firstOutCh = 0; + outChEnd = 1; + } + else /* 2 TC */ + { + firstInCh = 0; + inChEnd = 2; + firstOutCh = 1; + outChEnd = 2; + } + slot_idx_start = hSpar->slots_rendered; + /* Apply mixing matrix */ + for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) + { + int16_t md_idx = hSpar->render_to_md_slot_map[ts + slot_idx_start]; + /* determine SPAR parameters for this time slot */ + ivas_spar_get_parameters( hSpar, hDecoderConfig, md_idx, numch_out, numch_in, num_spar_bands, mixer_mat ); + + for ( cldfb_band = 0; cldfb_band < num_cldfb_bands; cldfb_band++ ) + { + float out_re[IVAS_SPAR_MAX_CH]; + float out_im[IVAS_SPAR_MAX_CH]; + float cldfb_par; + ivas_fb_bin_to_band_data_t *bin2band = &hSpar->hFbMixer->pFb->fb_bin_to_band; + + for ( out_ch = firstOutCh; out_ch < outChEnd; out_ch++ ) + { + out_re[out_ch] = 0.0f; + out_im[out_ch] = 0.0f; + + for ( in_ch = firstInCh; in_ch < inChEnd; in_ch++ ) + { + if ( cldfb_band < CLDFB_PAR_WEIGHT_START_BAND ) /* tuning parameter, depends on how much SPAR Filters overlap for the CLDFB bands */ + { + spar_band = bin2band->p_cldfb_map_to_spar_band[cldfb_band]; + cldfb_par = mixer_mat[out_ch][in_ch][spar_band]; + } + else + { + cldfb_par = 0.0f; + for ( spar_band = bin2band->p_spar_start_bands[cldfb_band]; spar_band < num_spar_bands; spar_band++ ) + { + /* accumulate contributions from all SPAR bands */ + cldfb_par += mixer_mat[out_ch][in_ch][spar_band] * bin2band->pp_cldfb_weights_per_spar_band[cldfb_band][spar_band]; + } + } + + out_re[out_ch] += inRe[in_ch][ts][cldfb_band] * cldfb_par; + out_im[out_ch] += inIm[in_ch][ts][cldfb_band] * cldfb_par; + } + } + + /*update CLDFB data with the parameter-modified data*/ + for ( out_ch = firstOutCh; out_ch < outChEnd; out_ch++ ) + { + inRe[out_ch][ts][cldfb_band] = out_re[out_ch]; + inIm[out_ch][ts][cldfb_band] = out_im[out_ch]; + } + } + + /* Update mixing matrices */ + if ( ( ( slot_idx_start + ts + 1 ) == hSpar->num_slots ) || ( ( md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME ) != ( hSpar->render_to_md_slot_map[ts + slot_idx_start + 1] / JBM_CLDFB_SLOTS_IN_SUBFRAME ) ) ) + { + /* we have crossed an unadapted parameter sf border, update previous mixing matrices */ + int16_t md_sf = md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME; + hSpar->i_subframe++; + hSpar->i_subframe = min( hSpar->i_subframe, MAX_PARAM_SPATIAL_SUBFRAMES ); + mvr2r( hSpar->hMdDec->mixer_mat_prev[1][0][0], hSpar->hMdDec->mixer_mat_prev[0][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + mvr2r( hSpar->hMdDec->mixer_mat_prev[2][0][0], hSpar->hMdDec->mixer_mat_prev[1][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + mvr2r( hSpar->hMdDec->mixer_mat_prev[3][0][0], hSpar->hMdDec->mixer_mat_prev[2][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + mvr2r( hSpar->hMdDec->mixer_mat_prev[4][0][0], hSpar->hMdDec->mixer_mat_prev[3][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + + for ( out_ch = 0; out_ch < numch_out; out_ch++ ) + { + for ( in_ch = 0; in_ch < numch_in; in_ch++ ) + { + for ( b = 0; b < num_spar_bands; b++ ) + { + hSpar->hMdDec->mixer_mat_prev[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][b + md_sf * IVAS_MAX_NUM_BANDS]; + } + } + } + } + } + + /* Create prototypes */ + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) + { + for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) + { + if ( st_ivas->nchan_transport == 1 ) /* Dual mono */ + { + mvr2r( inRe[0][ts], inRe[1][ts], CLDFB_NO_CHANNELS_MAX ); + mvr2r( inIm[0][ts], inIm[1][ts], CLDFB_NO_CHANNELS_MAX ); + } + else if ( st_ivas->nchan_transport == 2 ) /* Opposing cardioids */ + { + float temp_signal[CLDFB_NO_CHANNELS_MAX]; + + v_add( inRe[0][ts], inRe[1][ts], temp_signal, CLDFB_NO_CHANNELS_MAX ); + v_sub( inRe[0][ts], inRe[1][ts], inRe[1][ts], CLDFB_NO_CHANNELS_MAX ); + mvr2r( temp_signal, inRe[0][ts], CLDFB_NO_CHANNELS_MAX ); + v_multc( inRe[0][ts], 0.5f, inRe[0][ts], CLDFB_NO_CHANNELS_MAX ); + v_multc( inRe[1][ts], 0.5f, inRe[1][ts], CLDFB_NO_CHANNELS_MAX ); + + v_add( inIm[0][ts], inIm[1][ts], temp_signal, CLDFB_NO_CHANNELS_MAX ); + v_sub( inIm[0][ts], inIm[1][ts], inIm[1][ts], CLDFB_NO_CHANNELS_MAX ); + mvr2r( temp_signal, inIm[0][ts], CLDFB_NO_CHANNELS_MAX ); + v_multc( inIm[0][ts], 0.5f, inIm[0][ts], CLDFB_NO_CHANNELS_MAX ); + v_multc( inIm[1][ts], 0.5f, inIm[1][ts], CLDFB_NO_CHANNELS_MAX ); + } + } + } + + pop_wmops(); + + return; +} +#endif + void ivas_sba_prototype_renderer( Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ @@ -198,6 +350,10 @@ void ivas_sba_prototype_renderer( } } +#ifdef JBM_TSM_ON_TCS + hSpar->subframes_rendered += nSubframes; + hSpar->slots_rendered += slotEnd - firstSlot; +#endif pop_wmops(); return; diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 7744a6582b..6ef18946ca 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -4350,6 +4350,13 @@ static ivas_error renderIsmToBinauralRoom( IVAS_REND_AudioBuffer tmpMcBuffer; IVAS_REND_AudioObjectPosition rotatedPos; const IVAS_REND_HeadRotData *headRotData; +#ifdef JBM_TSM_ON_TCS + float *p_tmpRendBuffer[MAX_OUTPUT_CHANNELS]; + for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + p_tmpRendBuffer[i] = tmpRendBuffer[i]; + } +#endif push_wmops( "renderIsmToBinauralRoom" ); @@ -4449,8 +4456,13 @@ static ivas_error renderIsmToBinauralRoom( copyBufferTo2dArray( tmpMcBuffer, tmpRendBuffer ); +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, + NULL, NULL, NULL, NULL, p_tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, NULL, NULL, NULL, NULL, tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -4710,6 +4722,15 @@ static ivas_error renderMcToBinaural( ivas_error error; IVAS_REND_AudioBuffer tmpRotBuffer; +#ifdef JBM_TSM_ON_TCS + float *p_tmpRendBuffer[MAX_OUTPUT_CHANNELS]; + int16_t i; + for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + p_tmpRendBuffer[i] = tmpRendBuffer[i]; + } +#endif + push_wmops( "renderMcToBinaural" ); headRotEnabled = mcInput->base.ctx.pHeadRotData->headRotEnabled; @@ -4749,8 +4770,13 @@ static ivas_error renderMcToBinaural( } /* call CREND */ +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( mcInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), + NULL, NULL, NULL, NULL, p_tmpRendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( mcInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, NULL, NULL, NULL, tmpRendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -4780,6 +4806,15 @@ static ivas_error renderMcToBinauralRoom( ivas_error error; IVAS_REND_AudioBuffer tmpRotBuffer; +#ifdef JBM_TSM_ON_TCS + float *p_tmpRendBuffer[MAX_OUTPUT_CHANNELS]; + int16_t i; + for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + p_tmpRendBuffer[i] = tmpRendBuffer[i]; + } +#endif + push_wmops( "renderMcToBinauralRoom" ); headRotEnabled = mcInput->base.ctx.pHeadRotData->headRotEnabled; @@ -4819,8 +4854,13 @@ static ivas_error renderMcToBinauralRoom( } /* call CREND */ +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( mcInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), + NULL, NULL, NULL, NULL, p_tmpRendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( mcInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, NULL, NULL, NULL, tmpRendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -4853,12 +4893,23 @@ static ivas_error renderMcCustomLsToBinauralRoom( IVAS_REND_AudioBuffer tmpMcBuffer; IVAS_REND_AudioBuffer *tmpBufPtr; +#ifdef JBM_TSM_ON_TCS + float *p_tmpCrendBuffer[MAX_OUTPUT_CHANNELS]; +#endif + push_wmops( "renderMcCustomLsToBinauralRoom" ); tmpRotBuffer = outAudio; /* avoid compilation warning */ headRotEnabled = mcInput->base.ctx.pHeadRotData->headRotEnabled; +#ifdef JBM_TSM_ON_TCS + for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + p_tmpCrendBuffer[i] = tmpCrendBuffer[i]; + } +#endif + /* apply rotation */ if ( headRotEnabled ) { @@ -4892,8 +4943,13 @@ static ivas_error renderMcCustomLsToBinauralRoom( copyBufferTo2dArray( tmpMcBuffer, tmpCrendBuffer ); /* call CREND */ +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, AUDIO_CONFIG_7_1_4, getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, NULL, NULL, NULL, + p_tmpCrendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, AUDIO_CONFIG_7_1_4, getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, NULL, NULL, NULL, tmpCrendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -5096,8 +5152,20 @@ static ivas_error renderSbaToBinaural( ivas_error error; IVAS_REND_AudioBuffer tmpRotBuffer; +#ifdef JBM_TSM_ON_TCS + float *p_tmpCrendBuffer[MAX_OUTPUT_CHANNELS]; + int16_t i; +#endif + push_wmops( "renderSbaToBinaural" ); +#ifdef JBM_TSM_ON_TCS + for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + p_tmpCrendBuffer[i] = tmpCrendBuffer[i]; + } +#endif + /* apply rotation */ if ( sbaInput->base.ctx.pHeadRotData->headRotEnabled ) { @@ -5121,8 +5189,13 @@ static ivas_error renderSbaToBinaural( } /* call CREND */ +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_rend_crendProcess( sbaInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( sbaInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), + NULL, NULL, NULL, NULL, p_tmpCrendBuffer, *sbaInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_rend_crendProcess( sbaInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( sbaInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, NULL, NULL, NULL, tmpCrendBuffer, *sbaInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -5148,10 +5221,21 @@ static ivas_error renderSbaToBinauralRoom( IVAS_REND_AudioBuffer tmpMcBuffer; IVAS_REND_AudioBuffer *tmpBufPtr; +#ifdef JBM_TSM_ON_TCS + float *p_tmpCrendBuffer[MAX_OUTPUT_CHANNELS]; +#endif + tmpRotBuffer = outAudio; /* avoid compilation warning */ push_wmops( "renderSbaToBinauralRoom" ); +#ifdef JBM_TSM_ON_TCS + for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + p_tmpCrendBuffer[i] = tmpCrendBuffer[i]; + } +#endif + headRotEnabled = sbaInput->base.ctx.pHeadRotData->headRotEnabled; /* apply rotation */ @@ -5190,8 +5274,13 @@ static ivas_error renderSbaToBinauralRoom( copyBufferTo2dArray( tmpMcBuffer, tmpCrendBuffer ); /* call CREND */ +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_rend_crendProcess( sbaInput->crendWrapper, AUDIO_CONFIG_7_1_4, getIvasAudioConfigFromRendAudioConfig( outConfig ), + NULL, NULL, NULL, NULL, p_tmpCrendBuffer, *sbaInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_rend_crendProcess( sbaInput->crendWrapper, AUDIO_CONFIG_7_1_4, getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, NULL, NULL, NULL, tmpCrendBuffer, *sbaInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -5344,7 +5433,11 @@ static void renderMasaToMc( } else { +#ifdef JBM_TSM_ON_TCS + ivas_dirac_dec( masaInput->decDummy, tmpBuffer, masaInput->base.inputBuffer.config.numChannels ); +#else ivas_dirac_dec( masaInput->decDummy, tmpBuffer, masaInput->base.inputBuffer.config.numChannels, NULL, NULL, -1 ); +#endif } accumulate2dArrayToBuffer( tmpBuffer, &outAudio ); @@ -5361,7 +5454,11 @@ static void renderMasaToSba( copyBufferTo2dArray( masaInput->base.inputBuffer, tmpBuffer ); copyMasaMetadataToDiracRenderer( &masaInput->masaMetadata, masaInput->decDummy->hDirAC ); +#ifdef JBM_TSM_ON_TCS + ivas_dirac_dec( masaInput->decDummy, tmpBuffer, masaInput->base.inputBuffer.config.numChannels ); +#else ivas_dirac_dec( masaInput->decDummy, tmpBuffer, masaInput->base.inputBuffer.config.numChannels, NULL, NULL, -1 ); +#endif accumulate2dArrayToBuffer( tmpBuffer, &outAudio ); diff --git a/lib_util/tinywaveout_c.h b/lib_util/tinywaveout_c.h index d0531eb665..aab62a4dd3 100644 --- a/lib_util/tinywaveout_c.h +++ b/lib_util/tinywaveout_c.h @@ -490,6 +490,49 @@ static int32_t WriteWavShort( return __TWO_SUCCESS; } +#ifdef DEBUG_JBM +/* this function expects values in the 16 bit range +-32767/8 */ +static int32_t WriteWavFloat( + WAVEFILEOUT *self, + float sampleBuffer[], + uint32_t nSamples ) +{ + uint32_t i; + int32_t err = __TWO_SUCCESS; + + if ( !self ) + { + return __TWO_ERROR; + } + if ( !sampleBuffer ) + { + return __TWO_ERROR; + } + if ( __dataSizeChk( self, nSamples * sizeof( float ) ) ) + { + return __TWO_ERROR; + } + + for ( i = 0; i < nSamples; i++ ) + { + if ( self->bps == 32 ) + { + err = __WriteSample32( self, sampleBuffer[i]/32768.0f); + } + else + { + err = __TWO_ERROR; + } + if ( err != __TWO_SUCCESS ) + { + return err; + } + } + + return __TWO_SUCCESS; +} +#endif + static int32_t CloseWav( WAVEFILEOUT *self ) { diff --git a/lib_util/tsm_scale_file_reader.c b/lib_util/tsm_scale_file_reader.c new file mode 100644 index 0000000000..5c2e51edfa --- /dev/null +++ b/lib_util/tsm_scale_file_reader.c @@ -0,0 +1,148 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "tsm_scale_file_reader.h" +#include "cmdl_tools.h" +#include +#include +#include + +struct TsmScaleFileReader +{ + FILE *file; + char *file_path; + bool fileRewind; +}; + + +/*---------------------------------------------------------------------* + * TsmScaleFileReader_open() + * + * Allocates memory for an TsmScaleFileReader and opens the file at given path for reading. + *---------------------------------------------------------------------*/ + +/*! r: JbmFileReader handle */ +TsmScaleFileReader *TsmScaleFileReader_open( + const char *filePath /* i : path to CA config file */ +) +{ + TsmScaleFileReader *self; + FILE *file; + + if ( !filePath ) + { + return NULL; + } + + file = fopen( filePath, "rb" ); + + if ( !file ) + { + return NULL; + } + + self = calloc( sizeof( TsmScaleFileReader ), 1 ); + self->file = file; + self->file_path = calloc( sizeof( char ), strlen( filePath ) + 1 ); + strcpy( self->file_path, filePath ); + + return self; +} + + +/*---------------------------------------------------------------------* + * TsmScaleFileReader_readScale() + * + * Read TSM scale entry + *---------------------------------------------------------------------*/ + +ivas_error TsmScaleFileReader_readScale( + TsmScaleFileReader *self, /* i/o: TsmScaleFileReader handle */ + int16_t *scale /* o : scale */ +) +{ + int tmp; + if ( 1 != fscanf( self->file, "%d", &tmp ) ) + { + if ( feof( self->file ) ) + { + rewind( self->file ); + self->fileRewind = true; + return TsmScaleFileReader_readScale( self, scale ); + } + return IVAS_ERR_FAILED_FILE_PARSE; + } + *scale = (int16_t) tmp; + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * JbmFileReader_close() + * + * De-allocates all underlying memory of an JbmFileReader. + *---------------------------------------------------------------------*/ + +void TsmScaleFileReader_close( + TsmScaleFileReader **selfPtr /* i/o: pointer to JbmFileReader handle */ +) +{ + if ( selfPtr == NULL || *selfPtr == NULL ) + { + return; + } + + fclose( ( *selfPtr )->file ); + free( ( *selfPtr )->file_path ); + free( *selfPtr ); + *selfPtr = NULL; + + return; +} + + +/*---------------------------------------------------------------------* + * JbmFileReader_getFilePath() + * + *---------------------------------------------------------------------*/ + +const char *TsmScaleFileReader_getFilePath( + TsmScaleFileReader *self /* i/o: JbmFileReader handle */ +) +{ + if ( self == NULL ) + { + return NULL; + } + + return self->file_path; +} diff --git a/lib_util/tsm_scale_file_reader.h b/lib_util/tsm_scale_file_reader.h new file mode 100644 index 0000000000..7a795a25cb --- /dev/null +++ b/lib_util/tsm_scale_file_reader.h @@ -0,0 +1,67 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef IVAS_TSM_SCALE_FILE_READER_H +#define IVAS_TSM_SCALE_FILE_READER_H + +#include +#include "common_api_types.h" +#include "ivas_error.h" + +/* clang-format off */ + +typedef struct TsmScaleFileReader TsmScaleFileReader; + + +/*! r: TsmScaleFileReader handle */ +TsmScaleFileReader *TsmScaleFileReader_open( + const char *filePath /* i : path to TSM scale file */ +); + +ivas_error TsmScaleFileReader_readScale( + TsmScaleFileReader* self, /* i/o: TsmScaleFileReader handle */ + int16_t *scale /* o : next scale */ +); + +void TsmScaleFileReader_close( + TsmScaleFileReader **selfPtr /* i/o: pointer to TsmScaleFileReader handle */ +); + +/*! r: path to the currently opened file or NULL if `self` is NULL */ +const char *TsmScaleFileReader_getFilePath( + TsmScaleFileReader* self /* i/o: TsmScaleFileReader handle */ +); + + +/* clang-format on */ + +#endif /* IVAS_TSM_SCALE_FILE_READER_H */ diff --git a/scripts/batch_comp_audio.py b/scripts/batch_comp_audio.py index 72ae3fcc7d..97e9f8f548 100755 --- a/scripts/batch_comp_audio.py +++ b/scripts/batch_comp_audio.py @@ -96,10 +96,9 @@ def main(args): if not args.diffs_only or diff > 0: if diff == 0.0: - label = "\033[00;32m[OKAY]\033[00;00m" + label = "[OKAY]" else: - label = "\033[00;31m[FAIL]\033[00;00m" - + label = "[FAIL]" result = f"{label} Max. diff (PCM) for file {f}: {diff}" if args.verbose and diff != 0.0: @@ -108,10 +107,10 @@ def main(args): print(result, file=out_file) - if num_files_diff > 0: - print(f"{num_files_diff} files differ/don't exist", file=out_file) - else: - print(f"All files are bitexact", file=out_file) + if num_files_diff > 0: + print(f"{num_files_diff} files differ/don't exist", file=out_file) + else: + print(f"All files are bitexact", file=out_file) def compare_files(f, fol1, fol2, outputs_dict): diff --git a/scripts/config/ivas_modes.json b/scripts/config/ivas_modes.json index 0e4ef469d9..b384a2ea5e 100644 --- a/scripts/config/ivas_modes.json +++ b/scripts/config/ivas_modes.json @@ -964,6 +964,44 @@ ] } }, + "MASA_1TC_1DIR_b{bitrate}_{bandwidth}_rs": { + "encmodeoption": [ + "-masa", + "1" + ], + "encoptions": [ + "-max_band", + "{bandwidth}" + ], + "dec": { + "7_1_4": [], + "HOA3": [], + "mono": [], + "stereo": [], + "EXT": [] + }, + "in_config": "MASA1TC1DIR", + "table_name": "MASA 1TC 1DIR@{table_bitrate} kbps RS {bandwidth}", + "nummetadata": 1, + "metadatafilenames": [ + "{item}.met" + ], + "rs": true, + "amr": false, + "mono": false, + "bitrates": { + "wb": { + "all": "{sw_files_path}/sw_13k2_512k.bin" + }, + "swb": { + "all": "{sw_files_path}/sw_13k2_512k.bin" + }, + "fb": { + "all": "{sw_files_path}/sw_13k2_512k.bin" + } + } + + }, "MASA_2TC_1DIR_b{bitrate}_{bandwidth}_cbr": { "encmodeoption": [ "-masa", @@ -1034,6 +1072,46 @@ ] } }, + "MASA_2TC_1DIR_b{bitrate}_{bandwidth}_cbr": { + "encmodeoption": [ + "-masa", + "2" + ], + "encoptions": [ + "-max_band", + "{bandwidth}" + ], + "dec": { + "7_1_4": [], + "HOA3": [], + "mono": [], + "stereo": [], + "EXT": [] + }, + "in_config": "MASA2TC1DIR", + "table_name": "MASA 2TC 1DIR@{table_bitrate} kbps {bandwidth}", + "nummetadata": 1, + "metadatafilenames": [ + "{item}.met" + ], + "rs": false, + "amr": false, + "mono": false, + "rs": true, + "amr": false, + "mono": false, + "bitrates": { + "wb": { + "all": "{sw_files_path}/sw_13k2_512k.bin" + }, + "swb": { + "all": "{sw_files_path}/sw_13k2_512k.bin" + }, + "fb": { + "all": "{sw_files_path}/sw_13k2_512k.bin" + } + } + }, "MASA_1TC_2DIR_b{bitrate}_{bandwidth}_cbr": { "encmodeoption": [ "-masa", @@ -1851,6 +1929,39 @@ ] } }, + "ISM1_b{bitrate}_{bandwidth}_rs": { + "encmodeoption": [ + "-ism", + "1" + ], + "encoptions": [ + "-max_band", + "{bandwidth}" + ], + "dec": { + "EXT": [] + }, + "in_config": "ISM1", + "table_name": "ISM1@{table_bitrate} RS kbps {bandwidth}", + "nummetadata": 1, + "metadatafilenames": [ + "test_ISM_trajectory{mdi}.csv" + ], + "rs": true, + "amr": false, + "mono": false, + "bitrates": { + "wb": { + "all": "{sw_files_path}/sw_13k2_256k.bin" + }, + "swb": { + "all": "{sw_files_path}/sw_13k2_256k.bin" + }, + "fb": { + "all": "{sw_files_path}/sw_32k_256k.bin" + } + } + }, "ISM1_b{bitrate}_dtx_{bandwidth}_cbr": { "encmodeoption": [ "-ism", @@ -2030,6 +2141,39 @@ 256000 ] } + }, + "ISM2_b{bitrate}_{bandwidth}_rs": { + "encmodeoption": [ + "-ism", + "2" + ], + "encoptions": [ + "-max_band", + "{bandwidth}" + ], + "dec": { + "EXT": [] + }, + "in_config": "ISM2", + "table_name": "ISM2@{table_bitrate} kbps RS {bandwidth}", + "nummetadata": 2, + "metadatafilenames": [ + "test_ISM_trajectory{mdi}.csv" + ], + "rs": true, + "amr": false, + "mono": false, + "bitrates": { + "wb": { + "all": "{sw_files_path}/sw_16k4_256k.bin" + }, + "swb": { + "all": "{sw_files_path}/sw_16k4_256k.bin" + }, + "fb": { + "all": "{sw_files_path}/sw_32k_256k.bin" + } + } } }, "ISM3": { @@ -2157,6 +2301,39 @@ 384000 ] } + }, + "ISM3_b{bitrate}_{bandwidth}_rs": { + "encmodeoption": [ + "-ism", + "3" + ], + "encoptions": [ + "-max_band", + "{bandwidth}" + ], + "dec": { + "EXT": [] + }, + "in_config": "ISM3", + "table_name": "ISM3@{table_bitrate} kbps {bandwidth}", + "nummetadata": 3, + "metadatafilenames": [ + "test_ISM_trajectory{mdi}.csv" + ], + "rs": true, + "amr": false, + "mono": false, + "bitrates": { + "wb": { + "all": "{sw_files_path}/sw_24k4_256k_1.bin" + }, + "swb": { + "all": "{sw_files_path}/sw_24k4_256k_1.bin" + }, + "fb": { + "all": "{sw_files_path}/sw_32k_256k.bin" + } + } } }, "ISM4": { @@ -2290,6 +2467,39 @@ 512000 ] } + }, + "ISM4_b{bitrate}_{bandwidth}_rs": { + "encmodeoption": [ + "-ism", + "4" + ], + "encoptions": [ + "-max_band", + "{bandwidth}" + ], + "dec": { + "EXT": [] + }, + "in_config": "ISM4", + "table_name": "ISM4@{table_bitrate} kbps RS {bandwidth}", + "nummetadata": 4, + "metadatafilenames": [ + "test_ISM_trajectory{mdi}.csv" + ], + "rs": true, + "amr": false, + "mono": false, + "bitrates": { + "wb": { + "all": "{sw_files_path}/sw_24k4_256k_1.bin" + }, + "swb": { + "all": "{sw_files_path}/sw_24k4_256k_1.bin" + }, + "fb": { + "all": "{sw_files_path}/sw_32k_256k.bin" + } + } } }, "stereo": { diff --git a/scripts/runIvasCodec.py b/scripts/runIvasCodec.py index 070fb8e4f0..f96758e5be 100755 --- a/scripts/runIvasCodec.py +++ b/scripts/runIvasCodec.py @@ -34,6 +34,7 @@ import os.path import platform import sys import logging +import shutil from pyivastest import IvasScriptsCommon, IvasModeRunner import pyivastest.constants as constants @@ -81,6 +82,11 @@ class RunIvasCodec(IvasScriptsCommon.IvasScript): help="Decoder binary name (default {})".format(default_dec), default=default_dec, ) + self.parser.add_argument( + "--fail_log_dir", + help="Move logs of failed modes to dir (default none)", + default=None, + ) def run(self): self.parse_args() @@ -137,10 +143,19 @@ class RunIvasCodec(IvasScriptsCommon.IvasScript): self.logger.console(" Encoder: {}".format(bin_enc), logging.INFO) self.logger.console(" Decoder: {}".format(bin_dec), logging.INFO) + runner.run() self.logger.console(" ") + fail_log_dir=None + if self.args["fail_log_dir"] is not None: + fail_log_dir = os.path.realpath(self.args["fail_log_dir"]) + if not(os.path.exists(fail_log_dir)): + os.makedirs(fail_log_dir) for r in runner.results: self.logger.console(r[0]) + if fail_log_dir is not None: + shutil.copy(r[3],fail_log_dir) + self.logger.console(" ") -- GitLab From 6568718f765d9ae27c1eb332f9bb25775d64b343 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Wed, 26 Apr 2023 10:27:49 +0200 Subject: [PATCH 073/331] Fixed most BE problems --- lib_com/options.h | 4 +- lib_dec/ivas_dirac_dec.c | 48 ++++++----------------- lib_dec/ivas_dirac_output_synthesis_dec.c | 14 +++++-- lib_dec/ivas_mc_param_dec.c | 7 +++- lib_dec/ivas_sba_rendering_internal.c | 27 ++++++++----- 5 files changed, 48 insertions(+), 52 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index e7ffeb2b7a..a9d34de2c1 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -113,7 +113,7 @@ /*#define TDREND_HRTF_TABLE_METHODS*/ /* Enable HRTF lookup from tables, for testing & evaluation. Supply file in table format to use. Note that a suitable HR filter lookup method should be written if the filters sample point grids are not in the formats. */ /*#define TDREND_STANDALONE*/ /* Used when renderer is built in standalone form, without IVAS encoding/decoding (see scripts/object_renderer_standalone). This is just here to ensure this is cleaned out by prepare_instrumentation.sh */ -#define DEBUG_SBA /* debug DIRAC/SPAR in-out */ +/*#define DEBUG_SBA*/ /* debug DIRAC/SPAR in-out */ #ifdef DEBUG_SBA /*#define DEBUG_SBA_AUDIO_DUMP */ /* SBA intermediate audio wav file dumping */ /*#define DEBUG_SBA_MD_DUMP*/ /* SBA metadata and variable file dumping */ @@ -156,7 +156,7 @@ #ifdef JBM_TSM_ON_TCS #define TEST_BIN_RENDERER_BE #define TMP_FIX_ISM_BR_SWITCHING /* */ -/*#define JBM_DIRAC_DEBUG_BE*/ +#define JBM_DIRAC_DEBUG_BE #endif /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 9bb43b39c9..1a831d3103 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -1043,10 +1043,10 @@ ivas_error ivas_dirac_dec_config( } } } - + #endif /* JBM_TMS_ON_TCS*/ - return error; + return error; } @@ -1934,7 +1934,9 @@ void ivas_qmetadata_to_dirac( { hDirAC->elevation[tmp_write_idx_band][b] = 0; hDirAC->azimuth[tmp_write_idx_band][b] = 0; +#if 0 hDirAC->diffuseness_vector[tmp_write_idx_band][b] = 0.f; +#endif hDirAC->spreadCoherence[tmp_write_idx_band][b] = 0.0f; hDirAC->surroundingCoherence[tmp_write_idx_band][b] = 0.0f; hDirAC->energy_ratio1[tmp_write_idx_band][b] = 0; @@ -2557,39 +2559,16 @@ void ivas_dirac_dec_render_sf( #endif } } - - if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 1 ) - { - ivas_dirac_dec_compute_directional_responses( hDirAC, - st_ivas->hVBAPdata, - st_ivas->hMasa, - surCohRatio, - st_ivas->hHeadTrackData->shd_rot_max_order, - p_Rmat ); - } - else - { - ivas_dirac_dec_compute_directional_responses( hDirAC, - st_ivas->hVBAPdata, - st_ivas->hMasa, - surCohRatio, - 0, - 0 ); - } } - if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 1 ) { ivas_dirac_dec_compute_directional_responses( hDirAC, st_ivas->hVBAPdata, st_ivas->hMasa, #ifdef JBM_TSM_ON_TCS - azimuth[0], - elevation[0], + hDirAC->azimuth[md_idx], + hDirAC->elevation[md_idx], md_idx, -#else - subframe_idx, - subframe_idx, #endif surCohRatio, st_ivas->hHeadTrackData->shd_rot_max_order, @@ -2601,12 +2580,9 @@ void ivas_dirac_dec_render_sf( st_ivas->hVBAPdata, st_ivas->hMasa, #ifdef JBM_TSM_ON_TCS - azimuth[0], - elevation[0], + hDirAC->azimuth[md_idx], + hDirAC->elevation[md_idx], md_idx, -#else - subframe_idx, - subframe_idx, #endif surCohRatio, 0, @@ -2986,7 +2962,7 @@ void ivas_dirac_dec_render_sf( hDirAC, st_ivas->hMasa, 0, - p_Rmat, + 0, st_ivas->hVBAPdata, hDirAC->hOutSetup, nchan_transport, @@ -3039,7 +3015,7 @@ void ivas_dirac_dec_render_sf( qualityBasedSmFactor *= qualityBasedSmFactor; } #ifdef JBM_TSM_ON_TCS - /* Workaround for BE */ + /* Workaround for BE (should be gone when #393 is adressed) */ if ( hDirAC->hConfig->dec_param_estim == 1 ) { num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; @@ -3056,11 +3032,11 @@ void ivas_dirac_dec_render_sf( /* we are at the end, get the next one using the normal dirac read idx...*/ if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 ) { - diff_md_idx = ( hDirAC->dirac_read_idx + DEFAULT_JBM_CLDFB_TIMESLOTS + 1 ) % hDirAC->dirac_md_buffer_length; + diff_md_idx = ( hDirAC->dirac_read_idx + DEFAULT_JBM_CLDFB_TIMESLOTS ) % hDirAC->dirac_md_buffer_length; } else { - diff_md_idx = ( hDirAC->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS + 1 ) % hDirAC->dirac_md_buffer_length; + diff_md_idx = ( hDirAC->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % hDirAC->dirac_md_buffer_length; } } else diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c index ffbff9014a..670bd0072b 100644 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -846,7 +846,11 @@ void ivas_dirac_dec_output_synthesis_process_slot( /* process other PSDs only slot wise for 4 transport channels */ #if !defined( JBM_TSM_ON_TCS ) || defined( JBM_DIRAC_DEBUG_BE ) +#if defined( JBM_DIRAC_DEBUG_BE ) + if ( hDirAC->hConfig->dec_param_estim == TRUE || hDirAC->voip_active == 1) +#else if ( hDirAC->hConfig->dec_param_estim == TRUE ) +#endif #endif { computeTargetPSDs_direct( num_channels_dir, num_freq_bands, h_dirac_output_synthesis_state->direct_power_factor, reference_power, h_dirac_output_synthesis_state->direct_responses, h_dirac_output_synthesis_state->direct_responses_square, h_dirac_output_synthesis_state->cy_auto_dir_smooth, h_dirac_output_synthesis_state->cy_cross_dir_smooth ); @@ -1165,7 +1169,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( float qualityBasedSmFactor ) { int16_t buf_idx, num_freq_bands; -#ifndef JBM_TSM_ON_TCS +#if !defined( JBM_TSM_ON_TCS ) || defined( JBM_DIRAC_DEBUG_BE ) int16_t diff_start_band; #endif int16_t k, l; @@ -1188,7 +1192,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( float subtract_target_ratio; float subtract_target_ratio_db; float a, b; -#ifndef JBM_TSM_ON_TCS +#if !defined( JBM_TSM_ON_TCS ) || defined( JBM_DIRAC_DEBUG_BE ) uint16_t nchan_target_psds; #endif float alpha[CLDFB_NO_CHANNELS_MAX]; @@ -1211,8 +1215,12 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( /*-----------------------------------------------------------------* * compute target PSDs *-----------------------------------------------------------------*/ -#ifndef JBM_TSM_ON_TCS +#if !defined( JBM_TSM_ON_TCS ) || defined( JBM_DIRAC_DEBUG_BE ) +#ifdef JBM_DIRAC_DEBUG_BE + if ( hDirAC->hConfig->enc_param_start_band == 0 && hDirAC->voip_active == 0 ) +#else if ( hDirAC->hConfig->enc_param_start_band == 0 ) +#endif { diff_start_band = h_dirac_output_synthesis_params->use_onset_filters == 1 ? h_dirac_output_synthesis_params->max_band_decorr : 0; diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index f75c5fa830..a7e2611225 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -1469,7 +1469,12 @@ void ivas_param_mc_dec_digest_tc( hParamMC->slots_rendered = 0; hParamMC->subframes_rendered = 0; ivas_jbm_dec_get_adapted_subframes( nCldfbSlots, hParamMC->subframe_nbslots, &hParamMC->nb_subframes ); - ivas_param_mc_dec_compute_interpolator( hParamMC->hMetadataPMC->bAttackPresent, hParamMC->hMetadataPMC->attackIndex, nCldfbSlots, hParamMC->h_output_synthesis_params.interpolator ); + + /* BE Workaround */ + if ( !st_ivas->bfi && st_ivas->hDecoderConfig->voip_active == 0 ) + { + ivas_param_mc_dec_compute_interpolator( hParamMC->hMetadataPMC->bAttackPresent, hParamMC->hMetadataPMC->attackIndex, nCldfbSlots, hParamMC->h_output_synthesis_params.interpolator ); + } for ( param_band_idx = 0; param_band_idx < PARAM_MC_MAX_PARAMETER_BANDS; param_band_idx++ ) { diff --git a/lib_dec/ivas_sba_rendering_internal.c b/lib_dec/ivas_sba_rendering_internal.c index bc9b4cb7cb..3c463f68c0 100644 --- a/lib_dec/ivas_sba_rendering_internal.c +++ b/lib_dec/ivas_sba_rendering_internal.c @@ -68,7 +68,7 @@ void ivas_sba2mc_cldfb( #ifdef JBM_TSM_ON_TCS const int16_t nb_timeslots, /* i : number of time slots to process */ #endif - const float *hoa_dec_mtx /* i : HOA decoding mtx */ + const float *hoa_dec_mtx /* i : HOA decoding mtx */ ) { int16_t iBlock, iBand, n, m; @@ -144,16 +144,16 @@ void ivas_sba2mc_cldfb( *-------------------------------------------------------------------------*/ void ivas_mc2sba( - IVAS_OUTPUT_SETUP hIntSetup, /* i : Format of decoder output */ + IVAS_OUTPUT_SETUP hIntSetup, /* i : Format of decoder output */ #ifdef JBM_TSM_ON_TCS float *in_buffer_td[], /* i : MC signals (on input) and the HOA3 (on output) */ float *buffer_td[], /* i/o: MC signals (on input) and the HOA3 (on output) */ #else float buffer_td[][L_FRAME48k], /* i/o: MC signals (on input) and the HOA3 (on output) */ #endif - const int16_t output_frame, /* i : output frame length per channel */ - const int16_t sba_order, /* i : Ambisonic (SBA) order */ - const float gain_lfe /* i : gain for LFE, 0 = ignore LFE */ + const int16_t output_frame, /* i : output frame length per channel */ + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + const float gain_lfe /* i : gain for LFE, 0 = ignore LFE */ ) { int16_t i, j, k; @@ -430,13 +430,17 @@ void ivas_sba_upmixer_renderer( ) { - int16_t i, nchan_internal; + int16_t nchan_internal; +#ifndef JBM_TSM_ON_TCS + int16_t i; float temp; +#endif push_wmops( "ivas_sba_upmixer_renderer" ); nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order ); +#ifndef JBM_TSM_ON_TCS if ( st_ivas->nchan_transport >= 3 ) { /*convert WYZX downmix to WYXZ*/ @@ -447,14 +451,17 @@ void ivas_sba_upmixer_renderer( output[3][i] = temp; } } +#endif /* Upmixer + Renderer */ ivas_spar_dec_upmixer( st_ivas, output, nchan_internal, output_frame ); + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC ) + { #ifdef JBM_TSM_ON_TCS float *output_f[MAX_OUTPUT_CHANNELS]; int16_t ch; - for (ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++) + for ( ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++ ) { output_f[ch] = output[ch]; } @@ -462,7 +469,7 @@ void ivas_sba_upmixer_renderer( #else ivas_sba_linear_renderer( output, output_frame, st_ivas->hIntSetup.nchan_out_woLFE, st_ivas->hDecoderConfig->output_config, st_ivas->hOutSetup, st_ivas->hoa_dec_mtx ); #endif - + } pop_wmops(); return; @@ -479,7 +486,7 @@ static void ivas_sba_mtx_mult( #ifdef JBM_TSM_ON_TCS float *output_f[], /* i/o: synthesized core-corder transport channels/DirAC output */ #else - float output_f[][L_FRAME48k], /* i/o: synthesized core-corder transport channels/DirAC output */ + float output_f[][L_FRAME48k], /* i/o: synthesized core-corder transport channels/DirAC output */ #endif const int16_t output_frame, /* i : output frame length per channel */ const int16_t nchan_in, /* i : Number of ambisonic channels */ @@ -543,7 +550,7 @@ ivas_error ivas_sba_linear_renderer( #ifdef JBM_TSM_ON_TCS float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ #else - float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ + float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ #endif const int16_t output_frame, /* i : output frame length per channel */ const int16_t nchan_in, /* i : number of input ambisonics channels */ -- GitLab From 4793a158bc70984534bda4ad54ae3dc791b73f12 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Wed, 26 Apr 2023 12:55:35 +0200 Subject: [PATCH 074/331] fixed decoder app for variable speed decoding, added br switch profiles for ISM, cleanup --- apps/decoder.c | 19 +++- lib_com/options.h | 5 +- lib_debug/debug.c | 104 +------------------ lib_debug/debug.h | 15 --- lib_dec/ivas_dec.c | 4 +- lib_dec/ivas_spar_decoder.c | 88 +--------------- lib_dec/lib_dec.c | 6 +- lib_rend/ivas_dirac_dec_binaural_functions.c | 31 +----- scripts/switchPaths/sw_13k2_256k.bin | 3 + scripts/switchPaths/sw_16k4_256k.bin | 3 + scripts/switchPaths/sw_24k4_256k_1.bin | 3 + scripts/switchPaths/sw_32k_256k.bin | 3 + 12 files changed, 34 insertions(+), 250 deletions(-) create mode 100644 scripts/switchPaths/sw_13k2_256k.bin create mode 100644 scripts/switchPaths/sw_16k4_256k.bin create mode 100644 scripts/switchPaths/sw_24k4_256k_1.bin create mode 100644 scripts/switchPaths/sw_32k_256k.bin diff --git a/apps/decoder.c b/apps/decoder.c index 4b09ce7d36..05b8862735 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -2394,7 +2394,7 @@ static ivas_error decodeVariableSpeed( int16_t numInitialBadFrames = 0; /* Number of bad frames received until first good frame is decoded */ int16_t nOutChannels = 0; int16_t delayNumSamples = -1; - int16_t delayNumSamples_orig = 0; + int16_t delayNumSamples_orig[3]; int16_t nOutSamples = 0; int32_t delayTimeScale = 0; ivas_error error = IVAS_ERR_UNKNOWN; @@ -2437,6 +2437,8 @@ static ivas_error decodeVariableSpeed( fprintf( stdout, "\n-- Start the decoder (quiet mode) --\n\n" ); } + delayNumSamples_orig[0] = -1; + #ifdef WMOPS reset_stack(); reset_wmops(); @@ -2595,7 +2597,7 @@ static ivas_error decodeVariableSpeed( arg, numInitialBadFrames, nOutSamples, - &delayNumSamples_orig, + delayNumSamples_orig, &delayNumSamples, &delayTimeScale, &bsFormat, @@ -2844,7 +2846,13 @@ static ivas_error decodeVariableSpeed( if ( !arg.quietModeEnabled ) { - fprintf( stdout, "\nDecoder delay: %-5u [samples] - Timescale: %5u\n", delayNumSamples_orig, delayTimeScale ); + printf( "\n\nDecoder+renderer delay: %4.2f ms (%3u samples at timescale %5u)\n", 1000.f * delayNumSamples_orig[1] / (float) delayTimeScale, delayNumSamples_orig[1], delayTimeScale ); + + if ( delayNumSamples_orig[2] > 0 ) + { + printf( "HRIR/BRIR delay: %4.2f ms (%3u samples at timescale %5u)\n", 1000.f * delayNumSamples_orig[2] / (float) delayTimeScale, delayNumSamples_orig[2], delayTimeScale ); + printf( "Total delay: %4.2f ms (%3u samples at timescale %5u)\n", 1000.f * ( delayNumSamples_orig[1] + delayNumSamples_orig[2] ) / (float) delayTimeScale, delayNumSamples_orig[1] + delayNumSamples_orig[2], delayTimeScale ); + } } /* Print output metadata file name(s) */ @@ -2865,8 +2873,8 @@ static ivas_error decodeVariableSpeed( } /* add zeros at the end to have equal length of synthesized signals */ - memset( pcmBuf, 0, delayNumSamples_orig * nOutChannels * sizeof( int16_t ) ); - if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, delayNumSamples_orig * nOutChannels ) ) != IVAS_ERR_OK ) + memset( pcmBuf, 0, delayNumSamples_orig[0] * nOutChannels * sizeof( int16_t ) ); + if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, delayNumSamples_orig[0] * nOutChannels ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError writing output file: %s\n", ivas_error_to_string( error ) ); goto cleanup; @@ -2882,6 +2890,7 @@ cleanup: AudioFileWriter_close( &afWriter ); MasaFileWriter_close( &masaWriter ); + TsmScaleFileReader_close( &tsmScaleFileReader ); for ( i = 0; i < IVAS_MAX_NUM_OBJECTS; i++ ) { IsmFileWriter_close( &ismWriters[i] ); diff --git a/lib_com/options.h b/lib_com/options.h index a9d34de2c1..f1a4d6ecce 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -72,7 +72,6 @@ /*#define DEBUG_MODE_INFO_PLC */ /* define to output PLC related parameters */ /*#define DEBUG_MODE_INFO_ALLRAD*/ /* define to output generated HOA decoding mtx */ /*#define DEBUG_MODE_LFE */ /* define to output LFE relevant parameters */ -/*#define DEBUG_MODE_JBM */ /* define to output import JBM parameters */ #endif #ifdef DEBUG_MODE_MDCT @@ -113,7 +112,7 @@ /*#define TDREND_HRTF_TABLE_METHODS*/ /* Enable HRTF lookup from tables, for testing & evaluation. Supply file in table format to use. Note that a suitable HR filter lookup method should be written if the filters sample point grids are not in the formats. */ /*#define TDREND_STANDALONE*/ /* Used when renderer is built in standalone form, without IVAS encoding/decoding (see scripts/object_renderer_standalone). This is just here to ensure this is cleaned out by prepare_instrumentation.sh */ -/*#define DEBUG_SBA*/ /* debug DIRAC/SPAR in-out */ +#define DEBUG_SBA /* debug DIRAC/SPAR in-out */ #ifdef DEBUG_SBA /*#define DEBUG_SBA_AUDIO_DUMP */ /* SBA intermediate audio wav file dumping */ /*#define DEBUG_SBA_MD_DUMP*/ /* SBA metadata and variable file dumping */ @@ -126,7 +125,6 @@ /*#define SPAR_HOA_DBG*/ /* SPAR HOA debug statements */ /*#define DEBUG_BINAURAL_FILTER_DESIGN*/ /* debugging of Crend binaural filter design */ #define DEBUG_AGC_ENCODER_CMD_OPTION /* Ability to force enable or disable AGC behaviour in DIRAC/SPAR via command line option */ -/*#define DEBUG_JBM*/ #define DEBUG_JBM_CMD_OPTION /* ability for telling the decoder the frontend fetch size and to not delay compensate for bad frames at the beginning */ #endif @@ -154,7 +152,6 @@ #define VARIABLE_SPEED_DECODING /* FhG: variable speed decoding employing the JBM functioniality */ #define JBM_TSM_ON_TCS /* FhG: run the TSM part of JBM on the TCs instead of the final output pcm waveforms */ #ifdef JBM_TSM_ON_TCS -#define TEST_BIN_RENDERER_BE #define TMP_FIX_ISM_BR_SWITCHING /* */ #define JBM_DIRAC_DEBUG_BE #endif diff --git a/lib_debug/debug.c b/lib_debug/debug.c index 4e4cf1cf8b..ce10231876 100644 --- a/lib_debug/debug.c +++ b/lib_debug/debug.c @@ -54,9 +54,6 @@ #else #endif #include "wmc_auto.h" -#ifdef DEBUG_JBM -#include "tinywaveout_c.h" -#endif /*-------------------------------------------------------------------* @@ -96,12 +93,6 @@ static FILE *out_fileptr[N_FILEPTR]; static char *in_filename[N_FILEPTR]; static char *out_filename[N_FILEPTR]; -#ifdef DEBUG_MODE_JBM -static char *wav_out_filename[N_FILEPTR]; -static WAVEFILEOUT *wav_out_fileptr[N_FILEPTR]; -static int16_t wav_count; -#endif - static int16_t in_count = 0; static int16_t out_count = 0; @@ -210,92 +201,6 @@ int16_t dbgwrite( return 0; } -#ifdef DEBUG_MODE_JBM -/*-------------------------------------------------------------------* - * dbgwritewav() - * - * Writes the buffer content to the specified file. If the file is not in the - * debug file list, it is opened before write. - *--------------------------------------------------------------------*/ - -int16_t dbgwritewav( - const int16_t input_frame, - float **ppPcm, - float pcm_array[MAX_OUTPUT_CHANNELS][L_FRAME48k], - const int16_t no_channel, - const int32_t fs, -#ifdef DEBUG_MODE_INFO_TWEAK - const char *filename /* i : Output file name */ -#else - const char *const filename -#endif -) -{ - int16_t index, i; - -#ifdef DEBUG_MODE_INFO -#ifdef DEBUG_MODE_INFO_TWEAK - char filename_mod[FILENAME_MAX]; - int16_t textmode = 0; - memset( filename_mod, 0, FILENAME_MAX ); - tweakdbgfolder( filename, filename_mod, &textmode ); - if ( filename_mod[0] != 0 ) - { - filename = filename_mod; - } -#endif -#endif - - index = lookup( filename, (const char *const *) wav_out_filename, wav_count ); - - if ( index == -1 ) - { - if ( make_dirs( filename ) != 0 ) - { - fprintf( stderr, "dbgwrite: Could not create directory structure for %s. Exiting..\n", filename ); - exit( -1 ); - } - - index = wav_count; - wav_out_filename[index] = malloc( sizeof( char ) * ( strlen( filename ) + 1 ) ); - strcpy( wav_out_filename[index], filename ); - wav_out_fileptr[index] = CreateWav( (const char *) wav_out_filename[index], fs, no_channel, 32 /* const uint32_t writeWaveExt */ ); - - wav_count++; - } - - if ( wav_out_fileptr[index] != NULL ) - { - float debug_tmp[IVAS_SPAR_MAX_CH * L_FRAME48k * 2]; - int32_t j, k; - k = 0; - for ( j = 0; j < input_frame; j++ ) - { - for ( i = 0; i < no_channel; i++, k++ ) - { - float tmp_value; - if ( ppPcm ) - { - tmp_value = ppPcm[i][j]; - } - else - { - tmp_value = pcm_array[i][j]; - } - debug_tmp[k] = tmp_value; - } - } - WriteWavFloat( wav_out_fileptr[index], debug_tmp, ( no_channel * input_frame ) ); - } - else - { - fprintf( stderr, "dbgwrite: Could not write to file: %s. Exiting..\n", filename ); - exit( -1 ); - } - - return 0; -} -#endif /*-------------------------------------------------------------------* * dbgwrite_mat_repeat() @@ -502,14 +407,7 @@ void dbgclose() free( val_name[i] ); free( val[i] ); } -#ifdef DEBUG_MODE_JBM - for ( i = 0; i < wav_count; i++ ) - { - CloseWav( wav_out_fileptr[i] ); - wav_out_fileptr[i] = NULL; - free( wav_out_filename[i] ); - } -#endif + return; } diff --git a/lib_debug/debug.h b/lib_debug/debug.h index c89f245af6..3d59cb00a0 100644 --- a/lib_debug/debug.h +++ b/lib_debug/debug.h @@ -98,21 +98,6 @@ int16_t dbgwrite( #endif ); -#ifdef DEBUG_MODE_JBM -int16_t dbgwritewav( - const int16_t input_frame, - float **ppPcm, - float pcm_array[MAX_OUTPUT_CHANNELS][L_FRAME48k], - const int16_t no_channel, - const int32_t fs, -#ifdef DEBUG_MODE_INFO_TWEAK - const char *filename /* i : Output file name */ -#else - const char *const filename -#endif -); -#endif - void dbgwrite_mat_repeat( float *buffer, /* i : write buffer */ int16_t nRow, /* i : matrix size (rows) */ diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index 98490a2ace..c126d1243d 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -369,9 +369,7 @@ ivas_error ivas_dec( /* Dump audio signal after core-decoding */ ivas_spar_dump_signal_wav( output_frame, NULL, output, st_ivas->nchan_transport, spar_foa_dec_wav[0], "core-decoding" ); #endif -#ifdef DEBUG_MODE_JBM - dbgwritewav( output_frame, NULL, output, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, "res/sba_tc.wav" ); -#endif + /* TCs remapping */ nchan_remapped = st_ivas->nchan_transport; if ( st_ivas->sba_dirac_stereo_flag ) diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 4f74ae0c7a..52cfc7910b 100644 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -969,36 +969,13 @@ void ivas_spar_dec_agc_pca( /* Dump audio signal after ivas_agc_dec_process */ ivas_spar_dump_signal_wav( output_frame, NULL, output, st_ivas->nchan_transport, spar_foa_dec_wav[1], "ivas_agc_dec_process()" ); #endif -#ifdef DEBUG_MODE_JBM - { - int k; - dbgwritewav( output_frame, NULL, output, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, "res/spar_dec_agc_process.wav" ); - for ( k = 0; k < st_ivas->nchan_transport; k++ ) - { - char filename[100]; - sprintf( filename, "res/spar_dec_agc_process_%d.dat", k ); - dbgwrite( output[k], sizeof( float ), output_frame, 1, filename ); - } - } -#endif + if ( hSpar->hPCA != NULL ) { ivas_pca_dec( hSpar->hPCA, output_frame, num_in_ingest, hDecoderConfig->ivas_total_brate, hDecoderConfig->last_ivas_total_brate, st_ivas->bfi, output ); #ifdef DEBUG_SBA_AUDIO_DUMP /* Dump audio signal after ivas_pca_dec */ ivas_spar_dump_signal_wav( output_frame, NULL, output, num_in_ingest, spar_foa_dec_wav[2], "ivas_pca_dec()" ); -#endif -#ifdef DEBUG_MODE_JBM - { - int k; - dbgwritewav( output_frame, NULL, output, num_in_ingest, st_ivas->hDecoderConfig->output_Fs, "res/spar_pca_dec.wav" ); - for ( k = 0; k < num_in_ingest; k++ ) - { - char filename[100]; - sprintf( filename, "res/spar_pca_dec_%d.dat", k ); - dbgwrite( output[k], sizeof( float ), output_frame, 1, filename ); - } - } #endif } pop_wmops(); @@ -1096,9 +1073,6 @@ void ivas_spar_dec_digest_tc( } nSamplesLeftForTD -= nSamplesToDecorr; } -#ifdef DEBUG_MODE_JBM - dbgwritewav( nSamplesForRendering, st_ivas->tc, NULL, nchan_internal, st_ivas->hDecoderConfig->output_Fs, "res/spar_dec_td_decorr.wav" ); -#endif } ivas_spar_dec_set_render_params( st_ivas, nCldfbSlots ); @@ -1149,18 +1123,6 @@ void ivas_spar_dec_upmixer( { mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], st_ivas->hTcBuffer->tc[nchan_internal - 1 - i], output_frame ); } -#ifdef DEBUG_MODE_JBM - { - int k; - dbgwritewav( output_frame, st_ivas->tc, output, nchan_internal, st_ivas->hDecoderConfig->output_Fs, "res/spar_dec_td_decorr.wav" ); - for ( k = 0; k < nchan_internal; k++ ) - { - char filename[100]; - sprintf( filename, "res/spar_dec__tdcorr_%d.dat", k ); - dbgwrite( st_ivas->tc[k], sizeof( float ), output_frame, 1, filename ); - } - } -#endif } @@ -1314,9 +1276,6 @@ void ivas_spar_dec_upmixer( /* Dump audio signal after ivas_agc_dec_process */ ivas_spar_dump_signal_wav( output_frame, NULL, output, st_ivas->nchan_transport, spar_foa_dec_wav[1], "ivas_agc_dec_process()" ); #endif -#ifdef DEBUG_MODE_JBM - dbgwritewav( output_frame, NULL, output, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, "res/spar_dec_agc_process.wav" ); -#endif #endif /*---------------------------------------------------------------------* * TD Decorr and pcm ingest @@ -1350,18 +1309,6 @@ void ivas_spar_dec_upmixer( #ifdef DEBUG_SBA_AUDIO_DUMP /* Dump audio signal after ivas_pca_dec */ ivas_spar_dump_signal_wav( output_frame, NULL, output, num_in_ingest, spar_foa_dec_wav[2], "ivas_pca_dec()" ); -#endif -#ifdef DEBUG_MODE_JBM - dbgwritewav( output_frame, NULL, output, num_in_ingest, st_ivas->hDecoderConfig->output_Fs, "res/spar_pca_dec.wav" ); - { - int k; - for ( k = 0; k < num_in_ingest; k++ ) - { - char filename[100]; - sprintf( filename, "res/spar_pca_dec_%d.dat", k ); - dbgwrite( output[k], sizeof( float ), output_frame, 1, filename ); - } - } #endif } #endif @@ -1378,18 +1325,6 @@ void ivas_spar_dec_upmixer( { mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], output[nchan_internal - 1 - i], output_frame ); } -#ifdef DEBUG_MODE_JBM - dbgwritewav( output_frame, NULL, output, nchan_internal, st_ivas->hDecoderConfig->output_Fs, "res/spar_dec_td_decorr.wav" ); - { - int k; - for ( k = 0; k < nchan_internal; k++ ) - { - char filename[100]; - sprintf( filename, "res/spar_dec__tdcorr_%d.dat", k ); - dbgwrite( output[k], sizeof( float ), output_frame, 1, filename ); - } - } -#endif } #endif hSpar->hFbMixer->fb_cfg->num_in_chans = num_in_ingest; @@ -1452,27 +1387,6 @@ void ivas_spar_dec_upmixer( ivas_spar_dump_signal_wav( output_frame, NULL, output, numch_in, spar_foa_dec_wav[4], "ivas_spar_upmixer()" ); #endif #endif -#ifdef DEBUG_MODE_JBM - { - - int k; -#ifdef JBM_TSM_ON_TCS - dbgwritewav( output_frame, p_tc, output, numch_in, st_ivas->hDecoderConfig->output_Fs, "res/spar_cldfb_input.wav" ); -#else - dbgwritewav( output_frame, NULL, output, numch_in, st_ivas->hDecoderConfig->output_Fs, "res/spar_cldfb_input.wav" ); -#endif - for ( k = 0; k < numch_in; k++ ) - { - char filename[100]; - sprintf( filename, "res/spar_upmixer_in_%d.dat", k ); -#ifdef JBM_TSM_ON_TCS - dbgwrite( p_tc[k], sizeof( float ), output_frame, 1, filename ); -#else - dbgwrite( output[k], sizeof( float ), output_frame, 1, filename ); -#endif - } - } -#endif #ifndef JBM_TSM_ON_TCS for ( int16_t i_sf = 0; i_sf < MAX_PARAM_SPATIAL_SUBFRAMES; i_sf++ ) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index b3767b3556..4b59d4d3c5 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -594,10 +594,6 @@ ivas_error IVAS_DEC_EnableVoIP( } #ifdef VARIABLE_SPEED_DECODING } - if ( ( error = JB4_Init( hIvasDec->hVoIP->hJBM, jbmSafetyMargin ) ) != IVAS_ERR_OK ) - { - return error; - } #endif #ifndef JBM_TSM_ON_TCS if ( hDecoderConfig->output_Fs == 8000 ) @@ -639,6 +635,8 @@ ivas_error IVAS_DEC_EnableVoIP( { return IVAS_ERR_INIT_ERROR; } + /* we instantly need a new frame */ + hIvasDec->hVoIP->needNewFrame = true; } #else diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 17969865e9..78f49da735 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -504,9 +504,7 @@ void ivas_dirac_dec_binaural( } #endif -#ifdef DEBUG_MODE_JBM - dbgwritewav( st_ivas->hDirAC->slot_size * 16, NULL, output_f, nchan_transport, st_ivas->hDecoderConfig->output_Fs, "res/dirac_dec_binaural_tc.wav" ); -#endif + if ( st_ivas->hDiracDecBin->useTdDecorr ) { float *decorr_signal[BINAURAL_CHANNELS]; @@ -529,9 +527,6 @@ void ivas_dirac_dec_binaural( } #else ivas_td_decorr_process( st_ivas->hDiracDecBin->hTdDecorr, output_f, decorr_signal, output_frame ); -#endif -#ifdef DEBUG_MODE_JBM - dbgwritewav( st_ivas->hDirAC->slot_size * 16, decorr_signal, output_f, BINAURAL_CHANNELS, st_ivas->hDecoderConfig->output_Fs, "res/dirac_dec_binaural_tddecorr.wav" ); #endif } #ifdef JBM_TSM_ON_TCS @@ -540,9 +535,6 @@ void ivas_dirac_dec_binaural( Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; st_ivas->hTcBuffer->tc[nchan_transport] = &cng_td_buffer[0]; generate_masking_noise_lb_dirac( st->hFdCngDec->hFdCngCom, st_ivas->hTcBuffer->tc[nchan_transport], DEFAULT_JBM_CLDFB_TIMESLOTS, st->cna_dirac_flag && st->flag_cna ); -#ifdef DEBUG_MODE_JBM - dbgwritewav( st->hFdCngDec->hFdCngCom->frameSize, &( st_ivas->hTcBuffer->tc[nchan_transport] ), output_f, 1, st->hFdCngDec->hFdCngCom->frameSize * FRAMES_PER_SEC, "res/dirac_dec_binaural_cng.wav" ); -#endif } #endif @@ -551,15 +543,7 @@ void ivas_dirac_dec_binaural( uint8_t subframe; for ( subframe = 0; subframe < MAX_PARAM_SPATIAL_SUBFRAMES; subframe++ ) { -#ifdef DEBUG_JBM - ivas_dirac_dec_binaural_internal_sf( st_ivas, p_output, nchan_transport ); - for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - p_output[ch] += n_samples_sf; - } -#else ivas_dirac_dec_binaural_internal( st_ivas, output_f, nchan_transport, subframe, 1u ); -#endif } } else @@ -870,18 +854,7 @@ static void ivas_dirac_dec_binaural_internal( slot, st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->hSCE[0]->hCoreCoder[0]->flag_cna, ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA || st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 ) && ( st_ivas->hSCE[0]->hCoreCoder[0]->cng_type == FD_CNG ) && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ); -#ifdef DEBUG_MODE_JBM - if ( slot == 0 ) - { -#ifdef JBM_TSM_ON_TCS - dbgwritewav( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->frameSize, &( st_ivas->tc[nchan_transport] ), output_f, 1, st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->frameSize * FRAMES_PER_SEC, "res/dirac_dec_binaural_cng.wav" ); -#else - float *tc[1]; - tc[0] = &( output_f[1][L_FRAME48k - L_FRAME16k] ); - dbgwritewav( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->frameSize, tc, output_f, 1, st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->frameSize * FRAMES_PER_SEC, "res/dirac_dec_binaural_cng.wav" ); -#endif - } -#endif + /* LB: Copy first channel + LB-CNG to first and second channels with same scaling (dual-mono)*/ for ( b = 0; b < numCoreBands; b++ ) { diff --git a/scripts/switchPaths/sw_13k2_256k.bin b/scripts/switchPaths/sw_13k2_256k.bin new file mode 100644 index 0000000000..1d0c3fac28 --- /dev/null +++ b/scripts/switchPaths/sw_13k2_256k.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:05fd8870e43b0eb349d5e9b3bb939574b71d3e7630940a10d6767cae2c6c4a3c +size 60000 diff --git a/scripts/switchPaths/sw_16k4_256k.bin b/scripts/switchPaths/sw_16k4_256k.bin new file mode 100644 index 0000000000..47bc9c9aa3 --- /dev/null +++ b/scripts/switchPaths/sw_16k4_256k.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7dedd5a20cbc5594ec869b13b3e9774efd6394ad5d5b64a4e98210447c3a75ba +size 60000 diff --git a/scripts/switchPaths/sw_24k4_256k_1.bin b/scripts/switchPaths/sw_24k4_256k_1.bin new file mode 100644 index 0000000000..e285261926 --- /dev/null +++ b/scripts/switchPaths/sw_24k4_256k_1.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bf5b303299209bdd4f7e007d1190c7957b17ab3ee399570f1bb87d27f3fec092 +size 60000 diff --git a/scripts/switchPaths/sw_32k_256k.bin b/scripts/switchPaths/sw_32k_256k.bin new file mode 100644 index 0000000000..46b1e17cd4 --- /dev/null +++ b/scripts/switchPaths/sw_32k_256k.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:61dacf79a7582edb83c151c300392efb719f08762a963da29f9b7665305a8c5f +size 60000 -- GitLab From 66fbb204deda4c371c3c21b1a718c23397129067 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Wed, 26 Apr 2023 17:17:34 +0200 Subject: [PATCH 075/331] fixed several bugs, mainly for SBA JBM, ISM JBM --- Workspace_msvc/lib_dec.vcxproj.filters | 3 ++ lib_dec/ivas_dec.c | 2 +- lib_dec/ivas_ism_dec.c | 4 +-- lib_dec/ivas_ism_param_dec.c | 39 +++++++++++++++----------- lib_dec/ivas_jbm_dec.c | 2 -- lib_dec/ivas_masa_dec.c | 9 ++++-- lib_dec/ivas_sba_dec.c | 24 +++++++++++----- lib_dec/ivas_spar_decoder.c | 15 ++++++++-- 8 files changed, 66 insertions(+), 32 deletions(-) diff --git a/Workspace_msvc/lib_dec.vcxproj.filters b/Workspace_msvc/lib_dec.vcxproj.filters index d1dedc413c..b5b7bd9e5b 100644 --- a/Workspace_msvc/lib_dec.vcxproj.filters +++ b/Workspace_msvc/lib_dec.vcxproj.filters @@ -518,6 +518,9 @@ dec_ivas_c + + dec_ivas_c + diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index c126d1243d..b44ddf262b 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -411,7 +411,7 @@ ivas_error ivas_dec( ivas_sba_mix_matrix_determiner( st_ivas->hSpar, output, st_ivas->bfi, nchan_remapped, output_frame ); } #ifdef JBM_TSM_ON_TCS - else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) + else if ( st_ivas->sba_mode == SBA_MODE_SPAR && st_ivas->renderer_type != RENDERER_DISABLE ) { ivas_spar_dec_agc_pca( st_ivas, output, output_frame ); } diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index 15bdc3de97..cc8eb94cea 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -133,7 +133,7 @@ static ivas_error ivas_ism_bitrate_switching( if ( st_ivas->hDecoderConfig->voip_active ) { /* transfer subframe info from DirAC or ParamMC to central tc buffer */ - if ( last_ism_mode == ISM_MODE_PARAM && st_ivas->hDirAC != NULL ) + if ( last_ism_mode == ISM_MODE_PARAM && st_ivas->hDirAC != NULL && (st_ivas->renderer_type != RENDERER_MONO_DOWNMIX && st_ivas->renderer_type != RENDERER_DISABLE) ) { st_ivas->hTcBuffer->nb_subframes = st_ivas->hDirAC->nb_subframes; st_ivas->hTcBuffer->subframes_rendered = st_ivas->hDirAC->subframes_rendered; @@ -311,7 +311,7 @@ static ivas_error ivas_ism_bitrate_switching( tc_nchan_allocate_new = 2 * BINAURAL_CHANNELS; tc_nchan_full_new = tc_nchan_allocate_new; } - if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + if ( st_ivas->ism_mode == ISM_MODE_PARAM && (st_ivas->renderer_type != RENDERER_MONO_DOWNMIX && st_ivas->renderer_type != RENDERER_DISABLE) ) { tc_nchan_full_new = 0; } diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index 16988f05aa..e13b7e70d2 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -795,28 +795,35 @@ ivas_error ivas_param_ism_dec_open( st_ivas->hISMDTX.dtx_flag = 0; st_ivas->hDirAC = hDirAC; - + hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc = NULL; + hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc = NULL; #ifdef JBM_TSM_ON_TCS - if ( st_ivas->hDecoderConfig->voip_active && st_ivas->renderer_type != RENDERER_MONO_DOWNMIX ) - { - int16_t nchan_transport = st_ivas->nchan_transport; - hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc = (float *) malloc( MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hDirAC->num_freq_bands * sizeof( float ) ); - set_zero( hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc, MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hDirAC->num_freq_bands ); - hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc = (float *) malloc( MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hDirAC->num_freq_bands * sizeof( float ) ); - set_zero( hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc, MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hDirAC->num_freq_bands ); - if ( st_ivas->hTcBuffer == NULL ) + if ( st_ivas->hDecoderConfig->voip_active && st_ivas->hTcBuffer == NULL ) + { + if ( st_ivas->renderer_type != RENDERER_MONO_DOWNMIX && st_ivas->renderer_type != RENDERER_DISABLE ) { - if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, nchan_transport, nchan_transport, 0, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + int16_t nchan_transport = st_ivas->nchan_transport; + hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc = (float *) malloc( MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hDirAC->num_freq_bands * sizeof( float ) ); + set_zero( hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc, MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hDirAC->num_freq_bands ); + hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc = (float *) malloc( MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hDirAC->num_freq_bands * sizeof( float ) ); + set_zero( hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc, MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hDirAC->num_freq_bands ); + if ( st_ivas->hTcBuffer == NULL ) + { + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, nchan_transport, nchan_transport, 0, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else + { + int16_t nchan_to_allocate = st_ivas->hDecoderConfig->nchan_out; + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_BUFFER, nchan_to_allocate, nchan_to_allocate, nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) { return error; } } } - else - { - hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc = NULL; - hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc = NULL; - } #endif pop_wmops(); @@ -1167,7 +1174,7 @@ void ivas_param_ism_dec( /* Compute mixing matrix */ #ifdef JBM_TSM_ON_TCS - ivas_param_ism_compute_mixing_matrix( st_ivas->nchan_ism,hDirAC, st_ivas->hISMDTX, direct_response, nchan_transport, nchan_out_woLFE, cx_diag, ref_power, mixing_matrix ); + ivas_param_ism_compute_mixing_matrix( st_ivas->nchan_ism, hDirAC, st_ivas->hISMDTX, direct_response, nchan_transport, nchan_out_woLFE, cx_diag, ref_power, mixing_matrix ); #else ivas_param_ism_compute_mixing_matrix( st_ivas->nchan_ism, hDirAC, st_ivas->hISMDTX, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, direct_response, nchan_transport, nchan_out_woLFE, 0, CLDFB_NO_COL_MAX, mixing_matrix ); #endif diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index b579c10c96..3f4cb18b1a 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -478,9 +478,7 @@ ivas_error ivas_jbm_dec_tc( if ( !st_ivas->bfi ) /* do not update if first frame(s) are lost or NO_DATA */ { st_ivas->hDecoderConfig->last_ivas_total_brate = ivas_total_brate; -#ifdef SBA_BR_SWITCHING st_ivas->last_active_ivas_total_brate = ( ivas_total_brate <= IVAS_SID_5k2 ) ? st_ivas->last_active_ivas_total_brate : ivas_total_brate; -#endif } if ( st_ivas->ini_frame < MAX_FRAME_COUNTER && !( st_ivas->bfi && st_ivas->ini_frame == 0 ) ) /* keep "st_ivas->ini_frame = 0" until first good received frame */ diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 549cf48932..af4997f25c 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -377,9 +377,14 @@ ivas_error ivas_masa_dec_open( { int16_t nchan_to_allocate; error; - + TC_BUFFER_MODE buffer_mode; + buffer_mode = TC_BUFFER_MODE_RENDERER; + if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO ) + { + buffer_mode = TC_BUFFER_MODE_BUFFER; + } nchan_to_allocate = ivas_jbm_dec_get_num_tc_channels( st_ivas ); - if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, nchan_to_allocate, nchan_to_allocate, nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, buffer_mode, nchan_to_allocate, nchan_to_allocate, nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 098a90aed7..80ab861055 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -383,18 +383,28 @@ ivas_error ivas_sba_dec_reconfigure( TC_BUFFER_MODE tc_buffer_mode; int16_t sba_order_internal; - sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); - tc_buffer_mode = TC_BUFFER_MODE_RENDERER; tc_nchan_tc = ivas_jbm_dec_get_num_tc_channels( st_ivas ); - - tc_nchan_to_allocate = ivas_sba_get_nchan_metadata( sba_order_internal ); - tc_nchan_tc = st_ivas->nchan_transport; tc_nchan_to_allocate = tc_nchan_tc; - if ( st_ivas->nchan_transport == 1 && ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) || ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) ) + if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO ) { - tc_nchan_to_allocate++; /* we need a channel for the CNG in this case*/ + tc_buffer_mode = TC_BUFFER_MODE_BUFFER; + tc_nchan_tc = st_ivas->hDecoderConfig->nchan_out; + tc_nchan_to_allocate = tc_nchan_tc; } + else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) + { + sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); + tc_nchan_to_allocate = ivas_sba_get_nchan_metadata( sba_order_internal ); + } + else + { + if ( st_ivas->nchan_transport == 1 && ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) || ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) ) + { + tc_nchan_to_allocate++; /* we need a channel for the CNG in this case*/ + } + } + if ( tc_nchan_tc != st_ivas->hTcBuffer->nchan_transport_jbm || tc_nchan_to_allocate != st_ivas->hTcBuffer->nchan_transport_internal || tc_buffer_mode != st_ivas->hTcBuffer->tc_buffer_mode ) { if ( ( error = ivas_jbm_dec_tc_buffer_reconfigure( st_ivas, tc_buffer_mode, tc_nchan_tc, tc_nchan_to_allocate, tc_nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 52cfc7910b..6ac368ee0f 100644 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -193,8 +193,19 @@ ivas_error ivas_spar_dec_open( if ( st_ivas->hDecoderConfig->voip_active == 1 && st_ivas->hTcBuffer == NULL && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && st_ivas->renderer_type != RENDERER_STEREO_PARAMETRIC ) { int16_t nchan_to_allocate; - nchan_to_allocate = num_channels_internal; /*st_ivas->nchan_transport;*/ - if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, ivas_jbm_dec_get_num_tc_channels( st_ivas ), nchan_to_allocate,nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + int16_t nchan_tc; + TC_BUFFER_MODE buffer_mode; + + buffer_mode = TC_BUFFER_MODE_RENDERER; + nchan_tc = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + nchan_to_allocate = num_channels_internal; + if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO ) + { + buffer_mode = TC_BUFFER_MODE_BUFFER; + nchan_tc = st_ivas->hDecoderConfig->nchan_out; + nchan_to_allocate = nchan_tc; + } + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, buffer_mode, nchan_tc, nchan_to_allocate, nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) { return error; } -- GitLab From 7297642cbf9fb5b70b65ad35107dbf04ff383602 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Thu, 27 Apr 2023 10:50:59 +0200 Subject: [PATCH 076/331] fixed asan,msan problems, clang format, fixed Linux compiler warnings --- apps/decoder.c | 2 +- lib_com/fd_cng_com.c | 2 +- lib_com/ivas_stat_com.h | 2 +- lib_com/ivas_tools.c | 4 +-- lib_com/options.h | 4 +-- lib_debug/sba_debug.c | 4 +-- lib_dec/fd_cng_dec.c | 1 - lib_dec/ivas_dirac_dec.c | 4 +++ lib_dec/ivas_dirac_output_synthesis_dec.c | 2 +- lib_dec/ivas_ism_dec.c | 10 +++++-- lib_dec/ivas_ism_param_dec.c | 10 +++---- lib_dec/ivas_jbm_dec.c | 27 ++++++------------- lib_dec/ivas_masa_dec.c | 1 - lib_dec/ivas_mc_param_dec.c | 11 -------- lib_dec/ivas_mct_dec.c | 7 +++++ lib_dec/ivas_objectRenderer_internal.c | 8 +++--- lib_dec/ivas_out_setup_conversion.c | 4 +-- lib_dec/ivas_sba_dec.c | 2 +- lib_dec/ivas_spar_decoder.c | 14 ++++++---- lib_dec/ivas_stat_dec.h | 2 +- lib_dec/jbm_jb4sb.h | 2 +- lib_dec/jbm_pcmdsp_similarityestimation.h | 28 +++++++++----------- lib_dec/lib_dec.c | 10 +++---- lib_rend/ivas_crend.c | 1 - lib_rend/ivas_dirac_dec_binaural_functions.c | 4 +-- lib_rend/ivas_limiter.c | 10 +++---- lib_rend/ivas_reverb.c | 6 ++--- lib_rend/ivas_rotation.c | 20 +++++++------- lib_util/tinywaveout_c.h | 2 +- lib_util/tsm_scale_file_reader.c | 4 +-- 30 files changed, 95 insertions(+), 113 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 05b8862735..f2134a29f4 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -2890,7 +2890,7 @@ cleanup: AudioFileWriter_close( &afWriter ); MasaFileWriter_close( &masaWriter ); - TsmScaleFileReader_close( &tsmScaleFileReader ); + TsmScaleFileReader_close( &tsmScaleFileReader ); for ( i = 0; i < IVAS_MAX_NUM_OBJECTS; i++ ) { IsmFileWriter_close( &ismWriters[i] ); diff --git a/lib_com/fd_cng_com.c b/lib_com/fd_cng_com.c index 6cb2e014ba..99ae9894f4 100644 --- a/lib_com/fd_cng_com.c +++ b/lib_com/fd_cng_com.c @@ -998,7 +998,7 @@ void SynthesisSTFT_dirac( /* update and window olapBuf if we have a output frame that is shorter than the default frame size...*/ if ( samples_out < hFdCngCom->frameSize ) { - mvr2r( olapBuffer + samples_out, olapBuffer + hFdCngCom->frameSize, 3 * hFdCngCom->frameSize / 4 ); + mvr2r( olapBuffer + samples_out, olapBuffer + hFdCngCom->frameSize, 3 * hFdCngCom->frameSize / 4 ); } for ( i = 5 * hFdCngCom->frameSize / 4; i < 7 * hFdCngCom->frameSize / 4; i++ ) { diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index 80f564e54a..3c9b59df42 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -689,7 +689,7 @@ typedef struct ivas_td_decorr_state_t int16_t num_apd_outputs; int16_t num_apd_sections; int16_t ducking_flag; - + #ifdef JBM_TSM_ON_TCS int16_t offset; #endif diff --git a/lib_com/ivas_tools.c b/lib_com/ivas_tools.c index e348d8a241..ce4abafeb5 100644 --- a/lib_com/ivas_tools.c +++ b/lib_com/ivas_tools.c @@ -173,10 +173,10 @@ uint32_t ivas_syn_output( /*! r: number of clipped samples */ void ivas_syn_output_f( - float *synth[], /* i/o: float synthesis signal */ + float *synth[], /* i/o: float synthesis signal */ const int16_t output_frame, /* i : output frame length (one channel) */ const int16_t n_channels, /* i : number of output channels */ - float *synth_out /* o : integer 16 bits synthesis signal */ + float *synth_out /* o : integer 16 bits synthesis signal */ ) { int16_t i, n; diff --git a/lib_com/options.h b/lib_com/options.h index 935cc1f33e..df74f066f3 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -112,7 +112,7 @@ /*#define TDREND_HRTF_TABLE_METHODS*/ /* Enable HRTF lookup from tables, for testing & evaluation. Supply file in table format to use. Note that a suitable HR filter lookup method should be written if the filters sample point grids are not in the formats. */ /*#define TDREND_STANDALONE*/ /* Used when renderer is built in standalone form, without IVAS encoding/decoding (see scripts/object_renderer_standalone). This is just here to ensure this is cleaned out by prepare_instrumentation.sh */ -#define DEBUG_SBA /* debug DIRAC/SPAR in-out */ +/*#define DEBUG_SBA */ /* debug DIRAC/SPAR in-out */ #ifdef DEBUG_SBA /*#define DEBUG_SBA_AUDIO_DUMP */ /* SBA intermediate audio wav file dumping */ /*#define DEBUG_SBA_MD_DUMP*/ /* SBA metadata and variable file dumping */ @@ -148,7 +148,7 @@ #define FIX_419_ISM_MD_FIX /* VA: Issue 419: fix the upper value limitation for parameter angle1_diff_cnt */ #define SNS_MSVQ /* FhG: contribution 33 - MSVQ for SNS parameters at stereo mid bitrates */ -#define FIX_XXX_JBM_FIFO_BUFFER /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ +/*#define FIX_XXX_JBM_FIFO_BUFFER */ /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ #define FIX_379_GAININTP /* Eri: Adds a gain interpolation for directional/distance gain to handle abrupt changes in metadata (Non BE) */ diff --git a/lib_debug/sba_debug.c b/lib_debug/sba_debug.c index 3f9138e47f..73bb630b5f 100644 --- a/lib_debug/sba_debug.c +++ b/lib_debug/sba_debug.c @@ -214,11 +214,11 @@ void ivas_spar_dump_signal_wav( #else if ( ppPcm ) { - tmp_value = roundf(ppPcm[i][j]); + tmp_value = roundf( ppPcm[i][j] ); } else { - tmp_value = roundf(pcm_array[i][j]); + tmp_value = roundf( pcm_array[i][j] ); } #endif if ( tmp_value > MAX16B_FLT ) diff --git a/lib_dec/fd_cng_dec.c b/lib_dec/fd_cng_dec.c index 715fc46452..c8997fa4ee 100644 --- a/lib_dec/fd_cng_dec.c +++ b/lib_dec/fd_cng_dec.c @@ -1950,7 +1950,6 @@ void generate_masking_noise_lb_dirac( } n_samples_out -= hFdCngCom->frameSize; n_samples_start += hFdCngCom->frameSize; - } } diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 1a831d3103..b85120afa1 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -2559,6 +2559,10 @@ void ivas_dirac_dec_render_sf( #endif } } + else + { + set_zero( surCohRatio, hDirAC->num_freq_bands ); + } } if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 1 ) { diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c index 670bd0072b..03c512dfd8 100644 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -847,7 +847,7 @@ void ivas_dirac_dec_output_synthesis_process_slot( /* process other PSDs only slot wise for 4 transport channels */ #if !defined( JBM_TSM_ON_TCS ) || defined( JBM_DIRAC_DEBUG_BE ) #if defined( JBM_DIRAC_DEBUG_BE ) - if ( hDirAC->hConfig->dec_param_estim == TRUE || hDirAC->voip_active == 1) + if ( hDirAC->hConfig->dec_param_estim == TRUE || hDirAC->voip_active == 1 ) #else if ( hDirAC->hConfig->dec_param_estim == TRUE ) #endif diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index 357d8b51ba..04c9504cc1 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -135,7 +135,7 @@ static ivas_error ivas_ism_bitrate_switching( if ( st_ivas->hDecoderConfig->voip_active ) { /* transfer subframe info from DirAC or ParamMC to central tc buffer */ - if ( last_ism_mode == ISM_MODE_PARAM && st_ivas->hDirAC != NULL && (st_ivas->renderer_type != RENDERER_MONO_DOWNMIX && st_ivas->renderer_type != RENDERER_DISABLE) ) + if ( last_ism_mode == ISM_MODE_PARAM && st_ivas->hDirAC != NULL && ( st_ivas->renderer_type != RENDERER_MONO_DOWNMIX && st_ivas->renderer_type != RENDERER_DISABLE ) ) { st_ivas->hTcBuffer->nb_subframes = st_ivas->hDirAC->nb_subframes; st_ivas->hTcBuffer->subframes_rendered = st_ivas->hDirAC->subframes_rendered; @@ -196,6 +196,9 @@ static ivas_error ivas_ism_bitrate_switching( /* close the ISM renderer and reinitialize */ if ( st_ivas->hIsmRendererData != NULL ) { +#ifdef JBM_TSM_ON_TCS + free( st_ivas->hIsmRendererData->interpolator ); +#endif free( st_ivas->hIsmRendererData ); st_ivas->hIsmRendererData = NULL; } @@ -264,6 +267,9 @@ static ivas_error ivas_ism_bitrate_switching( /* Close the ISM renderer */ if ( st_ivas->hIsmRendererData != NULL ) { +#ifdef JBM_TSM_ON_TCS + free( st_ivas->hIsmRendererData->interpolator ); +#endif free( st_ivas->hIsmRendererData ); st_ivas->hIsmRendererData = NULL; } @@ -317,7 +323,7 @@ static ivas_error ivas_ism_bitrate_switching( tc_nchan_allocate_new = 2 * BINAURAL_CHANNELS; tc_nchan_full_new = tc_nchan_allocate_new; } - if ( st_ivas->ism_mode == ISM_MODE_PARAM && (st_ivas->renderer_type != RENDERER_MONO_DOWNMIX && st_ivas->renderer_type != RENDERER_DISABLE) ) + if ( st_ivas->ism_mode == ISM_MODE_PARAM && ( st_ivas->renderer_type != RENDERER_MONO_DOWNMIX && st_ivas->renderer_type != RENDERER_DISABLE ) ) { tc_nchan_full_new = 0; } diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index e13b7e70d2..d82ee7b8dd 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -195,8 +195,8 @@ static void ivas_param_ism_compute_mixing_matrix( float direct_response[MAX_NUM_OBJECTS][PARAM_ISM_MAX_CHAN], const int16_t nchan_transport, const int16_t nchan_out_woLFE, - const float cx_diag[][PARAM_ISM_MAX_DMX], - const float ref_power[], + float cx_diag[][PARAM_ISM_MAX_DMX], + float ref_power[], float mixing_matrix[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_CHAN * PARAM_ISM_MAX_DMX] ) { int16_t band_idx, bin_idx; @@ -815,7 +815,7 @@ ivas_error ivas_param_ism_dec_open( } } } - else + else { int16_t nchan_to_allocate = st_ivas->hDecoderConfig->nchan_out; if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_BUFFER, nchan_to_allocate, nchan_to_allocate, nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) @@ -1378,8 +1378,6 @@ void ivas_param_ism_dec_digest_tc( DIRAC_DEC_HANDLE hDirAC; - IVAS_OUTPUT_SETUP hSetup; - /* Initialization */ hDirAC = st_ivas->hDirAC; assert( hDirAC ); @@ -1399,8 +1397,6 @@ void ivas_param_ism_dec_digest_tc( nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; } - hSetup = st_ivas->hIntSetup; - push_wmops( "ivas_param_ism_dec" ); /* general setup */ diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 3f4cb18b1a..f4b0e3630f 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -520,28 +520,20 @@ ivas_error ivas_jbm_dec_feed_tc_to_renderer( float data_f[MAX_CLDFB_DIGEST_CHANNELS][MAX_JBM_L_FRAME48k]; /* 'float' buffer for transport channels that will be directly converted with the CLDFB */ float *p_data_f[MAX_CLDFB_DIGEST_CHANNELS]; - int16_t nCldfbTs; + int16_t n_render_timeslots; int16_t n; - int16_t nchan_transport; - int32_t ivas_total_brate; - int32_t output_Fs; ivas_error error; - AUDIO_CONFIG output_config; error = IVAS_ERR_OK; push_wmops( "ivas_jbm_dec_feed_tc_to_rendererer" ); - output_Fs = st_ivas->hDecoderConfig->output_Fs; - output_config = st_ivas->hDecoderConfig->output_config; - nchan_transport = st_ivas->hTcBuffer->nchan_transport_jbm; - ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; for ( n = 0; n < MAX_CLDFB_DIGEST_CHANNELS; n++ ) { p_data_f[n] = &data_f[n][0]; } ivas_jbm_dec_copy_tc( st_ivas, nSamplesForRendering, nSamplesResidual, data, p_data_f ); - nCldfbTs = st_ivas->hTcBuffer->n_samples_available / st_ivas->hTcBuffer->n_samples_granularity; + n_render_timeslots = st_ivas->hTcBuffer->n_samples_available / st_ivas->hTcBuffer->n_samples_granularity; if ( st_ivas->hTcBuffer->tc_buffer_mode == TC_BUFFER_MODE_BUFFER ) { @@ -558,12 +550,12 @@ ivas_error ivas_jbm_dec_feed_tc_to_renderer( { if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) { - ivas_dirac_dec_set_md_map( st_ivas, nCldfbTs ); + ivas_dirac_dec_set_md_map( st_ivas, n_render_timeslots ); ivas_param_ism_params_to_masa_param_mapping( st_ivas ); } else if ( st_ivas->renderer_type == RENDERER_PARAM_ISM || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) { - ivas_param_ism_dec_digest_tc( st_ivas, nCldfbTs, p_data_f ); + ivas_param_ism_dec_digest_tc( st_ivas, n_render_timeslots, p_data_f ); } } else /* ISM_MODE_DISC */ @@ -573,7 +565,7 @@ ivas_error ivas_jbm_dec_feed_tc_to_renderer( } else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) { - ivas_sba_dec_digest_tc( st_ivas, nCldfbTs, st_ivas->hTcBuffer->n_samples_available ); + ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); } else if ( st_ivas->ivas_format == MC_FORMAT ) { @@ -583,11 +575,11 @@ ivas_error ivas_jbm_dec_feed_tc_to_renderer( } else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) { - ivas_param_mc_dec_digest_tc( st_ivas, (uint8_t) nCldfbTs, p_data_f ); + ivas_param_mc_dec_digest_tc( st_ivas, (uint8_t) n_render_timeslots, p_data_f ); } else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) { - ivas_sba_dec_digest_tc( st_ivas, nCldfbTs, st_ivas->hTcBuffer->n_samples_available ); + ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); } } @@ -615,9 +607,8 @@ ivas_error ivas_jbm_dec_render( int16_t nchan_transport; float output[MAX_OUTPUT_CHANNELS][L_FRAME48k]; /* 'float' buffer for output synthesis, MAX_OUTPUT_CHANNELS channels */ /* IVAS_fmToDo: buffer can be allocated dynamically based on the actual number of output channels */ int16_t nchan_remapped; - int32_t output_Fs, ivas_total_brate; + int32_t output_Fs; AUDIO_CONFIG output_config; - int16_t nCldfbTs; int16_t nSamplesAskedLocal; ivas_error error; float *p_output[MAX_OUTPUT_CHANNELS]; @@ -635,9 +626,7 @@ ivas_error ivas_jbm_dec_render( nchan_out = st_ivas->hDecoderConfig->nchan_out; nchan_transport = st_ivas->hTcBuffer->nchan_transport_jbm; output_config = st_ivas->hDecoderConfig->output_config; - ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; nSamplesAskedLocal = nSamplesAsked + st_ivas->hTcBuffer->n_samples_discard; - nCldfbTs = nSamplesAskedLocal / NS2SA( output_Fs, CLDFB_SLOT_NS ); for ( n = 0; n < MAX_OUTPUT_CHANNELS; n++ ) { p_output[n] = &output[n][0]; diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index af4997f25c..dbb7e11572 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -376,7 +376,6 @@ ivas_error ivas_masa_dec_open( if ( st_ivas->hDecoderConfig->voip_active == 1 && st_ivas->hTcBuffer == NULL && st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && st_ivas->renderer_type != RENDERER_STEREO_PARAMETRIC ) { int16_t nchan_to_allocate; - error; TC_BUFFER_MODE buffer_mode; buffer_mode = TC_BUFFER_MODE_RENDERER; if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO ) diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index a7e2611225..7767cae99e 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -1414,7 +1414,6 @@ void ivas_param_mc_dec_digest_tc( float real_part, imag_part; /* format converter */ int16_t channel_active[MAX_OUTPUT_CHANNELS]; - uint16_t nchan_out_init; IVAS_OUTPUT_SETUP *hSynthesisOutputSetup; hParamMC = st_ivas->hParamMC; @@ -1425,16 +1424,11 @@ void ivas_param_mc_dec_digest_tc( set_s( channel_active, 0, MAX_CICP_CHANNELS ); nchan_transport = st_ivas->nchan_transport; nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; - nchan_out_init = nchan_out_transport; if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) { nchan_out_cldfb = BINAURAL_CHANNELS; set_s( channel_active, 1, nchan_out_cldfb ); - if ( st_ivas->hHeadTrackData ) - { - nchan_out_init = MAX_INTERN_CHANNELS; - } nchan_out_cov = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; hSynthesisOutputSetup = &st_ivas->hTransSetup; } @@ -1578,7 +1572,6 @@ void ivas_param_mc_dec_render( uint16_t nband_synth, nbands_to_zero; uint16_t nchan_out_init; uint32_t output_Fs; - IVAS_OUTPUT_SETUP *hSynthesisOutputSetup; hParamMC = st_ivas->hParamMC; assert( hParamMC ); @@ -1600,27 +1593,23 @@ void ivas_param_mc_dec_render( nchan_out_init = MAX_INTERN_CHANNELS; } nchan_out_cov = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; - hSynthesisOutputSetup = &st_ivas->hTransSetup; } else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_CLDFB ) { nchan_out_cov = nchan_out_transport; nchan_out_cldfb = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; - hSynthesisOutputSetup = &st_ivas->hTransSetup; } else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) { nchan_out_cov = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; nchan_out_cldfb = nchan_out_cov; set_s( channel_active, 1, nchan_out_cov ); - hSynthesisOutputSetup = &st_ivas->hOutSetup; } else { nchan_out_cov = nchan_out_transport; nchan_out_cldfb = nchan_out_transport; set_s( channel_active, 1, nchan_out_cov ); - hSynthesisOutputSetup = &st_ivas->hTransSetup; } /* set everything to zero that will not be decoded */ diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index 55a68c4475..f979942a9a 100644 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -807,6 +807,7 @@ static ivas_error ivas_mc_dec_reconfig( if ( st_ivas->hDirAC != NULL ) { ivas_dirac_dec_close( &st_ivas->hDirAC ); + vbap_free_data( &( st_ivas->hVBAPdata ) ); } #endif @@ -851,6 +852,8 @@ static ivas_error ivas_mc_dec_reconfig( if ( st_ivas->hDirAC != NULL ) { ivas_dirac_dec_close( &st_ivas->hDirAC ); + + vbap_free_data( &( st_ivas->hVBAPdata ) ); } #endif @@ -1085,6 +1088,10 @@ static ivas_error ivas_mc_dec_reconfig( else if ( st_ivas->renderer_type == RENDERER_DISABLE && st_ivas->hDirAC != NULL ) { ivas_dirac_dec_close( &( st_ivas->hDirAC ) ); + +#ifdef JBM_TSM_ON_TCS + vbap_free_data( &( st_ivas->hVBAPdata ) ); +#endif } } diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index a7c804007d..873c75938a 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -66,13 +66,13 @@ ivas_error ivas_td_binaural_open( *---------------------------------------------------------------------*/ ivas_error ivas_td_binaural_renderer( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ #ifdef JBM_TSM_ON_TCS - float *output[], /* i/o: SCE channels / Binaural synthesis */ + float *output[], /* i/o: SCE channels / Binaural synthesis */ #else float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ #endif - const int16_t output_frame /* i : output frame length */ + const int16_t output_frame /* i : output frame length */ ) { return ivas_td_binaural_renderer_unwrap( @@ -167,4 +167,4 @@ void ObjRenderIVASSubframe( st_ivas->hTcBuffer->subframes_rendered = last_sf; return; } -#endif \ No newline at end of file +#endif diff --git a/lib_dec/ivas_out_setup_conversion.c b/lib_dec/ivas_out_setup_conversion.c index 71b85a1dc9..abd34d9b75 100644 --- a/lib_dec/ivas_out_setup_conversion.c +++ b/lib_dec/ivas_out_setup_conversion.c @@ -467,8 +467,8 @@ void ivas_ls_setup_conversion( Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ const int16_t output_frame, /* i : frame length */ #ifdef JBM_TSM_ON_TCS - float *input[], /* i : LS input/output synthesis signal */ - float *output[] /* i/o: LS input/output synthesis signal */ + float *input[], /* i : LS input/output synthesis signal */ + float *output[] /* i/o: LS input/output synthesis signal */ #else float output[][L_FRAME48k] /* i/o: LS input/output synthesis signal */ #endif diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 80ab861055..c945e3f68b 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -489,7 +489,7 @@ void ivas_sba_dec_render( hSpar = st_ivas->hSpar; sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); nchan_internal = ivas_sba_get_nchan_metadata( sba_order_internal ); - nchan_out = nchan_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; + nchan_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; #ifdef DEBUGGING assert( hSpar ); #endif diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 6ac368ee0f..d3067b0e46 100644 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -1198,15 +1198,18 @@ void ivas_spar_dec_upmixer( float *cldfb_in_ts_im[MAX_OUTPUT_CHANNELS][CLDFB_NO_COL_MAX]; int16_t i, b, ts, out_ch, in_ch; int16_t num_spar_bands, spar_band, nchan_transport; - int16_t num_in_ingest, num_bands_out, split_band; + int16_t num_in_ingest, split_band; #ifdef JBM_TSM_ON_TCS - int16_t output_frame, slot_size, slot_idx_start, slot_idx_start_cldfb; + int16_t slot_size, slot_idx_start; float *p_tc[MAX_OUTPUT_CHANNELS]; int16_t md_idx; #endif float Pcm_tmp[MAX_OUTPUT_CHANNELS][L_FRAME48k]; int16_t numch_out_dirac; +#ifndef JBM_TSM_ON_TCS float *pPcm_tmp[MAX_OUTPUT_CHANNELS]; + int16_t num_bands_out; +#endif float mixer_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; int16_t b_skip_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; DECODER_CONFIG_HANDLE hDecoderConfig; @@ -1220,7 +1223,9 @@ void ivas_spar_dec_upmixer( hSpar = st_ivas->hSpar; hDecoderConfig = st_ivas->hDecoderConfig; +#ifndef JBM_TSM_ON_TCS num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; +#endif nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; num_cldfb_bands = hSpar->hFbMixer->pFb->fb_bin_to_band.num_cldfb_bands; @@ -1229,9 +1234,7 @@ void ivas_spar_dec_upmixer( #ifdef JBM_TSM_ON_TCS slot_size = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); - output_frame = hSpar->subframe_nbslots[hSpar->subframes_rendered] * slot_size; slot_idx_start = hSpar->slots_rendered; - slot_idx_start_cldfb = 0; for ( i = 0; i < nchan_internal; i++ ) { p_tc[i] = st_ivas->hTcBuffer->tc[i] + slot_idx_start * slot_size; @@ -1301,11 +1304,12 @@ void ivas_spar_dec_upmixer( num_in_ingest = nchan_transport; } +#ifndef JBM_TSM_ON_TCS for ( i = 0; i < nchan_internal; i++ ) { pPcm_tmp[i] = Pcm_tmp[i]; } - +#endif /*---------------------------------------------------------------------* * PCA decoder *---------------------------------------------------------------------*/ diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 276959a03b..debc90219e 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -1216,7 +1216,7 @@ typedef struct decoder_tc_buffer_structure int16_t subframes_rendered; int16_t slots_rendered; int16_t num_slots; - int16_t n_samples_discard; /* number of samples to discard from the beginning of the output */ + int16_t n_samples_discard; /* number of samples to discard from the beginning of the output */ } DECODER_TC_BUFFER, *DECODER_TC_BUFFER_HANDLE; #endif /*----------------------------------------------------------------------------------* diff --git a/lib_dec/jbm_jb4sb.h b/lib_dec/jbm_jb4sb.h index a2d85eddb6..7954358595 100644 --- a/lib_dec/jbm_jb4sb.h +++ b/lib_dec/jbm_jb4sb.h @@ -84,7 +84,7 @@ typedef enum JBM_RENDERER_NONE, JBM_RENDERER_IVAS, } JBM_RENDERER_TYPE; -#endif +#endif typedef struct JB4_DATAUNIT *JB4_DATAUNIT_HANDLE; diff --git a/lib_dec/jbm_pcmdsp_similarityestimation.h b/lib_dec/jbm_pcmdsp_similarityestimation.h index 7078580047..44b4fd246a 100644 --- a/lib_dec/jbm_pcmdsp_similarityestimation.h +++ b/lib_dec/jbm_pcmdsp_similarityestimation.h @@ -67,7 +67,7 @@ * ******************************************************************************** */ -float cross_correlation_self( +float cross_correlation_self( #ifdef JBM_TSM_ON_TCS const float *signal, #else @@ -75,8 +75,7 @@ float cross_correlation_self( #endif uint16_t x, uint16_t y, - uint16_t corr_len -); + uint16_t corr_len ); /* ******************************************************************************** @@ -112,8 +111,7 @@ float cross_correlation_subsampled_self( uint16_t x, uint16_t y, uint16_t corr_len, - uint16_t subsampling -); + uint16_t subsampling ); /* ******************************************************************************** @@ -151,28 +149,26 @@ float cross_correlation_subsampled_self( * ******************************************************************************** */ -float normalized_cross_correlation_self( +float normalized_cross_correlation_self( #ifdef JBM_TSM_ON_TCS const float *signal, #else const int16_t *signal, #endif - uint16_t x, - uint16_t y, - uint16_t corr_len, - uint16_t subsampling, - float *energy -); + uint16_t x, + uint16_t y, + uint16_t corr_len, + uint16_t subsampling, + float *energy ); /* Splits the signal into segments and checks if all of them have very low energy. */ -bool isSilence( +bool isSilence( #ifdef JBM_TSM_ON_TCS const float *signal, #else const int16_t *signal, #endif - uint32_t len, - uint32_t segments -); + uint32_t len, + uint32_t segments ); #endif /* JBM_PCMDSP_SIMILARITYESTIMATION_H */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 4b59d4d3c5..33a4ed7526 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -656,7 +656,7 @@ ivas_error IVAS_DEC_EnableVoIP( } #else if ( apa_init( &hIvasDec->hVoIP->hTimeScaler, - hDecoderConfig->nchan_out ) !=IVAS_ERR_OK || + hDecoderConfig->nchan_out ) != IVAS_ERR_OK || apa_set_rate( hIvasDec->hVoIP->hTimeScaler, hDecoderConfig->output_Fs ) != 0 || apa_set_complexity_options( hIvasDec->hVoIP->hTimeScaler, wss, css ) != 0 || apa_set_quality( hIvasDec->hVoIP->hTimeScaler, 1, 4, 4 ) != 0 || @@ -942,7 +942,7 @@ ivas_error IVAS_DEC_RendererFeedTcSamples( IVAS_DEC_HANDLE hIvasDec, /* i/o : IVAS decoder handle */ const int16_t nSamplesForRendering, /* i: : number of TC samples wanted from the renderer */ int16_t *nSamplesResidual, /* o: : number of samples not fitting into the renderer grid and buffer for the next call*/ - float *pcmBuf /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */ + float *pcmBuf /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */ ) { Decoder_Struct *st_ivas; @@ -2147,7 +2147,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( { if ( pcmdsp_fifo_read( hVoIP->hFifoOut, nSamplesPerChannel, (uint8_t *) pcmBuf ) != 0 ) #else - if ( pcmdsp_fifo_read( hVoIP->hFifoAfterTimeScaler, nSamplesPerChannel, (uint8_t *) pcmBuf ) != 0 ) +if ( pcmdsp_fifo_read( hVoIP->hFifoAfterTimeScaler, nSamplesPerChannel, (uint8_t *) pcmBuf ) != 0 ) #endif { return IVAS_ERR_UNKNOWN; @@ -2183,16 +2183,12 @@ ivas_error IVAS_DEC_VoIP_Flush( ) { ivas_error error; - Decoder_Struct *st_ivas; - DECODER_CONFIG_HANDLE hDecoderConfig; IVAS_DEC_VOIP *hVoIP; int16_t rendererPcmBuf[( MAX_OUTPUT_CHANNELS * L_FRAME_MAX * APA_MAX_SCALE ) / 100]; uint16_t nSamplesToRender; uint16_t nSamplesFlushedLocal; error = IVAS_ERR_OK; - st_ivas = hIvasDec->st_ivas; - hDecoderConfig = st_ivas->hDecoderConfig; hVoIP = hIvasDec->hVoIP; #if defined( JBM_TSM_ON_TCS ) *nSamplesFlushed = min( nSamplesPerChannel, hVoIP->nSamplesAvailableNext ); diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index 8dc6fa6783..a7572aea3f 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -1338,4 +1338,3 @@ ivas_error ivas_rend_crendProcessSubframe( return IVAS_ERR_OK; } #endif - diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 78f49da735..78cc924052 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -485,9 +485,7 @@ void ivas_dirac_dec_binaural( #ifdef JBM_TSM_ON_TCS float cng_td_buffer[L_FRAME16k]; float *p_output[MAX_OUTPUT_CHANNELS]; - int16_t ch, n_samples_sf; - - n_samples_sf = JBM_CLDFB_SLOTS_IN_SUBFRAME * st_ivas->hDirAC->slot_size; + int16_t ch; for ( ch = 0; ch < 2 * BINAURAL_CHANNELS; ch++ ) { diff --git a/lib_rend/ivas_limiter.c b/lib_rend/ivas_limiter.c index 17c5a94ff8..7875165e51 100644 --- a/lib_rend/ivas_limiter.c +++ b/lib_rend/ivas_limiter.c @@ -171,15 +171,15 @@ void ivas_limiter_close( *-------------------------------------------------------------------*/ void ivas_limiter_dec( - IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ + IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ #ifdef JBM_TSM_ON_TCS - float *output[MAX_OUTPUT_CHANNELS], /* i/o: input/output buffer */ + float *output[MAX_OUTPUT_CHANNELS], /* i/o: input/output buffer */ #else float output[MAX_OUTPUT_CHANNELS][L_FRAME48k], /* i/o: input/output buffer */ #endif - const int16_t num_channels, /* i : number of channels to be processed */ - const int16_t output_frame, /* i : number of samples per channel in the buffer */ - const int16_t BER_detect /* i : BER detect flag */ + const int16_t num_channels, /* i : number of channels to be processed */ + const int16_t output_frame, /* i : number of samples per channel in the buffer */ + const int16_t BER_detect /* i : BER detect flag */ ) { int16_t c; diff --git a/lib_rend/ivas_reverb.c b/lib_rend/ivas_reverb.c index 7239f4825b..3975a74559 100644 --- a/lib_rend/ivas_reverb.c +++ b/lib_rend/ivas_reverb.c @@ -1587,10 +1587,10 @@ ivas_error ivas_reverb_process( float *pcm_in[], /* i : the PCM audio to apply reverb on */ float *pcm_out[], /* o : the PCM audio with reverb applied */ #else - float pcm_in[][L_FRAME48k], /* i : the PCM audio to apply reverb on */ - float pcm_out[][L_FRAME48k], /* o : the PCM audio with reverb applied */ + float pcm_in[][L_FRAME48k], /* i : the PCM audio to apply reverb on */ + float pcm_out[][L_FRAME48k], /* o : the PCM audio with reverb applied */ #endif - const int16_t i_ts /* i : subframe index */ + const int16_t i_ts /* i : subframe index */ ) { float tmp0[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES], tmp1[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES], tmp2[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; diff --git a/lib_rend/ivas_rotation.c b/lib_rend/ivas_rotation.c index 0736bd4003..3191e943aa 100644 --- a/lib_rend/ivas_rotation.c +++ b/lib_rend/ivas_rotation.c @@ -254,7 +254,7 @@ void rotateFrame_shd( #ifdef JBM_TSM_ON_TCS float *output[], /* i/o: unrotated HOA3 signal buffer in TD */ #else - float output[][L_FRAME48k], /* i/o: unrotated HOA3 signal buffer in TD */ + float output[][L_FRAME48k], /* i/o: unrotated HOA3 signal buffer in TD */ #endif const int16_t subframe_len, /* i : subframe length per channel */ const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ @@ -359,14 +359,14 @@ void rotateFrame_shd( void rotateFrame_sd( HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ #ifdef JBM_TSM_ON_TCS - float *output[], /* i/o: unrotated SD signal buffer in TD */ + float *output[], /* i/o: unrotated SD signal buffer in TD */ #else - float output[][L_FRAME48k], /* i/o: unrotated SD signal buffer in TD */ -#endif - const int16_t subframe_len, /* i : subframe length per channel */ - const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ - const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ - const int16_t subframe_idx /* i : subframe index */ + float output[][L_FRAME48k], /* i/o: unrotated SD signal buffer in TD */ +#endif + const int16_t subframe_len, /* i : subframe length per channel */ + const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ + const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ + const int16_t subframe_idx /* i : subframe index */ ) { int16_t i, j; @@ -602,9 +602,9 @@ void rotateFrame_sd_cldfb( const IVAS_OUTPUT_SETUP_HANDLE hOutputSetup, /* i : output format setup number of channels */ const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ #ifdef JBM_TSM_ON_TCS - const int16_t numTimeSlots, /* i : number of time slots to process */ + const int16_t numTimeSlots, /* i : number of time slots to process */ #endif - const int16_t nb_band /* i : number of CLDFB bands to process */ + const int16_t nb_band /* i : number of CLDFB bands to process */ ) { int16_t iBlock, iBand, m, n; diff --git a/lib_util/tinywaveout_c.h b/lib_util/tinywaveout_c.h index aab62a4dd3..b82c0cd131 100644 --- a/lib_util/tinywaveout_c.h +++ b/lib_util/tinywaveout_c.h @@ -517,7 +517,7 @@ static int32_t WriteWavFloat( { if ( self->bps == 32 ) { - err = __WriteSample32( self, sampleBuffer[i]/32768.0f); + err = __WriteSample32( self, sampleBuffer[i] / 32768.0f ); } else { diff --git a/lib_util/tsm_scale_file_reader.c b/lib_util/tsm_scale_file_reader.c index 5c2e51edfa..fbd1824d9d 100644 --- a/lib_util/tsm_scale_file_reader.c +++ b/lib_util/tsm_scale_file_reader.c @@ -86,8 +86,8 @@ TsmScaleFileReader *TsmScaleFileReader_open( *---------------------------------------------------------------------*/ ivas_error TsmScaleFileReader_readScale( - TsmScaleFileReader *self, /* i/o: TsmScaleFileReader handle */ - int16_t *scale /* o : scale */ + TsmScaleFileReader *self, /* i/o: TsmScaleFileReader handle */ + int16_t *scale /* o : scale */ ) { int tmp; -- GitLab From 3d4c2b6f79b4f52ba9f3696e2e0a58c0c3949d46 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Thu, 27 Apr 2023 11:26:14 +0200 Subject: [PATCH 077/331] added missing TC Buffer to dummy decoder struct in the standalone renderer --- lib_rend/lib_rend.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 6ef18946ca..038b083654 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -2458,6 +2458,9 @@ static DecoderDummy *initDecoderDummy( decDummy->hMasa = NULL; decDummy->hDiracDecBin = NULL; decDummy->hQMetaData = NULL; +#ifdef JBM_TSM_ON_TCS + decDummy->hTcBuffer = NULL; +#endif decDummy->hDecoderConfig->output_config = getIvasAudioConfigFromRendAudioConfig( outConfig ); decDummy->nchan_transport = numTransChannels; @@ -2494,6 +2497,11 @@ static DecoderDummy *initDecoderDummy( decDummy->hRenderConfig = NULL; } +#ifdef JBM_TSM_ON_TCS + /* get a default TC buffer, needed for some renderers */ + ivas_jbm_dec_tc_buffer_open( decDummy, TC_BUFFER_MODE_NONE, 0, 0, 0, 1 ); +#endif + decDummy->renderer_type = RENDERER_DISABLE; return decDummy; @@ -2601,6 +2609,11 @@ static void freeDecoderDummy( /* Parametric binaural renderer handle */ ivas_dirac_dec_close_binaural_data( &pDecDummy->hDiracDecBin ); +#ifdef JBM_TSM_ON_TCS + /* TC buffer */ + ivas_jbm_dec_tc_buffer_close( &pDecDummy->hTcBuffer ); +#endif + free( pDecDummy ); pDecDummy = NULL; -- GitLab From 92f6c9b489e2ca898bcec3e93413b806cc3f8c8f Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Thu, 27 Apr 2023 12:08:57 +0200 Subject: [PATCH 078/331] fix renderer msan error, fix ParamMC smoke test issue --- lib_dec/ivas_mc_param_dec.c | 5 +++++ lib_rend/lib_rend.c | 3 +++ 2 files changed, 8 insertions(+) diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index 7767cae99e..89e4d8c136 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -1538,6 +1538,11 @@ void ivas_param_mc_dec_digest_tc( /* generate mixing matrices */ ivas_param_mc_get_mixing_matrices( hParamMC, hSynthesisOutputSetup, cx, hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, nchan_out_transport, hParamMC->synthesis_conf, nchan_transport, nchan_out_cov ); } + + pop_wmops(); + + return; + } /*------------------------------------------------------------------------- diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 038b083654..ad33b7fc86 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -2447,6 +2447,9 @@ static DecoderDummy *initDecoderDummy( decDummy->hDecoderConfig->output_Fs = sampleRate; decDummy->hDecoderConfig->nchan_out = numOutChannels; decDummy->hDecoderConfig->Opt_Headrotation = 0; +#ifdef JBM_TSM_ON_TCS + decDummy->hDecoderConfig->voip_active = 0; +#endif decDummy->hBinRenderer = NULL; decDummy->hEFAPdata = NULL; -- GitLab From 3e3f82233f82564a9d1a5bd211fce0e5cf4261a9 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Thu, 27 Apr 2023 13:21:57 +0200 Subject: [PATCH 079/331] fixed ParamISM open function --- lib_dec/ivas_ism_param_dec.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index d82ee7b8dd..33f094f3b5 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -795,10 +795,8 @@ ivas_error ivas_param_ism_dec_open( st_ivas->hISMDTX.dtx_flag = 0; st_ivas->hDirAC = hDirAC; - hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc = NULL; - hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc = NULL; #ifdef JBM_TSM_ON_TCS - if ( st_ivas->hDecoderConfig->voip_active && st_ivas->hTcBuffer == NULL ) + if ( st_ivas->hDecoderConfig->voip_active ) { if ( st_ivas->renderer_type != RENDERER_MONO_DOWNMIX && st_ivas->renderer_type != RENDERER_DISABLE ) { @@ -817,10 +815,15 @@ ivas_error ivas_param_ism_dec_open( } else { - int16_t nchan_to_allocate = st_ivas->hDecoderConfig->nchan_out; - if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_BUFFER, nchan_to_allocate, nchan_to_allocate, nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc = NULL; + hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc = NULL; + if ( st_ivas->hTcBuffer == NULL ) { - return error; + int16_t nchan_to_allocate = st_ivas->hDecoderConfig->nchan_out; + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_BUFFER, nchan_to_allocate, nchan_to_allocate, nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + { + return error; + } } } } -- GitLab From c288c4c2bd60e4f387287e08f5fdb942d54dfe75 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Thu, 27 Apr 2023 14:02:43 +0200 Subject: [PATCH 080/331] another init fix for ParamISM --- lib_dec/ivas_ism_param_dec.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index 33f094f3b5..1d80767e77 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -827,6 +827,11 @@ ivas_error ivas_param_ism_dec_open( } } } + else + { + hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc = NULL; + hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc = NULL; + } #endif pop_wmops(); -- GitLab From 898cf3cc49b77d8fb16f0aacc78df0a7dde29c4c Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Thu, 27 Apr 2023 14:38:48 +0200 Subject: [PATCH 081/331] another fix for ISM br switching, clang-format --- lib_dec/ivas_ism_dec.c | 8 +++++++- lib_dec/ivas_mc_param_dec.c | 1 - 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index 04c9504cc1..e4c22ebba2 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -83,7 +83,13 @@ static ivas_error ivas_ism_bitrate_switching( nSCE_old = st_ivas->nSCE; #ifdef FIX_416_ISM_BR_SWITCHING - ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); + /* we need to set to the old ism mode here, otherwise we are not getting the correct numbers*/ + { + ISM_MODE new_ism_mode = st_ivas->ism_mode; + st_ivas->ism_mode = last_ism_mode; + ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); + st_ivas->ism_mode = new_ism_mode; + } #endif if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->nchan_ism, NULL, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index 89e4d8c136..eea9bd5b56 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -1542,7 +1542,6 @@ void ivas_param_mc_dec_digest_tc( pop_wmops(); return; - } /*------------------------------------------------------------------------- -- GitLab From 2d9f5839c8c13e9abc76c6658762d63235886439 Mon Sep 17 00:00:00 2001 From: malenov Date: Thu, 27 Apr 2023 14:45:48 +0200 Subject: [PATCH 082/331] fixing incorrect reset of ind_list_metadata[] --- lib_enc/ivas_init_enc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index a9960a445d..8d113adf03 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -384,7 +384,7 @@ ivas_error ivas_init_encoder( /* reset the list of metadata indices */ for ( i = 0; i < st_ivas->ivas_max_num_indices_metadata; i++ ) { - st_ivas->ind_list[i].nb_bits = -1; + st_ivas->ind_list_metadata[i].nb_bits = -1; } #endif -- GitLab From e3dd0bab336be44636abf419f0ac217e2cdbed8f Mon Sep 17 00:00:00 2001 From: malenov Date: Thu, 27 Apr 2023 15:01:43 +0200 Subject: [PATCH 083/331] increase the amount of extra #indices during re-allocation to 100 --- lib_com/bitstream.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index 99d9f17f80..2d51364654 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -63,7 +63,7 @@ FILE *FEC_pattern = NULL; /* FEC pattern file (for simulation of FEC) */ #endif #ifdef IND_LIST_DYN -#define STEP_MAX_NUM_INDICES 20 /* increase the maximum number of allowed indices in the list by this amount */ +#define STEP_MAX_NUM_INDICES 100 /* increase the maximum number of allowed indices in the list by this amount */ #endif #ifndef IND_LIST_DYN @@ -902,7 +902,7 @@ ivas_error move_indices( /*-------------------------------------------------------------------* * check_ind_list_limits() * - * Check, if if the maximum number of indices has been reached -> reallocate + * Check, if the maximum number of indices has been reached -> reallocate * Check, if we will not overwrite an existing indice -> adjust the location *-------------------------------------------------------------------*/ @@ -1020,7 +1020,7 @@ ivas_error push_indice( #endif #ifdef IND_LIST_DYN - /* check the limits in the list of indices */ + /* check the limits of the list of indices */ error = check_ind_list_limits( hBstr ); #endif @@ -1143,7 +1143,7 @@ ivas_error push_next_indice( #endif #ifdef IND_LIST_DYN - /* check the limits in the list of indices */ + /* check the limits of the list of indices */ error = check_ind_list_limits( hBstr ); #endif @@ -1233,7 +1233,7 @@ void push_next_bits( code = (uint16_t) ( ( bits[i] << 15 ) | ( ( bits[i + 1] << 14 ) | ( ( bits[i + 2] << 13 ) | ( ( bits[i + 3] << 12 ) | ( ( bits[i + 4] << 11 ) | ( ( bits[i + 5] << 10 ) | ( ( bits[i + 6] << 9 ) | ( ( bits[i + 7] << 8 ) | ( ( bits[i + 8] << 7 ) | ( ( bits[i + 9] << 6 ) | ( ( bits[i + 10] << 5 ) | ( ( bits[i + 11] << 4 ) | ( ( bits[i + 12] << 3 ) | ( ( bits[i + 13] << 2 ) | ( ( bits[i + 14] << 1 ) | bits[i + 15] ) ) ) ) ) ) ) ) ) ) ) ) ) ) ); #ifdef IND_LIST_DYN - /* check the limits in the list of indices */ + /* check the limits of the list of indices */ check_ind_list_limits( hBstr ); ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; #endif @@ -1253,7 +1253,7 @@ void push_next_bits( for ( ; i < nb_bits; ++i ) { #ifdef IND_LIST_DYN - /* check the limits in the list of indices */ + /* check the limits of the list of indices */ check_ind_list_limits( hBstr ); ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; #endif -- GitLab From f475b4ea795565e4649e79408a11fb0c5a8ff9d6 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Thu, 27 Apr 2023 15:16:36 +0200 Subject: [PATCH 084/331] add correct bit rate switch profiles for ISM --- scripts/config/ivas_modes.json | 26 +++++++++++++------------- scripts/switchPaths/sw_13k2_128k.bin | 3 +++ scripts/switchPaths/sw_16k4_128k.bin | 3 +++ scripts/switchPaths/sw_24k4_384k.bin | 3 +++ scripts/switchPaths/sw_24k4_512k.bin | 3 +++ scripts/switchPaths/sw_32k_128k.bin | 3 +++ scripts/switchPaths/sw_32k_384k.bin | 3 +++ scripts/switchPaths/sw_32k_512k.bin | 3 +++ 8 files changed, 34 insertions(+), 13 deletions(-) create mode 100644 scripts/switchPaths/sw_13k2_128k.bin create mode 100644 scripts/switchPaths/sw_16k4_128k.bin create mode 100644 scripts/switchPaths/sw_24k4_384k.bin create mode 100644 scripts/switchPaths/sw_24k4_512k.bin create mode 100644 scripts/switchPaths/sw_32k_128k.bin create mode 100644 scripts/switchPaths/sw_32k_384k.bin create mode 100644 scripts/switchPaths/sw_32k_512k.bin diff --git a/scripts/config/ivas_modes.json b/scripts/config/ivas_modes.json index a4f9ef7fc6..77f87a2a39 100644 --- a/scripts/config/ivas_modes.json +++ b/scripts/config/ivas_modes.json @@ -1945,20 +1945,20 @@ "table_name": "ISM1@{table_bitrate} RS kbps {bandwidth}", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": true, "amr": false, "mono": false, "bitrates": { "wb": { - "all": "{sw_files_path}/sw_13k2_256k.bin" + "all": "{sw_files_path}/sw_13k2_128k.bin" }, "swb": { - "all": "{sw_files_path}/sw_13k2_256k.bin" + "all": "{sw_files_path}/sw_13k2_128k.bin" }, "fb": { - "all": "{sw_files_path}/sw_32k_256k.bin" + "all": "{sw_files_path}/sw_32k_128k.bin" } } }, @@ -2158,7 +2158,7 @@ "table_name": "ISM2@{table_bitrate} kbps RS {bandwidth}", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv.csv" ], "rs": true, "amr": false, @@ -2318,20 +2318,20 @@ "table_name": "ISM3@{table_bitrate} kbps {bandwidth}", "nummetadata": 3, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv.csv" ], "rs": true, "amr": false, "mono": false, "bitrates": { "wb": { - "all": "{sw_files_path}/sw_24k4_256k_1.bin" + "all": "{sw_files_path}/sw_24k4_384k.bin" }, "swb": { - "all": "{sw_files_path}/sw_24k4_256k_1.bin" + "all": "{sw_files_path}/sw_24k4_384k.bin" }, "fb": { - "all": "{sw_files_path}/sw_32k_256k.bin" + "all": "{sw_files_path}/sw_32k_384k.bin" } } } @@ -2484,20 +2484,20 @@ "table_name": "ISM4@{table_bitrate} kbps RS {bandwidth}", "nummetadata": 4, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": true, "amr": false, "mono": false, "bitrates": { "wb": { - "all": "{sw_files_path}/sw_24k4_256k_1.bin" + "all": "{sw_files_path}/sw_24k4_384k.bin" }, "swb": { - "all": "{sw_files_path}/sw_24k4_256k_1.bin" + "all": "{sw_files_path}/sw_24k4_384k.bin" }, "fb": { - "all": "{sw_files_path}/sw_32k_256k.bin" + "all": "{sw_files_path}/sw_32k_384k.bin" } } } diff --git a/scripts/switchPaths/sw_13k2_128k.bin b/scripts/switchPaths/sw_13k2_128k.bin new file mode 100644 index 0000000000..7309ee26ab --- /dev/null +++ b/scripts/switchPaths/sw_13k2_128k.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d9ddf71b27bcd47d5f37abb6c62146ff4fb5a848cd85605d4df87a9cc4b1d1e0 +size 60000 diff --git a/scripts/switchPaths/sw_16k4_128k.bin b/scripts/switchPaths/sw_16k4_128k.bin new file mode 100644 index 0000000000..1e85a18b77 --- /dev/null +++ b/scripts/switchPaths/sw_16k4_128k.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e07f8c6be0e08ed96b15c9a3daa2811ef0b596dc08cc687bce1f0ca8e49969b +size 60000 diff --git a/scripts/switchPaths/sw_24k4_384k.bin b/scripts/switchPaths/sw_24k4_384k.bin new file mode 100644 index 0000000000..781e3023b2 --- /dev/null +++ b/scripts/switchPaths/sw_24k4_384k.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6e3e7599638d3792d851a5bdc13b85d6b401ebc9724795562b1a5d25fc2c3bc6 +size 60000 diff --git a/scripts/switchPaths/sw_24k4_512k.bin b/scripts/switchPaths/sw_24k4_512k.bin new file mode 100644 index 0000000000..dcc58dbdc6 --- /dev/null +++ b/scripts/switchPaths/sw_24k4_512k.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2369edc21bdf3440ceaf21de16698e38cf50c246ddf04878a5961538dded11ad +size 60000 diff --git a/scripts/switchPaths/sw_32k_128k.bin b/scripts/switchPaths/sw_32k_128k.bin new file mode 100644 index 0000000000..fc4b81e0c3 --- /dev/null +++ b/scripts/switchPaths/sw_32k_128k.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fdb0da661cb08cc546c3761afa1d778d2c7aa04df61b608ae4301e31867dcc2e +size 60000 diff --git a/scripts/switchPaths/sw_32k_384k.bin b/scripts/switchPaths/sw_32k_384k.bin new file mode 100644 index 0000000000..088edfacbf --- /dev/null +++ b/scripts/switchPaths/sw_32k_384k.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77f6e7b141b16bd21005c5169cd9bc8b7b2c96df379ce9e74788717c66b9130f +size 60000 diff --git a/scripts/switchPaths/sw_32k_512k.bin b/scripts/switchPaths/sw_32k_512k.bin new file mode 100644 index 0000000000..d385f3a890 --- /dev/null +++ b/scripts/switchPaths/sw_32k_512k.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2a6eb4080fce3bc1a7ba20cfc8ef3e8ff981ebce5de7c8e45bbc12edf7f21d0c +size 60000 -- GitLab From 69eac64a578465065b1bfc2a40e6100404db5956 Mon Sep 17 00:00:00 2001 From: malenov Date: Thu, 27 Apr 2023 15:20:04 +0200 Subject: [PATCH 085/331] add warning message when re-allocating teh buffer of indices to prevent overwriting of existing indice(s) --- lib_com/bitstream.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index 2d51364654..a695f6b95c 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -942,6 +942,10 @@ ivas_error check_ind_list_limits( if ( hBstr->ind_list >= &hBstr->ivas_ind_list_zero[*( hBstr->ivas_max_num_indices )] ) { +#ifdef DEBUGGING + fprintf( stderr, "Warning: The maximum number of indices %d has been exceeded in frame %d! Increase the limits in get_ivas_max_num_indices() or get_max_num_indices_metadata().\n", *( hBstr->ivas_max_num_indices ), frame ); +#endif + /* no available empty slot -> need to re-allocate the buffer */ ind_list_realloc( hBstr, *( hBstr->ivas_max_num_indices ) + STEP_MAX_NUM_INDICES ); } -- GitLab From f8052edad270f91c25c25d5137b6949799462702 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Thu, 27 Apr 2023 15:30:21 +0200 Subject: [PATCH 086/331] fixed MASA RS mode config --- scripts/config/ivas_modes.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/config/ivas_modes.json b/scripts/config/ivas_modes.json index 77f87a2a39..dc2a93be9d 100644 --- a/scripts/config/ivas_modes.json +++ b/scripts/config/ivas_modes.json @@ -1072,7 +1072,7 @@ ] } }, - "MASA_2TC_1DIR_b{bitrate}_{bandwidth}_cbr": { + "MASA_2TC_1DIR_b{bitrate}_{bandwidth}_rs": { "encmodeoption": [ "-masa", "2" @@ -1094,7 +1094,7 @@ "metadatafilenames": [ "{item}.met" ], - "rs": false, + "rs": true, "amr": false, "mono": false, "rs": true, -- GitLab From 66bc1a919a83be34d855b7364b5447e4a6808cea Mon Sep 17 00:00:00 2001 From: emerit Date: Fri, 28 Apr 2023 10:18:11 +0200 Subject: [PATCH 087/331] bugs fixed in renderer configuration --- lib_dec/ivas_binRenderer_internal.c | 12 ++++++++---- lib_rend/ivas_crend.c | 25 ++++++++++++++----------- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index ae3a7064eb..0ceaa31311 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -350,17 +350,14 @@ static ivas_error ivas_binRenderer_convModuleOpen( } else { -#ifdef UPDATE_SBA_FILTER #ifdef UPDATE_SBA_FILTER if ( input_config == AUDIO_CONFIG_HOA3 ) { -#endif /* HOA3 filter coefficients */ hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftHRIRReal_HOA3[bandIdx][chIdx]; hBinRenConvModule->filterTapsLeftImag[bandIdx][chIdx] = hHrtf->leftHRIRImag_HOA3[bandIdx][chIdx]; hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightHRIRReal_HOA3[bandIdx][chIdx]; hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx] = hHrtf->rightHRIRImag_HOA3[bandIdx][chIdx]; -#ifdef UPDATE_SBA_FILTER } else if ( input_config == AUDIO_CONFIG_HOA2 ) { @@ -382,7 +379,6 @@ static ivas_error ivas_binRenderer_convModuleOpen( { return IVAS_ERR_INVALID_INPUT_FORMAT; } -#endif #else /* HOA3 filter coefficients */ hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftHRIRReal_HOA3[bandIdx][chIdx]; @@ -464,6 +460,14 @@ static ivas_error ivas_binaural_hrtf_open( mvr2r( leftHRIRImag_HOA3[i][j], HrtfFastConv->leftHRIRImag_HOA3[i][j], BINAURAL_NTAPS ); mvr2r( rightHRIRReal_HOA3[i][j], HrtfFastConv->rightHRIRReal_HOA3[i][j], BINAURAL_NTAPS ); mvr2r( rightHRIRImag_HOA3[i][j], HrtfFastConv->rightHRIRImag_HOA3[i][j], BINAURAL_NTAPS ); + mvr2r( leftHRIRReal_HOA2[i][j], HrtfFastConv->leftHRIRReal_HOA2[i][j], BINAURAL_NTAPS ); + mvr2r( leftHRIRImag_HOA2[i][j], HrtfFastConv->leftHRIRImag_HOA2[i][j], BINAURAL_NTAPS ); + mvr2r( rightHRIRReal_HOA2[i][j], HrtfFastConv->rightHRIRReal_HOA2[i][j], BINAURAL_NTAPS ); + mvr2r( rightHRIRImag_HOA2[i][j], HrtfFastConv->rightHRIRImag_HOA2[i][j], BINAURAL_NTAPS ); + mvr2r( leftHRIRReal_FOA[i][j], HrtfFastConv->leftHRIRReal_FOA[i][j], BINAURAL_NTAPS ); + mvr2r( leftHRIRImag_FOA[i][j], HrtfFastConv->leftHRIRImag_FOA[i][j], BINAURAL_NTAPS ); + mvr2r( rightHRIRReal_FOA[i][j], HrtfFastConv->rightHRIRReal_FOA[i][j], BINAURAL_NTAPS ); + mvr2r( rightHRIRImag_FOA[i][j], HrtfFastConv->rightHRIRImag_FOA[i][j], BINAURAL_NTAPS ); #else mvr2r( leftHRIRReal_HOA3[i][j], HrtfFastConv->leftHRIRReal_HOA3[i][j], 7 ); mvr2r( leftHRIRImag_HOA3[i][j], HrtfFastConv->leftHRIRImag_HOA3[i][j], 7 ); diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index a41375b63a..dde0db1f25 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -447,11 +447,9 @@ static ivas_error ivas_rend_initCrend( } else if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) { -#ifdef UPDATE_SBA_FILTER #ifdef UPDATE_SBA_FILTER if ( inConfig == IVAS_REND_AUDIO_CONFIG_HOA3 ) { -#endif if ( output_Fs == 48000 ) { hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s; @@ -532,7 +530,10 @@ static ivas_error ivas_rend_initCrend( hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[j]; } } -#ifdef UPDATE_SBA_FILTER + else + { + return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" ); + } } else if ( inConfig == IVAS_REND_AUDIO_CONFIG_HOA2 ) { @@ -616,6 +617,10 @@ static ivas_error ivas_rend_initCrend( hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz[j]; } } + else + { + return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" ); + } } else if ( inConfig == IVAS_REND_AUDIO_CONFIG_FOA ) { @@ -699,13 +704,15 @@ static ivas_error ivas_rend_initCrend( hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz[j]; } } + else + { + return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" ); + } } -#endif else { - return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" ); + return IVAS_ERROR( IVAS_ERR_INVALID_INPUT_FORMAT, "Encountered unsupported input config in Crend" ); } - #else if ( output_Fs == 48000 ) { @@ -893,11 +900,9 @@ static ivas_error ivas_rend_initCrend( } else if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) { -#ifdef UPDATE_SBA_FILTER #ifdef UPDATE_SBA_FILTER if ( inConfig == IVAS_REND_AUDIO_CONFIG_HOA3 ) { -#endif hHrtf->latency_s = hSetOfHRTF->hHRTF_hrir_hoa3->latency_s; hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_hoa3->max_num_iterations; hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_hoa3->index_frequency_max_diffuse; @@ -921,7 +926,6 @@ static ivas_error ivas_rend_initCrend( hHrtf->pOut_to_bin_diffuse_re[j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_diffuse_re[j]; hHrtf->pOut_to_bin_diffuse_im[j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_diffuse_im[j]; } -#ifdef UPDATE_SBA_FILTER } else if ( inConfig == IVAS_REND_AUDIO_CONFIG_HOA2 ) { @@ -949,7 +953,7 @@ static ivas_error ivas_rend_initCrend( hHrtf->pOut_to_bin_diffuse_im[j] = hSetOfHRTF->hHRTF_hrir_hoa2->pOut_to_bin_diffuse_im[j]; } } - else if ( inConfig == IVAS_REND_AUDIO_CONFIG_HOA2 ) + else if ( inConfig == IVAS_REND_AUDIO_CONFIG_FOA ) { hHrtf->latency_s = hSetOfHRTF->hHRTF_hrir_foa->latency_s; hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_foa->max_num_iterations; @@ -979,7 +983,6 @@ static ivas_error ivas_rend_initCrend( { return IVAS_ERROR( IVAS_ERR_INTERNAL, "Unsupported renderer type in Crend" ); } -#endif } #else hHrtf->latency_s = hSetOfHRTF->hHRTF_hrir_hoa3->latency_s; -- GitLab From e430ad7e6dae633f034b47e2801ac6f1448600d0 Mon Sep 17 00:00:00 2001 From: emerit Date: Fri, 28 Apr 2023 10:58:44 +0200 Subject: [PATCH 088/331] bug fix --- lib_dec/ivas_binRenderer_internal.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 0ceaa31311..36536f0ebb 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -453,28 +453,37 @@ static ivas_error ivas_binaural_hrtf_open( mvr2r( rightBRIRImag[i][j], HrtfFastConv->rightBRIRImag[i][j], BINAURAL_NTAPS_MAX ); } +#ifdef UPDATE_SBA_FILTER for ( j = 0; j < HRTF_SH_CHANNELS; j++ ) { -#ifdef UPDATE_SBA_FILTER mvr2r( leftHRIRReal_HOA3[i][j], HrtfFastConv->leftHRIRReal_HOA3[i][j], BINAURAL_NTAPS ); mvr2r( leftHRIRImag_HOA3[i][j], HrtfFastConv->leftHRIRImag_HOA3[i][j], BINAURAL_NTAPS ); mvr2r( rightHRIRReal_HOA3[i][j], HrtfFastConv->rightHRIRReal_HOA3[i][j], BINAURAL_NTAPS ); mvr2r( rightHRIRImag_HOA3[i][j], HrtfFastConv->rightHRIRImag_HOA3[i][j], BINAURAL_NTAPS ); + } + for ( j = 0; j < 9; j++ ) + { mvr2r( leftHRIRReal_HOA2[i][j], HrtfFastConv->leftHRIRReal_HOA2[i][j], BINAURAL_NTAPS ); mvr2r( leftHRIRImag_HOA2[i][j], HrtfFastConv->leftHRIRImag_HOA2[i][j], BINAURAL_NTAPS ); mvr2r( rightHRIRReal_HOA2[i][j], HrtfFastConv->rightHRIRReal_HOA2[i][j], BINAURAL_NTAPS ); mvr2r( rightHRIRImag_HOA2[i][j], HrtfFastConv->rightHRIRImag_HOA2[i][j], BINAURAL_NTAPS ); + } + for ( j = 0; j < 4; j++ ) + { mvr2r( leftHRIRReal_FOA[i][j], HrtfFastConv->leftHRIRReal_FOA[i][j], BINAURAL_NTAPS ); mvr2r( leftHRIRImag_FOA[i][j], HrtfFastConv->leftHRIRImag_FOA[i][j], BINAURAL_NTAPS ); mvr2r( rightHRIRReal_FOA[i][j], HrtfFastConv->rightHRIRReal_FOA[i][j], BINAURAL_NTAPS ); mvr2r( rightHRIRImag_FOA[i][j], HrtfFastConv->rightHRIRImag_FOA[i][j], BINAURAL_NTAPS ); + } #else + for ( j = 0; j < HRTF_SH_CHANNELS; j++ ) + { mvr2r( leftHRIRReal_HOA3[i][j], HrtfFastConv->leftHRIRReal_HOA3[i][j], 7 ); mvr2r( leftHRIRImag_HOA3[i][j], HrtfFastConv->leftHRIRImag_HOA3[i][j], 7 ); mvr2r( rightHRIRReal_HOA3[i][j], HrtfFastConv->rightHRIRReal_HOA3[i][j], 7 ); mvr2r( rightHRIRImag_HOA3[i][j], HrtfFastConv->rightHRIRImag_HOA3[i][j], 7 ); -#endif } +#endif } mvr2r( fastconvReverberationTimes, HrtfFastConv->fastconvReverberationTimes, CLDFB_NO_CHANNELS_MAX ); -- GitLab From 665014b27ba7131f5a33d3029081b455a9d0f5bf Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Fri, 28 Apr 2023 12:53:29 +0200 Subject: [PATCH 089/331] several fixes for the JBM path --- lib_dec/ivas_dirac_output_synthesis_dec.c | 43 +++++++++++++++++------ lib_dec/ivas_masa_dec.c | 19 +++++++--- lib_dec/ivas_mc_param_dec.c | 9 ++++- lib_dec/ivas_mct_dec.c | 3 +- lib_dec/ivas_sba_dec.c | 6 +++- 5 files changed, 62 insertions(+), 18 deletions(-) diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c index 03c512dfd8..8271749e21 100644 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -1503,21 +1503,44 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( *-----------------------------------------------------------------*/ /* store estimates for next synthesis block */ - mvr2r( gains_dir, h_dirac_output_synthesis_state->gains_dir_prev, num_freq_bands * nchan_out_woLFE ); - mvr2r( gains_diff, h_dirac_output_synthesis_state->gains_diff_prev, num_freq_bands * nchan_out_woLFE ); +#ifdef JBM_TSM_ON_TCS + if ( hDirAC->voip_active == 1 ) + { + mvr2r( gains_dir, h_dirac_output_synthesis_state->gains_dir_prev, num_freq_bands * hDirAC->num_outputs_dir ); + mvr2r( gains_diff, h_dirac_output_synthesis_state->gains_diff_prev, num_freq_bands * hDirAC->num_outputs_dir ); - /* reset values */ - set_zero( h_dirac_output_synthesis_state->proto_power_smooth, num_freq_bands * num_protos_dir ); + /* reset values */ + set_zero( h_dirac_output_synthesis_state->proto_power_smooth, num_freq_bands * hDirAC->num_outputs_dir ); - if ( h_dirac_output_synthesis_state->proto_power_diff_smooth != NULL ) - { - set_zero( h_dirac_output_synthesis_state->proto_power_diff_smooth, h_dirac_output_synthesis_params->max_band_decorr * nchan_out_woLFE ); + if ( h_dirac_output_synthesis_state->proto_power_diff_smooth != NULL ) + { + set_zero( h_dirac_output_synthesis_state->proto_power_diff_smooth, h_dirac_output_synthesis_params->max_band_decorr * hDirAC->num_outputs_dir ); + } + + set_zero( h_dirac_output_synthesis_state->cy_auto_dir_smooth, num_freq_bands * hDirAC->num_outputs_dir ); + set_zero( h_dirac_output_synthesis_state->cy_cross_dir_smooth, num_freq_bands * hDirAC->num_outputs_dir ); + set_zero( h_dirac_output_synthesis_state->cy_auto_diff_smooth, num_freq_bands * hDirAC->num_outputs_dir ); } + else + { +#endif + mvr2r( gains_dir, h_dirac_output_synthesis_state->gains_dir_prev, num_freq_bands * nchan_out_woLFE ); + mvr2r( gains_diff, h_dirac_output_synthesis_state->gains_diff_prev, num_freq_bands * nchan_out_woLFE ); - set_zero( h_dirac_output_synthesis_state->cy_auto_dir_smooth, num_freq_bands * nchan_out_woLFE ); - set_zero( h_dirac_output_synthesis_state->cy_cross_dir_smooth, num_freq_bands * nchan_out_woLFE ); - set_zero( h_dirac_output_synthesis_state->cy_auto_diff_smooth, num_freq_bands * nchan_out_woLFE ); + /* reset values */ + set_zero( h_dirac_output_synthesis_state->proto_power_smooth, num_freq_bands * num_protos_dir ); + + if ( h_dirac_output_synthesis_state->proto_power_diff_smooth != NULL ) + { + set_zero( h_dirac_output_synthesis_state->proto_power_diff_smooth, h_dirac_output_synthesis_params->max_band_decorr * nchan_out_woLFE ); + } + set_zero( h_dirac_output_synthesis_state->cy_auto_dir_smooth, num_freq_bands * nchan_out_woLFE ); + set_zero( h_dirac_output_synthesis_state->cy_cross_dir_smooth, num_freq_bands * nchan_out_woLFE ); + set_zero( h_dirac_output_synthesis_state->cy_auto_diff_smooth, num_freq_bands * nchan_out_woLFE ); +#ifdef JBM_TSM_ON_TCS + } +#endif pop_wmops(); return; diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index dbb7e11572..ac92d7eaf5 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -378,7 +378,7 @@ ivas_error ivas_masa_dec_open( int16_t nchan_to_allocate; TC_BUFFER_MODE buffer_mode; buffer_mode = TC_BUFFER_MODE_RENDERER; - if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO ) + if ( st_ivas->mc_mode == MC_MODE_MCMASA && (st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO) ) { buffer_mode = TC_BUFFER_MODE_BUFFER; } @@ -1162,13 +1162,22 @@ ivas_error ivas_masa_dec_reconfigure( ivas_masa_set_elements( ivas_total_brate, st_ivas->mc_mode, st_ivas->nchan_transport, st_ivas->hQMetaData, &tmp, &tmp, &tmp ); - if ( st_ivas->hDecoderConfig->voip_active == 1 && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && st_ivas->renderer_type != RENDERER_STEREO_PARAMETRIC ) + if ( st_ivas->hDecoderConfig->voip_active == 1 && st_ivas->renderer_type != RENDERER_DISABLE ) { - int16_t nchan_to_allocate = ivas_jbm_dec_get_num_tc_channels( st_ivas ); - if ( nchan_to_allocate != st_ivas->hTcBuffer->nchan_transport_jbm ) + int16_t tc_nchan_to_allocate; + int16_t tc_nchan_transport; + + tc_nchan_transport = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + tc_nchan_to_allocate = tc_nchan_transport; + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + tc_nchan_to_allocate = 2 * BINAURAL_CHANNELS; + } + if ( tc_nchan_transport != st_ivas->hTcBuffer->nchan_transport_jbm || tc_nchan_to_allocate != st_ivas->hTcBuffer->nchan_transport_internal ) { - if ( ( error = ivas_jbm_dec_tc_buffer_reconfigure( st_ivas, TC_BUFFER_MODE_RENDERER, nchan_to_allocate, nchan_to_allocate, nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_jbm_dec_tc_buffer_reconfigure( st_ivas, TC_BUFFER_MODE_RENDERER, tc_nchan_transport, tc_nchan_to_allocate, tc_nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) { + return error; } } } diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index eea9bd5b56..0ed6a0a94e 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -440,6 +440,9 @@ ivas_error ivas_param_mc_dec_open( return error; } +#ifdef JBM_TSM_ON_TCS + ivas_param_mc_dec_compute_interpolator( 0, 0, DEFAULT_JBM_CLDFB_TIMESLOTS, hParamMC->h_output_synthesis_params.interpolator ); +#endif /* Head rotation */ if ( ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) && st_ivas->hDecoderConfig->Opt_Headrotation ) @@ -960,6 +963,10 @@ ivas_error ivas_param_mc_dec_reconfig( return error; } +#ifdef JBM_TSM_ON_TCS + ivas_param_mc_dec_compute_interpolator( 0, 0, DEFAULT_JBM_CLDFB_TIMESLOTS, hParamMC->h_output_synthesis_params.interpolator ); +#endif + ivas_dirac_dec_output_synthesis_cov_init( &( hParamMC->h_output_synthesis_cov_state ), nchan_transport, nchan_out_cov, hParamMC->hMetadataPMC->num_parameter_bands, max_param_band_residual ); @@ -1465,7 +1472,7 @@ void ivas_param_mc_dec_digest_tc( ivas_jbm_dec_get_adapted_subframes( nCldfbSlots, hParamMC->subframe_nbslots, &hParamMC->nb_subframes ); /* BE Workaround */ - if ( !st_ivas->bfi && st_ivas->hDecoderConfig->voip_active == 0 ) + if ( !st_ivas->bfi && st_ivas->hDecoderConfig->voip_active == 1 ) { ivas_param_mc_dec_compute_interpolator( hParamMC->hMetadataPMC->bAttackPresent, hParamMC->hMetadataPMC->attackIndex, nCldfbSlots, hParamMC->h_output_synthesis_params.interpolator ); } diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index f979942a9a..92a48859ce 100644 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -1243,7 +1243,8 @@ static ivas_error ivas_mc_dec_reconfig( } /* reconfigure buffer */ if ( hTcBuffer->tc_buffer_mode != tc_buffer_mode_new || hTcBuffer->nchan_transport_jbm != tc_nchan_tc_new || - hTcBuffer->nchan_buffer_full != tc_nchan_full_new || hTcBuffer->nchan_transport_internal != tc_nchan_allocate_new ) + hTcBuffer->nchan_buffer_full != tc_nchan_full_new || hTcBuffer->nchan_transport_internal != tc_nchan_allocate_new || + tc_granularity_new != hTcBuffer->n_samples_granularity ) { if ( ( error = ivas_jbm_dec_tc_buffer_reconfigure( st_ivas, tc_buffer_mode_new, tc_nchan_tc_new, tc_nchan_allocate_new, tc_nchan_full_new, tc_granularity_new ) ) != IVAS_ERR_OK ) { diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index c945e3f68b..a3adfa3ff1 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -376,7 +376,7 @@ ivas_error ivas_sba_dec_reconfigure( /*-----------------------------------------------------------------* * TC buffer *-----------------------------------------------------------------*/ - if ( st_ivas->hDecoderConfig->voip_active == 1 && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && st_ivas->renderer_type != RENDERER_STEREO_PARAMETRIC ) + if ( st_ivas->hDecoderConfig->voip_active == 1 ) { int16_t tc_nchan_to_allocate; int16_t tc_nchan_tc; @@ -392,6 +392,10 @@ ivas_error ivas_sba_dec_reconfigure( tc_nchan_tc = st_ivas->hDecoderConfig->nchan_out; tc_nchan_to_allocate = tc_nchan_tc; } + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + tc_nchan_to_allocate = 2 * BINAURAL_CHANNELS; + } else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) { sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); -- GitLab From 1c3b4f06a9e6ed2b4cb7012a1f30e1bf9619f5b2 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Tue, 2 May 2023 08:54:59 +0200 Subject: [PATCH 090/331] fix EVS JBM BE, fix JBM bit rate switching for SBA, clang-format --- apps/decoder.c | 2 +- lib_dec/ivas_dirac_dec.c | 7 +++++- lib_dec/ivas_masa_dec.c | 2 +- lib_dec/ivas_spar_decoder.c | 6 ++++- lib_dec/jbm_pcmdsp_apa.c | 44 ++++++++++++++++++++++++++++++++-- lib_dec/jbm_pcmdsp_apa.h | 2 ++ lib_dec/jbm_pcmdsp_window.c | 48 +++++++++++++++++++++++++++++++++++++ lib_dec/jbm_pcmdsp_window.h | 1 + lib_dec/lib_dec.c | 15 +++++++++++- 9 files changed, 120 insertions(+), 7 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index f2134a29f4..31f38ec1f3 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -83,7 +83,7 @@ static #define VARIABLE_SPEED_FETCH_FRAMESIZE_MS 20 #endif #ifdef JBM_TSM_ON_TCS -#define JBM_FRONTEND_FETCH_FRAMESIZE_MS 5 +#define JBM_FRONTEND_FETCH_FRAMESIZE_MS 20 #define FRAME_SIZE_NS 20000000L #endif diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index b85120afa1..2d527a8e5d 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -1026,16 +1026,21 @@ ivas_error ivas_dirac_dec_config( /* allocate transport channels*/ if ( flag_config == DIRAC_OPEN ) { - if ( st_ivas->hDecoderConfig->voip_active == 1 && st_ivas->hTcBuffer == NULL && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && st_ivas->renderer_type != RENDERER_STEREO_PARAMETRIC ) + if ( st_ivas->hDecoderConfig->voip_active == 1 && st_ivas->hTcBuffer == NULL ) { if ( st_ivas->sba_mode == SBA_MODE_DIRAC ) { int16_t nchan_to_allocate; + nchan_to_allocate = nchan_transport; if ( st_ivas->nchan_transport == 1 && ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) || ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) ) { nchan_to_allocate++; /* we need a channel for the CNG in this case*/ } + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + nchan_to_allocate = 2 * BINAURAL_CHANNELS; + } if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, nchan_transport, nchan_to_allocate, nchan_to_allocate, hDirAC->slot_size ) ) != IVAS_ERR_OK ) { return error; diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index ac92d7eaf5..71ae7c5022 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -378,7 +378,7 @@ ivas_error ivas_masa_dec_open( int16_t nchan_to_allocate; TC_BUFFER_MODE buffer_mode; buffer_mode = TC_BUFFER_MODE_RENDERER; - if ( st_ivas->mc_mode == MC_MODE_MCMASA && (st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO) ) + if ( st_ivas->mc_mode == MC_MODE_MCMASA && ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO ) ) { buffer_mode = TC_BUFFER_MODE_BUFFER; } diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index d3067b0e46..7c1c70bf87 100644 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -190,7 +190,7 @@ ivas_error ivas_spar_dec_open( } } /* allocate transport channels*/ - if ( st_ivas->hDecoderConfig->voip_active == 1 && st_ivas->hTcBuffer == NULL && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && st_ivas->renderer_type != RENDERER_STEREO_PARAMETRIC ) + if ( st_ivas->hDecoderConfig->voip_active == 1 && st_ivas->hTcBuffer == NULL ) { int16_t nchan_to_allocate; int16_t nchan_tc; @@ -205,6 +205,10 @@ ivas_error ivas_spar_dec_open( nchan_tc = st_ivas->hDecoderConfig->nchan_out; nchan_to_allocate = nchan_tc; } + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + nchan_to_allocate = 2 * BINAURAL_CHANNELS; + } if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, buffer_mode, nchan_tc, nchan_to_allocate, nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) { return error; diff --git a/lib_dec/jbm_pcmdsp_apa.c b/lib_dec/jbm_pcmdsp_apa.c index 61b3256d58..713c2327a0 100644 --- a/lib_dec/jbm_pcmdsp_apa.c +++ b/lib_dec/jbm_pcmdsp_apa.c @@ -67,6 +67,7 @@ struct apa_state_t { /* output buffer */ #ifdef JBM_TSM_ON_TCS + bool evs_compat_mode; float *buf_out; #else int16_t *buf_out; @@ -187,6 +188,10 @@ ivas_error apa_init( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM\n" ) ); } +#ifdef JBM_TSM_ON_TCS + ps->evs_compat_mode = false; +#endif + apa_reset( ps ); *pps = ps; @@ -406,6 +411,19 @@ bool apa_set_renderer_residual_samples( ps->l_r_buf = l_r_buf * ps->num_channels; return 0; } + +bool apa_set_evs_compat_mode( apa_state_t *ps, bool mode ) +{ + /* make sure pointer is valid */ + if ( ps == NULL ) + { + return 1; + } + + ps->evs_compat_mode = mode; + + return 0; +} #endif /* @@ -1291,7 +1309,18 @@ static bool shrink_frm( { return 1; } - overlapAdd( frm_in, frm_in + xtract, frm_out, l_seg, ps->num_channels, ps->win + ps->l_halfwin, ps->win ); +#ifdef JBM_TSM_ON_TCS + if ( ps->evs_compat_mode == true ) + { + overlapAddEvs( frm_in, frm_in + xtract, frm_out, l_seg, ps->num_channels, ps->win + ps->l_halfwin, ps->win ); + } + else + { +#endif + overlapAdd( frm_in, frm_in + xtract, frm_out, l_seg, ps->num_channels, ps->win + ps->l_halfwin, ps->win ); +#ifdef JBM_TSM_ON_TCS + } +#endif } else { @@ -1517,7 +1546,18 @@ static bool extend_frm( fadeOut = frm_in + l_frm + xtract[n - 1] + l_seg; fadeIn = frm_in + l_frm + xtract[n]; out = frm_out + ( n - 2 ) * l_seg; - overlapAdd( fadeOut, fadeIn, out, l_seg, ps->num_channels, ps->win + ps->l_halfwin, ps->win ); +#ifdef JBM_TSM_ON_TCS + if ( ps->evs_compat_mode == true ) + { + overlapAddEvs( fadeOut, fadeIn, out, l_seg, ps->num_channels, ps->win + ps->l_halfwin, ps->win ); + } + else + { +#endif + overlapAdd( fadeOut, fadeIn, out, l_seg, ps->num_channels, ps->win + ps->l_halfwin, ps->win ); +#ifdef JBM_TSM_ON_TCS + } +#endif } else { diff --git a/lib_dec/jbm_pcmdsp_apa.h b/lib_dec/jbm_pcmdsp_apa.h index 6a2b02e13c..a5e7cb7d61 100644 --- a/lib_dec/jbm_pcmdsp_apa.h +++ b/lib_dec/jbm_pcmdsp_apa.h @@ -119,6 +119,8 @@ bool apa_set_renderer_granularity( apa_state_t *ps, uint16_t l_ts ); bool apa_set_renderer_residual_samples( apa_state_t *ps, uint16_t l_r_buf ); +bool apa_set_evs_compat_mode( apa_state_t *ps, bool mode ); + uint8_t apa_reconfigure( apa_state_t *ps, uint16_t num_channels, uint16_t l_ts ); #endif diff --git a/lib_dec/jbm_pcmdsp_window.c b/lib_dec/jbm_pcmdsp_window.c index fa0ea6f724..a31d368c91 100644 --- a/lib_dec/jbm_pcmdsp_window.c +++ b/lib_dec/jbm_pcmdsp_window.c @@ -139,3 +139,51 @@ void overlapAdd( return; } + +void overlapAddEvs( + const float *fadeOut, + const float *fadeIn, + float *out, + uint16_t n, + uint16_t nChannels, + const float *fadeOutWin, + const float *fadeInWin ) +{ + float fdOutVal, fdInVal; + int16_t i, j, hannIter; + float combinedVal; + + for ( j = 0; j < nChannels; j++ ) + { + /* reset Hann window iterator to beginning (both channels use same window) */ + hannIter = 0; + for ( i = j; i < n; i += nChannels ) + { + fdOutVal = fadeOut[i] * fadeOutWin[hannIter]; + fdInVal = fadeIn[i] * fadeInWin[hannIter]; + /* round combinedVal value (taking care of sign) */ + + combinedVal = floorf( ( fdInVal + fdOutVal ) + 0.5f ); + if ( fdInVal + fdOutVal < 0.0 ) + { + combinedVal = ceilf( ( fdInVal + fdOutVal ) - 0.5f ); + } + + /* saturate value */ + if ( combinedVal > MAX16B_FLT ) + { + combinedVal = MAX16B_FLT; + } + else if ( combinedVal < MIN16B_FLT ) + { + combinedVal = MIN16B_FLT; + } + + out[i] = combinedVal; + + hannIter++; + } + } + + return; +} diff --git a/lib_dec/jbm_pcmdsp_window.h b/lib_dec/jbm_pcmdsp_window.h index 2f8cd462b5..8c1823867a 100644 --- a/lib_dec/jbm_pcmdsp_window.h +++ b/lib_dec/jbm_pcmdsp_window.h @@ -63,6 +63,7 @@ void hannWindow( uint16_t n, float *w ); * @param[in] fadeInWin window for fade in */ #ifdef JBM_TSM_ON_TCS void overlapAdd( const float *fadeOut, const float *fadeIn, float *out, uint16_t n, uint16_t nChannels, const float *fadeOutWin, const float *fadeInWin ); +void overlapAddEvs( const float *fadeOut, const float *fadeIn, float *out, uint16_t n, uint16_t nChannels, const float *fadeOutWin, const float *fadeInWin ); #else void overlapAdd( const int16_t *fadeOut, const int16_t *fadeIn, int16_t *out, uint16_t n, uint16_t nChannels, const float *fadeOutWin, const float *fadeInWin ); #endif diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 33a4ed7526..9429c1bd89 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -2824,7 +2824,13 @@ static ivas_error evs_dec_main( #ifdef JBM_TSM_ON_TCS if ( floatBuf != NULL ) { - mvr2r( output, floatBuf, nOutSamples ); + /* BE workaround */ + int16_t pcm_buf_local[L_FRAME48k]; +#ifdef DEBUGGING + st_ivas->noClipping += +#endif + syn_output( output, nOutSamples, pcm_buf_local ); + mvs2r( pcm_buf_local, floatBuf, nOutSamples ); } else { @@ -3125,6 +3131,13 @@ ivas_error IVAS_DEC_VoIP_reconfigure( IVAS_DEC_HANDLE hIvasDec, const uint16_t n return IVAS_ERR_INIT_ERROR; } } + if ( hIvasDec->mode == IVAS_DEC_MODE_EVS ) + { + if ( apa_set_evs_compat_mode( hIvasDec->hVoIP->hTimeScaler, true ) != 0 ) + { + return IVAS_ERR_INIT_ERROR; + } + } } else { -- GitLab From e255694c1e47f9ef80a45df435e7972e54f0721b Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Mon, 8 May 2023 09:08:40 +0200 Subject: [PATCH 091/331] fix compile error, clang-format --- lib_dec/ivas_mc_param_dec.c | 8 +++----- lib_dec/ivas_sba_dec.c | 4 ---- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index 5f0b0e03eb..37c8f181aa 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -1396,8 +1396,10 @@ void ivas_param_mc_dec_read_BS( /* for PLC, use the saved ILDs and ICCs from the past and set the transient flag and transient position to zero */ hMetadataPMC->bAttackPresent = 0; hMetadataPMC->attackIndex = 0; +#ifndef JBM_TSM_ON_TCS #ifdef FIX_431_PARAMMC_PLC_INTERPOLATOR param_mc_compute_interpolator( hMetadataPMC->bAttackPresent, hMetadataPMC->attackIndex, PARAM_MC_MAX_NSLOTS, hParamMC->h_output_synthesis_params.interpolator ); +#endif #endif } @@ -1474,11 +1476,7 @@ void ivas_param_mc_dec_digest_tc( hParamMC->subframes_rendered = 0; ivas_jbm_dec_get_adapted_subframes( nCldfbSlots, hParamMC->subframe_nbslots, &hParamMC->nb_subframes ); - /* BE Workaround */ - if ( !st_ivas->bfi || st_ivas->hDecoderConfig->voip_active == 1 ) - { - ivas_param_mc_dec_compute_interpolator( hParamMC->hMetadataPMC->bAttackPresent, hParamMC->hMetadataPMC->attackIndex, nCldfbSlots, hParamMC->h_output_synthesis_params.interpolator ); - } + ivas_param_mc_dec_compute_interpolator( hParamMC->hMetadataPMC->bAttackPresent, hParamMC->hMetadataPMC->attackIndex, nCldfbSlots, hParamMC->h_output_synthesis_params.interpolator ); for ( param_band_idx = 0; param_band_idx < PARAM_MC_MAX_PARAMETER_BANDS; param_band_idx++ ) { diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index d135c2663e..91038ca927 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -178,8 +178,6 @@ ivas_error ivas_sba_dec_reconfigure( } ivas_spar_config( ivas_total_brate, sba_order_internal, &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &hSpar->core_nominal_brate, st_ivas->sid_format ); - - } else { @@ -351,7 +349,6 @@ ivas_error ivas_sba_dec_reconfigure( int16_t tc_nchan_to_allocate; int16_t tc_nchan_tc; TC_BUFFER_MODE tc_buffer_mode; - int16_t sba_order_internal; tc_buffer_mode = TC_BUFFER_MODE_RENDERER; tc_nchan_tc = ivas_jbm_dec_get_num_tc_channels( st_ivas ); @@ -368,7 +365,6 @@ ivas_error ivas_sba_dec_reconfigure( } else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) { - sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); tc_nchan_to_allocate = ivas_sba_get_nchan_metadata( sba_order_internal ); } else -- GitLab From 51413506987d0bea58d7113a3dc4b0005a1a4e9c Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Mon, 8 May 2023 16:44:00 +0200 Subject: [PATCH 092/331] JBM MASA and binaural renderer optimization, under subdefine MASA_PARAMBIN_SF_MAP --- lib_com/ivas_prot.h | 12 + lib_com/options.h | 2 +- lib_dec/ivas_dirac_dec.c | 185 ++++++-- lib_dec/ivas_dirac_output_synthesis_dec.c | 81 ++-- lib_dec/ivas_masa_dec.c | 27 +- lib_dec/ivas_mc_param_dec.c | 4 +- lib_dec/ivas_spar_decoder.c | 12 +- lib_dec/ivas_stat_dec.h | 6 +- lib_dec/lib_dec.c | 28 +- lib_rend/ivas_dirac_dec_binaural_functions.c | 443 ++++++++++++++++++- lib_rend/ivas_sba_rendering.c | 4 +- 11 files changed, 698 insertions(+), 106 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 58122739ba..92dc25bef2 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3758,11 +3758,15 @@ void ivas_dirac_dec_output_synthesis_process_slot( const int16_t *azimuth, const int16_t *elevation, const float *diffuseness, +#ifndef MASA_PARAMBIN_SF_MAP const uint16_t coherence_flag, +#endif #endif DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ #ifdef JBM_TSM_ON_TCS +#ifndef MASA_PARAMBIN_SF_MAP MASA_DECODER_HANDLE hMasa, +#endif const int16_t sh_rot_max_order, #endif const float *p_Rmat, /* i : rotation matrix */ @@ -5028,11 +5032,19 @@ void ivas_masa_prerender( #ifdef JBM_TSM_ON_TCS void ivas_spar_param_to_masa_param_mapping_sf( Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ +#ifdef MASA_PARAMBIN_SF_MAP + int16_t azimuth[CLDFB_NO_CHANNELS_MAX], + int16_t elevation[CLDFB_NO_CHANNELS_MAX], + float energy_ratio1[CLDFB_NO_CHANNELS_MAX], + float spreadCoherence[CLDFB_NO_CHANNELS_MAX], + float surroundingCoherence[CLDFB_NO_CHANNELS_MAX], +#else int16_t azimuth[][CLDFB_NO_CHANNELS_MAX], int16_t elevation[][CLDFB_NO_CHANNELS_MAX], float energy_ratio1[][CLDFB_NO_CHANNELS_MAX], float spreadCoherence[][CLDFB_NO_CHANNELS_MAX], float surroundingCoherence[][CLDFB_NO_CHANNELS_MAX], +#endif float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /* i : Input audio in CLDFB domain, imag */ ); diff --git a/lib_com/options.h b/lib_com/options.h index 8f4a40aab3..12048be943 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -179,7 +179,7 @@ #define VARIABLE_SPEED_DECODING /* FhG: variable speed decoding employing the JBM functioniality */ #define JBM_TSM_ON_TCS /* FhG: run the TSM part of JBM on the TCs instead of the final output pcm waveforms */ #ifdef JBM_TSM_ON_TCS -#define JBM_DIRAC_DEBUG_BE +#define MASA_PARAMBIN_SF_MAP #endif /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index a0b6126415..b4a8b44e79 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -173,7 +173,7 @@ ivas_error ivas_dirac_dec_config( num_outputs_diff_old = 0; num_protos_diff_old = 0; -#ifdef JBM_DIRAC_DEBUG_BE +#if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) hDirAC->voip_active = st_ivas->hDecoderConfig->voip_active; #endif @@ -846,11 +846,18 @@ ivas_error ivas_dirac_dec_config( #ifdef JBM_TSM_ON_TCS { int16_t map_idx; - set_s( hDirAC->render_to_md_slot_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); + set_s( hDirAC->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); +#ifdef MASA_PARAMBIN_SF_MAP + for ( map_idx = 0; map_idx < DEFAULT_JBM_SUBFRAMES_5MS; map_idx++ ) + { + hDirAC->render_to_md_map[map_idx] = map_idx; + } +#else for ( map_idx = 0; map_idx < DEFAULT_JBM_CLDFB_TIMESLOTS; map_idx++ ) { - hDirAC->render_to_md_slot_map[map_idx] = map_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME; + hDirAC->render_to_md_map[map_idx] = map_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME; } +#endif } #endif } @@ -858,6 +865,23 @@ ivas_error ivas_dirac_dec_config( { hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR; hDirAC->dirac_bs_md_write_idx = DELAY_MASA_PARAM_DEC_SFR; +#ifdef JBM_TSM_ON_TCS + { + int16_t map_idx; + set_s( hDirAC->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); +#ifdef MASA_PARAMBIN_SF_MAP + for ( map_idx = 0; map_idx < DEFAULT_JBM_SUBFRAMES_5MS; map_idx++ ) + { + hDirAC->render_to_md_map[map_idx] = map_idx; + } +#else + for ( map_idx = 0; map_idx < DEFAULT_JBM_CLDFB_TIMESLOTS; map_idx++ ) + { + hDirAC->render_to_md_map[map_idx] = map_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME; + } +#endif + } +#endif } else { @@ -883,10 +907,10 @@ ivas_error ivas_dirac_dec_config( #ifdef JBM_TSM_ON_TCS { int16_t map_idx; - set_s( hDirAC->render_to_md_slot_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); + set_s( hDirAC->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); for ( map_idx = 0; map_idx < DEFAULT_JBM_CLDFB_TIMESLOTS; map_idx++ ) { - hDirAC->render_to_md_slot_map[map_idx] = hDirAC->dirac_read_idx + map_idx * num_slots_in_subfr / JBM_CLDFB_SLOTS_IN_SUBFRAME; + hDirAC->render_to_md_map[map_idx] = hDirAC->dirac_read_idx + map_idx * num_slots_in_subfr / JBM_CLDFB_SLOTS_IN_SUBFRAME; } } #endif @@ -2275,6 +2299,11 @@ void ivas_qmetadata_to_dirac( #ifdef JBM_TSM_ON_TCS +/*------------------------------------------------------------------------- + * ivas_dirac_dec_set_md_map() + * + * Set metadata index mapping for DirAC + *------------------------------------------------------------------------*/ void ivas_dirac_dec_set_md_map( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ int16_t nCldfbTs ) @@ -2304,13 +2333,43 @@ void ivas_dirac_dec_set_md_map( /* set mapping according to dirac_read_idx */ - set_s( hDirAC->render_to_md_slot_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); - - ivas_jbm_dec_get_md_map( DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbTs, num_slots_in_subfr, hDirAC->dirac_read_idx, hDirAC->dirac_md_buffer_length, hDirAC->render_to_md_slot_map ); + set_s( hDirAC->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); +#ifdef MASA_PARAMBIN_SF_MAP + if ( hDirAC->hConfig == NULL || hDirAC->hConfig->dec_param_estim == 0 ) + { + ivas_jbm_dec_get_md_map( DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbTs, num_slots_in_subfr, 0, hDirAC->dirac_md_buffer_length, hDirAC->render_to_md_map ); + } + else + { +#endif + ivas_jbm_dec_get_md_map( DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbTs, num_slots_in_subfr, hDirAC->dirac_read_idx, hDirAC->dirac_md_buffer_length, hDirAC->render_to_md_map ); +#ifdef MASA_PARAMBIN_SF_MAP + } +#endif +#ifdef MASA_PARAMBIN_SF_MAP + if ( hDirAC->hConfig == NULL || hDirAC->hConfig->dec_param_estim == 0 ) + { + float tmp; + int16_t sf_idx, slot_idx, slot_idx_abs; + slot_idx_abs = 0; + for ( sf_idx = 0; sf_idx < hDirAC->nb_subframes; sf_idx++ ) + { + tmp = 0.0f; + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[sf_idx]; slot_idx++ ) + { + tmp += (float) hDirAC->render_to_md_map[slot_idx_abs]; + slot_idx_abs++; + } + hDirAC->render_to_md_map[sf_idx] = ( (int16_t) roundf( tmp / (float) hDirAC->subframe_nbslots[sf_idx] ) + hDirAC->dirac_read_idx ) % hDirAC->dirac_md_buffer_length; + } + set_s( &hDirAC->render_to_md_map[hDirAC->nb_subframes], 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME - hDirAC->nb_subframes ); + } +#endif return; } + /*------------------------------------------------------------------------- * ivas_dirac_dec() * @@ -2463,11 +2522,9 @@ void ivas_dirac_dec_render_sf( { int16_t i, ch, idx_in, idx_lfe; DIRAC_DEC_HANDLE hDirAC; -#if defined( JBM_DIRAC_DEBUG_BE ) || !defined( JBM_TSM_ON_TCS ) float dirEne; float surCohEner; float surCohRatio[CLDFB_NO_CHANNELS_MAX]; -#endif int16_t subframe_idx; #ifndef JBM_TSM_ON_TCS int16_t sf1, sf2; @@ -2589,13 +2646,30 @@ void ivas_dirac_dec_render_sf( } /* copy parameters into local buffers*/ - for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) +#ifdef MASA_PARAMBIN_SF_MAP + if ( hDirAC->hConfig->dec_param_estim == TRUE ) { - mvs2s( hDirAC->azimuth[hDirAC->render_to_md_slot_map[slot_idx + slot_idx_start]], azimuth[slot_idx], hDirAC->num_freq_bands ); - mvs2s( hDirAC->elevation[hDirAC->render_to_md_slot_map[slot_idx + slot_idx_start]], elevation[slot_idx], hDirAC->num_freq_bands ); - mvr2r( hDirAC->diffuseness_vector[hDirAC->render_to_md_slot_map[slot_idx + slot_idx_start]], diffuseness_vector[slot_idx], hDirAC->num_freq_bands ); +#endif + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) + { + mvs2s( hDirAC->azimuth[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], azimuth[slot_idx], hDirAC->num_freq_bands ); + mvs2s( hDirAC->elevation[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], elevation[slot_idx], hDirAC->num_freq_bands ); + mvr2r( hDirAC->diffuseness_vector[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], diffuseness_vector[slot_idx], hDirAC->num_freq_bands ); + } +#ifdef MASA_PARAMBIN_SF_MAP + } + else + { + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) + { + mvs2s( hDirAC->azimuth[hDirAC->render_to_md_map[subframe_idx]], azimuth[slot_idx], hDirAC->num_freq_bands ); + mvs2s( hDirAC->elevation[hDirAC->render_to_md_map[subframe_idx]], elevation[slot_idx], hDirAC->num_freq_bands ); + mvr2r( hDirAC->diffuseness_vector[hDirAC->render_to_md_map[subframe_idx]], diffuseness_vector[slot_idx], hDirAC->num_freq_bands ); + } } #endif +#endif + if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) { set_zero( reference_power_smooth, hDirAC->num_freq_bands ); @@ -2645,15 +2719,18 @@ void ivas_dirac_dec_render_sf( p_Rmat = 0; } -#if defined( JBM_DIRAC_DEBUG_BE ) || !defined( JBM_TSM_ON_TCS ) -#ifdef JBM_DIRAC_DEBUG_BE +#if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) if ( st_ivas->hDecoderConfig->voip_active == 0 && hDirAC->hConfig->dec_param_estim == FALSE ) #else - if ( hDirAC->hConfig->dec_param_estim == FALSE ) + if ( hDirAC->hConfig->dec_param_estim == FALSE ) #endif { #ifdef JBM_TSM_ON_TCS - int16_t md_idx = hDirAC->render_to_md_slot_map[slot_idx_start]; +#ifdef MASA_PARAMBIN_SF_MAP + int16_t md_idx = hDirAC->render_to_md_map[subframe_idx]; +#else + int16_t md_idx = hDirAC->render_to_md_map[slot_idx_start]; +#endif #endif /* compute response */ if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) @@ -2662,7 +2739,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS diffuseness_vector[0], #else - hDirAC->diffuseness_vector[hDirAC->dirac_read_idx], + hDirAC->diffuseness_vector[hDirAC->dirac_read_idx], #endif hDirAC->h_output_synthesis_psd_params.max_band_decorr, hDirAC->h_output_synthesis_psd_state.direct_power_factor, @@ -2676,7 +2753,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS surCohEner = hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] * hDirAC->surroundingCoherence[md_idx][i]; #else - surCohEner = hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] * hDirAC->surroundingCoherence[hDirAC->dirac_read_idx][i]; + surCohEner = hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] * hDirAC->surroundingCoherence[hDirAC->dirac_read_idx][i]; #endif hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] -= surCohEner; hDirAC->h_output_synthesis_psd_state.direct_power_factor[i] += surCohEner; @@ -2693,9 +2770,13 @@ void ivas_dirac_dec_render_sf( { ivas_dirac_dec_compute_gain_factors( hDirAC->num_freq_bands, #ifdef JBM_TSM_ON_TCS +#ifdef MASA_PARAMBIN_SF_MAP + hDirAC->diffuseness_vector[md_idx], +#else diffuseness_vector[0], +#endif #else - hDirAC->diffuseness_vector[hDirAC->dirac_read_idx], + hDirAC->diffuseness_vector[hDirAC->dirac_read_idx], #endif hDirAC->h_output_synthesis_psd_params.max_band_decorr, hDirAC->h_output_synthesis_psd_state.direct_power_factor, @@ -2708,7 +2789,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS surCohRatio[i] = hDirAC->surroundingCoherence[md_idx][i]; #else - surCohRatio[i] = hDirAC->surroundingCoherence[hDirAC->dirac_read_idx][i]; + surCohRatio[i] = hDirAC->surroundingCoherence[hDirAC->dirac_read_idx][i]; #endif } } @@ -2746,7 +2827,7 @@ void ivas_dirac_dec_render_sf( 0 ); } } -#endif + #ifdef JBM_TSM_ON_TCS for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) @@ -2816,7 +2897,11 @@ void ivas_dirac_dec_render_sf( Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS - 1], Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS - 1], slot_idx, #ifdef JBM_TSM_ON_TCS - hDirAC->render_to_md_slot_map[index_slot], +#ifdef MASA_PARAMBIN_SF_MAP + hDirAC->render_to_md_map[subframe_idx], +#else + hDirAC->render_to_md_map[index_slot], +#endif #else subframe_idx, #endif @@ -3076,8 +3161,7 @@ void ivas_dirac_dec_render_sf( p_Rmat, st_ivas->hVBAPdata, hDirAC->hOutSetup, - nchan_transport, - index_slot ); + nchan_transport ); } else { @@ -3087,8 +3171,7 @@ void ivas_dirac_dec_render_sf( 0, st_ivas->hVBAPdata, hDirAC->hOutSetup, - nchan_transport, - index_slot ); + nchan_transport ); } #else if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order > 0 ) @@ -3098,15 +3181,19 @@ void ivas_dirac_dec_render_sf( azimuth[slot_idx], elevation[slot_idx], diffuseness_vector[slot_idx], +#ifndef MASA_PARAMBIN_SF_MAP coherence_flag, +#endif hDirAC, +#ifndef MASA_PARAMBIN_SF_MAP st_ivas->hMasa, +#endif st_ivas->hHeadTrackData->shd_rot_max_order, p_Rmat, st_ivas->hVBAPdata, hDirAC->hOutSetup, nchan_transport, - hDirAC->render_to_md_slot_map[index_slot] ); + hDirAC->render_to_md_map[index_slot] ); } else { @@ -3115,15 +3202,19 @@ void ivas_dirac_dec_render_sf( azimuth[slot_idx], elevation[slot_idx], diffuseness_vector[slot_idx], +#ifndef MASA_PARAMBIN_SF_MAP coherence_flag, +#endif hDirAC, +#ifndef MASA_PARAMBIN_SF_MAP st_ivas->hMasa, +#endif 0, 0, st_ivas->hVBAPdata, hDirAC->hOutSetup, nchan_transport, - hDirAC->render_to_md_slot_map[index_slot] ); + hDirAC->render_to_md_map[index_slot] ); } #endif @@ -3178,12 +3269,13 @@ void ivas_dirac_dec_render_sf( num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) { - mvs2s( azimuth[slot_idx], hDirAC->azimuth[hDirAC->render_to_md_slot_map[slot_idx + slot_idx_start]], num_freq_bands ); - mvs2s( elevation[slot_idx], hDirAC->elevation[hDirAC->render_to_md_slot_map[slot_idx + slot_idx_start]], num_freq_bands ); - mvr2r( diffuseness_vector[slot_idx], hDirAC->diffuseness_vector[hDirAC->render_to_md_slot_map[slot_idx + slot_idx_start]], num_freq_bands ); + mvs2s( azimuth[slot_idx], hDirAC->azimuth[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], num_freq_bands ); + mvs2s( elevation[slot_idx], hDirAC->elevation[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], num_freq_bands ); + mvr2r( diffuseness_vector[slot_idx], hDirAC->diffuseness_vector[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], num_freq_bands ); } } /* get the correct md index for the direction smoothing, it is always the first slot of the next subframe*/ +#ifdef MASA_PARAMBIN_SF_MAP if ( slot_idx_start + hDirAC->subframe_nbslots[subframe_idx] == hDirAC->num_slots ) { /* we are at the end, get the next one using the normal dirac read idx...*/ @@ -3198,8 +3290,33 @@ void ivas_dirac_dec_render_sf( } else { - diff_md_idx = hDirAC->render_to_md_slot_map[slot_idx_start + hDirAC->subframe_nbslots[subframe_idx]]; + if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 ) + { + diff_md_idx = hDirAC->render_to_md_map[slot_idx_start + hDirAC->subframe_nbslots[subframe_idx]]; + } + else + { + diff_md_idx = hDirAC->render_to_md_map[subframe_idx + 1]; + } + } +#else + if ( slot_idx_start + hDirAC->subframe_nbslots[subframe_idx] == hDirAC->num_slots ) + { + /* we are at the end, get the next one using the normal dirac read idx...*/ + if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 ) + { + diff_md_idx = ( hDirAC->dirac_read_idx + DEFAULT_JBM_CLDFB_TIMESLOTS ) % hDirAC->dirac_md_buffer_length; + } + else + { + diff_md_idx = ( hDirAC->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % hDirAC->dirac_md_buffer_length; + } } + else + { + diff_md_idx = hDirAC->render_to_md_map[slot_idx_start + hDirAC->subframe_nbslots[subframe_idx]]; + } +#endif #endif ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( Cldfb_RealBuffer, diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c index 8271749e21..dd1aef168f 100644 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -529,11 +529,15 @@ void ivas_dirac_dec_output_synthesis_process_slot( const int16_t *azimuth, const int16_t *elevation, const float *diffuseness, +#ifndef MASA_PARAMBIN_SF_MAP const uint16_t coherence_flag, +#endif #endif DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ #ifdef JBM_TSM_ON_TCS +#ifndef MASA_PARAMBIN_SF_MAP MASA_DECODER_HANDLE hMasa, +#endif const int16_t sh_rot_max_order, #endif const float *p_Rmat, /* i : rotation matrix */ @@ -554,7 +558,7 @@ void ivas_dirac_dec_output_synthesis_process_slot( #ifndef JBM_TSM_ON_TCS const float *diffuseness; #endif -#ifdef JBM_TSM_ON_TCS +#if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) float dirEne; float surCohEner; float surCohRatio[CLDFB_NO_CHANNELS_MAX]; @@ -586,20 +590,17 @@ void ivas_dirac_dec_output_synthesis_process_slot( num_channels_dir = hOutSetup.nchan_out_woLFE; } -#if defined( JBM_DIRAC_DEBUG_BE ) || !defined( JBM_TSM_ON_TCS ) -#ifdef JBM_DIRAC_DEBUG_BE + +#if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) if ( hDirAC->hConfig->dec_param_estim == TRUE || hDirAC->voip_active == 1 ) #else if ( hDirAC->hConfig->dec_param_estim == TRUE ) -#endif #endif { -#ifdef JBM_TSM_ON_TCS -#ifdef JBM_DIRAC_DEBUG_BE +#if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) if ( hDirAC->voip_active == 1 ) { -#endif if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { ivas_dirac_dec_compute_gain_factors( num_freq_bands, @@ -657,19 +658,26 @@ void ivas_dirac_dec_output_synthesis_process_slot( set_zero( surCohRatio, hDirAC->num_freq_bands ); } } -#ifdef JBM_DIRAC_DEBUG_BE } #endif -#endif + /* compute direct responses */ #ifdef JBM_TSM_ON_TCS ivas_dirac_dec_compute_directional_responses( hDirAC, hVBAPdata, +#ifdef MASA_PARAMBIN_SF_MAP + NULL, +#else hMasa, +#endif azimuth, elevation, index_slot, +#ifdef MASA_PARAMBIN_SF_MAP + NULL, +#else coherence_flag ? surCohRatio : NULL, +#endif sh_rot_max_order, p_Rmat ); #else @@ -683,11 +691,9 @@ void ivas_dirac_dec_output_synthesis_process_slot( if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { -#if !defined( JBM_TSM_ON_TCS ) || defined( JBM_DIRAC_DEBUG_BE ) -#ifdef JBM_DIRAC_DEBUG_BE +#if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) if ( hDirAC->voip_active == 0 ) { - #endif ivas_dirac_dec_compute_gain_factors( num_freq_bands, diffuseness, @@ -704,13 +710,13 @@ void ivas_dirac_dec_output_synthesis_process_slot( 0.25f, h_dirac_output_synthesis_state->diffuse_power_factor, num_freq_bands ); -#ifdef JBM_DIRAC_DEBUG_BE +#if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) } -#endif #endif + /*Direct gain*/ -#ifdef JBM_TSM_ON_TCS +#if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) if ( hDirAC->hConfig->dec_param_estim == TRUE ) { #endif @@ -750,7 +756,7 @@ void ivas_dirac_dec_output_synthesis_process_slot( } } } -#ifdef JBM_TSM_ON_TCS +#if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) } else { @@ -808,25 +814,22 @@ void ivas_dirac_dec_output_synthesis_process_slot( return; } -#if !defined( JBM_TSM_ON_TCS ) || defined( JBM_DIRAC_DEBUG_BE ) else { /* compute reference and diffuse power factor for this frame */ -#ifdef JBM_DIRAC_DEBUG_BE +#if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) if ( hDirAC->voip_active == 0 ) { - #endif ivas_dirac_dec_compute_power_factors( num_freq_bands, diffuseness, h_dirac_output_synthesis_params->max_band_decorr, h_dirac_output_synthesis_state->direct_power_factor, h_dirac_output_synthesis_state->diffuse_power_factor ); -#ifdef JBM_DIRAC_DEBUG_BE +#if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) } #endif } -#endif } diff_start_band = 0; @@ -845,12 +848,10 @@ void ivas_dirac_dec_output_synthesis_process_slot( } /* process other PSDs only slot wise for 4 transport channels */ -#if !defined( JBM_TSM_ON_TCS ) || defined( JBM_DIRAC_DEBUG_BE ) -#if defined( JBM_DIRAC_DEBUG_BE ) +#if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) if ( hDirAC->hConfig->dec_param_estim == TRUE || hDirAC->voip_active == 1 ) #else if ( hDirAC->hConfig->dec_param_estim == TRUE ) -#endif #endif { computeTargetPSDs_direct( num_channels_dir, num_freq_bands, h_dirac_output_synthesis_state->direct_power_factor, reference_power, h_dirac_output_synthesis_state->direct_responses, h_dirac_output_synthesis_state->direct_responses_square, h_dirac_output_synthesis_state->cy_auto_dir_smooth, h_dirac_output_synthesis_state->cy_cross_dir_smooth ); @@ -912,8 +913,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( * comput target Gains *-----------------------------------------------------------------*/ -#if !defined( JBM_TSM_ON_TCS ) || defined( JBM_DIRAC_DEBUG_BE ) -#ifdef JBM_DIRAC_DEBUG_BE +#if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) if ( hDirAC->voip_active == 0 && hDirAC->hConfig->dec_param_estim == FALSE ) #else if ( hDirAC->hConfig->dec_param_estim == FALSE ) @@ -955,7 +955,6 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( v_multc( h_dirac_output_synthesis_state.diffuse_power_factor, hDirAC->diffuse_response_function[ch_idx], &h_dirac_output_synthesis_state.cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], num_freq_bands_diff ); } } -#endif /*-----------------------------------------------------------------* * compute gains @@ -1169,9 +1168,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( float qualityBasedSmFactor ) { int16_t buf_idx, num_freq_bands; -#if !defined( JBM_TSM_ON_TCS ) || defined( JBM_DIRAC_DEBUG_BE ) int16_t diff_start_band; -#endif int16_t k, l; int16_t nchan_out_woLFE; float *p_power_smooth_prev, *p_power_diff_smooth_prev; @@ -1192,9 +1189,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( float subtract_target_ratio; float subtract_target_ratio_db; float a, b; -#if !defined( JBM_TSM_ON_TCS ) || defined( JBM_DIRAC_DEBUG_BE ) uint16_t nchan_target_psds; -#endif float alpha[CLDFB_NO_CHANNELS_MAX]; float *alpha_synthesis; float *alpha_synthesis_fast; @@ -1215,8 +1210,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( /*-----------------------------------------------------------------* * compute target PSDs *-----------------------------------------------------------------*/ -#if !defined( JBM_TSM_ON_TCS ) || defined( JBM_DIRAC_DEBUG_BE ) -#ifdef JBM_DIRAC_DEBUG_BE +#if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) if ( hDirAC->hConfig->enc_param_start_band == 0 && hDirAC->voip_active == 0 ) #else if ( hDirAC->hConfig->enc_param_start_band == 0 ) @@ -1247,7 +1241,6 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( h_dirac_output_synthesis_state->diffuse_responses_square, h_dirac_output_synthesis_state->cy_auto_diff_smooth ); } -#endif /*-----------------------------------------------------------------* * compute variables for stereo transport signal type detection *-----------------------------------------------------------------*/ @@ -1503,7 +1496,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( *-----------------------------------------------------------------*/ /* store estimates for next synthesis block */ -#ifdef JBM_TSM_ON_TCS +#if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) if ( hDirAC->voip_active == 1 ) { mvr2r( gains_dir, h_dirac_output_synthesis_state->gains_dir_prev, num_freq_bands * hDirAC->num_outputs_dir ); @@ -1538,7 +1531,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( set_zero( h_dirac_output_synthesis_state->cy_auto_dir_smooth, num_freq_bands * nchan_out_woLFE ); set_zero( h_dirac_output_synthesis_state->cy_cross_dir_smooth, num_freq_bands * nchan_out_woLFE ); set_zero( h_dirac_output_synthesis_state->cy_auto_diff_smooth, num_freq_bands * nchan_out_woLFE ); -#ifdef JBM_TSM_ON_TCS +#if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) } #endif pop_wmops(); @@ -1843,9 +1836,9 @@ void ivas_dirac_dec_compute_directional_responses( directRatio[0] = hDirAC->energy_ratio1[md_idx][k] / totalDirect; directRatio[1] = hDirAC->energy_ratio2[md_idx][k] / totalDirect; #else - totalDirect = hDirAC->energy_ratio1[hDirAC->dirac_read_idx]][k] + hDirAC->energy_ratio2[hDirAC->dirac_read_idx]][k] + EPSILON; - directRatio[0] = hDirAC->energy_ratio1[hDirAC->dirac_read_idx]][k] / totalDirect; - directRatio[1] = hDirAC->energy_ratio2[hDirAC->dirac_read_idx]][k] / totalDirect; + totalDirect = hDirAC->energy_ratio1[hDirAC->dirac_read_idx][k] + hDirAC->energy_ratio2[hDirAC->dirac_read_idx][k] + EPSILON; + directRatio[0] = hDirAC->energy_ratio1[hDirAC->dirac_read_idx][k] / totalDirect; + directRatio[1] = hDirAC->energy_ratio2[hDirAC->dirac_read_idx][k] / totalDirect; #endif for ( l = 0; l < num_channels_dir; l++ ) { @@ -1897,7 +1890,7 @@ void ivas_dirac_dec_compute_directional_responses( #ifdef JBM_TSM_ON_TCS spreadCoherencePanningVbap( azimuth[k], elevation[k], hDirAC->spreadCoherence[md_idx][k], direct_response_ls, num_channels_dir, hVBAPdata ); #else - spreadCoherencePanningVbap( azimuth[k], elevation[k], hDirAC->spreadCoherence[hDirAC->dirac_read_idx]][k], direct_response_ls, num_channels_dir, hVBAPdata ); + spreadCoherencePanningVbap( azimuth[k], elevation[k], hDirAC->spreadCoherence[hDirAC->dirac_read_idx][k], direct_response_ls, num_channels_dir, hVBAPdata ); #endif normalizePanningGains( direct_response_ls, num_channels_dir ); @@ -1907,7 +1900,7 @@ void ivas_dirac_dec_compute_directional_responses( #ifdef JBM_TSM_ON_TCS spreadCoherencePanningVbap( azimuth2[k], elevation2[k], hDirAC->spreadCoherence2[md_idx][k], direct_response_dir2, num_channels_dir, hVBAPdata ); #else - spreadCoherencePanningVbap( azimuth2[k], elevation2[k], hDirAC->spreadCoherence2[hDirAC->dirac_read_idx]][k], direct_response_dir2, num_channels_dir, hVBAPdata ); + spreadCoherencePanningVbap( azimuth2[k], elevation2[k], hDirAC->spreadCoherence2[hDirAC->dirac_read_idx][k], direct_response_dir2, num_channels_dir, hVBAPdata ); #endif normalizePanningGains( direct_response_dir2, num_channels_dir ); @@ -1917,9 +1910,9 @@ void ivas_dirac_dec_compute_directional_responses( directRatio[0] = hDirAC->energy_ratio1[md_idx][k] / totalDirect; directRatio[1] = hDirAC->energy_ratio2[md_idx][k] / totalDirect; #else - totalDirect = hDirAC->energy_ratio1[hDirAC->dirac_read_idx]][k] + hDirAC->energy_ratio2[hDirAC->dirac_read_idx]][k] + EPSILON; - directRatio[0] = hDirAC->energy_ratio1[hDirAC->dirac_read_idx]][k] / totalDirect; - directRatio[1] = hDirAC->energy_ratio2[hDirAC->dirac_read_idx]][k] / totalDirect; + totalDirect = hDirAC->energy_ratio1[hDirAC->dirac_read_idx][k] + hDirAC->energy_ratio2[hDirAC->dirac_read_idx][k] + EPSILON; + directRatio[0] = hDirAC->energy_ratio1[hDirAC->dirac_read_idx][k] / totalDirect; + directRatio[1] = hDirAC->energy_ratio2[hDirAC->dirac_read_idx][k] / totalDirect; #endif for ( l = 0; l < num_channels_dir; l++ ) { diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index a3b7ddd6e9..a65369e2c4 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -1253,6 +1253,7 @@ ivas_error ivas_masa_dec_reconfigure( ivas_masa_set_elements( ivas_total_brate, st_ivas->mc_mode, st_ivas->nchan_transport, st_ivas->hQMetaData, &tmp, &tmp, &tmp ); +#ifdef JBM_TSM_ON_TCS if ( st_ivas->hDecoderConfig->voip_active == 1 && st_ivas->renderer_type != RENDERER_DISABLE ) { int16_t tc_nchan_to_allocate; @@ -1272,7 +1273,7 @@ ivas_error ivas_masa_dec_reconfigure( } } } - +#endif return error; } @@ -1285,11 +1286,19 @@ ivas_error ivas_masa_dec_reconfigure( #ifdef JBM_TSM_ON_TCS void ivas_spar_param_to_masa_param_mapping_sf( Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ +#ifdef MASA_PARAMBIN_SF_MAP + int16_t azimuth[CLDFB_NO_CHANNELS_MAX], + int16_t elevation[CLDFB_NO_CHANNELS_MAX], + float energy_ratio1[CLDFB_NO_CHANNELS_MAX], + float spreadCoherence[CLDFB_NO_CHANNELS_MAX], + float surroundingCoherence[CLDFB_NO_CHANNELS_MAX], +#else int16_t azimuth[][CLDFB_NO_CHANNELS_MAX], int16_t elevation[][CLDFB_NO_CHANNELS_MAX], float energy_ratio1[][CLDFB_NO_CHANNELS_MAX], float spreadCoherence[][CLDFB_NO_CHANNELS_MAX], float surroundingCoherence[][CLDFB_NO_CHANNELS_MAX], +#endif float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /* i : Input audio in CLDFB domain, imag */ ) @@ -1342,12 +1351,13 @@ void ivas_spar_param_to_masa_param_mapping_sf( } } + slot_fac = 1.0f / (float) hSpar->subframe_nbslots[subframe_idx]; /* Delay the SPAR mixing matrices to have them synced with the audio */ for ( slot_idx = 0; slot_idx < hSpar->subframe_nbslots[subframe_idx]; slot_idx++ ) { - sf = hSpar->render_to_md_slot_map[slot_idx + slot_idx_start] / JBM_CLDFB_SLOTS_IN_SUBFRAME; + sf = hSpar->render_to_md_map[slot_idx + slot_idx_start] / JBM_CLDFB_SLOTS_IN_SUBFRAME; if ( sf < SPAR_META_DELAY_SUBFRAMES ) { mixer_mat_index = sf + MAX_PARAM_SPATIAL_SUBFRAMES - SPAR_META_DELAY_SUBFRAMES + 1; @@ -1469,13 +1479,21 @@ void ivas_spar_param_to_masa_param_mapping_sf( ratio = I / fmaxf( 1e-12f, E ); /* Energy ratio */ ratio = fmaxf( 0.0f, fminf( 1.0f, ratio ) ); +#ifdef MASA_PARAMBIN_SF_MAP + azimuth[bin] = (int16_t) roundf( azi / PI_OVER_180 ); + elevation[bin] = (int16_t) roundf( ele / PI_OVER_180 ); + energy_ratio1[bin] = ratio; + + spreadCoherence[bin] = 0.0f; + surroundingCoherence[bin] = 0.0f; +#else azimuth[0][bin] = (int16_t) roundf( azi / PI_OVER_180 ); elevation[0][bin] = (int16_t) roundf( ele / PI_OVER_180 ); energy_ratio1[0][bin] = ratio; spreadCoherence[0][bin] = 0.0f; surroundingCoherence[0][bin] = 0.0f; - +#endif /* Determine directional distribution of the indirect audio based on the SPAR mixing matrices (and the transport audio signals when 2 TC) */ if ( hDiffuseDist != NULL ) { @@ -1515,6 +1533,7 @@ void ivas_spar_param_to_masa_param_mapping_sf( } } +#ifndef MASA_PARAMBIN_SF_MAP for ( slot_idx = 1; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) { mvs2s( azimuth[0], azimuth[slot_idx], nBins ); @@ -1523,7 +1542,7 @@ void ivas_spar_param_to_masa_param_mapping_sf( mvr2r( surroundingCoherence[0], surroundingCoherence[slot_idx], nBins ); mvr2r( energy_ratio1[0], energy_ratio1[slot_idx], nBins ); } - +#endif return; } diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index 37c8f181aa..e4e6480254 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -1398,7 +1398,7 @@ void ivas_param_mc_dec_read_BS( hMetadataPMC->attackIndex = 0; #ifndef JBM_TSM_ON_TCS #ifdef FIX_431_PARAMMC_PLC_INTERPOLATOR - param_mc_compute_interpolator( hMetadataPMC->bAttackPresent, hMetadataPMC->attackIndex, PARAM_MC_MAX_NSLOTS, hParamMC->h_output_synthesis_params.interpolator ); + ivas_param_mc_dec_compute_interpolator( hMetadataPMC->bAttackPresent, hMetadataPMC->attackIndex, PARAM_MC_MAX_NSLOTS, hParamMC->h_output_synthesis_params.interpolator ); #endif #endif } @@ -1477,7 +1477,7 @@ void ivas_param_mc_dec_digest_tc( ivas_jbm_dec_get_adapted_subframes( nCldfbSlots, hParamMC->subframe_nbslots, &hParamMC->nb_subframes ); ivas_param_mc_dec_compute_interpolator( hParamMC->hMetadataPMC->bAttackPresent, hParamMC->hMetadataPMC->attackIndex, nCldfbSlots, hParamMC->h_output_synthesis_params.interpolator ); - + for ( param_band_idx = 0; param_band_idx < PARAM_MC_MAX_PARAMETER_BANDS; param_band_idx++ ) { set_zero( cx[param_band_idx], PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index c221769b36..701ff8892d 100644 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -184,10 +184,10 @@ ivas_error ivas_spar_dec_open( /* init render timeslot mapping */ { int16_t map_idx; - set_s( hSpar->render_to_md_slot_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); + set_s( hSpar->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); for ( map_idx = 0; map_idx < DEFAULT_JBM_CLDFB_TIMESLOTS; map_idx++ ) { - hSpar->render_to_md_slot_map[map_idx] = map_idx; + hSpar->render_to_md_map[map_idx] = map_idx; } } /* allocate transport channels*/ @@ -1091,9 +1091,9 @@ void ivas_spar_dec_set_render_map( hSpar->num_slots = nCldfbTs; hSpar->slots_rendered = 0; hSpar->subframes_rendered = 0; - set_s( hSpar->render_to_md_slot_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); + set_s( hSpar->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); ivas_jbm_dec_get_adapted_subframes( nCldfbTs, hSpar->subframe_nbslots, &hSpar->nb_subframes ); - ivas_jbm_dec_get_md_map( DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbTs, 1, 0, DEFAULT_JBM_CLDFB_TIMESLOTS, hSpar->render_to_md_slot_map ); + ivas_jbm_dec_get_md_map( DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbTs, 1, 0, DEFAULT_JBM_CLDFB_TIMESLOTS, hSpar->render_to_md_map ); return; } @@ -1527,7 +1527,7 @@ void ivas_spar_dec_upmixer( #endif { #ifdef JBM_TSM_ON_TCS - md_idx = hSpar->render_to_md_slot_map[ts + slot_idx_start]; + md_idx = hSpar->render_to_md_map[ts + slot_idx_start]; ivas_spar_get_parameters( hSpar, hDecoderConfig, md_idx, numch_out, numch_in, num_spar_bands, mixer_mat ); #else /* determine SPAR parameters for this time slots */ @@ -1594,7 +1594,7 @@ void ivas_spar_dec_upmixer( } } #ifdef JBM_TSM_ON_TCS - if ( ( ( slot_idx_start + ts + 1 ) == hSpar->num_slots ) || ( ( md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME ) != ( hSpar->render_to_md_slot_map[ts + slot_idx_start + 1] / JBM_CLDFB_SLOTS_IN_SUBFRAME ) ) ) + if ( ( ( slot_idx_start + ts + 1 ) == hSpar->num_slots ) || ( ( md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME ) != ( hSpar->render_to_md_map[ts + slot_idx_start + 1] / JBM_CLDFB_SLOTS_IN_SUBFRAME ) ) ) { /* we have crossed an unadapted parameter sf border, update previous mixing matrices */ int16_t md_sf = md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME; diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 4fa4f9ad43..af2edd614d 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -638,8 +638,8 @@ typedef struct ivas_dirac_dec_data_structure int16_t subframes_rendered; int16_t slots_rendered; int16_t num_slots; - int16_t render_to_md_slot_map[MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME]; -#ifdef JBM_DIRAC_DEBUG_BE + int16_t render_to_md_map[MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME]; +#if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) int16_t voip_active; #endif #else @@ -891,7 +891,7 @@ typedef struct ivas_spar_dec_lib_t #endif #ifdef JBM_TSM_ON_TCS int16_t subframe_nbslots[MAX_JBM_SUBFRAMES_5MS]; - int16_t render_to_md_slot_map[MAX_JBM_CLDFB_TIMESLOTS]; + int16_t render_to_md_map[MAX_JBM_CLDFB_TIMESLOTS]; int16_t nb_subframes; int16_t subframes_rendered; int16_t slots_rendered; diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 9429c1bd89..da8b5049e5 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -653,6 +653,8 @@ ivas_error IVAS_DEC_EnableVoIP( { return IVAS_ERR_INIT_ERROR; } + /* we instantly need a new frame */ + hIvasDec->hVoIP->needNewFrame = true; } #else if ( apa_init( &hIvasDec->hVoIP->hTimeScaler, @@ -2041,6 +2043,16 @@ ivas_error IVAS_DEC_VoIP_GetSamples( { return IVAS_ERR_UNKNOWN; } +#ifdef VARIABLE_SPEED_DECODING + if ( hVoIP->mode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED ) + { + int16_t nSamplesAvailable = pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoAfterTimeScaler ); + if ( nSamplesAvailable < nSamplesPerChannel ) + { + hVoIP->needNewFrame = true; + } + } +#endif #endif #ifdef JBM_TSM_ON_TCS @@ -2065,7 +2077,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( st_ivas->noClipping += #endif syn_output( hVoIP->apaExecBuffer, nTimeScalerOutSamples, (int16_t *) hVoIP->apaExecBuffer ); -#endif + if ( pcmdsp_fifo_write( hVoIP->hFifoOut, (uint8_t *) hVoIP->apaExecBuffer, nSamplesTcsScaled ) != 0 ) { return IVAS_ERR_UNKNOWN; @@ -2073,6 +2085,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( nSamplesRendered = nSamplesTcsScaled; } } +#endif #ifdef SUPPORT_JBM_TRACEFILE /* jbmWriterFn and jbmWriter may be NULL if tracefile writing was not requested on CLI */ if ( jbmWriterFn != NULL && jbmWriter != NULL ) @@ -2147,7 +2160,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( { if ( pcmdsp_fifo_read( hVoIP->hFifoOut, nSamplesPerChannel, (uint8_t *) pcmBuf ) != 0 ) #else -if ( pcmdsp_fifo_read( hVoIP->hFifoAfterTimeScaler, nSamplesPerChannel, (uint8_t *) pcmBuf ) != 0 ) + if ( pcmdsp_fifo_read( hVoIP->hFifoAfterTimeScaler, nSamplesPerChannel, (uint8_t *) pcmBuf ) != 0 ) #endif { return IVAS_ERR_UNKNOWN; @@ -2161,6 +2174,15 @@ if ( pcmdsp_fifo_read( hVoIP->hFifoAfterTimeScaler, nSamplesPerChannel, (uint8_t *sampleAvailableNext = hVoIP->nSamplesAvailableNext; #else *sampleAvailableNext = max( 0, pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoAfterTimeScaler ) ); +#ifdef VARIABLE_SPEED_DECODING + if ( hVoIP->mode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED ) + { + if ( *sampleAvailableNext < nSamplesPerChannel ) + { + hVoIP->needNewFrame = true; + } + } +#endif #endif #endif @@ -2184,9 +2206,11 @@ ivas_error IVAS_DEC_VoIP_Flush( { ivas_error error; IVAS_DEC_VOIP *hVoIP; +#ifdef JBM_TSM_ON_TCS int16_t rendererPcmBuf[( MAX_OUTPUT_CHANNELS * L_FRAME_MAX * APA_MAX_SCALE ) / 100]; uint16_t nSamplesToRender; uint16_t nSamplesFlushedLocal; +#endif error = IVAS_ERR_OK; hVoIP = hIvasDec->hVoIP; diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index f8945d50d3..583aba3427 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -103,7 +103,11 @@ static void ivas_dirac_dec_binaural_process_output_sf( Decoder_Struct *st_ivas, static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked_sf( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const uint8_t slotEnd, const uint8_t nBins, float Rmat[3][3] ); +#ifdef MASA_PARAMBIN_SF_MAP +static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices_sf( Decoder_Struct *st_ivas, float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], int16_t azimuth[CLDFB_NO_CHANNELS_MAX], int16_t elevation[CLDFB_NO_CHANNELS_MAX], float energy_ratio1[CLDFB_NO_CHANNELS_MAX], float spreadCoherence[CLDFB_NO_CHANNELS_MAX], float surroundingCoherence[CLDFB_NO_CHANNELS_MAX], float Rmat[3][3] ); +#else static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices_sf( Decoder_Struct *st_ivas, float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], int16_t azimuth[][CLDFB_NO_CHANNELS_MAX], int16_t elevation[][CLDFB_NO_CHANNELS_MAX], float energy_ratio1[][CLDFB_NO_CHANNELS_MAX], float spreadCoherence[][CLDFB_NO_CHANNELS_MAX], float surroundingCoherence[][CLDFB_NO_CHANNELS_MAX], float Rmat[3][3] ); +#endif static void ivas_dirac_dec_binaural_internal_sf( Decoder_Struct *st_ivas, float *output_f[], const int16_t nchan_transport ); @@ -590,13 +594,24 @@ static void ivas_dirac_dec_binaural_internal_sf( float Cldfb_RealBuffer_in[2 * BINAURAL_CHANNELS][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; float Cldfb_ImagBuffer_in[2 * BINAURAL_CHANNELS][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; /* local copies of azi, ele, diffuseness */ +#ifdef MASA_PARAMBIN_SF_MAP + int16_t azimuth[CLDFB_NO_CHANNELS_MAX]; + int16_t elevation[CLDFB_NO_CHANNELS_MAX]; + float spreadCoherence[CLDFB_NO_CHANNELS_MAX]; + float surroundingCoherence[CLDFB_NO_CHANNELS_MAX]; + float energy_ratio1[CLDFB_NO_CHANNELS_MAX]; +#else int16_t azimuth[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; int16_t elevation[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; float spreadCoherence[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; float surroundingCoherence[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; float energy_ratio1[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; +#endif float Rmat[3][3]; - uint16_t slot_idx, slot_idx_start, subframe_idx; +#ifndef MASA_PARAMBIN_SF_MAP + uint16_t slot_idx; +#endif + uint16_t subframe_idx, slot_idx_start; int16_t max_band_decorr; DIFFUSE_DISTRIBUTION_DATA diffuseDistData; @@ -627,15 +642,22 @@ static void ivas_dirac_dec_binaural_internal_sf( subframe_idx = hDirAC->subframes_rendered; /* copy parameters into local buffers*/ +#ifdef MASA_PARAMBIN_SF_MAP + mvs2s( hDirAC->azimuth[hDirAC->render_to_md_map[subframe_idx]], azimuth, hDirAC->num_freq_bands ); + mvs2s( hDirAC->elevation[hDirAC->render_to_md_map[subframe_idx]], elevation, hDirAC->num_freq_bands ); + mvr2r( hDirAC->spreadCoherence[hDirAC->render_to_md_map[subframe_idx]], spreadCoherence, hDirAC->num_freq_bands ); + mvr2r( hDirAC->surroundingCoherence[hDirAC->render_to_md_map[subframe_idx]], surroundingCoherence, hDirAC->num_freq_bands ); + mvr2r( hDirAC->energy_ratio1[hDirAC->render_to_md_map[subframe_idx]], energy_ratio1, hDirAC->num_freq_bands ); +#else for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) { - mvs2s( hDirAC->azimuth[hDirAC->render_to_md_slot_map[slot_idx + slot_idx_start]], azimuth[slot_idx], hDirAC->num_freq_bands ); - mvs2s( hDirAC->elevation[hDirAC->render_to_md_slot_map[slot_idx + slot_idx_start]], elevation[slot_idx], hDirAC->num_freq_bands ); - mvr2r( hDirAC->spreadCoherence[hDirAC->render_to_md_slot_map[slot_idx + slot_idx_start]], spreadCoherence[slot_idx], hDirAC->num_freq_bands ); - mvr2r( hDirAC->surroundingCoherence[hDirAC->render_to_md_slot_map[slot_idx + slot_idx_start]], surroundingCoherence[slot_idx], hDirAC->num_freq_bands ); - mvr2r( hDirAC->energy_ratio1[hDirAC->render_to_md_slot_map[slot_idx + slot_idx_start]], energy_ratio1[slot_idx], hDirAC->num_freq_bands ); + mvs2s( hDirAC->azimuth[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], azimuth[slot_idx], hDirAC->num_freq_bands ); + mvs2s( hDirAC->elevation[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], elevation[slot_idx], hDirAC->num_freq_bands ); + mvr2r( hDirAC->spreadCoherence[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], spreadCoherence[slot_idx], hDirAC->num_freq_bands ); + mvr2r( hDirAC->surroundingCoherence[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], surroundingCoherence[slot_idx], hDirAC->num_freq_bands ); + mvr2r( hDirAC->energy_ratio1[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], energy_ratio1[slot_idx], hDirAC->num_freq_bands ); } - +#endif /* CLDFB Analysis of input */ for ( slot = 0; slot < hDirAC->subframe_nbslots[hDirAC->subframes_rendered]; slot++ ) { @@ -1082,7 +1104,411 @@ static void ivas_dirac_dec_decorrelate_slot_sf( return; } +#ifdef MASA_PARAMBIN_SF_MAP +static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices_sf( + Decoder_Struct *st_ivas, + float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + int16_t azimuth[CLDFB_NO_CHANNELS_MAX], + int16_t elevation[CLDFB_NO_CHANNELS_MAX], + float energy_ratio1[CLDFB_NO_CHANNELS_MAX], + float spreadCoherence[CLDFB_NO_CHANNELS_MAX], + float surroundingCoherence[CLDFB_NO_CHANNELS_MAX], + float Rmat[3][3] ) +{ + uint8_t ch, slot, bin; + uint8_t separateCenterChannelRendering; + int16_t nBins, idx, subframe; + float frameMeanDiffusenessEneWeight[CLDFB_NO_CHANNELS_MAX]; + DIRAC_DEC_HANDLE hDirAC; + DIRAC_DEC_BIN_HANDLE h; + float IIReneLimiterFactor; + float qualityBasedSmFactor; + float lowBitRateEQ[CLDFB_NO_CHANNELS_MAX]; + uint8_t applyLowBitRateEQ; + float subFrameTotalEne[CLDFB_NO_CHANNELS_MAX]; + int16_t md_idx; + + hDirAC = st_ivas->hDirAC; + h = st_ivas->hDiracDecBin; + separateCenterChannelRendering = st_ivas->hOutSetup.separateChannelEnabled; + nBins = hDirAC->num_freq_bands; /* Actually bins */ + subframe = hDirAC->subframes_rendered; + md_idx = hDirAC->render_to_md_map[hDirAC->subframes_rendered]; + + set_zero( h->ChCrossRe, nBins ); + set_zero( h->ChCrossIm, nBins ); + set_zero( h->ChCrossReOut, nBins ); + set_zero( h->ChCrossImOut, nBins ); + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + set_zero( h->ChEne[ch], nBins ); + set_zero( h->ChEneOut[ch], nBins ); + } + set_zero( h->frameMeanDiffuseness, nBins ); + + set_zero( frameMeanDiffusenessEneWeight, CLDFB_NO_CHANNELS_MAX ); + + /* Determine EQ for low bit rates (13.2 and 16.4 kbps) */ + applyLowBitRateEQ = 0; + if ( ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == MC_FORMAT ) && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE ) + { + applyLowBitRateEQ = 1; + if ( st_ivas->hDecoderConfig->ivas_total_brate == IVAS_16k4 ) + { + for ( bin = 0; bin < LOW_BIT_RATE_BINAURAL_EQ_BINS; bin++ ) + { + lowBitRateEQ[bin + LOW_BIT_RATE_BINAURAL_EQ_OFFSET] = lowBitRateBinauralEQ[bin] * 0.5f + 0.5f; + } + } + else + { + for ( bin = 0; bin < LOW_BIT_RATE_BINAURAL_EQ_BINS; bin++ ) + { + lowBitRateEQ[bin + LOW_BIT_RATE_BINAURAL_EQ_OFFSET] = lowBitRateBinauralEQ[bin]; + } + } + } + /* Formulate input and target covariance matrices combining all subframes */ + set_zero( subFrameTotalEne, CLDFB_NO_CHANNELS_MAX ); + + /* Calculate input covariance matrix */ + for ( slot = 0; slot < (uint8_t) hDirAC->subframe_nbslots[subframe]; slot++ ) + { + for ( bin = 0; bin < nBins; bin++ ) + { + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + float instEne; + + instEne = ( inRe[ch][slot][bin] * inRe[ch][slot][bin] ); + instEne += ( inIm[ch][slot][bin] * inIm[ch][slot][bin] ); + h->ChEne[ch][bin] += instEne; + subFrameTotalEne[bin] += instEne; + } + h->ChCrossRe[bin] += inRe[0][slot][bin] * inRe[1][slot][bin]; + h->ChCrossRe[bin] += inIm[0][slot][bin] * inIm[1][slot][bin]; + h->ChCrossIm[bin] += inRe[0][slot][bin] * inIm[1][slot][bin]; + h->ChCrossIm[bin] -= inIm[0][slot][bin] * inRe[1][slot][bin]; + } + } + + /* Apply EQ at low bit rates */ + if ( applyLowBitRateEQ ) + { + int16_t lastEqBin = LOW_BIT_RATE_BINAURAL_EQ_OFFSET + LOW_BIT_RATE_BINAURAL_EQ_BINS - 1; + + for ( bin = LOW_BIT_RATE_BINAURAL_EQ_OFFSET; bin < lastEqBin; bin++ ) + { + subFrameTotalEne[bin] *= lowBitRateEQ[bin]; + } + for ( ; bin < nBins; bin++ ) + { + subFrameTotalEne[bin] *= lowBitRateEQ[lastEqBin]; + } + } + + if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->nchan_transport == 2 ) + { + float tempRe, tempIm; + + set_zero( subFrameTotalEne, CLDFB_NO_CHANNELS_MAX ); + + for ( slot = 0; slot < (uint8_t) hDirAC->subframe_nbslots[subframe]; slot++ ) + { + for ( bin = 0; bin < nBins; bin++ ) + { + tempRe = inRe[0][slot][bin] + inRe[1][slot][bin]; + tempIm = inIm[0][slot][bin] + inIm[1][slot][bin]; + subFrameTotalEne[bin] += tempRe * tempRe + tempIm * tempIm; + } + } + } + + /* Determine target covariance matrix containing target binaural properties */ + for ( bin = 0; bin < nBins; bin++ ) + { + float diffuseness = 1.0f; /* ratio1 and ratio2 are subtracted from diffuseness further below */ + float surCoh = 0.0f, spreadCoh = 0.0f; /* Default values if spreadSurroundCoherenceApplied == false */ + float diffEne, dirEne, meanEnePerCh; + uint16_t dirIndex; + + /* When BINAURAL_ROOM is not indicated, hBinaural->earlyPartEneCorrection[bin] values are all 1.0f. + * When BINAURAL_ROOM is indicated, the binaural audio output is based on combined use of the + * HRTF data set and a BRIR-based data set. The HRTF data set is spectrally corrected to match + * the early spectrum of the BRIR data, using the spectral correction data in + * hBinaural->earlyPartEneCorrection[bin], based on the BRIR set. */ + meanEnePerCh = h->earlyPartEneCorrection[bin] * subFrameTotalEne[bin] / 2.0f; + + /* Determine direct part target covariance matrix (for 1 or 2 directions) */ + for ( dirIndex = 0; dirIndex < hDirAC->numSimultaneousDirections; dirIndex++ ) + { + int16_t aziDeg, eleDeg; + float lRealp, lImagp, rRealp, rImagp; + float lRealpTmp, lImagpTmp, rRealpTmp, rImagpTmp; + float hrtfEne[BINAURAL_CHANNELS], hrtfCrossRe, hrtfCrossIm, ratio; + + if ( dirIndex == 0 ) /* For first of the two simultaneous directions */ + { + aziDeg = azimuth[bin]; + eleDeg = elevation[bin]; + ratio = energy_ratio1[bin]; + spreadCoh = spreadCoherence[bin]; + } + else /* For second of the two simultaneous directions */ + { + aziDeg = hDirAC->azimuth2[md_idx][bin]; + eleDeg = hDirAC->elevation2[md_idx][bin]; + ratio = hDirAC->energy_ratio2[md_idx][bin]; + spreadCoh = hDirAC->spreadCoherence2[md_idx][bin]; + } + diffuseness -= ratio; /* diffuseness = 1 - ratio1 - ratio2 */ + + if ( separateCenterChannelRendering ) + { + /* In masa + mono rendering mode, the center directions originate from phantom sources, so the + * spread coherence is increased */ + float aziRad, eleRad, doaVectorX, spatialAngleDeg, altSpreadCoh; + + aziRad = (float) aziDeg * PI_OVER_180; + eleRad = (float) eleDeg * PI_OVER_180; + doaVectorX = cosf( aziRad ) * cosf( eleRad ); + spatialAngleDeg = acosf( doaVectorX ) * _180_OVER_PI; + altSpreadCoh = 1.0f - ( spatialAngleDeg / 30.0f ); + spreadCoh = max( spreadCoh, altSpreadCoh ); + } + + getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, h->renderStereoOutputInsteadOfBinaural, Rmat ); + + if ( h->renderStereoOutputInsteadOfBinaural ) + { + /* Synthesizing spread coherence is not needed for stereo loudspeaker output, + * as directional sound is reproduced with two loudspeakers in any case */ + spreadCoh = 0.0f; + } + + if ( spreadCoh > 0.0f ) + { + float centerMul, sidesMul; + float hrtfEneCenter, hrtfEneSides, hrtfEneRealized, eneCorrectionFactor; + float w1, w2, w3, eq; + + hrtfEneCenter = ( lRealp * lRealp ) + ( lImagp * lImagp ) + ( rRealp * rRealp ) + ( rImagp * rImagp ); + + /* Spread coherence is synthesized as coherent sources at 30 degree horizontal spacing. + * The following formulas determine the gains for these sources. + * spreadCoh = 0: Only panning + * spreadCoh = 0.5: Three sources coherent panning (e.g. 30 0 -30 deg azi) + * spreadCoh = 1.0: Two sources coherent panning with gap (as above, but center is silent) */ + if ( spreadCoh < 0.5f ) + { + /* 0.0f < spreadCoh < 0.5f */ + sidesMul = 0.5774f * spreadCoh * 2.0f; /* sqrt(1/3) = 0.5774f */ + centerMul = 1.0f - ( spreadCoh * 2.0f ) + sidesMul; + } + else + { + /* 0.5f <= spreadCoh < 1.0f */ + centerMul = 2.0f - ( 2.0f * spreadCoh ); + sidesMul = inv_sqrt( centerMul + 2.0f ); + centerMul *= sidesMul; + } + + /* Apply the gain for the center source of the three coherent sources */ + lRealp *= centerMul; + lImagp *= centerMul; + rRealp *= centerMul; + rImagp *= centerMul; + + /* Apply the gain for the left source of the three coherent sources */ + getDirectPartGains( bin, aziDeg + 30, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat ); + + hrtfEneSides = ( lRealpTmp * lRealpTmp ) + ( lImagpTmp * lImagpTmp ) + ( rRealpTmp * rRealpTmp ) + ( rImagpTmp * rImagpTmp ); + lRealp += sidesMul * lRealpTmp; + lImagp += sidesMul * lImagpTmp; + rRealp += sidesMul * rRealpTmp; + rImagp += sidesMul * rImagpTmp; + + /* Apply the gain for the right source of the three coherent sources. + * -30 degrees to 330 wrapping due to internal functions. */ + getDirectPartGains( bin, aziDeg + 330, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat ); + + hrtfEneSides += ( lRealpTmp * lRealpTmp ) + ( lImagpTmp * lImagpTmp ) + ( rRealpTmp * rRealpTmp ) + ( rImagpTmp * rImagpTmp ); + lRealp += sidesMul * lRealpTmp; + lImagp += sidesMul * lImagpTmp; + rRealp += sidesMul * rRealpTmp; + rImagp += sidesMul * rImagpTmp; + + /* Formulate an eneCorrectionFactor that compensates for the coherent summation of the HRTFs */ + hrtfEneRealized = ( lRealp * lRealp ) + ( lImagp * lImagp ) + ( rRealp * rRealp ) + ( rImagp * rImagp ); + eneCorrectionFactor = ( ( hrtfEneSides * sidesMul * sidesMul ) + + ( hrtfEneCenter * centerMul * centerMul ) ) / + max( 1e-12f, hrtfEneRealized ); + + /* Weighting factors to determine appropriate target spectrum for spread coherent sound */ + if ( spreadCoh < 0.5 ) + { + w1 = 1.0f - 2.0f * spreadCoh; + w2 = 2.0f * spreadCoh; + w3 = 0.0f; + } + else + { + w1 = 0.0f; + w2 = 2.0f - 2.0f * spreadCoh; + w3 = 2.0f * spreadCoh - 1.0f; + } + + if ( ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) ) + { + idx = min( bin, MASA_NUM_DEFINED_SUR_SPR_COH_ENE_BINS - 1 ); + + /* Apply the target spectrum to the eneCorrectionFactor */ + if ( separateCenterChannelRendering ) /* spreadCoh mostly originates from phantom sources in separate channel rendering mode */ + { + eneCorrectionFactor *= w1 * 1.0f + ( w2 + w3 ) * spreadCohEne1[idx]; + } + else + { + eneCorrectionFactor *= w1 * 1.0f + w2 * spreadCohEne05[idx] + w3 * spreadCohEne1[idx]; + } + } + + /* Equalize the spread coherent combined HRTFs */ + eq = min( 4.0f, sqrtf( eneCorrectionFactor ) ); + lRealp *= eq; + lImagp *= eq; + rRealp *= eq; + rImagp *= eq; + } + + hrtfEne[0] = ( lRealp * lRealp ) + ( lImagp * lImagp ); + hrtfEne[1] = ( rRealp * rRealp ) + ( rImagp * rImagp ); + hrtfCrossRe = ( lRealp * rRealp ) + ( lImagp * rImagp ); + hrtfCrossIm = ( -lImagp * rRealp ) + ( lRealp * rImagp ); + + /* Add direct part (1 or 2) covariance matrix */ + dirEne = ratio * meanEnePerCh; + h->ChEneOut[0][bin] += dirEne * hrtfEne[0]; /* Dir ene part*/ + h->ChEneOut[1][bin] += dirEne * hrtfEne[1]; + h->ChCrossReOut[bin] += dirEne * hrtfCrossRe; /* Dir cross re */ + h->ChCrossImOut[bin] += dirEne * hrtfCrossIm; /* Dir cross im */ + } + + /* Add diffuse / ambient part covariance matrix */ + diffuseness = max( 0.0f, diffuseness ); + diffEne = diffuseness * meanEnePerCh; + surCoh = surroundingCoherence[bin]; + if ( ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) ) + { + if ( !h->renderStereoOutputInsteadOfBinaural ) + { + idx = min( bin, MASA_NUM_DEFINED_SUR_SPR_COH_ENE_BINS - 1 ); + /* Apply target spectrum that emphasizes low frequencies when the sound is surround coherent */ + diffEne *= ( 1.0f - surCoh ) + surCoh * surCohEne[idx]; + } + } + h->ChEneOut[0][bin] += diffEne; /* Diff ene part*/ + h->ChEneOut[1][bin] += diffEne; + + if ( h->renderStereoOutputInsteadOfBinaural ) + { + /* When rendering stereo, ambience (except for surround coherent sound) has zero ICC. */ + h->ChCrossReOut[bin] += surCoh * diffEne; + } + else /* When rendering binaural, ambience has frequency dependent ICC. */ + { + if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && bin < BINAURAL_COHERENCE_DIFFERENCE_BINS ) + { + float diffuseFieldCoherence; + diffuseFieldCoherence = hDirAC->hDiffuseDist->diffuseRatioX[0][bin] * h->diffuseFieldCoherenceX[bin] + hDirAC->hDiffuseDist->diffuseRatioY[0][bin] * h->diffuseFieldCoherenceY[bin] + hDirAC->hDiffuseDist->diffuseRatioZ[0][bin] * h->diffuseFieldCoherenceZ[bin]; + h->ChCrossReOut[bin] += ( ( 1.0f - surCoh ) * diffuseFieldCoherence + surCoh ) * diffEne; + } + else + { + h->ChCrossReOut[bin] += ( ( 1.0f - surCoh ) * h->diffuseFieldCoherence[bin] + surCoh ) * diffEne; + } + } + + /* Store parameters for formulating average diffuseness over frame */ + h->frameMeanDiffuseness[bin] += diffEne; + frameMeanDiffusenessEneWeight[bin] += meanEnePerCh; + } + + + /* Formulate average diffuseness over frame */ + for ( bin = 0; bin < nBins; bin++ ) + { + h->frameMeanDiffuseness[bin] /= fmaxf( 1e-12f, frameMeanDiffusenessEneWeight[bin] ); + } + + /* Determine encoding quality based additional smoothing factor */ + qualityBasedSmFactor = 1.0f; + if ( st_ivas->hMasa != NULL ) + { + qualityBasedSmFactor = st_ivas->hMasa->data.dir_decode_quality; + qualityBasedSmFactor *= qualityBasedSmFactor; + } + + /* Temporal IIR-type smoothing of covariance matrices */ + if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE ) + { + IIReneLimiterFactor = 16.0f + ( 1.0f - qualityBasedSmFactor ); + } + else + { + IIReneLimiterFactor = 8.0f + ( 1.0f - qualityBasedSmFactor ); + } + for ( bin = 0; bin < nBins; bin++ ) + { + float eneRatio, IIReneLimiter; + + /* Temporally smooth cov mtx estimates for resulting mixing matrix stability. The design principle is that + * the energy history (IIR) must not be more than double of the current frame energy. This provides more + * robust performance at energy offsets when compared to typical IIR averaging. */ + eneRatio = ( h->ChEne[0][bin] + h->ChEne[1][bin] ) / fmaxf( 1e-12f, ( h->ChEnePrev[0][bin] + h->ChEnePrev[1][bin] ) ); + IIReneLimiter = fminf( 1.0f, eneRatio * IIReneLimiterFactor ); + + h->ChCrossRe[bin] *= qualityBasedSmFactor; + h->ChCrossIm[bin] *= qualityBasedSmFactor; + h->ChCrossReOut[bin] *= qualityBasedSmFactor; + h->ChCrossImOut[bin] *= qualityBasedSmFactor; + + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + h->ChEne[ch][bin] *= qualityBasedSmFactor; + h->ChEneOut[ch][bin] *= qualityBasedSmFactor; + } + + h->ChCrossRe[bin] += IIReneLimiter * h->ChCrossRePrev[bin]; + h->ChCrossIm[bin] += IIReneLimiter * h->ChCrossImPrev[bin]; + h->ChCrossReOut[bin] += IIReneLimiter * h->ChCrossReOutPrev[bin]; + h->ChCrossImOut[bin] += IIReneLimiter * h->ChCrossImOutPrev[bin]; + + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + h->ChEne[ch][bin] += IIReneLimiter * h->ChEnePrev[ch][bin]; + h->ChEneOut[ch][bin] += IIReneLimiter * h->ChEneOutPrev[ch][bin]; + } + + /* Store energy values and coefficients for next round */ + h->ChCrossRePrev[bin] = h->ChCrossRe[bin]; + h->ChCrossImPrev[bin] = h->ChCrossIm[bin]; + h->ChCrossReOutPrev[bin] = h->ChCrossReOut[bin]; + h->ChCrossImOutPrev[bin] = h->ChCrossImOut[bin]; + + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + h->ChEnePrev[ch][bin] = h->ChEne[ch][bin]; + h->ChEneOutPrev[ch][bin] = h->ChEneOut[ch][bin]; + } + } + + return; +} + +#else static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices_sf( Decoder_Struct *st_ivas, float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], @@ -1215,7 +1641,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) { - md_idx = hDirAC->render_to_md_slot_map[slot_idx + slot_idx_start]; + md_idx = hDirAC->render_to_md_map[slot_idx + slot_idx_start]; /* Determine target covariance matrix containing target binaural properties */ for ( bin = 0; bin < nBins; bin++ ) { @@ -1498,6 +1924,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric return; } #endif +#endif static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( diff --git a/lib_rend/ivas_sba_rendering.c b/lib_rend/ivas_sba_rendering.c index f316f2885f..26d9cbdf17 100644 --- a/lib_rend/ivas_sba_rendering.c +++ b/lib_rend/ivas_sba_rendering.c @@ -96,7 +96,7 @@ void ivas_sba_prototype_renderer_sf( /* Apply mixing matrix */ for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) { - int16_t md_idx = hSpar->render_to_md_slot_map[ts + slot_idx_start]; + int16_t md_idx = hSpar->render_to_md_map[ts + slot_idx_start]; /* determine SPAR parameters for this time slot */ ivas_spar_get_parameters( hSpar, hDecoderConfig, md_idx, numch_out, numch_in, num_spar_bands, mixer_mat ); @@ -143,7 +143,7 @@ void ivas_sba_prototype_renderer_sf( } /* Update mixing matrices */ - if ( ( ( slot_idx_start + ts + 1 ) == hSpar->num_slots ) || ( ( md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME ) != ( hSpar->render_to_md_slot_map[ts + slot_idx_start + 1] / JBM_CLDFB_SLOTS_IN_SUBFRAME ) ) ) + if ( ( ( slot_idx_start + ts + 1 ) == hSpar->num_slots ) || ( ( md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME ) != ( hSpar->render_to_md_map[ts + slot_idx_start + 1] / JBM_CLDFB_SLOTS_IN_SUBFRAME ) ) ) { /* we have crossed an unadapted parameter sf border, update previous mixing matrices */ int16_t md_sf = md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME; -- GitLab From ce82acf67f80cff9347deaa9c891f70bd39603bc Mon Sep 17 00:00:00 2001 From: knj Date: Tue, 9 May 2023 10:30:48 +0200 Subject: [PATCH 093/331] increase smoketest timeout and add printouts for easier log reading --- .gitlab-ci.yml | 2 +- ci/smoke_test.sh | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7ce29dfd65..377cbc8b24 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -314,7 +314,7 @@ codec-smoke-test: extends: - .test-job-linux-needs-testv-dir - .rules-merge-request - timeout: "5 minutes" + timeout: "10 minutes" stage: test needs: ["build-codec-linux-cmake"] script: diff --git a/ci/smoke_test.sh b/ci/smoke_test.sh index 852b74fe47..a301a48e54 100755 --- a/ci/smoke_test.sh +++ b/ci/smoke_test.sh @@ -78,28 +78,37 @@ fi # treat ISM modes separately because passing the metadata files to MASA modes causes crashes ism_modes=$(./scripts/runIvasCodec.py -l | grep ISM) non_ism_modes=$(./scripts/runIvasCodec.py -l | grep -v ISM) +echo "\n======================= 1. non-ism modes no FEC =======================\n\n" ./scripts/runIvasCodec.py -m $non_ism_modes -p $cfg -U 1 $WORKERS | tee smoke_test_output.txt +echo "\n======================= 2. ism modes no FEC =======================\n\n" ./scripts/runIvasCodec.py -m $ism_modes -p $cfg -U 1 $WORKERS $ism_md_cmd | tee smoke_test_output.txt # run the decoding again, but with 15% frame loss +echo "\n======================= 3. all modes with FEC =======================\n\n" ./scripts/runIvasCodec.py -p $cfg -U 1 $WORKERS -D="-fec 15" --decoder_only | tee smoke_test_output_plc.txt # run JBM modes - EXT is excluded as not supported yet modes_with_no_ext_out=$(./scripts/runIvasCodec.py -l | grep -v MASA | grep -v ISM) +modes_with_ext_out=$(./scripts/runIvasCodec.py -l | grep 'MASA\|ISM') +echo "\n======================= 4. JBM, modes with no EXT =======================\n\n" ./scripts/runIvasCodec.py -m $modes_with_no_ext_out -p $cfg -U 1 $WORKERS --decoder_only --jbm_file $dly_profile | tee smoke_test_output_jbm_noEXT.txt -./scripts/runIvasCodec.py -C MASA ISM1 ISM2 ISM3 ISM4 -p $cfg -U 1 $WORKERS --decoder_only --jbm_file $dly_profile --oc BINAURAL BINAURAL_ROOM mono stereo FOA HOA3 5_1 7_1_4 | tee -a smoke_test_output_jbm_noEXT.txt +echo "\n======================= 5. JBM, modes with EXT =======================\n\n" +./scripts/runIvasCodec.py -C $modes_with_ext_out -p $cfg -U 1 $WORKERS --decoder_only --jbm_file $dly_profile --oc BINAURAL BINAURAL_ROOM mono stereo FOA HOA3 5_1 7_1_4 | tee -a smoke_test_output_jbm_noEXT.txt # run all modes with binaural output using external files modes_with_bin_out="SBA PlanarSBA MASA MC ISM1 ISM2 ISM3 ISM4" bin_out_modes="BINAURAL BINAURAL_ROOM" +echo "\n======================= 6. binaural out with HRTF files - WB =======================\n\n" wb_modes=$(./scripts/runIvasCodec.py -l -C $modes_with_bin_out | grep _wb_) hrtf_wb="../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin" ./scripts/runIvasCodec.py -p $cfg -m $wb_modes -U 1 $WORKERS -D="-hrtf ${hrtf_wb}" --decoder_only --oc $bin_out_modes | tee -a smoke_test_output_hrtf.txt +echo "\n======================= 7. binaural out with HRTF files - SWB =======================\n\n" swb_modes=$(./scripts/runIvasCodec.py -l -C $modes_with_bin_out | grep _swb_) hrtf_swb="../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin" ./scripts/runIvasCodec.py -p $cfg -m $swb_modes -U 1 $WORKERS -D="-hrtf ${hrtf_swb}" --decoder_only --oc $bin_out_modes | tee -a smoke_test_output_hrtf.txt +echo "\n======================= 8. binaural out with HRTF files - FB =======================\n\n" fb_modes=$(./scripts/runIvasCodec.py -l -C $modes_with_bin_out | grep _fb_) hrtf_fb="../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin" ./scripts/runIvasCodec.py -p $cfg -m $fb_modes -U 1 $WORKERS -D="-hrtf ${hrtf_fb}" --decoder_only --oc $bin_out_modes | tee -a smoke_test_output_hrtf.txt -- GitLab From 0830d2084f2ffad9c18958e42bc22991a6788668 Mon Sep 17 00:00:00 2001 From: knj Date: Tue, 9 May 2023 10:36:23 +0200 Subject: [PATCH 094/331] fix typo in command --- ci/smoke_test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/smoke_test.sh b/ci/smoke_test.sh index a301a48e54..85f695da22 100755 --- a/ci/smoke_test.sh +++ b/ci/smoke_test.sh @@ -92,7 +92,7 @@ modes_with_ext_out=$(./scripts/runIvasCodec.py -l | grep 'MASA\|ISM') echo "\n======================= 4. JBM, modes with no EXT =======================\n\n" ./scripts/runIvasCodec.py -m $modes_with_no_ext_out -p $cfg -U 1 $WORKERS --decoder_only --jbm_file $dly_profile | tee smoke_test_output_jbm_noEXT.txt echo "\n======================= 5. JBM, modes with EXT =======================\n\n" -./scripts/runIvasCodec.py -C $modes_with_ext_out -p $cfg -U 1 $WORKERS --decoder_only --jbm_file $dly_profile --oc BINAURAL BINAURAL_ROOM mono stereo FOA HOA3 5_1 7_1_4 | tee -a smoke_test_output_jbm_noEXT.txt +./scripts/runIvasCodec.py -m $modes_with_ext_out -p $cfg -U 1 $WORKERS --decoder_only --jbm_file $dly_profile --oc BINAURAL BINAURAL_ROOM mono stereo FOA HOA3 5_1 7_1_4 | tee -a smoke_test_output_jbm_noEXT.txt # run all modes with binaural output using external files modes_with_bin_out="SBA PlanarSBA MASA MC ISM1 ISM2 ISM3 ISM4" -- GitLab From 94c54edd8c41e024aff4cb18afefd3ce9ae00795 Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 9 May 2023 08:41:05 +0000 Subject: [PATCH 095/331] Update lib_dec.c --- lib_dec/lib_dec.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index ee315bf399..076c0dc96e 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1238,6 +1238,14 @@ ivas_error IVAS_DEC_GetDelay( nSamples[2] = (int16_t) roundf( (float) st_ivas->binaural_latency_ns * hDecoderConfig->output_Fs / 1000000000.f ); nSamples[0] = nSamples[1] + nSamples[2]; +#ifdef FIX_MASA_DELAY_PRINTOUT + if ( st_ivas->ivas_format == MASA_FORMAT ) + { + /* note: in MASA, all delay is compensated at the decoder by default, so subtract the encoder delay for print-out */ + nSamples[1] -= NS2SA( hDecoderConfig->output_Fs, IVAS_ENC_DELAY_NS ); + } +#endif + *timeScale = hDecoderConfig->output_Fs; return IVAS_ERR_OK; -- GitLab From 283c897f8f668c331d887a088c5a6084dfeba1ee Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 9 May 2023 08:42:02 +0000 Subject: [PATCH 096/331] Update options.h --- lib_com/options.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 1429f24a75..26d6469c72 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -177,6 +177,8 @@ #define FIX_357_DTX_32K /* Eri: issue 357 - Forced LP-CNG at 32k */ #define FIX_435_ISM_MERGE_BUG /* Eri: Merge bug fix for ISM NULL metadata and tcx_only cases */ #define FIX_355_REFACTOR_PARAMBIN_TO_5MS /* Nokia: Fixes issue 355 by refactoring parametric binauralizer code to 5 ms mode */ +#define FIX_MASA_DELAY_PRINTOUT /* VA: issue 444: fix MASA decoder delay printout */ + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ -- GitLab From e8c8d6c0b893db626a721bab2d74536092dbd9bf Mon Sep 17 00:00:00 2001 From: knj Date: Tue, 9 May 2023 10:50:23 +0200 Subject: [PATCH 097/331] exclude ISM+ modes again --- ci/smoke_test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/smoke_test.sh b/ci/smoke_test.sh index 85f695da22..8735584721 100755 --- a/ci/smoke_test.sh +++ b/ci/smoke_test.sh @@ -88,7 +88,7 @@ echo "\n======================= 3. all modes with FEC =======================\n\ # run JBM modes - EXT is excluded as not supported yet modes_with_no_ext_out=$(./scripts/runIvasCodec.py -l | grep -v MASA | grep -v ISM) -modes_with_ext_out=$(./scripts/runIvasCodec.py -l | grep 'MASA\|ISM') +modes_with_ext_out=$(./scripts/runIvasCodec.py -l | grep 'MASA\|ISM' | grep -v ISM+) echo "\n======================= 4. JBM, modes with no EXT =======================\n\n" ./scripts/runIvasCodec.py -m $modes_with_no_ext_out -p $cfg -U 1 $WORKERS --decoder_only --jbm_file $dly_profile | tee smoke_test_output_jbm_noEXT.txt echo "\n======================= 5. JBM, modes with EXT =======================\n\n" -- GitLab From 838731d2f22e96a5113b49bcf6c3cdc9e2793805 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 10 May 2023 10:06:50 +0200 Subject: [PATCH 098/331] Add fixes under FIX_356_ISM_METADATA_SYNC --- apps/decoder.c | 5 +- lib_com/options.h | 2 +- lib_dec/ivas_objectRenderer_internal.c | 4 + lib_dec/ivas_stat_dec.h | 3 + lib_dec/lib_dec.c | 13 +- lib_dec/lib_dec.h | 5 + lib_rend/ivas_objectRenderer.c | 658 +++++++++++++------------ lib_rend/ivas_prot_rend.h | 6 + lib_rend/lib_rend.c | 38 ++ 9 files changed, 417 insertions(+), 317 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 22dc235fff..34ae45d396 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -354,8 +354,11 @@ int main( /*------------------------------------------------------------------------------------------* * Configure the decoder *------------------------------------------------------------------------------------------*/ - +#ifdef FIX_356_ISM_METADATA_SYNC + if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.renderConfigEnabled, arg.delayCompensationEnabled ) ) != IVAS_ERR_OK ) +#else if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.renderConfigEnabled ) ) != IVAS_ERR_OK ) +#endif { fprintf( stderr, "\nConfigure failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; diff --git a/lib_com/options.h b/lib_com/options.h index 78b765d30e..849e70bec0 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -179,7 +179,7 @@ #define FIX_355_REFACTOR_PARAMBIN_TO_5MS /* Nokia: Fixes issue 355 by refactoring parametric binauralizer code to 5 ms mode */ #define FIX_411_EVS_BE_TESTS_ON_WINDOWS_FAILING /* Eri: Fix incorrect use of stack variable used for channel aware config file */ #define COMBINED_FORMAT_SIGNALING /* VA: Introduce a signaling bit for combined format coding */ - +#define FIX_356_ISM_METADATA_SYNC /* Eri: issue 356: Metadata out-of-synch for -no_delay_comp */ #define FIX_440_PARAM_ISM_DIR_NOISE /* FhG: Issue 440: Fix directional background noise becoming diffuse in ParamISM */ diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index f1c1fc04f2..1dd3a1b1c8 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -75,6 +75,10 @@ ivas_error ivas_td_binaural_renderer( st_ivas->hReverb, st_ivas->transport_config, st_ivas->hBinRendererTd, st_ivas->nchan_transport, LFE_CHANNEL, st_ivas->ivas_format, +#ifdef FIX_356_ISM_METADATA_SYNC + st_ivas->hIsmMetaData, st_ivas->hDecoderConfig->Opt_delay_comp, st_ivas->hDecoderConfig->Opt_Headrotation, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Quaternions : NULL, +#else st_ivas->hIsmMetaData, st_ivas->hDecoderConfig->Opt_Headrotation, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Quaternions : NULL, +#endif ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Pos : NULL, output, output_frame ); } diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index ad453cd5bd..39e13e771a 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -1145,6 +1145,9 @@ typedef struct decoder_config_structure int16_t orientation_tracking; /* indicates orientation tracking type */ float no_diegetic_pan; int16_t Opt_AMR_WB; /* flag indicating AMR-WB IO mode */ +#ifdef FIX_356_ISM_METADATA_SYNC + int16_t Opt_delay_comp; /* flag indicating delay compensation active */ +#endif /* temp. development parameters */ #ifdef DEBUGGING diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index ee315bf399..5791fda0c6 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -226,6 +226,9 @@ static void init_decoder_config( hDecoderConfig->Opt_RendConfigCustom = 0; hDecoderConfig->orientation_tracking = orientation_tracking; hDecoderConfig->no_diegetic_pan = no_diegetic_pan; +#ifdef FIX_356_ISM_METADATA_SYNC + hDecoderConfig->Opt_delay_comp = 0; +#endif return; } @@ -388,7 +391,12 @@ ivas_error IVAS_DEC_Configure( const int16_t customLsOutputEnabled, /* i : enable custom loudspeaker setup handle */ const int16_t hrtfReaderEnabled, /* i : enable HRTF binary file input */ const int16_t enableHeadRotation, /* i : enable head rotation for binaural output */ - const int16_t renderConfigEnabled /* i : enable Renderer config. file for binaural output */ +#ifdef FIX_356_ISM_METADATA_SYNC + const int16_t renderConfigEnabled, /* i : enable Renderer config. file for binaural output */ + const int16_t delayCompensationEnabled /* i : enable delay compensation */ +#else + const int16_t renderConfigEnabled /* i : enable Renderer config. file for binaural output */ +#endif ) { Decoder_Struct *st_ivas; @@ -438,6 +446,9 @@ ivas_error IVAS_DEC_Configure( hDecoderConfig->Opt_Headrotation = enableHeadRotation; hDecoderConfig->Opt_HRTF_binary = hrtfReaderEnabled; hDecoderConfig->Opt_RendConfigCustom = renderConfigEnabled; +#ifdef FIX_356_ISM_METADATA_SYNC + hDecoderConfig->Opt_delay_comp = delayCompensationEnabled; +#endif /* Set decoder parameters to initial values */ if ( ( error = ivas_init_decoder_front( st_ivas ) ) != IVAS_ERR_OK ) diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index 17af564295..16aa8a66dd 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -130,7 +130,12 @@ ivas_error IVAS_DEC_Configure( const int16_t customLsOutputEnabled, /* i : enable custom loudspeaker setup handle */ const int16_t hrtfReaderEnabled, /* i : enable HRTF binary file input */ const int16_t enableHeadRotation, /* i : enable head rotation for binaural output */ +#ifdef FIX_356_ISM_METADATA_SYNC + const int16_t renderConfigEnabled, /* i : enable Renderer config. file for binaural output */ + const int16_t delayCompensationEnabled /* i : enable delay compensation */ +#else const int16_t renderConfigEnabled /* i : enable Renderer config. file for binaural output */ +#endif ); void IVAS_DEC_Close( diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 0618534448..a5d3d30863 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -256,398 +256,428 @@ ivas_error ivas_td_binaural_renderer_unwrap( const int16_t lfe_idx, /* i : LFE channel index */ const IVAS_FORMAT ivas_format, /* i : IVAS format */ ISM_METADATA_HANDLE *hIsmMetaData, /* i : ISM metadata handle */ - const int16_t Opt_Headrotation, /* i : Head rotation flag */ - const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ - const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ - float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ - const int16_t output_frame /* i : output frame length */ +#ifdef FIX_356_ISM_METADATA_SYNC + const int16_t Opt_delay_comp, /* i : Delay compensation flag */ +#endif + const int16_t Opt_Headrotation, /* i : Head rotation flag */ + const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ + const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ + float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ + const int16_t output_frame /* i : output frame length */ ) { int16_t subframe_length; int16_t subframe_idx; float reverb_signal[BINAURAL_CHANNELS][L_FRAME48k]; ivas_error error; +#ifdef FIX_356_ISM_METADATA_SYNC + int16_t subframe_update; + if ( Opt_delay_comp ) + { + subframe_update = 0; + } + else + { + subframe_update = 2; /* To be verified */ + } +#endif subframe_length = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES; +#ifndef FIX_356_ISM_METADATA_SYNC /* Update object position(s) */ - TDREND_Update_object_positions( hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, output ); + TDREND_Update_object_positions( hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, output ); +#endif + for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) + { +#ifdef FIX_356_ISM_METADATA_SYNC + if ( subframe_idx == subframe_update ) + { + /* Update object position(s) */ + TDREND_Update_object_positions( hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, output ); + } +#endif - for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) - { - /* Update the listener's location/orientation */ - TDREND_Update_listener_orientation( hBinRendererTd, Opt_Headrotation, ( Quaternions != NULL ) ? &Quaternions[subframe_idx] : NULL, ( Pos != NULL ) ? &Pos[subframe_idx] : NULL ); + /* Update the listener's location/orientation */ + TDREND_Update_listener_orientation( hBinRendererTd, Opt_Headrotation, ( Quaternions != NULL ) ? &Quaternions[subframe_idx] : NULL, ( Pos != NULL ) ? &Pos[subframe_idx] : NULL ); - if ( hReverb != NULL && hReverb->pConfig.roomAcoustics.late_reverb_on ) - { - if ( ( error = ivas_reverb_process( hReverb, transport_config, 0, output, reverb_signal, subframe_idx ) ) != IVAS_ERR_OK ) + if ( hReverb != NULL && hReverb->pConfig.roomAcoustics.late_reverb_on ) + { + if ( ( error = ivas_reverb_process( hReverb, transport_config, 0, output, reverb_signal, subframe_idx ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* Render subframe */ + if ( ( error = TDREND_GetMix( hBinRendererTd, output, subframe_length, subframe_idx ) ) != IVAS_ERR_OK ) { return error; } } - /* Render subframe */ - if ( ( error = TDREND_GetMix( hBinRendererTd, output, subframe_length, subframe_idx ) ) != IVAS_ERR_OK ) + + if ( hReverb != NULL && hReverb->pConfig.roomAcoustics.late_reverb_on ) { - return error; + /* add reverb to rendered signals */ + v_add( reverb_signal[0], output[0], output[0], output_frame ); + v_add( reverb_signal[1], output[1], output[1], output_frame ); } + + return IVAS_ERR_OK; } - if ( hReverb != NULL && hReverb->pConfig.roomAcoustics.late_reverb_on ) + /*---------------------------------------------------------------------* + * TDREND_GetMix() + * + * Render one 5 ms subframe from the mixer + *---------------------------------------------------------------------*/ + + ivas_error TDREND_GetMix( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + float output[][L_FRAME48k], /* i/o: ISM object synth / rendered output in 0,1 */ + const int16_t subframe_length, /* i/o: subframe length */ + const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ + ) { - /* add reverb to rendered signals */ - v_add( reverb_signal[0], output[0], output[0], output_frame ); - v_add( reverb_signal[1], output[1], output[1], output_frame ); - } + int16_t i; + TDREND_SRC_t *Src_p; + TDREND_SRC_SPATIAL_t *SrcSpatial_p; + TDREND_SRC_REND_t *SrcRend_p; + ivas_error error; + float output_buf[2][L_SPATIAL_SUBFR_48k]; /* Temp buffer for left/right rendered signal */ + float hrf_left_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; + float hrf_right_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; + int16_t intp_count; + error = IVAS_ERR_OK; + + /* Clear the output buffer to accumulate rendered sources */ + set_f( output_buf[0], 0.0f, subframe_length ); + set_f( output_buf[1], 0.0f, subframe_length ); + + /* Clear interpolation buffers and counter */ + set_f( hrf_left_delta, 0.0f, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); + set_f( hrf_right_delta, 0.0f, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); + intp_count = 0; + + /* Create the mix */ + /* Loop through the source list and render each source */ + for ( i = 0; i < hBinRendererTd->NumOfSrcs; i++ ) + { + Src_p = hBinRendererTd->Sources[i]; + SrcSpatial_p = Src_p->SrcSpatial_p; + SrcRend_p = Src_p->SrcRend_p; - return IVAS_ERR_OK; -} + /* Update rendering params if needed */ + if ( hBinRendererTd->Listener_p->PoseUpdated || SrcSpatial_p->Updated ) + { + TDREND_SRC_REND_UpdateFiltersFromSpatialParams( hBinRendererTd, SrcRend_p, SrcSpatial_p, Src_p->hrf_left_prev, + Src_p->hrf_right_prev, hrf_left_delta, hrf_right_delta, &intp_count, &Src_p->filterlength, &Src_p->itd, &Src_p->Gain, Src_p, subframe_idx ); + } + /* Render source if needed */ + if ( ( SrcRend_p->InputAvailable == TRUE ) && ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING ) ) + { + error = TDREND_REND_RenderSourceHRFilt( Src_p, hrf_left_delta, hrf_right_delta, intp_count, output_buf, subframe_length ); + } + } -/*---------------------------------------------------------------------* - * TDREND_GetMix() - * - * Render one 5 ms subframe from the mixer - *---------------------------------------------------------------------*/ + /* Populate output variable */ + mvr2r( output_buf[0], output[0] + subframe_idx * subframe_length, subframe_length ); /* Left */ + mvr2r( output_buf[1], output[1] + subframe_idx * subframe_length, subframe_length ); /* Right */ -ivas_error TDREND_GetMix( - BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ - float output[][L_FRAME48k], /* i/o: ISM object synth / rendered output in 0,1 */ - const int16_t subframe_length, /* i/o: subframe length */ - const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ -) -{ - int16_t i; - TDREND_SRC_t *Src_p; - TDREND_SRC_SPATIAL_t *SrcSpatial_p; - TDREND_SRC_REND_t *SrcRend_p; - ivas_error error; - float output_buf[2][L_SPATIAL_SUBFR_48k]; /* Temp buffer for left/right rendered signal */ - float hrf_left_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; - float hrf_right_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; - int16_t intp_count; - error = IVAS_ERR_OK; + /* Clear the PoseUpdated and Source position update flags */ + TDREND_Clear_Update_flags( hBinRendererTd ); + + return error; + } - /* Clear the output buffer to accumulate rendered sources */ - set_f( output_buf[0], 0.0f, subframe_length ); - set_f( output_buf[1], 0.0f, subframe_length ); - /* Clear interpolation buffers and counter */ - set_f( hrf_left_delta, 0.0f, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); - set_f( hrf_right_delta, 0.0f, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); - intp_count = 0; + /*---------------------------------------------------------------------* + * TDREND_Clear_Update_flags() + * + * Initializes the audio mixer module + *---------------------------------------------------------------------*/ - /* Create the mix */ - /* Loop through the source list and render each source */ - for ( i = 0; i < hBinRendererTd->NumOfSrcs; i++ ) + static void TDREND_Clear_Update_flags( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd /* i/o: TD renderer handle */ + ) { - Src_p = hBinRendererTd->Sources[i]; - SrcSpatial_p = Src_p->SrcSpatial_p; - SrcRend_p = Src_p->SrcRend_p; + int16_t i; - /* Update rendering params if needed */ - if ( hBinRendererTd->Listener_p->PoseUpdated || SrcSpatial_p->Updated ) - { - TDREND_SRC_REND_UpdateFiltersFromSpatialParams( hBinRendererTd, SrcRend_p, SrcSpatial_p, Src_p->hrf_left_prev, - Src_p->hrf_right_prev, hrf_left_delta, hrf_right_delta, &intp_count, &Src_p->filterlength, &Src_p->itd, &Src_p->Gain, Src_p, subframe_idx ); - } + hBinRendererTd->Listener_p->PoseUpdated = FALSE; - /* Render source if needed */ - if ( ( SrcRend_p->InputAvailable == TRUE ) && ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING ) ) + for ( i = 0; i < hBinRendererTd->NumOfSrcs; i++ ) { - error = TDREND_REND_RenderSourceHRFilt( Src_p, hrf_left_delta, hrf_right_delta, intp_count, output_buf, subframe_length ); + hBinRendererTd->Sources[i]->SrcSpatial_p->Updated = FALSE; } - } - - /* Populate output variable */ - mvr2r( output_buf[0], output[0] + subframe_idx * subframe_length, subframe_length ); /* Left */ - mvr2r( output_buf[1], output[1] + subframe_idx * subframe_length, subframe_length ); /* Right */ - /* Clear the PoseUpdated and Source position update flags */ - TDREND_Clear_Update_flags( hBinRendererTd ); + return; + } - return error; -} + /*---------------------------------------------------------------------* + * TDREND_Update_object_positions() + * + * Update object position(s) + *---------------------------------------------------------------------*/ + + void TDREND_Update_object_positions( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o : TD Renderer handle */ + const int16_t num_src, /* i : number of sources to render */ + const int16_t lfe_idx, /* i : Input LFE index */ + const IVAS_FORMAT in_format, /* i : Format of input sources */ + const ISM_METADATA_HANDLE *hIsmMetaData, /* i : Input metadata for ISM objects */ + float output[][L_FRAME48k] /* i/o: SCE/MC channels */ + ) + { + TDREND_DirAtten_t *DirAtten_p; + int16_t nS; + float Pos[3]; + float Dir[3]; + int16_t c_indx; -/*---------------------------------------------------------------------* - * TDREND_Clear_Update_flags() - * - * Initializes the audio mixer module - *---------------------------------------------------------------------*/ + DirAtten_p = hBinRendererTd->DirAtten_p; -static void TDREND_Clear_Update_flags( - BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd /* i/o: TD renderer handle */ -) -{ - int16_t i; + /* For each source, write the frame data to the source object*/ + c_indx = 0; + for ( nS = 0; nS < num_src; nS++ ) + { + if ( !( in_format == MC_FORMAT && nS == lfe_idx ) ) /* Skip LFE for MC */ + { + hBinRendererTd->Sources[c_indx]->InputFrame_p = output[nS]; + hBinRendererTd->Sources[c_indx]->SrcRend_p->InputAvailable = TRUE; + c_indx++; + } - hBinRendererTd->Listener_p->PoseUpdated = FALSE; + if ( in_format == ISM_FORMAT ) + { - for ( i = 0; i < hBinRendererTd->NumOfSrcs; i++ ) - { - hBinRendererTd->Sources[i]->SrcSpatial_p->Updated = FALSE; - } + /* Update the source positions */ + /* Source position and direction */ + angles_to_vec( hIsmMetaData[nS]->radius, hIsmMetaData[nS]->azimuth, hIsmMetaData[nS]->elevation, Pos ); + angles_to_vec( 1.0f, hIsmMetaData[nS]->yaw, hIsmMetaData[nS]->pitch, Dir ); + /* Source directivity info */ + DirAtten_p->ConeInnerAngle = 360.0f; + DirAtten_p->ConeOuterAngle = 360.0f; + DirAtten_p->ConeOuterGain = 1.0f; - return; -} + TDREND_MIX_SRC_SetPos( hBinRendererTd, nS, Pos ); + TDREND_MIX_SRC_SetDirAtten( hBinRendererTd, nS, DirAtten_p ); + TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING ); + TDREND_MIX_SRC_SetDir( hBinRendererTd, nS, Dir ); + } + } -/*---------------------------------------------------------------------* - * TDREND_Update_object_positions() - * - * Update object position(s) - *---------------------------------------------------------------------*/ + return; + } -void TDREND_Update_object_positions( - BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o : TD Renderer handle */ - const int16_t num_src, /* i : number of sources to render */ - const int16_t lfe_idx, /* i : Input LFE index */ - const IVAS_FORMAT in_format, /* i : Format of input sources */ - const ISM_METADATA_HANDLE *hIsmMetaData, /* i : Input metadata for ISM objects */ - float output[][L_FRAME48k] /* i/o: SCE/MC channels */ -) -{ - TDREND_DirAtten_t *DirAtten_p; - int16_t nS; - float Pos[3]; - float Dir[3]; - int16_t c_indx; - DirAtten_p = hBinRendererTd->DirAtten_p; + /*---------------------------------------------------------------------* + * TDREND_Update_listener_orientation() + * + * Update listener orientation (s) + *---------------------------------------------------------------------*/ - /* For each source, write the frame data to the source object*/ - c_indx = 0; - for ( nS = 0; nS < num_src; nS++ ) + void TDREND_Update_listener_orientation( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD Renderer handle */ + const int16_t headRotEnabled, /* i : Headrotation flag */ + const IVAS_QUATERNION *headPosition, /* i : Listener orientation */ + const IVAS_VECTOR3 *Pos /* i : Listener Position */ + ) { - if ( !( in_format == MC_FORMAT && nS == lfe_idx ) ) /* Skip LFE for MC */ + float FrontVec[3]; + float UpVec[3]; + float Rmat[3][3]; + float Pos_p[3]; + + if ( headRotEnabled ) { - hBinRendererTd->Sources[c_indx]->InputFrame_p = output[nS]; - hBinRendererTd->Sources[c_indx]->SrcRend_p->InputAvailable = TRUE; - c_indx++; + /* Obtain head rotation matrix */ + QuatToRotMat( *headPosition, Rmat ); + /* Apply rotation matrix to looking vector [1;0;0] */ + FrontVec[0] = Rmat[0][0]; + FrontVec[1] = Rmat[0][1]; + FrontVec[2] = Rmat[0][2]; + /* Apply rotation matrix to up vector [0;0;1] */ + UpVec[0] = Rmat[2][0]; + UpVec[1] = Rmat[2][1]; + UpVec[2] = Rmat[2][2]; + /* Input position */ + Pos_p[0] = ( *Pos ).x; + Pos_p[1] = ( *Pos ).y; + Pos_p[2] = ( *Pos ).z; } - - if ( in_format == ISM_FORMAT ) + else { - - /* Update the source positions */ - /* Source position and direction */ - angles_to_vec( hIsmMetaData[nS]->radius, hIsmMetaData[nS]->azimuth, hIsmMetaData[nS]->elevation, Pos ); - angles_to_vec( 1.0f, hIsmMetaData[nS]->yaw, hIsmMetaData[nS]->pitch, Dir ); - /* Source directivity info */ - DirAtten_p->ConeInnerAngle = 360.0f; - DirAtten_p->ConeOuterAngle = 360.0f; - DirAtten_p->ConeOuterGain = 1.0f; - - TDREND_MIX_SRC_SetPos( hBinRendererTd, nS, Pos ); - TDREND_MIX_SRC_SetDirAtten( hBinRendererTd, nS, DirAtten_p ); - TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING ); - - TDREND_MIX_SRC_SetDir( hBinRendererTd, nS, Dir ); + /* Oriented with looking vector along the x axis */ + FrontVec[0] = 1.0f; + FrontVec[1] = 0.0f; + FrontVec[2] = 0.0f; + /* Oriented with up vector along the z axis */ + UpVec[0] = 0.0f; + UpVec[1] = 0.0f; + UpVec[2] = 1.0f; + /* Listener at the origin */ + Pos_p[0] = 0.0f; + Pos_p[1] = 0.0f; + Pos_p[2] = 0.0f; } - } - - return; -} - -/*---------------------------------------------------------------------* - * TDREND_Update_listener_orientation() - * - * Update listener orientation (s) - *---------------------------------------------------------------------*/ - -void TDREND_Update_listener_orientation( - BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD Renderer handle */ - const int16_t headRotEnabled, /* i : Headrotation flag */ - const IVAS_QUATERNION *headPosition, /* i : Listener orientation */ - const IVAS_VECTOR3 *Pos /* i : Listener Position */ -) -{ - float FrontVec[3]; - float UpVec[3]; - float Rmat[3][3]; - float Pos_p[3]; + /* Set the listener position and orientation:*/ + TDREND_MIX_LIST_SetPos( hBinRendererTd, Pos_p ); + TDREND_MIX_LIST_SetOrient( hBinRendererTd, FrontVec, UpVec ); - if ( headRotEnabled ) - { - /* Obtain head rotation matrix */ - QuatToRotMat( *headPosition, Rmat ); - /* Apply rotation matrix to looking vector [1;0;0] */ - FrontVec[0] = Rmat[0][0]; - FrontVec[1] = Rmat[0][1]; - FrontVec[2] = Rmat[0][2]; - /* Apply rotation matrix to up vector [0;0;1] */ - UpVec[0] = Rmat[2][0]; - UpVec[1] = Rmat[2][1]; - UpVec[2] = Rmat[2][2]; - /* Input position */ - Pos_p[0] = ( *Pos ).x; - Pos_p[1] = ( *Pos ).y; - Pos_p[2] = ( *Pos ).z; - } - else - { - /* Oriented with looking vector along the x axis */ - FrontVec[0] = 1.0f; - FrontVec[1] = 0.0f; - FrontVec[2] = 0.0f; - /* Oriented with up vector along the z axis */ - UpVec[0] = 0.0f; - UpVec[1] = 0.0f; - UpVec[2] = 1.0f; - /* Listener at the origin */ - Pos_p[0] = 0.0f; - Pos_p[1] = 0.0f; - Pos_p[2] = 0.0f; + return; } - /* Set the listener position and orientation:*/ - TDREND_MIX_LIST_SetPos( hBinRendererTd, Pos_p ); - TDREND_MIX_LIST_SetOrient( hBinRendererTd, FrontVec, UpVec ); - return; -} + /*---------------------------------------------------------------------* + * ivas_td_binaural_open_ext() + * + * + *---------------------------------------------------------------------*/ + ivas_error ivas_td_binaural_open_ext( + TDREND_WRAPPER * pTDRend, + IVAS_REND_AudioConfig inConfig, + RENDER_CONFIG_DATA * hRendCfg, /* i : Renderer configuration */ + LSSETUP_CUSTOM_STRUCT * customLsInput, + const int32_t outFs ) + { + int16_t nchan_transport; + AUDIO_CONFIG transport_config; + IVAS_FORMAT ivas_format; + IVAS_OUTPUT_SETUP hTransSetup; + ivas_error error; + float *directivity = NULL; -/*---------------------------------------------------------------------* - * ivas_td_binaural_open_ext() - * - * - *---------------------------------------------------------------------*/ + if ( inConfig != IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) + { + if ( ( error = getAudioConfigNumChannels( inConfig, &nchan_transport ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + nchan_transport = customLsInput->num_spk; + } -ivas_error ivas_td_binaural_open_ext( - TDREND_WRAPPER *pTDRend, - IVAS_REND_AudioConfig inConfig, - RENDER_CONFIG_DATA *hRendCfg, /* i : Renderer configuration */ - LSSETUP_CUSTOM_STRUCT *customLsInput, - const int32_t outFs ) -{ - int16_t nchan_transport; - AUDIO_CONFIG transport_config; - IVAS_FORMAT ivas_format; - IVAS_OUTPUT_SETUP hTransSetup; - ivas_error error; - float *directivity = NULL; + transport_config = getIvasAudioConfigFromRendAudioConfig( inConfig ); + ivas_format = ( getAudioConfigType( inConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ? MC_FORMAT : ISM_FORMAT; + hTransSetup.ls_azimuth = customLsInput->ls_azimuth; + hTransSetup.ls_elevation = customLsInput->ls_elevation; - if ( inConfig != IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) - { - if ( ( error = getAudioConfigNumChannels( inConfig, &nchan_transport ) ) != IVAS_ERR_OK ) + if ( NULL != hRendCfg ) { - return error; + directivity = hRendCfg->directivity; } - } - else - { - nchan_transport = customLsInput->num_spk; - } - transport_config = getIvasAudioConfigFromRendAudioConfig( inConfig ); - ivas_format = ( getAudioConfigType( inConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ? MC_FORMAT : ISM_FORMAT; - hTransSetup.ls_azimuth = customLsInput->ls_azimuth; - hTransSetup.ls_elevation = customLsInput->ls_elevation; - - if ( NULL != hRendCfg ) - { - directivity = hRendCfg->directivity; + return ivas_td_binaural_open_unwrap( &pTDRend->hHrtfTD, outFs, nchan_transport, ivas_format, transport_config, directivity, hTransSetup, &pTDRend->hBinRendererTd, &pTDRend->binaural_latency_ns ); } - return ivas_td_binaural_open_unwrap( &pTDRend->hHrtfTD, outFs, nchan_transport, ivas_format, transport_config, directivity, hTransSetup, &pTDRend->hBinRendererTd, &pTDRend->binaural_latency_ns ); -} - - -/*---------------------------------------------------------------------* - * ivas_td_binaural_renderer_ext() - * - * Receives the current frames for the object streams, updates metadata - * and renders the current frame. - *---------------------------------------------------------------------*/ - -ivas_error ivas_td_binaural_renderer_ext( - const TDREND_WRAPPER *pTDRend, /* i : TD Renderer wrapper structure */ - const IVAS_REND_AudioConfig inConfig, /* i : Input audio configuration */ - const LSSETUP_CUSTOM_STRUCT *customLsInput, /* i : Input custom loudspeaker layout */ - const IVAS_REND_HeadRotData *headRotData, /* i : Input head positions */ - const IVAS_REND_AudioObjectPosition *currentPos, /* i : Object position */ - const REVERB_HANDLE hReverb, /* i : Reverberator handle */ - const int16_t output_frame, /* i : output frame length */ - float output[][L_FRAME48k] /* i/o: SCE channels / Binaural synthesis */ -) -{ - ISM_METADATA_FRAME hIsmMetaDataFrame; - ISM_METADATA_HANDLE hIsmMetaData[1]; - int16_t lfe_idx; - int16_t num_src; - IVAS_FORMAT ivas_format; - IVAS_REND_AudioConfigType inConfigType; - AUDIO_CONFIG transport_config; - ivas_error error; - - push_wmops( "ivas_td_binaural_renderer_ext" ); - inConfigType = getAudioConfigType( inConfig ); - lfe_idx = LFE_CHANNEL; - hIsmMetaData[0] = NULL; - - if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) + /*---------------------------------------------------------------------* + * ivas_td_binaural_renderer_ext() + * + * Receives the current frames for the object streams, updates metadata + * and renders the current frame. + *---------------------------------------------------------------------*/ + + ivas_error ivas_td_binaural_renderer_ext( + const TDREND_WRAPPER *pTDRend, /* i : TD Renderer wrapper structure */ + const IVAS_REND_AudioConfig inConfig, /* i : Input audio configuration */ + const LSSETUP_CUSTOM_STRUCT *customLsInput, /* i : Input custom loudspeaker layout */ + const IVAS_REND_HeadRotData *headRotData, /* i : Input head positions */ + const IVAS_REND_AudioObjectPosition *currentPos, /* i : Object position */ + const REVERB_HANDLE hReverb, /* i : Reverberator handle */ +#ifdef FIX_356_ISM_METADATA_SYNC + const int16_t Opt_delay_comp, /* i : Delay compensation flag */ +#endif + const int16_t output_frame, /* i : output frame length */ + float output[][L_FRAME48k] /* i/o: SCE channels / Binaural synthesis */ + ) { - ivas_format = MC_FORMAT; - transport_config = getIvasAudioConfigFromRendAudioConfig( inConfig ); - if ( inConfig != IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) + ISM_METADATA_FRAME hIsmMetaDataFrame; + ISM_METADATA_HANDLE hIsmMetaData[1]; + int16_t lfe_idx; + int16_t num_src; + IVAS_FORMAT ivas_format; + IVAS_REND_AudioConfigType inConfigType; + AUDIO_CONFIG transport_config; + ivas_error error; + + push_wmops( "ivas_td_binaural_renderer_ext" ); + + inConfigType = getAudioConfigType( inConfig ); + lfe_idx = LFE_CHANNEL; + hIsmMetaData[0] = NULL; + + if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) { - if ( ( error = getAudioConfigNumChannels( inConfig, &num_src ) ) != IVAS_ERR_OK ) + ivas_format = MC_FORMAT; + transport_config = getIvasAudioConfigFromRendAudioConfig( inConfig ); + if ( inConfig != IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) { - return error; + if ( ( error = getAudioConfigNumChannels( inConfig, &num_src ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + lfe_idx = ( customLsInput->num_lfe > 0 ) ? customLsInput->lfe_idx[0] : -1; + num_src = customLsInput->num_spk + customLsInput->num_lfe; } } else { - lfe_idx = ( customLsInput->num_lfe > 0 ) ? customLsInput->lfe_idx[0] : -1; - num_src = customLsInput->num_spk + customLsInput->num_lfe; + ivas_format = ISM_FORMAT; + num_src = 1; + transport_config = AUDIO_CONFIG_ISM1; + hIsmMetaData[0] = &hIsmMetaDataFrame; + hIsmMetaData[0]->azimuth = currentPos->azimuth; + hIsmMetaData[0]->elevation = currentPos->elevation; + hIsmMetaData[0]->yaw = currentPos->yaw; + hIsmMetaData[0]->pitch = currentPos->pitch; + hIsmMetaData[0]->radius = currentPos->radius; } - } - else - { - ivas_format = ISM_FORMAT; - num_src = 1; - transport_config = AUDIO_CONFIG_ISM1; - hIsmMetaData[0] = &hIsmMetaDataFrame; - hIsmMetaData[0]->azimuth = currentPos->azimuth; - hIsmMetaData[0]->elevation = currentPos->elevation; - hIsmMetaData[0]->yaw = currentPos->yaw; - hIsmMetaData[0]->pitch = currentPos->pitch; - hIsmMetaData[0]->radius = currentPos->radius; - } - - if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, - ( headRotData != NULL ) ? headRotData->headPositions : NULL, - ( headRotData != NULL ) ? headRotData->Pos : NULL, output, output_frame ) ) != IVAS_ERR_OK ) - { - return error; - } - pop_wmops(); +#ifdef FIX_356_ISM_METADATA_SYNC + if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, Opt_delay_comp, headRotData->headRotEnabled, +#else + if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, +#endif + ( headRotData != NULL ) ? headRotData->headPositions : NULL, + ( headRotData != NULL ) ? headRotData->Pos : NULL, output, output_frame ) ) != IVAS_ERR_OK ) + { + return error; + } - return IVAS_ERR_OK; -} + pop_wmops(); -/*---------------------------------------------------------------------* - * angles_to_vec() - * - * Convert azimuth and elevation angles to position/orientation vector - *---------------------------------------------------------------------*/ + return IVAS_ERR_OK; + } -static void angles_to_vec( - const float radius, /* i : radius */ - const float azimuth, /* i : Azimuth angle */ - const float elevation, /* i : Elevation angle */ - float *vec /* o : Pos/Dir vector */ -) -{ - vec[0] = radius * cosf( elevation * PI_OVER_180 ) * cosf( azimuth * PI_OVER_180 ); - vec[1] = radius * cosf( elevation * PI_OVER_180 ) * sinf( azimuth * PI_OVER_180 ); - vec[2] = radius * sinf( elevation * PI_OVER_180 ); + /*---------------------------------------------------------------------* + * angles_to_vec() + * + * Convert azimuth and elevation angles to position/orientation vector + *---------------------------------------------------------------------*/ + + static void angles_to_vec( + const float radius, /* i : radius */ + const float azimuth, /* i : Azimuth angle */ + const float elevation, /* i : Elevation angle */ + float *vec /* o : Pos/Dir vector */ + ) + { + vec[0] = radius * cosf( elevation * PI_OVER_180 ) * cosf( azimuth * PI_OVER_180 ); + vec[1] = radius * cosf( elevation * PI_OVER_180 ) * sinf( azimuth * PI_OVER_180 ); + vec[2] = radius * sinf( elevation * PI_OVER_180 ); - return; -} + return; + } diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index efa2111243..b3232656ae 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -228,6 +228,9 @@ ivas_error ivas_td_binaural_renderer_unwrap( const int16_t lfe_idx, /* i : LFE channel index */ const IVAS_FORMAT ivas_format, /* i : IVAS format */ ISM_METADATA_HANDLE *hIsmMetaData, /* i : ISM metadata handle */ +#ifdef FIX_356_ISM_METADATA_SYNC + const int16_t Opt_delay_comp, /* i : Delay compensation flag */ +#endif const int16_t Opt_Headrotation, /* i : Head rotation flag */ const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ @@ -242,6 +245,9 @@ ivas_error ivas_td_binaural_renderer_ext( const IVAS_REND_HeadRotData *headRotData, /* i : Input head positions */ const IVAS_REND_AudioObjectPosition *currentPos, /* i : Object position */ const REVERB_HANDLE hReverb, /* i : Reverberator handle */ +#ifdef FIX_356_ISM_METADATA_SYNC + const int16_t Opt_delay_comp, /* i : Delay compensation flag */ +#endif const int16_t output_frame, /* i : output frame length */ float output[][L_FRAME48k] /* i/o: SCE channels / Binaural synthesis */ ); diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 7744a6582b..da2c7c2023 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -191,6 +191,9 @@ struct IVAS_REND int8_t rendererConfigEnabled; RENDER_CONFIG_DATA *hRendererConfig; /* Renderer config pointer */ +#ifdef FIX_356_ISM_METADATA_SYNC + int8_t delayCompensationEnabled; +#endif }; @@ -4304,6 +4307,9 @@ static ivas_error rotateFrameSba( static ivas_error renderIsmToBinaural( const input_ism *ismInput, +#ifdef FIX_356_ISM_METADATA_SYNC + const int8_t delayCompensationEnabled, +#endif IVAS_REND_AudioBuffer outAudio ) { float tmpTDRendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; @@ -4320,6 +4326,9 @@ static ivas_error renderIsmToBinaural( ismInput->base.ctx.pHeadRotData, &ismInput->currentPos, ismInput->hReverb, +#ifdef FIX_356_ISM_METADATA_SYNC + (int16_t) delayCompensationEnabled, +#endif outAudio.config.numSamplesPerChannel, tmpTDRendBuffer ) ) != IVAS_ERR_OK ) { @@ -4335,6 +4344,9 @@ static ivas_error renderIsmToBinaural( static ivas_error renderIsmToBinauralRoom( input_ism *ismInput, +#ifdef FIX_356_ISM_METADATA_SYNC + const int8_t delayCompensationEnabled, +#endif IVAS_REND_AudioBuffer outAudio ) { int16_t i; @@ -4367,6 +4379,9 @@ static ivas_error renderIsmToBinauralRoom( ismInput->base.ctx.pHeadRotData, &ismInput->currentPos, ismInput->hReverb, +#ifdef FIX_356_ISM_METADATA_SYNC + (int16_t) delayCompensationEnabled, +#endif outAudio.config.numSamplesPerChannel, tmpRendBuffer ) ) != IVAS_ERR_OK ) { @@ -4575,6 +4590,9 @@ static ivas_error renderIsmToSba( static ivas_error renderInputIsm( input_ism *ismInput, const IVAS_REND_AudioConfig outConfig, +#ifdef FIX_356_ISM_METADATA_SYNC + const int8_t delayCompensationEnabled, +#endif const IVAS_REND_AudioBuffer outAudio ) { ivas_error error; @@ -4604,10 +4622,18 @@ static ivas_error renderInputIsm( switch ( outConfig ) { case IVAS_REND_AUDIO_CONFIG_BINAURAL: +#ifdef FIX_356_ISM_METADATA_SYNC + error = renderIsmToBinaural( ismInput, delayCompensationEnabled, outAudio ); +#else error = renderIsmToBinaural( ismInput, outAudio ); +#endif break; case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: +#ifdef FIX_356_ISM_METADATA_SYNC + error = renderIsmToBinauralRoom( ismInput, delayCompensationEnabled, outAudio ); +#else error = renderIsmToBinauralRoom( ismInput, outAudio ); +#endif break; default: return IVAS_ERR_INVALID_OUTPUT_FORMAT; @@ -4641,7 +4667,11 @@ static ivas_error renderActiveInputsIsm( continue; } +#ifdef FIX_356_ISM_METADATA_SYNC + if ( ( error = renderInputIsm( pCurrentInput, hIvasRend->outputConfig, hIvasRend->delayCompensationEnabled, outAudio ) ) != IVAS_ERR_OK ) +#else if ( ( error = renderInputIsm( pCurrentInput, hIvasRend->outputConfig, outAudio ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -4720,7 +4750,11 @@ static ivas_error renderMcToBinaural( copyBufferTo2dArray( mcInput->base.inputBuffer, tmpRendBuffer ); if ( ( error = ivas_td_binaural_renderer_ext( &mcInput->tdRendWrapper, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, NULL, +#ifdef FIX_356_ISM_METADATA_SYNC + mcInput->hReverb, 1, mcInput->base.inputBuffer.config.numSamplesPerChannel, tmpRendBuffer ) ) != IVAS_ERR_OK ) +#else mcInput->hReverb, mcInput->base.inputBuffer.config.numSamplesPerChannel, tmpRendBuffer ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -4790,7 +4824,11 @@ static ivas_error renderMcToBinauralRoom( copyBufferTo2dArray( mcInput->base.inputBuffer, tmpRendBuffer ); if ( ( error = ivas_td_binaural_renderer_ext( &mcInput->tdRendWrapper, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, +#ifdef FIX_356_ISM_METADATA_SYNC + NULL, mcInput->hReverb, 1, mcInput->base.inputBuffer.config.numSamplesPerChannel, tmpRendBuffer ) ) != IVAS_ERR_OK ) +#else NULL, mcInput->hReverb, mcInput->base.inputBuffer.config.numSamplesPerChannel, tmpRendBuffer ) ) != IVAS_ERR_OK ) +#endif { return error; } -- GitLab From f0ee4c37fc10fd5b7db1af218c84884d02573422 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Wed, 10 May 2023 11:19:25 +0200 Subject: [PATCH 099/331] adapt binaural reverb to variable subframe sizes, completely reintegrate JBM path into the parametric binaural rendering and remove duplicated functionality, fix typoes in ivas_mode.json, activate EXT interfache for JBM (not tested yet, but runs) --- apps/decoder.c | 49 ++++++ lib_com/ivas_prot.h | 2 + lib_dec/ivas_binRenderer_internal.c | 4 + lib_dec/ivas_masa_dec.c | 129 ++++++++++---- lib_dec/ivas_mc_param_dec.c | 2 +- lib_dec/ivas_stat_dec.h | 6 + lib_dec/lib_dec.c | 22 ++- lib_rend/ivas_dirac_dec_binaural_functions.c | 172 +++++++++++++++++-- lib_rend/ivas_prot_rend.h | 5 + lib_rend/ivas_reverb.c | 73 +++++++- lib_rend/ivas_sba_rendering.c | 42 +++++ scripts/config/ivas_modes.json | 4 +- 12 files changed, 450 insertions(+), 60 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 31f38ec1f3..16376844c6 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -2294,6 +2294,55 @@ static ivas_error decodeVoIP( { delayNumSamples -= nOutSamples; } + +#ifdef JBM_TSM_ON_TCS + /* Write ISM metadata to external file(s) */ + if ( decodedGoodFrame && arg.outputFormat == IVAS_DEC_OUTPUT_EXT ) + { + int16_t i; + + if ( bsFormat == IVAS_DEC_BS_OBJ ) + { + if ( ( error = IVAS_DEC_GetNumObjects( hIvasDec, &numObj ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetNumObjects: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + for ( i = 0; i < numObj; ++i ) + { + IVAS_ISM_METADATA IsmMetadata; + + if ( ( error = IVAS_DEC_GetObjectMetadata( hIvasDec, &IsmMetadata, 0, i ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetObjectMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( ( IsmFileWriter_writeFrame( IsmMetadata, ismWriters[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing ISM metadata to file %s\n", IsmFileWriter_getFilePath( ismWriters[i] ) ); + goto cleanup; + } + } + } + else if ( bsFormat == IVAS_DEC_BS_MASA ) + { + MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta; + if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); + goto cleanup; + } + } + } +#endif } if ( !arg.quietModeEnabled ) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 3362a69036..764e6e6940 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5030,6 +5030,7 @@ void ivas_masa_prerender( ); #ifdef JBM_TSM_ON_TCS +#ifndef FIX_355_REFACTOR_PARAMBIN_TO_5MS void ivas_spar_param_to_masa_param_mapping_sf( Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ #ifdef MASA_PARAMBIN_SF_MAP @@ -5049,6 +5050,7 @@ void ivas_spar_param_to_masa_param_mapping_sf( float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /* i : Input audio in CLDFB domain, imag */ ); #endif +#endif #ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS void ivas_spar_param_to_masa_param_mapping( diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 1144356094..bfe0a4bb53 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -1206,7 +1206,11 @@ void ivas_binRenderer( } #ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS +#ifdef JBM_TSM_ON_TCS + ivas_binaural_reverb_processSubframe( hBinRenderer->hReverb, BINAURAL_CHANNELS, numTimeSlots, inRe, inIm, reverbRe, reverbIm ); +#else ivas_binaural_reverb_processSubframe( hBinRenderer->hReverb, BINAURAL_CHANNELS, inRe, inIm, reverbRe, reverbIm ); +#endif #else ivas_binaural_reverb_processFrame( hBinRenderer->hReverb, BINAURAL_CHANNELS, inRe, inIm, reverbRe, reverbIm, 0u ); #endif diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 8404e41863..e4fafa2d25 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -1278,12 +1278,13 @@ ivas_error ivas_masa_dec_reconfigure( } +#ifdef JBM_TSM_ON_TCS +#ifndef FIX_355_REFACTOR_PARAMBIN_TO_5MS /*-------------------------------------------------------------------* * ivas_spar_param_to_masa_param_mapping() * * Determine MASA metadata from the SPAR metadata *-------------------------------------------------------------------*/ -#ifdef JBM_TSM_ON_TCS void ivas_spar_param_to_masa_param_mapping_sf( Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ #ifdef MASA_PARAMBIN_SF_MAP @@ -1437,9 +1438,9 @@ void ivas_spar_param_to_masa_param_mapping_sf( if ( hDiffuseDist != NULL ) { - set_zero( hDiffuseDist->diffuseRatioX[0], CLDFB_NO_CHANNELS_MAX ); - set_zero( hDiffuseDist->diffuseRatioY[0], CLDFB_NO_CHANNELS_MAX ); - set_zero( hDiffuseDist->diffuseRatioZ[0], CLDFB_NO_CHANNELS_MAX ); + set_zero( hDiffuseDist->diffuseRatioX, CLDFB_NO_CHANNELS_MAX ); + set_zero( hDiffuseDist->diffuseRatioY, CLDFB_NO_CHANNELS_MAX ); + set_zero( hDiffuseDist->diffuseRatioZ, CLDFB_NO_CHANNELS_MAX ); } for ( bin = 0; bin < nBins; bin++ ) @@ -1520,15 +1521,15 @@ void ivas_spar_param_to_masa_param_mapping_sf( if ( diffuseGainSum == 0.0f ) { - hDiffuseDist->diffuseRatioX[0][bin] = 1.0f / 3.0f; - hDiffuseDist->diffuseRatioY[0][bin] = 1.0f / 3.0f; - hDiffuseDist->diffuseRatioZ[0][bin] = 1.0f / 3.0f; + hDiffuseDist->diffuseRatioX[bin] = 1.0f / 3.0f; + hDiffuseDist->diffuseRatioY[bin] = 1.0f / 3.0f; + hDiffuseDist->diffuseRatioZ[bin] = 1.0f / 3.0f; } else { - hDiffuseDist->diffuseRatioX[0][bin] = diffuseGainX / ( diffuseGainSum + EPSILON ); - hDiffuseDist->diffuseRatioY[0][bin] = diffuseGainY / ( diffuseGainSum + EPSILON ); - hDiffuseDist->diffuseRatioZ[0][bin] = diffuseGainZ / ( diffuseGainSum + EPSILON ); + hDiffuseDist->diffuseRatioX[bin] = diffuseGainX / ( diffuseGainSum + EPSILON ); + hDiffuseDist->diffuseRatioY[bin] = diffuseGainY / ( diffuseGainSum + EPSILON ); + hDiffuseDist->diffuseRatioZ[bin] = diffuseGainZ / ( diffuseGainSum + EPSILON ); } } } @@ -1547,6 +1548,7 @@ void ivas_spar_param_to_masa_param_mapping_sf( return; } #endif +#endif #ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS void ivas_spar_param_to_masa_param_mapping( @@ -1561,8 +1563,8 @@ void ivas_spar_param_to_masa_param_mapping( int16_t dirac_write_idx; DIRAC_DEC_HANDLE hDirAC; DIFFUSE_DISTRIBUTION_HANDLE hDiffuseDist; - float mixer_mat_sf_bands_real[MAX_PARAM_SPATIAL_SUBFRAMES][SPAR_DIRAC_SPLIT_START_BAND][FOA_CHANNELS][FOA_CHANNELS]; - float mixer_mat_sf_bins_real[MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX][FOA_CHANNELS][FOA_CHANNELS]; + float mixer_mat_sf_bands_real[SPAR_DIRAC_SPLIT_START_BAND][FOA_CHANNELS][FOA_CHANNELS]; + float mixer_mat_sf_bins_real[CLDFB_NO_CHANNELS_MAX][FOA_CHANNELS][FOA_CHANNELS]; int16_t *band_grouping; int16_t band_start, band_end; float transportSignalEnergies[2][CLDFB_NO_CHANNELS_MAX]; @@ -1572,6 +1574,12 @@ void ivas_spar_param_to_masa_param_mapping( float foaCovarianceMtx[FOA_CHANNELS][FOA_CHANNELS]; float Iy, Iz, Ix, E, azi, ele, I, ratio; float diffuseGainX, diffuseGainY, diffuseGainZ, diffuseGainSum; +#ifdef JBM_TSM_ON_TCS + int16_t slot_idx, slot_idx_start, sf; + SPAR_DEC_HANDLE hSpar; + float slot_fac; +#endif + /* Set values */ hDirAC = st_ivas->hDirAC; @@ -1579,7 +1587,12 @@ void ivas_spar_param_to_masa_param_mapping( hDiffuseDist = st_ivas->hDirAC->hDiffuseDist; nchan_transport = st_ivas->nchan_transport; band_grouping = hDirAC->band_grouping; +#ifdef JBM_TSM_ON_TCS + hSpar = st_ivas->hSpar; + dirac_write_idx = hDirAC->render_to_md_map[subframe]; +#else dirac_write_idx = hDirAC->dirac_read_idx; /* Mixing matrices, from which MASA meta is determined, already have the delay compensation */ +#endif /* Init arrays */ for ( i = 0; i < FOA_CHANNELS; i++ ) @@ -1588,34 +1601,61 @@ void ivas_spar_param_to_masa_param_mapping( } /* Delay the SPAR mixing matrices to have them synced with the audio */ - if ( subframe < SPAR_META_DELAY_SUBFRAMES ) +#ifdef JBM_TSM_ON_TCS + slot_idx_start = hSpar->slots_rendered; + slot_fac = 1.0f / (float) hSpar->subframe_nbslots[subframe]; + + for ( slot_idx = 0; slot_idx < hSpar->subframe_nbslots[subframe]; slot_idx++ ) { - mixer_mat_index = subframe + MAX_PARAM_SPATIAL_SUBFRAMES - SPAR_META_DELAY_SUBFRAMES + 1; - for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ ) + sf = hSpar->render_to_md_map[slot_idx + slot_idx_start] / JBM_CLDFB_SLOTS_IN_SUBFRAME; +#endif + if ( subframe < SPAR_META_DELAY_SUBFRAMES ) { - for ( i = 0; i < FOA_CHANNELS; i++ ) +#ifdef JBM_TSM_ON_TCS + mixer_mat_index = sf + MAX_PARAM_SPATIAL_SUBFRAMES - SPAR_META_DELAY_SUBFRAMES + 1; +#else + mixer_mat_index = subframe + MAX_PARAM_SPATIAL_SUBFRAMES - SPAR_META_DELAY_SUBFRAMES + 1; +#endif + for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ ) { - for ( j = 0; j < FOA_CHANNELS; j++ ) + for ( i = 0; i < FOA_CHANNELS; i++ ) { - mixer_mat_sf_bands_real[subframe][band][i][j] = st_ivas->hSpar->hMdDec->mixer_mat_prev[mixer_mat_index][i][j][band]; + for ( j = 0; j < FOA_CHANNELS; j++ ) + { +#ifdef JBM_TSM_ON_TCS + mixer_mat_sf_bands_real[band][i][j] = slot_fac * st_ivas->hSpar->hMdDec->mixer_mat_prev[mixer_mat_index][i][j][band]; +#else + mixer_mat_sf_bands_real[band][i][j] = st_ivas->hSpar->hMdDec->mixer_mat_prev[mixer_mat_index][i][j][band]; +#endif + } } } } - } - else - { - mixer_mat_index = subframe - SPAR_META_DELAY_SUBFRAMES; - for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ ) + else { - for ( i = 0; i < FOA_CHANNELS; i++ ) +#ifdef JBM_TSM_ON_TCS + mixer_mat_index = sf - SPAR_META_DELAY_SUBFRAMES; +#else + mixer_mat_index = subframe - SPAR_META_DELAY_SUBFRAMES; +#endif + for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ ) { - for ( j = 0; j < FOA_CHANNELS; j++ ) + for ( i = 0; i < FOA_CHANNELS; i++ ) { - mixer_mat_sf_bands_real[subframe][band][i][j] = st_ivas->hSpar->hMdDec->mixer_mat[i][j][band + mixer_mat_index * IVAS_MAX_NUM_BANDS]; + for ( j = 0; j < FOA_CHANNELS; j++ ) + { +#ifdef JBM_TSM_ON_TCS + mixer_mat_sf_bands_real[band][i][j] = slot_fac * st_ivas->hSpar->hMdDec->mixer_mat[i][j][band + mixer_mat_index * IVAS_MAX_NUM_BANDS]; +#else + mixer_mat_sf_bands_real[band][i][j] = st_ivas->hSpar->hMdDec->mixer_mat[i][j][band + mixer_mat_index * IVAS_MAX_NUM_BANDS]; +#endif + } } } } +#ifdef JBM_TSM_ON_TCS } +#endif /* Map the mixing matrices from the frequency bands to frequency bins */ bin = 0; @@ -1629,7 +1669,7 @@ void ivas_spar_param_to_masa_param_mapping( { for ( j = 0; j < FOA_CHANNELS; j++ ) { - mixer_mat_sf_bins_real[subframe][bin][i][j] = mixer_mat_sf_bands_real[subframe][band][i][j]; + mixer_mat_sf_bins_real[bin][i][j] = mixer_mat_sf_bands_real[band][i][j]; } } } @@ -1666,9 +1706,15 @@ void ivas_spar_param_to_masa_param_mapping( if ( hDiffuseDist != NULL ) { +#ifdef JBM_TSM_ON_TCS + set_zero( hDiffuseDist->diffuseRatioX, CLDFB_NO_CHANNELS_MAX ); + set_zero( hDiffuseDist->diffuseRatioY, CLDFB_NO_CHANNELS_MAX ); + set_zero( hDiffuseDist->diffuseRatioZ, CLDFB_NO_CHANNELS_MAX ); +#else set_zero( hDiffuseDist->diffuseRatioX[subframe], CLDFB_NO_CHANNELS_MAX ); set_zero( hDiffuseDist->diffuseRatioY[subframe], CLDFB_NO_CHANNELS_MAX ); set_zero( hDiffuseDist->diffuseRatioZ[subframe], CLDFB_NO_CHANNELS_MAX ); +#endif } for ( bin = 0; bin < nBins; bin++ ) @@ -1695,7 +1741,7 @@ void ivas_spar_param_to_masa_param_mapping( inCovarianceMtx[1][0] = inCovarianceMtx[0][1]; } - compute_foa_cov_matrix( foaCovarianceMtx, inCovarianceMtx, mixer_mat_sf_bins_real[subframe][bin] ); + compute_foa_cov_matrix( foaCovarianceMtx, inCovarianceMtx, mixer_mat_sf_bins_real[bin] ); /* Estimate MASA metadata */ Iy = foaCovarianceMtx[0][1]; /* Intensity in Y direction */ @@ -1721,15 +1767,15 @@ void ivas_spar_param_to_masa_param_mapping( { if ( nchan_transport == 1 ) { - diffuseGainY = fabsf( mixer_mat_sf_bins_real[subframe][bin][1][1] ); - diffuseGainX = fabsf( mixer_mat_sf_bins_real[subframe][bin][3][2] ); - diffuseGainZ = fabsf( mixer_mat_sf_bins_real[subframe][bin][2][3] ); + diffuseGainY = fabsf( mixer_mat_sf_bins_real[bin][1][1] ); + diffuseGainX = fabsf( mixer_mat_sf_bins_real[bin][3][2] ); + diffuseGainZ = fabsf( mixer_mat_sf_bins_real[bin][2][3] ); } else if ( nchan_transport == 2 ) { - diffuseGainY = fabsf( mixer_mat_sf_bins_real[subframe][bin][1][1] * transportSignalEnergies[1][bin] ); - diffuseGainX = fabsf( mixer_mat_sf_bins_real[subframe][bin][3][2] * transportSignalEnergies[0][bin] ) + fabsf( mixer_mat_sf_bins_real[subframe][bin][3][1] * transportSignalEnergies[1][bin] ); - diffuseGainZ = fabsf( mixer_mat_sf_bins_real[subframe][bin][2][3] * transportSignalEnergies[0][bin] ) + fabsf( mixer_mat_sf_bins_real[subframe][bin][2][1] * transportSignalEnergies[1][bin] ); + diffuseGainY = fabsf( mixer_mat_sf_bins_real[bin][1][1] * transportSignalEnergies[1][bin] ); + diffuseGainX = fabsf( mixer_mat_sf_bins_real[bin][3][2] * transportSignalEnergies[0][bin] ) + fabsf( mixer_mat_sf_bins_real[bin][3][1] * transportSignalEnergies[1][bin] ); + diffuseGainZ = fabsf( mixer_mat_sf_bins_real[bin][2][3] * transportSignalEnergies[0][bin] ) + fabsf( mixer_mat_sf_bins_real[bin][2][1] * transportSignalEnergies[1][bin] ); } else { @@ -1740,6 +1786,20 @@ void ivas_spar_param_to_masa_param_mapping( diffuseGainSum = diffuseGainY + diffuseGainX + diffuseGainZ; +#ifdef JBM_TSM_ON_TCS + if ( diffuseGainSum == 0.0f ) + { + hDiffuseDist->diffuseRatioX[bin] = 1.0f / 3.0f; + hDiffuseDist->diffuseRatioY[bin] = 1.0f / 3.0f; + hDiffuseDist->diffuseRatioZ[bin] = 1.0f / 3.0f; + } + else + { + hDiffuseDist->diffuseRatioX[bin] = diffuseGainX / ( diffuseGainSum + EPSILON ); + hDiffuseDist->diffuseRatioY[bin] = diffuseGainY / ( diffuseGainSum + EPSILON ); + hDiffuseDist->diffuseRatioZ[bin] = diffuseGainZ / ( diffuseGainSum + EPSILON ); + } +#else if ( diffuseGainSum == 0.0f ) { hDiffuseDist->diffuseRatioX[subframe][bin] = 1.0f / 3.0f; @@ -1752,6 +1812,7 @@ void ivas_spar_param_to_masa_param_mapping( hDiffuseDist->diffuseRatioY[subframe][bin] = diffuseGainY / ( diffuseGainSum + EPSILON ); hDiffuseDist->diffuseRatioZ[subframe][bin] = diffuseGainZ / ( diffuseGainSum + EPSILON ); } +#endif } } diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index e4e6480254..d19e2d33cc 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -1477,7 +1477,7 @@ void ivas_param_mc_dec_digest_tc( ivas_jbm_dec_get_adapted_subframes( nCldfbSlots, hParamMC->subframe_nbslots, &hParamMC->nb_subframes ); ivas_param_mc_dec_compute_interpolator( hParamMC->hMetadataPMC->bAttackPresent, hParamMC->hMetadataPMC->attackIndex, nCldfbSlots, hParamMC->h_output_synthesis_params.interpolator ); - + for ( param_band_idx = 0; param_band_idx < PARAM_MC_MAX_PARAMETER_BANDS; param_band_idx++ ) { set_zero( cx[param_band_idx], PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index af2edd614d..913799b0a6 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -619,9 +619,15 @@ typedef struct /* Diffuse sound directional distribution data structure */ typedef struct ivas_diffuse_distribution_data_structure { +#ifdef JBM_TSM_ON_TCS + float diffuseRatioX[CLDFB_NO_CHANNELS_MAX]; + float diffuseRatioY[CLDFB_NO_CHANNELS_MAX]; + float diffuseRatioZ[CLDFB_NO_CHANNELS_MAX]; +#else float diffuseRatioX[MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; float diffuseRatioY[MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; float diffuseRatioZ[MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; +#endif } DIFFUSE_DISTRIBUTION_DATA, *DIFFUSE_DISTRIBUTION_HANDLE; diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index da8b5049e5..f99209a1c5 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -526,9 +526,26 @@ ivas_error IVAS_DEC_EnableVoIP( hDecoderConfig->voip_active = 1; #endif - hDecoderConfig->nchan_out = audioCfg2channels( hDecoderConfig->output_config ); +#ifdef JBM_TSM_ON_TCS + if ( hDecoderConfig->output_config != AUDIO_CONFIG_EXTERNAL ) + { +#endif + hDecoderConfig->nchan_out = audioCfg2channels( hDecoderConfig->output_config ); + +#ifdef JBM_TSM_ON_TCS + } +#ifdef VARIABLE_SPEED_DECODING + else + { + hDecoderConfig->nchan_out = 1; + } +#endif +#endif + +#ifndef JBM_TSM_ON_TCS assert( hDecoderConfig->nchan_out > 0 && "EXT output not yet supported in VoIP mode" ); +#endif if ( ( error = input_format_API_to_internal( inputFormat, &hIvasDec->bitstreamformat, &hIvasDec->sdp_hf_only, true ) ) != IVAS_ERR_OK ) { @@ -628,6 +645,7 @@ ivas_error IVAS_DEC_EnableVoIP( hIvasDec->hVoIP->hTimeScaler = NULL; /* create output pcm fifo*/ /* :TODO: also provide CLDFB output FIFO if things work out */ +#ifdef VARIABLE_SPEED_DECODING if ( hIvasDec->hVoIP->mode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED ) { if ( pcmdsp_fifo_create( &hIvasDec->hVoIP->hFifoOut ) != 0 || @@ -638,7 +656,7 @@ ivas_error IVAS_DEC_EnableVoIP( /* we instantly need a new frame */ hIvasDec->hVoIP->needNewFrame = true; } - +#endif #else #ifdef VARIABLE_SPEED_DECODING { diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 94ef6086d1..aa3ad7f85b 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -71,8 +71,11 @@ *------------------------------------------------------------------------*/ #ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS +#ifdef JBM_TSM_ON_TCS +static void ivas_dirac_dec_binaural_internal( Decoder_Struct *st_ivas, float *output_f[], const int16_t nchan_transport, const int16_t subframe ); +#else static void ivas_dirac_dec_binaural_internal( Decoder_Struct *st_ivas, float output_f[][L_FRAME48k], const int16_t nchan_transport, const int16_t subframe ); - +#endif static void ivas_dirac_dec_decorrelate_slot( DIRAC_DEC_HANDLE hDirAC, const int16_t slot, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float decRe[][CLDFB_NO_CHANNELS_MAX], float decIm[][CLDFB_NO_CHANNELS_MAX] ); static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( Decoder_Struct *st_ivas, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float Rmat[3][3], const int16_t subframe ); @@ -87,11 +90,20 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric static void ivas_dirac_dec_binaural_determine_processing_matrices( Decoder_Struct *st_ivas, const int16_t max_band_decorr, float Rmat[3][3] ); #ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS +#ifdef JBM_TSM_ON_TCS +static void ivas_dirac_dec_binaural_process_output( Decoder_Struct *st_ivas, float *output_f[], float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t max_band_decorr, const int16_t numInChannels, const int16_t subframe ); + +static void adaptTransportSignalsHeadtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, const int16_t nSlots, float Rmat[3][3] ); + +static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, const int16_t nSlots, float Rmat[3][3] ); +#else static void ivas_dirac_dec_binaural_process_output( Decoder_Struct *st_ivas, float output_f[][L_FRAME48k], float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t max_band_decorr, const int16_t numInChannels, const int16_t subframe ); static void adaptTransportSignalsHeadtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, float Rmat[3][3] ); static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, float Rmat[3][3] ); +#endif + #else static void ivas_dirac_dec_binaural_process_output( Decoder_Struct *st_ivas, float output_f[][L_FRAME48k], float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], const int16_t max_band_decorr, const uint8_t numInputChannels, const uint8_t firstSlot, const uint8_t slotEnd ); @@ -116,6 +128,7 @@ static float configure_reqularization_factor( const IVAS_FORMAT ivas_format, con #endif #ifdef JBM_TSM_ON_TCS +#ifndef FIX_355_REFACTOR_PARAMBIN_TO_5MS static void ivas_dirac_dec_binaural_process_output_sf( Decoder_Struct *st_ivas, float *output_f[], float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t max_band_decorr, const uint8_t numInChannels ); static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked_sf( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const uint8_t slotEnd, const uint8_t nBins, float Rmat[3][3] ); @@ -128,8 +141,10 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric static void ivas_dirac_dec_binaural_internal_sf( Decoder_Struct *st_ivas, float *output_f[], const int16_t nchan_transport ); + static void ivas_dirac_dec_decorrelate_slot_sf( DIRAC_DEC_HANDLE hDirAC, const int8_t slot, float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float decRe[][CLDFB_NO_CHANNELS_MAX], float decIm[][CLDFB_NO_CHANNELS_MAX] ); #endif +#endif /*------------------------------------------------------------------------- * ivas_dirac_dec_init_binaural_data() * @@ -251,6 +266,18 @@ ivas_error ivas_dirac_dec_init_binaural_data( if ( hBinaural->hReverb == NULL ) { +#if defined( JBM_TSM_ON_TCS ) && !defined( FIX_355_REFACTOR_PARAMBIN_TO_5MS ) + int16_t reverbBlockSize = st_ivas->hDecoderConfig->voip_active ? 1 : CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; + if ( ( error = ivas_binaural_reverb_open( &hBinaural->hReverb, + nBins, + reverbBlockSize, NULL, + st_ivas->hIntSetup.output_config, + output_Fs, + RENDERER_BINAURAL_PARAMETRIC_ROOM, + st_ivas->hHrtfFastConv, + st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) + +#else if ( ( error = ivas_binaural_reverb_open( &hBinaural->hReverb, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, NULL, @@ -259,6 +286,7 @@ ivas_error ivas_dirac_dec_init_binaural_data( RENDERER_BINAURAL_PARAMETRIC_ROOM, st_ivas->hHrtfFastConv, st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -508,7 +536,11 @@ void ivas_dirac_dec_binaural_render( for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) { int16_t n_samples_sf = slot_size * hDirAC->subframe_nbslots[subframe_idx]; +#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS + ivas_dirac_dec_binaural_internal( st_ivas, output_f_local, nchan_transport, subframe_idx ); +#else ivas_dirac_dec_binaural_internal_sf( st_ivas, output_f_local, nchan_transport ); +#endif for ( ch = 0; ch < nchan_out; ch++ ) { output_f_local[ch] += n_samples_sf; @@ -516,14 +548,7 @@ void ivas_dirac_dec_binaural_render( } if ( hDirAC->slots_rendered == hDirAC->num_slots ) { - if ( st_ivas->hDirAC->hConfig != NULL && st_ivas->hDirAC->hConfig->dec_param_estim == 1 ) - { - st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_CLDFB_TIMESLOTS ) % st_ivas->hDirAC->dirac_md_buffer_length; - } - else - { - st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % st_ivas->hDirAC->dirac_md_buffer_length; - } + st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % st_ivas->hDirAC->dirac_md_buffer_length; } *nSamplesAvailable = ( hDirAC->num_slots - hDirAC->slots_rendered ) * slot_size; @@ -545,13 +570,14 @@ void ivas_dirac_dec_binaural( { #ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS int16_t subframe; - #endif #ifdef JBM_TSM_ON_TCS float cng_td_buffer[L_FRAME16k]; float *p_output[MAX_OUTPUT_CHANNELS]; int16_t ch; + int16_t slot_size; + slot_size = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); for ( ch = 0; ch < 2 * BINAURAL_CHANNELS; ch++ ) { p_output[ch] = &output_f[ch][0]; @@ -604,7 +630,17 @@ void ivas_dirac_dec_binaural( #ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS for ( subframe = 0; subframe < MAX_PARAM_SPATIAL_SUBFRAMES; subframe++ ) { +#ifdef JBM_TSM_ON_TCS + int16_t n_samples_sf = slot_size * st_ivas->hDirAC->subframe_nbslots[subframe]; + ivas_dirac_dec_binaural_internal( st_ivas, p_output, nchan_transport, subframe ); + for ( ch = 0; ch < 2 * BINAURAL_CHANNELS; ch++ ) + { + p_output[ch] += n_samples_sf; + } + st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + 1 ) % st_ivas->hDirAC->dirac_md_buffer_length; +#else ivas_dirac_dec_binaural_internal( st_ivas, output_f, nchan_transport, subframe ); +#endif } #else if ( st_ivas->hDiracDecBin->useSubframeMode ) @@ -634,6 +670,7 @@ void ivas_dirac_dec_binaural( * Local functions *------------------------------------------------------------------------*/ #ifdef JBM_TSM_ON_TCS +#ifndef FIX_355_REFACTOR_PARAMBIN_TO_5MS static void ivas_dirac_dec_binaural_internal_sf( Decoder_Struct *st_ivas, float *output_f[], @@ -854,11 +891,16 @@ static void ivas_dirac_dec_binaural_internal_sf( return; } #endif +#endif #ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS static void ivas_dirac_dec_binaural_internal( Decoder_Struct *st_ivas, +#ifdef JBM_TSM_ON_TCS + float *output_f[], +#else float output_f[][L_FRAME48k], +#endif const int16_t nchan_transport, const int16_t subframe ) { @@ -873,7 +915,11 @@ static void ivas_dirac_dec_binaural_internal( hDirAC = st_ivas->hDirAC; nBins = hDirAC->num_freq_bands; +#ifdef JBM_TSM_ON_TCS + offsetSamples = hDirAC->slots_rendered * nBins; +#else offsetSamples = subframe * CLDFB_SLOTS_PER_SUBFRAME * nBins; +#endif /* The input channel number at this processing function (not nchan_transport) */ numInChannels = BINAURAL_CHANNELS; @@ -895,16 +941,25 @@ static void ivas_dirac_dec_binaural_internal( Rmat[2][2] = 1.0f; /* CLDFB Analysis of input */ +#ifdef JBM_TSM_ON_TCS + for ( slot = 0; slot < hDirAC->subframe_nbslots[subframe]; slot++ ) +#else for ( slot = 0; slot < CLDFB_SLOTS_PER_SUBFRAME; slot++ ) +#endif { for ( ch = 0; ch < numInChannels; ch++ ) { if ( ch == 0 || nchan_transport == 2 ) { - cldfbAnalysis_ts( &( output_f[ch][nBins * slot + offsetSamples] ), - Cldfb_RealBuffer_in[ch][slot], - Cldfb_ImagBuffer_in[ch][slot], - nBins, st_ivas->cldfbAnaDec[ch] ); + cldfbAnalysis_ts( +#ifdef JBM_TSM_ON_TCS + &( st_ivas->hTcBuffer->tc[ch][nBins * slot + offsetSamples] ), +#else + &( output_f[ch][nBins * slot + offsetSamples] ), +#endif + Cldfb_RealBuffer_in[ch][slot], + Cldfb_ImagBuffer_in[ch][slot], + nBins, st_ivas->cldfbAnaDec[ch] ); } else if ( st_ivas->nchan_transport == 2 ) /* Stereo signal transmitted as mono with DFT stereo */ { @@ -921,12 +976,16 @@ static void ivas_dirac_dec_binaural_internal( int16_t slotInFrame; numCoreBands = st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->numCoreBands; +#ifdef JBM_TSM_ON_TCS + slotInFrame = hDirAC->slots_rendered + slot; +#else slotInFrame = subframe * CLDFB_SLOTS_PER_SUBFRAME + slot; +#endif generate_masking_noise_dirac( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom, st_ivas->cldfbAnaDec[1], #ifdef JBM_TSM_ON_TCS - st_ivas->hTcBuffer->tc[1], + st_ivas->hTcBuffer->tc[nchan_transport], #else &( output_f[1][L_FRAME48k - L_FRAME16k] ), /*used as temporary static buffer for the whole frame*/ #endif @@ -1015,9 +1074,15 @@ static void ivas_dirac_dec_binaural_internal( if ( nchan_transport == 2 ) { +#ifdef JBM_TSM_ON_TCS + adaptTransportSignalsHeadtracked( st_ivas->hHeadTrackData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, hDirAC->subframe_nbslots[subframe], Rmat ); + + ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( st_ivas->hHeadTrackData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, hDirAC->subframe_nbslots[subframe], Rmat ); +#else adaptTransportSignalsHeadtracked( st_ivas->hHeadTrackData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, Rmat ); ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( st_ivas->hHeadTrackData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, Rmat ); +#endif } } @@ -1043,11 +1108,11 @@ static void ivas_dirac_dec_binaural_internal( st_ivas->hDirAC->hDiffuseDist = NULL; - hDirAC->dirac_read_idx = ( hDirAC->dirac_read_idx + 1 ) % hDirAC->dirac_md_buffer_length; - #ifdef JBM_TSM_ON_TCS hDirAC->slots_rendered += hDirAC->subframe_nbslots[subframe]; hDirAC->subframes_rendered++; +#else + hDirAC->dirac_read_idx = ( hDirAC->dirac_read_idx + 1 ) % hDirAC->dirac_md_buffer_length; #endif return; @@ -1312,6 +1377,7 @@ static void ivas_dirac_dec_decorrelate_slot( } #ifdef JBM_TSM_ON_TCS +#ifndef FIX_355_REFACTOR_PARAMBIN_TO_5MS static void ivas_dirac_dec_decorrelate_slot_sf( DIRAC_DEC_HANDLE hDirAC, const int8_t slot, @@ -1362,7 +1428,9 @@ static void ivas_dirac_dec_decorrelate_slot_sf( return; } +#endif +#ifndef FIX_355_REFACTOR_PARAMBIN_TO_5MS #ifdef MASA_PARAMBIN_SF_MAP static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices_sf( Decoder_Struct *st_ivas, @@ -1681,7 +1749,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && bin < BINAURAL_COHERENCE_DIFFERENCE_BINS ) { float diffuseFieldCoherence; - diffuseFieldCoherence = hDirAC->hDiffuseDist->diffuseRatioX[0][bin] * h->diffuseFieldCoherenceX[bin] + hDirAC->hDiffuseDist->diffuseRatioY[0][bin] * h->diffuseFieldCoherenceY[bin] + hDirAC->hDiffuseDist->diffuseRatioZ[0][bin] * h->diffuseFieldCoherenceZ[bin]; + diffuseFieldCoherence = hDirAC->hDiffuseDist->diffuseRatioX[bin] * h->diffuseFieldCoherenceX[bin] + hDirAC->hDiffuseDist->diffuseRatioY[bin] * h->diffuseFieldCoherenceY[bin] + hDirAC->hDiffuseDist->diffuseRatioZ[bin] * h->diffuseFieldCoherenceZ[bin]; h->ChCrossReOut[bin] += ( ( 1.0f - surCoh ) * diffuseFieldCoherence + surCoh ) * diffEne; } else @@ -2184,6 +2252,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric } #endif #endif +#endif #ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS @@ -2248,7 +2317,11 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric /* Formulate input and target covariance matrices for this subframe */ set_zero( subFrameTotalEne, CLDFB_NO_CHANNELS_MAX ); +#ifdef JBM_TSM_ON_TCS + dirac_read_idx = hDirAC->render_to_md_map[subframe]; +#else dirac_read_idx = hDirAC->dirac_read_idx; +#endif /* Calculate input covariance matrix */ #ifdef JBM_TSM_ON_TCS @@ -2507,7 +2580,11 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && bin < BINAURAL_COHERENCE_DIFFERENCE_BINS ) { float diffuseFieldCoherence; +#ifdef JBM_TSM_ON_TCS + diffuseFieldCoherence = hDirAC->hDiffuseDist->diffuseRatioX[bin] * h->diffuseFieldCoherenceX[bin] + hDirAC->hDiffuseDist->diffuseRatioY[bin] * h->diffuseFieldCoherenceY[bin] + hDirAC->hDiffuseDist->diffuseRatioZ[bin] * h->diffuseFieldCoherenceZ[bin]; +#else diffuseFieldCoherence = hDirAC->hDiffuseDist->diffuseRatioX[subframe][bin] * h->diffuseFieldCoherenceX[bin] + hDirAC->hDiffuseDist->diffuseRatioY[subframe][bin] * h->diffuseFieldCoherenceY[bin] + hDirAC->hDiffuseDist->diffuseRatioZ[subframe][bin] * h->diffuseFieldCoherenceZ[bin]; +#endif h->ChCrossReOut[bin] += ( ( 1.0f - surCoh ) * diffuseFieldCoherence + surCoh ) * diffEne; } else @@ -3201,6 +3278,7 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices( } #ifdef JBM_TSM_ON_TCS +#ifndef FIX_355_REFACTOR_PARAMBIN_TO_5MS static void ivas_dirac_dec_binaural_process_output_sf( Decoder_Struct *st_ivas, float *output_f[], @@ -3238,7 +3316,11 @@ static void ivas_dirac_dec_binaural_process_output_sf( } if ( !st_ivas->hDiracDecBin->useTdDecorr && max_band_decorr > 0 ) { +#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS + ivas_dirac_dec_decorrelate_slot( st_ivas->hDirAC, slot, inRe, inIm, decSlotRe, decSlotIm ); +#else ivas_dirac_dec_decorrelate_slot_sf( st_ivas->hDirAC, slot, inRe, inIm, decSlotRe, decSlotIm ); +#endif } for ( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) @@ -3311,11 +3393,16 @@ static void ivas_dirac_dec_binaural_process_output_sf( return; } #endif +#endif #ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS static void ivas_dirac_dec_binaural_process_output( Decoder_Struct *st_ivas, +#ifdef JBM_TSM_ON_TCS + float *output_f[], +#else float output_f[][L_FRAME48k], +#endif float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t max_band_decorr, @@ -3333,21 +3420,41 @@ static void ivas_dirac_dec_binaural_process_output( float *decSlotRePointer; float *decSlotImPointer; int16_t offsetSamples; +#ifdef JBM_TSM_ON_TCS + int16_t nSlots; +#endif h = st_ivas->hDiracDecBin; nBins = st_ivas->hDirAC->num_freq_bands; +#ifdef JBM_TSM_ON_TCS + offsetSamples = 0; + nSlots = st_ivas->hDirAC->subframe_nbslots[subframe]; +#else offsetSamples = subframe * CLDFB_SLOTS_PER_SUBFRAME * nBins; +#endif if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) { /* Process second / room effect part of binaural output when needed */ +#ifdef JBM_TSM_ON_TCS + ivas_binaural_reverb_processSubframe( st_ivas->hDiracDecBin->hReverb, numInChannels, nSlots, inRe, inIm, reverbRe, reverbIm ); +#else ivas_binaural_reverb_processSubframe( st_ivas->hDiracDecBin->hReverb, numInChannels, inRe, inIm, reverbRe, reverbIm ); +#endif } interpVal = 0.0f; +#ifdef JBM_TSM_ON_TCS + for ( slot = 0; slot < nSlots; slot++ ) +#else for ( slot = 0; slot < CLDFB_SLOTS_PER_SUBFRAME; slot++ ) +#endif { +#ifdef JBM_TSM_ON_TCS + interpVal += 1.0f / (float) nSlots; +#else interpVal += 1.0f / ( (float) CLDFB_SLOTS_PER_SUBFRAME ); +#endif if ( !st_ivas->hDiracDecBin->useTdDecorr && max_band_decorr > 0 ) { ivas_dirac_dec_decorrelate_slot( st_ivas->hDirAC, slot, inRe, inIm, decSlotRe, decSlotIm ); @@ -3536,6 +3643,7 @@ static void ivas_dirac_dec_binaural_process_output( #endif #ifdef JBM_TSM_ON_TCS +#ifndef FIX_355_REFACTOR_PARAMBIN_TO_5MS static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked_sf( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], @@ -3638,12 +3746,17 @@ static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked_sf( return; } #endif +#endif + #ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS static void adaptTransportSignalsHeadtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, +#ifdef JBM_TSM_ON_TCS + const int16_t nSlots, +#endif float Rmat[3][3] ) { int16_t slot, ch, bin, louderCh; @@ -3675,7 +3788,11 @@ static void adaptTransportSignalsHeadtracked( for ( ch = 0; ch < 2; ch++ ) { ch_nrg[ch] = 0.0f; +#ifdef JBM_TSM_ON_TCS + for ( slot = 0; slot < nSlots; slot++ ) +#else for ( slot = 0; slot < CLDFB_SLOTS_PER_SUBFRAME; slot++ ) +#endif { for ( bin = bin_lo; bin < bin_hi; bin++ ) { @@ -3711,7 +3828,11 @@ static void adaptTransportSignalsHeadtracked( { float band_nrg = 0.0f; +#ifdef JBM_TSM_ON_TCS + for ( slot = 0; slot < nSlots; slot++ ) +#else for ( slot = 0; slot < CLDFB_SLOTS_PER_SUBFRAME; slot++ ) +#endif { for ( bin = bin_lo; bin < bin_hi; bin++ ) { @@ -3737,7 +3858,11 @@ static void adaptTransportSignalsHeadtracked( ene_proc = hHeadTrackData->procChEneIIR[0][band_idx] + hHeadTrackData->procChEneIIR[1][band_idx]; eqVal = fminf( 4.0f, sqrtf( ene_target / fmaxf( 1e-12f, ene_proc ) ) ); +#ifdef JBM_TSM_ON_TCS + for ( slot = 0; slot < nSlots; slot++ ) +#else for ( slot = 0; slot < CLDFB_SLOTS_PER_SUBFRAME; slot++ ) +#endif { for ( ch = 0; ch < 2; ch++ ) { @@ -3887,6 +4012,9 @@ static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, +#ifdef JBM_TSM_ON_TCS + const int16_t nSlots, +#endif float Rmat[3][3] ) { int16_t slot, bin, ch; @@ -3922,7 +4050,11 @@ static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( if ( hHeadTrackData->lrSwitchedNext != hHeadTrackData->lrSwitchedCurrent ) { #ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS +#ifdef JBM_TSM_ON_TCS + for ( slot = 0; slot < nSlots; slot++ ) +#else for ( slot = 0; slot < CLDFB_SLOTS_PER_SUBFRAME; slot++ ) +#endif #else for ( slot = firstSlot; slot < slotEnd; slot++ ) #endif @@ -3982,7 +4114,11 @@ static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( if ( hHeadTrackData->lrSwitchedCurrent == 1 ) { #ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS +#ifdef JBM_TSM_ON_TCS + for ( slot = 0; slot < nSlots; slot++ ) +#else for ( slot = 0; slot < CLDFB_SLOTS_PER_SUBFRAME; slot++ ) +#endif #else for ( slot = firstSlot; slot < slotEnd; slot++ ) #endif diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 89bc8abf4c..b43a048f38 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -600,6 +600,9 @@ void ivas_binaural_reverb_close( void ivas_binaural_reverb_processSubframe( REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */ const int16_t numInChannels, /* i : num input channels to be processed */ +#ifdef JBM_TSM_ON_TCS + const int16_t numSlots, /* i : number of slots to be processed */ +#endif float inReal[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data real */ float inImag[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data imag */ float outReal[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data real */ @@ -618,6 +621,7 @@ void ivas_binaural_reverb_processFrame( #endif #ifdef JBM_TSM_ON_TCS +#ifndef FIX_355_REFACTOR_PARAMBIN_TO_5MS void ivas_binaural_reverb_processSlot( REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */ const int16_t numInChannels, /* i : num inputs to be processed */ @@ -628,6 +632,7 @@ void ivas_binaural_reverb_processSlot( const uint8_t offsetSamplesIO /* i : number of offset samples */ ); #endif +#endif ivas_error ivas_reverb_open( REVERB_HANDLE *hReverb, /* i/o: Reverberator handle */ diff --git a/lib_rend/ivas_reverb.c b/lib_rend/ivas_reverb.c index bf0c946d8c..12a8b55ddb 100644 --- a/lib_rend/ivas_reverb.c +++ b/lib_rend/ivas_reverb.c @@ -1627,8 +1627,11 @@ ivas_error ivas_reverb_process( #ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS void ivas_binaural_reverb_processSubframe( - REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */ - const int16_t numInChannels, /* i : num inputs to be processed */ + REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */ + const int16_t numInChannels, /* i : num inputs to be processed */ +#ifdef JBM_TSM_ON_TCS + const int16_t numSlots, /* i : number of slots to be processed */ +#endif float inReal[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data real, Comment: This change swaps two first dimensions as first dimension is not constant. */ float inImag[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data imag */ float outReal[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data real */ @@ -1649,12 +1652,24 @@ void ivas_binaural_reverb_processFrame( /* Declare the required variables */ int16_t idx, bin, ch, sample, invertSampleIndex, tapIdx, *phaseShiftTypePr; float **tapRealPr, **tapImagPr; + push_wmops( "binaural_reverb" ); /* 1) Rotate the data in the loop buffer of the reverberator. * Notice that the audio at the loop buffers is at time-inverted order * for convolution purposes later on. */ for ( bin = 0; bin < hReverb->numBins; bin++ ) { +#ifdef JBM_TSM_ON_TCS + /* Move the data forwards by blockSize (i.e. by the frame size of 16 CLDFB slots) */ + mvr2r( hReverb->loopBufReal[bin], hReverb->loopBufReal[bin] + numSlots, hReverb->loopBufLength[bin] ); + mvr2r( hReverb->loopBufImag[bin], hReverb->loopBufImag[bin] + numSlots, hReverb->loopBufLength[bin] ); + + /* Add the data from the end of the loop to the beginning, with an attenuation factor + * according to RT60. This procedure generates an IIR decaying response. The response + * is decorrelated later on. */ + v_multc( hReverb->loopBufReal[bin] + hReverb->loopBufLength[bin], hReverb->loopAttenuationFactor[bin], hReverb->loopBufReal[bin], numSlots ); + v_multc( hReverb->loopBufImag[bin] + hReverb->loopBufLength[bin], hReverb->loopAttenuationFactor[bin], hReverb->loopBufImag[bin], numSlots ); +#else /* Move the data forwards by blockSize (i.e. by the frame size of 16 CLDFB slots) */ mvr2r( hReverb->loopBufReal[bin], hReverb->loopBufReal[bin] + hReverb->blockSize, hReverb->loopBufLength[bin] ); mvr2r( hReverb->loopBufImag[bin], hReverb->loopBufImag[bin] + hReverb->blockSize, hReverb->loopBufLength[bin] ); @@ -1664,17 +1679,27 @@ void ivas_binaural_reverb_processFrame( * is decorrelated later on. */ v_multc( hReverb->loopBufReal[bin] + hReverb->loopBufLength[bin], hReverb->loopAttenuationFactor[bin], hReverb->loopBufReal[bin], hReverb->blockSize ); v_multc( hReverb->loopBufImag[bin] + hReverb->loopBufLength[bin], hReverb->loopAttenuationFactor[bin], hReverb->loopBufImag[bin], hReverb->blockSize ); +#endif } /* 2) Apply the determined pre-delay to the input audio, and add the delayed audio to the loop. */ idx = hReverb->preDelayBufferIndex; +#ifdef JBM_TSM_ON_TCS + for ( sample = 0; sample < numSlots; sample++ ) +#else for ( sample = 0; sample < hReverb->blockSize; sample++ ) +#endif { #ifndef FIX_355_REFACTOR_PARAMBIN_TO_5MS uint16_t sampleWithOffset; sampleWithOffset = sample + offsetSamplesIO; #endif +#ifdef JBM_TSM_ON_TCS + invertSampleIndex = numSlots - sample - 1; +#else invertSampleIndex = hReverb->blockSize - sample - 1; +#endif + for ( bin = 0; bin < hReverb->numBins; bin++ ) { /* Add from pre-delay buffer a sample to the loop buffer, in a time-inverted order. @@ -1730,17 +1755,41 @@ void ivas_binaural_reverb_processFrame( /* These tap pointers have been determined to point to the loop buffer at sparse locations */ tapRealPr = hReverb->tapPointersReal[bin][ch]; tapImagPr = hReverb->tapPointersImag[bin][ch]; + phaseShiftTypePr = hReverb->tapPhaseShiftType[bin][ch]; /* Flush output */ +#ifdef JBM_TSM_ON_TCS + set_f( hReverb->outputBufferReal[bin][ch], 0.0f, numSlots ); + set_f( hReverb->outputBufferImag[bin][ch], 0.0f, numSlots ); +#else set_f( hReverb->outputBufferReal[bin][ch], 0.0f, hReverb->blockSize ); set_f( hReverb->outputBufferImag[bin][ch], 0.0f, hReverb->blockSize ); +#endif /* Add from temporally decaying sparse tap locations the audio to the output. */ for ( tapIdx = 0; tapIdx < hReverb->taps[bin][ch]; tapIdx++ ) { switch ( phaseShiftTypePr[tapIdx] ) { +#ifdef JBM_TSM_ON_TCS + case 0: /* 0 degrees phase */ + v_add( hReverb->outputBufferReal[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferReal[bin][ch], numSlots ); + v_add( hReverb->outputBufferImag[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferImag[bin][ch], numSlots ); + break; + case 1: /* 90 degrees phase */ + v_sub( hReverb->outputBufferReal[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferReal[bin][ch], numSlots ); + v_add( hReverb->outputBufferImag[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferImag[bin][ch], numSlots ); + break; + case 2: /* 180 degrees phase */ + v_sub( hReverb->outputBufferReal[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferReal[bin][ch], numSlots ); + v_sub( hReverb->outputBufferImag[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferImag[bin][ch], numSlots ); + break; + default: /* 270 degrees phase */ + v_add( hReverb->outputBufferReal[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferReal[bin][ch], numSlots ); + v_sub( hReverb->outputBufferImag[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferImag[bin][ch], numSlots ); + break; +#else case 0: /* 0 degrees phase */ v_add( hReverb->outputBufferReal[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferReal[bin][ch], hReverb->blockSize ); v_add( hReverb->outputBufferImag[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferImag[bin][ch], hReverb->blockSize ); @@ -1757,6 +1806,7 @@ void ivas_binaural_reverb_processFrame( v_add( hReverb->outputBufferReal[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferReal[bin][ch], hReverb->blockSize ); v_sub( hReverb->outputBufferImag[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferImag[bin][ch], hReverb->blockSize ); break; +#endif } } } @@ -1766,7 +1816,11 @@ void ivas_binaural_reverb_processFrame( { if ( hReverb->useBinauralCoherence ) { +#ifdef JBM_TSM_ON_TCS + for ( sample = 0; sample < numSlots; sample++ ) +#else for ( sample = 0; sample < hReverb->blockSize; sample++ ) +#endif { float leftRe, rightRe, leftIm, rightIm; @@ -1787,15 +1841,23 @@ void ivas_binaural_reverb_processFrame( /* 4) Write data to output */ for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { +#ifdef JBM_TSM_ON_TCS + for ( sample = 0; sample < numSlots; sample++ ) +#else for ( sample = 0; sample < hReverb->blockSize; sample++ ) +#endif { #ifndef FIX_355_REFACTOR_PARAMBIN_TO_5MS uint16_t sampleWithOffset; sampleWithOffset = sample + offsetSamplesIO; #endif - /* Audio was in the temporally inverted order for convolution, re-invert audio to output */ +/* Audio was in the temporally inverted order for convolution, re-invert audio to output */ +#ifdef JBM_TSM_ON_TCS + invertSampleIndex = numSlots - sample - 1; +#else invertSampleIndex = hReverb->blockSize - sample - 1; +#endif #ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS for ( bin = 0; bin < hReverb->numBins; bin++ ) @@ -1823,10 +1885,12 @@ void ivas_binaural_reverb_processFrame( } } + pop_wmops(); return; } #ifdef JBM_TSM_ON_TCS +#ifndef FIX_355_REFACTOR_PARAMBIN_TO_5MS /*------------------------------------------------------------------------- * ivas_binaural_reverb_processSlot() * @@ -1851,6 +1915,7 @@ void ivas_binaural_reverb_processSlot( assert( hReverb->blockSize == 1 ); #endif + push_wmops( "binaural_reverb" ); /* 1) Rotate the data in the loop buffer of the reverberator. * Notice that the audio at the loop buffers is at time-inverted order * for convolution purposes later on. */ @@ -1989,9 +2054,11 @@ void ivas_binaural_reverb_processSlot( } } + pop_wmops(); return; } #endif +#endif /*------------------------------------------------------------------------- * ivas_binaural_reverb_open() diff --git a/lib_rend/ivas_sba_rendering.c b/lib_rend/ivas_sba_rendering.c index e8c6162142..c549461c37 100644 --- a/lib_rend/ivas_sba_rendering.c +++ b/lib_rend/ivas_sba_rendering.c @@ -233,6 +233,9 @@ void ivas_sba_prototype_renderer( int16_t firstSlot, slotEnd, firstInCh, inChEnd, firstOutCh, outChEnd; int16_t sf_idx; #endif +#ifdef JBM_TSM_ON_TCS + int16_t slot_idx_start, md_idx; +#endif push_wmops( "ivas_sba_prototype_renderer" ); @@ -247,6 +250,9 @@ void ivas_sba_prototype_renderer( num_cldfb_bands = hSpar->hFbMixer->pFb->fb_bin_to_band.num_cldfb_bands; numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; numch_out = hSpar->hFbMixer->fb_cfg->num_out_chans; +#ifdef JBM_TSM_ON_TCS + slot_idx_start = hSpar->slots_rendered; +#endif if ( st_ivas->nchan_transport == 1 ) { @@ -265,10 +271,19 @@ void ivas_sba_prototype_renderer( /* Apply mixing matrix */ #ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS +#ifdef JBM_TSM_ON_TCS + for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) +#else for ( ts = 0; ts < CLDFB_SLOTS_PER_SUBFRAME; ts++ ) +#endif { /* determine SPAR parameters for this time slot */ +#ifdef JBM_TSM_ON_TCS + md_idx = hSpar->render_to_md_map[ts + slot_idx_start]; + ivas_spar_get_parameters( hSpar, hDecoderConfig, md_idx, numch_out, numch_in, num_spar_bands, mixer_mat ); +#else ivas_spar_get_parameters( hSpar, hDecoderConfig, ts + subframe * CLDFB_SLOTS_PER_SUBFRAME, numch_out, numch_in, num_spar_bands, mixer_mat ); +#endif for ( cldfb_band = 0; cldfb_band < num_cldfb_bands; cldfb_band++ ) { @@ -311,8 +326,34 @@ void ivas_sba_prototype_renderer( inIm[out_ch][ts][cldfb_band] = out_im[out_ch]; } } +#ifdef JBM_TSM_ON_TCS + /* Update mixing matrices */ + if ( ( ( slot_idx_start + ts + 1 ) == hSpar->num_slots ) || ( ( md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME ) != ( hSpar->render_to_md_map[ts + slot_idx_start + 1] / JBM_CLDFB_SLOTS_IN_SUBFRAME ) ) ) + { + /* we have crossed an unadapted parameter sf border, update previous mixing matrices */ + int16_t md_sf = md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME; + hSpar->i_subframe++; + hSpar->i_subframe = min( hSpar->i_subframe, MAX_PARAM_SPATIAL_SUBFRAMES ); + mvr2r( hSpar->hMdDec->mixer_mat_prev[1][0][0], hSpar->hMdDec->mixer_mat_prev[0][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + mvr2r( hSpar->hMdDec->mixer_mat_prev[2][0][0], hSpar->hMdDec->mixer_mat_prev[1][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + mvr2r( hSpar->hMdDec->mixer_mat_prev[3][0][0], hSpar->hMdDec->mixer_mat_prev[2][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + mvr2r( hSpar->hMdDec->mixer_mat_prev[4][0][0], hSpar->hMdDec->mixer_mat_prev[3][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + + for ( out_ch = 0; out_ch < numch_out; out_ch++ ) + { + for ( in_ch = 0; in_ch < numch_in; in_ch++ ) + { + for ( b = 0; b < num_spar_bands; b++ ) + { + hSpar->hMdDec->mixer_mat_prev[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][b + md_sf * IVAS_MAX_NUM_BANDS]; + } + } + } + } +#endif } +#ifndef JBM_TSM_ON_TCS /* Update mixing matrices */ hSpar->i_subframe++; hSpar->i_subframe = min( hSpar->i_subframe, MAX_PARAM_SPATIAL_SUBFRAMES ); @@ -331,6 +372,7 @@ void ivas_sba_prototype_renderer( } } } +#endif #else for ( ts = firstSlot; ts < slotEnd; ts++ ) { diff --git a/scripts/config/ivas_modes.json b/scripts/config/ivas_modes.json index d6bce79929..d4f1e107cc 100644 --- a/scripts/config/ivas_modes.json +++ b/scripts/config/ivas_modes.json @@ -2158,7 +2158,7 @@ "table_name": "ISM2@{table_bitrate} kbps RS {bandwidth}", "nummetadata": 2, "metadatafilenames": [ - "stvISM{mdi}.csv.csv" + "stvISM{mdi}.csv" ], "rs": true, "amr": false, @@ -2318,7 +2318,7 @@ "table_name": "ISM3@{table_bitrate} kbps {bandwidth}", "nummetadata": 3, "metadatafilenames": [ - "stvISM{mdi}.csv.csv" + "stvISM{mdi}.csv" ], "rs": true, "amr": false, -- GitLab From 5fb1890dbddaf9f565a74ed6b599af9c21d4bedb Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Wed, 10 May 2023 12:34:21 +0200 Subject: [PATCH 100/331] fix JBM MASA BR switching --- lib_dec/ivas_masa_dec.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index e4fafa2d25..094085d354 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -1254,20 +1254,22 @@ ivas_error ivas_masa_dec_reconfigure( ivas_masa_set_elements( ivas_total_brate, st_ivas->mc_mode, st_ivas->nchan_transport, st_ivas->hQMetaData, &tmp, &tmp, &tmp ); #ifdef JBM_TSM_ON_TCS - if ( st_ivas->hDecoderConfig->voip_active == 1 && st_ivas->renderer_type != RENDERER_DISABLE ) + if ( st_ivas->hDecoderConfig->voip_active == 1 ) { int16_t tc_nchan_to_allocate; int16_t tc_nchan_transport; + TC_BUFFER_MODE buffer_mode_new; + buffer_mode_new = ivas_jbm_dec_get_tc_buffer_mode( st_ivas ); tc_nchan_transport = ivas_jbm_dec_get_num_tc_channels( st_ivas ); tc_nchan_to_allocate = tc_nchan_transport; if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) { tc_nchan_to_allocate = 2 * BINAURAL_CHANNELS; } - if ( tc_nchan_transport != st_ivas->hTcBuffer->nchan_transport_jbm || tc_nchan_to_allocate != st_ivas->hTcBuffer->nchan_transport_internal ) + if ( tc_nchan_transport != st_ivas->hTcBuffer->nchan_transport_jbm || tc_nchan_to_allocate != st_ivas->hTcBuffer->nchan_transport_internal || buffer_mode_new != st_ivas->hTcBuffer->tc_buffer_mode ) { - if ( ( error = ivas_jbm_dec_tc_buffer_reconfigure( st_ivas, TC_BUFFER_MODE_RENDERER, tc_nchan_transport, tc_nchan_to_allocate, tc_nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_jbm_dec_tc_buffer_reconfigure( st_ivas, buffer_mode_new, tc_nchan_transport, tc_nchan_to_allocate, tc_nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) { return error; } -- GitLab From 1d5c76a4d571e5da45a66e54d3641e2b9cfcb6a7 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Wed, 10 May 2023 12:52:28 +0200 Subject: [PATCH 101/331] fix McMASA 3TC binaural rendering --- lib_rend/ivas_dirac_dec_binaural_functions.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index aa3ad7f85b..4b0279fb2d 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -576,16 +576,23 @@ void ivas_dirac_dec_binaural( float *p_output[MAX_OUTPUT_CHANNELS]; int16_t ch; int16_t slot_size; + int16_t numInChannels; slot_size = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); for ( ch = 0; ch < 2 * BINAURAL_CHANNELS; ch++ ) { p_output[ch] = &output_f[ch][0]; } - for ( ch = 0; ch < nchan_transport; ch++ ) + numInChannels = nchan_transport; + if ( st_ivas->hOutSetup.separateChannelEnabled ) + { + numInChannels++; + } + for ( ch = 0; ch < numInChannels; ch++ ) { st_ivas->hTcBuffer->tc[ch] = &output_f[ch][0]; } + ivas_dirac_dec_set_md_map( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS ); if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR ) { -- GitLab From 262bc04e2bd86cc043d33047ce645a79d6c2111f Mon Sep 17 00:00:00 2001 From: Vladimir Malenovsky Date: Wed, 10 May 2023 16:01:05 +0200 Subject: [PATCH 102/331] fix cases where st_ivas->ind_list_metadata is NULL --- lib_enc/ivas_init_enc.c | 21 ++++++++++++++------- lib_enc/lib_enc.c | 36 ++++++++++++++++++++++++++---------- 2 files changed, 40 insertions(+), 17 deletions(-) diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index 8d113adf03..60423803e3 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -375,16 +375,23 @@ ivas_error ivas_init_encoder( /* set the maximum allowed number of metadata indices in the list */ st_ivas->ivas_max_num_indices_metadata = get_ivas_max_num_indices_metadata( st_ivas->hEncoderConfig->ivas_format, st_ivas->hEncoderConfig->ivas_total_brate ); - /* allocate buffer of indices */ - if ( ( st_ivas->ind_list_metadata = (INDICE_HANDLE) malloc( st_ivas->ivas_max_num_indices_metadata * sizeof( Indice ) ) ) == NULL ) + /* allocate buffer of metadata indices */ + if ( st_ivas->ivas_max_num_indices_metadata > 0 ) { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of metadata indices!\n" ) ); - } + if ( ( st_ivas->ind_list_metadata = (INDICE_HANDLE) malloc( st_ivas->ivas_max_num_indices_metadata * sizeof( Indice ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of metadata indices!\n" ) ); + } - /* reset the list of metadata indices */ - for ( i = 0; i < st_ivas->ivas_max_num_indices_metadata; i++ ) + /* reset the list of metadata indices */ + for ( i = 0; i < st_ivas->ivas_max_num_indices_metadata; i++ ) + { + st_ivas->ind_list_metadata[i].nb_bits = -1; + } + } + else { - st_ivas->ind_list_metadata[i].nb_bits = -1; + st_ivas->ind_list_metadata = NULL; } #endif diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index b2c6351abc..6e4313e5a2 100644 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -1167,11 +1167,9 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( { /* de-allocate old buffer of indices */ free( st_ivas->ind_list ); - free( st_ivas->ind_list_metadata ); /* set the maximum allowed number of indices in the list */ st_ivas->ivas_max_num_indices = get_ivas_max_num_indices( hEncoderConfig->ivas_format, hEncoderConfig->ivas_total_brate ); - st_ivas->ivas_max_num_indices_metadata = get_ivas_max_num_indices_metadata( hEncoderConfig->ivas_format, hEncoderConfig->ivas_total_brate ); /* allocate new buffer of indices */ if ( ( st_ivas->ind_list = (INDICE_HANDLE) malloc( st_ivas->ivas_max_num_indices * sizeof( Indice ) ) ) == NULL ) @@ -1179,23 +1177,41 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); } - if ( ( st_ivas->ind_list_metadata = (INDICE_HANDLE) malloc( st_ivas->ivas_max_num_indices_metadata * sizeof( Indice ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of metadata indices!\n" ) ); - } - /* reset the list of indices */ for ( i = 0; i < st_ivas->ivas_max_num_indices; i++ ) { st_ivas->ind_list[i].nb_bits = -1; } - for ( i = 0; i < st_ivas->ivas_max_num_indices_metadata; i++ ) + /* de-allocate old buffer of metadata indices */ + if ( st_ivas->ind_list_metadata != NULL ) + { + free( st_ivas->ind_list_metadata ); + } + + /* set the maximum allowed number of metadata indices in the list */ + st_ivas->ivas_max_num_indices_metadata = get_ivas_max_num_indices_metadata( hEncoderConfig->ivas_format, hEncoderConfig->ivas_total_brate ); + + if ( st_ivas->ivas_max_num_indices_metadata > 0 ) + { + /* allocate new buffer of metadata indices */ + if ( ( st_ivas->ind_list_metadata = (INDICE_HANDLE) malloc( st_ivas->ivas_max_num_indices_metadata * sizeof( Indice ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of metadata indices!\n" ) ); + } + + /* reset the list of metadata indices */ + for ( i = 0; i < st_ivas->ivas_max_num_indices_metadata; i++ ) + { + st_ivas->ind_list_metadata[i].nb_bits = -1; + } + } + else { - st_ivas->ind_list_metadata[i].nb_bits = -1; + st_ivas->ind_list_metadata = NULL; } - /* set pointers to the new buffer of indices in each element */ + /* set pointers to the new buffers of indices in each element */ for ( n = 0; n < st_ivas->nSCE; n++ ) { st_ivas->hSCE[n]->hCoreCoder[0]->hBstr->ind_list = st_ivas->ind_list; -- GitLab From 81c68191bb7286eb4b80f11f7ceced817705a13d Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 11 May 2023 09:50:40 +0200 Subject: [PATCH 103/331] introduce function ivas_get_hodirac_flag() --- lib_com/ivas_dirac_com.c | 48 ++++++++++++++++++++++++++++++++------ lib_com/ivas_prot.h | 8 +++++++ lib_com/options.h | 2 +- lib_dec/ivas_dec.c | 15 ++++-------- lib_dec/ivas_dirac_dec.c | 15 ++++++++---- lib_dec/ivas_init_dec.c | 4 ++-- lib_dec/ivas_sba_dec.c | 2 +- lib_dec/ivas_spar_md_dec.c | 2 +- 8 files changed, 70 insertions(+), 26 deletions(-) diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index d17732b66c..ad107ea1f6 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -48,6 +48,32 @@ static uint16_t deindex_sph_idx_general( const int16_t idx_sph, const int16_t no_bits, float *theta_dec, float *phi_dec, uint16_t *p_id_phi, const MC_LS_SETUP mc_format ); + +#ifdef HODIRAC +/*------------------------------------------------------------------------- + * ivas_get_hodirac_flag() + * + * Return flag for HO-DirAC method at high bitrates + *------------------------------------------------------------------------*/ + +/*! r: HO-DirAC flag */ +int16_t ivas_get_hodirac_flag( + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t sba_order /* i : Ambisonic (SBA) order */ +) +{ + if ( sba_order > 1 && ivas_total_brate > IVAS_256k ) + { + return 1; + } + else + { + return 0; + } +} +#endif + + /*------------------------------------------------------------------------- * ivas_dirac_sba_config() * @@ -133,7 +159,7 @@ ivas_error ivas_dirac_config( spar_dirac_split_band = min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); #ifdef HODIRAC - if ( sba_order > 1 && ivas_total_brate > IVAS_256k ) + if ( ivas_get_hodirac_flag( ivas_total_brate, sba_order ) ) { spar_dirac_split_band = 0; } @@ -174,7 +200,7 @@ ivas_error ivas_dirac_config( hConfig->enc_param_start_band = spar_dirac_split_band; } #ifdef HODIRAC - if ( sba_order > 1 && ivas_total_brate > IVAS_256k ) + if ( ivas_get_hodirac_flag( ivas_total_brate, sba_order ) ) { hConfig->dec_param_estim = FALSE; hConfig->enc_param_start_band = 0; @@ -335,10 +361,16 @@ ivas_error ivas_dirac_sba_config( int16_t i; int16_t nbands_wb; int16_t nbands_coded; +#ifdef HODIRAC + int16_t hodirac_flag; +#endif ivas_error error; error = IVAS_ERR_OK; hQMetaData->is_masa_ivas_format = 0; +#ifdef HODIRAC + hodirac_flag = ivas_get_hodirac_flag( sba_total_brate, sba_order ); +#endif if ( sba_mode == SBA_MODE_SPAR ) { @@ -376,7 +408,7 @@ ivas_error ivas_dirac_sba_config( { hQMetaData->useLowerBandRes = 0; #ifdef HODIRAC - if ( !( sba_order > 1 && sba_total_brate > IVAS_256k ) ) + if ( hodirac_flag == 0 ) #endif { nbands_coded = nbands - 1; /* always combine the last two bands */ @@ -386,7 +418,7 @@ ivas_error ivas_dirac_sba_config( { int16_t no_dirs = 1; #ifdef HODIRAC - if ( sba_order > 1 && sba_total_brate > IVAS_256k ) + if ( hodirac_flag ) { no_dirs = 2; } @@ -396,8 +428,9 @@ ivas_error ivas_dirac_sba_config( { return error; } + #ifdef HODIRAC_FIX_BR_SWITCHING_DTX - if ( sba_order > 1 && sba_total_brate > IVAS_256k ) + if ( hodirac_flag ) { int16_t dir, j; for ( dir = 0; dir < hQMetaData->no_directions; dir++ ) @@ -508,7 +541,7 @@ ivas_error ivas_dirac_sba_config( { int16_t no_dirs = 1; #ifdef HODIRAC - if ( sba_order > 1 && sba_total_brate > IVAS_256k ) + if ( hodirac_flag ) { no_dirs = 2; } @@ -545,8 +578,9 @@ ivas_error ivas_dirac_sba_config( for ( i = 0; i < hQMetaData->no_directions; i++ ) { hQMetaData->q_direction[i].cfg.search_effort = 1; + #ifdef HODIRAC - if ( sba_order > 1 && sba_total_brate > IVAS_256k ) + if ( hodirac_flag ) { hQMetaData->q_direction[i].cfg.start_band = 0; } diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 0355c00470..65c9632e9d 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3371,6 +3371,14 @@ void ivas_sba_dirac_stereo_config( STEREO_DFT_CONFIG_DATA_HANDLE hConfig /* o : DFT stereo configuration */ ); +#ifdef HODIRAC +/*! r: HO-DirAC flag */ +int16_t ivas_get_hodirac_flag( + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t sba_order /* i : Ambisonic (SBA) order */ +); +#endif + int16_t ivas_get_sba_dirac_stereo_flag( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); diff --git a/lib_com/options.h b/lib_com/options.h index b6dba1a368..10af89f845 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -191,7 +191,7 @@ #define FIX_441_SBA_PARAMBIN_GAINS /* Nokia: Fix issue 441 by changing gains in SBA path of parametric binauralizer */ -#define HODIRAC /* FhG: Sector-based HO-DirAC method for SBA at high bitrates */ +#define HODIRAC /* FhG: Contribution 32: Sector-based HO-DirAC method for SBA at high bitrates */ #ifdef HODIRAC #define SPAR_TUNING /* Dlb: tune SPAR for better quality */ diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index fd1638b849..72b2a87f25 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -261,7 +261,7 @@ ivas_error ivas_dec( { ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, #ifdef HODIRAC - st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_256k, + ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ), #endif 0 ); } @@ -278,17 +278,12 @@ ivas_error ivas_dec( if ( st_ivas->hQMetaData != NULL ) { st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; - ivas_dirac_dec_read_BS( - ivas_total_brate, - st, - st_ivas->hDirAC, - st_ivas->hQMetaData, - &nb_bits_metadata[0], - st_ivas->sba_mode, + + ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, #ifdef HODIRAC - st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_256k, + ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ), #endif - st_ivas->hSpar->dirac_to_spar_md_bands ); + st_ivas->hSpar->dirac_to_spar_md_bands ); } if ( ( error = ivas_spar_dec( st_ivas, nb_bits_metadata ) ) != IVAS_ERR_OK ) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 73c8dcf12e..401c79d3e7 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -140,6 +140,9 @@ ivas_error ivas_dirac_dec_config( int32_t output_Fs, ivas_total_brate; ivas_error error; int16_t nchan_transport_orig; +#ifdef HODIRAC + int16_t hodirac_flag; +#endif DIRAC_CONFIG_FLAG flag_config; flag_config = ( flag_config_inp == DIRAC_RECONFIGURE_MODE ) ? DIRAC_RECONFIGURE : flag_config_inp; @@ -148,6 +151,10 @@ ivas_error ivas_dirac_dec_config( hDirAC = NULL; output_Fs = st_ivas->hDecoderConfig->output_Fs; ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; +#ifdef HODIRAC + hodirac_flag = ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ); +#endif + if ( flag_config == DIRAC_RECONFIGURE ) { @@ -782,7 +789,7 @@ ivas_error ivas_dirac_dec_config( if ( ( ivas_dirac_dec_output_synthesis_open( hDirAC, st_ivas->renderer_type, nchan_transport, output_Fs #ifdef HODIRAC , - st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_256k + hodirac_flag #endif ) ) != IVAS_ERR_OK ) { @@ -797,7 +804,7 @@ ivas_error ivas_dirac_dec_config( if ( ( ivas_dirac_dec_output_synthesis_open( hDirAC, st_ivas->renderer_type, nchan_transport, output_Fs #ifdef HODIRAC , - st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_256k + hodirac_flag #endif ) ) != IVAS_ERR_OK ) { @@ -896,7 +903,7 @@ ivas_error ivas_dirac_dec_config( ivas_dirac_dec_output_synthesis_init( hDirAC, nchan_out_woLFE #ifdef HODIRAC , - st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_256k + hodirac_flag #endif ); @@ -908,7 +915,7 @@ ivas_error ivas_dirac_dec_config( if ( ( error = ivas_dirac_alloc_mem( hDirAC, st_ivas->renderer_type, &( hDirAC->stack_mem ) #ifdef HODIRAC , - st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_256k + hodirac_flag #endif ) ) != IVAS_ERR_OK ) { diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index b317d81cd1..031da35178 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -927,7 +927,7 @@ ivas_error ivas_init_decoder( st_ivas->sba_analysis_order, st_ivas->sba_mode, #ifdef HODIRAC - st_ivas->sba_analysis_order > 1 && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) + ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) #else IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND #endif @@ -955,7 +955,7 @@ ivas_error ivas_init_decoder( st_ivas->hSpar->enc_param_start_band = min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); #ifdef HODIRAC - if ( st_ivas->sba_analysis_order > 1 && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k ) + if ( ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ) { st_ivas->hSpar->enc_param_start_band = 0; diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 0b5cce1ca5..7660d90d6b 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -275,7 +275,7 @@ ivas_error ivas_sba_dec_reconfigure( st_ivas->sba_analysis_order, st_ivas->sba_mode, #ifdef HODIRAC - ( st_ivas->sba_analysis_order > 1 && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) + ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) #else IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND #endif diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index 9475c2f026..23c4ae27b6 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -3059,7 +3059,7 @@ void ivas_spar_to_dirac( if ( hDirAC != NULL #ifdef HODIRAC - && ( st_ivas->sba_analysis_order <= 1 || st_ivas->hDecoderConfig->ivas_total_brate <= IVAS_256k ) + && ivas_get_hodirac_flag( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ) == 0 #endif ) { -- GitLab From 078b3c429c0a1a46956b77ea5b040120ab2d3c2e Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 11 May 2023 10:07:16 +0200 Subject: [PATCH 104/331] harmonize name and comment of "hodirac_flag" --- lib_com/ivas_prot.h | 24 +++---- lib_com/ivas_qmetadata_com.c | 13 +++- lib_dec/ivas_dirac_dec.c | 23 +++---- lib_dec/ivas_dirac_output_synthesis_dec.c | 83 ++++++++++------------- lib_dec/ivas_qmetadata_dec.c | 13 ++-- lib_enc/ivas_dirac_enc.c | 31 ++++----- lib_enc/ivas_qmetadata_enc.c | 21 +++--- lib_enc/ivas_spar_encoder.c | 2 +- 8 files changed, 98 insertions(+), 112 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 65c9632e9d..2e74fddd72 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -2944,7 +2944,7 @@ ivas_error ivas_qmetadata_enc_encode( IVAS_QMETADATA *hQMetaData /* i/o: q_metadata handle */ #ifdef HODIRAC , - int16_t hodirac /* i: flag to indicate sector processing */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ #endif ); @@ -3020,7 +3020,7 @@ int16_t ivas_qmetadata_dec_decode( int16_t *index /* i/o: bitstream position */ #ifdef HODIRAC , - int16_t hodirac /* i: flag to indicate sector processing */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ #endif ); @@ -3248,7 +3248,7 @@ void ivas_dirac_param_est_enc( const SBA_MODE sba_mode #ifdef HODIRAC , - const int16_t hodirac, + const int16_t hodirac_flag, const int16_t nchan_fb_in #endif ); @@ -3586,7 +3586,6 @@ void ivas_dirac_dec_decorr_close( HANDLE_DIRAC_DECORR_STATE *ph_dirac_decorr_state ); - ivas_error ivas_dirac_dec_output_synthesis_open( DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ const RENDERER_TYPE renderer_type, /* i : renderer type */ @@ -3594,7 +3593,7 @@ ivas_error ivas_dirac_dec_output_synthesis_open( const int32_t output_Fs /* i : output sampling rate */ #ifdef HODIRAC , - const int16_t hodirac /* i : flag to indicate HO-DirAC mode*/ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ #endif ); @@ -3603,7 +3602,7 @@ void ivas_dirac_dec_output_synthesis_init( const int16_t nchan_out_woLFE /* i : number of output audio channels without LFE */ #ifdef HODIRAC , - const int16_t hodirac /* flag to indicate HO-DirAC mode */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ #endif ); @@ -3621,9 +3620,8 @@ void ivas_dirac_dec_output_synthesis_process_slot( const int16_t nchan_transport, /* i : number of transport channels */ #ifndef HODIRAC const int16_t index_slot -#endif -#ifdef HODIRAC - const int16_t hodirac +#else + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ #endif ); @@ -3635,7 +3633,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( const float *onset_filter #ifdef HODIRAC , - const int16_t hodirac /* i: flag for sector-based processing */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ #endif ); @@ -3686,7 +3684,7 @@ void ivas_dirac_dec_compute_directional_responses( const float *p_Rmat /* i : rotation matrix */ #ifdef HODIRAC , - const int16_t hodirac /* i : flag for sector based dirac processing */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ #endif ); @@ -4770,7 +4768,7 @@ void masa_compensate_two_dir_energy_ratio_index( int16_t *ratio_index_mod2 /* o : Output modified ratio for direction 2 */ #ifdef HODIRAC , - int16_t hodirac /* i: flag to indicate sector processing */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ #endif ); @@ -4782,7 +4780,7 @@ void ivas_set_qmetadata_maxbit_req( #ifdef HODIRAC /*! r: Bits to be used for quantizing distribution ratio of direct-to-total ratios */ int16_t ivas_get_df_ratio_bits_hodirac( - int16_t index_diff /* i : Index of quantized diffuse-to-total ratio */ + const int16_t index_diff /* i : Index of quantized diffuse-to-total ratio */ ); #endif diff --git a/lib_com/ivas_qmetadata_com.c b/lib_com/ivas_qmetadata_com.c index 4bd135ec98..8d3f4c73fb 100644 --- a/lib_com/ivas_qmetadata_com.c +++ b/lib_com/ivas_qmetadata_com.c @@ -510,7 +510,7 @@ void masa_compensate_two_dir_energy_ratio_index( int16_t *ratio_index_mod2 /* o : Output modified ratio for direction 2 */ #ifdef HODIRAC , - int16_t hodirac /* i: flag to indicate sector processing */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ #endif ) { @@ -523,7 +523,7 @@ void masa_compensate_two_dir_energy_ratio_index( ratio2 = 1.0f - diffuseness_reconstructions[ratio_index_2]; #ifdef HODIRAC - if ( !hodirac ) + if ( !hodirac_flag ) #endif { #ifdef HODIRAC @@ -626,10 +626,17 @@ void ivas_qmetadata_direction_vector_to_azimuth_elevation( return; } + #ifdef HODIRAC +/*------------------------------------------------------------------------- + * ivas_get_df_ratio_bits_hodirac() + * + * + *------------------------------------------------------------------------*/ + /*! r: bits to be used for quantizing ratio of ratios */ int16_t ivas_get_df_ratio_bits_hodirac( - int16_t index_diff /* i : index of quantized diffuse-to-total ratio */ + const int16_t index_diff /* i : index of quantized diffuse-to-total ratio */ ) { int16_t dfRatio_bits; diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 401c79d3e7..7027c6292c 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -54,7 +54,7 @@ static ivas_error ivas_dirac_alloc_mem( DIRAC_DEC_HANDLE hDirAC, const RENDERER_TYPE renderer_type, DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem #ifdef HODIRAC , - int16_t hodirac + const int16_t hodirac_flag #endif ); @@ -155,7 +155,6 @@ ivas_error ivas_dirac_dec_config( hodirac_flag = ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ); #endif - if ( flag_config == DIRAC_RECONFIGURE ) { hDirAC = st_ivas->hDirAC; @@ -1510,7 +1509,7 @@ static ivas_error ivas_dirac_alloc_mem( DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem #ifdef HODIRAC , - int16_t hodirac + const int16_t hodirac_flag #endif ) { @@ -1532,7 +1531,7 @@ static ivas_error ivas_dirac_alloc_mem( size = num_freq_bands * num_outputs_dir; #ifdef HODIRAC - if ( hodirac ) + if ( hodirac_flag ) { size_ho = size * DIRAC_HO_NUMSECTORS; size_pf = num_freq_bands * DIRAC_HO_NUMSECTORS; @@ -1810,7 +1809,7 @@ void ivas_dirac_dec_read_BS( int16_t *nb_bits, /* o : number of bits read */ const SBA_MODE sba_mode, /* i : SBA mode */ #ifdef HODIRAC - const int16_t hodirac, /* i : HO-Dirac flag */ + const int16_t hodirac_flag, /* i : HO-Dirac flag */ #endif int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ) @@ -1910,7 +1909,7 @@ void ivas_dirac_dec_read_BS( *nb_bits += ivas_qmetadata_dec_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ) #ifdef HODIRAC , - hodirac + hodirac_flag #endif ); } @@ -1982,7 +1981,7 @@ void ivas_dirac_dec_read_BS( ivas_qmetadata_to_dirac( hQMetaData, hDirAC, NULL, ivas_total_brate, sba_mode #ifdef HODIRAC , - hodirac + hodirac_flag #endif , dirac_to_spar_md_bands ); @@ -2005,7 +2004,7 @@ void ivas_qmetadata_to_dirac( const int32_t ivas_total_brate, /* i : IVAS total bitrate */ const SBA_MODE sba_mode, /* i : SBA mode */ #ifdef HODIRAC - const int16_t hodirac, /* i : HO-DirAC flag*/ + const int16_t hodirac_flag, /* i : HO-DirAC flag*/ #endif int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ) @@ -2219,7 +2218,7 @@ void ivas_qmetadata_to_dirac( /* Bands with spatial data transmitted */ #ifdef HODIRAC - if ( hodirac ) + if ( hodirac_flag ) { no_secs = DIRAC_HO_NUMSECTORS; } @@ -2270,7 +2269,7 @@ void ivas_qmetadata_to_dirac( #ifdef HODIRAC - if ( hMasa == NULL && hodirac ) + if ( hMasa == NULL && hodirac_flag ) { azimuth = q_direction[idx_sec].band_data[qBand_idx].azimuth[block_qmetadata]; elevation = q_direction[idx_sec].band_data[qBand_idx].elevation[block_qmetadata]; @@ -2306,7 +2305,7 @@ void ivas_qmetadata_to_dirac( tmp_write_idx_band = tmp_write_idx_param_band; #ifdef HODIRAC - if ( hodirac ) + if ( hodirac_flag ) { azi = (int16_t) ( azimuth + 0.5f ); ele = (int16_t) ( elevation + 0.5f ); @@ -2348,7 +2347,7 @@ void ivas_qmetadata_to_dirac( hDirAC->diffuseness_vector[tmp_write_idx_band][b] = diffuseness; #ifdef HODIRAC - if ( hodirac ) + if ( hodirac_flag ) { if ( idx_sec == 0 ) { diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c index fc76524abb..afce73d386 100755 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -93,7 +93,7 @@ ivas_error ivas_dirac_dec_output_synthesis_open( const int32_t output_Fs /* i : output sampling rate */ #ifdef HODIRAC , - const int16_t hodirac /* i : flag to indicate HO-DirAC mode*/ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode*/ #endif ) { @@ -175,7 +175,7 @@ ivas_error ivas_dirac_dec_output_synthesis_open( /* target PSD buffers */ #ifdef HODIRAC - if ( hodirac ) + if ( hodirac_flag ) { size = hDirAC->num_freq_bands * hDirAC->num_outputs_dir * DIRAC_HO_NUMSECTORS; } @@ -377,7 +377,7 @@ void ivas_dirac_dec_output_synthesis_init( const int16_t nchan_out_woLFE /* i : number of output audio channels without LFE */ #ifdef HODIRAC , - const int16_t hodirac /* flag to indicate HO-DirAC mode */ + const int16_t hodirac_flag /* flag to indicate HO-DirAC mode */ #endif ) { @@ -402,7 +402,7 @@ void ivas_dirac_dec_output_synthesis_init( } #ifdef HODIRAC - if ( hodirac ) + if ( hodirac_flag ) { size = hDirAC->num_freq_bands * hDirAC->num_outputs_dir * DIRAC_HO_NUMSECTORS; } @@ -572,9 +572,8 @@ void ivas_dirac_dec_output_synthesis_process_slot( const int16_t nchan_transport, /* i : number of transport channels*/ #ifndef HODIRAC const int16_t index_slot -#endif -#ifdef HODIRAC - const int16_t hodirac +#else + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode*/ #endif ) { @@ -609,37 +608,24 @@ void ivas_dirac_dec_output_synthesis_process_slot( } #ifdef HODIRAC - if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD && hodirac ) + if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD && hodirac_flag ) { - ivas_dirac_dec_compute_directional_responses( hDirAC, - hVBAPdata, - NULL, - NULL, - 2, - p_Rmat, - hodirac ); + ivas_dirac_dec_compute_directional_responses( hDirAC, hVBAPdata, NULL, NULL, 2, p_Rmat, hodirac_flag ); } - if ( hDirAC->hConfig->dec_param_estim == FALSE && hodirac ) + + if ( hDirAC->hConfig->dec_param_estim == FALSE && hodirac_flag ) { if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { v_multc( hDirAC->energy_ratio1[hDirAC->dirac_read_idx], -1.f, aux_buf, num_freq_bands ); v_addc( aux_buf, 1.f, aux_buf, num_freq_bands ); - mvr2r( hDirAC->energy_ratio1[hDirAC->dirac_read_idx], - h_dirac_output_synthesis_state->direct_power_factor, - num_freq_bands ); - mvr2r( aux_buf, - h_dirac_output_synthesis_state->diffuse_power_factor, - num_freq_bands ); + mvr2r( hDirAC->energy_ratio1[hDirAC->dirac_read_idx], h_dirac_output_synthesis_state->direct_power_factor, num_freq_bands ); + mvr2r( aux_buf, h_dirac_output_synthesis_state->diffuse_power_factor, num_freq_bands ); v_multc( hDirAC->energy_ratio2[hDirAC->dirac_read_idx], -1.f, aux_buf, num_freq_bands ); v_addc( aux_buf, 1.f, aux_buf, num_freq_bands ); - mvr2r( hDirAC->energy_ratio2[hDirAC->dirac_read_idx], - &h_dirac_output_synthesis_state->direct_power_factor[hDirAC->num_freq_bands], - num_freq_bands ); - mvr2r( aux_buf, - &h_dirac_output_synthesis_state->diffuse_power_factor[hDirAC->num_freq_bands], - num_freq_bands ); + mvr2r( hDirAC->energy_ratio2[hDirAC->dirac_read_idx], &h_dirac_output_synthesis_state->direct_power_factor[hDirAC->num_freq_bands], num_freq_bands ); + mvr2r( aux_buf, &h_dirac_output_synthesis_state->diffuse_power_factor[hDirAC->num_freq_bands], num_freq_bands ); } else { @@ -805,7 +791,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( const float *onset_filter #ifdef HODIRAC , - const int16_t hodirac /* i: flag for sector-based processing */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode*/ #endif ) { @@ -854,7 +840,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( *-----------------------------------------------------------------*/ #ifdef HODIRAC - if ( hodirac ) + if ( hodirac_flag ) { assert( hDirAC->hConfig->dec_param_estim == FALSE ); /*Direct gain*/ @@ -955,9 +941,9 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( p_cy_cross_dir_smooth = h_dirac_output_synthesis_state.cy_cross_dir_smooth; p_gains_dir = h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev; -/*Direct gains*/ + /*Direct gains*/ #ifdef HODIRAC - if ( hodirac ) + if ( hodirac_flag ) { for ( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ ) { @@ -1002,8 +988,9 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( *( p_gains_dir++ ) = g2; } } + #ifdef HODIRAC - if ( hodirac ) + if ( hodirac_flag ) { // wkr: additional gains for second sector, hard coded to two sectors p_cy_cross_dir_smooth = h_dirac_output_synthesis_state.cy_cross_dir_smooth + num_freq_bands * num_channels_dir; @@ -1035,7 +1022,6 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( } #endif - /*Diffuse gains*/ p_cy_auto_diff_smooth = h_dirac_output_synthesis_state.cy_auto_diff_smooth + nchan_transport_foa * num_freq_bands_diff; p_gains_diff = h_dirac_output_synthesis_state.cy_auto_diff_smooth_prev + nchan_transport_foa * num_freq_bands_diff; @@ -1079,7 +1065,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( for ( ch_idx = nchan_transport_foa; ch_idx < num_channels_dir; ch_idx++ ) { #ifdef HODIRAC - if ( hodirac ) + if ( hodirac_flag ) { if ( proto_direct_index[ch_idx] == 0 ) { @@ -1230,13 +1216,13 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( } } -/*-----------------------------------------------------------------* - * update buffers - *-----------------------------------------------------------------*/ + /*-----------------------------------------------------------------* + * update buffers + *-----------------------------------------------------------------*/ -/* store estimates for next synthesis block */ + /* store estimates for next synthesis block */ #ifdef HODIRAC - if ( hodirac ) + if ( hodirac_flag ) { mvr2r( h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev, h_dirac_output_synthesis_state.gains_dir_prev, num_freq_bands * num_channels_dir * DIRAC_HO_NUMSECTORS ); } @@ -1248,9 +1234,9 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( mvr2r( h_dirac_output_synthesis_state.cy_auto_diff_smooth_prev, h_dirac_output_synthesis_state.gains_diff_prev, num_freq_bands_diff * num_channels_diff ); -/* reset values */ + /* reset values */ #ifdef HODIRAC - if ( hodirac ) + if ( hodirac_flag ) { set_zero( h_dirac_output_synthesis_state.cy_cross_dir_smooth, num_freq_bands * num_channels_dir * DIRAC_HO_NUMSECTORS ); } @@ -1260,7 +1246,6 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( set_zero( h_dirac_output_synthesis_state.cy_cross_dir_smooth, num_freq_bands * num_channels_dir ); } - set_zero( h_dirac_output_synthesis_state.cy_auto_diff_smooth, num_freq_bands_diff * num_channels_diff ); return; @@ -1795,7 +1780,7 @@ void ivas_dirac_dec_compute_directional_responses( const float *p_Rmat /* i : rotation matrix */ #ifdef HODIRAC , - const int16_t hodirac /* i : flag for sector based dirac processing */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode*/ #endif ) { @@ -1868,10 +1853,12 @@ void ivas_dirac_dec_compute_directional_responses( #ifdef HODIRAC set_f( direct_response_hoa, 1.0f, MAX_OUTPUT_CHANNELS ); set_f( direct_response_dir2, 1.0f, MAX_OUTPUT_CHANNELS ); + if ( p_Rmat != 0 ) { ivas_dirac_dec_get_response_split_order( azimuth[k], elevation[k], direct_response_hoa, shd_rot_max_order, p_Rmat ); - if ( hodirac ) + + if ( hodirac_flag ) { ivas_dirac_dec_get_response_split_order( azimuth2[k], elevation2[k], direct_response_dir2, shd_rot_max_order, p_Rmat ); } @@ -1879,7 +1866,8 @@ void ivas_dirac_dec_compute_directional_responses( else { ivas_dirac_dec_get_response( azimuth[k], elevation[k], direct_response_hoa, hDirAC->hOutSetup.ambisonics_order ); - if ( hodirac ) + + if ( hodirac_flag ) { ivas_dirac_dec_get_response( azimuth2[k], elevation2[k], direct_response_dir2, hDirAC->hOutSetup.ambisonics_order ); } @@ -1888,7 +1876,8 @@ void ivas_dirac_dec_compute_directional_responses( if ( hMasa == NULL && hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { mvr2r_inc( direct_response_hoa, 1, &hDirAC->h_output_synthesis_psd_state.direct_responses[k], hDirAC->num_freq_bands, num_channels_dir ); - if ( hodirac ) + + if ( hodirac_flag ) { mvr2r_inc( direct_response_dir2, 1, &hDirAC->h_output_synthesis_psd_state.direct_responses[k + hDirAC->num_freq_bands * num_channels_dir], hDirAC->num_freq_bands, num_channels_dir ); } diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index 3774c06799..2bd8b855fd 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -159,7 +159,6 @@ static int16_t read_coherence_data_hr_512( * Main function for decoding Spatial Metadata *-----------------------------------------------------------------------*/ - /*! r: number of bits read */ int16_t ivas_qmetadata_dec_decode( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: hQMetaData handle */ @@ -167,7 +166,7 @@ int16_t ivas_qmetadata_dec_decode( int16_t *index /* i/o: bitstream position */ #ifdef HODIRAC , - int16_t hodirac /* i: flag to indicate sector processing */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ #endif ) { @@ -259,7 +258,7 @@ int16_t ivas_qmetadata_dec_decode( bits_diff_sum += ivas_qmetadata_entropy_decode_diffuseness( bitstream, index, &( hQMetaData->q_direction[0] ), &diffuseness_index_max_ec_frame_pre[0] ); #ifdef HODIRAC - if ( hodirac ) + if ( hodirac_flag ) { if ( hQMetaData->no_directions == 2 ) { @@ -312,7 +311,7 @@ int16_t ivas_qmetadata_dec_decode( dfRatio_qsteps = 1 << dfRatio_bits[dir2band]; #ifdef HODIRAC /* already encoded as total and ratios in HODIRAC*/ - if ( hodirac ) + if ( hodirac_flag ) { dfRatio = usdequant( hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0], 0.0f, 1.f / ( dfRatio_qsteps - 1 ) ); dir1ratio = 1.f - diffRatio; @@ -331,7 +330,7 @@ int16_t ivas_qmetadata_dec_decode( /* Requantize the 1 - dirRatio separately for each direction to obtain inverted dirRatio index. These are used in further decoding. */ hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0] = masa_sq( 1.0f - dir1ratio, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); #ifdef HODIRAC - if ( hodirac ) + if ( hodirac_flag ) { float tmp; hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0] = usquant( dir2ratio, &tmp, 0.0f, 1.f / ( DIRAC_DIFFUSE_LEVELS - 1 ), DIRAC_DIFFUSE_LEVELS ); @@ -399,7 +398,7 @@ int16_t ivas_qmetadata_dec_decode( masa_compensate_two_dir_energy_ratio_index( index_dirRatio1Inv, index_dirRatio2Inv, &index_dirRatio1Inv_mod, &index_dirRatio2Inv_mod #ifdef HODIRAC , - hodirac + hodirac_flag #endif ); @@ -792,7 +791,7 @@ int16_t ivas_qmetadata_dec_decode( /* Scale energy ratios that sum to over one */ #ifdef HODIRAC - if ( !hodirac ) + if ( !hodirac_flag ) #endif { for ( b = 0; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index 6c094a4491..7fa98b1e04 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -630,7 +630,7 @@ void ivas_dirac_param_est_enc( const SBA_MODE sba_mode #ifdef HODIRAC , - const int16_t hodirac, + const int16_t hodirac_flag, const int16_t nchan_fb_in #endif ) @@ -778,7 +778,7 @@ void ivas_dirac_param_est_enc( hDirAC->hConfig->enc_param_start_band, num_freq_bands, #ifdef HODIRAC - hodirac ? SBA_MODE_DIRAC : sba_mode + hodirac_flag ? SBA_MODE_DIRAC : sba_mode #else sba_mode #endif @@ -797,7 +797,7 @@ void ivas_dirac_param_est_enc( intensity_real ); #ifdef HODIRAC - if ( !hodirac ) + if ( !hodirac_flag ) #endif { computeDirectionVectors( @@ -822,19 +822,12 @@ void ivas_dirac_param_est_enc( mvr2r( reference_power[ts], &( hDirAC->buffer_energy[( index - 1 ) * num_freq_bands] ), num_freq_bands ); computeDiffuseness_mdft( hDirAC->buffer_intensity_real, hDirAC->buffer_energy, num_freq_bands, hDirAC->no_col_avg_diff, diffuseness_vector ); + #ifdef HODIRAC - if ( hodirac ) + if ( hodirac_flag ) { - calculate_hodirac_sector_parameters( - Cldfb_RealBuffer, - Cldfb_ImagBuffer, - l_ts, - 0.20f, - hDirAC->band_grouping, - hDirAC->hConfig->nbands, - hDirAC->hConfig->enc_param_start_band, - azi_secs, ele_secs, diff_secs, ene_secs ); + calculate_hodirac_sector_parameters( Cldfb_RealBuffer, Cldfb_ImagBuffer, l_ts, 0.20f, hDirAC->band_grouping, hDirAC->hConfig->nbands, hDirAC->hConfig->enc_param_start_band, azi_secs, ele_secs, diff_secs, ene_secs ); #ifdef HODIRAC_WRITE_PARAMS for ( i = 0; i < num_freq_bands; i++ ) @@ -849,13 +842,12 @@ void ivas_dirac_param_est_enc( diffuseness_vector[i] ); } } - -#endif // HODIRAC_WRITE_PARAMS +#endif } -#endif // HODIRAC +#endif #ifdef HODIRAC - if ( hodirac ) + if ( hodirac_flag ) { for ( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ ) { @@ -882,7 +874,7 @@ void ivas_dirac_param_est_enc( } #ifdef HODIRAC - if ( !hodirac ) + if ( !hodirac_flag ) #endif { @@ -921,9 +913,10 @@ void ivas_dirac_param_est_enc( &q_direction->band_data[band_m_idx].elevation[block_m_idx] ); } } + /* Sectors */ #ifdef HODIRAC - if ( hodirac ) + if ( hodirac_flag ) { for ( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ ) { diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index 273703b317..9d8f7fbe02 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -55,7 +55,7 @@ static float direction_distance( float elevation[DIRAC_MAX_NBANDS][MAX_PARAM_SPA static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( IVAS_QMETADATA_HANDLE hQMetaData, int16_t *needed_bits, int16_t *nbits_diff, int16_t *dfRatioBits #ifdef HODIRAC , - int16_t hodirac /* i: flag to indicate sector processing */ + const int16_t hodirac_flag #endif ); @@ -183,7 +183,7 @@ ivas_error ivas_qmetadata_enc_encode( IVAS_QMETADATA *hQMetaData /* i/o: metadata handle */ #ifdef HODIRAC , - int16_t hodirac /* i: flag to indicate sector processing */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode*/ #endif ) { @@ -270,7 +270,7 @@ ivas_error ivas_qmetadata_enc_encode( #endif /* Reorder 2dir bands for more efficient encoding. */ #ifdef HODIRAC - if ( !hodirac ) + if ( !hodirac_flag ) #endif { ivas_qmetadata_reorder_2dir_bands( hQMetaData ); @@ -311,7 +311,7 @@ ivas_error ivas_qmetadata_enc_encode( ivas_qmetadata_quantize_diffuseness_nrg_ratios( hQMetaData, bits_dir_raw_pre, bits_diff, dfRatio_bits #ifdef HODIRAC , - hodirac + hodirac_flag #endif ); @@ -1679,7 +1679,7 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( int16_t *dfRatioBits #ifdef HODIRAC , - int16_t hodirac /* i: flag to indicate sector processing */ + const int16_t hodirac_flag #endif ) { @@ -1706,7 +1706,7 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( * accurate than simple separate quantization of each direct-to-total ratio or their * separate inverses. */ #ifdef HODIRAC - if ( hodirac ) + if ( hodirac_flag ) { /* already encoded as total and ratios in HODIRAC*/ diffRatio = 1.f - hQMetaData->q_direction[0].band_data[j].energy_ratio[0]; @@ -1727,7 +1727,7 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( diffRatioQ = diffuseness_reconstructions[index_diff]; #ifdef HODIRAC - if ( hodirac ) + if ( hodirac_flag ) { dfRatio_bits = ivas_get_df_ratio_bits_hodirac( index_diff ); } @@ -1741,7 +1741,7 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( dfRatio_qsteps = ( 1 << dfRatio_bits ); #ifdef HODIRAC - if ( hodirac ) + if ( hodirac_flag ) { dfRatio_index = usquant( dfRatio, &dfRatioQ, 0.0f, 1.f / ( dfRatio_qsteps - 1 ), dfRatio_qsteps ); dirRatio1Q = 1.f - diffRatioQ; @@ -1769,8 +1769,9 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( hQMetaData->q_direction[0].band_data[j].energy_ratio[k] = dirRatio1Q; } nbits_diff[0] += MASA_BITS_ER; + #ifdef HODIRAC - if ( hodirac ) + if ( hodirac_flag ) { float tmp; index_dirRatio2Inv = usquant( dirRatio2Q, &tmp, 0.0f, 1.f / ( DIRAC_DIFFUSE_LEVELS - 1 ), DIRAC_DIFFUSE_LEVELS ); @@ -1795,7 +1796,7 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( masa_compensate_two_dir_energy_ratio_index( index_dirRatio1Inv, index_dirRatio2Inv, &index_dirRatio1Inv_mod, &index_dirRatio2Inv_mod #ifdef HODIRAC , - hodirac + hodirac_flag #endif ); diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 5ca91f334f..a415457a49 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -625,7 +625,7 @@ static ivas_error ivas_spar_enc_process( ivas_qmetadata_enc_encode( hMetaData, hQMetaData #ifdef HODIRAC , - st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_256k + ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) #endif ); } -- GitLab From c7985e799c8ce814d6ef256a9191f26351c7d1a9 Mon Sep 17 00:00:00 2001 From: Vidhya V P <100825@ittiam.com> Date: Thu, 11 May 2023 13:47:40 +0530 Subject: [PATCH 105/331] Added changes missed while merging to the main --- lib_enc/ivas_spar_md_enc.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index fcf3d71787..d746b5444d 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -657,6 +657,7 @@ ivas_error ivas_spar_md_enc_process( } hMetaData_tmp.ind_list = ind_list_tmp; + hMetaData_tmp.nb_bits_tot = 0; /* Save state of metadata bitstream buffer */ bit_pos_start = hMetaData->nb_bits_tot; @@ -692,7 +693,7 @@ ivas_error ivas_spar_md_enc_process( { for ( b = SPAR_DIRAC_SPLIT_START_BAND; b < num_bands; b++ ) { - for ( i = 0; i < FOA_CHANNELS - 1; i++ ) + for ( i = 0; i < DIRAC_TO_SPAR_HBR_PRED_CHS; i++ ) { pred_coeffs_re_local[i][b] = hMdEnc->spar_md.band_coeffs[b].pred_re[i]; } @@ -873,7 +874,7 @@ ivas_error ivas_spar_md_enc_process( { for ( b = SPAR_DIRAC_SPLIT_START_BAND; b < num_bands; b++ ) { - for ( i = 0; i < FOA_CHANNELS - 1; i++ ) + for ( i = 0; i < DIRAC_TO_SPAR_HBR_PRED_CHS; i++ ) { /* Use the prediction coeffs computed based on DirAC MD to generate mixer matrix */ pred_coeffs_re[i][b] = pred_coeffs_re_local[i][b]; @@ -1704,12 +1705,12 @@ static void ivas_get_arith_coded_bs( for ( j = 0; j < pred_cell_dims[i].dim1; j++ ) { hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j] = - hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j + ( FOA_CHANNELS - 1 )]; + hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j + DIRAC_TO_SPAR_HBR_PRED_CHS]; if ( any_diff == 1 ) { hMdEnc->spar_md_prior.band_coeffs_idx_mapped[i].pred_index_re[j] = - hMdEnc->spar_md_prior.band_coeffs_idx_mapped[i].pred_index_re[j + ( FOA_CHANNELS - 1 )]; + hMdEnc->spar_md_prior.band_coeffs_idx_mapped[i].pred_index_re[j + DIRAC_TO_SPAR_HBR_PRED_CHS]; } } } @@ -1747,10 +1748,10 @@ static void ivas_get_arith_coded_bs( { for ( j = pred_cell_dims[i].dim1 - 1; j >= 0; j-- ) { - hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j + ( FOA_CHANNELS - 1 )] = + hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j + DIRAC_TO_SPAR_HBR_PRED_CHS] = hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j]; } - for ( j = 0; j < FOA_CHANNELS - 1; j++ ) + for ( j = 0; j < DIRAC_TO_SPAR_HBR_PRED_CHS; j++ ) { hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j] = 0; } -- GitLab From d5fa1115f2ef8158a48350e30ae9ea6fca4312cd Mon Sep 17 00:00:00 2001 From: Vidhya V P <100825@ittiam.com> Date: Thu, 11 May 2023 14:00:04 +0530 Subject: [PATCH 106/331] Merge branch 'main' into arithmetic_huffman_coder_changes --- lib_com/ivas_cov_smooth.c | 17 +++++++++++++++-- lib_com/options.h | 8 ++++++-- lib_enc/ext_sig_ana.c | 9 +++++++++ lib_enc/ivas_spar_encoder.c | 2 ++ lib_rend/ivas_dirac_dec_binaural_functions.c | 11 +++++------ 5 files changed, 37 insertions(+), 10 deletions(-) mode change 100644 => 100755 lib_com/options.h mode change 100644 => 100755 lib_enc/ext_sig_ana.c diff --git a/lib_com/ivas_cov_smooth.c b/lib_com/ivas_cov_smooth.c index b5bd6369c5..7a24396606 100644 --- a/lib_com/ivas_cov_smooth.c +++ b/lib_com/ivas_cov_smooth.c @@ -50,8 +50,11 @@ static void ivas_set_up_cov_smoothing( ivas_cov_smooth_state_t *hCovState, ivas_filterbank_t *pFb, const float max_update_rate, - const int16_t min_pool_size, + const int16_t min_pool_size +#ifndef FIX_331_ALL_BRS + , const int16_t nchan_inp /* i : number of input channels */ +#endif , const int32_t ivas_total_brate ) { @@ -90,7 +93,9 @@ static void ivas_set_up_cov_smoothing( } } } - else if ( nchan_inp <= FOA_CHANNELS ) + else +#ifndef FIX_331_ALL_BRS + if ( nchan_inp <= FOA_CHANNELS ) { for ( j = 0; j < pFb->filterbank_num_bands; j++ ) { @@ -112,6 +117,7 @@ static void ivas_set_up_cov_smoothing( } else { +#endif for ( j = 0; j < pFb->filterbank_num_bands; j++ ) { float update_factor; @@ -131,7 +137,9 @@ static void ivas_set_up_cov_smoothing( hCovState->pSmoothing_factor[j] = max_update_rate; } } +#ifndef FIX_331_ALL_BRS } +#endif hCovState->prior_bank_idx = -1; return; @@ -178,7 +186,12 @@ ivas_error ivas_spar_covar_smooth_enc_open( } } + +#ifndef FIX_331_ALL_BRS ivas_set_up_cov_smoothing( hCovState, pFb, cov_smooth_cfg->max_update_rate, cov_smooth_cfg->min_pool_size, nchan_inp, ivas_total_brate ); +#else + ivas_set_up_cov_smoothing( hCovState, pFb, cov_smooth_cfg->max_update_rate, cov_smooth_cfg->min_pool_size, ivas_total_brate ); +#endif *hCovState_out = hCovState; diff --git a/lib_com/options.h b/lib_com/options.h old mode 100644 new mode 100755 index ae406a0552..ab66559806 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -137,6 +137,10 @@ #define DISABLE_ADAP_RES_COD_TMP /* temporary fix for IVAS-403, disables adaptive residual coding */ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ +#define FIX_103_RA_PARAMS_PARAM_BIN_REND /* Issue 103: Digest room acoustics parameters for Parametric Binaural Renderer*/ +/*#define SBA_HPF_TUNING_DEC*/ +#define SMOOTH_WITH_TRANS_DET +#define FIX_331_ALL_BRS /*Enable the fix_331 across all the bitrates and sba modes*/ #define FIX_ISM_DTX_CNG_BWIDTH_ALT /* VA: issue 396 - alternative fix for bw changes on CNG frames in ISM DTX for objects that use the decoder-side noise estimation */ #define FIX_398_MASA_DIRECTION_ALIGNMENT /* Nokia: Issue 398: in 2dir MASA, dynamically adjust directions to be consistent */ @@ -181,6 +185,7 @@ #define FIX_355_REFACTOR_PARAMBIN_TO_5MS /* Nokia: Fixes issue 355 by refactoring parametric binauralizer code to 5 ms mode */ #define FIX_411_EVS_BE_TESTS_ON_WINDOWS_FAILING /* Eri: Fix incorrect use of stack variable used for channel aware config file */ #define COMBINED_FORMAT_SIGNALING /* VA: Introduce a signaling bit for combined format coding */ +#define FIX_446_STEREO_DMX_CRASH /* FhG: fix discrepancy with EVS code that could cause crashes in rare cases */ #define FIX_386_CORECODER_RECONFIG_2 /* VA: Issue 386: Resolve remaining ToDo comments in CoreCoder reconfig. */ #define FIX_440_PARAM_ISM_DIR_NOISE /* FhG: Issue 440: Fix directional background noise becoming diffuse in ParamISM */ @@ -191,11 +196,10 @@ #define FIX_447_PARAMBIN_MASA_REGU_FAC /* Nokia: Issue 447: Fix issue by adjusting regularization factor minimum value. */ #define FIX_441_SBA_PARAMBIN_GAINS /* Nokia: Fix issue 441 by changing gains in SBA path of parametric binauralizer */ - #define HODIRAC /* FhG: Sector-based HO-DirAC method for SBA at high bitrates */ #ifdef HODIRAC -#define SPAR_TUNING /* Dlb: tune SPAR for better quality */ +#define SPAR_TUNING /* Dlb: tune SPAR for better quality */ #define HODIRAC_FIX_BR_SWITCHING_DTX #endif diff --git a/lib_enc/ext_sig_ana.c b/lib_enc/ext_sig_ana.c old mode 100644 new mode 100755 index 80e652cf07..f79fbb5f95 --- a/lib_enc/ext_sig_ana.c +++ b/lib_enc/ext_sig_ana.c @@ -444,10 +444,19 @@ void core_signal_analysis_high_bitrate( ProcessIGF( st, hTcxEnc->spectrum[frameno], hTcxEnc->spectrum[frameno], powerSpec, transform_type[frameno] == TCX_20, frameno, 0, vad_hover_flag ); } +#ifndef FIX_446_STEREO_DMX_CRASH /* Copy memory */ mvr2r( lsp_new, st->lspold_enc, M ); +#endif } } +#ifdef FIX_446_STEREO_DMX_CRASH + if ( st->element_mode != IVAS_CPE_MDCT ) + { + /* Copy memory */ + mvr2r( lsp_new, st->lspold_enc, M ); + } +#endif return; } diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index abb3e6899d..183614d039 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -508,10 +508,12 @@ static ivas_error ivas_spar_enc_process( *-----------------------------------------------------------------------------------------*/ ivas_transient_det_process( hSpar->hTranDet, data_f[0], input_frame, transient_det ); +#ifndef FIX_331_ALL_BRS if ( sba_order == 1 ) { transient_det[1] = transient_det[0]; } +#endif if ( ivas_total_brate < IVAS_24k4 ) { transient_det[1] = 0; diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 0af9e47868..d212517d08 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -2356,25 +2356,24 @@ static void adaptTransportSignalsHeadtracked( } #endif -#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackData, +#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, - float Rmat[3][3] ) -{ - int16_t slot, bin, ch; #else -static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( - HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], const uint8_t firstSlot, const uint8_t slotEnd, const uint8_t nBins, +#endif float Rmat[3][3] ) { +#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS + int16_t slot, bin, ch; +#else uint8_t slot, bin, ch; #endif float tmpVal; -- GitLab From 9857f232a04f73cb165c04cb5d0cf462c727b7bc Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Thu, 11 May 2023 10:52:28 +0200 Subject: [PATCH 107/331] revert last commits accidental deletion of ivas_dirac_dec.c --- lib_dec/ivas_ism_param_dec.c | 17 +++++++++++++---- lib_dec/ivas_spar_md_dec.c | 2 +- lib_dec/lib_dec.c | 3 +-- lib_rend/ivas_dirac_dec_binaural_functions.c | 1 - 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index 1d80767e77..0ce3ad7bef 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -1190,7 +1190,6 @@ void ivas_param_ism_dec( for ( subframe_idx = 0; subframe_idx < hDirAC->nb_subframes; subframe_idx++ ) { #ifdef JBM_TSM_ON_TCS - /* TODO: JBM just a quick fix to gewt SBA running, change to the right thing later...*/ uint16_t slot_idx_start = subframe_idx * hDirAC->subframe_nbslots[subframe_idx]; #else uint16_t slot_idx_start = subframe_idx * hDirAC->subframe_nbslots; @@ -1317,9 +1316,20 @@ void ivas_ism_dec_digest_tc( if ( ( st_ivas->hDecoderConfig->output_Fs / (int32_t) FRAMES_PER_SECOND ) == st_ivas->hTcBuffer->n_samples_available ) { int16_t interpolator_length = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / (int32_t) FRAMES_PER_SECOND ); - for ( i = 0; i < interpolator_length; i++ ) + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) { - st_ivas->hIsmRendererData->interpolator[i] = (float) i / ( (float) interpolator_length - 1 ); + st_ivas->hIsmRendererData->interpolator[0] = 0.0f; + for ( i = 1; i < interpolator_length; i++ ) + { + st_ivas->hIsmRendererData->interpolator[i] = st_ivas->hIsmRendererData->interpolator[i - 1] + 1.f / ( interpolator_length - 1 ); + } + } + else + { + for ( i = 0; i < interpolator_length; i++ ) + { + st_ivas->hIsmRendererData->interpolator[i] = (float) i / ( (float) interpolator_length - 1 ); + } } } else @@ -1525,7 +1535,6 @@ static void ivas_ism_param_dec_render_sf( Decoder_Struct *st_ivas, float *Cldfb_ImagBuffer_in[PARAM_ISM_MAX_DMX]; DIRAC_DEC_HANDLE hDirAC; - /* TODO: JBM just a quick fix to gewt SBA running, change to the right thing later...*/ int16_t slot_idx_start; int16_t idx_in; int16_t idx_lfe; diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index ca3f926e96..71ac89a08d 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -2957,7 +2957,7 @@ void ivas_spar_to_dirac( hDirAC->energy_ratio1[block][b] = en_ratio; tmp_write_idx_band = tmp_write_idx_param_band; - /* TODO: JBM */ + if ( hDirAC->hConfig->dec_param_estim == FALSE ) { hDirAC->elevation[tmp_write_idx_band][b] = ele_dith; diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index f99209a1c5..03de9374dc 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -890,8 +890,7 @@ static ivas_error IVAS_DEC_Setup( return error; } } - /* TODO: JBM replace with a function that gets the real number of TCs generated, - depending of remapping, td rendering already done in the TC decoding part, ....*/ + *nTransportChannels = (uint8_t) st_ivas->hTcBuffer->nchan_transport_jbm; *nTcBufferGranularity = (uint16_t) st_ivas->hTcBuffer->n_samples_granularity; *nOutChannels = (uint8_t) st_ivas->hDecoderConfig->nchan_out; diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 4b0279fb2d..33287b4207 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -2759,7 +2759,6 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric #endif { #ifdef JBM_TSM_ON_TCS - /* TODO: JBM this needs to be adapted to the variable size subframes */ int16_t slotThis = slot + slot_idx_start; #else int16_t slotThis = slot + ( hDirAC->subframe_nbslots * subframe ); -- GitLab From 406db880c698441df20c03e526e3a7288ab93923 Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 11 May 2023 10:53:54 +0200 Subject: [PATCH 108/331] formal improvements --- lib_com/ivas_cnst.h | 3 +- lib_com/ivas_dirac_com.c | 45 +++++++----- lib_com/ivas_fb_mixer.c | 26 +++---- lib_com/ivas_prot.h | 56 +++++++-------- lib_com/ivas_qmetadata_com.c | 12 +--- lib_dec/ivas_dirac_dec.c | 87 ++++++++++++++++------- lib_dec/ivas_dirac_output_synthesis_dec.c | 36 +++++----- lib_dec/ivas_masa_dec.c | 1 + lib_dec/ivas_qmetadata_dec.c | 2 +- lib_dec/ivas_sba_dec.c | 6 +- lib_enc/ivas_dirac_enc.c | 3 +- lib_enc/ivas_qmetadata_enc.c | 3 +- lib_enc/ivas_sba_enc.c | 2 +- lib_enc/ivas_spar_encoder.c | 7 +- 14 files changed, 162 insertions(+), 127 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 01b11b21e4..68a8e00cf8 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -998,10 +998,9 @@ typedef enum #endif #ifdef HODIRAC -#define IVAS_SPAR_MAX_FB_IN_CHAN 11 +#define IVAS_SPAR_MAX_FB_IN_CHAN 11 #endif - #define IVAS_SPAR_P_LOWERTRI ((IVAS_SPAR_MAX_CH - 1) * (IVAS_SPAR_MAX_CH - 2)) >> 1 #define IVAS_SPAR_MAX_C_COEFF (IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS) * ( IVAS_SPAR_MAX_DMX_CHS - 1) diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index ad107ea1f6..fa64a78948 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -158,6 +158,7 @@ ivas_error ivas_dirac_config( hConfig->nbands = IVAS_MAX_NUM_BANDS; spar_dirac_split_band = min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); + #ifdef HODIRAC if ( ivas_get_hodirac_flag( ivas_total_brate, sba_order ) ) { @@ -199,6 +200,7 @@ ivas_error ivas_dirac_config( { hConfig->enc_param_start_band = spar_dirac_split_band; } + #ifdef HODIRAC if ( ivas_get_hodirac_flag( ivas_total_brate, sba_order ) ) { @@ -221,15 +223,11 @@ ivas_error ivas_dirac_config( if ( sba_mode == SBA_MODE_SPAR ) { - ivas_dirac_config_bands( band_grouping, - IVAS_MAX_NUM_BANDS, - (int16_t) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), - dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hConfig->enc_param_start_band, hFbMdft ); + ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (int16_t) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hConfig->enc_param_start_band, hFbMdft ); } else { - ivas_dirac_config_bands( band_grouping, hConfig->nbands, (int16_t) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), - NULL, 0, 0, hFbMdft ); + ivas_dirac_config_bands( band_grouping, hConfig->nbands, (int16_t) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), NULL, 0, 0, hFbMdft ); } return error; @@ -891,19 +889,26 @@ void deindex_spherical_component( return; } + #ifdef HODIRAC +/*---------------------------------------------------------------- + * calculate_hodirac_sector_parameters() + * + * + *-----------------------------------------------------------------*/ + void calculate_hodirac_sector_parameters( - float RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i: signal vector (L+1)^2 x N_bins, real part */ - float ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i: signal vector, imaginary part*/ - const int16_t N_bins, /* i: number of bins */ - const float beta, /* i: forgetting factor for average filtering */ - const int16_t *band_grouping, /* i: indices of band groups */ - const int16_t N_bands, /* i: number of bands (groups) */ - const int16_t enc_param_start_band, /* i: first band to process */ - float *azi, /* o: array of sector azimuth angles, flat */ - float *ele, /* o: array of sector elevation angles, flat */ - float *diff, /* o: array of sector diffuseness values, flat*/ - float *ene /* o: array of sector energy values, flat*/ + float RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : signal vector (L+1)^2 x N_bins, real part */ + float ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : signal vector, imaginary part */ + const int16_t N_bins, /* i : number of bins */ + const float beta, /* i : forgetting factor for average filtering */ + const int16_t *band_grouping, /* i : indices of band groups */ + const int16_t N_bands, /* i : number of bands (groups) */ + const int16_t enc_param_start_band, /* i : first band to process */ + float *azi, /* o : array of sector azimuth angles, flat */ + float *ele, /* o : array of sector elevation angles, flat */ + float *diff, /* o : array of sector diffuseness values, flat */ + float *ene /* o : array of sector energy values, flat */ ) { int16_t i_sec, i_bin, i_band; @@ -1098,10 +1103,12 @@ void calculate_hodirac_sector_parameters( assert( *p_azi >= -180.f && *p_azi <= 180.f ); assert( *p_ele >= -90.f && *p_ele <= 90.f ); #endif - } // i_band - } // i_sec + } + } firstrun_sector_params = 0; + + return; } #endif diff --git a/lib_com/ivas_fb_mixer.c b/lib_com/ivas_fb_mixer.c index 3f54709bff..ca25ccd065 100644 --- a/lib_com/ivas_fb_mixer.c +++ b/lib_com/ivas_fb_mixer.c @@ -99,16 +99,16 @@ static int16_t ivas_get_num_bands( *---------------------------------------------------------------------*/ ivas_error ivas_fb_set_cfg( - IVAS_FB_CFG **pFb_cfg_out, /* o : FB config. handle */ - const int16_t ivas_format, /* i : IVAS format */ - const SBA_MODE sba_mode, /* i : SBA mode */ - const int16_t num_in_chans, /* i : number of FB input channels */ - const int16_t num_out_chans, /* i : number of FB output channels*/ - const int16_t active_w_mixing, /* i : active_w_mixing flag */ - const int32_t sampling_rate /* i : sampling rate */ + IVAS_FB_CFG **pFb_cfg_out, /* o : FB config. handle */ + const int16_t ivas_format, /* i : IVAS format */ + const SBA_MODE sba_mode, /* i : SBA mode */ + const int16_t num_in_chans, /* i : number of FB input channels */ + const int16_t num_out_chans, /* i : number of FB output channels */ + const int16_t active_w_mixing, /* i : active_w_mixing flag */ + const int32_t sampling_rate /* i : sampling rate */ #ifdef HODIRAC , - const int16_t nchan_fb_in /* i: number of dirac analysis channels */ + const int16_t nchan_fb_in /* i : number of dirAC analysis channels*/ #endif ) { @@ -579,12 +579,12 @@ void ivas_fb_mixer_pcm_ingest( *-----------------------------------------------------------------------------------------*/ void ivas_fb_mixer_update_prior_input( - IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */ - float *pcm_in[], /* i : input audio channels */ - const int16_t length /* i : length of time slot */ + IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */ + float *pcm_in[], /* i : input audio channels */ + const int16_t length /* i : length of time slot */ #ifdef HODIRAC , - const int16_t nchan_fb_in + const int16_t nchan_fb_in /* i : number of analysis channels */ #endif ) { @@ -621,7 +621,7 @@ void ivas_fb_mixer_get_windowed_fr( const int16_t mdft_len /* i : MDFT frame length */ #ifdef HODIRAC , - int16_t nchan_fb_in + const int16_t nchan_fb_in /* i : number of analysis channels */ #endif ) { diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 2e74fddd72..05a6f9d407 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3020,12 +3020,10 @@ int16_t ivas_qmetadata_dec_decode( int16_t *index /* i/o: bitstream position */ #ifdef HODIRAC , - const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ #endif ); - - /*! r: number of bits read */ int16_t ivas_qmetadata_dec_sid_decode( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ @@ -3044,7 +3042,7 @@ void ivas_qmetadata_to_dirac( const int32_t ivas_total_brate, /* i : IVAS total bitrate */ const SBA_MODE sba_mode, /* i : SBA mode */ #ifdef HODIRAC - const int16_t sba_analysis_order, /* i sba order*/ + const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ #endif int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ); @@ -3476,7 +3474,7 @@ void ivas_dirac_dec_read_BS( int16_t *nb_bits, /* o : number of bits read */ const SBA_MODE sba_mode, /* i : SBA mode */ #ifdef HODIRAC - const int16_t sba_analysis_order, /* i sba order*/ + const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ #endif int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ); @@ -3593,7 +3591,7 @@ ivas_error ivas_dirac_dec_output_synthesis_open( const int32_t output_Fs /* i : output sampling rate */ #ifdef HODIRAC , - const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ #endif ); @@ -3602,7 +3600,7 @@ void ivas_dirac_dec_output_synthesis_init( const int16_t nchan_out_woLFE /* i : number of output audio channels without LFE */ #ifdef HODIRAC , - const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ #endif ); @@ -3621,7 +3619,7 @@ void ivas_dirac_dec_output_synthesis_process_slot( #ifndef HODIRAC const int16_t index_slot #else - const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ #endif ); @@ -3633,7 +3631,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( const float *onset_filter #ifdef HODIRAC , - const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ #endif ); @@ -3684,7 +3682,7 @@ void ivas_dirac_dec_compute_directional_responses( const float *p_Rmat /* i : rotation matrix */ #ifdef HODIRAC , - const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ #endif ); @@ -3695,17 +3693,17 @@ void ivas_dirac_dec_get_frequency_axis( #ifdef HODIRAC void calculate_hodirac_sector_parameters( - float RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i: signal vector (L+1)^2 x N_bins, real part */ - float ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i: signal vector, imaginary part*/ - const int16_t N_bins, /* i: number of bins */ - const float beta, /* i: forgetting factor for average filtering */ - const int16_t *band_grouping, /* i: indices of band groups */ - const int16_t N_bands, /* i: number of bands (groups) */ - const int16_t enc_param_start_band, /* i: first band to process */ - float *azi, /* o: array of sector azimuth angles, flat */ - float *ele, /* o: array of sector elevation angles, flat */ - float *diff, /* o: array of sector diffuseness values, flat*/ - float *ene /* o: array of sector energy values, flat*/ + float RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : signal vector (L+1)^2 x N_bins, real part */ + float ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : signal vector, imaginary part */ + const int16_t N_bins, /* i : number of bins */ + const float beta, /* i : forgetting factor for average filtering */ + const int16_t *band_grouping, /* i : indices of band groups */ + const int16_t N_bands, /* i : number of bands (groups) */ + const int16_t enc_param_start_band, /* i : first band to process */ + float *azi, /* o : array of sector azimuth angles, flat */ + float *ele, /* o : array of sector elevation angles, flat */ + float *diff, /* o : array of sector diffuseness values, flat */ + float *ene /* o : array of sector energy values, flat */ ); #endif @@ -4768,7 +4766,7 @@ void masa_compensate_two_dir_energy_ratio_index( int16_t *ratio_index_mod2 /* o : Output modified ratio for direction 2 */ #ifdef HODIRAC , - const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ #endif ); @@ -4786,15 +4784,15 @@ int16_t ivas_get_df_ratio_bits_hodirac( /*! r: Bits to be used for quantizing distribution ratio of direct-to-total ratios */ int16_t ivas_get_df_ratio_bits( - int16_t index_diff /* i : Index of quantized diffuse-to-total ratio */ + const int16_t index_diff /* i : Index of quantized diffuse-to-total ratio */ ); void masa_sample_rate_band_correction( MASA_CODEC_CONFIG *config, /* i/o: MASA codec config */ int16_t *band_mapping, /* i/o: Band mapping used and modified */ IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: QMetadata structure for modification */ - const int32_t sampling_rate /* i : sampling rate */ - , MASA_DECODER_EXT_OUT_META_HANDLE hExtOutMeta /* i/o: MASA decoder metadata ext out buffer */ + const int32_t sampling_rate, /* i : sampling rate */ + MASA_DECODER_EXT_OUT_META_HANDLE hExtOutMeta /* i/o: MASA decoder metadata ext out buffer */ ); void invdct4_transform( @@ -5093,7 +5091,7 @@ void computeReferencePower_enc( const SBA_MODE sba_mode /* i : SBA mode */ #ifdef HODIRAC , - int16_t nchan_ana /* i : no of analysis channels */ + const int16_t nchan_ana /* i : number of analysis channels */ #endif ); @@ -5221,7 +5219,7 @@ ivas_error ivas_fb_set_cfg( const int32_t sampling_Fs /* i : sampling rate */ #ifdef HODIRAC , - const int16_t nachan_dirac_ana /* i: number of dirac analysis channels */ + const int16_t nachan_dirac_ana /* i : number of DirAR analysis channels */ #endif ); @@ -5261,7 +5259,7 @@ void ivas_fb_mixer_update_prior_input( const int16_t length /* i : length of time slot */ #ifdef HODIRAC , - const int16_t nchan_fb_in + const int16_t nchan_fb_in /* i : number of analysis channels */ #endif ); @@ -5274,7 +5272,7 @@ void ivas_fb_mixer_get_windowed_fr( const int16_t mdft_len /* i : MDFT frame length */ #ifdef HODIRAC , - int16_t nchan_fb_in + const int16_t nchan_fb_in /* i : number of analysis channels */ #endif ); diff --git a/lib_com/ivas_qmetadata_com.c b/lib_com/ivas_qmetadata_com.c index 8d3f4c73fb..73d00f58d7 100644 --- a/lib_com/ivas_qmetadata_com.c +++ b/lib_com/ivas_qmetadata_com.c @@ -263,7 +263,7 @@ void ivas_qmetadata_close( * scalar quantization using partition *------------------------------------------------------------------------*/ -/* r: codeword index */ +/*! r: codeword index */ int16_t masa_sq( const float in, /* i : input value */ const float *threshold, /* i : partition */ @@ -510,14 +510,12 @@ void masa_compensate_two_dir_energy_ratio_index( int16_t *ratio_index_mod2 /* o : Output modified ratio for direction 2 */ #ifdef HODIRAC , - const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ #endif ) { float ratio1, ratio2; -#ifndef HODIRAC float ratioSum; -#endif ratio1 = 1.0f - diffuseness_reconstructions[ratio_index_1]; ratio2 = 1.0f - diffuseness_reconstructions[ratio_index_2]; @@ -526,10 +524,6 @@ void masa_compensate_two_dir_energy_ratio_index( if ( !hodirac_flag ) #endif { -#ifdef HODIRAC - float ratioSum; -#endif - ratioSum = ratio1 + ratio2; if ( ratio1 >= ratio2 ) { @@ -668,7 +662,7 @@ int16_t ivas_get_df_ratio_bits_hodirac( /*! r: bits to be used for quantizing ratio of ratios */ int16_t ivas_get_df_ratio_bits( - int16_t index_diff /* i : index of quantized diffuse-to-total ratio */ + const int16_t index_diff /* i : index of quantized diffuse-to-total ratio */ ) { int16_t dfRatio_bits; diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 7027c6292c..feb67c4978 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -281,19 +281,51 @@ ivas_error ivas_dirac_dec_config( { if ( st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k && hDirAC->azimuth2 == NULL ) { - hDirAC->azimuth2 = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ); - hDirAC->elevation2 = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ); - hDirAC->energy_ratio2 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ); - hDirAC->spreadCoherence2 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ); + // TODO: the following block is repeated in several places -> introduce new function? + if ( ( hDirAC->azimuth2 = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + if ( ( hDirAC->elevation2 = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + if ( ( hDirAC->energy_ratio2 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + if ( ( hDirAC->spreadCoherence2 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) { - hDirAC->azimuth2[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ); + if ( ( hDirAC->azimuth2[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } set_s( hDirAC->azimuth2[i], 0, hDirAC->num_freq_bands ); - hDirAC->elevation2[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ); + + if ( ( hDirAC->elevation2[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } set_s( hDirAC->elevation2[i], 0, hDirAC->num_freq_bands ); - hDirAC->energy_ratio2[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ); + + if ( ( hDirAC->energy_ratio2[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } set_f( hDirAC->energy_ratio2[i], 0.0f, hDirAC->num_freq_bands ); - hDirAC->spreadCoherence2[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ); + + if ( ( hDirAC->spreadCoherence2[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } set_f( hDirAC->spreadCoherence2[i], 0.0f, hDirAC->num_freq_bands ); } } @@ -1802,16 +1834,16 @@ static void ivas_dirac_free_mem( *------------------------------------------------------------------------*/ void ivas_dirac_dec_read_BS( - const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - Decoder_State *st, /* i/o: decoder state structure */ - DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ - IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata */ - int16_t *nb_bits, /* o : number of bits read */ - const SBA_MODE sba_mode, /* i : SBA mode */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + Decoder_State *st, /* i/o: decoder state structure */ + DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata */ + int16_t *nb_bits, /* o : number of bits read */ + const SBA_MODE sba_mode, /* i : SBA mode */ #ifdef HODIRAC - const int16_t hodirac_flag, /* i : HO-Dirac flag */ + const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ #endif - int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ + int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ) { int16_t i, j, b, dir, orig_dirac_bands; @@ -2004,7 +2036,7 @@ void ivas_qmetadata_to_dirac( const int32_t ivas_total_brate, /* i : IVAS total bitrate */ const SBA_MODE sba_mode, /* i : SBA mode */ #ifdef HODIRAC - const int16_t hodirac_flag, /* i : HO-DirAC flag*/ + const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ #endif int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ) @@ -2222,6 +2254,7 @@ void ivas_qmetadata_to_dirac( { no_secs = DIRAC_HO_NUMSECTORS; } + for ( idx_sec = 0; idx_sec < no_secs; idx_sec++ ) #endif { @@ -2267,7 +2300,6 @@ void ivas_qmetadata_to_dirac( } #endif - #ifdef HODIRAC if ( hMasa == NULL && hodirac_flag ) { @@ -2490,6 +2522,9 @@ void ivas_dirac_dec( int16_t subframe_idx; int16_t sf1, sf2; int16_t slot_idx, index_slot; +#ifdef HODIRAC + int16_t hodirac_flag; +#endif float *p_Rmat; /*CLDFB: last output channels reserved to LFT for CICPx*/ @@ -2516,6 +2551,10 @@ void ivas_dirac_dec( onset_filter = DirAC_mem.onset_filter; onset_filter_subframe = DirAC_mem.onset_filter + hDirAC->num_freq_bands; +#ifdef HODIRAC + hodirac_flag = ivas_get_hodirac_flag( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order > 1 ); +#endif + if ( st_ivas->hQMetaData != NULL && st_ivas->sba_mode != SBA_MODE_SPAR ) { coherence_flag = st_ivas->hQMetaData->coherence_flag; @@ -2648,7 +2687,7 @@ void ivas_dirac_dec( p_Rmat #ifdef HODIRAC , - st_ivas->sba_analysis_order > 1 && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k + hodirac_flag #endif ); } @@ -2662,7 +2701,7 @@ void ivas_dirac_dec( 0 #ifdef HODIRAC , - st_ivas->sba_analysis_order > 1 && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k + hodirac_flag #endif ); } @@ -2980,8 +3019,7 @@ void ivas_dirac_dec( index_slot #endif #ifdef HODIRAC - st_ivas->sba_analysis_order > 1 && - st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k + hodirac_flag #endif ); @@ -2999,8 +3037,7 @@ void ivas_dirac_dec( index_slot #endif #ifdef HODIRAC - st_ivas->sba_analysis_order > 1 && - st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k + hodirac_flag #endif ); } @@ -3030,7 +3067,7 @@ void ivas_dirac_dec( p_onset_filter #ifdef HODIRAC , - st_ivas->sba_analysis_order > 1 && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k + hodirac_flag #endif ); } diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c index afce73d386..cf81b936a6 100755 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -87,13 +87,13 @@ static void normalizePanningGains( float *direct_response, const int16_t num_cha *------------------------------------------------------------------------*/ ivas_error ivas_dirac_dec_output_synthesis_open( - DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ - RENDERER_TYPE renderer_type, /* i : renderer type */ - const int16_t nchan_transport, /* i : number of transport channels*/ - const int32_t output_Fs /* i : output sampling rate */ + DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ + RENDERER_TYPE renderer_type, /* i : renderer type */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int32_t output_Fs /* i : output sampling rate */ #ifdef HODIRAC , - const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode*/ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ #endif ) { @@ -377,7 +377,7 @@ void ivas_dirac_dec_output_synthesis_init( const int16_t nchan_out_woLFE /* i : number of output audio channels without LFE */ #ifdef HODIRAC , - const int16_t hodirac_flag /* flag to indicate HO-DirAC mode */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ #endif ) { @@ -414,6 +414,7 @@ void ivas_dirac_dec_output_synthesis_init( #else set_zero( h_dirac_output_synthesis_state->cy_cross_dir_smooth_prev, hDirAC->num_freq_bands * hDirAC->num_outputs_dir ); #endif + if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { set_zero( h_dirac_output_synthesis_state->cy_auto_diff_smooth_prev, h_dirac_output_synthesis_params->max_band_decorr * hDirAC->num_outputs_diff ); @@ -563,17 +564,17 @@ void ivas_dirac_dec_output_synthesis_close( *------------------------------------------------------------------------*/ void ivas_dirac_dec_output_synthesis_process_slot( - const float *reference_power, /* i : Estimated power */ - const float *onset, /* i : onset filter */ - DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ - const float *p_Rmat, /* i : rotation matrix */ - const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ - const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ - const int16_t nchan_transport, /* i : number of transport channels*/ + const float *reference_power, /* i : Estimated power */ + const float *onset, /* i : onset filter */ + DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ + const float *p_Rmat, /* i : rotation matrix */ + const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ + const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ + const int16_t nchan_transport, /* i : number of transport channels */ #ifndef HODIRAC const int16_t index_slot #else - const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode*/ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ #endif ) { @@ -791,7 +792,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( const float *onset_filter #ifdef HODIRAC , - const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode*/ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ #endif ) { @@ -812,7 +813,6 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( DIRAC_OUTPUT_SYNTHESIS_STATE h_dirac_output_synthesis_state; int16_t nchan_transport_foa; int16_t ch_idx_diff; - #ifdef HODIRAC float aux_buf[CLDFB_NO_CHANNELS_MAX]; float ratio[DIRAC_HO_NUMSECTORS * CLDFB_NO_CHANNELS_MAX]; @@ -941,7 +941,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( p_cy_cross_dir_smooth = h_dirac_output_synthesis_state.cy_cross_dir_smooth; p_gains_dir = h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev; - /*Direct gains*/ + /* Direct gains */ #ifdef HODIRAC if ( hodirac_flag ) { @@ -1780,7 +1780,7 @@ void ivas_dirac_dec_compute_directional_responses( const float *p_Rmat /* i : rotation matrix */ #ifdef HODIRAC , - const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode*/ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ #endif ) { diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 2dde4a2bdc..b87bb6e2ea 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -216,6 +216,7 @@ ivas_error ivas_masa_decode( #ifdef HR_METADATA } #endif + /* Get direction decoding quality. EC 1 and 2 are handled by the default value. */ if ( hQMetaData->ec_flag == 2 ) { diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index 2bd8b855fd..6443b54900 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -310,7 +310,7 @@ int16_t ivas_qmetadata_dec_decode( diffRatio = diffuseness_reconstructions[hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0]]; dfRatio_qsteps = 1 << dfRatio_bits[dir2band]; #ifdef HODIRAC - /* already encoded as total and ratios in HODIRAC*/ + /* already encoded as total and ratios in HO-DirAC */ if ( hodirac_flag ) { dfRatio = usdequant( hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0], 0.0f, 1.f / ( dfRatio_qsteps - 1 ) ); diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 7660d90d6b..c6d53827d4 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -124,7 +124,6 @@ ivas_error ivas_sba_dec_reconfigure( last_ivas_total_brate = st_ivas->last_active_ivas_total_brate; #endif - /*-----------------------------------------------------------------* * Set SBA high-level parameters * Save old SBA high-level parameters @@ -157,7 +156,7 @@ ivas_error ivas_sba_dec_reconfigure( if ( nchan_transport_old != ivas_get_sba_num_TCs( ivas_total_brate, sba_order_internal ) #ifdef HODIRAC - || ( last_ivas_total_brate >= IVAS_512k && ivas_total_brate < IVAS_512k ) || ( last_ivas_total_brate < IVAS_512k && ivas_total_brate >= IVAS_512k ) + || ( last_ivas_total_brate >= IVAS_512k && ivas_total_brate < IVAS_512k ) || ( last_ivas_total_brate < IVAS_512k && ivas_total_brate >= IVAS_512k ) // TODO: please verify ( 384 kbps not included?) #endif ) { @@ -265,6 +264,7 @@ ivas_error ivas_sba_dec_reconfigure( return error; } } + if ( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, &st_ivas->nchan_transport, @@ -284,12 +284,14 @@ ivas_error ivas_sba_dec_reconfigure( { return error; } + if ( st_ivas->renderer_type == RENDERER_DISABLE ) { ivas_dirac_dec_close( &( st_ivas->hDirAC ) ); vbap_free_data( &( st_ivas->hVBAPdata ) ); } + if ( st_ivas->hDirAC != NULL ) { mvs2s( st_ivas->hDirAC->dirac_to_spar_md_bands, st_ivas->hSpar->dirac_to_spar_md_bands, DIRAC_MAX_NBANDS ); diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index 7fa98b1e04..dd6e2ee3fc 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -565,7 +565,7 @@ void computeReferencePower_enc( const SBA_MODE sba_mode /* i : SBA mode */ #ifdef HODIRAC , - int16_t nchan_ana /* i : no of analysis channels */ + const int16_t nchan_ana /* i : number of analysis channels */ #endif ) { @@ -586,6 +586,7 @@ void computeReferencePower_enc( reference_power_W[i] += ( Cldfb_RealBuffer[0][j] * Cldfb_RealBuffer[0][j] ) + ( Cldfb_ImagBuffer[0][j] * Cldfb_ImagBuffer[0][j] ); } reference_power[i] += reference_power_W[i]; + #ifdef HODIRAC for ( ch_idx = 1; ch_idx < nchan_ana; ch_idx++ ) #else diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index 9d8f7fbe02..50b0d8614f 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -1708,7 +1708,7 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( #ifdef HODIRAC if ( hodirac_flag ) { - /* already encoded as total and ratios in HODIRAC*/ + /* already encoded as total and ratios in HO-DirAC */ diffRatio = 1.f - hQMetaData->q_direction[0].band_data[j].energy_ratio[0]; dfRatio = hQMetaData->q_direction[1].band_data[dir2band].energy_ratio[0]; } @@ -1757,7 +1757,6 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( dirRatio2Q = ( 1.0f - diffRatioQ ) - dirRatio1Q; } - index_dirRatio1Inv = masa_sq( 1.0f - dirRatio1Q, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); /* Note: To save memory, we store temporarily index_diff and dfRatio_index into first and second direction diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index 35d22fe461..0e78243153 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -223,7 +223,7 @@ ivas_error ivas_sba_enc_reconfigure( } if ( nchan_transport_old != st_ivas->nchan_transport #ifdef HODIRAC - || ( ivas_total_brate < IVAS_512k && hEncoderConfig->last_ivas_total_brate >= IVAS_512k ) || ( ivas_total_brate >= IVAS_512k && hEncoderConfig->last_ivas_total_brate < IVAS_512k ) + || ( ivas_total_brate < IVAS_512k && hEncoderConfig->last_ivas_total_brate >= IVAS_512k ) || ( ivas_total_brate >= IVAS_512k && hEncoderConfig->last_ivas_total_brate < IVAS_512k ) // TODO: please verify ( 384 kbps not included?) #endif ) { diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index a415457a49..bfa0a0bb37 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -116,6 +116,7 @@ ivas_error ivas_spar_enc_open( assert( 0 && "sba_order must be 1,2, or 3!" ); } #endif + nchan_transport = ivas_get_sba_num_TCs( hEncoderConfig->ivas_total_brate, sba_order_internal ); // bw = ivas_get_bw_idx_from_sample_rate(pCfg->input_Fs); @@ -484,9 +485,7 @@ static ivas_error ivas_spar_enc_process( #ifdef HODIRAC nchan_fb_in = hSpar->hFbMixer->fb_cfg->nchan_fb_in; nchan_transport = st_ivas->nchan_transport; -#endif -#ifdef HODIRAC for ( i = FOA_CHANNELS + 1; i < nchan_fb_in; i++ ) #else for ( i = FOA_CHANNELS + 1; i < nchan_inp; i++ ) @@ -495,7 +494,6 @@ static ivas_error ivas_spar_enc_process( mvr2r( data_f[HOA_keep_ind[i]], data_f[i], input_frame ); } - /*-----------------------------------------------------------------------------------------* * Transient detector *-----------------------------------------------------------------------------------------*/ @@ -568,6 +566,7 @@ static ivas_error ivas_spar_enc_process( nchan_fb_in #endif ); + ivas_fb_mixer_update_prior_input( hSpar->hFbMixer, p_pcm_tmp, l_ts #ifdef HODIRAC , @@ -631,11 +630,9 @@ static ivas_error ivas_spar_enc_process( } else { - hQMetaData->q_direction[0].cfg.nbands = DIRAC_DTX_BANDS; /* compute directions */ - #ifdef HODIRAC for ( i = 0; i < hQMetaData->q_direction[0].cfg.nblocks; i++ ) #else -- GitLab From 7315eb1b287dfa9221a5fe653e4967ef2373bb67 Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 11 May 2023 11:16:29 +0200 Subject: [PATCH 109/331] fix in function call (issue introduced in previous commit) --- lib_dec/ivas_dirac_dec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index feb67c4978..c0afd2cb40 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -2552,7 +2552,7 @@ void ivas_dirac_dec( onset_filter_subframe = DirAC_mem.onset_filter + hDirAC->num_freq_bands; #ifdef HODIRAC - hodirac_flag = ivas_get_hodirac_flag( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order > 1 ); + hodirac_flag = ivas_get_hodirac_flag( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ); #endif if ( st_ivas->hQMetaData != NULL && st_ivas->sba_mode != SBA_MODE_SPAR ) -- GitLab From a73a9d7a041fbc1f611d2edc9144c2b054f160ef Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 11 May 2023 11:24:32 +0200 Subject: [PATCH 110/331] clang-format --- lib_com/ivas_dirac_com.c | 2 +- lib_com/ivas_qmetadata_com.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index fa64a78948..d946bbfa0b 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -894,7 +894,7 @@ void deindex_spherical_component( /*---------------------------------------------------------------- * calculate_hodirac_sector_parameters() * - * + * *-----------------------------------------------------------------*/ void calculate_hodirac_sector_parameters( diff --git a/lib_com/ivas_qmetadata_com.c b/lib_com/ivas_qmetadata_com.c index 73d00f58d7..3807236044 100644 --- a/lib_com/ivas_qmetadata_com.c +++ b/lib_com/ivas_qmetadata_com.c @@ -625,7 +625,7 @@ void ivas_qmetadata_direction_vector_to_azimuth_elevation( /*------------------------------------------------------------------------- * ivas_get_df_ratio_bits_hodirac() * - * + * *------------------------------------------------------------------------*/ /*! r: bits to be used for quantizing ratio of ratios */ -- GitLab From d448c837767712c3ac318f87055292ea118ebe5b Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 11 May 2023 11:25:47 +0200 Subject: [PATCH 111/331] remove obsolete switches coming from an incorrect merge --- lib_com/options.h | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 5b53720295..f2b5eeeaab 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -137,10 +137,7 @@ #define DISABLE_ADAP_RES_COD_TMP /* temporary fix for IVAS-403, disables adaptive residual coding */ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ -#define FIX_103_RA_PARAMS_PARAM_BIN_REND /* Issue 103: Digest room acoustics parameters for Parametric Binaural Renderer*/ -/*#define SBA_HPF_TUNING_DEC*/ -#define SMOOTH_WITH_TRANS_DET -#define FIX_331_ALL_BRS /*Enable the fix_331 across all the bitrates and sba modes*/ +#define FIX_331_ALL_BRS /* Enable the fix_331 across all the bitrates and sba modes*/ #define FIX_ISM_DTX_CNG_BWIDTH_ALT /* VA: issue 396 - alternative fix for bw changes on CNG frames in ISM DTX for objects that use the decoder-side noise estimation */ #define FIX_398_MASA_DIRECTION_ALIGNMENT /* Nokia: Issue 398: in 2dir MASA, dynamically adjust directions to be consistent */ -- GitLab From 823cb4db557e9c440f92add8b66ae6297674226d Mon Sep 17 00:00:00 2001 From: Eleni Fotopoulou Date: Thu, 11 May 2023 12:58:58 +0200 Subject: [PATCH 112/331] Improvement for DFT Stereo for cases with large ITDs under HYBRID_ITD_MAX --- lib_com/ivas_prot.h | 4 +++ lib_com/options.h | 2 ++ lib_enc/ivas_cpe_enc.c | 7 ++++- lib_enc/ivas_stat_enc.h | 4 +++ lib_enc/ivas_stereo_classifier.c | 8 +++++- lib_enc/ivas_stereo_dft_enc.c | 12 ++++++++- lib_enc/ivas_stereo_dft_enc_itd.c | 44 ++++++++++++++++++++++++++++--- lib_enc/ivas_stereo_dft_td_itd.c | 9 ++++++- 8 files changed, 82 insertions(+), 8 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 0355c00470..cf81a9ffb6 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -1401,6 +1401,10 @@ int16_t read_BS_adapt_GR_sg( void stereo_dft_hybrid_ITD_flag( STEREO_DFT_CONFIG_DATA_HANDLE hConfig, /* o : DFT stereo configuration */ const int32_t input_Fs /* i : CPE element sampling rate */ +#ifdef HYBRID_ITD_MAX + , + const int16_t hybrid_itd_max /* i : flag for hybrid ITD for very large ITDs */ +#endif ); void stereo_dft_enc_compute_itd( diff --git a/lib_com/options.h b/lib_com/options.h index 396d080b98..01c40764d2 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -211,6 +211,8 @@ //#define HODIRAC_READ_PARAMS #endif +#define HYBRID_ITD_MAX /* FhG: Improvement for DFT-stereo for cases with large ITDs */ + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index b60f8be45b..522cfb885d 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -333,7 +333,12 @@ ivas_error ivas_cpe_enc( if ( hCPE->element_mode == IVAS_CPE_DFT ) { - stereo_dft_hybrid_ITD_flag( hCPE->hStereoDft->hConfig, input_Fs ); + stereo_dft_hybrid_ITD_flag( hCPE->hStereoDft->hConfig, input_Fs +#ifdef HYBRID_ITD_MAX + , + hCPE->hStereoDft->hItd->hybrid_itd_max +#endif + ); /* Time Domain ITD compensation using extrapolation */ #ifdef DEBUG_MODE_DFT diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 5eced57880..be414ae6b8 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -81,6 +81,10 @@ typedef struct stereo_itd_data_struct int16_t prev_itd1; int16_t prev_itd2; +#ifdef HYBRID_ITD_MAX + /*flag for hybrid ITD for very large ITDs*/ + int16_t hybrid_itd_max; +#endif } ITD_DATA, *ITD_DATA_HANDLE; typedef struct dft_ana_struct diff --git a/lib_enc/ivas_stereo_classifier.c b/lib_enc/ivas_stereo_classifier.c index d4d0b310b6..5e7d3a1623 100644 --- a/lib_enc/ivas_stereo_classifier.c +++ b/lib_enc/ivas_stereo_classifier.c @@ -998,7 +998,13 @@ void xtalk_classifier_dft( printf( "\nSwitch DFT-stereo -> TD-LR on frame %d\n", frame ); #endif } - else if ( hCPE->element_brate >= IVAS_16k4 && hStereoClassif->xtalk_decision == 0 && abs( itd ) > STEREO_DFT_ITD_MAX && ( hCPE->hCoreCoder[0]->lp_speech - hCPE->hCoreCoder[0]->lp_noise ) > 25.0f ) + else if ( +#ifdef HYBRID_ITD_MAX + hCPE->element_brate > IVAS_16k4 +#else + hCPE->element_brate >= IVAS_16k4 +#endif + && hStereoClassif->xtalk_decision == 0 && abs( itd ) > STEREO_DFT_ITD_MAX && ( hCPE->hCoreCoder[0]->lp_speech - hCPE->hCoreCoder[0]->lp_noise ) > 25.0f ) { hStereoClassif->xtalk_decision = 1; } diff --git a/lib_enc/ivas_stereo_dft_enc.c b/lib_enc/ivas_stereo_dft_enc.c index 43546261a4..dbc0662255 100644 --- a/lib_enc/ivas_stereo_dft_enc.c +++ b/lib_enc/ivas_stereo_dft_enc.c @@ -294,9 +294,16 @@ ivas_error stereo_dft_enc_create( hStereoDft_loc->hConfig->force_mono_transmission = 0; stereo_dft_config( hStereoDft_loc->hConfig, IVAS_24k4, &tmpS, &tmpS ); - stereo_dft_hybrid_ITD_flag( hStereoDft_loc->hConfig, input_Fs ); + stereo_dft_enc_open( hStereoDft_loc, input_Fs, max_bwidth ); + stereo_dft_hybrid_ITD_flag( hStereoDft_loc->hConfig, input_Fs +#ifdef HYBRID_ITD_MAX + , + hStereoDft_loc->hItd->hybrid_itd_max +#endif + ); + *hStereoDft = hStereoDft_loc; return IVAS_ERR_OK; @@ -560,6 +567,9 @@ void stereo_enc_itd_init( hItd->prev_itd1 = 0; hItd->prev_itd2 = 0; +#ifdef HYBRID_ITD_MAX + hItd->hybrid_itd_max = 0; +#endif return; } diff --git a/lib_enc/ivas_stereo_dft_enc_itd.c b/lib_enc/ivas_stereo_dft_enc_itd.c index d2c0bc7fe1..025729e0cd 100644 --- a/lib_enc/ivas_stereo_dft_enc_itd.c +++ b/lib_enc/ivas_stereo_dft_enc_itd.c @@ -115,11 +115,19 @@ static void set_band_limits( void stereo_dft_hybrid_ITD_flag( STEREO_DFT_CONFIG_DATA_HANDLE hConfig, /* o : DFT stereo configuration */ const int32_t input_Fs /* i : CPE element sampling rate */ +#ifdef HYBRID_ITD_MAX + , + const int16_t hybrid_itd_max /* i : flag for hybrid ITD for very large ITDs */ +#endif ) { if ( hConfig != NULL ) { - if ( hConfig->res_cod_mode || ( hConfig->ada_wb_res_cod_mode && input_Fs == 16000 ) ) + if ( hConfig->res_cod_mode || ( hConfig->ada_wb_res_cod_mode && input_Fs == 16000 ) +#ifdef HYBRID_ITD_MAX + || ( hybrid_itd_max == 1 ) +#endif + ) { hConfig->hybrid_itd_flag = 1; } @@ -642,6 +650,11 @@ void stereo_dft_enc_compute_itd( float cng_xcorr_filt; +#ifdef HYBRID_ITD_MAX + int16_t prev_itd_max; + int16_t itd_max_flip; +#endif + if ( hCPE->element_mode == IVAS_CPE_DFT ) { hStereoDft = hCPE->hStereoDft; @@ -1328,7 +1341,12 @@ void stereo_dft_enc_compute_itd( hItd->prev_sum_nrg_L_lb = sum_nrg_L_lb; mvr2r( xcorr_lb, hItd->prev_xcorr_lb, STEREO_DFT_XCORR_LB_MAX ); } - +#ifdef HYBRID_ITD_MAX + /*save previous flag*/ + prev_itd_max = hItd->hybrid_itd_max; + /* enable hybrid ITD handling for very large ITDs*/ + hItd->hybrid_itd_max = ( abs( itd ) > STEREO_DFT_ITD_MAX && abs( itd ) < STEREO_DFT_ITD_MAX_ANA && !hCPE->hCoreCoder[0]->sp_aud_decision0 && hCPE->element_brate < IVAS_32k ); +#endif /* Update memory */ hItd->prev_itd = itd; @@ -1343,7 +1361,7 @@ void stereo_dft_enc_compute_itd( #ifdef DEBUG_STEREO_CLF dbgwrite( &hItd->itd[k_offset], sizeof( float ), 1, 1, "res/ITD.x" ); #endif - + /* limit ITD range for MDCT stereo even more */ if ( hCPE->element_mode == IVAS_CPE_MDCT && fabsf( hItd->itd[k_offset] ) > ITD_MAX_MDCT ) { itd = 0; @@ -1353,7 +1371,25 @@ void stereo_dft_enc_compute_itd( hItd->deltaItd[k_offset] = hItd->itd[k_offset] - hItd->td_itd[k_offset]; - /* limit ITD range for MDCT stereo even more */ +#ifdef HYBRID_ITD_MAX + if ( hItd->hybrid_itd_max ) + { + /*check if there is an ITD flip*/ + itd_max_flip = ( hItd->itd[k_offset] * hItd->itd[k_offset - 1] < 0 ); + + if ( hItd->deltaItd[k_offset - 1] != 0 && itd_max_flip == 0 ) + { + int16_t tmp_itd = (int16_t) floor( ( ( hItd->prev_itd ) * ( (float) input_frame / 640 ) ) + 0.5f ); + hItd->deltaItd[k_offset] = -1.0f * tmp_itd - hItd->td_itd[k_offset]; + } + } + /*signal change for next frame*/ + if ( prev_itd_max == 1 && hItd->hybrid_itd_max == 0 ) + { + hItd->hybrid_itd_max = -1; + } +#endif + #ifdef DEBUG_MODE_DFT { int16_t tmp; diff --git a/lib_enc/ivas_stereo_dft_td_itd.c b/lib_enc/ivas_stereo_dft_td_itd.c index b7fb95422f..27a71dfae4 100644 --- a/lib_enc/ivas_stereo_dft_td_itd.c +++ b/lib_enc/ivas_stereo_dft_td_itd.c @@ -271,11 +271,18 @@ void stereo_td_itd( hITD->td_itd_32k[i] = hITD->td_itd_32k[i + 1]; } } +#ifdef HYBRID_ITD_MAX + /*reset TD ITDs in case of hybrid itd_max change - turn hybrid ITD off*/ + if ( hITD->hybrid_itd_max == -1 && hybrid_itd_flag == 0 ) + { + hITD->td_itd[k_offset] = 0; + hITD->td_itd_32k[k_offset] = 0; + } +#endif if ( hybrid_itd_flag == 0 ) { return; } - stereo_td_get_td_itd( &( hITD->td_itd[k_offset] ), &( hITD->td_itd_32k[k_offset] ), hITD->itd[k_offset], sts[0]->input_Fs ); /* initializations*/ -- GitLab From bb31abd9fe634a4c813edd454074da87aded4880 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Thu, 11 May 2023 13:52:19 +0200 Subject: [PATCH 113/331] delete resolved comments --- lib_dec/ivas_dirac_dec.c | 1 - lib_dec/ivas_dirac_output_synthesis_dec.c | 1 - lib_dec/ivas_sba_dec.c | 2 +- lib_enc/ivas_sba_enc.c | 2 +- 4 files changed, 2 insertions(+), 4 deletions(-) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index c0afd2cb40..1518a2fe98 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -355,7 +355,6 @@ ivas_error ivas_dirac_dec_config( /* band config needed only for SPAR with FOA output */ if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_FOA && st_ivas->sba_mode == SBA_MODE_SPAR #ifdef HODIRAC - /*DLB : why is this needed ?*/ && ivas_total_brate < IVAS_256k #endif ) diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c index cf81b936a6..f02408b144 100755 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -992,7 +992,6 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( #ifdef HODIRAC if ( hodirac_flag ) { - // wkr: additional gains for second sector, hard coded to two sectors p_cy_cross_dir_smooth = h_dirac_output_synthesis_state.cy_cross_dir_smooth + num_freq_bands * num_channels_dir; p_gains_dir = h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev + num_freq_bands * num_channels_dir; diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index c6d53827d4..378e5dfaa3 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -156,7 +156,7 @@ ivas_error ivas_sba_dec_reconfigure( if ( nchan_transport_old != ivas_get_sba_num_TCs( ivas_total_brate, sba_order_internal ) #ifdef HODIRAC - || ( last_ivas_total_brate >= IVAS_512k && ivas_total_brate < IVAS_512k ) || ( last_ivas_total_brate < IVAS_512k && ivas_total_brate >= IVAS_512k ) // TODO: please verify ( 384 kbps not included?) + || ( last_ivas_total_brate >= IVAS_512k && ivas_total_brate < IVAS_512k ) || ( last_ivas_total_brate < IVAS_512k && ivas_total_brate >= IVAS_512k ) #endif ) { diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index 0e78243153..35d22fe461 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -223,7 +223,7 @@ ivas_error ivas_sba_enc_reconfigure( } if ( nchan_transport_old != st_ivas->nchan_transport #ifdef HODIRAC - || ( ivas_total_brate < IVAS_512k && hEncoderConfig->last_ivas_total_brate >= IVAS_512k ) || ( ivas_total_brate >= IVAS_512k && hEncoderConfig->last_ivas_total_brate < IVAS_512k ) // TODO: please verify ( 384 kbps not included?) + || ( ivas_total_brate < IVAS_512k && hEncoderConfig->last_ivas_total_brate >= IVAS_512k ) || ( ivas_total_brate >= IVAS_512k && hEncoderConfig->last_ivas_total_brate < IVAS_512k ) #endif ) { -- GitLab From 480a38cf6b7ffd462fe8e1c5f2c73994aeb07e8d Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Thu, 11 May 2023 14:13:08 +0200 Subject: [PATCH 114/331] fix EXT out for variable speed mode --- lib_dec/lib_dec.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 03de9374dc..64a27298fa 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -648,12 +648,6 @@ ivas_error IVAS_DEC_EnableVoIP( #ifdef VARIABLE_SPEED_DECODING if ( hIvasDec->hVoIP->mode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED ) { - if ( pcmdsp_fifo_create( &hIvasDec->hVoIP->hFifoOut ) != 0 || - pcmdsp_fifo_init( hIvasDec->hVoIP->hFifoOut, (uint16_t) ( hDecoderConfig->output_Fs * 4 / FRAMES_PER_SEC ) /* 4 frames */, hDecoderConfig->nchan_out, sizeof( int16_t ) ) != 0 ) - { - return IVAS_ERR_INIT_ERROR; - } - /* we instantly need a new frame */ hIvasDec->hVoIP->needNewFrame = true; } #endif @@ -3172,6 +3166,16 @@ ivas_error IVAS_DEC_VoIP_reconfigure( IVAS_DEC_HANDLE hIvasDec, const uint16_t n return IVAS_ERR_INIT_ERROR; } } +#ifdef VARIABLE_SPEED_DECODING + else if ( hIvasDec->hVoIP->mode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED ) + { + if ( pcmdsp_fifo_create( &hIvasDec->hVoIP->hFifoOut ) != 0 || + pcmdsp_fifo_init( hIvasDec->hVoIP->hFifoOut, (uint16_t) ( hDecoderConfig->output_Fs * 4 / FRAMES_PER_SEC ) /* 4 frames */, hDecoderConfig->nchan_out, sizeof( int16_t ) ) != 0 ) + { + return IVAS_ERR_INIT_ERROR; + } + } +#endif if ( hIvasDec->mode == IVAS_DEC_MODE_EVS ) { if ( apa_set_evs_compat_mode( hIvasDec->hVoIP->hTimeScaler, true ) != 0 ) -- GitLab From 0cdbc77084913495fae11311cce5fcfa1cc56922 Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Thu, 11 May 2023 14:22:27 +0200 Subject: [PATCH 115/331] Orientation tracking parameter aspects --- apps/decoder.c | 9 +++++++- apps/renderer.c | 24 +++++++++++++++++++ lib_com/ivas_cnst.h | 12 +++++++++- lib_com/options.h | 1 + lib_dec/ivas_init_dec.c | 7 ++++++ lib_dec/ivas_stat_dec.h | 4 ++++ lib_dec/lib_dec.c | 42 +++++++++++++++++++++++++++++++++- lib_dec/lib_dec.h | 10 +++++++- lib_rend/ivas_orient_trk.c | 47 ++++++++++++++++++++++++++++++++++++++ lib_rend/ivas_prot_rend.h | 4 ++++ lib_rend/ivas_stat_rend.h | 4 ++++ lib_rend/lib_rend.c | 8 +++++++ 12 files changed, 168 insertions(+), 4 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 22dc235fff..a24c177c84 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -189,8 +189,11 @@ int main( /*------------------------------------------------------------------------------------------* * Open decoder handle *------------------------------------------------------------------------------------------*/ - +#ifdef FIX_439_OTR_PARAMS + if ( ( error = IVAS_DEC_Open( &hIvasDec, arg.decMode, arg.no_diegetic_pan ) ) != IVAS_ERR_OK ) +#else if ( ( error = IVAS_DEC_Open( &hIvasDec, arg.decMode, arg.orientation_tracking, arg.no_diegetic_pan ) ) != IVAS_ERR_OK ) +#endif { fprintf( stderr, "Open failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; @@ -355,7 +358,11 @@ int main( * Configure the decoder *------------------------------------------------------------------------------------------*/ +#ifdef FIX_439_OTR_PARAMS + if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.orientation_tracking, arg.renderConfigEnabled ) ) != IVAS_ERR_OK ) +#else if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.renderConfigEnabled ) ) != IVAS_ERR_OK ) +#endif { fprintf( stderr, "\nConfigure failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; diff --git a/apps/renderer.c b/apps/renderer.c index 9045bbeaa0..1477e2279e 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -1374,23 +1374,43 @@ static bool parseOrientationTracking( if ( strcmp( value, "NONE" ) == 0 ) { +#ifdef FIX_439_OTR_PARAMS + *tracking_type = HEAD_ORIENT_TRK_NONE; +#else *tracking_type = IVAS_ORIENT_TRK_NONE; +#endif } else if ( strcmp( value, "REF" ) == 0 ) { +#ifdef FIX_439_OTR_PARAMS + *tracking_type = HEAD_ORIENT_TRK_REF; +#else *tracking_type = IVAS_ORIENT_TRK_REF; +#endif } else if ( strcmp( value, "AVG" ) == 0 ) { +#ifdef FIX_439_OTR_PARAMS + *tracking_type = HEAD_ORIENT_TRK_AVG; +#else *tracking_type = IVAS_ORIENT_TRK_AVG; +#endif } else if ( strcmp( value, "REF_VEC" ) == 0 ) { +#ifdef FIX_439_OTR_PARAMS + *tracking_type = HEAD_ORIENT_TRK_REF_VEC; +#else *tracking_type = IVAS_ORIENT_TRK_REF_VEC; +#endif } else if ( strcmp( value, "REF_VEC_LEV" ) == 0 ) { +#ifdef FIX_439_OTR_PARAMS + *tracking_type = HEAD_ORIENT_TRK_REF_VEC_LEV; +#else *tracking_type = IVAS_ORIENT_TRK_REF_VEC_LEV; +#endif } else { @@ -1614,7 +1634,11 @@ static CmdlnArgs defaultArgs( clearString( args.customHrtfFilePath ); clearString( args.renderConfigFilePath ); +#ifdef FIX_439_OTR_PARAMS + args.orientationTracking = HEAD_ORIENT_TRK_NONE; +#else args.orientationTracking = IVAS_ORIENT_TRK_NONE; +#endif args.noDiegeticPan = 0.0f; args.delayCompensationEnabled = true; diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 01b11b21e4..290f7318ad 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1544,6 +1544,16 @@ typedef enum *----------------------------------------------------------------------------------*/ /* Orientation tracking types */ +#ifdef FIX_439_OTR_PARAMS +typedef enum +{ + HEAD_ORIENT_TRK_NONE, + HEAD_ORIENT_TRK_REF, + HEAD_ORIENT_TRK_AVG, + HEAD_ORIENT_TRK_REF_VEC, + HEAD_ORIENT_TRK_REF_VEC_LEV +} HEAD_ORIENT_TRK_TYPE; +#else #define IVAS_ORIENT_TRK_NONE 0 #define IVAS_ORIENT_TRK_REF 1 #define IVAS_ORIENT_TRK_AVG 2 @@ -1559,7 +1569,7 @@ typedef enum OTR_TRACKING_REF_VEC = IVAS_ORIENT_TRK_REF_VEC, /* track orientation relative to external reference vector */ OTR_TRACKING_REF_VEC_LEV = IVAS_ORIENT_TRK_REF_VEC_LEV /* track orientation relative to level component of external reference vector */ } OTR_TRACKING_T; - +#endif /*----------------------------------------------------------------------------------* * Reverberator constants diff --git a/lib_com/options.h b/lib_com/options.h index b9dbd6e1f9..0ea2b6948a 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -188,6 +188,7 @@ #define FIX_446_STEREO_DMX_CRASH /* FhG: fix discrepancy with EVS code that could cause crashes in rare cases */ #define FIX_386_CORECODER_RECONFIG_2 /* VA: Issue 386: Resolve remaining ToDo comments in CoreCoder reconfig. */ +#define FIX_439_OTR_PARAMS /* Philips: Issue 439: orientation tracking parameter aspects. */ #define FIX_440_PARAM_ISM_DIR_NOISE /* FhG: Issue 440: Fix directional background noise becoming diffuse in ParamISM */ #define FIX_445_SNS_BUGFIXES /* FhG: bug fix for spectral tilt in SNS computation + necessary update of codebooks and converison to fixedpoint-compatible tables */ diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index b317d81cd1..1ca5ae512a 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -750,6 +750,12 @@ ivas_error ivas_init_decoder( if ( st_ivas->hDecoderConfig->Opt_Headrotation ) { +#ifdef FIX_439_OTR_PARAMS + if ( ( error = ivas_orient_trk_SetTrackingType( st_ivas->hHeadTrackData->OrientationTracker, st_ivas->hDecoderConfig->orientation_tracking ) ) != IVAS_ERR_OK ) + { + return error; + } +#else if ( st_ivas->hDecoderConfig->orientation_tracking == IVAS_ORIENT_TRK_NONE ) { if ( ( error = ivas_orient_trk_SetTrackingType( st_ivas->hHeadTrackData->OrientationTracker, OTR_TRACKING_NONE ) ) != IVAS_ERR_OK ) @@ -789,6 +795,7 @@ ivas_error ivas_init_decoder( { return IVAS_ERR_WRONG_MODE; } +#endif } /*-----------------------------------------------------------------* diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 4174b2772b..f059dfb88e 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -1151,7 +1151,11 @@ typedef struct decoder_config_structure int16_t Opt_HRTF_binary; /* indicates whether HRTF binary file is used */ int16_t Opt_Headrotation; /* indicates whether head-rotation is used */ int16_t Opt_RendConfigCustom; /* indicates whether Renderer configuration custom setup is used */ +#ifdef FIX_439_OTR_PARAMS + HEAD_ORIENT_TRK_TYPE orientation_tracking; /* indicates orientation tracking type */ +#else int16_t orientation_tracking; /* indicates orientation tracking type */ +#endif float no_diegetic_pan; int16_t Opt_AMR_WB; /* flag indicating AMR-WB IO mode */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index ee315bf399..6d9617517d 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -95,8 +95,11 @@ static void store_JbmData( IVAS_DEC_VOIP *hVoIP, JB4_DATAUNIT_HANDLE dataUnit, c #endif static ivas_error evs_dec_main( Decoder_Struct *st_ivas, const int16_t nOutSamples, int16_t *pcmBuf ); static ivas_error input_format_API_to_internal( IVAS_DEC_INPUT_FORMAT input_format, int16_t *bitstream_format_internal, int16_t *sdp_hf_only, const bool is_voip_enabled ); +#ifdef FIX_439_OTR_PARAMS +static void init_decoder_config( DECODER_CONFIG_HANDLE hDecoderConfig, const float no_diegetic_pan ); +#else static void init_decoder_config( DECODER_CONFIG_HANDLE hDecoderConfig, const int16_t orientation_tracking, const float no_diegetic_pan ); - +#endif /*---------------------------------------------------------------------* * IVAS_DEC_Open() @@ -108,7 +111,9 @@ static void init_decoder_config( DECODER_CONFIG_HANDLE hDecoderConfig, const int ivas_error IVAS_DEC_Open( IVAS_DEC_HANDLE *phIvasDec, /* i/o: pointer to an IVAS decoder handle to be opened */ const IVAS_DEC_MODE mode, /* i : compatibility mode (EVS or IVAS) */ +#ifndef FIX_439_OTR_PARAMS const int16_t orientation_tracking, /* i : orientation tracking type */ +#endif float no_diegetic_pan ) { IVAS_DEC_HANDLE hIvasDec; @@ -162,7 +167,11 @@ ivas_error IVAS_DEC_Open( st_ivas = hIvasDec->st_ivas; /* initialize Decoder Config. handle */ +#ifdef FIX_439_OTR_PARAMS + init_decoder_config( hIvasDec->st_ivas->hDecoderConfig, no_diegetic_pan ); +#else init_decoder_config( hIvasDec->st_ivas->hDecoderConfig, orientation_tracking, no_diegetic_pan ); +#endif /* initialize pointers to handles to NULL */ ivas_initialize_handles_dec( st_ivas ); @@ -214,7 +223,9 @@ ivas_error IVAS_DEC_Open( static void init_decoder_config( DECODER_CONFIG_HANDLE hDecoderConfig, /* i/o: configuration structure */ +#ifndef FIX_439_OTR_PARAMS const int16_t orientation_tracking, +#endif const float no_diegetic_pan ) { hDecoderConfig->Opt_AMR_WB = 0; @@ -224,7 +235,9 @@ static void init_decoder_config( hDecoderConfig->Opt_HRTF_binary = 0; hDecoderConfig->Opt_Headrotation = 0; hDecoderConfig->Opt_RendConfigCustom = 0; +#ifndef FIX_439_OTR_PARAMS hDecoderConfig->orientation_tracking = orientation_tracking; +#endif hDecoderConfig->no_diegetic_pan = no_diegetic_pan; return; @@ -388,6 +401,9 @@ ivas_error IVAS_DEC_Configure( const int16_t customLsOutputEnabled, /* i : enable custom loudspeaker setup handle */ const int16_t hrtfReaderEnabled, /* i : enable HRTF binary file input */ const int16_t enableHeadRotation, /* i : enable head rotation for binaural output */ +#ifdef FIX_439_OTR_PARAMS + HEAD_ORIENT_TRK_TYPE orientationTracking, /* i : head orientation tracking mode */ +#endif const int16_t renderConfigEnabled /* i : enable Renderer config. file for binaural output */ ) { @@ -436,6 +452,9 @@ ivas_error IVAS_DEC_Configure( hDecoderConfig->Opt_LsCustom = customLsOutputEnabled; hDecoderConfig->Opt_Headrotation = enableHeadRotation; +#ifdef FIX_439_OTR_PARAMS + hDecoderConfig->orientation_tracking = orientationTracking; +#endif hDecoderConfig->Opt_HRTF_binary = hrtfReaderEnabled; hDecoderConfig->Opt_RendConfigCustom = renderConfigEnabled; @@ -1985,6 +2004,26 @@ static ivas_error printConfigInfo_dec( fprintf( stdout, "Head rotation: ON\n" ); } +#ifdef FIX_439_OTR_PARAMS + if ( st_ivas->hDecoderConfig->orientation_tracking != HEAD_ORIENT_TRK_NONE ) + { + switch ( st_ivas->hDecoderConfig->orientation_tracking ) + { + case HEAD_ORIENT_TRK_AVG: + fprintf( stdout, "Orientation tracking: AVG\n" ); + break; + case HEAD_ORIENT_TRK_REF: + fprintf( stdout, "Orientation tracking: REF\n" ); + break; + case HEAD_ORIENT_TRK_REF_VEC: + fprintf( stdout, "Orientation tracking: REF_VEC\n" ); + break; + case HEAD_ORIENT_TRK_REF_VEC_LEV: + fprintf( stdout, "Orientation tracking: REF_VEC_LEV\n" ); + break; + } + } +#else if ( st_ivas->hDecoderConfig->orientation_tracking != IVAS_ORIENT_TRK_NONE ) { switch ( st_ivas->hDecoderConfig->orientation_tracking ) @@ -2003,6 +2042,7 @@ static ivas_error printConfigInfo_dec( break; } } +#endif } return IVAS_ERR_OK; diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index 17af564295..2258361f30 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -34,6 +34,9 @@ #define LIB_DEC_H #include "common_api_types.h" +#ifdef FIX_439_OTR_PARAMS +#include "ivas_cnst.h" +#endif #include @@ -118,7 +121,9 @@ typedef ivas_error ( *JbmTraceFileWriterFn )( const void *data, void *writer ); ivas_error IVAS_DEC_Open( IVAS_DEC_HANDLE *phIvasDec, /* i/o: pointer to an IVAS decoder handle to be opened */ IVAS_DEC_MODE mode, /* i : compatibility mode (EVS or IVAS) */ - const int16_t orientation_tracking, /* i : orientation tracking type */ +#ifndef FIX_439_OTR_PARAMS + const int16_t orientation_tracking, /* i : orientation tracking type */ +#endif float no_diegetic_pan ); @@ -130,6 +135,9 @@ ivas_error IVAS_DEC_Configure( const int16_t customLsOutputEnabled, /* i : enable custom loudspeaker setup handle */ const int16_t hrtfReaderEnabled, /* i : enable HRTF binary file input */ const int16_t enableHeadRotation, /* i : enable head rotation for binaural output */ +#ifdef FIX_439_OTR_PARAMS + HEAD_ORIENT_TRK_TYPE orientationTracking, /* i : head orientation tracking mode */ +#endif const int16_t renderConfigEnabled /* i : enable Renderer config. file for binaural output */ ); diff --git a/lib_rend/ivas_orient_trk.c b/lib_rend/ivas_orient_trk.c index 63d863c4b6..fd70611d62 100644 --- a/lib_rend/ivas_orient_trk.c +++ b/lib_rend/ivas_orient_trk.c @@ -406,7 +406,11 @@ ivas_error ivas_orient_trk_Init( pOTR->refRot = identity; /* set safe default tracking mode */ +#ifdef FIX_439_OTR_PARAMS + pOTR->trackingType = HEAD_ORIENT_TRK_NONE; + #else pOTR->trackingType = OTR_TRACKING_NONE; +#endif return IVAS_ERR_OK; } @@ -420,7 +424,11 @@ ivas_error ivas_orient_trk_Init( ivas_error ivas_orient_trk_SetTrackingType( ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ +#ifdef FIX_439_OTR_PARAMS + HEAD_ORIENT_TRK_TYPE trackingType /* i/o: orientation tracking type */ +#else const OTR_TRACKING_T trackingType /* i/o: orientation tracking type */ +#endif ) { if ( pOTR == NULL ) @@ -479,15 +487,29 @@ ivas_error ivas_orient_trk_GetMainOrientation( } switch ( pOTR->trackingType ) { +#ifdef FIX_439_OTR_PARAMS + case HEAD_ORIENT_TRK_NONE: +#else case OTR_TRACKING_NONE: +#endif *pOrientation = IdentityQuaternion(); break; +#ifdef FIX_439_OTR_PARAMS + case HEAD_ORIENT_TRK_REF_VEC: + case HEAD_ORIENT_TRK_REF_VEC_LEV: + case HEAD_ORIENT_TRK_REF: +#else case OTR_TRACKING_REF_VEC: case OTR_TRACKING_REF_VEC_LEV: case OTR_TRACKING_REF_ORIENT: +#endif *pOrientation = pOTR->refRot; break; +#ifdef FIX_439_OTR_PARAMS + case HEAD_ORIENT_TRK_AVG: +#else case OTR_TRACKING_AVG_ORIENT: +#endif *pOrientation = pOTR->absAvgRot; break; } @@ -541,13 +563,24 @@ ivas_error ivas_orient_trk_SetReferenceVector( switch ( pOTR->trackingType ) { +#ifdef FIX_439_OTR_PARAMS + case HEAD_ORIENT_TRK_NONE: + case HEAD_ORIENT_TRK_REF: + case HEAD_ORIENT_TRK_AVG: + case HEAD_ORIENT_TRK_REF_VEC: +#else case OTR_TRACKING_NONE: case OTR_TRACKING_REF_ORIENT: case OTR_TRACKING_AVG_ORIENT: case OTR_TRACKING_REF_VEC: +#endif acousticFrontVector = VectorSubtract( listenerPos, refPos ); break; +#ifdef FIX_439_OTR_PARAMS + case HEAD_ORIENT_TRK_REF_VEC_LEV: +#else case OTR_TRACKING_REF_VEC_LEV: +#endif /* ignore the height difference between listener position and reference position */ listenerPosLevel.z = refPosLevel.z = listenerPos.z; listenerPosLevel.x = listenerPos.x; @@ -607,12 +640,22 @@ ivas_error ivas_orient_trk_Process( switch ( pOTR->trackingType ) { +#ifdef FIX_439_OTR_PARAMS + case HEAD_ORIENT_TRK_NONE: +#else case OTR_TRACKING_NONE: +#endif pOTR->trkRot = absRot; break; +#ifdef FIX_439_OTR_PARAMS + case HEAD_ORIENT_TRK_REF: + case HEAD_ORIENT_TRK_REF_VEC: + case HEAD_ORIENT_TRK_REF_VEC_LEV: +#else case OTR_TRACKING_REF_VEC: case OTR_TRACKING_REF_VEC_LEV: case OTR_TRACKING_REF_ORIENT: +#endif /* Reset average orientation */ pOTR->absAvgRot = absRot; @@ -624,7 +667,11 @@ ivas_error ivas_orient_trk_Process( QuaternionProduct( pOTR->trkRot, absRot, &pOTR->trkRot ); break; +#ifdef FIX_439_OTR_PARAMS + case HEAD_ORIENT_TRK_AVG: +#else case OTR_TRACKING_AVG_ORIENT: +#endif /* Compute average (low-pass filtered) absolute orientation */ QuaternionSlerp( pOTR->absAvgRot, absRot, alpha, &pOTR->absAvgRot ); diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index efa2111243..6b39e611d8 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -873,7 +873,11 @@ ivas_error ivas_orient_trk_Init( ivas_error ivas_orient_trk_SetTrackingType( ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ +#ifdef FIX_439_OTR_PARAMS + HEAD_ORIENT_TRK_TYPE trackingType /* i : orientation tracking type */ +#else const OTR_TRACKING_T trackingType /* i : orientation tracking type */ +#endif ); ivas_error ivas_orient_trk_SetReferenceRotation( diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index a3308e23c2..94db3e5242 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -228,7 +228,11 @@ typedef struct EFAP typedef struct ivas_orient_trk_state_t { +#ifdef FIX_439_OTR_PARAMS + HEAD_ORIENT_TRK_TYPE trackingType; +#else OTR_TRACKING_T trackingType; +#endif float centerAdaptationRate; float offCenterAdaptationRate; float adaptationAngle; diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 731b284b0e..8632ca456f 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -3857,9 +3857,16 @@ ivas_error IVAS_REND_SetHeadRotation( ivas_error IVAS_REND_SetOrientationTrackingMode( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ +#ifdef FIX_439_OTR_PARAMS + HEAD_ORIENT_TRK_TYPE otrMode /* i : Head orientation tracking mode */ +#else const uint8_t otrMode /* i : Orientation tracking mode */ +#endif ) { +#ifdef FIX_439_OTR_PARAMS + return ivas_orient_trk_SetTrackingType( hIvasRend->headRotData.hOrientationTracker, otrMode ); +#else OTR_TRACKING_T mode; ivas_error error; @@ -3892,6 +3899,7 @@ ivas_error IVAS_REND_SetOrientationTrackingMode( { return error; } +#endif return IVAS_ERR_OK; } -- GitLab From c593bb39dd900bb1b30cbab1239c412802449577 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Thu, 11 May 2023 14:27:03 +0200 Subject: [PATCH 116/331] fix condition for dirac band re-configuration --- lib_dec/ivas_dirac_dec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 1518a2fe98..81909fc3f8 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -355,7 +355,7 @@ ivas_error ivas_dirac_dec_config( /* band config needed only for SPAR with FOA output */ if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_FOA && st_ivas->sba_mode == SBA_MODE_SPAR #ifdef HODIRAC - && ivas_total_brate < IVAS_256k + && !hodirac_flag #endif ) { -- GitLab From c3770825759a33ae72689437f8f641f5a7eb6633 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Thu, 11 May 2023 14:43:09 +0200 Subject: [PATCH 117/331] consolidate switches under main HODIRAC switch --- lib_com/ivas_cnst.h | 2 +- lib_com/ivas_dirac_com.c | 2 +- lib_com/ivas_fb_mixer.c | 4 +- lib_com/ivas_prot.h | 16 ++-- lib_com/ivas_rom_com.c | 6 +- lib_com/ivas_sba_config.c | 6 +- lib_com/ivas_spar_com.c | 4 +- lib_com/options.h | 5 -- lib_dec/ivas_dec.c | 2 +- lib_dec/ivas_dirac_dec.c | 16 ++-- lib_dec/ivas_dirac_output_synthesis_dec.c | 2 +- lib_dec/ivas_output_config.c | 2 +- lib_dec/ivas_rom_dec.c | 2 +- lib_dec/ivas_rom_dec.h | 2 +- lib_dec/ivas_sba_rendering_internal.c | 4 +- lib_dec/ivas_spar_decoder.c | 38 ++++----- lib_dec/ivas_spar_md_dec.c | 96 +++++++++++------------ lib_dec/ivas_stat_dec.h | 4 +- lib_enc/ivas_enc.c | 2 +- lib_enc/ivas_enc_cov_handler.c | 10 +-- lib_enc/ivas_init_enc.c | 2 +- lib_enc/ivas_mc_paramupmix_enc.c | 4 +- lib_enc/ivas_spar_encoder.c | 10 +-- lib_enc/ivas_spar_md_enc.c | 22 +++--- lib_enc/ivas_stat_enc.h | 2 +- 25 files changed, 130 insertions(+), 135 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 25d72948bc..05eb9b34ca 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -990,7 +990,7 @@ typedef enum #define SPAR_CONFIG_BW FB -#ifndef SPAR_TUNING +#ifndef HODIRAC #define IVAS_SPAR_MAX_CH (FOA_CHANNELS + 2 * ( IVAS_MAX_SBA_ORDER - 1 )) /* FOA + planar HOA */ #else #define IVAS_SPAR_MAX_CH ((( IVAS_MAX_SBA_ORDER ) * ( IVAS_MAX_SBA_ORDER )) + 2) /* HOA2 + pHOA3*/ diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index d946bbfa0b..9dae5449a9 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -427,7 +427,7 @@ ivas_error ivas_dirac_sba_config( return error; } -#ifdef HODIRAC_FIX_BR_SWITCHING_DTX +#ifdef HODIRAC if ( hodirac_flag ) { int16_t dir, j; diff --git a/lib_com/ivas_fb_mixer.c b/lib_com/ivas_fb_mixer.c index ca25ccd065..2598a43d30 100644 --- a/lib_com/ivas_fb_mixer.c +++ b/lib_com/ivas_fb_mixer.c @@ -526,7 +526,7 @@ void ivas_fb_mixer_pcm_ingest( float pcm_in[][L_FRAME48k], /* i : input audio channels */ float **ppOut_pcm, /* o : output audio channels */ const int16_t frame_len /* i : frame length */ -#ifdef SPAR_TUNING +#ifdef HODIRAC , const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] #endif @@ -553,7 +553,7 @@ void ivas_fb_mixer_pcm_ingest( { mvr2r( &hFbMixer->ppFilterbank_prior_input[i][fb_cfg->prior_input_length - frame_len], ppOut_pcm[i], frame_len ); #ifdef HODIRAC -#ifdef SPAR_TUNING +#ifdef HODIRAC mvr2r( pcm_in[HOA_md_ind[i]], &ppOut_pcm[i][frame_len], frame_len ); #else mvr2r( pcm_in[HOA_keep_ind_spar[i]], &ppOut_pcm[i][frame_len], frame_len ); diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 0ee94724d2..a0021a88ea 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3314,13 +3314,13 @@ int16_t ivas_sba_get_nchan( /*! r: number of ambisonics metadata channels */ int16_t ivas_sba_get_nchan_metadata( const int16_t sba_order /* i : Ambisonic (SBA) order */ -#ifdef SPAR_TUNING +#ifdef HODIRAC , const int32_t ivas_total_brate #endif ); -#ifdef SPAR_TUNING +#ifdef HODIRAC void ivas_sba_get_spar_hoa_ch_ind( const int16_t num_md_chs, /* i : number of MD channels */ const int32_t ivas_total_brate, /* i : IVAS total bitrate */ @@ -4324,7 +4324,7 @@ void ivas_get_spar_md_from_dirac( const int16_t active_w_vlbr ); -#ifdef SPAR_TUNING +#ifdef HODIRAC int16_t ivas_get_spar_dec_md_num_subframes( const int16_t sba_order, /* i : Ambisonic (SBA) order */ const int32_t ivas_total_brate ); @@ -4382,7 +4382,7 @@ void ivas_spar_update_md_hist( void ivas_spar_smooth_md_dtx( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t num_bands_out /* i : number of output bands */ - #ifdef SPAR_TUNING + #ifdef HODIRAC , const int16_t num_md_sub_frames /* i : number of metadata subframes */ #endif @@ -4391,7 +4391,7 @@ void ivas_spar_smooth_md_dtx( void ivas_spar_setup_md_smoothing( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t num_bands_out /* i : number of output bands */ -#ifdef SPAR_TUNING +#ifdef HODIRAC , const int16_t num_md_sub_frames /* i : number of metadata subframes */ #endif @@ -4402,7 +4402,7 @@ void ivas_spar_dec_gen_umx_mat( const int16_t nchan_transport, /* i : number of transport channels */ const int16_t num_bands_out, /* i : number of output bands */ const int16_t bfi /* i : bad frame indicator */ -#ifdef SPAR_TUNING +#ifdef HODIRAC , const int16_t num_md_sub_frames #endif @@ -4435,7 +4435,7 @@ void ivas_enc_cov_handler_process( const int16_t nchan_inp, const int16_t dtx_vad, const int16_t transient_det[2] -#ifdef SPAR_TUNING +#ifdef HODIRAC , const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] #endif @@ -5294,7 +5294,7 @@ void ivas_fb_mixer_pcm_ingest( float pcm_in[][L_FRAME48k], /* i : input audio channels */ float **ppOut_pcm, /* o : output audio channels */ const int16_t frame_length /* i : frame length */ -#ifdef SPAR_TUNING +#ifdef HODIRAC , const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] #endif diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index 7ed0ec4a82..e0ccc3005b 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -944,7 +944,7 @@ const ivas_spar_br_table_t ivas_spar_br_table_consts[IVAS_SPAR_BR_TABLE_LEN] = { 512000, 0, SBA_FOA_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 128000, 128000, 128000 },{ 128000, 128000, 128000 },{ 128000, 128000, 128000 }, {118450, 118450, 128000 } }, // not yet optimized { { 31, 1, 1, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, -#ifdef SPAR_TUNING +#ifdef HODIRAC { 512000, 0, SBA_HOA2_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 124000, 124000, 128000 },{ 124000, 124000, 128000 },{ 125200, 118450, 128000 },{ 76300, 73000, 128000 } }, // not yet optimized { { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, @@ -1482,14 +1482,14 @@ const int16_t remix_order_set[1][IVAS_SPAR_MAX_CH] = { /* WYZX --> WYXZ... */ { 0, 1, 3, 2, 4, 5, 6, 7} }; #endif -#ifdef SPAR_TUNING +#ifdef HODIRAC const int16_t keep_planar[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS] = { 1, 1, 1, 1, 1, 1 }; #else const int16_t keep_planar[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS] = { 1, 1, 1, 1 }; #endif #ifdef HODIRAC const int16_t HOA_keep_ind[IVAS_SPAR_MAX_FB_IN_CHAN] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 15}; -#ifdef SPAR_TUNING +#ifdef HODIRAC const int16_t HOA_keep_ind_spar[IVAS_SPAR_MAX_CH] = {0, 1, 2, 3, 4, 8, 9, 10, 10, 10, 10}; const int16_t HOA_keep_ind_spar512[IVAS_SPAR_MAX_CH] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; #else diff --git a/lib_com/ivas_sba_config.c b/lib_com/ivas_sba_config.c index f5e0c53e3a..d0b153260b 100644 --- a/lib_com/ivas_sba_config.c +++ b/lib_com/ivas_sba_config.c @@ -222,7 +222,7 @@ int16_t ivas_sba_get_nchan( /*! r: number of ambisonics metadata channels */ int16_t ivas_sba_get_nchan_metadata( const int16_t sba_order /* i : Ambisonic (SBA) order */ -#ifdef SPAR_TUNING +#ifdef HODIRAC , const int32_t ivas_total_brate #endif @@ -236,7 +236,7 @@ int16_t ivas_sba_get_nchan_metadata( } else { -#ifdef SPAR_TUNING +#ifdef HODIRAC if ( ivas_total_brate >= IVAS_512k ) { nb_channels = ( SBA_HOA2_ORDER + 1 ) * ( SBA_HOA2_ORDER + 1 ); @@ -261,7 +261,7 @@ int16_t ivas_sba_get_nchan_metadata( *-------------------------------------------------------------------*/ /*! r: flag indicating to code SPAR HOA MD for all bands */ -#ifdef SPAR_TUNING +#ifdef HODIRAC void ivas_sba_get_spar_hoa_ch_ind( const int16_t num_md_chs, /* i : number of MD channels */ const int32_t ivas_total_brate, /* i : IVAS total bitrate */ diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index 7ca2d41715..e49cd5380b 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -1687,14 +1687,14 @@ void ivas_get_spar_md_from_dirac( remix_order = remix_order_set[hSpar_md_cfg->remix_unmix_order]; num_ch = ivas_sba_get_nchan_metadata( order -#ifdef SPAR_TUNING +#ifdef HODIRAC , IVAS_256k /*dummy value as order is always 1 in this function*/ #endif ); hoa2_ch = ivas_sba_get_nchan_metadata( SBA_HOA2_ORDER -#ifdef SPAR_TUNING +#ifdef HODIRAC , IVAS_256k /*dummy value as order is always 1 in this function*/ #endif diff --git a/lib_com/options.h b/lib_com/options.h index b1c9c099a9..0461548a3d 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -197,11 +197,6 @@ #define HODIRAC /* FhG: Contribution 32: Sector-based HO-DirAC method for SBA at high bitrates */ -#ifdef HODIRAC -#define SPAR_TUNING /* Dlb: tune SPAR for better quality */ -#define HODIRAC_FIX_BR_SWITCHING_DTX -#endif - /*#define HODIRAC_DEBUG*/ #ifdef HODIRAC_DEBUG diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index 6b334944f3..3ef2d689ab 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -354,7 +354,7 @@ ivas_error ivas_dec( } ivas_spar_dec_gen_umx_mat( st_ivas->hSpar->hMdDec, st_ivas->nchan_transport, IVAS_MAX_NUM_BANDS, st_ivas->bfi -#ifdef SPAR_TUNING +#ifdef HODIRAC , ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate ) #endif diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 81909fc3f8..6f46397305 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -71,7 +71,7 @@ static void protoSignalComputation1( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRA static void protoSignalComputation2( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float *proto_frame_f, float *proto_direct_buffer_f, float *reference_power, float *proto_power_smooth, const int16_t isloudspeaker, const int16_t slot_index, const int16_t num_freq_bands, MASA_STEREO_TYPE_DETECT *stereo_type_detect ); static void protoSignalComputation4( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float *proto_frame_f, float *proto_direct_buffer_f, float *reference_power, float *proto_power_smooth, const int16_t slot_index, const int16_t num_outputs_diff, const int16_t num_freq_bands, const float *mtx_hoa_decoder, const int16_t nchan_transport -#ifdef SPAR_TUNING +#ifdef HODIRAC , const int16_t *sba_map_tc_ind #endif @@ -189,7 +189,7 @@ ivas_error ivas_dirac_dec_config( if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && !( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) { st_ivas->nchan_transport = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order -#ifdef SPAR_TUNING +#ifdef HODIRAC , st_ivas->hDecoderConfig->ivas_total_brate #endif @@ -514,7 +514,7 @@ ivas_error ivas_dirac_dec_config( } set_s( hDirAC->proto_index_diff, 0, hDirAC->num_outputs_diff ); -#ifdef SPAR_TUNING +#ifdef HODIRAC hDirAC->sba_map_tc = sba_map_tc; if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR ) { @@ -630,7 +630,7 @@ ivas_error ivas_dirac_dec_config( for ( k = 0; k < min( hDirAC->num_outputs_dir, hDirAC->num_protos_dir ); k++ ) { -#ifdef SPAR_TUNING +#ifdef HODIRAC if ( hDirAC->sba_map_tc[k] < hDirAC->num_outputs_dir ) { hDirAC->proto_index_dir[hDirAC->sba_map_tc[k]] = k; @@ -2723,7 +2723,7 @@ void ivas_dirac_dec( /* CLDFB Analysis*/ for ( ch = 0; ch < nchan_transport; ch++ ) { -#ifdef SPAR_TUNING +#ifdef HODIRAC cldfbAnalysis_ts( &( output_f[hDirAC->sba_map_tc[ch]][hDirAC->num_freq_bands * index_slot] ), Cldfb_RealBuffer[ch][0], Cldfb_ImagBuffer[ch][0], @@ -2818,7 +2818,7 @@ void ivas_dirac_dec( hDirAC->num_freq_bands, hDirAC->hoa_decoder, nchan_transport -#ifdef SPAR_TUNING +#ifdef HODIRAC , hDirAC->sba_map_tc #endif @@ -3945,7 +3945,7 @@ static void protoSignalComputation4( const int16_t num_freq_bands, const float *mtx_hoa_decoder, const int16_t nchan_transport -#ifdef SPAR_TUNING +#ifdef HODIRAC , const int16_t *sba_map_tc_ind #endif @@ -3975,7 +3975,7 @@ static void protoSignalComputation4( proto_frame_f[2 * l * num_freq_bands + 2 * k + 1] = 0.f; for ( n = 0; n < nchan_transport; n++ ) { -#ifdef SPAR_TUNING +#ifdef HODIRAC proto_frame_f[2 * l * num_freq_bands + 2 * k] += RealBuffer[n][0][k] * mtx_hoa_decoder[l * 16 + sba_map_tc_ind[n]]; proto_frame_f[2 * l * num_freq_bands + 2 * k + 1] += ImagBuffer[n][0][k] * mtx_hoa_decoder[l * 16 + sba_map_tc_ind[n]]; #else diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c index f02408b144..5a8c5c0aa3 100755 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -1150,7 +1150,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( for ( l = 0; l < num_freq_bands_diff; l++ ) { g = g1 * ( *( p_gains_diff++ ) ) + g2 * ( *( p_gains_diff_prev++ ) ); -#ifdef SPAR_TUNING +#ifdef HODIRAC output_real[l * num_channels_dir + hDirAC->sba_map_tc[ch_idx]] += g * ( *( p_proto++ ) ); /* maps ch_idx 5 to 8 */ output_imag[l * num_channels_dir + hDirAC->sba_map_tc[ch_idx]] += g * ( *( p_proto++ ) ); #else diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index f0d9ad84c3..4708470a4f 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -153,7 +153,7 @@ void ivas_renderer_select( { nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order -#ifdef SPAR_TUNING +#ifdef HODIRAC , st_ivas->hDecoderConfig->ivas_total_brate #endif diff --git a/lib_dec/ivas_rom_dec.c b/lib_dec/ivas_rom_dec.c index 2b034655f3..16298dfe98 100644 --- a/lib_dec/ivas_rom_dec.c +++ b/lib_dec/ivas_rom_dec.c @@ -524,7 +524,7 @@ const float ap_split_frequencies[DIRAC_DECORR_NUM_SPLIT_BANDS + 1] = 0.0f, 0.125f, 0.375f, 1.0f }; -#ifdef SPAR_TUNING +#ifdef HODIRAC const int16_t sba_map_tc[11] = { 0, 1, 2, 3, 4, 8, 9, 15, 5, 6, 7 diff --git a/lib_dec/ivas_rom_dec.h b/lib_dec/ivas_rom_dec.h index 81aec535a2..05211fa94e 100644 --- a/lib_dec/ivas_rom_dec.h +++ b/lib_dec/ivas_rom_dec.h @@ -115,7 +115,7 @@ extern const float ap_lattice_coeffs_3[DIRAC_DECORR_FILTER_LEN_3 * DIRAC_MAX_NUM extern const float *const ap_lattice_coeffs[DIRAC_DECORR_NUM_SPLIT_BANDS]; extern const float ap_split_frequencies[DIRAC_DECORR_NUM_SPLIT_BANDS + 1]; -#ifdef SPAR_TUNING +#ifdef HODIRAC extern const int16_t sba_map_tc[11]; extern const int16_t sba_map_tc_512[11]; #else diff --git a/lib_dec/ivas_sba_rendering_internal.c b/lib_dec/ivas_sba_rendering_internal.c index 6947efa868..1bab4c9af8 100644 --- a/lib_dec/ivas_sba_rendering_internal.c +++ b/lib_dec/ivas_sba_rendering_internal.c @@ -354,7 +354,7 @@ void ivas_sba_upmixer_renderer( push_wmops( "ivas_sba_upmixer_renderer" ); nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order -#ifdef SPAR_TUNING +#ifdef HODIRAC , st_ivas->hDecoderConfig->ivas_total_brate #endif @@ -587,7 +587,7 @@ void ivas_sba_mix_matrix_determiner( /* Mixing matrix determiner */ num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, bfi -#ifdef SPAR_TUNING +#ifdef HODIRAC , MAX_PARAM_SPATIAL_SUBFRAMES #endif diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 154d8c41f8..73f0ca158a 100755 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -72,14 +72,14 @@ ivas_error ivas_spar_dec_open( IVAS_FB_CFG *fb_cfg; int16_t i, j, b, active_w_mixing; int32_t output_Fs; -#ifdef SPAR_TUNING +#ifdef HODIRAC int16_t num_decor_chs; #endif error = IVAS_ERR_OK; sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); num_channels_internal = ivas_sba_get_nchan_metadata( sba_order_internal -#ifdef SPAR_TUNING +#ifdef HODIRAC , st_ivas->hDecoderConfig->ivas_total_brate #endif @@ -97,7 +97,7 @@ ivas_error ivas_spar_dec_open( } output_Fs = st_ivas->hDecoderConfig->output_Fs; -#ifdef SPAR_TUNING +#ifdef HODIRAC if ( num_channels_internal > ( SBA_HOA2_ORDER + 1 ) * ( SBA_HOA2_ORDER + 1 ) ) { num_decor_chs = IVAS_HBR_MAX_DECOR_CHS; @@ -108,7 +108,7 @@ ivas_error ivas_spar_dec_open( } #endif -#ifdef SPAR_TUNING +#ifdef HODIRAC /* TD decorr. */ if ( ( error = ivas_td_decorr_dec_open( &hSpar->hTdDecorr, output_Fs, num_decor_chs + 1, 1 ) ) != IVAS_ERR_OK ) { @@ -668,7 +668,7 @@ static void ivas_spar_dec_MD( { int16_t num_channels, table_idx, num_bands_out, bfi, sba_order; int32_t ivas_total_brate; -#ifdef SPAR_TUNING +#ifdef HODIRAC int16_t num_md_sub_frames; #endif DECODER_CONFIG_HANDLE hDecoderConfig = st_ivas->hDecoderConfig; @@ -684,13 +684,13 @@ static void ivas_spar_dec_MD( bfi = st_ivas->bfi; ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; num_channels = ivas_sba_get_nchan_metadata( sba_order -#ifdef SPAR_TUNING +#ifdef HODIRAC , ivas_total_brate #endif ); -#ifdef SPAR_TUNING +#ifdef HODIRAC num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order, st_ivas->hDecoderConfig->ivas_total_brate ); #endif @@ -754,7 +754,7 @@ static void ivas_spar_dec_MD( { ivas_spar_setup_md_smoothing( hSpar->hMdDec, num_bands_out -#ifdef SPAR_TUNING +#ifdef HODIRAC , num_md_sub_frames #endif @@ -770,7 +770,7 @@ static void ivas_spar_dec_MD( if ( !bfi ) { ivas_spar_smooth_md_dtx( hSpar->hMdDec, num_bands_out -#ifdef SPAR_TUNING +#ifdef HODIRAC , num_md_sub_frames #endif @@ -914,7 +914,7 @@ static void ivas_spar_get_skip_mat( const int16_t num_ch_in, const int16_t num_spar_bands, int16_t skip_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] -#ifdef SPAR_TUNING +#ifdef HODIRAC , const int16_t num_md_sub_frames #endif @@ -929,7 +929,7 @@ static void ivas_spar_get_skip_mat( { skip_mat[out_ch][in_ch] = 1; skip_flag = 1; -#ifdef SPAR_TUNING +#ifdef HODIRAC for ( i_ts = 0; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) { for ( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) @@ -1099,7 +1099,7 @@ void ivas_spar_dec_upmixer( int16_t b_skip_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; DECODER_CONFIG_HANDLE hDecoderConfig; SPAR_DEC_HANDLE hSpar; -#ifdef SPAR_TUNING +#ifdef HODIRAC int16_t num_md_sub_frames, md_sf_idx; #endif @@ -1114,7 +1114,7 @@ void ivas_spar_dec_upmixer( numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; numch_out = hSpar->hFbMixer->fb_cfg->num_out_chans; -#ifdef SPAR_TUNING +#ifdef HODIRAC num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, hDecoderConfig->ivas_total_brate ); #endif @@ -1209,7 +1209,7 @@ void ivas_spar_dec_upmixer( { ivas_td_decorr_process( hSpar->hTdDecorr, output, pPcm_tmp, output_frame ); -#ifdef SPAR_TUNING +#ifdef HODIRAC if ( hSpar->hTdDecorr->num_apd_outputs >= ( nchan_internal - nchan_transport ) ) { for ( i = 0; i < nchan_internal - nchan_transport; i++ ) @@ -1273,7 +1273,7 @@ void ivas_spar_dec_upmixer( *---------------------------------------------------------------------*/ ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, st_ivas->bfi -#ifdef SPAR_TUNING +#ifdef HODIRAC , num_md_sub_frames #endif @@ -1289,7 +1289,7 @@ void ivas_spar_dec_upmixer( /* apply parameters */ /* determine if we can skip certain data */ ivas_spar_get_skip_mat( hSpar, numch_out, numch_in, num_spar_bands, b_skip_mat -#ifdef SPAR_TUNING +#ifdef HODIRAC , num_md_sub_frames #endif @@ -1363,7 +1363,7 @@ void ivas_spar_dec_upmixer( for ( in_ch = 0; in_ch < numch_in; in_ch++ ) { -#ifdef SPAR_TUNING +#ifdef HODIRAC if ( b_skip_mat[out_ch][in_ch] == 0 ) { if ( cldfb_band < CLDFB_PAR_WEIGHT_START_BAND ) /* tuning parameter, depends on how much SPAR Filters overlap for the CLDFB bands */ @@ -1488,7 +1488,7 @@ void ivas_spar_dec_upmixer( /* Dump audio signal after cldfbSynthesis */ ivas_spar_dump_signal_wav( output_frame, NULL, output, hSpar->numOutChannels, spar_foa_dec_wav[3], "cldfbSynthesis()" ); #endif -#ifdef SPAR_TUNING +#ifdef HODIRAC md_sf_idx = ( num_md_sub_frames == MAX_PARAM_SPATIAL_SUBFRAMES ) ? i_sf : 0; #endif @@ -1508,7 +1508,7 @@ void ivas_spar_dec_upmixer( { for ( b = 0; b < num_spar_bands; b++ ) { -#ifdef SPAR_TUNING +#ifdef HODIRAC hSpar->hMdDec->mixer_mat_prev[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][b + md_sf_idx * IVAS_MAX_NUM_BANDS]; #else hSpar->hMdDec->mixer_mat_prev[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][b + i_sf * IVAS_MAX_NUM_BANDS]; diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index d1e1ed6685..9ddcd2cfe8 100755 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -64,7 +64,7 @@ static const int16_t ivas_spar_dec_plc_spatial_target[IVAS_SPAR_MAX_CH] = { 1, 0 *------------------------------------------------------------------------------------------*/ static void ivas_get_spar_matrices( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands_out, const int16_t n_ts, const int16_t bw, const int16_t dtx_vad, const int16_t nB, -#ifdef SPAR_TUNING +#ifdef HODIRAC const int16_t numch_out, #else const int16_t sba_order, @@ -82,19 +82,19 @@ static void ivas_get_band_idx_from_differential( ivas_spar_md_t *pSpar_md, const static void ivas_mat_col_rearrange( float in_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], const int16_t order[IVAS_SPAR_MAX_CH], const int16_t i_ts, float ***mixer_mat, const int16_t bands, const int16_t num_ch ); static void ivas_spar_dec_compute_ramp_down_post_matrix( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands, const int16_t bfi -#ifdef SPAR_TUNING +#ifdef HODIRAC , const int16_t num_md_sub_frames #endif ); static void ivas_spar_md_fill_invalid_bands( ivas_spar_dec_matrices_t *pSpar_coeffs, ivas_spar_dec_matrices_t *pSpar_coeffs_prev, const int16_t *valid_bands, int16_t *base_band_age, const int16_t num_bands, -#ifdef SPAR_TUNING +#ifdef HODIRAC const int16_t numch_out #else const int16_t sba_order #endif -#ifdef SPAR_TUNING +#ifdef HODIRAC , const int16_t num_md_sub_frames #endif @@ -118,19 +118,19 @@ static void ivas_spar_dec_parse_md_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder static ivas_error ivas_spar_md_dec_matrix_open( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t num_channels /* i : number of internal channels */ -#ifdef SPAR_TUNING +#ifdef HODIRAC , const int16_t num_md_sub_frames #endif ) { int16_t i, j; -#ifndef SPAR_TUNING +#ifndef HODIRAC int16_t num_md_sub_frames; num_md_sub_frames = MAX_PARAM_SPATIAL_SUBFRAMES; #endif -#ifdef SPAR_TUNING +#ifdef HODIRAC if ( ( hMdDec->spar_md.band_coeffs = (ivas_band_coeffs_t *) malloc( IVAS_MAX_NUM_BANDS * num_md_sub_frames * sizeof( ivas_band_coeffs_t ) ) ) == NULL ) #else if ( ( hMdDec->spar_md.band_coeffs = (ivas_band_coeffs_t *) malloc( IVAS_MAX_NUM_BANDS * MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( ivas_band_coeffs_t ) ) ) == NULL ) @@ -150,7 +150,7 @@ static ivas_error ivas_spar_md_dec_matrix_open( } for ( j = 0; j < num_channels; j++ ) { -#ifdef SPAR_TUNING +#ifdef HODIRAC if ( ( hMdDec->mixer_mat[i][j] = (float *) malloc( num_md_sub_frames * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) #else if ( ( hMdDec->mixer_mat[i][j] = (float *) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) @@ -173,7 +173,7 @@ static ivas_error ivas_spar_md_dec_matrix_open( } for ( j = 0; j < num_channels; j++ ) { -#ifdef SPAR_TUNING +#ifdef HODIRAC if ( ( hMdDec->spar_coeffs.C_re[i][j] = (float *) malloc( num_md_sub_frames * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) #else if ( ( hMdDec->spar_coeffs.C_re[i][j] = (float *) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) @@ -196,7 +196,7 @@ static ivas_error ivas_spar_md_dec_matrix_open( } for ( j = 0; j < num_channels; j++ ) { -#ifdef SPAR_TUNING +#ifdef HODIRAC if ( ( hMdDec->spar_coeffs.P_re[i][j] = (float *) malloc( num_md_sub_frames * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) #else if ( ( hMdDec->spar_coeffs.P_re[i][j] = (float *) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) @@ -286,7 +286,7 @@ static ivas_error ivas_spar_md_dec_matrix_open( return IVAS_ERR_OK; } -#ifdef SPAR_TUNING +#ifdef HODIRAC int16_t ivas_get_spar_dec_md_num_subframes( const int16_t sba_order, /* i : Ambisonic (SBA) order */ const int32_t ivas_total_brate ) @@ -320,7 +320,7 @@ ivas_error ivas_spar_md_dec_open( { ivas_spar_md_dec_state_t *hMdDec; ivas_error error; -#ifdef SPAR_TUNING +#ifdef HODIRAC int16_t num_md_sub_frames; #endif @@ -331,11 +331,11 @@ ivas_error ivas_spar_md_dec_open( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD decoder" ); } -#ifdef SPAR_TUNING +#ifdef HODIRAC num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order, hDecoderConfig->ivas_total_brate ); #endif if ( ( error = ivas_spar_md_dec_matrix_open( hMdDec, num_channels -#ifdef SPAR_TUNING +#ifdef HODIRAC , num_md_sub_frames #endif @@ -516,13 +516,13 @@ ivas_error ivas_spar_md_dec_init( int16_t nchan_transport; float pFC[IVAS_MAX_NUM_BANDS], PR_minmax[2]; -#ifdef SPAR_TUNING +#ifdef HODIRAC ivas_sba_get_spar_hoa_md_flag( sba_order, hDecoderConfig->ivas_total_brate, &hMdDec->spar_hoa_md_flag, &hMdDec->spar_hoa_dirac2spar_md_flag ); #else hMdDec->spar_hoa_md_flag = ivas_sba_get_spar_hoa_md_flag( sba_order, hDecoderConfig->ivas_total_brate ); #endif -#ifdef SPAR_TUNING +#ifdef HODIRAC ivas_sba_get_spar_hoa_ch_ind( num_channels, hDecoderConfig->ivas_total_brate, hMdDec->HOA_md_ind ); #endif @@ -668,7 +668,7 @@ static ivas_error ivas_spar_set_dec_config( } nchan = ivas_sba_get_nchan_metadata( ivas_spar_br_table_consts[hMdDec->table_idx].sba_order -#ifdef SPAR_TUNING +#ifdef HODIRAC , ivas_spar_br_table_consts[hMdDec->table_idx].ivas_total_brate #endif @@ -732,7 +732,7 @@ void ivas_spar_md_dec_process( { int16_t j, k, b, bw, dtx_vad, nB, i_ts; ivas_spar_md_dec_state_t *hMdDec; -#ifdef SPAR_TUNING +#ifdef HODIRAC int16_t num_md_chs; #endif int16_t num_md_sub_frames; @@ -742,10 +742,10 @@ void ivas_spar_md_dec_process( int16_t active_w_vlbr; active_w_vlbr = ( st_ivas->hDecoderConfig->ivas_total_brate < IVAS_24k4 ) ? 1 : 0; -#ifdef SPAR_TUNING +#ifdef HODIRAC num_md_chs = ivas_sba_get_nchan_metadata( sba_order, st_ivas->hDecoderConfig->ivas_total_brate ); #endif -#ifdef SPAR_TUNING +#ifdef HODIRAC num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order, st_ivas->hDecoderConfig->ivas_total_brate ); #else num_md_sub_frames = MAX_PARAM_SPATIAL_SUBFRAMES; @@ -761,7 +761,7 @@ void ivas_spar_md_dec_process( int16_t num_bands = nB; int16_t num_subframes = 1, num_block_groups = 1, num_elements = 1, byte_size = sizeof( float ); int16_t num_ch = ivas_sba_get_nchan_metadata( sba_order -#ifdef SPAR_TUNING +#ifdef HODIRAC , st_ivas->hDecoderConfig->ivas_total_brate #endif @@ -898,7 +898,7 @@ void ivas_spar_md_dec_process( }*/ #endif /* SPAR to DirAC conversion */ -#ifdef SPAR_TUNING +#ifdef HODIRAC if ( hMdDec->spar_hoa_dirac2spar_md_flag == 1 ) #endif { @@ -1035,7 +1035,7 @@ void ivas_spar_md_dec_process( }*/ #endif /* expand DirAC MD to all time slots */ -#ifdef SPAR_TUNING +#ifdef HODIRAC for ( i_ts = 1; i_ts < num_md_sub_frames; i_ts++ ) #else for ( i_ts = 1; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) @@ -1063,12 +1063,12 @@ void ivas_spar_md_dec_process( } } -#ifdef SPAR_TUNING +#ifdef HODIRAC ivas_get_spar_matrices( hMdDec, num_bands_out, num_md_sub_frames, bw, dtx_vad, nB, #else ivas_get_spar_matrices( hMdDec, num_bands_out, MAX_PARAM_SPATIAL_SUBFRAMES, bw, dtx_vad, nB, #endif -#ifdef SPAR_TUNING +#ifdef HODIRAC num_md_chs, #else sba_order, @@ -1098,12 +1098,12 @@ void ivas_spar_md_dec_process( } ivas_spar_md_fill_invalid_bands( &hMdDec->spar_coeffs, &hMdDec->spar_coeffs_prev, &hMdDec->valid_bands[0], &hMdDec->base_band_age[0], num_bands_out, -#ifdef SPAR_TUNING +#ifdef HODIRAC num_md_chs #else sba_order #endif -#ifdef SPAR_TUNING +#ifdef HODIRAC , num_md_sub_frames #endif @@ -1127,7 +1127,7 @@ void ivas_spar_md_dec_process( void ivas_spar_smooth_md_dtx( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t num_bands_out /* i : number of output bands */ -#ifdef SPAR_TUNING +#ifdef HODIRAC , const int16_t num_md_sub_frames /* i : number of metadata subframes */ #endif @@ -1166,7 +1166,7 @@ void ivas_spar_smooth_md_dtx( } /* expand MD to all time slots */ -#ifdef SPAR_TUNING +#ifdef HODIRAC for ( int16_t i_ts = 1; i_ts < num_md_sub_frames; i_ts++ ) #else for ( int16_t i_ts = 1; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) @@ -1210,7 +1210,7 @@ void ivas_spar_smooth_md_dtx( void ivas_spar_setup_md_smoothing( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t num_bands_out /* i : number of output bands */ -#ifdef SPAR_TUNING +#ifdef HODIRAC , const int16_t num_md_sub_frames /* i : number of metadata subframes */ #endif @@ -1266,7 +1266,7 @@ void ivas_spar_setup_md_smoothing( } ivas_spar_smooth_md_dtx( hMdDec, num_bands_out -#ifdef SPAR_TUNING +#ifdef HODIRAC , num_md_sub_frames #endif @@ -1350,14 +1350,14 @@ static void ivas_get_spar_matrices( const int16_t bw, const int16_t dtx_vad, const int16_t nB, -#ifdef SPAR_TUNING +#ifdef HODIRAC const int16_t numch_out, #else const int16_t sba_order, #endif const int16_t active_w_vlbr ) { -#ifndef SPAR_TUNING +#ifndef HODIRAC int16_t numch_out, num_bands, dmx_ch, split_band; #else int16_t num_bands, dmx_ch, split_band; @@ -1366,7 +1366,7 @@ static void ivas_get_spar_matrices( const int16_t *order; float active_w_dm_fac, re; -#ifndef SPAR_TUNING +#ifndef HODIRAC numch_out = ivas_sba_get_nchan_metadata( sba_order ); #endif @@ -1747,7 +1747,7 @@ void ivas_spar_dec_gen_umx_mat( const int16_t nchan_transport, /* i : number of transport channels */ const int16_t num_bands_out, /* i : number of output bands */ const int16_t bfi /* i : bad frame indicator */ -#ifdef SPAR_TUNING +#ifdef HODIRAC , const int16_t num_md_sub_frames #endif @@ -1757,7 +1757,7 @@ void ivas_spar_dec_gen_umx_mat( num_out_ch = hMdDec->spar_md_cfg.num_umx_chs; -#ifdef SPAR_TUNING +#ifdef HODIRAC for ( i_ts = 0; i_ts < num_md_sub_frames; i_ts++ ) #else for ( i_ts = 0; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) @@ -1823,7 +1823,7 @@ void ivas_spar_dec_gen_umx_mat( } ivas_spar_dec_compute_ramp_down_post_matrix( hMdDec, num_bands_out, bfi -#ifdef SPAR_TUNING +#ifdef HODIRAC , num_md_sub_frames #endif @@ -2206,7 +2206,7 @@ static void ivas_decode_arith_bs( { pred_cell_dims[i].dim1 = ndm + ndec - 1; if ( hMdDec->spar_hoa_md_flag -#ifdef SPAR_TUNING +#ifdef HODIRAC && hMdDec->spar_hoa_dirac2spar_md_flag #endif ) @@ -2238,7 +2238,7 @@ static void ivas_decode_arith_bs( if ( any_diff == 1 ) { -#ifdef SPAR_TUNING +#ifdef HODIRAC if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) #else if ( hMdDec->spar_hoa_md_flag ) @@ -2264,7 +2264,7 @@ static void ivas_decode_arith_bs( ivas_fill_band_coeffs_idx( hMdDec->spar_md.band_coeffs_idx, nB, symbol_arr_re, pred_cell_dims, PRED_COEFF, planarCP ); -#ifdef SPAR_TUNING +#ifdef HODIRAC if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) #else if ( hMdDec->spar_hoa_md_flag ) @@ -2533,7 +2533,7 @@ static void ivas_decode_huffman_bs( drct_dim = ndec * ( ndm - 1 ); decd_dim = ndec; pred_offset = 0; -#ifdef SPAR_TUNING +#ifdef HODIRAC if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) #else if ( hMdDec->spar_hoa_md_flag ) @@ -2551,7 +2551,7 @@ static void ivas_decode_huffman_bs( &hMdDec->spar_md.band_coeffs_idx[i].pred_index_re[j] ); } -#ifdef SPAR_TUNING +#ifdef HODIRAC if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) #else if ( hMdDec->spar_hoa_md_flag ) @@ -2608,12 +2608,12 @@ static void ivas_spar_md_fill_invalid_bands( const int16_t *valid_bands, int16_t *base_band_age, const int16_t num_bands, -#ifdef SPAR_TUNING +#ifdef HODIRAC const int16_t num_channels #else const int16_t sba_order #endif -#ifdef SPAR_TUNING +#ifdef HODIRAC , const int16_t num_md_sub_frames #endif @@ -2623,7 +2623,7 @@ static void ivas_spar_md_fill_invalid_bands( int16_t valid_band_idx[IVAS_MAX_NUM_BANDS], idx = -1; int16_t last_valid_band_idx[IVAS_MAX_NUM_BANDS]; float w = 0; -#ifndef SPAR_TUNING +#ifndef HODIRAC int16_t num_channels; num_channels = ivas_sba_get_nchan_metadata( sba_order ); @@ -2714,7 +2714,7 @@ static void ivas_spar_md_fill_invalid_bands( { for ( j = 0; j < num_channels; j++ ) { -#ifdef SPAR_TUNING +#ifdef HODIRAC for ( i_ts = 1; i_ts < num_md_sub_frames; i_ts++ ) #else for ( i_ts = 1; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) @@ -2743,7 +2743,7 @@ static void ivas_spar_dec_compute_ramp_down_post_matrix( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands_out, const int16_t bfi -#ifdef SPAR_TUNING +#ifdef HODIRAC , const int16_t num_md_sub_frames #endif @@ -2786,7 +2786,7 @@ static void ivas_spar_dec_compute_ramp_down_post_matrix( } /* apply the post matrix */ -#ifdef SPAR_TUNING +#ifdef HODIRAC for ( int16_t i_ts = 0; i_ts < num_md_sub_frames; i_ts++ ) #else for ( int16_t i_ts = 0; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 0e2f01c574..f73569f8f7 100755 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -710,7 +710,7 @@ typedef struct ivas_dirac_dec_data_structure PARAM_ISM_RENDERING_HANDLE hParamIsmRendering; IVAS_FB_MIXER_HANDLE hFbMdft; int16_t dirac_to_spar_md_bands[DIRAC_MAX_NBANDS]; -#ifdef SPAR_TUNING +#ifdef HODIRAC const int16_t *sba_map_tc; #endif @@ -829,7 +829,7 @@ typedef struct ivas_spar_md_dec_state_t int16_t table_idx; int16_t dtx_vad; int16_t spar_hoa_md_flag; -#ifdef SPAR_TUNING +#ifdef HODIRAC int16_t spar_hoa_dirac2spar_md_flag; int16_t HOA_md_ind[IVAS_SPAR_MAX_CH]; #endif diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index 50ea332a7a..6121bd588f 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -138,7 +138,7 @@ ivas_error ivas_enc( #endif ) { -#ifdef SPAR_TUNING +#ifdef HODIRAC hp20( data_f[HOA_keep_ind[st_ivas->hSpar->hMdEnc->HOA_md_ind[i]]], input_frame, st_ivas->mem_hp20_in[i], input_Fs ); #else hp20( data_f[HOA_keep_ind[i]], input_frame, st_ivas->mem_hp20_in[i], input_Fs ); diff --git a/lib_enc/ivas_enc_cov_handler.c b/lib_enc/ivas_enc_cov_handler.c index 7390ba8b38..6575d751a9 100644 --- a/lib_enc/ivas_enc_cov_handler.c +++ b/lib_enc/ivas_enc_cov_handler.c @@ -57,7 +57,7 @@ *------------------------------------------------------------------------------------------*/ static void ivas_band_cov( float **ppIn_FR_real, float **ppIn_FR_imag, const int16_t num_chans, const int16_t num_bins, int16_t stride, float **pFb_bin_to_band, const int16_t *pFb_start_bin_per_band, const int16_t *pFb_active_bins_per_band, const int16_t start_band, const int16_t end_band, float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] -#ifdef SPAR_TUNING +#ifdef HODIRAC , const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] #endif @@ -170,7 +170,7 @@ void ivas_enc_cov_handler_process( const int16_t num_ch, const int16_t dtx_vad, const int16_t transient_det[2] -#ifdef SPAR_TUNING +#ifdef HODIRAC , const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] #endif @@ -188,7 +188,7 @@ void ivas_enc_cov_handler_process( pFb->fb_bin_to_band.p_short_stride_num_bins_per_band, start_band, end_band, cov_real -#ifdef SPAR_TUNING +#ifdef HODIRAC , HOA_md_ind #endif @@ -285,7 +285,7 @@ static void ivas_band_cov( const int16_t start_band, const int16_t end_band, float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] -#ifdef SPAR_TUNING +#ifdef HODIRAC , const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] #endif @@ -301,7 +301,7 @@ static void ivas_band_cov( { #ifdef HODIRAC -#ifdef SPAR_TUNING +#ifdef HODIRAC int16_t i1 = HOA_md_ind[i]; int16_t j1 = HOA_md_ind[j]; #else diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index c706d9bb64..e858074445 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -198,7 +198,7 @@ int16_t getNumChanAnalysis( #ifdef HODIRAC n = ( st_ivas->sba_analysis_order + 1 ) * ( st_ivas->sba_analysis_order + 1 ); #else -#ifdef SPAR_TUNING +#ifdef HODIRAC n = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hEncoderConfig->ivas_total_brate ); #else n = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order ); diff --git a/lib_enc/ivas_mc_paramupmix_enc.c b/lib_enc/ivas_mc_paramupmix_enc.c index a44121f9a7..6363ee3b13 100644 --- a/lib_enc/ivas_mc_paramupmix_enc.c +++ b/lib_enc/ivas_mc_paramupmix_enc.c @@ -740,7 +740,7 @@ static void ivas_mc_paramupmix_param_est_enc( int16_t chan1s[4] = { 4, 5, 8, 9 }; int16_t chan2s[4] = { 6, 7, 10, 11 }; -#ifdef SPAR_TUNING +#ifdef HODIRAC const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; #endif @@ -817,7 +817,7 @@ static void ivas_mc_paramupmix_param_est_enc( cov_dtx_real[i][j] = hMCParamUpmix->cov_dtx_real[b][i][j]; } } -#ifdef SPAR_TUNING +#ifdef HODIRAC ivas_enc_cov_handler_process( hMCParamUpmix->hCovEnc[b], pp_in_fr_real, pp_in_fr_imag, cov_real, cov_dtx_real, hMCParamUpmix->hFbMixer->pFb, 0, hMCParamUpmix->hFbMixer->pFb->filterbank_num_bands, MC_PARAMUPMIX_NCH, 0 /*dtx_vad*/, transient_det[b], HOA_md_ind ); #else ivas_enc_cov_handler_process( hMCParamUpmix->hCovEnc[b], pp_in_fr_real, pp_in_fr_imag, cov_real, cov_dtx_real, hMCParamUpmix->hFbMixer->pFb, 0, hMCParamUpmix->hFbMixer->pFb->filterbank_num_bands, MC_PARAMUPMIX_NCH, 0 /*dtx_vad*/, transient_det[b] ); diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index a07a22a6e9..a7c359b7c9 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -89,7 +89,7 @@ ivas_error ivas_spar_enc_open( input_Fs = hEncoderConfig->input_Fs; sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); nchan_inp = ivas_sba_get_nchan_metadata( sba_order_internal -#ifdef SPAR_TUNING +#ifdef HODIRAC , hEncoderConfig->ivas_total_brate #endif @@ -472,7 +472,7 @@ static ivas_error ivas_spar_enc_process( input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); sba_order = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); nchan_inp = ivas_sba_get_nchan_metadata( sba_order -#ifdef SPAR_TUNING +#ifdef HODIRAC , hEncoderConfig->ivas_total_brate #endif @@ -540,7 +540,7 @@ static ivas_error ivas_spar_enc_process( /* run Filter Bank overlapping MDFT analysis first, then we can use the temporary buffer for Parameter MDFT analysis*/ ivas_fb_mixer_pcm_ingest( hSpar->hFbMixer, data_f, p_pcm_tmp, input_frame -#ifdef SPAR_TUNING +#ifdef HODIRAC , hSpar->hMdEnc->HOA_md_ind #endif @@ -751,7 +751,7 @@ static ivas_error ivas_spar_enc_process( nchan_inp, dtx_vad, transient_det -#ifdef SPAR_TUNING +#ifdef HODIRAC , hSpar->hMdEnc->HOA_md_ind #endif @@ -767,7 +767,7 @@ static ivas_error ivas_spar_enc_process( ivas_spar_md_enc_process( hSpar->hMdEnc, hEncoderConfig, cov_real, cov_dtx_real, hMetaData, dtx_vad, nchan_inp, sba_order, hSpar->hFbMixer->prior_mixer ); } -#ifdef SPAR_TUNING +#ifdef HODIRAC if ( hSpar->hMdEnc->spar_hoa_dirac2spar_md_flag ) #endif { diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index d27f149b6d..4f9882cd24 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -120,7 +120,7 @@ ivas_error ivas_spar_md_enc_open( } num_channels = ivas_sba_get_nchan_metadata( sba_order -#ifdef SPAR_TUNING +#ifdef HODIRAC , hEncoderConfig->ivas_total_brate #endif @@ -319,18 +319,18 @@ ivas_error ivas_spar_md_enc_init( float PR_minmax[2]; int16_t num_channels, i, j, k; -#ifdef SPAR_TUNING +#ifdef HODIRAC ivas_sba_get_spar_hoa_md_flag( sba_order, hEncoderConfig->ivas_total_brate, &hMdEnc->spar_hoa_md_flag, &hMdEnc->spar_hoa_dirac2spar_md_flag ); #else hMdEnc->spar_hoa_md_flag = ivas_sba_get_spar_hoa_md_flag( sba_order, hEncoderConfig->ivas_total_brate ); #endif num_channels = ivas_sba_get_nchan_metadata( sba_order -#ifdef SPAR_TUNING +#ifdef HODIRAC , hEncoderConfig->ivas_total_brate #endif ); -#ifdef SPAR_TUNING +#ifdef HODIRAC ivas_sba_get_spar_hoa_ch_ind( num_channels, hEncoderConfig->ivas_total_brate, hMdEnc->HOA_md_ind ); #endif table_idx = ivas_get_spar_table_idx( hEncoderConfig->ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL ); @@ -581,7 +581,7 @@ ivas_error ivas_spar_md_enc_process( num_quant_strats = hMdEnc->spar_md_cfg.num_quant_strats; num_ch = ivas_sba_get_nchan_metadata( sba_order -#ifdef SPAR_TUNING +#ifdef HODIRAC , hEncoderConfig->ivas_total_brate #endif @@ -657,7 +657,7 @@ ivas_error ivas_spar_md_enc_process( nB = num_bands; bands_bw = 1; } -#ifdef SPAR_TUNING +#ifdef HODIRAC if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) #else if ( hMdEnc->spar_hoa_md_flag ) @@ -838,7 +838,7 @@ ivas_error ivas_spar_md_enc_process( } } -#ifdef SPAR_TUNING +#ifdef HODIRAC if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) #else if ( hMdEnc->spar_hoa_md_flag ) @@ -1431,7 +1431,7 @@ static void ivas_get_huffman_coded_bs( pred_coeff_dim = ndm + ndec - 1; pred_offset = 0; -#ifdef SPAR_TUNING +#ifdef HODIRAC if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) #else if ( hMdEnc->spar_hoa_md_flag ) @@ -1542,7 +1542,7 @@ static void ivas_get_arith_coded_bs( { pred_cell_dims[i].dim1 = ndm + ndec - 1; if ( hMdEnc->spar_hoa_md_flag -#ifdef SPAR_TUNING +#ifdef HODIRAC && hMdEnc->spar_hoa_dirac2spar_md_flag #endif ) @@ -1571,7 +1571,7 @@ static void ivas_get_arith_coded_bs( break; } } -#ifdef SPAR_TUNING +#ifdef HODIRAC if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) #else if ( hMdEnc->spar_hoa_md_flag ) @@ -1605,7 +1605,7 @@ static void ivas_get_arith_coded_bs( ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.pred_arith_re[qsi], &hMdEnc->arith_coeffs.pred_arith_re_diff[qsi], pDo_diff, nB, symbol_arr_re, symbol_arr_old_re, pred_cell_dims, hMetaData, any_diff ); -#ifdef SPAR_TUNING +#ifdef HODIRAC if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) #else if ( hMdEnc->spar_hoa_md_flag ) diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 8ba9484661..58b7797662 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -656,7 +656,7 @@ typedef struct ivas_spar_md_enc_state_t ivas_huff_coeffs_t huff_coeffs; int16_t table_idx; int16_t spar_hoa_md_flag; -#ifdef SPAR_TUNING +#ifdef HODIRAC int16_t spar_hoa_dirac2spar_md_flag; int16_t HOA_md_ind[IVAS_SPAR_MAX_CH]; #endif -- GitLab From 1c90dbe2b064924954b227c74002862f30a222c7 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Thu, 11 May 2023 14:50:02 +0200 Subject: [PATCH 118/331] remove debug switches --- lib_com/options.h | 8 ---- lib_dec/ivas_dirac_dec.c | 88 ---------------------------------------- lib_enc/ivas_dirac_enc.c | 41 +------------------ 3 files changed, 1 insertion(+), 136 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 0461548a3d..e3021fdcfc 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -197,14 +197,6 @@ #define HODIRAC /* FhG: Contribution 32: Sector-based HO-DirAC method for SBA at high bitrates */ -/*#define HODIRAC_DEBUG*/ - -#ifdef HODIRAC_DEBUG -//#define HODIRAC_CHECK_VALUE_RANGE -//#define HODIRAC_WRITE_PARAMS -//#define HODIRAC_READ_PARAMS -#endif - /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 6f46397305..43896f8799 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -2058,14 +2058,6 @@ void ivas_qmetadata_to_dirac( int16_t no_secs = 1; #endif -#ifdef HODIRAC_READ_PARAMS - static FILE *f_secparams = 0; - if ( f_secparams == 0 ) - { - f_secparams = fopen( "sector_params.txt", "r" ); - } -#endif - q_direction = &( hQMetaData->q_direction[0] ); hDirAC->numSimultaneousDirections = hQMetaData->no_directions; @@ -2200,38 +2192,6 @@ void ivas_qmetadata_to_dirac( } } -#ifdef HODIRAC_READ_PARAMS - /* popular sector parameters from file */ - int16_t idx_f; - int idx_f_f, idx_sec_f; - float azi_secs[4][4][DIRAC_MAX_NBANDS], ele_secs[4][4][DIRAC_MAX_NBANDS], ene_secs[4][4][DIRAC_MAX_NBANDS], diff_secs[4][4][DIRAC_MAX_NBANDS], diff[4][DIRAC_MAX_NBANDS]; - assert( hDirAC->nb_subframes <= 4 ); - for ( block = 0; block < hDirAC->nb_subframes; block++ ) - { - int16_t block_qmetadata; - - block_qmetadata = min( block, nblocks - 1 ); - block_qmetadata = max( block_qmetadata, 0 ); - - assert( block_qmetadata == block ); // does this ever happen? - for ( idx_f = 0; idx_f < nbands; idx_f++ ) - { - for ( idx_sec = 0; idx_sec < 4; idx_sec++ ) - { - if ( 7 != fscanf( f_secparams, "%i %i %f %f %f %f %f\n", &idx_f_f, &idx_sec_f, &azi_secs[block_qmetadata][idx_sec][idx_f], &ele_secs[block_qmetadata][idx_sec][idx_f], &ene_secs[block_qmetadata][idx_sec][idx_f], &diff_secs[block_qmetadata][idx_sec][idx_f], &diff[block_qmetadata][idx_f] ) ) - { - printf( "ERROR reading parameters!\n" ); - exit( -1 ); - } - if ( azi_secs[block_qmetadata][idx_sec][idx_f] < 0.f ) - { - azi_secs[block_qmetadata][idx_sec][idx_f] += 360.f; - } - } - } - } -#endif - /* Low-Bands with no spatial data transmitted, analysis at decoder side */ for ( band = 0; band < start_band; band++ ) { @@ -2315,22 +2275,6 @@ void ivas_qmetadata_to_dirac( elevation = q_direction->band_data[qBand_idx].elevation[block_qmetadata]; } -#ifdef HODIRAC_READ_PARAMS - int16_t tmp_i; - tmp_i = 0; - ( idx_sec == 0 ) ? ( tmp_i = 1 ) : ( ( idx_sec == 1 ) ? ( tmp_i = 2 ) : ( tmp_i = -99 ) ); - assert( tmp_i < 3 ); - azimuth = azi_secs[block_qmetadata][tmp_i][qBand_idx]; - elevation = ele_secs[block_qmetadata][tmp_i][qBand_idx]; - diffuseness = diff[block_qmetadata][qBand_idx]; - - if ( azimuth < 0.f ) - { - azimuth += 360.f; - } - diffuseness_sec = 1.f - ( diff_secs[block_qmetadata][1][qBand_idx] / ( diff_secs[block_qmetadata][1][qBand_idx] + diff_secs[block_qmetadata][2][qBand_idx] + EPSILON ) ); -#endif - for ( b = band_start; b < band_end; b++ ) { tmp_write_idx_band = tmp_write_idx_param_band; @@ -2453,38 +2397,6 @@ void ivas_qmetadata_to_dirac( } } -#ifdef HODIRAC_WRITE_PARAMS - if ( hMasa == NULL && sba_analysis_order > 1 && ivas_total_brate > IVAS_256k ) - { - static FILE *f_params = 0; - int16_t tmp_write_idx_band = 0; - - if ( f_params == 0 ) - f_params = fopen( "param_dec", "w" ); - - tmp_write_idx_band = hDirAC->dirac_bs_md_write_idx; - for ( block = 0; block < hDirAC->nb_subframes; block++ ) - { - int16_t block_qmetadata; - - block_qmetadata = min( block, nblocks - 1 ); - block_qmetadata = max( block_qmetadata, 0 ); - - for ( band = 0; band < hDirAC->num_freq_bands; band++ ) - { - fprintf( f_params, "%d ", hDirAC->azimuth[tmp_write_idx_band][band] ); - fprintf( f_params, "%d ", hDirAC->elevation[tmp_write_idx_band][band] ); - fprintf( f_params, "%f ", hDirAC->diffuseness_vector[tmp_write_idx_band][band] ); - - fprintf( f_params, "%d ", hDirAC->azimuth2[tmp_write_idx_band][band] ); - fprintf( f_params, "%d ", hDirAC->elevation2[tmp_write_idx_band][band] ); - fprintf( f_params, "%f\n", 1.0f - hDirAC->energy_ratio2[tmp_write_idx_band][band] ); - } - tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length; - } - } -#endif - /* update buffer write index */ if ( hDirAC->hConfig->dec_param_estim == FALSE ) { diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index dd6e2ee3fc..e3d2f23b67 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -662,24 +662,13 @@ void ivas_dirac_param_est_enc( float ene_secs[2 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS] = { 0 }; #endif -#ifdef HODIRAC_WRITE_PARAMS - static FILE *f_secparams = 0; -#endif - push_wmops( "dirac_enc_param_est" ); #ifdef HODIRAC num_freq_bands = hDirAC->hConfig->nbands; #endif -#ifdef HODIRAC_WRITE_PARAMS - if ( f_secparams == 0 ) - { - f_secparams = fopen( "sector_params.txt", "w" ); - } -#endif - - /* Initialization */ + /* Initialization */ l_ts = input_frame / MAX_PARAM_SPATIAL_SUBFRAMES; if ( useLowerRes ) { @@ -830,20 +819,6 @@ void ivas_dirac_param_est_enc( calculate_hodirac_sector_parameters( Cldfb_RealBuffer, Cldfb_ImagBuffer, l_ts, 0.20f, hDirAC->band_grouping, hDirAC->hConfig->nbands, hDirAC->hConfig->enc_param_start_band, azi_secs, ele_secs, diff_secs, ene_secs ); -#ifdef HODIRAC_WRITE_PARAMS - for ( i = 0; i < num_freq_bands; i++ ) - { - for ( uint16_t j = 0; j < 4; j++ ) - { - fprintf( f_secparams, "%d %d %f %f %f %f %f\n", i, j, - azi_secs[j * num_freq_bands + i], - ele_secs[j * num_freq_bands + i], - ene_secs[j * num_freq_bands + i], - diff_secs[j * num_freq_bands + i], - diffuseness_vector[i] ); - } - } -#endif } #endif @@ -928,20 +903,6 @@ void ivas_dirac_param_est_enc( q_direction[1].band_data[band_m_idx].azimuth[block_m_idx] = azi_secs[num_freq_bands + band_m_idx]; q_direction[1].band_data[band_m_idx].elevation[block_m_idx] = ele_secs[num_freq_bands + band_m_idx]; q_direction[1].band_data[band_m_idx].energy_ratio[block_m_idx] = ( 1.f - diff_secs[band_m_idx] ) / ( ( 1.f - diff_secs[band_m_idx] ) + ( 1.f - diff_secs[num_freq_bands + band_m_idx] ) + EPSILON ); -#ifdef HODIRAC_WRITE_PARAMS - { - static FILE *f_a = 0; - if ( f_a == 0 ) - f_a = fopen( "param_enc", "w" ); - fprintf( f_a, "%f %f %f %f %f %f\n", - q_direction->band_data[band_m_idx].azimuth[block_m_idx], - q_direction->band_data[band_m_idx].elevation[block_m_idx], - diffuseness_vector[band_m_idx], - q_direction[1].band_data[band_m_idx].azimuth[block_m_idx], - q_direction[1].band_data[band_m_idx].elevation[block_m_idx], - q_direction[1].band_data[band_m_idx].energy_ratio[block_m_idx] ); - } -#endif } } #endif -- GitLab From 141240aee743671ff0b8f50e63b184421950da05 Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 11 May 2023 15:07:01 +0200 Subject: [PATCH 119/331] harmonize DirAC parameters allocation/deallocation; under DIRAC_ALLOC_HARM --- lib_com/ivas_prot.h | 14 ++ lib_com/options.h | 2 + lib_dec/ivas_dirac_dec.c | 351 ++++++++++++++++++++++++++++++++++- lib_dec/ivas_ism_param_dec.c | 18 ++ 4 files changed, 383 insertions(+), 2 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 0ee94724d2..8197ff3f7a 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3457,6 +3457,13 @@ ivas_error ivas_dirac_dec_open( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); +#ifdef DIRAC_ALLOC_HARM +ivas_error ivas_dirac_allocate_parameters( + DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ + const int16_t params_flag /* i : set of parameters flag */ +); +#endif + ivas_error ivas_dirac_dec_config( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const DIRAC_CONFIG_FLAG flag_configopen /* i/ : Flag determining if we open or reconfigure the DirAC decoder */ @@ -3466,6 +3473,13 @@ void ivas_dirac_dec_close( DIRAC_DEC_HANDLE *hDirAC /* i/o: decoder DirAC handle */ ); +#ifdef DIRAC_ALLOC_HARM +void ivas_dirac_deallocate_parameters( + DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ + const int16_t params_flag /* i : set of parameters flag */ +); +#endif + void ivas_dirac_dec_read_BS( const int32_t ivas_total_brate, /* i : IVAS total bitrate */ Decoder_State *st, /* i/o: decoder Core state structure */ diff --git a/lib_com/options.h b/lib_com/options.h index b1c9c099a9..7745495383 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -209,6 +209,8 @@ //#define HODIRAC_WRITE_PARAMS //#define HODIRAC_READ_PARAMS #endif +#define DIRAC_ALLOC_HARM /* VA: harmonize DirAC parameters allocation/deallocation */ + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 1518a2fe98..6f023e987f 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -113,6 +113,146 @@ ivas_error ivas_dirac_dec_open( } +#ifdef DIRAC_ALLOC_HARM +/*------------------------------------------------------------------------- + * ivas_dirac_allocate_parameters() + * + * Allocate and initialize DirAC parameters + *-------------------------------------------------------------------------*/ + +ivas_error ivas_dirac_allocate_parameters( + DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ + const int16_t params_flag /* i : set of parameters flag */ +) +{ + int16_t i; + + if ( params_flag == 1 ) + { + if ( ( hDirAC->azimuth = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + if ( ( hDirAC->elevation = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + if ( ( hDirAC->diffuseness_vector = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + if ( ( hDirAC->energy_ratio1 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + if ( ( hDirAC->spreadCoherence = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + if ( ( hDirAC->surroundingCoherence = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) + { + if ( ( hDirAC->azimuth[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_s( hDirAC->azimuth[i], 0, hDirAC->num_freq_bands ); + + if ( ( hDirAC->elevation[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_s( hDirAC->elevation[i], 0, hDirAC->num_freq_bands ); + + if ( ( hDirAC->diffuseness_vector[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_f( hDirAC->diffuseness_vector[i], 1.0f, hDirAC->num_freq_bands ); + + if ( ( hDirAC->energy_ratio1[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_f( hDirAC->energy_ratio1[i], 0.0f, hDirAC->num_freq_bands ); + + if ( ( hDirAC->spreadCoherence[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_f( hDirAC->spreadCoherence[i], 0.0f, hDirAC->num_freq_bands ); + + if ( ( hDirAC->surroundingCoherence[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_f( hDirAC->surroundingCoherence[i], 0.0f, hDirAC->num_freq_bands ); + } + } + else if ( params_flag == 2 ) + { + if ( ( hDirAC->azimuth2 = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + if ( ( hDirAC->elevation2 = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + if ( ( hDirAC->energy_ratio2 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + if ( ( hDirAC->spreadCoherence2 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) + { + if ( ( hDirAC->azimuth2[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_s( hDirAC->azimuth2[i], 0, hDirAC->num_freq_bands ); + + if ( ( hDirAC->elevation2[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_s( hDirAC->elevation2[i], 0, hDirAC->num_freq_bands ); + + if ( ( hDirAC->energy_ratio2[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_f( hDirAC->energy_ratio2[i], 0.0f, hDirAC->num_freq_bands ); + + if ( ( hDirAC->spreadCoherence2[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_f( hDirAC->spreadCoherence2[i], 0.0f, hDirAC->num_freq_bands ); + } + } + + return IVAS_ERR_OK; +} +#endif + + /*------------------------------------------------------------------------- * ivas_dirac_dec_config() * @@ -281,7 +421,12 @@ ivas_error ivas_dirac_dec_config( { if ( st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k && hDirAC->azimuth2 == NULL ) { - // TODO: the following block is repeated in several places -> introduce new function? +#ifdef DIRAC_ALLOC_HARM + if ( ( error = ivas_dirac_allocate_parameters( hDirAC, 2 ) ) != IVAS_ERR_OK ) + { + return error; + } +#else if ( ( hDirAC->azimuth2 = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); @@ -328,9 +473,13 @@ ivas_error ivas_dirac_dec_config( } set_f( hDirAC->spreadCoherence2[i], 0.0f, hDirAC->num_freq_bands ); } +#endif } else if ( st_ivas->hDecoderConfig->ivas_total_brate <= IVAS_256k && hDirAC->azimuth2 != NULL ) { +#ifdef DIRAC_ALLOC_HARM + ivas_dirac_deallocate_parameters( hDirAC, 2 ); +#else for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) { free( hDirAC->azimuth2[i] ); @@ -348,6 +497,7 @@ ivas_error ivas_dirac_dec_config( hDirAC->elevation2 = NULL; hDirAC->energy_ratio2 = NULL; hDirAC->spreadCoherence2 = NULL; +#endif } } #endif @@ -995,6 +1145,12 @@ ivas_error ivas_dirac_dec_config( } } +#ifdef DIRAC_ALLOC_HARM + if ( ( error = ivas_dirac_allocate_parameters( hDirAC, 1 ) ) != IVAS_ERR_OK ) + { + return error; + } +#else if ( ( hDirAC->azimuth = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); @@ -1063,6 +1219,7 @@ ivas_error ivas_dirac_dec_config( } set_f( hDirAC->surroundingCoherence[i], 0.0f, hDirAC->num_freq_bands ); } +#endif if ( st_ivas->ivas_format == MASA_FORMAT #ifdef HODIRAC @@ -1070,6 +1227,12 @@ ivas_error ivas_dirac_dec_config( #endif ) { +#ifdef DIRAC_ALLOC_HARM + if ( ( error = ivas_dirac_allocate_parameters( hDirAC, 2 ) ) != IVAS_ERR_OK ) + { + return error; + } +#else if ( ( hDirAC->azimuth2 = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); @@ -1116,6 +1279,7 @@ ivas_error ivas_dirac_dec_config( } set_f( hDirAC->spreadCoherence2[i], 0.0f, hDirAC->num_freq_bands ); } +#endif } else { @@ -1139,7 +1303,9 @@ ivas_error ivas_dirac_dec_config( { if ( ( hDirAC->hConfig->dec_param_estim_old != hDirAC->hConfig->dec_param_estim ) ) { - +#ifdef DIRAC_ALLOC_HARM + ivas_dirac_deallocate_parameters( hDirAC, 1 ); +#else for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) { if ( hDirAC->azimuth[i] != NULL ) @@ -1203,12 +1369,20 @@ ivas_error ivas_dirac_dec_config( free( hDirAC->surroundingCoherence ); hDirAC->surroundingCoherence = NULL; } +#endif } hDirAC->dirac_md_buffer_length = ( MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_DIRAC_PARAM_DEC_SFR ) * num_slots_in_subfr; hDirAC->dirac_bs_md_write_idx = DELAY_DIRAC_PARAM_DEC_SFR * num_slots_in_subfr; hDirAC->spar_to_dirac_write_idx = DELAY_DIRAC_PARAM_DEC_SFR * num_slots_in_subfr; hDirAC->dirac_read_idx = 0; hDirAC->dirac_estimator_idx = 0; + +#ifdef DIRAC_ALLOC_HARM + if ( ( error = ivas_dirac_allocate_parameters( hDirAC, 1 ) ) != IVAS_ERR_OK ) + { + return error; + } +#else if ( ( hDirAC->azimuth = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); @@ -1276,6 +1450,7 @@ ivas_error ivas_dirac_dec_config( } set_f( hDirAC->surroundingCoherence[i], 0.0f, hDirAC->num_freq_bands ); } +#endif } } #endif @@ -1380,6 +1555,10 @@ void ivas_dirac_dec_close( hDirAC->buffer_energy = NULL; } +#ifdef DIRAC_ALLOC_HARM + ivas_dirac_deallocate_parameters( hDirAC, 1 ); + ivas_dirac_deallocate_parameters( hDirAC, 2 ); +#else for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) { if ( hDirAC->azimuth[i] != NULL ) @@ -1512,6 +1691,7 @@ void ivas_dirac_dec_close( free( hDirAC->surroundingCoherence ); hDirAC->surroundingCoherence = NULL; } +#endif if ( hDirAC->masa_stereo_type_detect != NULL ) { @@ -1528,6 +1708,173 @@ void ivas_dirac_dec_close( } +#ifdef DIRAC_ALLOC_HARM +/*------------------------------------------------------------------------- + * ivas_dirac_deallocate_parameters() + * + * Deallocate DirAC parameters + *-------------------------------------------------------------------------*/ + +void ivas_dirac_deallocate_parameters( + DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ + const int16_t params_flag /* i : set of parameters flag */ +) +{ + int16_t i; + + if ( params_flag == 1 ) + { + if ( hDirAC->azimuth != NULL ) + { + for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) + { + if ( hDirAC->azimuth[i] != NULL ) + { + free( hDirAC->azimuth[i] ); + hDirAC->azimuth[i] = NULL; + } + } + + free( hDirAC->azimuth ); + hDirAC->azimuth = NULL; + } + + if ( hDirAC->elevation != NULL ) + { + for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) + { + if ( hDirAC->elevation[i] != NULL ) + { + free( hDirAC->elevation[i] ); + hDirAC->elevation[i] = NULL; + } + } + + free( hDirAC->elevation ); + hDirAC->elevation = NULL; + } + + if ( hDirAC->energy_ratio1 != NULL ) + { + for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) + { + if ( hDirAC->energy_ratio1[i] != NULL ) + { + free( hDirAC->energy_ratio1[i] ); + hDirAC->energy_ratio1[i] = NULL; + } + } + free( hDirAC->energy_ratio1 ); + hDirAC->energy_ratio1 = NULL; + } + + if ( hDirAC->diffuseness_vector != NULL ) + { + for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) + { + if ( hDirAC->diffuseness_vector[i] != NULL ) + { + free( hDirAC->diffuseness_vector[i] ); + hDirAC->diffuseness_vector[i] = NULL; + } + } + + free( hDirAC->diffuseness_vector ); + hDirAC->diffuseness_vector = NULL; + } + + if ( hDirAC->spreadCoherence != NULL ) + { + for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) + { + if ( hDirAC->spreadCoherence[i] != NULL ) + { + free( hDirAC->spreadCoherence[i] ); + hDirAC->spreadCoherence[i] = NULL; + } + } + free( hDirAC->spreadCoherence ); + hDirAC->spreadCoherence = NULL; + } + + if ( hDirAC->surroundingCoherence != NULL ) + { + for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) + { + if ( hDirAC->surroundingCoherence[i] != NULL ) + { + free( hDirAC->surroundingCoherence[i] ); + hDirAC->surroundingCoherence[i] = NULL; + } + } + free( hDirAC->surroundingCoherence ); + hDirAC->surroundingCoherence = NULL; + } + } + else if ( params_flag == 2 ) + { + if ( hDirAC->azimuth2 != NULL ) + { + for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) + { + if ( hDirAC->azimuth2[i] != NULL ) + { + free( hDirAC->azimuth2[i] ); + hDirAC->azimuth2[i] = NULL; + } + } + free( hDirAC->azimuth2 ); + hDirAC->azimuth2 = NULL; + } + + if ( hDirAC->elevation2 != NULL ) + { + for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) + { + if ( hDirAC->elevation2[i] != NULL ) + { + free( hDirAC->elevation2[i] ); + hDirAC->elevation2[i] = NULL; + } + } + free( hDirAC->elevation2 ); + hDirAC->elevation2 = NULL; + } + + if ( hDirAC->energy_ratio2 != NULL ) + { + for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) + { + if ( hDirAC->energy_ratio2[i] != NULL ) + { + free( hDirAC->energy_ratio2[i] ); + hDirAC->energy_ratio2[i] = NULL; + } + } + free( hDirAC->energy_ratio2 ); + hDirAC->energy_ratio2 = NULL; + } + + if ( hDirAC->spreadCoherence2 != NULL ) + { + for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) + { + if ( hDirAC->spreadCoherence2[i] != NULL ) + { + free( hDirAC->spreadCoherence2[i] ); + hDirAC->spreadCoherence2[i] = NULL; + } + } + free( hDirAC->spreadCoherence2 ); + hDirAC->spreadCoherence2 = NULL; + } + } + + return; +} +#endif + + /*------------------------------------------------------------------------- * ivas_dirac_alloc_mem() * diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index 244bf1f398..e8e1309ff3 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -495,6 +495,18 @@ ivas_error ivas_param_ism_dec_open( if ( ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) { hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES; + +#ifdef DIRAC_ALLOC_HARM + if ( ( error = ivas_dirac_allocate_parameters( hDirAC, 1 ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_dirac_allocate_parameters( hDirAC, 2 ) ) != IVAS_ERR_OK ) + { + return error; + } +#else if ( ( hDirAC->azimuth = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); @@ -596,6 +608,7 @@ ivas_error ivas_param_ism_dec_open( } set_f( hDirAC->surroundingCoherence[i], 0.0f, hDirAC->num_freq_bands ); } +#endif } st_ivas->hISMDTX.dtx_flag = 0; @@ -637,6 +650,10 @@ void ivas_param_ism_dec_close( if ( ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) { +#ifdef DIRAC_ALLOC_HARM + ivas_dirac_deallocate_parameters( hDirAC, 1 ); + ivas_dirac_deallocate_parameters( hDirAC, 2 ); +#else for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) { if ( hDirAC->azimuth[i] != NULL ) @@ -760,6 +777,7 @@ void ivas_param_ism_dec_close( free( hDirAC->surroundingCoherence ); hDirAC->surroundingCoherence = NULL; } +#endif } if ( !( output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) ) -- GitLab From d0225f1edc3b74fbb419e1a379c8550707025bdc Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Thu, 11 May 2023 15:12:53 +0200 Subject: [PATCH 120/331] Orientation tracking parameter aspects --- lib_rend/lib_rend.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 8632ca456f..8aa44ef8ea 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -3899,9 +3899,9 @@ ivas_error IVAS_REND_SetOrientationTrackingMode( { return error; } -#endif return IVAS_ERR_OK; +#endif } -- GitLab From eb854ba675f82f75bdcd023141818c6300b926aa Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 11 May 2023 15:17:59 +0200 Subject: [PATCH 121/331] uncommitted change under DIRAC_ALLOC_HARM --- lib_dec/ivas_ism_param_dec.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index e8e1309ff3..4d611743d8 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -631,7 +631,9 @@ void ivas_param_ism_dec_close( AUDIO_CONFIG output_config /* i : output audio configuration */ ) { +#ifndef DIRAC_ALLOC_HARM int16_t i; +#endif DIRAC_DEC_HANDLE hDirAC; if ( hDirAC_out == NULL || *hDirAC_out == NULL ) -- GitLab From 2a22d69a5aa9fe315a4fbb85e6c5470cc44b80d8 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Thu, 11 May 2023 15:26:46 +0200 Subject: [PATCH 122/331] remove left-over debug code in calculate_hodirac_sector_parameters --- lib_com/ivas_dirac_com.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index 9dae5449a9..01f92ca1dd 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -1099,10 +1099,6 @@ void calculate_hodirac_sector_parameters( *p_azi_prev = *p_azi; *p_ele_prev = *p_ele; } -#ifdef HODIRAC_CHECK_VALUE_RANGE - assert( *p_azi >= -180.f && *p_azi <= 180.f ); - assert( *p_ele >= -90.f && *p_ele <= 90.f ); -#endif } } -- GitLab From e9637087aa598a47d8029e4e0c33df3797a853fe Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Thu, 11 May 2023 15:58:36 +0200 Subject: [PATCH 123/331] fix formatting --- lib_enc/ivas_dirac_enc.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index e3d2f23b67..afea049d25 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -668,7 +668,7 @@ void ivas_dirac_param_est_enc( num_freq_bands = hDirAC->hConfig->nbands; #endif - /* Initialization */ + /* Initialization */ l_ts = input_frame / MAX_PARAM_SPATIAL_SUBFRAMES; if ( useLowerRes ) { @@ -818,7 +818,6 @@ void ivas_dirac_param_est_enc( { calculate_hodirac_sector_parameters( Cldfb_RealBuffer, Cldfb_ImagBuffer, l_ts, 0.20f, hDirAC->band_grouping, hDirAC->hConfig->nbands, hDirAC->hConfig->enc_param_start_band, azi_secs, ele_secs, diff_secs, ene_secs ); - } #endif -- GitLab From 30b64a5be322ee705ff3d41cf471bf589a5b12ac Mon Sep 17 00:00:00 2001 From: Shikha Shetgeri <100861@ittiam.com> Date: Thu, 11 May 2023 19:46:52 +0530 Subject: [PATCH 124/331] Added two test cases for initial SID frame --- scripts/config/self_test.prm | 7 +++++++ scripts/cut_bs.py | 6 +++--- tests/test_param_file.py | 35 +++++++++++++++++++++++++++++++++-- 3 files changed, 43 insertions(+), 5 deletions(-) diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index 429abcf2e6..5ed7f65782 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -649,6 +649,13 @@ ../IVAS_dec HOA3 32 bit testv/stv3OA32c.wav_sw_32-32_DTX_HOA3.tst +// SBA FOA at 13.2 kbps , 32kHz in, 32kHz out, DTX on, BINAURAL out, SID as first frame +../IVAS_cod -dtx -sba 1 13200 32 testv/stvFOA32c.wav bit +../IVAS_dec BINAURAL 32 bit testv/stvFOA32c.wav_BINAURAL_13200_32-32_DTX_SID.tst + +// SBA FOA at 24.4 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL out, SID as first frame +../IVAS_cod -dtx -sba 1 24400 32 testv/stvFOA32c.wav bit +../IVAS_dec BINAURAL 32 bit testv/stvFOA32c.wav_BINAURAL_13200_32-32_DTX_SID.tst // MASA 1dir 1TC at 13.2 kbps, 48kHz in, 48kHz out, BINAURAL out ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 13200 48 testv/stv1MASA1TC48c.wav bit diff --git a/scripts/cut_bs.py b/scripts/cut_bs.py index 5fee9845e7..c0ae6e1933 100755 --- a/scripts/cut_bs.py +++ b/scripts/cut_bs.py @@ -35,11 +35,12 @@ import argparse import os.path import sys -SID_BITS = {35, 48, 88, 100} +#SID_BITS = {35, 48, 88, 100} +SID_BITS = {35, 48, 104} SYNC_WORDS = {b"!k", b" k"} -def cut_bs(fp, fp_out, start_frame=0, start_with_sid=False): +def cut_bs(fp, fp_out, start_frame = 0, start_with_sid = False): # cut until start frame fr_cnt = 0 cut_cnt = 0 @@ -86,7 +87,6 @@ def cut_bs(fp, fp_out, start_frame=0, start_with_sid=False): fp_out.write(n_bits_bs) fp_out.write(fp.read(n_bits * 2)) fr_cnt += 1 - return (fr_cnt, cut_cnt) diff --git a/tests/test_param_file.py b/tests/test_param_file.py index 7774d59403..7b3f172daf 100644 --- a/tests/test_param_file.py +++ b/tests/test_param_file.py @@ -43,7 +43,7 @@ from cmp_pcm import cmp_pcm from cut_pcm import cut_samples from conftest import EncoderFrontend, DecoderFrontend from testconfig import PARAM_FILE - +from cut_bs import cut_bs VALID_DEC_OUTPUT_CONF = [ "MONO", @@ -162,6 +162,17 @@ def test_param_file_tests( sba_br_switching_dtx = 1 cut_file = pre_proc_input(testv_file, fs) testv_file = cut_file + #SID + sba_dtx_first_SID = 0 + if ( + bitrate.isdigit() + and "-dtx" in enc_opts.split() + and "-sba" in enc_opts.split() + and "SID" in tag_str.split('_') + ): + sba_dtx_first_SID = 1 + cut_file = pre_proc_input(testv_file, fs) + testv_file = cut_file # bitrate can be a filename: remove leading "../" if bitrate.startswith("../"): @@ -188,7 +199,27 @@ def test_param_file_tests( enc_split, update_ref, ) - if sba_br_switching_dtx == 1: + # SID : Update bitstream + if sba_dtx_first_SID == 1: + dut_out_dir = f"{dut_base_path}\\param_file\\enc" + ref_out_dir = f"{reference_path}\\param_file\\enc" + ref_out_file = f"{ref_out_dir}\\{bitstream_file}" + dut_out_file = f"{dut_out_dir}\\{bitstream_file}" + ref_out_file_cut = ref_out_file +"_cut" + dut_out_file_cut = dut_out_file +"_cut" + + if update_ref == 1 or update_ref == 2 and not os.path.exists(ref_out_file): + with open(ref_out_file, "rb") as fp_in: + with open(ref_out_file_cut, "wb") as fp_out: + fr_cnt, cut_cnt = cut_bs(fp_in, fp_out, 0, True) + if update_ref in [0, 2]: + with open(dut_out_file, "rb") as fp_in: + with open(dut_out_file_cut, "wb") as fp_out: + fr_cnt, cut_cnt = cut_bs(fp_in, fp_out, 0, True) + + bitstream_file = bitstream_file +"_cut" + + if sba_br_switching_dtx == 1 or sba_dtx_first_SID == 1: is_exist = os.path.exists(cut_file) if is_exist: os.remove(cut_file) -- GitLab From 1958d7df6155a7dc1078812391b200334aba50c3 Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Thu, 11 May 2023 16:21:31 +0200 Subject: [PATCH 125/331] Cleanup --- lib_com/ivas_cnst.h | 2 +- lib_dec/ivas_stat_dec.h | 2 +- lib_dec/lib_dec.c | 2 +- lib_dec/lib_dec.h | 2 +- lib_rend/ivas_orient_trk.c | 4 ++-- lib_rend/ivas_prot_rend.h | 2 +- lib_rend/ivas_stat_rend.h | 2 +- lib_rend/lib_rend.c | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 1d4c36e49b..d764ad95e9 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1608,7 +1608,7 @@ typedef enum HEAD_ORIENT_TRK_AVG, HEAD_ORIENT_TRK_REF_VEC, HEAD_ORIENT_TRK_REF_VEC_LEV -} HEAD_ORIENT_TRK_TYPE; +} HEAD_ORIENT_TRK_T; #else #define IVAS_ORIENT_TRK_NONE 0 #define IVAS_ORIENT_TRK_REF 1 diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 16d5404243..dae7ea68c3 100755 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -1175,7 +1175,7 @@ typedef struct decoder_config_structure int16_t Opt_Headrotation; /* indicates whether head-rotation is used */ int16_t Opt_RendConfigCustom; /* indicates whether Renderer configuration custom setup is used */ #ifdef FIX_439_OTR_PARAMS - HEAD_ORIENT_TRK_TYPE orientation_tracking; /* indicates orientation tracking type */ + HEAD_ORIENT_TRK_T orientation_tracking; /* indicates orientation tracking type */ #else int16_t orientation_tracking; /* indicates orientation tracking type */ #endif diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 6d9617517d..85bcd76c55 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -402,7 +402,7 @@ ivas_error IVAS_DEC_Configure( const int16_t hrtfReaderEnabled, /* i : enable HRTF binary file input */ const int16_t enableHeadRotation, /* i : enable head rotation for binaural output */ #ifdef FIX_439_OTR_PARAMS - HEAD_ORIENT_TRK_TYPE orientationTracking, /* i : head orientation tracking mode */ + HEAD_ORIENT_TRK_T orientationTracking, /* i : head orientation tracking mode */ #endif const int16_t renderConfigEnabled /* i : enable Renderer config. file for binaural output */ ) diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index 2258361f30..df67102e2c 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -136,7 +136,7 @@ ivas_error IVAS_DEC_Configure( const int16_t hrtfReaderEnabled, /* i : enable HRTF binary file input */ const int16_t enableHeadRotation, /* i : enable head rotation for binaural output */ #ifdef FIX_439_OTR_PARAMS - HEAD_ORIENT_TRK_TYPE orientationTracking, /* i : head orientation tracking mode */ + HEAD_ORIENT_TRK_T orientationTracking, /* i : head orientation tracking mode */ #endif const int16_t renderConfigEnabled /* i : enable Renderer config. file for binaural output */ ); diff --git a/lib_rend/ivas_orient_trk.c b/lib_rend/ivas_orient_trk.c index fd70611d62..de4b589c14 100644 --- a/lib_rend/ivas_orient_trk.c +++ b/lib_rend/ivas_orient_trk.c @@ -408,7 +408,7 @@ ivas_error ivas_orient_trk_Init( /* set safe default tracking mode */ #ifdef FIX_439_OTR_PARAMS pOTR->trackingType = HEAD_ORIENT_TRK_NONE; - #else +#else pOTR->trackingType = OTR_TRACKING_NONE; #endif @@ -425,7 +425,7 @@ ivas_error ivas_orient_trk_Init( ivas_error ivas_orient_trk_SetTrackingType( ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ #ifdef FIX_439_OTR_PARAMS - HEAD_ORIENT_TRK_TYPE trackingType /* i/o: orientation tracking type */ + HEAD_ORIENT_TRK_T trackingType /* i/o: orientation tracking type */ #else const OTR_TRACKING_T trackingType /* i/o: orientation tracking type */ #endif diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 6b39e611d8..55ff934168 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -874,7 +874,7 @@ ivas_error ivas_orient_trk_Init( ivas_error ivas_orient_trk_SetTrackingType( ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ #ifdef FIX_439_OTR_PARAMS - HEAD_ORIENT_TRK_TYPE trackingType /* i : orientation tracking type */ + HEAD_ORIENT_TRK_T trackingType /* i : orientation tracking type */ #else const OTR_TRACKING_T trackingType /* i : orientation tracking type */ #endif diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 94db3e5242..230fda130a 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -229,7 +229,7 @@ typedef struct EFAP typedef struct ivas_orient_trk_state_t { #ifdef FIX_439_OTR_PARAMS - HEAD_ORIENT_TRK_TYPE trackingType; + HEAD_ORIENT_TRK_T trackingType; #else OTR_TRACKING_T trackingType; #endif diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 8aa44ef8ea..e889900fe4 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -3858,7 +3858,7 @@ ivas_error IVAS_REND_SetHeadRotation( ivas_error IVAS_REND_SetOrientationTrackingMode( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ #ifdef FIX_439_OTR_PARAMS - HEAD_ORIENT_TRK_TYPE otrMode /* i : Head orientation tracking mode */ + HEAD_ORIENT_TRK_T otrMode /* i : Head orientation tracking mode */ #else const uint8_t otrMode /* i : Orientation tracking mode */ #endif -- GitLab From 4a48efe98bcada01508d4e0164752398971039dc Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Thu, 11 May 2023 16:30:21 +0200 Subject: [PATCH 126/331] small fixes for HO-DirAC, still not BE --- lib_com/ivas_prot.h | 3 ++ lib_dec/ivas_dirac_dec.c | 3 ++ lib_dec/ivas_dirac_output_synthesis_dec.c | 49 +++++++++++++++++++---- lib_dec/ivas_spar_decoder.c | 23 ++++++++++- 4 files changed, 70 insertions(+), 8 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index c4b297c054..5a3947ec19 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3850,6 +3850,9 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( const float *onset_filter #ifdef HODIRAC , +#ifdef JBM_TSM_ON_TCS + const int16_t md_idx, +#endif const int16_t hodirac /* i: flag for sector-based processing */ #endif ); diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 0317eaa4de..3186b1ebf3 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -3626,6 +3626,9 @@ void ivas_dirac_dec_render_sf( p_onset_filter #ifdef HODIRAC , +#ifdef JBM_TSM_ON_TCS + md_idx, +#endif st_ivas->sba_analysis_order > 1 && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k #endif ); diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c index a3f5ef1201..e7ccaeaba7 100644 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -598,7 +598,7 @@ void ivas_dirac_dec_output_synthesis_process_slot( const int16_t nchan_transport /* i : number of transport channels*/ #if !defined( HODIRAC ) || defined( JBM_TSM_ON_TCS ) , - const int16_t index_slot + const int16_t md_idx #endif #ifdef HODIRAC , @@ -655,7 +655,7 @@ void ivas_dirac_dec_output_synthesis_process_slot( #ifdef JBM_TSM_ON_TCS azimuth, elevation, - index_slot, + md_idx, #endif NULL, 2, @@ -666,6 +666,25 @@ void ivas_dirac_dec_output_synthesis_process_slot( { if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { +#ifdef JBM_TSM_ON_TCS + v_multc( hDirAC->energy_ratio1[md_idx], -1.f, aux_buf, num_freq_bands ); + v_addc( aux_buf, 1.f, aux_buf, num_freq_bands ); + mvr2r( hDirAC->energy_ratio1[md_idx], + h_dirac_output_synthesis_state->direct_power_factor, + num_freq_bands ); + mvr2r( aux_buf, + h_dirac_output_synthesis_state->diffuse_power_factor, + num_freq_bands ); + + v_multc( hDirAC->energy_ratio2[md_idx], -1.f, aux_buf, num_freq_bands ); + v_addc( aux_buf, 1.f, aux_buf, num_freq_bands ); + mvr2r( hDirAC->energy_ratio2[md_idx], + &h_dirac_output_synthesis_state->direct_power_factor[hDirAC->num_freq_bands], + num_freq_bands ); + mvr2r( aux_buf, + &h_dirac_output_synthesis_state->diffuse_power_factor[hDirAC->num_freq_bands], + num_freq_bands ); +#else v_multc( hDirAC->energy_ratio1[hDirAC->dirac_read_idx], -1.f, aux_buf, num_freq_bands ); v_addc( aux_buf, 1.f, aux_buf, num_freq_bands ); mvr2r( hDirAC->energy_ratio1[hDirAC->dirac_read_idx], @@ -683,14 +702,23 @@ void ivas_dirac_dec_output_synthesis_process_slot( mvr2r( aux_buf, &h_dirac_output_synthesis_state->diffuse_power_factor[hDirAC->num_freq_bands], num_freq_bands ); +#endif } else { +#ifdef JBM_TSM_ON_TCS + ivas_dirac_dec_compute_gain_factors( num_freq_bands, + hDirAC->diffuseness_vector[md_idx], + h_dirac_output_synthesis_params->max_band_decorr, + h_dirac_output_synthesis_state->direct_power_factor, + h_dirac_output_synthesis_state->diffuse_power_factor ); +#else ivas_dirac_dec_compute_gain_factors( num_freq_bands, hDirAC->diffuseness_vector[hDirAC->dirac_read_idx], h_dirac_output_synthesis_params->max_band_decorr, h_dirac_output_synthesis_state->direct_power_factor, h_dirac_output_synthesis_state->diffuse_power_factor ); +#endif } } else // ( hDirAC->hConfig->dec_param_estim == TRUE ) @@ -724,7 +752,7 @@ void ivas_dirac_dec_output_synthesis_process_slot( { for ( i = 0; i < hDirAC->num_freq_bands; i++ ) { - surCohRatio[i] = hDirAC->surroundingCoherence[index_slot][i]; + surCohRatio[i] = hDirAC->surroundingCoherence[md_idx][i]; } } else @@ -749,7 +777,7 @@ void ivas_dirac_dec_output_synthesis_process_slot( for ( i = 0; i < hDirAC->num_freq_bands; i++ ) { dirEne = hDirAC->h_output_synthesis_psd_state.direct_power_factor[i]; - surCohEner = hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] * hDirAC->surroundingCoherence[index_slot][i]; + surCohEner = hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] * hDirAC->surroundingCoherence[md_idx][i]; hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] -= surCohEner; hDirAC->h_output_synthesis_psd_state.direct_power_factor[i] += surCohEner; @@ -773,7 +801,7 @@ void ivas_dirac_dec_output_synthesis_process_slot( #endif azimuth, elevation, - index_slot, + md_idx, #ifdef MASA_PARAMBIN_SF_MAP NULL, #else @@ -987,10 +1015,13 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( const int16_t nchan_transport, /* i : number of transport channels */ #ifdef JBM_TSM_ON_TCS const int16_t nbslots, /* i : number of slots to process */ -#endif +#endif const float *onset_filter #ifdef HODIRAC , +#ifdef JBM_TSM_ON_TCS + const int16_t md_idx, +#endif const int16_t hodirac /* i: flag for sector-based processing */ #endif ) @@ -1032,7 +1063,11 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( nchan_transport_foa = min( 4, nchan_transport ); #ifdef HODIRAC +#ifdef JBM_TSM_ON_TCS + diffuseness = hDirAC->diffuseness_vector[md_idx]; +#else diffuseness = hDirAC->diffuseness_vector[hDirAC->dirac_read_idx]; +#endif #endif /*-----------------------------------------------------------------* @@ -1098,7 +1133,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( #if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) if ( hDirAC->voip_active == 0 && hDirAC->hConfig->dec_param_estim == FALSE ) #else - if ( hDirAC->hConfig->dec_param_estim == FALSE ) + if ( hDirAC->hConfig->dec_param_estim == FALSE ) #endif { /*Direct gain*/ diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index ffe8240750..7f0b29a2f1 100644 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -1227,7 +1227,7 @@ void ivas_spar_dec_set_render_params( ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, st_ivas->bfi #ifdef SPAR_TUNING , - MAX_PARAM_SPATIAL_SUBFRAMES + ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate ) #endif ); @@ -1350,10 +1350,31 @@ void ivas_spar_dec_upmixer( if ( hSpar->hMdDec->td_decorr_flag ) { ivas_td_decorr_process( hSpar->hTdDecorr, st_ivas->hTcBuffer->tc, pPcm_tmp, output_frame ); +#ifdef SPAR_TUNING + if ( hSpar->hTdDecorr->num_apd_outputs >= ( nchan_internal - nchan_transport ) ) + { + for ( i = 0; i < nchan_internal - nchan_transport; i++ ) + { + mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], st_ivas->hTcBuffer->tc[nchan_internal - 1 - i], output_frame ); + } + } + else + { + for ( i = 0; i < nchan_internal - nchan_transport; i++ ) + { + set_zero( st_ivas->hTcBuffer->tc[nchan_internal - 1 - i], output_frame ); + } + for ( i = 0; i < hSpar->hTdDecorr->num_apd_outputs; i++ ) + { + mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], st_ivas->hTcBuffer->tc[nchan_internal - 1 - i], output_frame ); + } + } +#else for ( i = 0; i < nchan_internal - nchan_transport; i++ ) { mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], st_ivas->hTcBuffer->tc[nchan_internal - 1 - i], output_frame ); } +#endif } -- GitLab From 799edbf9e4bcc3a45361a5aba2610109c64958c9 Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 11 May 2023 16:31:54 +0200 Subject: [PATCH 127/331] review of HR_METADATA --- lib_com/ivas_cnst.h | 6 +- lib_com/ivas_dirac_com.c | 2 +- lib_com/ivas_masa_com.c | 201 ++++++++++++++++++++++++++++++--- lib_com/ivas_prot.h | 142 ++++++++++++----------- lib_com/ivas_qspherical_com.c | 8 +- lib_com/ivas_spar_com.c | 2 +- lib_com/options.h | 2 +- lib_dec/ivas_masa_dec.c | 4 + lib_dec/ivas_qmetadata_dec.c | 207 +++++++++++++++++++--------------- lib_dec/ivas_spar_decoder.c | 2 +- lib_enc/ivas_dirac_enc.c | 3 +- lib_enc/ivas_masa_enc.c | 9 +- lib_enc/ivas_qmetadata_enc.c | 199 ++++++++++++++++---------------- lib_enc/ivas_qspherical_enc.c | 53 ++++----- lib_util/masa_file_reader.c | 23 ++-- 15 files changed, 544 insertions(+), 319 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 05eb9b34ca..0d7afe326c 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1230,10 +1230,10 @@ enum #define MASA_BIT_REDUCT_PARAM 10 #ifdef HR_METADATA -#define MASA_MAXIMUM_TWO_DIR_BANDS 24 -#define NBITS_HR_COH 4 +#define MASA_MAXIMUM_TWO_DIR_BANDS 24 +#define NBITS_HR_COH 4 #else -#define MASA_MAXIMUM_TWO_DIR_BANDS 18 +#define MASA_MAXIMUM_TWO_DIR_BANDS 18 #endif typedef enum { diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index 01f92ca1dd..c7d5c07a1d 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -1120,7 +1120,7 @@ void calculate_hodirac_sector_parameters( * deindex the spherical index for more than 2 bits for the spherical grid *----------------------------------------------------------------------*/ -/* !r: decoded elevation index */ +/*! r: decoded elevation index */ static uint16_t deindex_sph_idx_general( const int16_t idx_sph, /* i : spherical index */ const int16_t no_bits, /* i : number of bits in the spherical grid*/ diff --git a/lib_com/ivas_masa_com.c b/lib_com/ivas_masa_com.c index 02d9939dc4..7c0955436d 100644 --- a/lib_com/ivas_masa_com.c +++ b/lib_com/ivas_masa_com.c @@ -412,12 +412,19 @@ void masa_sample_rate_band_correction( return; } + #ifdef HR_METADATA -/* !r: output index for direction */ +/*------------------------------------------------------------------------- + * index_theta_phi_16() + * + * + *------------------------------------------------------------------------*/ + +/*! r: output index for direction */ uint16_t index_theta_phi_16( - float *p_theta, /* i/o : input elevation to be indexed */ - float *p_phi, /* i/o : input azimuth to be indexed */ - SPHERICAL_GRID_DATA *gridData /* i : generated grid data */ + float *p_theta, /* i/o: input elevation to be indexed */ + float *p_phi, /* i/o: input azimuth to be indexed */ + const SPHERICAL_GRID_DATA *gridData /* i : generated grid data */ ) { float abs_theta; @@ -501,14 +508,21 @@ uint16_t index_theta_phi_16( } } - return idx_sph; } + +/*------------------------------------------------------------------------- + * quantize_phi_masa() + * + * + *------------------------------------------------------------------------*/ + +/*! r: output index */ int16_t quantize_theta( - float x, /* i : theta value to be quantized */ - int16_t no_cb, /* i : number of codewords */ - float *xhat /* o : quantized value */ + float x, /* i : theta value to be quantized */ + const int16_t no_cb, /* i : number of codewords */ + float *xhat /* o : quantized value */ ) { int16_t imin; @@ -540,12 +554,18 @@ int16_t quantize_theta( } -/* !r: index azimuth */ +/*------------------------------------------------------------------------- + * quantize_phi_masa() + * + * + *------------------------------------------------------------------------*/ + +/*! r: index azimuth */ int16_t quantize_phi_masa( - float phi, /* i : azimuth value */ - int16_t flag_delta, /* i : flag indicating if the azimuth codebook is translated or not */ - float *phi_hat, /* o : quantized azimuth */ - const int16_t n /* i : azimuth codebook size */ + float phi, /* i : azimuth value */ + const int16_t flag_delta, /* i : flag indicating if the azimuth codebook is translated or not */ + float *phi_hat, /* o : quantized azimuth */ + const int16_t n /* i : azimuth codebook size */ ) { int16_t id_phi; @@ -587,4 +607,159 @@ int16_t quantize_phi_masa( return id_phi; } + +/*------------------------------------------------------------------------- + * deindex_sph_idx() + * + * deindex the MASA metadata from the input metadata file + *------------------------------------------------------------------------*/ + +void deindex_sph_idx( + const uint16_t sphIndex, /* i : Spherical index */ + const SPHERICAL_GRID_DATA *gridData, /* i : Prepared spherical grid */ + float *theta, /* o : Elevation */ + float *phi /* o : Azimuth */ +) +{ + float ba_crt, del_crt, div_crt, a4_crt; + float estim; + int32_t base_low, base_up; + int16_t n_crt; + int16_t id_th; + int16_t sign_theta; + int16_t id_phi; + int16_t no_th = gridData->no_theta; + const int16_t *n = gridData->no_phi; + const float ba[3] = { + 2.137991118026424e+02f, + 1.244854404591542e+02f, + 1.228408647140870e+02f, + }; + const float del[3] = { 7.998262115303199e+05f, 1.300883976959332e+06f, 1.424072242426373e+06f }; + const float div[3] = { -0.237662341081474f, -0.100938185496887f, -0.092050209205032f }; + const float a4[3] = { -8.415300425381099f, -19.814106922515204f, -21.727272727270197f }; + const uint16_t limit_index1 = 64964, limit_index2 = 47870; + + if ( sphIndex >= limit_index1 ) + { + ba_crt = ba[2]; + div_crt = div[2]; + a4_crt = a4[2]; + del_crt = del[2]; + } + else if ( sphIndex >= limit_index2 ) + { + ba_crt = ba[1]; + div_crt = div[1]; + a4_crt = a4[1]; + del_crt = del[1]; + } + else + { + ba_crt = ba[0]; + div_crt = div[0]; + a4_crt = a4[0]; + del_crt = del[0]; + } + estim = ba_crt + div_crt * sqrtf( del_crt + a4_crt * sphIndex ); + + if ( estim > MASA_NO_CIRCLES ) + { + estim = MASA_NO_CIRCLES; + } + + assert( estim > 0 ); + id_th = (int16_t) roundf( estim ) - 1; + if ( id_th < 0 ) + { + id_th = 0; + } + + if ( id_th == 0 ) + { + base_low = 0; + base_up = n[0]; + } + else + { + estim = MASA_ANGLE_AT_EQUATOR * (float) ( id_th - 0.5f ); + base_low = n[0]; + if ( id_th >= 2 ) + { + if ( id_th == 2 ) + { + base_low += 2 * (int16_t) ceilf( MASA_NTOT2_FAC * ( sinf( estim ) - MASA_ASIN_OFFSET ) ); + } + else + { + base_low += 2 * (int16_t) roundf( MASA_NTOT2_FAC * ( sinf( estim ) - MASA_ASIN_OFFSET ) ); + } + } + base_up = base_low + 2 * n[id_th]; + } + + sign_theta = 1; + + n_crt = n[id_th]; + if ( sphIndex < base_low ) + { + id_th--; + n_crt = n[id_th]; + if ( id_th == 0 ) + { + base_low = 0; + base_up = n_crt; + } + else + { + base_up = base_low; + base_low -= 2 * n[id_th]; + } + assert( sphIndex >= base_low ); + } + else if ( sphIndex >= base_up ) + { + id_th++; + n_crt = n[id_th]; + base_low = base_up; + base_up += 2 * n_crt; + assert( sphIndex < base_up ); + } + + id_phi = (int16_t) ( sphIndex - base_low ); + if ( sphIndex - base_low >= n_crt ) + { + id_phi -= n_crt; + sign_theta = -1; + } + + if ( id_th == 0 ) + { + *theta = 0.f; + *phi = (float) sphIndex * 360 / (float) n_crt - 180; + } + else + { + if ( id_th == no_th - 1 ) + { + id_phi = 0; + *phi = -180; + *theta = 90 * (float) sign_theta; + } + else + { + *theta = id_th * MASA_ANGLE_AT_EQUATOR_DEG * (float) sign_theta; + if ( id_th % 2 == 0 ) + { + *phi = (float) id_phi * 360 / (float) n_crt - 180; + } + else + { + *phi = ( (float) id_phi + 0.5f ) * 360 / (float) n_crt - 180; + } + } + } + + return; +} #endif diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 822a13af0c..e368a46bdd 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -2944,53 +2944,45 @@ ivas_error ivas_qmetadata_enc_encode( IVAS_QMETADATA *hQMetaData /* i/o: q_metadata handle */ #ifdef HODIRAC , - const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ #endif ); #ifdef HR_METADATA - ivas_error ivas_qmetadata_enc_encode_hr_384_512( - BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ - IVAS_QMETADATA *hQMetaData, /* i/o: metadata handle */ - int16_t bits_sph_idx, - int16_t bits_sp_coh -); -int16_t ivas_qmetadata_dec_decode_hr_384_512( - IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: hQMetaData handle */ - uint16_t *bitstream, /* i : bitstream */ - int16_t *index, /* i/o: bitstream position */ - SPHERICAL_GRID_DATA *sph_grid16, /* i: spherical grid for deindexing */ - int16_t bits_sph_idx, - int16_t bits_sp_coh + BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ + IVAS_QMETADATA *hQMetaData, /* i/o: metadata handle */ + const int16_t bits_sph_idx, + const int16_t bits_sp_coh ); void deindex_sph_idx( - const uint16_t sphIndex, /* i : Spherical index */ - const SPHERICAL_GRID_DATA *gridData, /* i : Prepared spherical grid */ - float *theta, /* o : Elevation */ - float *phi /* o : Azimuth */ + const uint16_t sphIndex, /* i : Spherical index */ + const SPHERICAL_GRID_DATA *gridData, /* i : Prepared spherical grid */ + float *theta, /* o : Elevation */ + float *phi /* o : Azimuth */ ); - +/*! r: output index for direction */ uint16_t index_theta_phi_16( - float * p_theta, /* i/o : input elevation to be indexed */ - float * p_phi, /* i/o : input azimuth to be indexed */ - SPHERICAL_GRID_DATA *gridData /* i : generated grid data */ + float * p_theta, /* i/o: input elevation to be indexed */ + float * p_phi, /* i/o: input azimuth to be indexed */ + const SPHERICAL_GRID_DATA *gridData /* i : generated grid data */ ); - int16_t quantize_theta( - float x, /* i : theta value to be quantized */ - int16_t no_cb, /* i : number of codewords */ - float *xhat /* o : quantized value */ +/*! r: output index */ +int16_t quantize_theta( + float x, /* i : theta value to be quantized */ + const int16_t no_cb, /* i : number of codewords */ + float *xhat /* o : quantized value */ ); -/* !r: index azimuth */ - int16_t quantize_phi_masa( - float phi, /* i : azimuth value */ - int16_t flag_delta, /* i : flag indicating if the azimuth codebook is translated or not */ - float *phi_hat, /* o : quantized azimuth */ - const int16_t n /* i : azimuth codebook size */ +/*! r: index azimuth */ +int16_t quantize_phi_masa( + float phi, /* i : azimuth value */ + const int16_t flag_delta, /* i : flag indicating if the azimuth codebook is translated or not */ + float *phi_hat, /* o : quantized azimuth */ + const int16_t n /* i : azimuth codebook size */ ); #endif @@ -3024,6 +3016,18 @@ int16_t ivas_qmetadata_dec_decode( #endif ); +#ifdef HR_METADATA +/*! r: number of bits read */ +int16_t ivas_qmetadata_dec_decode_hr_384_512( + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: hQMetaData handle */ + uint16_t *bitstream, /* i : bitstream */ + int16_t *index, /* i/o: bitstream position */ + const SPHERICAL_GRID_DATA *sph_grid16, /* i : spherical grid for deindexing */ + const int16_t bits_sph_idx, + const int16_t bits_sp_coh +); +#endif + /*! r: number of bits read */ int16_t ivas_qmetadata_dec_sid_decode( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ @@ -3069,7 +3073,7 @@ void restore_metadata_buffer( const int16_t bit_pos_start ); -/* !r: codeword index */ +/*! r: codeword index */ int16_t masa_sq( const float in, /* i : input value */ const float *threshold, /* i : partition */ @@ -3103,11 +3107,11 @@ void quantize_direction_frame( float elevation_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES] #ifdef HR_METADATA , - int16_t is_hr + const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding*/ #endif ); -/* !r: quantized spherical index */ +/*! r: quantized spherical index */ uint16_t quantize_direction( const float theta, /* i : input elevation value */ float phi, /* i : input azimuth value */ @@ -3127,7 +3131,7 @@ int16_t quantize_direction2D( const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ ); -/* !r :companded azimuth value */ +/*! r :companded azimuth value */ float companding_azimuth( const float azi, /* i : input azimuth value */ const MC_LS_SETUP mc_format, /* i : input channel format */ @@ -3135,14 +3139,14 @@ float companding_azimuth( const int16_t direction /* i : direction of companding (direct or inverse)*/ ); -/* !r: index azimuth */ +/*! r: index azimuth */ int16_t quantize_phi_chan_lbr( const float phi, /* i : azimuth value */ float *phi_hat, /* o : quantized azimuth */ const int16_t n /* i : azimuth codebook size */ ); -/* !r: index azimuth */ +/*! r: index azimuth */ int16_t quantize_phi_chan_compand( float phi, /* i : azimuth value */ float *phi_hat, /* o : quantized azimuth */ @@ -3166,7 +3170,7 @@ void small_requantize_direction_frame( int16_t *diff /* i/o: number of bits to be reduced */ ); -/*!r : index azimuth */ +/*! r: index azimuth */ int16_t quantize_phi( float phi, /* i : azimuth value */ const int16_t flag_delta, /* i : flag indicating if the azimuth codebook is translated or not */ @@ -3322,16 +3326,18 @@ int16_t ivas_sba_get_nchan_metadata( #ifdef HODIRAC void ivas_sba_get_spar_hoa_ch_ind( - const int16_t num_md_chs, /* i : number of MD channels */ - const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] ); + const int16_t num_md_chs, /* i : number of MD channels */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] +); /*! r: flag indicating to code SPAR HOA MD for all bands */ void ivas_sba_get_spar_hoa_md_flag( - const int16_t sba_order, /* i : Ambisonic (SBA) order */ - const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ int16_t *spar_hoa_md_flag, - int16_t *spar_hoa_dirac2spar_md_flag ); + int16_t *spar_hoa_dirac2spar_md_flag +); #else /*! r: flag indicating to code SPAR HOA MD for all bands */ int16_t ivas_sba_get_spar_hoa_md_flag( @@ -3339,6 +3345,7 @@ int16_t ivas_sba_get_spar_hoa_md_flag( const int32_t ivas_total_brate /* i : IVAS total bitrate */ ); #endif + void ivas_sba_zero_vert_comp( float sba_data[][L_FRAME48k], /* i/o: SBA data frame */ const int16_t sba_order, /* i : Ambisonic (SBA) order */ @@ -3723,37 +3730,44 @@ void calculate_hodirac_sector_parameters( #ifdef MC_PARAMUPMIX_MODE void ivas_mc_paramupmix_enc( - Encoder_Struct *st_ivas, /* i/o: IVAS Encoder handle */ - BSTR_ENC_HANDLE hMetaData, /* i/o: IVAS Metadata bitstream handle */ - float data_f[][L_FRAME48k], /* i/o: input: CICP6, CICP12, CICP14, CICP16 or CICP19 MC data */ - const int16_t input_frame /* i : input frame length */ + Encoder_Struct *st_ivas, /* i/o: IVAS Encoder handle */ + BSTR_ENC_HANDLE hMetaData, /* i/o: IVAS Metadata bitstream handle */ + float data_f[][L_FRAME48k], /* i/o: input: CICP6, CICP12, CICP14, CICP16 or CICP19 MC data */ + const int16_t input_frame /* i : input frame length */ ); + ivas_error ivas_mc_paramupmix_enc_open( - Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ ); + void ivas_mc_paramupmix_enc_close( - MC_PARAMUPMIX_ENC_HANDLE *hMCParamUpmix, /* i/o: MC Param-Upmix encoder handle */ + MC_PARAMUPMIX_ENC_HANDLE *hMCParamUpmix, /* i/o: MC Param-Upmix encoder handle */ const int32_t sampling_rate ); + void ivas_mc_paramupmix_dec( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */ ); + int16_t ivas_mc_paramupmix_getNumTransportChannels( void ); + ivas_error ivas_mc_paramupmix_dec_open( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); + void ivas_mc_paramupmix_dec_close( - MC_PARAMUPMIX_DEC_HANDLE *hMCParamUpmix_out /* i/o: Parametric MC decoder handle */ + MC_PARAMUPMIX_DEC_HANDLE *hMCParamUpmix_out /* i/o: Parametric MC decoder handle */ ); + void ivas_mc_paramupmix_dec_read_BS( - const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - Decoder_State *st, /* i/o: decoder state structure */ - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, /* i/o: decoder MC Param-Upmix handle */ - int16_t *nb_bits /* o : number of bits written */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + Decoder_State *st, /* i/o: decoder state structure */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, /* i/o: decoder MC Param-Upmix handle */ + int16_t *nb_bits /* o : number of bits written */ ); #endif @@ -3935,7 +3949,7 @@ int16_t computeMixingMatricesResidual( float *mixing_matrix /* o : resulting residual mixing matrix */ ); -/* !r: error or success */ +/*! r: error or success */ int16_t svd( float InputMatrix[][MAX_OUTPUT_CHANNELS], /* i : matrix to be decomposed (M) */ float singularVectors_Left[][MAX_OUTPUT_CHANNELS], /* o : left singular vectors (U) */ @@ -4169,7 +4183,7 @@ int16_t ivas_get_bw_idx_from_sample_rate( const int32_t sampling_rate /* i : sampling rate */ ); -/* !r: config. table index */ +/*! r: config. table index */ int16_t ivas_get_spar_table_idx( const int32_t ivas_total_brate, /* i : IVAS total bitrate */ const int16_t sba_order, /* i : IVAS SBA order */ @@ -4241,7 +4255,7 @@ void ivas_spar_get_cldfb_gains( const DECODER_CONFIG_HANDLE hDecoderConfig ); -/* !r: 1 if prediction residual channel */ +/*! r: 1 if prediction residual channel */ int16_t ivas_is_res_channel( const int16_t ch, /* i : ch index in WYZX ordering */ const int16_t nchan_transport /* i : number of transport channels (1-4) */ @@ -5359,7 +5373,7 @@ void ivas_fb_mixer_get_in_out_mapping( int16_t in_out_mixer_map[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH] /* i/o: mixing mapping */ ); -/* !r: number of spectral bands */ +/*! r: number of spectral bands */ int16_t ivas_get_num_bands_from_bw_idx( const int16_t bwidth /* i : audio bandwidth */ ); diff --git a/lib_com/ivas_qspherical_com.c b/lib_com/ivas_qspherical_com.c index 039dea53eb..874f66d059 100644 --- a/lib_com/ivas_qspherical_com.c +++ b/lib_com/ivas_qspherical_com.c @@ -71,7 +71,7 @@ uint16_t ivas_qmetadata_reorder_generic( * Returns the original value of the array "folded" by ReorderGeneric *------------------------------------------------------------------------*/ -/* !r: "Unfolded" value, positive or negative depending on the value of the input */ +/*! r: "Unfolded" value, positive or negative depending on the value of the input */ int16_t ivas_qmetadata_dereorder_generic( const uint16_t uns_value /* i : unsigned value result of ReorderGeneric */ ) @@ -234,7 +234,7 @@ void small_reduction_direction( * Input phi expected to be an angle in degree between 0 and 360. *-----------------------------------------------------------------------*/ -/* !r: index azimuth */ +/*! r: index azimuth */ int16_t quantize_phi( float phi, /* i : azimuth value */ const int16_t flag_delta, /* i : flag indicating if the azimuth codebook is translated or not */ @@ -401,7 +401,7 @@ float companding_azimuth( * Input phi expected to be an angle in degree between 0 and 360. *-----------------------------------------------------------------------*/ -/* !r: index azimuth */ +/*! r: index azimuth */ int16_t quantize_phi_chan_lbr( const float phi, /* i : azimuth value */ float *phi_hat, /* o : quantized azimuth */ @@ -445,7 +445,7 @@ int16_t quantize_phi_chan_lbr( * Input phi expected to be an angle in degree between 0 and 360. *-----------------------------------------------------------------------*/ -/* !r: index azimuth */ +/*! r: index azimuth */ int16_t quantize_phi_chan_compand( float phi, /* i : azimuth value */ float *phi_hat, /* o : quantized azimuth */ diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index e49cd5380b..73d8030651 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -368,7 +368,7 @@ void ivas_spar_config( * Get SPAR table index *-----------------------------------------------------------------------------------------*/ -/* !r: config. table index */ +/*! r: config. table index */ int16_t ivas_get_spar_table_idx( const int32_t ivas_total_brate, /* i : IVAS total bitrate */ const int16_t sba_order, /* i : Ambisonic (SBA) order */ diff --git a/lib_com/options.h b/lib_com/options.h index bbeb64007f..312b184ec8 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -172,7 +172,7 @@ #define FIX_425_MASA_BRSW_RENDERER /* Nokia: Issue 425: renderer not reconfigure in MASA bitrate switching */ #define EUALER2QUAT_FIX /* Dlb :fix for issue 430 issue in euler2quat, sign of quat y is inverted */ -#define HR_METADATA /* Nok: encode directional MASA metadata with more bits at 384k and 512k */ +#define HR_METADATA /* Nok: Contribution #45: encode directional MASA metadata with more bits at 384k and 512k */ #define SBA_TD_RESIDUAL /* Dlb : Issue 426: SBA encoder complexity optimization */ #define FIX_357_DTX_32K /* Eri: issue 357 - Forced LP-CNG at 32k */ diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index b87bb6e2ea..2122902114 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -47,9 +47,11 @@ /*-----------------------------------------------------------------------* * Local constants *-----------------------------------------------------------------------*/ + #define SPAR_META_DELAY_SUBFRAMES 2 /* Number of subframes to delay the SPAR metadata */ #define SPH_IDX_FRONT ( MASA_NO_POINTS_EQUATOR / 2 ) /* Spherical index corresponding to front direction for setting as default value */ + /*-----------------------------------------------------------------------* * Local function prototypes *-----------------------------------------------------------------------*/ @@ -58,7 +60,9 @@ static int16_t quantize_theta( float x, int16_t no_cb, float *xhat ); static uint16_t index_theta_phi_16( float theta, float phi, SPHERICAL_GRID_DATA *Sph_Grid16 ); static int16_t quantize_phi_masa( float phi, int16_t flag_delta, float *phi_hat, const int16_t n ); #endif + static void index_16bits( IVAS_QMETADATA_HANDLE hQMetaData, SPHERICAL_GRID_DATA *Sph_Grid16 ); + static void create_masa_ext_out_meta( MASA_DECODER *hMasa, IVAS_QMETADATA_HANDLE hQMetaData, const int16_t nchan_transport ); static void replicate_subframes( IVAS_QMETADATA_HANDLE hQMetaData ); diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index 6443b54900..5480f73a33 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -52,14 +52,14 @@ static int16_t ivas_qmetadata_entropy_decode_df_ratio( uint16_t *bitstream, int1 static int16_t ivas_qmetadata_entropy_decode_dir( IVAS_QDIRECTION *q_direction, uint16_t *bitstream, int16_t *index, const uint16_t diffuseness_index_max_ec_frame, const int16_t nbands, const int16_t start_band #ifdef HR_METADATA , - int16_t is_hr + const int16_t hrmasa_flag #endif ); static int16_t ivas_qmetadata_raw_decode_dir( IVAS_QDIRECTION *q_direction, uint16_t *bitstream, int16_t *index, const int16_t nbands, const int16_t start_band #ifdef HR_METADATA , - int16_t is_hr + const int16_t hrmasa_flag #endif ); @@ -90,7 +90,7 @@ static ivas_error read_huf( int16_t *num_bits_read, const uint16_t *bitstream, u static int16_t read_coherence_data( uint16_t *bitstream, int16_t *p_bit_pos, IVAS_QMETADATA *hQMetaData, const int16_t idx_dir #ifdef HR_METADATA , - int16_t is_hr + const int16_t hrmasa_flag #endif ); @@ -99,7 +99,7 @@ static int16_t read_surround_coherence( uint16_t *bitstream, int16_t *p_bit_pos, static void decode_spread_coherence( IVAS_QMETADATA_HANDLE hQMetaData, int16_t idx_d, const int16_t no_frames #ifdef HR_METADATA , - int16_t is_hr + const int16_t hrmasa_flag #endif ); @@ -112,43 +112,18 @@ static int16_t read_GR_min_removed_data( uint16_t *bitstream, int16_t *p_bit_pos static int16_t decode_fixed_rate_composed_index_coherence( uint16_t *bitstream, int16_t *p_bit_pos, const int16_t no_bands, int16_t *no_cv_vec, uint16_t *decoded_index, const int16_t no_symb ); #ifdef HR_METADATA +static int16_t ivas_qmetadata_entropy_decode_diffuseness_hr( uint16_t *bitstream, int16_t *index, IVAS_QDIRECTION *q_direction, uint16_t *diffuseness_index_max_ec_frame ); -static int16_t ivas_qmetadata_entropy_decode_diffuseness_hr( - uint16_t *bitstream, /* i : bitstream */ - int16_t *index, - IVAS_QDIRECTION *q_direction, - uint16_t *diffuseness_index_max_ec_frame ); - - -static int16_t ivas_qmetadata_entropy_decode_diffuseness_hr_512( - uint16_t *bitstream, /* i : bitstream */ - int16_t *index, - IVAS_QDIRECTION *q_direction ); +static int16_t ivas_qmetadata_entropy_decode_diffuseness_hr_512( uint16_t *bitstream, int16_t *index, IVAS_QDIRECTION *q_direction ); -static int16_t ivas_qmetadata_raw_decode_dir_512( - IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ - uint16_t *bitstream, /* i : bitstream */ - int16_t *index, - const int16_t nbands, - const int16_t start_band, - SPHERICAL_GRID_DATA *sph_grid16 /* i: spherical grid for deindexing */ -); -static int16_t read_surround_coherence_hr( - uint16_t *bitstream, /* i : bitstream */ - int16_t *p_bit_pos, /* i : position in the bitstream */ - IVAS_QMETADATA *hQMetaData /* i/o: quantized metadata structure */ -); +static int16_t ivas_qmetadata_raw_decode_dir_512( IVAS_QDIRECTION *q_direction, uint16_t *bitstream, int16_t *index, const int16_t nbands, const int16_t start_band, const SPHERICAL_GRID_DATA *sph_grid16 ); -/* !r: number of bits read */ -static int16_t read_coherence_data_hr_512( - uint16_t *bitstream, /* i : bitstream */ - int16_t *p_bit_pos, /* i : position in the bitstream */ - IVAS_QMETADATA *hQMetaData, /* i/o: quantized metadata structure */ - const int16_t idx_dir, /* i : direction index */ - int16_t nbits_coh ); +static int16_t read_surround_coherence_hr( uint16_t *bitstream, int16_t *p_bit_pos, IVAS_QMETADATA *hQMetaData ); +static int16_t read_coherence_data_hr_512( uint16_t *bitstream, int16_t *p_bit_pos, IVAS_QMETADATA *hQMetaData, const int16_t idx_dir, const int16_t nbits_coh ); #endif + /*-----------------------------------------------------------------------* * Global function definitions *-----------------------------------------------------------------------*/ @@ -161,9 +136,9 @@ static int16_t read_coherence_data_hr_512( /*! r: number of bits read */ int16_t ivas_qmetadata_dec_decode( - IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: hQMetaData handle */ - uint16_t *bitstream, /* i : bitstream */ - int16_t *index /* i/o: bitstream position */ + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: hQMetaData handle */ + uint16_t *bitstream, /* i : bitstream */ + int16_t *index /* i/o: bitstream position */ #ifdef HODIRAC , const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ @@ -197,7 +172,6 @@ int16_t ivas_qmetadata_dec_decode( int16_t reduce_bits; int16_t ind_order[MASA_MAXIMUM_CODING_SUBBANDS]; - #ifdef DEBUG_MODE_QMETADATA static FILE *pF = NULL; static FILE *pF_azi = NULL; @@ -254,7 +228,6 @@ int16_t ivas_qmetadata_dec_decode( } bits_diff_sum = 0; - bits_diff_sum += ivas_qmetadata_entropy_decode_diffuseness( bitstream, index, &( hQMetaData->q_direction[0] ), &diffuseness_index_max_ec_frame_pre[0] ); #ifdef HODIRAC @@ -740,6 +713,7 @@ int16_t ivas_qmetadata_dec_decode( } #endif } + /* move 2 dir data to its correct subband */ if ( hQMetaData->no_directions == 2 ) { @@ -819,24 +793,27 @@ int16_t ivas_qmetadata_dec_decode( hQMetaData->dir_comp_ratio = 1.0f; } - return ( start_index_0 - *index ); } #ifdef HR_METADATA +/*-----------------------------------------------------------------------* + * ivas_qmetadata_dec_decode_hr_384_512() + * + * Main function for decoding Spatial Metadata at HRs + *-----------------------------------------------------------------------*/ /*! r: number of bits read */ int16_t ivas_qmetadata_dec_decode_hr_384_512( - IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: hQMetaData handle */ - uint16_t *bitstream, /* i : bitstream */ - int16_t *index, /* i/o: bitstream position */ - SPHERICAL_GRID_DATA *sph_grid16, /* i: spherical grid for deindexing */ - int16_t bits_sph_idx, - int16_t bits_sp_coh ) + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: hQMetaData handle */ + uint16_t *bitstream, /* i : bitstream */ + int16_t *index, /* i/o: bitstream position */ + const SPHERICAL_GRID_DATA *sph_grid16, /* i : spherical grid for deindexing */ + const int16_t bits_sph_idx, + const int16_t bits_sp_coh ) { int16_t d, b, m; - int16_t bits_diff_sum; int16_t nbands, start_band; IVAS_QDIRECTION *q_direction; @@ -955,7 +932,6 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( } } - if ( all_coherence_zero == 0 ) { bits_sur_coherence = read_surround_coherence_hr( bitstream, index, hQMetaData ); @@ -974,14 +950,12 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( } bits_no_dirs_coh += bits_sur_coherence; - for ( d = 0; d < hQMetaData->no_directions; d++ ) { q_direction = &hQMetaData->q_direction[d]; nbands = q_direction->cfg.nbands; start_band = q_direction->cfg.start_band; - /* Read coherence, if any */ if ( all_coherence_zero == 0 ) { @@ -1004,11 +978,9 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( } } - /* Decode quantized directions frame-wise */ ivas_qmetadata_raw_decode_dir_512( q_direction, bitstream, index, nbands, start_band, sph_grid16 ); - #ifdef DEBUG_MODE_QMETADATA fprintf( pF, "frame %d: diff %d surcoh %d ", frame, bits_diff_sum, bits_sur_coherence ); @@ -1018,7 +990,6 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( fprintf( pF_spcoh, "frame %d/dir %d: ", frame, d ); fprintf( pF_ratio, "frame %d/dir %d: ", frame, d ); - for ( b = start_band; b < nbands; b++ ) { for ( m = 0; m < q_direction->cfg.nblocks; m++ ) @@ -1078,6 +1049,7 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( } } } + /* Scale energy ratios that sum to over one */ for ( b = 0; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) { @@ -1095,7 +1067,6 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( } } - #ifdef DEBUG_MODE_QMETADATA for ( d = 0; d < hQMetaData->no_directions; d++ ) { @@ -1138,7 +1109,6 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( hQMetaData->dir_comp_ratio = 1.0f; } - return ( start_index_0 - *index ); } @@ -1411,6 +1381,12 @@ static int16_t ivas_diffuseness_huff_ec_decode( } +/*-------------------------------------------------------------------* + * ivas_qmetadata_entropy_decode_diffuseness() + * + * + *-------------------------------------------------------------------*/ + static int16_t ivas_qmetadata_entropy_decode_diffuseness( uint16_t *bitstream, /* i : bitstream */ int16_t *index, @@ -1508,6 +1484,12 @@ static int16_t ivas_qmetadata_entropy_decode_diffuseness( #ifdef HR_METADATA +/*-------------------------------------------------------------------* + * ivas_qmetadata_entropy_decode_diffuseness_hr() + * + * + *-------------------------------------------------------------------*/ + static int16_t ivas_qmetadata_entropy_decode_diffuseness_hr( uint16_t *bitstream, /* i : bitstream */ int16_t *index, @@ -1582,6 +1564,13 @@ static int16_t ivas_qmetadata_entropy_decode_diffuseness_hr( return ( index_start - *index ); } + +/*-------------------------------------------------------------------* + * ivas_qmetadata_entropy_decode_diffuseness_hr_512() + * + * + *-------------------------------------------------------------------*/ + static int16_t ivas_qmetadata_entropy_decode_diffuseness_hr_512( uint16_t *bitstream, /* i : bitstream */ int16_t *index, @@ -1611,7 +1600,6 @@ static int16_t ivas_qmetadata_entropy_decode_diffuseness_hr_512( return MASA_BITS_ER_HR; } - for ( b = start_band; b < nbands; b++ ) { for ( k = 0; k < nblocks; k++ ) @@ -1624,6 +1612,13 @@ static int16_t ivas_qmetadata_entropy_decode_diffuseness_hr_512( } #endif + +/*-------------------------------------------------------------------* + * ivas_qmetadata_entropy_decode_df_ratio() + * + * + *-------------------------------------------------------------------*/ + static int16_t ivas_qmetadata_entropy_decode_df_ratio( uint16_t *bitstream, int16_t *index, @@ -1752,7 +1747,7 @@ static int16_t ivas_qmetadata_entropy_decode_dir( const int16_t start_band #ifdef HR_METADATA , - int16_t is_hr + const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding*/ #endif ) { @@ -1782,7 +1777,7 @@ static int16_t ivas_qmetadata_entropy_decode_dir( for ( b = start_band; b < nbands; b++ ) { #ifdef HR_METADATA - if ( is_hr ) + if ( hrmasa_flag ) { diff_idx = 0; } @@ -1793,6 +1788,7 @@ static int16_t ivas_qmetadata_entropy_decode_dir( #ifdef HR_METADATA } #endif + diff_idx_min = min( diff_idx_min, diff_idx ); if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) { @@ -1802,6 +1798,7 @@ static int16_t ivas_qmetadata_entropy_decode_dir( { elev_alph[b] = no_theta_masa[bits_direction_masa[diff_idx] - 3] * 2 - 1; } + #ifdef HR_METADATA if ( q_direction->band_data[b].energy_ratio_index_mod[0] > diffuseness_index_max_ec_frame ) #else @@ -1860,7 +1857,7 @@ static int16_t ivas_qmetadata_entropy_decode_dir( { int16_t tmp_index; #ifdef HR_METADATA - if ( is_hr ) + if ( hrmasa_flag ) { diff_idx = 0; } @@ -1879,6 +1876,7 @@ static int16_t ivas_qmetadata_entropy_decode_dir( else { avg_elevation_index_projected = ivas_dirac_project_elevation_index( avg_elevation_idx, avg_elevation_alphabet, elev_alph[b] ); + /*reorder elevation indexing*/ tmp_index = avg_elevation_index_projected - ( elev_alph[b] >> 1 ); if ( tmp_index < 0 ) @@ -1895,6 +1893,7 @@ static int16_t ivas_qmetadata_entropy_decode_dir( for ( m = 0; m < nblocks; m++ ) { q_direction->band_data[b].elevation_index[m] = avg_elevation_index_projected; + /*deduce aplhabet for azimuth*/ if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) { @@ -1919,18 +1918,18 @@ static int16_t ivas_qmetadata_entropy_decode_dir( if ( bands_entropic[b] ) { #ifdef HR_METADATA - if ( is_hr ) + if ( hrmasa_flag ) { diff_idx = 0; } else { - #endif diff_idx = q_direction->band_data[b].energy_ratio_index_mod[0]; #ifdef HR_METADATA } #endif + for ( m = 0; m < nblocks; m++ ) { int16_t tmp_index; @@ -1953,7 +1952,6 @@ static int16_t ivas_qmetadata_entropy_decode_dir( } else { - avg_elevation_index_projected = ivas_dirac_project_elevation_index( avg_elevation_idx, avg_elevation_alphabet, elev_alph[b] ); tmp_index = ivas_qmetadata_DecodeExtendedGR( bitstream, index, elev_alph[b], gr_param_elev ); @@ -1990,18 +1988,18 @@ static int16_t ivas_qmetadata_entropy_decode_dir( if ( bands_entropic[b] ) { #ifdef HR_METADATA - if ( is_hr ) + if ( hrmasa_flag ) { diff_idx = 0; } else { - #endif diff_idx = q_direction->band_data[b].energy_ratio_index_mod[0]; #ifdef HR_METADATA } #endif + for ( m = 0; m < nblocks; m++ ) { q_direction->band_data[b].elevation_index[m] = 0; @@ -2061,6 +2059,7 @@ static int16_t ivas_qmetadata_entropy_decode_dir( set_zero( avg_direction_vector, 3 ); use_adapt_avg = 0; idx = 0; + for ( b = start_band; b < nbands; b++ ) { if ( bands_entropic[b] ) @@ -2119,6 +2118,7 @@ static int16_t ivas_qmetadata_entropy_decode_dir( return ( index_start - *index ); } + #ifdef HR_METADATA /*------------------------------------------------------------------------- * ivas_qmetadata_raw_decode_dir() @@ -2132,7 +2132,7 @@ static int16_t ivas_qmetadata_raw_decode_dir_512( int16_t *index, const int16_t nbands, const int16_t start_band, - SPHERICAL_GRID_DATA *sph_grid16 /* i: spherical grid for deindexing */ + const SPHERICAL_GRID_DATA *sph_grid16 /* i : spherical grid for deindexing */ ) { int16_t b, m, i; @@ -2153,6 +2153,7 @@ static int16_t ivas_qmetadata_raw_decode_dir_512( value = ( value << 1 ) + bitstream[( *index )--]; } q_direction->band_data[b].spherical_index[m] = value; + if ( q_direction->band_data[b].bits_sph_idx[m] == 16 ) { deindex_sph_idx( value, sph_grid16, &( q_direction->band_data[b].elevation[m] ), &( q_direction->band_data[b].azimuth[m] ) ); @@ -2166,11 +2167,11 @@ static int16_t ivas_qmetadata_raw_decode_dir_512( } } - return ( index_start - *index ); } #endif + /*------------------------------------------------------------------------- * ivas_qmetadata_raw_decode_dir() * @@ -2185,7 +2186,7 @@ static int16_t ivas_qmetadata_raw_decode_dir( const int16_t start_band #ifdef HR_METADATA , - int16_t is_hr + const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding*/ #endif ) { @@ -2206,7 +2207,7 @@ static int16_t ivas_qmetadata_raw_decode_dir( else { #ifdef HR_METADATA - if ( is_hr ) + if ( hrmasa_flag ) { diff_idx = 0; } @@ -2240,7 +2241,7 @@ static int16_t ivas_qmetadata_raw_decode_dir( * Read the bitstream following the encoding scheme of EncodeQuasiUniform *------------------------------------------------------------------------*/ -/* !r: Value read from the bitstream */ +/*! r: Value read from the bitstream */ static uint16_t ivas_qmetadata_DecodeQuasiUniform( const uint16_t *bitstream, /* i : pointer to the bitstream to read */ int16_t *index, /* i : position in the bitstream to start reading (gets updated with reading) */ @@ -2281,7 +2282,7 @@ static uint16_t ivas_qmetadata_DecodeQuasiUniform( * Reads the bitstream and decodes the value using the ExtendedGR algorithm *------------------------------------------------------------------------*/ -/* !r: Value decoded from the bitstream */ +/*! r: Value decoded from the bitstream */ static int16_t ivas_qmetadata_DecodeExtendedGR( uint16_t *bitstream, /* i : pointer to the bitstream to read */ int16_t *index, /* i/o: position in the bitstream to start reading (gets updated with reading) */ @@ -2340,7 +2341,7 @@ static int16_t ivas_qmetadata_DecodeExtendedGR( * Calculates the correct elevation index from the decoded data *------------------------------------------------------------------------*/ -/* !r: Elevation index as it will be read by the dequantizer */ +/*! r: Elevation index as it will be read by the dequantizer */ static int16_t ivas_qmetadata_ReorderElevationDecoded( const int16_t elev_dist, /* i : Distance to the average extracted from the bitstream */ const int16_t elev_avg, /* i : Average value over time-blocks extracted from the bitstream */ @@ -2370,7 +2371,7 @@ static int16_t ivas_qmetadata_ReorderElevationDecoded( * Local functions: requentizeEC3 *-----------------------------------------------------------------------*/ -/* !r: number of bits read */ +/*! r: number of bits read */ static int16_t read_directions( IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ const uint8_t coding_subbands, /* i : number of directions */ @@ -2422,6 +2423,7 @@ static int16_t read_directions( max_nb_idx = k; } } + if ( q_direction->cfg.nblocks == 1 ) { byteBuffer = 0; @@ -2601,7 +2603,7 @@ static int16_t read_directions( * read and decode the azimuth indexes for one subband *-------------------------------------------------------------------*/ -/* !r: number of bits read */ +/*! r: number of bits read */ static int16_t decode_azimuth( IVAS_QDIRECTION *q_direction, /* i/o: quantized metadata structure */ uint16_t *bitstream, /* i : bitstream to be read */ @@ -2770,7 +2772,7 @@ static int16_t decode_azimuth( * Reads the bitstream and decode the elevation index *-------------------------------------------------------------------*/ -/* !r: number of bits read */ +/*! r: number of bits read */ static int16_t decode_elevation( IVAS_QDIRECTION *q_direction, /* i/o: quantized metadata structure */ uint16_t *bitstream, /* i : input bitstream */ @@ -2898,7 +2900,7 @@ static int16_t decode_elevation( * decoding in fixed rate case, i.e. when using the spherical indexes *-----------------------------------------------------------------*/ -/* !r: number of bits read */ +/*! r: number of bits read */ static int16_t decode_fixed_rate( IVAS_QDIRECTION *q_direction, /* i/o: quantized metadata */ const uint16_t *bitstream, /* i : bitstream to be read */ @@ -2938,7 +2940,7 @@ static int16_t decode_fixed_rate( * Azimuth bitstream reading and decoding in 2D case *-------------------------------------------------------------------*/ -/* !r: number of bits read */ +/*! r: number of bits read */ static int16_t decode_azimuth2D( IVAS_QDIRECTION *q_direction, /* i/o: quantized metadata structure */ uint16_t *bitstream, /* i : bitstream to be read */ @@ -3132,7 +3134,7 @@ static int16_t read_truncGR_azimuth( * *-------------------------------------------------------------------*/ -/* !r: number of bits read */ +/*! r: number of bits read */ static int16_t read_common_direction( uint16_t *bitstream, /* i : bitstream to be read */ IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ @@ -3259,7 +3261,7 @@ static void decode_spread_coherence( const int16_t no_frames /* i : number of time subframes */ #ifdef HR_METADATA , - int16_t is_hr + const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding*/ #endif ) { @@ -3273,6 +3275,7 @@ static void decode_spread_coherence( #ifdef HR_METADATA int16_t min_index; #endif + coding_subbands_0 = hQMetaData->q_direction[0].cfg.nbands; coding_subbands = hQMetaData->q_direction[idx_d].cfg.nbands; if ( coding_subbands_0 <= 5 ) @@ -3327,8 +3330,9 @@ static void decode_spread_coherence( for ( i = 0; i < coding_subbands; i++ ) { var_azi = var( q_direction->band_data[i].azimuth, no_frames ); + #ifdef HR_METADATA - if ( is_hr ) + if ( hrmasa_flag ) { minimum_s( (int16_t *) ( q_direction->band_data[i].energy_ratio_index ), q_direction->cfg.nblocks, &min_index ); min_index = min_index >> 1; @@ -3356,7 +3360,9 @@ static void decode_spread_coherence( idx_sub_cb = MASA_NO_CV_COH * ( q_direction->band_data[i].energy_ratio_index[0] + DIRAC_DIFFUSE_LEVELS ); /* NO_CV_COH = 8 */ } #endif + dct_coh[i][0] = coherence_cb0_masa[idx_sub_cb + q_direction->coherence_band_data[i].spread_coherence_dct0_index]; + if ( coding_subbands < coding_subbands_0 ) { assert( idx_d == 1 ); @@ -3385,7 +3391,7 @@ static void decode_spread_coherence( * Read Hufman code *-------------------------------------------------------------------*/ -/* !r: number of bits read */ +/*! r: number of bits read */ static ivas_error read_huf( int16_t *num_bits_read, const uint16_t *bitstream, /* i : bitstream to be read */ @@ -3613,14 +3619,21 @@ static int16_t decode_fixed_rate_composed_index_coherence( return nbits; } + #ifdef HR_METADATA -/* !r: number of bits read */ +/*-------------------------------------------------------------------* + * read_coherence_data_hr_512() + * + * + *-------------------------------------------------------------------*/ + +/*! r: number of bits read */ static int16_t read_coherence_data_hr_512( uint16_t *bitstream, /* i : bitstream */ int16_t *p_bit_pos, /* i : position in the bitstream */ IVAS_QMETADATA *hQMetaData, /* i/o: quantized metadata structure */ const int16_t idx_dir, /* i : direction index */ - int16_t nbits_coh ) + const int16_t nbits_coh ) { int16_t j, k, i; int16_t nbands, nblocks; @@ -3686,13 +3699,15 @@ static int16_t read_coherence_data_hr_512( return nbits; } #endif -/*------------------------------------------------------------------ - * + + +/*------------------------------------------------------------------- * * read_coherence_data() * * Read coherence data - *------------------------------------------------------------------ - */ + *------------------------------------------------------------------- */ -/* !r: number of bits read */ +/*! r: number of bits read */ static int16_t read_coherence_data( uint16_t *bitstream, /* i : bitstream */ int16_t *p_bit_pos, /* i : position in the bitstream */ @@ -3700,7 +3715,7 @@ static int16_t read_coherence_data( const int16_t idx_dir /* i : direction index */ #ifdef HR_METADATA , - int16_t is_hr + const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding*/ #endif ) { @@ -3722,6 +3737,7 @@ static int16_t read_coherence_data( #ifdef HR_METADATA int16_t min_index; #endif + coding_subbands = hQMetaData->q_direction[idx_dir].cfg.nbands; q_direction = &( hQMetaData->q_direction[idx_dir] ); @@ -3733,7 +3749,7 @@ static int16_t read_coherence_data( for ( j = 0; j < coding_subbands; j++ ) { #ifdef HR_METADATA - if ( is_hr ) + if ( hrmasa_flag ) { idx_ER = 7 - ( q_direction->band_data[j].energy_ratio_index_mod[0] >> 1 ) + coding_subbands / MASA_FACTOR_CV_COH; } @@ -3769,7 +3785,7 @@ static int16_t read_coherence_data( if ( no_cv_vec[j] > 1 ) { #ifdef HR_METADATA - q_direction->coherence_band_data[j].spread_coherence[0] = (uint8_t) roundf( decoded_idx[j] * ( 255.0f / (float) ( 7 - ( q_direction->band_data[j].energy_ratio_index_mod[0] >> ( is_hr ) ) + coding_subbands / MASA_FACTOR_CV_COH ) ) ); + q_direction->coherence_band_data[j].spread_coherence[0] = (uint8_t) roundf( decoded_idx[j] * ( 255.0f / (float) ( 7 - ( q_direction->band_data[j].energy_ratio_index_mod[0] >> ( hrmasa_flag ) ) + coding_subbands / MASA_FACTOR_CV_COH ) ) ); #else q_direction->coherence_band_data[j].spread_coherence[0] = (uint8_t) roundf( decoded_idx[j] * ( 255.0f / (float) ( 7 - q_direction->band_data[j].energy_ratio_index_mod[0] + coding_subbands / MASA_FACTOR_CV_COH ) ) ); #endif @@ -3790,7 +3806,7 @@ static int16_t read_coherence_data( if ( no_cv_vec[j] > 1 ) { #ifdef HR_METADATA - q_direction->coherence_band_data[j].spread_coherence[0] = (uint8_t) roundf( decoded_index[j] * ( 255.0f / (float) ( 7 - ( q_direction->band_data[j].energy_ratio_index_mod[0] >> ( is_hr ) ) + coding_subbands / MASA_FACTOR_CV_COH ) ) ); + q_direction->coherence_band_data[j].spread_coherence[0] = (uint8_t) roundf( decoded_index[j] * ( 255.0f / (float) ( 7 - ( q_direction->band_data[j].energy_ratio_index_mod[0] >> ( hrmasa_flag ) ) + coding_subbands / MASA_FACTOR_CV_COH ) ) ); #else q_direction->coherence_band_data[j].spread_coherence[0] = (uint8_t) roundf( decoded_index[j] * ( 255.0f / (float) ( 7 - q_direction->band_data[j].energy_ratio_index_mod[0] + coding_subbands / MASA_FACTOR_CV_COH ) ) ); #endif @@ -3807,7 +3823,7 @@ static int16_t read_coherence_data( for ( j = 0; j < coding_subbands; j++ ) { #ifdef HR_METADATA - if ( is_hr ) + if ( hrmasa_flag ) { minimum_s( (int16_t *) ( q_direction->band_data[j].energy_ratio_index ), q_direction->cfg.nblocks, &min_index ); no_cv_vec[j] = len_cb_dct0_masa[min_index >> 1]; /* spread coherence DCT0*/ @@ -4102,7 +4118,15 @@ static int16_t read_surround_coherence( return bits_sur_coherence; } + + #ifdef HR_METADATA +/*-------------------------------------------------------------------* + * read_surround_coherence_hr() + * + * + *-------------------------------------------------------------------*/ + static int16_t read_surround_coherence_hr( uint16_t *bitstream, /* i : bitstream */ int16_t *p_bit_pos, /* i : position in the bitstream */ @@ -4174,7 +4198,6 @@ static int16_t read_surround_coherence_hr( } else { - /* read how the surround coherence is encoded */ byteBuffer = bitstream[bit_pos--]; bits_sur_coherence += 1; diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 73f0ca158a..e956504f7a 100755 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -631,7 +631,7 @@ void ivas_spar_get_cldfb_gains( * determines if an FOA input channel is transmitted as residual channel. *---------------------------------------------------------------------*/ -/* !r: 1 if prediction residual channel */ +/*! r: 1 if prediction residual channel */ int16_t ivas_is_res_channel( const int16_t ch, /* i : ch index in WYZX ordering */ const int16_t nchan_transport /* i : number of transport channels (1-4) */ diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index e3d2f23b67..afea049d25 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -668,7 +668,7 @@ void ivas_dirac_param_est_enc( num_freq_bands = hDirAC->hConfig->nbands; #endif - /* Initialization */ + /* Initialization */ l_ts = input_frame / MAX_PARAM_SPATIAL_SUBFRAMES; if ( useLowerRes ) { @@ -818,7 +818,6 @@ void ivas_dirac_param_est_enc( { calculate_hodirac_sector_parameters( Cldfb_RealBuffer, Cldfb_ImagBuffer, l_ts, 0.20f, hDirAC->band_grouping, hDirAC->hConfig->nbands, hDirAC->hConfig->enc_param_start_band, azi_secs, ele_secs, diff_secs, ene_secs ); - } #endif diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 8938a415ff..2527fa91aa 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -64,7 +64,7 @@ static void reduce_metadata_further( MASA_ENCODER_HANDLE hMasa, IVAS_QMETADATA_H static void average_masa_metadata( MASA_METADATA_FRAME *masaMetadata, float energy[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] #ifdef HR_METADATA , - SPHERICAL_GRID_DATA *sphGrid + const SPHERICAL_GRID_DATA *sphGrid #endif ); @@ -256,12 +256,14 @@ ivas_error ivas_masa_encode( } } } + #ifdef HR_METADATA if ( ivas_format == MASA_FORMAT && ivas_total_brate >= IVAS_384k ) { hMasa->config.mergeRatiosOverSubframes = 0; } #endif + /* Combine frequency bands and sub-frames */ combine_freqbands_and_subframes( hMasa ); } @@ -350,7 +352,6 @@ ivas_error ivas_masa_encode( } #endif - *nb_bits_metadata = hMetaData->nb_bits_tot; if ( ivas_format == MASA_FORMAT && Opt_DTX_ON ) @@ -537,6 +538,7 @@ ivas_error ivas_masa_enc_config( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA spherical grid\n" ) ); } + if ( ivas_total_brate == IVAS_512k ) { generate_gridEq( sphGrid ); @@ -546,6 +548,7 @@ ivas_error ivas_masa_enc_config( sphGrid->no_theta = 0; } #endif + /* average over sub-frames */ average_masa_metadata( &( hMasa->masaMetadata ), hMasa->data.energy #ifdef HR_METADATA @@ -1775,7 +1778,7 @@ static void average_masa_metadata( float energy[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] #ifdef HR_METADATA , - SPHERICAL_GRID_DATA *Sph_Grid16 + const SPHERICAL_GRID_DATA *Sph_Grid16 #endif ) { diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index 50b0d8614f..64d5b8e6aa 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -68,7 +68,7 @@ static int16_t ivas_qmetadata_entropy_encode_df_ratio( BSTR_ENC_HANDLE hMetaData static int16_t ivas_qmetadata_entropy_encode_dir( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, const uint16_t diffuseness_index_max_ec_frame, const int16_t nbands, const int16_t start_band, const int16_t direction_bits_raw, int16_t max_bits #ifdef HR_METADATA , - int16_t is_hr + const int16_t hrmasa_flag #endif ); @@ -101,7 +101,7 @@ static int16_t write_fixed_rate_direction( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRE static int16_t ivas_qmetadata_quantize_coherence( IVAS_QMETADATA *hQMetaData, const int16_t idx_d, const int16_t all_coherence_zero, BSTR_ENC_HANDLE hMetaData, const int16_t write_flag, int16_t *indice_coherence #ifdef HR_METADATA , - int16_t is_hr + const int16_t hrmasa_flag #endif ); @@ -110,11 +110,11 @@ static void dct4_transform( uint8_t *v, float *dct_v ); static float quantize_DCT_0_coh( const float x, const int16_t j, const float *coherence_cb, const float delta_var, const int16_t no_cb, IVAS_QDIRECTION *q_direction, uint16_t *idx_x, int16_t *p_no_cb #ifdef HR_METADATA , - int16_t is_hr + const int16_t hrmasa_flag #endif ); -static int16_t encode_coherence_indexesDCT0( uint16_t *idx_dct, const int16_t len, int16_t *no_cb_vec, BSTR_ENC_HANDLE hMetaData, int16_t indice_coherence, const int16_t nbits, const int16_t nbits1 ); +static int16_t encode_coherence_indexesDCT0( uint16_t *idx_dct, const int16_t len, int16_t *no_cb_vec, BSTR_ENC_HANDLE hMetaData, const int16_t indice_coherence, const int16_t nbits, const int16_t nbits1 ); static int16_t encode_coherence_indexesDCT1( uint16_t *idx_dct, const int16_t len, BSTR_ENC_HANDLE hMetaData ); @@ -137,41 +137,22 @@ static int16_t write_2dir_info( BSTR_ENC_HANDLE hMetaData, uint8_t *twoDirBands, static void transform_azimuth_dir2( IVAS_QMETADATA_HANDLE hQMetaData, int16_t *dir2_bands ); static int16_t calc_var_azi( const IVAS_QDIRECTION *q_direction, const int16_t diffuseness_index_max_ec_frame, const float avg_azimuth, float *avg_azimuth_out ); + #ifdef HR_METADATA -static void ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr( - IVAS_QMETADATA_HANDLE hQMetaData, - int16_t *needed_bits, - int16_t *nbits_diff, - int16_t *dfRatioBits, - int16_t bits_dir_hr ); -static int16_t ivas_qmetadata_entropy_encode_diffuseness_hr( - BSTR_ENC_HANDLE hMetaData, - IVAS_QDIRECTION *q_direction, - uint16_t *diffuseness_index_max_ec_frame ); +static void ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr( IVAS_QMETADATA_HANDLE hQMetaData, int16_t *needed_bits, int16_t *nbits_diff, int16_t *dfRatioBits, const int16_t bits_dir_hr ); -static void ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr_512( - IVAS_QMETADATA_HANDLE hQMetaData, - int16_t *needed_bits, - int16_t bits_dir_hr, - BSTR_ENC_HANDLE hMetaData ); +static int16_t ivas_qmetadata_entropy_encode_diffuseness_hr( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, uint16_t *diffuseness_index_max_ec_frame ); -static int16_t encode_surround_coherence_hr( - IVAS_QMETADATA *hQMetaData, /* i : quantized metadata */ - BSTR_ENC_HANDLE hMetaData /* i/o: metadata bitstream handle */ -); +static void ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr_512( IVAS_QMETADATA_HANDLE hQMetaData, int16_t *needed_bits, const int16_t bits_dir_hr, BSTR_ENC_HANDLE hMetaData ); -static void ivas_qmetadata_reorder_2dir_bands_hr( - IVAS_QMETADATA_HANDLE hQMetaData ); +static int16_t encode_surround_coherence_hr( IVAS_QMETADATA *hQMetaData, BSTR_ENC_HANDLE hMetaData ); -static int16_t ivas_qmetadata_quantize_coherence_hr_512( - IVAS_QMETADATA *hQMetaData, /* i/o: quantized metadata */ - const int16_t idx_d, /* i : current direction index */ - const int16_t all_coherence_zero, /* i : all coherence is zero - flag */ - BSTR_ENC_HANDLE hMetaData, /* i : metadata handle */ - int16_t bits_coh ); +static void ivas_qmetadata_reorder_2dir_bands_hr( IVAS_QMETADATA_HANDLE hQMetaData ); +static int16_t ivas_qmetadata_quantize_coherence_hr_512( IVAS_QMETADATA *hQMetaData, const int16_t idx_d, const int16_t all_coherence_zero, BSTR_ENC_HANDLE hMetaData, const int16_t bits_coh ); #endif + /*-----------------------------------------------------------------------* * ivas_qmetadata_enc_encode() * @@ -179,8 +160,8 @@ static int16_t ivas_qmetadata_quantize_coherence_hr_512( *-----------------------------------------------------------------------*/ ivas_error ivas_qmetadata_enc_encode( - BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ - IVAS_QMETADATA *hQMetaData /* i/o: metadata handle */ + BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ + IVAS_QMETADATA *hQMetaData /* i/o: metadata handle */ #ifdef HODIRAC , const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode*/ @@ -748,16 +729,21 @@ ivas_error ivas_qmetadata_enc_encode( return error; } + #ifdef HR_METADATA +/*-----------------------------------------------------------------------* + * ivas_qmetadata_enc_encode_hr_384_512() + * + * Main function for quantizing and coding Spatial Metadata at HRs + *-----------------------------------------------------------------------*/ ivas_error ivas_qmetadata_enc_encode_hr_384_512( BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ IVAS_QMETADATA *hQMetaData, /* i/o: metadata handle */ - int16_t bits_sph_idx, - int16_t bits_sp_coh ) + const int16_t bits_sph_idx, + const int16_t bits_sp_coh ) { int16_t i, j; - int16_t bits_diff[QMETADATA_MAX_NO_DIRECTIONS]; IVAS_QDIRECTION *q_direction; int16_t nbands, nblocks, start_band; @@ -766,7 +752,6 @@ ivas_error ivas_qmetadata_enc_encode_hr_384_512( int16_t bits_no_dirs_coh; int16_t bits_ec; float azimuth_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], elevation_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; - ivas_error error; error = IVAS_ERR_OK; @@ -799,7 +784,6 @@ ivas_error ivas_qmetadata_enc_encode_hr_384_512( ndirections = hQMetaData->no_directions; - /* Check if coherence should be encoded */ all_coherence_zero = 1; bits_no_dirs_coh = 0; @@ -810,6 +794,7 @@ ivas_error ivas_qmetadata_enc_encode_hr_384_512( push_next_indice( hMetaData, all_coherence_zero, 1 ); /* signal coherence */ bits_no_dirs_coh += 1; } + /* encode 2 direction subbands position */ if ( ndirections == 2 && bits_sph_idx == 11 ) { @@ -822,8 +807,8 @@ ivas_error ivas_qmetadata_enc_encode_hr_384_512( hQMetaData->q_direction[1].cfg.nbands = hQMetaData->numTwoDirBands; } - /*Quantization and encoding of the Diffuseness */ + /*Quantization and encoding of the Diffuseness */ ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr_512( hQMetaData, bits_diff, bits_sph_idx, hMetaData ); /* Encode surround coherence */ @@ -833,7 +818,6 @@ ivas_error ivas_qmetadata_enc_encode_hr_384_512( } else { - for ( i = 0; i < hQMetaData->q_direction[0].cfg.nbands; i++ ) { if ( hQMetaData->surcoh_band_data != NULL ) @@ -843,7 +827,6 @@ ivas_error ivas_qmetadata_enc_encode_hr_384_512( } } - /* Loop over number of directions*/ for ( d = 0; d < ndirections; d++ ) { @@ -853,7 +836,6 @@ ivas_error ivas_qmetadata_enc_encode_hr_384_512( nblocks = q_direction->cfg.nblocks; start_band = q_direction->cfg.start_band; - #ifdef DEBUG_MODE_QMETADATA { int16_t k; @@ -875,7 +857,6 @@ ivas_error ivas_qmetadata_enc_encode_hr_384_512( #endif /*Coherence */ - if ( all_coherence_zero == 0 ) { ivas_qmetadata_quantize_coherence_hr_512( hQMetaData, d, all_coherence_zero, hMetaData, bits_sp_coh ); @@ -1328,13 +1309,13 @@ void reset_metadata_spatial( * *------------------------------------------------------------------------*/ -/* !r: quantized spherical index */ +/*! r: quantized spherical index */ int16_t quantize_direction2D( - float phi, /* i : input azimuth value */ - const int16_t no_cw, /* i : number of bits */ - float *phi_q, /* o : quantized azimuth value */ - uint16_t *index_phi, /* o : quantized azimuth index */ - const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ + float phi, /* i : input azimuth value */ + const int16_t no_cw, /* i : number of bits */ + float *phi_q, /* o : quantized azimuth value */ + uint16_t *index_phi, /* o : quantized azimuth index */ + const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ ) { int16_t idx_sph; @@ -1346,7 +1327,6 @@ int16_t quantize_direction2D( return 0; } - if ( mc_format != MC_LS_SETUP_INVALID ) { id_phi = quantize_phi_chan_compand( phi + 180, phi_q, no_cw, 0, mc_format ); @@ -1363,6 +1343,7 @@ int16_t quantize_direction2D( return idx_sph; } + #ifdef HR_METADATA /*------------------------------------------------------------------------- * ivas_qmetadata_quantize_diffuseness_nrg_ratios() @@ -1375,7 +1356,7 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr( int16_t *needed_bits, int16_t *nbits_diff, int16_t *dfRatioBits, - int16_t bits_dir_hr ) + const int16_t bits_dir_hr ) { int16_t j, k, dir2band; int16_t index_dirRatio1Inv, index_dirRatio2Inv, index_dirRatio1Inv_mod, index_dirRatio2Inv_mod; @@ -1517,17 +1498,15 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr( static void ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr_512( IVAS_QMETADATA_HANDLE hQMetaData, int16_t *needed_bits, - int16_t bits_dir_hr, + const int16_t bits_dir_hr, BSTR_ENC_HANDLE hMetaData ) { int16_t j, k; int16_t index; - needed_bits[0] = 0; needed_bits[1] = 0; - for ( j = hQMetaData->q_direction[0].cfg.start_band; j < hQMetaData->q_direction[0].cfg.nbands; ++j ) { for ( k = 0; k < hQMetaData->q_direction[0].cfg.nblocks; k++ ) @@ -1541,6 +1520,7 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr_512( hQMetaData->q_direction[0].band_data[j].bits_sph_idx[k] = bits_dir_hr; } } + if ( hQMetaData->no_directions == 2 ) { for ( j = hQMetaData->q_direction[1].cfg.start_band; j < hQMetaData->q_direction[1].cfg.nbands; ++j ) @@ -1619,7 +1599,6 @@ static int16_t ivas_qmetadata_entropy_encode_diffuseness_hr( } } - /* Use similarity coding approach or raw coding when there is a low number of bands. */ /* one bit is used to indicate whether diffuseness values are entropy coded or coded raw */ if ( min_diffuseness_m_index == max_diffuseness_m_index ) /* all values are equal */ @@ -1649,7 +1628,6 @@ static int16_t ivas_qmetadata_entropy_encode_diffuseness_hr( } } - *diffuseness_index_max_ec_frame = 10; /* adaptively select the diffuseness_index_max_ec threshold */ if ( min_diffuseness_m_index > 10 ) @@ -1660,7 +1638,6 @@ static int16_t ivas_qmetadata_entropy_encode_diffuseness_hr( #ifdef DEBUGGING assert( ( hMetaData->nb_bits_tot - start_bit_pos ) <= 1 + diffuseness_bits_raw ); #endif - return ( hMetaData->nb_bits_tot - start_bit_pos ); } @@ -2244,7 +2221,7 @@ static void ivas_qmetadata_encode_quasi_uniform( * *------------------------------------------------------------------------*/ -/* !r: number of bits using Golomb Rice code */ +/*! r: number of bits using Golomb Rice code */ static int16_t GR_bits_new( uint16_t *data, /* i : data to encode with GR */ int16_t *no_symb, /* i : number of symbols for each component*/ @@ -2298,7 +2275,7 @@ static int16_t GR_bits_new( * Encoding azimuth indexes with GR code using context *------------------------------------------------------------------------*/ -/* !r: numer of bits used for coding */ +/*! r: numer of bits used for coding */ static int16_t GR_bits_azimuth_context( uint16_t *data_in, /* i : data to be encoded */ int16_t *no_symb, /* i : number of symbols for each component */ @@ -2396,7 +2373,7 @@ static int16_t GR_bits_azimuth_context( * Golomb Rice encoding with mean removing *------------------------------------------------------------------------*/ -/* !r: number of bits used */ +/*! r: number of bits used */ static int16_t mean_removed_GR_new( const uint16_t *idx, /* i : data to encode */ const int16_t max_no_symb, @@ -2486,7 +2463,7 @@ static int16_t ivas_qmetadata_entropy_encode_dir( int16_t max_bits #ifdef HR_METADATA , - int16_t is_hr + const int16_t hrmasa_flag #endif ) { @@ -2532,10 +2509,11 @@ static int16_t ivas_qmetadata_entropy_encode_dir( idx = 0; dist_count = 0; set_zero( avg_direction_vector, 3 ); + for ( i = start_band; i < nbands; i++ ) { #ifdef HR_METADATA - if ( is_hr ) + if ( hrmasa_flag ) { diff_idx_min = 0; // min( q_direction->band_data[i].energy_ratio_index_mod[0]>>1, diff_idx_min ); } @@ -2595,7 +2573,6 @@ static int16_t ivas_qmetadata_entropy_encode_dir( no_th = no_theta_masa[bits_direction_masa[diff_idx_min] - 3]; - for ( i = 0; i < no_th; i++ ) { theta_cb[i] = i * delta_theta_masa[bits_direction_masa[diff_idx_min] - 3]; @@ -2747,6 +2724,7 @@ static int16_t ivas_qmetadata_entropy_encode_dir( } } } + direction_bits_ec += elevation_bits_ec_best; } @@ -2919,6 +2897,7 @@ static int16_t ivas_qmetadata_entropy_encode_dir( } } } + /* encode the ExtendedGR part for azimuth */ ivas_qmetadata_encode_quasi_uniform( hMetaData, ivas_qmetadata_reorder_generic( avg_azimuth_index_best - ( avg_azimuth_alphabet >> 1 ) ), avg_azimuth_alphabet ); @@ -2952,6 +2931,7 @@ static int16_t ivas_qmetadata_entropy_encode_dir( ivas_qmetadata_encode_extended_gr( hMetaData, dist_azimuth_indexes_best[idx], dist_azimuth_alphabets[idx], gr_param_azimuth_best ); } } + if ( dist_count > nblocks ) { if ( ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) && ( nblocks > 1 ) ) @@ -2986,6 +2966,7 @@ static int16_t ivas_qmetadata_entropy_encode_dir( } } } + direction_bits_ec -= bits_gained; } else @@ -4139,7 +4120,7 @@ static ivas_error requantize_direction_EC_3( * writing of the spherical indexes *-------------------------------------------------------------------*/ -/* !r: number of bits written */ +/*! r: number of bits written */ static int16_t write_fixed_rate_direction( BSTR_ENC_HANDLE hMetaData, /* i : MASA metadata structure */ IVAS_QDIRECTION *qdirection, /* i/o: quantized directional parameters */ @@ -4401,7 +4382,7 @@ static void calculate_two_distances( * write metadata using entropy encoding *-------------------------------------------------------------------*/ -/* !r: number of bits written */ +/*! r: number of bits written */ static ivas_error write_ec_direction( int16_t *num_bits_written, /* o : Number of bits written */ BSTR_ENC_HANDLE hMetaData, /* i : MASA metadata structure */ @@ -4575,7 +4556,7 @@ static ivas_error write_ec_direction( * Local functions (coherence Q and coding) *-----------------------------------------------------------------------*/ -/* !r: index */ +/*! r: index */ static uint64_t create_combined_index( uint16_t *idx_dct, /* i : indexes to combine */ const int16_t len, /* i : number of indexes */ @@ -4601,13 +4582,13 @@ static uint64_t create_combined_index( * encoding DCT0 coeffs with joint index *-----------------------------------------------------------------------*/ -/* !r: number of bits written */ +/*! r: number of bits written */ static int16_t encode_coherence_indexesDCT0( uint16_t *idx_dct, /* i : indexes to be encoded */ const int16_t len, /* i : number of indexes */ int16_t *no_cb_vec, /* i : number of codewords for each position */ BSTR_ENC_HANDLE hMetaData, - int16_t indice_coherence, + const int16_t indice_coherence, const int16_t nbits, const int16_t nbits1 ) { @@ -4750,14 +4731,14 @@ static int16_t coherence_coding_length( * Encoding spread coherence for 1 subframe bands *-------------------------------------------------------------------*/ -/* !r: number of bits written */ +/*! r: number of bits written */ static int16_t encode_spread_coherence_1sf( - IVAS_QMETADATA *q_metadata, /* i : quantized metadata */ - const int16_t idx_d, /* i : current direction index */ - BSTR_ENC_HANDLE hMasaMetaData /* i/o: metadata bitstream handle */ + IVAS_QMETADATA *q_metadata, /* i : quantized metadata */ + const int16_t idx_d, /* i : current direction index */ + BSTR_ENC_HANDLE hMasaMetaData /* i/o: metadata bitstream handle */ #ifdef HR_METADATA , - int16_t is_hr + const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding */ #endif ) { @@ -4790,7 +4771,7 @@ static int16_t encode_spread_coherence_1sf( for ( j = 0; j < coding_subbands; j++ ) { #ifdef HR_METADATA - if ( is_hr ) + if ( hrmasa_flag ) { idx_ER = 7 - ( q_direction->band_data[j].energy_ratio_index_mod[0] >> 1 ) + extra_cv; } @@ -4801,6 +4782,7 @@ static int16_t encode_spread_coherence_1sf( #ifdef HR_METADATA } #endif + if ( idx_ER > 0 ) { idx_sp_coh[j] = (uint16_t) roundf( q_direction->coherence_band_data[j].spread_coherence[0] / ( 255.0f / (float) idx_ER ) ); @@ -4945,7 +4927,7 @@ static int16_t encode_spread_coherence_1sf( * encoding surround coherence *-------------------------------------------------------------------*/ -/* !r: number of bits written */ +/*! r: number of bits written */ static int16_t encode_surround_coherence( IVAS_QMETADATA *hQMetaData, /* i : quantized metadata */ BSTR_ENC_HANDLE hMetaData /* i/o: metadata bitstream handle */ @@ -5360,7 +5342,7 @@ static int16_t encode_surround_coherence_hr( * quanization of DCT component of order zero for transformed coherence vector *-------------------------------------------------------------------*/ -/* !r: quantized value */ +/*! r: quantized value */ static float quantize_DCT_0_coh( const float x, /* i : input value */ const int16_t j, /* i : subband index */ @@ -5372,7 +5354,7 @@ static float quantize_DCT_0_coh( int16_t *p_no_cb /* o : actual number of codewords dependent on energy ratio value */ #ifdef HR_METADATA , - int16_t is_hr + const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding */ #endif ) { @@ -5383,8 +5365,9 @@ static float quantize_DCT_0_coh( #endif /* quantize first DCT component */ var_azi = var( q_direction->band_data[j].azimuth, q_direction->cfg.nblocks ); + #ifdef HR_METADATA - if ( is_hr ) + if ( hrmasa_flag ) { minimum_s( (int16_t *) ( q_direction->band_data[j].energy_ratio_index ), q_direction->cfg.nblocks, &min_index ); min_index = min_index >> 1; @@ -5393,6 +5376,7 @@ static float quantize_DCT_0_coh( { min_index = q_direction->band_data[j].energy_ratio_index[0]; } + if ( var_azi < delta_var ) { idx_sub_cb = no_cb * min_index; @@ -5431,7 +5415,7 @@ static float quantize_DCT_0_coh( * Encoding DCT1 coeffs with joint index or EC *-------------------------------------------------------------------*/ -/* !r: number of bits written */ +/*! r: number of bits written */ static int16_t encode_coherence_indexesDCT1( uint16_t *idx_dct, /* i : data to be encoded */ const int16_t len, /* i : number of data */ @@ -5486,13 +5470,20 @@ static void dct4_transform( return; } + #ifdef HR_METADATA +/*-------------------------------------------------------------------* + * ivas_qmetadata_quantize_coherence_hr_512() + * + * + *-------------------------------------------------------------------*/ + static int16_t ivas_qmetadata_quantize_coherence_hr_512( IVAS_QMETADATA *hQMetaData, /* i/o: quantized metadata */ const int16_t idx_d, /* i : current direction index */ const int16_t all_coherence_zero, /* i : all coherence is zero - flag */ BSTR_ENC_HANDLE hMetaData, /* i : metadata handle */ - int16_t bits_coh ) + const int16_t bits_coh ) { int16_t j, k; int16_t nbands, nblocks; @@ -5588,23 +5579,24 @@ static int16_t ivas_qmetadata_quantize_coherence_hr_512( } #endif + /*-------------------------------------------------------------------* * ivas_qmetadata_quantize_coherence() * * *-------------------------------------------------------------------*/ -/* !r: number of bits written */ +/*! r: number of bits written */ static int16_t ivas_qmetadata_quantize_coherence( - IVAS_QMETADATA *hQMetaData, /* i/o: quantized metadata */ - const int16_t idx_d, /* i : current direction index */ - const int16_t all_coherence_zero, /* i : all coherence is zero - flag */ - BSTR_ENC_HANDLE hMetaData, /* i : metadata handle */ - const int16_t write_flag, /* i : flag to actually write the data or not */ + IVAS_QMETADATA *hQMetaData, /* i/o: quantized metadata */ + const int16_t idx_d, /* i : current direction index */ + const int16_t all_coherence_zero, /* i : all coherence is zero - flag */ + BSTR_ENC_HANDLE hMetaData, /* i : metadata handle */ + const int16_t write_flag, /* i : flag to actually write the data or not */ int16_t *indice_coherence #ifdef HR_METADATA , - int16_t is_hr + const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding */ #endif ) { @@ -5638,7 +5630,7 @@ static int16_t ivas_qmetadata_quantize_coherence( nbits = encode_spread_coherence_1sf( hQMetaData, idx_d, hMetaData #ifdef HR_METADATA , - is_hr + hrmasa_flag #endif ); @@ -5695,8 +5687,9 @@ static int16_t ivas_qmetadata_quantize_coherence( { /* DCT transform */ dct4_transform( hQMetaData->q_direction[idx_d].coherence_band_data[j].spread_coherence, dct_coh[j] ); + #ifdef HR_METADATA - if ( is_hr ) + if ( hrmasa_flag ) { minimum_s( (int16_t *) ( q_direction->band_data[j].energy_ratio_index ), q_direction->cfg.nblocks, &min_index ); no_cb_vec[j] = len_cb_dct0_masa[min_index >> 1]; @@ -5715,7 +5708,7 @@ static int16_t ivas_qmetadata_quantize_coherence( dct_coh[j][0] = quantize_DCT_0_coh( dct_coh[j][0], j, coherence_cb0_masa, MASA_DELTA_AZI_DCT0, MASA_NO_CV_COH, q_direction, &idx_dct[k], &no_cb_vec[j] #ifdef HR_METADATA , - is_hr + hrmasa_flag #endif ); } @@ -5880,13 +5873,22 @@ static void ivas_qmetadata_reorder_2dir_bands( return; } + #ifdef HR_METADATA +/*-------------------------------------------------------------------* + * ivas_qmetadata_reorder_2dir_bands_hr() + * + * + *-------------------------------------------------------------------*/ + static void ivas_qmetadata_reorder_2dir_bands_hr( IVAS_QMETADATA_HANDLE hQMetaData ) { - int16_t nbands; - int16_t nsubframes; + int16_t nbands, nsubframes; int16_t band, sf; + uint16_t uint16_tmp; + float flt_tmp; + uint8_t uint8_tmp; nbands = hQMetaData->q_direction[0].cfg.nbands; nsubframes = hQMetaData->q_direction[0].cfg.nblocks; @@ -5895,14 +5897,10 @@ static void ivas_qmetadata_reorder_2dir_bands_hr( { if ( hQMetaData->twoDirBands[band] == 1 ) { - for ( sf = 0; sf < nsubframes; sf++ ) { if ( hQMetaData->q_direction[0].band_data[band].energy_ratio[sf] < hQMetaData->q_direction[1].band_data[band].energy_ratio[sf] ) { - uint16_t uint16_tmp = 0; - float flt_tmp = 0; - uint8_t uint8_tmp = 0; uint16_tmp = hQMetaData->q_direction[0].band_data[band].spherical_index[sf]; hQMetaData->q_direction[0].band_data[band].spherical_index[sf] = hQMetaData->q_direction[1].band_data[band].spherical_index[sf]; hQMetaData->q_direction[1].band_data[band].spherical_index[sf] = uint16_tmp; @@ -5936,6 +5934,7 @@ static void ivas_qmetadata_reorder_2dir_bands_hr( } #endif + /*-------------------------------------------------------------------* * write_2dir_info() * @@ -5952,6 +5951,7 @@ static int16_t write_2dir_info( int16_t p[MASA_MAXIMUM_CODING_SUBBANDS]; uint16_t dif_p[MASA_MAXIMUM_CODING_SUBBANDS]; int16_t i, j; + j = 0; p[0] = 0; for ( i = 0; i < n; i++ ) @@ -5962,6 +5962,7 @@ static int16_t write_2dir_info( j++; } } + dif_p[0] = p[0]; for ( i = 1; i < j; i++ ) { @@ -5982,6 +5983,12 @@ static int16_t write_2dir_info( } +/*-------------------------------------------------------------------* + * transform_azimuth_dir2() + * + * + *-------------------------------------------------------------------*/ + static void transform_azimuth_dir2( IVAS_QMETADATA_HANDLE hQMetaData, int16_t *dir2_bands ) diff --git a/lib_enc/ivas_qspherical_enc.c b/lib_enc/ivas_qspherical_enc.c index 3d2df98217..4c79b875b7 100644 --- a/lib_enc/ivas_qspherical_enc.c +++ b/lib_enc/ivas_qspherical_enc.c @@ -62,7 +62,7 @@ void quantize_direction_frame( float elevation_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES] #ifdef HR_METADATA , - int16_t is_hr + const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding*/ #endif ) { @@ -98,7 +98,7 @@ void quantize_direction_frame( q_direction->not_in_2D += q_direction->band_data[i].elevation_index[j]; #ifdef HR_METADATA - if ( is_hr ) + if ( hrmasa_flag ) { if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) { @@ -127,6 +127,7 @@ void quantize_direction_frame( #ifdef HR_METADATA } #endif + if ( q_direction->band_data[i].azimuth_index[j] == MASA_NO_INDEX ) { q_direction->band_data[i].azimuth_index[j] = 0; @@ -162,6 +163,7 @@ void quantize_direction_frame( return; } + /*-------------------------------------------------------------------* * quantize_direction_frame2D() * @@ -270,6 +272,7 @@ void small_requantize_direction_frame( return; } + /*-------------------------------------------------------------------* * quantize_direction() * @@ -351,7 +354,6 @@ uint16_t quantize_direction( return idx_sph; } - no_th = no_theta_masa[no_bits - 3]; for ( i = 0; i < no_th; i++ ) @@ -497,20 +499,21 @@ uint16_t quantize_direction( return idx_sph; } + /*-------------------------------------------------------------------* * direction_distance_cp() * * quantization distortion calculated on the sphere *----------------------------------------------------------------------*/ -/* !r: distortion value */ +/*! r: distortion value */ static float direction_distance_cp( - float theta, /* i : elevation absolute value */ - float theta_hat, /* i : quantized elevation value in absolute value */ - float theta_hat1, /* i : quantized elevation value in absolute value */ - const float phi, /* i : azimuth value */ - const float phi_hat, /* i : quantized azimuth value */ - const float phi_hat1, /* i : quantized azimuth value */ + float theta, /* i : elevation absolute value */ + float theta_hat, /* i : quantized elevation value in absolute value */ + float theta_hat1, /* i : quantized elevation value in absolute value */ + const float phi, /* i : azimuth value */ + const float phi_hat, /* i : quantized azimuth value */ + const float phi_hat1, /* i : quantized azimuth value */ float *d1 ) { float d, ct, st, st1, st2; @@ -536,28 +539,27 @@ static float direction_distance_cp( * joint quantization of elevation and azimuth *----------------------------------------------------------------------*/ -/* !r: quantized elevation value */ +/*! r: quantized elevation value */ static float quantize_theta_phi( - float *theta_cb, /* i : elevation codebook */ - const int16_t no_th, /* i : elevation codebook size */ - const int16_t *no_phi_loc, /* i : number of azimuth values for each elevation codeword */ - const float abs_theta, /* i : absolute value of elevation to be quantized */ - int16_t *id_phi, /* o : azimuth index */ - int16_t *id_phi_remap, /* o : remapped azimuth index */ - float *phi_hat, /* o : quantized azimuth value */ - const float phi, /* i : input azimuth value; to be quantized */ - const int16_t no_bits, /* i : number of bits used for quantization */ - int16_t *id_theta, /* o : elevation index */ - float *phi_q, /* o : rotated quantized azimuth */ - const int16_t remap, /* i : flag for remapping */ - const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ + float *theta_cb, /* i : elevation codebook */ + const int16_t no_th, /* i : elevation codebook size */ + const int16_t *no_phi_loc, /* i : number of azimuth values for each elevation codeword*/ + const float abs_theta, /* i : absolute value of elevation to be quantized */ + int16_t *id_phi, /* o : azimuth index */ + int16_t *id_phi_remap, /* o : remapped azimuth index */ + float *phi_hat, /* o : quantized azimuth value */ + const float phi, /* i : input azimuth value; to be quantized */ + const int16_t no_bits, /* i : number of bits used for quantization */ + int16_t *id_theta, /* o : elevation index */ + float *phi_q, /* o : rotated quantized azimuth */ + const int16_t remap, /* i : flag for remapping */ + const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ ) { float theta_hat, theta_hat1, phi_hat1; int16_t id_th, id_th1, id_th2, id_ph, id_ph1; float d, d1; - id_th = (int16_t) ( abs_theta / delta_theta_masa[no_bits - 3] ); if ( id_th >= no_th ) { @@ -573,7 +575,6 @@ static float quantize_theta_phi( { if ( ( no_th < 6 ) && mc_format == MC_LS_SETUP_INVALID ) { - if ( id_th == 0 ) { id_th1 = 1; diff --git a/lib_util/masa_file_reader.c b/lib_util/masa_file_reader.c index 95da7818e7..90756a39b1 100644 --- a/lib_util/masa_file_reader.c +++ b/lib_util/masa_file_reader.c @@ -84,7 +84,7 @@ MasaFileReader *MasaFileReader_open( *------------------------------------------------------------------------*/ IVAS_MASA_METADATA_HANDLE MasaFileReader_getMetadataHandle( - MasaFileReader *self /* i/o: MasaFileReader handle */ + MasaFileReader *self /* i/o: MasaFileReader handle */ ) { if ( self == NULL ) @@ -95,21 +95,19 @@ IVAS_MASA_METADATA_HANDLE MasaFileReader_getMetadataHandle( return &self->metadataFrame; } + +#ifndef HR_METADATA /*------------------------------------------------------------------------- * deindex_sph_idx() * * deindex the MASA metadata from the input metadata file *------------------------------------------------------------------------*/ -#ifndef HR_METADATA -static -#endif - void - deindex_sph_idx( - const uint16_t sphIndex, /* i : Spherical index */ - const SPHERICAL_GRID_DATA *gridData, /* i : Prepared spherical grid */ - float *theta, /* o : Elevation */ - float *phi /* o : Azimuth */ - ) +static void deindex_sph_idx( + const uint16_t sphIndex, /* i : Spherical index */ + const SPHERICAL_GRID_DATA *gridData, /* i : Prepared spherical grid */ + float *theta, /* o : Elevation */ + float *phi /* o : Azimuth */ +) { float ba_crt, del_crt, div_crt, a4_crt; float estim; @@ -252,6 +250,7 @@ static return; } +#endif /*------------------------------------------------------------------------- @@ -418,7 +417,7 @@ ivas_error MasaFileReader_readNextFrame( *------------------------------------------------------------------------*/ void MasaFileReader_close( - MasaFileReader **selfPtr /* i/o: pointer to MasaFileReader handle */ + MasaFileReader **selfPtr /* i/o: pointer to MasaFileReader handle */ ) { if ( selfPtr == NULL || *selfPtr == NULL ) -- GitLab From 5c4e3a519ee8d8c56715dcf42d78dcea78847669 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Thu, 11 May 2023 17:38:53 +0200 Subject: [PATCH 128/331] preliminarily fix sanitizer errors --- lib_dec/ivas_dirac_dec.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 3186b1ebf3..274254df61 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -2935,6 +2935,14 @@ void ivas_dirac_dec_render_sf( #endif #ifdef JBM_TSM_ON_TCS +#ifdef JBM_TSM_ON_TCS +#ifdef MASA_PARAMBIN_SF_MAP + md_idx = hDirAC->render_to_md_map[subframe_idx]; +#else + md_idx = hDirAC->render_to_md_map[slot_idx_start]; +#endif +#endif + /* Another workaround for self test BE */ if ( st_ivas->hHeadTrackData && st_ivas->hDecoderConfig->voip_active == 0 ) { @@ -3037,13 +3045,7 @@ void ivas_dirac_dec_render_sf( if ( hDirAC->hConfig->dec_param_estim == FALSE ) #endif { -#ifdef JBM_TSM_ON_TCS -#ifdef MASA_PARAMBIN_SF_MAP - md_idx = hDirAC->render_to_md_map[subframe_idx]; -#else - md_idx = hDirAC->render_to_md_map[slot_idx_start]; -#endif -#endif + /* compute response */ if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) { -- GitLab From 22591097624219f6c2772f2785bd5a6329c69b9e Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Thu, 11 May 2023 18:18:47 +0200 Subject: [PATCH 129/331] fix noumber of SPAR channels --- lib_com/ivas_cnst.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 5640ded12b..f2673408c9 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -209,7 +209,7 @@ typedef enum #define DEFAULT_JBM_CLDFB_TIMESLOTS 16 #define MAX_JBM_L_FRAME48k 1920 #define MAX_JBM_L_FRAME_NS 40000000L -#define MAX_SPAR_INTERNAL_CHANNELS FOA_CHANNELS + 2* ( IVAS_MAX_SBA_ORDER -1 ) +#define MAX_SPAR_INTERNAL_CHANNELS IVAS_SPAR_MAX_CH #define MAX_CLDFB_DIGEST_CHANNELS 4 typedef enum { -- GitLab From ab6eba33f55ef22e3b17bf2a3f33ef9e59d88f72 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Fri, 12 May 2023 09:25:48 +0200 Subject: [PATCH 130/331] Fix HO-DirAC CBR, SBA BR switching still no BE --- lib_dec/ivas_dirac_dec.c | 147 ++++++++++++++++++++++++--------------- 1 file changed, 90 insertions(+), 57 deletions(-) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 274254df61..a19acac344 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -2933,15 +2933,22 @@ void ivas_dirac_dec_render_sf( for ( subframe_idx = sf1; subframe_idx < sf2; subframe_idx++ ) { #endif -#ifdef JBM_TSM_ON_TCS - #ifdef JBM_TSM_ON_TCS #ifdef MASA_PARAMBIN_SF_MAP - md_idx = hDirAC->render_to_md_map[subframe_idx]; + if ( hDirAC->hConfig->dec_param_estim == FALSE ) + { + md_idx = hDirAC->render_to_md_map[subframe_idx]; + } + else + { + md_idx = hDirAC->render_to_md_map[slot_idx_start]; + } #else md_idx = hDirAC->render_to_md_map[slot_idx_start]; #endif #endif +#ifdef JBM_TSM_ON_TCS + /* Another workaround for self test BE */ if ( st_ivas->hHeadTrackData && st_ivas->hDecoderConfig->voip_active == 0 ) @@ -3163,6 +3170,14 @@ void ivas_dirac_dec_render_sf( { #ifdef JBM_TSM_ON_TCS index_slot = slot_idx_start + slot_idx; + if ( hDirAC->hConfig->dec_param_estim == TRUE ) + { + md_idx = hDirAC->render_to_md_map[index_slot]; + } + else + { + md_idx = hDirAC->render_to_md_map[subframe_idx]; + } #else index_slot = subframe_idx * hDirAC->subframe_nbslots + slot_idx; #endif @@ -3181,11 +3196,19 @@ void ivas_dirac_dec_render_sf( for ( ch = 0; ch < nchan_transport; ch++ ) { #ifdef JBM_TSM_ON_TCS +#ifdef SPAR_TUNING + cldfbAnalysis_ts( &( st_ivas->hTcBuffer->tc[hDirAC->sba_map_tc[ch]][hDirAC->num_freq_bands * index_slot] ), + Cldfb_RealBuffer[ch][0], + Cldfb_ImagBuffer[ch][0], + hDirAC->num_freq_bands, + st_ivas->cldfbAnaDec[ch] ); +#else cldfbAnalysis_ts( &( st_ivas->hTcBuffer->tc[sba_map_tc[ch]][hDirAC->num_freq_bands * index_slot] ), Cldfb_RealBuffer[ch][0], Cldfb_ImagBuffer[ch][0], hDirAC->num_freq_bands, st_ivas->cldfbAnaDec[ch] ); +#endif #else #ifdef SPAR_TUNING cldfbAnalysis_ts( &( output_f[hDirAC->sba_map_tc[ch]][hDirAC->num_freq_bands * index_slot] ), @@ -3233,11 +3256,7 @@ void ivas_dirac_dec_render_sf( Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS - 1], Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS - 1], slot_idx, #ifdef JBM_TSM_ON_TCS -#ifdef MASA_PARAMBIN_SF_MAP - hDirAC->render_to_md_map[subframe_idx], -#else - hDirAC->render_to_md_map[index_slot], -#endif + md_idx, #else subframe_idx, #endif @@ -3559,7 +3578,7 @@ void ivas_dirac_dec_render_sf( st_ivas->hVBAPdata, hDirAC->hOutSetup, nchan_transport, - hDirAC->render_to_md_map[index_slot], + md_idx, #ifdef HODIRAC st_ivas->sba_analysis_order > 1 && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k @@ -3586,7 +3605,7 @@ void ivas_dirac_dec_render_sf( st_ivas->hVBAPdata, hDirAC->hOutSetup, nchan_transport, - hDirAC->render_to_md_map[index_slot], + md_idx, #ifdef HODIRAC st_ivas->sba_analysis_order > 1 && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k @@ -3615,6 +3634,64 @@ void ivas_dirac_dec_render_sf( #endif #ifdef JBM_TSM_ON_TCS ivas_dirac_dec_output_synthesis_get_interpolator( &hDirAC->h_output_synthesis_psd_params, hDirAC->subframe_nbslots[subframe_idx] ); +#ifdef MASA_PARAMBIN_SF_MAP + if ( hDirAC->hConfig->dec_param_estim == FALSE ) + { + md_idx = hDirAC->render_to_md_map[subframe_idx]; + } + else + { + md_idx = hDirAC->render_to_md_map[slot_idx_start]; + } +#else + md_idx = hDirAC->render_to_md_map[slot_idx_start]; +#endif + +#ifdef MASA_PARAMBIN_SF_MAP + /* Workaround for BE (should be gone when #393 is adressed and diffuseness index in the gain SHD renderer with HO-DirAC is fixed) */ + /* :TODO: remove */ + /* get the correct md index for the diffuseness in direction smoothing and HO-DirAC, it is always the first slot of the next subframe*/ + if ( slot_idx_start + hDirAC->subframe_nbslots[subframe_idx] == hDirAC->num_slots ) + { + /* we are at the end, get the next one using the normal dirac read idx...*/ + if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 ) + { + md_idx = ( hDirAC->dirac_read_idx + DEFAULT_JBM_CLDFB_TIMESLOTS ) % hDirAC->dirac_md_buffer_length; + } + else + { + md_idx = ( hDirAC->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % hDirAC->dirac_md_buffer_length; + } + } + else + { + if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 ) + { + md_idx = hDirAC->render_to_md_map[slot_idx_start + hDirAC->subframe_nbslots[subframe_idx]]; + } + else + { + md_idx = hDirAC->render_to_md_map[subframe_idx + 1]; + } + } +#else + if ( slot_idx_start + hDirAC->subframe_nbslots[subframe_idx] == hDirAC->num_slots ) + { + /* we are at the end, get the next one using the normal dirac read idx...*/ + if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 ) + { + md_idx = ( hDirAC->dirac_read_idx + DEFAULT_JBM_CLDFB_TIMESLOTS ) % hDirAC->dirac_md_buffer_length; + } + else + { + md_idx = ( hDirAC->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % hDirAC->dirac_md_buffer_length; + } + } + else + { + md_idx = hDirAC->render_to_md_map[slot_idx_start + hDirAC->subframe_nbslots[subframe_idx]]; + } +#endif #endif if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { @@ -3639,9 +3716,7 @@ void ivas_dirac_dec_render_sf( { /* Determine encoding quality based additional smoothing factor */ float qualityBasedSmFactor = 1.0f; -#ifdef JBM_TSM_ON_TCS - int16_t diff_md_idx; -#endif + if ( st_ivas->hMasa != NULL ) { qualityBasedSmFactor = st_ivas->hMasa->data.dir_decode_quality; @@ -3659,49 +3734,7 @@ void ivas_dirac_dec_render_sf( mvr2r( diffuseness_vector[slot_idx], hDirAC->diffuseness_vector[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], num_freq_bands ); } } - /* get the correct md index for the direction smoothing, it is always the first slot of the next subframe*/ -#ifdef MASA_PARAMBIN_SF_MAP - if ( slot_idx_start + hDirAC->subframe_nbslots[subframe_idx] == hDirAC->num_slots ) - { - /* we are at the end, get the next one using the normal dirac read idx...*/ - if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 ) - { - diff_md_idx = ( hDirAC->dirac_read_idx + DEFAULT_JBM_CLDFB_TIMESLOTS ) % hDirAC->dirac_md_buffer_length; - } - else - { - diff_md_idx = ( hDirAC->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % hDirAC->dirac_md_buffer_length; - } - } - else - { - if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 ) - { - diff_md_idx = hDirAC->render_to_md_map[slot_idx_start + hDirAC->subframe_nbslots[subframe_idx]]; - } - else - { - diff_md_idx = hDirAC->render_to_md_map[subframe_idx + 1]; - } - } -#else - if ( slot_idx_start + hDirAC->subframe_nbslots[subframe_idx] == hDirAC->num_slots ) - { - /* we are at the end, get the next one using the normal dirac read idx...*/ - if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 ) - { - diff_md_idx = ( hDirAC->dirac_read_idx + DEFAULT_JBM_CLDFB_TIMESLOTS ) % hDirAC->dirac_md_buffer_length; - } - else - { - diff_md_idx = ( hDirAC->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % hDirAC->dirac_md_buffer_length; - } - } - else - { - diff_md_idx = hDirAC->render_to_md_map[slot_idx_start + hDirAC->subframe_nbslots[subframe_idx]]; - } -#endif + #endif ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( Cldfb_RealBuffer, @@ -3709,7 +3742,7 @@ void ivas_dirac_dec_render_sf( hDirAC, #ifdef JBM_TSM_ON_TCS hDirAC->subframe_nbslots[subframe_idx], - diff_md_idx, + md_idx, #endif reference_power_smooth, qualityBasedSmFactor ); -- GitLab From d2ee4f8e682f8d28ed02e57f4d34a86e947ad5af Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Fri, 12 May 2023 10:53:23 +0200 Subject: [PATCH 131/331] fix SBA JBM BR switching --- lib_dec/ivas_sba_dec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index a1c03ab008..28920ccf53 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -398,7 +398,7 @@ ivas_error ivas_sba_dec_reconfigure( } else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) { - st_ivas->nchan_transport = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order + tc_nchan_to_allocate = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order #ifdef SPAR_TUNING , st_ivas->hDecoderConfig->ivas_total_brate -- GitLab From e1f21b832615b373ff036fcede9c3306670c222d Mon Sep 17 00:00:00 2001 From: knj Date: Fri, 12 May 2023 11:11:45 +0200 Subject: [PATCH 132/331] use st->total_brate in FD cng configuration for SCEs --- lib_com/options.h | 2 ++ lib_enc/ivas_core_pre_proc_front.c | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 62717d9ad7..66492a74eb 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -214,6 +214,8 @@ //#define HODIRAC_READ_PARAMS #endif +#define FIX_443_FD_CNG_INIT /* FhG: correct bitrate value for FD-CNG init */ + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_enc/ivas_core_pre_proc_front.c b/lib_enc/ivas_core_pre_proc_front.c index cf23ddef53..4b016d44ac 100644 --- a/lib_enc/ivas_core_pre_proc_front.c +++ b/lib_enc/ivas_core_pre_proc_front.c @@ -563,7 +563,14 @@ ivas_error pre_proc_front_ivas( if ( st->hFdCngEnc != NULL && ( st->ini_frame == 0 || last_element_brate != element_brate || st->last_bwidth != st->bwidth ) ) { +#ifdef FIX_443_FD_CNG_INIT + int16_t total_brate; + + total_brate = ( element_mode == IVAS_SCE ) ? st->total_brate : st->bits_frame_nominal * FRAMES_PER_SEC; + configureFdCngEnc( st->hFdCngEnc, max( st->input_bwidth, WB ), total_brate ); +#else configureFdCngEnc( st->hFdCngEnc, max( st->input_bwidth, WB ), st->bits_frame_nominal * FRAMES_PER_SEC ); +#endif if ( hCPE != NULL ) { st->hFdCngEnc->hFdCngCom->CngBitrate = hCPE->element_brate - 1; -- GitLab From 77b810b4742a6447f8161b65fa4d130427894f46 Mon Sep 17 00:00:00 2001 From: knj Date: Fri, 12 May 2023 11:23:34 +0200 Subject: [PATCH 133/331] fix warning on windows --- lib_enc/ivas_core_pre_proc_front.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/ivas_core_pre_proc_front.c b/lib_enc/ivas_core_pre_proc_front.c index 4b016d44ac..b0f4f45495 100644 --- a/lib_enc/ivas_core_pre_proc_front.c +++ b/lib_enc/ivas_core_pre_proc_front.c @@ -566,7 +566,7 @@ ivas_error pre_proc_front_ivas( #ifdef FIX_443_FD_CNG_INIT int16_t total_brate; - total_brate = ( element_mode == IVAS_SCE ) ? st->total_brate : st->bits_frame_nominal * FRAMES_PER_SEC; + total_brate = ( element_mode == IVAS_SCE ) ? st->total_brate : (int16_t) ( st->bits_frame_nominal * FRAMES_PER_SEC ); configureFdCngEnc( st->hFdCngEnc, max( st->input_bwidth, WB ), total_brate ); #else configureFdCngEnc( st->hFdCngEnc, max( st->input_bwidth, WB ), st->bits_frame_nominal * FRAMES_PER_SEC ); -- GitLab From 309d0b29e0ef96b22e06f8425a61b2cce3c58e2d Mon Sep 17 00:00:00 2001 From: knj Date: Fri, 12 May 2023 11:30:05 +0200 Subject: [PATCH 134/331] fix data type --- lib_enc/ivas_core_pre_proc_front.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_enc/ivas_core_pre_proc_front.c b/lib_enc/ivas_core_pre_proc_front.c index b0f4f45495..5f775d2403 100644 --- a/lib_enc/ivas_core_pre_proc_front.c +++ b/lib_enc/ivas_core_pre_proc_front.c @@ -564,9 +564,9 @@ ivas_error pre_proc_front_ivas( if ( st->hFdCngEnc != NULL && ( st->ini_frame == 0 || last_element_brate != element_brate || st->last_bwidth != st->bwidth ) ) { #ifdef FIX_443_FD_CNG_INIT - int16_t total_brate; + int32_t total_brate; - total_brate = ( element_mode == IVAS_SCE ) ? st->total_brate : (int16_t) ( st->bits_frame_nominal * FRAMES_PER_SEC ); + total_brate = ( element_mode == IVAS_SCE ) ? st->total_brate : st->bits_frame_nominal * FRAMES_PER_SEC; configureFdCngEnc( st->hFdCngEnc, max( st->input_bwidth, WB ), total_brate ); #else configureFdCngEnc( st->hFdCngEnc, max( st->input_bwidth, WB ), st->bits_frame_nominal * FRAMES_PER_SEC ); -- GitLab From 8a41c3f5d184f8c66fb0243da7720801fc73b2b2 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Fri, 12 May 2023 11:30:58 +0200 Subject: [PATCH 135/331] fix compile errors in the JBM path --- lib_dec/ivas_jbm_dec.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 361754f2e3..13a062fd93 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -131,7 +131,11 @@ ivas_error ivas_jbm_dec_tc( } if ( st_ivas->renderer_type == RENDERER_MC && st_ivas->hDecoderConfig->nchan_out == 1 ) { +#ifdef MC_PARAMUPMIX_MODE + ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output ); +#else ivas_ls_setup_conversion( st_ivas, output_frame, p_output, p_output ); +#endif } } else if ( st_ivas->ivas_format == ISM_FORMAT ) @@ -363,7 +367,11 @@ ivas_error ivas_jbm_dec_tc( { if ( st_ivas->renderer_type == RENDERER_MC ) { +#ifdef MC_PARAMUPMIX_MODE + ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output ); +#else ivas_ls_setup_conversion( st_ivas, output_frame, p_output, p_output ); +#endif } else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) { @@ -400,7 +408,11 @@ ivas_error ivas_jbm_dec_tc( /* Rendering */ if ( output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) { +#ifdef MC_PARAMUPMIX_MODE + ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output ); +#else ivas_ls_setup_conversion( st_ivas, output_frame, p_output, p_output ); +#endif } } else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) @@ -674,7 +686,11 @@ ivas_error ivas_jbm_dec_render( if ( st_ivas->renderer_type == RENDERER_MC ) { *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); - ivas_ls_setup_conversion( st_ivas, *nSamplesRendered, p_tc, p_output ); +#ifdef MC_PARAMUPMIX_MODE + ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, *nSamplesRendered, p_tc, p_output ); +#else + ivas_ls_setup_conversion( st_ivas, output_frame, p_output, p_output ); +#endif } } else if ( st_ivas->ivas_format == ISM_FORMAT ) @@ -806,7 +822,11 @@ ivas_error ivas_jbm_dec_render( else if ( st_ivas->renderer_type == RENDERER_MC ) { *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); +#ifdef MC_PARAMUPMIX_MODE + ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, *nSamplesRendered, p_tc, p_output ); +#else ivas_ls_setup_conversion( st_ivas, *nSamplesRendered, p_tc, p_output ); +#endif } else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) { -- GitLab From d1b226baab278b19b0288ec4d07a5bf9f2e0d186 Mon Sep 17 00:00:00 2001 From: Shikha Shetgeri <100861@ittiam.com> Date: Fri, 12 May 2023 15:07:39 +0530 Subject: [PATCH 136/331] path correction --- tests/test_param_file.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_param_file.py b/tests/test_param_file.py index 7b3f172daf..96bb83b1b4 100644 --- a/tests/test_param_file.py +++ b/tests/test_param_file.py @@ -201,10 +201,10 @@ def test_param_file_tests( ) # SID : Update bitstream if sba_dtx_first_SID == 1: - dut_out_dir = f"{dut_base_path}\\param_file\\enc" - ref_out_dir = f"{reference_path}\\param_file\\enc" - ref_out_file = f"{ref_out_dir}\\{bitstream_file}" - dut_out_file = f"{dut_out_dir}\\{bitstream_file}" + dut_out_dir = f"{dut_base_path}/param_file/enc" + ref_out_dir = f"{reference_path}/param_file/enc" + ref_out_file = f"{ref_out_dir}/{bitstream_file}" + dut_out_file = f"{dut_out_dir}/{bitstream_file}" ref_out_file_cut = ref_out_file +"_cut" dut_out_file_cut = dut_out_file +"_cut" -- GitLab From 64964adfbb394b66b57db3b24939955b1ccdbe7a Mon Sep 17 00:00:00 2001 From: knj Date: Fri, 12 May 2023 11:59:40 +0200 Subject: [PATCH 137/331] only run EVS conformance test on main --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 96ea0708d6..5d4cdd72f2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -657,7 +657,7 @@ clang-format-check: # check bitexactness to EVS windows binaries be-2-evs-windows: extends: - - .rules-basis + - .rules-main-push tags: - ivas-windows stage: test -- GitLab From de16a98ed9e913d1dbd3b6ce03e02af34d1cdca3 Mon Sep 17 00:00:00 2001 From: Vidhya V P <100825@ittiam.com> Date: Fri, 12 May 2023 16:13:55 +0530 Subject: [PATCH 138/331] Made changes for Max MD bits calculation --- lib_com/ivas_cnst.h | 3 +++ lib_com/ivas_spar_com.c | 15 +++++++++++++-- lib_com/options.h | 1 + lib_dec/ivas_spar_md_dec.c | 6 ++++-- lib_enc/ivas_sba_enc.c | 14 +++++++++++++- lib_enc/ivas_spar_encoder.c | 7 ++++++- lib_enc/ivas_spar_md_enc.c | 7 ++++++- 7 files changed, 46 insertions(+), 7 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 228419b25d..edcfa1b230 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1690,6 +1690,9 @@ typedef enum #define IVAS_FB_BANDS_12 12 #define IVAS_FB_BANDS_20 20 #define IVAS_MAX_NUM_BANDS IVAS_FB_BANDS_12 +#ifdef ARITH_HUFF_CODER_CHANGES_1 +#define IVAS_MAX_NUM_BANDS_VLBR 6 +#endif #define IVAS_MAX_NUM_FB_BANDS IVAS_FB_BANDS_20 #define IVAS_FB_12_1MS_LEN ( IVAS_FB_12_1MS_48K_END_BINS_BAND_0 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_0 ) + ( IVAS_FB_12_1MS_48K_END_BINS_BAND_1 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_1 ) + ( IVAS_FB_12_1MS_48K_END_BINS_BAND_2 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_2 ) + ( IVAS_FB_12_1MS_48K_END_BINS_BAND_3 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_3 ) + ( IVAS_FB_12_1MS_48K_END_BINS_BAND_4 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_4 ) + ( IVAS_FB_12_1MS_48K_END_BINS_BAND_5 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_5 ) + ( IVAS_FB_12_1MS_48K_END_BINS_BAND_6 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_6 ) + ( IVAS_FB_12_1MS_48K_END_BINS_BAND_7 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_7 ) + ( IVAS_FB_12_1MS_48K_END_BINS_BAND_8 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_8 ) + ( IVAS_FB_12_1MS_48K_END_BINS_BAND_9 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_9 ) + ( IVAS_FB_12_1MS_48K_END_BINS_BAND_10 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_10 ) + ( IVAS_FB_12_1MS_48K_END_BINS_BAND_11 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_11 ) #define IVAS_16K_12BANDS_ACTIVE_BANDS 10 diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index 966f6c35d0..b7e82e7fd3 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -2198,10 +2198,21 @@ void ivas_spar_set_bitrate_config( pSpar_md_cfg->tgt_bits_per_blk -= md_coding_bits_header; pSpar_md_cfg->max_bits_per_blk -= md_coding_bits_header; - +#ifdef ARITH_HUFF_CODER_CHANGES_1 + if ( ivas_total_brate < IVAS_24k4 ) + { + pSpar_md_cfg->tgt_bits_per_blk = (int16_t) ceilf( ( 1.0f * pSpar_md_cfg->tgt_bits_per_blk * num_bands ) / IVAS_MAX_NUM_BANDS_VLBR ); + pSpar_md_cfg->max_bits_per_blk = (int16_t) ceilf( ( 1.0f * pSpar_md_cfg->max_bits_per_blk * num_bands ) / IVAS_MAX_NUM_BANDS_VLBR ); + } + else + { + pSpar_md_cfg->tgt_bits_per_blk = (int16_t) ceilf( ( 1.0f * pSpar_md_cfg->tgt_bits_per_blk * num_bands ) / IVAS_MAX_NUM_BANDS ); + pSpar_md_cfg->max_bits_per_blk = (int16_t) ceilf( ( 1.0f * pSpar_md_cfg->max_bits_per_blk * num_bands ) / IVAS_MAX_NUM_BANDS ); + } +#else pSpar_md_cfg->tgt_bits_per_blk = (int16_t) ceilf( ( 1.0f * pSpar_md_cfg->tgt_bits_per_blk * num_bands ) / IVAS_MAX_NUM_BANDS ); pSpar_md_cfg->max_bits_per_blk = (int16_t) ceilf( ( 1.0f * pSpar_md_cfg->max_bits_per_blk * num_bands ) / IVAS_MAX_NUM_BANDS ); - +#endif pSpar_md_cfg->tgt_bits_per_blk += md_coding_bits_header; pSpar_md_cfg->max_bits_per_blk += md_coding_bits_header; diff --git a/lib_com/options.h b/lib_com/options.h index ab66559806..5112c4967e 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -193,6 +193,7 @@ #define FIX_445_SNS_BUGFIXES /* FhG: bug fix for spectral tilt in SNS computation + necessary update of codebooks and converison to fixedpoint-compatible tables */ #define ARITH_HUFF_CODER_CHANGES /* DLB: Optimization of metadata memory for Huffman and arithmetic coders */ +#define ARITH_HUFF_CODER_CHANGES_1 /* DLB: additional changes for Huffman and arithmetic coders*/ #define FIX_447_PARAMBIN_MASA_REGU_FAC /* Nokia: Issue 447: Fix issue by adjusting regularization factor minimum value. */ #define FIX_441_SBA_PARAMBIN_GAINS /* Nokia: Fix issue 441 by changing gains in SBA path of parametric binauralizer */ diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index e9810cc17b..897f13e353 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -525,9 +525,11 @@ ivas_error ivas_spar_md_dec_init( #ifdef SPAR_TUNING ivas_sba_get_spar_hoa_ch_ind( num_channels, hDecoderConfig->ivas_total_brate, hMdDec->HOA_md_ind ); #endif - +#ifdef ARITH_HUFF_CODER_CHANGES_1 + hMdDec->spar_md.num_bands = ( hMdDec->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : ( ( hDecoderConfig->ivas_total_brate < IVAS_24k4 ) ? IVAS_MAX_NUM_BANDS_VLBR : min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ) ); +#else hMdDec->spar_md.num_bands = ( hMdDec->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); - +#endif ivas_spar_set_bitrate_config( &hMdDec->spar_md_cfg, hMdDec->table_idx, hMdDec->spar_md.num_bands #ifdef ARITH_HUFF_CODER_CHANGES , diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index 4e0984b2da..adac8f8f46 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -266,8 +266,20 @@ int16_t ivas_sba_get_max_md_bits( Encoder_Struct *st_ivas ) { int16_t max_md_bits; - +#ifndef ARITH_HUFF_CODER_CHANGES max_md_bits = min( st_ivas->hQMetaData->metadata_max_bits + 1, 500 ); // TODO: remove 500 once max MD bits has been defined at all bitrates in DirAC +#else + int16_t max_bits; + if ( ( st_ivas->sba_analysis_order > 1 ) && ( st_ivas->hEncoderConfig->ivas_total_brate > IVAS_256k ) ) + { + max_bits = 2000; + } + else + { + max_bits = 500; + } + max_md_bits = min( st_ivas->hQMetaData->metadata_max_bits + 1, max_bits ); // TODO: remove 500 once max MD bits has been defined at all bitrates in DirAC +#endif if ( st_ivas->sba_mode == SBA_MODE_SPAR ) { max_md_bits += st_ivas->hSpar->hMdEnc->spar_md_cfg.max_md_bits_spar; diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 183614d039..8f8bb73601 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -733,7 +733,12 @@ static ivas_error ivas_spar_enc_process( } else { - ivas_spar_set_bitrate_config( &hSpar->hMdEnc->spar_md_cfg, table_idx, ( hSpar->hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND + ivas_spar_set_bitrate_config( &hSpar->hMdEnc->spar_md_cfg, table_idx, +#ifndef ARITH_HUFF_CODER_CHANGES_1 + ( hSpar->hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND +#else + ( hSpar->hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : ( ivas_total_brate < IVAS_24k4 ? IVAS_MAX_NUM_BANDS_VLBR : SPAR_DIRAC_SPLIT_START_BAND ) +#endif #ifdef ARITH_HUFF_CODER_CHANGES , 1, hEncoderConfig->Opt_PCA_ON, diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index d746b5444d..c4bfb3b7d2 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -340,7 +340,12 @@ ivas_error ivas_spar_md_enc_init( #endif table_idx = ivas_get_spar_table_idx( hEncoderConfig->ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL ); - ivas_spar_set_bitrate_config( &hMdEnc->spar_md_cfg, table_idx, ( hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND + ivas_spar_set_bitrate_config( &hMdEnc->spar_md_cfg, table_idx, +#ifndef ARITH_HUFF_CODER_CHANGES_1 + ( hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND +#else + ( hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : ( hEncoderConfig->ivas_total_brate < IVAS_24k4 ? IVAS_MAX_NUM_BANDS_VLBR : SPAR_DIRAC_SPLIT_START_BAND ) +#endif #ifdef ARITH_HUFF_CODER_CHANGES , 1, hEncoderConfig->Opt_PCA_ON, -- GitLab From 8df2e959797a5e6c4eb216f66124a439faad7bac Mon Sep 17 00:00:00 2001 From: Shikha Shetgeri <100861@ittiam.com> Date: Fri, 12 May 2023 16:28:13 +0530 Subject: [PATCH 139/331] disabling agc --- lib_com/options.h | 2 +- tests/conftest.py | 4 ---- tests/test_sba_bs_dec_plc.py | 9 +------- tests/test_sba_bs_enc.py | 40 ++++-------------------------------- 4 files changed, 6 insertions(+), 49 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index e68aca0ef1..5784e1d333 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -125,7 +125,7 @@ #endif /*#define SPAR_HOA_DBG*/ /* SPAR HOA debug statements */ /*#define DEBUG_BINAURAL_FILTER_DESIGN*/ /* debugging of Crend binaural filter design */ -#define DEBUG_AGC_ENCODER_CMD_OPTION /* Ability to force enable or disable AGC behaviour in DIRAC/SPAR via command line option */ +//#define DEBUG_AGC_ENCODER_CMD_OPTION /* Ability to force enable or disable AGC behaviour in DIRAC/SPAR via command line option */ #endif /* #################### End DEBUGGING switches ############################ */ diff --git a/tests/conftest.py b/tests/conftest.py index ef5f46ffc9..d7a35a36e0 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -196,7 +196,6 @@ class EncoderFrontend: sba_order: Optional[str] = None, dtx_mode: Optional[bool] = False, max_band: Optional[str] = None, - agc_op: Optional[int] = None, bypass_mode: Optional[int] = None, quiet_mode: Optional[bool] = True, add_option_list: Optional[list] = None, @@ -213,9 +212,6 @@ class EncoderFrontend: if max_band is not None: command.extend(["-max_band", max_band]) - if agc_op is not None: - command.extend(["-agc", str(agc_op)]) - if bypass_mode is not None: command.extend(["-bypass", str(bypass_mode)]) diff --git a/tests/test_sba_bs_dec_plc.py b/tests/test_sba_bs_dec_plc.py index 4920a9c59c..40a9965bd1 100644 --- a/tests/test_sba_bs_dec_plc.py +++ b/tests/test_sba_bs_dec_plc.py @@ -47,7 +47,6 @@ plc_patterns = ['PLperc12mblen5', 'PLperc40mblen50', 'PLperc42mblen2'] dtx_set = ['0', '1'] ivas_br_list = ['32000', '64000', '96000', '256000'] sampling_rate_list = ['48', '32', '16'] -agc_list = [-1, 0, 1] AbsTol = '0' @@ -73,7 +72,6 @@ def check_and_makedir(dir_path): @pytest.mark.parametrize("tag", tag_list) @pytest.mark.parametrize("plc_pattern", plc_patterns) @pytest.mark.parametrize("fs", sampling_rate_list) -@pytest.mark.parametrize("agc", agc_list) def test_sba_plc_system( dut_decoder_frontend: DecoderFrontend, test_vector_path, @@ -86,8 +84,7 @@ def test_sba_plc_system( dtx, tag, plc_pattern, - fs, - agc + fs ): if dtx == '1' and ivas_br not in ['32000', '64000']: # skip high bitrates for DTX until DTX issue is resolved @@ -108,7 +105,6 @@ def test_sba_plc_system( dtx, plc_pattern, update_ref, - agc, keep_files, ) @@ -127,15 +123,12 @@ def sba_dec_plc( dtx, plc_pattern, update_ref, - agc, keep_files, ): # ------------ run cmd ------------ tag_out = f"{tag}_ivasbr{ivas_br[:-3]}k_DTX{dtx}" - if agc != -1: - tag_out += f'_AGC{agc}' plc_tag_out = f"{tag_out}_{plc_pattern}" dut_out_dir = f"{dut_base_path}/sba_bs/raw" diff --git a/tests/test_sba_bs_enc.py b/tests/test_sba_bs_enc.py index 6825ee12ba..59fde6a16e 100644 --- a/tests/test_sba_bs_enc.py +++ b/tests/test_sba_bs_enc.py @@ -59,7 +59,6 @@ ivas_br_HOA3 = ['256000', '384000', '512000'] sample_rate_list = ['48', '32', '16'] bypass_list = [1, 2] -agc_list = [-1, 0, 1] sample_rate_bw_idx_list = [('48', 'SWB'), ('48', 'WB'), ('32', 'WB')] @@ -100,7 +99,6 @@ def test_bypass_enc( ivas_br = '256000' dtx = '0' max_bw = "FB" - agc = -1 sba_order = "+1" output_config = "FOA" @@ -118,7 +116,6 @@ def test_bypass_enc( dtx, max_bw, bypass, - agc, sba_order, update_ref, cut_testv=True @@ -136,7 +133,6 @@ def test_bypass_enc( dtx, max_bw, bypass, - agc, output_config, update_ref, keep_files, @@ -148,7 +144,6 @@ def test_bypass_enc( @pytest.mark.parametrize("dtx", dtx_set) @pytest.mark.parametrize("tag", tag_list) @pytest.mark.parametrize("fs", sample_rate_list) -@pytest.mark.parametrize("agc", agc_list) def test_sba_enc_system( dut_encoder_frontend: EncoderFrontend, dut_decoder_frontend: DecoderFrontend, @@ -164,12 +159,11 @@ def test_sba_enc_system( dtx, tag, fs, - agc, ): if dtx == '1' and ivas_br not in ['32000', '64000']: # skip high bitrates for DTX until DTX issue is resolved pytest.skip() - if ivas_br == 'sw_24k4_256k.bin' and agc != 1: + if ivas_br == 'sw_24k4_256k.bin': pytest.skip() tag = tag + fs + 'c' @@ -177,9 +171,7 @@ def test_sba_enc_system( bypass = -1 sba_order = "+1" output_config = "FOA" - if agc == 1: - cut_gain = "16.0" - elif dtx == '1': + if dtx == '1': cut_gain = ".004" else: cut_gain = "1.0" @@ -197,7 +189,6 @@ def test_sba_enc_system( dtx, max_bw, bypass, - agc, sba_order, update_ref, cut_gain=cut_gain, @@ -217,7 +208,6 @@ def test_sba_enc_system( dtx, max_bw, bypass, - agc, output_config, update_ref, keep_files, @@ -242,7 +232,6 @@ def test_spar_hoa2_enc_system( ): fs = '48' dtx = '0' - agc = -1 tag = tag + fs + 'c' max_bw = "FB" @@ -264,7 +253,6 @@ def test_spar_hoa2_enc_system( dtx, max_bw, bypass, - agc, sba_order, update_ref, ) @@ -281,7 +269,6 @@ def test_spar_hoa2_enc_system( dtx, max_bw, bypass, - agc, output_config, update_ref, keep_files, @@ -306,8 +293,6 @@ def test_spar_hoa3_enc_system( ): fs = '48' dtx = '0' - agc = -1 - tag = tag + fs + 'c' max_bw = "FB" bypass = -1 @@ -328,7 +313,6 @@ def test_spar_hoa3_enc_system( dtx, max_bw, bypass, - agc, sba_order, update_ref, ) @@ -345,7 +329,6 @@ def test_spar_hoa3_enc_system( dtx, max_bw, bypass, - agc, output_config, update_ref, keep_files, @@ -381,7 +364,6 @@ def test_sba_enc_BWforce_system( bw = sample_rate_bw_idx[1] tag = tag + fs + 'c' bypass = -1 - agc = -1 sba_order = "+1" output_config = "FOA" @@ -399,7 +381,6 @@ def test_sba_enc_BWforce_system( dtx, bw, bypass, - agc, sba_order, update_ref, cut_testv=True @@ -417,7 +398,6 @@ def test_sba_enc_BWforce_system( dtx, bw, bypass, - agc, output_config, update_ref, keep_files, @@ -439,7 +419,6 @@ def sba_enc( dtx, ivas_max_bw, bypass, - agc, sba_order, update_ref, cut_gain='1.0', @@ -466,20 +445,16 @@ def sba_enc( if ivas_br == 'sw_24k4_256k.bin': ivas_br = f"{br_switch_file_path}/sw_24k4_256k.bin" short_tag_ext = "" - if agc != -1: - short_tag_ext += f'_AGC{agc}' # we update only bypass = 0/2 (bypass 1 is the same as the baseline) if bypass in [0, 2]: short_tag_ext += f"_pca{bypass}" # to avoid conflicting names in case of parallel test execution, differentiate all cases - long_tag_ext = f"_AGC{agc}" if agc != -1 else "_AGC-unspecified" - long_tag_ext += f"_pca{bypass}" + long_tag_ext = f"_pca{bypass}" dut_pkt_file = f"{dut_out_dir}/{tag_out}{long_tag_ext}.pkt" ref_pkt_file = f"{ref_out_dir}/{tag_out}{short_tag_ext}.pkt" ref_pkt_file_dutenc = f"{ref_out_dir}/{tag_out}{short_tag_ext}_dutenc.pkt" input_path = f"{test_vector_path}/{tag_in}{in_extension}" - agc_op = agc if agc != -1 else None bypass_mode = bypass if bypass >= 0 else None dtx_mode = dtx == '1' @@ -507,7 +482,6 @@ def sba_enc( ref_pkt_file, sba_order=sba_order, max_band=ivas_max_bw, - agc_op=agc_op, bypass_mode=bypass_mode, dtx_mode=dtx_mode, ) @@ -520,7 +494,6 @@ def sba_enc( ref_pkt_file_dutenc, sba_order=sba_order, max_band=ivas_max_bw, - agc_op=agc_op, bypass_mode=bypass_mode, dtx_mode=dtx_mode, ) @@ -534,7 +507,6 @@ def sba_enc( dut_pkt_file, sba_order=sba_order, max_band=ivas_max_bw, - agc_op=agc_op, bypass_mode=bypass_mode, dtx_mode=dtx_mode, ) @@ -551,7 +523,6 @@ def sba_dec( dtx, ivas_max_bw, bypass, - agc, output_config, update_ref, keep_files, @@ -566,15 +537,12 @@ def sba_dec( tag_out = f"{tag}_ivasbr{ivas_br[:-3]}k_DTX{dtx}" short_tag_ext = "" - if agc != -1: - short_tag_ext += f'_AGC{agc}' # we update only bypass = 0/2 (bypass 1 is the same as the baseline) if bypass in [0, 2]: short_tag_ext += f"_pca{bypass}" # to avoid conflicting names in case of parallel test execution, differentiate all cases - long_tag_ext = f"_AGC{agc}" if agc != -1 else "_AGC-unspecified" - long_tag_ext += f"_pca{bypass}" + long_tag_ext = f"_pca{bypass}" dut_out_dir = f"{dut_base_path}/sba_bs/raw" ref_out_dir = f"{reference_path}/sba_bs/raw" -- GitLab From b592f56516a6039e71e8c0643c1aa407806c4e71 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Fri, 12 May 2023 13:04:31 +0200 Subject: [PATCH 140/331] fix compiler warnings, clang-format --- lib_dec/ivas_sba_dec.c | 11 +++++------ lib_dec/ivas_spar_decoder.c | 17 ++++++++--------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 28920ccf53..471916d12c 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -400,8 +400,8 @@ ivas_error ivas_sba_dec_reconfigure( { tc_nchan_to_allocate = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order #ifdef SPAR_TUNING - , - st_ivas->hDecoderConfig->ivas_total_brate + , + st_ivas->hDecoderConfig->ivas_total_brate #endif ); } @@ -490,16 +490,15 @@ void ivas_sba_dec_render( { int16_t slots_to_render, first_sf, last_sf, subframe_idx; uint16_t slot_size, ch; - uint16_t nchan_internal, sba_order_internal, nchan_out; + uint16_t nchan_internal, nchan_out; SPAR_DEC_HANDLE hSpar; float *output_f_local[MAX_OUTPUT_CHANNELS]; hSpar = st_ivas->hSpar; - sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order #ifdef SPAR_TUNING - , - st_ivas->hDecoderConfig->ivas_total_brate + , + st_ivas->hDecoderConfig->ivas_total_brate #endif ); nchan_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index e346ffda61..33611932f0 100755 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -1151,8 +1151,8 @@ void ivas_spar_dec_agc_pca( { num_in_ingest = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order #ifdef SPAR_TUNING - , - st_ivas->hDecoderConfig->ivas_total_brate + , + st_ivas->hDecoderConfig->ivas_total_brate #endif ); } @@ -1251,12 +1251,11 @@ void ivas_spar_dec_digest_tc( float Pcm_tmp[MAX_SPAR_INTERNAL_CHANNELS][L_FRAME48k]; float *pPcm_tmp[MAX_SPAR_INTERNAL_CHANNELS]; float *p_tc[MAX_SPAR_INTERNAL_CHANNELS]; - int16_t nchan_internal, ch, sba_order_internal; + int16_t nchan_internal, ch; int16_t nSamplesLeftForTD, default_frame; /* TD decorrelator */ default_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); nSamplesLeftForTD = nSamplesForRendering; - sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order #ifdef SPAR_TUNING , @@ -1717,10 +1716,10 @@ void ivas_spar_dec_upmixer( #ifdef LBR_ADAP_SMOOTHING_OPT ivas_spar_calc_smooth_facs( cldfb_in_ts_re[0], cldfb_in_ts_im[0], num_spar_bands, &hSpar->hFbMixer->pFb->fb_bin_to_band, hSpar->hMdDec->smooth_fac, hSpar->hMdDec->smooth_buf ); #else - for ( in_ch = 0; in_ch < numch_in; in_ch++ ) - { - ivas_spar_calc_smooth_facs( cldfb_in_ts_re[in_ch], cldfb_in_ts_im[in_ch], num_spar_bands, &hSpar->hFbMixer->pFb->fb_bin_to_band, hSpar->hMdDec->smooth_fac[in_ch], hSpar->hMdDec->smooth_buf[in_ch] ); - } + for ( in_ch = 0; in_ch < numch_in; in_ch++ ) + { + ivas_spar_calc_smooth_facs( cldfb_in_ts_re[in_ch], cldfb_in_ts_im[in_ch], num_spar_bands, &hSpar->hFbMixer->pFb->fb_bin_to_band, hSpar->hMdDec->smooth_fac[in_ch], hSpar->hMdDec->smooth_buf[in_ch] ); + } #endif } @@ -1748,7 +1747,7 @@ void ivas_spar_dec_upmixer( #ifdef LBR_ADAP_SMOOTHING_OPT mixer_mat[out_ch][in_ch][spar_band] = ( 1 - hSpar->hMdDec->smooth_fac[spar_band] ) * mixer_mat[out_ch][in_ch][spar_band] + hSpar->hMdDec->smooth_fac[spar_band] * hSpar->hMdDec->mixer_mat_prev2[out_ch][in_ch][spar_band]; #else - mixer_mat[out_ch][in_ch][spar_band] = ( 1 - hSpar->hMdDec->smooth_fac[in_ch][spar_band] ) * mixer_mat[out_ch][in_ch][spar_band] + hSpar->hMdDec->smooth_fac[in_ch][spar_band] * hSpar->hMdDec->mixer_mat_prev2[out_ch][in_ch][spar_band]; + mixer_mat[out_ch][in_ch][spar_band] = ( 1 - hSpar->hMdDec->smooth_fac[in_ch][spar_band] ) * mixer_mat[out_ch][in_ch][spar_band] + hSpar->hMdDec->smooth_fac[in_ch][spar_band] * hSpar->hMdDec->mixer_mat_prev2[out_ch][in_ch][spar_band]; #endif hSpar->hMdDec->mixer_mat_prev2[out_ch][in_ch][spar_band] = mixer_mat[out_ch][in_ch][spar_band]; } -- GitLab From b5768aafea625f39e808520fe49fbefab77def51 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Fri, 12 May 2023 13:09:57 +0200 Subject: [PATCH 141/331] initialize DirAC MD arrays on every change of the number of bands or directions --- lib_com/ivas_dirac_com.c | 14 +++++++------- lib_com/options.h | 2 ++ lib_enc/ivas_sba_enc.c | 29 +++++++++++++++++++++++++++-- 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index d17732b66c..15eb3e747b 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -197,12 +197,12 @@ ivas_error ivas_dirac_config( { ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, - (int16_t) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), + ( int16_t )( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hConfig->enc_param_start_band, hFbMdft ); } else { - ivas_dirac_config_bands( band_grouping, hConfig->nbands, (int16_t) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), + ivas_dirac_config_bands( band_grouping, hConfig->nbands, ( int16_t )( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), NULL, 0, 0, hFbMdft ); } @@ -367,7 +367,7 @@ ivas_error ivas_dirac_sba_config( } nbands_coded = nbands; - if ( sba_total_brate <= (int32_t) ( (float) IVAS_192k / (float) SPAR_DIRAC_SPLIT_START_BAND ) ) + if ( sba_total_brate <= ( int32_t )( (float) IVAS_192k / (float) SPAR_DIRAC_SPLIT_START_BAND ) ) { hQMetaData->useLowerBandRes = 1; nbands_coded = nbands / 2 + nbands % 2; @@ -396,7 +396,7 @@ ivas_error ivas_dirac_sba_config( { return error; } -#ifdef HODIRAC_FIX_BR_SWITCHING_DTX +#if defined( HODIRAC_FIX_BR_SWITCHING_DTX ) && !defined( FIX_DTX_428 ) if ( sba_order > 1 && sba_total_brate > IVAS_256k ) { int16_t dir, j; @@ -462,7 +462,7 @@ ivas_error ivas_dirac_sba_config( } else { - hQMetaData->bits_frame_nominal = (int16_t) ( sba_total_brate / FRAMES_PER_SEC ); + hQMetaData->bits_frame_nominal = ( int16_t )( sba_total_brate / FRAMES_PER_SEC ); hQMetaData->metadata_max_bits = MAX16B; /* no limit */ } @@ -539,7 +539,7 @@ ivas_error ivas_dirac_sba_config( *nCPE = ( ( *nchan_transport + 1 ) / 2 ); *nSCE = 0; - hQMetaData->bits_frame_nominal = (int16_t) ( sba_total_brate / FRAMES_PER_SEC ); + hQMetaData->bits_frame_nominal = ( int16_t )( sba_total_brate / FRAMES_PER_SEC ); hQMetaData->metadata_max_bits = MAX16B; /* no limit */ for ( i = 0; i < hQMetaData->no_directions; i++ ) @@ -586,7 +586,7 @@ ivas_error ivas_dirac_sba_config( } else { - hQMetaData->bits_frame_nominal = (int16_t) ( sba_total_brate / FRAMES_PER_SEC ); + hQMetaData->bits_frame_nominal = ( int16_t )( sba_total_brate / FRAMES_PER_SEC ); hQMetaData->metadata_max_bits = 250; } diff --git a/lib_com/options.h b/lib_com/options.h index e68aca0ef1..c6b7e8c4e5 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -216,6 +216,8 @@ #define COMPLEXITY_LEVEL_INDICATION +#define FIX_DTX_428 + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index 35d22fe461..72e1f69985 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -84,10 +84,10 @@ void ivas_sba_getTCs( int16_t tmp[L_FRAME48k]; char file_name[50] = { 0 }; - sprintf( file_name, "./res/ivas_dirac_enc_%d.%d.pcm", n, (int16_t) ( input_frame * 0.05 ) ); + sprintf( file_name, "./res/ivas_dirac_enc_%d.%d.pcm", n, ( int16_t )( input_frame * 0.05 ) ); for ( int16_t i = 0; i < input_frame; i++ ) { - tmp[i] = (int16_t) ( sba_data[n][i] + 0.5f ); + tmp[i] = ( int16_t )( sba_data[n][i] + 0.5f ); } dbgwrite( tmp, sizeof( int16_t ), input_frame, 1, file_name ); } @@ -121,6 +121,10 @@ ivas_error ivas_sba_enc_reconfigure( SPAR_ENC_HANDLE hSpar; int16_t analysis_order_old; int16_t spar_reconfig_flag; +#ifdef FIX_DTX_428 + int16_t nbands_old; + int16_t ndir_old; +#endif spar_reconfig_flag = 0; nchan_transport_old = st_ivas->nchan_transport; @@ -128,6 +132,10 @@ ivas_error ivas_sba_enc_reconfigure( nSCE_old = st_ivas->nSCE; st_ivas->sba_analysis_order = ivas_sba_get_analysis_order( ivas_total_brate, hEncoderConfig->sba_order ); analysis_order_old = ivas_sba_get_analysis_order( hEncoderConfig->last_ivas_total_brate, hEncoderConfig->sba_order ); +#ifdef FIX_DTX_428 + nbands_old = st_ivas->hQMetaData->q_direction->cfg.nbands; + ndir_old = st_ivas->hQMetaData->no_directions; +#endif if ( analysis_order_old != st_ivas->sba_analysis_order ) { @@ -246,6 +254,23 @@ ivas_error ivas_sba_enc_reconfigure( { return error; } +#ifdef FIX_DTX_428 + if ( st_ivas->hQMetaData->q_direction->cfg.nbands != nbands_old || st_ivas->hQMetaData->no_directions != ndir_old ) + { + int16_t dir, j, i; + for ( dir = 0; dir < st_ivas->hQMetaData->no_directions; dir++ ) + { + for ( j = 0; j < st_ivas->hQMetaData->q_direction[dir].cfg.nbands; j++ ) + { + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + st_ivas->hQMetaData->q_direction[dir].band_data[j].energy_ratio_index[i] = 0; + st_ivas->hQMetaData->q_direction[dir].band_data[j].energy_ratio_index_mod[i] = 0; + } + } + } + } +#endif mvs2s( hDirAC->dirac_to_spar_md_bands, hSpar->dirac_to_spar_md_bands, DIRAC_MAX_NBANDS ); hSpar->enc_param_start_band = hDirAC->hConfig->enc_param_start_band; /*-----------------------------------------------------------------* -- GitLab From b3f5259a2dc00409f5efffa74adc1fc6952d8e60 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Fri, 12 May 2023 13:23:35 +0200 Subject: [PATCH 142/331] fix formatting --- lib_com/ivas_dirac_com.c | 12 ++++++------ lib_enc/ivas_sba_enc.c | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index 15eb3e747b..2792efc196 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -197,12 +197,12 @@ ivas_error ivas_dirac_config( { ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, - ( int16_t )( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), + (int16_t) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hConfig->enc_param_start_band, hFbMdft ); } else { - ivas_dirac_config_bands( band_grouping, hConfig->nbands, ( int16_t )( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), + ivas_dirac_config_bands( band_grouping, hConfig->nbands, (int16_t) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), NULL, 0, 0, hFbMdft ); } @@ -367,7 +367,7 @@ ivas_error ivas_dirac_sba_config( } nbands_coded = nbands; - if ( sba_total_brate <= ( int32_t )( (float) IVAS_192k / (float) SPAR_DIRAC_SPLIT_START_BAND ) ) + if ( sba_total_brate <= (int32_t) ( (float) IVAS_192k / (float) SPAR_DIRAC_SPLIT_START_BAND ) ) { hQMetaData->useLowerBandRes = 1; nbands_coded = nbands / 2 + nbands % 2; @@ -462,7 +462,7 @@ ivas_error ivas_dirac_sba_config( } else { - hQMetaData->bits_frame_nominal = ( int16_t )( sba_total_brate / FRAMES_PER_SEC ); + hQMetaData->bits_frame_nominal = (int16_t) ( sba_total_brate / FRAMES_PER_SEC ); hQMetaData->metadata_max_bits = MAX16B; /* no limit */ } @@ -539,7 +539,7 @@ ivas_error ivas_dirac_sba_config( *nCPE = ( ( *nchan_transport + 1 ) / 2 ); *nSCE = 0; - hQMetaData->bits_frame_nominal = ( int16_t )( sba_total_brate / FRAMES_PER_SEC ); + hQMetaData->bits_frame_nominal = (int16_t) ( sba_total_brate / FRAMES_PER_SEC ); hQMetaData->metadata_max_bits = MAX16B; /* no limit */ for ( i = 0; i < hQMetaData->no_directions; i++ ) @@ -586,7 +586,7 @@ ivas_error ivas_dirac_sba_config( } else { - hQMetaData->bits_frame_nominal = ( int16_t )( sba_total_brate / FRAMES_PER_SEC ); + hQMetaData->bits_frame_nominal = (int16_t) ( sba_total_brate / FRAMES_PER_SEC ); hQMetaData->metadata_max_bits = 250; } diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index 72e1f69985..9547564d37 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -84,10 +84,10 @@ void ivas_sba_getTCs( int16_t tmp[L_FRAME48k]; char file_name[50] = { 0 }; - sprintf( file_name, "./res/ivas_dirac_enc_%d.%d.pcm", n, ( int16_t )( input_frame * 0.05 ) ); + sprintf( file_name, "./res/ivas_dirac_enc_%d.%d.pcm", n, (int16_t) ( input_frame * 0.05 ) ); for ( int16_t i = 0; i < input_frame; i++ ) { - tmp[i] = ( int16_t )( sba_data[n][i] + 0.5f ); + tmp[i] = (int16_t) ( sba_data[n][i] + 0.5f ); } dbgwrite( tmp, sizeof( int16_t ), input_frame, 1, file_name ); } -- GitLab From be4217e1ebfa6d36d6bcce336051abd9d38d90be Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Fri, 12 May 2023 13:48:09 +0200 Subject: [PATCH 143/331] fix voip BE test --- apps/decoder.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 16376844c6..f4a2129cff 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -2123,7 +2123,7 @@ static ivas_error decodeVoIP( #ifdef JBM_TSM_ON_TCS #ifdef DEBUG_JBM_CMD_OPTION - nFrontendFramesPerIvasFrame = FRAME_SIZE_NS / ( 1000L * arg.frontendFetchSizeMs ); + nFrontendFramesPerIvasFrame = FRAME_SIZE_NS / ( 1000000L * arg.frontendFetchSizeMs ); systemTimeInc_ms = arg.frontendFetchSizeMs; #else nFrontendFramesPerIvasFrame = FRAME_SIZE_NS / ( 1000L * JBM_FRONTEND_FETCH_FRAMESIZE_MS ); @@ -2190,7 +2190,7 @@ static ivas_error decodeVoIP( /* also stop when the input file contains less than two frames, because JBM cannot calculate a delay value and won't start decoding */ #ifdef JBM_TSM_ON_TCS /* last clause should make sure that for BE tests we end up with the same number of samples...*/ - if ( nextPacketRcvTime_ms == (uint32_t) ( -1 ) && ( IVAS_DEC_VoIP_IsEmpty( hIvasDec, nOutSamples ) || nFramesFed < 2 || ( nFramesWritten % nFrontendFramesPerIvasFrame == 0 ) ) ) + if ( nextPacketRcvTime_ms == (uint32_t) ( -1 ) && ( IVAS_DEC_VoIP_IsEmpty( hIvasDec, nOutSamples ) || nFramesFed < 2 ) ) #else if ( nextPacketRcvTime_ms == (uint32_t) ( -1 ) && ( IVAS_DEC_VoIP_IsEmpty( hIvasDec ) || nFramesFed < 2 ) ) #endif -- GitLab From 90c7b25691cf41c4ca1538def63e7060e1a7df4b Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Fri, 12 May 2023 13:56:31 +0200 Subject: [PATCH 144/331] fix compiler warnings --- apps/decoder.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index f4a2129cff..df31d4c176 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -1984,7 +1984,6 @@ static ivas_error decodeVoIP( #ifdef JBM_TSM_ON_TCS uint32_t systemTimeInc_ms = (uint32_t) JBM_FRONTEND_FETCH_FRAMESIZE_MS; int32_t nFramesWritten = 0; - int32_t nFrontendFramesPerIvasFrame = 0; #endif int32_t nFramesFed = 0; @@ -2123,7 +2122,6 @@ static ivas_error decodeVoIP( #ifdef JBM_TSM_ON_TCS #ifdef DEBUG_JBM_CMD_OPTION - nFrontendFramesPerIvasFrame = FRAME_SIZE_NS / ( 1000000L * arg.frontendFetchSizeMs ); systemTimeInc_ms = arg.frontendFetchSizeMs; #else nFrontendFramesPerIvasFrame = FRAME_SIZE_NS / ( 1000L * JBM_FRONTEND_FETCH_FRAMESIZE_MS ); -- GitLab From 72fff2075d2e93a0403105edf69aa3b86ddb7cd6 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Fri, 12 May 2023 14:05:05 +0200 Subject: [PATCH 145/331] fix compiler error --- apps/decoder.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index df31d4c176..55d99d3e53 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -2123,8 +2123,6 @@ static ivas_error decodeVoIP( #ifdef JBM_TSM_ON_TCS #ifdef DEBUG_JBM_CMD_OPTION systemTimeInc_ms = arg.frontendFetchSizeMs; -#else - nFrontendFramesPerIvasFrame = FRAME_SIZE_NS / ( 1000L * JBM_FRONTEND_FETCH_FRAMESIZE_MS ); #endif #endif -- GitLab From 3f78adfcaaa58a26caaa7e6b6fef58a08749ef6c Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Fri, 12 May 2023 15:24:36 +0200 Subject: [PATCH 146/331] fix asan/msan errors for ParamISM and binaural output --- lib_dec/ivas_ism_dec.c | 2 +- lib_dec/ivas_ism_param_dec.c | 20 +++++++++++++++----- lib_dec/ivas_spar_decoder.c | 2 +- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index 0b305cacf6..19a8a40e5b 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -327,7 +327,7 @@ static ivas_error ivas_ism_bitrate_switching( tc_nchan_allocate_new = 2 * BINAURAL_CHANNELS; tc_nchan_full_new = tc_nchan_allocate_new; } - if ( st_ivas->ism_mode == ISM_MODE_PARAM && ( st_ivas->renderer_type != RENDERER_MONO_DOWNMIX && st_ivas->renderer_type != RENDERER_DISABLE ) ) + if ( st_ivas->ism_mode == ISM_MODE_PARAM && ( st_ivas->renderer_type != RENDERER_MONO_DOWNMIX && st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) { tc_nchan_full_new = 0; } diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index 0ce3ad7bef..d58887f2da 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -801,13 +801,23 @@ ivas_error ivas_param_ism_dec_open( if ( st_ivas->renderer_type != RENDERER_MONO_DOWNMIX && st_ivas->renderer_type != RENDERER_DISABLE ) { int16_t nchan_transport = st_ivas->nchan_transport; - hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc = (float *) malloc( MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hDirAC->num_freq_bands * sizeof( float ) ); - set_zero( hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc, MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hDirAC->num_freq_bands ); - hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc = (float *) malloc( MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hDirAC->num_freq_bands * sizeof( float ) ); - set_zero( hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc, MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hDirAC->num_freq_bands ); + int16_t nchan_full = 0; + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) + { + nchan_full = nchan_transport; + hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc = NULL; + hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc = NULL; + } + else + { + hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc = (float *) malloc( MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hDirAC->num_freq_bands * sizeof( float ) ); + set_zero( hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc, MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hDirAC->num_freq_bands ); + hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc = (float *) malloc( MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hDirAC->num_freq_bands * sizeof( float ) ); + set_zero( hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc, MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hDirAC->num_freq_bands ); + } if ( st_ivas->hTcBuffer == NULL ) { - if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, nchan_transport, nchan_transport, 0, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, nchan_transport, nchan_transport, nchan_full, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 33611932f0..22d38997dd 100755 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -1457,7 +1457,7 @@ void ivas_spar_dec_upmixer( #ifdef SPAR_TUNING int16_t num_md_sub_frames; #ifndef JBM_TSM_ON_TCS - md_sf_idx; + int16_t md_sf_idx; #endif #endif -- GitLab From 7effe8d15672031c64917f23a3b89ff25354e022 Mon Sep 17 00:00:00 2001 From: hsd Date: Fri, 12 May 2023 15:58:25 +0200 Subject: [PATCH 147/331] Moved HEAD_ORIENT_TRK_T to common_api_types.h to avoid including the private ivas_cnst.h header in the decoder/renderer APIs --- lib_com/common_api_types.h | 10 ++++++++++ lib_com/ivas_cnst.h | 11 +---------- lib_dec/lib_dec.h | 4 ---- lib_rend/lib_rend.h | 6 +++++- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/lib_com/common_api_types.h b/lib_com/common_api_types.h index 61c68eae5d..3f0f8b305b 100644 --- a/lib_com/common_api_types.h +++ b/lib_com/common_api_types.h @@ -93,6 +93,16 @@ typedef struct float x, y, z; } IVAS_VECTOR3; +#ifdef FIX_439_OTR_PARAMS +typedef enum +{ + HEAD_ORIENT_TRK_NONE, + HEAD_ORIENT_TRK_REF, + HEAD_ORIENT_TRK_AVG, + HEAD_ORIENT_TRK_REF_VEC, + HEAD_ORIENT_TRK_REF_VEC_LEV +} HEAD_ORIENT_TRK_T; +#endif typedef struct ivas_masa_metadata_frame_struct *IVAS_MASA_METADATA_HANDLE; typedef struct ivas_masa_decoder_ext_out_meta_struct *MASA_DECODER_EXT_OUT_META_HANDLE; diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index d764ad95e9..b107631d7e 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1595,21 +1595,12 @@ typedef enum } SFX_OpMode_t; +#ifndef FIX_439_OTR_PARAMS /*----------------------------------------------------------------------------------* * Orientation tracking constants *----------------------------------------------------------------------------------*/ /* Orientation tracking types */ -#ifdef FIX_439_OTR_PARAMS -typedef enum -{ - HEAD_ORIENT_TRK_NONE, - HEAD_ORIENT_TRK_REF, - HEAD_ORIENT_TRK_AVG, - HEAD_ORIENT_TRK_REF_VEC, - HEAD_ORIENT_TRK_REF_VEC_LEV -} HEAD_ORIENT_TRK_T; -#else #define IVAS_ORIENT_TRK_NONE 0 #define IVAS_ORIENT_TRK_REF 1 #define IVAS_ORIENT_TRK_AVG 2 diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index df67102e2c..069137fddd 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -34,12 +34,8 @@ #define LIB_DEC_H #include "common_api_types.h" -#ifdef FIX_439_OTR_PARAMS -#include "ivas_cnst.h" -#endif #include - /*---------------------------------------------------------------------* * Decoder enums *---------------------------------------------------------------------*/ diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index 1e9d41fd38..9d9ed3555a 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -250,7 +250,11 @@ ivas_error IVAS_REND_SetHeadRotation( ivas_error IVAS_REND_SetOrientationTrackingMode( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ - const uint8_t otrMode /* i : Orientation tracking mode */ +#ifdef FIX_439_OTR_PARAMS + HEAD_ORIENT_TRK_T otrMode /* i : Head orientation tracking mode */ +#else + const uint8_t otrMode /* i : Orientation tracking mode */ +#endif ); ivas_error IVAS_REND_SetReferenceRotation( -- GitLab From f2dbf8ec73daeaeb6bf1a2591190cdd56b66378f Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Fri, 12 May 2023 16:35:47 +0200 Subject: [PATCH 148/331] fix indexing of DoA arrays for head rotation in DirAC --- lib_dec/ivas_dirac_dec.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 73c8dcf12e..2cc3d15fec 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -2572,8 +2572,7 @@ void ivas_dirac_dec( num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ ) { - index_slot = subframe_idx * hDirAC->subframe_nbslots + slot_idx; - /* Todo: This access to azimuth & elevation may use wrong indices as access should probably be based on hDirAC->dirac_read_idx */ + index_slot = ( hDirAC->dirac_read_idx + slot_idx ) % hDirAC->dirac_md_buffer_length; rotateAziEle_DirAC( hDirAC->azimuth[index_slot], hDirAC->elevation[index_slot], num_freq_bands, hDirAC->num_freq_bands, p_Rmat ); } } -- GitLab From 00ba13396fedcde76cf8cb5958381d3023f71335 Mon Sep 17 00:00:00 2001 From: Sumeyra Kanik Date: Fri, 12 May 2023 21:23:26 +0200 Subject: [PATCH 149/331] Delay compensation disabled for ISM in encoder, added to decoder --- apps/decoder.c | 2 +- lib_com/delay_comp.c | 12 + lib_com/ivas_stat_com.h | 15 +- lib_dec/ivas_ism_metadata_dec.c | 17 +- lib_dec/ivas_objectRenderer_internal.c | 2 +- lib_enc/ivas_ism_metadata_enc.c | 1 - lib_rend/ivas_objectRenderer.c | 650 +++++++++++++------------ lib_rend/ivas_objectRenderer_sources.c | 1 - lib_rend/ivas_prot_rend.h | 4 + lib_util/audio_file_writer.c | 1 - 10 files changed, 379 insertions(+), 326 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 34ae45d396..e1a5c2a66b 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -1583,7 +1583,6 @@ static ivas_error decodeG192( } } - /* Write current frame */ if ( decodedGoodFrame ) { @@ -1669,6 +1668,7 @@ static ivas_error decodeG192( *------------------------------------------------------------------------------------------*/ memset( pcmBuf, 0, delayNumSamples_orig[0] * nOutChannels * sizeof( int16_t ) ); + if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, delayNumSamples_orig[0] * nOutChannels ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError writing output file: %s\n", ivas_error_to_string( error ) ); diff --git a/lib_com/delay_comp.c b/lib_com/delay_comp.c index 5557a88606..29af982512 100644 --- a/lib_com/delay_comp.c +++ b/lib_com/delay_comp.c @@ -73,6 +73,12 @@ int32_t get_delay( { delay = 0; /* All delay is compensated in the decoder with MASA */ } +#ifdef FIX_356_ISM_METADATA_SYNC + if (ivas_format == ISM_FORMAT) + { + delay = 0; /* All delay is compensated in the decoder with ISM */ + } +#endif } if ( ivas_format == SBA_FORMAT ) @@ -109,6 +115,12 @@ int32_t get_delay( { delay += IVAS_ENC_DELAY_NS; /* Compensate also the encoder delay in the decoder with MASA */ } +#ifdef FIX_356_ISM_METADATA_SYNC + if (ivas_format == ISM_FORMAT) + { + delay += IVAS_ENC_DELAY_NS; /* Compensate also the encoder delay in the decoder with ISM */ + } +#endif } } diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index 305a18951a..20073e6dd9 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -57,10 +57,10 @@ typedef struct int16_t last_ism_metadata_flag; /* last frame ism_metadata_flag */ float azimuth; /* azimuth value read from the input metadata file */ - float elevation; /* azimuth value read from the input metadata file */ - float radius; - float yaw; /* azimuth orientation value read from the input metadata file */ - float pitch; /* elevation orientation value read from the input metadata file */ + float elevation; /* elevation value read from the input metadata file */ + float radius; /* radius value read from the input metadata file */ + float yaw; /* yaw value read from the input metadata file */ + float pitch; /* pitch value read from the input metadata file */ ISM_METADATA_ANGLE position_angle; /* Angle structs for azimuth and elevation */ ISM_METADATA_ANGLE orientation_angle; /* Angle structs for yaw and pitch */ int16_t last_radius_idx; /* last frame index of coded radius */ @@ -78,6 +78,13 @@ typedef struct #ifdef FIX_435_ISM_MERGE_BUG float last_true_radius; /* last true Q radius value */ #endif +#ifdef FIX_356_ISM_METADATA_SYNC + float prev_azimuth; + float prev_elevation; + float prev_radius; + float prev_yaw; + float prev_pitch; +#endif } ISM_METADATA_FRAME, *ISM_METADATA_HANDLE; diff --git a/lib_dec/ivas_ism_metadata_dec.c b/lib_dec/ivas_ism_metadata_dec.c index 7a61424a1f..a2a79e29bb 100644 --- a/lib_dec/ivas_ism_metadata_dec.c +++ b/lib_dec/ivas_ism_metadata_dec.c @@ -244,6 +244,14 @@ ivas_error ivas_ism_metadata_dec( /* Read ISM present flags (one per object) */ for ( ch = 0; ch < *nchan_transport; ch++ ) { +#ifdef FIX_356_ISM_METADATA_SYNC + hIsmMeta[ch]->prev_azimuth = hIsmMeta[ch]->azimuth; + hIsmMeta[ch]->prev_elevation = hIsmMeta[ch]->elevation; + hIsmMeta[ch]->prev_radius = hIsmMeta[ch]->radius; + hIsmMeta[ch]->prev_yaw = hIsmMeta[ch]->yaw; + hIsmMeta[ch]->prev_pitch = hIsmMeta[ch]->pitch; + +#endif ism_imp[ch] = get_next_indice( st0, ISM_METADATA_FLAG_BITS ); if ( ism_imp[ch] > ISM_NO_META ) @@ -548,7 +556,14 @@ ivas_error ivas_ism_metadata_dec_create( st_ivas->hIsmMetaData[ch]->last_true_azimuth = 0; st_ivas->hIsmMetaData[ch]->last_true_elevation = 0; - +#ifdef FIX_356_ISM_METADATA_SYNC + // st_ivas->hIsmMetaData[ch]->last_true_radius = 1.0f; + st_ivas->hIsmMetaData[ch]->prev_azimuth = 0.0f; + st_ivas->hIsmMetaData[ch]->prev_elevation = 0.0f; + st_ivas->hIsmMetaData[ch]->prev_radius = 1.0f; + st_ivas->hIsmMetaData[ch]->prev_yaw = 0.0f; + st_ivas->hIsmMetaData[ch]->prev_pitch = 0.0f; +#endif ivas_ism_reset_metadata( st_ivas->hIsmMetaData[ch] ); } diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index 1dd3a1b1c8..9ce51cffba 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -76,7 +76,7 @@ ivas_error ivas_td_binaural_renderer( st_ivas->transport_config, st_ivas->hBinRendererTd, st_ivas->nchan_transport, LFE_CHANNEL, st_ivas->ivas_format, #ifdef FIX_356_ISM_METADATA_SYNC - st_ivas->hIsmMetaData, st_ivas->hDecoderConfig->Opt_delay_comp, st_ivas->hDecoderConfig->Opt_Headrotation, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Quaternions : NULL, + st_ivas->hIsmMetaData, st_ivas->hDecoderConfig->Opt_delay_comp, st_ivas->hRenderConfig->directivity, st_ivas->hDecoderConfig->Opt_Headrotation, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Quaternions : NULL, #else st_ivas->hIsmMetaData, st_ivas->hDecoderConfig->Opt_Headrotation, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Quaternions : NULL, #endif diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index a4678d6bbb..98da7f95ac 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -633,7 +633,6 @@ ivas_error ivas_ism_metadata_enc_create( st_ivas->hIsmMetaData[ch]->last_true_radius = 1.0f; #endif } - if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, n_ISms, NULL, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) { return error; diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index a5d3d30863..4e837f3818 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -258,6 +258,7 @@ ivas_error ivas_td_binaural_renderer_unwrap( ISM_METADATA_HANDLE *hIsmMetaData, /* i : ISM metadata handle */ #ifdef FIX_356_ISM_METADATA_SYNC const int16_t Opt_delay_comp, /* i : Delay compensation flag */ + const float *directivity, /* i : Directivity pattern (used for ISM) */ #endif const int16_t Opt_Headrotation, /* i : Head rotation flag */ const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ @@ -284,400 +285,417 @@ ivas_error ivas_td_binaural_renderer_unwrap( #endif subframe_length = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES; -#ifndef FIX_356_ISM_METADATA_SYNC +#ifdef FIX_356_ISM_METADATA_SYNC + TDREND_Update_object_positions( hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, Opt_delay_comp, output ); +#else /* Update object position(s) */ - TDREND_Update_object_positions( hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, output ); + TDREND_Update_object_positions( hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, output ); #endif - for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) - { + for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) + { #ifdef FIX_356_ISM_METADATA_SYNC - if ( subframe_idx == subframe_update ) - { - /* Update object position(s) */ - TDREND_Update_object_positions( hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, output ); - } + if ( !Opt_delay_comp && subframe_idx == subframe_update ) + { + /* Update object position(s) */ + TDREND_Update_object_positions( hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, !Opt_delay_comp, output ); + } #endif + /* Update the listener's location/orientation */ + TDREND_Update_listener_orientation( hBinRendererTd, Opt_Headrotation, ( Quaternions != NULL ) ? &Quaternions[subframe_idx] : NULL, ( Pos != NULL ) ? &Pos[subframe_idx] : NULL ); - /* Update the listener's location/orientation */ - TDREND_Update_listener_orientation( hBinRendererTd, Opt_Headrotation, ( Quaternions != NULL ) ? &Quaternions[subframe_idx] : NULL, ( Pos != NULL ) ? &Pos[subframe_idx] : NULL ); - - if ( hReverb != NULL && hReverb->pConfig.roomAcoustics.late_reverb_on ) - { - if ( ( error = ivas_reverb_process( hReverb, transport_config, 0, output, reverb_signal, subframe_idx ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - /* Render subframe */ - if ( ( error = TDREND_GetMix( hBinRendererTd, output, subframe_length, subframe_idx ) ) != IVAS_ERR_OK ) + if ( hReverb != NULL && hReverb->pConfig.roomAcoustics.late_reverb_on ) + { + if ( ( error = ivas_reverb_process( hReverb, transport_config, 0, output, reverb_signal, subframe_idx ) ) != IVAS_ERR_OK ) { return error; } } - - if ( hReverb != NULL && hReverb->pConfig.roomAcoustics.late_reverb_on ) + /* Render subframe */ + if ( ( error = TDREND_GetMix( hBinRendererTd, output, subframe_length, subframe_idx ) ) != IVAS_ERR_OK ) { - /* add reverb to rendered signals */ - v_add( reverb_signal[0], output[0], output[0], output_frame ); - v_add( reverb_signal[1], output[1], output[1], output_frame ); + return error; } + } + - return IVAS_ERR_OK; + if ( hReverb != NULL && hReverb->pConfig.roomAcoustics.late_reverb_on ) + { + /* add reverb to rendered signals */ + v_add( reverb_signal[0], output[0], output[0], output_frame ); + v_add( reverb_signal[1], output[1], output[1], output_frame ); } + return IVAS_ERR_OK; +} + - /*---------------------------------------------------------------------* - * TDREND_GetMix() - * - * Render one 5 ms subframe from the mixer - *---------------------------------------------------------------------*/ +/*---------------------------------------------------------------------* + * TDREND_GetMix() + * + * Render one 5 ms subframe from the mixer + *---------------------------------------------------------------------*/ - ivas_error TDREND_GetMix( - BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ - float output[][L_FRAME48k], /* i/o: ISM object synth / rendered output in 0,1 */ - const int16_t subframe_length, /* i/o: subframe length */ - const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ - ) +ivas_error TDREND_GetMix( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + float output[][L_FRAME48k], /* i/o: ISM object synth / rendered output in 0,1 */ + const int16_t subframe_length, /* i/o: subframe length */ + const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ +) +{ + int16_t i; + TDREND_SRC_t *Src_p; + TDREND_SRC_SPATIAL_t *SrcSpatial_p; + TDREND_SRC_REND_t *SrcRend_p; + ivas_error error; + float output_buf[2][L_SPATIAL_SUBFR_48k]; /* Temp buffer for left/right rendered signal */ + float hrf_left_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; + float hrf_right_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; + int16_t intp_count; + error = IVAS_ERR_OK; + + /* Clear the output buffer to accumulate rendered sources */ + set_f( output_buf[0], 0.0f, subframe_length ); + set_f( output_buf[1], 0.0f, subframe_length ); + + /* Clear interpolation buffers and counter */ + set_f( hrf_left_delta, 0.0f, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); + set_f( hrf_right_delta, 0.0f, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); + intp_count = 0; + + /* Create the mix */ + /* Loop through the source list and render each source */ + for ( i = 0; i < hBinRendererTd->NumOfSrcs; i++ ) { - int16_t i; - TDREND_SRC_t *Src_p; - TDREND_SRC_SPATIAL_t *SrcSpatial_p; - TDREND_SRC_REND_t *SrcRend_p; - ivas_error error; - float output_buf[2][L_SPATIAL_SUBFR_48k]; /* Temp buffer for left/right rendered signal */ - float hrf_left_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; - float hrf_right_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; - int16_t intp_count; - error = IVAS_ERR_OK; - - /* Clear the output buffer to accumulate rendered sources */ - set_f( output_buf[0], 0.0f, subframe_length ); - set_f( output_buf[1], 0.0f, subframe_length ); - - /* Clear interpolation buffers and counter */ - set_f( hrf_left_delta, 0.0f, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); - set_f( hrf_right_delta, 0.0f, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); - intp_count = 0; - - /* Create the mix */ - /* Loop through the source list and render each source */ - for ( i = 0; i < hBinRendererTd->NumOfSrcs; i++ ) - { - Src_p = hBinRendererTd->Sources[i]; - SrcSpatial_p = Src_p->SrcSpatial_p; - SrcRend_p = Src_p->SrcRend_p; + Src_p = hBinRendererTd->Sources[i]; + SrcSpatial_p = Src_p->SrcSpatial_p; + SrcRend_p = Src_p->SrcRend_p; - /* Update rendering params if needed */ - if ( hBinRendererTd->Listener_p->PoseUpdated || SrcSpatial_p->Updated ) - { - TDREND_SRC_REND_UpdateFiltersFromSpatialParams( hBinRendererTd, SrcRend_p, SrcSpatial_p, Src_p->hrf_left_prev, - Src_p->hrf_right_prev, hrf_left_delta, hrf_right_delta, &intp_count, &Src_p->filterlength, &Src_p->itd, &Src_p->Gain, Src_p, subframe_idx ); - } + /* Update rendering params if needed */ + if ( hBinRendererTd->Listener_p->PoseUpdated || SrcSpatial_p->Updated ) + { + TDREND_SRC_REND_UpdateFiltersFromSpatialParams( hBinRendererTd, SrcRend_p, SrcSpatial_p, Src_p->hrf_left_prev, + Src_p->hrf_right_prev, hrf_left_delta, hrf_right_delta, &intp_count, &Src_p->filterlength, &Src_p->itd, &Src_p->Gain, Src_p, subframe_idx ); + } - /* Render source if needed */ - if ( ( SrcRend_p->InputAvailable == TRUE ) && ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING ) ) - { - error = TDREND_REND_RenderSourceHRFilt( Src_p, hrf_left_delta, hrf_right_delta, intp_count, output_buf, subframe_length ); - } + /* Render source if needed */ + if ( ( SrcRend_p->InputAvailable == TRUE ) && ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING ) ) + { + error = TDREND_REND_RenderSourceHRFilt( Src_p, hrf_left_delta, hrf_right_delta, intp_count, output_buf, subframe_length ); } + } - /* Populate output variable */ - mvr2r( output_buf[0], output[0] + subframe_idx * subframe_length, subframe_length ); /* Left */ - mvr2r( output_buf[1], output[1] + subframe_idx * subframe_length, subframe_length ); /* Right */ + /* Populate output variable */ + mvr2r( output_buf[0], output[0] + subframe_idx * subframe_length, subframe_length ); /* Left */ + mvr2r( output_buf[1], output[1] + subframe_idx * subframe_length, subframe_length ); /* Right */ - /* Clear the PoseUpdated and Source position update flags */ - TDREND_Clear_Update_flags( hBinRendererTd ); + /* Clear the PoseUpdated and Source position update flags */ + TDREND_Clear_Update_flags( hBinRendererTd ); - return error; - } + return error; +} - /*---------------------------------------------------------------------* - * TDREND_Clear_Update_flags() - * - * Initializes the audio mixer module - *---------------------------------------------------------------------*/ +/*---------------------------------------------------------------------* + * TDREND_Clear_Update_flags() + * + * Initializes the audio mixer module + *---------------------------------------------------------------------*/ - static void TDREND_Clear_Update_flags( - BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd /* i/o: TD renderer handle */ - ) +static void TDREND_Clear_Update_flags( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd /* i/o: TD renderer handle */ +) +{ + int16_t i; + + hBinRendererTd->Listener_p->PoseUpdated = FALSE; + + for ( i = 0; i < hBinRendererTd->NumOfSrcs; i++ ) { - int16_t i; + hBinRendererTd->Sources[i]->SrcSpatial_p->Updated = FALSE; + } + + return; +} - hBinRendererTd->Listener_p->PoseUpdated = FALSE; - for ( i = 0; i < hBinRendererTd->NumOfSrcs; i++ ) - { - hBinRendererTd->Sources[i]->SrcSpatial_p->Updated = FALSE; - } +/*---------------------------------------------------------------------* + * TDREND_Update_object_positions() + * + * Update object position(s) + *---------------------------------------------------------------------*/ - return; - } +void TDREND_Update_object_positions( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o : TD Renderer handle */ + const int16_t num_src, /* i : number of sources to render */ + const int16_t lfe_idx, /* i : Input LFE index */ + const IVAS_FORMAT in_format, /* i : Format of input sources */ + const ISM_METADATA_HANDLE *hIsmMetaData, /* i : Input metadata for ISM objects */ +#ifdef FIX_356_ISM_METADATA_SYNC + const int16_t Opt_delay_comp, +#endif + float output[][L_FRAME48k] /* i/o: SCE/MC channels */ +) +{ + TDREND_DirAtten_t *DirAtten_p; + int16_t nS; + float Pos[3]; + float Dir[3]; + int16_t c_indx; + DirAtten_p = hBinRendererTd->DirAtten_p; - /*---------------------------------------------------------------------* - * TDREND_Update_object_positions() - * - * Update object position(s) - *---------------------------------------------------------------------*/ - - void TDREND_Update_object_positions( - BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o : TD Renderer handle */ - const int16_t num_src, /* i : number of sources to render */ - const int16_t lfe_idx, /* i : Input LFE index */ - const IVAS_FORMAT in_format, /* i : Format of input sources */ - const ISM_METADATA_HANDLE *hIsmMetaData, /* i : Input metadata for ISM objects */ - float output[][L_FRAME48k] /* i/o: SCE/MC channels */ - ) + /* For each source, write the frame data to the source object*/ + c_indx = 0; + for ( nS = 0; nS < num_src; nS++ ) { - TDREND_DirAtten_t *DirAtten_p; - int16_t nS; - float Pos[3]; - float Dir[3]; - int16_t c_indx; - - DirAtten_p = hBinRendererTd->DirAtten_p; + if ( !( in_format == MC_FORMAT && nS == lfe_idx ) ) /* Skip LFE for MC */ + { + hBinRendererTd->Sources[c_indx]->InputFrame_p = output[nS]; + hBinRendererTd->Sources[c_indx]->SrcRend_p->InputAvailable = TRUE; + c_indx++; + } - /* For each source, write the frame data to the source object*/ - c_indx = 0; - for ( nS = 0; nS < num_src; nS++ ) + if ( in_format == ISM_FORMAT ) { - if ( !( in_format == MC_FORMAT && nS == lfe_idx ) ) /* Skip LFE for MC */ + /* Update the source positions */ + /* Source position and direction */ +#ifdef FIX_356_ISM_METADATA_SYNC + if ( !Opt_delay_comp ) { - hBinRendererTd->Sources[c_indx]->InputFrame_p = output[nS]; - hBinRendererTd->Sources[c_indx]->SrcRend_p->InputAvailable = TRUE; - c_indx++; + angles_to_vec( hIsmMetaData[nS]->prev_radius, hIsmMetaData[nS]->prev_azimuth, hIsmMetaData[nS]->prev_elevation, Pos ); + angles_to_vec( 1.0f, hIsmMetaData[nS]->prev_yaw, hIsmMetaData[nS]->prev_pitch, Dir ); } - - if ( in_format == ISM_FORMAT ) + else { - - /* Update the source positions */ - /* Source position and direction */ angles_to_vec( hIsmMetaData[nS]->radius, hIsmMetaData[nS]->azimuth, hIsmMetaData[nS]->elevation, Pos ); angles_to_vec( 1.0f, hIsmMetaData[nS]->yaw, hIsmMetaData[nS]->pitch, Dir ); - /* Source directivity info */ - DirAtten_p->ConeInnerAngle = 360.0f; - DirAtten_p->ConeOuterAngle = 360.0f; - DirAtten_p->ConeOuterGain = 1.0f; + } +#else + angles_to_vec( hIsmMetaData[nS]->radius, hIsmMetaData[nS]->azimuth, hIsmMetaData[nS]->elevation, Pos ); + angles_to_vec( 1.0f, hIsmMetaData[nS]->yaw, hIsmMetaData[nS]->pitch, Dir ); +#endif + /* Source directivity info */ + DirAtten_p->ConeInnerAngle = 360.0f; + DirAtten_p->ConeOuterAngle = 360.0f; + DirAtten_p->ConeOuterGain = 1.0f; - TDREND_MIX_SRC_SetPos( hBinRendererTd, nS, Pos ); - TDREND_MIX_SRC_SetDirAtten( hBinRendererTd, nS, DirAtten_p ); - TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING ); + TDREND_MIX_SRC_SetPos( hBinRendererTd, nS, Pos ); + TDREND_MIX_SRC_SetDirAtten( hBinRendererTd, nS, DirAtten_p ); + TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING ); - TDREND_MIX_SRC_SetDir( hBinRendererTd, nS, Dir ); - } - } + TDREND_MIX_SRC_SetDir( hBinRendererTd, nS, Dir ); - return; + } } + return; +} - /*---------------------------------------------------------------------* - * TDREND_Update_listener_orientation() - * - * Update listener orientation (s) - *---------------------------------------------------------------------*/ - - void TDREND_Update_listener_orientation( - BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD Renderer handle */ - const int16_t headRotEnabled, /* i : Headrotation flag */ - const IVAS_QUATERNION *headPosition, /* i : Listener orientation */ - const IVAS_VECTOR3 *Pos /* i : Listener Position */ - ) - { - float FrontVec[3]; - float UpVec[3]; - float Rmat[3][3]; - float Pos_p[3]; - if ( headRotEnabled ) - { - /* Obtain head rotation matrix */ - QuatToRotMat( *headPosition, Rmat ); - /* Apply rotation matrix to looking vector [1;0;0] */ - FrontVec[0] = Rmat[0][0]; - FrontVec[1] = Rmat[0][1]; - FrontVec[2] = Rmat[0][2]; - /* Apply rotation matrix to up vector [0;0;1] */ - UpVec[0] = Rmat[2][0]; - UpVec[1] = Rmat[2][1]; - UpVec[2] = Rmat[2][2]; - /* Input position */ - Pos_p[0] = ( *Pos ).x; - Pos_p[1] = ( *Pos ).y; - Pos_p[2] = ( *Pos ).z; - } - else - { - /* Oriented with looking vector along the x axis */ - FrontVec[0] = 1.0f; - FrontVec[1] = 0.0f; - FrontVec[2] = 0.0f; - /* Oriented with up vector along the z axis */ - UpVec[0] = 0.0f; - UpVec[1] = 0.0f; - UpVec[2] = 1.0f; - /* Listener at the origin */ - Pos_p[0] = 0.0f; - Pos_p[1] = 0.0f; - Pos_p[2] = 0.0f; - } +/*---------------------------------------------------------------------* + * TDREND_Update_listener_orientation() + * + * Update listener orientation (s) + *---------------------------------------------------------------------*/ - /* Set the listener position and orientation:*/ - TDREND_MIX_LIST_SetPos( hBinRendererTd, Pos_p ); - TDREND_MIX_LIST_SetOrient( hBinRendererTd, FrontVec, UpVec ); +void TDREND_Update_listener_orientation( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD Renderer handle */ + const int16_t headRotEnabled, /* i : Headrotation flag */ + const IVAS_QUATERNION *headPosition, /* i : Listener orientation */ + const IVAS_VECTOR3 *Pos /* i : Listener Position */ +) +{ + float FrontVec[3]; + float UpVec[3]; + float Rmat[3][3]; + float Pos_p[3]; - return; + if ( headRotEnabled ) + { + /* Obtain head rotation matrix */ + QuatToRotMat( *headPosition, Rmat ); + /* Apply rotation matrix to looking vector [1;0;0] */ + FrontVec[0] = Rmat[0][0]; + FrontVec[1] = Rmat[0][1]; + FrontVec[2] = Rmat[0][2]; + /* Apply rotation matrix to up vector [0;0;1] */ + UpVec[0] = Rmat[2][0]; + UpVec[1] = Rmat[2][1]; + UpVec[2] = Rmat[2][2]; + /* Input position */ + Pos_p[0] = ( *Pos ).x; + Pos_p[1] = ( *Pos ).y; + Pos_p[2] = ( *Pos ).z; + } + else + { + /* Oriented with looking vector along the x axis */ + FrontVec[0] = 1.0f; + FrontVec[1] = 0.0f; + FrontVec[2] = 0.0f; + /* Oriented with up vector along the z axis */ + UpVec[0] = 0.0f; + UpVec[1] = 0.0f; + UpVec[2] = 1.0f; + /* Listener at the origin */ + Pos_p[0] = 0.0f; + Pos_p[1] = 0.0f; + Pos_p[2] = 0.0f; } + /* Set the listener position and orientation:*/ + TDREND_MIX_LIST_SetPos( hBinRendererTd, Pos_p ); + TDREND_MIX_LIST_SetOrient( hBinRendererTd, FrontVec, UpVec ); - /*---------------------------------------------------------------------* - * ivas_td_binaural_open_ext() - * - * - *---------------------------------------------------------------------*/ + return; +} - ivas_error ivas_td_binaural_open_ext( - TDREND_WRAPPER * pTDRend, - IVAS_REND_AudioConfig inConfig, - RENDER_CONFIG_DATA * hRendCfg, /* i : Renderer configuration */ - LSSETUP_CUSTOM_STRUCT * customLsInput, - const int32_t outFs ) - { - int16_t nchan_transport; - AUDIO_CONFIG transport_config; - IVAS_FORMAT ivas_format; - IVAS_OUTPUT_SETUP hTransSetup; - ivas_error error; - float *directivity = NULL; - if ( inConfig != IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) - { - if ( ( error = getAudioConfigNumChannels( inConfig, &nchan_transport ) ) != IVAS_ERR_OK ) - { - return error; - } - } - else - { - nchan_transport = customLsInput->num_spk; - } +/*---------------------------------------------------------------------* + * ivas_td_binaural_open_ext() + * + * + *---------------------------------------------------------------------*/ - transport_config = getIvasAudioConfigFromRendAudioConfig( inConfig ); - ivas_format = ( getAudioConfigType( inConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ? MC_FORMAT : ISM_FORMAT; - hTransSetup.ls_azimuth = customLsInput->ls_azimuth; - hTransSetup.ls_elevation = customLsInput->ls_elevation; +ivas_error ivas_td_binaural_open_ext( + TDREND_WRAPPER *pTDRend, + IVAS_REND_AudioConfig inConfig, + RENDER_CONFIG_DATA *hRendCfg, /* i : Renderer configuration */ + LSSETUP_CUSTOM_STRUCT *customLsInput, + const int32_t outFs ) +{ + int16_t nchan_transport; + AUDIO_CONFIG transport_config; + IVAS_FORMAT ivas_format; + IVAS_OUTPUT_SETUP hTransSetup; + ivas_error error; + float *directivity = NULL; - if ( NULL != hRendCfg ) + if ( inConfig != IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) + { + if ( ( error = getAudioConfigNumChannels( inConfig, &nchan_transport ) ) != IVAS_ERR_OK ) { - directivity = hRendCfg->directivity; + return error; } + } + else + { + nchan_transport = customLsInput->num_spk; + } + + transport_config = getIvasAudioConfigFromRendAudioConfig( inConfig ); + ivas_format = ( getAudioConfigType( inConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ? MC_FORMAT : ISM_FORMAT; + hTransSetup.ls_azimuth = customLsInput->ls_azimuth; + hTransSetup.ls_elevation = customLsInput->ls_elevation; - return ivas_td_binaural_open_unwrap( &pTDRend->hHrtfTD, outFs, nchan_transport, ivas_format, transport_config, directivity, hTransSetup, &pTDRend->hBinRendererTd, &pTDRend->binaural_latency_ns ); + if ( NULL != hRendCfg ) + { + directivity = hRendCfg->directivity; } + return ivas_td_binaural_open_unwrap( &pTDRend->hHrtfTD, outFs, nchan_transport, ivas_format, transport_config, directivity, hTransSetup, &pTDRend->hBinRendererTd, &pTDRend->binaural_latency_ns ); +} + - /*---------------------------------------------------------------------* - * ivas_td_binaural_renderer_ext() - * - * Receives the current frames for the object streams, updates metadata - * and renders the current frame. - *---------------------------------------------------------------------*/ - - ivas_error ivas_td_binaural_renderer_ext( - const TDREND_WRAPPER *pTDRend, /* i : TD Renderer wrapper structure */ - const IVAS_REND_AudioConfig inConfig, /* i : Input audio configuration */ - const LSSETUP_CUSTOM_STRUCT *customLsInput, /* i : Input custom loudspeaker layout */ - const IVAS_REND_HeadRotData *headRotData, /* i : Input head positions */ - const IVAS_REND_AudioObjectPosition *currentPos, /* i : Object position */ - const REVERB_HANDLE hReverb, /* i : Reverberator handle */ +/*---------------------------------------------------------------------* + * ivas_td_binaural_renderer_ext() + * + * Receives the current frames for the object streams, updates metadata + * and renders the current frame. + *---------------------------------------------------------------------*/ + +ivas_error ivas_td_binaural_renderer_ext( + const TDREND_WRAPPER *pTDRend, /* i : TD Renderer wrapper structure */ + const IVAS_REND_AudioConfig inConfig, /* i : Input audio configuration */ + const LSSETUP_CUSTOM_STRUCT *customLsInput, /* i : Input custom loudspeaker layout */ + const IVAS_REND_HeadRotData *headRotData, /* i : Input head positions */ + const IVAS_REND_AudioObjectPosition *currentPos, /* i : Object position */ + const REVERB_HANDLE hReverb, /* i : Reverberator handle */ #ifdef FIX_356_ISM_METADATA_SYNC - const int16_t Opt_delay_comp, /* i : Delay compensation flag */ + const int16_t Opt_delay_comp, /* i : Delay compensation flag */ #endif - const int16_t output_frame, /* i : output frame length */ - float output[][L_FRAME48k] /* i/o: SCE channels / Binaural synthesis */ - ) + const int16_t output_frame, /* i : output frame length */ + float output[][L_FRAME48k] /* i/o: SCE channels / Binaural synthesis */ +) +{ + ISM_METADATA_FRAME hIsmMetaDataFrame; + ISM_METADATA_HANDLE hIsmMetaData[1]; + int16_t lfe_idx; + int16_t num_src; + IVAS_FORMAT ivas_format; + IVAS_REND_AudioConfigType inConfigType; + AUDIO_CONFIG transport_config; + ivas_error error; + + push_wmops( "ivas_td_binaural_renderer_ext" ); + + inConfigType = getAudioConfigType( inConfig ); + lfe_idx = LFE_CHANNEL; + hIsmMetaData[0] = NULL; + + if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) { - ISM_METADATA_FRAME hIsmMetaDataFrame; - ISM_METADATA_HANDLE hIsmMetaData[1]; - int16_t lfe_idx; - int16_t num_src; - IVAS_FORMAT ivas_format; - IVAS_REND_AudioConfigType inConfigType; - AUDIO_CONFIG transport_config; - ivas_error error; - - push_wmops( "ivas_td_binaural_renderer_ext" ); - - inConfigType = getAudioConfigType( inConfig ); - lfe_idx = LFE_CHANNEL; - hIsmMetaData[0] = NULL; - - if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) + ivas_format = MC_FORMAT; + transport_config = getIvasAudioConfigFromRendAudioConfig( inConfig ); + if ( inConfig != IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) { - ivas_format = MC_FORMAT; - transport_config = getIvasAudioConfigFromRendAudioConfig( inConfig ); - if ( inConfig != IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) + if ( ( error = getAudioConfigNumChannels( inConfig, &num_src ) ) != IVAS_ERR_OK ) { - if ( ( error = getAudioConfigNumChannels( inConfig, &num_src ) ) != IVAS_ERR_OK ) - { - return error; - } - } - else - { - lfe_idx = ( customLsInput->num_lfe > 0 ) ? customLsInput->lfe_idx[0] : -1; - num_src = customLsInput->num_spk + customLsInput->num_lfe; + return error; } } else { - ivas_format = ISM_FORMAT; - num_src = 1; - transport_config = AUDIO_CONFIG_ISM1; - hIsmMetaData[0] = &hIsmMetaDataFrame; - hIsmMetaData[0]->azimuth = currentPos->azimuth; - hIsmMetaData[0]->elevation = currentPos->elevation; - hIsmMetaData[0]->yaw = currentPos->yaw; - hIsmMetaData[0]->pitch = currentPos->pitch; - hIsmMetaData[0]->radius = currentPos->radius; + lfe_idx = ( customLsInput->num_lfe > 0 ) ? customLsInput->lfe_idx[0] : -1; + num_src = customLsInput->num_spk + customLsInput->num_lfe; } + } + else + { + ivas_format = ISM_FORMAT; + num_src = 1; + transport_config = AUDIO_CONFIG_ISM1; + hIsmMetaData[0] = &hIsmMetaDataFrame; + hIsmMetaData[0]->azimuth = currentPos->azimuth; + hIsmMetaData[0]->elevation = currentPos->elevation; + hIsmMetaData[0]->yaw = currentPos->yaw; + hIsmMetaData[0]->pitch = currentPos->pitch; + hIsmMetaData[0]->radius = currentPos->radius; + } #ifdef FIX_356_ISM_METADATA_SYNC - if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, Opt_delay_comp, headRotData->headRotEnabled, + if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, Opt_delay_comp, NULL, headRotData->headRotEnabled, #else - if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, + if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, #endif - ( headRotData != NULL ) ? headRotData->headPositions : NULL, - ( headRotData != NULL ) ? headRotData->Pos : NULL, output, output_frame ) ) != IVAS_ERR_OK ) - { - return error; - } + ( headRotData != NULL ) ? headRotData->headPositions : NULL, + ( headRotData != NULL ) ? headRotData->Pos : NULL, output, output_frame ) ) != IVAS_ERR_OK ) + { + return error; + } - pop_wmops(); + pop_wmops(); - return IVAS_ERR_OK; - } + return IVAS_ERR_OK; +} - /*---------------------------------------------------------------------* - * angles_to_vec() - * - * Convert azimuth and elevation angles to position/orientation vector - *---------------------------------------------------------------------*/ - - static void angles_to_vec( - const float radius, /* i : radius */ - const float azimuth, /* i : Azimuth angle */ - const float elevation, /* i : Elevation angle */ - float *vec /* o : Pos/Dir vector */ - ) - { - vec[0] = radius * cosf( elevation * PI_OVER_180 ) * cosf( azimuth * PI_OVER_180 ); - vec[1] = radius * cosf( elevation * PI_OVER_180 ) * sinf( azimuth * PI_OVER_180 ); - vec[2] = radius * sinf( elevation * PI_OVER_180 ); +/*---------------------------------------------------------------------* + * angles_to_vec() + * + * Convert azimuth and elevation angles to position/orientation vector + *---------------------------------------------------------------------*/ - return; - } +static void angles_to_vec( + const float radius, /* i : radius */ + const float azimuth, /* i : Azimuth angle */ + const float elevation, /* i : Elevation angle */ + float *vec /* o : Pos/Dir vector */ +) +{ + vec[0] = radius * cosf( elevation * PI_OVER_180 ) * cosf( azimuth * PI_OVER_180 ); + vec[1] = radius * cosf( elevation * PI_OVER_180 ) * sinf( azimuth * PI_OVER_180 ); + vec[2] = radius * sinf( elevation * PI_OVER_180 ); + + return; +} diff --git a/lib_rend/ivas_objectRenderer_sources.c b/lib_rend/ivas_objectRenderer_sources.c index 91253748b2..4b58104c17 100644 --- a/lib_rend/ivas_objectRenderer_sources.c +++ b/lib_rend/ivas_objectRenderer_sources.c @@ -219,7 +219,6 @@ static void TDREND_SRC_REND_Init( /* Internal state */ SrcRend_p->InputAvailable = FALSE; SrcRend_p->PlayStatus = TDREND_PLAYSTATUS_INITIAL; - /* SrcGain */ for ( nC = 0; nC < SPAT_BIN_MAX_INPUT_CHANNELS; nC++ ) { diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index b3232656ae..81839e17ac 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -230,6 +230,7 @@ ivas_error ivas_td_binaural_renderer_unwrap( ISM_METADATA_HANDLE *hIsmMetaData, /* i : ISM metadata handle */ #ifdef FIX_356_ISM_METADATA_SYNC const int16_t Opt_delay_comp, /* i : Delay compensation flag */ + const float *directivity, /* i : Directivity pattern (used for ISM) */ #endif const int16_t Opt_Headrotation, /* i : Head rotation flag */ const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ @@ -297,6 +298,9 @@ void TDREND_Update_object_positions( const int16_t lfe_idx, /* i : Input LFE index */ const IVAS_FORMAT in_format, /* i : Format of input sources */ const ISM_METADATA_HANDLE *hIsmMetaData, /* i : Input metadata for ISM objects */ +#ifdef FIX_356_ISM_METADATA_SYNC + const int16_t Opt_delay_comp, +#endif float output[][L_FRAME48k] /* i/o: SCE/MC channels */ ); diff --git a/lib_util/audio_file_writer.c b/lib_util/audio_file_writer.c index 81084dbd95..0ed64d02c5 100644 --- a/lib_util/audio_file_writer.c +++ b/lib_util/audio_file_writer.c @@ -151,7 +151,6 @@ ivas_error AudioFileWriter_write( uint32_t numSamples ) { ivas_error error = IVAS_ERR_OK; - if ( self->rawFile ) { if ( fwrite( samples, sizeof( int16_t ), numSamples, self->rawFile ) != numSamples ) -- GitLab From 5182c183b95b0f1a23b00eed811c187b83e331e0 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Mon, 15 May 2023 08:06:37 +0200 Subject: [PATCH 150/331] Add fix for directivity pattern under FIX_463_TD_RENDERER_DIRECTIVITY_RESET --- lib_com/options.h | 1 + lib_rend/ivas_objectRenderer.c | 2 ++ 2 files changed, 3 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index e68aca0ef1..6b524c67b1 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -215,6 +215,7 @@ #endif #define COMPLEXITY_LEVEL_INDICATION +#define FIX_463_TD_RENDERER_DIRECTIVITY_RESET /* Eri: Remove unintentional reset of directivity pattern */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 0618534448..92cfaabd71 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -435,10 +435,12 @@ void TDREND_Update_object_positions( /* Source position and direction */ angles_to_vec( hIsmMetaData[nS]->radius, hIsmMetaData[nS]->azimuth, hIsmMetaData[nS]->elevation, Pos ); angles_to_vec( 1.0f, hIsmMetaData[nS]->yaw, hIsmMetaData[nS]->pitch, Dir ); +#ifndef FIX_463_TD_RENDERER_DIRECTIVITY_RESET /* Source directivity info */ DirAtten_p->ConeInnerAngle = 360.0f; DirAtten_p->ConeOuterAngle = 360.0f; DirAtten_p->ConeOuterGain = 1.0f; +#endif TDREND_MIX_SRC_SetPos( hBinRendererTd, nS, Pos ); TDREND_MIX_SRC_SetDirAtten( hBinRendererTd, nS, DirAtten_p ); -- GitLab From 8c81788184d2d84514a7b6b506db17fb6d045abd Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 15 May 2023 08:35:41 +0200 Subject: [PATCH 151/331] wrap changes into the new switch FIX_642 --- lib_com/options.h | 2 ++ lib_dec/ivas_dirac_dec.c | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index e68aca0ef1..b13da21142 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -216,6 +216,8 @@ #define COMPLEXITY_LEVEL_INDICATION +#define FIX_642 /* FhG: Fix for usse 642, buggy DoA-array access in DirAC head rotation*/ + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 2cc3d15fec..88bdd4dda5 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -2572,7 +2572,11 @@ void ivas_dirac_dec( num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ ) { +#ifndef FIX_642 + index_slot = subframe_idx * hDirAC->subframe_nbslots + slot_idx; +#else index_slot = ( hDirAC->dirac_read_idx + slot_idx ) % hDirAC->dirac_md_buffer_length; +#endif rotateAziEle_DirAC( hDirAC->azimuth[index_slot], hDirAC->elevation[index_slot], num_freq_bands, hDirAC->num_freq_bands, p_Rmat ); } } -- GitLab From 1173116fccec4b253fab20d20b4b2976ab07fbf4 Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 15 May 2023 09:20:54 +0200 Subject: [PATCH 152/331] harmonize parameter names; add "const" to fucntion input parameters --- apps/decoder.c | 1 + apps/renderer.c | 31 ++++++++++++++++++++++++------- lib_dec/lib_dec.c | 10 +++++----- lib_dec/lib_dec.h | 2 +- lib_rend/ivas_orient_trk.c | 24 +++++++++++++++++++++--- lib_rend/ivas_prot_rend.h | 2 +- lib_rend/ivas_stat_rend.h | 2 +- lib_rend/lib_rend.c | 6 +++--- lib_rend/lib_rend.h | 8 ++++---- 9 files changed, 61 insertions(+), 25 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index a24c177c84..1942fe7cfa 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -189,6 +189,7 @@ int main( /*------------------------------------------------------------------------------------------* * Open decoder handle *------------------------------------------------------------------------------------------*/ + #ifdef FIX_439_OTR_PARAMS if ( ( error = IVAS_DEC_Open( &hIvasDec, arg.decMode, arg.no_diegetic_pan ) ) != IVAS_ERR_OK ) #else diff --git a/apps/renderer.c b/apps/renderer.c index 1477e2279e..68300d2950 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -135,7 +135,11 @@ typedef struct char referenceRotationFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; char customHrtfFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; char renderConfigFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; +#ifdef FIX_439_OTR_PARAMS + int8_t orientation_tracking; +#else int8_t orientationTracking; +#endif float noDiegeticPan; bool delayCompensationEnabled; bool quietModeEnabled; @@ -708,7 +712,11 @@ int main( } } +#ifdef FIX_439_OTR_PARAMS + if ( ( error = IVAS_REND_SetOrientationTrackingMode( hIvasRend, args.orientation_tracking ) ) != IVAS_ERR_OK ) +#else if ( ( error = IVAS_REND_SetOrientationTrackingMode( hIvasRend, args.orientationTracking ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -1367,7 +1375,12 @@ static bool parseDiegeticPan( static bool parseOrientationTracking( char *value, - int8_t *tracking_type ) +#ifdef FIX_439_OTR_PARAMS + int8_t *orientation_tracking +#else + int8_t *tracking_type +#endif +) { to_upper( value ); @@ -1375,7 +1388,7 @@ static bool parseOrientationTracking( if ( strcmp( value, "NONE" ) == 0 ) { #ifdef FIX_439_OTR_PARAMS - *tracking_type = HEAD_ORIENT_TRK_NONE; + *orientation_tracking = HEAD_ORIENT_TRK_NONE; #else *tracking_type = IVAS_ORIENT_TRK_NONE; #endif @@ -1383,7 +1396,7 @@ static bool parseOrientationTracking( else if ( strcmp( value, "REF" ) == 0 ) { #ifdef FIX_439_OTR_PARAMS - *tracking_type = HEAD_ORIENT_TRK_REF; + *orientation_tracking = HEAD_ORIENT_TRK_REF; #else *tracking_type = IVAS_ORIENT_TRK_REF; #endif @@ -1391,7 +1404,7 @@ static bool parseOrientationTracking( else if ( strcmp( value, "AVG" ) == 0 ) { #ifdef FIX_439_OTR_PARAMS - *tracking_type = HEAD_ORIENT_TRK_AVG; + *orientation_tracking = HEAD_ORIENT_TRK_AVG; #else *tracking_type = IVAS_ORIENT_TRK_AVG; #endif @@ -1399,7 +1412,7 @@ static bool parseOrientationTracking( else if ( strcmp( value, "REF_VEC" ) == 0 ) { #ifdef FIX_439_OTR_PARAMS - *tracking_type = HEAD_ORIENT_TRK_REF_VEC; + *orientation_tracking = HEAD_ORIENT_TRK_REF_VEC; #else *tracking_type = IVAS_ORIENT_TRK_REF_VEC; #endif @@ -1407,7 +1420,7 @@ static bool parseOrientationTracking( else if ( strcmp( value, "REF_VEC_LEV" ) == 0 ) { #ifdef FIX_439_OTR_PARAMS - *tracking_type = HEAD_ORIENT_TRK_REF_VEC_LEV; + *orientation_tracking = HEAD_ORIENT_TRK_REF_VEC_LEV; #else *tracking_type = IVAS_ORIENT_TRK_REF_VEC_LEV; #endif @@ -1635,7 +1648,7 @@ static CmdlnArgs defaultArgs( clearString( args.renderConfigFilePath ); #ifdef FIX_439_OTR_PARAMS - args.orientationTracking = HEAD_ORIENT_TRK_NONE; + args.orientation_tracking = HEAD_ORIENT_TRK_NONE; #else args.orientationTracking = IVAS_ORIENT_TRK_NONE; #endif @@ -1739,7 +1752,11 @@ static void parseOption( break; case CmdLnOptionId_orientationTracking: assert( numOptionValues == 1 ); +#ifdef FIX_439_OTR_PARAMS + if ( !parseOrientationTracking( optionValues[0], &args->orientation_tracking ) ) +#else if ( !parseOrientationTracking( optionValues[0], &args->orientationTracking ) ) +#endif { fprintf( stderr, "Unknown option for orientation tracking: %s\n", optionValues[0] ); exit( -1 ); diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 85bcd76c55..bb00dc6559 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -109,8 +109,8 @@ static void init_decoder_config( DECODER_CONFIG_HANDLE hDecoderConfig, const int /* may return an error but may still have allocated memory - thus run Close also in case of error to release memory */ ivas_error IVAS_DEC_Open( - IVAS_DEC_HANDLE *phIvasDec, /* i/o: pointer to an IVAS decoder handle to be opened */ - const IVAS_DEC_MODE mode, /* i : compatibility mode (EVS or IVAS) */ + IVAS_DEC_HANDLE *phIvasDec, /* i/o: pointer to an IVAS decoder handle to be opened */ + const IVAS_DEC_MODE mode, /* i : compatibility mode (EVS or IVAS) */ #ifndef FIX_439_OTR_PARAMS const int16_t orientation_tracking, /* i : orientation tracking type */ #endif @@ -402,9 +402,9 @@ ivas_error IVAS_DEC_Configure( const int16_t hrtfReaderEnabled, /* i : enable HRTF binary file input */ const int16_t enableHeadRotation, /* i : enable head rotation for binaural output */ #ifdef FIX_439_OTR_PARAMS - HEAD_ORIENT_TRK_T orientationTracking, /* i : head orientation tracking mode */ + const HEAD_ORIENT_TRK_T orientation_tracking, /* i : head orientation tracking type */ #endif - const int16_t renderConfigEnabled /* i : enable Renderer config. file for binaural output */ + const int16_t renderConfigEnabled /* i : enable Renderer config. file for binaural output */ ) { Decoder_Struct *st_ivas; @@ -453,7 +453,7 @@ ivas_error IVAS_DEC_Configure( hDecoderConfig->Opt_LsCustom = customLsOutputEnabled; hDecoderConfig->Opt_Headrotation = enableHeadRotation; #ifdef FIX_439_OTR_PARAMS - hDecoderConfig->orientation_tracking = orientationTracking; + hDecoderConfig->orientation_tracking = orientation_tracking; #endif hDecoderConfig->Opt_HRTF_binary = hrtfReaderEnabled; hDecoderConfig->Opt_RendConfigCustom = renderConfigEnabled; diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index 069137fddd..091f50ca23 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -132,7 +132,7 @@ ivas_error IVAS_DEC_Configure( const int16_t hrtfReaderEnabled, /* i : enable HRTF binary file input */ const int16_t enableHeadRotation, /* i : enable head rotation for binaural output */ #ifdef FIX_439_OTR_PARAMS - HEAD_ORIENT_TRK_T orientationTracking, /* i : head orientation tracking mode */ + const HEAD_ORIENT_TRK_T orientation_tracking, /* i : head orientation tracking type */ #endif const int16_t renderConfigEnabled /* i : enable Renderer config. file for binaural output */ ); diff --git a/lib_rend/ivas_orient_trk.c b/lib_rend/ivas_orient_trk.c index de4b589c14..ae646b4d5c 100644 --- a/lib_rend/ivas_orient_trk.c +++ b/lib_rend/ivas_orient_trk.c @@ -407,7 +407,7 @@ ivas_error ivas_orient_trk_Init( /* set safe default tracking mode */ #ifdef FIX_439_OTR_PARAMS - pOTR->trackingType = HEAD_ORIENT_TRK_NONE; + pOTR->orientation_tracking = HEAD_ORIENT_TRK_NONE; #else pOTR->trackingType = OTR_TRACKING_NONE; #endif @@ -423,9 +423,9 @@ ivas_error ivas_orient_trk_Init( *-------------------------------------------------------------------*/ ivas_error ivas_orient_trk_SetTrackingType( - ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ + ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ #ifdef FIX_439_OTR_PARAMS - HEAD_ORIENT_TRK_T trackingType /* i/o: orientation tracking type */ + const HEAD_ORIENT_TRK_T orientation_tracking /* i : orientation tracking type */ #else const OTR_TRACKING_T trackingType /* i/o: orientation tracking type */ #endif @@ -435,7 +435,12 @@ ivas_error ivas_orient_trk_SetTrackingType( { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } + +#ifdef FIX_439_OTR_PARAMS + pOTR->orientation_tracking = orientation_tracking; +#else pOTR->trackingType = trackingType; +#endif return IVAS_ERR_OK; } @@ -485,7 +490,12 @@ ivas_error ivas_orient_trk_GetMainOrientation( { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } + +#ifdef FIX_439_OTR_PARAMS + switch ( pOTR->orientation_tracking ) +#else switch ( pOTR->trackingType ) +#endif { #ifdef FIX_439_OTR_PARAMS case HEAD_ORIENT_TRK_NONE: @@ -561,7 +571,11 @@ ivas_error ivas_orient_trk_SetReferenceVector( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } +#ifdef FIX_439_OTR_PARAMS + switch ( pOTR->orientation_tracking ) +#else switch ( pOTR->trackingType ) +#endif { #ifdef FIX_439_OTR_PARAMS case HEAD_ORIENT_TRK_NONE: @@ -638,7 +652,11 @@ ivas_error ivas_orient_trk_Process( result = IVAS_ERR_OK; +#ifdef FIX_439_OTR_PARAMS + switch ( pOTR->orientation_tracking ) +#else switch ( pOTR->trackingType ) +#endif { #ifdef FIX_439_OTR_PARAMS case HEAD_ORIENT_TRK_NONE: diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 55ff934168..34d4edc65a 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -874,7 +874,7 @@ ivas_error ivas_orient_trk_Init( ivas_error ivas_orient_trk_SetTrackingType( ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ #ifdef FIX_439_OTR_PARAMS - HEAD_ORIENT_TRK_T trackingType /* i : orientation tracking type */ + const HEAD_ORIENT_TRK_T orientation_tracking /* i : orientation tracking type */ #else const OTR_TRACKING_T trackingType /* i : orientation tracking type */ #endif diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 230fda130a..a987a1f835 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -229,7 +229,7 @@ typedef struct EFAP typedef struct ivas_orient_trk_state_t { #ifdef FIX_439_OTR_PARAMS - HEAD_ORIENT_TRK_T trackingType; + HEAD_ORIENT_TRK_T orientation_tracking; #else OTR_TRACKING_T trackingType; #endif diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index e889900fe4..2fb8ba6753 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -3858,14 +3858,14 @@ ivas_error IVAS_REND_SetHeadRotation( ivas_error IVAS_REND_SetOrientationTrackingMode( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ #ifdef FIX_439_OTR_PARAMS - HEAD_ORIENT_TRK_T otrMode /* i : Head orientation tracking mode */ + const HEAD_ORIENT_TRK_T orientation_tracking /* i : Head orientation tracking type */ #else - const uint8_t otrMode /* i : Orientation tracking mode */ + const uint8_t otrMode /* i : Orientation tracking mode */ #endif ) { #ifdef FIX_439_OTR_PARAMS - return ivas_orient_trk_SetTrackingType( hIvasRend->headRotData.hOrientationTracker, otrMode ); + return ivas_orient_trk_SetTrackingType( hIvasRend->headRotData.hOrientationTracker, orientation_tracking ); #else OTR_TRACKING_T mode; ivas_error error; diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index 9d9ed3555a..8e681c3832 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -228,8 +228,8 @@ ivas_error IVAS_REND_FeedInputMasaMetadata( ); ivas_error IVAS_REND_InitConfig( - IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ - const IVAS_REND_AudioConfig outAudioConfig /* i : output audioConfig */ + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_REND_AudioConfig outAudioConfig /* i : output audioConfig */ ); int16_t IVAS_REND_GetRenderConfig( @@ -245,13 +245,13 @@ int16_t IVAS_REND_FeedRenderConfig( ivas_error IVAS_REND_SetHeadRotation( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ const IVAS_QUATERNION headRot[RENDERER_HEAD_POSITIONS_PER_FRAME], /* i : head orientations for next rendering call */ - const IVAS_VECTOR3 Pos[RENDERER_HEAD_POSITIONS_PER_FRAME] /* i : listener positions for next rendering call */ + const IVAS_VECTOR3 Pos[RENDERER_HEAD_POSITIONS_PER_FRAME] /* i : listener positions for next rendering call */ ); ivas_error IVAS_REND_SetOrientationTrackingMode( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ #ifdef FIX_439_OTR_PARAMS - HEAD_ORIENT_TRK_T otrMode /* i : Head orientation tracking mode */ + const HEAD_ORIENT_TRK_T orientation_tracking /* i : Head orientation tracking type */ #else const uint8_t otrMode /* i : Orientation tracking mode */ #endif -- GitLab From 5b2ea567d1151c8bdfb47106a88501657d9469fb Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 15 May 2023 09:28:06 +0200 Subject: [PATCH 153/331] fix compilation warning --- lib_dec/lib_dec.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index bb00dc6559..9a18cbf356 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -2021,6 +2021,8 @@ static ivas_error printConfigInfo_dec( case HEAD_ORIENT_TRK_REF_VEC_LEV: fprintf( stdout, "Orientation tracking: REF_VEC_LEV\n" ); break; + default: + break; } } #else -- GitLab From c375cbad87e5a7df871ebe74666a57a85741acf9 Mon Sep 17 00:00:00 2001 From: emerit Date: Mon, 15 May 2023 10:16:56 +0200 Subject: [PATCH 154/331] Update metadata ism file to 8 values --- scripts/testv/stvISM1.csv | 3000 ++++++++++++++--------------- scripts/testv/stvISM2.csv | 3000 ++++++++++++++--------------- scripts/testv/stvISM3.csv | 3000 ++++++++++++++--------------- scripts/testv/stvISM4.csv | 3000 ++++++++++++++--------------- tests/renderer/data/ism_0a_0e.csv | 1499 +++++++------- 5 files changed, 6749 insertions(+), 6750 deletions(-) diff --git a/scripts/testv/stvISM1.csv b/scripts/testv/stvISM1.csv index 0082c12823..9100a52238 100644 --- a/scripts/testv/stvISM1.csv +++ b/scripts/testv/stvISM1.csv @@ -1,1500 +1,1500 @@ -0.00,0.00,0.00,0.00,1.00,0.00,0.00 -4.80,0.00,0.02,0.00,1.00,0.00,-4.80 -9.60,0.00,0.04,0.00,1.00,0.00,4.80 -14.40,0.00,0.06,0.00,1.00,0.00,-9.60 -19.20,0.00,0.09,0.00,1.00,0.00,14.40 -24.00,0.00,0.11,0.00,1.00,0.00,-14.40 -28.80,0.00,0.13,0.00,1.00,0.00,19.20 -33.60,0.00,0.15,0.00,1.00,0.00,-24.00 -38.40,0.00,0.17,0.00,1.00,0.00,24.00 -43.20,0.00,0.19,0.00,1.00,0.00,-28.80 -48.00,0.00,0.21,0.00,1.00,0.00,33.60 -52.80,0.00,0.23,0.00,1.00,0.00,-33.60 -57.60,0.00,0.26,0.00,1.00,0.00,38.40 -62.40,0.00,0.28,0.00,1.00,4.80,-38.40 -67.20,0.00,0.30,0.00,1.00,4.80,38.40 -72.00,0.00,0.32,0.00,1.00,4.80,-43.20 -76.80,0.00,0.34,0.00,1.00,9.60,43.20 -81.60,0.00,0.36,0.00,1.00,19.20,-43.20 -86.40,0.00,0.38,0.00,1.00,134.40,43.20 -91.20,0.00,0.41,0.00,1.00,168.00,-43.20 -96.00,0.00,0.43,0.00,1.00,172.80,43.20 -100.80,0.00,0.45,0.00,1.00,177.60,-43.20 -105.60,0.00,0.47,0.00,1.00,177.60,43.20 -110.40,0.00,0.49,0.00,1.00,177.60,-43.20 -115.20,0.00,0.51,0.00,1.00,177.60,38.40 -120.00,0.00,0.53,0.00,1.00,177.60,-38.40 -124.80,0.00,0.56,0.00,1.00,177.60,33.60 -129.60,0.00,0.58,0.00,1.00,177.60,-33.60 -134.40,0.00,0.60,0.00,1.00,177.60,28.80 -139.20,0.00,0.62,0.00,1.00,177.60,-28.80 -144.00,0.00,0.64,0.00,1.00,177.60,24.00 -148.80,0.00,0.66,0.00,1.00,177.60,-19.20 -153.60,0.00,0.68,0.00,1.00,177.60,19.20 -158.40,0.00,0.70,0.00,1.00,177.60,-14.40 -163.20,0.00,0.73,0.00,1.00,177.60,9.60 -168.00,0.00,0.75,0.00,1.00,177.60,-9.60 -172.80,0.00,0.77,0.00,1.00,177.60,4.80 -177.60,0.00,0.79,0.00,1.00,-177.60,-0.00 --177.60,0.00,0.81,0.00,1.00,-177.60,-0.00 --172.80,0.00,0.83,0.00,1.00,-177.60,4.80 --168.00,0.00,0.85,0.00,1.00,-177.60,-9.60 --163.20,0.00,0.88,0.00,1.00,-177.60,9.60 --158.40,0.00,0.90,0.00,1.00,-177.60,-14.40 --153.60,0.00,0.92,0.00,1.00,-177.60,19.20 --148.80,0.00,0.94,0.00,1.00,-177.60,-19.20 --144.00,0.00,0.96,0.00,1.00,-177.60,24.00 --139.20,0.00,0.98,0.00,1.00,-177.60,-28.80 --134.40,0.00,1.00,0.00,1.00,-177.60,28.80 --129.60,0.00,1.03,0.00,1.00,-177.60,-33.60 --124.80,0.00,1.05,0.00,1.00,-177.60,33.60 --120.00,0.00,1.07,0.00,1.00,-177.60,-38.40 --115.20,0.00,1.09,0.00,1.00,-177.60,38.40 --110.40,0.00,1.11,0.00,1.00,-177.60,-43.20 --105.60,0.00,1.13,0.00,1.00,-172.80,43.20 --100.80,0.00,1.15,0.00,1.00,-168.00,-43.20 --96.00,0.00,1.17,0.00,1.00,-134.40,43.20 --91.20,0.00,1.20,0.00,1.00,-19.20,-43.20 --86.40,0.00,1.22,0.00,1.00,-9.60,43.20 --81.60,0.00,1.24,0.00,1.00,-4.80,-43.20 --76.80,0.00,1.26,0.00,1.00,-4.80,43.20 --72.00,0.00,1.28,0.00,1.00,-4.80,-43.20 --67.20,0.00,1.30,0.00,1.00,-0.00,38.40 --62.40,0.00,1.32,0.00,1.00,-0.00,-38.40 --57.60,0.00,1.35,0.00,1.00,-0.00,38.40 --52.80,0.00,1.37,0.00,1.00,-0.00,-33.60 --48.00,0.00,1.39,0.00,1.00,-0.00,33.60 --43.20,0.00,1.41,0.00,1.00,-0.00,-28.80 --38.40,0.00,1.43,0.00,1.00,-0.00,24.00 --33.60,0.00,1.45,0.00,1.00,-0.00,-24.00 --28.80,0.00,1.47,0.00,1.00,-0.00,19.20 --24.00,0.00,1.50,0.00,1.00,-0.00,-14.40 --19.20,0.00,1.52,0.00,1.00,-0.00,14.40 --14.40,0.00,1.54,0.00,1.00,-0.00,-9.60 --9.60,0.00,1.56,0.00,1.00,-0.00,4.80 --4.80,0.00,1.58,0.00,1.00,-0.00,-4.80 -0.00,0.00,1.60,0.00,1.00,-0.00,0.00 -4.80,-0.00,1.62,0.00,1.00,-0.00,-4.80 -9.60,-0.00,1.64,0.00,1.00,-0.00,4.80 -14.40,-0.00,1.67,0.00,1.00,-0.00,-9.60 -19.20,-0.00,1.69,0.00,1.00,-0.00,14.40 -24.00,-0.00,1.71,0.00,1.00,-0.00,-14.40 -28.80,-0.00,1.73,0.00,1.00,-0.00,19.20 -33.60,-4.80,1.75,0.00,1.00,-4.80,-19.20 -38.40,-4.80,1.77,0.00,1.00,-4.80,24.00 -43.20,-4.80,1.79,0.00,1.00,-4.80,-24.00 -48.00,-4.80,1.82,0.00,1.00,-4.80,28.80 -52.80,-4.80,1.84,0.00,1.00,-4.80,-28.80 -57.60,-4.80,1.86,0.00,1.00,-4.80,33.60 -62.40,-4.80,1.88,0.00,1.00,-9.60,-33.60 -67.20,-4.80,1.90,0.00,1.00,-9.60,38.40 -72.00,-4.80,1.92,0.00,1.00,-14.40,-38.40 -76.80,-4.80,1.94,0.00,1.00,-24.00,38.40 -81.60,-4.80,1.97,0.00,1.00,-43.20,-38.40 -86.40,-4.80,1.99,0.00,1.00,-110.40,38.40 -91.20,-4.80,2.01,0.00,1.00,-148.80,-38.40 -96.00,-4.80,2.03,0.00,1.00,-163.20,38.40 -100.80,-4.80,2.05,0.00,1.00,-168.00,-38.40 -105.60,-4.80,2.07,0.00,1.00,-172.80,38.40 -110.40,-4.80,2.09,0.00,1.00,-172.80,-38.40 -115.20,-4.80,2.11,0.00,1.00,-172.80,33.60 -120.00,-4.80,2.14,0.00,1.00,-172.80,-33.60 -124.80,-4.80,2.16,0.00,1.00,-177.60,33.60 -129.60,-4.80,2.18,0.00,1.00,-177.60,-28.80 -134.40,-4.80,2.20,0.00,1.00,-177.60,28.80 -139.20,-4.80,2.22,0.00,1.00,-177.60,-24.00 -144.00,-4.80,2.24,0.00,1.00,-177.60,24.00 -148.80,-4.80,2.26,0.00,1.00,-177.60,-19.20 -153.60,-0.00,2.29,0.00,1.00,-177.60,14.40 -158.40,-0.00,2.31,0.00,1.00,-177.60,-14.40 -163.20,-0.00,2.33,0.00,1.00,-177.60,9.60 -168.00,-0.00,2.35,0.00,1.00,-177.60,-9.60 -172.80,-0.00,2.37,0.00,1.00,-177.60,4.80 -177.60,-0.00,2.39,0.00,1.00,177.60,-0.00 --177.60,0.00,2.41,0.00,1.00,177.60,-0.00 --172.80,0.00,2.44,0.00,1.00,177.60,4.80 --168.00,0.00,2.46,0.00,1.00,177.60,-9.60 --163.20,0.00,2.48,0.00,1.00,177.60,9.60 --158.40,0.00,2.50,0.00,1.00,177.60,-14.40 --153.60,0.00,2.52,0.00,1.00,177.60,14.40 --148.80,4.80,2.54,0.00,1.00,177.60,-19.20 --144.00,4.80,2.56,0.00,1.00,177.60,24.00 --139.20,4.80,2.58,0.00,1.00,177.60,-24.00 --134.40,4.80,2.61,0.00,1.00,177.60,28.80 --129.60,4.80,2.63,0.00,1.00,172.80,-28.80 --124.80,4.80,2.65,0.00,1.00,172.80,33.60 --120.00,4.80,2.67,0.00,1.00,172.80,-33.60 --115.20,4.80,2.69,0.00,1.00,172.80,33.60 --110.40,4.80,2.71,0.00,1.00,168.00,-38.40 --105.60,4.80,2.73,0.00,1.00,163.20,38.40 --100.80,4.80,2.76,0.00,1.00,148.80,-38.40 --96.00,4.80,2.78,0.00,1.00,110.40,38.40 --91.20,4.80,2.80,0.00,1.00,43.20,-38.40 --86.40,4.80,2.82,0.00,1.00,24.00,38.40 --81.60,4.80,2.84,0.00,1.00,14.40,-38.40 --76.80,4.80,2.86,0.00,1.00,9.60,38.40 --72.00,4.80,2.88,0.00,1.00,9.60,-38.40 --67.20,4.80,2.91,0.00,1.00,4.80,38.40 --62.40,4.80,2.93,0.00,1.00,4.80,-33.60 --57.60,4.80,2.95,0.00,1.00,4.80,33.60 --52.80,4.80,2.97,0.00,1.00,4.80,-28.80 --48.00,4.80,2.99,0.00,1.00,4.80,28.80 --43.20,4.80,3.01,0.00,1.00,4.80,-24.00 --38.40,4.80,3.03,0.00,1.00,0.00,24.00 --33.60,4.80,3.05,0.00,1.00,0.00,-19.20 --28.80,0.00,3.08,0.00,1.00,0.00,19.20 --24.00,0.00,3.10,0.00,1.00,0.00,-14.40 --19.20,0.00,3.12,0.00,1.00,0.00,14.40 --14.40,0.00,3.14,0.00,1.00,0.00,-9.60 --9.60,0.00,3.16,0.00,1.00,0.00,4.80 --4.80,0.00,3.18,0.00,1.00,0.00,-4.80 -0.00,0.00,3.20,0.00,1.00,-0.00,0.00 -4.80,-0.00,3.23,0.00,1.00,-0.00,-4.80 -9.60,-0.00,3.25,0.00,1.00,-0.00,4.80 -14.40,-0.00,3.27,0.00,1.00,-4.80,-9.60 -19.20,-4.80,3.29,0.00,1.00,-4.80,9.60 -24.00,-4.80,3.31,0.00,1.00,-4.80,-14.40 -28.80,-4.80,3.33,0.00,1.00,-4.80,14.40 -33.60,-4.80,3.35,0.00,1.00,-4.80,-19.20 -38.40,-4.80,3.38,0.00,1.00,-9.60,19.20 -43.20,-4.80,3.40,0.00,1.00,-9.60,-24.00 -48.00,-4.80,3.42,0.00,1.00,-9.60,24.00 -52.80,-9.60,3.44,0.00,1.00,-14.40,-28.80 -57.60,-9.60,3.46,0.00,1.00,-14.40,28.80 -62.40,-9.60,3.48,0.00,1.00,-19.20,-28.80 -67.20,-9.60,3.50,0.00,1.00,-24.00,33.60 -72.00,-9.60,3.52,0.00,1.00,-33.60,-33.60 -76.80,-9.60,3.55,0.00,1.00,-43.20,33.60 -81.60,-9.60,3.57,0.00,1.00,-67.20,-33.60 -86.40,-9.60,3.59,0.00,1.00,-96.00,33.60 -91.20,-9.60,3.61,0.00,1.00,-124.80,-33.60 -96.00,-9.60,3.63,0.00,1.00,-144.00,33.60 -100.80,-9.60,3.65,0.00,1.00,-153.60,-33.60 -105.60,-9.60,3.67,0.00,1.00,-158.40,33.60 -110.40,-9.60,3.70,0.00,1.00,-163.20,-33.60 -115.20,-9.60,3.72,0.00,1.00,-168.00,33.60 -120.00,-9.60,3.74,0.00,1.00,-168.00,-28.80 -124.80,-9.60,3.76,0.00,1.00,-168.00,28.80 -129.60,-9.60,3.78,0.00,1.00,-172.80,-28.80 -134.40,-4.80,3.80,0.00,1.00,-172.80,24.00 -139.20,-4.80,3.82,0.00,1.00,-172.80,-24.00 -144.00,-4.80,3.85,0.00,1.00,-172.80,19.20 -148.80,-4.80,3.87,0.00,1.00,-177.60,-19.20 -153.60,-4.80,3.89,0.00,1.00,-177.60,14.40 -158.40,-4.80,3.91,0.00,1.00,-177.60,-14.40 -163.20,-4.80,3.93,0.00,1.00,-177.60,9.60 -168.00,-0.00,3.95,0.00,1.00,-177.60,-4.80 -172.80,-0.00,3.97,0.00,1.00,-177.60,4.80 -177.60,-0.00,3.99,0.00,1.00,177.60,-0.00 --177.60,0.00,4.02,0.00,1.00,177.60,-0.00 --172.80,0.00,4.04,0.00,1.00,177.60,4.80 --168.00,0.00,4.06,0.00,1.00,177.60,-4.80 --163.20,4.80,4.08,0.00,1.00,177.60,9.60 --158.40,4.80,4.10,0.00,1.00,177.60,-14.40 --153.60,4.80,4.12,0.00,1.00,172.80,14.40 --148.80,4.80,4.14,0.00,1.00,172.80,-19.20 --144.00,4.80,4.17,0.00,1.00,172.80,19.20 --139.20,4.80,4.19,0.00,1.00,172.80,-24.00 --134.40,4.80,4.21,0.00,1.00,168.00,24.00 --129.60,9.60,4.23,0.00,1.00,168.00,-28.80 --124.80,9.60,4.25,0.00,1.00,168.00,28.80 --120.00,9.60,4.27,0.00,1.00,163.20,-28.80 --115.20,9.60,4.29,0.00,1.00,158.40,33.60 --110.40,9.60,4.32,0.00,1.00,153.60,-33.60 --105.60,9.60,4.34,0.00,1.00,144.00,33.60 --100.80,9.60,4.36,0.00,1.00,124.80,-33.60 --96.00,9.60,4.38,0.00,1.00,96.00,33.60 --91.20,9.60,4.40,0.00,1.00,67.20,-33.60 --86.40,9.60,4.42,0.00,1.00,43.20,33.60 --81.60,9.60,4.44,0.00,1.00,33.60,-33.60 --76.80,9.60,4.46,0.00,1.00,24.00,33.60 --72.00,9.60,4.49,0.00,1.00,19.20,-33.60 --67.20,9.60,4.51,0.00,1.00,14.40,33.60 --62.40,9.60,4.53,0.00,1.00,14.40,-28.80 --57.60,9.60,4.55,0.00,1.00,9.60,28.80 --52.80,9.60,4.57,0.00,1.00,9.60,-28.80 --48.00,4.80,4.59,0.00,1.00,9.60,24.00 --43.20,4.80,4.61,0.00,1.00,4.80,-24.00 --38.40,4.80,4.64,0.00,1.00,4.80,19.20 --33.60,4.80,4.66,0.00,1.00,4.80,-19.20 --28.80,4.80,4.68,0.00,1.00,4.80,14.40 --24.00,4.80,4.70,0.00,1.00,4.80,-14.40 --19.20,4.80,4.72,0.00,1.00,0.00,9.60 --14.40,0.00,4.74,0.00,1.00,0.00,-9.60 --9.60,0.00,4.76,0.00,1.00,0.00,4.80 --4.80,0.00,4.79,0.00,1.00,0.00,-4.80 -0.00,0.00,4.81,0.00,1.00,-0.00,0.00 -4.80,-0.00,4.83,0.00,1.00,-0.00,-4.80 -9.60,-0.00,4.85,0.00,1.00,-4.80,4.80 -14.40,-4.80,4.87,0.00,1.00,-4.80,-9.60 -19.20,-4.80,4.89,0.00,1.00,-4.80,9.60 -24.00,-4.80,4.91,0.00,1.00,-4.80,-9.60 -28.80,-4.80,4.93,0.00,1.00,-9.60,14.40 -33.60,-9.60,4.96,0.00,1.00,-9.60,-14.40 -38.40,-9.60,4.98,0.00,1.00,-14.40,19.20 -43.20,-9.60,5.00,0.00,1.00,-14.40,-19.20 -48.00,-9.60,5.02,0.00,1.00,-14.40,24.00 -52.80,-9.60,5.04,0.00,1.00,-19.20,-24.00 -57.60,-14.40,5.06,0.00,1.00,-24.00,24.00 -62.40,-14.40,5.08,0.00,1.00,-28.80,-28.80 -67.20,-14.40,5.11,0.00,1.00,-33.60,28.80 -72.00,-14.40,5.13,0.00,1.00,-43.20,-28.80 -76.80,-14.40,5.15,0.00,1.00,-57.60,28.80 -81.60,-14.40,5.17,0.00,1.00,-76.80,-28.80 -86.40,-14.40,5.19,0.00,1.00,-96.00,28.80 -91.20,-14.40,5.21,0.00,1.00,-115.20,-28.80 -96.00,-14.40,5.23,0.00,1.00,-129.60,28.80 -100.80,-14.40,5.26,0.00,1.00,-139.20,-28.80 -105.60,-14.40,5.28,0.00,1.00,-148.80,28.80 -110.40,-14.40,5.30,0.00,1.00,-153.60,-28.80 -115.20,-14.40,5.32,0.00,1.00,-158.40,28.80 -120.00,-14.40,5.34,0.00,1.00,-163.20,-24.00 -124.80,-9.60,5.36,0.00,1.00,-163.20,24.00 -129.60,-9.60,5.38,0.00,1.00,-168.00,-24.00 -134.40,-9.60,5.40,0.00,1.00,-168.00,19.20 -139.20,-9.60,5.43,0.00,1.00,-172.80,-19.20 -144.00,-9.60,5.45,0.00,1.00,-172.80,19.20 -148.80,-9.60,5.47,0.00,1.00,-172.80,-14.40 -153.60,-4.80,5.49,0.00,1.00,-172.80,14.40 -158.40,-4.80,5.51,0.00,1.00,-177.60,-9.60 -163.20,-4.80,5.53,0.00,1.00,-177.60,9.60 -168.00,-4.80,5.55,0.00,1.00,-177.60,-4.80 -172.80,-0.00,5.58,0.00,1.00,-177.60,4.80 -177.60,-0.00,5.60,0.00,1.00,177.60,-0.00 --177.60,0.00,5.62,0.00,1.00,177.60,-0.00 --172.80,0.00,5.64,0.00,1.00,177.60,4.80 --168.00,4.80,5.66,0.00,1.00,177.60,-4.80 --163.20,4.80,5.68,0.00,1.00,172.80,9.60 --158.40,4.80,5.70,0.00,1.00,172.80,-9.60 --153.60,4.80,5.72,0.00,1.00,172.80,14.40 --148.80,9.60,5.75,0.00,1.00,172.80,-14.40 --144.00,9.60,5.77,0.00,1.00,168.00,19.20 --139.20,9.60,5.79,0.00,1.00,168.00,-19.20 --134.40,9.60,5.81,0.00,1.00,163.20,19.20 --129.60,9.60,5.83,0.00,1.00,163.20,-24.00 --124.80,9.60,5.85,0.00,1.00,158.40,24.00 --120.00,14.40,5.87,0.00,1.00,153.60,-24.00 --115.20,14.40,5.90,0.00,1.00,148.80,28.80 --110.40,14.40,5.92,0.00,1.00,139.20,-28.80 --105.60,14.40,5.94,0.00,1.00,129.60,28.80 --100.80,14.40,5.96,0.00,1.00,115.20,-28.80 --96.00,14.40,5.98,0.00,1.00,96.00,28.80 --91.20,14.40,6.00,0.00,1.00,76.80,-28.80 --86.40,14.40,6.02,0.00,1.00,57.60,28.80 --81.60,14.40,6.05,0.00,1.00,43.20,-28.80 --76.80,14.40,6.07,0.00,1.00,33.60,28.80 --72.00,14.40,6.09,0.00,1.00,28.80,-28.80 --67.20,14.40,6.11,0.00,1.00,24.00,28.80 --62.40,14.40,6.13,0.00,1.00,19.20,-28.80 --57.60,14.40,6.15,0.00,1.00,14.40,24.00 --52.80,9.60,6.17,0.00,1.00,14.40,-24.00 --48.00,9.60,6.19,0.00,1.00,14.40,24.00 --43.20,9.60,6.22,0.00,1.00,9.60,-19.20 --38.40,9.60,6.24,0.00,1.00,9.60,19.20 --33.60,9.60,6.26,0.00,1.00,4.80,-14.40 --28.80,4.80,6.28,0.00,1.00,4.80,14.40 --24.00,4.80,6.30,0.00,1.00,4.80,-9.60 --19.20,4.80,6.32,0.00,1.00,4.80,9.60 --14.40,4.80,6.34,0.00,1.00,0.00,-9.60 --9.60,0.00,6.37,0.00,1.00,0.00,4.80 --4.80,0.00,6.39,0.00,1.00,0.00,-4.80 -0.00,0.00,6.41,0.00,1.00,-0.00,0.00 -4.80,-0.00,6.43,0.00,1.00,-4.80,-0.00 -9.60,-4.80,6.45,0.00,1.00,-4.80,4.80 -14.40,-4.80,6.47,0.00,1.00,-4.80,-4.80 -19.20,-4.80,6.49,0.00,1.00,-9.60,9.60 -24.00,-9.60,6.52,0.00,1.00,-9.60,-9.60 -28.80,-9.60,6.54,0.00,1.00,-9.60,14.40 -33.60,-9.60,6.56,0.00,1.00,-14.40,-14.40 -38.40,-9.60,6.58,0.00,1.00,-14.40,14.40 -43.20,-14.40,6.60,0.00,1.00,-19.20,-19.20 -48.00,-14.40,6.62,0.00,1.00,-24.00,19.20 -52.80,-14.40,6.64,0.00,1.00,-24.00,-19.20 -57.60,-14.40,6.66,0.00,1.00,-28.80,19.20 -62.40,-19.20,6.69,0.00,1.00,-38.40,-24.00 -67.20,-19.20,6.71,0.00,1.00,-43.20,24.00 -72.00,-19.20,6.73,0.00,1.00,-52.80,-24.00 -76.80,-19.20,6.75,0.00,1.00,-62.40,24.00 -81.60,-19.20,6.77,0.00,1.00,-76.80,-24.00 -86.40,-19.20,6.79,0.00,1.00,-96.00,24.00 -91.20,-19.20,6.81,0.00,1.00,-110.40,-24.00 -96.00,-19.20,6.84,0.00,1.00,-120.00,24.00 -100.80,-19.20,6.86,0.00,1.00,-134.40,-24.00 -105.60,-19.20,6.88,0.00,1.00,-139.20,24.00 -110.40,-19.20,6.90,0.00,1.00,-148.80,-24.00 -115.20,-19.20,6.92,0.00,1.00,-153.60,24.00 -120.00,-14.40,6.94,0.00,1.00,-158.40,-24.00 -124.80,-14.40,6.96,0.00,1.00,-158.40,19.20 -129.60,-14.40,6.99,0.00,1.00,-163.20,-19.20 -134.40,-14.40,7.01,0.00,1.00,-163.20,19.20 -139.20,-14.40,7.03,0.00,1.00,-168.00,-14.40 -144.00,-9.60,7.05,0.00,1.00,-168.00,14.40 -148.80,-9.60,7.07,0.00,1.00,-172.80,-14.40 -153.60,-9.60,7.09,0.00,1.00,-172.80,9.60 -158.40,-4.80,7.11,0.00,1.00,-172.80,-9.60 -163.20,-4.80,7.13,0.00,1.00,-177.60,9.60 -168.00,-4.80,7.16,0.00,1.00,-177.60,-4.80 -172.80,-0.00,7.18,0.00,1.00,-177.60,4.80 -177.60,-0.00,7.20,0.00,1.00,177.60,-0.00 --177.60,0.00,7.22,0.00,1.00,177.60,-0.00 --172.80,0.00,7.24,0.00,1.00,177.60,4.80 --168.00,4.80,7.26,0.00,1.00,172.80,-4.80 --163.20,4.80,7.28,0.00,1.00,172.80,9.60 --158.40,4.80,7.31,0.00,1.00,172.80,-9.60 --153.60,9.60,7.33,0.00,1.00,168.00,9.60 --148.80,9.60,7.35,0.00,1.00,168.00,-14.40 --144.00,9.60,7.37,0.00,1.00,163.20,14.40 --139.20,14.40,7.39,0.00,1.00,163.20,-14.40 --134.40,14.40,7.41,0.00,1.00,158.40,19.20 --129.60,14.40,7.43,0.00,1.00,158.40,-19.20 --124.80,14.40,7.46,0.00,1.00,153.60,19.20 --120.00,14.40,7.48,0.00,1.00,148.80,-24.00 --115.20,19.20,7.50,0.00,1.00,139.20,24.00 --110.40,19.20,7.52,0.00,1.00,134.40,-24.00 --105.60,19.20,7.54,0.00,1.00,120.00,24.00 --100.80,19.20,7.56,0.00,1.00,110.40,-24.00 --96.00,19.20,7.58,0.00,1.00,96.00,24.00 --91.20,19.20,7.60,0.00,1.00,76.80,-24.00 --86.40,19.20,7.63,0.00,1.00,62.40,24.00 --81.60,19.20,7.65,0.00,1.00,52.80,-24.00 --76.80,19.20,7.67,0.00,1.00,43.20,24.00 --72.00,19.20,7.69,0.00,1.00,38.40,-24.00 --67.20,19.20,7.71,0.00,1.00,28.80,24.00 --62.40,19.20,7.73,0.00,1.00,24.00,-24.00 --57.60,14.40,7.75,0.00,1.00,24.00,19.20 --52.80,14.40,7.78,0.00,1.00,19.20,-19.20 --48.00,14.40,7.80,0.00,1.00,14.40,19.20 --43.20,14.40,7.82,0.00,1.00,14.40,-19.20 --38.40,9.60,7.84,0.00,1.00,9.60,14.40 --33.60,9.60,7.86,0.00,1.00,9.60,-14.40 --28.80,9.60,7.88,0.00,1.00,9.60,14.40 --24.00,9.60,7.90,0.00,1.00,4.80,-9.60 --19.20,4.80,7.93,0.00,1.00,4.80,9.60 --14.40,4.80,7.95,0.00,1.00,4.80,-4.80 --9.60,4.80,7.97,0.00,1.00,0.00,4.80 --4.80,0.00,7.99,0.00,1.00,0.00,-0.00 -0.00,0.00,8.01,0.00,1.00,-0.00,0.00 -4.80,-0.00,8.03,0.00,1.00,-4.80,-0.00 -9.60,-4.80,8.05,0.00,1.00,-4.80,4.80 -14.40,-4.80,8.07,0.00,1.00,-9.60,-4.80 -19.20,-9.60,8.10,0.00,1.00,-9.60,4.80 -24.00,-9.60,8.12,0.00,1.00,-14.40,-9.60 -28.80,-9.60,8.14,0.00,1.00,-14.40,9.60 -33.60,-14.40,8.16,0.00,1.00,-19.20,-9.60 -33.60,-14.40,8.18,0.00,1.00,-19.20,14.40 -38.40,-14.40,8.20,0.00,1.00,-24.00,-14.40 -43.20,-19.20,8.22,0.00,1.00,-28.80,14.40 -48.00,-19.20,8.25,0.00,1.00,-33.60,-14.40 -57.60,-19.20,8.27,0.00,1.00,-38.40,19.20 -62.40,-19.20,8.29,0.00,1.00,-43.20,-19.20 -67.20,-24.00,8.31,0.00,1.00,-48.00,19.20 -72.00,-24.00,8.33,0.00,1.00,-57.60,-19.20 -76.80,-24.00,8.35,0.00,1.00,-67.20,19.20 -81.60,-24.00,8.37,0.00,1.00,-81.60,-19.20 -86.40,-24.00,8.40,0.00,1.00,-91.20,19.20 -91.20,-24.00,8.42,0.00,1.00,-105.60,-19.20 -96.00,-24.00,8.44,0.00,1.00,-115.20,19.20 -100.80,-24.00,8.46,0.00,1.00,-124.80,-19.20 -105.60,-24.00,8.48,0.00,1.00,-134.40,19.20 -110.40,-24.00,8.50,0.00,1.00,-139.20,-19.20 -115.20,-19.20,8.52,0.00,1.00,-144.00,19.20 -120.00,-19.20,8.54,0.00,1.00,-148.80,-19.20 -129.60,-19.20,8.57,0.00,1.00,-153.60,19.20 -134.40,-19.20,8.59,0.00,1.00,-158.40,-14.40 -139.20,-19.20,8.61,0.00,1.00,-163.20,14.40 -144.00,-14.40,8.63,0.00,1.00,-163.20,-14.40 -148.80,-14.40,8.65,0.00,1.00,-168.00,14.40 -148.80,-14.40,8.67,0.00,1.00,-168.00,-9.60 -153.60,-9.60,8.69,0.00,1.00,-172.80,9.60 -158.40,-9.60,8.72,0.00,1.00,-172.80,-9.60 -163.20,-4.80,8.74,0.00,1.00,-177.60,4.80 -168.00,-4.80,8.76,0.00,1.00,-177.60,-4.80 -172.80,-4.80,8.78,0.00,1.00,-177.60,4.80 -177.60,-0.00,8.80,0.00,1.00,177.60,-0.00 --177.60,0.00,8.82,0.00,1.00,177.60,-0.00 --172.80,4.80,8.84,0.00,1.00,177.60,4.80 --168.00,4.80,8.87,0.00,1.00,172.80,-4.80 --163.20,4.80,8.89,0.00,1.00,172.80,4.80 --158.40,9.60,8.91,0.00,1.00,168.00,-9.60 --153.60,9.60,8.93,0.00,1.00,168.00,9.60 --148.80,14.40,8.95,0.00,1.00,163.20,-9.60 --148.80,14.40,8.97,0.00,1.00,163.20,14.40 --144.00,14.40,8.99,0.00,1.00,158.40,-14.40 --139.20,19.20,9.01,0.00,1.00,153.60,14.40 --134.40,19.20,9.04,0.00,1.00,148.80,-14.40 --129.60,19.20,9.06,0.00,1.00,144.00,19.20 --120.00,19.20,9.08,0.00,1.00,139.20,-19.20 --115.20,19.20,9.10,0.00,1.00,134.40,19.20 --110.40,24.00,9.12,0.00,1.00,124.80,-19.20 --105.60,24.00,9.14,0.00,1.00,115.20,19.20 --100.80,24.00,9.16,0.00,1.00,105.60,-19.20 --96.00,24.00,9.19,0.00,1.00,91.20,19.20 --91.20,24.00,9.21,0.00,1.00,81.60,-19.20 --86.40,24.00,9.23,0.00,1.00,67.20,19.20 --81.60,24.00,9.25,0.00,1.00,57.60,-19.20 --76.80,24.00,9.27,0.00,1.00,48.00,19.20 --72.00,24.00,9.29,0.00,1.00,43.20,-19.20 --67.20,24.00,9.31,0.00,1.00,38.40,19.20 --62.40,19.20,9.34,0.00,1.00,33.60,-19.20 --57.60,19.20,9.36,0.00,1.00,28.80,19.20 --48.00,19.20,9.38,0.00,1.00,24.00,-14.40 --43.20,19.20,9.40,0.00,1.00,19.20,14.40 --38.40,14.40,9.42,0.00,1.00,19.20,-14.40 --33.60,14.40,9.44,0.00,1.00,14.40,14.40 --33.60,14.40,9.46,0.00,1.00,14.40,-9.60 --28.80,9.60,9.48,0.00,1.00,9.60,9.60 --24.00,9.60,9.51,0.00,1.00,9.60,-9.60 --19.20,9.60,9.53,0.00,1.00,4.80,4.80 --14.40,4.80,9.55,0.00,1.00,4.80,-4.80 --9.60,4.80,9.57,0.00,1.00,0.00,4.80 --4.80,0.00,9.59,0.00,1.00,0.00,-0.00 -0.00,0.00,9.61,0.00,1.00,-0.00,0.00 -4.80,-0.00,9.63,0.00,1.00,-4.80,-0.00 -9.60,-4.80,9.66,0.00,1.00,-4.80,4.80 -14.40,-4.80,9.68,0.00,1.00,-9.60,-4.80 -19.20,-9.60,9.70,0.00,1.00,-9.60,4.80 -19.20,-9.60,9.72,0.00,1.00,-14.40,-4.80 -24.00,-14.40,9.74,0.00,1.00,-19.20,9.60 -28.80,-14.40,9.76,0.00,1.00,-19.20,-9.60 -33.60,-19.20,9.78,0.00,1.00,-24.00,9.60 -38.40,-19.20,9.81,0.00,1.00,-28.80,-9.60 -43.20,-19.20,9.83,0.00,1.00,-33.60,9.60 -48.00,-24.00,9.85,0.00,1.00,-38.40,-14.40 -52.80,-24.00,9.87,0.00,1.00,-43.20,14.40 -57.60,-24.00,9.89,0.00,1.00,-48.00,-14.40 -62.40,-24.00,9.91,0.00,1.00,-52.80,14.40 -72.00,-28.80,9.93,0.00,1.00,-62.40,-14.40 -76.80,-28.80,9.95,0.00,1.00,-72.00,14.40 -81.60,-28.80,9.98,0.00,1.00,-81.60,-14.40 -86.40,-28.80,10.00,0.00,1.00,-91.20,14.40 -91.20,-28.80,10.02,0.00,1.00,-100.80,-14.40 -96.00,-28.80,10.04,0.00,1.00,-110.40,14.40 -100.80,-28.80,10.06,0.00,1.00,-120.00,-14.40 -105.60,-28.80,10.08,0.00,1.00,-129.60,14.40 -115.20,-28.80,10.10,0.00,1.00,-134.40,-14.40 -120.00,-24.00,10.13,0.00,1.00,-139.20,14.40 -124.80,-24.00,10.15,0.00,1.00,-144.00,-14.40 -129.60,-24.00,10.17,0.00,1.00,-148.80,14.40 -134.40,-24.00,10.19,0.00,1.00,-153.60,-14.40 -139.20,-19.20,10.21,0.00,1.00,-158.40,9.60 -144.00,-19.20,10.23,0.00,1.00,-163.20,-9.60 -148.80,-14.40,10.25,0.00,1.00,-163.20,9.60 -153.60,-14.40,10.28,0.00,1.00,-168.00,-9.60 -158.40,-14.40,10.30,0.00,1.00,-168.00,4.80 -163.20,-9.60,10.32,0.00,1.00,-172.80,-4.80 -163.20,-9.60,10.34,0.00,1.00,-172.80,4.80 -168.00,-4.80,10.36,0.00,1.00,-177.60,-4.80 -172.80,-4.80,10.38,0.00,1.00,-177.60,0.00 -177.60,-0.00,10.40,0.00,1.00,177.60,-0.00 --177.60,0.00,10.42,0.00,1.00,177.60,-0.00 --172.80,4.80,10.45,0.00,1.00,172.80,0.00 --168.00,4.80,10.47,0.00,1.00,172.80,-4.80 --163.20,9.60,10.49,0.00,1.00,168.00,4.80 --163.20,9.60,10.51,0.00,1.00,168.00,-4.80 --158.40,14.40,10.53,0.00,1.00,163.20,4.80 --153.60,14.40,10.55,0.00,1.00,163.20,-9.60 --148.80,14.40,10.57,0.00,1.00,158.40,9.60 --144.00,19.20,10.60,0.00,1.00,153.60,-9.60 --139.20,19.20,10.62,0.00,1.00,148.80,9.60 --134.40,24.00,10.64,0.00,1.00,144.00,-14.40 --129.60,24.00,10.66,0.00,1.00,139.20,14.40 --124.80,24.00,10.68,0.00,1.00,134.40,-14.40 --120.00,24.00,10.70,0.00,1.00,129.60,14.40 --115.20,28.80,10.72,0.00,1.00,120.00,-14.40 --105.60,28.80,10.74,0.00,1.00,110.40,14.40 --100.80,28.80,10.77,0.00,1.00,100.80,-14.40 --96.00,28.80,10.79,0.00,1.00,91.20,14.40 --91.20,28.80,10.81,0.00,1.00,81.60,-14.40 --86.40,28.80,10.83,0.00,1.00,72.00,14.40 --81.60,28.80,10.85,0.00,1.00,62.40,-14.40 --76.80,28.80,10.87,0.00,1.00,52.80,14.40 --72.00,28.80,10.89,0.00,1.00,48.00,-14.40 --62.40,24.00,10.92,0.00,1.00,43.20,14.40 --57.60,24.00,10.94,0.00,1.00,38.40,-14.40 --52.80,24.00,10.96,0.00,1.00,33.60,14.40 --48.00,24.00,10.98,0.00,1.00,28.80,-14.40 --43.20,19.20,11.00,0.00,1.00,24.00,9.60 --38.40,19.20,11.02,0.00,1.00,19.20,-9.60 --33.60,19.20,11.04,0.00,1.00,19.20,9.60 --28.80,14.40,11.07,0.00,1.00,14.40,-9.60 --24.00,14.40,11.09,0.00,1.00,9.60,9.60 --19.20,9.60,11.11,0.00,1.00,9.60,-4.80 --19.20,9.60,11.13,0.00,1.00,4.80,4.80 --14.40,4.80,11.15,0.00,1.00,4.80,-4.80 --9.60,4.80,11.17,0.00,1.00,0.00,4.80 --4.80,0.00,11.19,0.00,1.00,0.00,-0.00 -0.00,0.00,11.21,0.00,1.00,-4.80,0.00 -4.80,-4.80,11.24,0.00,1.00,-4.80,-0.00 -9.60,-4.80,11.26,0.00,1.00,-9.60,0.00 -14.40,-9.60,11.28,0.00,1.00,-9.60,-4.80 -14.40,-9.60,11.30,0.00,1.00,-14.40,4.80 -19.20,-14.40,11.32,0.00,1.00,-14.40,-4.80 -24.00,-14.40,11.34,0.00,1.00,-19.20,4.80 -28.80,-19.20,11.36,0.00,1.00,-24.00,-4.80 -33.60,-19.20,11.39,0.00,1.00,-28.80,4.80 -38.40,-24.00,11.41,0.00,1.00,-28.80,-9.60 -43.20,-24.00,11.43,0.00,1.00,-33.60,9.60 -48.00,-24.00,11.45,0.00,1.00,-38.40,-9.60 -52.80,-28.80,11.47,0.00,1.00,-48.00,9.60 -57.60,-28.80,11.49,0.00,1.00,-52.80,-9.60 -62.40,-28.80,11.51,0.00,1.00,-57.60,9.60 -67.20,-33.60,11.54,0.00,1.00,-67.20,-9.60 -72.00,-33.60,11.56,0.00,1.00,-76.80,9.60 -81.60,-33.60,11.58,0.00,1.00,-81.60,-9.60 -86.40,-33.60,11.60,0.00,1.00,-91.20,9.60 -91.20,-33.60,11.62,0.00,1.00,-100.80,-9.60 -96.00,-33.60,11.64,0.00,1.00,-110.40,9.60 -100.80,-33.60,11.66,0.00,1.00,-115.20,-9.60 -110.40,-33.60,11.68,0.00,1.00,-124.80,9.60 -115.20,-33.60,11.71,0.00,1.00,-129.60,-9.60 -120.00,-28.80,11.73,0.00,1.00,-139.20,9.60 -124.80,-28.80,11.75,0.00,1.00,-144.00,-9.60 -129.60,-28.80,11.77,0.00,1.00,-148.80,9.60 -134.40,-24.00,11.79,0.00,1.00,-153.60,-9.60 -139.20,-24.00,11.81,0.00,1.00,-153.60,9.60 -144.00,-19.20,11.83,0.00,1.00,-158.40,-9.60 -148.80,-19.20,11.86,0.00,1.00,-163.20,4.80 -153.60,-14.40,11.88,0.00,1.00,-163.20,-4.80 -158.40,-14.40,11.90,0.00,1.00,-168.00,4.80 -163.20,-9.60,11.92,0.00,1.00,-172.80,-4.80 -168.00,-9.60,11.94,0.00,1.00,-172.80,4.80 -168.00,-4.80,11.96,0.00,1.00,-177.60,-0.00 -172.80,-4.80,11.98,0.00,1.00,-177.60,0.00 -177.60,-0.00,12.01,0.00,1.00,177.60,-0.00 --177.60,0.00,12.03,0.00,1.00,177.60,-0.00 --172.80,4.80,12.05,0.00,1.00,172.80,0.00 --168.00,4.80,12.07,0.00,1.00,172.80,-0.00 --168.00,9.60,12.09,0.00,1.00,168.00,4.80 --163.20,9.60,12.11,0.00,1.00,163.20,-4.80 --158.40,14.40,12.13,0.00,1.00,163.20,4.80 --153.60,14.40,12.15,0.00,1.00,158.40,-4.80 --148.80,19.20,12.18,0.00,1.00,153.60,4.80 --144.00,19.20,12.20,0.00,1.00,153.60,-9.60 --139.20,24.00,12.22,0.00,1.00,148.80,9.60 --134.40,24.00,12.24,0.00,1.00,144.00,-9.60 --129.60,28.80,12.26,0.00,1.00,139.20,9.60 --124.80,28.80,12.28,0.00,1.00,129.60,-9.60 --120.00,28.80,12.30,0.00,1.00,124.80,9.60 --115.20,33.60,12.33,0.00,1.00,115.20,-9.60 --110.40,33.60,12.35,0.00,1.00,110.40,9.60 --100.80,33.60,12.37,0.00,1.00,100.80,-9.60 --96.00,33.60,12.39,0.00,1.00,91.20,9.60 --91.20,33.60,12.41,0.00,1.00,81.60,-9.60 --86.40,33.60,12.43,0.00,1.00,76.80,9.60 --81.60,33.60,12.45,0.00,1.00,67.20,-9.60 --72.00,33.60,12.48,0.00,1.00,57.60,9.60 --67.20,33.60,12.50,0.00,1.00,52.80,-9.60 --62.40,28.80,12.52,0.00,1.00,48.00,9.60 --57.60,28.80,12.54,0.00,1.00,38.40,-9.60 --52.80,28.80,12.56,0.00,1.00,33.60,9.60 --48.00,24.00,12.58,0.00,1.00,28.80,-9.60 --43.20,24.00,12.60,0.00,1.00,28.80,9.60 --38.40,24.00,12.62,0.00,1.00,24.00,-9.60 --33.60,19.20,12.65,0.00,1.00,19.20,4.80 --28.80,19.20,12.67,0.00,1.00,14.40,-4.80 --24.00,14.40,12.69,0.00,1.00,14.40,4.80 --19.20,14.40,12.71,0.00,1.00,9.60,-4.80 --14.40,9.60,12.73,0.00,1.00,9.60,4.80 --14.40,9.60,12.75,0.00,1.00,4.80,-4.80 --9.60,4.80,12.77,0.00,1.00,4.80,0.00 --4.80,4.80,12.80,0.00,1.00,0.00,-0.00 -0.00,0.00,12.82,0.00,1.00,-4.80,0.00 -4.80,-4.80,12.84,0.00,1.00,-4.80,-0.00 -9.60,-4.80,12.86,0.00,1.00,-9.60,0.00 -9.60,-9.60,12.88,0.00,1.00,-9.60,-0.00 -14.40,-9.60,12.90,0.00,1.00,-14.40,0.00 -19.20,-14.40,12.92,0.00,1.00,-19.20,-4.80 -24.00,-19.20,12.95,0.00,1.00,-24.00,4.80 -28.80,-19.20,12.97,0.00,1.00,-24.00,-4.80 -33.60,-24.00,12.99,0.00,1.00,-28.80,4.80 -38.40,-24.00,13.01,0.00,1.00,-33.60,-4.80 -43.20,-28.80,13.03,0.00,1.00,-38.40,4.80 -48.00,-28.80,13.05,0.00,1.00,-43.20,-4.80 -52.80,-33.60,13.07,0.00,1.00,-48.00,4.80 -57.60,-33.60,13.09,0.00,1.00,-52.80,-4.80 -62.40,-33.60,13.12,0.00,1.00,-62.40,4.80 -67.20,-38.40,13.14,0.00,1.00,-67.20,-4.80 -72.00,-38.40,13.16,0.00,1.00,-76.80,4.80 -81.60,-38.40,13.18,0.00,1.00,-86.40,-4.80 -86.40,-38.40,13.20,0.00,1.00,-91.20,4.80 -91.20,-38.40,13.22,0.00,1.00,-100.80,-4.80 -96.00,-38.40,13.24,0.00,1.00,-105.60,4.80 -105.60,-38.40,13.27,0.00,1.00,-115.20,-4.80 -110.40,-38.40,13.29,0.00,1.00,-120.00,4.80 -115.20,-33.60,13.31,0.00,1.00,-129.60,-4.80 -120.00,-33.60,13.33,0.00,1.00,-134.40,4.80 -124.80,-33.60,13.35,0.00,1.00,-139.20,-4.80 -129.60,-28.80,13.37,0.00,1.00,-144.00,4.80 -134.40,-28.80,13.39,0.00,1.00,-148.80,-4.80 -139.20,-24.00,13.42,0.00,1.00,-153.60,4.80 -144.00,-24.00,13.44,0.00,1.00,-158.40,-4.80 -148.80,-19.20,13.46,0.00,1.00,-158.40,4.80 -153.60,-19.20,13.48,0.00,1.00,-163.20,-4.80 -158.40,-14.40,13.50,0.00,1.00,-168.00,4.80 -163.20,-14.40,13.52,0.00,1.00,-168.00,-4.80 -168.00,-9.60,13.54,0.00,1.00,-172.80,0.00 -172.80,-9.60,13.56,0.00,1.00,-177.60,-0.00 -172.80,-4.80,13.59,0.00,1.00,-177.60,0.00 -177.60,-0.00,13.61,0.00,1.00,177.60,-0.00 --177.60,0.00,13.63,0.00,1.00,177.60,-0.00 --172.80,4.80,13.65,0.00,1.00,172.80,0.00 --172.80,9.60,13.67,0.00,1.00,168.00,-0.00 --168.00,9.60,13.69,0.00,1.00,168.00,0.00 --163.20,14.40,13.71,0.00,1.00,163.20,-4.80 --158.40,14.40,13.74,0.00,1.00,158.40,4.80 --153.60,19.20,13.76,0.00,1.00,158.40,-4.80 --148.80,19.20,13.78,0.00,1.00,153.60,4.80 --144.00,24.00,13.80,0.00,1.00,148.80,-4.80 --139.20,24.00,13.82,0.00,1.00,144.00,4.80 --134.40,28.80,13.84,0.00,1.00,139.20,-4.80 --129.60,28.80,13.86,0.00,1.00,134.40,4.80 --124.80,33.60,13.89,0.00,1.00,129.60,-4.80 --120.00,33.60,13.91,0.00,1.00,120.00,4.80 --115.20,33.60,13.93,0.00,1.00,115.20,-4.80 --110.40,38.40,13.95,0.00,1.00,105.60,4.80 --105.60,38.40,13.97,0.00,1.00,100.80,-4.80 --96.00,38.40,13.99,0.00,1.00,91.20,4.80 --91.20,38.40,14.01,0.00,1.00,86.40,-4.80 --86.40,38.40,14.03,0.00,1.00,76.80,4.80 --81.60,38.40,14.06,0.00,1.00,67.20,-4.80 --72.00,38.40,14.08,0.00,1.00,62.40,4.80 --67.20,38.40,14.10,0.00,1.00,52.80,-4.80 --62.40,33.60,14.12,0.00,1.00,48.00,4.80 --57.60,33.60,14.14,0.00,1.00,43.20,-4.80 --52.80,33.60,14.16,0.00,1.00,38.40,4.80 --48.00,28.80,14.18,0.00,1.00,33.60,-4.80 --43.20,28.80,14.21,0.00,1.00,28.80,4.80 --38.40,24.00,14.23,0.00,1.00,24.00,-4.80 --33.60,24.00,14.25,0.00,1.00,24.00,4.80 --28.80,19.20,14.27,0.00,1.00,19.20,-4.80 --24.00,19.20,14.29,0.00,1.00,14.40,4.80 --19.20,14.40,14.31,0.00,1.00,9.60,-4.80 --14.40,9.60,14.33,0.00,1.00,9.60,0.00 --9.60,9.60,14.36,0.00,1.00,4.80,-0.00 --9.60,4.80,14.38,0.00,1.00,4.80,0.00 --4.80,4.80,14.40,0.00,1.00,0.00,-0.00 -0.00,0.00,14.42,0.00,1.00,-4.80,0.00 -4.80,-4.80,14.44,0.00,1.00,-4.80,-0.00 -4.80,-4.80,14.46,0.00,1.00,-9.60,0.00 -9.60,-9.60,14.48,0.00,1.00,-14.40,-0.00 -14.40,-14.40,14.50,0.00,1.00,-14.40,0.00 -19.20,-14.40,14.53,0.00,1.00,-19.20,-0.00 -24.00,-19.20,14.55,0.00,1.00,-24.00,0.00 -24.00,-24.00,14.57,0.00,1.00,-28.80,-0.00 -28.80,-24.00,14.59,0.00,1.00,-33.60,0.00 -33.60,-28.80,14.61,0.00,1.00,-38.40,-0.00 -38.40,-28.80,14.63,0.00,1.00,-43.20,0.00 -43.20,-33.60,14.65,0.00,1.00,-48.00,-0.00 -48.00,-33.60,14.68,0.00,1.00,-52.80,0.00 -52.80,-38.40,14.70,0.00,1.00,-57.60,-0.00 -62.40,-38.40,14.72,0.00,1.00,-62.40,0.00 -67.20,-38.40,14.74,0.00,1.00,-72.00,-0.00 -72.00,-43.20,14.76,0.00,1.00,-76.80,0.00 -76.80,-43.20,14.78,0.00,1.00,-86.40,-0.00 -86.40,-43.20,14.80,0.00,1.00,-91.20,0.00 -91.20,-43.20,14.83,0.00,1.00,-100.80,-0.00 -96.00,-43.20,14.85,0.00,1.00,-105.60,0.00 -105.60,-43.20,14.87,0.00,1.00,-110.40,-0.00 -110.40,-43.20,14.89,0.00,1.00,-120.00,0.00 -115.20,-38.40,14.91,0.00,1.00,-124.80,-0.00 -124.80,-38.40,14.93,0.00,1.00,-129.60,0.00 -129.60,-38.40,14.95,0.00,1.00,-134.40,-0.00 -134.40,-33.60,14.97,0.00,1.00,-139.20,0.00 -139.20,-33.60,15.00,0.00,1.00,-144.00,-0.00 -144.00,-28.80,15.02,0.00,1.00,-148.80,0.00 -148.80,-28.80,15.04,0.00,1.00,-153.60,-0.00 -153.60,-24.00,15.06,0.00,1.00,-158.40,0.00 -158.40,-19.20,15.08,0.00,1.00,-163.20,-0.00 -158.40,-19.20,15.10,0.00,1.00,-163.20,0.00 -163.20,-14.40,15.12,0.00,1.00,-168.00,-0.00 -168.00,-9.60,15.15,0.00,1.00,-172.80,0.00 -172.80,-9.60,15.17,0.00,1.00,-172.80,-0.00 -172.80,-4.80,15.19,0.00,1.00,-177.60,0.00 -177.60,-0.00,15.21,0.00,1.00,177.60,-0.00 --177.60,0.00,15.23,0.00,1.00,172.80,-0.00 --172.80,4.80,15.25,0.00,1.00,172.80,0.00 --172.80,9.60,15.27,0.00,1.00,168.00,-0.00 --168.00,9.60,15.30,0.00,1.00,163.20,0.00 --163.20,14.40,15.32,0.00,1.00,163.20,-0.00 --158.40,19.20,15.34,0.00,1.00,158.40,0.00 --158.40,19.20,15.36,0.00,1.00,153.60,-0.00 --153.60,24.00,15.38,0.00,1.00,148.80,0.00 --148.80,28.80,15.40,0.00,1.00,144.00,-0.00 --144.00,28.80,15.42,0.00,1.00,139.20,0.00 --139.20,33.60,15.44,0.00,1.00,134.40,-0.00 --134.40,33.60,15.47,0.00,1.00,129.60,0.00 --129.60,38.40,15.49,0.00,1.00,124.80,-0.00 --124.80,38.40,15.51,0.00,1.00,120.00,0.00 --115.20,38.40,15.53,0.00,1.00,110.40,-0.00 --110.40,43.20,15.55,0.00,1.00,105.60,0.00 --105.60,43.20,15.57,0.00,1.00,100.80,-0.00 --96.00,43.20,15.59,0.00,1.00,91.20,0.00 --91.20,43.20,15.62,0.00,1.00,86.40,-0.00 --86.40,43.20,15.64,0.00,1.00,76.80,0.00 --76.80,43.20,15.66,0.00,1.00,72.00,-0.00 --72.00,43.20,15.68,0.00,1.00,62.40,0.00 --67.20,38.40,15.70,0.00,1.00,57.60,-0.00 --62.40,38.40,15.72,0.00,1.00,52.80,0.00 --52.80,38.40,15.74,0.00,1.00,48.00,-0.00 --48.00,33.60,15.77,0.00,1.00,43.20,0.00 --43.20,33.60,15.79,0.00,1.00,38.40,-0.00 --38.40,28.80,15.81,0.00,1.00,33.60,0.00 --33.60,28.80,15.83,0.00,1.00,28.80,-0.00 --28.80,24.00,15.85,0.00,1.00,24.00,0.00 --24.00,24.00,15.87,0.00,1.00,19.20,-0.00 --24.00,19.20,15.89,0.00,1.00,14.40,0.00 --19.20,14.40,15.91,0.00,1.00,14.40,-0.00 --14.40,14.40,15.94,0.00,1.00,9.60,0.00 --9.60,9.60,15.96,0.00,1.00,4.80,-0.00 --4.80,4.80,15.98,0.00,1.00,4.80,0.00 --4.80,4.80,16.00,0.00,1.00,0.00,-0.00 -0.00,0.00,16.00,0.00,1.00,-4.80,0.00 -4.80,-4.80,15.98,0.00,1.00,-4.80,0.00 -4.80,-4.80,15.96,0.00,1.00,-9.60,-0.00 -9.60,-9.60,15.94,0.00,1.00,-14.40,0.00 -14.40,-14.40,15.91,0.00,1.00,-19.20,-0.00 -14.40,-19.20,15.89,0.00,1.00,-24.00,0.00 -19.20,-19.20,15.87,0.00,1.00,-24.00,-0.00 -24.00,-24.00,15.85,0.00,1.00,-28.80,0.00 -28.80,-28.80,15.83,0.00,1.00,-33.60,-0.00 -33.60,-28.80,15.81,0.00,1.00,-38.40,0.00 -38.40,-33.60,15.79,0.00,1.00,-43.20,-0.00 -43.20,-38.40,15.77,0.00,1.00,-48.00,0.00 -48.00,-38.40,15.74,0.00,1.00,-52.80,-4.80 -52.80,-43.20,15.72,0.00,1.00,-62.40,4.80 -57.60,-43.20,15.70,0.00,1.00,-67.20,-4.80 -62.40,-43.20,15.68,0.00,1.00,-72.00,4.80 -72.00,-48.00,15.66,0.00,1.00,-76.80,-4.80 -76.80,-48.00,15.64,0.00,1.00,-86.40,4.80 -86.40,-48.00,15.62,0.00,1.00,-91.20,-4.80 -91.20,-48.00,15.59,0.00,1.00,-96.00,4.80 -100.80,-48.00,15.57,0.00,1.00,-105.60,-4.80 -105.60,-48.00,15.55,0.00,1.00,-110.40,4.80 -110.40,-48.00,15.53,0.00,1.00,-115.20,-4.80 -120.00,-43.20,15.51,0.00,1.00,-124.80,4.80 -124.80,-43.20,15.49,0.00,1.00,-129.60,-4.80 -129.60,-38.40,15.47,0.00,1.00,-134.40,4.80 -134.40,-38.40,15.44,0.00,1.00,-139.20,-4.80 -139.20,-33.60,15.42,0.00,1.00,-144.00,0.00 -144.00,-33.60,15.40,0.00,1.00,-148.80,-0.00 -148.80,-28.80,15.38,0.00,1.00,-153.60,0.00 -153.60,-24.00,15.36,0.00,1.00,-158.40,-0.00 -158.40,-24.00,15.34,0.00,1.00,-158.40,0.00 -163.20,-19.20,15.32,0.00,1.00,-163.20,-0.00 -163.20,-14.40,15.30,0.00,1.00,-168.00,0.00 -168.00,-14.40,15.27,0.00,1.00,-172.80,-0.00 -172.80,-9.60,15.25,0.00,1.00,-172.80,0.00 -172.80,-4.80,15.23,0.00,1.00,-177.60,-0.00 -177.60,-0.00,15.21,0.00,1.00,177.60,0.00 --177.60,0.00,15.19,0.00,1.00,172.80,0.00 --172.80,4.80,15.17,0.00,1.00,172.80,-0.00 --172.80,9.60,15.15,0.00,1.00,168.00,0.00 --168.00,14.40,15.12,0.00,1.00,163.20,-0.00 --163.20,14.40,15.10,0.00,1.00,158.40,0.00 --163.20,19.20,15.08,0.00,1.00,158.40,-0.00 --158.40,24.00,15.06,0.00,1.00,153.60,0.00 --153.60,24.00,15.04,0.00,1.00,148.80,-0.00 --148.80,28.80,15.02,0.00,1.00,144.00,0.00 --144.00,33.60,15.00,0.00,1.00,139.20,-0.00 --139.20,33.60,14.97,0.00,1.00,134.40,0.00 --134.40,38.40,14.95,0.00,1.00,129.60,-4.80 --129.60,38.40,14.93,0.00,1.00,124.80,4.80 --124.80,43.20,14.91,0.00,1.00,115.20,-4.80 --120.00,43.20,14.89,0.00,1.00,110.40,4.80 --110.40,48.00,14.87,0.00,1.00,105.60,-4.80 --105.60,48.00,14.85,0.00,1.00,96.00,4.80 --100.80,48.00,14.83,0.00,1.00,91.20,-4.80 --91.20,48.00,14.80,0.00,1.00,86.40,4.80 --86.40,48.00,14.78,0.00,1.00,76.80,-4.80 --76.80,48.00,14.76,0.00,1.00,72.00,4.80 --72.00,48.00,14.74,0.00,1.00,67.20,-4.80 --62.40,43.20,14.72,0.00,1.00,62.40,4.80 --57.60,43.20,14.70,0.00,1.00,52.80,-4.80 --52.80,43.20,14.68,0.00,1.00,48.00,4.80 --48.00,38.40,14.65,0.00,1.00,43.20,-4.80 --43.20,38.40,14.63,0.00,1.00,38.40,0.00 --38.40,33.60,14.61,0.00,1.00,33.60,-0.00 --33.60,28.80,14.59,0.00,1.00,28.80,0.00 --28.80,28.80,14.57,0.00,1.00,24.00,-0.00 --24.00,24.00,14.55,0.00,1.00,24.00,0.00 --19.20,19.20,14.53,0.00,1.00,19.20,-0.00 --14.40,19.20,14.50,0.00,1.00,14.40,0.00 --14.40,14.40,14.48,0.00,1.00,9.60,-0.00 --9.60,9.60,14.46,0.00,1.00,4.80,0.00 --4.80,4.80,14.44,0.00,1.00,4.80,-0.00 --4.80,4.80,14.42,0.00,1.00,0.00,0.00 -0.00,0.00,14.40,0.00,1.00,-4.80,0.00 -4.80,-4.80,14.38,0.00,1.00,-9.60,0.00 -4.80,-9.60,14.36,0.00,1.00,-9.60,-0.00 -9.60,-9.60,14.33,0.00,1.00,-14.40,0.00 -9.60,-14.40,14.31,0.00,1.00,-19.20,-4.80 -14.40,-19.20,14.29,0.00,1.00,-24.00,4.80 -19.20,-24.00,14.27,0.00,1.00,-28.80,-4.80 -24.00,-24.00,14.25,0.00,1.00,-33.60,4.80 -24.00,-28.80,14.23,0.00,1.00,-38.40,-4.80 -28.80,-33.60,14.21,0.00,1.00,-43.20,4.80 -33.60,-38.40,14.18,0.00,1.00,-48.00,-4.80 -38.40,-38.40,14.16,0.00,1.00,-52.80,4.80 -43.20,-43.20,14.14,0.00,1.00,-57.60,-4.80 -48.00,-43.20,14.12,0.00,1.00,-62.40,4.80 -52.80,-48.00,14.10,0.00,1.00,-67.20,-4.80 -62.40,-48.00,14.08,0.00,1.00,-72.00,9.60 -67.20,-52.80,14.06,0.00,1.00,-81.60,-9.60 -76.80,-52.80,14.03,0.00,1.00,-86.40,9.60 -86.40,-52.80,14.01,0.00,1.00,-91.20,-9.60 -91.20,-52.80,13.99,0.00,1.00,-96.00,9.60 -100.80,-52.80,13.97,0.00,1.00,-105.60,-9.60 -105.60,-52.80,13.95,0.00,1.00,-110.40,9.60 -115.20,-48.00,13.93,0.00,1.00,-115.20,-9.60 -120.00,-48.00,13.91,0.00,1.00,-120.00,9.60 -129.60,-48.00,13.89,0.00,1.00,-124.80,-4.80 -134.40,-43.20,13.86,0.00,1.00,-129.60,4.80 -139.20,-43.20,13.84,0.00,1.00,-134.40,-4.80 -144.00,-38.40,13.82,0.00,1.00,-139.20,4.80 -148.80,-33.60,13.80,0.00,1.00,-144.00,-4.80 -153.60,-33.60,13.78,0.00,1.00,-148.80,4.80 -158.40,-28.80,13.76,0.00,1.00,-153.60,-4.80 -158.40,-24.00,13.74,0.00,1.00,-158.40,4.80 -163.20,-19.20,13.71,0.00,1.00,-163.20,-4.80 -168.00,-19.20,13.69,0.00,1.00,-168.00,4.80 -168.00,-14.40,13.67,0.00,1.00,-172.80,-0.00 -172.80,-9.60,13.65,0.00,1.00,-172.80,0.00 -177.60,-4.80,13.63,0.00,1.00,-177.60,-0.00 -177.60,-0.00,13.61,0.00,1.00,177.60,0.00 --177.60,0.00,13.59,0.00,1.00,172.80,0.00 --177.60,4.80,13.56,0.00,1.00,172.80,-0.00 --172.80,9.60,13.54,0.00,1.00,168.00,0.00 --168.00,14.40,13.52,0.00,1.00,163.20,-0.00 --168.00,19.20,13.50,0.00,1.00,158.40,4.80 --163.20,19.20,13.48,0.00,1.00,153.60,-4.80 --158.40,24.00,13.46,0.00,1.00,148.80,4.80 --158.40,28.80,13.44,0.00,1.00,144.00,-4.80 --153.60,33.60,13.42,0.00,1.00,139.20,4.80 --148.80,33.60,13.39,0.00,1.00,134.40,-4.80 --144.00,38.40,13.37,0.00,1.00,129.60,4.80 --139.20,43.20,13.35,0.00,1.00,124.80,-4.80 --134.40,43.20,13.33,0.00,1.00,120.00,4.80 --129.60,48.00,13.31,0.00,1.00,115.20,-4.80 --120.00,48.00,13.29,0.00,1.00,110.40,9.60 --115.20,48.00,13.27,0.00,1.00,105.60,-9.60 --105.60,52.80,13.24,0.00,1.00,96.00,9.60 --100.80,52.80,13.22,0.00,1.00,91.20,-9.60 --91.20,52.80,13.20,0.00,1.00,86.40,9.60 --86.40,52.80,13.18,0.00,1.00,81.60,-9.60 --76.80,52.80,13.16,0.00,1.00,72.00,9.60 --67.20,52.80,13.14,0.00,1.00,67.20,-9.60 --62.40,48.00,13.12,0.00,1.00,62.40,9.60 --52.80,48.00,13.09,0.00,1.00,57.60,-4.80 --48.00,43.20,13.07,0.00,1.00,52.80,4.80 --43.20,43.20,13.05,0.00,1.00,48.00,-4.80 --38.40,38.40,13.03,0.00,1.00,43.20,4.80 --33.60,38.40,13.01,0.00,1.00,38.40,-4.80 --28.80,33.60,12.99,0.00,1.00,33.60,4.80 --24.00,28.80,12.97,0.00,1.00,28.80,-4.80 --24.00,24.00,12.95,0.00,1.00,24.00,4.80 --19.20,24.00,12.92,0.00,1.00,19.20,-4.80 --14.40,19.20,12.90,0.00,1.00,14.40,4.80 --9.60,14.40,12.88,0.00,1.00,9.60,-4.80 --9.60,9.60,12.86,0.00,1.00,9.60,0.00 --4.80,9.60,12.84,0.00,1.00,4.80,-0.00 --4.80,4.80,12.82,0.00,1.00,0.00,0.00 -0.00,0.00,12.80,0.00,1.00,-4.80,0.00 -4.80,-4.80,12.77,0.00,1.00,-9.60,0.00 -4.80,-9.60,12.75,0.00,1.00,-14.40,-0.00 -9.60,-14.40,12.73,0.00,1.00,-14.40,4.80 -9.60,-14.40,12.71,0.00,1.00,-19.20,-4.80 -14.40,-19.20,12.69,0.00,1.00,-24.00,4.80 -14.40,-24.00,12.67,0.00,1.00,-28.80,-4.80 -19.20,-28.80,12.65,0.00,1.00,-33.60,4.80 -24.00,-33.60,12.62,0.00,1.00,-38.40,-9.60 -28.80,-33.60,12.60,0.00,1.00,-43.20,9.60 -28.80,-38.40,12.58,0.00,1.00,-48.00,-9.60 -33.60,-43.20,12.56,0.00,1.00,-52.80,9.60 -38.40,-43.20,12.54,0.00,1.00,-57.60,-9.60 -48.00,-48.00,12.52,0.00,1.00,-62.40,9.60 -52.80,-52.80,12.50,0.00,1.00,-67.20,-9.60 -57.60,-52.80,12.48,0.00,1.00,-72.00,9.60 -67.20,-57.60,12.45,0.00,1.00,-81.60,-14.40 -76.80,-57.60,12.43,0.00,1.00,-86.40,14.40 -81.60,-57.60,12.41,0.00,1.00,-91.20,-14.40 -91.20,-57.60,12.39,0.00,1.00,-96.00,14.40 -100.80,-57.60,12.37,0.00,1.00,-100.80,-14.40 -110.40,-57.60,12.35,0.00,1.00,-110.40,14.40 -115.20,-52.80,12.33,0.00,1.00,-115.20,-14.40 -124.80,-52.80,12.30,0.00,1.00,-120.00,9.60 -129.60,-48.00,12.28,0.00,1.00,-124.80,-9.60 -139.20,-48.00,12.26,0.00,1.00,-129.60,9.60 -144.00,-43.20,12.24,0.00,1.00,-134.40,-9.60 -148.80,-38.40,12.22,0.00,1.00,-139.20,9.60 -153.60,-38.40,12.20,0.00,1.00,-144.00,-9.60 -153.60,-33.60,12.18,0.00,1.00,-148.80,9.60 -158.40,-28.80,12.15,0.00,1.00,-153.60,-9.60 -163.20,-24.00,12.13,0.00,1.00,-158.40,4.80 -163.20,-24.00,12.11,0.00,1.00,-163.20,-4.80 -168.00,-19.20,12.09,0.00,1.00,-168.00,4.80 -172.80,-14.40,12.07,0.00,1.00,-168.00,-4.80 -172.80,-9.60,12.05,0.00,1.00,-172.80,4.80 -177.60,-4.80,12.03,0.00,1.00,-177.60,-0.00 -177.60,-0.00,12.01,0.00,1.00,177.60,0.00 --177.60,0.00,11.98,0.00,1.00,172.80,0.00 --177.60,4.80,11.96,0.00,1.00,168.00,-0.00 --172.80,9.60,11.94,0.00,1.00,168.00,4.80 --172.80,14.40,11.92,0.00,1.00,163.20,-4.80 --168.00,19.20,11.90,0.00,1.00,158.40,4.80 --163.20,24.00,11.88,0.00,1.00,153.60,-4.80 --163.20,24.00,11.86,0.00,1.00,148.80,4.80 --158.40,28.80,11.83,0.00,1.00,144.00,-9.60 --153.60,33.60,11.81,0.00,1.00,139.20,9.60 --153.60,38.40,11.79,0.00,1.00,134.40,-9.60 --148.80,38.40,11.77,0.00,1.00,129.60,9.60 --144.00,43.20,11.75,0.00,1.00,124.80,-9.60 --139.20,48.00,11.73,0.00,1.00,120.00,9.60 --129.60,48.00,11.71,0.00,1.00,115.20,-9.60 --124.80,52.80,11.68,0.00,1.00,110.40,9.60 --115.20,52.80,11.66,0.00,1.00,100.80,-14.40 --110.40,57.60,11.64,0.00,1.00,96.00,14.40 --100.80,57.60,11.62,0.00,1.00,91.20,-14.40 --91.20,57.60,11.60,0.00,1.00,86.40,14.40 --81.60,57.60,11.58,0.00,1.00,81.60,-14.40 --76.80,57.60,11.56,0.00,1.00,72.00,14.40 --67.20,57.60,11.54,0.00,1.00,67.20,-14.40 --57.60,52.80,11.51,0.00,1.00,62.40,9.60 --52.80,52.80,11.49,0.00,1.00,57.60,-9.60 --48.00,48.00,11.47,0.00,1.00,52.80,9.60 --38.40,43.20,11.45,0.00,1.00,48.00,-9.60 --33.60,43.20,11.43,0.00,1.00,43.20,9.60 --28.80,38.40,11.41,0.00,1.00,38.40,-9.60 --28.80,33.60,11.39,0.00,1.00,33.60,9.60 --24.00,33.60,11.36,0.00,1.00,28.80,-9.60 --19.20,28.80,11.34,0.00,1.00,24.00,4.80 --14.40,24.00,11.32,0.00,1.00,19.20,-4.80 --14.40,19.20,11.30,0.00,1.00,14.40,4.80 --9.60,14.40,11.28,0.00,1.00,14.40,-4.80 --9.60,14.40,11.26,0.00,1.00,9.60,4.80 --4.80,9.60,11.24,0.00,1.00,4.80,-0.00 --4.80,4.80,11.21,0.00,1.00,0.00,0.00 -0.00,0.00,11.19,0.00,1.00,-4.80,0.00 -0.00,-4.80,11.17,0.00,1.00,-9.60,0.00 -4.80,-9.60,11.15,0.00,1.00,-14.40,-4.80 -4.80,-14.40,11.13,0.00,1.00,-19.20,4.80 -9.60,-19.20,11.11,0.00,1.00,-19.20,-4.80 -9.60,-19.20,11.09,0.00,1.00,-24.00,4.80 -14.40,-24.00,11.07,0.00,1.00,-28.80,-9.60 -19.20,-28.80,11.04,0.00,1.00,-33.60,9.60 -19.20,-33.60,11.02,0.00,1.00,-38.40,-9.60 -24.00,-38.40,11.00,0.00,1.00,-43.20,9.60 -28.80,-43.20,10.98,0.00,1.00,-48.00,-14.40 -33.60,-43.20,10.96,0.00,1.00,-52.80,14.40 -38.40,-48.00,10.94,0.00,1.00,-57.60,-14.40 -43.20,-52.80,10.92,0.00,1.00,-62.40,14.40 -48.00,-52.80,10.89,0.00,1.00,-72.00,-14.40 -52.80,-57.60,10.87,0.00,1.00,-76.80,14.40 -62.40,-57.60,10.85,0.00,1.00,-81.60,-19.20 -72.00,-62.40,10.83,0.00,1.00,-86.40,19.20 -81.60,-62.40,10.81,0.00,1.00,-91.20,-19.20 -91.20,-62.40,10.79,0.00,1.00,-96.00,19.20 -100.80,-62.40,10.77,0.00,1.00,-100.80,-19.20 -110.40,-62.40,10.74,0.00,1.00,-105.60,19.20 -120.00,-57.60,10.72,0.00,1.00,-115.20,-14.40 -129.60,-57.60,10.70,0.00,1.00,-120.00,14.40 -134.40,-52.80,10.68,0.00,1.00,-124.80,-14.40 -139.20,-48.00,10.66,0.00,1.00,-129.60,14.40 -144.00,-48.00,10.64,0.00,1.00,-134.40,-14.40 -148.80,-43.20,10.62,0.00,1.00,-139.20,14.40 -153.60,-38.40,10.60,0.00,1.00,-144.00,-14.40 -158.40,-33.60,10.57,0.00,1.00,-148.80,9.60 -163.20,-33.60,10.55,0.00,1.00,-153.60,-9.60 -163.20,-28.80,10.53,0.00,1.00,-158.40,9.60 -168.00,-24.00,10.51,0.00,1.00,-163.20,-9.60 -168.00,-19.20,10.49,0.00,1.00,-163.20,4.80 -172.80,-14.40,10.47,0.00,1.00,-168.00,-4.80 -172.80,-9.60,10.45,0.00,1.00,-172.80,4.80 -177.60,-4.80,10.42,0.00,1.00,-177.60,-0.00 -177.60,-0.00,10.40,0.00,1.00,177.60,0.00 --177.60,0.00,10.38,0.00,1.00,172.80,0.00 --177.60,4.80,10.36,0.00,1.00,168.00,-0.00 --172.80,9.60,10.34,0.00,1.00,163.20,4.80 --172.80,14.40,10.32,0.00,1.00,163.20,-4.80 --168.00,19.20,10.30,0.00,1.00,158.40,4.80 --168.00,24.00,10.28,0.00,1.00,153.60,-9.60 --163.20,28.80,10.25,0.00,1.00,148.80,9.60 --163.20,33.60,10.23,0.00,1.00,144.00,-9.60 --158.40,33.60,10.21,0.00,1.00,139.20,9.60 --153.60,38.40,10.19,0.00,1.00,134.40,-14.40 --148.80,43.20,10.17,0.00,1.00,129.60,14.40 --144.00,48.00,10.15,0.00,1.00,124.80,-14.40 --139.20,48.00,10.13,0.00,1.00,120.00,14.40 --134.40,52.80,10.10,0.00,1.00,115.20,-14.40 --129.60,57.60,10.08,0.00,1.00,105.60,14.40 --120.00,57.60,10.06,0.00,1.00,100.80,-14.40 --110.40,62.40,10.04,0.00,1.00,96.00,19.20 --100.80,62.40,10.02,0.00,1.00,91.20,-19.20 --91.20,62.40,10.00,0.00,1.00,86.40,19.20 --81.60,62.40,9.98,0.00,1.00,81.60,-19.20 --72.00,62.40,9.95,0.00,1.00,76.80,19.20 --62.40,57.60,9.93,0.00,1.00,72.00,-19.20 --52.80,57.60,9.91,0.00,1.00,62.40,14.40 --48.00,52.80,9.89,0.00,1.00,57.60,-14.40 --43.20,52.80,9.87,0.00,1.00,52.80,14.40 --38.40,48.00,9.85,0.00,1.00,48.00,-14.40 --33.60,43.20,9.83,0.00,1.00,43.20,14.40 --28.80,43.20,9.81,0.00,1.00,38.40,-14.40 --24.00,38.40,9.78,0.00,1.00,33.60,9.60 --19.20,33.60,9.76,0.00,1.00,28.80,-9.60 --19.20,28.80,9.74,0.00,1.00,24.00,9.60 --14.40,24.00,9.72,0.00,1.00,19.20,-9.60 --9.60,19.20,9.70,0.00,1.00,19.20,4.80 --9.60,19.20,9.68,0.00,1.00,14.40,-4.80 --4.80,14.40,9.66,0.00,1.00,9.60,4.80 --4.80,9.60,9.63,0.00,1.00,4.80,-4.80 --0.00,4.80,9.61,0.00,1.00,0.00,0.00 -0.00,0.00,9.59,0.00,1.00,-4.80,0.00 -0.00,-4.80,9.57,0.00,1.00,-9.60,0.00 -4.80,-9.60,9.55,0.00,1.00,-14.40,-4.80 -4.80,-14.40,9.53,0.00,1.00,-19.20,4.80 -9.60,-19.20,9.51,0.00,1.00,-24.00,-4.80 -9.60,-24.00,9.48,0.00,1.00,-28.80,9.60 -14.40,-24.00,9.46,0.00,1.00,-33.60,-9.60 -14.40,-28.80,9.44,0.00,1.00,-33.60,14.40 -19.20,-33.60,9.42,0.00,1.00,-38.40,-14.40 -19.20,-38.40,9.40,0.00,1.00,-43.20,14.40 -24.00,-43.20,9.38,0.00,1.00,-48.00,-14.40 -28.80,-48.00,9.36,0.00,1.00,-57.60,19.20 -33.60,-52.80,9.34,0.00,1.00,-62.40,-19.20 -38.40,-52.80,9.31,0.00,1.00,-67.20,19.20 -43.20,-57.60,9.29,0.00,1.00,-72.00,-19.20 -48.00,-62.40,9.27,0.00,1.00,-76.80,19.20 -57.60,-62.40,9.25,0.00,1.00,-81.60,-19.20 -67.20,-67.20,9.23,0.00,1.00,-86.40,24.00 -81.60,-67.20,9.21,0.00,1.00,-91.20,-24.00 -91.20,-67.20,9.19,0.00,1.00,-96.00,24.00 -105.60,-67.20,9.16,0.00,1.00,-100.80,-24.00 -115.20,-67.20,9.14,0.00,1.00,-105.60,24.00 -124.80,-62.40,9.12,0.00,1.00,-110.40,-19.20 -134.40,-57.60,9.10,0.00,1.00,-115.20,19.20 -139.20,-57.60,9.08,0.00,1.00,-120.00,-19.20 -144.00,-52.80,9.06,0.00,1.00,-129.60,19.20 -148.80,-48.00,9.04,0.00,1.00,-134.40,-19.20 -153.60,-43.20,9.01,0.00,1.00,-139.20,19.20 -158.40,-43.20,8.99,0.00,1.00,-144.00,-14.40 -163.20,-38.40,8.97,0.00,1.00,-148.80,14.40 -163.20,-33.60,8.95,0.00,1.00,-148.80,-14.40 -168.00,-28.80,8.93,0.00,1.00,-153.60,9.60 -168.00,-24.00,8.91,0.00,1.00,-158.40,-9.60 -172.80,-19.20,8.89,0.00,1.00,-163.20,9.60 -172.80,-14.40,8.87,0.00,1.00,-168.00,-4.80 -177.60,-9.60,8.84,0.00,1.00,-172.80,4.80 -177.60,-4.80,8.82,0.00,1.00,-177.60,-4.80 -177.60,-0.00,8.80,0.00,1.00,177.60,0.00 --177.60,0.00,8.78,0.00,1.00,172.80,0.00 --177.60,4.80,8.76,0.00,1.00,168.00,-4.80 --177.60,9.60,8.74,0.00,1.00,163.20,4.80 --172.80,14.40,8.72,0.00,1.00,158.40,-4.80 --172.80,19.20,8.69,0.00,1.00,153.60,9.60 --168.00,24.00,8.67,0.00,1.00,148.80,-9.60 --168.00,28.80,8.65,0.00,1.00,148.80,9.60 --163.20,33.60,8.63,0.00,1.00,144.00,-14.40 --163.20,38.40,8.61,0.00,1.00,139.20,14.40 --158.40,43.20,8.59,0.00,1.00,134.40,-14.40 --153.60,43.20,8.57,0.00,1.00,129.60,19.20 --148.80,48.00,8.54,0.00,1.00,120.00,-19.20 --144.00,52.80,8.52,0.00,1.00,115.20,19.20 --139.20,57.60,8.50,0.00,1.00,110.40,-19.20 --134.40,57.60,8.48,0.00,1.00,105.60,19.20 --124.80,62.40,8.46,0.00,1.00,100.80,-19.20 --115.20,67.20,8.44,0.00,1.00,96.00,24.00 --105.60,67.20,8.42,0.00,1.00,91.20,-24.00 --91.20,67.20,8.40,0.00,1.00,86.40,24.00 --81.60,67.20,8.37,0.00,1.00,81.60,-24.00 --67.20,67.20,8.35,0.00,1.00,76.80,24.00 --57.60,62.40,8.33,0.00,1.00,72.00,-19.20 --48.00,62.40,8.31,0.00,1.00,67.20,19.20 --43.20,57.60,8.29,0.00,1.00,62.40,-19.20 --38.40,52.80,8.27,0.00,1.00,57.60,19.20 --33.60,52.80,8.25,0.00,1.00,48.00,-19.20 --28.80,48.00,8.22,0.00,1.00,43.20,19.20 --24.00,43.20,8.20,0.00,1.00,38.40,-14.40 --19.20,38.40,8.18,0.00,1.00,33.60,14.40 --19.20,33.60,8.16,0.00,1.00,33.60,-14.40 --14.40,28.80,8.14,0.00,1.00,28.80,14.40 --14.40,24.00,8.12,0.00,1.00,24.00,-9.60 --9.60,24.00,8.10,0.00,1.00,19.20,9.60 --9.60,19.20,8.07,0.00,1.00,14.40,-4.80 --4.80,14.40,8.05,0.00,1.00,9.60,4.80 --4.80,9.60,8.03,0.00,1.00,4.80,-4.80 --0.00,4.80,8.01,0.00,1.00,0.00,0.00 -0.00,0.00,7.99,0.00,1.00,-4.80,0.00 -0.00,-4.80,7.97,0.00,1.00,-9.60,0.00 -4.80,-9.60,7.95,0.00,1.00,-14.40,-4.80 -4.80,-14.40,7.93,0.00,1.00,-19.20,4.80 -4.80,-19.20,7.90,0.00,1.00,-24.00,-9.60 -9.60,-24.00,7.88,0.00,1.00,-28.80,9.60 -9.60,-28.80,7.86,0.00,1.00,-33.60,-14.40 -9.60,-33.60,7.84,0.00,1.00,-38.40,14.40 -14.40,-38.40,7.82,0.00,1.00,-43.20,-14.40 -14.40,-38.40,7.80,0.00,1.00,-48.00,19.20 -19.20,-43.20,7.78,0.00,1.00,-52.80,-19.20 -24.00,-48.00,7.75,0.00,1.00,-57.60,19.20 -24.00,-52.80,7.73,0.00,1.00,-62.40,-24.00 -28.80,-57.60,7.71,0.00,1.00,-67.20,24.00 -38.40,-62.40,7.69,0.00,1.00,-72.00,-24.00 -43.20,-62.40,7.67,0.00,1.00,-76.80,24.00 -52.80,-67.20,7.65,0.00,1.00,-81.60,-24.00 -62.40,-72.00,7.63,0.00,1.00,-86.40,28.80 -76.80,-72.00,7.60,0.00,1.00,-91.20,-28.80 -96.00,-72.00,7.58,0.00,1.00,-96.00,28.80 -110.40,-72.00,7.56,0.00,1.00,-100.80,-28.80 -120.00,-67.20,7.54,0.00,1.00,-105.60,28.80 -134.40,-67.20,7.52,0.00,1.00,-110.40,-24.00 -139.20,-62.40,7.50,0.00,1.00,-115.20,24.00 -148.80,-57.60,7.48,0.00,1.00,-120.00,-24.00 -153.60,-57.60,7.46,0.00,1.00,-124.80,24.00 -158.40,-52.80,7.43,0.00,1.00,-129.60,-24.00 -158.40,-48.00,7.41,0.00,1.00,-134.40,19.20 -163.20,-43.20,7.39,0.00,1.00,-139.20,-19.20 -163.20,-38.40,7.37,0.00,1.00,-144.00,19.20 -168.00,-33.60,7.35,0.00,1.00,-148.80,-14.40 -168.00,-28.80,7.33,0.00,1.00,-153.60,14.40 -172.80,-24.00,7.31,0.00,1.00,-158.40,-9.60 -172.80,-19.20,7.28,0.00,1.00,-163.20,9.60 -172.80,-14.40,7.26,0.00,1.00,-168.00,-9.60 -177.60,-9.60,7.24,0.00,1.00,-172.80,4.80 -177.60,-4.80,7.22,0.00,1.00,-177.60,-4.80 -177.60,-0.00,7.20,0.00,1.00,177.60,0.00 --177.60,0.00,7.18,0.00,1.00,172.80,0.00 --177.60,4.80,7.16,0.00,1.00,168.00,-4.80 --177.60,9.60,7.13,0.00,1.00,163.20,4.80 --172.80,14.40,7.11,0.00,1.00,158.40,-9.60 --172.80,19.20,7.09,0.00,1.00,153.60,9.60 --172.80,24.00,7.07,0.00,1.00,148.80,-9.60 --168.00,28.80,7.05,0.00,1.00,144.00,14.40 --168.00,33.60,7.03,0.00,1.00,139.20,-14.40 --163.20,38.40,7.01,0.00,1.00,134.40,19.20 --163.20,43.20,6.99,0.00,1.00,129.60,-19.20 --158.40,48.00,6.96,0.00,1.00,124.80,19.20 --158.40,52.80,6.94,0.00,1.00,120.00,-24.00 --153.60,57.60,6.92,0.00,1.00,115.20,24.00 --148.80,57.60,6.90,0.00,1.00,110.40,-24.00 --139.20,62.40,6.88,0.00,1.00,105.60,24.00 --134.40,67.20,6.86,0.00,1.00,100.80,-24.00 --120.00,67.20,6.84,0.00,1.00,96.00,28.80 --110.40,72.00,6.81,0.00,1.00,91.20,-28.80 --96.00,72.00,6.79,0.00,1.00,86.40,28.80 --76.80,72.00,6.77,0.00,1.00,81.60,-28.80 --62.40,72.00,6.75,0.00,1.00,76.80,28.80 --52.80,67.20,6.73,0.00,1.00,72.00,-24.00 --43.20,62.40,6.71,0.00,1.00,67.20,24.00 --38.40,62.40,6.69,0.00,1.00,62.40,-24.00 --28.80,57.60,6.66,0.00,1.00,57.60,24.00 --24.00,52.80,6.64,0.00,1.00,52.80,-24.00 --24.00,48.00,6.62,0.00,1.00,48.00,19.20 --19.20,43.20,6.60,0.00,1.00,43.20,-19.20 --14.40,38.40,6.58,0.00,1.00,38.40,19.20 --14.40,38.40,6.56,0.00,1.00,33.60,-14.40 --9.60,33.60,6.54,0.00,1.00,28.80,14.40 --9.60,28.80,6.52,0.00,1.00,24.00,-14.40 --9.60,24.00,6.49,0.00,1.00,19.20,9.60 --4.80,19.20,6.47,0.00,1.00,14.40,-9.60 --4.80,14.40,6.45,0.00,1.00,9.60,4.80 --4.80,9.60,6.43,0.00,1.00,4.80,-4.80 --0.00,4.80,6.41,0.00,1.00,0.00,0.00 -0.00,0.00,6.39,0.00,1.00,-4.80,0.00 -0.00,-4.80,6.37,0.00,1.00,-9.60,4.80 -0.00,-9.60,6.34,0.00,1.00,-14.40,-4.80 -4.80,-14.40,6.32,0.00,1.00,-19.20,9.60 -4.80,-19.20,6.30,0.00,1.00,-24.00,-9.60 -4.80,-24.00,6.28,0.00,1.00,-28.80,14.40 -4.80,-28.80,6.26,0.00,1.00,-33.60,-14.40 -9.60,-33.60,6.24,0.00,1.00,-38.40,19.20 -9.60,-38.40,6.22,0.00,1.00,-43.20,-19.20 -14.40,-43.20,6.19,0.00,1.00,-48.00,19.20 -14.40,-48.00,6.17,0.00,1.00,-52.80,-24.00 -14.40,-52.80,6.15,0.00,1.00,-57.60,24.00 -19.20,-57.60,6.13,0.00,1.00,-62.40,-28.80 -24.00,-57.60,6.11,0.00,1.00,-67.20,28.80 -28.80,-62.40,6.09,0.00,1.00,-72.00,-28.80 -33.60,-67.20,6.07,0.00,1.00,-76.80,28.80 -43.20,-72.00,6.05,0.00,1.00,-81.60,-28.80 -57.60,-72.00,6.02,0.00,1.00,-86.40,33.60 -76.80,-76.80,6.00,0.00,1.00,-91.20,-33.60 -96.00,-76.80,5.98,0.00,1.00,-96.00,33.60 -115.20,-76.80,5.96,0.00,1.00,-100.80,-33.60 -129.60,-72.00,5.94,0.00,1.00,-105.60,28.80 -139.20,-72.00,5.92,0.00,1.00,-110.40,-28.80 -148.80,-67.20,5.90,0.00,1.00,-115.20,28.80 -153.60,-62.40,5.87,0.00,1.00,-120.00,-28.80 -158.40,-57.60,5.85,0.00,1.00,-124.80,28.80 -163.20,-52.80,5.83,0.00,1.00,-129.60,-24.00 -163.20,-48.00,5.81,0.00,1.00,-134.40,24.00 -168.00,-43.20,5.79,0.00,1.00,-139.20,-24.00 -168.00,-38.40,5.77,0.00,1.00,-144.00,19.20 -172.80,-33.60,5.75,0.00,1.00,-148.80,-19.20 -172.80,-28.80,5.72,0.00,1.00,-153.60,14.40 -172.80,-24.00,5.70,0.00,1.00,-158.40,-14.40 -172.80,-19.20,5.68,0.00,1.00,-163.20,9.60 -177.60,-14.40,5.66,0.00,1.00,-168.00,-9.60 -177.60,-9.60,5.64,0.00,1.00,-172.80,4.80 -177.60,-4.80,5.62,0.00,1.00,-177.60,-4.80 -177.60,-0.00,5.60,0.00,1.00,177.60,0.00 --177.60,0.00,5.58,0.00,1.00,172.80,0.00 --177.60,4.80,5.55,0.00,1.00,168.00,-4.80 --177.60,9.60,5.53,0.00,1.00,163.20,4.80 --177.60,14.40,5.51,0.00,1.00,158.40,-9.60 --172.80,19.20,5.49,0.00,1.00,153.60,9.60 --172.80,24.00,5.47,0.00,1.00,148.80,-14.40 --172.80,28.80,5.45,0.00,1.00,144.00,14.40 --172.80,33.60,5.43,0.00,1.00,139.20,-19.20 --168.00,38.40,5.40,0.00,1.00,134.40,19.20 --168.00,43.20,5.38,0.00,1.00,129.60,-24.00 --163.20,48.00,5.36,0.00,1.00,124.80,24.00 --163.20,52.80,5.34,0.00,1.00,120.00,-24.00 --158.40,57.60,5.32,0.00,1.00,115.20,28.80 --153.60,62.40,5.30,0.00,1.00,110.40,-28.80 --148.80,67.20,5.28,0.00,1.00,105.60,28.80 --139.20,72.00,5.26,0.00,1.00,100.80,-28.80 --129.60,72.00,5.23,0.00,1.00,96.00,28.80 --115.20,76.80,5.21,0.00,1.00,91.20,-33.60 --96.00,76.80,5.19,0.00,1.00,86.40,33.60 --76.80,76.80,5.17,0.00,1.00,81.60,-33.60 --57.60,72.00,5.15,0.00,1.00,76.80,33.60 --43.20,72.00,5.13,0.00,1.00,72.00,-28.80 --33.60,67.20,5.11,0.00,1.00,67.20,28.80 --28.80,62.40,5.08,0.00,1.00,62.40,-28.80 --24.00,57.60,5.06,0.00,1.00,57.60,28.80 --19.20,57.60,5.04,0.00,1.00,52.80,-28.80 --14.40,52.80,5.02,0.00,1.00,48.00,24.00 --14.40,48.00,5.00,0.00,1.00,43.20,-24.00 --14.40,43.20,4.98,0.00,1.00,38.40,19.20 --9.60,38.40,4.96,0.00,1.00,33.60,-19.20 --9.60,33.60,4.93,0.00,1.00,28.80,19.20 --4.80,28.80,4.91,0.00,1.00,24.00,-14.40 --4.80,24.00,4.89,0.00,1.00,19.20,14.40 --4.80,19.20,4.87,0.00,1.00,14.40,-9.60 --4.80,14.40,4.85,0.00,1.00,9.60,9.60 --0.00,9.60,4.83,0.00,1.00,4.80,-4.80 --0.00,4.80,4.81,0.00,1.00,0.00,4.80 -0.00,0.00,4.79,0.00,1.00,-4.80,0.00 -0.00,-4.80,4.76,0.00,1.00,-9.60,4.80 -0.00,-9.60,4.74,0.00,1.00,-14.40,-4.80 -0.00,-14.40,4.72,0.00,1.00,-19.20,9.60 -4.80,-19.20,4.70,0.00,1.00,-24.00,-9.60 -4.80,-24.00,4.68,0.00,1.00,-28.80,14.40 -4.80,-28.80,4.66,0.00,1.00,-33.60,-14.40 -4.80,-33.60,4.64,0.00,1.00,-38.40,19.20 -4.80,-38.40,4.61,0.00,1.00,-43.20,-24.00 -9.60,-43.20,4.59,0.00,1.00,-48.00,24.00 -9.60,-48.00,4.57,0.00,1.00,-52.80,-24.00 -9.60,-52.80,4.55,0.00,1.00,-57.60,28.80 -14.40,-57.60,4.53,0.00,1.00,-62.40,-28.80 -14.40,-62.40,4.51,0.00,1.00,-67.20,33.60 -19.20,-67.20,4.49,0.00,1.00,-72.00,-33.60 -24.00,-72.00,4.46,0.00,1.00,-76.80,33.60 -33.60,-72.00,4.44,0.00,1.00,-81.60,-33.60 -43.20,-76.80,4.42,0.00,1.00,-86.40,38.40 -67.20,-81.60,4.40,0.00,1.00,-91.20,-38.40 -96.00,-81.60,4.38,0.00,1.00,-96.00,38.40 -124.80,-81.60,4.36,0.00,1.00,-100.80,-38.40 -144.00,-76.80,4.34,0.00,1.00,-105.60,33.60 -153.60,-72.00,4.32,0.00,1.00,-110.40,-33.60 -158.40,-67.20,4.29,0.00,1.00,-115.20,33.60 -163.20,-62.40,4.27,0.00,1.00,-120.00,-33.60 -168.00,-57.60,4.25,0.00,1.00,-124.80,28.80 -168.00,-52.80,4.23,0.00,1.00,-129.60,-28.80 -168.00,-48.00,4.21,0.00,1.00,-134.40,28.80 -172.80,-43.20,4.19,0.00,1.00,-139.20,-24.00 -172.80,-38.40,4.17,0.00,1.00,-144.00,24.00 -172.80,-33.60,4.14,0.00,1.00,-148.80,-19.20 -172.80,-28.80,4.12,0.00,1.00,-153.60,19.20 -177.60,-24.00,4.10,0.00,1.00,-158.40,-14.40 -177.60,-19.20,4.08,0.00,1.00,-163.20,14.40 -177.60,-14.40,4.06,0.00,1.00,-168.00,-9.60 -177.60,-9.60,4.04,0.00,1.00,-172.80,4.80 -177.60,-4.80,4.02,0.00,1.00,-177.60,-4.80 -177.60,-0.00,3.99,0.00,1.00,177.60,0.00 --177.60,0.00,3.97,0.00,1.00,172.80,0.00 --177.60,4.80,3.95,0.00,1.00,168.00,-4.80 --177.60,9.60,3.93,0.00,1.00,163.20,4.80 --177.60,14.40,3.91,0.00,1.00,158.40,-9.60 --177.60,19.20,3.89,0.00,1.00,153.60,14.40 --177.60,24.00,3.87,0.00,1.00,148.80,-14.40 --172.80,28.80,3.85,0.00,1.00,144.00,19.20 --172.80,33.60,3.82,0.00,1.00,139.20,-19.20 --172.80,38.40,3.80,0.00,1.00,134.40,24.00 --172.80,43.20,3.78,0.00,1.00,129.60,-24.00 --168.00,48.00,3.76,0.00,1.00,124.80,28.80 --168.00,52.80,3.74,0.00,1.00,120.00,-28.80 --168.00,57.60,3.72,0.00,1.00,115.20,28.80 --163.20,62.40,3.70,0.00,1.00,110.40,-33.60 --158.40,67.20,3.67,0.00,1.00,105.60,33.60 --153.60,72.00,3.65,0.00,1.00,100.80,-33.60 --144.00,76.80,3.63,0.00,1.00,96.00,33.60 --124.80,81.60,3.61,0.00,1.00,91.20,-38.40 --96.00,81.60,3.59,0.00,1.00,86.40,38.40 --67.20,81.60,3.57,0.00,1.00,81.60,-38.40 --43.20,76.80,3.55,0.00,1.00,76.80,38.40 --33.60,72.00,3.52,0.00,1.00,72.00,-33.60 --24.00,72.00,3.50,0.00,1.00,67.20,33.60 --19.20,67.20,3.48,0.00,1.00,62.40,-33.60 --14.40,62.40,3.46,0.00,1.00,57.60,33.60 --14.40,57.60,3.44,0.00,1.00,52.80,-28.80 --9.60,52.80,3.42,0.00,1.00,48.00,28.80 --9.60,48.00,3.40,0.00,1.00,43.20,-24.00 --9.60,43.20,3.38,0.00,1.00,38.40,24.00 --4.80,38.40,3.35,0.00,1.00,33.60,-24.00 --4.80,33.60,3.33,0.00,1.00,28.80,19.20 --4.80,28.80,3.31,0.00,1.00,24.00,-14.40 --4.80,24.00,3.29,0.00,1.00,19.20,14.40 --4.80,19.20,3.27,0.00,1.00,14.40,-9.60 --0.00,14.40,3.25,0.00,1.00,9.60,9.60 --0.00,9.60,3.23,0.00,1.00,4.80,-4.80 --0.00,4.80,3.20,0.00,1.00,0.00,4.80 -0.00,0.00,3.18,0.00,1.00,-4.80,0.00 -0.00,-4.80,3.16,0.00,1.00,-9.60,4.80 -0.00,-9.60,3.14,0.00,1.00,-14.40,-4.80 -0.00,-14.40,3.12,0.00,1.00,-19.20,9.60 -0.00,-19.20,3.10,0.00,1.00,-24.00,-14.40 -0.00,-24.00,3.08,0.00,1.00,-28.80,14.40 -0.00,-28.80,3.05,0.00,1.00,-33.60,-19.20 -0.00,-33.60,3.03,0.00,1.00,-38.40,19.20 -4.80,-38.40,3.01,0.00,1.00,-43.20,-24.00 -4.80,-43.20,2.99,0.00,1.00,-48.00,28.80 -4.80,-48.00,2.97,0.00,1.00,-52.80,-28.80 -4.80,-52.80,2.95,0.00,1.00,-57.60,33.60 -4.80,-57.60,2.93,0.00,1.00,-62.40,-33.60 -4.80,-62.40,2.91,0.00,1.00,-67.20,33.60 -9.60,-67.20,2.88,0.00,1.00,-72.00,-38.40 -9.60,-72.00,2.86,0.00,1.00,-76.80,38.40 -14.40,-76.80,2.84,0.00,1.00,-81.60,-38.40 -24.00,-81.60,2.82,0.00,1.00,-86.40,43.20 -43.20,-86.40,2.80,0.00,1.00,-91.20,-43.20 -110.40,-86.40,2.78,0.00,1.00,-96.00,43.20 -148.80,-81.60,2.76,0.00,1.00,-100.80,-43.20 -163.20,-76.80,2.73,0.00,1.00,-105.60,38.40 -168.00,-72.00,2.71,0.00,1.00,-110.40,-38.40 -172.80,-67.20,2.69,0.00,1.00,-115.20,38.40 -172.80,-62.40,2.67,0.00,1.00,-120.00,-38.40 -172.80,-57.60,2.65,0.00,1.00,-124.80,33.60 -172.80,-52.80,2.63,0.00,1.00,-129.60,-33.60 -177.60,-48.00,2.61,0.00,1.00,-134.40,28.80 -177.60,-43.20,2.58,0.00,1.00,-139.20,-28.80 -177.60,-38.40,2.56,0.00,1.00,-144.00,24.00 -177.60,-33.60,2.54,0.00,1.00,-148.80,-24.00 -177.60,-28.80,2.52,0.00,1.00,-153.60,19.20 -177.60,-24.00,2.50,0.00,1.00,-158.40,-19.20 -177.60,-19.20,2.48,0.00,1.00,-163.20,14.40 -177.60,-14.40,2.46,0.00,1.00,-168.00,-9.60 -177.60,-9.60,2.44,0.00,1.00,-172.80,9.60 -177.60,-4.80,2.41,0.00,1.00,-177.60,-4.80 -177.60,-0.00,2.39,0.00,1.00,177.60,0.00 --177.60,0.00,2.37,0.00,1.00,172.80,0.00 --177.60,4.80,2.35,0.00,1.00,168.00,-4.80 --177.60,9.60,2.33,0.00,1.00,163.20,9.60 --177.60,14.40,2.31,0.00,1.00,158.40,-9.60 --177.60,19.20,2.29,0.00,1.00,153.60,14.40 --177.60,24.00,2.26,0.00,1.00,148.80,-19.20 --177.60,28.80,2.24,0.00,1.00,144.00,19.20 --177.60,33.60,2.22,0.00,1.00,139.20,-24.00 --177.60,38.40,2.20,0.00,1.00,134.40,24.00 --177.60,43.20,2.18,0.00,1.00,129.60,-28.80 --177.60,48.00,2.16,0.00,1.00,124.80,28.80 --172.80,52.80,2.14,0.00,1.00,120.00,-33.60 --172.80,57.60,2.11,0.00,1.00,115.20,33.60 --172.80,62.40,2.09,0.00,1.00,110.40,-38.40 --172.80,67.20,2.07,0.00,1.00,105.60,38.40 --168.00,72.00,2.05,0.00,1.00,100.80,-38.40 --163.20,76.80,2.03,0.00,1.00,96.00,38.40 --148.80,81.60,2.01,0.00,1.00,91.20,-43.20 --110.40,86.40,1.99,0.00,1.00,86.40,43.20 --43.20,86.40,1.97,0.00,1.00,81.60,-43.20 --24.00,81.60,1.94,0.00,1.00,76.80,43.20 --14.40,76.80,1.92,0.00,1.00,72.00,-38.40 --9.60,72.00,1.90,0.00,1.00,67.20,38.40 --9.60,67.20,1.88,0.00,1.00,62.40,-38.40 --4.80,62.40,1.86,0.00,1.00,57.60,33.60 --4.80,57.60,1.84,0.00,1.00,52.80,-33.60 --4.80,52.80,1.82,0.00,1.00,48.00,33.60 --4.80,48.00,1.79,0.00,1.00,43.20,-28.80 --4.80,43.20,1.77,0.00,1.00,38.40,28.80 --4.80,38.40,1.75,0.00,1.00,33.60,-24.00 --0.00,33.60,1.73,0.00,1.00,28.80,19.20 --0.00,28.80,1.71,0.00,1.00,24.00,-19.20 --0.00,24.00,1.69,0.00,1.00,19.20,14.40 --0.00,19.20,1.67,0.00,1.00,14.40,-14.40 --0.00,14.40,1.64,0.00,1.00,9.60,9.60 --0.00,9.60,1.62,0.00,1.00,4.80,-4.80 --0.00,4.80,1.60,0.00,1.00,0.00,4.80 --0.00,0.00,1.58,0.00,1.00,-4.80,0.00 --0.00,-4.80,1.56,0.00,1.00,-9.60,4.80 --0.00,-9.60,1.54,0.00,1.00,-14.40,-4.80 --0.00,-14.40,1.52,0.00,1.00,-19.20,9.60 --0.00,-19.20,1.50,0.00,1.00,-24.00,-14.40 --0.00,-24.00,1.47,0.00,1.00,-28.80,19.20 --0.00,-28.80,1.45,0.00,1.00,-33.60,-19.20 --0.00,-33.60,1.43,0.00,1.00,-38.40,24.00 --0.00,-38.40,1.41,0.00,1.00,-43.20,-28.80 --0.00,-43.20,1.39,0.00,1.00,-48.00,28.80 --0.00,-48.00,1.37,0.00,1.00,-52.80,-33.60 --0.00,-52.80,1.35,0.00,1.00,-57.60,33.60 --0.00,-57.60,1.32,0.00,1.00,-62.40,-38.40 --0.00,-62.40,1.30,0.00,1.00,-67.20,38.40 --4.80,-67.20,1.28,0.00,1.00,-72.00,-43.20 --4.80,-72.00,1.26,0.00,1.00,-76.80,43.20 --4.80,-76.80,1.24,0.00,1.00,-81.60,-43.20 --9.60,-81.60,1.22,0.00,1.00,-86.40,43.20 --19.20,-86.40,1.20,0.00,1.00,-91.20,-48.00 --134.40,-86.40,1.17,0.00,1.00,-96.00,48.00 --168.00,-81.60,1.15,0.00,1.00,-100.80,-48.00 --172.80,-76.80,1.13,0.00,1.00,-105.60,43.20 --177.60,-72.00,1.11,0.00,1.00,-110.40,-43.20 --177.60,-67.20,1.09,0.00,1.00,-115.20,43.20 --177.60,-62.40,1.07,0.00,1.00,-120.00,-38.40 --177.60,-57.60,1.05,0.00,1.00,-124.80,38.40 --177.60,-52.80,1.03,0.00,1.00,-129.60,-38.40 --177.60,-48.00,1.00,0.00,1.00,-134.40,33.60 --177.60,-43.20,0.98,0.00,1.00,-139.20,-28.80 --177.60,-38.40,0.96,0.00,1.00,-144.00,28.80 --177.60,-33.60,0.94,0.00,1.00,-148.80,-24.00 --177.60,-28.80,0.92,0.00,1.00,-153.60,24.00 --177.60,-24.00,0.90,0.00,1.00,-158.40,-19.20 --177.60,-19.20,0.88,0.00,1.00,-163.20,14.40 --177.60,-14.40,0.85,0.00,1.00,-168.00,-14.40 --177.60,-9.60,0.83,0.00,1.00,-172.80,9.60 --177.60,-4.80,0.81,0.00,1.00,-177.60,-4.80 --177.60,-0.00,0.79,0.00,1.00,177.60,0.00 -177.60,0.00,0.77,0.00,1.00,172.80,0.00 -177.60,4.80,0.75,0.00,1.00,168.00,-4.80 -177.60,9.60,0.73,0.00,1.00,163.20,9.60 -177.60,14.40,0.70,0.00,1.00,158.40,-14.40 -177.60,19.20,0.68,0.00,1.00,153.60,14.40 -177.60,24.00,0.66,0.00,1.00,148.80,-19.20 -177.60,28.80,0.64,0.00,1.00,144.00,24.00 -177.60,33.60,0.62,0.00,1.00,139.20,-24.00 -177.60,38.40,0.60,0.00,1.00,134.40,28.80 -177.60,43.20,0.58,0.00,1.00,129.60,-28.80 -177.60,48.00,0.56,0.00,1.00,124.80,33.60 -177.60,52.80,0.53,0.00,1.00,120.00,-38.40 -177.60,57.60,0.51,0.00,1.00,115.20,38.40 -177.60,62.40,0.49,0.00,1.00,110.40,-38.40 -177.60,67.20,0.47,0.00,1.00,105.60,43.20 -177.60,72.00,0.45,0.00,1.00,100.80,-43.20 -172.80,76.80,0.43,0.00,1.00,96.00,43.20 -168.00,81.60,0.41,0.00,1.00,91.20,-48.00 -134.40,86.40,0.38,0.00,1.00,86.40,48.00 -19.20,86.40,0.36,0.00,1.00,81.60,-48.00 -9.60,81.60,0.34,0.00,1.00,76.80,43.20 -4.80,76.80,0.32,0.00,1.00,72.00,-43.20 -4.80,72.00,0.30,0.00,1.00,67.20,43.20 -4.80,67.20,0.28,0.00,1.00,62.40,-43.20 -0.00,62.40,0.26,0.00,1.00,57.60,38.40 -0.00,57.60,0.23,0.00,1.00,52.80,-38.40 -0.00,52.80,0.21,0.00,1.00,48.00,33.60 -0.00,48.00,0.19,0.00,1.00,43.20,-33.60 -0.00,43.20,0.17,0.00,1.00,38.40,28.80 -0.00,38.40,0.15,0.00,1.00,33.60,-28.80 -0.00,33.60,0.13,0.00,1.00,28.80,24.00 -0.00,28.80,0.11,0.00,1.00,24.00,-19.20 -0.00,24.00,0.09,0.00,1.00,19.20,19.20 -0.00,19.20,0.06,0.00,1.00,14.40,-14.40 -0.00,14.40,0.04,0.00,1.00,9.60,9.60 -0.00,9.60,0.02,0.00,1.00,4.80,-4.80 -0.00,4.80,0.00,0.00,1.00,0.00,4.80 +0.00,0.00,0.00,0.00,1.00,0.00,0.00,0 +4.80,0.00,0.02,0.00,1.00,0.00,-4.80,0 +9.60,0.00,0.04,0.00,1.00,0.00,4.80,0 +14.40,0.00,0.06,0.00,1.00,0.00,-9.60,0 +19.20,0.00,0.09,0.00,1.00,0.00,14.40,0 +24.00,0.00,0.11,0.00,1.00,0.00,-14.40,0 +28.80,0.00,0.13,0.00,1.00,0.00,19.20,0 +33.60,0.00,0.15,0.00,1.00,0.00,-24.00,0 +38.40,0.00,0.17,0.00,1.00,0.00,24.00,0 +43.20,0.00,0.19,0.00,1.00,0.00,-28.80,0 +48.00,0.00,0.21,0.00,1.00,0.00,33.60,0 +52.80,0.00,0.23,0.00,1.00,0.00,-33.60,0 +57.60,0.00,0.26,0.00,1.00,0.00,38.40,0 +62.40,0.00,0.28,0.00,1.00,4.80,-38.40,0 +67.20,0.00,0.30,0.00,1.00,4.80,38.40,0 +72.00,0.00,0.32,0.00,1.00,4.80,-43.20,0 +76.80,0.00,0.34,0.00,1.00,9.60,43.20,0 +81.60,0.00,0.36,0.00,1.00,19.20,-43.20,0 +86.40,0.00,0.38,0.00,1.00,134.40,43.20,0 +91.20,0.00,0.41,0.00,1.00,168.00,-43.20,0 +96.00,0.00,0.43,0.00,1.00,172.80,43.20,0 +100.80,0.00,0.45,0.00,1.00,177.60,-43.20,0 +105.60,0.00,0.47,0.00,1.00,177.60,43.20,0 +110.40,0.00,0.49,0.00,1.00,177.60,-43.20,0 +115.20,0.00,0.51,0.00,1.00,177.60,38.40,0 +120.00,0.00,0.53,0.00,1.00,177.60,-38.40,0 +124.80,0.00,0.56,0.00,1.00,177.60,33.60,0 +129.60,0.00,0.58,0.00,1.00,177.60,-33.60,0 +134.40,0.00,0.60,0.00,1.00,177.60,28.80,0 +139.20,0.00,0.62,0.00,1.00,177.60,-28.80,0 +144.00,0.00,0.64,0.00,1.00,177.60,24.00,0 +148.80,0.00,0.66,0.00,1.00,177.60,-19.20,0 +153.60,0.00,0.68,0.00,1.00,177.60,19.20,0 +158.40,0.00,0.70,0.00,1.00,177.60,-14.40,0 +163.20,0.00,0.73,0.00,1.00,177.60,9.60,0 +168.00,0.00,0.75,0.00,1.00,177.60,-9.60,0 +172.80,0.00,0.77,0.00,1.00,177.60,4.80,0 +177.60,0.00,0.79,0.00,1.00,-177.60,-0.00,0 +-177.60,0.00,0.81,0.00,1.00,-177.60,-0.00,0 +-172.80,0.00,0.83,0.00,1.00,-177.60,4.80,0 +-168.00,0.00,0.85,0.00,1.00,-177.60,-9.60,0 +-163.20,0.00,0.88,0.00,1.00,-177.60,9.60,0 +-158.40,0.00,0.90,0.00,1.00,-177.60,-14.40,0 +-153.60,0.00,0.92,0.00,1.00,-177.60,19.20,0 +-148.80,0.00,0.94,0.00,1.00,-177.60,-19.20,0 +-144.00,0.00,0.96,0.00,1.00,-177.60,24.00,0 +-139.20,0.00,0.98,0.00,1.00,-177.60,-28.80,0 +-134.40,0.00,1.00,0.00,1.00,-177.60,28.80,0 +-129.60,0.00,1.03,0.00,1.00,-177.60,-33.60,0 +-124.80,0.00,1.05,0.00,1.00,-177.60,33.60,0 +-120.00,0.00,1.07,0.00,1.00,-177.60,-38.40,0 +-115.20,0.00,1.09,0.00,1.00,-177.60,38.40,0 +-110.40,0.00,1.11,0.00,1.00,-177.60,-43.20,0 +-105.60,0.00,1.13,0.00,1.00,-172.80,43.20,0 +-100.80,0.00,1.15,0.00,1.00,-168.00,-43.20,0 +-96.00,0.00,1.17,0.00,1.00,-134.40,43.20,0 +-91.20,0.00,1.20,0.00,1.00,-19.20,-43.20,0 +-86.40,0.00,1.22,0.00,1.00,-9.60,43.20,0 +-81.60,0.00,1.24,0.00,1.00,-4.80,-43.20,0 +-76.80,0.00,1.26,0.00,1.00,-4.80,43.20,0 +-72.00,0.00,1.28,0.00,1.00,-4.80,-43.20,0 +-67.20,0.00,1.30,0.00,1.00,-0.00,38.40,0 +-62.40,0.00,1.32,0.00,1.00,-0.00,-38.40,0 +-57.60,0.00,1.35,0.00,1.00,-0.00,38.40,0 +-52.80,0.00,1.37,0.00,1.00,-0.00,-33.60,0 +-48.00,0.00,1.39,0.00,1.00,-0.00,33.60,0 +-43.20,0.00,1.41,0.00,1.00,-0.00,-28.80,0 +-38.40,0.00,1.43,0.00,1.00,-0.00,24.00,0 +-33.60,0.00,1.45,0.00,1.00,-0.00,-24.00,0 +-28.80,0.00,1.47,0.00,1.00,-0.00,19.20,0 +-24.00,0.00,1.50,0.00,1.00,-0.00,-14.40,0 +-19.20,0.00,1.52,0.00,1.00,-0.00,14.40,0 +-14.40,0.00,1.54,0.00,1.00,-0.00,-9.60,0 +-9.60,0.00,1.56,0.00,1.00,-0.00,4.80,0 +-4.80,0.00,1.58,0.00,1.00,-0.00,-4.80,0 +0.00,0.00,1.60,0.00,1.00,-0.00,0.00,0 +4.80,-0.00,1.62,0.00,1.00,-0.00,-4.80,0 +9.60,-0.00,1.64,0.00,1.00,-0.00,4.80,0 +14.40,-0.00,1.67,0.00,1.00,-0.00,-9.60,0 +19.20,-0.00,1.69,0.00,1.00,-0.00,14.40,0 +24.00,-0.00,1.71,0.00,1.00,-0.00,-14.40,0 +28.80,-0.00,1.73,0.00,1.00,-0.00,19.20,0 +33.60,-4.80,1.75,0.00,1.00,-4.80,-19.20,0 +38.40,-4.80,1.77,0.00,1.00,-4.80,24.00,0 +43.20,-4.80,1.79,0.00,1.00,-4.80,-24.00,0 +48.00,-4.80,1.82,0.00,1.00,-4.80,28.80,0 +52.80,-4.80,1.84,0.00,1.00,-4.80,-28.80,0 +57.60,-4.80,1.86,0.00,1.00,-4.80,33.60,0 +62.40,-4.80,1.88,0.00,1.00,-9.60,-33.60,0 +67.20,-4.80,1.90,0.00,1.00,-9.60,38.40,0 +72.00,-4.80,1.92,0.00,1.00,-14.40,-38.40,0 +76.80,-4.80,1.94,0.00,1.00,-24.00,38.40,0 +81.60,-4.80,1.97,0.00,1.00,-43.20,-38.40,0 +86.40,-4.80,1.99,0.00,1.00,-110.40,38.40,0 +91.20,-4.80,2.01,0.00,1.00,-148.80,-38.40,0 +96.00,-4.80,2.03,0.00,1.00,-163.20,38.40,0 +100.80,-4.80,2.05,0.00,1.00,-168.00,-38.40,0 +105.60,-4.80,2.07,0.00,1.00,-172.80,38.40,0 +110.40,-4.80,2.09,0.00,1.00,-172.80,-38.40,0 +115.20,-4.80,2.11,0.00,1.00,-172.80,33.60,0 +120.00,-4.80,2.14,0.00,1.00,-172.80,-33.60,0 +124.80,-4.80,2.16,0.00,1.00,-177.60,33.60,0 +129.60,-4.80,2.18,0.00,1.00,-177.60,-28.80,0 +134.40,-4.80,2.20,0.00,1.00,-177.60,28.80,0 +139.20,-4.80,2.22,0.00,1.00,-177.60,-24.00,0 +144.00,-4.80,2.24,0.00,1.00,-177.60,24.00,0 +148.80,-4.80,2.26,0.00,1.00,-177.60,-19.20,0 +153.60,-0.00,2.29,0.00,1.00,-177.60,14.40,0 +158.40,-0.00,2.31,0.00,1.00,-177.60,-14.40,0 +163.20,-0.00,2.33,0.00,1.00,-177.60,9.60,0 +168.00,-0.00,2.35,0.00,1.00,-177.60,-9.60,0 +172.80,-0.00,2.37,0.00,1.00,-177.60,4.80,0 +177.60,-0.00,2.39,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,2.41,0.00,1.00,177.60,-0.00,0 +-172.80,0.00,2.44,0.00,1.00,177.60,4.80,0 +-168.00,0.00,2.46,0.00,1.00,177.60,-9.60,0 +-163.20,0.00,2.48,0.00,1.00,177.60,9.60,0 +-158.40,0.00,2.50,0.00,1.00,177.60,-14.40,0 +-153.60,0.00,2.52,0.00,1.00,177.60,14.40,0 +-148.80,4.80,2.54,0.00,1.00,177.60,-19.20,0 +-144.00,4.80,2.56,0.00,1.00,177.60,24.00,0 +-139.20,4.80,2.58,0.00,1.00,177.60,-24.00,0 +-134.40,4.80,2.61,0.00,1.00,177.60,28.80,0 +-129.60,4.80,2.63,0.00,1.00,172.80,-28.80,0 +-124.80,4.80,2.65,0.00,1.00,172.80,33.60,0 +-120.00,4.80,2.67,0.00,1.00,172.80,-33.60,0 +-115.20,4.80,2.69,0.00,1.00,172.80,33.60,0 +-110.40,4.80,2.71,0.00,1.00,168.00,-38.40,0 +-105.60,4.80,2.73,0.00,1.00,163.20,38.40,0 +-100.80,4.80,2.76,0.00,1.00,148.80,-38.40,0 +-96.00,4.80,2.78,0.00,1.00,110.40,38.40,0 +-91.20,4.80,2.80,0.00,1.00,43.20,-38.40,0 +-86.40,4.80,2.82,0.00,1.00,24.00,38.40,0 +-81.60,4.80,2.84,0.00,1.00,14.40,-38.40,0 +-76.80,4.80,2.86,0.00,1.00,9.60,38.40,0 +-72.00,4.80,2.88,0.00,1.00,9.60,-38.40,0 +-67.20,4.80,2.91,0.00,1.00,4.80,38.40,0 +-62.40,4.80,2.93,0.00,1.00,4.80,-33.60,0 +-57.60,4.80,2.95,0.00,1.00,4.80,33.60,0 +-52.80,4.80,2.97,0.00,1.00,4.80,-28.80,0 +-48.00,4.80,2.99,0.00,1.00,4.80,28.80,0 +-43.20,4.80,3.01,0.00,1.00,4.80,-24.00,0 +-38.40,4.80,3.03,0.00,1.00,0.00,24.00,0 +-33.60,4.80,3.05,0.00,1.00,0.00,-19.20,0 +-28.80,0.00,3.08,0.00,1.00,0.00,19.20,0 +-24.00,0.00,3.10,0.00,1.00,0.00,-14.40,0 +-19.20,0.00,3.12,0.00,1.00,0.00,14.40,0 +-14.40,0.00,3.14,0.00,1.00,0.00,-9.60,0 +-9.60,0.00,3.16,0.00,1.00,0.00,4.80,0 +-4.80,0.00,3.18,0.00,1.00,0.00,-4.80,0 +0.00,0.00,3.20,0.00,1.00,-0.00,0.00,0 +4.80,-0.00,3.23,0.00,1.00,-0.00,-4.80,0 +9.60,-0.00,3.25,0.00,1.00,-0.00,4.80,0 +14.40,-0.00,3.27,0.00,1.00,-4.80,-9.60,0 +19.20,-4.80,3.29,0.00,1.00,-4.80,9.60,0 +24.00,-4.80,3.31,0.00,1.00,-4.80,-14.40,0 +28.80,-4.80,3.33,0.00,1.00,-4.80,14.40,0 +33.60,-4.80,3.35,0.00,1.00,-4.80,-19.20,0 +38.40,-4.80,3.38,0.00,1.00,-9.60,19.20,0 +43.20,-4.80,3.40,0.00,1.00,-9.60,-24.00,0 +48.00,-4.80,3.42,0.00,1.00,-9.60,24.00,0 +52.80,-9.60,3.44,0.00,1.00,-14.40,-28.80,0 +57.60,-9.60,3.46,0.00,1.00,-14.40,28.80,0 +62.40,-9.60,3.48,0.00,1.00,-19.20,-28.80,0 +67.20,-9.60,3.50,0.00,1.00,-24.00,33.60,0 +72.00,-9.60,3.52,0.00,1.00,-33.60,-33.60,0 +76.80,-9.60,3.55,0.00,1.00,-43.20,33.60,0 +81.60,-9.60,3.57,0.00,1.00,-67.20,-33.60,0 +86.40,-9.60,3.59,0.00,1.00,-96.00,33.60,0 +91.20,-9.60,3.61,0.00,1.00,-124.80,-33.60,0 +96.00,-9.60,3.63,0.00,1.00,-144.00,33.60,0 +100.80,-9.60,3.65,0.00,1.00,-153.60,-33.60,0 +105.60,-9.60,3.67,0.00,1.00,-158.40,33.60,0 +110.40,-9.60,3.70,0.00,1.00,-163.20,-33.60,0 +115.20,-9.60,3.72,0.00,1.00,-168.00,33.60,0 +120.00,-9.60,3.74,0.00,1.00,-168.00,-28.80,0 +124.80,-9.60,3.76,0.00,1.00,-168.00,28.80,0 +129.60,-9.60,3.78,0.00,1.00,-172.80,-28.80,0 +134.40,-4.80,3.80,0.00,1.00,-172.80,24.00,0 +139.20,-4.80,3.82,0.00,1.00,-172.80,-24.00,0 +144.00,-4.80,3.85,0.00,1.00,-172.80,19.20,0 +148.80,-4.80,3.87,0.00,1.00,-177.60,-19.20,0 +153.60,-4.80,3.89,0.00,1.00,-177.60,14.40,0 +158.40,-4.80,3.91,0.00,1.00,-177.60,-14.40,0 +163.20,-4.80,3.93,0.00,1.00,-177.60,9.60,0 +168.00,-0.00,3.95,0.00,1.00,-177.60,-4.80,0 +172.80,-0.00,3.97,0.00,1.00,-177.60,4.80,0 +177.60,-0.00,3.99,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,4.02,0.00,1.00,177.60,-0.00,0 +-172.80,0.00,4.04,0.00,1.00,177.60,4.80,0 +-168.00,0.00,4.06,0.00,1.00,177.60,-4.80,0 +-163.20,4.80,4.08,0.00,1.00,177.60,9.60,0 +-158.40,4.80,4.10,0.00,1.00,177.60,-14.40,0 +-153.60,4.80,4.12,0.00,1.00,172.80,14.40,0 +-148.80,4.80,4.14,0.00,1.00,172.80,-19.20,0 +-144.00,4.80,4.17,0.00,1.00,172.80,19.20,0 +-139.20,4.80,4.19,0.00,1.00,172.80,-24.00,0 +-134.40,4.80,4.21,0.00,1.00,168.00,24.00,0 +-129.60,9.60,4.23,0.00,1.00,168.00,-28.80,0 +-124.80,9.60,4.25,0.00,1.00,168.00,28.80,0 +-120.00,9.60,4.27,0.00,1.00,163.20,-28.80,0 +-115.20,9.60,4.29,0.00,1.00,158.40,33.60,0 +-110.40,9.60,4.32,0.00,1.00,153.60,-33.60,0 +-105.60,9.60,4.34,0.00,1.00,144.00,33.60,0 +-100.80,9.60,4.36,0.00,1.00,124.80,-33.60,0 +-96.00,9.60,4.38,0.00,1.00,96.00,33.60,0 +-91.20,9.60,4.40,0.00,1.00,67.20,-33.60,0 +-86.40,9.60,4.42,0.00,1.00,43.20,33.60,0 +-81.60,9.60,4.44,0.00,1.00,33.60,-33.60,0 +-76.80,9.60,4.46,0.00,1.00,24.00,33.60,0 +-72.00,9.60,4.49,0.00,1.00,19.20,-33.60,0 +-67.20,9.60,4.51,0.00,1.00,14.40,33.60,0 +-62.40,9.60,4.53,0.00,1.00,14.40,-28.80,0 +-57.60,9.60,4.55,0.00,1.00,9.60,28.80,0 +-52.80,9.60,4.57,0.00,1.00,9.60,-28.80,0 +-48.00,4.80,4.59,0.00,1.00,9.60,24.00,0 +-43.20,4.80,4.61,0.00,1.00,4.80,-24.00,0 +-38.40,4.80,4.64,0.00,1.00,4.80,19.20,0 +-33.60,4.80,4.66,0.00,1.00,4.80,-19.20,0 +-28.80,4.80,4.68,0.00,1.00,4.80,14.40,0 +-24.00,4.80,4.70,0.00,1.00,4.80,-14.40,0 +-19.20,4.80,4.72,0.00,1.00,0.00,9.60,0 +-14.40,0.00,4.74,0.00,1.00,0.00,-9.60,0 +-9.60,0.00,4.76,0.00,1.00,0.00,4.80,0 +-4.80,0.00,4.79,0.00,1.00,0.00,-4.80,0 +0.00,0.00,4.81,0.00,1.00,-0.00,0.00,0 +4.80,-0.00,4.83,0.00,1.00,-0.00,-4.80,0 +9.60,-0.00,4.85,0.00,1.00,-4.80,4.80,0 +14.40,-4.80,4.87,0.00,1.00,-4.80,-9.60,0 +19.20,-4.80,4.89,0.00,1.00,-4.80,9.60,0 +24.00,-4.80,4.91,0.00,1.00,-4.80,-9.60,0 +28.80,-4.80,4.93,0.00,1.00,-9.60,14.40,0 +33.60,-9.60,4.96,0.00,1.00,-9.60,-14.40,0 +38.40,-9.60,4.98,0.00,1.00,-14.40,19.20,0 +43.20,-9.60,5.00,0.00,1.00,-14.40,-19.20,0 +48.00,-9.60,5.02,0.00,1.00,-14.40,24.00,0 +52.80,-9.60,5.04,0.00,1.00,-19.20,-24.00,0 +57.60,-14.40,5.06,0.00,1.00,-24.00,24.00,0 +62.40,-14.40,5.08,0.00,1.00,-28.80,-28.80,0 +67.20,-14.40,5.11,0.00,1.00,-33.60,28.80,0 +72.00,-14.40,5.13,0.00,1.00,-43.20,-28.80,0 +76.80,-14.40,5.15,0.00,1.00,-57.60,28.80,0 +81.60,-14.40,5.17,0.00,1.00,-76.80,-28.80,0 +86.40,-14.40,5.19,0.00,1.00,-96.00,28.80,0 +91.20,-14.40,5.21,0.00,1.00,-115.20,-28.80,0 +96.00,-14.40,5.23,0.00,1.00,-129.60,28.80,0 +100.80,-14.40,5.26,0.00,1.00,-139.20,-28.80,0 +105.60,-14.40,5.28,0.00,1.00,-148.80,28.80,0 +110.40,-14.40,5.30,0.00,1.00,-153.60,-28.80,0 +115.20,-14.40,5.32,0.00,1.00,-158.40,28.80,0 +120.00,-14.40,5.34,0.00,1.00,-163.20,-24.00,0 +124.80,-9.60,5.36,0.00,1.00,-163.20,24.00,0 +129.60,-9.60,5.38,0.00,1.00,-168.00,-24.00,0 +134.40,-9.60,5.40,0.00,1.00,-168.00,19.20,0 +139.20,-9.60,5.43,0.00,1.00,-172.80,-19.20,0 +144.00,-9.60,5.45,0.00,1.00,-172.80,19.20,0 +148.80,-9.60,5.47,0.00,1.00,-172.80,-14.40,0 +153.60,-4.80,5.49,0.00,1.00,-172.80,14.40,0 +158.40,-4.80,5.51,0.00,1.00,-177.60,-9.60,0 +163.20,-4.80,5.53,0.00,1.00,-177.60,9.60,0 +168.00,-4.80,5.55,0.00,1.00,-177.60,-4.80,0 +172.80,-0.00,5.58,0.00,1.00,-177.60,4.80,0 +177.60,-0.00,5.60,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,5.62,0.00,1.00,177.60,-0.00,0 +-172.80,0.00,5.64,0.00,1.00,177.60,4.80,0 +-168.00,4.80,5.66,0.00,1.00,177.60,-4.80,0 +-163.20,4.80,5.68,0.00,1.00,172.80,9.60,0 +-158.40,4.80,5.70,0.00,1.00,172.80,-9.60,0 +-153.60,4.80,5.72,0.00,1.00,172.80,14.40,0 +-148.80,9.60,5.75,0.00,1.00,172.80,-14.40,0 +-144.00,9.60,5.77,0.00,1.00,168.00,19.20,0 +-139.20,9.60,5.79,0.00,1.00,168.00,-19.20,0 +-134.40,9.60,5.81,0.00,1.00,163.20,19.20,0 +-129.60,9.60,5.83,0.00,1.00,163.20,-24.00,0 +-124.80,9.60,5.85,0.00,1.00,158.40,24.00,0 +-120.00,14.40,5.87,0.00,1.00,153.60,-24.00,0 +-115.20,14.40,5.90,0.00,1.00,148.80,28.80,0 +-110.40,14.40,5.92,0.00,1.00,139.20,-28.80,0 +-105.60,14.40,5.94,0.00,1.00,129.60,28.80,0 +-100.80,14.40,5.96,0.00,1.00,115.20,-28.80,0 +-96.00,14.40,5.98,0.00,1.00,96.00,28.80,0 +-91.20,14.40,6.00,0.00,1.00,76.80,-28.80,0 +-86.40,14.40,6.02,0.00,1.00,57.60,28.80,0 +-81.60,14.40,6.05,0.00,1.00,43.20,-28.80,0 +-76.80,14.40,6.07,0.00,1.00,33.60,28.80,0 +-72.00,14.40,6.09,0.00,1.00,28.80,-28.80,0 +-67.20,14.40,6.11,0.00,1.00,24.00,28.80,0 +-62.40,14.40,6.13,0.00,1.00,19.20,-28.80,0 +-57.60,14.40,6.15,0.00,1.00,14.40,24.00,0 +-52.80,9.60,6.17,0.00,1.00,14.40,-24.00,0 +-48.00,9.60,6.19,0.00,1.00,14.40,24.00,0 +-43.20,9.60,6.22,0.00,1.00,9.60,-19.20,0 +-38.40,9.60,6.24,0.00,1.00,9.60,19.20,0 +-33.60,9.60,6.26,0.00,1.00,4.80,-14.40,0 +-28.80,4.80,6.28,0.00,1.00,4.80,14.40,0 +-24.00,4.80,6.30,0.00,1.00,4.80,-9.60,0 +-19.20,4.80,6.32,0.00,1.00,4.80,9.60,0 +-14.40,4.80,6.34,0.00,1.00,0.00,-9.60,0 +-9.60,0.00,6.37,0.00,1.00,0.00,4.80,0 +-4.80,0.00,6.39,0.00,1.00,0.00,-4.80,0 +0.00,0.00,6.41,0.00,1.00,-0.00,0.00,0 +4.80,-0.00,6.43,0.00,1.00,-4.80,-0.00,0 +9.60,-4.80,6.45,0.00,1.00,-4.80,4.80,0 +14.40,-4.80,6.47,0.00,1.00,-4.80,-4.80,0 +19.20,-4.80,6.49,0.00,1.00,-9.60,9.60,0 +24.00,-9.60,6.52,0.00,1.00,-9.60,-9.60,0 +28.80,-9.60,6.54,0.00,1.00,-9.60,14.40,0 +33.60,-9.60,6.56,0.00,1.00,-14.40,-14.40,0 +38.40,-9.60,6.58,0.00,1.00,-14.40,14.40,0 +43.20,-14.40,6.60,0.00,1.00,-19.20,-19.20,0 +48.00,-14.40,6.62,0.00,1.00,-24.00,19.20,0 +52.80,-14.40,6.64,0.00,1.00,-24.00,-19.20,0 +57.60,-14.40,6.66,0.00,1.00,-28.80,19.20,0 +62.40,-19.20,6.69,0.00,1.00,-38.40,-24.00,0 +67.20,-19.20,6.71,0.00,1.00,-43.20,24.00,0 +72.00,-19.20,6.73,0.00,1.00,-52.80,-24.00,0 +76.80,-19.20,6.75,0.00,1.00,-62.40,24.00,0 +81.60,-19.20,6.77,0.00,1.00,-76.80,-24.00,0 +86.40,-19.20,6.79,0.00,1.00,-96.00,24.00,0 +91.20,-19.20,6.81,0.00,1.00,-110.40,-24.00,0 +96.00,-19.20,6.84,0.00,1.00,-120.00,24.00,0 +100.80,-19.20,6.86,0.00,1.00,-134.40,-24.00,0 +105.60,-19.20,6.88,0.00,1.00,-139.20,24.00,0 +110.40,-19.20,6.90,0.00,1.00,-148.80,-24.00,0 +115.20,-19.20,6.92,0.00,1.00,-153.60,24.00,0 +120.00,-14.40,6.94,0.00,1.00,-158.40,-24.00,0 +124.80,-14.40,6.96,0.00,1.00,-158.40,19.20,0 +129.60,-14.40,6.99,0.00,1.00,-163.20,-19.20,0 +134.40,-14.40,7.01,0.00,1.00,-163.20,19.20,0 +139.20,-14.40,7.03,0.00,1.00,-168.00,-14.40,0 +144.00,-9.60,7.05,0.00,1.00,-168.00,14.40,0 +148.80,-9.60,7.07,0.00,1.00,-172.80,-14.40,0 +153.60,-9.60,7.09,0.00,1.00,-172.80,9.60,0 +158.40,-4.80,7.11,0.00,1.00,-172.80,-9.60,0 +163.20,-4.80,7.13,0.00,1.00,-177.60,9.60,0 +168.00,-4.80,7.16,0.00,1.00,-177.60,-4.80,0 +172.80,-0.00,7.18,0.00,1.00,-177.60,4.80,0 +177.60,-0.00,7.20,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,7.22,0.00,1.00,177.60,-0.00,0 +-172.80,0.00,7.24,0.00,1.00,177.60,4.80,0 +-168.00,4.80,7.26,0.00,1.00,172.80,-4.80,0 +-163.20,4.80,7.28,0.00,1.00,172.80,9.60,0 +-158.40,4.80,7.31,0.00,1.00,172.80,-9.60,0 +-153.60,9.60,7.33,0.00,1.00,168.00,9.60,0 +-148.80,9.60,7.35,0.00,1.00,168.00,-14.40,0 +-144.00,9.60,7.37,0.00,1.00,163.20,14.40,0 +-139.20,14.40,7.39,0.00,1.00,163.20,-14.40,0 +-134.40,14.40,7.41,0.00,1.00,158.40,19.20,0 +-129.60,14.40,7.43,0.00,1.00,158.40,-19.20,0 +-124.80,14.40,7.46,0.00,1.00,153.60,19.20,0 +-120.00,14.40,7.48,0.00,1.00,148.80,-24.00,0 +-115.20,19.20,7.50,0.00,1.00,139.20,24.00,0 +-110.40,19.20,7.52,0.00,1.00,134.40,-24.00,0 +-105.60,19.20,7.54,0.00,1.00,120.00,24.00,0 +-100.80,19.20,7.56,0.00,1.00,110.40,-24.00,0 +-96.00,19.20,7.58,0.00,1.00,96.00,24.00,0 +-91.20,19.20,7.60,0.00,1.00,76.80,-24.00,0 +-86.40,19.20,7.63,0.00,1.00,62.40,24.00,0 +-81.60,19.20,7.65,0.00,1.00,52.80,-24.00,0 +-76.80,19.20,7.67,0.00,1.00,43.20,24.00,0 +-72.00,19.20,7.69,0.00,1.00,38.40,-24.00,0 +-67.20,19.20,7.71,0.00,1.00,28.80,24.00,0 +-62.40,19.20,7.73,0.00,1.00,24.00,-24.00,0 +-57.60,14.40,7.75,0.00,1.00,24.00,19.20,0 +-52.80,14.40,7.78,0.00,1.00,19.20,-19.20,0 +-48.00,14.40,7.80,0.00,1.00,14.40,19.20,0 +-43.20,14.40,7.82,0.00,1.00,14.40,-19.20,0 +-38.40,9.60,7.84,0.00,1.00,9.60,14.40,0 +-33.60,9.60,7.86,0.00,1.00,9.60,-14.40,0 +-28.80,9.60,7.88,0.00,1.00,9.60,14.40,0 +-24.00,9.60,7.90,0.00,1.00,4.80,-9.60,0 +-19.20,4.80,7.93,0.00,1.00,4.80,9.60,0 +-14.40,4.80,7.95,0.00,1.00,4.80,-4.80,0 +-9.60,4.80,7.97,0.00,1.00,0.00,4.80,0 +-4.80,0.00,7.99,0.00,1.00,0.00,-0.00,0 +0.00,0.00,8.01,0.00,1.00,-0.00,0.00,0 +4.80,-0.00,8.03,0.00,1.00,-4.80,-0.00,0 +9.60,-4.80,8.05,0.00,1.00,-4.80,4.80,0 +14.40,-4.80,8.07,0.00,1.00,-9.60,-4.80,0 +19.20,-9.60,8.10,0.00,1.00,-9.60,4.80,0 +24.00,-9.60,8.12,0.00,1.00,-14.40,-9.60,0 +28.80,-9.60,8.14,0.00,1.00,-14.40,9.60,0 +33.60,-14.40,8.16,0.00,1.00,-19.20,-9.60,0 +33.60,-14.40,8.18,0.00,1.00,-19.20,14.40,0 +38.40,-14.40,8.20,0.00,1.00,-24.00,-14.40,0 +43.20,-19.20,8.22,0.00,1.00,-28.80,14.40,0 +48.00,-19.20,8.25,0.00,1.00,-33.60,-14.40,0 +57.60,-19.20,8.27,0.00,1.00,-38.40,19.20,0 +62.40,-19.20,8.29,0.00,1.00,-43.20,-19.20,0 +67.20,-24.00,8.31,0.00,1.00,-48.00,19.20,0 +72.00,-24.00,8.33,0.00,1.00,-57.60,-19.20,0 +76.80,-24.00,8.35,0.00,1.00,-67.20,19.20,0 +81.60,-24.00,8.37,0.00,1.00,-81.60,-19.20,0 +86.40,-24.00,8.40,0.00,1.00,-91.20,19.20,0 +91.20,-24.00,8.42,0.00,1.00,-105.60,-19.20,0 +96.00,-24.00,8.44,0.00,1.00,-115.20,19.20,0 +100.80,-24.00,8.46,0.00,1.00,-124.80,-19.20,0 +105.60,-24.00,8.48,0.00,1.00,-134.40,19.20,0 +110.40,-24.00,8.50,0.00,1.00,-139.20,-19.20,0 +115.20,-19.20,8.52,0.00,1.00,-144.00,19.20,0 +120.00,-19.20,8.54,0.00,1.00,-148.80,-19.20,0 +129.60,-19.20,8.57,0.00,1.00,-153.60,19.20,0 +134.40,-19.20,8.59,0.00,1.00,-158.40,-14.40,0 +139.20,-19.20,8.61,0.00,1.00,-163.20,14.40,0 +144.00,-14.40,8.63,0.00,1.00,-163.20,-14.40,0 +148.80,-14.40,8.65,0.00,1.00,-168.00,14.40,0 +148.80,-14.40,8.67,0.00,1.00,-168.00,-9.60,0 +153.60,-9.60,8.69,0.00,1.00,-172.80,9.60,0 +158.40,-9.60,8.72,0.00,1.00,-172.80,-9.60,0 +163.20,-4.80,8.74,0.00,1.00,-177.60,4.80,0 +168.00,-4.80,8.76,0.00,1.00,-177.60,-4.80,0 +172.80,-4.80,8.78,0.00,1.00,-177.60,4.80,0 +177.60,-0.00,8.80,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,8.82,0.00,1.00,177.60,-0.00,0 +-172.80,4.80,8.84,0.00,1.00,177.60,4.80,0 +-168.00,4.80,8.87,0.00,1.00,172.80,-4.80,0 +-163.20,4.80,8.89,0.00,1.00,172.80,4.80,0 +-158.40,9.60,8.91,0.00,1.00,168.00,-9.60,0 +-153.60,9.60,8.93,0.00,1.00,168.00,9.60,0 +-148.80,14.40,8.95,0.00,1.00,163.20,-9.60,0 +-148.80,14.40,8.97,0.00,1.00,163.20,14.40,0 +-144.00,14.40,8.99,0.00,1.00,158.40,-14.40,0 +-139.20,19.20,9.01,0.00,1.00,153.60,14.40,0 +-134.40,19.20,9.04,0.00,1.00,148.80,-14.40,0 +-129.60,19.20,9.06,0.00,1.00,144.00,19.20,0 +-120.00,19.20,9.08,0.00,1.00,139.20,-19.20,0 +-115.20,19.20,9.10,0.00,1.00,134.40,19.20,0 +-110.40,24.00,9.12,0.00,1.00,124.80,-19.20,0 +-105.60,24.00,9.14,0.00,1.00,115.20,19.20,0 +-100.80,24.00,9.16,0.00,1.00,105.60,-19.20,0 +-96.00,24.00,9.19,0.00,1.00,91.20,19.20,0 +-91.20,24.00,9.21,0.00,1.00,81.60,-19.20,0 +-86.40,24.00,9.23,0.00,1.00,67.20,19.20,0 +-81.60,24.00,9.25,0.00,1.00,57.60,-19.20,0 +-76.80,24.00,9.27,0.00,1.00,48.00,19.20,0 +-72.00,24.00,9.29,0.00,1.00,43.20,-19.20,0 +-67.20,24.00,9.31,0.00,1.00,38.40,19.20,0 +-62.40,19.20,9.34,0.00,1.00,33.60,-19.20,0 +-57.60,19.20,9.36,0.00,1.00,28.80,19.20,0 +-48.00,19.20,9.38,0.00,1.00,24.00,-14.40,0 +-43.20,19.20,9.40,0.00,1.00,19.20,14.40,0 +-38.40,14.40,9.42,0.00,1.00,19.20,-14.40,0 +-33.60,14.40,9.44,0.00,1.00,14.40,14.40,0 +-33.60,14.40,9.46,0.00,1.00,14.40,-9.60,0 +-28.80,9.60,9.48,0.00,1.00,9.60,9.60,0 +-24.00,9.60,9.51,0.00,1.00,9.60,-9.60,0 +-19.20,9.60,9.53,0.00,1.00,4.80,4.80,0 +-14.40,4.80,9.55,0.00,1.00,4.80,-4.80,0 +-9.60,4.80,9.57,0.00,1.00,0.00,4.80,0 +-4.80,0.00,9.59,0.00,1.00,0.00,-0.00,0 +0.00,0.00,9.61,0.00,1.00,-0.00,0.00,0 +4.80,-0.00,9.63,0.00,1.00,-4.80,-0.00,0 +9.60,-4.80,9.66,0.00,1.00,-4.80,4.80,0 +14.40,-4.80,9.68,0.00,1.00,-9.60,-4.80,0 +19.20,-9.60,9.70,0.00,1.00,-9.60,4.80,0 +19.20,-9.60,9.72,0.00,1.00,-14.40,-4.80,0 +24.00,-14.40,9.74,0.00,1.00,-19.20,9.60,0 +28.80,-14.40,9.76,0.00,1.00,-19.20,-9.60,0 +33.60,-19.20,9.78,0.00,1.00,-24.00,9.60,0 +38.40,-19.20,9.81,0.00,1.00,-28.80,-9.60,0 +43.20,-19.20,9.83,0.00,1.00,-33.60,9.60,0 +48.00,-24.00,9.85,0.00,1.00,-38.40,-14.40,0 +52.80,-24.00,9.87,0.00,1.00,-43.20,14.40,0 +57.60,-24.00,9.89,0.00,1.00,-48.00,-14.40,0 +62.40,-24.00,9.91,0.00,1.00,-52.80,14.40,0 +72.00,-28.80,9.93,0.00,1.00,-62.40,-14.40,0 +76.80,-28.80,9.95,0.00,1.00,-72.00,14.40,0 +81.60,-28.80,9.98,0.00,1.00,-81.60,-14.40,0 +86.40,-28.80,10.00,0.00,1.00,-91.20,14.40,0 +91.20,-28.80,10.02,0.00,1.00,-100.80,-14.40,0 +96.00,-28.80,10.04,0.00,1.00,-110.40,14.40,0 +100.80,-28.80,10.06,0.00,1.00,-120.00,-14.40,0 +105.60,-28.80,10.08,0.00,1.00,-129.60,14.40,0 +115.20,-28.80,10.10,0.00,1.00,-134.40,-14.40,0 +120.00,-24.00,10.13,0.00,1.00,-139.20,14.40,0 +124.80,-24.00,10.15,0.00,1.00,-144.00,-14.40,0 +129.60,-24.00,10.17,0.00,1.00,-148.80,14.40,0 +134.40,-24.00,10.19,0.00,1.00,-153.60,-14.40,0 +139.20,-19.20,10.21,0.00,1.00,-158.40,9.60,0 +144.00,-19.20,10.23,0.00,1.00,-163.20,-9.60,0 +148.80,-14.40,10.25,0.00,1.00,-163.20,9.60,0 +153.60,-14.40,10.28,0.00,1.00,-168.00,-9.60,0 +158.40,-14.40,10.30,0.00,1.00,-168.00,4.80,0 +163.20,-9.60,10.32,0.00,1.00,-172.80,-4.80,0 +163.20,-9.60,10.34,0.00,1.00,-172.80,4.80,0 +168.00,-4.80,10.36,0.00,1.00,-177.60,-4.80,0 +172.80,-4.80,10.38,0.00,1.00,-177.60,0.00,0 +177.60,-0.00,10.40,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,10.42,0.00,1.00,177.60,-0.00,0 +-172.80,4.80,10.45,0.00,1.00,172.80,0.00,0 +-168.00,4.80,10.47,0.00,1.00,172.80,-4.80,0 +-163.20,9.60,10.49,0.00,1.00,168.00,4.80,0 +-163.20,9.60,10.51,0.00,1.00,168.00,-4.80,0 +-158.40,14.40,10.53,0.00,1.00,163.20,4.80,0 +-153.60,14.40,10.55,0.00,1.00,163.20,-9.60,0 +-148.80,14.40,10.57,0.00,1.00,158.40,9.60,0 +-144.00,19.20,10.60,0.00,1.00,153.60,-9.60,0 +-139.20,19.20,10.62,0.00,1.00,148.80,9.60,0 +-134.40,24.00,10.64,0.00,1.00,144.00,-14.40,0 +-129.60,24.00,10.66,0.00,1.00,139.20,14.40,0 +-124.80,24.00,10.68,0.00,1.00,134.40,-14.40,0 +-120.00,24.00,10.70,0.00,1.00,129.60,14.40,0 +-115.20,28.80,10.72,0.00,1.00,120.00,-14.40,0 +-105.60,28.80,10.74,0.00,1.00,110.40,14.40,0 +-100.80,28.80,10.77,0.00,1.00,100.80,-14.40,0 +-96.00,28.80,10.79,0.00,1.00,91.20,14.40,0 +-91.20,28.80,10.81,0.00,1.00,81.60,-14.40,0 +-86.40,28.80,10.83,0.00,1.00,72.00,14.40,0 +-81.60,28.80,10.85,0.00,1.00,62.40,-14.40,0 +-76.80,28.80,10.87,0.00,1.00,52.80,14.40,0 +-72.00,28.80,10.89,0.00,1.00,48.00,-14.40,0 +-62.40,24.00,10.92,0.00,1.00,43.20,14.40,0 +-57.60,24.00,10.94,0.00,1.00,38.40,-14.40,0 +-52.80,24.00,10.96,0.00,1.00,33.60,14.40,0 +-48.00,24.00,10.98,0.00,1.00,28.80,-14.40,0 +-43.20,19.20,11.00,0.00,1.00,24.00,9.60,0 +-38.40,19.20,11.02,0.00,1.00,19.20,-9.60,0 +-33.60,19.20,11.04,0.00,1.00,19.20,9.60,0 +-28.80,14.40,11.07,0.00,1.00,14.40,-9.60,0 +-24.00,14.40,11.09,0.00,1.00,9.60,9.60,0 +-19.20,9.60,11.11,0.00,1.00,9.60,-4.80,0 +-19.20,9.60,11.13,0.00,1.00,4.80,4.80,0 +-14.40,4.80,11.15,0.00,1.00,4.80,-4.80,0 +-9.60,4.80,11.17,0.00,1.00,0.00,4.80,0 +-4.80,0.00,11.19,0.00,1.00,0.00,-0.00,0 +0.00,0.00,11.21,0.00,1.00,-4.80,0.00,0 +4.80,-4.80,11.24,0.00,1.00,-4.80,-0.00,0 +9.60,-4.80,11.26,0.00,1.00,-9.60,0.00,0 +14.40,-9.60,11.28,0.00,1.00,-9.60,-4.80,0 +14.40,-9.60,11.30,0.00,1.00,-14.40,4.80,0 +19.20,-14.40,11.32,0.00,1.00,-14.40,-4.80,0 +24.00,-14.40,11.34,0.00,1.00,-19.20,4.80,0 +28.80,-19.20,11.36,0.00,1.00,-24.00,-4.80,0 +33.60,-19.20,11.39,0.00,1.00,-28.80,4.80,0 +38.40,-24.00,11.41,0.00,1.00,-28.80,-9.60,0 +43.20,-24.00,11.43,0.00,1.00,-33.60,9.60,0 +48.00,-24.00,11.45,0.00,1.00,-38.40,-9.60,0 +52.80,-28.80,11.47,0.00,1.00,-48.00,9.60,0 +57.60,-28.80,11.49,0.00,1.00,-52.80,-9.60,0 +62.40,-28.80,11.51,0.00,1.00,-57.60,9.60,0 +67.20,-33.60,11.54,0.00,1.00,-67.20,-9.60,0 +72.00,-33.60,11.56,0.00,1.00,-76.80,9.60,0 +81.60,-33.60,11.58,0.00,1.00,-81.60,-9.60,0 +86.40,-33.60,11.60,0.00,1.00,-91.20,9.60,0 +91.20,-33.60,11.62,0.00,1.00,-100.80,-9.60,0 +96.00,-33.60,11.64,0.00,1.00,-110.40,9.60,0 +100.80,-33.60,11.66,0.00,1.00,-115.20,-9.60,0 +110.40,-33.60,11.68,0.00,1.00,-124.80,9.60,0 +115.20,-33.60,11.71,0.00,1.00,-129.60,-9.60,0 +120.00,-28.80,11.73,0.00,1.00,-139.20,9.60,0 +124.80,-28.80,11.75,0.00,1.00,-144.00,-9.60,0 +129.60,-28.80,11.77,0.00,1.00,-148.80,9.60,0 +134.40,-24.00,11.79,0.00,1.00,-153.60,-9.60,0 +139.20,-24.00,11.81,0.00,1.00,-153.60,9.60,0 +144.00,-19.20,11.83,0.00,1.00,-158.40,-9.60,0 +148.80,-19.20,11.86,0.00,1.00,-163.20,4.80,0 +153.60,-14.40,11.88,0.00,1.00,-163.20,-4.80,0 +158.40,-14.40,11.90,0.00,1.00,-168.00,4.80,0 +163.20,-9.60,11.92,0.00,1.00,-172.80,-4.80,0 +168.00,-9.60,11.94,0.00,1.00,-172.80,4.80,0 +168.00,-4.80,11.96,0.00,1.00,-177.60,-0.00,0 +172.80,-4.80,11.98,0.00,1.00,-177.60,0.00,0 +177.60,-0.00,12.01,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,12.03,0.00,1.00,177.60,-0.00,0 +-172.80,4.80,12.05,0.00,1.00,172.80,0.00,0 +-168.00,4.80,12.07,0.00,1.00,172.80,-0.00,0 +-168.00,9.60,12.09,0.00,1.00,168.00,4.80,0 +-163.20,9.60,12.11,0.00,1.00,163.20,-4.80,0 +-158.40,14.40,12.13,0.00,1.00,163.20,4.80,0 +-153.60,14.40,12.15,0.00,1.00,158.40,-4.80,0 +-148.80,19.20,12.18,0.00,1.00,153.60,4.80,0 +-144.00,19.20,12.20,0.00,1.00,153.60,-9.60,0 +-139.20,24.00,12.22,0.00,1.00,148.80,9.60,0 +-134.40,24.00,12.24,0.00,1.00,144.00,-9.60,0 +-129.60,28.80,12.26,0.00,1.00,139.20,9.60,0 +-124.80,28.80,12.28,0.00,1.00,129.60,-9.60,0 +-120.00,28.80,12.30,0.00,1.00,124.80,9.60,0 +-115.20,33.60,12.33,0.00,1.00,115.20,-9.60,0 +-110.40,33.60,12.35,0.00,1.00,110.40,9.60,0 +-100.80,33.60,12.37,0.00,1.00,100.80,-9.60,0 +-96.00,33.60,12.39,0.00,1.00,91.20,9.60,0 +-91.20,33.60,12.41,0.00,1.00,81.60,-9.60,0 +-86.40,33.60,12.43,0.00,1.00,76.80,9.60,0 +-81.60,33.60,12.45,0.00,1.00,67.20,-9.60,0 +-72.00,33.60,12.48,0.00,1.00,57.60,9.60,0 +-67.20,33.60,12.50,0.00,1.00,52.80,-9.60,0 +-62.40,28.80,12.52,0.00,1.00,48.00,9.60,0 +-57.60,28.80,12.54,0.00,1.00,38.40,-9.60,0 +-52.80,28.80,12.56,0.00,1.00,33.60,9.60,0 +-48.00,24.00,12.58,0.00,1.00,28.80,-9.60,0 +-43.20,24.00,12.60,0.00,1.00,28.80,9.60,0 +-38.40,24.00,12.62,0.00,1.00,24.00,-9.60,0 +-33.60,19.20,12.65,0.00,1.00,19.20,4.80,0 +-28.80,19.20,12.67,0.00,1.00,14.40,-4.80,0 +-24.00,14.40,12.69,0.00,1.00,14.40,4.80,0 +-19.20,14.40,12.71,0.00,1.00,9.60,-4.80,0 +-14.40,9.60,12.73,0.00,1.00,9.60,4.80,0 +-14.40,9.60,12.75,0.00,1.00,4.80,-4.80,0 +-9.60,4.80,12.77,0.00,1.00,4.80,0.00,0 +-4.80,4.80,12.80,0.00,1.00,0.00,-0.00,0 +0.00,0.00,12.82,0.00,1.00,-4.80,0.00,0 +4.80,-4.80,12.84,0.00,1.00,-4.80,-0.00,0 +9.60,-4.80,12.86,0.00,1.00,-9.60,0.00,0 +9.60,-9.60,12.88,0.00,1.00,-9.60,-0.00,0 +14.40,-9.60,12.90,0.00,1.00,-14.40,0.00,0 +19.20,-14.40,12.92,0.00,1.00,-19.20,-4.80,0 +24.00,-19.20,12.95,0.00,1.00,-24.00,4.80,0 +28.80,-19.20,12.97,0.00,1.00,-24.00,-4.80,0 +33.60,-24.00,12.99,0.00,1.00,-28.80,4.80,0 +38.40,-24.00,13.01,0.00,1.00,-33.60,-4.80,0 +43.20,-28.80,13.03,0.00,1.00,-38.40,4.80,0 +48.00,-28.80,13.05,0.00,1.00,-43.20,-4.80,0 +52.80,-33.60,13.07,0.00,1.00,-48.00,4.80,0 +57.60,-33.60,13.09,0.00,1.00,-52.80,-4.80,0 +62.40,-33.60,13.12,0.00,1.00,-62.40,4.80,0 +67.20,-38.40,13.14,0.00,1.00,-67.20,-4.80,0 +72.00,-38.40,13.16,0.00,1.00,-76.80,4.80,0 +81.60,-38.40,13.18,0.00,1.00,-86.40,-4.80,0 +86.40,-38.40,13.20,0.00,1.00,-91.20,4.80,0 +91.20,-38.40,13.22,0.00,1.00,-100.80,-4.80,0 +96.00,-38.40,13.24,0.00,1.00,-105.60,4.80,0 +105.60,-38.40,13.27,0.00,1.00,-115.20,-4.80,0 +110.40,-38.40,13.29,0.00,1.00,-120.00,4.80,0 +115.20,-33.60,13.31,0.00,1.00,-129.60,-4.80,0 +120.00,-33.60,13.33,0.00,1.00,-134.40,4.80,0 +124.80,-33.60,13.35,0.00,1.00,-139.20,-4.80,0 +129.60,-28.80,13.37,0.00,1.00,-144.00,4.80,0 +134.40,-28.80,13.39,0.00,1.00,-148.80,-4.80,0 +139.20,-24.00,13.42,0.00,1.00,-153.60,4.80,0 +144.00,-24.00,13.44,0.00,1.00,-158.40,-4.80,0 +148.80,-19.20,13.46,0.00,1.00,-158.40,4.80,0 +153.60,-19.20,13.48,0.00,1.00,-163.20,-4.80,0 +158.40,-14.40,13.50,0.00,1.00,-168.00,4.80,0 +163.20,-14.40,13.52,0.00,1.00,-168.00,-4.80,0 +168.00,-9.60,13.54,0.00,1.00,-172.80,0.00,0 +172.80,-9.60,13.56,0.00,1.00,-177.60,-0.00,0 +172.80,-4.80,13.59,0.00,1.00,-177.60,0.00,0 +177.60,-0.00,13.61,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,13.63,0.00,1.00,177.60,-0.00,0 +-172.80,4.80,13.65,0.00,1.00,172.80,0.00,0 +-172.80,9.60,13.67,0.00,1.00,168.00,-0.00,0 +-168.00,9.60,13.69,0.00,1.00,168.00,0.00,0 +-163.20,14.40,13.71,0.00,1.00,163.20,-4.80,0 +-158.40,14.40,13.74,0.00,1.00,158.40,4.80,0 +-153.60,19.20,13.76,0.00,1.00,158.40,-4.80,0 +-148.80,19.20,13.78,0.00,1.00,153.60,4.80,0 +-144.00,24.00,13.80,0.00,1.00,148.80,-4.80,0 +-139.20,24.00,13.82,0.00,1.00,144.00,4.80,0 +-134.40,28.80,13.84,0.00,1.00,139.20,-4.80,0 +-129.60,28.80,13.86,0.00,1.00,134.40,4.80,0 +-124.80,33.60,13.89,0.00,1.00,129.60,-4.80,0 +-120.00,33.60,13.91,0.00,1.00,120.00,4.80,0 +-115.20,33.60,13.93,0.00,1.00,115.20,-4.80,0 +-110.40,38.40,13.95,0.00,1.00,105.60,4.80,0 +-105.60,38.40,13.97,0.00,1.00,100.80,-4.80,0 +-96.00,38.40,13.99,0.00,1.00,91.20,4.80,0 +-91.20,38.40,14.01,0.00,1.00,86.40,-4.80,0 +-86.40,38.40,14.03,0.00,1.00,76.80,4.80,0 +-81.60,38.40,14.06,0.00,1.00,67.20,-4.80,0 +-72.00,38.40,14.08,0.00,1.00,62.40,4.80,0 +-67.20,38.40,14.10,0.00,1.00,52.80,-4.80,0 +-62.40,33.60,14.12,0.00,1.00,48.00,4.80,0 +-57.60,33.60,14.14,0.00,1.00,43.20,-4.80,0 +-52.80,33.60,14.16,0.00,1.00,38.40,4.80,0 +-48.00,28.80,14.18,0.00,1.00,33.60,-4.80,0 +-43.20,28.80,14.21,0.00,1.00,28.80,4.80,0 +-38.40,24.00,14.23,0.00,1.00,24.00,-4.80,0 +-33.60,24.00,14.25,0.00,1.00,24.00,4.80,0 +-28.80,19.20,14.27,0.00,1.00,19.20,-4.80,0 +-24.00,19.20,14.29,0.00,1.00,14.40,4.80,0 +-19.20,14.40,14.31,0.00,1.00,9.60,-4.80,0 +-14.40,9.60,14.33,0.00,1.00,9.60,0.00,0 +-9.60,9.60,14.36,0.00,1.00,4.80,-0.00,0 +-9.60,4.80,14.38,0.00,1.00,4.80,0.00,0 +-4.80,4.80,14.40,0.00,1.00,0.00,-0.00,0 +0.00,0.00,14.42,0.00,1.00,-4.80,0.00,0 +4.80,-4.80,14.44,0.00,1.00,-4.80,-0.00,0 +4.80,-4.80,14.46,0.00,1.00,-9.60,0.00,0 +9.60,-9.60,14.48,0.00,1.00,-14.40,-0.00,0 +14.40,-14.40,14.50,0.00,1.00,-14.40,0.00,0 +19.20,-14.40,14.53,0.00,1.00,-19.20,-0.00,0 +24.00,-19.20,14.55,0.00,1.00,-24.00,0.00,0 +24.00,-24.00,14.57,0.00,1.00,-28.80,-0.00,0 +28.80,-24.00,14.59,0.00,1.00,-33.60,0.00,0 +33.60,-28.80,14.61,0.00,1.00,-38.40,-0.00,0 +38.40,-28.80,14.63,0.00,1.00,-43.20,0.00,0 +43.20,-33.60,14.65,0.00,1.00,-48.00,-0.00,0 +48.00,-33.60,14.68,0.00,1.00,-52.80,0.00,0 +52.80,-38.40,14.70,0.00,1.00,-57.60,-0.00,0 +62.40,-38.40,14.72,0.00,1.00,-62.40,0.00,0 +67.20,-38.40,14.74,0.00,1.00,-72.00,-0.00,0 +72.00,-43.20,14.76,0.00,1.00,-76.80,0.00,0 +76.80,-43.20,14.78,0.00,1.00,-86.40,-0.00,0 +86.40,-43.20,14.80,0.00,1.00,-91.20,0.00,0 +91.20,-43.20,14.83,0.00,1.00,-100.80,-0.00,0 +96.00,-43.20,14.85,0.00,1.00,-105.60,0.00,0 +105.60,-43.20,14.87,0.00,1.00,-110.40,-0.00,0 +110.40,-43.20,14.89,0.00,1.00,-120.00,0.00,0 +115.20,-38.40,14.91,0.00,1.00,-124.80,-0.00,0 +124.80,-38.40,14.93,0.00,1.00,-129.60,0.00,0 +129.60,-38.40,14.95,0.00,1.00,-134.40,-0.00,0 +134.40,-33.60,14.97,0.00,1.00,-139.20,0.00,0 +139.20,-33.60,15.00,0.00,1.00,-144.00,-0.00,0 +144.00,-28.80,15.02,0.00,1.00,-148.80,0.00,0 +148.80,-28.80,15.04,0.00,1.00,-153.60,-0.00,0 +153.60,-24.00,15.06,0.00,1.00,-158.40,0.00,0 +158.40,-19.20,15.08,0.00,1.00,-163.20,-0.00,0 +158.40,-19.20,15.10,0.00,1.00,-163.20,0.00,0 +163.20,-14.40,15.12,0.00,1.00,-168.00,-0.00,0 +168.00,-9.60,15.15,0.00,1.00,-172.80,0.00,0 +172.80,-9.60,15.17,0.00,1.00,-172.80,-0.00,0 +172.80,-4.80,15.19,0.00,1.00,-177.60,0.00,0 +177.60,-0.00,15.21,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,15.23,0.00,1.00,172.80,-0.00,0 +-172.80,4.80,15.25,0.00,1.00,172.80,0.00,0 +-172.80,9.60,15.27,0.00,1.00,168.00,-0.00,0 +-168.00,9.60,15.30,0.00,1.00,163.20,0.00,0 +-163.20,14.40,15.32,0.00,1.00,163.20,-0.00,0 +-158.40,19.20,15.34,0.00,1.00,158.40,0.00,0 +-158.40,19.20,15.36,0.00,1.00,153.60,-0.00,0 +-153.60,24.00,15.38,0.00,1.00,148.80,0.00,0 +-148.80,28.80,15.40,0.00,1.00,144.00,-0.00,0 +-144.00,28.80,15.42,0.00,1.00,139.20,0.00,0 +-139.20,33.60,15.44,0.00,1.00,134.40,-0.00,0 +-134.40,33.60,15.47,0.00,1.00,129.60,0.00,0 +-129.60,38.40,15.49,0.00,1.00,124.80,-0.00,0 +-124.80,38.40,15.51,0.00,1.00,120.00,0.00,0 +-115.20,38.40,15.53,0.00,1.00,110.40,-0.00,0 +-110.40,43.20,15.55,0.00,1.00,105.60,0.00,0 +-105.60,43.20,15.57,0.00,1.00,100.80,-0.00,0 +-96.00,43.20,15.59,0.00,1.00,91.20,0.00,0 +-91.20,43.20,15.62,0.00,1.00,86.40,-0.00,0 +-86.40,43.20,15.64,0.00,1.00,76.80,0.00,0 +-76.80,43.20,15.66,0.00,1.00,72.00,-0.00,0 +-72.00,43.20,15.68,0.00,1.00,62.40,0.00,0 +-67.20,38.40,15.70,0.00,1.00,57.60,-0.00,0 +-62.40,38.40,15.72,0.00,1.00,52.80,0.00,0 +-52.80,38.40,15.74,0.00,1.00,48.00,-0.00,0 +-48.00,33.60,15.77,0.00,1.00,43.20,0.00,0 +-43.20,33.60,15.79,0.00,1.00,38.40,-0.00,0 +-38.40,28.80,15.81,0.00,1.00,33.60,0.00,0 +-33.60,28.80,15.83,0.00,1.00,28.80,-0.00,0 +-28.80,24.00,15.85,0.00,1.00,24.00,0.00,0 +-24.00,24.00,15.87,0.00,1.00,19.20,-0.00,0 +-24.00,19.20,15.89,0.00,1.00,14.40,0.00,0 +-19.20,14.40,15.91,0.00,1.00,14.40,-0.00,0 +-14.40,14.40,15.94,0.00,1.00,9.60,0.00,0 +-9.60,9.60,15.96,0.00,1.00,4.80,-0.00,0 +-4.80,4.80,15.98,0.00,1.00,4.80,0.00,0 +-4.80,4.80,16.00,0.00,1.00,0.00,-0.00,0 +0.00,0.00,16.00,0.00,1.00,-4.80,0.00,0 +4.80,-4.80,15.98,0.00,1.00,-4.80,0.00,0 +4.80,-4.80,15.96,0.00,1.00,-9.60,-0.00,0 +9.60,-9.60,15.94,0.00,1.00,-14.40,0.00,0 +14.40,-14.40,15.91,0.00,1.00,-19.20,-0.00,0 +14.40,-19.20,15.89,0.00,1.00,-24.00,0.00,0 +19.20,-19.20,15.87,0.00,1.00,-24.00,-0.00,0 +24.00,-24.00,15.85,0.00,1.00,-28.80,0.00,0 +28.80,-28.80,15.83,0.00,1.00,-33.60,-0.00,0 +33.60,-28.80,15.81,0.00,1.00,-38.40,0.00,0 +38.40,-33.60,15.79,0.00,1.00,-43.20,-0.00,0 +43.20,-38.40,15.77,0.00,1.00,-48.00,0.00,0 +48.00,-38.40,15.74,0.00,1.00,-52.80,-4.80,0 +52.80,-43.20,15.72,0.00,1.00,-62.40,4.80,0 +57.60,-43.20,15.70,0.00,1.00,-67.20,-4.80,0 +62.40,-43.20,15.68,0.00,1.00,-72.00,4.80,0 +72.00,-48.00,15.66,0.00,1.00,-76.80,-4.80,0 +76.80,-48.00,15.64,0.00,1.00,-86.40,4.80,0 +86.40,-48.00,15.62,0.00,1.00,-91.20,-4.80,0 +91.20,-48.00,15.59,0.00,1.00,-96.00,4.80,0 +100.80,-48.00,15.57,0.00,1.00,-105.60,-4.80,0 +105.60,-48.00,15.55,0.00,1.00,-110.40,4.80,0 +110.40,-48.00,15.53,0.00,1.00,-115.20,-4.80,0 +120.00,-43.20,15.51,0.00,1.00,-124.80,4.80,0 +124.80,-43.20,15.49,0.00,1.00,-129.60,-4.80,0 +129.60,-38.40,15.47,0.00,1.00,-134.40,4.80,0 +134.40,-38.40,15.44,0.00,1.00,-139.20,-4.80,0 +139.20,-33.60,15.42,0.00,1.00,-144.00,0.00,0 +144.00,-33.60,15.40,0.00,1.00,-148.80,-0.00,0 +148.80,-28.80,15.38,0.00,1.00,-153.60,0.00,0 +153.60,-24.00,15.36,0.00,1.00,-158.40,-0.00,0 +158.40,-24.00,15.34,0.00,1.00,-158.40,0.00,0 +163.20,-19.20,15.32,0.00,1.00,-163.20,-0.00,0 +163.20,-14.40,15.30,0.00,1.00,-168.00,0.00,0 +168.00,-14.40,15.27,0.00,1.00,-172.80,-0.00,0 +172.80,-9.60,15.25,0.00,1.00,-172.80,0.00,0 +172.80,-4.80,15.23,0.00,1.00,-177.60,-0.00,0 +177.60,-0.00,15.21,0.00,1.00,177.60,0.00,0 +-177.60,0.00,15.19,0.00,1.00,172.80,0.00,0 +-172.80,4.80,15.17,0.00,1.00,172.80,-0.00,0 +-172.80,9.60,15.15,0.00,1.00,168.00,0.00,0 +-168.00,14.40,15.12,0.00,1.00,163.20,-0.00,0 +-163.20,14.40,15.10,0.00,1.00,158.40,0.00,0 +-163.20,19.20,15.08,0.00,1.00,158.40,-0.00,0 +-158.40,24.00,15.06,0.00,1.00,153.60,0.00,0 +-153.60,24.00,15.04,0.00,1.00,148.80,-0.00,0 +-148.80,28.80,15.02,0.00,1.00,144.00,0.00,0 +-144.00,33.60,15.00,0.00,1.00,139.20,-0.00,0 +-139.20,33.60,14.97,0.00,1.00,134.40,0.00,0 +-134.40,38.40,14.95,0.00,1.00,129.60,-4.80,0 +-129.60,38.40,14.93,0.00,1.00,124.80,4.80,0 +-124.80,43.20,14.91,0.00,1.00,115.20,-4.80,0 +-120.00,43.20,14.89,0.00,1.00,110.40,4.80,0 +-110.40,48.00,14.87,0.00,1.00,105.60,-4.80,0 +-105.60,48.00,14.85,0.00,1.00,96.00,4.80,0 +-100.80,48.00,14.83,0.00,1.00,91.20,-4.80,0 +-91.20,48.00,14.80,0.00,1.00,86.40,4.80,0 +-86.40,48.00,14.78,0.00,1.00,76.80,-4.80,0 +-76.80,48.00,14.76,0.00,1.00,72.00,4.80,0 +-72.00,48.00,14.74,0.00,1.00,67.20,-4.80,0 +-62.40,43.20,14.72,0.00,1.00,62.40,4.80,0 +-57.60,43.20,14.70,0.00,1.00,52.80,-4.80,0 +-52.80,43.20,14.68,0.00,1.00,48.00,4.80,0 +-48.00,38.40,14.65,0.00,1.00,43.20,-4.80,0 +-43.20,38.40,14.63,0.00,1.00,38.40,0.00,0 +-38.40,33.60,14.61,0.00,1.00,33.60,-0.00,0 +-33.60,28.80,14.59,0.00,1.00,28.80,0.00,0 +-28.80,28.80,14.57,0.00,1.00,24.00,-0.00,0 +-24.00,24.00,14.55,0.00,1.00,24.00,0.00,0 +-19.20,19.20,14.53,0.00,1.00,19.20,-0.00,0 +-14.40,19.20,14.50,0.00,1.00,14.40,0.00,0 +-14.40,14.40,14.48,0.00,1.00,9.60,-0.00,0 +-9.60,9.60,14.46,0.00,1.00,4.80,0.00,0 +-4.80,4.80,14.44,0.00,1.00,4.80,-0.00,0 +-4.80,4.80,14.42,0.00,1.00,0.00,0.00,0 +0.00,0.00,14.40,0.00,1.00,-4.80,0.00,0 +4.80,-4.80,14.38,0.00,1.00,-9.60,0.00,0 +4.80,-9.60,14.36,0.00,1.00,-9.60,-0.00,0 +9.60,-9.60,14.33,0.00,1.00,-14.40,0.00,0 +9.60,-14.40,14.31,0.00,1.00,-19.20,-4.80,0 +14.40,-19.20,14.29,0.00,1.00,-24.00,4.80,0 +19.20,-24.00,14.27,0.00,1.00,-28.80,-4.80,0 +24.00,-24.00,14.25,0.00,1.00,-33.60,4.80,0 +24.00,-28.80,14.23,0.00,1.00,-38.40,-4.80,0 +28.80,-33.60,14.21,0.00,1.00,-43.20,4.80,0 +33.60,-38.40,14.18,0.00,1.00,-48.00,-4.80,0 +38.40,-38.40,14.16,0.00,1.00,-52.80,4.80,0 +43.20,-43.20,14.14,0.00,1.00,-57.60,-4.80,0 +48.00,-43.20,14.12,0.00,1.00,-62.40,4.80,0 +52.80,-48.00,14.10,0.00,1.00,-67.20,-4.80,0 +62.40,-48.00,14.08,0.00,1.00,-72.00,9.60,0 +67.20,-52.80,14.06,0.00,1.00,-81.60,-9.60,0 +76.80,-52.80,14.03,0.00,1.00,-86.40,9.60,0 +86.40,-52.80,14.01,0.00,1.00,-91.20,-9.60,0 +91.20,-52.80,13.99,0.00,1.00,-96.00,9.60,0 +100.80,-52.80,13.97,0.00,1.00,-105.60,-9.60,0 +105.60,-52.80,13.95,0.00,1.00,-110.40,9.60,0 +115.20,-48.00,13.93,0.00,1.00,-115.20,-9.60,0 +120.00,-48.00,13.91,0.00,1.00,-120.00,9.60,0 +129.60,-48.00,13.89,0.00,1.00,-124.80,-4.80,0 +134.40,-43.20,13.86,0.00,1.00,-129.60,4.80,0 +139.20,-43.20,13.84,0.00,1.00,-134.40,-4.80,0 +144.00,-38.40,13.82,0.00,1.00,-139.20,4.80,0 +148.80,-33.60,13.80,0.00,1.00,-144.00,-4.80,0 +153.60,-33.60,13.78,0.00,1.00,-148.80,4.80,0 +158.40,-28.80,13.76,0.00,1.00,-153.60,-4.80,0 +158.40,-24.00,13.74,0.00,1.00,-158.40,4.80,0 +163.20,-19.20,13.71,0.00,1.00,-163.20,-4.80,0 +168.00,-19.20,13.69,0.00,1.00,-168.00,4.80,0 +168.00,-14.40,13.67,0.00,1.00,-172.80,-0.00,0 +172.80,-9.60,13.65,0.00,1.00,-172.80,0.00,0 +177.60,-4.80,13.63,0.00,1.00,-177.60,-0.00,0 +177.60,-0.00,13.61,0.00,1.00,177.60,0.00,0 +-177.60,0.00,13.59,0.00,1.00,172.80,0.00,0 +-177.60,4.80,13.56,0.00,1.00,172.80,-0.00,0 +-172.80,9.60,13.54,0.00,1.00,168.00,0.00,0 +-168.00,14.40,13.52,0.00,1.00,163.20,-0.00,0 +-168.00,19.20,13.50,0.00,1.00,158.40,4.80,0 +-163.20,19.20,13.48,0.00,1.00,153.60,-4.80,0 +-158.40,24.00,13.46,0.00,1.00,148.80,4.80,0 +-158.40,28.80,13.44,0.00,1.00,144.00,-4.80,0 +-153.60,33.60,13.42,0.00,1.00,139.20,4.80,0 +-148.80,33.60,13.39,0.00,1.00,134.40,-4.80,0 +-144.00,38.40,13.37,0.00,1.00,129.60,4.80,0 +-139.20,43.20,13.35,0.00,1.00,124.80,-4.80,0 +-134.40,43.20,13.33,0.00,1.00,120.00,4.80,0 +-129.60,48.00,13.31,0.00,1.00,115.20,-4.80,0 +-120.00,48.00,13.29,0.00,1.00,110.40,9.60,0 +-115.20,48.00,13.27,0.00,1.00,105.60,-9.60,0 +-105.60,52.80,13.24,0.00,1.00,96.00,9.60,0 +-100.80,52.80,13.22,0.00,1.00,91.20,-9.60,0 +-91.20,52.80,13.20,0.00,1.00,86.40,9.60,0 +-86.40,52.80,13.18,0.00,1.00,81.60,-9.60,0 +-76.80,52.80,13.16,0.00,1.00,72.00,9.60,0 +-67.20,52.80,13.14,0.00,1.00,67.20,-9.60,0 +-62.40,48.00,13.12,0.00,1.00,62.40,9.60,0 +-52.80,48.00,13.09,0.00,1.00,57.60,-4.80,0 +-48.00,43.20,13.07,0.00,1.00,52.80,4.80,0 +-43.20,43.20,13.05,0.00,1.00,48.00,-4.80,0 +-38.40,38.40,13.03,0.00,1.00,43.20,4.80,0 +-33.60,38.40,13.01,0.00,1.00,38.40,-4.80,0 +-28.80,33.60,12.99,0.00,1.00,33.60,4.80,0 +-24.00,28.80,12.97,0.00,1.00,28.80,-4.80,0 +-24.00,24.00,12.95,0.00,1.00,24.00,4.80,0 +-19.20,24.00,12.92,0.00,1.00,19.20,-4.80,0 +-14.40,19.20,12.90,0.00,1.00,14.40,4.80,0 +-9.60,14.40,12.88,0.00,1.00,9.60,-4.80,0 +-9.60,9.60,12.86,0.00,1.00,9.60,0.00,0 +-4.80,9.60,12.84,0.00,1.00,4.80,-0.00,0 +-4.80,4.80,12.82,0.00,1.00,0.00,0.00,0 +0.00,0.00,12.80,0.00,1.00,-4.80,0.00,0 +4.80,-4.80,12.77,0.00,1.00,-9.60,0.00,0 +4.80,-9.60,12.75,0.00,1.00,-14.40,-0.00,0 +9.60,-14.40,12.73,0.00,1.00,-14.40,4.80,0 +9.60,-14.40,12.71,0.00,1.00,-19.20,-4.80,0 +14.40,-19.20,12.69,0.00,1.00,-24.00,4.80,0 +14.40,-24.00,12.67,0.00,1.00,-28.80,-4.80,0 +19.20,-28.80,12.65,0.00,1.00,-33.60,4.80,0 +24.00,-33.60,12.62,0.00,1.00,-38.40,-9.60,0 +28.80,-33.60,12.60,0.00,1.00,-43.20,9.60,0 +28.80,-38.40,12.58,0.00,1.00,-48.00,-9.60,0 +33.60,-43.20,12.56,0.00,1.00,-52.80,9.60,0 +38.40,-43.20,12.54,0.00,1.00,-57.60,-9.60,0 +48.00,-48.00,12.52,0.00,1.00,-62.40,9.60,0 +52.80,-52.80,12.50,0.00,1.00,-67.20,-9.60,0 +57.60,-52.80,12.48,0.00,1.00,-72.00,9.60,0 +67.20,-57.60,12.45,0.00,1.00,-81.60,-14.40,0 +76.80,-57.60,12.43,0.00,1.00,-86.40,14.40,0 +81.60,-57.60,12.41,0.00,1.00,-91.20,-14.40,0 +91.20,-57.60,12.39,0.00,1.00,-96.00,14.40,0 +100.80,-57.60,12.37,0.00,1.00,-100.80,-14.40,0 +110.40,-57.60,12.35,0.00,1.00,-110.40,14.40,0 +115.20,-52.80,12.33,0.00,1.00,-115.20,-14.40,0 +124.80,-52.80,12.30,0.00,1.00,-120.00,9.60,0 +129.60,-48.00,12.28,0.00,1.00,-124.80,-9.60,0 +139.20,-48.00,12.26,0.00,1.00,-129.60,9.60,0 +144.00,-43.20,12.24,0.00,1.00,-134.40,-9.60,0 +148.80,-38.40,12.22,0.00,1.00,-139.20,9.60,0 +153.60,-38.40,12.20,0.00,1.00,-144.00,-9.60,0 +153.60,-33.60,12.18,0.00,1.00,-148.80,9.60,0 +158.40,-28.80,12.15,0.00,1.00,-153.60,-9.60,0 +163.20,-24.00,12.13,0.00,1.00,-158.40,4.80,0 +163.20,-24.00,12.11,0.00,1.00,-163.20,-4.80,0 +168.00,-19.20,12.09,0.00,1.00,-168.00,4.80,0 +172.80,-14.40,12.07,0.00,1.00,-168.00,-4.80,0 +172.80,-9.60,12.05,0.00,1.00,-172.80,4.80,0 +177.60,-4.80,12.03,0.00,1.00,-177.60,-0.00,0 +177.60,-0.00,12.01,0.00,1.00,177.60,0.00,0 +-177.60,0.00,11.98,0.00,1.00,172.80,0.00,0 +-177.60,4.80,11.96,0.00,1.00,168.00,-0.00,0 +-172.80,9.60,11.94,0.00,1.00,168.00,4.80,0 +-172.80,14.40,11.92,0.00,1.00,163.20,-4.80,0 +-168.00,19.20,11.90,0.00,1.00,158.40,4.80,0 +-163.20,24.00,11.88,0.00,1.00,153.60,-4.80,0 +-163.20,24.00,11.86,0.00,1.00,148.80,4.80,0 +-158.40,28.80,11.83,0.00,1.00,144.00,-9.60,0 +-153.60,33.60,11.81,0.00,1.00,139.20,9.60,0 +-153.60,38.40,11.79,0.00,1.00,134.40,-9.60,0 +-148.80,38.40,11.77,0.00,1.00,129.60,9.60,0 +-144.00,43.20,11.75,0.00,1.00,124.80,-9.60,0 +-139.20,48.00,11.73,0.00,1.00,120.00,9.60,0 +-129.60,48.00,11.71,0.00,1.00,115.20,-9.60,0 +-124.80,52.80,11.68,0.00,1.00,110.40,9.60,0 +-115.20,52.80,11.66,0.00,1.00,100.80,-14.40,0 +-110.40,57.60,11.64,0.00,1.00,96.00,14.40,0 +-100.80,57.60,11.62,0.00,1.00,91.20,-14.40,0 +-91.20,57.60,11.60,0.00,1.00,86.40,14.40,0 +-81.60,57.60,11.58,0.00,1.00,81.60,-14.40,0 +-76.80,57.60,11.56,0.00,1.00,72.00,14.40,0 +-67.20,57.60,11.54,0.00,1.00,67.20,-14.40,0 +-57.60,52.80,11.51,0.00,1.00,62.40,9.60,0 +-52.80,52.80,11.49,0.00,1.00,57.60,-9.60,0 +-48.00,48.00,11.47,0.00,1.00,52.80,9.60,0 +-38.40,43.20,11.45,0.00,1.00,48.00,-9.60,0 +-33.60,43.20,11.43,0.00,1.00,43.20,9.60,0 +-28.80,38.40,11.41,0.00,1.00,38.40,-9.60,0 +-28.80,33.60,11.39,0.00,1.00,33.60,9.60,0 +-24.00,33.60,11.36,0.00,1.00,28.80,-9.60,0 +-19.20,28.80,11.34,0.00,1.00,24.00,4.80,0 +-14.40,24.00,11.32,0.00,1.00,19.20,-4.80,0 +-14.40,19.20,11.30,0.00,1.00,14.40,4.80,0 +-9.60,14.40,11.28,0.00,1.00,14.40,-4.80,0 +-9.60,14.40,11.26,0.00,1.00,9.60,4.80,0 +-4.80,9.60,11.24,0.00,1.00,4.80,-0.00,0 +-4.80,4.80,11.21,0.00,1.00,0.00,0.00,0 +0.00,0.00,11.19,0.00,1.00,-4.80,0.00,0 +0.00,-4.80,11.17,0.00,1.00,-9.60,0.00,0 +4.80,-9.60,11.15,0.00,1.00,-14.40,-4.80,0 +4.80,-14.40,11.13,0.00,1.00,-19.20,4.80,0 +9.60,-19.20,11.11,0.00,1.00,-19.20,-4.80,0 +9.60,-19.20,11.09,0.00,1.00,-24.00,4.80,0 +14.40,-24.00,11.07,0.00,1.00,-28.80,-9.60,0 +19.20,-28.80,11.04,0.00,1.00,-33.60,9.60,0 +19.20,-33.60,11.02,0.00,1.00,-38.40,-9.60,0 +24.00,-38.40,11.00,0.00,1.00,-43.20,9.60,0 +28.80,-43.20,10.98,0.00,1.00,-48.00,-14.40,0 +33.60,-43.20,10.96,0.00,1.00,-52.80,14.40,0 +38.40,-48.00,10.94,0.00,1.00,-57.60,-14.40,0 +43.20,-52.80,10.92,0.00,1.00,-62.40,14.40,0 +48.00,-52.80,10.89,0.00,1.00,-72.00,-14.40,0 +52.80,-57.60,10.87,0.00,1.00,-76.80,14.40,0 +62.40,-57.60,10.85,0.00,1.00,-81.60,-19.20,0 +72.00,-62.40,10.83,0.00,1.00,-86.40,19.20,0 +81.60,-62.40,10.81,0.00,1.00,-91.20,-19.20,0 +91.20,-62.40,10.79,0.00,1.00,-96.00,19.20,0 +100.80,-62.40,10.77,0.00,1.00,-100.80,-19.20,0 +110.40,-62.40,10.74,0.00,1.00,-105.60,19.20,0 +120.00,-57.60,10.72,0.00,1.00,-115.20,-14.40,0 +129.60,-57.60,10.70,0.00,1.00,-120.00,14.40,0 +134.40,-52.80,10.68,0.00,1.00,-124.80,-14.40,0 +139.20,-48.00,10.66,0.00,1.00,-129.60,14.40,0 +144.00,-48.00,10.64,0.00,1.00,-134.40,-14.40,0 +148.80,-43.20,10.62,0.00,1.00,-139.20,14.40,0 +153.60,-38.40,10.60,0.00,1.00,-144.00,-14.40,0 +158.40,-33.60,10.57,0.00,1.00,-148.80,9.60,0 +163.20,-33.60,10.55,0.00,1.00,-153.60,-9.60,0 +163.20,-28.80,10.53,0.00,1.00,-158.40,9.60,0 +168.00,-24.00,10.51,0.00,1.00,-163.20,-9.60,0 +168.00,-19.20,10.49,0.00,1.00,-163.20,4.80,0 +172.80,-14.40,10.47,0.00,1.00,-168.00,-4.80,0 +172.80,-9.60,10.45,0.00,1.00,-172.80,4.80,0 +177.60,-4.80,10.42,0.00,1.00,-177.60,-0.00,0 +177.60,-0.00,10.40,0.00,1.00,177.60,0.00,0 +-177.60,0.00,10.38,0.00,1.00,172.80,0.00,0 +-177.60,4.80,10.36,0.00,1.00,168.00,-0.00,0 +-172.80,9.60,10.34,0.00,1.00,163.20,4.80,0 +-172.80,14.40,10.32,0.00,1.00,163.20,-4.80,0 +-168.00,19.20,10.30,0.00,1.00,158.40,4.80,0 +-168.00,24.00,10.28,0.00,1.00,153.60,-9.60,0 +-163.20,28.80,10.25,0.00,1.00,148.80,9.60,0 +-163.20,33.60,10.23,0.00,1.00,144.00,-9.60,0 +-158.40,33.60,10.21,0.00,1.00,139.20,9.60,0 +-153.60,38.40,10.19,0.00,1.00,134.40,-14.40,0 +-148.80,43.20,10.17,0.00,1.00,129.60,14.40,0 +-144.00,48.00,10.15,0.00,1.00,124.80,-14.40,0 +-139.20,48.00,10.13,0.00,1.00,120.00,14.40,0 +-134.40,52.80,10.10,0.00,1.00,115.20,-14.40,0 +-129.60,57.60,10.08,0.00,1.00,105.60,14.40,0 +-120.00,57.60,10.06,0.00,1.00,100.80,-14.40,0 +-110.40,62.40,10.04,0.00,1.00,96.00,19.20,0 +-100.80,62.40,10.02,0.00,1.00,91.20,-19.20,0 +-91.20,62.40,10.00,0.00,1.00,86.40,19.20,0 +-81.60,62.40,9.98,0.00,1.00,81.60,-19.20,0 +-72.00,62.40,9.95,0.00,1.00,76.80,19.20,0 +-62.40,57.60,9.93,0.00,1.00,72.00,-19.20,0 +-52.80,57.60,9.91,0.00,1.00,62.40,14.40,0 +-48.00,52.80,9.89,0.00,1.00,57.60,-14.40,0 +-43.20,52.80,9.87,0.00,1.00,52.80,14.40,0 +-38.40,48.00,9.85,0.00,1.00,48.00,-14.40,0 +-33.60,43.20,9.83,0.00,1.00,43.20,14.40,0 +-28.80,43.20,9.81,0.00,1.00,38.40,-14.40,0 +-24.00,38.40,9.78,0.00,1.00,33.60,9.60,0 +-19.20,33.60,9.76,0.00,1.00,28.80,-9.60,0 +-19.20,28.80,9.74,0.00,1.00,24.00,9.60,0 +-14.40,24.00,9.72,0.00,1.00,19.20,-9.60,0 +-9.60,19.20,9.70,0.00,1.00,19.20,4.80,0 +-9.60,19.20,9.68,0.00,1.00,14.40,-4.80,0 +-4.80,14.40,9.66,0.00,1.00,9.60,4.80,0 +-4.80,9.60,9.63,0.00,1.00,4.80,-4.80,0 +-0.00,4.80,9.61,0.00,1.00,0.00,0.00,0 +0.00,0.00,9.59,0.00,1.00,-4.80,0.00,0 +0.00,-4.80,9.57,0.00,1.00,-9.60,0.00,0 +4.80,-9.60,9.55,0.00,1.00,-14.40,-4.80,0 +4.80,-14.40,9.53,0.00,1.00,-19.20,4.80,0 +9.60,-19.20,9.51,0.00,1.00,-24.00,-4.80,0 +9.60,-24.00,9.48,0.00,1.00,-28.80,9.60,0 +14.40,-24.00,9.46,0.00,1.00,-33.60,-9.60,0 +14.40,-28.80,9.44,0.00,1.00,-33.60,14.40,0 +19.20,-33.60,9.42,0.00,1.00,-38.40,-14.40,0 +19.20,-38.40,9.40,0.00,1.00,-43.20,14.40,0 +24.00,-43.20,9.38,0.00,1.00,-48.00,-14.40,0 +28.80,-48.00,9.36,0.00,1.00,-57.60,19.20,0 +33.60,-52.80,9.34,0.00,1.00,-62.40,-19.20,0 +38.40,-52.80,9.31,0.00,1.00,-67.20,19.20,0 +43.20,-57.60,9.29,0.00,1.00,-72.00,-19.20,0 +48.00,-62.40,9.27,0.00,1.00,-76.80,19.20,0 +57.60,-62.40,9.25,0.00,1.00,-81.60,-19.20,0 +67.20,-67.20,9.23,0.00,1.00,-86.40,24.00,0 +81.60,-67.20,9.21,0.00,1.00,-91.20,-24.00,0 +91.20,-67.20,9.19,0.00,1.00,-96.00,24.00,0 +105.60,-67.20,9.16,0.00,1.00,-100.80,-24.00,0 +115.20,-67.20,9.14,0.00,1.00,-105.60,24.00,0 +124.80,-62.40,9.12,0.00,1.00,-110.40,-19.20,0 +134.40,-57.60,9.10,0.00,1.00,-115.20,19.20,0 +139.20,-57.60,9.08,0.00,1.00,-120.00,-19.20,0 +144.00,-52.80,9.06,0.00,1.00,-129.60,19.20,0 +148.80,-48.00,9.04,0.00,1.00,-134.40,-19.20,0 +153.60,-43.20,9.01,0.00,1.00,-139.20,19.20,0 +158.40,-43.20,8.99,0.00,1.00,-144.00,-14.40,0 +163.20,-38.40,8.97,0.00,1.00,-148.80,14.40,0 +163.20,-33.60,8.95,0.00,1.00,-148.80,-14.40,0 +168.00,-28.80,8.93,0.00,1.00,-153.60,9.60,0 +168.00,-24.00,8.91,0.00,1.00,-158.40,-9.60,0 +172.80,-19.20,8.89,0.00,1.00,-163.20,9.60,0 +172.80,-14.40,8.87,0.00,1.00,-168.00,-4.80,0 +177.60,-9.60,8.84,0.00,1.00,-172.80,4.80,0 +177.60,-4.80,8.82,0.00,1.00,-177.60,-4.80,0 +177.60,-0.00,8.80,0.00,1.00,177.60,0.00,0 +-177.60,0.00,8.78,0.00,1.00,172.80,0.00,0 +-177.60,4.80,8.76,0.00,1.00,168.00,-4.80,0 +-177.60,9.60,8.74,0.00,1.00,163.20,4.80,0 +-172.80,14.40,8.72,0.00,1.00,158.40,-4.80,0 +-172.80,19.20,8.69,0.00,1.00,153.60,9.60,0 +-168.00,24.00,8.67,0.00,1.00,148.80,-9.60,0 +-168.00,28.80,8.65,0.00,1.00,148.80,9.60,0 +-163.20,33.60,8.63,0.00,1.00,144.00,-14.40,0 +-163.20,38.40,8.61,0.00,1.00,139.20,14.40,0 +-158.40,43.20,8.59,0.00,1.00,134.40,-14.40,0 +-153.60,43.20,8.57,0.00,1.00,129.60,19.20,0 +-148.80,48.00,8.54,0.00,1.00,120.00,-19.20,0 +-144.00,52.80,8.52,0.00,1.00,115.20,19.20,0 +-139.20,57.60,8.50,0.00,1.00,110.40,-19.20,0 +-134.40,57.60,8.48,0.00,1.00,105.60,19.20,0 +-124.80,62.40,8.46,0.00,1.00,100.80,-19.20,0 +-115.20,67.20,8.44,0.00,1.00,96.00,24.00,0 +-105.60,67.20,8.42,0.00,1.00,91.20,-24.00,0 +-91.20,67.20,8.40,0.00,1.00,86.40,24.00,0 +-81.60,67.20,8.37,0.00,1.00,81.60,-24.00,0 +-67.20,67.20,8.35,0.00,1.00,76.80,24.00,0 +-57.60,62.40,8.33,0.00,1.00,72.00,-19.20,0 +-48.00,62.40,8.31,0.00,1.00,67.20,19.20,0 +-43.20,57.60,8.29,0.00,1.00,62.40,-19.20,0 +-38.40,52.80,8.27,0.00,1.00,57.60,19.20,0 +-33.60,52.80,8.25,0.00,1.00,48.00,-19.20,0 +-28.80,48.00,8.22,0.00,1.00,43.20,19.20,0 +-24.00,43.20,8.20,0.00,1.00,38.40,-14.40,0 +-19.20,38.40,8.18,0.00,1.00,33.60,14.40,0 +-19.20,33.60,8.16,0.00,1.00,33.60,-14.40,0 +-14.40,28.80,8.14,0.00,1.00,28.80,14.40,0 +-14.40,24.00,8.12,0.00,1.00,24.00,-9.60,0 +-9.60,24.00,8.10,0.00,1.00,19.20,9.60,0 +-9.60,19.20,8.07,0.00,1.00,14.40,-4.80,0 +-4.80,14.40,8.05,0.00,1.00,9.60,4.80,0 +-4.80,9.60,8.03,0.00,1.00,4.80,-4.80,0 +-0.00,4.80,8.01,0.00,1.00,0.00,0.00,0 +0.00,0.00,7.99,0.00,1.00,-4.80,0.00,0 +0.00,-4.80,7.97,0.00,1.00,-9.60,0.00,0 +4.80,-9.60,7.95,0.00,1.00,-14.40,-4.80,0 +4.80,-14.40,7.93,0.00,1.00,-19.20,4.80,0 +4.80,-19.20,7.90,0.00,1.00,-24.00,-9.60,0 +9.60,-24.00,7.88,0.00,1.00,-28.80,9.60,0 +9.60,-28.80,7.86,0.00,1.00,-33.60,-14.40,0 +9.60,-33.60,7.84,0.00,1.00,-38.40,14.40,0 +14.40,-38.40,7.82,0.00,1.00,-43.20,-14.40,0 +14.40,-38.40,7.80,0.00,1.00,-48.00,19.20,0 +19.20,-43.20,7.78,0.00,1.00,-52.80,-19.20,0 +24.00,-48.00,7.75,0.00,1.00,-57.60,19.20,0 +24.00,-52.80,7.73,0.00,1.00,-62.40,-24.00,0 +28.80,-57.60,7.71,0.00,1.00,-67.20,24.00,0 +38.40,-62.40,7.69,0.00,1.00,-72.00,-24.00,0 +43.20,-62.40,7.67,0.00,1.00,-76.80,24.00,0 +52.80,-67.20,7.65,0.00,1.00,-81.60,-24.00,0 +62.40,-72.00,7.63,0.00,1.00,-86.40,28.80,0 +76.80,-72.00,7.60,0.00,1.00,-91.20,-28.80,0 +96.00,-72.00,7.58,0.00,1.00,-96.00,28.80,0 +110.40,-72.00,7.56,0.00,1.00,-100.80,-28.80,0 +120.00,-67.20,7.54,0.00,1.00,-105.60,28.80,0 +134.40,-67.20,7.52,0.00,1.00,-110.40,-24.00,0 +139.20,-62.40,7.50,0.00,1.00,-115.20,24.00,0 +148.80,-57.60,7.48,0.00,1.00,-120.00,-24.00,0 +153.60,-57.60,7.46,0.00,1.00,-124.80,24.00,0 +158.40,-52.80,7.43,0.00,1.00,-129.60,-24.00,0 +158.40,-48.00,7.41,0.00,1.00,-134.40,19.20,0 +163.20,-43.20,7.39,0.00,1.00,-139.20,-19.20,0 +163.20,-38.40,7.37,0.00,1.00,-144.00,19.20,0 +168.00,-33.60,7.35,0.00,1.00,-148.80,-14.40,0 +168.00,-28.80,7.33,0.00,1.00,-153.60,14.40,0 +172.80,-24.00,7.31,0.00,1.00,-158.40,-9.60,0 +172.80,-19.20,7.28,0.00,1.00,-163.20,9.60,0 +172.80,-14.40,7.26,0.00,1.00,-168.00,-9.60,0 +177.60,-9.60,7.24,0.00,1.00,-172.80,4.80,0 +177.60,-4.80,7.22,0.00,1.00,-177.60,-4.80,0 +177.60,-0.00,7.20,0.00,1.00,177.60,0.00,0 +-177.60,0.00,7.18,0.00,1.00,172.80,0.00,0 +-177.60,4.80,7.16,0.00,1.00,168.00,-4.80,0 +-177.60,9.60,7.13,0.00,1.00,163.20,4.80,0 +-172.80,14.40,7.11,0.00,1.00,158.40,-9.60,0 +-172.80,19.20,7.09,0.00,1.00,153.60,9.60,0 +-172.80,24.00,7.07,0.00,1.00,148.80,-9.60,0 +-168.00,28.80,7.05,0.00,1.00,144.00,14.40,0 +-168.00,33.60,7.03,0.00,1.00,139.20,-14.40,0 +-163.20,38.40,7.01,0.00,1.00,134.40,19.20,0 +-163.20,43.20,6.99,0.00,1.00,129.60,-19.20,0 +-158.40,48.00,6.96,0.00,1.00,124.80,19.20,0 +-158.40,52.80,6.94,0.00,1.00,120.00,-24.00,0 +-153.60,57.60,6.92,0.00,1.00,115.20,24.00,0 +-148.80,57.60,6.90,0.00,1.00,110.40,-24.00,0 +-139.20,62.40,6.88,0.00,1.00,105.60,24.00,0 +-134.40,67.20,6.86,0.00,1.00,100.80,-24.00,0 +-120.00,67.20,6.84,0.00,1.00,96.00,28.80,0 +-110.40,72.00,6.81,0.00,1.00,91.20,-28.80,0 +-96.00,72.00,6.79,0.00,1.00,86.40,28.80,0 +-76.80,72.00,6.77,0.00,1.00,81.60,-28.80,0 +-62.40,72.00,6.75,0.00,1.00,76.80,28.80,0 +-52.80,67.20,6.73,0.00,1.00,72.00,-24.00,0 +-43.20,62.40,6.71,0.00,1.00,67.20,24.00,0 +-38.40,62.40,6.69,0.00,1.00,62.40,-24.00,0 +-28.80,57.60,6.66,0.00,1.00,57.60,24.00,0 +-24.00,52.80,6.64,0.00,1.00,52.80,-24.00,0 +-24.00,48.00,6.62,0.00,1.00,48.00,19.20,0 +-19.20,43.20,6.60,0.00,1.00,43.20,-19.20,0 +-14.40,38.40,6.58,0.00,1.00,38.40,19.20,0 +-14.40,38.40,6.56,0.00,1.00,33.60,-14.40,0 +-9.60,33.60,6.54,0.00,1.00,28.80,14.40,0 +-9.60,28.80,6.52,0.00,1.00,24.00,-14.40,0 +-9.60,24.00,6.49,0.00,1.00,19.20,9.60,0 +-4.80,19.20,6.47,0.00,1.00,14.40,-9.60,0 +-4.80,14.40,6.45,0.00,1.00,9.60,4.80,0 +-4.80,9.60,6.43,0.00,1.00,4.80,-4.80,0 +-0.00,4.80,6.41,0.00,1.00,0.00,0.00,0 +0.00,0.00,6.39,0.00,1.00,-4.80,0.00,0 +0.00,-4.80,6.37,0.00,1.00,-9.60,4.80,0 +0.00,-9.60,6.34,0.00,1.00,-14.40,-4.80,0 +4.80,-14.40,6.32,0.00,1.00,-19.20,9.60,0 +4.80,-19.20,6.30,0.00,1.00,-24.00,-9.60,0 +4.80,-24.00,6.28,0.00,1.00,-28.80,14.40,0 +4.80,-28.80,6.26,0.00,1.00,-33.60,-14.40,0 +9.60,-33.60,6.24,0.00,1.00,-38.40,19.20,0 +9.60,-38.40,6.22,0.00,1.00,-43.20,-19.20,0 +14.40,-43.20,6.19,0.00,1.00,-48.00,19.20,0 +14.40,-48.00,6.17,0.00,1.00,-52.80,-24.00,0 +14.40,-52.80,6.15,0.00,1.00,-57.60,24.00,0 +19.20,-57.60,6.13,0.00,1.00,-62.40,-28.80,0 +24.00,-57.60,6.11,0.00,1.00,-67.20,28.80,0 +28.80,-62.40,6.09,0.00,1.00,-72.00,-28.80,0 +33.60,-67.20,6.07,0.00,1.00,-76.80,28.80,0 +43.20,-72.00,6.05,0.00,1.00,-81.60,-28.80,0 +57.60,-72.00,6.02,0.00,1.00,-86.40,33.60,0 +76.80,-76.80,6.00,0.00,1.00,-91.20,-33.60,0 +96.00,-76.80,5.98,0.00,1.00,-96.00,33.60,0 +115.20,-76.80,5.96,0.00,1.00,-100.80,-33.60,0 +129.60,-72.00,5.94,0.00,1.00,-105.60,28.80,0 +139.20,-72.00,5.92,0.00,1.00,-110.40,-28.80,0 +148.80,-67.20,5.90,0.00,1.00,-115.20,28.80,0 +153.60,-62.40,5.87,0.00,1.00,-120.00,-28.80,0 +158.40,-57.60,5.85,0.00,1.00,-124.80,28.80,0 +163.20,-52.80,5.83,0.00,1.00,-129.60,-24.00,0 +163.20,-48.00,5.81,0.00,1.00,-134.40,24.00,0 +168.00,-43.20,5.79,0.00,1.00,-139.20,-24.00,0 +168.00,-38.40,5.77,0.00,1.00,-144.00,19.20,0 +172.80,-33.60,5.75,0.00,1.00,-148.80,-19.20,0 +172.80,-28.80,5.72,0.00,1.00,-153.60,14.40,0 +172.80,-24.00,5.70,0.00,1.00,-158.40,-14.40,0 +172.80,-19.20,5.68,0.00,1.00,-163.20,9.60,0 +177.60,-14.40,5.66,0.00,1.00,-168.00,-9.60,0 +177.60,-9.60,5.64,0.00,1.00,-172.80,4.80,0 +177.60,-4.80,5.62,0.00,1.00,-177.60,-4.80,0 +177.60,-0.00,5.60,0.00,1.00,177.60,0.00,0 +-177.60,0.00,5.58,0.00,1.00,172.80,0.00,0 +-177.60,4.80,5.55,0.00,1.00,168.00,-4.80,0 +-177.60,9.60,5.53,0.00,1.00,163.20,4.80,0 +-177.60,14.40,5.51,0.00,1.00,158.40,-9.60,0 +-172.80,19.20,5.49,0.00,1.00,153.60,9.60,0 +-172.80,24.00,5.47,0.00,1.00,148.80,-14.40,0 +-172.80,28.80,5.45,0.00,1.00,144.00,14.40,0 +-172.80,33.60,5.43,0.00,1.00,139.20,-19.20,0 +-168.00,38.40,5.40,0.00,1.00,134.40,19.20,0 +-168.00,43.20,5.38,0.00,1.00,129.60,-24.00,0 +-163.20,48.00,5.36,0.00,1.00,124.80,24.00,0 +-163.20,52.80,5.34,0.00,1.00,120.00,-24.00,0 +-158.40,57.60,5.32,0.00,1.00,115.20,28.80,0 +-153.60,62.40,5.30,0.00,1.00,110.40,-28.80,0 +-148.80,67.20,5.28,0.00,1.00,105.60,28.80,0 +-139.20,72.00,5.26,0.00,1.00,100.80,-28.80,0 +-129.60,72.00,5.23,0.00,1.00,96.00,28.80,0 +-115.20,76.80,5.21,0.00,1.00,91.20,-33.60,0 +-96.00,76.80,5.19,0.00,1.00,86.40,33.60,0 +-76.80,76.80,5.17,0.00,1.00,81.60,-33.60,0 +-57.60,72.00,5.15,0.00,1.00,76.80,33.60,0 +-43.20,72.00,5.13,0.00,1.00,72.00,-28.80,0 +-33.60,67.20,5.11,0.00,1.00,67.20,28.80,0 +-28.80,62.40,5.08,0.00,1.00,62.40,-28.80,0 +-24.00,57.60,5.06,0.00,1.00,57.60,28.80,0 +-19.20,57.60,5.04,0.00,1.00,52.80,-28.80,0 +-14.40,52.80,5.02,0.00,1.00,48.00,24.00,0 +-14.40,48.00,5.00,0.00,1.00,43.20,-24.00,0 +-14.40,43.20,4.98,0.00,1.00,38.40,19.20,0 +-9.60,38.40,4.96,0.00,1.00,33.60,-19.20,0 +-9.60,33.60,4.93,0.00,1.00,28.80,19.20,0 +-4.80,28.80,4.91,0.00,1.00,24.00,-14.40,0 +-4.80,24.00,4.89,0.00,1.00,19.20,14.40,0 +-4.80,19.20,4.87,0.00,1.00,14.40,-9.60,0 +-4.80,14.40,4.85,0.00,1.00,9.60,9.60,0 +-0.00,9.60,4.83,0.00,1.00,4.80,-4.80,0 +-0.00,4.80,4.81,0.00,1.00,0.00,4.80,0 +0.00,0.00,4.79,0.00,1.00,-4.80,0.00,0 +0.00,-4.80,4.76,0.00,1.00,-9.60,4.80,0 +0.00,-9.60,4.74,0.00,1.00,-14.40,-4.80,0 +0.00,-14.40,4.72,0.00,1.00,-19.20,9.60,0 +4.80,-19.20,4.70,0.00,1.00,-24.00,-9.60,0 +4.80,-24.00,4.68,0.00,1.00,-28.80,14.40,0 +4.80,-28.80,4.66,0.00,1.00,-33.60,-14.40,0 +4.80,-33.60,4.64,0.00,1.00,-38.40,19.20,0 +4.80,-38.40,4.61,0.00,1.00,-43.20,-24.00,0 +9.60,-43.20,4.59,0.00,1.00,-48.00,24.00,0 +9.60,-48.00,4.57,0.00,1.00,-52.80,-24.00,0 +9.60,-52.80,4.55,0.00,1.00,-57.60,28.80,0 +14.40,-57.60,4.53,0.00,1.00,-62.40,-28.80,0 +14.40,-62.40,4.51,0.00,1.00,-67.20,33.60,0 +19.20,-67.20,4.49,0.00,1.00,-72.00,-33.60,0 +24.00,-72.00,4.46,0.00,1.00,-76.80,33.60,0 +33.60,-72.00,4.44,0.00,1.00,-81.60,-33.60,0 +43.20,-76.80,4.42,0.00,1.00,-86.40,38.40,0 +67.20,-81.60,4.40,0.00,1.00,-91.20,-38.40,0 +96.00,-81.60,4.38,0.00,1.00,-96.00,38.40,0 +124.80,-81.60,4.36,0.00,1.00,-100.80,-38.40,0 +144.00,-76.80,4.34,0.00,1.00,-105.60,33.60,0 +153.60,-72.00,4.32,0.00,1.00,-110.40,-33.60,0 +158.40,-67.20,4.29,0.00,1.00,-115.20,33.60,0 +163.20,-62.40,4.27,0.00,1.00,-120.00,-33.60,0 +168.00,-57.60,4.25,0.00,1.00,-124.80,28.80,0 +168.00,-52.80,4.23,0.00,1.00,-129.60,-28.80,0 +168.00,-48.00,4.21,0.00,1.00,-134.40,28.80,0 +172.80,-43.20,4.19,0.00,1.00,-139.20,-24.00,0 +172.80,-38.40,4.17,0.00,1.00,-144.00,24.00,0 +172.80,-33.60,4.14,0.00,1.00,-148.80,-19.20,0 +172.80,-28.80,4.12,0.00,1.00,-153.60,19.20,0 +177.60,-24.00,4.10,0.00,1.00,-158.40,-14.40,0 +177.60,-19.20,4.08,0.00,1.00,-163.20,14.40,0 +177.60,-14.40,4.06,0.00,1.00,-168.00,-9.60,0 +177.60,-9.60,4.04,0.00,1.00,-172.80,4.80,0 +177.60,-4.80,4.02,0.00,1.00,-177.60,-4.80,0 +177.60,-0.00,3.99,0.00,1.00,177.60,0.00,0 +-177.60,0.00,3.97,0.00,1.00,172.80,0.00,0 +-177.60,4.80,3.95,0.00,1.00,168.00,-4.80,0 +-177.60,9.60,3.93,0.00,1.00,163.20,4.80,0 +-177.60,14.40,3.91,0.00,1.00,158.40,-9.60,0 +-177.60,19.20,3.89,0.00,1.00,153.60,14.40,0 +-177.60,24.00,3.87,0.00,1.00,148.80,-14.40,0 +-172.80,28.80,3.85,0.00,1.00,144.00,19.20,0 +-172.80,33.60,3.82,0.00,1.00,139.20,-19.20,0 +-172.80,38.40,3.80,0.00,1.00,134.40,24.00,0 +-172.80,43.20,3.78,0.00,1.00,129.60,-24.00,0 +-168.00,48.00,3.76,0.00,1.00,124.80,28.80,0 +-168.00,52.80,3.74,0.00,1.00,120.00,-28.80,0 +-168.00,57.60,3.72,0.00,1.00,115.20,28.80,0 +-163.20,62.40,3.70,0.00,1.00,110.40,-33.60,0 +-158.40,67.20,3.67,0.00,1.00,105.60,33.60,0 +-153.60,72.00,3.65,0.00,1.00,100.80,-33.60,0 +-144.00,76.80,3.63,0.00,1.00,96.00,33.60,0 +-124.80,81.60,3.61,0.00,1.00,91.20,-38.40,0 +-96.00,81.60,3.59,0.00,1.00,86.40,38.40,0 +-67.20,81.60,3.57,0.00,1.00,81.60,-38.40,0 +-43.20,76.80,3.55,0.00,1.00,76.80,38.40,0 +-33.60,72.00,3.52,0.00,1.00,72.00,-33.60,0 +-24.00,72.00,3.50,0.00,1.00,67.20,33.60,0 +-19.20,67.20,3.48,0.00,1.00,62.40,-33.60,0 +-14.40,62.40,3.46,0.00,1.00,57.60,33.60,0 +-14.40,57.60,3.44,0.00,1.00,52.80,-28.80,0 +-9.60,52.80,3.42,0.00,1.00,48.00,28.80,0 +-9.60,48.00,3.40,0.00,1.00,43.20,-24.00,0 +-9.60,43.20,3.38,0.00,1.00,38.40,24.00,0 +-4.80,38.40,3.35,0.00,1.00,33.60,-24.00,0 +-4.80,33.60,3.33,0.00,1.00,28.80,19.20,0 +-4.80,28.80,3.31,0.00,1.00,24.00,-14.40,0 +-4.80,24.00,3.29,0.00,1.00,19.20,14.40,0 +-4.80,19.20,3.27,0.00,1.00,14.40,-9.60,0 +-0.00,14.40,3.25,0.00,1.00,9.60,9.60,0 +-0.00,9.60,3.23,0.00,1.00,4.80,-4.80,0 +-0.00,4.80,3.20,0.00,1.00,0.00,4.80,0 +0.00,0.00,3.18,0.00,1.00,-4.80,0.00,0 +0.00,-4.80,3.16,0.00,1.00,-9.60,4.80,0 +0.00,-9.60,3.14,0.00,1.00,-14.40,-4.80,0 +0.00,-14.40,3.12,0.00,1.00,-19.20,9.60,0 +0.00,-19.20,3.10,0.00,1.00,-24.00,-14.40,0 +0.00,-24.00,3.08,0.00,1.00,-28.80,14.40,0 +0.00,-28.80,3.05,0.00,1.00,-33.60,-19.20,0 +0.00,-33.60,3.03,0.00,1.00,-38.40,19.20,0 +4.80,-38.40,3.01,0.00,1.00,-43.20,-24.00,0 +4.80,-43.20,2.99,0.00,1.00,-48.00,28.80,0 +4.80,-48.00,2.97,0.00,1.00,-52.80,-28.80,0 +4.80,-52.80,2.95,0.00,1.00,-57.60,33.60,0 +4.80,-57.60,2.93,0.00,1.00,-62.40,-33.60,0 +4.80,-62.40,2.91,0.00,1.00,-67.20,33.60,0 +9.60,-67.20,2.88,0.00,1.00,-72.00,-38.40,0 +9.60,-72.00,2.86,0.00,1.00,-76.80,38.40,0 +14.40,-76.80,2.84,0.00,1.00,-81.60,-38.40,0 +24.00,-81.60,2.82,0.00,1.00,-86.40,43.20,0 +43.20,-86.40,2.80,0.00,1.00,-91.20,-43.20,0 +110.40,-86.40,2.78,0.00,1.00,-96.00,43.20,0 +148.80,-81.60,2.76,0.00,1.00,-100.80,-43.20,0 +163.20,-76.80,2.73,0.00,1.00,-105.60,38.40,0 +168.00,-72.00,2.71,0.00,1.00,-110.40,-38.40,0 +172.80,-67.20,2.69,0.00,1.00,-115.20,38.40,0 +172.80,-62.40,2.67,0.00,1.00,-120.00,-38.40,0 +172.80,-57.60,2.65,0.00,1.00,-124.80,33.60,0 +172.80,-52.80,2.63,0.00,1.00,-129.60,-33.60,0 +177.60,-48.00,2.61,0.00,1.00,-134.40,28.80,0 +177.60,-43.20,2.58,0.00,1.00,-139.20,-28.80,0 +177.60,-38.40,2.56,0.00,1.00,-144.00,24.00,0 +177.60,-33.60,2.54,0.00,1.00,-148.80,-24.00,0 +177.60,-28.80,2.52,0.00,1.00,-153.60,19.20,0 +177.60,-24.00,2.50,0.00,1.00,-158.40,-19.20,0 +177.60,-19.20,2.48,0.00,1.00,-163.20,14.40,0 +177.60,-14.40,2.46,0.00,1.00,-168.00,-9.60,0 +177.60,-9.60,2.44,0.00,1.00,-172.80,9.60,0 +177.60,-4.80,2.41,0.00,1.00,-177.60,-4.80,0 +177.60,-0.00,2.39,0.00,1.00,177.60,0.00,0 +-177.60,0.00,2.37,0.00,1.00,172.80,0.00,0 +-177.60,4.80,2.35,0.00,1.00,168.00,-4.80,0 +-177.60,9.60,2.33,0.00,1.00,163.20,9.60,0 +-177.60,14.40,2.31,0.00,1.00,158.40,-9.60,0 +-177.60,19.20,2.29,0.00,1.00,153.60,14.40,0 +-177.60,24.00,2.26,0.00,1.00,148.80,-19.20,0 +-177.60,28.80,2.24,0.00,1.00,144.00,19.20,0 +-177.60,33.60,2.22,0.00,1.00,139.20,-24.00,0 +-177.60,38.40,2.20,0.00,1.00,134.40,24.00,0 +-177.60,43.20,2.18,0.00,1.00,129.60,-28.80,0 +-177.60,48.00,2.16,0.00,1.00,124.80,28.80,0 +-172.80,52.80,2.14,0.00,1.00,120.00,-33.60,0 +-172.80,57.60,2.11,0.00,1.00,115.20,33.60,0 +-172.80,62.40,2.09,0.00,1.00,110.40,-38.40,0 +-172.80,67.20,2.07,0.00,1.00,105.60,38.40,0 +-168.00,72.00,2.05,0.00,1.00,100.80,-38.40,0 +-163.20,76.80,2.03,0.00,1.00,96.00,38.40,0 +-148.80,81.60,2.01,0.00,1.00,91.20,-43.20,0 +-110.40,86.40,1.99,0.00,1.00,86.40,43.20,0 +-43.20,86.40,1.97,0.00,1.00,81.60,-43.20,0 +-24.00,81.60,1.94,0.00,1.00,76.80,43.20,0 +-14.40,76.80,1.92,0.00,1.00,72.00,-38.40,0 +-9.60,72.00,1.90,0.00,1.00,67.20,38.40,0 +-9.60,67.20,1.88,0.00,1.00,62.40,-38.40,0 +-4.80,62.40,1.86,0.00,1.00,57.60,33.60,0 +-4.80,57.60,1.84,0.00,1.00,52.80,-33.60,0 +-4.80,52.80,1.82,0.00,1.00,48.00,33.60,0 +-4.80,48.00,1.79,0.00,1.00,43.20,-28.80,0 +-4.80,43.20,1.77,0.00,1.00,38.40,28.80,0 +-4.80,38.40,1.75,0.00,1.00,33.60,-24.00,0 +-0.00,33.60,1.73,0.00,1.00,28.80,19.20,0 +-0.00,28.80,1.71,0.00,1.00,24.00,-19.20,0 +-0.00,24.00,1.69,0.00,1.00,19.20,14.40,0 +-0.00,19.20,1.67,0.00,1.00,14.40,-14.40,0 +-0.00,14.40,1.64,0.00,1.00,9.60,9.60,0 +-0.00,9.60,1.62,0.00,1.00,4.80,-4.80,0 +-0.00,4.80,1.60,0.00,1.00,0.00,4.80,0 +-0.00,0.00,1.58,0.00,1.00,-4.80,0.00,0 +-0.00,-4.80,1.56,0.00,1.00,-9.60,4.80,0 +-0.00,-9.60,1.54,0.00,1.00,-14.40,-4.80,0 +-0.00,-14.40,1.52,0.00,1.00,-19.20,9.60,0 +-0.00,-19.20,1.50,0.00,1.00,-24.00,-14.40,0 +-0.00,-24.00,1.47,0.00,1.00,-28.80,19.20,0 +-0.00,-28.80,1.45,0.00,1.00,-33.60,-19.20,0 +-0.00,-33.60,1.43,0.00,1.00,-38.40,24.00,0 +-0.00,-38.40,1.41,0.00,1.00,-43.20,-28.80,0 +-0.00,-43.20,1.39,0.00,1.00,-48.00,28.80,0 +-0.00,-48.00,1.37,0.00,1.00,-52.80,-33.60,0 +-0.00,-52.80,1.35,0.00,1.00,-57.60,33.60,0 +-0.00,-57.60,1.32,0.00,1.00,-62.40,-38.40,0 +-0.00,-62.40,1.30,0.00,1.00,-67.20,38.40,0 +-4.80,-67.20,1.28,0.00,1.00,-72.00,-43.20,0 +-4.80,-72.00,1.26,0.00,1.00,-76.80,43.20,0 +-4.80,-76.80,1.24,0.00,1.00,-81.60,-43.20,0 +-9.60,-81.60,1.22,0.00,1.00,-86.40,43.20,0 +-19.20,-86.40,1.20,0.00,1.00,-91.20,-48.00,0 +-134.40,-86.40,1.17,0.00,1.00,-96.00,48.00,0 +-168.00,-81.60,1.15,0.00,1.00,-100.80,-48.00,0 +-172.80,-76.80,1.13,0.00,1.00,-105.60,43.20,0 +-177.60,-72.00,1.11,0.00,1.00,-110.40,-43.20,0 +-177.60,-67.20,1.09,0.00,1.00,-115.20,43.20,0 +-177.60,-62.40,1.07,0.00,1.00,-120.00,-38.40,0 +-177.60,-57.60,1.05,0.00,1.00,-124.80,38.40,0 +-177.60,-52.80,1.03,0.00,1.00,-129.60,-38.40,0 +-177.60,-48.00,1.00,0.00,1.00,-134.40,33.60,0 +-177.60,-43.20,0.98,0.00,1.00,-139.20,-28.80,0 +-177.60,-38.40,0.96,0.00,1.00,-144.00,28.80,0 +-177.60,-33.60,0.94,0.00,1.00,-148.80,-24.00,0 +-177.60,-28.80,0.92,0.00,1.00,-153.60,24.00,0 +-177.60,-24.00,0.90,0.00,1.00,-158.40,-19.20,0 +-177.60,-19.20,0.88,0.00,1.00,-163.20,14.40,0 +-177.60,-14.40,0.85,0.00,1.00,-168.00,-14.40,0 +-177.60,-9.60,0.83,0.00,1.00,-172.80,9.60,0 +-177.60,-4.80,0.81,0.00,1.00,-177.60,-4.80,0 +-177.60,-0.00,0.79,0.00,1.00,177.60,0.00,0 +177.60,0.00,0.77,0.00,1.00,172.80,0.00,0 +177.60,4.80,0.75,0.00,1.00,168.00,-4.80,0 +177.60,9.60,0.73,0.00,1.00,163.20,9.60,0 +177.60,14.40,0.70,0.00,1.00,158.40,-14.40,0 +177.60,19.20,0.68,0.00,1.00,153.60,14.40,0 +177.60,24.00,0.66,0.00,1.00,148.80,-19.20,0 +177.60,28.80,0.64,0.00,1.00,144.00,24.00,0 +177.60,33.60,0.62,0.00,1.00,139.20,-24.00,0 +177.60,38.40,0.60,0.00,1.00,134.40,28.80,0 +177.60,43.20,0.58,0.00,1.00,129.60,-28.80,0 +177.60,48.00,0.56,0.00,1.00,124.80,33.60,0 +177.60,52.80,0.53,0.00,1.00,120.00,-38.40,0 +177.60,57.60,0.51,0.00,1.00,115.20,38.40,0 +177.60,62.40,0.49,0.00,1.00,110.40,-38.40,0 +177.60,67.20,0.47,0.00,1.00,105.60,43.20,0 +177.60,72.00,0.45,0.00,1.00,100.80,-43.20,0 +172.80,76.80,0.43,0.00,1.00,96.00,43.20,0 +168.00,81.60,0.41,0.00,1.00,91.20,-48.00,0 +134.40,86.40,0.38,0.00,1.00,86.40,48.00,0 +19.20,86.40,0.36,0.00,1.00,81.60,-48.00,0 +9.60,81.60,0.34,0.00,1.00,76.80,43.20,0 +4.80,76.80,0.32,0.00,1.00,72.00,-43.20,0 +4.80,72.00,0.30,0.00,1.00,67.20,43.20,0 +4.80,67.20,0.28,0.00,1.00,62.40,-43.20,0 +0.00,62.40,0.26,0.00,1.00,57.60,38.40,0 +0.00,57.60,0.23,0.00,1.00,52.80,-38.40,0 +0.00,52.80,0.21,0.00,1.00,48.00,33.60,0 +0.00,48.00,0.19,0.00,1.00,43.20,-33.60,0 +0.00,43.20,0.17,0.00,1.00,38.40,28.80,0 +0.00,38.40,0.15,0.00,1.00,33.60,-28.80,0 +0.00,33.60,0.13,0.00,1.00,28.80,24.00,0 +0.00,28.80,0.11,0.00,1.00,24.00,-19.20,0 +0.00,24.00,0.09,0.00,1.00,19.20,19.20,0 +0.00,19.20,0.06,0.00,1.00,14.40,-14.40,0 +0.00,14.40,0.04,0.00,1.00,9.60,9.60,0 +0.00,9.60,0.02,0.00,1.00,4.80,-4.80,0 +0.00,4.80,0.00,0.00,1.00,0.00,4.80,0 diff --git a/scripts/testv/stvISM2.csv b/scripts/testv/stvISM2.csv index 35698d046f..f5c6b1f25e 100644 --- a/scripts/testv/stvISM2.csv +++ b/scripts/testv/stvISM2.csv @@ -1,1500 +1,1500 @@ -0.00,4.80,16.00,0.00,1.00,0.00,0.00 -0.00,9.60,15.98,0.00,1.00,-177.60,4.80 -0.00,14.40,15.96,0.00,1.00,4.80,9.60 -0.00,19.20,15.94,0.00,1.00,-168.00,14.40 -0.00,24.00,15.91,0.00,1.00,14.40,19.20 -0.00,28.80,15.89,0.00,1.00,-163.20,24.00 -0.00,33.60,15.87,0.00,1.00,19.20,28.80 -0.00,38.40,15.85,0.00,1.00,-153.60,33.60 -0.00,43.20,15.83,0.00,1.00,28.80,38.40 -0.00,48.00,15.81,0.00,1.00,-148.80,43.20 -0.00,52.80,15.79,0.00,1.00,38.40,48.00 -0.00,57.60,15.77,0.00,1.00,-139.20,52.80 -0.00,62.40,15.74,0.00,1.00,48.00,57.60 -4.80,67.20,15.72,0.00,1.00,-124.80,62.40 -4.80,72.00,15.70,0.00,1.00,57.60,67.20 -4.80,76.80,15.68,0.00,1.00,-115.20,72.00 -9.60,81.60,15.66,0.00,1.00,72.00,76.80 -19.20,86.40,15.64,0.00,1.00,-100.80,81.60 -134.40,86.40,15.62,0.00,1.00,86.40,86.40 -168.00,81.60,15.59,0.00,1.00,-86.40,89.20 -172.80,76.80,15.57,0.00,1.00,100.80,86.40 -177.60,72.00,15.55,0.00,1.00,-76.80,81.60 -177.60,67.20,15.53,0.00,1.00,110.40,76.80 -177.60,62.40,15.51,0.00,1.00,-62.40,72.00 -177.60,57.60,15.49,0.00,1.00,124.80,67.20 -177.60,52.80,15.47,0.00,1.00,-52.80,62.40 -177.60,48.00,15.44,0.00,1.00,134.40,57.60 -177.60,43.20,15.42,0.00,1.00,-38.40,52.80 -177.60,38.40,15.40,0.00,1.00,144.00,48.00 -177.60,33.60,15.38,0.00,1.00,-33.60,43.20 -177.60,28.80,15.36,0.00,1.00,153.60,38.40 -177.60,24.00,15.34,0.00,1.00,-24.00,33.60 -177.60,19.20,15.32,0.00,1.00,158.40,28.80 -177.60,14.40,15.30,0.00,1.00,-14.40,24.00 -177.60,9.60,15.27,0.00,1.00,168.00,19.20 -177.60,4.80,15.25,0.00,1.00,-9.60,14.40 -177.60,0.00,15.23,0.00,1.00,172.80,9.60 --177.60,-0.00,15.21,0.00,1.00,-0.00,4.80 --177.60,-4.80,15.19,0.00,1.00,-177.60,-0.00 --177.60,-9.60,15.17,0.00,1.00,4.80,-4.80 --177.60,-14.40,15.15,0.00,1.00,-172.80,-9.60 --177.60,-19.20,15.12,0.00,1.00,14.40,-14.40 --177.60,-24.00,15.10,0.00,1.00,-163.20,-19.20 --177.60,-28.80,15.08,0.00,1.00,19.20,-24.00 --177.60,-33.60,15.06,0.00,1.00,-158.40,-28.80 --177.60,-38.40,15.04,0.00,1.00,28.80,-33.60 --177.60,-43.20,15.02,0.00,1.00,-148.80,-38.40 --177.60,-48.00,15.00,0.00,1.00,33.60,-48.00 --177.60,-52.80,14.97,0.00,1.00,-139.20,-48.00 --177.60,-57.60,14.95,0.00,1.00,43.20,-52.80 --177.60,-62.40,14.93,0.00,1.00,-129.60,-57.60 --177.60,-67.20,14.91,0.00,1.00,57.60,-62.40 --177.60,-72.00,14.89,0.00,1.00,-120.00,-67.20 --172.80,-76.80,14.87,0.00,1.00,67.20,-76.80 --168.00,-81.60,14.85,0.00,1.00,-105.60,-76.80 --134.40,-86.40,14.83,0.00,1.00,81.60,-86.40 --19.20,-86.40,14.80,0.00,1.00,-91.20,-89.20 --9.60,-81.60,14.78,0.00,1.00,96.00,-86.40 --4.80,-76.80,14.76,0.00,1.00,-76.80,-81.60 --4.80,-72.00,14.74,0.00,1.00,110.40,-76.80 --4.80,-67.20,14.72,0.00,1.00,-67.20,-72.00 --0.00,-62.40,14.70,0.00,1.00,120.00,-67.20 --0.00,-57.60,14.68,0.00,1.00,-52.80,-62.40 --0.00,-52.80,14.65,0.00,1.00,129.60,-57.60 --0.00,-48.00,14.63,0.00,1.00,-43.20,-52.80 --0.00,-43.20,14.61,0.00,1.00,144.00,-48.00 --0.00,-38.40,14.59,0.00,1.00,-33.60,-43.20 --0.00,-33.60,14.57,0.00,1.00,148.80,-38.40 --0.00,-28.80,14.55,0.00,1.00,-24.00,-33.60 --0.00,-24.00,14.53,0.00,1.00,158.40,-28.80 --0.00,-19.20,14.50,0.00,1.00,-19.20,-24.00 --0.00,-14.40,14.48,0.00,1.00,168.00,-19.20 --0.00,-9.60,14.46,0.00,1.00,-9.60,-14.40 --0.00,-4.80,14.44,0.00,1.00,172.80,-9.60 --0.00,0.00,14.42,0.00,1.00,-4.80,-4.80 --0.00,4.80,14.40,0.00,1.00,0.00,0.00 --0.00,9.60,14.38,0.00,1.00,-177.60,4.80 --0.00,14.40,14.36,0.00,1.00,9.60,9.60 --0.00,19.20,14.33,0.00,1.00,-168.00,14.40 --0.00,24.00,14.31,0.00,1.00,14.40,19.20 --0.00,28.80,14.29,0.00,1.00,-163.20,24.00 --0.00,33.60,14.27,0.00,1.00,24.00,28.80 --4.80,38.40,14.25,0.00,1.00,-153.60,33.60 --4.80,43.20,14.23,0.00,1.00,28.80,38.40 --4.80,48.00,14.21,0.00,1.00,-144.00,43.20 --4.80,52.80,14.18,0.00,1.00,38.40,48.00 --4.80,57.60,14.16,0.00,1.00,-134.40,52.80 --4.80,62.40,14.14,0.00,1.00,48.00,57.60 --9.60,67.20,14.12,0.00,1.00,-124.80,62.40 --9.60,72.00,14.10,0.00,1.00,62.40,67.20 --14.40,76.80,14.08,0.00,1.00,-115.20,72.00 --24.00,81.60,14.06,0.00,1.00,72.00,76.80 --43.20,86.40,14.03,0.00,1.00,-100.80,81.60 --110.40,86.40,14.01,0.00,1.00,86.40,86.40 --148.80,81.60,13.99,0.00,1.00,-86.40,86.40 --163.20,76.80,13.97,0.00,1.00,96.00,81.60 --168.00,72.00,13.95,0.00,1.00,-76.80,76.80 --172.80,67.20,13.93,0.00,1.00,110.40,72.00 --172.80,62.40,13.91,0.00,1.00,-62.40,67.20 --172.80,57.60,13.89,0.00,1.00,120.00,62.40 --172.80,52.80,13.86,0.00,1.00,-52.80,57.60 --177.60,48.00,13.84,0.00,1.00,134.40,52.80 --177.60,43.20,13.82,0.00,1.00,-43.20,48.00 --177.60,38.40,13.80,0.00,1.00,144.00,43.20 --177.60,33.60,13.78,0.00,1.00,-33.60,38.40 --177.60,28.80,13.76,0.00,1.00,148.80,33.60 --177.60,24.00,13.74,0.00,1.00,-24.00,28.80 --177.60,19.20,13.71,0.00,1.00,158.40,24.00 --177.60,14.40,13.69,0.00,1.00,-19.20,19.20 --177.60,9.60,13.67,0.00,1.00,168.00,14.40 --177.60,4.80,13.65,0.00,1.00,-9.60,9.60 --177.60,0.00,13.63,0.00,1.00,172.80,4.80 -177.60,-0.00,13.61,0.00,1.00,-0.00,0.00 -177.60,-4.80,13.59,0.00,1.00,-177.60,-0.00 -177.60,-9.60,13.56,0.00,1.00,4.80,-4.80 -177.60,-14.40,13.54,0.00,1.00,-172.80,-9.60 -177.60,-19.20,13.52,0.00,1.00,14.40,-14.40 -177.60,-24.00,13.50,0.00,1.00,-163.20,-19.20 -177.60,-28.80,13.48,0.00,1.00,19.20,-24.00 -177.60,-33.60,13.46,0.00,1.00,-153.60,-28.80 -177.60,-38.40,13.44,0.00,1.00,28.80,-33.60 -177.60,-43.20,13.42,0.00,1.00,-148.80,-38.40 -177.60,-48.00,13.39,0.00,1.00,38.40,-43.20 -172.80,-52.80,13.37,0.00,1.00,-139.20,-48.00 -172.80,-57.60,13.35,0.00,1.00,48.00,-52.80 -172.80,-62.40,13.33,0.00,1.00,-124.80,-57.60 -172.80,-67.20,13.31,0.00,1.00,57.60,-62.40 -168.00,-72.00,13.29,0.00,1.00,-115.20,-67.20 -163.20,-76.80,13.27,0.00,1.00,72.00,-72.00 -148.80,-81.60,13.24,0.00,1.00,-105.60,-76.80 -110.40,-86.40,13.22,0.00,1.00,81.60,-81.60 -43.20,-86.40,13.20,0.00,1.00,-91.20,-86.40 -24.00,-81.60,13.18,0.00,1.00,96.00,-86.40 -14.40,-76.80,13.16,0.00,1.00,-76.80,-81.60 -9.60,-72.00,13.14,0.00,1.00,105.60,-76.80 -9.60,-67.20,13.12,0.00,1.00,-67.20,-72.00 -4.80,-62.40,13.09,0.00,1.00,120.00,-67.20 -4.80,-57.60,13.07,0.00,1.00,-57.60,-62.40 -4.80,-52.80,13.05,0.00,1.00,129.60,-57.60 -4.80,-48.00,13.03,0.00,1.00,-43.20,-52.80 -4.80,-43.20,13.01,0.00,1.00,139.20,-48.00 -4.80,-38.40,12.99,0.00,1.00,-33.60,-43.20 -0.00,-33.60,12.97,0.00,1.00,148.80,-38.40 -0.00,-28.80,12.95,0.00,1.00,-28.80,-33.60 -0.00,-24.00,12.92,0.00,1.00,158.40,-28.80 -0.00,-19.20,12.90,0.00,1.00,-19.20,-24.00 -0.00,-14.40,12.88,0.00,1.00,163.20,-19.20 -0.00,-9.60,12.86,0.00,1.00,-9.60,-14.40 -0.00,-4.80,12.84,0.00,1.00,172.80,-9.60 -0.00,0.00,12.82,0.00,1.00,-4.80,-4.80 --0.00,4.80,12.80,0.00,1.00,0.00,0.00 --0.00,9.60,12.77,0.00,1.00,-177.60,4.80 --0.00,14.40,12.75,0.00,1.00,9.60,9.60 --4.80,19.20,12.73,0.00,1.00,-168.00,14.40 --4.80,24.00,12.71,0.00,1.00,14.40,19.20 --4.80,28.80,12.69,0.00,1.00,-158.40,24.00 --4.80,33.60,12.67,0.00,1.00,24.00,28.80 --4.80,38.40,12.65,0.00,1.00,-153.60,33.60 --9.60,43.20,12.62,0.00,1.00,33.60,38.40 --9.60,48.00,12.60,0.00,1.00,-144.00,43.20 --9.60,52.80,12.58,0.00,1.00,43.20,48.00 --14.40,57.60,12.56,0.00,1.00,-134.40,52.80 --14.40,62.40,12.54,0.00,1.00,52.80,57.60 --19.20,67.20,12.52,0.00,1.00,-124.80,62.40 --24.00,72.00,12.50,0.00,1.00,62.40,67.20 --33.60,72.00,12.48,0.00,1.00,-110.40,72.00 --43.20,76.80,12.45,0.00,1.00,72.00,72.00 --67.20,81.60,12.43,0.00,1.00,-100.80,76.80 --96.00,81.60,12.41,0.00,1.00,86.40,81.60 --124.80,81.60,12.39,0.00,1.00,-86.40,81.60 --144.00,76.80,12.37,0.00,1.00,96.00,76.80 --153.60,72.00,12.35,0.00,1.00,-76.80,76.80 --158.40,67.20,12.33,0.00,1.00,110.40,72.00 --163.20,62.40,12.30,0.00,1.00,-67.20,67.20 --168.00,57.60,12.28,0.00,1.00,120.00,62.40 --168.00,52.80,12.26,0.00,1.00,-52.80,57.60 --168.00,48.00,12.24,0.00,1.00,129.60,52.80 --172.80,43.20,12.22,0.00,1.00,-43.20,48.00 --172.80,38.40,12.20,0.00,1.00,139.20,43.20 --172.80,33.60,12.18,0.00,1.00,-33.60,38.40 --172.80,28.80,12.15,0.00,1.00,148.80,33.60 --177.60,24.00,12.13,0.00,1.00,-24.00,28.80 --177.60,19.20,12.11,0.00,1.00,158.40,24.00 --177.60,14.40,12.09,0.00,1.00,-19.20,19.20 --177.60,9.60,12.07,0.00,1.00,168.00,14.40 --177.60,4.80,12.05,0.00,1.00,-9.60,9.60 --177.60,0.00,12.03,0.00,1.00,172.80,4.80 -177.60,-0.00,12.01,0.00,1.00,-0.00,0.00 -177.60,-4.80,11.98,0.00,1.00,-177.60,-0.00 -177.60,-9.60,11.96,0.00,1.00,4.80,-4.80 -177.60,-14.40,11.94,0.00,1.00,-168.00,-9.60 -177.60,-19.20,11.92,0.00,1.00,14.40,-14.40 -177.60,-24.00,11.90,0.00,1.00,-163.20,-19.20 -172.80,-28.80,11.88,0.00,1.00,24.00,-24.00 -172.80,-33.60,11.86,0.00,1.00,-153.60,-28.80 -172.80,-38.40,11.83,0.00,1.00,28.80,-33.60 -172.80,-43.20,11.81,0.00,1.00,-144.00,-38.40 -168.00,-48.00,11.79,0.00,1.00,38.40,-43.20 -168.00,-52.80,11.77,0.00,1.00,-134.40,-48.00 -168.00,-57.60,11.75,0.00,1.00,48.00,-52.80 -163.20,-62.40,11.73,0.00,1.00,-124.80,-57.60 -158.40,-67.20,11.71,0.00,1.00,62.40,-62.40 -153.60,-72.00,11.68,0.00,1.00,-115.20,-67.20 -144.00,-76.80,11.66,0.00,1.00,72.00,-72.00 -124.80,-81.60,11.64,0.00,1.00,-100.80,-76.80 -96.00,-81.60,11.62,0.00,1.00,81.60,-76.80 -67.20,-81.60,11.60,0.00,1.00,-91.20,-81.60 -43.20,-76.80,11.58,0.00,1.00,96.00,-81.60 -33.60,-72.00,11.56,0.00,1.00,-81.60,-76.80 -24.00,-72.00,11.54,0.00,1.00,105.60,-72.00 -19.20,-67.20,11.51,0.00,1.00,-67.20,-72.00 -14.40,-62.40,11.49,0.00,1.00,115.20,-67.20 -14.40,-57.60,11.47,0.00,1.00,-57.60,-62.40 -9.60,-52.80,11.45,0.00,1.00,129.60,-57.60 -9.60,-48.00,11.43,0.00,1.00,-48.00,-52.80 -9.60,-43.20,11.41,0.00,1.00,139.20,-48.00 -4.80,-38.40,11.39,0.00,1.00,-38.40,-43.20 -4.80,-33.60,11.36,0.00,1.00,148.80,-38.40 -4.80,-28.80,11.34,0.00,1.00,-28.80,-33.60 -4.80,-24.00,11.32,0.00,1.00,153.60,-28.80 -4.80,-19.20,11.30,0.00,1.00,-19.20,-24.00 -0.00,-14.40,11.28,0.00,1.00,163.20,-19.20 -0.00,-9.60,11.26,0.00,1.00,-9.60,-14.40 -0.00,-4.80,11.24,0.00,1.00,172.80,-9.60 -0.00,0.00,11.21,0.00,1.00,-4.80,-4.80 --0.00,4.80,11.19,0.00,1.00,0.00,0.00 --0.00,9.60,11.17,0.00,1.00,-177.60,4.80 --4.80,14.40,11.15,0.00,1.00,9.60,9.60 --4.80,19.20,11.13,0.00,1.00,-168.00,14.40 --4.80,24.00,11.11,0.00,1.00,14.40,19.20 --4.80,28.80,11.09,0.00,1.00,-158.40,24.00 --9.60,33.60,11.07,0.00,1.00,24.00,28.80 --9.60,38.40,11.04,0.00,1.00,-148.80,33.60 --14.40,43.20,11.02,0.00,1.00,33.60,38.40 --14.40,48.00,11.00,0.00,1.00,-139.20,43.20 --14.40,52.80,10.98,0.00,1.00,43.20,48.00 --19.20,57.60,10.96,0.00,1.00,-129.60,52.80 --24.00,57.60,10.94,0.00,1.00,52.80,52.80 --28.80,62.40,10.92,0.00,1.00,-120.00,57.60 --33.60,67.20,10.89,0.00,1.00,62.40,62.40 --43.20,72.00,10.87,0.00,1.00,-110.40,67.20 --57.60,72.00,10.85,0.00,1.00,76.80,72.00 --76.80,76.80,10.83,0.00,1.00,-100.80,72.00 --96.00,76.80,10.81,0.00,1.00,86.40,76.80 --115.20,76.80,10.79,0.00,1.00,-86.40,76.80 --129.60,72.00,10.77,0.00,1.00,96.00,76.80 --139.20,72.00,10.74,0.00,1.00,-76.80,72.00 --148.80,67.20,10.72,0.00,1.00,105.60,67.20 --153.60,62.40,10.70,0.00,1.00,-67.20,67.20 --158.40,57.60,10.68,0.00,1.00,120.00,62.40 --163.20,52.80,10.66,0.00,1.00,-57.60,57.60 --163.20,48.00,10.64,0.00,1.00,129.60,52.80 --168.00,43.20,10.62,0.00,1.00,-48.00,48.00 --168.00,38.40,10.60,0.00,1.00,139.20,43.20 --172.80,33.60,10.57,0.00,1.00,-38.40,38.40 --172.80,28.80,10.55,0.00,1.00,148.80,33.60 --172.80,24.00,10.53,0.00,1.00,-28.80,28.80 --172.80,19.20,10.51,0.00,1.00,158.40,24.00 --177.60,14.40,10.49,0.00,1.00,-19.20,19.20 --177.60,9.60,10.47,0.00,1.00,163.20,14.40 --177.60,4.80,10.45,0.00,1.00,-9.60,9.60 --177.60,0.00,10.42,0.00,1.00,172.80,4.80 -177.60,-0.00,10.40,0.00,1.00,-0.00,0.00 -177.60,-4.80,10.38,0.00,1.00,-177.60,-0.00 -177.60,-9.60,10.36,0.00,1.00,4.80,-4.80 -177.60,-14.40,10.34,0.00,1.00,-168.00,-9.60 -172.80,-19.20,10.32,0.00,1.00,14.40,-14.40 -172.80,-24.00,10.30,0.00,1.00,-163.20,-19.20 -172.80,-28.80,10.28,0.00,1.00,24.00,-24.00 -172.80,-33.60,10.25,0.00,1.00,-153.60,-28.80 -168.00,-38.40,10.23,0.00,1.00,33.60,-33.60 -168.00,-43.20,10.21,0.00,1.00,-144.00,-38.40 -163.20,-48.00,10.19,0.00,1.00,43.20,-43.20 -163.20,-52.80,10.17,0.00,1.00,-134.40,-48.00 -158.40,-57.60,10.15,0.00,1.00,52.80,-52.80 -153.60,-62.40,10.13,0.00,1.00,-124.80,-57.60 -148.80,-67.20,10.10,0.00,1.00,62.40,-62.40 -139.20,-72.00,10.08,0.00,1.00,-115.20,-67.20 -129.60,-72.00,10.06,0.00,1.00,72.00,-67.20 -115.20,-76.80,10.04,0.00,1.00,-100.80,-72.00 -96.00,-76.80,10.02,0.00,1.00,81.60,-76.80 -76.80,-76.80,10.00,0.00,1.00,-91.20,-76.80 -57.60,-72.00,9.98,0.00,1.00,96.00,-76.80 -43.20,-72.00,9.95,0.00,1.00,-81.60,-72.00 -33.60,-67.20,9.93,0.00,1.00,105.60,-72.00 -28.80,-62.40,9.91,0.00,1.00,-67.20,-67.20 -24.00,-57.60,9.89,0.00,1.00,115.20,-62.40 -19.20,-57.60,9.87,0.00,1.00,-57.60,-57.60 -14.40,-52.80,9.85,0.00,1.00,124.80,-52.80 -14.40,-48.00,9.83,0.00,1.00,-48.00,-52.80 -14.40,-43.20,9.81,0.00,1.00,134.40,-48.00 -9.60,-38.40,9.78,0.00,1.00,-38.40,-43.20 -9.60,-33.60,9.76,0.00,1.00,144.00,-38.40 -4.80,-28.80,9.74,0.00,1.00,-28.80,-33.60 -4.80,-24.00,9.72,0.00,1.00,153.60,-28.80 -4.80,-19.20,9.70,0.00,1.00,-19.20,-24.00 -4.80,-14.40,9.68,0.00,1.00,163.20,-19.20 -0.00,-9.60,9.66,0.00,1.00,-14.40,-14.40 -0.00,-4.80,9.63,0.00,1.00,172.80,-9.60 -0.00,0.00,9.61,0.00,1.00,-4.80,-4.80 --0.00,4.80,9.59,0.00,1.00,0.00,0.00 --4.80,9.60,9.57,0.00,1.00,-177.60,4.80 --4.80,14.40,9.55,0.00,1.00,9.60,9.60 --4.80,19.20,9.53,0.00,1.00,-168.00,14.40 --9.60,24.00,9.51,0.00,1.00,19.20,19.20 --9.60,28.80,9.48,0.00,1.00,-158.40,24.00 --9.60,33.60,9.46,0.00,1.00,24.00,28.80 --14.40,38.40,9.44,0.00,1.00,-148.80,33.60 --14.40,38.40,9.42,0.00,1.00,33.60,33.60 --19.20,43.20,9.40,0.00,1.00,-139.20,38.40 --24.00,48.00,9.38,0.00,1.00,43.20,43.20 --24.00,52.80,9.36,0.00,1.00,-129.60,48.00 --28.80,57.60,9.34,0.00,1.00,52.80,52.80 --38.40,62.40,9.31,0.00,1.00,-120.00,57.60 --43.20,62.40,9.29,0.00,1.00,67.20,62.40 --52.80,67.20,9.27,0.00,1.00,-110.40,62.40 --62.40,72.00,9.25,0.00,1.00,76.80,67.20 --76.80,72.00,9.23,0.00,1.00,-100.80,67.20 --96.00,72.00,9.21,0.00,1.00,86.40,72.00 --110.40,72.00,9.19,0.00,1.00,-86.40,72.00 --120.00,67.20,9.16,0.00,1.00,96.00,72.00 --134.40,67.20,9.14,0.00,1.00,-76.80,67.20 --139.20,62.40,9.12,0.00,1.00,105.60,67.20 --148.80,57.60,9.10,0.00,1.00,-67.20,62.40 --153.60,57.60,9.08,0.00,1.00,115.20,57.60 --158.40,52.80,9.06,0.00,1.00,-57.60,52.80 --158.40,48.00,9.04,0.00,1.00,129.60,52.80 --163.20,43.20,9.01,0.00,1.00,-48.00,48.00 --163.20,38.40,8.99,0.00,1.00,139.20,43.20 --168.00,33.60,8.97,0.00,1.00,-38.40,38.40 --168.00,28.80,8.95,0.00,1.00,148.80,33.60 --172.80,24.00,8.93,0.00,1.00,-28.80,28.80 --172.80,19.20,8.91,0.00,1.00,153.60,24.00 --172.80,14.40,8.89,0.00,1.00,-19.20,19.20 --177.60,9.60,8.87,0.00,1.00,163.20,14.40 --177.60,4.80,8.84,0.00,1.00,-9.60,9.60 --177.60,0.00,8.82,0.00,1.00,172.80,4.80 -177.60,-0.00,8.80,0.00,1.00,-0.00,0.00 -177.60,-4.80,8.78,0.00,1.00,-177.60,-0.00 -177.60,-9.60,8.76,0.00,1.00,4.80,-4.80 -172.80,-14.40,8.74,0.00,1.00,-168.00,-9.60 -172.80,-19.20,8.72,0.00,1.00,14.40,-14.40 -172.80,-24.00,8.69,0.00,1.00,-158.40,-19.20 -168.00,-28.80,8.67,0.00,1.00,24.00,-24.00 -168.00,-33.60,8.65,0.00,1.00,-153.60,-28.80 -163.20,-38.40,8.63,0.00,1.00,33.60,-33.60 -163.20,-43.20,8.61,0.00,1.00,-144.00,-38.40 -158.40,-48.00,8.59,0.00,1.00,43.20,-43.20 -158.40,-52.80,8.57,0.00,1.00,-134.40,-48.00 -153.60,-57.60,8.54,0.00,1.00,52.80,-52.80 -148.80,-57.60,8.52,0.00,1.00,-124.80,-52.80 -139.20,-62.40,8.50,0.00,1.00,62.40,-57.60 -134.40,-67.20,8.48,0.00,1.00,-110.40,-62.40 -120.00,-67.20,8.46,0.00,1.00,72.00,-67.20 -110.40,-72.00,8.44,0.00,1.00,-100.80,-67.20 -96.00,-72.00,8.42,0.00,1.00,81.60,-72.00 -76.80,-72.00,8.40,0.00,1.00,-91.20,-72.00 -62.40,-72.00,8.37,0.00,1.00,96.00,-72.00 -52.80,-67.20,8.35,0.00,1.00,-81.60,-67.20 -43.20,-62.40,8.33,0.00,1.00,105.60,-67.20 -38.40,-62.40,8.31,0.00,1.00,-72.00,-62.40 -28.80,-57.60,8.29,0.00,1.00,115.20,-62.40 -24.00,-52.80,8.27,0.00,1.00,-57.60,-57.60 -24.00,-48.00,8.25,0.00,1.00,124.80,-52.80 -19.20,-43.20,8.22,0.00,1.00,-48.00,-48.00 -14.40,-38.40,8.20,0.00,1.00,134.40,-43.20 -14.40,-38.40,8.18,0.00,1.00,-38.40,-38.40 -9.60,-33.60,8.16,0.00,1.00,144.00,-33.60 -9.60,-28.80,8.14,0.00,1.00,-28.80,-33.60 -9.60,-24.00,8.12,0.00,1.00,153.60,-28.80 -4.80,-19.20,8.10,0.00,1.00,-24.00,-24.00 -4.80,-14.40,8.07,0.00,1.00,163.20,-19.20 -4.80,-9.60,8.05,0.00,1.00,-14.40,-14.40 -0.00,-4.80,8.03,0.00,1.00,172.80,-9.60 -0.00,0.00,8.01,0.00,1.00,-4.80,-4.80 --0.00,4.80,7.99,0.00,1.00,0.00,0.00 --4.80,9.60,7.97,0.00,1.00,-177.60,4.80 --4.80,14.40,7.95,0.00,1.00,9.60,9.60 --9.60,19.20,7.93,0.00,1.00,-168.00,14.40 --9.60,24.00,7.90,0.00,1.00,19.20,19.20 --14.40,24.00,7.88,0.00,1.00,-158.40,24.00 --14.40,28.80,7.86,0.00,1.00,28.80,24.00 --19.20,33.60,7.84,0.00,1.00,-148.80,28.80 --19.20,38.40,7.82,0.00,1.00,38.40,33.60 --24.00,43.20,7.80,0.00,1.00,-139.20,38.40 --28.80,48.00,7.78,0.00,1.00,48.00,43.20 --33.60,52.80,7.75,0.00,1.00,-129.60,48.00 --38.40,52.80,7.73,0.00,1.00,57.60,52.80 --43.20,57.60,7.71,0.00,1.00,-120.00,52.80 --48.00,62.40,7.69,0.00,1.00,67.20,57.60 --57.60,62.40,7.67,0.00,1.00,-110.40,62.40 --67.20,67.20,7.65,0.00,1.00,76.80,62.40 --81.60,67.20,7.63,0.00,1.00,-100.80,62.40 --91.20,67.20,7.60,0.00,1.00,86.40,67.20 --105.60,67.20,7.58,0.00,1.00,-86.40,67.20 --115.20,67.20,7.56,0.00,1.00,96.00,67.20 --124.80,62.40,7.54,0.00,1.00,-76.80,62.40 --134.40,57.60,7.52,0.00,1.00,105.60,62.40 --139.20,57.60,7.50,0.00,1.00,-67.20,57.60 --144.00,52.80,7.48,0.00,1.00,115.20,57.60 --148.80,48.00,7.46,0.00,1.00,-57.60,52.80 --153.60,43.20,7.43,0.00,1.00,124.80,48.00 --158.40,43.20,7.41,0.00,1.00,-48.00,43.20 --163.20,38.40,7.39,0.00,1.00,134.40,38.40 --163.20,33.60,7.37,0.00,1.00,-38.40,38.40 --168.00,28.80,7.35,0.00,1.00,144.00,33.60 --168.00,24.00,7.33,0.00,1.00,-28.80,28.80 --172.80,19.20,7.31,0.00,1.00,153.60,24.00 --172.80,14.40,7.28,0.00,1.00,-19.20,19.20 --177.60,9.60,7.26,0.00,1.00,163.20,14.40 --177.60,4.80,7.24,0.00,1.00,-9.60,9.60 --177.60,0.00,7.22,0.00,1.00,172.80,4.80 -177.60,-0.00,7.20,0.00,1.00,-0.00,0.00 -177.60,-4.80,7.18,0.00,1.00,-177.60,-0.00 -177.60,-9.60,7.16,0.00,1.00,4.80,-4.80 -172.80,-14.40,7.13,0.00,1.00,-168.00,-9.60 -172.80,-19.20,7.11,0.00,1.00,14.40,-14.40 -168.00,-24.00,7.09,0.00,1.00,-158.40,-19.20 -168.00,-28.80,7.07,0.00,1.00,24.00,-24.00 -163.20,-33.60,7.05,0.00,1.00,-148.80,-28.80 -163.20,-38.40,7.03,0.00,1.00,33.60,-33.60 -158.40,-43.20,7.01,0.00,1.00,-139.20,-38.40 -153.60,-43.20,6.99,0.00,1.00,43.20,-38.40 -148.80,-48.00,6.96,0.00,1.00,-129.60,-43.20 -144.00,-52.80,6.94,0.00,1.00,52.80,-48.00 -139.20,-57.60,6.92,0.00,1.00,-120.00,-52.80 -134.40,-57.60,6.90,0.00,1.00,62.40,-57.60 -124.80,-62.40,6.88,0.00,1.00,-110.40,-57.60 -115.20,-67.20,6.86,0.00,1.00,72.00,-62.40 -105.60,-67.20,6.84,0.00,1.00,-100.80,-62.40 -91.20,-67.20,6.81,0.00,1.00,81.60,-67.20 -81.60,-67.20,6.79,0.00,1.00,-91.20,-67.20 -67.20,-67.20,6.77,0.00,1.00,96.00,-67.20 -57.60,-62.40,6.75,0.00,1.00,-81.60,-62.40 -48.00,-62.40,6.73,0.00,1.00,105.60,-62.40 -43.20,-57.60,6.71,0.00,1.00,-72.00,-62.40 -38.40,-52.80,6.69,0.00,1.00,115.20,-57.60 -33.60,-52.80,6.66,0.00,1.00,-62.40,-52.80 -28.80,-48.00,6.64,0.00,1.00,124.80,-52.80 -24.00,-43.20,6.62,0.00,1.00,-52.80,-48.00 -19.20,-38.40,6.60,0.00,1.00,134.40,-43.20 -19.20,-33.60,6.58,0.00,1.00,-43.20,-38.40 -14.40,-28.80,6.56,0.00,1.00,144.00,-33.60 -14.40,-24.00,6.54,0.00,1.00,-33.60,-28.80 -9.60,-24.00,6.52,0.00,1.00,153.60,-24.00 -9.60,-19.20,6.49,0.00,1.00,-24.00,-24.00 -4.80,-14.40,6.47,0.00,1.00,163.20,-19.20 -4.80,-9.60,6.45,0.00,1.00,-14.40,-14.40 -0.00,-4.80,6.43,0.00,1.00,172.80,-9.60 -0.00,0.00,6.41,0.00,1.00,-4.80,-4.80 --0.00,4.80,6.39,0.00,1.00,0.00,0.00 --4.80,9.60,6.37,0.00,1.00,-177.60,4.80 --4.80,14.40,6.34,0.00,1.00,9.60,9.60 --9.60,19.20,6.32,0.00,1.00,-168.00,14.40 --9.60,19.20,6.30,0.00,1.00,19.20,14.40 --14.40,24.00,6.28,0.00,1.00,-158.40,19.20 --19.20,28.80,6.26,0.00,1.00,28.80,24.00 --19.20,33.60,6.24,0.00,1.00,-148.80,28.80 --24.00,38.40,6.22,0.00,1.00,38.40,33.60 --28.80,43.20,6.19,0.00,1.00,-139.20,38.40 --33.60,43.20,6.17,0.00,1.00,48.00,38.40 --38.40,48.00,6.15,0.00,1.00,-129.60,43.20 --43.20,52.80,6.13,0.00,1.00,57.60,48.00 --48.00,52.80,6.11,0.00,1.00,-120.00,52.80 --52.80,57.60,6.09,0.00,1.00,67.20,52.80 --62.40,57.60,6.07,0.00,1.00,-110.40,57.60 --72.00,62.40,6.05,0.00,1.00,76.80,57.60 --81.60,62.40,6.02,0.00,1.00,-100.80,62.40 --91.20,62.40,6.00,0.00,1.00,86.40,62.40 --100.80,62.40,5.98,0.00,1.00,-86.40,62.40 --110.40,62.40,5.96,0.00,1.00,96.00,62.40 --120.00,57.60,5.94,0.00,1.00,-76.80,57.60 --129.60,57.60,5.92,0.00,1.00,105.60,57.60 --134.40,52.80,5.90,0.00,1.00,-67.20,57.60 --139.20,48.00,5.87,0.00,1.00,115.20,52.80 --144.00,48.00,5.85,0.00,1.00,-57.60,48.00 --148.80,43.20,5.83,0.00,1.00,124.80,48.00 --153.60,38.40,5.81,0.00,1.00,-48.00,43.20 --158.40,33.60,5.79,0.00,1.00,134.40,38.40 --163.20,33.60,5.77,0.00,1.00,-38.40,33.60 --163.20,28.80,5.75,0.00,1.00,144.00,28.80 --168.00,24.00,5.72,0.00,1.00,-28.80,28.80 --168.00,19.20,5.70,0.00,1.00,153.60,24.00 --172.80,14.40,5.68,0.00,1.00,-19.20,19.20 --172.80,9.60,5.66,0.00,1.00,163.20,14.40 --177.60,4.80,5.64,0.00,1.00,-9.60,9.60 --177.60,0.00,5.62,0.00,1.00,172.80,4.80 -177.60,-0.00,5.60,0.00,1.00,-0.00,0.00 -177.60,-4.80,5.58,0.00,1.00,-177.60,-0.00 -172.80,-9.60,5.55,0.00,1.00,4.80,-4.80 -172.80,-14.40,5.53,0.00,1.00,-168.00,-9.60 -168.00,-19.20,5.51,0.00,1.00,14.40,-14.40 -168.00,-24.00,5.49,0.00,1.00,-158.40,-19.20 -163.20,-28.80,5.47,0.00,1.00,24.00,-24.00 -163.20,-33.60,5.45,0.00,1.00,-148.80,-28.80 -158.40,-33.60,5.43,0.00,1.00,33.60,-28.80 -153.60,-38.40,5.40,0.00,1.00,-139.20,-33.60 -148.80,-43.20,5.38,0.00,1.00,43.20,-38.40 -144.00,-48.00,5.36,0.00,1.00,-129.60,-43.20 -139.20,-48.00,5.34,0.00,1.00,52.80,-48.00 -134.40,-52.80,5.32,0.00,1.00,-120.00,-48.00 -129.60,-57.60,5.30,0.00,1.00,62.40,-52.80 -120.00,-57.60,5.28,0.00,1.00,-110.40,-57.60 -110.40,-62.40,5.26,0.00,1.00,72.00,-57.60 -100.80,-62.40,5.23,0.00,1.00,-100.80,-57.60 -91.20,-62.40,5.21,0.00,1.00,81.60,-62.40 -81.60,-62.40,5.19,0.00,1.00,-91.20,-62.40 -72.00,-62.40,5.17,0.00,1.00,96.00,-62.40 -62.40,-57.60,5.15,0.00,1.00,-81.60,-62.40 -52.80,-57.60,5.13,0.00,1.00,105.60,-57.60 -48.00,-52.80,5.11,0.00,1.00,-72.00,-57.60 -43.20,-52.80,5.08,0.00,1.00,115.20,-52.80 -38.40,-48.00,5.06,0.00,1.00,-62.40,-52.80 -33.60,-43.20,5.04,0.00,1.00,124.80,-48.00 -28.80,-43.20,5.02,0.00,1.00,-52.80,-43.20 -24.00,-38.40,5.00,0.00,1.00,134.40,-38.40 -19.20,-33.60,4.98,0.00,1.00,-43.20,-38.40 -19.20,-28.80,4.96,0.00,1.00,144.00,-33.60 -14.40,-24.00,4.93,0.00,1.00,-33.60,-28.80 -9.60,-19.20,4.91,0.00,1.00,153.60,-24.00 -9.60,-19.20,4.89,0.00,1.00,-24.00,-19.20 -4.80,-14.40,4.87,0.00,1.00,163.20,-14.40 -4.80,-9.60,4.85,0.00,1.00,-14.40,-14.40 -0.00,-4.80,4.83,0.00,1.00,172.80,-9.60 -0.00,0.00,4.81,0.00,1.00,-4.80,-4.80 --4.80,4.80,4.79,0.00,1.00,0.00,0.00 --4.80,9.60,4.76,0.00,1.00,-177.60,4.80 --9.60,14.40,4.74,0.00,1.00,9.60,9.60 --9.60,14.40,4.72,0.00,1.00,-168.00,9.60 --14.40,19.20,4.70,0.00,1.00,19.20,14.40 --14.40,24.00,4.68,0.00,1.00,-158.40,19.20 --19.20,28.80,4.66,0.00,1.00,28.80,24.00 --24.00,33.60,4.64,0.00,1.00,-148.80,28.80 --28.80,33.60,4.61,0.00,1.00,38.40,28.80 --28.80,38.40,4.59,0.00,1.00,-139.20,33.60 --33.60,43.20,4.57,0.00,1.00,48.00,38.40 --38.40,43.20,4.55,0.00,1.00,-129.60,43.20 --48.00,48.00,4.53,0.00,1.00,57.60,43.20 --52.80,52.80,4.51,0.00,1.00,-120.00,48.00 --57.60,52.80,4.49,0.00,1.00,67.20,48.00 --67.20,57.60,4.46,0.00,1.00,-110.40,52.80 --76.80,57.60,4.44,0.00,1.00,76.80,52.80 --81.60,57.60,4.42,0.00,1.00,-100.80,57.60 --91.20,57.60,4.40,0.00,1.00,86.40,57.60 --100.80,57.60,4.38,0.00,1.00,-86.40,57.60 --110.40,57.60,4.36,0.00,1.00,96.00,57.60 --115.20,52.80,4.34,0.00,1.00,-76.80,52.80 --124.80,52.80,4.32,0.00,1.00,105.60,52.80 --129.60,48.00,4.29,0.00,1.00,-67.20,52.80 --139.20,48.00,4.27,0.00,1.00,115.20,48.00 --144.00,43.20,4.25,0.00,1.00,-57.60,48.00 --148.80,38.40,4.23,0.00,1.00,124.80,43.20 --153.60,38.40,4.21,0.00,1.00,-48.00,38.40 --153.60,33.60,4.19,0.00,1.00,134.40,38.40 --158.40,28.80,4.17,0.00,1.00,-38.40,33.60 --163.20,24.00,4.14,0.00,1.00,144.00,28.80 --163.20,24.00,4.12,0.00,1.00,-28.80,24.00 --168.00,19.20,4.10,0.00,1.00,153.60,24.00 --172.80,14.40,4.08,0.00,1.00,-19.20,19.20 --172.80,9.60,4.06,0.00,1.00,163.20,14.40 --177.60,4.80,4.04,0.00,1.00,-9.60,9.60 --177.60,0.00,4.02,0.00,1.00,172.80,4.80 -177.60,-0.00,3.99,0.00,1.00,-0.00,0.00 -177.60,-4.80,3.97,0.00,1.00,-177.60,-0.00 -172.80,-9.60,3.95,0.00,1.00,4.80,-4.80 -172.80,-14.40,3.93,0.00,1.00,-168.00,-9.60 -168.00,-19.20,3.91,0.00,1.00,14.40,-14.40 -163.20,-24.00,3.89,0.00,1.00,-158.40,-19.20 -163.20,-24.00,3.87,0.00,1.00,24.00,-24.00 -158.40,-28.80,3.85,0.00,1.00,-148.80,-24.00 -153.60,-33.60,3.82,0.00,1.00,33.60,-28.80 -153.60,-38.40,3.80,0.00,1.00,-139.20,-33.60 -148.80,-38.40,3.78,0.00,1.00,43.20,-38.40 -144.00,-43.20,3.76,0.00,1.00,-129.60,-38.40 -139.20,-48.00,3.74,0.00,1.00,52.80,-43.20 -129.60,-48.00,3.72,0.00,1.00,-120.00,-48.00 -124.80,-52.80,3.70,0.00,1.00,62.40,-48.00 -115.20,-52.80,3.67,0.00,1.00,-110.40,-52.80 -110.40,-57.60,3.65,0.00,1.00,72.00,-52.80 -100.80,-57.60,3.63,0.00,1.00,-100.80,-52.80 -91.20,-57.60,3.61,0.00,1.00,81.60,-57.60 -81.60,-57.60,3.59,0.00,1.00,-91.20,-57.60 -76.80,-57.60,3.57,0.00,1.00,96.00,-57.60 -67.20,-57.60,3.55,0.00,1.00,-81.60,-57.60 -57.60,-52.80,3.52,0.00,1.00,105.60,-52.80 -52.80,-52.80,3.50,0.00,1.00,-72.00,-52.80 -48.00,-48.00,3.48,0.00,1.00,115.20,-48.00 -38.40,-43.20,3.46,0.00,1.00,-62.40,-48.00 -33.60,-43.20,3.44,0.00,1.00,124.80,-43.20 -28.80,-38.40,3.42,0.00,1.00,-52.80,-43.20 -28.80,-33.60,3.40,0.00,1.00,134.40,-38.40 -24.00,-33.60,3.38,0.00,1.00,-43.20,-33.60 -19.20,-28.80,3.35,0.00,1.00,144.00,-28.80 -14.40,-24.00,3.33,0.00,1.00,-33.60,-28.80 -14.40,-19.20,3.31,0.00,1.00,153.60,-24.00 -9.60,-14.40,3.29,0.00,1.00,-24.00,-19.20 -9.60,-14.40,3.27,0.00,1.00,163.20,-14.40 -4.80,-9.60,3.25,0.00,1.00,-14.40,-9.60 -4.80,-4.80,3.23,0.00,1.00,172.80,-9.60 -0.00,0.00,3.20,0.00,1.00,-4.80,-4.80 --4.80,4.80,3.18,0.00,1.00,0.00,0.00 --4.80,9.60,3.16,0.00,1.00,-177.60,4.80 --9.60,9.60,3.14,0.00,1.00,9.60,9.60 --9.60,14.40,3.12,0.00,1.00,-168.00,9.60 --14.40,19.20,3.10,0.00,1.00,19.20,14.40 --19.20,24.00,3.08,0.00,1.00,-158.40,19.20 --24.00,24.00,3.05,0.00,1.00,28.80,24.00 --24.00,28.80,3.03,0.00,1.00,-148.80,24.00 --28.80,33.60,3.01,0.00,1.00,38.40,28.80 --33.60,38.40,2.99,0.00,1.00,-139.20,33.60 --38.40,38.40,2.97,0.00,1.00,48.00,33.60 --43.20,43.20,2.95,0.00,1.00,-129.60,38.40 --48.00,43.20,2.93,0.00,1.00,57.60,43.20 --52.80,48.00,2.91,0.00,1.00,-120.00,43.20 --62.40,48.00,2.88,0.00,1.00,67.20,48.00 --67.20,52.80,2.86,0.00,1.00,-110.40,48.00 --76.80,52.80,2.84,0.00,1.00,76.80,48.00 --86.40,52.80,2.82,0.00,1.00,-100.80,52.80 --91.20,52.80,2.80,0.00,1.00,86.40,52.80 --100.80,52.80,2.78,0.00,1.00,-86.40,52.80 --105.60,52.80,2.76,0.00,1.00,96.00,52.80 --115.20,48.00,2.73,0.00,1.00,-76.80,48.00 --120.00,48.00,2.71,0.00,1.00,105.60,48.00 --129.60,48.00,2.69,0.00,1.00,-67.20,48.00 --134.40,43.20,2.67,0.00,1.00,115.20,43.20 --139.20,43.20,2.65,0.00,1.00,-57.60,43.20 --144.00,38.40,2.63,0.00,1.00,124.80,38.40 --148.80,33.60,2.61,0.00,1.00,-48.00,38.40 --153.60,33.60,2.58,0.00,1.00,134.40,33.60 --158.40,28.80,2.56,0.00,1.00,-38.40,28.80 --158.40,24.00,2.54,0.00,1.00,144.00,28.80 --163.20,19.20,2.52,0.00,1.00,-28.80,24.00 --168.00,19.20,2.50,0.00,1.00,153.60,19.20 --168.00,14.40,2.48,0.00,1.00,-19.20,14.40 --172.80,9.60,2.46,0.00,1.00,163.20,14.40 --177.60,4.80,2.44,0.00,1.00,-9.60,9.60 --177.60,0.00,2.41,0.00,1.00,172.80,4.80 -177.60,-0.00,2.39,0.00,1.00,-0.00,0.00 -177.60,-4.80,2.37,0.00,1.00,-177.60,-0.00 -172.80,-9.60,2.35,0.00,1.00,4.80,-4.80 -168.00,-14.40,2.33,0.00,1.00,-168.00,-9.60 -168.00,-19.20,2.31,0.00,1.00,14.40,-14.40 -163.20,-19.20,2.29,0.00,1.00,-158.40,-14.40 -158.40,-24.00,2.26,0.00,1.00,24.00,-19.20 -158.40,-28.80,2.24,0.00,1.00,-148.80,-24.00 -153.60,-33.60,2.22,0.00,1.00,33.60,-28.80 -148.80,-33.60,2.20,0.00,1.00,-139.20,-28.80 -144.00,-38.40,2.18,0.00,1.00,43.20,-33.60 -139.20,-43.20,2.16,0.00,1.00,-129.60,-38.40 -134.40,-43.20,2.14,0.00,1.00,52.80,-38.40 -129.60,-48.00,2.11,0.00,1.00,-120.00,-43.20 -120.00,-48.00,2.09,0.00,1.00,62.40,-43.20 -115.20,-48.00,2.07,0.00,1.00,-110.40,-48.00 -105.60,-52.80,2.05,0.00,1.00,72.00,-48.00 -100.80,-52.80,2.03,0.00,1.00,-100.80,-48.00 -91.20,-52.80,2.01,0.00,1.00,81.60,-52.80 -86.40,-52.80,1.99,0.00,1.00,-91.20,-52.80 -76.80,-52.80,1.97,0.00,1.00,96.00,-52.80 -67.20,-52.80,1.94,0.00,1.00,-81.60,-52.80 -62.40,-48.00,1.92,0.00,1.00,105.60,-48.00 -52.80,-48.00,1.90,0.00,1.00,-72.00,-48.00 -48.00,-43.20,1.88,0.00,1.00,115.20,-48.00 -43.20,-43.20,1.86,0.00,1.00,-62.40,-43.20 -38.40,-38.40,1.84,0.00,1.00,124.80,-43.20 -33.60,-38.40,1.82,0.00,1.00,-52.80,-38.40 -28.80,-33.60,1.79,0.00,1.00,134.40,-33.60 -24.00,-28.80,1.77,0.00,1.00,-43.20,-33.60 -24.00,-24.00,1.75,0.00,1.00,144.00,-28.80 -19.20,-24.00,1.73,0.00,1.00,-33.60,-24.00 -14.40,-19.20,1.71,0.00,1.00,153.60,-24.00 -9.60,-14.40,1.69,0.00,1.00,-24.00,-19.20 -9.60,-9.60,1.67,0.00,1.00,163.20,-14.40 -4.80,-9.60,1.64,0.00,1.00,-14.40,-9.60 -4.80,-4.80,1.62,0.00,1.00,172.80,-9.60 -0.00,0.00,1.60,0.00,1.00,-4.80,-4.80 --4.80,4.80,1.58,0.00,1.00,0.00,0.00 --4.80,4.80,1.56,0.00,1.00,-177.60,4.80 --9.60,9.60,1.54,0.00,1.00,9.60,4.80 --14.40,14.40,1.52,0.00,1.00,-168.00,9.60 --14.40,19.20,1.50,0.00,1.00,19.20,14.40 --19.20,19.20,1.47,0.00,1.00,-158.40,19.20 --24.00,24.00,1.45,0.00,1.00,28.80,19.20 --28.80,28.80,1.43,0.00,1.00,-148.80,24.00 --33.60,28.80,1.41,0.00,1.00,38.40,28.80 --38.40,33.60,1.39,0.00,1.00,-139.20,28.80 --43.20,38.40,1.37,0.00,1.00,48.00,33.60 --48.00,38.40,1.35,0.00,1.00,-129.60,33.60 --52.80,43.20,1.32,0.00,1.00,57.60,38.40 --57.60,43.20,1.30,0.00,1.00,-120.00,38.40 --62.40,43.20,1.28,0.00,1.00,67.20,43.20 --72.00,48.00,1.26,0.00,1.00,-110.40,43.20 --76.80,48.00,1.24,0.00,1.00,76.80,43.20 --86.40,48.00,1.22,0.00,1.00,-100.80,48.00 --91.20,48.00,1.20,0.00,1.00,86.40,48.00 --100.80,48.00,1.17,0.00,1.00,-86.40,48.00 --105.60,48.00,1.15,0.00,1.00,96.00,48.00 --110.40,48.00,1.13,0.00,1.00,-76.80,48.00 --120.00,43.20,1.11,0.00,1.00,105.60,43.20 --124.80,43.20,1.09,0.00,1.00,-67.20,43.20 --129.60,38.40,1.07,0.00,1.00,115.20,43.20 --134.40,38.40,1.05,0.00,1.00,-57.60,38.40 --139.20,33.60,1.03,0.00,1.00,124.80,38.40 --144.00,33.60,1.00,0.00,1.00,-48.00,33.60 --148.80,28.80,0.98,0.00,1.00,134.40,33.60 --153.60,24.00,0.96,0.00,1.00,-38.40,28.80 --158.40,24.00,0.94,0.00,1.00,144.00,24.00 --163.20,19.20,0.92,0.00,1.00,-28.80,24.00 --163.20,14.40,0.90,0.00,1.00,153.60,19.20 --168.00,14.40,0.88,0.00,1.00,-19.20,14.40 --172.80,9.60,0.85,0.00,1.00,163.20,14.40 --172.80,4.80,0.83,0.00,1.00,-9.60,9.60 --177.60,0.00,0.81,0.00,1.00,172.80,4.80 -177.60,-0.00,0.79,0.00,1.00,-0.00,0.00 -172.80,-4.80,0.77,0.00,1.00,-177.60,-0.00 -172.80,-9.60,0.75,0.00,1.00,4.80,-4.80 -168.00,-14.40,0.73,0.00,1.00,-168.00,-9.60 -163.20,-14.40,0.70,0.00,1.00,14.40,-14.40 -163.20,-19.20,0.68,0.00,1.00,-158.40,-14.40 -158.40,-24.00,0.66,0.00,1.00,24.00,-19.20 -153.60,-24.00,0.64,0.00,1.00,-148.80,-24.00 -148.80,-28.80,0.62,0.00,1.00,33.60,-24.00 -144.00,-33.60,0.60,0.00,1.00,-139.20,-28.80 -139.20,-33.60,0.58,0.00,1.00,43.20,-33.60 -134.40,-38.40,0.56,0.00,1.00,-129.60,-33.60 -129.60,-38.40,0.53,0.00,1.00,52.80,-38.40 -124.80,-43.20,0.51,0.00,1.00,-120.00,-38.40 -120.00,-43.20,0.49,0.00,1.00,62.40,-43.20 -110.40,-48.00,0.47,0.00,1.00,-110.40,-43.20 -105.60,-48.00,0.45,0.00,1.00,72.00,-43.20 -100.80,-48.00,0.43,0.00,1.00,-100.80,-48.00 -91.20,-48.00,0.41,0.00,1.00,81.60,-48.00 -86.40,-48.00,0.38,0.00,1.00,-91.20,-48.00 -76.80,-48.00,0.36,0.00,1.00,96.00,-48.00 -72.00,-48.00,0.34,0.00,1.00,-81.60,-48.00 -62.40,-43.20,0.32,0.00,1.00,105.60,-43.20 -57.60,-43.20,0.30,0.00,1.00,-72.00,-43.20 -52.80,-43.20,0.28,0.00,1.00,115.20,-43.20 -48.00,-38.40,0.26,0.00,1.00,-62.40,-38.40 -43.20,-38.40,0.23,0.00,1.00,124.80,-38.40 -38.40,-33.60,0.21,0.00,1.00,-52.80,-33.60 -33.60,-28.80,0.19,0.00,1.00,134.40,-33.60 -28.80,-28.80,0.17,0.00,1.00,-43.20,-28.80 -24.00,-24.00,0.15,0.00,1.00,144.00,-28.80 -19.20,-19.20,0.13,0.00,1.00,-33.60,-24.00 -14.40,-19.20,0.11,0.00,1.00,153.60,-19.20 -14.40,-14.40,0.09,0.00,1.00,-24.00,-19.20 -9.60,-9.60,0.06,0.00,1.00,163.20,-14.40 -4.80,-4.80,0.04,0.00,1.00,-14.40,-9.60 -4.80,-4.80,0.02,0.00,1.00,172.80,-4.80 -0.00,0.00,0.00,0.00,1.00,-4.80,-4.80 --4.80,4.80,0.00,0.00,1.00,0.00,0.00 --4.80,4.80,0.02,0.00,1.00,-177.60,4.80 --9.60,9.60,0.04,0.00,1.00,9.60,4.80 --14.40,14.40,0.06,0.00,1.00,-168.00,9.60 --19.20,14.40,0.09,0.00,1.00,19.20,14.40 --24.00,19.20,0.11,0.00,1.00,-158.40,14.40 --24.00,24.00,0.13,0.00,1.00,28.80,19.20 --28.80,24.00,0.15,0.00,1.00,-148.80,24.00 --33.60,28.80,0.17,0.00,1.00,38.40,24.00 --38.40,28.80,0.19,0.00,1.00,-139.20,28.80 --43.20,33.60,0.21,0.00,1.00,48.00,28.80 --48.00,33.60,0.23,0.00,1.00,-129.60,33.60 --52.80,38.40,0.26,0.00,1.00,57.60,33.60 --62.40,38.40,0.28,0.00,1.00,-120.00,38.40 --67.20,38.40,0.30,0.00,1.00,67.20,38.40 --72.00,43.20,0.32,0.00,1.00,-110.40,38.40 --76.80,43.20,0.34,0.00,1.00,76.80,38.40 --86.40,43.20,0.36,0.00,1.00,-100.80,43.20 --91.20,43.20,0.38,0.00,1.00,86.40,43.20 --96.00,43.20,0.41,0.00,1.00,-86.40,43.20 --105.60,43.20,0.43,0.00,1.00,96.00,43.20 --110.40,43.20,0.45,0.00,1.00,-76.80,43.20 --115.20,38.40,0.47,0.00,1.00,105.60,38.40 --124.80,38.40,0.49,0.00,1.00,-67.20,38.40 --129.60,38.40,0.51,0.00,1.00,115.20,38.40 --134.40,33.60,0.53,0.00,1.00,-57.60,33.60 --139.20,33.60,0.56,0.00,1.00,124.80,33.60 --144.00,28.80,0.58,0.00,1.00,-48.00,28.80 --148.80,28.80,0.60,0.00,1.00,134.40,28.80 --153.60,24.00,0.62,0.00,1.00,-38.40,24.00 --158.40,19.20,0.64,0.00,1.00,144.00,24.00 --158.40,19.20,0.66,0.00,1.00,-28.80,19.20 --163.20,14.40,0.68,0.00,1.00,153.60,19.20 --168.00,9.60,0.70,0.00,1.00,-19.20,14.40 --172.80,9.60,0.73,0.00,1.00,163.20,9.60 --172.80,4.80,0.75,0.00,1.00,-9.60,9.60 --177.60,0.00,0.77,0.00,1.00,172.80,4.80 -177.60,-0.00,0.79,0.00,1.00,-0.00,0.00 -172.80,-4.80,0.81,0.00,1.00,-177.60,-0.00 -172.80,-9.60,0.83,0.00,1.00,4.80,-4.80 -168.00,-9.60,0.85,0.00,1.00,-168.00,-9.60 -163.20,-14.40,0.88,0.00,1.00,14.40,-9.60 -158.40,-19.20,0.90,0.00,1.00,-158.40,-14.40 -158.40,-19.20,0.92,0.00,1.00,24.00,-19.20 -153.60,-24.00,0.94,0.00,1.00,-148.80,-19.20 -148.80,-28.80,0.96,0.00,1.00,33.60,-24.00 -144.00,-28.80,0.98,0.00,1.00,-139.20,-24.00 -139.20,-33.60,1.00,0.00,1.00,43.20,-28.80 -134.40,-33.60,1.03,0.00,1.00,-129.60,-28.80 -129.60,-38.40,1.05,0.00,1.00,52.80,-33.60 -124.80,-38.40,1.07,0.00,1.00,-120.00,-33.60 -115.20,-38.40,1.09,0.00,1.00,62.40,-38.40 -110.40,-43.20,1.11,0.00,1.00,-110.40,-38.40 -105.60,-43.20,1.13,0.00,1.00,72.00,-38.40 -96.00,-43.20,1.15,0.00,1.00,-100.80,-43.20 -91.20,-43.20,1.17,0.00,1.00,81.60,-43.20 -86.40,-43.20,1.20,0.00,1.00,-91.20,-43.20 -76.80,-43.20,1.22,0.00,1.00,96.00,-43.20 -72.00,-43.20,1.24,0.00,1.00,-81.60,-43.20 -67.20,-38.40,1.26,0.00,1.00,105.60,-38.40 -62.40,-38.40,1.28,0.00,1.00,-72.00,-38.40 -52.80,-38.40,1.30,0.00,1.00,115.20,-38.40 -48.00,-33.60,1.32,0.00,1.00,-62.40,-38.40 -43.20,-33.60,1.35,0.00,1.00,124.80,-33.60 -38.40,-28.80,1.37,0.00,1.00,-52.80,-33.60 -33.60,-28.80,1.39,0.00,1.00,134.40,-28.80 -28.80,-24.00,1.41,0.00,1.00,-43.20,-28.80 -24.00,-24.00,1.43,0.00,1.00,144.00,-24.00 -24.00,-19.20,1.45,0.00,1.00,-33.60,-24.00 -19.20,-14.40,1.47,0.00,1.00,153.60,-19.20 -14.40,-14.40,1.50,0.00,1.00,-24.00,-14.40 -9.60,-9.60,1.52,0.00,1.00,163.20,-14.40 -4.80,-4.80,1.54,0.00,1.00,-14.40,-9.60 -4.80,-4.80,1.56,0.00,1.00,172.80,-4.80 -0.00,0.00,1.58,0.00,1.00,-4.80,-4.80 --4.80,4.80,1.60,0.00,1.00,0.00,0.00 --9.60,4.80,1.62,0.00,1.00,-177.60,4.80 --9.60,9.60,1.64,0.00,1.00,9.60,4.80 --14.40,9.60,1.67,0.00,1.00,-168.00,9.60 --19.20,14.40,1.69,0.00,1.00,19.20,9.60 --24.00,19.20,1.71,0.00,1.00,-158.40,14.40 --28.80,19.20,1.73,0.00,1.00,28.80,19.20 --33.60,24.00,1.75,0.00,1.00,-148.80,19.20 --38.40,24.00,1.77,0.00,1.00,38.40,24.00 --43.20,28.80,1.79,0.00,1.00,-139.20,24.00 --48.00,28.80,1.82,0.00,1.00,48.00,28.80 --52.80,33.60,1.84,0.00,1.00,-129.60,28.80 --57.60,33.60,1.86,0.00,1.00,57.60,28.80 --62.40,33.60,1.88,0.00,1.00,-120.00,33.60 --67.20,38.40,1.90,0.00,1.00,67.20,33.60 --72.00,38.40,1.92,0.00,1.00,-110.40,33.60 --81.60,38.40,1.94,0.00,1.00,76.80,38.40 --86.40,38.40,1.97,0.00,1.00,-100.80,38.40 --91.20,38.40,1.99,0.00,1.00,86.40,38.40 --96.00,38.40,2.01,0.00,1.00,-86.40,38.40 --105.60,38.40,2.03,0.00,1.00,96.00,38.40 --110.40,38.40,2.05,0.00,1.00,-76.80,38.40 --115.20,33.60,2.07,0.00,1.00,105.60,33.60 --120.00,33.60,2.09,0.00,1.00,-67.20,33.60 --124.80,33.60,2.11,0.00,1.00,115.20,33.60 --129.60,28.80,2.14,0.00,1.00,-57.60,33.60 --134.40,28.80,2.16,0.00,1.00,124.80,28.80 --139.20,24.00,2.18,0.00,1.00,-48.00,28.80 --144.00,24.00,2.20,0.00,1.00,134.40,24.00 --148.80,19.20,2.22,0.00,1.00,-38.40,24.00 --153.60,19.20,2.24,0.00,1.00,144.00,19.20 --158.40,14.40,2.26,0.00,1.00,-28.80,19.20 --163.20,14.40,2.29,0.00,1.00,153.60,14.40 --168.00,9.60,2.31,0.00,1.00,-19.20,14.40 --172.80,9.60,2.33,0.00,1.00,163.20,9.60 --172.80,4.80,2.35,0.00,1.00,-9.60,9.60 --177.60,0.00,2.37,0.00,1.00,172.80,4.80 -177.60,-0.00,2.39,0.00,1.00,-0.00,0.00 -172.80,-4.80,2.41,0.00,1.00,-177.60,-0.00 -172.80,-9.60,2.44,0.00,1.00,4.80,-4.80 -168.00,-9.60,2.46,0.00,1.00,-168.00,-9.60 -163.20,-14.40,2.48,0.00,1.00,14.40,-9.60 -158.40,-14.40,2.50,0.00,1.00,-158.40,-14.40 -153.60,-19.20,2.52,0.00,1.00,24.00,-14.40 -148.80,-19.20,2.54,0.00,1.00,-148.80,-19.20 -144.00,-24.00,2.56,0.00,1.00,33.60,-19.20 -139.20,-24.00,2.58,0.00,1.00,-139.20,-24.00 -134.40,-28.80,2.61,0.00,1.00,43.20,-24.00 -129.60,-28.80,2.63,0.00,1.00,-129.60,-28.80 -124.80,-33.60,2.65,0.00,1.00,52.80,-28.80 -120.00,-33.60,2.67,0.00,1.00,-120.00,-33.60 -115.20,-33.60,2.69,0.00,1.00,62.40,-33.60 -110.40,-38.40,2.71,0.00,1.00,-110.40,-33.60 -105.60,-38.40,2.73,0.00,1.00,72.00,-33.60 -96.00,-38.40,2.76,0.00,1.00,-100.80,-38.40 -91.20,-38.40,2.78,0.00,1.00,81.60,-38.40 -86.40,-38.40,2.80,0.00,1.00,-91.20,-38.40 -81.60,-38.40,2.82,0.00,1.00,96.00,-38.40 -72.00,-38.40,2.84,0.00,1.00,-81.60,-38.40 -67.20,-38.40,2.86,0.00,1.00,105.60,-38.40 -62.40,-33.60,2.88,0.00,1.00,-72.00,-33.60 -57.60,-33.60,2.91,0.00,1.00,115.20,-33.60 -52.80,-33.60,2.93,0.00,1.00,-62.40,-33.60 -48.00,-28.80,2.95,0.00,1.00,124.80,-28.80 -43.20,-28.80,2.97,0.00,1.00,-52.80,-28.80 -38.40,-24.00,2.99,0.00,1.00,134.40,-28.80 -33.60,-24.00,3.01,0.00,1.00,-43.20,-24.00 -28.80,-19.20,3.03,0.00,1.00,144.00,-24.00 -24.00,-19.20,3.05,0.00,1.00,-33.60,-19.20 -19.20,-14.40,3.08,0.00,1.00,153.60,-19.20 -14.40,-9.60,3.10,0.00,1.00,-24.00,-14.40 -9.60,-9.60,3.12,0.00,1.00,163.20,-9.60 -9.60,-4.80,3.14,0.00,1.00,-14.40,-9.60 -4.80,-4.80,3.16,0.00,1.00,172.80,-4.80 -0.00,0.00,3.18,0.00,1.00,-4.80,-4.80 --4.80,4.80,3.20,0.00,1.00,0.00,0.00 --9.60,4.80,3.23,0.00,1.00,-177.60,4.80 --14.40,9.60,3.25,0.00,1.00,9.60,4.80 --14.40,9.60,3.27,0.00,1.00,-168.00,9.60 --19.20,14.40,3.29,0.00,1.00,19.20,9.60 --24.00,14.40,3.31,0.00,1.00,-158.40,14.40 --28.80,19.20,3.33,0.00,1.00,28.80,14.40 --33.60,19.20,3.35,0.00,1.00,-148.80,19.20 --38.40,24.00,3.38,0.00,1.00,38.40,19.20 --43.20,24.00,3.40,0.00,1.00,-139.20,19.20 --48.00,24.00,3.42,0.00,1.00,48.00,24.00 --52.80,28.80,3.44,0.00,1.00,-129.60,24.00 --57.60,28.80,3.46,0.00,1.00,57.60,28.80 --62.40,28.80,3.48,0.00,1.00,-120.00,28.80 --67.20,33.60,3.50,0.00,1.00,67.20,28.80 --72.00,33.60,3.52,0.00,1.00,-110.40,28.80 --81.60,33.60,3.55,0.00,1.00,76.80,33.60 --86.40,33.60,3.57,0.00,1.00,-100.80,33.60 --91.20,33.60,3.59,0.00,1.00,86.40,33.60 --96.00,33.60,3.61,0.00,1.00,-86.40,33.60 --100.80,33.60,3.63,0.00,1.00,96.00,33.60 --110.40,33.60,3.65,0.00,1.00,-76.80,33.60 --115.20,33.60,3.67,0.00,1.00,105.60,28.80 --120.00,28.80,3.70,0.00,1.00,-67.20,28.80 --124.80,28.80,3.72,0.00,1.00,115.20,28.80 --129.60,28.80,3.74,0.00,1.00,-57.60,28.80 --134.40,24.00,3.76,0.00,1.00,124.80,24.00 --139.20,24.00,3.78,0.00,1.00,-48.00,24.00 --144.00,19.20,3.80,0.00,1.00,134.40,24.00 --148.80,19.20,3.82,0.00,1.00,-38.40,19.20 --153.60,14.40,3.85,0.00,1.00,144.00,19.20 --158.40,14.40,3.87,0.00,1.00,-28.80,14.40 --163.20,9.60,3.89,0.00,1.00,153.60,14.40 --168.00,9.60,3.91,0.00,1.00,-19.20,9.60 --168.00,4.80,3.93,0.00,1.00,163.20,9.60 --172.80,4.80,3.95,0.00,1.00,-9.60,4.80 --177.60,0.00,3.97,0.00,1.00,172.80,4.80 -177.60,-0.00,3.99,0.00,1.00,-0.00,0.00 -172.80,-4.80,4.02,0.00,1.00,-177.60,-0.00 -168.00,-4.80,4.04,0.00,1.00,4.80,-4.80 -168.00,-9.60,4.06,0.00,1.00,-168.00,-4.80 -163.20,-9.60,4.08,0.00,1.00,14.40,-9.60 -158.40,-14.40,4.10,0.00,1.00,-158.40,-9.60 -153.60,-14.40,4.12,0.00,1.00,24.00,-14.40 -148.80,-19.20,4.14,0.00,1.00,-148.80,-14.40 -144.00,-19.20,4.17,0.00,1.00,33.60,-19.20 -139.20,-24.00,4.19,0.00,1.00,-139.20,-19.20 -134.40,-24.00,4.21,0.00,1.00,43.20,-24.00 -129.60,-28.80,4.23,0.00,1.00,-129.60,-24.00 -124.80,-28.80,4.25,0.00,1.00,52.80,-24.00 -120.00,-28.80,4.27,0.00,1.00,-120.00,-28.80 -115.20,-33.60,4.29,0.00,1.00,62.40,-28.80 -110.40,-33.60,4.32,0.00,1.00,-110.40,-28.80 -100.80,-33.60,4.34,0.00,1.00,72.00,-28.80 -96.00,-33.60,4.36,0.00,1.00,-100.80,-33.60 -91.20,-33.60,4.38,0.00,1.00,81.60,-33.60 -86.40,-33.60,4.40,0.00,1.00,-91.20,-33.60 -81.60,-33.60,4.42,0.00,1.00,96.00,-33.60 -72.00,-33.60,4.44,0.00,1.00,-81.60,-33.60 -67.20,-33.60,4.46,0.00,1.00,105.60,-33.60 -62.40,-28.80,4.49,0.00,1.00,-72.00,-28.80 -57.60,-28.80,4.51,0.00,1.00,115.20,-28.80 -52.80,-28.80,4.53,0.00,1.00,-62.40,-28.80 -48.00,-24.00,4.55,0.00,1.00,124.80,-28.80 -43.20,-24.00,4.57,0.00,1.00,-52.80,-24.00 -38.40,-24.00,4.59,0.00,1.00,134.40,-24.00 -33.60,-19.20,4.61,0.00,1.00,-43.20,-19.20 -28.80,-19.20,4.64,0.00,1.00,144.00,-19.20 -24.00,-14.40,4.66,0.00,1.00,-33.60,-19.20 -19.20,-14.40,4.68,0.00,1.00,153.60,-14.40 -14.40,-9.60,4.70,0.00,1.00,-24.00,-14.40 -14.40,-9.60,4.72,0.00,1.00,163.20,-9.60 -9.60,-4.80,4.74,0.00,1.00,-14.40,-9.60 -4.80,-4.80,4.76,0.00,1.00,172.80,-4.80 -0.00,0.00,4.79,0.00,1.00,-4.80,-4.80 --4.80,0.00,4.81,0.00,1.00,0.00,0.00 --9.60,4.80,4.83,0.00,1.00,-177.60,0.00 --14.40,4.80,4.85,0.00,1.00,9.60,4.80 --19.20,9.60,4.87,0.00,1.00,-168.00,4.80 --19.20,9.60,4.89,0.00,1.00,19.20,9.60 --24.00,14.40,4.91,0.00,1.00,-158.40,9.60 --28.80,14.40,4.93,0.00,1.00,28.80,14.40 --33.60,19.20,4.96,0.00,1.00,-148.80,14.40 --38.40,19.20,4.98,0.00,1.00,38.40,14.40 --43.20,19.20,5.00,0.00,1.00,-139.20,19.20 --48.00,24.00,5.02,0.00,1.00,48.00,19.20 --52.80,24.00,5.04,0.00,1.00,-129.60,24.00 --57.60,24.00,5.06,0.00,1.00,57.60,24.00 --62.40,24.00,5.08,0.00,1.00,-120.00,24.00 --72.00,28.80,5.11,0.00,1.00,67.20,24.00 --76.80,28.80,5.13,0.00,1.00,-110.40,24.00 --81.60,28.80,5.15,0.00,1.00,76.80,28.80 --86.40,28.80,5.17,0.00,1.00,-100.80,28.80 --91.20,28.80,5.19,0.00,1.00,86.40,28.80 --96.00,28.80,5.21,0.00,1.00,-86.40,28.80 --100.80,28.80,5.23,0.00,1.00,96.00,28.80 --105.60,28.80,5.26,0.00,1.00,-76.80,28.80 --115.20,28.80,5.28,0.00,1.00,105.60,28.80 --120.00,24.00,5.30,0.00,1.00,-67.20,24.00 --124.80,24.00,5.32,0.00,1.00,115.20,24.00 --129.60,24.00,5.34,0.00,1.00,-57.60,24.00 --134.40,24.00,5.36,0.00,1.00,124.80,24.00 --139.20,19.20,5.38,0.00,1.00,-48.00,19.20 --144.00,19.20,5.40,0.00,1.00,134.40,19.20 --148.80,14.40,5.43,0.00,1.00,-38.40,19.20 --153.60,14.40,5.45,0.00,1.00,144.00,14.40 --158.40,14.40,5.47,0.00,1.00,-28.80,14.40 --163.20,9.60,5.49,0.00,1.00,153.60,9.60 --163.20,9.60,5.51,0.00,1.00,-19.20,9.60 --168.00,4.80,5.53,0.00,1.00,163.20,9.60 --172.80,4.80,5.55,0.00,1.00,-9.60,4.80 --177.60,0.00,5.58,0.00,1.00,172.80,4.80 -177.60,-0.00,5.60,0.00,1.00,-0.00,0.00 -172.80,-4.80,5.62,0.00,1.00,-177.60,-0.00 -168.00,-4.80,5.64,0.00,1.00,4.80,-4.80 -163.20,-9.60,5.66,0.00,1.00,-168.00,-4.80 -163.20,-9.60,5.68,0.00,1.00,14.40,-9.60 -158.40,-14.40,5.70,0.00,1.00,-158.40,-9.60 -153.60,-14.40,5.72,0.00,1.00,24.00,-9.60 -148.80,-14.40,5.75,0.00,1.00,-148.80,-14.40 -144.00,-19.20,5.77,0.00,1.00,33.60,-14.40 -139.20,-19.20,5.79,0.00,1.00,-139.20,-19.20 -134.40,-24.00,5.81,0.00,1.00,43.20,-19.20 -129.60,-24.00,5.83,0.00,1.00,-129.60,-19.20 -124.80,-24.00,5.85,0.00,1.00,52.80,-24.00 -120.00,-24.00,5.87,0.00,1.00,-120.00,-24.00 -115.20,-28.80,5.90,0.00,1.00,62.40,-24.00 -105.60,-28.80,5.92,0.00,1.00,-110.40,-24.00 -100.80,-28.80,5.94,0.00,1.00,72.00,-28.80 -96.00,-28.80,5.96,0.00,1.00,-100.80,-28.80 -91.20,-28.80,5.98,0.00,1.00,81.60,-28.80 -86.40,-28.80,6.00,0.00,1.00,-91.20,-28.80 -81.60,-28.80,6.02,0.00,1.00,96.00,-28.80 -76.80,-28.80,6.05,0.00,1.00,-81.60,-28.80 -72.00,-28.80,6.07,0.00,1.00,105.60,-28.80 -62.40,-24.00,6.09,0.00,1.00,-72.00,-24.00 -57.60,-24.00,6.11,0.00,1.00,115.20,-24.00 -52.80,-24.00,6.13,0.00,1.00,-62.40,-24.00 -48.00,-24.00,6.15,0.00,1.00,124.80,-24.00 -43.20,-19.20,6.17,0.00,1.00,-52.80,-24.00 -38.40,-19.20,6.19,0.00,1.00,134.40,-19.20 -33.60,-19.20,6.22,0.00,1.00,-43.20,-19.20 -28.80,-14.40,6.24,0.00,1.00,144.00,-14.40 -24.00,-14.40,6.26,0.00,1.00,-33.60,-14.40 -19.20,-9.60,6.28,0.00,1.00,153.60,-14.40 -19.20,-9.60,6.30,0.00,1.00,-24.00,-9.60 -14.40,-4.80,6.32,0.00,1.00,163.20,-9.60 -9.60,-4.80,6.34,0.00,1.00,-14.40,-4.80 -4.80,-0.00,6.37,0.00,1.00,172.80,-4.80 -0.00,0.00,6.39,0.00,1.00,-4.80,-0.00 --4.80,0.00,6.41,0.00,1.00,0.00,0.00 --9.60,4.80,6.43,0.00,1.00,-177.60,0.00 --14.40,4.80,6.45,0.00,1.00,9.60,4.80 --19.20,9.60,6.47,0.00,1.00,-168.00,4.80 --24.00,9.60,6.49,0.00,1.00,19.20,9.60 --28.80,9.60,6.52,0.00,1.00,-158.40,9.60 --33.60,14.40,6.54,0.00,1.00,28.80,9.60 --33.60,14.40,6.56,0.00,1.00,-148.80,14.40 --38.40,14.40,6.58,0.00,1.00,38.40,14.40 --43.20,19.20,6.60,0.00,1.00,-139.20,14.40 --48.00,19.20,6.62,0.00,1.00,48.00,14.40 --57.60,19.20,6.64,0.00,1.00,-129.60,19.20 --62.40,19.20,6.66,0.00,1.00,57.60,19.20 --67.20,24.00,6.69,0.00,1.00,-120.00,19.20 --72.00,24.00,6.71,0.00,1.00,67.20,19.20 --76.80,24.00,6.73,0.00,1.00,-110.40,24.00 --81.60,24.00,6.75,0.00,1.00,76.80,24.00 --86.40,24.00,6.77,0.00,1.00,-100.80,24.00 --91.20,24.00,6.79,0.00,1.00,86.40,24.00 --96.00,24.00,6.81,0.00,1.00,-86.40,24.00 --100.80,24.00,6.84,0.00,1.00,96.00,24.00 --105.60,24.00,6.86,0.00,1.00,-76.80,24.00 --110.40,24.00,6.88,0.00,1.00,105.60,24.00 --115.20,19.20,6.90,0.00,1.00,-67.20,19.20 --120.00,19.20,6.92,0.00,1.00,115.20,19.20 --129.60,19.20,6.94,0.00,1.00,-57.60,19.20 --134.40,19.20,6.96,0.00,1.00,124.80,19.20 --139.20,19.20,6.99,0.00,1.00,-48.00,19.20 --144.00,14.40,7.01,0.00,1.00,134.40,14.40 --148.80,14.40,7.03,0.00,1.00,-38.40,14.40 --148.80,14.40,7.05,0.00,1.00,144.00,14.40 --153.60,9.60,7.07,0.00,1.00,-28.80,9.60 --158.40,9.60,7.09,0.00,1.00,153.60,9.60 --163.20,4.80,7.11,0.00,1.00,-19.20,9.60 --168.00,4.80,7.13,0.00,1.00,163.20,4.80 --172.80,4.80,7.16,0.00,1.00,-9.60,4.80 --177.60,0.00,7.18,0.00,1.00,172.80,4.80 -177.60,-0.00,7.20,0.00,1.00,-0.00,0.00 -172.80,-4.80,7.22,0.00,1.00,-177.60,-0.00 -168.00,-4.80,7.24,0.00,1.00,4.80,-4.80 -163.20,-4.80,7.26,0.00,1.00,-168.00,-4.80 -158.40,-9.60,7.28,0.00,1.00,14.40,-4.80 -153.60,-9.60,7.31,0.00,1.00,-158.40,-9.60 -148.80,-14.40,7.33,0.00,1.00,24.00,-9.60 -148.80,-14.40,7.35,0.00,1.00,-148.80,-9.60 -144.00,-14.40,7.37,0.00,1.00,33.60,-14.40 -139.20,-19.20,7.39,0.00,1.00,-139.20,-14.40 -134.40,-19.20,7.41,0.00,1.00,43.20,-14.40 -129.60,-19.20,7.43,0.00,1.00,-129.60,-19.20 -120.00,-19.20,7.46,0.00,1.00,52.80,-19.20 -115.20,-19.20,7.48,0.00,1.00,-120.00,-19.20 -110.40,-24.00,7.50,0.00,1.00,62.40,-19.20 -105.60,-24.00,7.52,0.00,1.00,-110.40,-19.20 -100.80,-24.00,7.54,0.00,1.00,72.00,-24.00 -96.00,-24.00,7.56,0.00,1.00,-100.80,-24.00 -91.20,-24.00,7.58,0.00,1.00,81.60,-24.00 -86.40,-24.00,7.60,0.00,1.00,-91.20,-24.00 -81.60,-24.00,7.63,0.00,1.00,96.00,-24.00 -76.80,-24.00,7.65,0.00,1.00,-81.60,-24.00 -72.00,-24.00,7.67,0.00,1.00,105.60,-24.00 -67.20,-24.00,7.69,0.00,1.00,-72.00,-24.00 -62.40,-19.20,7.71,0.00,1.00,115.20,-19.20 -57.60,-19.20,7.73,0.00,1.00,-62.40,-19.20 -48.00,-19.20,7.75,0.00,1.00,124.80,-19.20 -43.20,-19.20,7.78,0.00,1.00,-52.80,-19.20 -38.40,-14.40,7.80,0.00,1.00,134.40,-14.40 -33.60,-14.40,7.82,0.00,1.00,-43.20,-14.40 -33.60,-14.40,7.84,0.00,1.00,144.00,-14.40 -28.80,-9.60,7.86,0.00,1.00,-33.60,-14.40 -24.00,-9.60,7.88,0.00,1.00,153.60,-9.60 -19.20,-9.60,7.90,0.00,1.00,-24.00,-9.60 -14.40,-4.80,7.93,0.00,1.00,163.20,-9.60 -9.60,-4.80,7.95,0.00,1.00,-14.40,-4.80 -4.80,-0.00,7.97,0.00,1.00,172.80,-4.80 -0.00,0.00,7.99,0.00,1.00,-4.80,-0.00 --4.80,0.00,8.01,0.00,1.00,0.00,0.00 --9.60,4.80,8.03,0.00,1.00,-177.60,0.00 --14.40,4.80,8.05,0.00,1.00,9.60,4.80 --19.20,4.80,8.07,0.00,1.00,-168.00,4.80 --24.00,9.60,8.10,0.00,1.00,19.20,4.80 --28.80,9.60,8.12,0.00,1.00,-158.40,9.60 --33.60,9.60,8.14,0.00,1.00,24.00,9.60 --38.40,9.60,8.16,0.00,1.00,-148.80,9.60 --43.20,14.40,8.18,0.00,1.00,33.60,9.60 --48.00,14.40,8.20,0.00,1.00,-139.20,14.40 --52.80,14.40,8.22,0.00,1.00,43.20,14.40 --57.60,14.40,8.25,0.00,1.00,-129.60,14.40 --62.40,19.20,8.27,0.00,1.00,52.80,14.40 --67.20,19.20,8.29,0.00,1.00,-120.00,14.40 --72.00,19.20,8.31,0.00,1.00,62.40,14.40 --76.80,19.20,8.33,0.00,1.00,-110.40,19.20 --81.60,19.20,8.35,0.00,1.00,76.80,19.20 --86.40,19.20,8.37,0.00,1.00,-100.80,19.20 --91.20,19.20,8.40,0.00,1.00,86.40,19.20 --96.00,19.20,8.42,0.00,1.00,-86.40,19.20 --100.80,19.20,8.44,0.00,1.00,96.00,19.20 --105.60,19.20,8.46,0.00,1.00,-76.80,19.20 --110.40,19.20,8.48,0.00,1.00,105.60,19.20 --115.20,19.20,8.50,0.00,1.00,-67.20,19.20 --120.00,14.40,8.52,0.00,1.00,120.00,14.40 --124.80,14.40,8.54,0.00,1.00,-57.60,14.40 --129.60,14.40,8.57,0.00,1.00,129.60,14.40 --134.40,14.40,8.59,0.00,1.00,-48.00,14.40 --139.20,14.40,8.61,0.00,1.00,139.20,14.40 --144.00,9.60,8.63,0.00,1.00,-38.40,9.60 --148.80,9.60,8.65,0.00,1.00,148.80,9.60 --153.60,9.60,8.67,0.00,1.00,-28.80,9.60 --158.40,4.80,8.69,0.00,1.00,158.40,9.60 --163.20,4.80,8.72,0.00,1.00,-19.20,4.80 --168.00,4.80,8.74,0.00,1.00,163.20,4.80 --172.80,0.00,8.76,0.00,1.00,-9.60,4.80 --177.60,0.00,8.78,0.00,1.00,172.80,0.00 -177.60,-0.00,8.80,0.00,1.00,-0.00,0.00 -172.80,-0.00,8.82,0.00,1.00,-177.60,-0.00 -168.00,-4.80,8.84,0.00,1.00,4.80,-0.00 -163.20,-4.80,8.87,0.00,1.00,-168.00,-4.80 -158.40,-4.80,8.89,0.00,1.00,14.40,-4.80 -153.60,-9.60,8.91,0.00,1.00,-158.40,-4.80 -148.80,-9.60,8.93,0.00,1.00,24.00,-9.60 -144.00,-9.60,8.95,0.00,1.00,-153.60,-9.60 -139.20,-14.40,8.97,0.00,1.00,33.60,-9.60 -134.40,-14.40,8.99,0.00,1.00,-144.00,-9.60 -129.60,-14.40,9.01,0.00,1.00,43.20,-14.40 -124.80,-14.40,9.04,0.00,1.00,-134.40,-14.40 -120.00,-14.40,9.06,0.00,1.00,52.80,-14.40 -115.20,-19.20,9.08,0.00,1.00,-124.80,-14.40 -110.40,-19.20,9.10,0.00,1.00,62.40,-14.40 -105.60,-19.20,9.12,0.00,1.00,-110.40,-19.20 -100.80,-19.20,9.14,0.00,1.00,72.00,-19.20 -96.00,-19.20,9.16,0.00,1.00,-100.80,-19.20 -91.20,-19.20,9.19,0.00,1.00,81.60,-19.20 -86.40,-19.20,9.21,0.00,1.00,-91.20,-19.20 -81.60,-19.20,9.23,0.00,1.00,96.00,-19.20 -76.80,-19.20,9.25,0.00,1.00,-81.60,-19.20 -72.00,-19.20,9.27,0.00,1.00,105.60,-19.20 -67.20,-19.20,9.29,0.00,1.00,-72.00,-19.20 -62.40,-19.20,9.31,0.00,1.00,115.20,-14.40 -57.60,-14.40,9.34,0.00,1.00,-57.60,-14.40 -52.80,-14.40,9.36,0.00,1.00,124.80,-14.40 -48.00,-14.40,9.38,0.00,1.00,-48.00,-14.40 -43.20,-14.40,9.40,0.00,1.00,134.40,-14.40 -38.40,-9.60,9.42,0.00,1.00,-38.40,-14.40 -33.60,-9.60,9.44,0.00,1.00,144.00,-9.60 -28.80,-9.60,9.46,0.00,1.00,-28.80,-9.60 -24.00,-9.60,9.48,0.00,1.00,153.60,-9.60 -19.20,-4.80,9.51,0.00,1.00,-24.00,-9.60 -14.40,-4.80,9.53,0.00,1.00,163.20,-4.80 -9.60,-4.80,9.55,0.00,1.00,-14.40,-4.80 -4.80,-0.00,9.57,0.00,1.00,172.80,-4.80 -0.00,0.00,9.59,0.00,1.00,-4.80,-0.00 --4.80,0.00,9.61,0.00,1.00,0.00,0.00 --9.60,0.00,9.63,0.00,1.00,-177.60,0.00 --14.40,4.80,9.66,0.00,1.00,9.60,0.00 --19.20,4.80,9.68,0.00,1.00,-168.00,4.80 --24.00,4.80,9.70,0.00,1.00,14.40,4.80 --28.80,4.80,9.72,0.00,1.00,-158.40,4.80 --33.60,9.60,9.74,0.00,1.00,24.00,4.80 --38.40,9.60,9.76,0.00,1.00,-148.80,9.60 --43.20,9.60,9.78,0.00,1.00,33.60,9.60 --48.00,9.60,9.81,0.00,1.00,-139.20,9.60 --52.80,9.60,9.83,0.00,1.00,43.20,9.60 --57.60,14.40,9.85,0.00,1.00,-129.60,9.60 --62.40,14.40,9.87,0.00,1.00,52.80,9.60 --67.20,14.40,9.89,0.00,1.00,-120.00,9.60 --72.00,14.40,9.91,0.00,1.00,62.40,14.40 --76.80,14.40,9.93,0.00,1.00,-110.40,14.40 --81.60,14.40,9.95,0.00,1.00,76.80,14.40 --86.40,14.40,9.98,0.00,1.00,-100.80,14.40 --91.20,14.40,10.00,0.00,1.00,86.40,14.40 --96.00,14.40,10.02,0.00,1.00,-86.40,14.40 --100.80,14.40,10.04,0.00,1.00,96.00,14.40 --105.60,14.40,10.06,0.00,1.00,-76.80,14.40 --110.40,14.40,10.08,0.00,1.00,110.40,14.40 --115.20,14.40,10.10,0.00,1.00,-67.20,14.40 --120.00,14.40,10.13,0.00,1.00,120.00,9.60 --124.80,9.60,10.15,0.00,1.00,-57.60,9.60 --129.60,9.60,10.17,0.00,1.00,129.60,9.60 --134.40,9.60,10.19,0.00,1.00,-48.00,9.60 --139.20,9.60,10.21,0.00,1.00,139.20,9.60 --144.00,9.60,10.23,0.00,1.00,-38.40,9.60 --148.80,9.60,10.25,0.00,1.00,148.80,9.60 --153.60,4.80,10.28,0.00,1.00,-28.80,4.80 --158.40,4.80,10.30,0.00,1.00,158.40,4.80 --163.20,4.80,10.32,0.00,1.00,-19.20,4.80 --168.00,4.80,10.34,0.00,1.00,168.00,4.80 --172.80,0.00,10.36,0.00,1.00,-9.60,4.80 --177.60,0.00,10.38,0.00,1.00,172.80,0.00 -177.60,-0.00,10.40,0.00,1.00,-0.00,0.00 -172.80,-0.00,10.42,0.00,1.00,-177.60,-0.00 -168.00,-4.80,10.45,0.00,1.00,4.80,-0.00 -163.20,-4.80,10.47,0.00,1.00,-168.00,-4.80 -158.40,-4.80,10.49,0.00,1.00,14.40,-4.80 -153.60,-4.80,10.51,0.00,1.00,-163.20,-4.80 -148.80,-9.60,10.53,0.00,1.00,24.00,-4.80 -144.00,-9.60,10.55,0.00,1.00,-153.60,-4.80 -139.20,-9.60,10.57,0.00,1.00,33.60,-9.60 -134.40,-9.60,10.60,0.00,1.00,-144.00,-9.60 -129.60,-9.60,10.62,0.00,1.00,43.20,-9.60 -124.80,-9.60,10.64,0.00,1.00,-134.40,-9.60 -120.00,-14.40,10.66,0.00,1.00,52.80,-9.60 -115.20,-14.40,10.68,0.00,1.00,-124.80,-9.60 -110.40,-14.40,10.70,0.00,1.00,62.40,-9.60 -105.60,-14.40,10.72,0.00,1.00,-115.20,-14.40 -100.80,-14.40,10.74,0.00,1.00,72.00,-14.40 -96.00,-14.40,10.77,0.00,1.00,-100.80,-14.40 -91.20,-14.40,10.79,0.00,1.00,81.60,-14.40 -86.40,-14.40,10.81,0.00,1.00,-91.20,-14.40 -81.60,-14.40,10.83,0.00,1.00,96.00,-14.40 -76.80,-14.40,10.85,0.00,1.00,-81.60,-14.40 -72.00,-14.40,10.87,0.00,1.00,105.60,-14.40 -67.20,-14.40,10.89,0.00,1.00,-67.20,-14.40 -62.40,-14.40,10.92,0.00,1.00,115.20,-14.40 -57.60,-14.40,10.94,0.00,1.00,-57.60,-9.60 -52.80,-9.60,10.96,0.00,1.00,124.80,-9.60 -48.00,-9.60,10.98,0.00,1.00,-48.00,-9.60 -43.20,-9.60,11.00,0.00,1.00,134.40,-9.60 -38.40,-9.60,11.02,0.00,1.00,-38.40,-9.60 -33.60,-9.60,11.04,0.00,1.00,144.00,-9.60 -28.80,-4.80,11.07,0.00,1.00,-28.80,-9.60 -24.00,-4.80,11.09,0.00,1.00,153.60,-4.80 -19.20,-4.80,11.11,0.00,1.00,-19.20,-4.80 -14.40,-4.80,11.13,0.00,1.00,163.20,-4.80 -9.60,-0.00,11.15,0.00,1.00,-14.40,-4.80 -4.80,-0.00,11.17,0.00,1.00,172.80,-0.00 -0.00,0.00,11.19,0.00,1.00,-4.80,-0.00 --4.80,0.00,11.21,0.00,1.00,0.00,0.00 --9.60,0.00,11.24,0.00,1.00,-177.60,0.00 --14.40,0.00,11.26,0.00,1.00,9.60,0.00 --19.20,4.80,11.28,0.00,1.00,-168.00,0.00 --24.00,4.80,11.30,0.00,1.00,14.40,4.80 --28.80,4.80,11.32,0.00,1.00,-158.40,4.80 --33.60,4.80,11.34,0.00,1.00,24.00,4.80 --38.40,4.80,11.36,0.00,1.00,-153.60,4.80 --43.20,4.80,11.39,0.00,1.00,33.60,4.80 --48.00,4.80,11.41,0.00,1.00,-144.00,4.80 --52.80,9.60,11.43,0.00,1.00,43.20,4.80 --57.60,9.60,11.45,0.00,1.00,-134.40,4.80 --62.40,9.60,11.47,0.00,1.00,52.80,4.80 --67.20,9.60,11.49,0.00,1.00,-124.80,9.60 --72.00,9.60,11.51,0.00,1.00,62.40,9.60 --76.80,9.60,11.54,0.00,1.00,-110.40,9.60 --81.60,9.60,11.56,0.00,1.00,72.00,9.60 --86.40,9.60,11.58,0.00,1.00,-100.80,9.60 --91.20,9.60,11.60,0.00,1.00,86.40,9.60 --96.00,9.60,11.62,0.00,1.00,-86.40,9.60 --100.80,9.60,11.64,0.00,1.00,96.00,9.60 --105.60,9.60,11.66,0.00,1.00,-76.80,9.60 --110.40,9.60,11.68,0.00,1.00,110.40,9.60 --115.20,9.60,11.71,0.00,1.00,-67.20,9.60 --120.00,9.60,11.73,0.00,1.00,120.00,9.60 --124.80,9.60,11.75,0.00,1.00,-52.80,9.60 --129.60,9.60,11.77,0.00,1.00,129.60,4.80 --134.40,4.80,11.79,0.00,1.00,-43.20,4.80 --139.20,4.80,11.81,0.00,1.00,139.20,4.80 --144.00,4.80,11.83,0.00,1.00,-33.60,4.80 --148.80,4.80,11.86,0.00,1.00,148.80,4.80 --153.60,4.80,11.88,0.00,1.00,-24.00,4.80 --158.40,4.80,11.90,0.00,1.00,158.40,4.80 --163.20,4.80,11.92,0.00,1.00,-19.20,4.80 --168.00,0.00,11.94,0.00,1.00,168.00,4.80 --172.80,0.00,11.96,0.00,1.00,-9.60,0.00 --177.60,0.00,11.98,0.00,1.00,172.80,0.00 -177.60,-0.00,12.01,0.00,1.00,-0.00,0.00 -172.80,-0.00,12.03,0.00,1.00,-177.60,-0.00 -168.00,-0.00,12.05,0.00,1.00,4.80,-0.00 -163.20,-4.80,12.07,0.00,1.00,-168.00,-0.00 -158.40,-4.80,12.09,0.00,1.00,14.40,-4.80 -153.60,-4.80,12.11,0.00,1.00,-163.20,-4.80 -148.80,-4.80,12.13,0.00,1.00,24.00,-4.80 -144.00,-4.80,12.15,0.00,1.00,-153.60,-4.80 -139.20,-4.80,12.18,0.00,1.00,28.80,-4.80 -134.40,-4.80,12.20,0.00,1.00,-144.00,-4.80 -129.60,-9.60,12.22,0.00,1.00,38.40,-4.80 -124.80,-9.60,12.24,0.00,1.00,-134.40,-4.80 -120.00,-9.60,12.26,0.00,1.00,48.00,-4.80 -115.20,-9.60,12.28,0.00,1.00,-124.80,-9.60 -110.40,-9.60,12.30,0.00,1.00,57.60,-9.60 -105.60,-9.60,12.33,0.00,1.00,-115.20,-9.60 -100.80,-9.60,12.35,0.00,1.00,72.00,-9.60 -96.00,-9.60,12.37,0.00,1.00,-105.60,-9.60 -91.20,-9.60,12.39,0.00,1.00,81.60,-9.60 -86.40,-9.60,12.41,0.00,1.00,-91.20,-9.60 -81.60,-9.60,12.43,0.00,1.00,96.00,-9.60 -76.80,-9.60,12.45,0.00,1.00,-81.60,-9.60 -72.00,-9.60,12.48,0.00,1.00,105.60,-9.60 -67.20,-9.60,12.50,0.00,1.00,-67.20,-9.60 -62.40,-9.60,12.52,0.00,1.00,120.00,-9.60 -57.60,-9.60,12.54,0.00,1.00,-57.60,-9.60 -52.80,-9.60,12.56,0.00,1.00,129.60,-4.80 -48.00,-4.80,12.58,0.00,1.00,-48.00,-4.80 -43.20,-4.80,12.60,0.00,1.00,139.20,-4.80 -38.40,-4.80,12.62,0.00,1.00,-38.40,-4.80 -33.60,-4.80,12.65,0.00,1.00,148.80,-4.80 -28.80,-4.80,12.67,0.00,1.00,-28.80,-4.80 -24.00,-4.80,12.69,0.00,1.00,158.40,-4.80 -19.20,-4.80,12.71,0.00,1.00,-19.20,-4.80 -14.40,-0.00,12.73,0.00,1.00,163.20,-4.80 -9.60,-0.00,12.75,0.00,1.00,-9.60,-0.00 -4.80,-0.00,12.77,0.00,1.00,172.80,-0.00 -0.00,0.00,12.80,0.00,1.00,-4.80,-0.00 --4.80,0.00,12.82,0.00,1.00,0.00,0.00 --9.60,0.00,12.84,0.00,1.00,-177.60,0.00 --14.40,0.00,12.86,0.00,1.00,9.60,0.00 --19.20,0.00,12.88,0.00,1.00,-168.00,0.00 --24.00,0.00,12.90,0.00,1.00,14.40,0.00 --28.80,0.00,12.92,0.00,1.00,-163.20,0.00 --33.60,4.80,12.95,0.00,1.00,24.00,0.00 --38.40,4.80,12.97,0.00,1.00,-153.60,0.00 --43.20,4.80,12.99,0.00,1.00,28.80,0.00 --48.00,4.80,13.01,0.00,1.00,-144.00,4.80 --52.80,4.80,13.03,0.00,1.00,38.40,4.80 --57.60,4.80,13.05,0.00,1.00,-134.40,4.80 --62.40,4.80,13.07,0.00,1.00,48.00,4.80 --67.20,4.80,13.09,0.00,1.00,-124.80,4.80 --72.00,4.80,13.12,0.00,1.00,62.40,4.80 --76.80,4.80,13.14,0.00,1.00,-115.20,4.80 --81.60,4.80,13.16,0.00,1.00,72.00,4.80 --86.40,4.80,13.18,0.00,1.00,-100.80,4.80 --91.20,4.80,13.20,0.00,1.00,86.40,4.80 --96.00,4.80,13.22,0.00,1.00,-86.40,4.80 --100.80,4.80,13.24,0.00,1.00,96.00,4.80 --105.60,4.80,13.27,0.00,1.00,-76.80,4.80 --110.40,4.80,13.29,0.00,1.00,110.40,4.80 --115.20,4.80,13.31,0.00,1.00,-62.40,4.80 --120.00,4.80,13.33,0.00,1.00,120.00,4.80 --124.80,4.80,13.35,0.00,1.00,-52.80,4.80 --129.60,4.80,13.37,0.00,1.00,134.40,4.80 --134.40,4.80,13.39,0.00,1.00,-43.20,4.80 --139.20,4.80,13.42,0.00,1.00,144.00,4.80 --144.00,4.80,13.44,0.00,1.00,-33.60,0.00 --148.80,4.80,13.46,0.00,1.00,153.60,0.00 --153.60,0.00,13.48,0.00,1.00,-24.00,0.00 --158.40,0.00,13.50,0.00,1.00,158.40,0.00 --163.20,0.00,13.52,0.00,1.00,-14.40,0.00 --168.00,0.00,13.54,0.00,1.00,168.00,0.00 --172.80,0.00,13.56,0.00,1.00,-9.60,0.00 --177.60,0.00,13.59,0.00,1.00,172.80,0.00 -177.60,-0.00,13.61,0.00,1.00,-0.00,0.00 -172.80,-0.00,13.63,0.00,1.00,-177.60,-0.00 -168.00,-0.00,13.65,0.00,1.00,4.80,-0.00 -163.20,-0.00,13.67,0.00,1.00,-172.80,-0.00 -158.40,-0.00,13.69,0.00,1.00,14.40,-0.00 -153.60,-0.00,13.71,0.00,1.00,-163.20,-0.00 -148.80,-4.80,13.74,0.00,1.00,19.20,-0.00 -144.00,-4.80,13.76,0.00,1.00,-153.60,-0.00 -139.20,-4.80,13.78,0.00,1.00,28.80,-0.00 -134.40,-4.80,13.80,0.00,1.00,-148.80,-0.00 -129.60,-4.80,13.82,0.00,1.00,38.40,-4.80 -124.80,-4.80,13.84,0.00,1.00,-139.20,-4.80 -120.00,-4.80,13.86,0.00,1.00,48.00,-4.80 -115.20,-4.80,13.89,0.00,1.00,-129.60,-4.80 -110.40,-4.80,13.91,0.00,1.00,57.60,-4.80 -105.60,-4.80,13.93,0.00,1.00,-115.20,-4.80 -100.80,-4.80,13.95,0.00,1.00,67.20,-4.80 -96.00,-4.80,13.97,0.00,1.00,-105.60,-4.80 -91.20,-4.80,13.99,0.00,1.00,81.60,-4.80 -86.40,-4.80,14.01,0.00,1.00,-91.20,-4.80 -81.60,-4.80,14.03,0.00,1.00,96.00,-4.80 -76.80,-4.80,14.06,0.00,1.00,-76.80,-4.80 -72.00,-4.80,14.08,0.00,1.00,105.60,-4.80 -67.20,-4.80,14.10,0.00,1.00,-67.20,-4.80 -62.40,-4.80,14.12,0.00,1.00,120.00,-4.80 -57.60,-4.80,14.14,0.00,1.00,-52.80,-4.80 -52.80,-4.80,14.16,0.00,1.00,129.60,-4.80 -48.00,-4.80,14.18,0.00,1.00,-43.20,-4.80 -43.20,-4.80,14.21,0.00,1.00,139.20,-4.80 -38.40,-4.80,14.23,0.00,1.00,-33.60,-4.80 -33.60,-4.80,14.25,0.00,1.00,148.80,-0.00 -28.80,-0.00,14.27,0.00,1.00,-28.80,-0.00 -24.00,-0.00,14.29,0.00,1.00,158.40,-0.00 -19.20,-0.00,14.31,0.00,1.00,-19.20,-0.00 -14.40,-0.00,14.33,0.00,1.00,163.20,-0.00 -9.60,-0.00,14.36,0.00,1.00,-9.60,-0.00 -4.80,-0.00,14.38,0.00,1.00,172.80,-0.00 -0.00,0.00,14.40,0.00,1.00,-4.80,-0.00 --4.80,0.00,14.42,0.00,1.00,0.00,0.00 --9.60,0.00,14.44,0.00,1.00,-177.60,-0.00 --14.40,0.00,14.46,0.00,1.00,4.80,-0.00 --19.20,0.00,14.48,0.00,1.00,-168.00,-0.00 --24.00,0.00,14.50,0.00,1.00,14.40,-0.00 --28.80,0.00,14.53,0.00,1.00,-163.20,-0.00 --33.60,0.00,14.55,0.00,1.00,19.20,-0.00 --38.40,0.00,14.57,0.00,1.00,-153.60,-0.00 --43.20,0.00,14.59,0.00,1.00,28.80,-0.00 --48.00,0.00,14.61,0.00,1.00,-148.80,-0.00 --52.80,0.00,14.63,0.00,1.00,38.40,-0.00 --57.60,0.00,14.65,0.00,1.00,-139.20,-0.00 --62.40,0.00,14.68,0.00,1.00,48.00,-0.00 --67.20,0.00,14.70,0.00,1.00,-124.80,-0.00 --72.00,0.00,14.72,0.00,1.00,57.60,-0.00 --76.80,0.00,14.74,0.00,1.00,-115.20,-0.00 --81.60,0.00,14.76,0.00,1.00,72.00,-0.00 --86.40,0.00,14.78,0.00,1.00,-100.80,-0.00 --91.20,0.00,14.80,0.00,1.00,86.40,-0.00 --96.00,0.00,14.83,0.00,1.00,-86.40,-0.00 --100.80,0.00,14.85,0.00,1.00,100.80,-0.00 --105.60,0.00,14.87,0.00,1.00,-76.80,-0.00 --110.40,0.00,14.89,0.00,1.00,110.40,-0.00 --115.20,0.00,14.91,0.00,1.00,-62.40,-0.00 --120.00,0.00,14.93,0.00,1.00,124.80,-0.00 --124.80,0.00,14.95,0.00,1.00,-48.00,-0.00 --129.60,0.00,14.97,0.00,1.00,134.40,-0.00 --134.40,0.00,15.00,0.00,1.00,-38.40,-0.00 --139.20,0.00,15.02,0.00,1.00,144.00,-0.00 --144.00,0.00,15.04,0.00,1.00,-28.80,-0.00 --148.80,0.00,15.06,0.00,1.00,153.60,-0.00 --153.60,0.00,15.08,0.00,1.00,-24.00,-0.00 --158.40,0.00,15.10,0.00,1.00,163.20,-0.00 --163.20,0.00,15.12,0.00,1.00,-14.40,-0.00 --168.00,0.00,15.15,0.00,1.00,168.00,-0.00 --172.80,0.00,15.17,0.00,1.00,-9.60,-0.00 --177.60,0.00,15.19,0.00,1.00,172.80,-0.00 -177.60,0.00,15.21,0.00,1.00,-0.00,-0.00 -172.80,0.00,15.23,0.00,1.00,-177.60,0.00 -168.00,0.00,15.25,0.00,1.00,4.80,0.00 -163.20,0.00,15.27,0.00,1.00,-172.80,0.00 -158.40,0.00,15.30,0.00,1.00,9.60,0.00 -153.60,0.00,15.32,0.00,1.00,-163.20,0.00 -148.80,0.00,15.34,0.00,1.00,19.20,0.00 -144.00,0.00,15.36,0.00,1.00,-158.40,0.00 -139.20,0.00,15.38,0.00,1.00,28.80,0.00 -134.40,0.00,15.40,0.00,1.00,-148.80,0.00 -129.60,0.00,15.42,0.00,1.00,33.60,0.00 -124.80,0.00,15.44,0.00,1.00,-139.20,0.00 -120.00,0.00,15.47,0.00,1.00,43.20,0.00 -115.20,0.00,15.49,0.00,1.00,-129.60,0.00 -110.40,0.00,15.51,0.00,1.00,57.60,0.00 -105.60,0.00,15.53,0.00,1.00,-120.00,0.00 -100.80,0.00,15.55,0.00,1.00,67.20,0.00 -96.00,0.00,15.57,0.00,1.00,-105.60,0.00 -91.20,0.00,15.59,0.00,1.00,81.60,0.00 -86.40,0.00,15.62,0.00,1.00,-91.20,0.00 -81.60,0.00,15.64,0.00,1.00,96.00,0.00 -76.80,0.00,15.66,0.00,1.00,-76.80,0.00 -72.00,0.00,15.68,0.00,1.00,110.40,0.00 -67.20,0.00,15.70,0.00,1.00,-67.20,0.00 -62.40,0.00,15.72,0.00,1.00,120.00,0.00 -57.60,0.00,15.74,0.00,1.00,-52.80,0.00 -52.80,0.00,15.77,0.00,1.00,134.40,0.00 -48.00,0.00,15.79,0.00,1.00,-43.20,0.00 -43.20,0.00,15.81,0.00,1.00,144.00,0.00 -38.40,0.00,15.83,0.00,1.00,-33.60,0.00 -33.60,0.00,15.85,0.00,1.00,153.60,0.00 -28.80,0.00,15.87,0.00,1.00,-24.00,0.00 -24.00,0.00,15.89,0.00,1.00,158.40,0.00 -19.20,0.00,15.91,0.00,1.00,-19.20,0.00 -14.40,0.00,15.94,0.00,1.00,168.00,0.00 -9.60,0.00,15.96,0.00,1.00,-9.60,0.00 -4.80,0.00,15.98,0.00,1.00,172.80,0.00 -0.00,0.00,16.00,0.00,1.00,-4.80,0.00 +0.00,4.80,16.00,0.00,1.00,0.00,0.00,0 +0.00,9.60,15.98,0.00,1.00,-177.60,4.80,0 +0.00,14.40,15.96,0.00,1.00,4.80,9.60,0 +0.00,19.20,15.94,0.00,1.00,-168.00,14.40,0 +0.00,24.00,15.91,0.00,1.00,14.40,19.20,0 +0.00,28.80,15.89,0.00,1.00,-163.20,24.00,0 +0.00,33.60,15.87,0.00,1.00,19.20,28.80,0 +0.00,38.40,15.85,0.00,1.00,-153.60,33.60,0 +0.00,43.20,15.83,0.00,1.00,28.80,38.40,0 +0.00,48.00,15.81,0.00,1.00,-148.80,43.20,0 +0.00,52.80,15.79,0.00,1.00,38.40,48.00,0 +0.00,57.60,15.77,0.00,1.00,-139.20,52.80,0 +0.00,62.40,15.74,0.00,1.00,48.00,57.60,0 +4.80,67.20,15.72,0.00,1.00,-124.80,62.40,0 +4.80,72.00,15.70,0.00,1.00,57.60,67.20,0 +4.80,76.80,15.68,0.00,1.00,-115.20,72.00,0 +9.60,81.60,15.66,0.00,1.00,72.00,76.80,0 +19.20,86.40,15.64,0.00,1.00,-100.80,81.60,0 +134.40,86.40,15.62,0.00,1.00,86.40,86.40,0 +168.00,81.60,15.59,0.00,1.00,-86.40,89.20,0 +172.80,76.80,15.57,0.00,1.00,100.80,86.40,0 +177.60,72.00,15.55,0.00,1.00,-76.80,81.60,0 +177.60,67.20,15.53,0.00,1.00,110.40,76.80,0 +177.60,62.40,15.51,0.00,1.00,-62.40,72.00,0 +177.60,57.60,15.49,0.00,1.00,124.80,67.20,0 +177.60,52.80,15.47,0.00,1.00,-52.80,62.40,0 +177.60,48.00,15.44,0.00,1.00,134.40,57.60,0 +177.60,43.20,15.42,0.00,1.00,-38.40,52.80,0 +177.60,38.40,15.40,0.00,1.00,144.00,48.00,0 +177.60,33.60,15.38,0.00,1.00,-33.60,43.20,0 +177.60,28.80,15.36,0.00,1.00,153.60,38.40,0 +177.60,24.00,15.34,0.00,1.00,-24.00,33.60,0 +177.60,19.20,15.32,0.00,1.00,158.40,28.80,0 +177.60,14.40,15.30,0.00,1.00,-14.40,24.00,0 +177.60,9.60,15.27,0.00,1.00,168.00,19.20,0 +177.60,4.80,15.25,0.00,1.00,-9.60,14.40,0 +177.60,0.00,15.23,0.00,1.00,172.80,9.60,0 +-177.60,-0.00,15.21,0.00,1.00,-0.00,4.80,0 +-177.60,-4.80,15.19,0.00,1.00,-177.60,-0.00,0 +-177.60,-9.60,15.17,0.00,1.00,4.80,-4.80,0 +-177.60,-14.40,15.15,0.00,1.00,-172.80,-9.60,0 +-177.60,-19.20,15.12,0.00,1.00,14.40,-14.40,0 +-177.60,-24.00,15.10,0.00,1.00,-163.20,-19.20,0 +-177.60,-28.80,15.08,0.00,1.00,19.20,-24.00,0 +-177.60,-33.60,15.06,0.00,1.00,-158.40,-28.80,0 +-177.60,-38.40,15.04,0.00,1.00,28.80,-33.60,0 +-177.60,-43.20,15.02,0.00,1.00,-148.80,-38.40,0 +-177.60,-48.00,15.00,0.00,1.00,33.60,-48.00,0 +-177.60,-52.80,14.97,0.00,1.00,-139.20,-48.00,0 +-177.60,-57.60,14.95,0.00,1.00,43.20,-52.80,0 +-177.60,-62.40,14.93,0.00,1.00,-129.60,-57.60,0 +-177.60,-67.20,14.91,0.00,1.00,57.60,-62.40,0 +-177.60,-72.00,14.89,0.00,1.00,-120.00,-67.20,0 +-172.80,-76.80,14.87,0.00,1.00,67.20,-76.80,0 +-168.00,-81.60,14.85,0.00,1.00,-105.60,-76.80,0 +-134.40,-86.40,14.83,0.00,1.00,81.60,-86.40,0 +-19.20,-86.40,14.80,0.00,1.00,-91.20,-89.20,0 +-9.60,-81.60,14.78,0.00,1.00,96.00,-86.40,0 +-4.80,-76.80,14.76,0.00,1.00,-76.80,-81.60,0 +-4.80,-72.00,14.74,0.00,1.00,110.40,-76.80,0 +-4.80,-67.20,14.72,0.00,1.00,-67.20,-72.00,0 +-0.00,-62.40,14.70,0.00,1.00,120.00,-67.20,0 +-0.00,-57.60,14.68,0.00,1.00,-52.80,-62.40,0 +-0.00,-52.80,14.65,0.00,1.00,129.60,-57.60,0 +-0.00,-48.00,14.63,0.00,1.00,-43.20,-52.80,0 +-0.00,-43.20,14.61,0.00,1.00,144.00,-48.00,0 +-0.00,-38.40,14.59,0.00,1.00,-33.60,-43.20,0 +-0.00,-33.60,14.57,0.00,1.00,148.80,-38.40,0 +-0.00,-28.80,14.55,0.00,1.00,-24.00,-33.60,0 +-0.00,-24.00,14.53,0.00,1.00,158.40,-28.80,0 +-0.00,-19.20,14.50,0.00,1.00,-19.20,-24.00,0 +-0.00,-14.40,14.48,0.00,1.00,168.00,-19.20,0 +-0.00,-9.60,14.46,0.00,1.00,-9.60,-14.40,0 +-0.00,-4.80,14.44,0.00,1.00,172.80,-9.60,0 +-0.00,0.00,14.42,0.00,1.00,-4.80,-4.80,0 +-0.00,4.80,14.40,0.00,1.00,0.00,0.00,0 +-0.00,9.60,14.38,0.00,1.00,-177.60,4.80,0 +-0.00,14.40,14.36,0.00,1.00,9.60,9.60,0 +-0.00,19.20,14.33,0.00,1.00,-168.00,14.40,0 +-0.00,24.00,14.31,0.00,1.00,14.40,19.20,0 +-0.00,28.80,14.29,0.00,1.00,-163.20,24.00,0 +-0.00,33.60,14.27,0.00,1.00,24.00,28.80,0 +-4.80,38.40,14.25,0.00,1.00,-153.60,33.60,0 +-4.80,43.20,14.23,0.00,1.00,28.80,38.40,0 +-4.80,48.00,14.21,0.00,1.00,-144.00,43.20,0 +-4.80,52.80,14.18,0.00,1.00,38.40,48.00,0 +-4.80,57.60,14.16,0.00,1.00,-134.40,52.80,0 +-4.80,62.40,14.14,0.00,1.00,48.00,57.60,0 +-9.60,67.20,14.12,0.00,1.00,-124.80,62.40,0 +-9.60,72.00,14.10,0.00,1.00,62.40,67.20,0 +-14.40,76.80,14.08,0.00,1.00,-115.20,72.00,0 +-24.00,81.60,14.06,0.00,1.00,72.00,76.80,0 +-43.20,86.40,14.03,0.00,1.00,-100.80,81.60,0 +-110.40,86.40,14.01,0.00,1.00,86.40,86.40,0 +-148.80,81.60,13.99,0.00,1.00,-86.40,86.40,0 +-163.20,76.80,13.97,0.00,1.00,96.00,81.60,0 +-168.00,72.00,13.95,0.00,1.00,-76.80,76.80,0 +-172.80,67.20,13.93,0.00,1.00,110.40,72.00,0 +-172.80,62.40,13.91,0.00,1.00,-62.40,67.20,0 +-172.80,57.60,13.89,0.00,1.00,120.00,62.40,0 +-172.80,52.80,13.86,0.00,1.00,-52.80,57.60,0 +-177.60,48.00,13.84,0.00,1.00,134.40,52.80,0 +-177.60,43.20,13.82,0.00,1.00,-43.20,48.00,0 +-177.60,38.40,13.80,0.00,1.00,144.00,43.20,0 +-177.60,33.60,13.78,0.00,1.00,-33.60,38.40,0 +-177.60,28.80,13.76,0.00,1.00,148.80,33.60,0 +-177.60,24.00,13.74,0.00,1.00,-24.00,28.80,0 +-177.60,19.20,13.71,0.00,1.00,158.40,24.00,0 +-177.60,14.40,13.69,0.00,1.00,-19.20,19.20,0 +-177.60,9.60,13.67,0.00,1.00,168.00,14.40,0 +-177.60,4.80,13.65,0.00,1.00,-9.60,9.60,0 +-177.60,0.00,13.63,0.00,1.00,172.80,4.80,0 +177.60,-0.00,13.61,0.00,1.00,-0.00,0.00,0 +177.60,-4.80,13.59,0.00,1.00,-177.60,-0.00,0 +177.60,-9.60,13.56,0.00,1.00,4.80,-4.80,0 +177.60,-14.40,13.54,0.00,1.00,-172.80,-9.60,0 +177.60,-19.20,13.52,0.00,1.00,14.40,-14.40,0 +177.60,-24.00,13.50,0.00,1.00,-163.20,-19.20,0 +177.60,-28.80,13.48,0.00,1.00,19.20,-24.00,0 +177.60,-33.60,13.46,0.00,1.00,-153.60,-28.80,0 +177.60,-38.40,13.44,0.00,1.00,28.80,-33.60,0 +177.60,-43.20,13.42,0.00,1.00,-148.80,-38.40,0 +177.60,-48.00,13.39,0.00,1.00,38.40,-43.20,0 +172.80,-52.80,13.37,0.00,1.00,-139.20,-48.00,0 +172.80,-57.60,13.35,0.00,1.00,48.00,-52.80,0 +172.80,-62.40,13.33,0.00,1.00,-124.80,-57.60,0 +172.80,-67.20,13.31,0.00,1.00,57.60,-62.40,0 +168.00,-72.00,13.29,0.00,1.00,-115.20,-67.20,0 +163.20,-76.80,13.27,0.00,1.00,72.00,-72.00,0 +148.80,-81.60,13.24,0.00,1.00,-105.60,-76.80,0 +110.40,-86.40,13.22,0.00,1.00,81.60,-81.60,0 +43.20,-86.40,13.20,0.00,1.00,-91.20,-86.40,0 +24.00,-81.60,13.18,0.00,1.00,96.00,-86.40,0 +14.40,-76.80,13.16,0.00,1.00,-76.80,-81.60,0 +9.60,-72.00,13.14,0.00,1.00,105.60,-76.80,0 +9.60,-67.20,13.12,0.00,1.00,-67.20,-72.00,0 +4.80,-62.40,13.09,0.00,1.00,120.00,-67.20,0 +4.80,-57.60,13.07,0.00,1.00,-57.60,-62.40,0 +4.80,-52.80,13.05,0.00,1.00,129.60,-57.60,0 +4.80,-48.00,13.03,0.00,1.00,-43.20,-52.80,0 +4.80,-43.20,13.01,0.00,1.00,139.20,-48.00,0 +4.80,-38.40,12.99,0.00,1.00,-33.60,-43.20,0 +0.00,-33.60,12.97,0.00,1.00,148.80,-38.40,0 +0.00,-28.80,12.95,0.00,1.00,-28.80,-33.60,0 +0.00,-24.00,12.92,0.00,1.00,158.40,-28.80,0 +0.00,-19.20,12.90,0.00,1.00,-19.20,-24.00,0 +0.00,-14.40,12.88,0.00,1.00,163.20,-19.20,0 +0.00,-9.60,12.86,0.00,1.00,-9.60,-14.40,0 +0.00,-4.80,12.84,0.00,1.00,172.80,-9.60,0 +0.00,0.00,12.82,0.00,1.00,-4.80,-4.80,0 +-0.00,4.80,12.80,0.00,1.00,0.00,0.00,0 +-0.00,9.60,12.77,0.00,1.00,-177.60,4.80,0 +-0.00,14.40,12.75,0.00,1.00,9.60,9.60,0 +-4.80,19.20,12.73,0.00,1.00,-168.00,14.40,0 +-4.80,24.00,12.71,0.00,1.00,14.40,19.20,0 +-4.80,28.80,12.69,0.00,1.00,-158.40,24.00,0 +-4.80,33.60,12.67,0.00,1.00,24.00,28.80,0 +-4.80,38.40,12.65,0.00,1.00,-153.60,33.60,0 +-9.60,43.20,12.62,0.00,1.00,33.60,38.40,0 +-9.60,48.00,12.60,0.00,1.00,-144.00,43.20,0 +-9.60,52.80,12.58,0.00,1.00,43.20,48.00,0 +-14.40,57.60,12.56,0.00,1.00,-134.40,52.80,0 +-14.40,62.40,12.54,0.00,1.00,52.80,57.60,0 +-19.20,67.20,12.52,0.00,1.00,-124.80,62.40,0 +-24.00,72.00,12.50,0.00,1.00,62.40,67.20,0 +-33.60,72.00,12.48,0.00,1.00,-110.40,72.00,0 +-43.20,76.80,12.45,0.00,1.00,72.00,72.00,0 +-67.20,81.60,12.43,0.00,1.00,-100.80,76.80,0 +-96.00,81.60,12.41,0.00,1.00,86.40,81.60,0 +-124.80,81.60,12.39,0.00,1.00,-86.40,81.60,0 +-144.00,76.80,12.37,0.00,1.00,96.00,76.80,0 +-153.60,72.00,12.35,0.00,1.00,-76.80,76.80,0 +-158.40,67.20,12.33,0.00,1.00,110.40,72.00,0 +-163.20,62.40,12.30,0.00,1.00,-67.20,67.20,0 +-168.00,57.60,12.28,0.00,1.00,120.00,62.40,0 +-168.00,52.80,12.26,0.00,1.00,-52.80,57.60,0 +-168.00,48.00,12.24,0.00,1.00,129.60,52.80,0 +-172.80,43.20,12.22,0.00,1.00,-43.20,48.00,0 +-172.80,38.40,12.20,0.00,1.00,139.20,43.20,0 +-172.80,33.60,12.18,0.00,1.00,-33.60,38.40,0 +-172.80,28.80,12.15,0.00,1.00,148.80,33.60,0 +-177.60,24.00,12.13,0.00,1.00,-24.00,28.80,0 +-177.60,19.20,12.11,0.00,1.00,158.40,24.00,0 +-177.60,14.40,12.09,0.00,1.00,-19.20,19.20,0 +-177.60,9.60,12.07,0.00,1.00,168.00,14.40,0 +-177.60,4.80,12.05,0.00,1.00,-9.60,9.60,0 +-177.60,0.00,12.03,0.00,1.00,172.80,4.80,0 +177.60,-0.00,12.01,0.00,1.00,-0.00,0.00,0 +177.60,-4.80,11.98,0.00,1.00,-177.60,-0.00,0 +177.60,-9.60,11.96,0.00,1.00,4.80,-4.80,0 +177.60,-14.40,11.94,0.00,1.00,-168.00,-9.60,0 +177.60,-19.20,11.92,0.00,1.00,14.40,-14.40,0 +177.60,-24.00,11.90,0.00,1.00,-163.20,-19.20,0 +172.80,-28.80,11.88,0.00,1.00,24.00,-24.00,0 +172.80,-33.60,11.86,0.00,1.00,-153.60,-28.80,0 +172.80,-38.40,11.83,0.00,1.00,28.80,-33.60,0 +172.80,-43.20,11.81,0.00,1.00,-144.00,-38.40,0 +168.00,-48.00,11.79,0.00,1.00,38.40,-43.20,0 +168.00,-52.80,11.77,0.00,1.00,-134.40,-48.00,0 +168.00,-57.60,11.75,0.00,1.00,48.00,-52.80,0 +163.20,-62.40,11.73,0.00,1.00,-124.80,-57.60,0 +158.40,-67.20,11.71,0.00,1.00,62.40,-62.40,0 +153.60,-72.00,11.68,0.00,1.00,-115.20,-67.20,0 +144.00,-76.80,11.66,0.00,1.00,72.00,-72.00,0 +124.80,-81.60,11.64,0.00,1.00,-100.80,-76.80,0 +96.00,-81.60,11.62,0.00,1.00,81.60,-76.80,0 +67.20,-81.60,11.60,0.00,1.00,-91.20,-81.60,0 +43.20,-76.80,11.58,0.00,1.00,96.00,-81.60,0 +33.60,-72.00,11.56,0.00,1.00,-81.60,-76.80,0 +24.00,-72.00,11.54,0.00,1.00,105.60,-72.00,0 +19.20,-67.20,11.51,0.00,1.00,-67.20,-72.00,0 +14.40,-62.40,11.49,0.00,1.00,115.20,-67.20,0 +14.40,-57.60,11.47,0.00,1.00,-57.60,-62.40,0 +9.60,-52.80,11.45,0.00,1.00,129.60,-57.60,0 +9.60,-48.00,11.43,0.00,1.00,-48.00,-52.80,0 +9.60,-43.20,11.41,0.00,1.00,139.20,-48.00,0 +4.80,-38.40,11.39,0.00,1.00,-38.40,-43.20,0 +4.80,-33.60,11.36,0.00,1.00,148.80,-38.40,0 +4.80,-28.80,11.34,0.00,1.00,-28.80,-33.60,0 +4.80,-24.00,11.32,0.00,1.00,153.60,-28.80,0 +4.80,-19.20,11.30,0.00,1.00,-19.20,-24.00,0 +0.00,-14.40,11.28,0.00,1.00,163.20,-19.20,0 +0.00,-9.60,11.26,0.00,1.00,-9.60,-14.40,0 +0.00,-4.80,11.24,0.00,1.00,172.80,-9.60,0 +0.00,0.00,11.21,0.00,1.00,-4.80,-4.80,0 +-0.00,4.80,11.19,0.00,1.00,0.00,0.00,0 +-0.00,9.60,11.17,0.00,1.00,-177.60,4.80,0 +-4.80,14.40,11.15,0.00,1.00,9.60,9.60,0 +-4.80,19.20,11.13,0.00,1.00,-168.00,14.40,0 +-4.80,24.00,11.11,0.00,1.00,14.40,19.20,0 +-4.80,28.80,11.09,0.00,1.00,-158.40,24.00,0 +-9.60,33.60,11.07,0.00,1.00,24.00,28.80,0 +-9.60,38.40,11.04,0.00,1.00,-148.80,33.60,0 +-14.40,43.20,11.02,0.00,1.00,33.60,38.40,0 +-14.40,48.00,11.00,0.00,1.00,-139.20,43.20,0 +-14.40,52.80,10.98,0.00,1.00,43.20,48.00,0 +-19.20,57.60,10.96,0.00,1.00,-129.60,52.80,0 +-24.00,57.60,10.94,0.00,1.00,52.80,52.80,0 +-28.80,62.40,10.92,0.00,1.00,-120.00,57.60,0 +-33.60,67.20,10.89,0.00,1.00,62.40,62.40,0 +-43.20,72.00,10.87,0.00,1.00,-110.40,67.20,0 +-57.60,72.00,10.85,0.00,1.00,76.80,72.00,0 +-76.80,76.80,10.83,0.00,1.00,-100.80,72.00,0 +-96.00,76.80,10.81,0.00,1.00,86.40,76.80,0 +-115.20,76.80,10.79,0.00,1.00,-86.40,76.80,0 +-129.60,72.00,10.77,0.00,1.00,96.00,76.80,0 +-139.20,72.00,10.74,0.00,1.00,-76.80,72.00,0 +-148.80,67.20,10.72,0.00,1.00,105.60,67.20,0 +-153.60,62.40,10.70,0.00,1.00,-67.20,67.20,0 +-158.40,57.60,10.68,0.00,1.00,120.00,62.40,0 +-163.20,52.80,10.66,0.00,1.00,-57.60,57.60,0 +-163.20,48.00,10.64,0.00,1.00,129.60,52.80,0 +-168.00,43.20,10.62,0.00,1.00,-48.00,48.00,0 +-168.00,38.40,10.60,0.00,1.00,139.20,43.20,0 +-172.80,33.60,10.57,0.00,1.00,-38.40,38.40,0 +-172.80,28.80,10.55,0.00,1.00,148.80,33.60,0 +-172.80,24.00,10.53,0.00,1.00,-28.80,28.80,0 +-172.80,19.20,10.51,0.00,1.00,158.40,24.00,0 +-177.60,14.40,10.49,0.00,1.00,-19.20,19.20,0 +-177.60,9.60,10.47,0.00,1.00,163.20,14.40,0 +-177.60,4.80,10.45,0.00,1.00,-9.60,9.60,0 +-177.60,0.00,10.42,0.00,1.00,172.80,4.80,0 +177.60,-0.00,10.40,0.00,1.00,-0.00,0.00,0 +177.60,-4.80,10.38,0.00,1.00,-177.60,-0.00,0 +177.60,-9.60,10.36,0.00,1.00,4.80,-4.80,0 +177.60,-14.40,10.34,0.00,1.00,-168.00,-9.60,0 +172.80,-19.20,10.32,0.00,1.00,14.40,-14.40,0 +172.80,-24.00,10.30,0.00,1.00,-163.20,-19.20,0 +172.80,-28.80,10.28,0.00,1.00,24.00,-24.00,0 +172.80,-33.60,10.25,0.00,1.00,-153.60,-28.80,0 +168.00,-38.40,10.23,0.00,1.00,33.60,-33.60,0 +168.00,-43.20,10.21,0.00,1.00,-144.00,-38.40,0 +163.20,-48.00,10.19,0.00,1.00,43.20,-43.20,0 +163.20,-52.80,10.17,0.00,1.00,-134.40,-48.00,0 +158.40,-57.60,10.15,0.00,1.00,52.80,-52.80,0 +153.60,-62.40,10.13,0.00,1.00,-124.80,-57.60,0 +148.80,-67.20,10.10,0.00,1.00,62.40,-62.40,0 +139.20,-72.00,10.08,0.00,1.00,-115.20,-67.20,0 +129.60,-72.00,10.06,0.00,1.00,72.00,-67.20,0 +115.20,-76.80,10.04,0.00,1.00,-100.80,-72.00,0 +96.00,-76.80,10.02,0.00,1.00,81.60,-76.80,0 +76.80,-76.80,10.00,0.00,1.00,-91.20,-76.80,0 +57.60,-72.00,9.98,0.00,1.00,96.00,-76.80,0 +43.20,-72.00,9.95,0.00,1.00,-81.60,-72.00,0 +33.60,-67.20,9.93,0.00,1.00,105.60,-72.00,0 +28.80,-62.40,9.91,0.00,1.00,-67.20,-67.20,0 +24.00,-57.60,9.89,0.00,1.00,115.20,-62.40,0 +19.20,-57.60,9.87,0.00,1.00,-57.60,-57.60,0 +14.40,-52.80,9.85,0.00,1.00,124.80,-52.80,0 +14.40,-48.00,9.83,0.00,1.00,-48.00,-52.80,0 +14.40,-43.20,9.81,0.00,1.00,134.40,-48.00,0 +9.60,-38.40,9.78,0.00,1.00,-38.40,-43.20,0 +9.60,-33.60,9.76,0.00,1.00,144.00,-38.40,0 +4.80,-28.80,9.74,0.00,1.00,-28.80,-33.60,0 +4.80,-24.00,9.72,0.00,1.00,153.60,-28.80,0 +4.80,-19.20,9.70,0.00,1.00,-19.20,-24.00,0 +4.80,-14.40,9.68,0.00,1.00,163.20,-19.20,0 +0.00,-9.60,9.66,0.00,1.00,-14.40,-14.40,0 +0.00,-4.80,9.63,0.00,1.00,172.80,-9.60,0 +0.00,0.00,9.61,0.00,1.00,-4.80,-4.80,0 +-0.00,4.80,9.59,0.00,1.00,0.00,0.00,0 +-4.80,9.60,9.57,0.00,1.00,-177.60,4.80,0 +-4.80,14.40,9.55,0.00,1.00,9.60,9.60,0 +-4.80,19.20,9.53,0.00,1.00,-168.00,14.40,0 +-9.60,24.00,9.51,0.00,1.00,19.20,19.20,0 +-9.60,28.80,9.48,0.00,1.00,-158.40,24.00,0 +-9.60,33.60,9.46,0.00,1.00,24.00,28.80,0 +-14.40,38.40,9.44,0.00,1.00,-148.80,33.60,0 +-14.40,38.40,9.42,0.00,1.00,33.60,33.60,0 +-19.20,43.20,9.40,0.00,1.00,-139.20,38.40,0 +-24.00,48.00,9.38,0.00,1.00,43.20,43.20,0 +-24.00,52.80,9.36,0.00,1.00,-129.60,48.00,0 +-28.80,57.60,9.34,0.00,1.00,52.80,52.80,0 +-38.40,62.40,9.31,0.00,1.00,-120.00,57.60,0 +-43.20,62.40,9.29,0.00,1.00,67.20,62.40,0 +-52.80,67.20,9.27,0.00,1.00,-110.40,62.40,0 +-62.40,72.00,9.25,0.00,1.00,76.80,67.20,0 +-76.80,72.00,9.23,0.00,1.00,-100.80,67.20,0 +-96.00,72.00,9.21,0.00,1.00,86.40,72.00,0 +-110.40,72.00,9.19,0.00,1.00,-86.40,72.00,0 +-120.00,67.20,9.16,0.00,1.00,96.00,72.00,0 +-134.40,67.20,9.14,0.00,1.00,-76.80,67.20,0 +-139.20,62.40,9.12,0.00,1.00,105.60,67.20,0 +-148.80,57.60,9.10,0.00,1.00,-67.20,62.40,0 +-153.60,57.60,9.08,0.00,1.00,115.20,57.60,0 +-158.40,52.80,9.06,0.00,1.00,-57.60,52.80,0 +-158.40,48.00,9.04,0.00,1.00,129.60,52.80,0 +-163.20,43.20,9.01,0.00,1.00,-48.00,48.00,0 +-163.20,38.40,8.99,0.00,1.00,139.20,43.20,0 +-168.00,33.60,8.97,0.00,1.00,-38.40,38.40,0 +-168.00,28.80,8.95,0.00,1.00,148.80,33.60,0 +-172.80,24.00,8.93,0.00,1.00,-28.80,28.80,0 +-172.80,19.20,8.91,0.00,1.00,153.60,24.00,0 +-172.80,14.40,8.89,0.00,1.00,-19.20,19.20,0 +-177.60,9.60,8.87,0.00,1.00,163.20,14.40,0 +-177.60,4.80,8.84,0.00,1.00,-9.60,9.60,0 +-177.60,0.00,8.82,0.00,1.00,172.80,4.80,0 +177.60,-0.00,8.80,0.00,1.00,-0.00,0.00,0 +177.60,-4.80,8.78,0.00,1.00,-177.60,-0.00,0 +177.60,-9.60,8.76,0.00,1.00,4.80,-4.80,0 +172.80,-14.40,8.74,0.00,1.00,-168.00,-9.60,0 +172.80,-19.20,8.72,0.00,1.00,14.40,-14.40,0 +172.80,-24.00,8.69,0.00,1.00,-158.40,-19.20,0 +168.00,-28.80,8.67,0.00,1.00,24.00,-24.00,0 +168.00,-33.60,8.65,0.00,1.00,-153.60,-28.80,0 +163.20,-38.40,8.63,0.00,1.00,33.60,-33.60,0 +163.20,-43.20,8.61,0.00,1.00,-144.00,-38.40,0 +158.40,-48.00,8.59,0.00,1.00,43.20,-43.20,0 +158.40,-52.80,8.57,0.00,1.00,-134.40,-48.00,0 +153.60,-57.60,8.54,0.00,1.00,52.80,-52.80,0 +148.80,-57.60,8.52,0.00,1.00,-124.80,-52.80,0 +139.20,-62.40,8.50,0.00,1.00,62.40,-57.60,0 +134.40,-67.20,8.48,0.00,1.00,-110.40,-62.40,0 +120.00,-67.20,8.46,0.00,1.00,72.00,-67.20,0 +110.40,-72.00,8.44,0.00,1.00,-100.80,-67.20,0 +96.00,-72.00,8.42,0.00,1.00,81.60,-72.00,0 +76.80,-72.00,8.40,0.00,1.00,-91.20,-72.00,0 +62.40,-72.00,8.37,0.00,1.00,96.00,-72.00,0 +52.80,-67.20,8.35,0.00,1.00,-81.60,-67.20,0 +43.20,-62.40,8.33,0.00,1.00,105.60,-67.20,0 +38.40,-62.40,8.31,0.00,1.00,-72.00,-62.40,0 +28.80,-57.60,8.29,0.00,1.00,115.20,-62.40,0 +24.00,-52.80,8.27,0.00,1.00,-57.60,-57.60,0 +24.00,-48.00,8.25,0.00,1.00,124.80,-52.80,0 +19.20,-43.20,8.22,0.00,1.00,-48.00,-48.00,0 +14.40,-38.40,8.20,0.00,1.00,134.40,-43.20,0 +14.40,-38.40,8.18,0.00,1.00,-38.40,-38.40,0 +9.60,-33.60,8.16,0.00,1.00,144.00,-33.60,0 +9.60,-28.80,8.14,0.00,1.00,-28.80,-33.60,0 +9.60,-24.00,8.12,0.00,1.00,153.60,-28.80,0 +4.80,-19.20,8.10,0.00,1.00,-24.00,-24.00,0 +4.80,-14.40,8.07,0.00,1.00,163.20,-19.20,0 +4.80,-9.60,8.05,0.00,1.00,-14.40,-14.40,0 +0.00,-4.80,8.03,0.00,1.00,172.80,-9.60,0 +0.00,0.00,8.01,0.00,1.00,-4.80,-4.80,0 +-0.00,4.80,7.99,0.00,1.00,0.00,0.00,0 +-4.80,9.60,7.97,0.00,1.00,-177.60,4.80,0 +-4.80,14.40,7.95,0.00,1.00,9.60,9.60,0 +-9.60,19.20,7.93,0.00,1.00,-168.00,14.40,0 +-9.60,24.00,7.90,0.00,1.00,19.20,19.20,0 +-14.40,24.00,7.88,0.00,1.00,-158.40,24.00,0 +-14.40,28.80,7.86,0.00,1.00,28.80,24.00,0 +-19.20,33.60,7.84,0.00,1.00,-148.80,28.80,0 +-19.20,38.40,7.82,0.00,1.00,38.40,33.60,0 +-24.00,43.20,7.80,0.00,1.00,-139.20,38.40,0 +-28.80,48.00,7.78,0.00,1.00,48.00,43.20,0 +-33.60,52.80,7.75,0.00,1.00,-129.60,48.00,0 +-38.40,52.80,7.73,0.00,1.00,57.60,52.80,0 +-43.20,57.60,7.71,0.00,1.00,-120.00,52.80,0 +-48.00,62.40,7.69,0.00,1.00,67.20,57.60,0 +-57.60,62.40,7.67,0.00,1.00,-110.40,62.40,0 +-67.20,67.20,7.65,0.00,1.00,76.80,62.40,0 +-81.60,67.20,7.63,0.00,1.00,-100.80,62.40,0 +-91.20,67.20,7.60,0.00,1.00,86.40,67.20,0 +-105.60,67.20,7.58,0.00,1.00,-86.40,67.20,0 +-115.20,67.20,7.56,0.00,1.00,96.00,67.20,0 +-124.80,62.40,7.54,0.00,1.00,-76.80,62.40,0 +-134.40,57.60,7.52,0.00,1.00,105.60,62.40,0 +-139.20,57.60,7.50,0.00,1.00,-67.20,57.60,0 +-144.00,52.80,7.48,0.00,1.00,115.20,57.60,0 +-148.80,48.00,7.46,0.00,1.00,-57.60,52.80,0 +-153.60,43.20,7.43,0.00,1.00,124.80,48.00,0 +-158.40,43.20,7.41,0.00,1.00,-48.00,43.20,0 +-163.20,38.40,7.39,0.00,1.00,134.40,38.40,0 +-163.20,33.60,7.37,0.00,1.00,-38.40,38.40,0 +-168.00,28.80,7.35,0.00,1.00,144.00,33.60,0 +-168.00,24.00,7.33,0.00,1.00,-28.80,28.80,0 +-172.80,19.20,7.31,0.00,1.00,153.60,24.00,0 +-172.80,14.40,7.28,0.00,1.00,-19.20,19.20,0 +-177.60,9.60,7.26,0.00,1.00,163.20,14.40,0 +-177.60,4.80,7.24,0.00,1.00,-9.60,9.60,0 +-177.60,0.00,7.22,0.00,1.00,172.80,4.80,0 +177.60,-0.00,7.20,0.00,1.00,-0.00,0.00,0 +177.60,-4.80,7.18,0.00,1.00,-177.60,-0.00,0 +177.60,-9.60,7.16,0.00,1.00,4.80,-4.80,0 +172.80,-14.40,7.13,0.00,1.00,-168.00,-9.60,0 +172.80,-19.20,7.11,0.00,1.00,14.40,-14.40,0 +168.00,-24.00,7.09,0.00,1.00,-158.40,-19.20,0 +168.00,-28.80,7.07,0.00,1.00,24.00,-24.00,0 +163.20,-33.60,7.05,0.00,1.00,-148.80,-28.80,0 +163.20,-38.40,7.03,0.00,1.00,33.60,-33.60,0 +158.40,-43.20,7.01,0.00,1.00,-139.20,-38.40,0 +153.60,-43.20,6.99,0.00,1.00,43.20,-38.40,0 +148.80,-48.00,6.96,0.00,1.00,-129.60,-43.20,0 +144.00,-52.80,6.94,0.00,1.00,52.80,-48.00,0 +139.20,-57.60,6.92,0.00,1.00,-120.00,-52.80,0 +134.40,-57.60,6.90,0.00,1.00,62.40,-57.60,0 +124.80,-62.40,6.88,0.00,1.00,-110.40,-57.60,0 +115.20,-67.20,6.86,0.00,1.00,72.00,-62.40,0 +105.60,-67.20,6.84,0.00,1.00,-100.80,-62.40,0 +91.20,-67.20,6.81,0.00,1.00,81.60,-67.20,0 +81.60,-67.20,6.79,0.00,1.00,-91.20,-67.20,0 +67.20,-67.20,6.77,0.00,1.00,96.00,-67.20,0 +57.60,-62.40,6.75,0.00,1.00,-81.60,-62.40,0 +48.00,-62.40,6.73,0.00,1.00,105.60,-62.40,0 +43.20,-57.60,6.71,0.00,1.00,-72.00,-62.40,0 +38.40,-52.80,6.69,0.00,1.00,115.20,-57.60,0 +33.60,-52.80,6.66,0.00,1.00,-62.40,-52.80,0 +28.80,-48.00,6.64,0.00,1.00,124.80,-52.80,0 +24.00,-43.20,6.62,0.00,1.00,-52.80,-48.00,0 +19.20,-38.40,6.60,0.00,1.00,134.40,-43.20,0 +19.20,-33.60,6.58,0.00,1.00,-43.20,-38.40,0 +14.40,-28.80,6.56,0.00,1.00,144.00,-33.60,0 +14.40,-24.00,6.54,0.00,1.00,-33.60,-28.80,0 +9.60,-24.00,6.52,0.00,1.00,153.60,-24.00,0 +9.60,-19.20,6.49,0.00,1.00,-24.00,-24.00,0 +4.80,-14.40,6.47,0.00,1.00,163.20,-19.20,0 +4.80,-9.60,6.45,0.00,1.00,-14.40,-14.40,0 +0.00,-4.80,6.43,0.00,1.00,172.80,-9.60,0 +0.00,0.00,6.41,0.00,1.00,-4.80,-4.80,0 +-0.00,4.80,6.39,0.00,1.00,0.00,0.00,0 +-4.80,9.60,6.37,0.00,1.00,-177.60,4.80,0 +-4.80,14.40,6.34,0.00,1.00,9.60,9.60,0 +-9.60,19.20,6.32,0.00,1.00,-168.00,14.40,0 +-9.60,19.20,6.30,0.00,1.00,19.20,14.40,0 +-14.40,24.00,6.28,0.00,1.00,-158.40,19.20,0 +-19.20,28.80,6.26,0.00,1.00,28.80,24.00,0 +-19.20,33.60,6.24,0.00,1.00,-148.80,28.80,0 +-24.00,38.40,6.22,0.00,1.00,38.40,33.60,0 +-28.80,43.20,6.19,0.00,1.00,-139.20,38.40,0 +-33.60,43.20,6.17,0.00,1.00,48.00,38.40,0 +-38.40,48.00,6.15,0.00,1.00,-129.60,43.20,0 +-43.20,52.80,6.13,0.00,1.00,57.60,48.00,0 +-48.00,52.80,6.11,0.00,1.00,-120.00,52.80,0 +-52.80,57.60,6.09,0.00,1.00,67.20,52.80,0 +-62.40,57.60,6.07,0.00,1.00,-110.40,57.60,0 +-72.00,62.40,6.05,0.00,1.00,76.80,57.60,0 +-81.60,62.40,6.02,0.00,1.00,-100.80,62.40,0 +-91.20,62.40,6.00,0.00,1.00,86.40,62.40,0 +-100.80,62.40,5.98,0.00,1.00,-86.40,62.40,0 +-110.40,62.40,5.96,0.00,1.00,96.00,62.40,0 +-120.00,57.60,5.94,0.00,1.00,-76.80,57.60,0 +-129.60,57.60,5.92,0.00,1.00,105.60,57.60,0 +-134.40,52.80,5.90,0.00,1.00,-67.20,57.60,0 +-139.20,48.00,5.87,0.00,1.00,115.20,52.80,0 +-144.00,48.00,5.85,0.00,1.00,-57.60,48.00,0 +-148.80,43.20,5.83,0.00,1.00,124.80,48.00,0 +-153.60,38.40,5.81,0.00,1.00,-48.00,43.20,0 +-158.40,33.60,5.79,0.00,1.00,134.40,38.40,0 +-163.20,33.60,5.77,0.00,1.00,-38.40,33.60,0 +-163.20,28.80,5.75,0.00,1.00,144.00,28.80,0 +-168.00,24.00,5.72,0.00,1.00,-28.80,28.80,0 +-168.00,19.20,5.70,0.00,1.00,153.60,24.00,0 +-172.80,14.40,5.68,0.00,1.00,-19.20,19.20,0 +-172.80,9.60,5.66,0.00,1.00,163.20,14.40,0 +-177.60,4.80,5.64,0.00,1.00,-9.60,9.60,0 +-177.60,0.00,5.62,0.00,1.00,172.80,4.80,0 +177.60,-0.00,5.60,0.00,1.00,-0.00,0.00,0 +177.60,-4.80,5.58,0.00,1.00,-177.60,-0.00,0 +172.80,-9.60,5.55,0.00,1.00,4.80,-4.80,0 +172.80,-14.40,5.53,0.00,1.00,-168.00,-9.60,0 +168.00,-19.20,5.51,0.00,1.00,14.40,-14.40,0 +168.00,-24.00,5.49,0.00,1.00,-158.40,-19.20,0 +163.20,-28.80,5.47,0.00,1.00,24.00,-24.00,0 +163.20,-33.60,5.45,0.00,1.00,-148.80,-28.80,0 +158.40,-33.60,5.43,0.00,1.00,33.60,-28.80,0 +153.60,-38.40,5.40,0.00,1.00,-139.20,-33.60,0 +148.80,-43.20,5.38,0.00,1.00,43.20,-38.40,0 +144.00,-48.00,5.36,0.00,1.00,-129.60,-43.20,0 +139.20,-48.00,5.34,0.00,1.00,52.80,-48.00,0 +134.40,-52.80,5.32,0.00,1.00,-120.00,-48.00,0 +129.60,-57.60,5.30,0.00,1.00,62.40,-52.80,0 +120.00,-57.60,5.28,0.00,1.00,-110.40,-57.60,0 +110.40,-62.40,5.26,0.00,1.00,72.00,-57.60,0 +100.80,-62.40,5.23,0.00,1.00,-100.80,-57.60,0 +91.20,-62.40,5.21,0.00,1.00,81.60,-62.40,0 +81.60,-62.40,5.19,0.00,1.00,-91.20,-62.40,0 +72.00,-62.40,5.17,0.00,1.00,96.00,-62.40,0 +62.40,-57.60,5.15,0.00,1.00,-81.60,-62.40,0 +52.80,-57.60,5.13,0.00,1.00,105.60,-57.60,0 +48.00,-52.80,5.11,0.00,1.00,-72.00,-57.60,0 +43.20,-52.80,5.08,0.00,1.00,115.20,-52.80,0 +38.40,-48.00,5.06,0.00,1.00,-62.40,-52.80,0 +33.60,-43.20,5.04,0.00,1.00,124.80,-48.00,0 +28.80,-43.20,5.02,0.00,1.00,-52.80,-43.20,0 +24.00,-38.40,5.00,0.00,1.00,134.40,-38.40,0 +19.20,-33.60,4.98,0.00,1.00,-43.20,-38.40,0 +19.20,-28.80,4.96,0.00,1.00,144.00,-33.60,0 +14.40,-24.00,4.93,0.00,1.00,-33.60,-28.80,0 +9.60,-19.20,4.91,0.00,1.00,153.60,-24.00,0 +9.60,-19.20,4.89,0.00,1.00,-24.00,-19.20,0 +4.80,-14.40,4.87,0.00,1.00,163.20,-14.40,0 +4.80,-9.60,4.85,0.00,1.00,-14.40,-14.40,0 +0.00,-4.80,4.83,0.00,1.00,172.80,-9.60,0 +0.00,0.00,4.81,0.00,1.00,-4.80,-4.80,0 +-4.80,4.80,4.79,0.00,1.00,0.00,0.00,0 +-4.80,9.60,4.76,0.00,1.00,-177.60,4.80,0 +-9.60,14.40,4.74,0.00,1.00,9.60,9.60,0 +-9.60,14.40,4.72,0.00,1.00,-168.00,9.60,0 +-14.40,19.20,4.70,0.00,1.00,19.20,14.40,0 +-14.40,24.00,4.68,0.00,1.00,-158.40,19.20,0 +-19.20,28.80,4.66,0.00,1.00,28.80,24.00,0 +-24.00,33.60,4.64,0.00,1.00,-148.80,28.80,0 +-28.80,33.60,4.61,0.00,1.00,38.40,28.80,0 +-28.80,38.40,4.59,0.00,1.00,-139.20,33.60,0 +-33.60,43.20,4.57,0.00,1.00,48.00,38.40,0 +-38.40,43.20,4.55,0.00,1.00,-129.60,43.20,0 +-48.00,48.00,4.53,0.00,1.00,57.60,43.20,0 +-52.80,52.80,4.51,0.00,1.00,-120.00,48.00,0 +-57.60,52.80,4.49,0.00,1.00,67.20,48.00,0 +-67.20,57.60,4.46,0.00,1.00,-110.40,52.80,0 +-76.80,57.60,4.44,0.00,1.00,76.80,52.80,0 +-81.60,57.60,4.42,0.00,1.00,-100.80,57.60,0 +-91.20,57.60,4.40,0.00,1.00,86.40,57.60,0 +-100.80,57.60,4.38,0.00,1.00,-86.40,57.60,0 +-110.40,57.60,4.36,0.00,1.00,96.00,57.60,0 +-115.20,52.80,4.34,0.00,1.00,-76.80,52.80,0 +-124.80,52.80,4.32,0.00,1.00,105.60,52.80,0 +-129.60,48.00,4.29,0.00,1.00,-67.20,52.80,0 +-139.20,48.00,4.27,0.00,1.00,115.20,48.00,0 +-144.00,43.20,4.25,0.00,1.00,-57.60,48.00,0 +-148.80,38.40,4.23,0.00,1.00,124.80,43.20,0 +-153.60,38.40,4.21,0.00,1.00,-48.00,38.40,0 +-153.60,33.60,4.19,0.00,1.00,134.40,38.40,0 +-158.40,28.80,4.17,0.00,1.00,-38.40,33.60,0 +-163.20,24.00,4.14,0.00,1.00,144.00,28.80,0 +-163.20,24.00,4.12,0.00,1.00,-28.80,24.00,0 +-168.00,19.20,4.10,0.00,1.00,153.60,24.00,0 +-172.80,14.40,4.08,0.00,1.00,-19.20,19.20,0 +-172.80,9.60,4.06,0.00,1.00,163.20,14.40,0 +-177.60,4.80,4.04,0.00,1.00,-9.60,9.60,0 +-177.60,0.00,4.02,0.00,1.00,172.80,4.80,0 +177.60,-0.00,3.99,0.00,1.00,-0.00,0.00,0 +177.60,-4.80,3.97,0.00,1.00,-177.60,-0.00,0 +172.80,-9.60,3.95,0.00,1.00,4.80,-4.80,0 +172.80,-14.40,3.93,0.00,1.00,-168.00,-9.60,0 +168.00,-19.20,3.91,0.00,1.00,14.40,-14.40,0 +163.20,-24.00,3.89,0.00,1.00,-158.40,-19.20,0 +163.20,-24.00,3.87,0.00,1.00,24.00,-24.00,0 +158.40,-28.80,3.85,0.00,1.00,-148.80,-24.00,0 +153.60,-33.60,3.82,0.00,1.00,33.60,-28.80,0 +153.60,-38.40,3.80,0.00,1.00,-139.20,-33.60,0 +148.80,-38.40,3.78,0.00,1.00,43.20,-38.40,0 +144.00,-43.20,3.76,0.00,1.00,-129.60,-38.40,0 +139.20,-48.00,3.74,0.00,1.00,52.80,-43.20,0 +129.60,-48.00,3.72,0.00,1.00,-120.00,-48.00,0 +124.80,-52.80,3.70,0.00,1.00,62.40,-48.00,0 +115.20,-52.80,3.67,0.00,1.00,-110.40,-52.80,0 +110.40,-57.60,3.65,0.00,1.00,72.00,-52.80,0 +100.80,-57.60,3.63,0.00,1.00,-100.80,-52.80,0 +91.20,-57.60,3.61,0.00,1.00,81.60,-57.60,0 +81.60,-57.60,3.59,0.00,1.00,-91.20,-57.60,0 +76.80,-57.60,3.57,0.00,1.00,96.00,-57.60,0 +67.20,-57.60,3.55,0.00,1.00,-81.60,-57.60,0 +57.60,-52.80,3.52,0.00,1.00,105.60,-52.80,0 +52.80,-52.80,3.50,0.00,1.00,-72.00,-52.80,0 +48.00,-48.00,3.48,0.00,1.00,115.20,-48.00,0 +38.40,-43.20,3.46,0.00,1.00,-62.40,-48.00,0 +33.60,-43.20,3.44,0.00,1.00,124.80,-43.20,0 +28.80,-38.40,3.42,0.00,1.00,-52.80,-43.20,0 +28.80,-33.60,3.40,0.00,1.00,134.40,-38.40,0 +24.00,-33.60,3.38,0.00,1.00,-43.20,-33.60,0 +19.20,-28.80,3.35,0.00,1.00,144.00,-28.80,0 +14.40,-24.00,3.33,0.00,1.00,-33.60,-28.80,0 +14.40,-19.20,3.31,0.00,1.00,153.60,-24.00,0 +9.60,-14.40,3.29,0.00,1.00,-24.00,-19.20,0 +9.60,-14.40,3.27,0.00,1.00,163.20,-14.40,0 +4.80,-9.60,3.25,0.00,1.00,-14.40,-9.60,0 +4.80,-4.80,3.23,0.00,1.00,172.80,-9.60,0 +0.00,0.00,3.20,0.00,1.00,-4.80,-4.80,0 +-4.80,4.80,3.18,0.00,1.00,0.00,0.00,0 +-4.80,9.60,3.16,0.00,1.00,-177.60,4.80,0 +-9.60,9.60,3.14,0.00,1.00,9.60,9.60,0 +-9.60,14.40,3.12,0.00,1.00,-168.00,9.60,0 +-14.40,19.20,3.10,0.00,1.00,19.20,14.40,0 +-19.20,24.00,3.08,0.00,1.00,-158.40,19.20,0 +-24.00,24.00,3.05,0.00,1.00,28.80,24.00,0 +-24.00,28.80,3.03,0.00,1.00,-148.80,24.00,0 +-28.80,33.60,3.01,0.00,1.00,38.40,28.80,0 +-33.60,38.40,2.99,0.00,1.00,-139.20,33.60,0 +-38.40,38.40,2.97,0.00,1.00,48.00,33.60,0 +-43.20,43.20,2.95,0.00,1.00,-129.60,38.40,0 +-48.00,43.20,2.93,0.00,1.00,57.60,43.20,0 +-52.80,48.00,2.91,0.00,1.00,-120.00,43.20,0 +-62.40,48.00,2.88,0.00,1.00,67.20,48.00,0 +-67.20,52.80,2.86,0.00,1.00,-110.40,48.00,0 +-76.80,52.80,2.84,0.00,1.00,76.80,48.00,0 +-86.40,52.80,2.82,0.00,1.00,-100.80,52.80,0 +-91.20,52.80,2.80,0.00,1.00,86.40,52.80,0 +-100.80,52.80,2.78,0.00,1.00,-86.40,52.80,0 +-105.60,52.80,2.76,0.00,1.00,96.00,52.80,0 +-115.20,48.00,2.73,0.00,1.00,-76.80,48.00,0 +-120.00,48.00,2.71,0.00,1.00,105.60,48.00,0 +-129.60,48.00,2.69,0.00,1.00,-67.20,48.00,0 +-134.40,43.20,2.67,0.00,1.00,115.20,43.20,0 +-139.20,43.20,2.65,0.00,1.00,-57.60,43.20,0 +-144.00,38.40,2.63,0.00,1.00,124.80,38.40,0 +-148.80,33.60,2.61,0.00,1.00,-48.00,38.40,0 +-153.60,33.60,2.58,0.00,1.00,134.40,33.60,0 +-158.40,28.80,2.56,0.00,1.00,-38.40,28.80,0 +-158.40,24.00,2.54,0.00,1.00,144.00,28.80,0 +-163.20,19.20,2.52,0.00,1.00,-28.80,24.00,0 +-168.00,19.20,2.50,0.00,1.00,153.60,19.20,0 +-168.00,14.40,2.48,0.00,1.00,-19.20,14.40,0 +-172.80,9.60,2.46,0.00,1.00,163.20,14.40,0 +-177.60,4.80,2.44,0.00,1.00,-9.60,9.60,0 +-177.60,0.00,2.41,0.00,1.00,172.80,4.80,0 +177.60,-0.00,2.39,0.00,1.00,-0.00,0.00,0 +177.60,-4.80,2.37,0.00,1.00,-177.60,-0.00,0 +172.80,-9.60,2.35,0.00,1.00,4.80,-4.80,0 +168.00,-14.40,2.33,0.00,1.00,-168.00,-9.60,0 +168.00,-19.20,2.31,0.00,1.00,14.40,-14.40,0 +163.20,-19.20,2.29,0.00,1.00,-158.40,-14.40,0 +158.40,-24.00,2.26,0.00,1.00,24.00,-19.20,0 +158.40,-28.80,2.24,0.00,1.00,-148.80,-24.00,0 +153.60,-33.60,2.22,0.00,1.00,33.60,-28.80,0 +148.80,-33.60,2.20,0.00,1.00,-139.20,-28.80,0 +144.00,-38.40,2.18,0.00,1.00,43.20,-33.60,0 +139.20,-43.20,2.16,0.00,1.00,-129.60,-38.40,0 +134.40,-43.20,2.14,0.00,1.00,52.80,-38.40,0 +129.60,-48.00,2.11,0.00,1.00,-120.00,-43.20,0 +120.00,-48.00,2.09,0.00,1.00,62.40,-43.20,0 +115.20,-48.00,2.07,0.00,1.00,-110.40,-48.00,0 +105.60,-52.80,2.05,0.00,1.00,72.00,-48.00,0 +100.80,-52.80,2.03,0.00,1.00,-100.80,-48.00,0 +91.20,-52.80,2.01,0.00,1.00,81.60,-52.80,0 +86.40,-52.80,1.99,0.00,1.00,-91.20,-52.80,0 +76.80,-52.80,1.97,0.00,1.00,96.00,-52.80,0 +67.20,-52.80,1.94,0.00,1.00,-81.60,-52.80,0 +62.40,-48.00,1.92,0.00,1.00,105.60,-48.00,0 +52.80,-48.00,1.90,0.00,1.00,-72.00,-48.00,0 +48.00,-43.20,1.88,0.00,1.00,115.20,-48.00,0 +43.20,-43.20,1.86,0.00,1.00,-62.40,-43.20,0 +38.40,-38.40,1.84,0.00,1.00,124.80,-43.20,0 +33.60,-38.40,1.82,0.00,1.00,-52.80,-38.40,0 +28.80,-33.60,1.79,0.00,1.00,134.40,-33.60,0 +24.00,-28.80,1.77,0.00,1.00,-43.20,-33.60,0 +24.00,-24.00,1.75,0.00,1.00,144.00,-28.80,0 +19.20,-24.00,1.73,0.00,1.00,-33.60,-24.00,0 +14.40,-19.20,1.71,0.00,1.00,153.60,-24.00,0 +9.60,-14.40,1.69,0.00,1.00,-24.00,-19.20,0 +9.60,-9.60,1.67,0.00,1.00,163.20,-14.40,0 +4.80,-9.60,1.64,0.00,1.00,-14.40,-9.60,0 +4.80,-4.80,1.62,0.00,1.00,172.80,-9.60,0 +0.00,0.00,1.60,0.00,1.00,-4.80,-4.80,0 +-4.80,4.80,1.58,0.00,1.00,0.00,0.00,0 +-4.80,4.80,1.56,0.00,1.00,-177.60,4.80,0 +-9.60,9.60,1.54,0.00,1.00,9.60,4.80,0 +-14.40,14.40,1.52,0.00,1.00,-168.00,9.60,0 +-14.40,19.20,1.50,0.00,1.00,19.20,14.40,0 +-19.20,19.20,1.47,0.00,1.00,-158.40,19.20,0 +-24.00,24.00,1.45,0.00,1.00,28.80,19.20,0 +-28.80,28.80,1.43,0.00,1.00,-148.80,24.00,0 +-33.60,28.80,1.41,0.00,1.00,38.40,28.80,0 +-38.40,33.60,1.39,0.00,1.00,-139.20,28.80,0 +-43.20,38.40,1.37,0.00,1.00,48.00,33.60,0 +-48.00,38.40,1.35,0.00,1.00,-129.60,33.60,0 +-52.80,43.20,1.32,0.00,1.00,57.60,38.40,0 +-57.60,43.20,1.30,0.00,1.00,-120.00,38.40,0 +-62.40,43.20,1.28,0.00,1.00,67.20,43.20,0 +-72.00,48.00,1.26,0.00,1.00,-110.40,43.20,0 +-76.80,48.00,1.24,0.00,1.00,76.80,43.20,0 +-86.40,48.00,1.22,0.00,1.00,-100.80,48.00,0 +-91.20,48.00,1.20,0.00,1.00,86.40,48.00,0 +-100.80,48.00,1.17,0.00,1.00,-86.40,48.00,0 +-105.60,48.00,1.15,0.00,1.00,96.00,48.00,0 +-110.40,48.00,1.13,0.00,1.00,-76.80,48.00,0 +-120.00,43.20,1.11,0.00,1.00,105.60,43.20,0 +-124.80,43.20,1.09,0.00,1.00,-67.20,43.20,0 +-129.60,38.40,1.07,0.00,1.00,115.20,43.20,0 +-134.40,38.40,1.05,0.00,1.00,-57.60,38.40,0 +-139.20,33.60,1.03,0.00,1.00,124.80,38.40,0 +-144.00,33.60,1.00,0.00,1.00,-48.00,33.60,0 +-148.80,28.80,0.98,0.00,1.00,134.40,33.60,0 +-153.60,24.00,0.96,0.00,1.00,-38.40,28.80,0 +-158.40,24.00,0.94,0.00,1.00,144.00,24.00,0 +-163.20,19.20,0.92,0.00,1.00,-28.80,24.00,0 +-163.20,14.40,0.90,0.00,1.00,153.60,19.20,0 +-168.00,14.40,0.88,0.00,1.00,-19.20,14.40,0 +-172.80,9.60,0.85,0.00,1.00,163.20,14.40,0 +-172.80,4.80,0.83,0.00,1.00,-9.60,9.60,0 +-177.60,0.00,0.81,0.00,1.00,172.80,4.80,0 +177.60,-0.00,0.79,0.00,1.00,-0.00,0.00,0 +172.80,-4.80,0.77,0.00,1.00,-177.60,-0.00,0 +172.80,-9.60,0.75,0.00,1.00,4.80,-4.80,0 +168.00,-14.40,0.73,0.00,1.00,-168.00,-9.60,0 +163.20,-14.40,0.70,0.00,1.00,14.40,-14.40,0 +163.20,-19.20,0.68,0.00,1.00,-158.40,-14.40,0 +158.40,-24.00,0.66,0.00,1.00,24.00,-19.20,0 +153.60,-24.00,0.64,0.00,1.00,-148.80,-24.00,0 +148.80,-28.80,0.62,0.00,1.00,33.60,-24.00,0 +144.00,-33.60,0.60,0.00,1.00,-139.20,-28.80,0 +139.20,-33.60,0.58,0.00,1.00,43.20,-33.60,0 +134.40,-38.40,0.56,0.00,1.00,-129.60,-33.60,0 +129.60,-38.40,0.53,0.00,1.00,52.80,-38.40,0 +124.80,-43.20,0.51,0.00,1.00,-120.00,-38.40,0 +120.00,-43.20,0.49,0.00,1.00,62.40,-43.20,0 +110.40,-48.00,0.47,0.00,1.00,-110.40,-43.20,0 +105.60,-48.00,0.45,0.00,1.00,72.00,-43.20,0 +100.80,-48.00,0.43,0.00,1.00,-100.80,-48.00,0 +91.20,-48.00,0.41,0.00,1.00,81.60,-48.00,0 +86.40,-48.00,0.38,0.00,1.00,-91.20,-48.00,0 +76.80,-48.00,0.36,0.00,1.00,96.00,-48.00,0 +72.00,-48.00,0.34,0.00,1.00,-81.60,-48.00,0 +62.40,-43.20,0.32,0.00,1.00,105.60,-43.20,0 +57.60,-43.20,0.30,0.00,1.00,-72.00,-43.20,0 +52.80,-43.20,0.28,0.00,1.00,115.20,-43.20,0 +48.00,-38.40,0.26,0.00,1.00,-62.40,-38.40,0 +43.20,-38.40,0.23,0.00,1.00,124.80,-38.40,0 +38.40,-33.60,0.21,0.00,1.00,-52.80,-33.60,0 +33.60,-28.80,0.19,0.00,1.00,134.40,-33.60,0 +28.80,-28.80,0.17,0.00,1.00,-43.20,-28.80,0 +24.00,-24.00,0.15,0.00,1.00,144.00,-28.80,0 +19.20,-19.20,0.13,0.00,1.00,-33.60,-24.00,0 +14.40,-19.20,0.11,0.00,1.00,153.60,-19.20,0 +14.40,-14.40,0.09,0.00,1.00,-24.00,-19.20,0 +9.60,-9.60,0.06,0.00,1.00,163.20,-14.40,0 +4.80,-4.80,0.04,0.00,1.00,-14.40,-9.60,0 +4.80,-4.80,0.02,0.00,1.00,172.80,-4.80,0 +0.00,0.00,0.00,0.00,1.00,-4.80,-4.80,0 +-4.80,4.80,0.00,0.00,1.00,0.00,0.00,0 +-4.80,4.80,0.02,0.00,1.00,-177.60,4.80,0 +-9.60,9.60,0.04,0.00,1.00,9.60,4.80,0 +-14.40,14.40,0.06,0.00,1.00,-168.00,9.60,0 +-19.20,14.40,0.09,0.00,1.00,19.20,14.40,0 +-24.00,19.20,0.11,0.00,1.00,-158.40,14.40,0 +-24.00,24.00,0.13,0.00,1.00,28.80,19.20,0 +-28.80,24.00,0.15,0.00,1.00,-148.80,24.00,0 +-33.60,28.80,0.17,0.00,1.00,38.40,24.00,0 +-38.40,28.80,0.19,0.00,1.00,-139.20,28.80,0 +-43.20,33.60,0.21,0.00,1.00,48.00,28.80,0 +-48.00,33.60,0.23,0.00,1.00,-129.60,33.60,0 +-52.80,38.40,0.26,0.00,1.00,57.60,33.60,0 +-62.40,38.40,0.28,0.00,1.00,-120.00,38.40,0 +-67.20,38.40,0.30,0.00,1.00,67.20,38.40,0 +-72.00,43.20,0.32,0.00,1.00,-110.40,38.40,0 +-76.80,43.20,0.34,0.00,1.00,76.80,38.40,0 +-86.40,43.20,0.36,0.00,1.00,-100.80,43.20,0 +-91.20,43.20,0.38,0.00,1.00,86.40,43.20,0 +-96.00,43.20,0.41,0.00,1.00,-86.40,43.20,0 +-105.60,43.20,0.43,0.00,1.00,96.00,43.20,0 +-110.40,43.20,0.45,0.00,1.00,-76.80,43.20,0 +-115.20,38.40,0.47,0.00,1.00,105.60,38.40,0 +-124.80,38.40,0.49,0.00,1.00,-67.20,38.40,0 +-129.60,38.40,0.51,0.00,1.00,115.20,38.40,0 +-134.40,33.60,0.53,0.00,1.00,-57.60,33.60,0 +-139.20,33.60,0.56,0.00,1.00,124.80,33.60,0 +-144.00,28.80,0.58,0.00,1.00,-48.00,28.80,0 +-148.80,28.80,0.60,0.00,1.00,134.40,28.80,0 +-153.60,24.00,0.62,0.00,1.00,-38.40,24.00,0 +-158.40,19.20,0.64,0.00,1.00,144.00,24.00,0 +-158.40,19.20,0.66,0.00,1.00,-28.80,19.20,0 +-163.20,14.40,0.68,0.00,1.00,153.60,19.20,0 +-168.00,9.60,0.70,0.00,1.00,-19.20,14.40,0 +-172.80,9.60,0.73,0.00,1.00,163.20,9.60,0 +-172.80,4.80,0.75,0.00,1.00,-9.60,9.60,0 +-177.60,0.00,0.77,0.00,1.00,172.80,4.80,0 +177.60,-0.00,0.79,0.00,1.00,-0.00,0.00,0 +172.80,-4.80,0.81,0.00,1.00,-177.60,-0.00,0 +172.80,-9.60,0.83,0.00,1.00,4.80,-4.80,0 +168.00,-9.60,0.85,0.00,1.00,-168.00,-9.60,0 +163.20,-14.40,0.88,0.00,1.00,14.40,-9.60,0 +158.40,-19.20,0.90,0.00,1.00,-158.40,-14.40,0 +158.40,-19.20,0.92,0.00,1.00,24.00,-19.20,0 +153.60,-24.00,0.94,0.00,1.00,-148.80,-19.20,0 +148.80,-28.80,0.96,0.00,1.00,33.60,-24.00,0 +144.00,-28.80,0.98,0.00,1.00,-139.20,-24.00,0 +139.20,-33.60,1.00,0.00,1.00,43.20,-28.80,0 +134.40,-33.60,1.03,0.00,1.00,-129.60,-28.80,0 +129.60,-38.40,1.05,0.00,1.00,52.80,-33.60,0 +124.80,-38.40,1.07,0.00,1.00,-120.00,-33.60,0 +115.20,-38.40,1.09,0.00,1.00,62.40,-38.40,0 +110.40,-43.20,1.11,0.00,1.00,-110.40,-38.40,0 +105.60,-43.20,1.13,0.00,1.00,72.00,-38.40,0 +96.00,-43.20,1.15,0.00,1.00,-100.80,-43.20,0 +91.20,-43.20,1.17,0.00,1.00,81.60,-43.20,0 +86.40,-43.20,1.20,0.00,1.00,-91.20,-43.20,0 +76.80,-43.20,1.22,0.00,1.00,96.00,-43.20,0 +72.00,-43.20,1.24,0.00,1.00,-81.60,-43.20,0 +67.20,-38.40,1.26,0.00,1.00,105.60,-38.40,0 +62.40,-38.40,1.28,0.00,1.00,-72.00,-38.40,0 +52.80,-38.40,1.30,0.00,1.00,115.20,-38.40,0 +48.00,-33.60,1.32,0.00,1.00,-62.40,-38.40,0 +43.20,-33.60,1.35,0.00,1.00,124.80,-33.60,0 +38.40,-28.80,1.37,0.00,1.00,-52.80,-33.60,0 +33.60,-28.80,1.39,0.00,1.00,134.40,-28.80,0 +28.80,-24.00,1.41,0.00,1.00,-43.20,-28.80,0 +24.00,-24.00,1.43,0.00,1.00,144.00,-24.00,0 +24.00,-19.20,1.45,0.00,1.00,-33.60,-24.00,0 +19.20,-14.40,1.47,0.00,1.00,153.60,-19.20,0 +14.40,-14.40,1.50,0.00,1.00,-24.00,-14.40,0 +9.60,-9.60,1.52,0.00,1.00,163.20,-14.40,0 +4.80,-4.80,1.54,0.00,1.00,-14.40,-9.60,0 +4.80,-4.80,1.56,0.00,1.00,172.80,-4.80,0 +0.00,0.00,1.58,0.00,1.00,-4.80,-4.80,0 +-4.80,4.80,1.60,0.00,1.00,0.00,0.00,0 +-9.60,4.80,1.62,0.00,1.00,-177.60,4.80,0 +-9.60,9.60,1.64,0.00,1.00,9.60,4.80,0 +-14.40,9.60,1.67,0.00,1.00,-168.00,9.60,0 +-19.20,14.40,1.69,0.00,1.00,19.20,9.60,0 +-24.00,19.20,1.71,0.00,1.00,-158.40,14.40,0 +-28.80,19.20,1.73,0.00,1.00,28.80,19.20,0 +-33.60,24.00,1.75,0.00,1.00,-148.80,19.20,0 +-38.40,24.00,1.77,0.00,1.00,38.40,24.00,0 +-43.20,28.80,1.79,0.00,1.00,-139.20,24.00,0 +-48.00,28.80,1.82,0.00,1.00,48.00,28.80,0 +-52.80,33.60,1.84,0.00,1.00,-129.60,28.80,0 +-57.60,33.60,1.86,0.00,1.00,57.60,28.80,0 +-62.40,33.60,1.88,0.00,1.00,-120.00,33.60,0 +-67.20,38.40,1.90,0.00,1.00,67.20,33.60,0 +-72.00,38.40,1.92,0.00,1.00,-110.40,33.60,0 +-81.60,38.40,1.94,0.00,1.00,76.80,38.40,0 +-86.40,38.40,1.97,0.00,1.00,-100.80,38.40,0 +-91.20,38.40,1.99,0.00,1.00,86.40,38.40,0 +-96.00,38.40,2.01,0.00,1.00,-86.40,38.40,0 +-105.60,38.40,2.03,0.00,1.00,96.00,38.40,0 +-110.40,38.40,2.05,0.00,1.00,-76.80,38.40,0 +-115.20,33.60,2.07,0.00,1.00,105.60,33.60,0 +-120.00,33.60,2.09,0.00,1.00,-67.20,33.60,0 +-124.80,33.60,2.11,0.00,1.00,115.20,33.60,0 +-129.60,28.80,2.14,0.00,1.00,-57.60,33.60,0 +-134.40,28.80,2.16,0.00,1.00,124.80,28.80,0 +-139.20,24.00,2.18,0.00,1.00,-48.00,28.80,0 +-144.00,24.00,2.20,0.00,1.00,134.40,24.00,0 +-148.80,19.20,2.22,0.00,1.00,-38.40,24.00,0 +-153.60,19.20,2.24,0.00,1.00,144.00,19.20,0 +-158.40,14.40,2.26,0.00,1.00,-28.80,19.20,0 +-163.20,14.40,2.29,0.00,1.00,153.60,14.40,0 +-168.00,9.60,2.31,0.00,1.00,-19.20,14.40,0 +-172.80,9.60,2.33,0.00,1.00,163.20,9.60,0 +-172.80,4.80,2.35,0.00,1.00,-9.60,9.60,0 +-177.60,0.00,2.37,0.00,1.00,172.80,4.80,0 +177.60,-0.00,2.39,0.00,1.00,-0.00,0.00,0 +172.80,-4.80,2.41,0.00,1.00,-177.60,-0.00,0 +172.80,-9.60,2.44,0.00,1.00,4.80,-4.80,0 +168.00,-9.60,2.46,0.00,1.00,-168.00,-9.60,0 +163.20,-14.40,2.48,0.00,1.00,14.40,-9.60,0 +158.40,-14.40,2.50,0.00,1.00,-158.40,-14.40,0 +153.60,-19.20,2.52,0.00,1.00,24.00,-14.40,0 +148.80,-19.20,2.54,0.00,1.00,-148.80,-19.20,0 +144.00,-24.00,2.56,0.00,1.00,33.60,-19.20,0 +139.20,-24.00,2.58,0.00,1.00,-139.20,-24.00,0 +134.40,-28.80,2.61,0.00,1.00,43.20,-24.00,0 +129.60,-28.80,2.63,0.00,1.00,-129.60,-28.80,0 +124.80,-33.60,2.65,0.00,1.00,52.80,-28.80,0 +120.00,-33.60,2.67,0.00,1.00,-120.00,-33.60,0 +115.20,-33.60,2.69,0.00,1.00,62.40,-33.60,0 +110.40,-38.40,2.71,0.00,1.00,-110.40,-33.60,0 +105.60,-38.40,2.73,0.00,1.00,72.00,-33.60,0 +96.00,-38.40,2.76,0.00,1.00,-100.80,-38.40,0 +91.20,-38.40,2.78,0.00,1.00,81.60,-38.40,0 +86.40,-38.40,2.80,0.00,1.00,-91.20,-38.40,0 +81.60,-38.40,2.82,0.00,1.00,96.00,-38.40,0 +72.00,-38.40,2.84,0.00,1.00,-81.60,-38.40,0 +67.20,-38.40,2.86,0.00,1.00,105.60,-38.40,0 +62.40,-33.60,2.88,0.00,1.00,-72.00,-33.60,0 +57.60,-33.60,2.91,0.00,1.00,115.20,-33.60,0 +52.80,-33.60,2.93,0.00,1.00,-62.40,-33.60,0 +48.00,-28.80,2.95,0.00,1.00,124.80,-28.80,0 +43.20,-28.80,2.97,0.00,1.00,-52.80,-28.80,0 +38.40,-24.00,2.99,0.00,1.00,134.40,-28.80,0 +33.60,-24.00,3.01,0.00,1.00,-43.20,-24.00,0 +28.80,-19.20,3.03,0.00,1.00,144.00,-24.00,0 +24.00,-19.20,3.05,0.00,1.00,-33.60,-19.20,0 +19.20,-14.40,3.08,0.00,1.00,153.60,-19.20,0 +14.40,-9.60,3.10,0.00,1.00,-24.00,-14.40,0 +9.60,-9.60,3.12,0.00,1.00,163.20,-9.60,0 +9.60,-4.80,3.14,0.00,1.00,-14.40,-9.60,0 +4.80,-4.80,3.16,0.00,1.00,172.80,-4.80,0 +0.00,0.00,3.18,0.00,1.00,-4.80,-4.80,0 +-4.80,4.80,3.20,0.00,1.00,0.00,0.00,0 +-9.60,4.80,3.23,0.00,1.00,-177.60,4.80,0 +-14.40,9.60,3.25,0.00,1.00,9.60,4.80,0 +-14.40,9.60,3.27,0.00,1.00,-168.00,9.60,0 +-19.20,14.40,3.29,0.00,1.00,19.20,9.60,0 +-24.00,14.40,3.31,0.00,1.00,-158.40,14.40,0 +-28.80,19.20,3.33,0.00,1.00,28.80,14.40,0 +-33.60,19.20,3.35,0.00,1.00,-148.80,19.20,0 +-38.40,24.00,3.38,0.00,1.00,38.40,19.20,0 +-43.20,24.00,3.40,0.00,1.00,-139.20,19.20,0 +-48.00,24.00,3.42,0.00,1.00,48.00,24.00,0 +-52.80,28.80,3.44,0.00,1.00,-129.60,24.00,0 +-57.60,28.80,3.46,0.00,1.00,57.60,28.80,0 +-62.40,28.80,3.48,0.00,1.00,-120.00,28.80,0 +-67.20,33.60,3.50,0.00,1.00,67.20,28.80,0 +-72.00,33.60,3.52,0.00,1.00,-110.40,28.80,0 +-81.60,33.60,3.55,0.00,1.00,76.80,33.60,0 +-86.40,33.60,3.57,0.00,1.00,-100.80,33.60,0 +-91.20,33.60,3.59,0.00,1.00,86.40,33.60,0 +-96.00,33.60,3.61,0.00,1.00,-86.40,33.60,0 +-100.80,33.60,3.63,0.00,1.00,96.00,33.60,0 +-110.40,33.60,3.65,0.00,1.00,-76.80,33.60,0 +-115.20,33.60,3.67,0.00,1.00,105.60,28.80,0 +-120.00,28.80,3.70,0.00,1.00,-67.20,28.80,0 +-124.80,28.80,3.72,0.00,1.00,115.20,28.80,0 +-129.60,28.80,3.74,0.00,1.00,-57.60,28.80,0 +-134.40,24.00,3.76,0.00,1.00,124.80,24.00,0 +-139.20,24.00,3.78,0.00,1.00,-48.00,24.00,0 +-144.00,19.20,3.80,0.00,1.00,134.40,24.00,0 +-148.80,19.20,3.82,0.00,1.00,-38.40,19.20,0 +-153.60,14.40,3.85,0.00,1.00,144.00,19.20,0 +-158.40,14.40,3.87,0.00,1.00,-28.80,14.40,0 +-163.20,9.60,3.89,0.00,1.00,153.60,14.40,0 +-168.00,9.60,3.91,0.00,1.00,-19.20,9.60,0 +-168.00,4.80,3.93,0.00,1.00,163.20,9.60,0 +-172.80,4.80,3.95,0.00,1.00,-9.60,4.80,0 +-177.60,0.00,3.97,0.00,1.00,172.80,4.80,0 +177.60,-0.00,3.99,0.00,1.00,-0.00,0.00,0 +172.80,-4.80,4.02,0.00,1.00,-177.60,-0.00,0 +168.00,-4.80,4.04,0.00,1.00,4.80,-4.80,0 +168.00,-9.60,4.06,0.00,1.00,-168.00,-4.80,0 +163.20,-9.60,4.08,0.00,1.00,14.40,-9.60,0 +158.40,-14.40,4.10,0.00,1.00,-158.40,-9.60,0 +153.60,-14.40,4.12,0.00,1.00,24.00,-14.40,0 +148.80,-19.20,4.14,0.00,1.00,-148.80,-14.40,0 +144.00,-19.20,4.17,0.00,1.00,33.60,-19.20,0 +139.20,-24.00,4.19,0.00,1.00,-139.20,-19.20,0 +134.40,-24.00,4.21,0.00,1.00,43.20,-24.00,0 +129.60,-28.80,4.23,0.00,1.00,-129.60,-24.00,0 +124.80,-28.80,4.25,0.00,1.00,52.80,-24.00,0 +120.00,-28.80,4.27,0.00,1.00,-120.00,-28.80,0 +115.20,-33.60,4.29,0.00,1.00,62.40,-28.80,0 +110.40,-33.60,4.32,0.00,1.00,-110.40,-28.80,0 +100.80,-33.60,4.34,0.00,1.00,72.00,-28.80,0 +96.00,-33.60,4.36,0.00,1.00,-100.80,-33.60,0 +91.20,-33.60,4.38,0.00,1.00,81.60,-33.60,0 +86.40,-33.60,4.40,0.00,1.00,-91.20,-33.60,0 +81.60,-33.60,4.42,0.00,1.00,96.00,-33.60,0 +72.00,-33.60,4.44,0.00,1.00,-81.60,-33.60,0 +67.20,-33.60,4.46,0.00,1.00,105.60,-33.60,0 +62.40,-28.80,4.49,0.00,1.00,-72.00,-28.80,0 +57.60,-28.80,4.51,0.00,1.00,115.20,-28.80,0 +52.80,-28.80,4.53,0.00,1.00,-62.40,-28.80,0 +48.00,-24.00,4.55,0.00,1.00,124.80,-28.80,0 +43.20,-24.00,4.57,0.00,1.00,-52.80,-24.00,0 +38.40,-24.00,4.59,0.00,1.00,134.40,-24.00,0 +33.60,-19.20,4.61,0.00,1.00,-43.20,-19.20,0 +28.80,-19.20,4.64,0.00,1.00,144.00,-19.20,0 +24.00,-14.40,4.66,0.00,1.00,-33.60,-19.20,0 +19.20,-14.40,4.68,0.00,1.00,153.60,-14.40,0 +14.40,-9.60,4.70,0.00,1.00,-24.00,-14.40,0 +14.40,-9.60,4.72,0.00,1.00,163.20,-9.60,0 +9.60,-4.80,4.74,0.00,1.00,-14.40,-9.60,0 +4.80,-4.80,4.76,0.00,1.00,172.80,-4.80,0 +0.00,0.00,4.79,0.00,1.00,-4.80,-4.80,0 +-4.80,0.00,4.81,0.00,1.00,0.00,0.00,0 +-9.60,4.80,4.83,0.00,1.00,-177.60,0.00,0 +-14.40,4.80,4.85,0.00,1.00,9.60,4.80,0 +-19.20,9.60,4.87,0.00,1.00,-168.00,4.80,0 +-19.20,9.60,4.89,0.00,1.00,19.20,9.60,0 +-24.00,14.40,4.91,0.00,1.00,-158.40,9.60,0 +-28.80,14.40,4.93,0.00,1.00,28.80,14.40,0 +-33.60,19.20,4.96,0.00,1.00,-148.80,14.40,0 +-38.40,19.20,4.98,0.00,1.00,38.40,14.40,0 +-43.20,19.20,5.00,0.00,1.00,-139.20,19.20,0 +-48.00,24.00,5.02,0.00,1.00,48.00,19.20,0 +-52.80,24.00,5.04,0.00,1.00,-129.60,24.00,0 +-57.60,24.00,5.06,0.00,1.00,57.60,24.00,0 +-62.40,24.00,5.08,0.00,1.00,-120.00,24.00,0 +-72.00,28.80,5.11,0.00,1.00,67.20,24.00,0 +-76.80,28.80,5.13,0.00,1.00,-110.40,24.00,0 +-81.60,28.80,5.15,0.00,1.00,76.80,28.80,0 +-86.40,28.80,5.17,0.00,1.00,-100.80,28.80,0 +-91.20,28.80,5.19,0.00,1.00,86.40,28.80,0 +-96.00,28.80,5.21,0.00,1.00,-86.40,28.80,0 +-100.80,28.80,5.23,0.00,1.00,96.00,28.80,0 +-105.60,28.80,5.26,0.00,1.00,-76.80,28.80,0 +-115.20,28.80,5.28,0.00,1.00,105.60,28.80,0 +-120.00,24.00,5.30,0.00,1.00,-67.20,24.00,0 +-124.80,24.00,5.32,0.00,1.00,115.20,24.00,0 +-129.60,24.00,5.34,0.00,1.00,-57.60,24.00,0 +-134.40,24.00,5.36,0.00,1.00,124.80,24.00,0 +-139.20,19.20,5.38,0.00,1.00,-48.00,19.20,0 +-144.00,19.20,5.40,0.00,1.00,134.40,19.20,0 +-148.80,14.40,5.43,0.00,1.00,-38.40,19.20,0 +-153.60,14.40,5.45,0.00,1.00,144.00,14.40,0 +-158.40,14.40,5.47,0.00,1.00,-28.80,14.40,0 +-163.20,9.60,5.49,0.00,1.00,153.60,9.60,0 +-163.20,9.60,5.51,0.00,1.00,-19.20,9.60,0 +-168.00,4.80,5.53,0.00,1.00,163.20,9.60,0 +-172.80,4.80,5.55,0.00,1.00,-9.60,4.80,0 +-177.60,0.00,5.58,0.00,1.00,172.80,4.80,0 +177.60,-0.00,5.60,0.00,1.00,-0.00,0.00,0 +172.80,-4.80,5.62,0.00,1.00,-177.60,-0.00,0 +168.00,-4.80,5.64,0.00,1.00,4.80,-4.80,0 +163.20,-9.60,5.66,0.00,1.00,-168.00,-4.80,0 +163.20,-9.60,5.68,0.00,1.00,14.40,-9.60,0 +158.40,-14.40,5.70,0.00,1.00,-158.40,-9.60,0 +153.60,-14.40,5.72,0.00,1.00,24.00,-9.60,0 +148.80,-14.40,5.75,0.00,1.00,-148.80,-14.40,0 +144.00,-19.20,5.77,0.00,1.00,33.60,-14.40,0 +139.20,-19.20,5.79,0.00,1.00,-139.20,-19.20,0 +134.40,-24.00,5.81,0.00,1.00,43.20,-19.20,0 +129.60,-24.00,5.83,0.00,1.00,-129.60,-19.20,0 +124.80,-24.00,5.85,0.00,1.00,52.80,-24.00,0 +120.00,-24.00,5.87,0.00,1.00,-120.00,-24.00,0 +115.20,-28.80,5.90,0.00,1.00,62.40,-24.00,0 +105.60,-28.80,5.92,0.00,1.00,-110.40,-24.00,0 +100.80,-28.80,5.94,0.00,1.00,72.00,-28.80,0 +96.00,-28.80,5.96,0.00,1.00,-100.80,-28.80,0 +91.20,-28.80,5.98,0.00,1.00,81.60,-28.80,0 +86.40,-28.80,6.00,0.00,1.00,-91.20,-28.80,0 +81.60,-28.80,6.02,0.00,1.00,96.00,-28.80,0 +76.80,-28.80,6.05,0.00,1.00,-81.60,-28.80,0 +72.00,-28.80,6.07,0.00,1.00,105.60,-28.80,0 +62.40,-24.00,6.09,0.00,1.00,-72.00,-24.00,0 +57.60,-24.00,6.11,0.00,1.00,115.20,-24.00,0 +52.80,-24.00,6.13,0.00,1.00,-62.40,-24.00,0 +48.00,-24.00,6.15,0.00,1.00,124.80,-24.00,0 +43.20,-19.20,6.17,0.00,1.00,-52.80,-24.00,0 +38.40,-19.20,6.19,0.00,1.00,134.40,-19.20,0 +33.60,-19.20,6.22,0.00,1.00,-43.20,-19.20,0 +28.80,-14.40,6.24,0.00,1.00,144.00,-14.40,0 +24.00,-14.40,6.26,0.00,1.00,-33.60,-14.40,0 +19.20,-9.60,6.28,0.00,1.00,153.60,-14.40,0 +19.20,-9.60,6.30,0.00,1.00,-24.00,-9.60,0 +14.40,-4.80,6.32,0.00,1.00,163.20,-9.60,0 +9.60,-4.80,6.34,0.00,1.00,-14.40,-4.80,0 +4.80,-0.00,6.37,0.00,1.00,172.80,-4.80,0 +0.00,0.00,6.39,0.00,1.00,-4.80,-0.00,0 +-4.80,0.00,6.41,0.00,1.00,0.00,0.00,0 +-9.60,4.80,6.43,0.00,1.00,-177.60,0.00,0 +-14.40,4.80,6.45,0.00,1.00,9.60,4.80,0 +-19.20,9.60,6.47,0.00,1.00,-168.00,4.80,0 +-24.00,9.60,6.49,0.00,1.00,19.20,9.60,0 +-28.80,9.60,6.52,0.00,1.00,-158.40,9.60,0 +-33.60,14.40,6.54,0.00,1.00,28.80,9.60,0 +-33.60,14.40,6.56,0.00,1.00,-148.80,14.40,0 +-38.40,14.40,6.58,0.00,1.00,38.40,14.40,0 +-43.20,19.20,6.60,0.00,1.00,-139.20,14.40,0 +-48.00,19.20,6.62,0.00,1.00,48.00,14.40,0 +-57.60,19.20,6.64,0.00,1.00,-129.60,19.20,0 +-62.40,19.20,6.66,0.00,1.00,57.60,19.20,0 +-67.20,24.00,6.69,0.00,1.00,-120.00,19.20,0 +-72.00,24.00,6.71,0.00,1.00,67.20,19.20,0 +-76.80,24.00,6.73,0.00,1.00,-110.40,24.00,0 +-81.60,24.00,6.75,0.00,1.00,76.80,24.00,0 +-86.40,24.00,6.77,0.00,1.00,-100.80,24.00,0 +-91.20,24.00,6.79,0.00,1.00,86.40,24.00,0 +-96.00,24.00,6.81,0.00,1.00,-86.40,24.00,0 +-100.80,24.00,6.84,0.00,1.00,96.00,24.00,0 +-105.60,24.00,6.86,0.00,1.00,-76.80,24.00,0 +-110.40,24.00,6.88,0.00,1.00,105.60,24.00,0 +-115.20,19.20,6.90,0.00,1.00,-67.20,19.20,0 +-120.00,19.20,6.92,0.00,1.00,115.20,19.20,0 +-129.60,19.20,6.94,0.00,1.00,-57.60,19.20,0 +-134.40,19.20,6.96,0.00,1.00,124.80,19.20,0 +-139.20,19.20,6.99,0.00,1.00,-48.00,19.20,0 +-144.00,14.40,7.01,0.00,1.00,134.40,14.40,0 +-148.80,14.40,7.03,0.00,1.00,-38.40,14.40,0 +-148.80,14.40,7.05,0.00,1.00,144.00,14.40,0 +-153.60,9.60,7.07,0.00,1.00,-28.80,9.60,0 +-158.40,9.60,7.09,0.00,1.00,153.60,9.60,0 +-163.20,4.80,7.11,0.00,1.00,-19.20,9.60,0 +-168.00,4.80,7.13,0.00,1.00,163.20,4.80,0 +-172.80,4.80,7.16,0.00,1.00,-9.60,4.80,0 +-177.60,0.00,7.18,0.00,1.00,172.80,4.80,0 +177.60,-0.00,7.20,0.00,1.00,-0.00,0.00,0 +172.80,-4.80,7.22,0.00,1.00,-177.60,-0.00,0 +168.00,-4.80,7.24,0.00,1.00,4.80,-4.80,0 +163.20,-4.80,7.26,0.00,1.00,-168.00,-4.80,0 +158.40,-9.60,7.28,0.00,1.00,14.40,-4.80,0 +153.60,-9.60,7.31,0.00,1.00,-158.40,-9.60,0 +148.80,-14.40,7.33,0.00,1.00,24.00,-9.60,0 +148.80,-14.40,7.35,0.00,1.00,-148.80,-9.60,0 +144.00,-14.40,7.37,0.00,1.00,33.60,-14.40,0 +139.20,-19.20,7.39,0.00,1.00,-139.20,-14.40,0 +134.40,-19.20,7.41,0.00,1.00,43.20,-14.40,0 +129.60,-19.20,7.43,0.00,1.00,-129.60,-19.20,0 +120.00,-19.20,7.46,0.00,1.00,52.80,-19.20,0 +115.20,-19.20,7.48,0.00,1.00,-120.00,-19.20,0 +110.40,-24.00,7.50,0.00,1.00,62.40,-19.20,0 +105.60,-24.00,7.52,0.00,1.00,-110.40,-19.20,0 +100.80,-24.00,7.54,0.00,1.00,72.00,-24.00,0 +96.00,-24.00,7.56,0.00,1.00,-100.80,-24.00,0 +91.20,-24.00,7.58,0.00,1.00,81.60,-24.00,0 +86.40,-24.00,7.60,0.00,1.00,-91.20,-24.00,0 +81.60,-24.00,7.63,0.00,1.00,96.00,-24.00,0 +76.80,-24.00,7.65,0.00,1.00,-81.60,-24.00,0 +72.00,-24.00,7.67,0.00,1.00,105.60,-24.00,0 +67.20,-24.00,7.69,0.00,1.00,-72.00,-24.00,0 +62.40,-19.20,7.71,0.00,1.00,115.20,-19.20,0 +57.60,-19.20,7.73,0.00,1.00,-62.40,-19.20,0 +48.00,-19.20,7.75,0.00,1.00,124.80,-19.20,0 +43.20,-19.20,7.78,0.00,1.00,-52.80,-19.20,0 +38.40,-14.40,7.80,0.00,1.00,134.40,-14.40,0 +33.60,-14.40,7.82,0.00,1.00,-43.20,-14.40,0 +33.60,-14.40,7.84,0.00,1.00,144.00,-14.40,0 +28.80,-9.60,7.86,0.00,1.00,-33.60,-14.40,0 +24.00,-9.60,7.88,0.00,1.00,153.60,-9.60,0 +19.20,-9.60,7.90,0.00,1.00,-24.00,-9.60,0 +14.40,-4.80,7.93,0.00,1.00,163.20,-9.60,0 +9.60,-4.80,7.95,0.00,1.00,-14.40,-4.80,0 +4.80,-0.00,7.97,0.00,1.00,172.80,-4.80,0 +0.00,0.00,7.99,0.00,1.00,-4.80,-0.00,0 +-4.80,0.00,8.01,0.00,1.00,0.00,0.00,0 +-9.60,4.80,8.03,0.00,1.00,-177.60,0.00,0 +-14.40,4.80,8.05,0.00,1.00,9.60,4.80,0 +-19.20,4.80,8.07,0.00,1.00,-168.00,4.80,0 +-24.00,9.60,8.10,0.00,1.00,19.20,4.80,0 +-28.80,9.60,8.12,0.00,1.00,-158.40,9.60,0 +-33.60,9.60,8.14,0.00,1.00,24.00,9.60,0 +-38.40,9.60,8.16,0.00,1.00,-148.80,9.60,0 +-43.20,14.40,8.18,0.00,1.00,33.60,9.60,0 +-48.00,14.40,8.20,0.00,1.00,-139.20,14.40,0 +-52.80,14.40,8.22,0.00,1.00,43.20,14.40,0 +-57.60,14.40,8.25,0.00,1.00,-129.60,14.40,0 +-62.40,19.20,8.27,0.00,1.00,52.80,14.40,0 +-67.20,19.20,8.29,0.00,1.00,-120.00,14.40,0 +-72.00,19.20,8.31,0.00,1.00,62.40,14.40,0 +-76.80,19.20,8.33,0.00,1.00,-110.40,19.20,0 +-81.60,19.20,8.35,0.00,1.00,76.80,19.20,0 +-86.40,19.20,8.37,0.00,1.00,-100.80,19.20,0 +-91.20,19.20,8.40,0.00,1.00,86.40,19.20,0 +-96.00,19.20,8.42,0.00,1.00,-86.40,19.20,0 +-100.80,19.20,8.44,0.00,1.00,96.00,19.20,0 +-105.60,19.20,8.46,0.00,1.00,-76.80,19.20,0 +-110.40,19.20,8.48,0.00,1.00,105.60,19.20,0 +-115.20,19.20,8.50,0.00,1.00,-67.20,19.20,0 +-120.00,14.40,8.52,0.00,1.00,120.00,14.40,0 +-124.80,14.40,8.54,0.00,1.00,-57.60,14.40,0 +-129.60,14.40,8.57,0.00,1.00,129.60,14.40,0 +-134.40,14.40,8.59,0.00,1.00,-48.00,14.40,0 +-139.20,14.40,8.61,0.00,1.00,139.20,14.40,0 +-144.00,9.60,8.63,0.00,1.00,-38.40,9.60,0 +-148.80,9.60,8.65,0.00,1.00,148.80,9.60,0 +-153.60,9.60,8.67,0.00,1.00,-28.80,9.60,0 +-158.40,4.80,8.69,0.00,1.00,158.40,9.60,0 +-163.20,4.80,8.72,0.00,1.00,-19.20,4.80,0 +-168.00,4.80,8.74,0.00,1.00,163.20,4.80,0 +-172.80,0.00,8.76,0.00,1.00,-9.60,4.80,0 +-177.60,0.00,8.78,0.00,1.00,172.80,0.00,0 +177.60,-0.00,8.80,0.00,1.00,-0.00,0.00,0 +172.80,-0.00,8.82,0.00,1.00,-177.60,-0.00,0 +168.00,-4.80,8.84,0.00,1.00,4.80,-0.00,0 +163.20,-4.80,8.87,0.00,1.00,-168.00,-4.80,0 +158.40,-4.80,8.89,0.00,1.00,14.40,-4.80,0 +153.60,-9.60,8.91,0.00,1.00,-158.40,-4.80,0 +148.80,-9.60,8.93,0.00,1.00,24.00,-9.60,0 +144.00,-9.60,8.95,0.00,1.00,-153.60,-9.60,0 +139.20,-14.40,8.97,0.00,1.00,33.60,-9.60,0 +134.40,-14.40,8.99,0.00,1.00,-144.00,-9.60,0 +129.60,-14.40,9.01,0.00,1.00,43.20,-14.40,0 +124.80,-14.40,9.04,0.00,1.00,-134.40,-14.40,0 +120.00,-14.40,9.06,0.00,1.00,52.80,-14.40,0 +115.20,-19.20,9.08,0.00,1.00,-124.80,-14.40,0 +110.40,-19.20,9.10,0.00,1.00,62.40,-14.40,0 +105.60,-19.20,9.12,0.00,1.00,-110.40,-19.20,0 +100.80,-19.20,9.14,0.00,1.00,72.00,-19.20,0 +96.00,-19.20,9.16,0.00,1.00,-100.80,-19.20,0 +91.20,-19.20,9.19,0.00,1.00,81.60,-19.20,0 +86.40,-19.20,9.21,0.00,1.00,-91.20,-19.20,0 +81.60,-19.20,9.23,0.00,1.00,96.00,-19.20,0 +76.80,-19.20,9.25,0.00,1.00,-81.60,-19.20,0 +72.00,-19.20,9.27,0.00,1.00,105.60,-19.20,0 +67.20,-19.20,9.29,0.00,1.00,-72.00,-19.20,0 +62.40,-19.20,9.31,0.00,1.00,115.20,-14.40,0 +57.60,-14.40,9.34,0.00,1.00,-57.60,-14.40,0 +52.80,-14.40,9.36,0.00,1.00,124.80,-14.40,0 +48.00,-14.40,9.38,0.00,1.00,-48.00,-14.40,0 +43.20,-14.40,9.40,0.00,1.00,134.40,-14.40,0 +38.40,-9.60,9.42,0.00,1.00,-38.40,-14.40,0 +33.60,-9.60,9.44,0.00,1.00,144.00,-9.60,0 +28.80,-9.60,9.46,0.00,1.00,-28.80,-9.60,0 +24.00,-9.60,9.48,0.00,1.00,153.60,-9.60,0 +19.20,-4.80,9.51,0.00,1.00,-24.00,-9.60,0 +14.40,-4.80,9.53,0.00,1.00,163.20,-4.80,0 +9.60,-4.80,9.55,0.00,1.00,-14.40,-4.80,0 +4.80,-0.00,9.57,0.00,1.00,172.80,-4.80,0 +0.00,0.00,9.59,0.00,1.00,-4.80,-0.00,0 +-4.80,0.00,9.61,0.00,1.00,0.00,0.00,0 +-9.60,0.00,9.63,0.00,1.00,-177.60,0.00,0 +-14.40,4.80,9.66,0.00,1.00,9.60,0.00,0 +-19.20,4.80,9.68,0.00,1.00,-168.00,4.80,0 +-24.00,4.80,9.70,0.00,1.00,14.40,4.80,0 +-28.80,4.80,9.72,0.00,1.00,-158.40,4.80,0 +-33.60,9.60,9.74,0.00,1.00,24.00,4.80,0 +-38.40,9.60,9.76,0.00,1.00,-148.80,9.60,0 +-43.20,9.60,9.78,0.00,1.00,33.60,9.60,0 +-48.00,9.60,9.81,0.00,1.00,-139.20,9.60,0 +-52.80,9.60,9.83,0.00,1.00,43.20,9.60,0 +-57.60,14.40,9.85,0.00,1.00,-129.60,9.60,0 +-62.40,14.40,9.87,0.00,1.00,52.80,9.60,0 +-67.20,14.40,9.89,0.00,1.00,-120.00,9.60,0 +-72.00,14.40,9.91,0.00,1.00,62.40,14.40,0 +-76.80,14.40,9.93,0.00,1.00,-110.40,14.40,0 +-81.60,14.40,9.95,0.00,1.00,76.80,14.40,0 +-86.40,14.40,9.98,0.00,1.00,-100.80,14.40,0 +-91.20,14.40,10.00,0.00,1.00,86.40,14.40,0 +-96.00,14.40,10.02,0.00,1.00,-86.40,14.40,0 +-100.80,14.40,10.04,0.00,1.00,96.00,14.40,0 +-105.60,14.40,10.06,0.00,1.00,-76.80,14.40,0 +-110.40,14.40,10.08,0.00,1.00,110.40,14.40,0 +-115.20,14.40,10.10,0.00,1.00,-67.20,14.40,0 +-120.00,14.40,10.13,0.00,1.00,120.00,9.60,0 +-124.80,9.60,10.15,0.00,1.00,-57.60,9.60,0 +-129.60,9.60,10.17,0.00,1.00,129.60,9.60,0 +-134.40,9.60,10.19,0.00,1.00,-48.00,9.60,0 +-139.20,9.60,10.21,0.00,1.00,139.20,9.60,0 +-144.00,9.60,10.23,0.00,1.00,-38.40,9.60,0 +-148.80,9.60,10.25,0.00,1.00,148.80,9.60,0 +-153.60,4.80,10.28,0.00,1.00,-28.80,4.80,0 +-158.40,4.80,10.30,0.00,1.00,158.40,4.80,0 +-163.20,4.80,10.32,0.00,1.00,-19.20,4.80,0 +-168.00,4.80,10.34,0.00,1.00,168.00,4.80,0 +-172.80,0.00,10.36,0.00,1.00,-9.60,4.80,0 +-177.60,0.00,10.38,0.00,1.00,172.80,0.00,0 +177.60,-0.00,10.40,0.00,1.00,-0.00,0.00,0 +172.80,-0.00,10.42,0.00,1.00,-177.60,-0.00,0 +168.00,-4.80,10.45,0.00,1.00,4.80,-0.00,0 +163.20,-4.80,10.47,0.00,1.00,-168.00,-4.80,0 +158.40,-4.80,10.49,0.00,1.00,14.40,-4.80,0 +153.60,-4.80,10.51,0.00,1.00,-163.20,-4.80,0 +148.80,-9.60,10.53,0.00,1.00,24.00,-4.80,0 +144.00,-9.60,10.55,0.00,1.00,-153.60,-4.80,0 +139.20,-9.60,10.57,0.00,1.00,33.60,-9.60,0 +134.40,-9.60,10.60,0.00,1.00,-144.00,-9.60,0 +129.60,-9.60,10.62,0.00,1.00,43.20,-9.60,0 +124.80,-9.60,10.64,0.00,1.00,-134.40,-9.60,0 +120.00,-14.40,10.66,0.00,1.00,52.80,-9.60,0 +115.20,-14.40,10.68,0.00,1.00,-124.80,-9.60,0 +110.40,-14.40,10.70,0.00,1.00,62.40,-9.60,0 +105.60,-14.40,10.72,0.00,1.00,-115.20,-14.40,0 +100.80,-14.40,10.74,0.00,1.00,72.00,-14.40,0 +96.00,-14.40,10.77,0.00,1.00,-100.80,-14.40,0 +91.20,-14.40,10.79,0.00,1.00,81.60,-14.40,0 +86.40,-14.40,10.81,0.00,1.00,-91.20,-14.40,0 +81.60,-14.40,10.83,0.00,1.00,96.00,-14.40,0 +76.80,-14.40,10.85,0.00,1.00,-81.60,-14.40,0 +72.00,-14.40,10.87,0.00,1.00,105.60,-14.40,0 +67.20,-14.40,10.89,0.00,1.00,-67.20,-14.40,0 +62.40,-14.40,10.92,0.00,1.00,115.20,-14.40,0 +57.60,-14.40,10.94,0.00,1.00,-57.60,-9.60,0 +52.80,-9.60,10.96,0.00,1.00,124.80,-9.60,0 +48.00,-9.60,10.98,0.00,1.00,-48.00,-9.60,0 +43.20,-9.60,11.00,0.00,1.00,134.40,-9.60,0 +38.40,-9.60,11.02,0.00,1.00,-38.40,-9.60,0 +33.60,-9.60,11.04,0.00,1.00,144.00,-9.60,0 +28.80,-4.80,11.07,0.00,1.00,-28.80,-9.60,0 +24.00,-4.80,11.09,0.00,1.00,153.60,-4.80,0 +19.20,-4.80,11.11,0.00,1.00,-19.20,-4.80,0 +14.40,-4.80,11.13,0.00,1.00,163.20,-4.80,0 +9.60,-0.00,11.15,0.00,1.00,-14.40,-4.80,0 +4.80,-0.00,11.17,0.00,1.00,172.80,-0.00,0 +0.00,0.00,11.19,0.00,1.00,-4.80,-0.00,0 +-4.80,0.00,11.21,0.00,1.00,0.00,0.00,0 +-9.60,0.00,11.24,0.00,1.00,-177.60,0.00,0 +-14.40,0.00,11.26,0.00,1.00,9.60,0.00,0 +-19.20,4.80,11.28,0.00,1.00,-168.00,0.00,0 +-24.00,4.80,11.30,0.00,1.00,14.40,4.80,0 +-28.80,4.80,11.32,0.00,1.00,-158.40,4.80,0 +-33.60,4.80,11.34,0.00,1.00,24.00,4.80,0 +-38.40,4.80,11.36,0.00,1.00,-153.60,4.80,0 +-43.20,4.80,11.39,0.00,1.00,33.60,4.80,0 +-48.00,4.80,11.41,0.00,1.00,-144.00,4.80,0 +-52.80,9.60,11.43,0.00,1.00,43.20,4.80,0 +-57.60,9.60,11.45,0.00,1.00,-134.40,4.80,0 +-62.40,9.60,11.47,0.00,1.00,52.80,4.80,0 +-67.20,9.60,11.49,0.00,1.00,-124.80,9.60,0 +-72.00,9.60,11.51,0.00,1.00,62.40,9.60,0 +-76.80,9.60,11.54,0.00,1.00,-110.40,9.60,0 +-81.60,9.60,11.56,0.00,1.00,72.00,9.60,0 +-86.40,9.60,11.58,0.00,1.00,-100.80,9.60,0 +-91.20,9.60,11.60,0.00,1.00,86.40,9.60,0 +-96.00,9.60,11.62,0.00,1.00,-86.40,9.60,0 +-100.80,9.60,11.64,0.00,1.00,96.00,9.60,0 +-105.60,9.60,11.66,0.00,1.00,-76.80,9.60,0 +-110.40,9.60,11.68,0.00,1.00,110.40,9.60,0 +-115.20,9.60,11.71,0.00,1.00,-67.20,9.60,0 +-120.00,9.60,11.73,0.00,1.00,120.00,9.60,0 +-124.80,9.60,11.75,0.00,1.00,-52.80,9.60,0 +-129.60,9.60,11.77,0.00,1.00,129.60,4.80,0 +-134.40,4.80,11.79,0.00,1.00,-43.20,4.80,0 +-139.20,4.80,11.81,0.00,1.00,139.20,4.80,0 +-144.00,4.80,11.83,0.00,1.00,-33.60,4.80,0 +-148.80,4.80,11.86,0.00,1.00,148.80,4.80,0 +-153.60,4.80,11.88,0.00,1.00,-24.00,4.80,0 +-158.40,4.80,11.90,0.00,1.00,158.40,4.80,0 +-163.20,4.80,11.92,0.00,1.00,-19.20,4.80,0 +-168.00,0.00,11.94,0.00,1.00,168.00,4.80,0 +-172.80,0.00,11.96,0.00,1.00,-9.60,0.00,0 +-177.60,0.00,11.98,0.00,1.00,172.80,0.00,0 +177.60,-0.00,12.01,0.00,1.00,-0.00,0.00,0 +172.80,-0.00,12.03,0.00,1.00,-177.60,-0.00,0 +168.00,-0.00,12.05,0.00,1.00,4.80,-0.00,0 +163.20,-4.80,12.07,0.00,1.00,-168.00,-0.00,0 +158.40,-4.80,12.09,0.00,1.00,14.40,-4.80,0 +153.60,-4.80,12.11,0.00,1.00,-163.20,-4.80,0 +148.80,-4.80,12.13,0.00,1.00,24.00,-4.80,0 +144.00,-4.80,12.15,0.00,1.00,-153.60,-4.80,0 +139.20,-4.80,12.18,0.00,1.00,28.80,-4.80,0 +134.40,-4.80,12.20,0.00,1.00,-144.00,-4.80,0 +129.60,-9.60,12.22,0.00,1.00,38.40,-4.80,0 +124.80,-9.60,12.24,0.00,1.00,-134.40,-4.80,0 +120.00,-9.60,12.26,0.00,1.00,48.00,-4.80,0 +115.20,-9.60,12.28,0.00,1.00,-124.80,-9.60,0 +110.40,-9.60,12.30,0.00,1.00,57.60,-9.60,0 +105.60,-9.60,12.33,0.00,1.00,-115.20,-9.60,0 +100.80,-9.60,12.35,0.00,1.00,72.00,-9.60,0 +96.00,-9.60,12.37,0.00,1.00,-105.60,-9.60,0 +91.20,-9.60,12.39,0.00,1.00,81.60,-9.60,0 +86.40,-9.60,12.41,0.00,1.00,-91.20,-9.60,0 +81.60,-9.60,12.43,0.00,1.00,96.00,-9.60,0 +76.80,-9.60,12.45,0.00,1.00,-81.60,-9.60,0 +72.00,-9.60,12.48,0.00,1.00,105.60,-9.60,0 +67.20,-9.60,12.50,0.00,1.00,-67.20,-9.60,0 +62.40,-9.60,12.52,0.00,1.00,120.00,-9.60,0 +57.60,-9.60,12.54,0.00,1.00,-57.60,-9.60,0 +52.80,-9.60,12.56,0.00,1.00,129.60,-4.80,0 +48.00,-4.80,12.58,0.00,1.00,-48.00,-4.80,0 +43.20,-4.80,12.60,0.00,1.00,139.20,-4.80,0 +38.40,-4.80,12.62,0.00,1.00,-38.40,-4.80,0 +33.60,-4.80,12.65,0.00,1.00,148.80,-4.80,0 +28.80,-4.80,12.67,0.00,1.00,-28.80,-4.80,0 +24.00,-4.80,12.69,0.00,1.00,158.40,-4.80,0 +19.20,-4.80,12.71,0.00,1.00,-19.20,-4.80,0 +14.40,-0.00,12.73,0.00,1.00,163.20,-4.80,0 +9.60,-0.00,12.75,0.00,1.00,-9.60,-0.00,0 +4.80,-0.00,12.77,0.00,1.00,172.80,-0.00,0 +0.00,0.00,12.80,0.00,1.00,-4.80,-0.00,0 +-4.80,0.00,12.82,0.00,1.00,0.00,0.00,0 +-9.60,0.00,12.84,0.00,1.00,-177.60,0.00,0 +-14.40,0.00,12.86,0.00,1.00,9.60,0.00,0 +-19.20,0.00,12.88,0.00,1.00,-168.00,0.00,0 +-24.00,0.00,12.90,0.00,1.00,14.40,0.00,0 +-28.80,0.00,12.92,0.00,1.00,-163.20,0.00,0 +-33.60,4.80,12.95,0.00,1.00,24.00,0.00,0 +-38.40,4.80,12.97,0.00,1.00,-153.60,0.00,0 +-43.20,4.80,12.99,0.00,1.00,28.80,0.00,0 +-48.00,4.80,13.01,0.00,1.00,-144.00,4.80,0 +-52.80,4.80,13.03,0.00,1.00,38.40,4.80,0 +-57.60,4.80,13.05,0.00,1.00,-134.40,4.80,0 +-62.40,4.80,13.07,0.00,1.00,48.00,4.80,0 +-67.20,4.80,13.09,0.00,1.00,-124.80,4.80,0 +-72.00,4.80,13.12,0.00,1.00,62.40,4.80,0 +-76.80,4.80,13.14,0.00,1.00,-115.20,4.80,0 +-81.60,4.80,13.16,0.00,1.00,72.00,4.80,0 +-86.40,4.80,13.18,0.00,1.00,-100.80,4.80,0 +-91.20,4.80,13.20,0.00,1.00,86.40,4.80,0 +-96.00,4.80,13.22,0.00,1.00,-86.40,4.80,0 +-100.80,4.80,13.24,0.00,1.00,96.00,4.80,0 +-105.60,4.80,13.27,0.00,1.00,-76.80,4.80,0 +-110.40,4.80,13.29,0.00,1.00,110.40,4.80,0 +-115.20,4.80,13.31,0.00,1.00,-62.40,4.80,0 +-120.00,4.80,13.33,0.00,1.00,120.00,4.80,0 +-124.80,4.80,13.35,0.00,1.00,-52.80,4.80,0 +-129.60,4.80,13.37,0.00,1.00,134.40,4.80,0 +-134.40,4.80,13.39,0.00,1.00,-43.20,4.80,0 +-139.20,4.80,13.42,0.00,1.00,144.00,4.80,0 +-144.00,4.80,13.44,0.00,1.00,-33.60,0.00,0 +-148.80,4.80,13.46,0.00,1.00,153.60,0.00,0 +-153.60,0.00,13.48,0.00,1.00,-24.00,0.00,0 +-158.40,0.00,13.50,0.00,1.00,158.40,0.00,0 +-163.20,0.00,13.52,0.00,1.00,-14.40,0.00,0 +-168.00,0.00,13.54,0.00,1.00,168.00,0.00,0 +-172.80,0.00,13.56,0.00,1.00,-9.60,0.00,0 +-177.60,0.00,13.59,0.00,1.00,172.80,0.00,0 +177.60,-0.00,13.61,0.00,1.00,-0.00,0.00,0 +172.80,-0.00,13.63,0.00,1.00,-177.60,-0.00,0 +168.00,-0.00,13.65,0.00,1.00,4.80,-0.00,0 +163.20,-0.00,13.67,0.00,1.00,-172.80,-0.00,0 +158.40,-0.00,13.69,0.00,1.00,14.40,-0.00,0 +153.60,-0.00,13.71,0.00,1.00,-163.20,-0.00,0 +148.80,-4.80,13.74,0.00,1.00,19.20,-0.00,0 +144.00,-4.80,13.76,0.00,1.00,-153.60,-0.00,0 +139.20,-4.80,13.78,0.00,1.00,28.80,-0.00,0 +134.40,-4.80,13.80,0.00,1.00,-148.80,-0.00,0 +129.60,-4.80,13.82,0.00,1.00,38.40,-4.80,0 +124.80,-4.80,13.84,0.00,1.00,-139.20,-4.80,0 +120.00,-4.80,13.86,0.00,1.00,48.00,-4.80,0 +115.20,-4.80,13.89,0.00,1.00,-129.60,-4.80,0 +110.40,-4.80,13.91,0.00,1.00,57.60,-4.80,0 +105.60,-4.80,13.93,0.00,1.00,-115.20,-4.80,0 +100.80,-4.80,13.95,0.00,1.00,67.20,-4.80,0 +96.00,-4.80,13.97,0.00,1.00,-105.60,-4.80,0 +91.20,-4.80,13.99,0.00,1.00,81.60,-4.80,0 +86.40,-4.80,14.01,0.00,1.00,-91.20,-4.80,0 +81.60,-4.80,14.03,0.00,1.00,96.00,-4.80,0 +76.80,-4.80,14.06,0.00,1.00,-76.80,-4.80,0 +72.00,-4.80,14.08,0.00,1.00,105.60,-4.80,0 +67.20,-4.80,14.10,0.00,1.00,-67.20,-4.80,0 +62.40,-4.80,14.12,0.00,1.00,120.00,-4.80,0 +57.60,-4.80,14.14,0.00,1.00,-52.80,-4.80,0 +52.80,-4.80,14.16,0.00,1.00,129.60,-4.80,0 +48.00,-4.80,14.18,0.00,1.00,-43.20,-4.80,0 +43.20,-4.80,14.21,0.00,1.00,139.20,-4.80,0 +38.40,-4.80,14.23,0.00,1.00,-33.60,-4.80,0 +33.60,-4.80,14.25,0.00,1.00,148.80,-0.00,0 +28.80,-0.00,14.27,0.00,1.00,-28.80,-0.00,0 +24.00,-0.00,14.29,0.00,1.00,158.40,-0.00,0 +19.20,-0.00,14.31,0.00,1.00,-19.20,-0.00,0 +14.40,-0.00,14.33,0.00,1.00,163.20,-0.00,0 +9.60,-0.00,14.36,0.00,1.00,-9.60,-0.00,0 +4.80,-0.00,14.38,0.00,1.00,172.80,-0.00,0 +0.00,0.00,14.40,0.00,1.00,-4.80,-0.00,0 +-4.80,0.00,14.42,0.00,1.00,0.00,0.00,0 +-9.60,0.00,14.44,0.00,1.00,-177.60,-0.00,0 +-14.40,0.00,14.46,0.00,1.00,4.80,-0.00,0 +-19.20,0.00,14.48,0.00,1.00,-168.00,-0.00,0 +-24.00,0.00,14.50,0.00,1.00,14.40,-0.00,0 +-28.80,0.00,14.53,0.00,1.00,-163.20,-0.00,0 +-33.60,0.00,14.55,0.00,1.00,19.20,-0.00,0 +-38.40,0.00,14.57,0.00,1.00,-153.60,-0.00,0 +-43.20,0.00,14.59,0.00,1.00,28.80,-0.00,0 +-48.00,0.00,14.61,0.00,1.00,-148.80,-0.00,0 +-52.80,0.00,14.63,0.00,1.00,38.40,-0.00,0 +-57.60,0.00,14.65,0.00,1.00,-139.20,-0.00,0 +-62.40,0.00,14.68,0.00,1.00,48.00,-0.00,0 +-67.20,0.00,14.70,0.00,1.00,-124.80,-0.00,0 +-72.00,0.00,14.72,0.00,1.00,57.60,-0.00,0 +-76.80,0.00,14.74,0.00,1.00,-115.20,-0.00,0 +-81.60,0.00,14.76,0.00,1.00,72.00,-0.00,0 +-86.40,0.00,14.78,0.00,1.00,-100.80,-0.00,0 +-91.20,0.00,14.80,0.00,1.00,86.40,-0.00,0 +-96.00,0.00,14.83,0.00,1.00,-86.40,-0.00,0 +-100.80,0.00,14.85,0.00,1.00,100.80,-0.00,0 +-105.60,0.00,14.87,0.00,1.00,-76.80,-0.00,0 +-110.40,0.00,14.89,0.00,1.00,110.40,-0.00,0 +-115.20,0.00,14.91,0.00,1.00,-62.40,-0.00,0 +-120.00,0.00,14.93,0.00,1.00,124.80,-0.00,0 +-124.80,0.00,14.95,0.00,1.00,-48.00,-0.00,0 +-129.60,0.00,14.97,0.00,1.00,134.40,-0.00,0 +-134.40,0.00,15.00,0.00,1.00,-38.40,-0.00,0 +-139.20,0.00,15.02,0.00,1.00,144.00,-0.00,0 +-144.00,0.00,15.04,0.00,1.00,-28.80,-0.00,0 +-148.80,0.00,15.06,0.00,1.00,153.60,-0.00,0 +-153.60,0.00,15.08,0.00,1.00,-24.00,-0.00,0 +-158.40,0.00,15.10,0.00,1.00,163.20,-0.00,0 +-163.20,0.00,15.12,0.00,1.00,-14.40,-0.00,0 +-168.00,0.00,15.15,0.00,1.00,168.00,-0.00,0 +-172.80,0.00,15.17,0.00,1.00,-9.60,-0.00,0 +-177.60,0.00,15.19,0.00,1.00,172.80,-0.00,0 +177.60,0.00,15.21,0.00,1.00,-0.00,-0.00,0 +172.80,0.00,15.23,0.00,1.00,-177.60,0.00,0 +168.00,0.00,15.25,0.00,1.00,4.80,0.00,0 +163.20,0.00,15.27,0.00,1.00,-172.80,0.00,0 +158.40,0.00,15.30,0.00,1.00,9.60,0.00,0 +153.60,0.00,15.32,0.00,1.00,-163.20,0.00,0 +148.80,0.00,15.34,0.00,1.00,19.20,0.00,0 +144.00,0.00,15.36,0.00,1.00,-158.40,0.00,0 +139.20,0.00,15.38,0.00,1.00,28.80,0.00,0 +134.40,0.00,15.40,0.00,1.00,-148.80,0.00,0 +129.60,0.00,15.42,0.00,1.00,33.60,0.00,0 +124.80,0.00,15.44,0.00,1.00,-139.20,0.00,0 +120.00,0.00,15.47,0.00,1.00,43.20,0.00,0 +115.20,0.00,15.49,0.00,1.00,-129.60,0.00,0 +110.40,0.00,15.51,0.00,1.00,57.60,0.00,0 +105.60,0.00,15.53,0.00,1.00,-120.00,0.00,0 +100.80,0.00,15.55,0.00,1.00,67.20,0.00,0 +96.00,0.00,15.57,0.00,1.00,-105.60,0.00,0 +91.20,0.00,15.59,0.00,1.00,81.60,0.00,0 +86.40,0.00,15.62,0.00,1.00,-91.20,0.00,0 +81.60,0.00,15.64,0.00,1.00,96.00,0.00,0 +76.80,0.00,15.66,0.00,1.00,-76.80,0.00,0 +72.00,0.00,15.68,0.00,1.00,110.40,0.00,0 +67.20,0.00,15.70,0.00,1.00,-67.20,0.00,0 +62.40,0.00,15.72,0.00,1.00,120.00,0.00,0 +57.60,0.00,15.74,0.00,1.00,-52.80,0.00,0 +52.80,0.00,15.77,0.00,1.00,134.40,0.00,0 +48.00,0.00,15.79,0.00,1.00,-43.20,0.00,0 +43.20,0.00,15.81,0.00,1.00,144.00,0.00,0 +38.40,0.00,15.83,0.00,1.00,-33.60,0.00,0 +33.60,0.00,15.85,0.00,1.00,153.60,0.00,0 +28.80,0.00,15.87,0.00,1.00,-24.00,0.00,0 +24.00,0.00,15.89,0.00,1.00,158.40,0.00,0 +19.20,0.00,15.91,0.00,1.00,-19.20,0.00,0 +14.40,0.00,15.94,0.00,1.00,168.00,0.00,0 +9.60,0.00,15.96,0.00,1.00,-9.60,0.00,0 +4.80,0.00,15.98,0.00,1.00,172.80,0.00,0 +0.00,0.00,16.00,0.00,1.00,-4.80,0.00,0 diff --git a/scripts/testv/stvISM3.csv b/scripts/testv/stvISM3.csv index ac37e672e3..14eee9b693 100644 --- a/scripts/testv/stvISM3.csv +++ b/scripts/testv/stvISM3.csv @@ -1,1500 +1,1500 @@ -0.00,0.00,0.00,0.00,1.00,-0.00,0.00 --177.60,-4.80,16.00,0.00,1.00,-0.00,0.00 -4.80,4.80,0.02,0.00,1.00,-0.00,0.00 --168.00,-9.60,15.98,0.00,1.00,-0.00,0.00 -14.40,14.40,0.04,0.00,1.00,-0.00,0.00 --163.20,-14.40,15.96,0.00,1.00,-0.00,0.00 -19.20,19.20,0.06,0.00,1.00,-0.00,0.00 --153.60,-24.00,15.94,0.00,1.00,-0.00,0.00 -28.80,24.00,0.09,0.00,1.00,-0.00,0.00 --148.80,-28.80,15.91,0.00,1.00,-0.00,0.00 -38.40,33.60,0.11,0.00,1.00,-0.00,0.00 --139.20,-33.60,15.89,0.00,1.00,-0.00,0.00 -48.00,38.40,0.13,0.00,1.00,-0.00,0.00 --124.80,-38.40,15.87,0.00,1.00,-0.00,0.00 -57.60,38.40,0.15,0.00,1.00,-0.00,0.00 --115.20,-43.20,15.85,0.00,1.00,-0.00,0.00 -72.00,43.20,0.17,0.00,1.00,-0.00,0.00 --100.80,-43.20,15.83,0.00,1.00,-0.00,0.00 -86.40,43.20,0.19,0.00,1.00,-0.00,0.00 --86.40,-43.20,15.81,0.00,1.00,-177.60,0.00 -100.80,43.20,0.21,0.00,1.00,-177.60,0.00 --76.80,-43.20,15.79,0.00,1.00,-177.60,0.00 -110.40,43.20,0.23,0.00,1.00,-177.60,0.00 --62.40,-43.20,15.77,0.00,1.00,-177.60,0.00 -124.80,38.40,0.26,0.00,1.00,-177.60,0.00 --52.80,-38.40,15.74,0.00,1.00,177.60,0.00 -134.40,33.60,0.28,0.00,1.00,177.60,0.00 --38.40,-33.60,15.72,0.00,1.00,177.60,0.00 -144.00,28.80,0.30,0.00,1.00,177.60,0.00 --33.60,-28.80,15.70,0.00,1.00,177.60,0.00 -153.60,24.00,0.32,0.00,1.00,177.60,0.00 --24.00,-19.20,15.68,0.00,1.00,177.60,0.00 -158.40,19.20,0.34,0.00,1.00,177.60,0.00 --14.40,-14.40,15.66,0.00,1.00,177.60,0.00 -168.00,9.60,0.36,0.00,1.00,177.60,0.00 --9.60,-9.60,15.64,0.00,1.00,177.60,0.00 -172.80,4.80,0.38,0.00,1.00,177.60,0.00 --0.00,-0.00,15.62,0.00,1.00,177.60,0.00 --177.60,-0.00,0.41,0.00,1.00,-177.60,0.00 -4.80,4.80,15.59,0.00,1.00,-177.60,0.00 --172.80,-9.60,0.43,0.00,1.00,-177.60,0.00 -14.40,9.60,15.57,0.00,1.00,-177.60,0.00 --163.20,-14.40,0.45,0.00,1.00,-177.60,0.00 -19.20,19.20,15.55,0.00,1.00,-177.60,0.00 --158.40,-19.20,0.47,0.00,1.00,-177.60,0.00 -28.80,24.00,15.53,0.00,1.00,-177.60,0.00 --148.80,-28.80,0.49,0.00,1.00,-177.60,0.00 -33.60,28.80,15.51,0.00,1.00,-177.60,0.00 --139.20,-33.60,0.51,0.00,1.00,-177.60,0.00 -43.20,33.60,15.49,0.00,1.00,-177.60,0.00 --129.60,-38.40,0.53,0.00,1.00,-177.60,0.00 -57.60,38.40,15.47,0.00,1.00,177.60,0.00 --120.00,-43.20,0.56,0.00,1.00,177.60,0.00 -67.20,43.20,15.44,0.00,1.00,177.60,0.00 --105.60,-43.20,0.58,0.00,1.00,177.60,0.00 -81.60,43.20,15.42,0.00,1.00,177.60,0.00 --91.20,-43.20,0.60,0.00,1.00,177.60,0.00 -96.00,43.20,15.40,0.00,1.00,0.00,0.00 --76.80,-43.20,0.62,0.00,1.00,0.00,0.00 -110.40,43.20,15.38,0.00,1.00,0.00,0.00 --67.20,-43.20,0.64,0.00,1.00,0.00,0.00 -120.00,38.40,15.36,0.00,1.00,0.00,0.00 --52.80,-38.40,0.66,0.00,1.00,0.00,0.00 -129.60,38.40,15.34,0.00,1.00,0.00,0.00 --43.20,-33.60,0.68,0.00,1.00,0.00,0.00 -144.00,33.60,15.32,0.00,1.00,0.00,0.00 --33.60,-28.80,0.70,0.00,1.00,0.00,0.00 -148.80,24.00,15.30,0.00,1.00,0.00,0.00 --24.00,-24.00,0.73,0.00,1.00,0.00,0.00 -158.40,19.20,15.27,0.00,1.00,0.00,0.00 --19.20,-14.40,0.75,0.00,1.00,0.00,0.00 -168.00,14.40,15.25,0.00,1.00,0.00,0.00 --9.60,-9.60,0.77,0.00,1.00,0.00,0.00 -172.80,4.80,15.23,0.00,1.00,0.00,0.00 --4.80,-4.80,0.79,0.00,1.00,0.00,0.00 -0.00,0.00,15.21,0.00,1.00,0.00,0.00 --177.60,-4.80,0.81,0.00,1.00,0.00,-0.00 -9.60,4.80,15.19,0.00,1.00,0.00,-0.00 --168.00,-9.60,0.83,0.00,1.00,0.00,-0.00 -14.40,14.40,15.17,0.00,1.00,0.00,-0.00 --163.20,-14.40,0.85,0.00,1.00,0.00,-0.00 -24.00,19.20,15.15,0.00,1.00,4.80,-0.00 --153.60,-19.20,0.88,0.00,1.00,4.80,-4.80 -28.80,24.00,15.12,0.00,1.00,4.80,-4.80 --144.00,-24.00,0.90,0.00,1.00,4.80,-4.80 -38.40,28.80,15.10,0.00,1.00,4.80,-4.80 --134.40,-28.80,0.92,0.00,1.00,4.80,-4.80 -48.00,33.60,15.08,0.00,1.00,9.60,-4.80 --124.80,-33.60,0.94,0.00,1.00,9.60,-4.80 -62.40,38.40,15.06,0.00,1.00,9.60,-4.80 --115.20,-38.40,0.96,0.00,1.00,14.40,-4.80 -72.00,38.40,15.04,0.00,1.00,19.20,-4.80 --100.80,-38.40,0.98,0.00,1.00,28.80,-4.80 -86.40,38.40,15.02,0.00,1.00,52.80,-4.80 --86.40,-38.40,1.00,0.00,1.00,105.60,-4.80 -96.00,38.40,15.00,0.00,1.00,139.20,-4.80 --76.80,-38.40,1.03,0.00,1.00,158.40,-4.80 -110.40,38.40,14.97,0.00,1.00,163.20,-4.80 --62.40,-38.40,1.05,0.00,1.00,168.00,-4.80 -120.00,33.60,14.95,0.00,1.00,168.00,-4.80 --52.80,-33.60,1.07,0.00,1.00,172.80,-4.80 -134.40,33.60,14.93,0.00,1.00,172.80,-4.80 --43.20,-28.80,1.09,0.00,1.00,172.80,-4.80 -144.00,28.80,14.91,0.00,1.00,172.80,-4.80 --33.60,-24.00,1.11,0.00,1.00,177.60,-4.80 -148.80,24.00,14.89,0.00,1.00,177.60,-4.80 --24.00,-19.20,1.13,0.00,1.00,177.60,-4.80 -158.40,14.40,14.87,0.00,1.00,177.60,-0.00 --19.20,-14.40,1.15,0.00,1.00,177.60,-0.00 -168.00,9.60,14.85,0.00,1.00,177.60,-0.00 --9.60,-9.60,1.17,0.00,1.00,177.60,-0.00 -172.80,4.80,14.83,0.00,1.00,177.60,-0.00 --0.00,-0.00,1.20,0.00,1.00,177.60,-0.00 --177.60,-0.00,14.80,0.00,1.00,-177.60,0.00 -4.80,4.80,1.22,0.00,1.00,-177.60,0.00 --172.80,-9.60,14.78,0.00,1.00,-177.60,0.00 -14.40,9.60,1.24,0.00,1.00,-177.60,0.00 --163.20,-14.40,14.76,0.00,1.00,-177.60,0.00 -19.20,14.40,1.26,0.00,1.00,-177.60,0.00 --153.60,-19.20,14.74,0.00,1.00,-177.60,4.80 -28.80,24.00,1.28,0.00,1.00,-177.60,4.80 --148.80,-24.00,14.72,0.00,1.00,-177.60,4.80 -38.40,28.80,1.30,0.00,1.00,-172.80,4.80 --139.20,-28.80,14.70,0.00,1.00,-172.80,4.80 -48.00,33.60,1.32,0.00,1.00,-172.80,4.80 --124.80,-33.60,14.68,0.00,1.00,-172.80,4.80 -57.60,33.60,1.35,0.00,1.00,-168.00,4.80 --115.20,-38.40,14.65,0.00,1.00,-168.00,4.80 -72.00,38.40,1.37,0.00,1.00,-163.20,4.80 --105.60,-38.40,14.63,0.00,1.00,-158.40,4.80 -81.60,38.40,1.39,0.00,1.00,-139.20,4.80 --91.20,-38.40,14.61,0.00,1.00,-105.60,4.80 -96.00,38.40,1.41,0.00,1.00,-52.80,4.80 --76.80,-38.40,14.59,0.00,1.00,-28.80,4.80 -105.60,38.40,1.43,0.00,1.00,-19.20,4.80 --67.20,-38.40,14.57,0.00,1.00,-14.40,4.80 -120.00,38.40,1.45,0.00,1.00,-9.60,4.80 --57.60,-33.60,14.55,0.00,1.00,-9.60,4.80 -129.60,33.60,1.47,0.00,1.00,-9.60,4.80 --43.20,-28.80,14.53,0.00,1.00,-4.80,4.80 -139.20,28.80,1.50,0.00,1.00,-4.80,4.80 --33.60,-24.00,14.50,0.00,1.00,-4.80,4.80 -148.80,24.00,1.52,0.00,1.00,-4.80,4.80 --28.80,-19.20,14.48,0.00,1.00,-4.80,4.80 -158.40,19.20,1.54,0.00,1.00,-4.80,0.00 --19.20,-14.40,14.46,0.00,1.00,-0.00,0.00 -163.20,14.40,1.56,0.00,1.00,-0.00,0.00 --9.60,-9.60,14.44,0.00,1.00,-0.00,0.00 -172.80,4.80,1.58,0.00,1.00,-0.00,0.00 --4.80,-4.80,14.42,0.00,1.00,-0.00,0.00 -0.00,0.00,1.60,0.00,1.00,0.00,0.00 --177.60,-4.80,14.40,0.00,1.00,0.00,-0.00 -9.60,4.80,1.62,0.00,1.00,0.00,-0.00 --168.00,-9.60,14.38,0.00,1.00,4.80,-0.00 -14.40,9.60,1.64,0.00,1.00,4.80,-4.80 --158.40,-14.40,14.36,0.00,1.00,4.80,-4.80 -24.00,14.40,1.67,0.00,1.00,4.80,-4.80 --153.60,-19.20,14.33,0.00,1.00,4.80,-4.80 -33.60,19.20,1.69,0.00,1.00,9.60,-4.80 --144.00,-24.00,14.31,0.00,1.00,9.60,-4.80 -43.20,24.00,1.71,0.00,1.00,9.60,-4.80 --134.40,-28.80,14.29,0.00,1.00,14.40,-9.60 -52.80,28.80,1.73,0.00,1.00,14.40,-9.60 --124.80,-28.80,14.27,0.00,1.00,19.20,-9.60 -62.40,33.60,1.75,0.00,1.00,24.00,-9.60 --110.40,-33.60,14.25,0.00,1.00,28.80,-9.60 -72.00,33.60,1.77,0.00,1.00,33.60,-9.60 --100.80,-33.60,14.23,0.00,1.00,48.00,-9.60 -86.40,33.60,1.79,0.00,1.00,67.20,-9.60 --86.40,-33.60,14.21,0.00,1.00,96.00,-9.60 -96.00,33.60,1.82,0.00,1.00,120.00,-9.60 --76.80,-33.60,14.18,0.00,1.00,139.20,-9.60 -110.40,33.60,1.84,0.00,1.00,148.80,-9.60 --67.20,-33.60,14.16,0.00,1.00,153.60,-9.60 -120.00,33.60,1.86,0.00,1.00,158.40,-9.60 --52.80,-28.80,14.14,0.00,1.00,163.20,-9.60 -129.60,28.80,1.88,0.00,1.00,168.00,-9.60 --43.20,-28.80,14.12,0.00,1.00,168.00,-9.60 -139.20,24.00,1.90,0.00,1.00,168.00,-4.80 --33.60,-24.00,14.10,0.00,1.00,172.80,-4.80 -148.80,19.20,1.92,0.00,1.00,172.80,-4.80 --24.00,-19.20,14.08,0.00,1.00,172.80,-4.80 -158.40,14.40,1.94,0.00,1.00,177.60,-4.80 --19.20,-14.40,14.06,0.00,1.00,177.60,-4.80 -168.00,9.60,1.97,0.00,1.00,177.60,-4.80 --9.60,-4.80,14.03,0.00,1.00,177.60,-0.00 -172.80,4.80,1.99,0.00,1.00,177.60,-0.00 --0.00,-0.00,14.01,0.00,1.00,177.60,-0.00 --177.60,-0.00,2.01,0.00,1.00,-177.60,0.00 -4.80,4.80,13.99,0.00,1.00,-177.60,0.00 --168.00,-4.80,2.03,0.00,1.00,-177.60,0.00 -14.40,9.60,13.97,0.00,1.00,-177.60,4.80 --163.20,-14.40,2.05,0.00,1.00,-177.60,4.80 -24.00,14.40,13.95,0.00,1.00,-177.60,4.80 --153.60,-19.20,2.07,0.00,1.00,-172.80,4.80 -28.80,19.20,13.93,0.00,1.00,-172.80,4.80 --144.00,-24.00,2.09,0.00,1.00,-172.80,4.80 -38.40,24.00,13.91,0.00,1.00,-168.00,4.80 --134.40,-28.80,2.11,0.00,1.00,-168.00,9.60 -48.00,28.80,13.89,0.00,1.00,-168.00,9.60 --124.80,-28.80,2.14,0.00,1.00,-163.20,9.60 -62.40,33.60,13.86,0.00,1.00,-158.40,9.60 --115.20,-33.60,2.16,0.00,1.00,-153.60,9.60 -72.00,33.60,13.84,0.00,1.00,-148.80,9.60 --100.80,-33.60,2.18,0.00,1.00,-139.20,9.60 -81.60,33.60,13.82,0.00,1.00,-120.00,9.60 --91.20,-33.60,2.20,0.00,1.00,-96.00,9.60 -96.00,33.60,13.80,0.00,1.00,-67.20,9.60 --81.60,-33.60,2.22,0.00,1.00,-48.00,9.60 -105.60,33.60,13.78,0.00,1.00,-33.60,9.60 --67.20,-33.60,2.24,0.00,1.00,-28.80,9.60 -115.20,33.60,13.76,0.00,1.00,-24.00,9.60 --57.60,-28.80,2.26,0.00,1.00,-19.20,9.60 -129.60,28.80,13.74,0.00,1.00,-14.40,9.60 --48.00,-28.80,2.29,0.00,1.00,-14.40,9.60 -139.20,24.00,13.71,0.00,1.00,-9.60,4.80 --38.40,-24.00,2.31,0.00,1.00,-9.60,4.80 -148.80,19.20,13.69,0.00,1.00,-9.60,4.80 --28.80,-19.20,2.33,0.00,1.00,-4.80,4.80 -153.60,14.40,13.67,0.00,1.00,-4.80,4.80 --19.20,-14.40,2.35,0.00,1.00,-4.80,4.80 -163.20,9.60,13.65,0.00,1.00,-4.80,4.80 --9.60,-9.60,2.37,0.00,1.00,-4.80,0.00 -172.80,4.80,13.63,0.00,1.00,-0.00,0.00 --4.80,-4.80,2.39,0.00,1.00,-0.00,0.00 -0.00,0.00,13.61,0.00,1.00,0.00,0.00 --177.60,-4.80,2.41,0.00,1.00,0.00,-0.00 -9.60,4.80,13.59,0.00,1.00,4.80,-0.00 --168.00,-9.60,2.44,0.00,1.00,4.80,-4.80 -14.40,9.60,13.56,0.00,1.00,4.80,-4.80 --158.40,-9.60,2.46,0.00,1.00,4.80,-4.80 -24.00,14.40,13.54,0.00,1.00,9.60,-4.80 --148.80,-14.40,2.48,0.00,1.00,9.60,-9.60 -33.60,19.20,13.52,0.00,1.00,9.60,-9.60 --139.20,-19.20,2.50,0.00,1.00,14.40,-9.60 -43.20,24.00,13.50,0.00,1.00,14.40,-9.60 --129.60,-24.00,2.52,0.00,1.00,19.20,-9.60 -52.80,24.00,13.48,0.00,1.00,19.20,-14.40 --120.00,-28.80,2.54,0.00,1.00,24.00,-14.40 -62.40,28.80,13.46,0.00,1.00,28.80,-14.40 --110.40,-28.80,2.56,0.00,1.00,38.40,-14.40 -76.80,28.80,13.44,0.00,1.00,48.00,-14.40 --100.80,-28.80,2.58,0.00,1.00,57.60,-14.40 -86.40,28.80,13.42,0.00,1.00,76.80,-14.40 --86.40,-28.80,2.61,0.00,1.00,96.00,-14.40 -96.00,28.80,13.39,0.00,1.00,115.20,-14.40 --76.80,-28.80,2.63,0.00,1.00,129.60,-14.40 -105.60,28.80,13.37,0.00,1.00,139.20,-14.40 --67.20,-28.80,2.65,0.00,1.00,144.00,-14.40 -120.00,28.80,13.35,0.00,1.00,153.60,-14.40 --57.60,-24.00,2.67,0.00,1.00,158.40,-14.40 -129.60,24.00,13.33,0.00,1.00,158.40,-9.60 --48.00,-24.00,2.69,0.00,1.00,163.20,-9.60 -139.20,19.20,13.31,0.00,1.00,168.00,-9.60 --38.40,-19.20,2.71,0.00,1.00,168.00,-9.60 -148.80,19.20,13.29,0.00,1.00,168.00,-9.60 --28.80,-14.40,2.73,0.00,1.00,172.80,-9.60 -158.40,14.40,13.27,0.00,1.00,172.80,-4.80 --19.20,-9.60,2.76,0.00,1.00,172.80,-4.80 -163.20,9.60,13.24,0.00,1.00,177.60,-4.80 --9.60,-4.80,2.78,0.00,1.00,177.60,-4.80 -172.80,4.80,13.22,0.00,1.00,177.60,-0.00 --0.00,-0.00,2.80,0.00,1.00,177.60,-0.00 --177.60,-0.00,13.20,0.00,1.00,-177.60,0.00 -4.80,4.80,2.82,0.00,1.00,-177.60,0.00 --168.00,-4.80,13.18,0.00,1.00,-177.60,4.80 -14.40,9.60,2.84,0.00,1.00,-177.60,4.80 --163.20,-9.60,13.16,0.00,1.00,-172.80,4.80 -24.00,14.40,2.86,0.00,1.00,-172.80,4.80 --153.60,-14.40,13.14,0.00,1.00,-172.80,9.60 -33.60,19.20,2.88,0.00,1.00,-168.00,9.60 --144.00,-19.20,13.12,0.00,1.00,-168.00,9.60 -43.20,19.20,2.91,0.00,1.00,-168.00,9.60 --134.40,-24.00,13.09,0.00,1.00,-163.20,9.60 -52.80,24.00,2.93,0.00,1.00,-158.40,9.60 --124.80,-24.00,13.07,0.00,1.00,-158.40,14.40 -62.40,28.80,2.95,0.00,1.00,-153.60,14.40 --115.20,-28.80,13.05,0.00,1.00,-144.00,14.40 -72.00,28.80,2.97,0.00,1.00,-139.20,14.40 --100.80,-28.80,13.03,0.00,1.00,-129.60,14.40 -81.60,28.80,2.99,0.00,1.00,-115.20,14.40 --91.20,-28.80,13.01,0.00,1.00,-96.00,14.40 -96.00,28.80,3.01,0.00,1.00,-76.80,14.40 --81.60,-28.80,12.99,0.00,1.00,-57.60,14.40 -105.60,28.80,3.03,0.00,1.00,-48.00,14.40 --67.20,-28.80,12.97,0.00,1.00,-38.40,14.40 -115.20,28.80,3.05,0.00,1.00,-28.80,14.40 --57.60,-28.80,12.95,0.00,1.00,-24.00,14.40 -124.80,24.00,3.08,0.00,1.00,-19.20,14.40 --48.00,-24.00,12.92,0.00,1.00,-19.20,9.60 -134.40,24.00,3.10,0.00,1.00,-14.40,9.60 --38.40,-19.20,12.90,0.00,1.00,-14.40,9.60 -144.00,19.20,3.12,0.00,1.00,-9.60,9.60 --28.80,-14.40,12.88,0.00,1.00,-9.60,9.60 -153.60,14.40,3.14,0.00,1.00,-9.60,4.80 --19.20,-9.60,12.86,0.00,1.00,-4.80,4.80 -163.20,9.60,3.16,0.00,1.00,-4.80,4.80 --14.40,-9.60,12.84,0.00,1.00,-4.80,4.80 -172.80,4.80,3.18,0.00,1.00,-4.80,0.00 --4.80,-4.80,12.82,0.00,1.00,-0.00,0.00 -0.00,0.00,3.20,0.00,1.00,0.00,0.00 --177.60,-0.00,12.80,0.00,1.00,0.00,-0.00 -9.60,4.80,3.23,0.00,1.00,4.80,-4.80 --168.00,-4.80,12.77,0.00,1.00,4.80,-4.80 -19.20,9.60,3.25,0.00,1.00,4.80,-4.80 --158.40,-9.60,12.75,0.00,1.00,9.60,-9.60 -24.00,14.40,3.27,0.00,1.00,9.60,-9.60 --148.80,-14.40,12.73,0.00,1.00,14.40,-9.60 -33.60,14.40,3.29,0.00,1.00,14.40,-9.60 --139.20,-19.20,12.71,0.00,1.00,19.20,-14.40 -43.20,19.20,3.31,0.00,1.00,19.20,-14.40 --129.60,-19.20,12.69,0.00,1.00,24.00,-14.40 -52.80,19.20,3.33,0.00,1.00,28.80,-14.40 --120.00,-24.00,12.67,0.00,1.00,33.60,-19.20 -67.20,24.00,3.35,0.00,1.00,38.40,-19.20 --110.40,-24.00,12.65,0.00,1.00,43.20,-19.20 -76.80,24.00,3.38,0.00,1.00,52.80,-19.20 --100.80,-24.00,12.62,0.00,1.00,67.20,-19.20 -86.40,24.00,3.40,0.00,1.00,76.80,-19.20 --86.40,-24.00,12.60,0.00,1.00,96.00,-19.20 -96.00,24.00,3.42,0.00,1.00,105.60,-19.20 --76.80,-24.00,12.58,0.00,1.00,120.00,-19.20 -105.60,24.00,3.44,0.00,1.00,129.60,-19.20 --67.20,-24.00,12.56,0.00,1.00,139.20,-19.20 -115.20,24.00,3.46,0.00,1.00,144.00,-19.20 --57.60,-24.00,12.54,0.00,1.00,148.80,-14.40 -129.60,19.20,3.48,0.00,1.00,153.60,-14.40 --48.00,-19.20,12.52,0.00,1.00,158.40,-14.40 -139.20,19.20,3.50,0.00,1.00,163.20,-14.40 --38.40,-14.40,12.50,0.00,1.00,163.20,-14.40 -148.80,14.40,3.52,0.00,1.00,168.00,-9.60 --28.80,-14.40,12.48,0.00,1.00,168.00,-9.60 -153.60,9.60,3.55,0.00,1.00,172.80,-9.60 --19.20,-9.60,12.45,0.00,1.00,172.80,-4.80 -163.20,9.60,3.57,0.00,1.00,172.80,-4.80 --9.60,-4.80,12.43,0.00,1.00,177.60,-4.80 -172.80,4.80,3.59,0.00,1.00,177.60,-0.00 --0.00,-0.00,12.41,0.00,1.00,177.60,-0.00 --177.60,-0.00,3.61,0.00,1.00,-177.60,0.00 -4.80,4.80,12.39,0.00,1.00,-177.60,0.00 --168.00,-4.80,3.63,0.00,1.00,-177.60,4.80 -14.40,9.60,12.37,0.00,1.00,-172.80,4.80 --158.40,-9.60,3.65,0.00,1.00,-172.80,4.80 -24.00,9.60,12.35,0.00,1.00,-172.80,9.60 --153.60,-14.40,3.67,0.00,1.00,-168.00,9.60 -33.60,14.40,12.33,0.00,1.00,-168.00,9.60 --144.00,-14.40,3.70,0.00,1.00,-163.20,14.40 -43.20,19.20,12.30,0.00,1.00,-163.20,14.40 --134.40,-19.20,3.72,0.00,1.00,-158.40,14.40 -52.80,19.20,12.28,0.00,1.00,-153.60,14.40 --124.80,-24.00,3.74,0.00,1.00,-148.80,14.40 -62.40,24.00,12.26,0.00,1.00,-144.00,19.20 --110.40,-24.00,3.76,0.00,1.00,-139.20,19.20 -72.00,24.00,12.24,0.00,1.00,-129.60,19.20 --100.80,-24.00,3.78,0.00,1.00,-120.00,19.20 -81.60,24.00,12.22,0.00,1.00,-105.60,19.20 --91.20,-24.00,3.80,0.00,1.00,-96.00,19.20 -96.00,24.00,12.20,0.00,1.00,-76.80,19.20 --81.60,-24.00,3.82,0.00,1.00,-67.20,19.20 -105.60,24.00,12.18,0.00,1.00,-52.80,19.20 --72.00,-24.00,3.85,0.00,1.00,-43.20,19.20 -115.20,24.00,12.15,0.00,1.00,-38.40,19.20 --57.60,-24.00,3.87,0.00,1.00,-33.60,19.20 -124.80,19.20,12.13,0.00,1.00,-28.80,14.40 --48.00,-19.20,3.89,0.00,1.00,-24.00,14.40 -134.40,19.20,12.11,0.00,1.00,-19.20,14.40 --38.40,-19.20,3.91,0.00,1.00,-19.20,14.40 -144.00,14.40,12.09,0.00,1.00,-14.40,9.60 --28.80,-14.40,3.93,0.00,1.00,-14.40,9.60 -153.60,14.40,12.07,0.00,1.00,-9.60,9.60 --24.00,-9.60,3.95,0.00,1.00,-9.60,9.60 -163.20,9.60,12.05,0.00,1.00,-4.80,4.80 --14.40,-4.80,3.97,0.00,1.00,-4.80,4.80 -172.80,4.80,12.03,0.00,1.00,-4.80,4.80 --4.80,-0.00,3.99,0.00,1.00,-0.00,0.00 -0.00,0.00,12.01,0.00,1.00,0.00,0.00 --177.60,-0.00,4.02,0.00,1.00,0.00,-0.00 -9.60,4.80,11.98,0.00,1.00,4.80,-4.80 --168.00,-4.80,4.04,0.00,1.00,4.80,-4.80 -19.20,4.80,11.96,0.00,1.00,9.60,-9.60 --158.40,-9.60,4.06,0.00,1.00,9.60,-9.60 -28.80,9.60,11.94,0.00,1.00,14.40,-9.60 --148.80,-9.60,4.08,0.00,1.00,14.40,-14.40 -38.40,14.40,11.92,0.00,1.00,19.20,-14.40 --139.20,-14.40,4.10,0.00,1.00,19.20,-14.40 -48.00,14.40,11.90,0.00,1.00,24.00,-19.20 --129.60,-14.40,4.12,0.00,1.00,28.80,-19.20 -57.60,19.20,11.88,0.00,1.00,33.60,-19.20 --120.00,-19.20,4.14,0.00,1.00,38.40,-19.20 -67.20,19.20,11.86,0.00,1.00,43.20,-24.00 --110.40,-19.20,4.17,0.00,1.00,52.80,-24.00 -76.80,19.20,11.83,0.00,1.00,62.40,-24.00 --100.80,-19.20,4.19,0.00,1.00,72.00,-24.00 -86.40,19.20,11.81,0.00,1.00,81.60,-24.00 --86.40,-19.20,4.21,0.00,1.00,91.20,-24.00 -96.00,19.20,11.79,0.00,1.00,105.60,-24.00 --76.80,-19.20,4.23,0.00,1.00,115.20,-24.00 -105.60,19.20,11.77,0.00,1.00,124.80,-24.00 --67.20,-19.20,4.25,0.00,1.00,134.40,-24.00 -115.20,19.20,11.75,0.00,1.00,139.20,-19.20 --57.60,-19.20,4.27,0.00,1.00,144.00,-19.20 -124.80,19.20,11.73,0.00,1.00,148.80,-19.20 --48.00,-14.40,4.29,0.00,1.00,153.60,-19.20 -134.40,14.40,11.71,0.00,1.00,158.40,-19.20 --38.40,-14.40,4.32,0.00,1.00,158.40,-14.40 -144.00,14.40,11.68,0.00,1.00,163.20,-14.40 --28.80,-9.60,4.34,0.00,1.00,168.00,-14.40 -153.60,9.60,11.66,0.00,1.00,168.00,-9.60 --19.20,-9.60,4.36,0.00,1.00,172.80,-9.60 -163.20,4.80,11.64,0.00,1.00,172.80,-4.80 --9.60,-4.80,4.38,0.00,1.00,172.80,-4.80 -172.80,4.80,11.62,0.00,1.00,177.60,-4.80 --0.00,-0.00,4.40,0.00,1.00,177.60,-0.00 --177.60,-0.00,11.60,0.00,1.00,-177.60,0.00 -4.80,4.80,4.42,0.00,1.00,-177.60,4.80 --168.00,-4.80,11.58,0.00,1.00,-172.80,4.80 -14.40,4.80,4.44,0.00,1.00,-172.80,4.80 --158.40,-9.60,11.56,0.00,1.00,-172.80,9.60 -24.00,9.60,4.46,0.00,1.00,-168.00,9.60 --148.80,-9.60,11.54,0.00,1.00,-168.00,14.40 -33.60,14.40,4.49,0.00,1.00,-163.20,14.40 --139.20,-14.40,11.51,0.00,1.00,-158.40,14.40 -43.20,14.40,4.51,0.00,1.00,-158.40,19.20 --129.60,-14.40,11.49,0.00,1.00,-153.60,19.20 -52.80,19.20,4.53,0.00,1.00,-148.80,19.20 --120.00,-19.20,11.47,0.00,1.00,-144.00,19.20 -62.40,19.20,4.55,0.00,1.00,-139.20,19.20 --110.40,-19.20,11.45,0.00,1.00,-134.40,24.00 -72.00,19.20,4.57,0.00,1.00,-124.80,24.00 --100.80,-19.20,11.43,0.00,1.00,-115.20,24.00 -81.60,19.20,4.59,0.00,1.00,-105.60,24.00 --91.20,-19.20,11.41,0.00,1.00,-91.20,24.00 -96.00,19.20,4.61,0.00,1.00,-81.60,24.00 --81.60,-19.20,11.39,0.00,1.00,-72.00,24.00 -105.60,19.20,4.64,0.00,1.00,-62.40,24.00 --72.00,-19.20,11.36,0.00,1.00,-52.80,24.00 -115.20,19.20,4.66,0.00,1.00,-43.20,24.00 --62.40,-19.20,11.34,0.00,1.00,-38.40,19.20 -124.80,19.20,4.68,0.00,1.00,-33.60,19.20 --52.80,-14.40,11.32,0.00,1.00,-28.80,19.20 -134.40,14.40,4.70,0.00,1.00,-24.00,19.20 --43.20,-14.40,11.30,0.00,1.00,-19.20,14.40 -144.00,14.40,4.72,0.00,1.00,-19.20,14.40 --33.60,-9.60,11.28,0.00,1.00,-14.40,14.40 -153.60,9.60,4.74,0.00,1.00,-14.40,9.60 --24.00,-9.60,11.26,0.00,1.00,-9.60,9.60 -163.20,4.80,4.76,0.00,1.00,-9.60,9.60 --14.40,-4.80,11.24,0.00,1.00,-4.80,4.80 -172.80,4.80,4.79,0.00,1.00,-4.80,4.80 --4.80,-0.00,11.21,0.00,1.00,-0.00,0.00 -0.00,0.00,4.81,0.00,1.00,0.00,0.00 --177.60,-0.00,11.19,0.00,1.00,0.00,-0.00 -9.60,4.80,4.83,0.00,1.00,4.80,-4.80 --168.00,-4.80,11.17,0.00,1.00,4.80,-4.80 -19.20,4.80,4.85,0.00,1.00,9.60,-9.60 --158.40,-4.80,11.15,0.00,1.00,14.40,-9.60 -28.80,9.60,4.87,0.00,1.00,14.40,-14.40 --148.80,-9.60,11.13,0.00,1.00,19.20,-14.40 -38.40,9.60,4.89,0.00,1.00,19.20,-19.20 --139.20,-9.60,11.11,0.00,1.00,24.00,-19.20 -48.00,9.60,4.91,0.00,1.00,28.80,-19.20 --129.60,-14.40,11.09,0.00,1.00,33.60,-24.00 -57.60,14.40,4.93,0.00,1.00,38.40,-24.00 --120.00,-14.40,11.07,0.00,1.00,43.20,-24.00 -67.20,14.40,4.96,0.00,1.00,48.00,-24.00 --110.40,-14.40,11.04,0.00,1.00,57.60,-28.80 -76.80,14.40,4.98,0.00,1.00,62.40,-28.80 --100.80,-14.40,11.02,0.00,1.00,72.00,-28.80 -86.40,14.40,5.00,0.00,1.00,81.60,-28.80 --86.40,-14.40,11.00,0.00,1.00,91.20,-28.80 -96.00,14.40,5.02,0.00,1.00,100.80,-28.80 --76.80,-14.40,10.98,0.00,1.00,110.40,-28.80 -105.60,14.40,5.04,0.00,1.00,120.00,-28.80 --67.20,-14.40,10.96,0.00,1.00,129.60,-28.80 -115.20,14.40,5.06,0.00,1.00,134.40,-24.00 --57.60,-14.40,10.94,0.00,1.00,139.20,-24.00 -124.80,14.40,5.08,0.00,1.00,144.00,-24.00 --48.00,-14.40,10.92,0.00,1.00,148.80,-24.00 -134.40,9.60,5.11,0.00,1.00,153.60,-19.20 --38.40,-9.60,10.89,0.00,1.00,158.40,-19.20 -144.00,9.60,5.13,0.00,1.00,158.40,-14.40 --28.80,-9.60,10.87,0.00,1.00,163.20,-14.40 -153.60,4.80,5.15,0.00,1.00,168.00,-14.40 --19.20,-4.80,10.85,0.00,1.00,168.00,-9.60 -163.20,4.80,5.17,0.00,1.00,172.80,-9.60 --9.60,-4.80,10.83,0.00,1.00,172.80,-4.80 -172.80,0.00,5.19,0.00,1.00,177.60,-4.80 --0.00,-0.00,10.81,0.00,1.00,177.60,-0.00 --177.60,-0.00,5.21,0.00,1.00,-177.60,0.00 -4.80,0.00,10.79,0.00,1.00,-177.60,4.80 --168.00,-4.80,5.23,0.00,1.00,-172.80,4.80 -14.40,4.80,10.77,0.00,1.00,-172.80,9.60 --158.40,-4.80,5.26,0.00,1.00,-168.00,9.60 -24.00,4.80,10.74,0.00,1.00,-168.00,14.40 --148.80,-9.60,5.28,0.00,1.00,-163.20,14.40 -33.60,9.60,10.72,0.00,1.00,-158.40,14.40 --139.20,-9.60,5.30,0.00,1.00,-158.40,19.20 -43.20,9.60,10.70,0.00,1.00,-153.60,19.20 --129.60,-14.40,5.32,0.00,1.00,-148.80,24.00 -52.80,14.40,10.68,0.00,1.00,-144.00,24.00 --120.00,-14.40,5.34,0.00,1.00,-139.20,24.00 -62.40,14.40,10.66,0.00,1.00,-134.40,24.00 --110.40,-14.40,5.36,0.00,1.00,-129.60,28.80 -72.00,14.40,10.64,0.00,1.00,-120.00,28.80 --100.80,-14.40,5.38,0.00,1.00,-110.40,28.80 -81.60,14.40,10.62,0.00,1.00,-100.80,28.80 --91.20,-14.40,5.40,0.00,1.00,-91.20,28.80 -96.00,14.40,10.60,0.00,1.00,-81.60,28.80 --81.60,-14.40,5.43,0.00,1.00,-72.00,28.80 -105.60,14.40,10.57,0.00,1.00,-62.40,28.80 --72.00,-14.40,5.45,0.00,1.00,-57.60,28.80 -115.20,14.40,10.55,0.00,1.00,-48.00,24.00 --62.40,-14.40,5.47,0.00,1.00,-43.20,24.00 -124.80,14.40,10.53,0.00,1.00,-38.40,24.00 --52.80,-14.40,5.49,0.00,1.00,-33.60,24.00 -134.40,9.60,10.51,0.00,1.00,-28.80,19.20 --43.20,-9.60,5.51,0.00,1.00,-24.00,19.20 -144.00,9.60,10.49,0.00,1.00,-19.20,19.20 --33.60,-9.60,5.53,0.00,1.00,-19.20,14.40 -153.60,9.60,10.47,0.00,1.00,-14.40,14.40 --24.00,-4.80,5.55,0.00,1.00,-14.40,9.60 -163.20,4.80,10.45,0.00,1.00,-9.60,9.60 --14.40,-4.80,5.58,0.00,1.00,-4.80,4.80 -172.80,4.80,10.42,0.00,1.00,-4.80,4.80 --4.80,-0.00,5.60,0.00,1.00,-0.00,0.00 -0.00,0.00,10.40,0.00,1.00,0.00,0.00 --177.60,-0.00,5.62,0.00,1.00,4.80,-4.80 -9.60,0.00,10.38,0.00,1.00,4.80,-4.80 --168.00,-4.80,5.64,0.00,1.00,9.60,-9.60 -19.20,4.80,10.36,0.00,1.00,9.60,-9.60 --158.40,-4.80,5.66,0.00,1.00,14.40,-14.40 -28.80,4.80,10.34,0.00,1.00,19.20,-14.40 --148.80,-4.80,5.68,0.00,1.00,19.20,-19.20 -38.40,4.80,10.32,0.00,1.00,24.00,-19.20 --139.20,-9.60,5.70,0.00,1.00,28.80,-24.00 -48.00,9.60,10.30,0.00,1.00,33.60,-24.00 --129.60,-9.60,5.72,0.00,1.00,38.40,-24.00 -57.60,9.60,10.28,0.00,1.00,43.20,-28.80 --120.00,-9.60,5.75,0.00,1.00,48.00,-28.80 -67.20,9.60,10.25,0.00,1.00,52.80,-28.80 --110.40,-9.60,5.77,0.00,1.00,57.60,-33.60 -76.80,9.60,10.23,0.00,1.00,67.20,-33.60 --100.80,-9.60,5.79,0.00,1.00,76.80,-33.60 -86.40,9.60,10.21,0.00,1.00,81.60,-33.60 --86.40,-9.60,5.81,0.00,1.00,91.20,-33.60 -96.00,9.60,10.19,0.00,1.00,100.80,-33.60 --76.80,-9.60,5.83,0.00,1.00,110.40,-33.60 -105.60,9.60,10.17,0.00,1.00,115.20,-33.60 --67.20,-9.60,5.85,0.00,1.00,124.80,-33.60 -115.20,9.60,10.15,0.00,1.00,129.60,-28.80 --57.60,-9.60,5.87,0.00,1.00,134.40,-28.80 -124.80,9.60,10.13,0.00,1.00,139.20,-28.80 --48.00,-9.60,5.90,0.00,1.00,144.00,-24.00 -134.40,9.60,10.10,0.00,1.00,148.80,-24.00 --38.40,-9.60,5.92,0.00,1.00,153.60,-19.20 -144.00,4.80,10.08,0.00,1.00,158.40,-19.20 --28.80,-4.80,5.94,0.00,1.00,163.20,-14.40 -153.60,4.80,10.06,0.00,1.00,163.20,-14.40 --19.20,-4.80,5.96,0.00,1.00,168.00,-9.60 -163.20,4.80,10.04,0.00,1.00,172.80,-9.60 --9.60,-0.00,5.98,0.00,1.00,172.80,-4.80 -172.80,0.00,10.02,0.00,1.00,177.60,-4.80 --0.00,-0.00,6.00,0.00,1.00,177.60,-0.00 --177.60,-0.00,10.00,0.00,1.00,-177.60,0.00 -4.80,0.00,6.02,0.00,1.00,-177.60,4.80 --168.00,-0.00,9.98,0.00,1.00,-172.80,4.80 -14.40,4.80,6.05,0.00,1.00,-172.80,9.60 --158.40,-4.80,9.95,0.00,1.00,-168.00,9.60 -24.00,4.80,6.07,0.00,1.00,-163.20,14.40 --148.80,-4.80,9.93,0.00,1.00,-163.20,14.40 -33.60,4.80,6.09,0.00,1.00,-158.40,19.20 --139.20,-9.60,9.91,0.00,1.00,-153.60,19.20 -43.20,9.60,6.11,0.00,1.00,-148.80,24.00 --129.60,-9.60,9.89,0.00,1.00,-144.00,24.00 -52.80,9.60,6.13,0.00,1.00,-139.20,28.80 --120.00,-9.60,9.87,0.00,1.00,-134.40,28.80 -62.40,9.60,6.15,0.00,1.00,-129.60,28.80 --110.40,-9.60,9.85,0.00,1.00,-124.80,33.60 -72.00,9.60,6.17,0.00,1.00,-115.20,33.60 --100.80,-9.60,9.83,0.00,1.00,-110.40,33.60 -81.60,9.60,6.19,0.00,1.00,-100.80,33.60 --91.20,-9.60,9.81,0.00,1.00,-91.20,33.60 -96.00,9.60,6.22,0.00,1.00,-81.60,33.60 --81.60,-9.60,9.78,0.00,1.00,-76.80,33.60 -105.60,9.60,6.24,0.00,1.00,-67.20,33.60 --72.00,-9.60,9.76,0.00,1.00,-57.60,33.60 -115.20,9.60,6.26,0.00,1.00,-52.80,28.80 --62.40,-9.60,9.74,0.00,1.00,-48.00,28.80 -124.80,9.60,6.28,0.00,1.00,-43.20,28.80 --52.80,-9.60,9.72,0.00,1.00,-38.40,24.00 -134.40,9.60,6.30,0.00,1.00,-33.60,24.00 --43.20,-9.60,9.70,0.00,1.00,-28.80,24.00 -144.00,4.80,6.32,0.00,1.00,-24.00,19.20 --33.60,-4.80,9.68,0.00,1.00,-19.20,19.20 -153.60,4.80,6.34,0.00,1.00,-19.20,14.40 --24.00,-4.80,9.66,0.00,1.00,-14.40,14.40 -163.20,4.80,6.37,0.00,1.00,-9.60,9.60 --14.40,-4.80,9.63,0.00,1.00,-9.60,9.60 -172.80,0.00,6.39,0.00,1.00,-4.80,4.80 --4.80,-0.00,9.61,0.00,1.00,-4.80,4.80 -0.00,0.00,6.41,0.00,1.00,0.00,0.00 --177.60,-0.00,9.59,0.00,1.00,4.80,-4.80 -9.60,0.00,6.43,0.00,1.00,4.80,-4.80 --168.00,-0.00,9.57,0.00,1.00,9.60,-9.60 -19.20,0.00,6.45,0.00,1.00,14.40,-9.60 --158.40,-4.80,9.55,0.00,1.00,14.40,-14.40 -28.80,4.80,6.47,0.00,1.00,19.20,-19.20 --148.80,-4.80,9.53,0.00,1.00,24.00,-19.20 -38.40,4.80,6.49,0.00,1.00,24.00,-24.00 --139.20,-4.80,9.51,0.00,1.00,28.80,-24.00 -48.00,4.80,6.52,0.00,1.00,33.60,-28.80 --129.60,-4.80,9.48,0.00,1.00,38.40,-28.80 -57.60,4.80,6.54,0.00,1.00,43.20,-33.60 --120.00,-4.80,9.46,0.00,1.00,48.00,-33.60 -67.20,4.80,6.56,0.00,1.00,57.60,-33.60 --110.40,-4.80,9.44,0.00,1.00,62.40,-38.40 -76.80,4.80,6.58,0.00,1.00,67.20,-38.40 --100.80,-4.80,9.42,0.00,1.00,76.80,-38.40 -86.40,4.80,6.60,0.00,1.00,86.40,-38.40 --86.40,-4.80,9.40,0.00,1.00,91.20,-38.40 -96.00,4.80,6.62,0.00,1.00,100.80,-38.40 --76.80,-4.80,9.38,0.00,1.00,105.60,-38.40 -105.60,4.80,6.64,0.00,1.00,115.20,-38.40 --67.20,-4.80,9.36,0.00,1.00,120.00,-33.60 -115.20,4.80,6.66,0.00,1.00,124.80,-33.60 --57.60,-4.80,9.34,0.00,1.00,134.40,-33.60 -124.80,4.80,6.69,0.00,1.00,139.20,-28.80 --48.00,-4.80,9.31,0.00,1.00,144.00,-28.80 -134.40,4.80,6.71,0.00,1.00,148.80,-24.00 --38.40,-4.80,9.29,0.00,1.00,153.60,-24.00 -144.00,4.80,6.73,0.00,1.00,153.60,-19.20 --28.80,-4.80,9.27,0.00,1.00,158.40,-19.20 -153.60,4.80,6.75,0.00,1.00,163.20,-14.40 --19.20,-4.80,9.25,0.00,1.00,168.00,-14.40 -163.20,0.00,6.77,0.00,1.00,168.00,-9.60 --9.60,-0.00,9.23,0.00,1.00,172.80,-9.60 -172.80,0.00,6.79,0.00,1.00,177.60,-4.80 --0.00,-0.00,9.21,0.00,1.00,177.60,-0.00 --177.60,-0.00,6.81,0.00,1.00,-177.60,0.00 -4.80,0.00,9.19,0.00,1.00,-177.60,4.80 --168.00,-0.00,6.84,0.00,1.00,-172.80,9.60 -14.40,0.00,9.16,0.00,1.00,-168.00,9.60 --158.40,-4.80,6.86,0.00,1.00,-168.00,14.40 -24.00,4.80,9.14,0.00,1.00,-163.20,14.40 --148.80,-4.80,6.88,0.00,1.00,-158.40,19.20 -33.60,4.80,9.12,0.00,1.00,-153.60,19.20 --139.20,-4.80,6.90,0.00,1.00,-153.60,24.00 -43.20,4.80,9.10,0.00,1.00,-148.80,24.00 --129.60,-4.80,6.92,0.00,1.00,-144.00,28.80 -52.80,4.80,9.08,0.00,1.00,-139.20,28.80 --120.00,-4.80,6.94,0.00,1.00,-134.40,33.60 -62.40,4.80,9.06,0.00,1.00,-124.80,33.60 --110.40,-4.80,6.96,0.00,1.00,-120.00,33.60 -72.00,4.80,9.04,0.00,1.00,-115.20,38.40 --100.80,-4.80,6.99,0.00,1.00,-105.60,38.40 -81.60,4.80,9.01,0.00,1.00,-100.80,38.40 --91.20,-4.80,7.01,0.00,1.00,-91.20,38.40 -96.00,4.80,8.99,0.00,1.00,-86.40,38.40 --81.60,-4.80,7.03,0.00,1.00,-76.80,38.40 -105.60,4.80,8.97,0.00,1.00,-67.20,38.40 --72.00,-4.80,7.05,0.00,1.00,-62.40,38.40 -115.20,4.80,8.95,0.00,1.00,-57.60,33.60 --62.40,-4.80,7.07,0.00,1.00,-48.00,33.60 -124.80,4.80,8.93,0.00,1.00,-43.20,33.60 --52.80,-4.80,7.09,0.00,1.00,-38.40,28.80 -134.40,4.80,8.91,0.00,1.00,-33.60,28.80 --43.20,-4.80,7.11,0.00,1.00,-28.80,24.00 -144.00,4.80,8.89,0.00,1.00,-24.00,24.00 --33.60,-4.80,7.13,0.00,1.00,-24.00,19.20 -153.60,4.80,8.87,0.00,1.00,-19.20,19.20 --24.00,-4.80,7.16,0.00,1.00,-14.40,14.40 -163.20,0.00,8.84,0.00,1.00,-14.40,9.60 --14.40,-0.00,7.18,0.00,1.00,-9.60,9.60 -172.80,0.00,8.82,0.00,1.00,-4.80,4.80 --4.80,-0.00,7.20,0.00,1.00,-4.80,4.80 -0.00,0.00,8.80,0.00,1.00,0.00,0.00 --177.60,-0.00,7.22,0.00,1.00,4.80,-4.80 -9.60,0.00,8.78,0.00,1.00,4.80,-4.80 --168.00,-0.00,7.24,0.00,1.00,9.60,-9.60 -19.20,0.00,8.76,0.00,1.00,14.40,-14.40 --158.40,-0.00,7.26,0.00,1.00,19.20,-14.40 -28.80,0.00,8.74,0.00,1.00,19.20,-19.20 --148.80,-0.00,7.28,0.00,1.00,24.00,-24.00 -38.40,0.00,8.72,0.00,1.00,28.80,-24.00 --139.20,-0.00,7.31,0.00,1.00,33.60,-28.80 -48.00,0.00,8.69,0.00,1.00,38.40,-28.80 --129.60,-0.00,7.33,0.00,1.00,43.20,-33.60 -57.60,0.00,8.67,0.00,1.00,48.00,-33.60 --120.00,-0.00,7.35,0.00,1.00,52.80,-38.40 -67.20,0.00,8.65,0.00,1.00,57.60,-38.40 --110.40,-0.00,7.37,0.00,1.00,62.40,-38.40 -76.80,0.00,8.63,0.00,1.00,72.00,-43.20 --100.80,-0.00,7.39,0.00,1.00,76.80,-43.20 -86.40,0.00,8.61,0.00,1.00,86.40,-43.20 --86.40,-0.00,7.41,0.00,1.00,91.20,-43.20 -96.00,0.00,8.59,0.00,1.00,100.80,-43.20 --76.80,-0.00,7.43,0.00,1.00,105.60,-43.20 -105.60,0.00,8.57,0.00,1.00,110.40,-43.20 --67.20,-0.00,7.46,0.00,1.00,120.00,-38.40 -115.20,0.00,8.54,0.00,1.00,124.80,-38.40 --57.60,-0.00,7.48,0.00,1.00,129.60,-38.40 -124.80,0.00,8.52,0.00,1.00,134.40,-33.60 --48.00,-0.00,7.50,0.00,1.00,139.20,-33.60 -134.40,0.00,8.50,0.00,1.00,144.00,-28.80 --38.40,-0.00,7.52,0.00,1.00,148.80,-28.80 -144.00,0.00,8.48,0.00,1.00,153.60,-24.00 --28.80,-0.00,7.54,0.00,1.00,158.40,-19.20 -153.60,0.00,8.46,0.00,1.00,163.20,-19.20 --19.20,-0.00,7.56,0.00,1.00,163.20,-14.40 -163.20,0.00,8.44,0.00,1.00,168.00,-9.60 --9.60,-0.00,7.58,0.00,1.00,172.80,-9.60 -172.80,0.00,8.42,0.00,1.00,172.80,-4.80 --0.00,-0.00,7.60,0.00,1.00,177.60,-0.00 --177.60,-0.00,8.40,0.00,1.00,-177.60,0.00 -4.80,0.00,7.63,0.00,1.00,-172.80,4.80 --168.00,-0.00,8.37,0.00,1.00,-172.80,9.60 -14.40,0.00,7.65,0.00,1.00,-168.00,9.60 --158.40,-0.00,8.35,0.00,1.00,-163.20,14.40 -24.00,0.00,7.67,0.00,1.00,-163.20,19.20 --148.80,-0.00,8.33,0.00,1.00,-158.40,19.20 -33.60,0.00,7.69,0.00,1.00,-153.60,24.00 --139.20,-0.00,8.31,0.00,1.00,-148.80,28.80 -43.20,0.00,7.71,0.00,1.00,-144.00,28.80 --129.60,-0.00,8.29,0.00,1.00,-139.20,33.60 -52.80,0.00,7.73,0.00,1.00,-134.40,33.60 --120.00,-0.00,8.27,0.00,1.00,-129.60,38.40 -62.40,0.00,7.75,0.00,1.00,-124.80,38.40 --110.40,-0.00,8.25,0.00,1.00,-120.00,38.40 -72.00,0.00,7.78,0.00,1.00,-110.40,43.20 --100.80,-0.00,8.22,0.00,1.00,-105.60,43.20 -81.60,0.00,7.80,0.00,1.00,-100.80,43.20 --91.20,-0.00,8.20,0.00,1.00,-91.20,43.20 -96.00,0.00,7.82,0.00,1.00,-86.40,43.20 --81.60,-0.00,8.18,0.00,1.00,-76.80,43.20 -105.60,0.00,7.84,0.00,1.00,-72.00,43.20 --72.00,-0.00,8.16,0.00,1.00,-62.40,38.40 -115.20,0.00,7.86,0.00,1.00,-57.60,38.40 --62.40,-0.00,8.14,0.00,1.00,-52.80,38.40 -124.80,0.00,7.88,0.00,1.00,-48.00,33.60 --52.80,-0.00,8.12,0.00,1.00,-43.20,33.60 -134.40,0.00,7.90,0.00,1.00,-38.40,28.80 --43.20,-0.00,8.10,0.00,1.00,-33.60,28.80 -144.00,0.00,7.93,0.00,1.00,-28.80,24.00 --33.60,-0.00,8.07,0.00,1.00,-24.00,24.00 -153.60,0.00,7.95,0.00,1.00,-19.20,19.20 --24.00,-0.00,8.05,0.00,1.00,-19.20,14.40 -163.20,0.00,7.97,0.00,1.00,-14.40,14.40 --14.40,-0.00,8.03,0.00,1.00,-9.60,9.60 -172.80,0.00,7.99,0.00,1.00,-4.80,4.80 --4.80,-0.00,8.01,0.00,1.00,-4.80,4.80 -0.00,0.00,8.01,0.00,1.00,0.00,0.00 --177.60,0.00,7.99,0.00,1.00,4.80,-4.80 -9.60,-0.00,8.03,0.00,1.00,4.80,-4.80 --168.00,0.00,7.97,0.00,1.00,9.60,-9.60 -19.20,-0.00,8.05,0.00,1.00,14.40,-14.40 --158.40,0.00,7.95,0.00,1.00,19.20,-19.20 -28.80,-0.00,8.07,0.00,1.00,24.00,-19.20 --148.80,0.00,7.93,0.00,1.00,24.00,-24.00 -38.40,-0.00,8.10,0.00,1.00,28.80,-28.80 --139.20,0.00,7.90,0.00,1.00,33.60,-28.80 -48.00,-0.00,8.12,0.00,1.00,38.40,-33.60 --129.60,0.00,7.88,0.00,1.00,43.20,-38.40 -57.60,-4.80,8.14,0.00,1.00,48.00,-38.40 --120.00,4.80,7.86,0.00,1.00,52.80,-43.20 -67.20,-4.80,8.16,0.00,1.00,62.40,-43.20 --110.40,4.80,7.84,0.00,1.00,67.20,-43.20 -76.80,-4.80,8.18,0.00,1.00,72.00,-48.00 --100.80,4.80,7.82,0.00,1.00,76.80,-48.00 -86.40,-4.80,8.20,0.00,1.00,86.40,-48.00 --86.40,4.80,7.80,0.00,1.00,91.20,-48.00 -96.00,-4.80,8.22,0.00,1.00,96.00,-48.00 --76.80,4.80,7.78,0.00,1.00,105.60,-48.00 -105.60,-4.80,8.25,0.00,1.00,110.40,-48.00 --67.20,4.80,7.75,0.00,1.00,115.20,-43.20 -115.20,-4.80,8.27,0.00,1.00,120.00,-43.20 --57.60,4.80,7.73,0.00,1.00,129.60,-38.40 -124.80,-4.80,8.29,0.00,1.00,134.40,-38.40 --48.00,0.00,7.71,0.00,1.00,139.20,-33.60 -134.40,-0.00,8.31,0.00,1.00,144.00,-33.60 --38.40,0.00,7.69,0.00,1.00,148.80,-28.80 -144.00,-0.00,8.33,0.00,1.00,153.60,-24.00 --28.80,0.00,7.67,0.00,1.00,153.60,-24.00 -153.60,-0.00,8.35,0.00,1.00,158.40,-19.20 --19.20,0.00,7.65,0.00,1.00,163.20,-14.40 -163.20,-0.00,8.37,0.00,1.00,168.00,-14.40 --9.60,0.00,7.63,0.00,1.00,172.80,-9.60 -172.80,-0.00,8.40,0.00,1.00,172.80,-4.80 --0.00,0.00,7.60,0.00,1.00,177.60,-0.00 --177.60,0.00,8.42,0.00,1.00,-177.60,0.00 -4.80,-0.00,7.58,0.00,1.00,-172.80,4.80 --168.00,0.00,8.44,0.00,1.00,-172.80,9.60 -14.40,-0.00,7.56,0.00,1.00,-168.00,14.40 --158.40,0.00,8.46,0.00,1.00,-163.20,14.40 -24.00,-0.00,7.54,0.00,1.00,-158.40,19.20 --148.80,0.00,8.48,0.00,1.00,-153.60,24.00 -33.60,-0.00,7.52,0.00,1.00,-153.60,24.00 --139.20,0.00,8.50,0.00,1.00,-148.80,28.80 -43.20,-0.00,7.50,0.00,1.00,-144.00,33.60 --129.60,0.00,8.52,0.00,1.00,-139.20,33.60 -52.80,-4.80,7.48,0.00,1.00,-134.40,38.40 --120.00,4.80,8.54,0.00,1.00,-129.60,38.40 -62.40,-4.80,7.46,0.00,1.00,-120.00,43.20 --110.40,4.80,8.57,0.00,1.00,-115.20,43.20 -72.00,-4.80,7.43,0.00,1.00,-110.40,48.00 --100.80,4.80,8.59,0.00,1.00,-105.60,48.00 -81.60,-4.80,7.41,0.00,1.00,-96.00,48.00 --91.20,4.80,8.61,0.00,1.00,-91.20,48.00 -96.00,-4.80,7.39,0.00,1.00,-86.40,48.00 --81.60,4.80,8.63,0.00,1.00,-76.80,48.00 -105.60,-4.80,7.37,0.00,1.00,-72.00,48.00 --72.00,4.80,8.65,0.00,1.00,-67.20,43.20 -115.20,-4.80,7.35,0.00,1.00,-62.40,43.20 --62.40,4.80,8.67,0.00,1.00,-52.80,43.20 -124.80,-4.80,7.33,0.00,1.00,-48.00,38.40 --52.80,0.00,8.69,0.00,1.00,-43.20,38.40 -134.40,-0.00,7.31,0.00,1.00,-38.40,33.60 --43.20,0.00,8.72,0.00,1.00,-33.60,28.80 -144.00,-0.00,7.28,0.00,1.00,-28.80,28.80 --33.60,0.00,8.74,0.00,1.00,-24.00,24.00 -153.60,-0.00,7.26,0.00,1.00,-24.00,19.20 --24.00,0.00,8.76,0.00,1.00,-19.20,19.20 -163.20,-0.00,7.24,0.00,1.00,-14.40,14.40 --14.40,0.00,8.78,0.00,1.00,-9.60,9.60 -172.80,-0.00,7.22,0.00,1.00,-4.80,4.80 --4.80,0.00,8.80,0.00,1.00,-4.80,4.80 -0.00,0.00,7.20,0.00,1.00,0.00,0.00 --177.60,0.00,8.82,0.00,1.00,4.80,-4.80 -9.60,-0.00,7.18,0.00,1.00,9.60,-9.60 --168.00,0.00,8.84,0.00,1.00,9.60,-9.60 -19.20,-4.80,7.16,0.00,1.00,14.40,-14.40 --158.40,4.80,8.87,0.00,1.00,19.20,-19.20 -28.80,-4.80,7.13,0.00,1.00,24.00,-24.00 --148.80,4.80,8.89,0.00,1.00,28.80,-24.00 -38.40,-4.80,7.11,0.00,1.00,33.60,-28.80 --139.20,4.80,8.91,0.00,1.00,38.40,-33.60 -48.00,-4.80,7.09,0.00,1.00,43.20,-38.40 --129.60,4.80,8.93,0.00,1.00,48.00,-38.40 -57.60,-4.80,7.07,0.00,1.00,52.80,-43.20 --120.00,4.80,8.95,0.00,1.00,57.60,-43.20 -67.20,-4.80,7.05,0.00,1.00,62.40,-48.00 --110.40,9.60,8.97,0.00,1.00,67.20,-48.00 -76.80,-9.60,7.03,0.00,1.00,72.00,-52.80 --100.80,9.60,8.99,0.00,1.00,81.60,-52.80 -86.40,-9.60,7.01,0.00,1.00,86.40,-52.80 --86.40,9.60,9.01,0.00,1.00,91.20,-52.80 -96.00,-9.60,6.99,0.00,1.00,96.00,-52.80 --76.80,9.60,9.04,0.00,1.00,105.60,-52.80 -105.60,-9.60,6.96,0.00,1.00,110.40,-48.00 --67.20,9.60,9.06,0.00,1.00,115.20,-48.00 -115.20,-4.80,6.94,0.00,1.00,120.00,-48.00 --57.60,4.80,9.08,0.00,1.00,124.80,-43.20 -124.80,-4.80,6.92,0.00,1.00,129.60,-43.20 --48.00,4.80,9.10,0.00,1.00,134.40,-38.40 -134.40,-4.80,6.90,0.00,1.00,139.20,-33.60 --38.40,4.80,9.12,0.00,1.00,144.00,-33.60 -144.00,-4.80,6.88,0.00,1.00,148.80,-28.80 --28.80,4.80,9.14,0.00,1.00,153.60,-24.00 -153.60,-4.80,6.86,0.00,1.00,158.40,-19.20 --19.20,4.80,9.16,0.00,1.00,163.20,-19.20 -163.20,-0.00,6.84,0.00,1.00,168.00,-14.40 --9.60,0.00,9.19,0.00,1.00,168.00,-9.60 -172.80,-0.00,6.81,0.00,1.00,172.80,-4.80 --0.00,0.00,9.21,0.00,1.00,177.60,-0.00 --177.60,0.00,6.79,0.00,1.00,-177.60,0.00 -4.80,-0.00,9.23,0.00,1.00,-172.80,4.80 --168.00,0.00,6.77,0.00,1.00,-168.00,9.60 -14.40,-0.00,9.25,0.00,1.00,-168.00,14.40 --158.40,4.80,6.75,0.00,1.00,-163.20,19.20 -24.00,-4.80,9.27,0.00,1.00,-158.40,19.20 --148.80,4.80,6.73,0.00,1.00,-153.60,24.00 -33.60,-4.80,9.29,0.00,1.00,-148.80,28.80 --139.20,4.80,6.71,0.00,1.00,-144.00,33.60 -43.20,-4.80,9.31,0.00,1.00,-139.20,33.60 --129.60,4.80,6.69,0.00,1.00,-134.40,38.40 -52.80,-4.80,9.34,0.00,1.00,-129.60,43.20 --120.00,4.80,6.66,0.00,1.00,-124.80,43.20 -62.40,-4.80,9.36,0.00,1.00,-120.00,48.00 --110.40,9.60,6.64,0.00,1.00,-115.20,48.00 -72.00,-9.60,9.38,0.00,1.00,-110.40,48.00 --100.80,9.60,6.62,0.00,1.00,-105.60,52.80 -81.60,-9.60,9.40,0.00,1.00,-96.00,52.80 --91.20,9.60,6.60,0.00,1.00,-91.20,52.80 -96.00,-9.60,9.42,0.00,1.00,-86.40,52.80 --81.60,9.60,6.58,0.00,1.00,-81.60,52.80 -105.60,-9.60,9.44,0.00,1.00,-72.00,52.80 --72.00,9.60,6.56,0.00,1.00,-67.20,48.00 -115.20,-4.80,9.46,0.00,1.00,-62.40,48.00 --62.40,4.80,6.54,0.00,1.00,-57.60,43.20 -124.80,-4.80,9.48,0.00,1.00,-52.80,43.20 --52.80,4.80,6.52,0.00,1.00,-48.00,38.40 -134.40,-4.80,9.51,0.00,1.00,-43.20,38.40 --43.20,4.80,6.49,0.00,1.00,-38.40,33.60 -144.00,-4.80,9.53,0.00,1.00,-33.60,28.80 --33.60,4.80,6.47,0.00,1.00,-28.80,24.00 -153.60,-4.80,9.55,0.00,1.00,-24.00,24.00 --24.00,4.80,6.45,0.00,1.00,-19.20,19.20 -163.20,-4.80,9.57,0.00,1.00,-14.40,14.40 --14.40,0.00,6.43,0.00,1.00,-9.60,9.60 -172.80,-0.00,9.59,0.00,1.00,-9.60,9.60 --4.80,0.00,6.41,0.00,1.00,-4.80,4.80 -0.00,0.00,9.61,0.00,1.00,0.00,0.00 --177.60,0.00,6.39,0.00,1.00,4.80,-4.80 -9.60,-0.00,9.63,0.00,1.00,9.60,-9.60 --168.00,4.80,6.37,0.00,1.00,14.40,-14.40 -19.20,-4.80,9.66,0.00,1.00,14.40,-14.40 --158.40,4.80,6.34,0.00,1.00,19.20,-19.20 -28.80,-4.80,9.68,0.00,1.00,24.00,-24.00 --148.80,4.80,6.32,0.00,1.00,28.80,-28.80 -38.40,-9.60,9.70,0.00,1.00,33.60,-33.60 --139.20,9.60,6.30,0.00,1.00,38.40,-33.60 -48.00,-9.60,9.72,0.00,1.00,43.20,-38.40 --129.60,9.60,6.28,0.00,1.00,48.00,-43.20 -57.60,-9.60,9.74,0.00,1.00,52.80,-43.20 --120.00,9.60,6.26,0.00,1.00,57.60,-48.00 -67.20,-9.60,9.76,0.00,1.00,62.40,-52.80 --110.40,9.60,6.24,0.00,1.00,67.20,-52.80 -76.80,-14.40,9.78,0.00,1.00,76.80,-57.60 --100.80,14.40,6.22,0.00,1.00,81.60,-57.60 -86.40,-14.40,9.81,0.00,1.00,86.40,-57.60 --86.40,14.40,6.19,0.00,1.00,91.20,-57.60 -96.00,-14.40,9.83,0.00,1.00,96.00,-57.60 --76.80,14.40,6.17,0.00,1.00,100.80,-57.60 -105.60,-14.40,9.85,0.00,1.00,110.40,-52.80 --67.20,9.60,6.15,0.00,1.00,115.20,-52.80 -115.20,-9.60,9.87,0.00,1.00,120.00,-48.00 --57.60,9.60,6.13,0.00,1.00,124.80,-48.00 -124.80,-9.60,9.89,0.00,1.00,129.60,-43.20 --48.00,9.60,6.11,0.00,1.00,134.40,-38.40 -134.40,-9.60,9.91,0.00,1.00,139.20,-38.40 --38.40,9.60,6.09,0.00,1.00,144.00,-33.60 -144.00,-9.60,9.93,0.00,1.00,148.80,-28.80 --28.80,4.80,6.07,0.00,1.00,153.60,-24.00 -153.60,-4.80,9.95,0.00,1.00,158.40,-24.00 --19.20,4.80,6.05,0.00,1.00,163.20,-19.20 -163.20,-4.80,9.98,0.00,1.00,168.00,-14.40 --9.60,4.80,6.02,0.00,1.00,168.00,-9.60 -172.80,-0.00,10.00,0.00,1.00,172.80,-4.80 --0.00,0.00,6.00,0.00,1.00,177.60,-0.00 --177.60,0.00,10.02,0.00,1.00,-177.60,0.00 -4.80,-0.00,5.98,0.00,1.00,-172.80,4.80 --168.00,4.80,10.04,0.00,1.00,-168.00,9.60 -14.40,-4.80,5.96,0.00,1.00,-168.00,14.40 --158.40,4.80,10.06,0.00,1.00,-163.20,19.20 -24.00,-4.80,5.94,0.00,1.00,-158.40,24.00 --148.80,4.80,10.08,0.00,1.00,-153.60,24.00 -33.60,-9.60,5.92,0.00,1.00,-148.80,28.80 --139.20,9.60,10.10,0.00,1.00,-144.00,33.60 -43.20,-9.60,5.90,0.00,1.00,-139.20,38.40 --129.60,9.60,10.13,0.00,1.00,-134.40,38.40 -52.80,-9.60,5.87,0.00,1.00,-129.60,43.20 --120.00,9.60,10.15,0.00,1.00,-124.80,48.00 -62.40,-9.60,5.85,0.00,1.00,-120.00,48.00 --110.40,9.60,10.17,0.00,1.00,-115.20,52.80 -72.00,-14.40,5.83,0.00,1.00,-110.40,52.80 --100.80,14.40,10.19,0.00,1.00,-100.80,57.60 -81.60,-14.40,5.81,0.00,1.00,-96.00,57.60 --91.20,14.40,10.21,0.00,1.00,-91.20,57.60 -96.00,-14.40,5.79,0.00,1.00,-86.40,57.60 --81.60,14.40,10.23,0.00,1.00,-81.60,57.60 -105.60,-14.40,5.77,0.00,1.00,-76.80,57.60 --72.00,9.60,10.25,0.00,1.00,-67.20,52.80 -115.20,-9.60,5.75,0.00,1.00,-62.40,52.80 --62.40,9.60,10.28,0.00,1.00,-57.60,48.00 -124.80,-9.60,5.72,0.00,1.00,-52.80,43.20 --52.80,9.60,10.30,0.00,1.00,-48.00,43.20 -134.40,-9.60,5.70,0.00,1.00,-43.20,38.40 --43.20,9.60,10.32,0.00,1.00,-38.40,33.60 -144.00,-9.60,5.68,0.00,1.00,-33.60,33.60 --33.60,4.80,10.34,0.00,1.00,-28.80,28.80 -153.60,-4.80,5.66,0.00,1.00,-24.00,24.00 --24.00,4.80,10.36,0.00,1.00,-19.20,19.20 -163.20,-4.80,5.64,0.00,1.00,-14.40,14.40 --14.40,4.80,10.38,0.00,1.00,-14.40,14.40 -172.80,-0.00,5.62,0.00,1.00,-9.60,9.60 --4.80,0.00,10.40,0.00,1.00,-4.80,4.80 -0.00,0.00,5.60,0.00,1.00,0.00,0.00 --177.60,0.00,10.42,0.00,1.00,4.80,-4.80 -9.60,-4.80,5.58,0.00,1.00,9.60,-9.60 --168.00,4.80,10.45,0.00,1.00,14.40,-14.40 -19.20,-4.80,5.55,0.00,1.00,19.20,-19.20 --158.40,4.80,10.47,0.00,1.00,19.20,-19.20 -28.80,-9.60,5.53,0.00,1.00,24.00,-24.00 --148.80,9.60,10.49,0.00,1.00,28.80,-28.80 -38.40,-9.60,5.51,0.00,1.00,33.60,-33.60 --139.20,9.60,10.51,0.00,1.00,38.40,-38.40 -48.00,-14.40,5.49,0.00,1.00,43.20,-43.20 --129.60,14.40,10.53,0.00,1.00,48.00,-43.20 -57.60,-14.40,5.47,0.00,1.00,52.80,-48.00 --120.00,14.40,10.55,0.00,1.00,57.60,-52.80 -67.20,-14.40,5.45,0.00,1.00,62.40,-52.80 --110.40,14.40,10.57,0.00,1.00,72.00,-57.60 -76.80,-19.20,5.43,0.00,1.00,76.80,-57.60 --100.80,19.20,10.60,0.00,1.00,81.60,-62.40 -86.40,-19.20,5.40,0.00,1.00,86.40,-62.40 --86.40,19.20,10.62,0.00,1.00,91.20,-62.40 -96.00,-19.20,5.38,0.00,1.00,96.00,-62.40 --76.80,19.20,10.64,0.00,1.00,100.80,-62.40 -105.60,-14.40,5.36,0.00,1.00,105.60,-57.60 --67.20,14.40,10.66,0.00,1.00,110.40,-57.60 -115.20,-14.40,5.34,0.00,1.00,120.00,-52.80 --57.60,14.40,10.68,0.00,1.00,124.80,-48.00 -124.80,-14.40,5.32,0.00,1.00,129.60,-48.00 --48.00,14.40,10.70,0.00,1.00,134.40,-43.20 -134.40,-14.40,5.30,0.00,1.00,139.20,-38.40 --38.40,9.60,10.72,0.00,1.00,144.00,-33.60 -144.00,-9.60,5.28,0.00,1.00,148.80,-33.60 --28.80,9.60,10.74,0.00,1.00,153.60,-28.80 -153.60,-9.60,5.26,0.00,1.00,158.40,-24.00 --19.20,4.80,10.77,0.00,1.00,158.40,-19.20 -163.20,-4.80,5.23,0.00,1.00,163.20,-14.40 --9.60,4.80,10.79,0.00,1.00,168.00,-9.60 -172.80,-0.00,5.21,0.00,1.00,172.80,-4.80 --0.00,0.00,10.81,0.00,1.00,177.60,-0.00 --177.60,0.00,5.19,0.00,1.00,-177.60,0.00 -4.80,-0.00,10.83,0.00,1.00,-172.80,4.80 --168.00,4.80,5.17,0.00,1.00,-168.00,9.60 -14.40,-4.80,10.85,0.00,1.00,-163.20,14.40 --158.40,4.80,5.15,0.00,1.00,-158.40,19.20 -24.00,-9.60,10.87,0.00,1.00,-158.40,24.00 --148.80,9.60,5.13,0.00,1.00,-153.60,28.80 -33.60,-9.60,10.89,0.00,1.00,-148.80,33.60 --139.20,9.60,5.11,0.00,1.00,-144.00,33.60 -43.20,-14.40,10.92,0.00,1.00,-139.20,38.40 --129.60,14.40,5.08,0.00,1.00,-134.40,43.20 -52.80,-14.40,10.94,0.00,1.00,-129.60,48.00 --120.00,14.40,5.06,0.00,1.00,-124.80,48.00 -62.40,-14.40,10.96,0.00,1.00,-120.00,52.80 --110.40,14.40,5.04,0.00,1.00,-110.40,57.60 -72.00,-14.40,10.98,0.00,1.00,-105.60,57.60 --100.80,19.20,5.02,0.00,1.00,-100.80,62.40 -81.60,-19.20,11.00,0.00,1.00,-96.00,62.40 --91.20,19.20,5.00,0.00,1.00,-91.20,62.40 -96.00,-19.20,11.02,0.00,1.00,-86.40,62.40 --81.60,19.20,4.98,0.00,1.00,-81.60,62.40 -105.60,-19.20,11.04,0.00,1.00,-76.80,57.60 --72.00,14.40,4.96,0.00,1.00,-72.00,57.60 -115.20,-14.40,11.07,0.00,1.00,-62.40,52.80 --62.40,14.40,4.93,0.00,1.00,-57.60,52.80 -124.80,-14.40,11.09,0.00,1.00,-52.80,48.00 --52.80,14.40,4.91,0.00,1.00,-48.00,43.20 -134.40,-14.40,11.11,0.00,1.00,-43.20,43.20 --43.20,9.60,4.89,0.00,1.00,-38.40,38.40 -144.00,-9.60,11.13,0.00,1.00,-33.60,33.60 --33.60,9.60,4.87,0.00,1.00,-28.80,28.80 -153.60,-9.60,11.15,0.00,1.00,-24.00,24.00 --24.00,4.80,4.85,0.00,1.00,-19.20,19.20 -163.20,-4.80,11.17,0.00,1.00,-19.20,19.20 --14.40,4.80,4.83,0.00,1.00,-14.40,14.40 -172.80,-4.80,11.19,0.00,1.00,-9.60,9.60 --4.80,0.00,4.81,0.00,1.00,-4.80,4.80 -0.00,0.00,11.21,0.00,1.00,0.00,0.00 --177.60,0.00,4.79,0.00,1.00,4.80,-4.80 -9.60,-4.80,11.24,0.00,1.00,9.60,-9.60 --168.00,4.80,4.76,0.00,1.00,14.40,-14.40 -19.20,-4.80,11.26,0.00,1.00,19.20,-19.20 --158.40,9.60,4.74,0.00,1.00,24.00,-24.00 -28.80,-9.60,11.28,0.00,1.00,28.80,-24.00 --148.80,14.40,4.72,0.00,1.00,33.60,-28.80 -38.40,-14.40,11.30,0.00,1.00,38.40,-33.60 --139.20,14.40,4.70,0.00,1.00,43.20,-38.40 -48.00,-14.40,11.32,0.00,1.00,48.00,-43.20 --129.60,19.20,4.68,0.00,1.00,52.80,-48.00 -57.60,-19.20,11.34,0.00,1.00,57.60,-52.80 --120.00,19.20,4.66,0.00,1.00,62.40,-52.80 -67.20,-19.20,11.36,0.00,1.00,67.20,-57.60 --110.40,19.20,4.64,0.00,1.00,72.00,-62.40 -76.80,-19.20,11.39,0.00,1.00,76.80,-62.40 --100.80,24.00,4.61,0.00,1.00,81.60,-67.20 -86.40,-24.00,11.41,0.00,1.00,86.40,-67.20 --86.40,24.00,4.59,0.00,1.00,91.20,-67.20 -96.00,-24.00,11.43,0.00,1.00,96.00,-67.20 --76.80,24.00,4.57,0.00,1.00,100.80,-67.20 -105.60,-19.20,11.45,0.00,1.00,105.60,-62.40 --67.20,19.20,4.55,0.00,1.00,110.40,-57.60 -115.20,-19.20,11.47,0.00,1.00,115.20,-57.60 --57.60,19.20,4.53,0.00,1.00,120.00,-52.80 -124.80,-19.20,11.49,0.00,1.00,124.80,-48.00 --48.00,19.20,4.51,0.00,1.00,129.60,-43.20 -134.40,-14.40,11.51,0.00,1.00,134.40,-43.20 --38.40,14.40,4.49,0.00,1.00,139.20,-38.40 -144.00,-14.40,11.54,0.00,1.00,144.00,-33.60 --28.80,9.60,4.46,0.00,1.00,148.80,-28.80 -153.60,-9.60,11.56,0.00,1.00,153.60,-24.00 --19.20,9.60,4.44,0.00,1.00,158.40,-19.20 -163.20,-4.80,11.58,0.00,1.00,163.20,-14.40 --9.60,4.80,4.42,0.00,1.00,168.00,-9.60 -172.80,-4.80,11.60,0.00,1.00,172.80,-4.80 --0.00,0.00,4.40,0.00,1.00,177.60,-0.00 --177.60,0.00,11.62,0.00,1.00,-177.60,0.00 -4.80,-4.80,4.38,0.00,1.00,-172.80,4.80 --168.00,4.80,11.64,0.00,1.00,-168.00,9.60 -14.40,-4.80,4.36,0.00,1.00,-163.20,14.40 --158.40,9.60,11.66,0.00,1.00,-158.40,19.20 -24.00,-9.60,4.34,0.00,1.00,-153.60,24.00 --148.80,9.60,11.68,0.00,1.00,-148.80,28.80 -33.60,-14.40,4.32,0.00,1.00,-144.00,33.60 --139.20,14.40,11.71,0.00,1.00,-139.20,38.40 -43.20,-14.40,4.29,0.00,1.00,-134.40,43.20 --129.60,19.20,11.73,0.00,1.00,-129.60,43.20 -52.80,-19.20,4.27,0.00,1.00,-124.80,48.00 --120.00,19.20,11.75,0.00,1.00,-120.00,52.80 -62.40,-19.20,4.25,0.00,1.00,-115.20,57.60 --110.40,19.20,11.77,0.00,1.00,-110.40,57.60 -72.00,-19.20,4.23,0.00,1.00,-105.60,62.40 --100.80,24.00,11.79,0.00,1.00,-100.80,67.20 -81.60,-24.00,4.21,0.00,1.00,-96.00,67.20 --91.20,24.00,11.81,0.00,1.00,-91.20,67.20 -96.00,-24.00,4.19,0.00,1.00,-86.40,67.20 --81.60,24.00,11.83,0.00,1.00,-81.60,67.20 -105.60,-19.20,4.17,0.00,1.00,-76.80,62.40 --72.00,19.20,11.86,0.00,1.00,-72.00,62.40 -115.20,-19.20,4.14,0.00,1.00,-67.20,57.60 --62.40,19.20,11.88,0.00,1.00,-62.40,52.80 -124.80,-19.20,4.12,0.00,1.00,-57.60,52.80 --52.80,19.20,11.90,0.00,1.00,-52.80,48.00 -134.40,-14.40,4.10,0.00,1.00,-48.00,43.20 --43.20,14.40,11.92,0.00,1.00,-43.20,38.40 -144.00,-14.40,4.08,0.00,1.00,-38.40,33.60 --33.60,14.40,11.94,0.00,1.00,-33.60,28.80 -153.60,-9.60,4.06,0.00,1.00,-28.80,24.00 --24.00,9.60,11.96,0.00,1.00,-24.00,24.00 -163.20,-4.80,4.04,0.00,1.00,-19.20,19.20 --14.40,4.80,11.98,0.00,1.00,-14.40,14.40 -172.80,-4.80,4.02,0.00,1.00,-9.60,9.60 --4.80,0.00,12.01,0.00,1.00,-4.80,4.80 -0.00,0.00,3.99,0.00,1.00,0.00,0.00 --177.60,0.00,12.03,0.00,1.00,4.80,-4.80 -9.60,-4.80,3.97,0.00,1.00,9.60,-9.60 --168.00,4.80,12.05,0.00,1.00,14.40,-14.40 -19.20,-9.60,3.95,0.00,1.00,19.20,-19.20 --158.40,9.60,12.07,0.00,1.00,24.00,-24.00 -24.00,-14.40,3.93,0.00,1.00,28.80,-28.80 --148.80,14.40,12.09,0.00,1.00,33.60,-33.60 -33.60,-14.40,3.91,0.00,1.00,38.40,-38.40 --139.20,19.20,12.11,0.00,1.00,43.20,-38.40 -43.20,-19.20,3.89,0.00,1.00,48.00,-43.20 --129.60,19.20,12.13,0.00,1.00,52.80,-48.00 -52.80,-24.00,3.87,0.00,1.00,57.60,-52.80 --120.00,24.00,12.15,0.00,1.00,62.40,-57.60 -62.40,-24.00,3.85,0.00,1.00,67.20,-62.40 --110.40,24.00,12.18,0.00,1.00,72.00,-62.40 -76.80,-24.00,3.82,0.00,1.00,76.80,-67.20 --100.80,28.80,12.20,0.00,1.00,81.60,-72.00 -86.40,-28.80,3.80,0.00,1.00,86.40,-72.00 --86.40,28.80,12.22,0.00,1.00,91.20,-72.00 -96.00,-28.80,3.78,0.00,1.00,96.00,-72.00 --76.80,28.80,12.24,0.00,1.00,100.80,-67.20 -105.60,-24.00,3.76,0.00,1.00,105.60,-67.20 --67.20,24.00,12.26,0.00,1.00,110.40,-62.40 -120.00,-24.00,3.74,0.00,1.00,115.20,-57.60 --57.60,24.00,12.28,0.00,1.00,120.00,-57.60 -129.60,-24.00,3.72,0.00,1.00,124.80,-52.80 --48.00,19.20,12.30,0.00,1.00,129.60,-48.00 -139.20,-19.20,3.70,0.00,1.00,134.40,-43.20 --38.40,19.20,12.33,0.00,1.00,139.20,-38.40 -148.80,-14.40,3.67,0.00,1.00,144.00,-33.60 --28.80,14.40,12.35,0.00,1.00,148.80,-28.80 -158.40,-9.60,3.65,0.00,1.00,153.60,-24.00 --19.20,9.60,12.37,0.00,1.00,158.40,-19.20 -163.20,-9.60,3.63,0.00,1.00,163.20,-14.40 --9.60,4.80,12.39,0.00,1.00,168.00,-9.60 -172.80,-4.80,3.61,0.00,1.00,172.80,-4.80 --0.00,0.00,12.41,0.00,1.00,177.60,-0.00 --177.60,0.00,3.59,0.00,1.00,-177.60,0.00 -4.80,-4.80,12.43,0.00,1.00,-172.80,4.80 --168.00,4.80,3.57,0.00,1.00,-168.00,9.60 -14.40,-9.60,12.45,0.00,1.00,-163.20,14.40 --158.40,9.60,3.55,0.00,1.00,-158.40,19.20 -24.00,-9.60,12.48,0.00,1.00,-153.60,24.00 --153.60,14.40,3.52,0.00,1.00,-148.80,28.80 -33.60,-14.40,12.50,0.00,1.00,-144.00,33.60 --144.00,19.20,3.50,0.00,1.00,-139.20,38.40 -43.20,-19.20,12.52,0.00,1.00,-134.40,43.20 --134.40,19.20,3.48,0.00,1.00,-129.60,48.00 -52.80,-24.00,12.54,0.00,1.00,-124.80,52.80 --124.80,24.00,3.46,0.00,1.00,-120.00,57.60 -62.40,-24.00,12.56,0.00,1.00,-115.20,57.60 --110.40,24.00,3.44,0.00,1.00,-110.40,62.40 -72.00,-24.00,12.58,0.00,1.00,-105.60,67.20 --100.80,28.80,3.42,0.00,1.00,-100.80,67.20 -81.60,-28.80,12.60,0.00,1.00,-96.00,72.00 --91.20,28.80,3.40,0.00,1.00,-91.20,72.00 -96.00,-28.80,12.62,0.00,1.00,-86.40,72.00 --81.60,28.80,3.38,0.00,1.00,-81.60,72.00 -105.60,-24.00,12.65,0.00,1.00,-76.80,67.20 --72.00,24.00,3.35,0.00,1.00,-72.00,62.40 -115.20,-24.00,12.67,0.00,1.00,-67.20,62.40 --57.60,24.00,3.33,0.00,1.00,-62.40,57.60 -124.80,-24.00,12.69,0.00,1.00,-57.60,52.80 --48.00,19.20,3.31,0.00,1.00,-52.80,48.00 -134.40,-19.20,12.71,0.00,1.00,-48.00,43.20 --38.40,19.20,3.29,0.00,1.00,-43.20,38.40 -144.00,-14.40,12.73,0.00,1.00,-38.40,38.40 --28.80,14.40,3.27,0.00,1.00,-33.60,33.60 -153.60,-14.40,12.75,0.00,1.00,-28.80,28.80 --24.00,9.60,3.25,0.00,1.00,-24.00,24.00 -163.20,-9.60,12.77,0.00,1.00,-19.20,19.20 --14.40,4.80,3.23,0.00,1.00,-14.40,14.40 -172.80,-4.80,12.80,0.00,1.00,-9.60,9.60 --4.80,0.00,3.20,0.00,1.00,-4.80,4.80 -0.00,0.00,12.82,0.00,1.00,0.00,0.00 --177.60,4.80,3.18,0.00,1.00,4.80,-4.80 -9.60,-4.80,12.84,0.00,1.00,9.60,-9.60 --168.00,9.60,3.16,0.00,1.00,14.40,-14.40 -14.40,-9.60,12.86,0.00,1.00,19.20,-19.20 --158.40,14.40,3.14,0.00,1.00,24.00,-24.00 -24.00,-14.40,12.88,0.00,1.00,28.80,-28.80 --148.80,19.20,3.12,0.00,1.00,33.60,-33.60 -33.60,-19.20,12.90,0.00,1.00,38.40,-38.40 --139.20,19.20,3.10,0.00,1.00,43.20,-43.20 -43.20,-24.00,12.92,0.00,1.00,48.00,-48.00 --129.60,24.00,3.08,0.00,1.00,52.80,-52.80 -52.80,-28.80,12.95,0.00,1.00,57.60,-57.60 --120.00,28.80,3.05,0.00,1.00,62.40,-57.60 -62.40,-28.80,12.97,0.00,1.00,67.20,-62.40 --110.40,28.80,3.03,0.00,1.00,72.00,-67.20 -76.80,-28.80,12.99,0.00,1.00,76.80,-72.00 --100.80,33.60,3.01,0.00,1.00,81.60,-72.00 -86.40,-33.60,13.01,0.00,1.00,86.40,-76.80 --86.40,33.60,2.99,0.00,1.00,91.20,-76.80 -96.00,-33.60,13.03,0.00,1.00,96.00,-76.80 --76.80,28.80,2.97,0.00,1.00,100.80,-72.00 -110.40,-28.80,13.05,0.00,1.00,105.60,-72.00 --67.20,28.80,2.95,0.00,1.00,110.40,-67.20 -120.00,-28.80,13.07,0.00,1.00,115.20,-62.40 --57.60,28.80,2.93,0.00,1.00,120.00,-57.60 -129.60,-24.00,13.09,0.00,1.00,124.80,-52.80 --48.00,24.00,2.91,0.00,1.00,129.60,-48.00 -139.20,-24.00,13.12,0.00,1.00,134.40,-43.20 --38.40,19.20,2.88,0.00,1.00,139.20,-38.40 -148.80,-19.20,13.14,0.00,1.00,144.00,-33.60 --28.80,14.40,2.86,0.00,1.00,148.80,-28.80 -158.40,-14.40,13.16,0.00,1.00,153.60,-24.00 --19.20,9.60,2.84,0.00,1.00,158.40,-19.20 -168.00,-9.60,13.18,0.00,1.00,163.20,-14.40 --9.60,4.80,2.82,0.00,1.00,168.00,-9.60 -172.80,-4.80,13.20,0.00,1.00,172.80,-4.80 --0.00,0.00,2.80,0.00,1.00,177.60,-0.00 --177.60,0.00,13.22,0.00,1.00,-177.60,0.00 -4.80,-4.80,2.78,0.00,1.00,-172.80,4.80 --168.00,4.80,13.24,0.00,1.00,-168.00,9.60 -14.40,-9.60,2.76,0.00,1.00,-163.20,14.40 --163.20,9.60,13.27,0.00,1.00,-158.40,19.20 -24.00,-14.40,2.73,0.00,1.00,-153.60,24.00 --153.60,14.40,13.29,0.00,1.00,-148.80,28.80 -33.60,-19.20,2.71,0.00,1.00,-144.00,33.60 --144.00,19.20,13.31,0.00,1.00,-139.20,38.40 -43.20,-24.00,2.69,0.00,1.00,-134.40,43.20 --134.40,24.00,13.33,0.00,1.00,-129.60,48.00 -52.80,-24.00,2.67,0.00,1.00,-124.80,52.80 --124.80,28.80,13.35,0.00,1.00,-120.00,57.60 -62.40,-28.80,2.65,0.00,1.00,-115.20,62.40 --115.20,28.80,13.37,0.00,1.00,-110.40,67.20 -72.00,-28.80,2.63,0.00,1.00,-105.60,72.00 --100.80,28.80,13.39,0.00,1.00,-100.80,72.00 -81.60,-33.60,2.61,0.00,1.00,-96.00,76.80 --91.20,33.60,13.42,0.00,1.00,-91.20,76.80 -96.00,-33.60,2.58,0.00,1.00,-86.40,76.80 --81.60,33.60,13.44,0.00,1.00,-81.60,72.00 -105.60,-28.80,2.56,0.00,1.00,-76.80,72.00 --67.20,28.80,13.46,0.00,1.00,-72.00,67.20 -115.20,-28.80,2.54,0.00,1.00,-67.20,62.40 --57.60,28.80,13.48,0.00,1.00,-62.40,57.60 -124.80,-28.80,2.52,0.00,1.00,-57.60,57.60 --48.00,24.00,13.50,0.00,1.00,-52.80,52.80 -134.40,-24.00,2.50,0.00,1.00,-48.00,48.00 --38.40,19.20,13.52,0.00,1.00,-43.20,43.20 -144.00,-19.20,2.48,0.00,1.00,-38.40,38.40 --28.80,19.20,13.54,0.00,1.00,-33.60,33.60 -153.60,-14.40,2.46,0.00,1.00,-28.80,28.80 --19.20,14.40,13.56,0.00,1.00,-24.00,24.00 -163.20,-9.60,2.44,0.00,1.00,-19.20,19.20 --14.40,9.60,13.59,0.00,1.00,-14.40,14.40 -172.80,-4.80,2.41,0.00,1.00,-9.60,9.60 --4.80,4.80,13.61,0.00,1.00,-4.80,4.80 -0.00,0.00,2.39,0.00,1.00,0.00,0.00 --177.60,4.80,13.63,0.00,1.00,4.80,-4.80 -9.60,-4.80,2.37,0.00,1.00,9.60,-9.60 --168.00,9.60,13.65,0.00,1.00,14.40,-14.40 -14.40,-9.60,2.35,0.00,1.00,19.20,-19.20 --158.40,14.40,13.67,0.00,1.00,24.00,-24.00 -24.00,-14.40,2.33,0.00,1.00,28.80,-28.80 --153.60,19.20,13.69,0.00,1.00,33.60,-33.60 -33.60,-24.00,2.31,0.00,1.00,38.40,-38.40 --144.00,24.00,13.71,0.00,1.00,43.20,-43.20 -43.20,-24.00,2.29,0.00,1.00,48.00,-48.00 --134.40,28.80,13.74,0.00,1.00,52.80,-52.80 -52.80,-28.80,2.26,0.00,1.00,57.60,-57.60 --124.80,33.60,13.76,0.00,1.00,62.40,-62.40 -62.40,-33.60,2.24,0.00,1.00,67.20,-67.20 --110.40,33.60,13.78,0.00,1.00,72.00,-72.00 -72.00,-33.60,2.22,0.00,1.00,76.80,-72.00 --100.80,38.40,13.80,0.00,1.00,81.60,-76.80 -86.40,-38.40,2.20,0.00,1.00,86.40,-81.60 --86.40,38.40,13.82,0.00,1.00,91.20,-81.60 -96.00,-38.40,2.18,0.00,1.00,96.00,-81.60 --76.80,33.60,13.84,0.00,1.00,100.80,-76.80 -110.40,-33.60,2.16,0.00,1.00,105.60,-72.00 --67.20,33.60,13.86,0.00,1.00,110.40,-67.20 -120.00,-33.60,2.14,0.00,1.00,115.20,-62.40 --52.80,28.80,13.89,0.00,1.00,120.00,-57.60 -129.60,-28.80,2.11,0.00,1.00,124.80,-52.80 --43.20,28.80,13.91,0.00,1.00,129.60,-48.00 -139.20,-24.00,2.09,0.00,1.00,134.40,-43.20 --33.60,24.00,13.93,0.00,1.00,139.20,-38.40 -148.80,-19.20,2.07,0.00,1.00,144.00,-33.60 --24.00,19.20,13.95,0.00,1.00,148.80,-28.80 -158.40,-14.40,2.05,0.00,1.00,153.60,-24.00 --19.20,14.40,13.97,0.00,1.00,158.40,-19.20 -168.00,-9.60,2.03,0.00,1.00,163.20,-14.40 --9.60,4.80,13.99,0.00,1.00,168.00,-9.60 -172.80,-4.80,2.01,0.00,1.00,172.80,-4.80 --0.00,0.00,14.01,0.00,1.00,177.60,-0.00 --177.60,0.00,1.99,0.00,1.00,-177.60,0.00 -4.80,-4.80,14.03,0.00,1.00,-172.80,4.80 --168.00,4.80,1.97,0.00,1.00,-168.00,9.60 -14.40,-9.60,14.06,0.00,1.00,-163.20,14.40 --163.20,14.40,1.94,0.00,1.00,-158.40,19.20 -24.00,-14.40,14.08,0.00,1.00,-153.60,24.00 --153.60,19.20,1.92,0.00,1.00,-148.80,28.80 -28.80,-19.20,14.10,0.00,1.00,-144.00,33.60 --144.00,24.00,1.90,0.00,1.00,-139.20,38.40 -38.40,-24.00,14.12,0.00,1.00,-134.40,43.20 --134.40,28.80,1.88,0.00,1.00,-129.60,48.00 -48.00,-28.80,14.14,0.00,1.00,-124.80,52.80 --124.80,28.80,1.86,0.00,1.00,-120.00,57.60 -57.60,-33.60,14.16,0.00,1.00,-115.20,62.40 --115.20,33.60,1.84,0.00,1.00,-110.40,67.20 -72.00,-33.60,14.18,0.00,1.00,-105.60,72.00 --105.60,33.60,1.82,0.00,1.00,-100.80,76.80 -81.60,-38.40,14.21,0.00,1.00,-96.00,81.60 --91.20,38.40,1.79,0.00,1.00,-91.20,81.60 -96.00,-38.40,14.23,0.00,1.00,-86.40,81.60 --81.60,38.40,1.77,0.00,1.00,-81.60,76.80 -105.60,-33.60,14.25,0.00,1.00,-76.80,72.00 --67.20,33.60,1.75,0.00,1.00,-72.00,72.00 -120.00,-33.60,14.27,0.00,1.00,-67.20,67.20 --57.60,33.60,1.73,0.00,1.00,-62.40,62.40 -129.60,-28.80,14.29,0.00,1.00,-57.60,57.60 --48.00,28.80,1.71,0.00,1.00,-52.80,52.80 -139.20,-24.00,14.31,0.00,1.00,-48.00,48.00 --38.40,24.00,1.69,0.00,1.00,-43.20,43.20 -148.80,-24.00,14.33,0.00,1.00,-38.40,38.40 --28.80,19.20,1.67,0.00,1.00,-33.60,33.60 -158.40,-14.40,14.36,0.00,1.00,-28.80,28.80 --19.20,14.40,1.64,0.00,1.00,-24.00,24.00 -163.20,-9.60,14.38,0.00,1.00,-19.20,19.20 --9.60,9.60,1.62,0.00,1.00,-14.40,14.40 -172.80,-4.80,14.40,0.00,1.00,-9.60,9.60 --4.80,4.80,1.60,0.00,1.00,-4.80,4.80 -0.00,0.00,14.42,0.00,1.00,0.00,0.00 --177.60,4.80,1.58,0.00,1.00,4.80,-4.80 -9.60,-4.80,14.44,0.00,1.00,9.60,-9.60 --168.00,9.60,1.56,0.00,1.00,14.40,-14.40 -14.40,-14.40,14.46,0.00,1.00,19.20,-19.20 --163.20,14.40,1.54,0.00,1.00,24.00,-24.00 -24.00,-19.20,14.48,0.00,1.00,28.80,-28.80 --153.60,19.20,1.52,0.00,1.00,33.60,-33.60 -28.80,-24.00,14.50,0.00,1.00,38.40,-38.40 --144.00,28.80,1.50,0.00,1.00,43.20,-43.20 -38.40,-28.80,14.53,0.00,1.00,48.00,-48.00 --134.40,33.60,1.47,0.00,1.00,52.80,-52.80 -48.00,-33.60,14.55,0.00,1.00,57.60,-57.60 --124.80,33.60,1.45,0.00,1.00,62.40,-62.40 -62.40,-38.40,14.57,0.00,1.00,67.20,-67.20 --115.20,38.40,1.43,0.00,1.00,72.00,-72.00 -72.00,-38.40,14.59,0.00,1.00,76.80,-76.80 --100.80,43.20,1.41,0.00,1.00,81.60,-81.60 -86.40,-43.20,14.61,0.00,1.00,86.40,-86.40 --86.40,43.20,1.39,0.00,1.00,91.20,-86.40 -96.00,-43.20,14.63,0.00,1.00,96.00,-81.60 --76.80,38.40,1.37,0.00,1.00,100.80,-76.80 -110.40,-38.40,14.65,0.00,1.00,105.60,-72.00 --62.40,38.40,1.35,0.00,1.00,110.40,-67.20 -120.00,-38.40,14.68,0.00,1.00,115.20,-62.40 --52.80,33.60,1.32,0.00,1.00,120.00,-57.60 -134.40,-33.60,14.70,0.00,1.00,124.80,-52.80 --43.20,28.80,1.30,0.00,1.00,129.60,-48.00 -144.00,-28.80,14.72,0.00,1.00,134.40,-43.20 --33.60,24.00,1.28,0.00,1.00,139.20,-38.40 -153.60,-24.00,14.74,0.00,1.00,144.00,-33.60 --24.00,19.20,1.26,0.00,1.00,148.80,-28.80 -158.40,-19.20,14.76,0.00,1.00,153.60,-24.00 --14.40,14.40,1.24,0.00,1.00,158.40,-19.20 -168.00,-9.60,14.78,0.00,1.00,163.20,-14.40 --9.60,9.60,1.22,0.00,1.00,168.00,-9.60 -172.80,-4.80,14.80,0.00,1.00,172.80,-4.80 --0.00,0.00,1.20,0.00,1.00,177.60,-0.00 --177.60,0.00,14.83,0.00,1.00,-177.60,0.00 -4.80,-4.80,1.17,0.00,1.00,-172.80,4.80 --172.80,9.60,14.85,0.00,1.00,-168.00,9.60 -14.40,-9.60,1.15,0.00,1.00,-163.20,14.40 --163.20,14.40,14.87,0.00,1.00,-158.40,19.20 -19.20,-19.20,1.13,0.00,1.00,-153.60,24.00 --153.60,19.20,14.89,0.00,1.00,-148.80,28.80 -28.80,-24.00,1.11,0.00,1.00,-144.00,33.60 --148.80,24.00,14.91,0.00,1.00,-139.20,38.40 -38.40,-28.80,1.09,0.00,1.00,-134.40,43.20 --139.20,28.80,14.93,0.00,1.00,-129.60,48.00 -48.00,-33.60,1.07,0.00,1.00,-124.80,52.80 --129.60,33.60,14.95,0.00,1.00,-120.00,57.60 -57.60,-38.40,1.05,0.00,1.00,-115.20,62.40 --115.20,38.40,14.97,0.00,1.00,-110.40,67.20 -67.20,-38.40,1.03,0.00,1.00,-105.60,72.00 --105.60,38.40,15.00,0.00,1.00,-100.80,76.80 -81.60,-43.20,1.00,0.00,1.00,-96.00,81.60 --91.20,43.20,15.02,0.00,1.00,-91.20,86.40 -96.00,-43.20,0.98,0.00,1.00,-86.40,86.40 --76.80,43.20,15.04,0.00,1.00,-81.60,81.60 -105.60,-38.40,0.96,0.00,1.00,-76.80,76.80 --67.20,38.40,15.06,0.00,1.00,-72.00,72.00 -120.00,-38.40,0.94,0.00,1.00,-67.20,67.20 --52.80,33.60,15.08,0.00,1.00,-62.40,62.40 -129.60,-33.60,0.92,0.00,1.00,-57.60,57.60 --43.20,33.60,15.10,0.00,1.00,-52.80,52.80 -139.20,-28.80,0.90,0.00,1.00,-48.00,48.00 --33.60,28.80,15.12,0.00,1.00,-43.20,43.20 -148.80,-24.00,0.88,0.00,1.00,-38.40,38.40 --28.80,19.20,15.15,0.00,1.00,-33.60,33.60 -158.40,-19.20,0.85,0.00,1.00,-28.80,28.80 --19.20,14.40,15.17,0.00,1.00,-24.00,24.00 -163.20,-14.40,0.83,0.00,1.00,-19.20,19.20 --9.60,9.60,15.19,0.00,1.00,-14.40,14.40 -172.80,-4.80,0.81,0.00,1.00,-9.60,9.60 --4.80,4.80,15.21,0.00,1.00,-4.80,4.80 -0.00,0.00,0.79,0.00,1.00,0.00,0.00 --177.60,4.80,15.23,0.00,1.00,4.80,-4.80 -4.80,-4.80,0.77,0.00,1.00,9.60,-9.60 --168.00,9.60,15.25,0.00,1.00,14.40,-14.40 -14.40,-14.40,0.75,0.00,1.00,19.20,-19.20 --163.20,19.20,15.27,0.00,1.00,24.00,-24.00 -19.20,-19.20,0.73,0.00,1.00,28.80,-28.80 --153.60,24.00,15.30,0.00,1.00,33.60,-33.60 -28.80,-28.80,0.70,0.00,1.00,38.40,-38.40 --148.80,28.80,15.32,0.00,1.00,43.20,-43.20 -38.40,-33.60,0.68,0.00,1.00,48.00,-48.00 --139.20,33.60,15.34,0.00,1.00,52.80,-52.80 -48.00,-38.40,0.66,0.00,1.00,57.60,-57.60 --124.80,38.40,15.36,0.00,1.00,62.40,-62.40 -57.60,-43.20,0.64,0.00,1.00,67.20,-67.20 --115.20,43.20,15.38,0.00,1.00,72.00,-72.00 -72.00,-43.20,0.62,0.00,1.00,76.80,-76.80 --100.80,43.20,15.40,0.00,1.00,81.60,-81.60 -86.40,-48.00,0.60,0.00,1.00,86.40,-86.40 --86.40,48.00,15.42,0.00,1.00,91.20,-86.40 -100.80,-48.00,0.58,0.00,1.00,96.00,-81.60 --76.80,43.20,15.44,0.00,1.00,100.80,-76.80 -110.40,-43.20,0.56,0.00,1.00,105.60,-72.00 --62.40,43.20,15.47,0.00,1.00,110.40,-67.20 -124.80,-38.40,0.53,0.00,1.00,115.20,-62.40 --48.00,38.40,15.49,0.00,1.00,120.00,-57.60 -134.40,-38.40,0.51,0.00,1.00,124.80,-52.80 --38.40,33.60,15.51,0.00,1.00,129.60,-48.00 -144.00,-28.80,0.49,0.00,1.00,134.40,-43.20 --28.80,28.80,15.53,0.00,1.00,139.20,-38.40 -153.60,-24.00,0.47,0.00,1.00,144.00,-33.60 --24.00,24.00,15.55,0.00,1.00,148.80,-28.80 -163.20,-19.20,0.45,0.00,1.00,153.60,-24.00 --14.40,14.40,15.57,0.00,1.00,158.40,-19.20 -168.00,-14.40,0.43,0.00,1.00,163.20,-14.40 --9.60,9.60,15.59,0.00,1.00,168.00,-9.60 -172.80,-4.80,0.41,0.00,1.00,172.80,-4.80 --0.00,0.00,15.62,0.00,1.00,177.60,-0.00 --177.60,0.00,0.38,0.00,1.00,-177.60,0.00 -4.80,-4.80,15.64,0.00,1.00,-172.80,4.80 --172.80,9.60,0.36,0.00,1.00,-168.00,9.60 -9.60,-14.40,15.66,0.00,1.00,-163.20,14.40 --163.20,14.40,0.34,0.00,1.00,-158.40,19.20 -19.20,-19.20,15.68,0.00,1.00,-153.60,24.00 --158.40,24.00,0.32,0.00,1.00,-148.80,28.80 -28.80,-24.00,15.70,0.00,1.00,-144.00,33.60 --148.80,28.80,0.30,0.00,1.00,-139.20,38.40 -33.60,-28.80,15.72,0.00,1.00,-134.40,43.20 --139.20,33.60,0.28,0.00,1.00,-129.60,48.00 -43.20,-38.40,15.74,0.00,1.00,-124.80,52.80 --129.60,38.40,0.26,0.00,1.00,-120.00,57.60 -57.60,-38.40,15.77,0.00,1.00,-115.20,62.40 --120.00,43.20,0.23,0.00,1.00,-110.40,67.20 -67.20,-43.20,15.79,0.00,1.00,-105.60,72.00 --105.60,43.20,0.21,0.00,1.00,-100.80,76.80 -81.60,-48.00,15.81,0.00,1.00,-96.00,81.60 --91.20,48.00,0.19,0.00,1.00,-91.20,86.40 -96.00,-48.00,15.83,0.00,1.00,-86.40,86.40 --76.80,43.20,0.17,0.00,1.00,-81.60,81.60 -110.40,-43.20,15.85,0.00,1.00,-76.80,76.80 --67.20,43.20,0.15,0.00,1.00,-72.00,72.00 -120.00,-43.20,15.87,0.00,1.00,-67.20,67.20 --52.80,38.40,0.13,0.00,1.00,-62.40,62.40 -134.40,-38.40,15.89,0.00,1.00,-57.60,57.60 --43.20,33.60,0.11,0.00,1.00,-52.80,52.80 -144.00,-33.60,15.91,0.00,1.00,-48.00,48.00 --33.60,28.80,0.09,0.00,1.00,-43.20,43.20 -153.60,-28.80,15.94,0.00,1.00,-38.40,38.40 --24.00,24.00,0.06,0.00,1.00,-33.60,33.60 -158.40,-19.20,15.96,0.00,1.00,-28.80,28.80 --19.20,19.20,0.04,0.00,1.00,-24.00,24.00 -168.00,-14.40,15.98,0.00,1.00,-19.20,19.20 --9.60,9.60,0.02,0.00,1.00,-14.40,14.40 -172.80,-4.80,16.00,0.00,1.00,-9.60,9.60 --4.80,4.80,0.00,0.00,1.00,-4.80,4.80 +0.00,0.00,0.00,0.00,1.00,-0.00,0.00,0 +-177.60,-4.80,16.00,0.00,1.00,-0.00,0.00,0 +4.80,4.80,0.02,0.00,1.00,-0.00,0.00,0 +-168.00,-9.60,15.98,0.00,1.00,-0.00,0.00,0 +14.40,14.40,0.04,0.00,1.00,-0.00,0.00,0 +-163.20,-14.40,15.96,0.00,1.00,-0.00,0.00,0 +19.20,19.20,0.06,0.00,1.00,-0.00,0.00,0 +-153.60,-24.00,15.94,0.00,1.00,-0.00,0.00,0 +28.80,24.00,0.09,0.00,1.00,-0.00,0.00,0 +-148.80,-28.80,15.91,0.00,1.00,-0.00,0.00,0 +38.40,33.60,0.11,0.00,1.00,-0.00,0.00,0 +-139.20,-33.60,15.89,0.00,1.00,-0.00,0.00,0 +48.00,38.40,0.13,0.00,1.00,-0.00,0.00,0 +-124.80,-38.40,15.87,0.00,1.00,-0.00,0.00,0 +57.60,38.40,0.15,0.00,1.00,-0.00,0.00,0 +-115.20,-43.20,15.85,0.00,1.00,-0.00,0.00,0 +72.00,43.20,0.17,0.00,1.00,-0.00,0.00,0 +-100.80,-43.20,15.83,0.00,1.00,-0.00,0.00,0 +86.40,43.20,0.19,0.00,1.00,-0.00,0.00,0 +-86.40,-43.20,15.81,0.00,1.00,-177.60,0.00,0 +100.80,43.20,0.21,0.00,1.00,-177.60,0.00,0 +-76.80,-43.20,15.79,0.00,1.00,-177.60,0.00,0 +110.40,43.20,0.23,0.00,1.00,-177.60,0.00,0 +-62.40,-43.20,15.77,0.00,1.00,-177.60,0.00,0 +124.80,38.40,0.26,0.00,1.00,-177.60,0.00,0 +-52.80,-38.40,15.74,0.00,1.00,177.60,0.00,0 +134.40,33.60,0.28,0.00,1.00,177.60,0.00,0 +-38.40,-33.60,15.72,0.00,1.00,177.60,0.00,0 +144.00,28.80,0.30,0.00,1.00,177.60,0.00,0 +-33.60,-28.80,15.70,0.00,1.00,177.60,0.00,0 +153.60,24.00,0.32,0.00,1.00,177.60,0.00,0 +-24.00,-19.20,15.68,0.00,1.00,177.60,0.00,0 +158.40,19.20,0.34,0.00,1.00,177.60,0.00,0 +-14.40,-14.40,15.66,0.00,1.00,177.60,0.00,0 +168.00,9.60,0.36,0.00,1.00,177.60,0.00,0 +-9.60,-9.60,15.64,0.00,1.00,177.60,0.00,0 +172.80,4.80,0.38,0.00,1.00,177.60,0.00,0 +-0.00,-0.00,15.62,0.00,1.00,177.60,0.00,0 +-177.60,-0.00,0.41,0.00,1.00,-177.60,0.00,0 +4.80,4.80,15.59,0.00,1.00,-177.60,0.00,0 +-172.80,-9.60,0.43,0.00,1.00,-177.60,0.00,0 +14.40,9.60,15.57,0.00,1.00,-177.60,0.00,0 +-163.20,-14.40,0.45,0.00,1.00,-177.60,0.00,0 +19.20,19.20,15.55,0.00,1.00,-177.60,0.00,0 +-158.40,-19.20,0.47,0.00,1.00,-177.60,0.00,0 +28.80,24.00,15.53,0.00,1.00,-177.60,0.00,0 +-148.80,-28.80,0.49,0.00,1.00,-177.60,0.00,0 +33.60,28.80,15.51,0.00,1.00,-177.60,0.00,0 +-139.20,-33.60,0.51,0.00,1.00,-177.60,0.00,0 +43.20,33.60,15.49,0.00,1.00,-177.60,0.00,0 +-129.60,-38.40,0.53,0.00,1.00,-177.60,0.00,0 +57.60,38.40,15.47,0.00,1.00,177.60,0.00,0 +-120.00,-43.20,0.56,0.00,1.00,177.60,0.00,0 +67.20,43.20,15.44,0.00,1.00,177.60,0.00,0 +-105.60,-43.20,0.58,0.00,1.00,177.60,0.00,0 +81.60,43.20,15.42,0.00,1.00,177.60,0.00,0 +-91.20,-43.20,0.60,0.00,1.00,177.60,0.00,0 +96.00,43.20,15.40,0.00,1.00,0.00,0.00,0 +-76.80,-43.20,0.62,0.00,1.00,0.00,0.00,0 +110.40,43.20,15.38,0.00,1.00,0.00,0.00,0 +-67.20,-43.20,0.64,0.00,1.00,0.00,0.00,0 +120.00,38.40,15.36,0.00,1.00,0.00,0.00,0 +-52.80,-38.40,0.66,0.00,1.00,0.00,0.00,0 +129.60,38.40,15.34,0.00,1.00,0.00,0.00,0 +-43.20,-33.60,0.68,0.00,1.00,0.00,0.00,0 +144.00,33.60,15.32,0.00,1.00,0.00,0.00,0 +-33.60,-28.80,0.70,0.00,1.00,0.00,0.00,0 +148.80,24.00,15.30,0.00,1.00,0.00,0.00,0 +-24.00,-24.00,0.73,0.00,1.00,0.00,0.00,0 +158.40,19.20,15.27,0.00,1.00,0.00,0.00,0 +-19.20,-14.40,0.75,0.00,1.00,0.00,0.00,0 +168.00,14.40,15.25,0.00,1.00,0.00,0.00,0 +-9.60,-9.60,0.77,0.00,1.00,0.00,0.00,0 +172.80,4.80,15.23,0.00,1.00,0.00,0.00,0 +-4.80,-4.80,0.79,0.00,1.00,0.00,0.00,0 +0.00,0.00,15.21,0.00,1.00,0.00,0.00,0 +-177.60,-4.80,0.81,0.00,1.00,0.00,-0.00,0 +9.60,4.80,15.19,0.00,1.00,0.00,-0.00,0 +-168.00,-9.60,0.83,0.00,1.00,0.00,-0.00,0 +14.40,14.40,15.17,0.00,1.00,0.00,-0.00,0 +-163.20,-14.40,0.85,0.00,1.00,0.00,-0.00,0 +24.00,19.20,15.15,0.00,1.00,4.80,-0.00,0 +-153.60,-19.20,0.88,0.00,1.00,4.80,-4.80,0 +28.80,24.00,15.12,0.00,1.00,4.80,-4.80,0 +-144.00,-24.00,0.90,0.00,1.00,4.80,-4.80,0 +38.40,28.80,15.10,0.00,1.00,4.80,-4.80,0 +-134.40,-28.80,0.92,0.00,1.00,4.80,-4.80,0 +48.00,33.60,15.08,0.00,1.00,9.60,-4.80,0 +-124.80,-33.60,0.94,0.00,1.00,9.60,-4.80,0 +62.40,38.40,15.06,0.00,1.00,9.60,-4.80,0 +-115.20,-38.40,0.96,0.00,1.00,14.40,-4.80,0 +72.00,38.40,15.04,0.00,1.00,19.20,-4.80,0 +-100.80,-38.40,0.98,0.00,1.00,28.80,-4.80,0 +86.40,38.40,15.02,0.00,1.00,52.80,-4.80,0 +-86.40,-38.40,1.00,0.00,1.00,105.60,-4.80,0 +96.00,38.40,15.00,0.00,1.00,139.20,-4.80,0 +-76.80,-38.40,1.03,0.00,1.00,158.40,-4.80,0 +110.40,38.40,14.97,0.00,1.00,163.20,-4.80,0 +-62.40,-38.40,1.05,0.00,1.00,168.00,-4.80,0 +120.00,33.60,14.95,0.00,1.00,168.00,-4.80,0 +-52.80,-33.60,1.07,0.00,1.00,172.80,-4.80,0 +134.40,33.60,14.93,0.00,1.00,172.80,-4.80,0 +-43.20,-28.80,1.09,0.00,1.00,172.80,-4.80,0 +144.00,28.80,14.91,0.00,1.00,172.80,-4.80,0 +-33.60,-24.00,1.11,0.00,1.00,177.60,-4.80,0 +148.80,24.00,14.89,0.00,1.00,177.60,-4.80,0 +-24.00,-19.20,1.13,0.00,1.00,177.60,-4.80,0 +158.40,14.40,14.87,0.00,1.00,177.60,-0.00,0 +-19.20,-14.40,1.15,0.00,1.00,177.60,-0.00,0 +168.00,9.60,14.85,0.00,1.00,177.60,-0.00,0 +-9.60,-9.60,1.17,0.00,1.00,177.60,-0.00,0 +172.80,4.80,14.83,0.00,1.00,177.60,-0.00,0 +-0.00,-0.00,1.20,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,14.80,0.00,1.00,-177.60,0.00,0 +4.80,4.80,1.22,0.00,1.00,-177.60,0.00,0 +-172.80,-9.60,14.78,0.00,1.00,-177.60,0.00,0 +14.40,9.60,1.24,0.00,1.00,-177.60,0.00,0 +-163.20,-14.40,14.76,0.00,1.00,-177.60,0.00,0 +19.20,14.40,1.26,0.00,1.00,-177.60,0.00,0 +-153.60,-19.20,14.74,0.00,1.00,-177.60,4.80,0 +28.80,24.00,1.28,0.00,1.00,-177.60,4.80,0 +-148.80,-24.00,14.72,0.00,1.00,-177.60,4.80,0 +38.40,28.80,1.30,0.00,1.00,-172.80,4.80,0 +-139.20,-28.80,14.70,0.00,1.00,-172.80,4.80,0 +48.00,33.60,1.32,0.00,1.00,-172.80,4.80,0 +-124.80,-33.60,14.68,0.00,1.00,-172.80,4.80,0 +57.60,33.60,1.35,0.00,1.00,-168.00,4.80,0 +-115.20,-38.40,14.65,0.00,1.00,-168.00,4.80,0 +72.00,38.40,1.37,0.00,1.00,-163.20,4.80,0 +-105.60,-38.40,14.63,0.00,1.00,-158.40,4.80,0 +81.60,38.40,1.39,0.00,1.00,-139.20,4.80,0 +-91.20,-38.40,14.61,0.00,1.00,-105.60,4.80,0 +96.00,38.40,1.41,0.00,1.00,-52.80,4.80,0 +-76.80,-38.40,14.59,0.00,1.00,-28.80,4.80,0 +105.60,38.40,1.43,0.00,1.00,-19.20,4.80,0 +-67.20,-38.40,14.57,0.00,1.00,-14.40,4.80,0 +120.00,38.40,1.45,0.00,1.00,-9.60,4.80,0 +-57.60,-33.60,14.55,0.00,1.00,-9.60,4.80,0 +129.60,33.60,1.47,0.00,1.00,-9.60,4.80,0 +-43.20,-28.80,14.53,0.00,1.00,-4.80,4.80,0 +139.20,28.80,1.50,0.00,1.00,-4.80,4.80,0 +-33.60,-24.00,14.50,0.00,1.00,-4.80,4.80,0 +148.80,24.00,1.52,0.00,1.00,-4.80,4.80,0 +-28.80,-19.20,14.48,0.00,1.00,-4.80,4.80,0 +158.40,19.20,1.54,0.00,1.00,-4.80,0.00,0 +-19.20,-14.40,14.46,0.00,1.00,-0.00,0.00,0 +163.20,14.40,1.56,0.00,1.00,-0.00,0.00,0 +-9.60,-9.60,14.44,0.00,1.00,-0.00,0.00,0 +172.80,4.80,1.58,0.00,1.00,-0.00,0.00,0 +-4.80,-4.80,14.42,0.00,1.00,-0.00,0.00,0 +0.00,0.00,1.60,0.00,1.00,0.00,0.00,0 +-177.60,-4.80,14.40,0.00,1.00,0.00,-0.00,0 +9.60,4.80,1.62,0.00,1.00,0.00,-0.00,0 +-168.00,-9.60,14.38,0.00,1.00,4.80,-0.00,0 +14.40,9.60,1.64,0.00,1.00,4.80,-4.80,0 +-158.40,-14.40,14.36,0.00,1.00,4.80,-4.80,0 +24.00,14.40,1.67,0.00,1.00,4.80,-4.80,0 +-153.60,-19.20,14.33,0.00,1.00,4.80,-4.80,0 +33.60,19.20,1.69,0.00,1.00,9.60,-4.80,0 +-144.00,-24.00,14.31,0.00,1.00,9.60,-4.80,0 +43.20,24.00,1.71,0.00,1.00,9.60,-4.80,0 +-134.40,-28.80,14.29,0.00,1.00,14.40,-9.60,0 +52.80,28.80,1.73,0.00,1.00,14.40,-9.60,0 +-124.80,-28.80,14.27,0.00,1.00,19.20,-9.60,0 +62.40,33.60,1.75,0.00,1.00,24.00,-9.60,0 +-110.40,-33.60,14.25,0.00,1.00,28.80,-9.60,0 +72.00,33.60,1.77,0.00,1.00,33.60,-9.60,0 +-100.80,-33.60,14.23,0.00,1.00,48.00,-9.60,0 +86.40,33.60,1.79,0.00,1.00,67.20,-9.60,0 +-86.40,-33.60,14.21,0.00,1.00,96.00,-9.60,0 +96.00,33.60,1.82,0.00,1.00,120.00,-9.60,0 +-76.80,-33.60,14.18,0.00,1.00,139.20,-9.60,0 +110.40,33.60,1.84,0.00,1.00,148.80,-9.60,0 +-67.20,-33.60,14.16,0.00,1.00,153.60,-9.60,0 +120.00,33.60,1.86,0.00,1.00,158.40,-9.60,0 +-52.80,-28.80,14.14,0.00,1.00,163.20,-9.60,0 +129.60,28.80,1.88,0.00,1.00,168.00,-9.60,0 +-43.20,-28.80,14.12,0.00,1.00,168.00,-9.60,0 +139.20,24.00,1.90,0.00,1.00,168.00,-4.80,0 +-33.60,-24.00,14.10,0.00,1.00,172.80,-4.80,0 +148.80,19.20,1.92,0.00,1.00,172.80,-4.80,0 +-24.00,-19.20,14.08,0.00,1.00,172.80,-4.80,0 +158.40,14.40,1.94,0.00,1.00,177.60,-4.80,0 +-19.20,-14.40,14.06,0.00,1.00,177.60,-4.80,0 +168.00,9.60,1.97,0.00,1.00,177.60,-4.80,0 +-9.60,-4.80,14.03,0.00,1.00,177.60,-0.00,0 +172.80,4.80,1.99,0.00,1.00,177.60,-0.00,0 +-0.00,-0.00,14.01,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,2.01,0.00,1.00,-177.60,0.00,0 +4.80,4.80,13.99,0.00,1.00,-177.60,0.00,0 +-168.00,-4.80,2.03,0.00,1.00,-177.60,0.00,0 +14.40,9.60,13.97,0.00,1.00,-177.60,4.80,0 +-163.20,-14.40,2.05,0.00,1.00,-177.60,4.80,0 +24.00,14.40,13.95,0.00,1.00,-177.60,4.80,0 +-153.60,-19.20,2.07,0.00,1.00,-172.80,4.80,0 +28.80,19.20,13.93,0.00,1.00,-172.80,4.80,0 +-144.00,-24.00,2.09,0.00,1.00,-172.80,4.80,0 +38.40,24.00,13.91,0.00,1.00,-168.00,4.80,0 +-134.40,-28.80,2.11,0.00,1.00,-168.00,9.60,0 +48.00,28.80,13.89,0.00,1.00,-168.00,9.60,0 +-124.80,-28.80,2.14,0.00,1.00,-163.20,9.60,0 +62.40,33.60,13.86,0.00,1.00,-158.40,9.60,0 +-115.20,-33.60,2.16,0.00,1.00,-153.60,9.60,0 +72.00,33.60,13.84,0.00,1.00,-148.80,9.60,0 +-100.80,-33.60,2.18,0.00,1.00,-139.20,9.60,0 +81.60,33.60,13.82,0.00,1.00,-120.00,9.60,0 +-91.20,-33.60,2.20,0.00,1.00,-96.00,9.60,0 +96.00,33.60,13.80,0.00,1.00,-67.20,9.60,0 +-81.60,-33.60,2.22,0.00,1.00,-48.00,9.60,0 +105.60,33.60,13.78,0.00,1.00,-33.60,9.60,0 +-67.20,-33.60,2.24,0.00,1.00,-28.80,9.60,0 +115.20,33.60,13.76,0.00,1.00,-24.00,9.60,0 +-57.60,-28.80,2.26,0.00,1.00,-19.20,9.60,0 +129.60,28.80,13.74,0.00,1.00,-14.40,9.60,0 +-48.00,-28.80,2.29,0.00,1.00,-14.40,9.60,0 +139.20,24.00,13.71,0.00,1.00,-9.60,4.80,0 +-38.40,-24.00,2.31,0.00,1.00,-9.60,4.80,0 +148.80,19.20,13.69,0.00,1.00,-9.60,4.80,0 +-28.80,-19.20,2.33,0.00,1.00,-4.80,4.80,0 +153.60,14.40,13.67,0.00,1.00,-4.80,4.80,0 +-19.20,-14.40,2.35,0.00,1.00,-4.80,4.80,0 +163.20,9.60,13.65,0.00,1.00,-4.80,4.80,0 +-9.60,-9.60,2.37,0.00,1.00,-4.80,0.00,0 +172.80,4.80,13.63,0.00,1.00,-0.00,0.00,0 +-4.80,-4.80,2.39,0.00,1.00,-0.00,0.00,0 +0.00,0.00,13.61,0.00,1.00,0.00,0.00,0 +-177.60,-4.80,2.41,0.00,1.00,0.00,-0.00,0 +9.60,4.80,13.59,0.00,1.00,4.80,-0.00,0 +-168.00,-9.60,2.44,0.00,1.00,4.80,-4.80,0 +14.40,9.60,13.56,0.00,1.00,4.80,-4.80,0 +-158.40,-9.60,2.46,0.00,1.00,4.80,-4.80,0 +24.00,14.40,13.54,0.00,1.00,9.60,-4.80,0 +-148.80,-14.40,2.48,0.00,1.00,9.60,-9.60,0 +33.60,19.20,13.52,0.00,1.00,9.60,-9.60,0 +-139.20,-19.20,2.50,0.00,1.00,14.40,-9.60,0 +43.20,24.00,13.50,0.00,1.00,14.40,-9.60,0 +-129.60,-24.00,2.52,0.00,1.00,19.20,-9.60,0 +52.80,24.00,13.48,0.00,1.00,19.20,-14.40,0 +-120.00,-28.80,2.54,0.00,1.00,24.00,-14.40,0 +62.40,28.80,13.46,0.00,1.00,28.80,-14.40,0 +-110.40,-28.80,2.56,0.00,1.00,38.40,-14.40,0 +76.80,28.80,13.44,0.00,1.00,48.00,-14.40,0 +-100.80,-28.80,2.58,0.00,1.00,57.60,-14.40,0 +86.40,28.80,13.42,0.00,1.00,76.80,-14.40,0 +-86.40,-28.80,2.61,0.00,1.00,96.00,-14.40,0 +96.00,28.80,13.39,0.00,1.00,115.20,-14.40,0 +-76.80,-28.80,2.63,0.00,1.00,129.60,-14.40,0 +105.60,28.80,13.37,0.00,1.00,139.20,-14.40,0 +-67.20,-28.80,2.65,0.00,1.00,144.00,-14.40,0 +120.00,28.80,13.35,0.00,1.00,153.60,-14.40,0 +-57.60,-24.00,2.67,0.00,1.00,158.40,-14.40,0 +129.60,24.00,13.33,0.00,1.00,158.40,-9.60,0 +-48.00,-24.00,2.69,0.00,1.00,163.20,-9.60,0 +139.20,19.20,13.31,0.00,1.00,168.00,-9.60,0 +-38.40,-19.20,2.71,0.00,1.00,168.00,-9.60,0 +148.80,19.20,13.29,0.00,1.00,168.00,-9.60,0 +-28.80,-14.40,2.73,0.00,1.00,172.80,-9.60,0 +158.40,14.40,13.27,0.00,1.00,172.80,-4.80,0 +-19.20,-9.60,2.76,0.00,1.00,172.80,-4.80,0 +163.20,9.60,13.24,0.00,1.00,177.60,-4.80,0 +-9.60,-4.80,2.78,0.00,1.00,177.60,-4.80,0 +172.80,4.80,13.22,0.00,1.00,177.60,-0.00,0 +-0.00,-0.00,2.80,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,13.20,0.00,1.00,-177.60,0.00,0 +4.80,4.80,2.82,0.00,1.00,-177.60,0.00,0 +-168.00,-4.80,13.18,0.00,1.00,-177.60,4.80,0 +14.40,9.60,2.84,0.00,1.00,-177.60,4.80,0 +-163.20,-9.60,13.16,0.00,1.00,-172.80,4.80,0 +24.00,14.40,2.86,0.00,1.00,-172.80,4.80,0 +-153.60,-14.40,13.14,0.00,1.00,-172.80,9.60,0 +33.60,19.20,2.88,0.00,1.00,-168.00,9.60,0 +-144.00,-19.20,13.12,0.00,1.00,-168.00,9.60,0 +43.20,19.20,2.91,0.00,1.00,-168.00,9.60,0 +-134.40,-24.00,13.09,0.00,1.00,-163.20,9.60,0 +52.80,24.00,2.93,0.00,1.00,-158.40,9.60,0 +-124.80,-24.00,13.07,0.00,1.00,-158.40,14.40,0 +62.40,28.80,2.95,0.00,1.00,-153.60,14.40,0 +-115.20,-28.80,13.05,0.00,1.00,-144.00,14.40,0 +72.00,28.80,2.97,0.00,1.00,-139.20,14.40,0 +-100.80,-28.80,13.03,0.00,1.00,-129.60,14.40,0 +81.60,28.80,2.99,0.00,1.00,-115.20,14.40,0 +-91.20,-28.80,13.01,0.00,1.00,-96.00,14.40,0 +96.00,28.80,3.01,0.00,1.00,-76.80,14.40,0 +-81.60,-28.80,12.99,0.00,1.00,-57.60,14.40,0 +105.60,28.80,3.03,0.00,1.00,-48.00,14.40,0 +-67.20,-28.80,12.97,0.00,1.00,-38.40,14.40,0 +115.20,28.80,3.05,0.00,1.00,-28.80,14.40,0 +-57.60,-28.80,12.95,0.00,1.00,-24.00,14.40,0 +124.80,24.00,3.08,0.00,1.00,-19.20,14.40,0 +-48.00,-24.00,12.92,0.00,1.00,-19.20,9.60,0 +134.40,24.00,3.10,0.00,1.00,-14.40,9.60,0 +-38.40,-19.20,12.90,0.00,1.00,-14.40,9.60,0 +144.00,19.20,3.12,0.00,1.00,-9.60,9.60,0 +-28.80,-14.40,12.88,0.00,1.00,-9.60,9.60,0 +153.60,14.40,3.14,0.00,1.00,-9.60,4.80,0 +-19.20,-9.60,12.86,0.00,1.00,-4.80,4.80,0 +163.20,9.60,3.16,0.00,1.00,-4.80,4.80,0 +-14.40,-9.60,12.84,0.00,1.00,-4.80,4.80,0 +172.80,4.80,3.18,0.00,1.00,-4.80,0.00,0 +-4.80,-4.80,12.82,0.00,1.00,-0.00,0.00,0 +0.00,0.00,3.20,0.00,1.00,0.00,0.00,0 +-177.60,-0.00,12.80,0.00,1.00,0.00,-0.00,0 +9.60,4.80,3.23,0.00,1.00,4.80,-4.80,0 +-168.00,-4.80,12.77,0.00,1.00,4.80,-4.80,0 +19.20,9.60,3.25,0.00,1.00,4.80,-4.80,0 +-158.40,-9.60,12.75,0.00,1.00,9.60,-9.60,0 +24.00,14.40,3.27,0.00,1.00,9.60,-9.60,0 +-148.80,-14.40,12.73,0.00,1.00,14.40,-9.60,0 +33.60,14.40,3.29,0.00,1.00,14.40,-9.60,0 +-139.20,-19.20,12.71,0.00,1.00,19.20,-14.40,0 +43.20,19.20,3.31,0.00,1.00,19.20,-14.40,0 +-129.60,-19.20,12.69,0.00,1.00,24.00,-14.40,0 +52.80,19.20,3.33,0.00,1.00,28.80,-14.40,0 +-120.00,-24.00,12.67,0.00,1.00,33.60,-19.20,0 +67.20,24.00,3.35,0.00,1.00,38.40,-19.20,0 +-110.40,-24.00,12.65,0.00,1.00,43.20,-19.20,0 +76.80,24.00,3.38,0.00,1.00,52.80,-19.20,0 +-100.80,-24.00,12.62,0.00,1.00,67.20,-19.20,0 +86.40,24.00,3.40,0.00,1.00,76.80,-19.20,0 +-86.40,-24.00,12.60,0.00,1.00,96.00,-19.20,0 +96.00,24.00,3.42,0.00,1.00,105.60,-19.20,0 +-76.80,-24.00,12.58,0.00,1.00,120.00,-19.20,0 +105.60,24.00,3.44,0.00,1.00,129.60,-19.20,0 +-67.20,-24.00,12.56,0.00,1.00,139.20,-19.20,0 +115.20,24.00,3.46,0.00,1.00,144.00,-19.20,0 +-57.60,-24.00,12.54,0.00,1.00,148.80,-14.40,0 +129.60,19.20,3.48,0.00,1.00,153.60,-14.40,0 +-48.00,-19.20,12.52,0.00,1.00,158.40,-14.40,0 +139.20,19.20,3.50,0.00,1.00,163.20,-14.40,0 +-38.40,-14.40,12.50,0.00,1.00,163.20,-14.40,0 +148.80,14.40,3.52,0.00,1.00,168.00,-9.60,0 +-28.80,-14.40,12.48,0.00,1.00,168.00,-9.60,0 +153.60,9.60,3.55,0.00,1.00,172.80,-9.60,0 +-19.20,-9.60,12.45,0.00,1.00,172.80,-4.80,0 +163.20,9.60,3.57,0.00,1.00,172.80,-4.80,0 +-9.60,-4.80,12.43,0.00,1.00,177.60,-4.80,0 +172.80,4.80,3.59,0.00,1.00,177.60,-0.00,0 +-0.00,-0.00,12.41,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,3.61,0.00,1.00,-177.60,0.00,0 +4.80,4.80,12.39,0.00,1.00,-177.60,0.00,0 +-168.00,-4.80,3.63,0.00,1.00,-177.60,4.80,0 +14.40,9.60,12.37,0.00,1.00,-172.80,4.80,0 +-158.40,-9.60,3.65,0.00,1.00,-172.80,4.80,0 +24.00,9.60,12.35,0.00,1.00,-172.80,9.60,0 +-153.60,-14.40,3.67,0.00,1.00,-168.00,9.60,0 +33.60,14.40,12.33,0.00,1.00,-168.00,9.60,0 +-144.00,-14.40,3.70,0.00,1.00,-163.20,14.40,0 +43.20,19.20,12.30,0.00,1.00,-163.20,14.40,0 +-134.40,-19.20,3.72,0.00,1.00,-158.40,14.40,0 +52.80,19.20,12.28,0.00,1.00,-153.60,14.40,0 +-124.80,-24.00,3.74,0.00,1.00,-148.80,14.40,0 +62.40,24.00,12.26,0.00,1.00,-144.00,19.20,0 +-110.40,-24.00,3.76,0.00,1.00,-139.20,19.20,0 +72.00,24.00,12.24,0.00,1.00,-129.60,19.20,0 +-100.80,-24.00,3.78,0.00,1.00,-120.00,19.20,0 +81.60,24.00,12.22,0.00,1.00,-105.60,19.20,0 +-91.20,-24.00,3.80,0.00,1.00,-96.00,19.20,0 +96.00,24.00,12.20,0.00,1.00,-76.80,19.20,0 +-81.60,-24.00,3.82,0.00,1.00,-67.20,19.20,0 +105.60,24.00,12.18,0.00,1.00,-52.80,19.20,0 +-72.00,-24.00,3.85,0.00,1.00,-43.20,19.20,0 +115.20,24.00,12.15,0.00,1.00,-38.40,19.20,0 +-57.60,-24.00,3.87,0.00,1.00,-33.60,19.20,0 +124.80,19.20,12.13,0.00,1.00,-28.80,14.40,0 +-48.00,-19.20,3.89,0.00,1.00,-24.00,14.40,0 +134.40,19.20,12.11,0.00,1.00,-19.20,14.40,0 +-38.40,-19.20,3.91,0.00,1.00,-19.20,14.40,0 +144.00,14.40,12.09,0.00,1.00,-14.40,9.60,0 +-28.80,-14.40,3.93,0.00,1.00,-14.40,9.60,0 +153.60,14.40,12.07,0.00,1.00,-9.60,9.60,0 +-24.00,-9.60,3.95,0.00,1.00,-9.60,9.60,0 +163.20,9.60,12.05,0.00,1.00,-4.80,4.80,0 +-14.40,-4.80,3.97,0.00,1.00,-4.80,4.80,0 +172.80,4.80,12.03,0.00,1.00,-4.80,4.80,0 +-4.80,-0.00,3.99,0.00,1.00,-0.00,0.00,0 +0.00,0.00,12.01,0.00,1.00,0.00,0.00,0 +-177.60,-0.00,4.02,0.00,1.00,0.00,-0.00,0 +9.60,4.80,11.98,0.00,1.00,4.80,-4.80,0 +-168.00,-4.80,4.04,0.00,1.00,4.80,-4.80,0 +19.20,4.80,11.96,0.00,1.00,9.60,-9.60,0 +-158.40,-9.60,4.06,0.00,1.00,9.60,-9.60,0 +28.80,9.60,11.94,0.00,1.00,14.40,-9.60,0 +-148.80,-9.60,4.08,0.00,1.00,14.40,-14.40,0 +38.40,14.40,11.92,0.00,1.00,19.20,-14.40,0 +-139.20,-14.40,4.10,0.00,1.00,19.20,-14.40,0 +48.00,14.40,11.90,0.00,1.00,24.00,-19.20,0 +-129.60,-14.40,4.12,0.00,1.00,28.80,-19.20,0 +57.60,19.20,11.88,0.00,1.00,33.60,-19.20,0 +-120.00,-19.20,4.14,0.00,1.00,38.40,-19.20,0 +67.20,19.20,11.86,0.00,1.00,43.20,-24.00,0 +-110.40,-19.20,4.17,0.00,1.00,52.80,-24.00,0 +76.80,19.20,11.83,0.00,1.00,62.40,-24.00,0 +-100.80,-19.20,4.19,0.00,1.00,72.00,-24.00,0 +86.40,19.20,11.81,0.00,1.00,81.60,-24.00,0 +-86.40,-19.20,4.21,0.00,1.00,91.20,-24.00,0 +96.00,19.20,11.79,0.00,1.00,105.60,-24.00,0 +-76.80,-19.20,4.23,0.00,1.00,115.20,-24.00,0 +105.60,19.20,11.77,0.00,1.00,124.80,-24.00,0 +-67.20,-19.20,4.25,0.00,1.00,134.40,-24.00,0 +115.20,19.20,11.75,0.00,1.00,139.20,-19.20,0 +-57.60,-19.20,4.27,0.00,1.00,144.00,-19.20,0 +124.80,19.20,11.73,0.00,1.00,148.80,-19.20,0 +-48.00,-14.40,4.29,0.00,1.00,153.60,-19.20,0 +134.40,14.40,11.71,0.00,1.00,158.40,-19.20,0 +-38.40,-14.40,4.32,0.00,1.00,158.40,-14.40,0 +144.00,14.40,11.68,0.00,1.00,163.20,-14.40,0 +-28.80,-9.60,4.34,0.00,1.00,168.00,-14.40,0 +153.60,9.60,11.66,0.00,1.00,168.00,-9.60,0 +-19.20,-9.60,4.36,0.00,1.00,172.80,-9.60,0 +163.20,4.80,11.64,0.00,1.00,172.80,-4.80,0 +-9.60,-4.80,4.38,0.00,1.00,172.80,-4.80,0 +172.80,4.80,11.62,0.00,1.00,177.60,-4.80,0 +-0.00,-0.00,4.40,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,11.60,0.00,1.00,-177.60,0.00,0 +4.80,4.80,4.42,0.00,1.00,-177.60,4.80,0 +-168.00,-4.80,11.58,0.00,1.00,-172.80,4.80,0 +14.40,4.80,4.44,0.00,1.00,-172.80,4.80,0 +-158.40,-9.60,11.56,0.00,1.00,-172.80,9.60,0 +24.00,9.60,4.46,0.00,1.00,-168.00,9.60,0 +-148.80,-9.60,11.54,0.00,1.00,-168.00,14.40,0 +33.60,14.40,4.49,0.00,1.00,-163.20,14.40,0 +-139.20,-14.40,11.51,0.00,1.00,-158.40,14.40,0 +43.20,14.40,4.51,0.00,1.00,-158.40,19.20,0 +-129.60,-14.40,11.49,0.00,1.00,-153.60,19.20,0 +52.80,19.20,4.53,0.00,1.00,-148.80,19.20,0 +-120.00,-19.20,11.47,0.00,1.00,-144.00,19.20,0 +62.40,19.20,4.55,0.00,1.00,-139.20,19.20,0 +-110.40,-19.20,11.45,0.00,1.00,-134.40,24.00,0 +72.00,19.20,4.57,0.00,1.00,-124.80,24.00,0 +-100.80,-19.20,11.43,0.00,1.00,-115.20,24.00,0 +81.60,19.20,4.59,0.00,1.00,-105.60,24.00,0 +-91.20,-19.20,11.41,0.00,1.00,-91.20,24.00,0 +96.00,19.20,4.61,0.00,1.00,-81.60,24.00,0 +-81.60,-19.20,11.39,0.00,1.00,-72.00,24.00,0 +105.60,19.20,4.64,0.00,1.00,-62.40,24.00,0 +-72.00,-19.20,11.36,0.00,1.00,-52.80,24.00,0 +115.20,19.20,4.66,0.00,1.00,-43.20,24.00,0 +-62.40,-19.20,11.34,0.00,1.00,-38.40,19.20,0 +124.80,19.20,4.68,0.00,1.00,-33.60,19.20,0 +-52.80,-14.40,11.32,0.00,1.00,-28.80,19.20,0 +134.40,14.40,4.70,0.00,1.00,-24.00,19.20,0 +-43.20,-14.40,11.30,0.00,1.00,-19.20,14.40,0 +144.00,14.40,4.72,0.00,1.00,-19.20,14.40,0 +-33.60,-9.60,11.28,0.00,1.00,-14.40,14.40,0 +153.60,9.60,4.74,0.00,1.00,-14.40,9.60,0 +-24.00,-9.60,11.26,0.00,1.00,-9.60,9.60,0 +163.20,4.80,4.76,0.00,1.00,-9.60,9.60,0 +-14.40,-4.80,11.24,0.00,1.00,-4.80,4.80,0 +172.80,4.80,4.79,0.00,1.00,-4.80,4.80,0 +-4.80,-0.00,11.21,0.00,1.00,-0.00,0.00,0 +0.00,0.00,4.81,0.00,1.00,0.00,0.00,0 +-177.60,-0.00,11.19,0.00,1.00,0.00,-0.00,0 +9.60,4.80,4.83,0.00,1.00,4.80,-4.80,0 +-168.00,-4.80,11.17,0.00,1.00,4.80,-4.80,0 +19.20,4.80,4.85,0.00,1.00,9.60,-9.60,0 +-158.40,-4.80,11.15,0.00,1.00,14.40,-9.60,0 +28.80,9.60,4.87,0.00,1.00,14.40,-14.40,0 +-148.80,-9.60,11.13,0.00,1.00,19.20,-14.40,0 +38.40,9.60,4.89,0.00,1.00,19.20,-19.20,0 +-139.20,-9.60,11.11,0.00,1.00,24.00,-19.20,0 +48.00,9.60,4.91,0.00,1.00,28.80,-19.20,0 +-129.60,-14.40,11.09,0.00,1.00,33.60,-24.00,0 +57.60,14.40,4.93,0.00,1.00,38.40,-24.00,0 +-120.00,-14.40,11.07,0.00,1.00,43.20,-24.00,0 +67.20,14.40,4.96,0.00,1.00,48.00,-24.00,0 +-110.40,-14.40,11.04,0.00,1.00,57.60,-28.80,0 +76.80,14.40,4.98,0.00,1.00,62.40,-28.80,0 +-100.80,-14.40,11.02,0.00,1.00,72.00,-28.80,0 +86.40,14.40,5.00,0.00,1.00,81.60,-28.80,0 +-86.40,-14.40,11.00,0.00,1.00,91.20,-28.80,0 +96.00,14.40,5.02,0.00,1.00,100.80,-28.80,0 +-76.80,-14.40,10.98,0.00,1.00,110.40,-28.80,0 +105.60,14.40,5.04,0.00,1.00,120.00,-28.80,0 +-67.20,-14.40,10.96,0.00,1.00,129.60,-28.80,0 +115.20,14.40,5.06,0.00,1.00,134.40,-24.00,0 +-57.60,-14.40,10.94,0.00,1.00,139.20,-24.00,0 +124.80,14.40,5.08,0.00,1.00,144.00,-24.00,0 +-48.00,-14.40,10.92,0.00,1.00,148.80,-24.00,0 +134.40,9.60,5.11,0.00,1.00,153.60,-19.20,0 +-38.40,-9.60,10.89,0.00,1.00,158.40,-19.20,0 +144.00,9.60,5.13,0.00,1.00,158.40,-14.40,0 +-28.80,-9.60,10.87,0.00,1.00,163.20,-14.40,0 +153.60,4.80,5.15,0.00,1.00,168.00,-14.40,0 +-19.20,-4.80,10.85,0.00,1.00,168.00,-9.60,0 +163.20,4.80,5.17,0.00,1.00,172.80,-9.60,0 +-9.60,-4.80,10.83,0.00,1.00,172.80,-4.80,0 +172.80,0.00,5.19,0.00,1.00,177.60,-4.80,0 +-0.00,-0.00,10.81,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,5.21,0.00,1.00,-177.60,0.00,0 +4.80,0.00,10.79,0.00,1.00,-177.60,4.80,0 +-168.00,-4.80,5.23,0.00,1.00,-172.80,4.80,0 +14.40,4.80,10.77,0.00,1.00,-172.80,9.60,0 +-158.40,-4.80,5.26,0.00,1.00,-168.00,9.60,0 +24.00,4.80,10.74,0.00,1.00,-168.00,14.40,0 +-148.80,-9.60,5.28,0.00,1.00,-163.20,14.40,0 +33.60,9.60,10.72,0.00,1.00,-158.40,14.40,0 +-139.20,-9.60,5.30,0.00,1.00,-158.40,19.20,0 +43.20,9.60,10.70,0.00,1.00,-153.60,19.20,0 +-129.60,-14.40,5.32,0.00,1.00,-148.80,24.00,0 +52.80,14.40,10.68,0.00,1.00,-144.00,24.00,0 +-120.00,-14.40,5.34,0.00,1.00,-139.20,24.00,0 +62.40,14.40,10.66,0.00,1.00,-134.40,24.00,0 +-110.40,-14.40,5.36,0.00,1.00,-129.60,28.80,0 +72.00,14.40,10.64,0.00,1.00,-120.00,28.80,0 +-100.80,-14.40,5.38,0.00,1.00,-110.40,28.80,0 +81.60,14.40,10.62,0.00,1.00,-100.80,28.80,0 +-91.20,-14.40,5.40,0.00,1.00,-91.20,28.80,0 +96.00,14.40,10.60,0.00,1.00,-81.60,28.80,0 +-81.60,-14.40,5.43,0.00,1.00,-72.00,28.80,0 +105.60,14.40,10.57,0.00,1.00,-62.40,28.80,0 +-72.00,-14.40,5.45,0.00,1.00,-57.60,28.80,0 +115.20,14.40,10.55,0.00,1.00,-48.00,24.00,0 +-62.40,-14.40,5.47,0.00,1.00,-43.20,24.00,0 +124.80,14.40,10.53,0.00,1.00,-38.40,24.00,0 +-52.80,-14.40,5.49,0.00,1.00,-33.60,24.00,0 +134.40,9.60,10.51,0.00,1.00,-28.80,19.20,0 +-43.20,-9.60,5.51,0.00,1.00,-24.00,19.20,0 +144.00,9.60,10.49,0.00,1.00,-19.20,19.20,0 +-33.60,-9.60,5.53,0.00,1.00,-19.20,14.40,0 +153.60,9.60,10.47,0.00,1.00,-14.40,14.40,0 +-24.00,-4.80,5.55,0.00,1.00,-14.40,9.60,0 +163.20,4.80,10.45,0.00,1.00,-9.60,9.60,0 +-14.40,-4.80,5.58,0.00,1.00,-4.80,4.80,0 +172.80,4.80,10.42,0.00,1.00,-4.80,4.80,0 +-4.80,-0.00,5.60,0.00,1.00,-0.00,0.00,0 +0.00,0.00,10.40,0.00,1.00,0.00,0.00,0 +-177.60,-0.00,5.62,0.00,1.00,4.80,-4.80,0 +9.60,0.00,10.38,0.00,1.00,4.80,-4.80,0 +-168.00,-4.80,5.64,0.00,1.00,9.60,-9.60,0 +19.20,4.80,10.36,0.00,1.00,9.60,-9.60,0 +-158.40,-4.80,5.66,0.00,1.00,14.40,-14.40,0 +28.80,4.80,10.34,0.00,1.00,19.20,-14.40,0 +-148.80,-4.80,5.68,0.00,1.00,19.20,-19.20,0 +38.40,4.80,10.32,0.00,1.00,24.00,-19.20,0 +-139.20,-9.60,5.70,0.00,1.00,28.80,-24.00,0 +48.00,9.60,10.30,0.00,1.00,33.60,-24.00,0 +-129.60,-9.60,5.72,0.00,1.00,38.40,-24.00,0 +57.60,9.60,10.28,0.00,1.00,43.20,-28.80,0 +-120.00,-9.60,5.75,0.00,1.00,48.00,-28.80,0 +67.20,9.60,10.25,0.00,1.00,52.80,-28.80,0 +-110.40,-9.60,5.77,0.00,1.00,57.60,-33.60,0 +76.80,9.60,10.23,0.00,1.00,67.20,-33.60,0 +-100.80,-9.60,5.79,0.00,1.00,76.80,-33.60,0 +86.40,9.60,10.21,0.00,1.00,81.60,-33.60,0 +-86.40,-9.60,5.81,0.00,1.00,91.20,-33.60,0 +96.00,9.60,10.19,0.00,1.00,100.80,-33.60,0 +-76.80,-9.60,5.83,0.00,1.00,110.40,-33.60,0 +105.60,9.60,10.17,0.00,1.00,115.20,-33.60,0 +-67.20,-9.60,5.85,0.00,1.00,124.80,-33.60,0 +115.20,9.60,10.15,0.00,1.00,129.60,-28.80,0 +-57.60,-9.60,5.87,0.00,1.00,134.40,-28.80,0 +124.80,9.60,10.13,0.00,1.00,139.20,-28.80,0 +-48.00,-9.60,5.90,0.00,1.00,144.00,-24.00,0 +134.40,9.60,10.10,0.00,1.00,148.80,-24.00,0 +-38.40,-9.60,5.92,0.00,1.00,153.60,-19.20,0 +144.00,4.80,10.08,0.00,1.00,158.40,-19.20,0 +-28.80,-4.80,5.94,0.00,1.00,163.20,-14.40,0 +153.60,4.80,10.06,0.00,1.00,163.20,-14.40,0 +-19.20,-4.80,5.96,0.00,1.00,168.00,-9.60,0 +163.20,4.80,10.04,0.00,1.00,172.80,-9.60,0 +-9.60,-0.00,5.98,0.00,1.00,172.80,-4.80,0 +172.80,0.00,10.02,0.00,1.00,177.60,-4.80,0 +-0.00,-0.00,6.00,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,10.00,0.00,1.00,-177.60,0.00,0 +4.80,0.00,6.02,0.00,1.00,-177.60,4.80,0 +-168.00,-0.00,9.98,0.00,1.00,-172.80,4.80,0 +14.40,4.80,6.05,0.00,1.00,-172.80,9.60,0 +-158.40,-4.80,9.95,0.00,1.00,-168.00,9.60,0 +24.00,4.80,6.07,0.00,1.00,-163.20,14.40,0 +-148.80,-4.80,9.93,0.00,1.00,-163.20,14.40,0 +33.60,4.80,6.09,0.00,1.00,-158.40,19.20,0 +-139.20,-9.60,9.91,0.00,1.00,-153.60,19.20,0 +43.20,9.60,6.11,0.00,1.00,-148.80,24.00,0 +-129.60,-9.60,9.89,0.00,1.00,-144.00,24.00,0 +52.80,9.60,6.13,0.00,1.00,-139.20,28.80,0 +-120.00,-9.60,9.87,0.00,1.00,-134.40,28.80,0 +62.40,9.60,6.15,0.00,1.00,-129.60,28.80,0 +-110.40,-9.60,9.85,0.00,1.00,-124.80,33.60,0 +72.00,9.60,6.17,0.00,1.00,-115.20,33.60,0 +-100.80,-9.60,9.83,0.00,1.00,-110.40,33.60,0 +81.60,9.60,6.19,0.00,1.00,-100.80,33.60,0 +-91.20,-9.60,9.81,0.00,1.00,-91.20,33.60,0 +96.00,9.60,6.22,0.00,1.00,-81.60,33.60,0 +-81.60,-9.60,9.78,0.00,1.00,-76.80,33.60,0 +105.60,9.60,6.24,0.00,1.00,-67.20,33.60,0 +-72.00,-9.60,9.76,0.00,1.00,-57.60,33.60,0 +115.20,9.60,6.26,0.00,1.00,-52.80,28.80,0 +-62.40,-9.60,9.74,0.00,1.00,-48.00,28.80,0 +124.80,9.60,6.28,0.00,1.00,-43.20,28.80,0 +-52.80,-9.60,9.72,0.00,1.00,-38.40,24.00,0 +134.40,9.60,6.30,0.00,1.00,-33.60,24.00,0 +-43.20,-9.60,9.70,0.00,1.00,-28.80,24.00,0 +144.00,4.80,6.32,0.00,1.00,-24.00,19.20,0 +-33.60,-4.80,9.68,0.00,1.00,-19.20,19.20,0 +153.60,4.80,6.34,0.00,1.00,-19.20,14.40,0 +-24.00,-4.80,9.66,0.00,1.00,-14.40,14.40,0 +163.20,4.80,6.37,0.00,1.00,-9.60,9.60,0 +-14.40,-4.80,9.63,0.00,1.00,-9.60,9.60,0 +172.80,0.00,6.39,0.00,1.00,-4.80,4.80,0 +-4.80,-0.00,9.61,0.00,1.00,-4.80,4.80,0 +0.00,0.00,6.41,0.00,1.00,0.00,0.00,0 +-177.60,-0.00,9.59,0.00,1.00,4.80,-4.80,0 +9.60,0.00,6.43,0.00,1.00,4.80,-4.80,0 +-168.00,-0.00,9.57,0.00,1.00,9.60,-9.60,0 +19.20,0.00,6.45,0.00,1.00,14.40,-9.60,0 +-158.40,-4.80,9.55,0.00,1.00,14.40,-14.40,0 +28.80,4.80,6.47,0.00,1.00,19.20,-19.20,0 +-148.80,-4.80,9.53,0.00,1.00,24.00,-19.20,0 +38.40,4.80,6.49,0.00,1.00,24.00,-24.00,0 +-139.20,-4.80,9.51,0.00,1.00,28.80,-24.00,0 +48.00,4.80,6.52,0.00,1.00,33.60,-28.80,0 +-129.60,-4.80,9.48,0.00,1.00,38.40,-28.80,0 +57.60,4.80,6.54,0.00,1.00,43.20,-33.60,0 +-120.00,-4.80,9.46,0.00,1.00,48.00,-33.60,0 +67.20,4.80,6.56,0.00,1.00,57.60,-33.60,0 +-110.40,-4.80,9.44,0.00,1.00,62.40,-38.40,0 +76.80,4.80,6.58,0.00,1.00,67.20,-38.40,0 +-100.80,-4.80,9.42,0.00,1.00,76.80,-38.40,0 +86.40,4.80,6.60,0.00,1.00,86.40,-38.40,0 +-86.40,-4.80,9.40,0.00,1.00,91.20,-38.40,0 +96.00,4.80,6.62,0.00,1.00,100.80,-38.40,0 +-76.80,-4.80,9.38,0.00,1.00,105.60,-38.40,0 +105.60,4.80,6.64,0.00,1.00,115.20,-38.40,0 +-67.20,-4.80,9.36,0.00,1.00,120.00,-33.60,0 +115.20,4.80,6.66,0.00,1.00,124.80,-33.60,0 +-57.60,-4.80,9.34,0.00,1.00,134.40,-33.60,0 +124.80,4.80,6.69,0.00,1.00,139.20,-28.80,0 +-48.00,-4.80,9.31,0.00,1.00,144.00,-28.80,0 +134.40,4.80,6.71,0.00,1.00,148.80,-24.00,0 +-38.40,-4.80,9.29,0.00,1.00,153.60,-24.00,0 +144.00,4.80,6.73,0.00,1.00,153.60,-19.20,0 +-28.80,-4.80,9.27,0.00,1.00,158.40,-19.20,0 +153.60,4.80,6.75,0.00,1.00,163.20,-14.40,0 +-19.20,-4.80,9.25,0.00,1.00,168.00,-14.40,0 +163.20,0.00,6.77,0.00,1.00,168.00,-9.60,0 +-9.60,-0.00,9.23,0.00,1.00,172.80,-9.60,0 +172.80,0.00,6.79,0.00,1.00,177.60,-4.80,0 +-0.00,-0.00,9.21,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,6.81,0.00,1.00,-177.60,0.00,0 +4.80,0.00,9.19,0.00,1.00,-177.60,4.80,0 +-168.00,-0.00,6.84,0.00,1.00,-172.80,9.60,0 +14.40,0.00,9.16,0.00,1.00,-168.00,9.60,0 +-158.40,-4.80,6.86,0.00,1.00,-168.00,14.40,0 +24.00,4.80,9.14,0.00,1.00,-163.20,14.40,0 +-148.80,-4.80,6.88,0.00,1.00,-158.40,19.20,0 +33.60,4.80,9.12,0.00,1.00,-153.60,19.20,0 +-139.20,-4.80,6.90,0.00,1.00,-153.60,24.00,0 +43.20,4.80,9.10,0.00,1.00,-148.80,24.00,0 +-129.60,-4.80,6.92,0.00,1.00,-144.00,28.80,0 +52.80,4.80,9.08,0.00,1.00,-139.20,28.80,0 +-120.00,-4.80,6.94,0.00,1.00,-134.40,33.60,0 +62.40,4.80,9.06,0.00,1.00,-124.80,33.60,0 +-110.40,-4.80,6.96,0.00,1.00,-120.00,33.60,0 +72.00,4.80,9.04,0.00,1.00,-115.20,38.40,0 +-100.80,-4.80,6.99,0.00,1.00,-105.60,38.40,0 +81.60,4.80,9.01,0.00,1.00,-100.80,38.40,0 +-91.20,-4.80,7.01,0.00,1.00,-91.20,38.40,0 +96.00,4.80,8.99,0.00,1.00,-86.40,38.40,0 +-81.60,-4.80,7.03,0.00,1.00,-76.80,38.40,0 +105.60,4.80,8.97,0.00,1.00,-67.20,38.40,0 +-72.00,-4.80,7.05,0.00,1.00,-62.40,38.40,0 +115.20,4.80,8.95,0.00,1.00,-57.60,33.60,0 +-62.40,-4.80,7.07,0.00,1.00,-48.00,33.60,0 +124.80,4.80,8.93,0.00,1.00,-43.20,33.60,0 +-52.80,-4.80,7.09,0.00,1.00,-38.40,28.80,0 +134.40,4.80,8.91,0.00,1.00,-33.60,28.80,0 +-43.20,-4.80,7.11,0.00,1.00,-28.80,24.00,0 +144.00,4.80,8.89,0.00,1.00,-24.00,24.00,0 +-33.60,-4.80,7.13,0.00,1.00,-24.00,19.20,0 +153.60,4.80,8.87,0.00,1.00,-19.20,19.20,0 +-24.00,-4.80,7.16,0.00,1.00,-14.40,14.40,0 +163.20,0.00,8.84,0.00,1.00,-14.40,9.60,0 +-14.40,-0.00,7.18,0.00,1.00,-9.60,9.60,0 +172.80,0.00,8.82,0.00,1.00,-4.80,4.80,0 +-4.80,-0.00,7.20,0.00,1.00,-4.80,4.80,0 +0.00,0.00,8.80,0.00,1.00,0.00,0.00,0 +-177.60,-0.00,7.22,0.00,1.00,4.80,-4.80,0 +9.60,0.00,8.78,0.00,1.00,4.80,-4.80,0 +-168.00,-0.00,7.24,0.00,1.00,9.60,-9.60,0 +19.20,0.00,8.76,0.00,1.00,14.40,-14.40,0 +-158.40,-0.00,7.26,0.00,1.00,19.20,-14.40,0 +28.80,0.00,8.74,0.00,1.00,19.20,-19.20,0 +-148.80,-0.00,7.28,0.00,1.00,24.00,-24.00,0 +38.40,0.00,8.72,0.00,1.00,28.80,-24.00,0 +-139.20,-0.00,7.31,0.00,1.00,33.60,-28.80,0 +48.00,0.00,8.69,0.00,1.00,38.40,-28.80,0 +-129.60,-0.00,7.33,0.00,1.00,43.20,-33.60,0 +57.60,0.00,8.67,0.00,1.00,48.00,-33.60,0 +-120.00,-0.00,7.35,0.00,1.00,52.80,-38.40,0 +67.20,0.00,8.65,0.00,1.00,57.60,-38.40,0 +-110.40,-0.00,7.37,0.00,1.00,62.40,-38.40,0 +76.80,0.00,8.63,0.00,1.00,72.00,-43.20,0 +-100.80,-0.00,7.39,0.00,1.00,76.80,-43.20,0 +86.40,0.00,8.61,0.00,1.00,86.40,-43.20,0 +-86.40,-0.00,7.41,0.00,1.00,91.20,-43.20,0 +96.00,0.00,8.59,0.00,1.00,100.80,-43.20,0 +-76.80,-0.00,7.43,0.00,1.00,105.60,-43.20,0 +105.60,0.00,8.57,0.00,1.00,110.40,-43.20,0 +-67.20,-0.00,7.46,0.00,1.00,120.00,-38.40,0 +115.20,0.00,8.54,0.00,1.00,124.80,-38.40,0 +-57.60,-0.00,7.48,0.00,1.00,129.60,-38.40,0 +124.80,0.00,8.52,0.00,1.00,134.40,-33.60,0 +-48.00,-0.00,7.50,0.00,1.00,139.20,-33.60,0 +134.40,0.00,8.50,0.00,1.00,144.00,-28.80,0 +-38.40,-0.00,7.52,0.00,1.00,148.80,-28.80,0 +144.00,0.00,8.48,0.00,1.00,153.60,-24.00,0 +-28.80,-0.00,7.54,0.00,1.00,158.40,-19.20,0 +153.60,0.00,8.46,0.00,1.00,163.20,-19.20,0 +-19.20,-0.00,7.56,0.00,1.00,163.20,-14.40,0 +163.20,0.00,8.44,0.00,1.00,168.00,-9.60,0 +-9.60,-0.00,7.58,0.00,1.00,172.80,-9.60,0 +172.80,0.00,8.42,0.00,1.00,172.80,-4.80,0 +-0.00,-0.00,7.60,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,8.40,0.00,1.00,-177.60,0.00,0 +4.80,0.00,7.63,0.00,1.00,-172.80,4.80,0 +-168.00,-0.00,8.37,0.00,1.00,-172.80,9.60,0 +14.40,0.00,7.65,0.00,1.00,-168.00,9.60,0 +-158.40,-0.00,8.35,0.00,1.00,-163.20,14.40,0 +24.00,0.00,7.67,0.00,1.00,-163.20,19.20,0 +-148.80,-0.00,8.33,0.00,1.00,-158.40,19.20,0 +33.60,0.00,7.69,0.00,1.00,-153.60,24.00,0 +-139.20,-0.00,8.31,0.00,1.00,-148.80,28.80,0 +43.20,0.00,7.71,0.00,1.00,-144.00,28.80,0 +-129.60,-0.00,8.29,0.00,1.00,-139.20,33.60,0 +52.80,0.00,7.73,0.00,1.00,-134.40,33.60,0 +-120.00,-0.00,8.27,0.00,1.00,-129.60,38.40,0 +62.40,0.00,7.75,0.00,1.00,-124.80,38.40,0 +-110.40,-0.00,8.25,0.00,1.00,-120.00,38.40,0 +72.00,0.00,7.78,0.00,1.00,-110.40,43.20,0 +-100.80,-0.00,8.22,0.00,1.00,-105.60,43.20,0 +81.60,0.00,7.80,0.00,1.00,-100.80,43.20,0 +-91.20,-0.00,8.20,0.00,1.00,-91.20,43.20,0 +96.00,0.00,7.82,0.00,1.00,-86.40,43.20,0 +-81.60,-0.00,8.18,0.00,1.00,-76.80,43.20,0 +105.60,0.00,7.84,0.00,1.00,-72.00,43.20,0 +-72.00,-0.00,8.16,0.00,1.00,-62.40,38.40,0 +115.20,0.00,7.86,0.00,1.00,-57.60,38.40,0 +-62.40,-0.00,8.14,0.00,1.00,-52.80,38.40,0 +124.80,0.00,7.88,0.00,1.00,-48.00,33.60,0 +-52.80,-0.00,8.12,0.00,1.00,-43.20,33.60,0 +134.40,0.00,7.90,0.00,1.00,-38.40,28.80,0 +-43.20,-0.00,8.10,0.00,1.00,-33.60,28.80,0 +144.00,0.00,7.93,0.00,1.00,-28.80,24.00,0 +-33.60,-0.00,8.07,0.00,1.00,-24.00,24.00,0 +153.60,0.00,7.95,0.00,1.00,-19.20,19.20,0 +-24.00,-0.00,8.05,0.00,1.00,-19.20,14.40,0 +163.20,0.00,7.97,0.00,1.00,-14.40,14.40,0 +-14.40,-0.00,8.03,0.00,1.00,-9.60,9.60,0 +172.80,0.00,7.99,0.00,1.00,-4.80,4.80,0 +-4.80,-0.00,8.01,0.00,1.00,-4.80,4.80,0 +0.00,0.00,8.01,0.00,1.00,0.00,0.00,0 +-177.60,0.00,7.99,0.00,1.00,4.80,-4.80,0 +9.60,-0.00,8.03,0.00,1.00,4.80,-4.80,0 +-168.00,0.00,7.97,0.00,1.00,9.60,-9.60,0 +19.20,-0.00,8.05,0.00,1.00,14.40,-14.40,0 +-158.40,0.00,7.95,0.00,1.00,19.20,-19.20,0 +28.80,-0.00,8.07,0.00,1.00,24.00,-19.20,0 +-148.80,0.00,7.93,0.00,1.00,24.00,-24.00,0 +38.40,-0.00,8.10,0.00,1.00,28.80,-28.80,0 +-139.20,0.00,7.90,0.00,1.00,33.60,-28.80,0 +48.00,-0.00,8.12,0.00,1.00,38.40,-33.60,0 +-129.60,0.00,7.88,0.00,1.00,43.20,-38.40,0 +57.60,-4.80,8.14,0.00,1.00,48.00,-38.40,0 +-120.00,4.80,7.86,0.00,1.00,52.80,-43.20,0 +67.20,-4.80,8.16,0.00,1.00,62.40,-43.20,0 +-110.40,4.80,7.84,0.00,1.00,67.20,-43.20,0 +76.80,-4.80,8.18,0.00,1.00,72.00,-48.00,0 +-100.80,4.80,7.82,0.00,1.00,76.80,-48.00,0 +86.40,-4.80,8.20,0.00,1.00,86.40,-48.00,0 +-86.40,4.80,7.80,0.00,1.00,91.20,-48.00,0 +96.00,-4.80,8.22,0.00,1.00,96.00,-48.00,0 +-76.80,4.80,7.78,0.00,1.00,105.60,-48.00,0 +105.60,-4.80,8.25,0.00,1.00,110.40,-48.00,0 +-67.20,4.80,7.75,0.00,1.00,115.20,-43.20,0 +115.20,-4.80,8.27,0.00,1.00,120.00,-43.20,0 +-57.60,4.80,7.73,0.00,1.00,129.60,-38.40,0 +124.80,-4.80,8.29,0.00,1.00,134.40,-38.40,0 +-48.00,0.00,7.71,0.00,1.00,139.20,-33.60,0 +134.40,-0.00,8.31,0.00,1.00,144.00,-33.60,0 +-38.40,0.00,7.69,0.00,1.00,148.80,-28.80,0 +144.00,-0.00,8.33,0.00,1.00,153.60,-24.00,0 +-28.80,0.00,7.67,0.00,1.00,153.60,-24.00,0 +153.60,-0.00,8.35,0.00,1.00,158.40,-19.20,0 +-19.20,0.00,7.65,0.00,1.00,163.20,-14.40,0 +163.20,-0.00,8.37,0.00,1.00,168.00,-14.40,0 +-9.60,0.00,7.63,0.00,1.00,172.80,-9.60,0 +172.80,-0.00,8.40,0.00,1.00,172.80,-4.80,0 +-0.00,0.00,7.60,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,8.42,0.00,1.00,-177.60,0.00,0 +4.80,-0.00,7.58,0.00,1.00,-172.80,4.80,0 +-168.00,0.00,8.44,0.00,1.00,-172.80,9.60,0 +14.40,-0.00,7.56,0.00,1.00,-168.00,14.40,0 +-158.40,0.00,8.46,0.00,1.00,-163.20,14.40,0 +24.00,-0.00,7.54,0.00,1.00,-158.40,19.20,0 +-148.80,0.00,8.48,0.00,1.00,-153.60,24.00,0 +33.60,-0.00,7.52,0.00,1.00,-153.60,24.00,0 +-139.20,0.00,8.50,0.00,1.00,-148.80,28.80,0 +43.20,-0.00,7.50,0.00,1.00,-144.00,33.60,0 +-129.60,0.00,8.52,0.00,1.00,-139.20,33.60,0 +52.80,-4.80,7.48,0.00,1.00,-134.40,38.40,0 +-120.00,4.80,8.54,0.00,1.00,-129.60,38.40,0 +62.40,-4.80,7.46,0.00,1.00,-120.00,43.20,0 +-110.40,4.80,8.57,0.00,1.00,-115.20,43.20,0 +72.00,-4.80,7.43,0.00,1.00,-110.40,48.00,0 +-100.80,4.80,8.59,0.00,1.00,-105.60,48.00,0 +81.60,-4.80,7.41,0.00,1.00,-96.00,48.00,0 +-91.20,4.80,8.61,0.00,1.00,-91.20,48.00,0 +96.00,-4.80,7.39,0.00,1.00,-86.40,48.00,0 +-81.60,4.80,8.63,0.00,1.00,-76.80,48.00,0 +105.60,-4.80,7.37,0.00,1.00,-72.00,48.00,0 +-72.00,4.80,8.65,0.00,1.00,-67.20,43.20,0 +115.20,-4.80,7.35,0.00,1.00,-62.40,43.20,0 +-62.40,4.80,8.67,0.00,1.00,-52.80,43.20,0 +124.80,-4.80,7.33,0.00,1.00,-48.00,38.40,0 +-52.80,0.00,8.69,0.00,1.00,-43.20,38.40,0 +134.40,-0.00,7.31,0.00,1.00,-38.40,33.60,0 +-43.20,0.00,8.72,0.00,1.00,-33.60,28.80,0 +144.00,-0.00,7.28,0.00,1.00,-28.80,28.80,0 +-33.60,0.00,8.74,0.00,1.00,-24.00,24.00,0 +153.60,-0.00,7.26,0.00,1.00,-24.00,19.20,0 +-24.00,0.00,8.76,0.00,1.00,-19.20,19.20,0 +163.20,-0.00,7.24,0.00,1.00,-14.40,14.40,0 +-14.40,0.00,8.78,0.00,1.00,-9.60,9.60,0 +172.80,-0.00,7.22,0.00,1.00,-4.80,4.80,0 +-4.80,0.00,8.80,0.00,1.00,-4.80,4.80,0 +0.00,0.00,7.20,0.00,1.00,0.00,0.00,0 +-177.60,0.00,8.82,0.00,1.00,4.80,-4.80,0 +9.60,-0.00,7.18,0.00,1.00,9.60,-9.60,0 +-168.00,0.00,8.84,0.00,1.00,9.60,-9.60,0 +19.20,-4.80,7.16,0.00,1.00,14.40,-14.40,0 +-158.40,4.80,8.87,0.00,1.00,19.20,-19.20,0 +28.80,-4.80,7.13,0.00,1.00,24.00,-24.00,0 +-148.80,4.80,8.89,0.00,1.00,28.80,-24.00,0 +38.40,-4.80,7.11,0.00,1.00,33.60,-28.80,0 +-139.20,4.80,8.91,0.00,1.00,38.40,-33.60,0 +48.00,-4.80,7.09,0.00,1.00,43.20,-38.40,0 +-129.60,4.80,8.93,0.00,1.00,48.00,-38.40,0 +57.60,-4.80,7.07,0.00,1.00,52.80,-43.20,0 +-120.00,4.80,8.95,0.00,1.00,57.60,-43.20,0 +67.20,-4.80,7.05,0.00,1.00,62.40,-48.00,0 +-110.40,9.60,8.97,0.00,1.00,67.20,-48.00,0 +76.80,-9.60,7.03,0.00,1.00,72.00,-52.80,0 +-100.80,9.60,8.99,0.00,1.00,81.60,-52.80,0 +86.40,-9.60,7.01,0.00,1.00,86.40,-52.80,0 +-86.40,9.60,9.01,0.00,1.00,91.20,-52.80,0 +96.00,-9.60,6.99,0.00,1.00,96.00,-52.80,0 +-76.80,9.60,9.04,0.00,1.00,105.60,-52.80,0 +105.60,-9.60,6.96,0.00,1.00,110.40,-48.00,0 +-67.20,9.60,9.06,0.00,1.00,115.20,-48.00,0 +115.20,-4.80,6.94,0.00,1.00,120.00,-48.00,0 +-57.60,4.80,9.08,0.00,1.00,124.80,-43.20,0 +124.80,-4.80,6.92,0.00,1.00,129.60,-43.20,0 +-48.00,4.80,9.10,0.00,1.00,134.40,-38.40,0 +134.40,-4.80,6.90,0.00,1.00,139.20,-33.60,0 +-38.40,4.80,9.12,0.00,1.00,144.00,-33.60,0 +144.00,-4.80,6.88,0.00,1.00,148.80,-28.80,0 +-28.80,4.80,9.14,0.00,1.00,153.60,-24.00,0 +153.60,-4.80,6.86,0.00,1.00,158.40,-19.20,0 +-19.20,4.80,9.16,0.00,1.00,163.20,-19.20,0 +163.20,-0.00,6.84,0.00,1.00,168.00,-14.40,0 +-9.60,0.00,9.19,0.00,1.00,168.00,-9.60,0 +172.80,-0.00,6.81,0.00,1.00,172.80,-4.80,0 +-0.00,0.00,9.21,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,6.79,0.00,1.00,-177.60,0.00,0 +4.80,-0.00,9.23,0.00,1.00,-172.80,4.80,0 +-168.00,0.00,6.77,0.00,1.00,-168.00,9.60,0 +14.40,-0.00,9.25,0.00,1.00,-168.00,14.40,0 +-158.40,4.80,6.75,0.00,1.00,-163.20,19.20,0 +24.00,-4.80,9.27,0.00,1.00,-158.40,19.20,0 +-148.80,4.80,6.73,0.00,1.00,-153.60,24.00,0 +33.60,-4.80,9.29,0.00,1.00,-148.80,28.80,0 +-139.20,4.80,6.71,0.00,1.00,-144.00,33.60,0 +43.20,-4.80,9.31,0.00,1.00,-139.20,33.60,0 +-129.60,4.80,6.69,0.00,1.00,-134.40,38.40,0 +52.80,-4.80,9.34,0.00,1.00,-129.60,43.20,0 +-120.00,4.80,6.66,0.00,1.00,-124.80,43.20,0 +62.40,-4.80,9.36,0.00,1.00,-120.00,48.00,0 +-110.40,9.60,6.64,0.00,1.00,-115.20,48.00,0 +72.00,-9.60,9.38,0.00,1.00,-110.40,48.00,0 +-100.80,9.60,6.62,0.00,1.00,-105.60,52.80,0 +81.60,-9.60,9.40,0.00,1.00,-96.00,52.80,0 +-91.20,9.60,6.60,0.00,1.00,-91.20,52.80,0 +96.00,-9.60,9.42,0.00,1.00,-86.40,52.80,0 +-81.60,9.60,6.58,0.00,1.00,-81.60,52.80,0 +105.60,-9.60,9.44,0.00,1.00,-72.00,52.80,0 +-72.00,9.60,6.56,0.00,1.00,-67.20,48.00,0 +115.20,-4.80,9.46,0.00,1.00,-62.40,48.00,0 +-62.40,4.80,6.54,0.00,1.00,-57.60,43.20,0 +124.80,-4.80,9.48,0.00,1.00,-52.80,43.20,0 +-52.80,4.80,6.52,0.00,1.00,-48.00,38.40,0 +134.40,-4.80,9.51,0.00,1.00,-43.20,38.40,0 +-43.20,4.80,6.49,0.00,1.00,-38.40,33.60,0 +144.00,-4.80,9.53,0.00,1.00,-33.60,28.80,0 +-33.60,4.80,6.47,0.00,1.00,-28.80,24.00,0 +153.60,-4.80,9.55,0.00,1.00,-24.00,24.00,0 +-24.00,4.80,6.45,0.00,1.00,-19.20,19.20,0 +163.20,-4.80,9.57,0.00,1.00,-14.40,14.40,0 +-14.40,0.00,6.43,0.00,1.00,-9.60,9.60,0 +172.80,-0.00,9.59,0.00,1.00,-9.60,9.60,0 +-4.80,0.00,6.41,0.00,1.00,-4.80,4.80,0 +0.00,0.00,9.61,0.00,1.00,0.00,0.00,0 +-177.60,0.00,6.39,0.00,1.00,4.80,-4.80,0 +9.60,-0.00,9.63,0.00,1.00,9.60,-9.60,0 +-168.00,4.80,6.37,0.00,1.00,14.40,-14.40,0 +19.20,-4.80,9.66,0.00,1.00,14.40,-14.40,0 +-158.40,4.80,6.34,0.00,1.00,19.20,-19.20,0 +28.80,-4.80,9.68,0.00,1.00,24.00,-24.00,0 +-148.80,4.80,6.32,0.00,1.00,28.80,-28.80,0 +38.40,-9.60,9.70,0.00,1.00,33.60,-33.60,0 +-139.20,9.60,6.30,0.00,1.00,38.40,-33.60,0 +48.00,-9.60,9.72,0.00,1.00,43.20,-38.40,0 +-129.60,9.60,6.28,0.00,1.00,48.00,-43.20,0 +57.60,-9.60,9.74,0.00,1.00,52.80,-43.20,0 +-120.00,9.60,6.26,0.00,1.00,57.60,-48.00,0 +67.20,-9.60,9.76,0.00,1.00,62.40,-52.80,0 +-110.40,9.60,6.24,0.00,1.00,67.20,-52.80,0 +76.80,-14.40,9.78,0.00,1.00,76.80,-57.60,0 +-100.80,14.40,6.22,0.00,1.00,81.60,-57.60,0 +86.40,-14.40,9.81,0.00,1.00,86.40,-57.60,0 +-86.40,14.40,6.19,0.00,1.00,91.20,-57.60,0 +96.00,-14.40,9.83,0.00,1.00,96.00,-57.60,0 +-76.80,14.40,6.17,0.00,1.00,100.80,-57.60,0 +105.60,-14.40,9.85,0.00,1.00,110.40,-52.80,0 +-67.20,9.60,6.15,0.00,1.00,115.20,-52.80,0 +115.20,-9.60,9.87,0.00,1.00,120.00,-48.00,0 +-57.60,9.60,6.13,0.00,1.00,124.80,-48.00,0 +124.80,-9.60,9.89,0.00,1.00,129.60,-43.20,0 +-48.00,9.60,6.11,0.00,1.00,134.40,-38.40,0 +134.40,-9.60,9.91,0.00,1.00,139.20,-38.40,0 +-38.40,9.60,6.09,0.00,1.00,144.00,-33.60,0 +144.00,-9.60,9.93,0.00,1.00,148.80,-28.80,0 +-28.80,4.80,6.07,0.00,1.00,153.60,-24.00,0 +153.60,-4.80,9.95,0.00,1.00,158.40,-24.00,0 +-19.20,4.80,6.05,0.00,1.00,163.20,-19.20,0 +163.20,-4.80,9.98,0.00,1.00,168.00,-14.40,0 +-9.60,4.80,6.02,0.00,1.00,168.00,-9.60,0 +172.80,-0.00,10.00,0.00,1.00,172.80,-4.80,0 +-0.00,0.00,6.00,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,10.02,0.00,1.00,-177.60,0.00,0 +4.80,-0.00,5.98,0.00,1.00,-172.80,4.80,0 +-168.00,4.80,10.04,0.00,1.00,-168.00,9.60,0 +14.40,-4.80,5.96,0.00,1.00,-168.00,14.40,0 +-158.40,4.80,10.06,0.00,1.00,-163.20,19.20,0 +24.00,-4.80,5.94,0.00,1.00,-158.40,24.00,0 +-148.80,4.80,10.08,0.00,1.00,-153.60,24.00,0 +33.60,-9.60,5.92,0.00,1.00,-148.80,28.80,0 +-139.20,9.60,10.10,0.00,1.00,-144.00,33.60,0 +43.20,-9.60,5.90,0.00,1.00,-139.20,38.40,0 +-129.60,9.60,10.13,0.00,1.00,-134.40,38.40,0 +52.80,-9.60,5.87,0.00,1.00,-129.60,43.20,0 +-120.00,9.60,10.15,0.00,1.00,-124.80,48.00,0 +62.40,-9.60,5.85,0.00,1.00,-120.00,48.00,0 +-110.40,9.60,10.17,0.00,1.00,-115.20,52.80,0 +72.00,-14.40,5.83,0.00,1.00,-110.40,52.80,0 +-100.80,14.40,10.19,0.00,1.00,-100.80,57.60,0 +81.60,-14.40,5.81,0.00,1.00,-96.00,57.60,0 +-91.20,14.40,10.21,0.00,1.00,-91.20,57.60,0 +96.00,-14.40,5.79,0.00,1.00,-86.40,57.60,0 +-81.60,14.40,10.23,0.00,1.00,-81.60,57.60,0 +105.60,-14.40,5.77,0.00,1.00,-76.80,57.60,0 +-72.00,9.60,10.25,0.00,1.00,-67.20,52.80,0 +115.20,-9.60,5.75,0.00,1.00,-62.40,52.80,0 +-62.40,9.60,10.28,0.00,1.00,-57.60,48.00,0 +124.80,-9.60,5.72,0.00,1.00,-52.80,43.20,0 +-52.80,9.60,10.30,0.00,1.00,-48.00,43.20,0 +134.40,-9.60,5.70,0.00,1.00,-43.20,38.40,0 +-43.20,9.60,10.32,0.00,1.00,-38.40,33.60,0 +144.00,-9.60,5.68,0.00,1.00,-33.60,33.60,0 +-33.60,4.80,10.34,0.00,1.00,-28.80,28.80,0 +153.60,-4.80,5.66,0.00,1.00,-24.00,24.00,0 +-24.00,4.80,10.36,0.00,1.00,-19.20,19.20,0 +163.20,-4.80,5.64,0.00,1.00,-14.40,14.40,0 +-14.40,4.80,10.38,0.00,1.00,-14.40,14.40,0 +172.80,-0.00,5.62,0.00,1.00,-9.60,9.60,0 +-4.80,0.00,10.40,0.00,1.00,-4.80,4.80,0 +0.00,0.00,5.60,0.00,1.00,0.00,0.00,0 +-177.60,0.00,10.42,0.00,1.00,4.80,-4.80,0 +9.60,-4.80,5.58,0.00,1.00,9.60,-9.60,0 +-168.00,4.80,10.45,0.00,1.00,14.40,-14.40,0 +19.20,-4.80,5.55,0.00,1.00,19.20,-19.20,0 +-158.40,4.80,10.47,0.00,1.00,19.20,-19.20,0 +28.80,-9.60,5.53,0.00,1.00,24.00,-24.00,0 +-148.80,9.60,10.49,0.00,1.00,28.80,-28.80,0 +38.40,-9.60,5.51,0.00,1.00,33.60,-33.60,0 +-139.20,9.60,10.51,0.00,1.00,38.40,-38.40,0 +48.00,-14.40,5.49,0.00,1.00,43.20,-43.20,0 +-129.60,14.40,10.53,0.00,1.00,48.00,-43.20,0 +57.60,-14.40,5.47,0.00,1.00,52.80,-48.00,0 +-120.00,14.40,10.55,0.00,1.00,57.60,-52.80,0 +67.20,-14.40,5.45,0.00,1.00,62.40,-52.80,0 +-110.40,14.40,10.57,0.00,1.00,72.00,-57.60,0 +76.80,-19.20,5.43,0.00,1.00,76.80,-57.60,0 +-100.80,19.20,10.60,0.00,1.00,81.60,-62.40,0 +86.40,-19.20,5.40,0.00,1.00,86.40,-62.40,0 +-86.40,19.20,10.62,0.00,1.00,91.20,-62.40,0 +96.00,-19.20,5.38,0.00,1.00,96.00,-62.40,0 +-76.80,19.20,10.64,0.00,1.00,100.80,-62.40,0 +105.60,-14.40,5.36,0.00,1.00,105.60,-57.60,0 +-67.20,14.40,10.66,0.00,1.00,110.40,-57.60,0 +115.20,-14.40,5.34,0.00,1.00,120.00,-52.80,0 +-57.60,14.40,10.68,0.00,1.00,124.80,-48.00,0 +124.80,-14.40,5.32,0.00,1.00,129.60,-48.00,0 +-48.00,14.40,10.70,0.00,1.00,134.40,-43.20,0 +134.40,-14.40,5.30,0.00,1.00,139.20,-38.40,0 +-38.40,9.60,10.72,0.00,1.00,144.00,-33.60,0 +144.00,-9.60,5.28,0.00,1.00,148.80,-33.60,0 +-28.80,9.60,10.74,0.00,1.00,153.60,-28.80,0 +153.60,-9.60,5.26,0.00,1.00,158.40,-24.00,0 +-19.20,4.80,10.77,0.00,1.00,158.40,-19.20,0 +163.20,-4.80,5.23,0.00,1.00,163.20,-14.40,0 +-9.60,4.80,10.79,0.00,1.00,168.00,-9.60,0 +172.80,-0.00,5.21,0.00,1.00,172.80,-4.80,0 +-0.00,0.00,10.81,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,5.19,0.00,1.00,-177.60,0.00,0 +4.80,-0.00,10.83,0.00,1.00,-172.80,4.80,0 +-168.00,4.80,5.17,0.00,1.00,-168.00,9.60,0 +14.40,-4.80,10.85,0.00,1.00,-163.20,14.40,0 +-158.40,4.80,5.15,0.00,1.00,-158.40,19.20,0 +24.00,-9.60,10.87,0.00,1.00,-158.40,24.00,0 +-148.80,9.60,5.13,0.00,1.00,-153.60,28.80,0 +33.60,-9.60,10.89,0.00,1.00,-148.80,33.60,0 +-139.20,9.60,5.11,0.00,1.00,-144.00,33.60,0 +43.20,-14.40,10.92,0.00,1.00,-139.20,38.40,0 +-129.60,14.40,5.08,0.00,1.00,-134.40,43.20,0 +52.80,-14.40,10.94,0.00,1.00,-129.60,48.00,0 +-120.00,14.40,5.06,0.00,1.00,-124.80,48.00,0 +62.40,-14.40,10.96,0.00,1.00,-120.00,52.80,0 +-110.40,14.40,5.04,0.00,1.00,-110.40,57.60,0 +72.00,-14.40,10.98,0.00,1.00,-105.60,57.60,0 +-100.80,19.20,5.02,0.00,1.00,-100.80,62.40,0 +81.60,-19.20,11.00,0.00,1.00,-96.00,62.40,0 +-91.20,19.20,5.00,0.00,1.00,-91.20,62.40,0 +96.00,-19.20,11.02,0.00,1.00,-86.40,62.40,0 +-81.60,19.20,4.98,0.00,1.00,-81.60,62.40,0 +105.60,-19.20,11.04,0.00,1.00,-76.80,57.60,0 +-72.00,14.40,4.96,0.00,1.00,-72.00,57.60,0 +115.20,-14.40,11.07,0.00,1.00,-62.40,52.80,0 +-62.40,14.40,4.93,0.00,1.00,-57.60,52.80,0 +124.80,-14.40,11.09,0.00,1.00,-52.80,48.00,0 +-52.80,14.40,4.91,0.00,1.00,-48.00,43.20,0 +134.40,-14.40,11.11,0.00,1.00,-43.20,43.20,0 +-43.20,9.60,4.89,0.00,1.00,-38.40,38.40,0 +144.00,-9.60,11.13,0.00,1.00,-33.60,33.60,0 +-33.60,9.60,4.87,0.00,1.00,-28.80,28.80,0 +153.60,-9.60,11.15,0.00,1.00,-24.00,24.00,0 +-24.00,4.80,4.85,0.00,1.00,-19.20,19.20,0 +163.20,-4.80,11.17,0.00,1.00,-19.20,19.20,0 +-14.40,4.80,4.83,0.00,1.00,-14.40,14.40,0 +172.80,-4.80,11.19,0.00,1.00,-9.60,9.60,0 +-4.80,0.00,4.81,0.00,1.00,-4.80,4.80,0 +0.00,0.00,11.21,0.00,1.00,0.00,0.00,0 +-177.60,0.00,4.79,0.00,1.00,4.80,-4.80,0 +9.60,-4.80,11.24,0.00,1.00,9.60,-9.60,0 +-168.00,4.80,4.76,0.00,1.00,14.40,-14.40,0 +19.20,-4.80,11.26,0.00,1.00,19.20,-19.20,0 +-158.40,9.60,4.74,0.00,1.00,24.00,-24.00,0 +28.80,-9.60,11.28,0.00,1.00,28.80,-24.00,0 +-148.80,14.40,4.72,0.00,1.00,33.60,-28.80,0 +38.40,-14.40,11.30,0.00,1.00,38.40,-33.60,0 +-139.20,14.40,4.70,0.00,1.00,43.20,-38.40,0 +48.00,-14.40,11.32,0.00,1.00,48.00,-43.20,0 +-129.60,19.20,4.68,0.00,1.00,52.80,-48.00,0 +57.60,-19.20,11.34,0.00,1.00,57.60,-52.80,0 +-120.00,19.20,4.66,0.00,1.00,62.40,-52.80,0 +67.20,-19.20,11.36,0.00,1.00,67.20,-57.60,0 +-110.40,19.20,4.64,0.00,1.00,72.00,-62.40,0 +76.80,-19.20,11.39,0.00,1.00,76.80,-62.40,0 +-100.80,24.00,4.61,0.00,1.00,81.60,-67.20,0 +86.40,-24.00,11.41,0.00,1.00,86.40,-67.20,0 +-86.40,24.00,4.59,0.00,1.00,91.20,-67.20,0 +96.00,-24.00,11.43,0.00,1.00,96.00,-67.20,0 +-76.80,24.00,4.57,0.00,1.00,100.80,-67.20,0 +105.60,-19.20,11.45,0.00,1.00,105.60,-62.40,0 +-67.20,19.20,4.55,0.00,1.00,110.40,-57.60,0 +115.20,-19.20,11.47,0.00,1.00,115.20,-57.60,0 +-57.60,19.20,4.53,0.00,1.00,120.00,-52.80,0 +124.80,-19.20,11.49,0.00,1.00,124.80,-48.00,0 +-48.00,19.20,4.51,0.00,1.00,129.60,-43.20,0 +134.40,-14.40,11.51,0.00,1.00,134.40,-43.20,0 +-38.40,14.40,4.49,0.00,1.00,139.20,-38.40,0 +144.00,-14.40,11.54,0.00,1.00,144.00,-33.60,0 +-28.80,9.60,4.46,0.00,1.00,148.80,-28.80,0 +153.60,-9.60,11.56,0.00,1.00,153.60,-24.00,0 +-19.20,9.60,4.44,0.00,1.00,158.40,-19.20,0 +163.20,-4.80,11.58,0.00,1.00,163.20,-14.40,0 +-9.60,4.80,4.42,0.00,1.00,168.00,-9.60,0 +172.80,-4.80,11.60,0.00,1.00,172.80,-4.80,0 +-0.00,0.00,4.40,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,11.62,0.00,1.00,-177.60,0.00,0 +4.80,-4.80,4.38,0.00,1.00,-172.80,4.80,0 +-168.00,4.80,11.64,0.00,1.00,-168.00,9.60,0 +14.40,-4.80,4.36,0.00,1.00,-163.20,14.40,0 +-158.40,9.60,11.66,0.00,1.00,-158.40,19.20,0 +24.00,-9.60,4.34,0.00,1.00,-153.60,24.00,0 +-148.80,9.60,11.68,0.00,1.00,-148.80,28.80,0 +33.60,-14.40,4.32,0.00,1.00,-144.00,33.60,0 +-139.20,14.40,11.71,0.00,1.00,-139.20,38.40,0 +43.20,-14.40,4.29,0.00,1.00,-134.40,43.20,0 +-129.60,19.20,11.73,0.00,1.00,-129.60,43.20,0 +52.80,-19.20,4.27,0.00,1.00,-124.80,48.00,0 +-120.00,19.20,11.75,0.00,1.00,-120.00,52.80,0 +62.40,-19.20,4.25,0.00,1.00,-115.20,57.60,0 +-110.40,19.20,11.77,0.00,1.00,-110.40,57.60,0 +72.00,-19.20,4.23,0.00,1.00,-105.60,62.40,0 +-100.80,24.00,11.79,0.00,1.00,-100.80,67.20,0 +81.60,-24.00,4.21,0.00,1.00,-96.00,67.20,0 +-91.20,24.00,11.81,0.00,1.00,-91.20,67.20,0 +96.00,-24.00,4.19,0.00,1.00,-86.40,67.20,0 +-81.60,24.00,11.83,0.00,1.00,-81.60,67.20,0 +105.60,-19.20,4.17,0.00,1.00,-76.80,62.40,0 +-72.00,19.20,11.86,0.00,1.00,-72.00,62.40,0 +115.20,-19.20,4.14,0.00,1.00,-67.20,57.60,0 +-62.40,19.20,11.88,0.00,1.00,-62.40,52.80,0 +124.80,-19.20,4.12,0.00,1.00,-57.60,52.80,0 +-52.80,19.20,11.90,0.00,1.00,-52.80,48.00,0 +134.40,-14.40,4.10,0.00,1.00,-48.00,43.20,0 +-43.20,14.40,11.92,0.00,1.00,-43.20,38.40,0 +144.00,-14.40,4.08,0.00,1.00,-38.40,33.60,0 +-33.60,14.40,11.94,0.00,1.00,-33.60,28.80,0 +153.60,-9.60,4.06,0.00,1.00,-28.80,24.00,0 +-24.00,9.60,11.96,0.00,1.00,-24.00,24.00,0 +163.20,-4.80,4.04,0.00,1.00,-19.20,19.20,0 +-14.40,4.80,11.98,0.00,1.00,-14.40,14.40,0 +172.80,-4.80,4.02,0.00,1.00,-9.60,9.60,0 +-4.80,0.00,12.01,0.00,1.00,-4.80,4.80,0 +0.00,0.00,3.99,0.00,1.00,0.00,0.00,0 +-177.60,0.00,12.03,0.00,1.00,4.80,-4.80,0 +9.60,-4.80,3.97,0.00,1.00,9.60,-9.60,0 +-168.00,4.80,12.05,0.00,1.00,14.40,-14.40,0 +19.20,-9.60,3.95,0.00,1.00,19.20,-19.20,0 +-158.40,9.60,12.07,0.00,1.00,24.00,-24.00,0 +24.00,-14.40,3.93,0.00,1.00,28.80,-28.80,0 +-148.80,14.40,12.09,0.00,1.00,33.60,-33.60,0 +33.60,-14.40,3.91,0.00,1.00,38.40,-38.40,0 +-139.20,19.20,12.11,0.00,1.00,43.20,-38.40,0 +43.20,-19.20,3.89,0.00,1.00,48.00,-43.20,0 +-129.60,19.20,12.13,0.00,1.00,52.80,-48.00,0 +52.80,-24.00,3.87,0.00,1.00,57.60,-52.80,0 +-120.00,24.00,12.15,0.00,1.00,62.40,-57.60,0 +62.40,-24.00,3.85,0.00,1.00,67.20,-62.40,0 +-110.40,24.00,12.18,0.00,1.00,72.00,-62.40,0 +76.80,-24.00,3.82,0.00,1.00,76.80,-67.20,0 +-100.80,28.80,12.20,0.00,1.00,81.60,-72.00,0 +86.40,-28.80,3.80,0.00,1.00,86.40,-72.00,0 +-86.40,28.80,12.22,0.00,1.00,91.20,-72.00,0 +96.00,-28.80,3.78,0.00,1.00,96.00,-72.00,0 +-76.80,28.80,12.24,0.00,1.00,100.80,-67.20,0 +105.60,-24.00,3.76,0.00,1.00,105.60,-67.20,0 +-67.20,24.00,12.26,0.00,1.00,110.40,-62.40,0 +120.00,-24.00,3.74,0.00,1.00,115.20,-57.60,0 +-57.60,24.00,12.28,0.00,1.00,120.00,-57.60,0 +129.60,-24.00,3.72,0.00,1.00,124.80,-52.80,0 +-48.00,19.20,12.30,0.00,1.00,129.60,-48.00,0 +139.20,-19.20,3.70,0.00,1.00,134.40,-43.20,0 +-38.40,19.20,12.33,0.00,1.00,139.20,-38.40,0 +148.80,-14.40,3.67,0.00,1.00,144.00,-33.60,0 +-28.80,14.40,12.35,0.00,1.00,148.80,-28.80,0 +158.40,-9.60,3.65,0.00,1.00,153.60,-24.00,0 +-19.20,9.60,12.37,0.00,1.00,158.40,-19.20,0 +163.20,-9.60,3.63,0.00,1.00,163.20,-14.40,0 +-9.60,4.80,12.39,0.00,1.00,168.00,-9.60,0 +172.80,-4.80,3.61,0.00,1.00,172.80,-4.80,0 +-0.00,0.00,12.41,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,3.59,0.00,1.00,-177.60,0.00,0 +4.80,-4.80,12.43,0.00,1.00,-172.80,4.80,0 +-168.00,4.80,3.57,0.00,1.00,-168.00,9.60,0 +14.40,-9.60,12.45,0.00,1.00,-163.20,14.40,0 +-158.40,9.60,3.55,0.00,1.00,-158.40,19.20,0 +24.00,-9.60,12.48,0.00,1.00,-153.60,24.00,0 +-153.60,14.40,3.52,0.00,1.00,-148.80,28.80,0 +33.60,-14.40,12.50,0.00,1.00,-144.00,33.60,0 +-144.00,19.20,3.50,0.00,1.00,-139.20,38.40,0 +43.20,-19.20,12.52,0.00,1.00,-134.40,43.20,0 +-134.40,19.20,3.48,0.00,1.00,-129.60,48.00,0 +52.80,-24.00,12.54,0.00,1.00,-124.80,52.80,0 +-124.80,24.00,3.46,0.00,1.00,-120.00,57.60,0 +62.40,-24.00,12.56,0.00,1.00,-115.20,57.60,0 +-110.40,24.00,3.44,0.00,1.00,-110.40,62.40,0 +72.00,-24.00,12.58,0.00,1.00,-105.60,67.20,0 +-100.80,28.80,3.42,0.00,1.00,-100.80,67.20,0 +81.60,-28.80,12.60,0.00,1.00,-96.00,72.00,0 +-91.20,28.80,3.40,0.00,1.00,-91.20,72.00,0 +96.00,-28.80,12.62,0.00,1.00,-86.40,72.00,0 +-81.60,28.80,3.38,0.00,1.00,-81.60,72.00,0 +105.60,-24.00,12.65,0.00,1.00,-76.80,67.20,0 +-72.00,24.00,3.35,0.00,1.00,-72.00,62.40,0 +115.20,-24.00,12.67,0.00,1.00,-67.20,62.40,0 +-57.60,24.00,3.33,0.00,1.00,-62.40,57.60,0 +124.80,-24.00,12.69,0.00,1.00,-57.60,52.80,0 +-48.00,19.20,3.31,0.00,1.00,-52.80,48.00,0 +134.40,-19.20,12.71,0.00,1.00,-48.00,43.20,0 +-38.40,19.20,3.29,0.00,1.00,-43.20,38.40,0 +144.00,-14.40,12.73,0.00,1.00,-38.40,38.40,0 +-28.80,14.40,3.27,0.00,1.00,-33.60,33.60,0 +153.60,-14.40,12.75,0.00,1.00,-28.80,28.80,0 +-24.00,9.60,3.25,0.00,1.00,-24.00,24.00,0 +163.20,-9.60,12.77,0.00,1.00,-19.20,19.20,0 +-14.40,4.80,3.23,0.00,1.00,-14.40,14.40,0 +172.80,-4.80,12.80,0.00,1.00,-9.60,9.60,0 +-4.80,0.00,3.20,0.00,1.00,-4.80,4.80,0 +0.00,0.00,12.82,0.00,1.00,0.00,0.00,0 +-177.60,4.80,3.18,0.00,1.00,4.80,-4.80,0 +9.60,-4.80,12.84,0.00,1.00,9.60,-9.60,0 +-168.00,9.60,3.16,0.00,1.00,14.40,-14.40,0 +14.40,-9.60,12.86,0.00,1.00,19.20,-19.20,0 +-158.40,14.40,3.14,0.00,1.00,24.00,-24.00,0 +24.00,-14.40,12.88,0.00,1.00,28.80,-28.80,0 +-148.80,19.20,3.12,0.00,1.00,33.60,-33.60,0 +33.60,-19.20,12.90,0.00,1.00,38.40,-38.40,0 +-139.20,19.20,3.10,0.00,1.00,43.20,-43.20,0 +43.20,-24.00,12.92,0.00,1.00,48.00,-48.00,0 +-129.60,24.00,3.08,0.00,1.00,52.80,-52.80,0 +52.80,-28.80,12.95,0.00,1.00,57.60,-57.60,0 +-120.00,28.80,3.05,0.00,1.00,62.40,-57.60,0 +62.40,-28.80,12.97,0.00,1.00,67.20,-62.40,0 +-110.40,28.80,3.03,0.00,1.00,72.00,-67.20,0 +76.80,-28.80,12.99,0.00,1.00,76.80,-72.00,0 +-100.80,33.60,3.01,0.00,1.00,81.60,-72.00,0 +86.40,-33.60,13.01,0.00,1.00,86.40,-76.80,0 +-86.40,33.60,2.99,0.00,1.00,91.20,-76.80,0 +96.00,-33.60,13.03,0.00,1.00,96.00,-76.80,0 +-76.80,28.80,2.97,0.00,1.00,100.80,-72.00,0 +110.40,-28.80,13.05,0.00,1.00,105.60,-72.00,0 +-67.20,28.80,2.95,0.00,1.00,110.40,-67.20,0 +120.00,-28.80,13.07,0.00,1.00,115.20,-62.40,0 +-57.60,28.80,2.93,0.00,1.00,120.00,-57.60,0 +129.60,-24.00,13.09,0.00,1.00,124.80,-52.80,0 +-48.00,24.00,2.91,0.00,1.00,129.60,-48.00,0 +139.20,-24.00,13.12,0.00,1.00,134.40,-43.20,0 +-38.40,19.20,2.88,0.00,1.00,139.20,-38.40,0 +148.80,-19.20,13.14,0.00,1.00,144.00,-33.60,0 +-28.80,14.40,2.86,0.00,1.00,148.80,-28.80,0 +158.40,-14.40,13.16,0.00,1.00,153.60,-24.00,0 +-19.20,9.60,2.84,0.00,1.00,158.40,-19.20,0 +168.00,-9.60,13.18,0.00,1.00,163.20,-14.40,0 +-9.60,4.80,2.82,0.00,1.00,168.00,-9.60,0 +172.80,-4.80,13.20,0.00,1.00,172.80,-4.80,0 +-0.00,0.00,2.80,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,13.22,0.00,1.00,-177.60,0.00,0 +4.80,-4.80,2.78,0.00,1.00,-172.80,4.80,0 +-168.00,4.80,13.24,0.00,1.00,-168.00,9.60,0 +14.40,-9.60,2.76,0.00,1.00,-163.20,14.40,0 +-163.20,9.60,13.27,0.00,1.00,-158.40,19.20,0 +24.00,-14.40,2.73,0.00,1.00,-153.60,24.00,0 +-153.60,14.40,13.29,0.00,1.00,-148.80,28.80,0 +33.60,-19.20,2.71,0.00,1.00,-144.00,33.60,0 +-144.00,19.20,13.31,0.00,1.00,-139.20,38.40,0 +43.20,-24.00,2.69,0.00,1.00,-134.40,43.20,0 +-134.40,24.00,13.33,0.00,1.00,-129.60,48.00,0 +52.80,-24.00,2.67,0.00,1.00,-124.80,52.80,0 +-124.80,28.80,13.35,0.00,1.00,-120.00,57.60,0 +62.40,-28.80,2.65,0.00,1.00,-115.20,62.40,0 +-115.20,28.80,13.37,0.00,1.00,-110.40,67.20,0 +72.00,-28.80,2.63,0.00,1.00,-105.60,72.00,0 +-100.80,28.80,13.39,0.00,1.00,-100.80,72.00,0 +81.60,-33.60,2.61,0.00,1.00,-96.00,76.80,0 +-91.20,33.60,13.42,0.00,1.00,-91.20,76.80,0 +96.00,-33.60,2.58,0.00,1.00,-86.40,76.80,0 +-81.60,33.60,13.44,0.00,1.00,-81.60,72.00,0 +105.60,-28.80,2.56,0.00,1.00,-76.80,72.00,0 +-67.20,28.80,13.46,0.00,1.00,-72.00,67.20,0 +115.20,-28.80,2.54,0.00,1.00,-67.20,62.40,0 +-57.60,28.80,13.48,0.00,1.00,-62.40,57.60,0 +124.80,-28.80,2.52,0.00,1.00,-57.60,57.60,0 +-48.00,24.00,13.50,0.00,1.00,-52.80,52.80,0 +134.40,-24.00,2.50,0.00,1.00,-48.00,48.00,0 +-38.40,19.20,13.52,0.00,1.00,-43.20,43.20,0 +144.00,-19.20,2.48,0.00,1.00,-38.40,38.40,0 +-28.80,19.20,13.54,0.00,1.00,-33.60,33.60,0 +153.60,-14.40,2.46,0.00,1.00,-28.80,28.80,0 +-19.20,14.40,13.56,0.00,1.00,-24.00,24.00,0 +163.20,-9.60,2.44,0.00,1.00,-19.20,19.20,0 +-14.40,9.60,13.59,0.00,1.00,-14.40,14.40,0 +172.80,-4.80,2.41,0.00,1.00,-9.60,9.60,0 +-4.80,4.80,13.61,0.00,1.00,-4.80,4.80,0 +0.00,0.00,2.39,0.00,1.00,0.00,0.00,0 +-177.60,4.80,13.63,0.00,1.00,4.80,-4.80,0 +9.60,-4.80,2.37,0.00,1.00,9.60,-9.60,0 +-168.00,9.60,13.65,0.00,1.00,14.40,-14.40,0 +14.40,-9.60,2.35,0.00,1.00,19.20,-19.20,0 +-158.40,14.40,13.67,0.00,1.00,24.00,-24.00,0 +24.00,-14.40,2.33,0.00,1.00,28.80,-28.80,0 +-153.60,19.20,13.69,0.00,1.00,33.60,-33.60,0 +33.60,-24.00,2.31,0.00,1.00,38.40,-38.40,0 +-144.00,24.00,13.71,0.00,1.00,43.20,-43.20,0 +43.20,-24.00,2.29,0.00,1.00,48.00,-48.00,0 +-134.40,28.80,13.74,0.00,1.00,52.80,-52.80,0 +52.80,-28.80,2.26,0.00,1.00,57.60,-57.60,0 +-124.80,33.60,13.76,0.00,1.00,62.40,-62.40,0 +62.40,-33.60,2.24,0.00,1.00,67.20,-67.20,0 +-110.40,33.60,13.78,0.00,1.00,72.00,-72.00,0 +72.00,-33.60,2.22,0.00,1.00,76.80,-72.00,0 +-100.80,38.40,13.80,0.00,1.00,81.60,-76.80,0 +86.40,-38.40,2.20,0.00,1.00,86.40,-81.60,0 +-86.40,38.40,13.82,0.00,1.00,91.20,-81.60,0 +96.00,-38.40,2.18,0.00,1.00,96.00,-81.60,0 +-76.80,33.60,13.84,0.00,1.00,100.80,-76.80,0 +110.40,-33.60,2.16,0.00,1.00,105.60,-72.00,0 +-67.20,33.60,13.86,0.00,1.00,110.40,-67.20,0 +120.00,-33.60,2.14,0.00,1.00,115.20,-62.40,0 +-52.80,28.80,13.89,0.00,1.00,120.00,-57.60,0 +129.60,-28.80,2.11,0.00,1.00,124.80,-52.80,0 +-43.20,28.80,13.91,0.00,1.00,129.60,-48.00,0 +139.20,-24.00,2.09,0.00,1.00,134.40,-43.20,0 +-33.60,24.00,13.93,0.00,1.00,139.20,-38.40,0 +148.80,-19.20,2.07,0.00,1.00,144.00,-33.60,0 +-24.00,19.20,13.95,0.00,1.00,148.80,-28.80,0 +158.40,-14.40,2.05,0.00,1.00,153.60,-24.00,0 +-19.20,14.40,13.97,0.00,1.00,158.40,-19.20,0 +168.00,-9.60,2.03,0.00,1.00,163.20,-14.40,0 +-9.60,4.80,13.99,0.00,1.00,168.00,-9.60,0 +172.80,-4.80,2.01,0.00,1.00,172.80,-4.80,0 +-0.00,0.00,14.01,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,1.99,0.00,1.00,-177.60,0.00,0 +4.80,-4.80,14.03,0.00,1.00,-172.80,4.80,0 +-168.00,4.80,1.97,0.00,1.00,-168.00,9.60,0 +14.40,-9.60,14.06,0.00,1.00,-163.20,14.40,0 +-163.20,14.40,1.94,0.00,1.00,-158.40,19.20,0 +24.00,-14.40,14.08,0.00,1.00,-153.60,24.00,0 +-153.60,19.20,1.92,0.00,1.00,-148.80,28.80,0 +28.80,-19.20,14.10,0.00,1.00,-144.00,33.60,0 +-144.00,24.00,1.90,0.00,1.00,-139.20,38.40,0 +38.40,-24.00,14.12,0.00,1.00,-134.40,43.20,0 +-134.40,28.80,1.88,0.00,1.00,-129.60,48.00,0 +48.00,-28.80,14.14,0.00,1.00,-124.80,52.80,0 +-124.80,28.80,1.86,0.00,1.00,-120.00,57.60,0 +57.60,-33.60,14.16,0.00,1.00,-115.20,62.40,0 +-115.20,33.60,1.84,0.00,1.00,-110.40,67.20,0 +72.00,-33.60,14.18,0.00,1.00,-105.60,72.00,0 +-105.60,33.60,1.82,0.00,1.00,-100.80,76.80,0 +81.60,-38.40,14.21,0.00,1.00,-96.00,81.60,0 +-91.20,38.40,1.79,0.00,1.00,-91.20,81.60,0 +96.00,-38.40,14.23,0.00,1.00,-86.40,81.60,0 +-81.60,38.40,1.77,0.00,1.00,-81.60,76.80,0 +105.60,-33.60,14.25,0.00,1.00,-76.80,72.00,0 +-67.20,33.60,1.75,0.00,1.00,-72.00,72.00,0 +120.00,-33.60,14.27,0.00,1.00,-67.20,67.20,0 +-57.60,33.60,1.73,0.00,1.00,-62.40,62.40,0 +129.60,-28.80,14.29,0.00,1.00,-57.60,57.60,0 +-48.00,28.80,1.71,0.00,1.00,-52.80,52.80,0 +139.20,-24.00,14.31,0.00,1.00,-48.00,48.00,0 +-38.40,24.00,1.69,0.00,1.00,-43.20,43.20,0 +148.80,-24.00,14.33,0.00,1.00,-38.40,38.40,0 +-28.80,19.20,1.67,0.00,1.00,-33.60,33.60,0 +158.40,-14.40,14.36,0.00,1.00,-28.80,28.80,0 +-19.20,14.40,1.64,0.00,1.00,-24.00,24.00,0 +163.20,-9.60,14.38,0.00,1.00,-19.20,19.20,0 +-9.60,9.60,1.62,0.00,1.00,-14.40,14.40,0 +172.80,-4.80,14.40,0.00,1.00,-9.60,9.60,0 +-4.80,4.80,1.60,0.00,1.00,-4.80,4.80,0 +0.00,0.00,14.42,0.00,1.00,0.00,0.00,0 +-177.60,4.80,1.58,0.00,1.00,4.80,-4.80,0 +9.60,-4.80,14.44,0.00,1.00,9.60,-9.60,0 +-168.00,9.60,1.56,0.00,1.00,14.40,-14.40,0 +14.40,-14.40,14.46,0.00,1.00,19.20,-19.20,0 +-163.20,14.40,1.54,0.00,1.00,24.00,-24.00,0 +24.00,-19.20,14.48,0.00,1.00,28.80,-28.80,0 +-153.60,19.20,1.52,0.00,1.00,33.60,-33.60,0 +28.80,-24.00,14.50,0.00,1.00,38.40,-38.40,0 +-144.00,28.80,1.50,0.00,1.00,43.20,-43.20,0 +38.40,-28.80,14.53,0.00,1.00,48.00,-48.00,0 +-134.40,33.60,1.47,0.00,1.00,52.80,-52.80,0 +48.00,-33.60,14.55,0.00,1.00,57.60,-57.60,0 +-124.80,33.60,1.45,0.00,1.00,62.40,-62.40,0 +62.40,-38.40,14.57,0.00,1.00,67.20,-67.20,0 +-115.20,38.40,1.43,0.00,1.00,72.00,-72.00,0 +72.00,-38.40,14.59,0.00,1.00,76.80,-76.80,0 +-100.80,43.20,1.41,0.00,1.00,81.60,-81.60,0 +86.40,-43.20,14.61,0.00,1.00,86.40,-86.40,0 +-86.40,43.20,1.39,0.00,1.00,91.20,-86.40,0 +96.00,-43.20,14.63,0.00,1.00,96.00,-81.60,0 +-76.80,38.40,1.37,0.00,1.00,100.80,-76.80,0 +110.40,-38.40,14.65,0.00,1.00,105.60,-72.00,0 +-62.40,38.40,1.35,0.00,1.00,110.40,-67.20,0 +120.00,-38.40,14.68,0.00,1.00,115.20,-62.40,0 +-52.80,33.60,1.32,0.00,1.00,120.00,-57.60,0 +134.40,-33.60,14.70,0.00,1.00,124.80,-52.80,0 +-43.20,28.80,1.30,0.00,1.00,129.60,-48.00,0 +144.00,-28.80,14.72,0.00,1.00,134.40,-43.20,0 +-33.60,24.00,1.28,0.00,1.00,139.20,-38.40,0 +153.60,-24.00,14.74,0.00,1.00,144.00,-33.60,0 +-24.00,19.20,1.26,0.00,1.00,148.80,-28.80,0 +158.40,-19.20,14.76,0.00,1.00,153.60,-24.00,0 +-14.40,14.40,1.24,0.00,1.00,158.40,-19.20,0 +168.00,-9.60,14.78,0.00,1.00,163.20,-14.40,0 +-9.60,9.60,1.22,0.00,1.00,168.00,-9.60,0 +172.80,-4.80,14.80,0.00,1.00,172.80,-4.80,0 +-0.00,0.00,1.20,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,14.83,0.00,1.00,-177.60,0.00,0 +4.80,-4.80,1.17,0.00,1.00,-172.80,4.80,0 +-172.80,9.60,14.85,0.00,1.00,-168.00,9.60,0 +14.40,-9.60,1.15,0.00,1.00,-163.20,14.40,0 +-163.20,14.40,14.87,0.00,1.00,-158.40,19.20,0 +19.20,-19.20,1.13,0.00,1.00,-153.60,24.00,0 +-153.60,19.20,14.89,0.00,1.00,-148.80,28.80,0 +28.80,-24.00,1.11,0.00,1.00,-144.00,33.60,0 +-148.80,24.00,14.91,0.00,1.00,-139.20,38.40,0 +38.40,-28.80,1.09,0.00,1.00,-134.40,43.20,0 +-139.20,28.80,14.93,0.00,1.00,-129.60,48.00,0 +48.00,-33.60,1.07,0.00,1.00,-124.80,52.80,0 +-129.60,33.60,14.95,0.00,1.00,-120.00,57.60,0 +57.60,-38.40,1.05,0.00,1.00,-115.20,62.40,0 +-115.20,38.40,14.97,0.00,1.00,-110.40,67.20,0 +67.20,-38.40,1.03,0.00,1.00,-105.60,72.00,0 +-105.60,38.40,15.00,0.00,1.00,-100.80,76.80,0 +81.60,-43.20,1.00,0.00,1.00,-96.00,81.60,0 +-91.20,43.20,15.02,0.00,1.00,-91.20,86.40,0 +96.00,-43.20,0.98,0.00,1.00,-86.40,86.40,0 +-76.80,43.20,15.04,0.00,1.00,-81.60,81.60,0 +105.60,-38.40,0.96,0.00,1.00,-76.80,76.80,0 +-67.20,38.40,15.06,0.00,1.00,-72.00,72.00,0 +120.00,-38.40,0.94,0.00,1.00,-67.20,67.20,0 +-52.80,33.60,15.08,0.00,1.00,-62.40,62.40,0 +129.60,-33.60,0.92,0.00,1.00,-57.60,57.60,0 +-43.20,33.60,15.10,0.00,1.00,-52.80,52.80,0 +139.20,-28.80,0.90,0.00,1.00,-48.00,48.00,0 +-33.60,28.80,15.12,0.00,1.00,-43.20,43.20,0 +148.80,-24.00,0.88,0.00,1.00,-38.40,38.40,0 +-28.80,19.20,15.15,0.00,1.00,-33.60,33.60,0 +158.40,-19.20,0.85,0.00,1.00,-28.80,28.80,0 +-19.20,14.40,15.17,0.00,1.00,-24.00,24.00,0 +163.20,-14.40,0.83,0.00,1.00,-19.20,19.20,0 +-9.60,9.60,15.19,0.00,1.00,-14.40,14.40,0 +172.80,-4.80,0.81,0.00,1.00,-9.60,9.60,0 +-4.80,4.80,15.21,0.00,1.00,-4.80,4.80,0 +0.00,0.00,0.79,0.00,1.00,0.00,0.00,0 +-177.60,4.80,15.23,0.00,1.00,4.80,-4.80,0 +4.80,-4.80,0.77,0.00,1.00,9.60,-9.60,0 +-168.00,9.60,15.25,0.00,1.00,14.40,-14.40,0 +14.40,-14.40,0.75,0.00,1.00,19.20,-19.20,0 +-163.20,19.20,15.27,0.00,1.00,24.00,-24.00,0 +19.20,-19.20,0.73,0.00,1.00,28.80,-28.80,0 +-153.60,24.00,15.30,0.00,1.00,33.60,-33.60,0 +28.80,-28.80,0.70,0.00,1.00,38.40,-38.40,0 +-148.80,28.80,15.32,0.00,1.00,43.20,-43.20,0 +38.40,-33.60,0.68,0.00,1.00,48.00,-48.00,0 +-139.20,33.60,15.34,0.00,1.00,52.80,-52.80,0 +48.00,-38.40,0.66,0.00,1.00,57.60,-57.60,0 +-124.80,38.40,15.36,0.00,1.00,62.40,-62.40,0 +57.60,-43.20,0.64,0.00,1.00,67.20,-67.20,0 +-115.20,43.20,15.38,0.00,1.00,72.00,-72.00,0 +72.00,-43.20,0.62,0.00,1.00,76.80,-76.80,0 +-100.80,43.20,15.40,0.00,1.00,81.60,-81.60,0 +86.40,-48.00,0.60,0.00,1.00,86.40,-86.40,0 +-86.40,48.00,15.42,0.00,1.00,91.20,-86.40,0 +100.80,-48.00,0.58,0.00,1.00,96.00,-81.60,0 +-76.80,43.20,15.44,0.00,1.00,100.80,-76.80,0 +110.40,-43.20,0.56,0.00,1.00,105.60,-72.00,0 +-62.40,43.20,15.47,0.00,1.00,110.40,-67.20,0 +124.80,-38.40,0.53,0.00,1.00,115.20,-62.40,0 +-48.00,38.40,15.49,0.00,1.00,120.00,-57.60,0 +134.40,-38.40,0.51,0.00,1.00,124.80,-52.80,0 +-38.40,33.60,15.51,0.00,1.00,129.60,-48.00,0 +144.00,-28.80,0.49,0.00,1.00,134.40,-43.20,0 +-28.80,28.80,15.53,0.00,1.00,139.20,-38.40,0 +153.60,-24.00,0.47,0.00,1.00,144.00,-33.60,0 +-24.00,24.00,15.55,0.00,1.00,148.80,-28.80,0 +163.20,-19.20,0.45,0.00,1.00,153.60,-24.00,0 +-14.40,14.40,15.57,0.00,1.00,158.40,-19.20,0 +168.00,-14.40,0.43,0.00,1.00,163.20,-14.40,0 +-9.60,9.60,15.59,0.00,1.00,168.00,-9.60,0 +172.80,-4.80,0.41,0.00,1.00,172.80,-4.80,0 +-0.00,0.00,15.62,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,0.38,0.00,1.00,-177.60,0.00,0 +4.80,-4.80,15.64,0.00,1.00,-172.80,4.80,0 +-172.80,9.60,0.36,0.00,1.00,-168.00,9.60,0 +9.60,-14.40,15.66,0.00,1.00,-163.20,14.40,0 +-163.20,14.40,0.34,0.00,1.00,-158.40,19.20,0 +19.20,-19.20,15.68,0.00,1.00,-153.60,24.00,0 +-158.40,24.00,0.32,0.00,1.00,-148.80,28.80,0 +28.80,-24.00,15.70,0.00,1.00,-144.00,33.60,0 +-148.80,28.80,0.30,0.00,1.00,-139.20,38.40,0 +33.60,-28.80,15.72,0.00,1.00,-134.40,43.20,0 +-139.20,33.60,0.28,0.00,1.00,-129.60,48.00,0 +43.20,-38.40,15.74,0.00,1.00,-124.80,52.80,0 +-129.60,38.40,0.26,0.00,1.00,-120.00,57.60,0 +57.60,-38.40,15.77,0.00,1.00,-115.20,62.40,0 +-120.00,43.20,0.23,0.00,1.00,-110.40,67.20,0 +67.20,-43.20,15.79,0.00,1.00,-105.60,72.00,0 +-105.60,43.20,0.21,0.00,1.00,-100.80,76.80,0 +81.60,-48.00,15.81,0.00,1.00,-96.00,81.60,0 +-91.20,48.00,0.19,0.00,1.00,-91.20,86.40,0 +96.00,-48.00,15.83,0.00,1.00,-86.40,86.40,0 +-76.80,43.20,0.17,0.00,1.00,-81.60,81.60,0 +110.40,-43.20,15.85,0.00,1.00,-76.80,76.80,0 +-67.20,43.20,0.15,0.00,1.00,-72.00,72.00,0 +120.00,-43.20,15.87,0.00,1.00,-67.20,67.20,0 +-52.80,38.40,0.13,0.00,1.00,-62.40,62.40,0 +134.40,-38.40,15.89,0.00,1.00,-57.60,57.60,0 +-43.20,33.60,0.11,0.00,1.00,-52.80,52.80,0 +144.00,-33.60,15.91,0.00,1.00,-48.00,48.00,0 +-33.60,28.80,0.09,0.00,1.00,-43.20,43.20,0 +153.60,-28.80,15.94,0.00,1.00,-38.40,38.40,0 +-24.00,24.00,0.06,0.00,1.00,-33.60,33.60,0 +158.40,-19.20,15.96,0.00,1.00,-28.80,28.80,0 +-19.20,19.20,0.04,0.00,1.00,-24.00,24.00,0 +168.00,-14.40,15.98,0.00,1.00,-19.20,19.20,0 +-9.60,9.60,0.02,0.00,1.00,-14.40,14.40,0 +172.80,-4.80,16.00,0.00,1.00,-9.60,9.60,0 +-4.80,4.80,0.00,0.00,1.00,-4.80,4.80,0 diff --git a/scripts/testv/stvISM4.csv b/scripts/testv/stvISM4.csv index 326176319a..8a14c3413d 100644 --- a/scripts/testv/stvISM4.csv +++ b/scripts/testv/stvISM4.csv @@ -1,1500 +1,1500 @@ --0.00,0.00,0.00,0.00,1.00,0.00,4.80 --0.00,4.80,0.06,0.00,1.00,4.80,9.60 --0.00,9.60,0.13,0.00,1.00,9.60,14.40 --0.00,14.40,0.19,0.00,1.00,14.40,19.20 --0.00,19.20,0.26,0.00,1.00,19.20,24.00 --0.00,24.00,0.32,0.00,1.00,24.00,28.80 --0.00,28.80,0.39,0.00,1.00,28.80,33.60 --0.00,33.60,0.45,0.00,1.00,33.60,38.40 --0.00,38.40,0.51,0.00,1.00,38.40,43.20 --0.00,43.20,0.58,0.00,1.00,43.20,48.00 --0.00,48.00,0.64,0.00,1.00,48.00,52.80 --0.00,52.80,0.71,0.00,1.00,52.80,57.60 --0.00,57.60,0.77,0.00,1.00,57.60,62.40 --0.00,62.40,0.84,0.00,1.00,62.40,67.20 --0.00,67.20,0.90,0.00,1.00,67.20,72.00 --0.00,72.00,0.96,0.00,1.00,72.00,76.80 --0.00,76.80,1.03,0.00,1.00,76.80,81.60 --0.00,81.60,1.09,0.00,1.00,81.60,86.40 --0.00,86.40,1.16,0.00,1.00,86.40,86.40 --177.60,89.20,1.22,0.00,1.00,91.20,81.60 --177.60,86.40,1.29,0.00,1.00,96.00,76.80 --177.60,81.60,1.35,0.00,1.00,100.80,72.00 --177.60,76.80,1.41,0.00,1.00,105.60,67.20 --177.60,72.00,1.48,0.00,1.00,110.40,62.40 --177.60,67.20,1.54,0.00,1.00,115.20,57.60 -177.60,62.40,1.61,0.00,1.00,120.00,52.80 -177.60,57.60,1.67,0.00,1.00,124.80,48.00 -177.60,52.80,1.73,0.00,1.00,129.60,43.20 -177.60,48.00,1.80,0.00,1.00,134.40,38.40 -177.60,43.20,1.86,0.00,1.00,139.20,33.60 -177.60,38.40,1.93,0.00,1.00,144.00,28.80 -177.60,33.60,1.99,0.00,1.00,148.80,24.00 -177.60,28.80,2.06,0.00,1.00,153.60,19.20 -177.60,24.00,2.12,0.00,1.00,158.40,14.40 -177.60,19.20,2.18,0.00,1.00,163.20,9.60 -177.60,14.40,2.25,0.00,1.00,168.00,4.80 -177.60,9.60,2.31,0.00,1.00,172.80,0.00 -177.60,4.80,2.38,0.00,1.00,177.60,-0.00 --177.60,-0.00,2.44,0.00,1.00,-177.60,-4.80 --177.60,-4.80,2.51,0.00,1.00,-172.80,-9.60 --177.60,-9.60,2.57,0.00,1.00,-168.00,-14.40 --177.60,-14.40,2.63,0.00,1.00,-163.20,-19.20 --177.60,-19.20,2.70,0.00,1.00,-158.40,-24.00 --177.60,-24.00,2.76,0.00,1.00,-153.60,-28.80 --177.60,-28.80,2.83,0.00,1.00,-148.80,-33.60 --177.60,-33.60,2.89,0.00,1.00,-144.00,-38.40 --177.60,-38.40,2.96,0.00,1.00,-139.20,-43.20 --177.60,-48.00,3.02,0.00,1.00,-134.40,-48.00 --177.60,-48.00,3.08,0.00,1.00,-129.60,-52.80 --177.60,-52.80,3.15,0.00,1.00,-124.80,-57.60 --177.60,-57.60,3.21,0.00,1.00,-120.00,-62.40 -177.60,-62.40,3.28,0.00,1.00,-115.20,-67.20 -177.60,-67.20,3.34,0.00,1.00,-110.40,-72.00 -177.60,-76.80,3.41,0.00,1.00,-105.60,-76.80 -177.60,-76.80,3.47,0.00,1.00,-100.80,-81.60 -177.60,-86.40,3.53,0.00,1.00,-96.00,-86.40 -177.60,-89.20,3.60,0.00,1.00,-91.20,-86.40 -0.00,-86.40,3.66,0.00,1.00,-86.40,-81.60 -0.00,-81.60,3.73,0.00,1.00,-81.60,-76.80 -0.00,-76.80,3.79,0.00,1.00,-76.80,-72.00 -0.00,-72.00,3.86,0.00,1.00,-72.00,-67.20 -0.00,-67.20,3.92,0.00,1.00,-67.20,-62.40 -0.00,-62.40,3.98,0.00,1.00,-62.40,-57.60 -0.00,-57.60,4.05,0.00,1.00,-57.60,-52.80 -0.00,-52.80,4.11,0.00,1.00,-52.80,-48.00 -0.00,-48.00,4.18,0.00,1.00,-48.00,-43.20 -0.00,-43.20,4.24,0.00,1.00,-43.20,-38.40 -0.00,-38.40,4.31,0.00,1.00,-38.40,-33.60 -0.00,-33.60,4.37,0.00,1.00,-33.60,-28.80 -0.00,-28.80,4.43,0.00,1.00,-28.80,-24.00 -0.00,-24.00,4.50,0.00,1.00,-24.00,-19.20 -0.00,-19.20,4.56,0.00,1.00,-19.20,-14.40 -0.00,-14.40,4.63,0.00,1.00,-14.40,-9.60 -0.00,-9.60,4.69,0.00,1.00,-9.60,-4.80 -0.00,-4.80,4.76,0.00,1.00,-4.80,0.00 -0.00,0.00,4.82,0.00,1.00,0.00,4.80 -0.00,4.80,4.88,0.00,1.00,4.80,9.60 -0.00,9.60,4.95,0.00,1.00,9.60,14.40 -0.00,14.40,5.01,0.00,1.00,14.40,19.20 -0.00,19.20,5.08,0.00,1.00,19.20,24.00 -0.00,24.00,5.14,0.00,1.00,24.00,28.80 -4.80,28.80,5.20,0.00,1.00,28.80,33.60 -4.80,33.60,5.27,0.00,1.00,33.60,38.40 -4.80,38.40,5.33,0.00,1.00,38.40,43.20 -4.80,43.20,5.40,0.00,1.00,43.20,48.00 -4.80,48.00,5.46,0.00,1.00,48.00,52.80 -4.80,52.80,5.53,0.00,1.00,52.80,57.60 -9.60,57.60,5.59,0.00,1.00,57.60,62.40 -9.60,62.40,5.65,0.00,1.00,62.40,67.20 -9.60,67.20,5.72,0.00,1.00,67.20,72.00 -14.40,72.00,5.78,0.00,1.00,72.00,76.80 -19.20,76.80,5.85,0.00,1.00,76.80,81.60 -28.80,81.60,5.91,0.00,1.00,81.60,86.40 -52.80,86.40,5.98,0.00,1.00,86.40,86.40 -105.60,86.40,6.04,0.00,1.00,91.20,81.60 -139.20,81.60,6.10,0.00,1.00,96.00,76.80 -158.40,76.80,6.17,0.00,1.00,100.80,72.00 -163.20,72.00,6.23,0.00,1.00,105.60,67.20 -168.00,67.20,6.30,0.00,1.00,110.40,62.40 -168.00,62.40,6.36,0.00,1.00,115.20,57.60 -172.80,57.60,6.43,0.00,1.00,120.00,52.80 -172.80,52.80,6.49,0.00,1.00,124.80,48.00 -172.80,48.00,6.55,0.00,1.00,129.60,43.20 -172.80,43.20,6.62,0.00,1.00,134.40,38.40 -177.60,38.40,6.68,0.00,1.00,139.20,33.60 -177.60,33.60,6.75,0.00,1.00,144.00,28.80 -177.60,28.80,6.81,0.00,1.00,148.80,24.00 -177.60,24.00,6.88,0.00,1.00,153.60,19.20 -177.60,19.20,6.94,0.00,1.00,158.40,14.40 -177.60,14.40,7.00,0.00,1.00,163.20,9.60 -177.60,9.60,7.07,0.00,1.00,168.00,4.80 -177.60,4.80,7.13,0.00,1.00,172.80,0.00 -177.60,0.00,7.20,0.00,1.00,177.60,-0.00 --177.60,-0.00,7.26,0.00,1.00,-177.60,-4.80 --177.60,-4.80,7.33,0.00,1.00,-172.80,-9.60 --177.60,-9.60,7.39,0.00,1.00,-168.00,-14.40 --177.60,-14.40,7.45,0.00,1.00,-163.20,-19.20 --177.60,-19.20,7.52,0.00,1.00,-158.40,-24.00 --177.60,-24.00,7.58,0.00,1.00,-153.60,-28.80 --177.60,-28.80,7.65,0.00,1.00,-148.80,-33.60 --177.60,-33.60,7.71,0.00,1.00,-144.00,-38.40 --177.60,-38.40,7.78,0.00,1.00,-139.20,-43.20 --172.80,-43.20,7.84,0.00,1.00,-134.40,-48.00 --172.80,-48.00,7.90,0.00,1.00,-129.60,-52.80 --172.80,-52.80,7.97,0.00,1.00,-124.80,-57.60 --172.80,-57.60,8.03,0.00,1.00,-120.00,-62.40 --168.00,-62.40,8.10,0.00,1.00,-115.20,-67.20 --168.00,-67.20,8.16,0.00,1.00,-110.40,-72.00 --163.20,-72.00,8.22,0.00,1.00,-105.60,-76.80 --158.40,-76.80,8.29,0.00,1.00,-100.80,-81.60 --139.20,-81.60,8.35,0.00,1.00,-96.00,-86.40 --105.60,-86.40,8.42,0.00,1.00,-91.20,-86.40 --52.80,-86.40,8.48,0.00,1.00,-86.40,-81.60 --28.80,-81.60,8.55,0.00,1.00,-81.60,-76.80 --19.20,-76.80,8.61,0.00,1.00,-76.80,-72.00 --14.40,-72.00,8.67,0.00,1.00,-72.00,-67.20 --9.60,-67.20,8.74,0.00,1.00,-67.20,-62.40 --9.60,-62.40,8.80,0.00,1.00,-62.40,-57.60 --9.60,-57.60,8.87,0.00,1.00,-57.60,-52.80 --4.80,-52.80,8.93,0.00,1.00,-52.80,-48.00 --4.80,-48.00,9.00,0.00,1.00,-48.00,-43.20 --4.80,-43.20,9.06,0.00,1.00,-43.20,-38.40 --4.80,-38.40,9.12,0.00,1.00,-38.40,-33.60 --4.80,-33.60,9.19,0.00,1.00,-33.60,-28.80 --4.80,-28.80,9.25,0.00,1.00,-28.80,-24.00 --0.00,-24.00,9.32,0.00,1.00,-24.00,-19.20 --0.00,-19.20,9.38,0.00,1.00,-19.20,-14.40 --0.00,-14.40,9.45,0.00,1.00,-14.40,-9.60 --0.00,-9.60,9.51,0.00,1.00,-9.60,-4.80 --0.00,-4.80,9.57,0.00,1.00,-4.80,0.00 -0.00,0.00,9.64,0.00,1.00,0.00,4.80 -0.00,4.80,9.70,0.00,1.00,4.80,9.60 -0.00,9.60,9.77,0.00,1.00,9.60,14.40 -4.80,14.40,9.83,0.00,1.00,14.40,19.20 -4.80,19.20,9.90,0.00,1.00,19.20,24.00 -4.80,24.00,9.96,0.00,1.00,24.00,28.80 -4.80,28.80,10.02,0.00,1.00,28.80,33.60 -4.80,33.60,10.09,0.00,1.00,33.60,38.40 -9.60,38.40,10.15,0.00,1.00,38.40,43.20 -9.60,43.20,10.22,0.00,1.00,43.20,48.00 -9.60,48.00,10.28,0.00,1.00,48.00,52.80 -14.40,52.80,10.35,0.00,1.00,52.80,57.60 -14.40,57.60,10.41,0.00,1.00,57.60,62.40 -19.20,62.40,10.47,0.00,1.00,62.40,67.20 -24.00,67.20,10.54,0.00,1.00,67.20,72.00 -28.80,72.00,10.60,0.00,1.00,72.00,72.00 -33.60,72.00,10.67,0.00,1.00,76.80,76.80 -48.00,76.80,10.73,0.00,1.00,81.60,81.60 -67.20,81.60,10.80,0.00,1.00,86.40,81.60 -96.00,81.60,10.86,0.00,1.00,91.20,81.60 -120.00,76.80,10.92,0.00,1.00,96.00,76.80 -139.20,76.80,10.99,0.00,1.00,100.80,72.00 -148.80,72.00,11.05,0.00,1.00,105.60,67.20 -153.60,67.20,11.12,0.00,1.00,110.40,62.40 -158.40,62.40,11.18,0.00,1.00,115.20,57.60 -163.20,57.60,11.24,0.00,1.00,120.00,52.80 -168.00,52.80,11.31,0.00,1.00,124.80,48.00 -168.00,48.00,11.37,0.00,1.00,129.60,43.20 -168.00,43.20,11.44,0.00,1.00,134.40,38.40 -172.80,38.40,11.50,0.00,1.00,139.20,33.60 -172.80,33.60,11.57,0.00,1.00,144.00,28.80 -172.80,28.80,11.63,0.00,1.00,148.80,24.00 -177.60,24.00,11.69,0.00,1.00,153.60,19.20 -177.60,19.20,11.76,0.00,1.00,158.40,14.40 -177.60,14.40,11.82,0.00,1.00,163.20,9.60 -177.60,9.60,11.89,0.00,1.00,168.00,4.80 -177.60,4.80,11.95,0.00,1.00,172.80,0.00 -177.60,0.00,12.02,0.00,1.00,177.60,-0.00 --177.60,-0.00,12.08,0.00,1.00,-177.60,-4.80 --177.60,-4.80,12.14,0.00,1.00,-172.80,-9.60 --177.60,-9.60,12.21,0.00,1.00,-168.00,-14.40 --177.60,-14.40,12.27,0.00,1.00,-163.20,-19.20 --177.60,-19.20,12.34,0.00,1.00,-158.40,-24.00 --177.60,-24.00,12.40,0.00,1.00,-153.60,-28.80 --172.80,-28.80,12.47,0.00,1.00,-148.80,-33.60 --172.80,-33.60,12.53,0.00,1.00,-144.00,-38.40 --172.80,-38.40,12.59,0.00,1.00,-139.20,-43.20 --168.00,-43.20,12.66,0.00,1.00,-134.40,-48.00 --168.00,-48.00,12.72,0.00,1.00,-129.60,-52.80 --168.00,-52.80,12.79,0.00,1.00,-124.80,-57.60 --163.20,-57.60,12.85,0.00,1.00,-120.00,-62.40 --158.40,-62.40,12.92,0.00,1.00,-115.20,-67.20 --153.60,-67.20,12.98,0.00,1.00,-110.40,-72.00 --148.80,-72.00,13.04,0.00,1.00,-105.60,-76.80 --139.20,-76.80,13.11,0.00,1.00,-100.80,-81.60 --120.00,-76.80,13.17,0.00,1.00,-96.00,-81.60 --96.00,-81.60,13.24,0.00,1.00,-91.20,-81.60 --67.20,-81.60,13.30,0.00,1.00,-86.40,-76.80 --48.00,-76.80,13.37,0.00,1.00,-81.60,-72.00 --33.60,-72.00,13.43,0.00,1.00,-76.80,-72.00 --28.80,-72.00,13.49,0.00,1.00,-72.00,-67.20 --24.00,-67.20,13.56,0.00,1.00,-67.20,-62.40 --19.20,-62.40,13.62,0.00,1.00,-62.40,-57.60 --14.40,-57.60,13.69,0.00,1.00,-57.60,-52.80 --14.40,-52.80,13.75,0.00,1.00,-52.80,-48.00 --9.60,-48.00,13.82,0.00,1.00,-48.00,-43.20 --9.60,-43.20,13.88,0.00,1.00,-43.20,-38.40 --9.60,-38.40,13.94,0.00,1.00,-38.40,-33.60 --4.80,-33.60,14.01,0.00,1.00,-33.60,-28.80 --4.80,-28.80,14.07,0.00,1.00,-28.80,-24.00 --4.80,-24.00,14.14,0.00,1.00,-24.00,-19.20 --4.80,-19.20,14.20,0.00,1.00,-19.20,-14.40 --4.80,-14.40,14.27,0.00,1.00,-14.40,-9.60 --0.00,-9.60,14.33,0.00,1.00,-9.60,-4.80 --0.00,-4.80,14.39,0.00,1.00,-4.80,0.00 -0.00,0.00,14.46,0.00,1.00,0.00,4.80 -0.00,4.80,14.52,0.00,1.00,4.80,9.60 -4.80,9.60,14.59,0.00,1.00,9.60,14.40 -4.80,14.40,14.65,0.00,1.00,14.40,19.20 -4.80,19.20,14.71,0.00,1.00,19.20,24.00 -4.80,24.00,14.78,0.00,1.00,24.00,28.80 -9.60,28.80,14.84,0.00,1.00,28.80,33.60 -9.60,33.60,14.91,0.00,1.00,33.60,38.40 -9.60,38.40,14.97,0.00,1.00,38.40,43.20 -14.40,43.20,15.04,0.00,1.00,43.20,48.00 -14.40,48.00,15.10,0.00,1.00,48.00,52.80 -19.20,52.80,15.16,0.00,1.00,52.80,57.60 -19.20,52.80,15.23,0.00,1.00,57.60,57.60 -24.00,57.60,15.29,0.00,1.00,62.40,62.40 -28.80,62.40,15.36,0.00,1.00,67.20,67.20 -38.40,67.20,15.42,0.00,1.00,72.00,72.00 -48.00,72.00,15.49,0.00,1.00,76.80,72.00 -57.60,72.00,15.55,0.00,1.00,81.60,76.80 -76.80,76.80,15.61,0.00,1.00,86.40,76.80 -96.00,76.80,15.68,0.00,1.00,91.20,76.80 -115.20,76.80,15.74,0.00,1.00,96.00,72.00 -129.60,72.00,15.81,0.00,1.00,100.80,72.00 -139.20,67.20,15.87,0.00,1.00,105.60,67.20 -144.00,67.20,15.94,0.00,1.00,110.40,62.40 -153.60,62.40,16.00,0.00,1.00,115.20,57.60 -158.40,57.60,16.00,0.00,1.00,120.00,52.80 -158.40,52.80,15.94,0.00,1.00,124.80,48.00 -163.20,48.00,15.87,0.00,1.00,129.60,43.20 -168.00,43.20,15.81,0.00,1.00,134.40,38.40 -168.00,38.40,15.74,0.00,1.00,139.20,33.60 -168.00,33.60,15.68,0.00,1.00,144.00,28.80 -172.80,28.80,15.61,0.00,1.00,148.80,24.00 -172.80,24.00,15.55,0.00,1.00,153.60,19.20 -172.80,19.20,15.49,0.00,1.00,158.40,14.40 -177.60,14.40,15.42,0.00,1.00,163.20,9.60 -177.60,9.60,15.36,0.00,1.00,168.00,4.80 -177.60,4.80,15.29,0.00,1.00,172.80,0.00 -177.60,0.00,15.23,0.00,1.00,177.60,-0.00 --177.60,-0.00,15.16,0.00,1.00,-177.60,-4.80 --177.60,-4.80,15.10,0.00,1.00,-172.80,-9.60 --177.60,-9.60,15.04,0.00,1.00,-168.00,-14.40 --177.60,-14.40,14.97,0.00,1.00,-163.20,-19.20 --172.80,-19.20,14.91,0.00,1.00,-158.40,-24.00 --172.80,-24.00,14.84,0.00,1.00,-153.60,-28.80 --172.80,-28.80,14.78,0.00,1.00,-148.80,-33.60 --168.00,-33.60,14.71,0.00,1.00,-144.00,-38.40 --168.00,-38.40,14.65,0.00,1.00,-139.20,-43.20 --168.00,-43.20,14.59,0.00,1.00,-134.40,-48.00 --163.20,-48.00,14.52,0.00,1.00,-129.60,-52.80 --158.40,-52.80,14.46,0.00,1.00,-124.80,-57.60 --158.40,-57.60,14.39,0.00,1.00,-120.00,-62.40 --153.60,-62.40,14.33,0.00,1.00,-115.20,-67.20 --144.00,-67.20,14.27,0.00,1.00,-110.40,-72.00 --139.20,-67.20,14.20,0.00,1.00,-105.60,-72.00 --129.60,-72.00,14.14,0.00,1.00,-100.80,-76.80 --115.20,-76.80,14.07,0.00,1.00,-96.00,-76.80 --96.00,-76.80,14.01,0.00,1.00,-91.20,-76.80 --76.80,-76.80,13.94,0.00,1.00,-86.40,-72.00 --57.60,-72.00,13.88,0.00,1.00,-81.60,-72.00 --48.00,-72.00,13.82,0.00,1.00,-76.80,-67.20 --38.40,-67.20,13.75,0.00,1.00,-72.00,-62.40 --28.80,-62.40,13.69,0.00,1.00,-67.20,-57.60 --24.00,-57.60,13.62,0.00,1.00,-62.40,-57.60 --19.20,-52.80,13.56,0.00,1.00,-57.60,-52.80 --19.20,-52.80,13.49,0.00,1.00,-52.80,-48.00 --14.40,-48.00,13.43,0.00,1.00,-48.00,-43.20 --14.40,-43.20,13.37,0.00,1.00,-43.20,-38.40 --9.60,-38.40,13.30,0.00,1.00,-38.40,-33.60 --9.60,-33.60,13.24,0.00,1.00,-33.60,-28.80 --9.60,-28.80,13.17,0.00,1.00,-28.80,-24.00 --4.80,-24.00,13.11,0.00,1.00,-24.00,-19.20 --4.80,-19.20,13.04,0.00,1.00,-19.20,-14.40 --4.80,-14.40,12.98,0.00,1.00,-14.40,-9.60 --4.80,-9.60,12.92,0.00,1.00,-9.60,-4.80 --0.00,-4.80,12.85,0.00,1.00,-4.80,0.00 -0.00,0.00,12.79,0.00,1.00,0.00,4.80 -0.00,4.80,12.72,0.00,1.00,4.80,9.60 -4.80,9.60,12.66,0.00,1.00,9.60,14.40 -4.80,14.40,12.59,0.00,1.00,14.40,19.20 -4.80,19.20,12.53,0.00,1.00,19.20,24.00 -9.60,24.00,12.47,0.00,1.00,24.00,28.80 -9.60,28.80,12.40,0.00,1.00,28.80,33.60 -14.40,33.60,12.34,0.00,1.00,33.60,38.40 -14.40,33.60,12.27,0.00,1.00,38.40,38.40 -19.20,38.40,12.21,0.00,1.00,43.20,43.20 -19.20,43.20,12.14,0.00,1.00,48.00,48.00 -24.00,48.00,12.08,0.00,1.00,52.80,52.80 -28.80,52.80,12.02,0.00,1.00,57.60,57.60 -33.60,57.60,11.95,0.00,1.00,62.40,62.40 -38.40,62.40,11.89,0.00,1.00,67.20,62.40 -43.20,62.40,11.82,0.00,1.00,72.00,67.20 -52.80,67.20,11.76,0.00,1.00,76.80,72.00 -67.20,67.20,11.69,0.00,1.00,81.60,72.00 -76.80,72.00,11.63,0.00,1.00,86.40,72.00 -96.00,72.00,11.57,0.00,1.00,91.20,72.00 -105.60,72.00,11.50,0.00,1.00,96.00,67.20 -120.00,67.20,11.44,0.00,1.00,100.80,67.20 -129.60,67.20,11.37,0.00,1.00,105.60,62.40 -139.20,62.40,11.31,0.00,1.00,110.40,57.60 -144.00,57.60,11.24,0.00,1.00,115.20,57.60 -148.80,52.80,11.18,0.00,1.00,120.00,52.80 -153.60,52.80,11.12,0.00,1.00,124.80,48.00 -158.40,48.00,11.05,0.00,1.00,129.60,43.20 -163.20,43.20,10.99,0.00,1.00,134.40,38.40 -163.20,38.40,10.92,0.00,1.00,139.20,33.60 -168.00,33.60,10.86,0.00,1.00,144.00,28.80 -168.00,28.80,10.80,0.00,1.00,148.80,24.00 -172.80,24.00,10.73,0.00,1.00,153.60,19.20 -172.80,19.20,10.67,0.00,1.00,158.40,14.40 -172.80,14.40,10.60,0.00,1.00,163.20,9.60 -177.60,9.60,10.54,0.00,1.00,168.00,4.80 -177.60,4.80,10.47,0.00,1.00,172.80,0.00 -177.60,0.00,10.41,0.00,1.00,177.60,-0.00 --177.60,-0.00,10.35,0.00,1.00,-177.60,-4.80 --177.60,-4.80,10.28,0.00,1.00,-172.80,-9.60 --177.60,-9.60,10.22,0.00,1.00,-168.00,-14.40 --172.80,-14.40,10.15,0.00,1.00,-163.20,-19.20 --172.80,-19.20,10.09,0.00,1.00,-158.40,-24.00 --172.80,-24.00,10.02,0.00,1.00,-153.60,-28.80 --168.00,-28.80,9.96,0.00,1.00,-148.80,-33.60 --168.00,-33.60,9.90,0.00,1.00,-144.00,-38.40 --163.20,-38.40,9.83,0.00,1.00,-139.20,-43.20 --163.20,-43.20,9.77,0.00,1.00,-134.40,-48.00 --158.40,-48.00,9.70,0.00,1.00,-129.60,-52.80 --153.60,-52.80,9.64,0.00,1.00,-124.80,-57.60 --148.80,-52.80,9.57,0.00,1.00,-120.00,-57.60 --144.00,-57.60,9.51,0.00,1.00,-115.20,-62.40 --139.20,-62.40,9.45,0.00,1.00,-110.40,-67.20 --129.60,-67.20,9.38,0.00,1.00,-105.60,-67.20 --120.00,-67.20,9.32,0.00,1.00,-100.80,-72.00 --105.60,-72.00,9.25,0.00,1.00,-96.00,-72.00 --96.00,-72.00,9.19,0.00,1.00,-91.20,-72.00 --76.80,-72.00,9.12,0.00,1.00,-86.40,-72.00 --67.20,-67.20,9.06,0.00,1.00,-81.60,-67.20 --52.80,-67.20,9.00,0.00,1.00,-76.80,-62.40 --43.20,-62.40,8.93,0.00,1.00,-72.00,-62.40 --38.40,-62.40,8.87,0.00,1.00,-67.20,-57.60 --33.60,-57.60,8.80,0.00,1.00,-62.40,-52.80 --28.80,-52.80,8.74,0.00,1.00,-57.60,-48.00 --24.00,-48.00,8.67,0.00,1.00,-52.80,-43.20 --19.20,-43.20,8.61,0.00,1.00,-48.00,-38.40 --19.20,-38.40,8.55,0.00,1.00,-43.20,-38.40 --14.40,-33.60,8.48,0.00,1.00,-38.40,-33.60 --14.40,-33.60,8.42,0.00,1.00,-33.60,-28.80 --9.60,-28.80,8.35,0.00,1.00,-28.80,-24.00 --9.60,-24.00,8.29,0.00,1.00,-24.00,-19.20 --4.80,-19.20,8.22,0.00,1.00,-19.20,-14.40 --4.80,-14.40,8.16,0.00,1.00,-14.40,-9.60 --4.80,-9.60,8.10,0.00,1.00,-9.60,-4.80 --0.00,-4.80,8.03,0.00,1.00,-4.80,0.00 -0.00,0.00,7.97,0.00,1.00,0.00,4.80 -0.00,4.80,7.90,0.00,1.00,4.80,9.60 -4.80,9.60,7.84,0.00,1.00,9.60,14.40 -4.80,14.40,7.78,0.00,1.00,14.40,19.20 -9.60,19.20,7.71,0.00,1.00,19.20,24.00 -9.60,24.00,7.65,0.00,1.00,24.00,24.00 -14.40,24.00,7.58,0.00,1.00,28.80,28.80 -14.40,28.80,7.52,0.00,1.00,33.60,33.60 -19.20,33.60,7.45,0.00,1.00,33.60,38.40 -19.20,38.40,7.39,0.00,1.00,38.40,43.20 -24.00,43.20,7.33,0.00,1.00,43.20,48.00 -28.80,48.00,7.26,0.00,1.00,48.00,52.80 -33.60,52.80,7.20,0.00,1.00,57.60,52.80 -38.40,52.80,7.13,0.00,1.00,62.40,57.60 -43.20,57.60,7.07,0.00,1.00,67.20,62.40 -52.80,62.40,7.00,0.00,1.00,72.00,62.40 -62.40,62.40,6.94,0.00,1.00,76.80,67.20 -72.00,62.40,6.88,0.00,1.00,81.60,67.20 -81.60,67.20,6.81,0.00,1.00,86.40,67.20 -91.20,67.20,6.75,0.00,1.00,91.20,67.20 -105.60,67.20,6.68,0.00,1.00,96.00,67.20 -115.20,62.40,6.62,0.00,1.00,100.80,62.40 -124.80,62.40,6.55,0.00,1.00,105.60,57.60 -134.40,57.60,6.49,0.00,1.00,110.40,57.60 -139.20,57.60,6.43,0.00,1.00,115.20,52.80 -144.00,52.80,6.36,0.00,1.00,120.00,48.00 -148.80,48.00,6.30,0.00,1.00,129.60,43.20 -153.60,43.20,6.23,0.00,1.00,134.40,43.20 -158.40,38.40,6.17,0.00,1.00,139.20,38.40 -158.40,38.40,6.10,0.00,1.00,144.00,33.60 -163.20,33.60,6.04,0.00,1.00,148.80,28.80 -168.00,28.80,5.98,0.00,1.00,148.80,24.00 -168.00,24.00,5.91,0.00,1.00,153.60,19.20 -172.80,19.20,5.85,0.00,1.00,158.40,14.40 -172.80,14.40,5.78,0.00,1.00,163.20,9.60 -172.80,9.60,5.72,0.00,1.00,168.00,4.80 -177.60,4.80,5.65,0.00,1.00,172.80,0.00 -177.60,0.00,5.59,0.00,1.00,177.60,-0.00 --177.60,-0.00,5.53,0.00,1.00,-177.60,-4.80 --177.60,-4.80,5.46,0.00,1.00,-172.80,-9.60 --172.80,-9.60,5.40,0.00,1.00,-168.00,-14.40 --172.80,-14.40,5.33,0.00,1.00,-163.20,-19.20 --172.80,-19.20,5.27,0.00,1.00,-158.40,-24.00 --168.00,-24.00,5.20,0.00,1.00,-153.60,-28.80 --168.00,-28.80,5.14,0.00,1.00,-148.80,-33.60 --163.20,-33.60,5.08,0.00,1.00,-148.80,-38.40 --158.40,-38.40,5.01,0.00,1.00,-144.00,-43.20 --158.40,-38.40,4.95,0.00,1.00,-139.20,-43.20 --153.60,-43.20,4.88,0.00,1.00,-134.40,-48.00 --148.80,-48.00,4.82,0.00,1.00,-129.60,-52.80 --144.00,-52.80,4.76,0.00,1.00,-120.00,-57.60 --139.20,-57.60,4.69,0.00,1.00,-115.20,-57.60 --134.40,-57.60,4.63,0.00,1.00,-110.40,-62.40 --124.80,-62.40,4.56,0.00,1.00,-105.60,-67.20 --115.20,-62.40,4.50,0.00,1.00,-100.80,-67.20 --105.60,-67.20,4.43,0.00,1.00,-96.00,-67.20 --91.20,-67.20,4.37,0.00,1.00,-91.20,-67.20 --81.60,-67.20,4.31,0.00,1.00,-86.40,-67.20 --72.00,-62.40,4.24,0.00,1.00,-81.60,-62.40 --62.40,-62.40,4.18,0.00,1.00,-76.80,-62.40 --52.80,-62.40,4.11,0.00,1.00,-72.00,-57.60 --43.20,-57.60,4.05,0.00,1.00,-67.20,-52.80 --38.40,-52.80,3.98,0.00,1.00,-62.40,-52.80 --33.60,-52.80,3.92,0.00,1.00,-57.60,-48.00 --28.80,-48.00,3.86,0.00,1.00,-48.00,-43.20 --24.00,-43.20,3.79,0.00,1.00,-43.20,-38.40 --19.20,-38.40,3.73,0.00,1.00,-38.40,-33.60 --19.20,-33.60,3.66,0.00,1.00,-33.60,-28.80 --14.40,-28.80,3.60,0.00,1.00,-33.60,-24.00 --14.40,-24.00,3.53,0.00,1.00,-28.80,-24.00 --9.60,-24.00,3.47,0.00,1.00,-24.00,-19.20 --9.60,-19.20,3.41,0.00,1.00,-19.20,-14.40 --4.80,-14.40,3.34,0.00,1.00,-14.40,-9.60 --4.80,-9.60,3.28,0.00,1.00,-9.60,-4.80 --0.00,-4.80,3.21,0.00,1.00,-4.80,0.00 -0.00,0.00,3.15,0.00,1.00,0.00,4.80 -0.00,4.80,3.08,0.00,1.00,4.80,9.60 -4.80,9.60,3.02,0.00,1.00,9.60,14.40 -4.80,14.40,2.96,0.00,1.00,14.40,19.20 -9.60,14.40,2.89,0.00,1.00,19.20,19.20 -14.40,19.20,2.83,0.00,1.00,19.20,24.00 -14.40,24.00,2.76,0.00,1.00,24.00,28.80 -19.20,28.80,2.70,0.00,1.00,28.80,33.60 -19.20,33.60,2.63,0.00,1.00,33.60,38.40 -24.00,38.40,2.57,0.00,1.00,38.40,43.20 -28.80,38.40,2.51,0.00,1.00,43.20,43.20 -33.60,43.20,2.44,0.00,1.00,48.00,48.00 -38.40,48.00,2.38,0.00,1.00,52.80,52.80 -43.20,52.80,2.31,0.00,1.00,57.60,52.80 -48.00,52.80,2.25,0.00,1.00,62.40,57.60 -57.60,57.60,2.18,0.00,1.00,72.00,57.60 -62.40,57.60,2.12,0.00,1.00,76.80,62.40 -72.00,62.40,2.06,0.00,1.00,81.60,62.40 -81.60,62.40,1.99,0.00,1.00,86.40,62.40 -91.20,62.40,1.93,0.00,1.00,91.20,62.40 -100.80,62.40,1.86,0.00,1.00,96.00,62.40 -110.40,57.60,1.80,0.00,1.00,100.80,57.60 -120.00,57.60,1.73,0.00,1.00,105.60,57.60 -129.60,57.60,1.67,0.00,1.00,115.20,52.80 -134.40,52.80,1.61,0.00,1.00,120.00,48.00 -139.20,48.00,1.54,0.00,1.00,124.80,48.00 -144.00,48.00,1.48,0.00,1.00,129.60,43.20 -148.80,43.20,1.41,0.00,1.00,134.40,38.40 -153.60,38.40,1.35,0.00,1.00,139.20,33.60 -158.40,33.60,1.29,0.00,1.00,144.00,33.60 -158.40,28.80,1.22,0.00,1.00,148.80,28.80 -163.20,28.80,1.16,0.00,1.00,153.60,24.00 -168.00,24.00,1.09,0.00,1.00,158.40,19.20 -168.00,19.20,1.03,0.00,1.00,163.20,14.40 -172.80,14.40,0.96,0.00,1.00,163.20,9.60 -172.80,9.60,0.90,0.00,1.00,168.00,4.80 -177.60,4.80,0.84,0.00,1.00,172.80,0.00 -177.60,0.00,0.77,0.00,1.00,177.60,-0.00 --177.60,-0.00,0.71,0.00,1.00,-177.60,-4.80 --177.60,-4.80,0.64,0.00,1.00,-172.80,-9.60 --172.80,-9.60,0.58,0.00,1.00,-168.00,-14.40 --172.80,-14.40,0.51,0.00,1.00,-163.20,-19.20 --168.00,-19.20,0.45,0.00,1.00,-163.20,-24.00 --168.00,-24.00,0.39,0.00,1.00,-158.40,-28.80 --163.20,-28.80,0.32,0.00,1.00,-153.60,-33.60 --158.40,-28.80,0.26,0.00,1.00,-148.80,-33.60 --158.40,-33.60,0.19,0.00,1.00,-144.00,-38.40 --153.60,-38.40,0.13,0.00,1.00,-139.20,-43.20 --148.80,-43.20,0.06,0.00,1.00,-134.40,-48.00 --144.00,-48.00,0.00,0.00,1.00,-129.60,-48.00 --139.20,-48.00,0.00,0.00,1.00,-124.80,-52.80 --134.40,-52.80,0.16,0.00,1.00,-120.00,-57.60 --129.60,-57.60,0.32,0.00,1.00,-115.20,-57.60 --120.00,-57.60,0.48,0.00,1.00,-105.60,-62.40 --110.40,-57.60,0.65,0.00,1.00,-100.80,-62.40 --100.80,-62.40,0.81,0.00,1.00,-96.00,-62.40 --91.20,-62.40,0.97,0.00,1.00,-91.20,-62.40 --81.60,-62.40,1.13,0.00,1.00,-86.40,-62.40 --72.00,-62.40,1.29,0.00,1.00,-81.60,-57.60 --62.40,-57.60,1.45,0.00,1.00,-76.80,-57.60 --57.60,-57.60,1.62,0.00,1.00,-72.00,-52.80 --48.00,-52.80,1.78,0.00,1.00,-62.40,-52.80 --43.20,-52.80,1.94,0.00,1.00,-57.60,-48.00 --38.40,-48.00,2.10,0.00,1.00,-52.80,-43.20 --33.60,-43.20,2.26,0.00,1.00,-48.00,-43.20 --28.80,-38.40,2.42,0.00,1.00,-43.20,-38.40 --24.00,-38.40,2.59,0.00,1.00,-38.40,-33.60 --19.20,-33.60,2.75,0.00,1.00,-33.60,-28.80 --19.20,-28.80,2.91,0.00,1.00,-28.80,-24.00 --14.40,-24.00,3.07,0.00,1.00,-24.00,-19.20 --14.40,-19.20,3.23,0.00,1.00,-19.20,-19.20 --9.60,-14.40,3.39,0.00,1.00,-19.20,-14.40 --4.80,-14.40,3.56,0.00,1.00,-14.40,-9.60 --4.80,-9.60,3.72,0.00,1.00,-9.60,-4.80 --0.00,-4.80,3.88,0.00,1.00,-4.80,0.00 -0.00,0.00,4.04,0.00,1.00,0.00,4.80 -4.80,4.80,4.20,0.00,1.00,4.80,9.60 -4.80,9.60,4.36,0.00,1.00,9.60,14.40 -9.60,9.60,4.53,0.00,1.00,14.40,14.40 -9.60,14.40,4.69,0.00,1.00,14.40,19.20 -14.40,19.20,4.85,0.00,1.00,19.20,24.00 -19.20,24.00,5.01,0.00,1.00,24.00,28.80 -19.20,28.80,5.17,0.00,1.00,28.80,33.60 -24.00,28.80,5.33,0.00,1.00,33.60,33.60 -28.80,33.60,5.49,0.00,1.00,38.40,38.40 -33.60,38.40,5.66,0.00,1.00,43.20,43.20 -38.40,43.20,5.82,0.00,1.00,48.00,43.20 -43.20,43.20,5.98,0.00,1.00,52.80,48.00 -48.00,48.00,6.14,0.00,1.00,57.60,52.80 -52.80,48.00,6.30,0.00,1.00,62.40,52.80 -57.60,52.80,6.46,0.00,1.00,67.20,57.60 -67.20,52.80,6.63,0.00,1.00,72.00,57.60 -76.80,57.60,6.79,0.00,1.00,81.60,57.60 -81.60,57.60,6.95,0.00,1.00,86.40,57.60 -91.20,57.60,7.11,0.00,1.00,91.20,57.60 -100.80,57.60,7.27,0.00,1.00,96.00,57.60 -110.40,52.80,7.43,0.00,1.00,100.80,52.80 -115.20,52.80,7.60,0.00,1.00,110.40,52.80 -124.80,52.80,7.76,0.00,1.00,115.20,48.00 -129.60,48.00,7.92,0.00,1.00,120.00,48.00 -134.40,48.00,8.08,0.00,1.00,124.80,43.20 -139.20,43.20,8.24,0.00,1.00,129.60,38.40 -144.00,38.40,8.40,0.00,1.00,134.40,38.40 -148.80,38.40,8.57,0.00,1.00,139.20,33.60 -153.60,33.60,8.73,0.00,1.00,144.00,28.80 -158.40,28.80,8.89,0.00,1.00,148.80,24.00 -163.20,24.00,9.05,0.00,1.00,153.60,24.00 -163.20,24.00,9.21,0.00,1.00,158.40,19.20 -168.00,19.20,9.37,0.00,1.00,163.20,14.40 -172.80,14.40,9.54,0.00,1.00,168.00,9.60 -172.80,9.60,9.70,0.00,1.00,168.00,4.80 -177.60,4.80,9.86,0.00,1.00,172.80,0.00 -177.60,0.00,10.02,0.00,1.00,177.60,-0.00 --177.60,-0.00,10.18,0.00,1.00,-177.60,-4.80 --177.60,-4.80,10.34,0.00,1.00,-172.80,-9.60 --172.80,-9.60,10.51,0.00,1.00,-168.00,-14.40 --172.80,-14.40,10.67,0.00,1.00,-168.00,-19.20 --168.00,-19.20,10.83,0.00,1.00,-163.20,-24.00 --163.20,-24.00,10.99,0.00,1.00,-158.40,-24.00 --163.20,-24.00,11.15,0.00,1.00,-153.60,-28.80 --158.40,-28.80,11.31,0.00,1.00,-148.80,-33.60 --153.60,-33.60,11.47,0.00,1.00,-144.00,-38.40 --148.80,-38.40,11.64,0.00,1.00,-139.20,-38.40 --144.00,-38.40,11.80,0.00,1.00,-134.40,-43.20 --139.20,-43.20,11.96,0.00,1.00,-129.60,-48.00 --134.40,-48.00,12.12,0.00,1.00,-124.80,-48.00 --129.60,-48.00,12.28,0.00,1.00,-120.00,-52.80 --124.80,-52.80,12.44,0.00,1.00,-115.20,-52.80 --115.20,-52.80,12.61,0.00,1.00,-110.40,-57.60 --110.40,-52.80,12.77,0.00,1.00,-100.80,-57.60 --100.80,-57.60,12.93,0.00,1.00,-96.00,-57.60 --91.20,-57.60,13.09,0.00,1.00,-91.20,-57.60 --81.60,-57.60,13.25,0.00,1.00,-86.40,-57.60 --76.80,-57.60,13.41,0.00,1.00,-81.60,-57.60 --67.20,-52.80,13.58,0.00,1.00,-72.00,-52.80 --57.60,-52.80,13.74,0.00,1.00,-67.20,-52.80 --52.80,-48.00,13.90,0.00,1.00,-62.40,-48.00 --48.00,-48.00,14.06,0.00,1.00,-57.60,-43.20 --43.20,-43.20,14.22,0.00,1.00,-52.80,-43.20 --38.40,-43.20,14.38,0.00,1.00,-48.00,-38.40 --33.60,-38.40,14.55,0.00,1.00,-43.20,-33.60 --28.80,-33.60,14.71,0.00,1.00,-38.40,-33.60 --24.00,-28.80,14.87,0.00,1.00,-33.60,-28.80 --19.20,-28.80,15.03,0.00,1.00,-28.80,-24.00 --19.20,-24.00,15.19,0.00,1.00,-24.00,-19.20 --14.40,-19.20,15.35,0.00,1.00,-19.20,-14.40 --9.60,-14.40,15.52,0.00,1.00,-14.40,-14.40 --9.60,-9.60,15.68,0.00,1.00,-14.40,-9.60 --4.80,-9.60,15.84,0.00,1.00,-9.60,-4.80 --4.80,-4.80,16.00,0.00,1.00,-4.80,0.00 -0.00,0.00,16.00,0.00,1.00,0.00,4.80 -4.80,4.80,15.84,0.00,1.00,4.80,9.60 -4.80,9.60,15.68,0.00,1.00,9.60,9.60 -9.60,9.60,15.52,0.00,1.00,9.60,14.40 -14.40,14.40,15.35,0.00,1.00,14.40,19.20 -14.40,19.20,15.19,0.00,1.00,19.20,24.00 -19.20,24.00,15.03,0.00,1.00,24.00,24.00 -24.00,24.00,14.87,0.00,1.00,28.80,28.80 -24.00,28.80,14.71,0.00,1.00,33.60,33.60 -28.80,33.60,14.55,0.00,1.00,38.40,38.40 -33.60,33.60,14.38,0.00,1.00,43.20,38.40 -38.40,38.40,14.22,0.00,1.00,48.00,43.20 -43.20,43.20,14.06,0.00,1.00,52.80,43.20 -48.00,43.20,13.90,0.00,1.00,57.60,48.00 -57.60,48.00,13.74,0.00,1.00,62.40,48.00 -62.40,48.00,13.58,0.00,1.00,67.20,52.80 -67.20,48.00,13.41,0.00,1.00,72.00,52.80 -76.80,52.80,13.25,0.00,1.00,81.60,52.80 -86.40,52.80,13.09,0.00,1.00,86.40,52.80 -91.20,52.80,12.93,0.00,1.00,91.20,52.80 -100.80,52.80,12.77,0.00,1.00,96.00,52.80 -105.60,48.00,12.61,0.00,1.00,105.60,48.00 -115.20,48.00,12.44,0.00,1.00,110.40,48.00 -120.00,48.00,12.28,0.00,1.00,115.20,48.00 -124.80,43.20,12.12,0.00,1.00,120.00,43.20 -134.40,43.20,11.96,0.00,1.00,124.80,43.20 -139.20,38.40,11.80,0.00,1.00,129.60,38.40 -144.00,38.40,11.64,0.00,1.00,134.40,33.60 -148.80,33.60,11.47,0.00,1.00,139.20,33.60 -153.60,28.80,11.31,0.00,1.00,144.00,28.80 -153.60,28.80,11.15,0.00,1.00,148.80,24.00 -158.40,24.00,10.99,0.00,1.00,153.60,19.20 -163.20,19.20,10.83,0.00,1.00,158.40,19.20 -168.00,14.40,10.67,0.00,1.00,163.20,14.40 -168.00,14.40,10.51,0.00,1.00,168.00,9.60 -172.80,9.60,10.34,0.00,1.00,172.80,4.80 -177.60,4.80,10.18,0.00,1.00,172.80,0.00 -177.60,0.00,10.02,0.00,1.00,177.60,-0.00 --177.60,-0.00,9.86,0.00,1.00,-177.60,-4.80 --177.60,-4.80,9.70,0.00,1.00,-172.80,-9.60 --172.80,-9.60,9.54,0.00,1.00,-172.80,-14.40 --168.00,-14.40,9.37,0.00,1.00,-168.00,-19.20 --168.00,-14.40,9.21,0.00,1.00,-163.20,-19.20 --163.20,-19.20,9.05,0.00,1.00,-158.40,-24.00 --158.40,-24.00,8.89,0.00,1.00,-153.60,-28.80 --153.60,-28.80,8.73,0.00,1.00,-148.80,-33.60 --153.60,-28.80,8.57,0.00,1.00,-144.00,-33.60 --148.80,-33.60,8.40,0.00,1.00,-139.20,-38.40 --144.00,-38.40,8.24,0.00,1.00,-134.40,-43.20 --139.20,-38.40,8.08,0.00,1.00,-129.60,-43.20 --134.40,-43.20,7.92,0.00,1.00,-124.80,-48.00 --124.80,-43.20,7.76,0.00,1.00,-120.00,-48.00 --120.00,-48.00,7.60,0.00,1.00,-115.20,-48.00 --115.20,-48.00,7.43,0.00,1.00,-110.40,-52.80 --105.60,-48.00,7.27,0.00,1.00,-105.60,-52.80 --100.80,-52.80,7.11,0.00,1.00,-96.00,-52.80 --91.20,-52.80,6.95,0.00,1.00,-91.20,-52.80 --86.40,-52.80,6.79,0.00,1.00,-86.40,-52.80 --76.80,-52.80,6.63,0.00,1.00,-81.60,-52.80 --67.20,-48.00,6.46,0.00,1.00,-72.00,-48.00 --62.40,-48.00,6.30,0.00,1.00,-67.20,-48.00 --57.60,-48.00,6.14,0.00,1.00,-62.40,-43.20 --48.00,-43.20,5.98,0.00,1.00,-57.60,-43.20 --43.20,-43.20,5.82,0.00,1.00,-52.80,-38.40 --38.40,-38.40,5.66,0.00,1.00,-48.00,-38.40 --33.60,-33.60,5.49,0.00,1.00,-43.20,-33.60 --28.80,-33.60,5.33,0.00,1.00,-38.40,-28.80 --24.00,-28.80,5.17,0.00,1.00,-33.60,-24.00 --24.00,-24.00,5.01,0.00,1.00,-28.80,-24.00 --19.20,-24.00,4.85,0.00,1.00,-24.00,-19.20 --14.40,-19.20,4.69,0.00,1.00,-19.20,-14.40 --14.40,-14.40,4.53,0.00,1.00,-14.40,-9.60 --9.60,-9.60,4.36,0.00,1.00,-9.60,-9.60 --4.80,-9.60,4.20,0.00,1.00,-9.60,-4.80 --4.80,-4.80,4.04,0.00,1.00,-4.80,0.00 -0.00,0.00,3.88,0.00,1.00,0.00,4.80 -4.80,4.80,3.72,0.00,1.00,4.80,4.80 -4.80,4.80,3.56,0.00,1.00,4.80,9.60 -9.60,9.60,3.39,0.00,1.00,9.60,14.40 -14.40,14.40,3.23,0.00,1.00,14.40,19.20 -19.20,19.20,3.07,0.00,1.00,19.20,19.20 -19.20,19.20,2.91,0.00,1.00,24.00,24.00 -24.00,24.00,2.75,0.00,1.00,24.00,28.80 -28.80,28.80,2.59,0.00,1.00,28.80,28.80 -33.60,28.80,2.42,0.00,1.00,33.60,33.60 -38.40,33.60,2.26,0.00,1.00,38.40,38.40 -43.20,33.60,2.10,0.00,1.00,43.20,38.40 -48.00,38.40,1.94,0.00,1.00,48.00,43.20 -52.80,38.40,1.78,0.00,1.00,52.80,43.20 -57.60,43.20,1.62,0.00,1.00,62.40,43.20 -62.40,43.20,1.45,0.00,1.00,67.20,48.00 -72.00,43.20,1.29,0.00,1.00,72.00,48.00 -76.80,48.00,1.13,0.00,1.00,76.80,48.00 -86.40,48.00,0.97,0.00,1.00,86.40,48.00 -91.20,48.00,0.81,0.00,1.00,91.20,48.00 -100.80,48.00,0.65,0.00,1.00,96.00,48.00 -105.60,48.00,0.48,0.00,1.00,105.60,48.00 -110.40,43.20,0.32,0.00,1.00,110.40,43.20 -120.00,43.20,0.16,0.00,1.00,115.20,43.20 -124.80,43.20,0.00,0.00,1.00,124.80,38.40 -129.60,38.40,0.00,0.00,1.00,129.60,38.40 -134.40,38.40,0.04,0.00,1.00,134.40,33.60 -139.20,33.60,0.08,0.00,1.00,139.20,33.60 -144.00,33.60,0.12,0.00,1.00,144.00,28.80 -148.80,28.80,0.16,0.00,1.00,148.80,24.00 -153.60,24.00,0.20,0.00,1.00,153.60,24.00 -158.40,24.00,0.24,0.00,1.00,158.40,19.20 -163.20,19.20,0.28,0.00,1.00,158.40,14.40 -163.20,14.40,0.32,0.00,1.00,163.20,14.40 -168.00,14.40,0.36,0.00,1.00,168.00,9.60 -172.80,9.60,0.40,0.00,1.00,172.80,4.80 -172.80,4.80,0.44,0.00,1.00,172.80,0.00 -177.60,0.00,0.48,0.00,1.00,177.60,-0.00 --177.60,-0.00,0.52,0.00,1.00,-177.60,-4.80 --172.80,-4.80,0.56,0.00,1.00,-172.80,-9.60 --172.80,-9.60,0.60,0.00,1.00,-172.80,-14.40 --168.00,-14.40,0.64,0.00,1.00,-168.00,-14.40 --163.20,-14.40,0.68,0.00,1.00,-163.20,-19.20 --163.20,-19.20,0.72,0.00,1.00,-158.40,-24.00 --158.40,-24.00,0.76,0.00,1.00,-158.40,-24.00 --153.60,-24.00,0.80,0.00,1.00,-153.60,-28.80 --148.80,-28.80,0.84,0.00,1.00,-148.80,-33.60 --144.00,-33.60,0.88,0.00,1.00,-144.00,-33.60 --139.20,-33.60,0.92,0.00,1.00,-139.20,-38.40 --134.40,-38.40,0.96,0.00,1.00,-134.40,-38.40 --129.60,-38.40,1.00,0.00,1.00,-129.60,-43.20 --124.80,-43.20,1.04,0.00,1.00,-124.80,-43.20 --120.00,-43.20,1.08,0.00,1.00,-115.20,-48.00 --110.40,-43.20,1.12,0.00,1.00,-110.40,-48.00 --105.60,-48.00,1.16,0.00,1.00,-105.60,-48.00 --100.80,-48.00,1.20,0.00,1.00,-96.00,-48.00 --91.20,-48.00,1.24,0.00,1.00,-91.20,-48.00 --86.40,-48.00,1.28,0.00,1.00,-86.40,-48.00 --76.80,-48.00,1.32,0.00,1.00,-76.80,-48.00 --72.00,-43.20,1.36,0.00,1.00,-72.00,-43.20 --62.40,-43.20,1.40,0.00,1.00,-67.20,-43.20 --57.60,-43.20,1.44,0.00,1.00,-62.40,-43.20 --52.80,-38.40,1.48,0.00,1.00,-52.80,-38.40 --48.00,-38.40,1.52,0.00,1.00,-48.00,-38.40 --43.20,-33.60,1.56,0.00,1.00,-43.20,-33.60 --38.40,-33.60,1.60,0.00,1.00,-38.40,-28.80 --33.60,-28.80,1.64,0.00,1.00,-33.60,-28.80 --28.80,-28.80,1.68,0.00,1.00,-28.80,-24.00 --24.00,-24.00,1.72,0.00,1.00,-24.00,-19.20 --19.20,-19.20,1.76,0.00,1.00,-24.00,-19.20 --19.20,-19.20,1.80,0.00,1.00,-19.20,-14.40 --14.40,-14.40,1.84,0.00,1.00,-14.40,-9.60 --9.60,-9.60,1.88,0.00,1.00,-9.60,-4.80 --4.80,-4.80,1.92,0.00,1.00,-4.80,-4.80 --4.80,-4.80,1.96,0.00,1.00,-4.80,0.00 -0.00,0.00,2.01,0.00,1.00,0.00,4.80 -4.80,4.80,2.05,0.00,1.00,4.80,4.80 -4.80,4.80,2.09,0.00,1.00,4.80,9.60 -9.60,9.60,2.13,0.00,1.00,9.60,14.40 -14.40,14.40,2.17,0.00,1.00,14.40,14.40 -19.20,14.40,2.21,0.00,1.00,14.40,19.20 -24.00,19.20,2.25,0.00,1.00,19.20,24.00 -24.00,24.00,2.29,0.00,1.00,24.00,24.00 -28.80,24.00,2.33,0.00,1.00,28.80,28.80 -33.60,28.80,2.37,0.00,1.00,33.60,28.80 -38.40,28.80,2.41,0.00,1.00,38.40,33.60 -43.20,33.60,2.45,0.00,1.00,43.20,33.60 -48.00,33.60,2.49,0.00,1.00,48.00,38.40 -52.80,38.40,2.53,0.00,1.00,52.80,38.40 -62.40,38.40,2.57,0.00,1.00,57.60,38.40 -67.20,38.40,2.61,0.00,1.00,62.40,43.20 -72.00,38.40,2.65,0.00,1.00,72.00,43.20 -76.80,43.20,2.69,0.00,1.00,76.80,43.20 -86.40,43.20,2.73,0.00,1.00,86.40,43.20 -91.20,43.20,2.77,0.00,1.00,91.20,43.20 -96.00,43.20,2.81,0.00,1.00,100.80,43.20 -105.60,43.20,2.85,0.00,1.00,105.60,43.20 -110.40,38.40,2.89,0.00,1.00,110.40,38.40 -115.20,38.40,2.93,0.00,1.00,120.00,38.40 -120.00,38.40,2.97,0.00,1.00,124.80,38.40 -129.60,33.60,3.01,0.00,1.00,129.60,33.60 -134.40,33.60,3.05,0.00,1.00,134.40,33.60 -139.20,28.80,3.09,0.00,1.00,139.20,28.80 -144.00,28.80,3.13,0.00,1.00,144.00,28.80 -148.80,24.00,3.17,0.00,1.00,148.80,24.00 -153.60,24.00,3.21,0.00,1.00,153.60,19.20 -153.60,19.20,3.25,0.00,1.00,158.40,19.20 -158.40,19.20,3.29,0.00,1.00,163.20,14.40 -163.20,14.40,3.33,0.00,1.00,163.20,9.60 -168.00,9.60,3.37,0.00,1.00,168.00,9.60 -172.80,9.60,3.41,0.00,1.00,172.80,4.80 -172.80,4.80,3.45,0.00,1.00,172.80,0.00 -177.60,0.00,3.49,0.00,1.00,177.60,-0.00 --177.60,-0.00,3.53,0.00,1.00,-177.60,-4.80 --172.80,-4.80,3.57,0.00,1.00,-172.80,-9.60 --172.80,-9.60,3.61,0.00,1.00,-172.80,-9.60 --168.00,-9.60,3.65,0.00,1.00,-168.00,-14.40 --163.20,-14.40,3.69,0.00,1.00,-163.20,-19.20 --158.40,-19.20,3.73,0.00,1.00,-163.20,-19.20 --153.60,-19.20,3.77,0.00,1.00,-158.40,-24.00 --153.60,-24.00,3.81,0.00,1.00,-153.60,-28.80 --148.80,-24.00,3.85,0.00,1.00,-148.80,-28.80 --144.00,-28.80,3.89,0.00,1.00,-144.00,-33.60 --139.20,-28.80,3.93,0.00,1.00,-139.20,-33.60 --134.40,-33.60,3.97,0.00,1.00,-134.40,-38.40 --129.60,-33.60,4.01,0.00,1.00,-129.60,-38.40 --120.00,-38.40,4.05,0.00,1.00,-124.80,-38.40 --115.20,-38.40,4.09,0.00,1.00,-120.00,-43.20 --110.40,-38.40,4.13,0.00,1.00,-110.40,-43.20 --105.60,-43.20,4.17,0.00,1.00,-105.60,-43.20 --96.00,-43.20,4.21,0.00,1.00,-100.80,-43.20 --91.20,-43.20,4.25,0.00,1.00,-91.20,-43.20 --86.40,-43.20,4.29,0.00,1.00,-86.40,-43.20 --76.80,-43.20,4.33,0.00,1.00,-76.80,-43.20 --72.00,-38.40,4.37,0.00,1.00,-72.00,-38.40 --67.20,-38.40,4.41,0.00,1.00,-62.40,-38.40 --62.40,-38.40,4.45,0.00,1.00,-57.60,-38.40 --52.80,-38.40,4.49,0.00,1.00,-52.80,-33.60 --48.00,-33.60,4.53,0.00,1.00,-48.00,-33.60 --43.20,-33.60,4.57,0.00,1.00,-43.20,-28.80 --38.40,-28.80,4.61,0.00,1.00,-38.40,-28.80 --33.60,-28.80,4.65,0.00,1.00,-33.60,-24.00 --28.80,-24.00,4.69,0.00,1.00,-28.80,-24.00 --24.00,-24.00,4.73,0.00,1.00,-24.00,-19.20 --24.00,-19.20,4.77,0.00,1.00,-19.20,-14.40 --19.20,-14.40,4.81,0.00,1.00,-14.40,-14.40 --14.40,-14.40,4.85,0.00,1.00,-14.40,-9.60 --9.60,-9.60,4.89,0.00,1.00,-9.60,-4.80 --4.80,-4.80,4.93,0.00,1.00,-4.80,-4.80 --4.80,-4.80,4.97,0.00,1.00,-4.80,0.00 -0.00,0.00,5.01,0.00,1.00,0.00,4.80 -4.80,4.80,5.05,0.00,1.00,4.80,4.80 -9.60,4.80,5.09,0.00,1.00,4.80,9.60 -9.60,9.60,5.13,0.00,1.00,9.60,9.60 -14.40,9.60,5.17,0.00,1.00,9.60,14.40 -19.20,14.40,5.21,0.00,1.00,14.40,19.20 -24.00,19.20,5.25,0.00,1.00,19.20,19.20 -28.80,19.20,5.29,0.00,1.00,24.00,24.00 -33.60,24.00,5.33,0.00,1.00,24.00,24.00 -38.40,24.00,5.37,0.00,1.00,28.80,28.80 -43.20,28.80,5.41,0.00,1.00,33.60,28.80 -48.00,28.80,5.45,0.00,1.00,38.40,33.60 -52.80,28.80,5.49,0.00,1.00,43.20,33.60 -57.60,33.60,5.53,0.00,1.00,48.00,33.60 -62.40,33.60,5.57,0.00,1.00,52.80,38.40 -67.20,33.60,5.61,0.00,1.00,62.40,38.40 -72.00,38.40,5.65,0.00,1.00,67.20,38.40 -81.60,38.40,5.69,0.00,1.00,76.80,38.40 -86.40,38.40,5.73,0.00,1.00,86.40,38.40 -91.20,38.40,5.77,0.00,1.00,91.20,38.40 -96.00,38.40,5.81,0.00,1.00,100.80,38.40 -105.60,38.40,5.85,0.00,1.00,105.60,38.40 -110.40,33.60,5.89,0.00,1.00,115.20,33.60 -115.20,33.60,5.93,0.00,1.00,120.00,33.60 -120.00,33.60,5.97,0.00,1.00,129.60,33.60 -124.80,33.60,6.02,0.00,1.00,134.40,28.80 -129.60,28.80,6.06,0.00,1.00,139.20,28.80 -134.40,28.80,6.10,0.00,1.00,144.00,24.00 -139.20,24.00,6.14,0.00,1.00,148.80,24.00 -144.00,24.00,6.18,0.00,1.00,153.60,19.20 -148.80,19.20,6.22,0.00,1.00,158.40,19.20 -153.60,19.20,6.26,0.00,1.00,158.40,14.40 -158.40,14.40,6.30,0.00,1.00,163.20,14.40 -163.20,14.40,6.34,0.00,1.00,168.00,9.60 -168.00,9.60,6.38,0.00,1.00,168.00,9.60 -168.00,9.60,6.42,0.00,1.00,172.80,4.80 -172.80,4.80,6.46,0.00,1.00,177.60,0.00 -177.60,0.00,6.50,0.00,1.00,177.60,-0.00 --177.60,-0.00,6.54,0.00,1.00,-177.60,-4.80 --172.80,-4.80,6.58,0.00,1.00,-177.60,-9.60 --168.00,-9.60,6.62,0.00,1.00,-172.80,-9.60 --168.00,-9.60,6.66,0.00,1.00,-168.00,-14.40 --163.20,-14.40,6.70,0.00,1.00,-168.00,-14.40 --158.40,-14.40,6.74,0.00,1.00,-163.20,-19.20 --153.60,-19.20,6.78,0.00,1.00,-158.40,-19.20 --148.80,-19.20,6.82,0.00,1.00,-158.40,-24.00 --144.00,-24.00,6.86,0.00,1.00,-153.60,-24.00 --139.20,-24.00,6.90,0.00,1.00,-148.80,-28.80 --134.40,-28.80,6.94,0.00,1.00,-144.00,-28.80 --129.60,-28.80,6.98,0.00,1.00,-139.20,-33.60 --124.80,-33.60,7.02,0.00,1.00,-134.40,-33.60 --120.00,-33.60,7.06,0.00,1.00,-129.60,-33.60 --115.20,-33.60,7.10,0.00,1.00,-120.00,-38.40 --110.40,-33.60,7.14,0.00,1.00,-115.20,-38.40 --105.60,-38.40,7.18,0.00,1.00,-105.60,-38.40 --96.00,-38.40,7.22,0.00,1.00,-100.80,-38.40 --91.20,-38.40,7.26,0.00,1.00,-91.20,-38.40 --86.40,-38.40,7.30,0.00,1.00,-86.40,-38.40 --81.60,-38.40,7.34,0.00,1.00,-76.80,-38.40 --72.00,-38.40,7.38,0.00,1.00,-67.20,-38.40 --67.20,-33.60,7.42,0.00,1.00,-62.40,-33.60 --62.40,-33.60,7.46,0.00,1.00,-52.80,-33.60 --57.60,-33.60,7.50,0.00,1.00,-48.00,-33.60 --52.80,-28.80,7.54,0.00,1.00,-43.20,-28.80 --48.00,-28.80,7.58,0.00,1.00,-38.40,-28.80 --43.20,-28.80,7.62,0.00,1.00,-33.60,-24.00 --38.40,-24.00,7.66,0.00,1.00,-28.80,-24.00 --33.60,-24.00,7.70,0.00,1.00,-24.00,-19.20 --28.80,-19.20,7.74,0.00,1.00,-24.00,-19.20 --24.00,-19.20,7.78,0.00,1.00,-19.20,-14.40 --19.20,-14.40,7.82,0.00,1.00,-14.40,-9.60 --14.40,-9.60,7.86,0.00,1.00,-9.60,-9.60 --9.60,-9.60,7.90,0.00,1.00,-9.60,-4.80 --9.60,-4.80,7.94,0.00,1.00,-4.80,-4.80 --4.80,-4.80,7.98,0.00,1.00,-4.80,0.00 -0.00,0.00,8.02,0.00,1.00,0.00,4.80 -4.80,4.80,8.06,0.00,1.00,4.80,4.80 -9.60,4.80,8.10,0.00,1.00,4.80,9.60 -14.40,9.60,8.14,0.00,1.00,9.60,9.60 -14.40,9.60,8.18,0.00,1.00,9.60,14.40 -19.20,14.40,8.22,0.00,1.00,14.40,14.40 -24.00,14.40,8.26,0.00,1.00,14.40,19.20 -28.80,19.20,8.30,0.00,1.00,19.20,19.20 -33.60,19.20,8.34,0.00,1.00,24.00,24.00 -38.40,19.20,8.38,0.00,1.00,28.80,24.00 -43.20,24.00,8.42,0.00,1.00,28.80,24.00 -48.00,24.00,8.46,0.00,1.00,33.60,28.80 -52.80,28.80,8.50,0.00,1.00,38.40,28.80 -57.60,28.80,8.54,0.00,1.00,48.00,28.80 -62.40,28.80,8.58,0.00,1.00,52.80,33.60 -67.20,28.80,8.62,0.00,1.00,57.60,33.60 -76.80,33.60,8.66,0.00,1.00,67.20,33.60 -81.60,33.60,8.70,0.00,1.00,76.80,33.60 -86.40,33.60,8.74,0.00,1.00,81.60,33.60 -91.20,33.60,8.78,0.00,1.00,91.20,33.60 -96.00,33.60,8.82,0.00,1.00,100.80,33.60 -100.80,33.60,8.86,0.00,1.00,110.40,33.60 -110.40,28.80,8.90,0.00,1.00,115.20,33.60 -115.20,28.80,8.94,0.00,1.00,124.80,28.80 -120.00,28.80,8.98,0.00,1.00,129.60,28.80 -124.80,28.80,9.02,0.00,1.00,139.20,28.80 -129.60,24.00,9.06,0.00,1.00,144.00,24.00 -134.40,24.00,9.10,0.00,1.00,148.80,24.00 -139.20,24.00,9.14,0.00,1.00,153.60,19.20 -144.00,19.20,9.18,0.00,1.00,153.60,19.20 -148.80,19.20,9.22,0.00,1.00,158.40,14.40 -153.60,14.40,9.26,0.00,1.00,163.20,14.40 -158.40,14.40,9.30,0.00,1.00,163.20,9.60 -163.20,9.60,9.34,0.00,1.00,168.00,9.60 -168.00,9.60,9.38,0.00,1.00,172.80,4.80 -168.00,4.80,9.42,0.00,1.00,172.80,4.80 -172.80,4.80,9.46,0.00,1.00,177.60,0.00 -177.60,0.00,9.50,0.00,1.00,177.60,-0.00 --177.60,-0.00,9.54,0.00,1.00,-177.60,-4.80 --172.80,-4.80,9.58,0.00,1.00,-177.60,-4.80 --168.00,-4.80,9.62,0.00,1.00,-172.80,-9.60 --168.00,-9.60,9.66,0.00,1.00,-172.80,-9.60 --163.20,-9.60,9.70,0.00,1.00,-168.00,-14.40 --158.40,-14.40,9.74,0.00,1.00,-163.20,-14.40 --153.60,-14.40,9.78,0.00,1.00,-163.20,-19.20 --148.80,-19.20,9.82,0.00,1.00,-158.40,-19.20 --144.00,-19.20,9.86,0.00,1.00,-153.60,-24.00 --139.20,-24.00,9.90,0.00,1.00,-153.60,-24.00 --134.40,-24.00,9.94,0.00,1.00,-148.80,-28.80 --129.60,-24.00,9.98,0.00,1.00,-144.00,-28.80 --124.80,-28.80,10.03,0.00,1.00,-139.20,-28.80 --120.00,-28.80,10.07,0.00,1.00,-129.60,-33.60 --115.20,-28.80,10.11,0.00,1.00,-124.80,-33.60 --110.40,-28.80,10.15,0.00,1.00,-115.20,-33.60 --100.80,-33.60,10.19,0.00,1.00,-110.40,-33.60 --96.00,-33.60,10.23,0.00,1.00,-100.80,-33.60 --91.20,-33.60,10.27,0.00,1.00,-91.20,-33.60 --86.40,-33.60,10.31,0.00,1.00,-81.60,-33.60 --81.60,-33.60,10.35,0.00,1.00,-76.80,-33.60 --76.80,-33.60,10.39,0.00,1.00,-67.20,-33.60 --67.20,-28.80,10.43,0.00,1.00,-57.60,-28.80 --62.40,-28.80,10.47,0.00,1.00,-52.80,-28.80 --57.60,-28.80,10.51,0.00,1.00,-48.00,-28.80 --52.80,-28.80,10.55,0.00,1.00,-38.40,-24.00 --48.00,-24.00,10.59,0.00,1.00,-33.60,-24.00 --43.20,-24.00,10.63,0.00,1.00,-28.80,-24.00 --38.40,-19.20,10.67,0.00,1.00,-28.80,-19.20 --33.60,-19.20,10.71,0.00,1.00,-24.00,-19.20 --28.80,-19.20,10.75,0.00,1.00,-19.20,-14.40 --24.00,-14.40,10.79,0.00,1.00,-14.40,-14.40 --19.20,-14.40,10.83,0.00,1.00,-14.40,-9.60 --14.40,-9.60,10.87,0.00,1.00,-9.60,-9.60 --14.40,-9.60,10.91,0.00,1.00,-9.60,-4.80 --9.60,-4.80,10.95,0.00,1.00,-4.80,-4.80 --4.80,-4.80,10.99,0.00,1.00,-4.80,0.00 -0.00,0.00,11.03,0.00,1.00,0.00,0.00 -4.80,0.00,11.07,0.00,1.00,0.00,4.80 -9.60,4.80,11.11,0.00,1.00,4.80,4.80 -14.40,4.80,11.15,0.00,1.00,4.80,9.60 -19.20,9.60,11.19,0.00,1.00,9.60,9.60 -19.20,9.60,11.23,0.00,1.00,9.60,14.40 -24.00,14.40,11.27,0.00,1.00,14.40,14.40 -28.80,14.40,11.31,0.00,1.00,19.20,19.20 -33.60,14.40,11.35,0.00,1.00,19.20,19.20 -38.40,19.20,11.39,0.00,1.00,24.00,19.20 -43.20,19.20,11.43,0.00,1.00,28.80,24.00 -48.00,24.00,11.47,0.00,1.00,33.60,24.00 -52.80,24.00,11.51,0.00,1.00,38.40,24.00 -57.60,24.00,11.55,0.00,1.00,43.20,24.00 -62.40,24.00,11.59,0.00,1.00,48.00,28.80 -72.00,24.00,11.63,0.00,1.00,52.80,28.80 -76.80,28.80,11.67,0.00,1.00,62.40,28.80 -81.60,28.80,11.71,0.00,1.00,72.00,28.80 -86.40,28.80,11.75,0.00,1.00,81.60,28.80 -91.20,28.80,11.79,0.00,1.00,91.20,28.80 -96.00,28.80,11.83,0.00,1.00,100.80,28.80 -100.80,28.80,11.87,0.00,1.00,110.40,28.80 -105.60,28.80,11.91,0.00,1.00,120.00,28.80 -110.40,24.00,11.95,0.00,1.00,129.60,24.00 -120.00,24.00,11.99,0.00,1.00,134.40,24.00 -124.80,24.00,12.03,0.00,1.00,139.20,24.00 -129.60,24.00,12.07,0.00,1.00,144.00,24.00 -134.40,19.20,12.11,0.00,1.00,148.80,19.20 -139.20,19.20,12.15,0.00,1.00,153.60,19.20 -144.00,19.20,12.19,0.00,1.00,158.40,14.40 -148.80,14.40,12.23,0.00,1.00,163.20,14.40 -153.60,14.40,12.27,0.00,1.00,163.20,14.40 -158.40,9.60,12.31,0.00,1.00,168.00,9.60 -158.40,9.60,12.35,0.00,1.00,168.00,9.60 -163.20,9.60,12.39,0.00,1.00,172.80,4.80 -168.00,4.80,12.43,0.00,1.00,172.80,4.80 -172.80,4.80,12.47,0.00,1.00,177.60,0.00 -177.60,0.00,12.51,0.00,1.00,177.60,-0.00 --177.60,-0.00,12.55,0.00,1.00,-177.60,-4.80 --172.80,-4.80,12.59,0.00,1.00,-177.60,-4.80 --168.00,-4.80,12.63,0.00,1.00,-172.80,-9.60 --163.20,-9.60,12.67,0.00,1.00,-172.80,-9.60 --158.40,-9.60,12.71,0.00,1.00,-168.00,-14.40 --158.40,-9.60,12.75,0.00,1.00,-168.00,-14.40 --153.60,-14.40,12.79,0.00,1.00,-163.20,-14.40 --148.80,-14.40,12.83,0.00,1.00,-163.20,-19.20 --144.00,-19.20,12.87,0.00,1.00,-158.40,-19.20 --139.20,-19.20,12.91,0.00,1.00,-153.60,-24.00 --134.40,-19.20,12.95,0.00,1.00,-148.80,-24.00 --129.60,-24.00,12.99,0.00,1.00,-144.00,-24.00 --124.80,-24.00,13.03,0.00,1.00,-139.20,-24.00 --120.00,-24.00,13.07,0.00,1.00,-134.40,-28.80 --110.40,-24.00,13.11,0.00,1.00,-129.60,-28.80 --105.60,-28.80,13.15,0.00,1.00,-120.00,-28.80 --100.80,-28.80,13.19,0.00,1.00,-110.40,-28.80 --96.00,-28.80,13.23,0.00,1.00,-100.80,-28.80 --91.20,-28.80,13.27,0.00,1.00,-91.20,-28.80 --86.40,-28.80,13.31,0.00,1.00,-81.60,-28.80 --81.60,-28.80,13.35,0.00,1.00,-72.00,-28.80 --76.80,-28.80,13.39,0.00,1.00,-62.40,-28.80 --72.00,-24.00,13.43,0.00,1.00,-52.80,-24.00 --62.40,-24.00,13.47,0.00,1.00,-48.00,-24.00 --57.60,-24.00,13.51,0.00,1.00,-43.20,-24.00 --52.80,-24.00,13.55,0.00,1.00,-38.40,-24.00 --48.00,-24.00,13.59,0.00,1.00,-33.60,-19.20 --43.20,-19.20,13.63,0.00,1.00,-28.80,-19.20 --38.40,-19.20,13.67,0.00,1.00,-24.00,-19.20 --33.60,-14.40,13.71,0.00,1.00,-19.20,-14.40 --28.80,-14.40,13.75,0.00,1.00,-19.20,-14.40 --24.00,-14.40,13.79,0.00,1.00,-14.40,-9.60 --19.20,-9.60,13.83,0.00,1.00,-9.60,-9.60 --19.20,-9.60,13.87,0.00,1.00,-9.60,-4.80 --14.40,-4.80,13.91,0.00,1.00,-4.80,-4.80 --9.60,-4.80,13.95,0.00,1.00,-4.80,-0.00 --4.80,-0.00,13.99,0.00,1.00,-0.00,0.00 -0.00,0.00,14.04,0.00,1.00,0.00,0.00 -4.80,0.00,14.08,0.00,1.00,0.00,4.80 -9.60,4.80,14.12,0.00,1.00,4.80,4.80 -14.40,4.80,14.16,0.00,1.00,4.80,9.60 -19.20,9.60,14.20,0.00,1.00,9.60,9.60 -24.00,9.60,14.24,0.00,1.00,9.60,9.60 -28.80,9.60,14.28,0.00,1.00,14.40,14.40 -33.60,14.40,14.32,0.00,1.00,14.40,14.40 -38.40,14.40,14.36,0.00,1.00,19.20,14.40 -43.20,14.40,14.40,0.00,1.00,19.20,19.20 -48.00,14.40,14.44,0.00,1.00,24.00,19.20 -52.80,19.20,14.48,0.00,1.00,28.80,19.20 -57.60,19.20,14.52,0.00,1.00,33.60,19.20 -62.40,19.20,14.56,0.00,1.00,38.40,24.00 -67.20,19.20,14.60,0.00,1.00,43.20,24.00 -72.00,24.00,14.64,0.00,1.00,48.00,24.00 -76.80,24.00,14.68,0.00,1.00,57.60,24.00 -81.60,24.00,14.72,0.00,1.00,67.20,24.00 -86.40,24.00,14.76,0.00,1.00,81.60,24.00 -91.20,24.00,14.80,0.00,1.00,91.20,24.00 -96.00,24.00,14.84,0.00,1.00,105.60,24.00 -100.80,24.00,14.88,0.00,1.00,115.20,24.00 -105.60,24.00,14.92,0.00,1.00,124.80,24.00 -110.40,19.20,14.96,0.00,1.00,134.40,19.20 -115.20,19.20,15.00,0.00,1.00,139.20,19.20 -120.00,19.20,15.04,0.00,1.00,144.00,19.20 -124.80,19.20,15.08,0.00,1.00,148.80,19.20 -129.60,19.20,15.12,0.00,1.00,153.60,19.20 -134.40,14.40,15.16,0.00,1.00,158.40,14.40 -139.20,14.40,15.20,0.00,1.00,163.20,14.40 -144.00,14.40,15.24,0.00,1.00,163.20,14.40 -148.80,9.60,15.28,0.00,1.00,168.00,9.60 -153.60,9.60,15.32,0.00,1.00,168.00,9.60 -158.40,9.60,15.36,0.00,1.00,172.80,4.80 -163.20,4.80,15.40,0.00,1.00,172.80,4.80 -168.00,4.80,15.44,0.00,1.00,177.60,4.80 -172.80,4.80,15.48,0.00,1.00,177.60,0.00 -177.60,0.00,15.52,0.00,1.00,177.60,-0.00 --177.60,-0.00,15.56,0.00,1.00,-177.60,-4.80 --172.80,-4.80,15.60,0.00,1.00,-177.60,-4.80 --168.00,-4.80,15.64,0.00,1.00,-177.60,-4.80 --163.20,-4.80,15.68,0.00,1.00,-172.80,-9.60 --158.40,-9.60,15.72,0.00,1.00,-172.80,-9.60 --153.60,-9.60,15.76,0.00,1.00,-168.00,-14.40 --148.80,-9.60,15.80,0.00,1.00,-168.00,-14.40 --144.00,-14.40,15.84,0.00,1.00,-163.20,-14.40 --139.20,-14.40,15.88,0.00,1.00,-163.20,-19.20 --134.40,-14.40,15.92,0.00,1.00,-158.40,-19.20 --129.60,-19.20,15.96,0.00,1.00,-153.60,-19.20 --124.80,-19.20,16.00,0.00,1.00,-148.80,-19.20 --120.00,-19.20,16.00,0.00,1.00,-144.00,-19.20 --115.20,-19.20,15.96,0.00,1.00,-139.20,-24.00 --110.40,-19.20,15.92,0.00,1.00,-134.40,-24.00 --105.60,-24.00,15.88,0.00,1.00,-124.80,-24.00 --100.80,-24.00,15.84,0.00,1.00,-115.20,-24.00 --96.00,-24.00,15.80,0.00,1.00,-105.60,-24.00 --91.20,-24.00,15.76,0.00,1.00,-91.20,-24.00 --86.40,-24.00,15.72,0.00,1.00,-81.60,-24.00 --81.60,-24.00,15.68,0.00,1.00,-67.20,-24.00 --76.80,-24.00,15.64,0.00,1.00,-57.60,-24.00 --72.00,-24.00,15.60,0.00,1.00,-48.00,-24.00 --67.20,-19.20,15.56,0.00,1.00,-43.20,-19.20 --62.40,-19.20,15.52,0.00,1.00,-38.40,-19.20 --57.60,-19.20,15.48,0.00,1.00,-33.60,-19.20 --52.80,-19.20,15.44,0.00,1.00,-28.80,-19.20 --48.00,-14.40,15.40,0.00,1.00,-24.00,-14.40 --43.20,-14.40,15.36,0.00,1.00,-19.20,-14.40 --38.40,-14.40,15.32,0.00,1.00,-19.20,-14.40 --33.60,-14.40,15.28,0.00,1.00,-14.40,-9.60 --28.80,-9.60,15.24,0.00,1.00,-14.40,-9.60 --24.00,-9.60,15.20,0.00,1.00,-9.60,-9.60 --19.20,-9.60,15.16,0.00,1.00,-9.60,-4.80 --14.40,-4.80,15.12,0.00,1.00,-4.80,-4.80 --9.60,-4.80,15.08,0.00,1.00,-4.80,-0.00 --4.80,-0.00,15.04,0.00,1.00,-0.00,0.00 -0.00,0.00,15.00,0.00,1.00,0.00,0.00 -4.80,0.00,14.96,0.00,1.00,0.00,4.80 -9.60,4.80,14.92,0.00,1.00,4.80,4.80 -14.40,4.80,14.88,0.00,1.00,4.80,4.80 -19.20,4.80,14.84,0.00,1.00,4.80,9.60 -24.00,9.60,14.80,0.00,1.00,9.60,9.60 -28.80,9.60,14.76,0.00,1.00,9.60,9.60 -33.60,9.60,14.72,0.00,1.00,9.60,9.60 -38.40,9.60,14.68,0.00,1.00,14.40,14.40 -43.20,14.40,14.64,0.00,1.00,14.40,14.40 -48.00,14.40,14.60,0.00,1.00,19.20,14.40 -52.80,14.40,14.56,0.00,1.00,24.00,14.40 -57.60,14.40,14.52,0.00,1.00,24.00,19.20 -62.40,14.40,14.48,0.00,1.00,28.80,19.20 -67.20,14.40,14.44,0.00,1.00,38.40,19.20 -72.00,19.20,14.40,0.00,1.00,43.20,19.20 -76.80,19.20,14.36,0.00,1.00,52.80,19.20 -81.60,19.20,14.32,0.00,1.00,62.40,19.20 -86.40,19.20,14.28,0.00,1.00,76.80,19.20 -91.20,19.20,14.24,0.00,1.00,96.00,19.20 -96.00,19.20,14.20,0.00,1.00,110.40,19.20 -100.80,19.20,14.16,0.00,1.00,120.00,19.20 -105.60,19.20,14.12,0.00,1.00,134.40,19.20 -110.40,19.20,14.08,0.00,1.00,139.20,19.20 -115.20,14.40,14.04,0.00,1.00,148.80,14.40 -120.00,14.40,13.99,0.00,1.00,153.60,14.40 -124.80,14.40,13.95,0.00,1.00,158.40,14.40 -129.60,14.40,13.91,0.00,1.00,158.40,14.40 -134.40,14.40,13.87,0.00,1.00,163.20,14.40 -139.20,9.60,13.83,0.00,1.00,163.20,9.60 -144.00,9.60,13.79,0.00,1.00,168.00,9.60 -148.80,9.60,13.75,0.00,1.00,168.00,9.60 -153.60,9.60,13.71,0.00,1.00,172.80,4.80 -158.40,4.80,13.67,0.00,1.00,172.80,4.80 -163.20,4.80,13.63,0.00,1.00,172.80,4.80 -168.00,4.80,13.59,0.00,1.00,177.60,0.00 -172.80,0.00,13.55,0.00,1.00,177.60,0.00 -177.60,0.00,13.51,0.00,1.00,177.60,-0.00 --177.60,-0.00,13.47,0.00,1.00,-177.60,-0.00 --172.80,-0.00,13.43,0.00,1.00,-177.60,-4.80 --168.00,-4.80,13.39,0.00,1.00,-177.60,-4.80 --163.20,-4.80,13.35,0.00,1.00,-172.80,-4.80 --158.40,-4.80,13.31,0.00,1.00,-172.80,-9.60 --153.60,-9.60,13.27,0.00,1.00,-172.80,-9.60 --148.80,-9.60,13.23,0.00,1.00,-168.00,-9.60 --144.00,-9.60,13.19,0.00,1.00,-168.00,-14.40 --139.20,-9.60,13.15,0.00,1.00,-163.20,-14.40 --134.40,-14.40,13.11,0.00,1.00,-163.20,-14.40 --129.60,-14.40,13.07,0.00,1.00,-158.40,-14.40 --124.80,-14.40,13.03,0.00,1.00,-158.40,-14.40 --120.00,-14.40,12.99,0.00,1.00,-153.60,-19.20 --115.20,-14.40,12.95,0.00,1.00,-148.80,-19.20 --110.40,-19.20,12.91,0.00,1.00,-139.20,-19.20 --105.60,-19.20,12.87,0.00,1.00,-134.40,-19.20 --100.80,-19.20,12.83,0.00,1.00,-120.00,-19.20 --96.00,-19.20,12.79,0.00,1.00,-110.40,-19.20 --91.20,-19.20,12.75,0.00,1.00,-96.00,-19.20 --86.40,-19.20,12.71,0.00,1.00,-76.80,-19.20 --81.60,-19.20,12.67,0.00,1.00,-62.40,-19.20 --76.80,-19.20,12.63,0.00,1.00,-52.80,-19.20 --72.00,-19.20,12.59,0.00,1.00,-43.20,-19.20 --67.20,-14.40,12.55,0.00,1.00,-38.40,-19.20 --62.40,-14.40,12.51,0.00,1.00,-28.80,-14.40 --57.60,-14.40,12.47,0.00,1.00,-24.00,-14.40 --52.80,-14.40,12.43,0.00,1.00,-24.00,-14.40 --48.00,-14.40,12.39,0.00,1.00,-19.20,-14.40 --43.20,-14.40,12.35,0.00,1.00,-14.40,-9.60 --38.40,-9.60,12.31,0.00,1.00,-14.40,-9.60 --33.60,-9.60,12.27,0.00,1.00,-9.60,-9.60 --28.80,-9.60,12.23,0.00,1.00,-9.60,-9.60 --24.00,-9.60,12.19,0.00,1.00,-9.60,-4.80 --19.20,-4.80,12.15,0.00,1.00,-4.80,-4.80 --14.40,-4.80,12.11,0.00,1.00,-4.80,-4.80 --9.60,-4.80,12.07,0.00,1.00,-4.80,-0.00 --4.80,-0.00,12.03,0.00,1.00,-0.00,0.00 -0.00,0.00,11.99,0.00,1.00,0.00,0.00 -4.80,0.00,11.95,0.00,1.00,0.00,0.00 -9.60,0.00,11.91,0.00,1.00,0.00,4.80 -14.40,4.80,11.87,0.00,1.00,4.80,4.80 -19.20,4.80,11.83,0.00,1.00,4.80,4.80 -24.00,4.80,11.79,0.00,1.00,4.80,4.80 -28.80,4.80,11.75,0.00,1.00,4.80,9.60 -33.60,9.60,11.71,0.00,1.00,9.60,9.60 -38.40,9.60,11.67,0.00,1.00,9.60,9.60 -43.20,9.60,11.63,0.00,1.00,14.40,9.60 -48.00,9.60,11.59,0.00,1.00,14.40,9.60 -52.80,9.60,11.55,0.00,1.00,14.40,14.40 -57.60,9.60,11.51,0.00,1.00,19.20,14.40 -62.40,9.60,11.47,0.00,1.00,24.00,14.40 -67.20,14.40,11.43,0.00,1.00,28.80,14.40 -72.00,14.40,11.39,0.00,1.00,33.60,14.40 -76.80,14.40,11.35,0.00,1.00,43.20,14.40 -81.60,14.40,11.31,0.00,1.00,57.60,14.40 -86.40,14.40,11.27,0.00,1.00,76.80,14.40 -91.20,14.40,11.23,0.00,1.00,96.00,14.40 -96.00,14.40,11.19,0.00,1.00,115.20,14.40 -100.80,14.40,11.15,0.00,1.00,129.60,14.40 -105.60,14.40,11.11,0.00,1.00,139.20,14.40 -110.40,14.40,11.07,0.00,1.00,148.80,14.40 -115.20,9.60,11.03,0.00,1.00,153.60,14.40 -120.00,9.60,10.99,0.00,1.00,158.40,9.60 -124.80,9.60,10.95,0.00,1.00,163.20,9.60 -129.60,9.60,10.91,0.00,1.00,163.20,9.60 -134.40,9.60,10.87,0.00,1.00,168.00,9.60 -139.20,9.60,10.83,0.00,1.00,168.00,9.60 -144.00,9.60,10.79,0.00,1.00,172.80,9.60 -148.80,4.80,10.75,0.00,1.00,172.80,4.80 -153.60,4.80,10.71,0.00,1.00,172.80,4.80 -158.40,4.80,10.67,0.00,1.00,172.80,4.80 -163.20,4.80,10.63,0.00,1.00,177.60,4.80 -168.00,4.80,10.59,0.00,1.00,177.60,0.00 -172.80,0.00,10.55,0.00,1.00,177.60,0.00 -177.60,0.00,10.51,0.00,1.00,177.60,-0.00 --177.60,-0.00,10.47,0.00,1.00,-177.60,-0.00 --172.80,-0.00,10.43,0.00,1.00,-177.60,-4.80 --168.00,-4.80,10.39,0.00,1.00,-177.60,-4.80 --163.20,-4.80,10.35,0.00,1.00,-177.60,-4.80 --158.40,-4.80,10.31,0.00,1.00,-172.80,-4.80 --153.60,-4.80,10.27,0.00,1.00,-172.80,-9.60 --148.80,-4.80,10.23,0.00,1.00,-172.80,-9.60 --144.00,-9.60,10.19,0.00,1.00,-172.80,-9.60 --139.20,-9.60,10.15,0.00,1.00,-168.00,-9.60 --134.40,-9.60,10.11,0.00,1.00,-168.00,-9.60 --129.60,-9.60,10.07,0.00,1.00,-163.20,-9.60 --124.80,-9.60,10.03,0.00,1.00,-163.20,-14.40 --120.00,-9.60,9.98,0.00,1.00,-158.40,-14.40 --115.20,-9.60,9.94,0.00,1.00,-153.60,-14.40 --110.40,-14.40,9.90,0.00,1.00,-148.80,-14.40 --105.60,-14.40,9.86,0.00,1.00,-139.20,-14.40 --100.80,-14.40,9.82,0.00,1.00,-129.60,-14.40 --96.00,-14.40,9.78,0.00,1.00,-115.20,-14.40 --91.20,-14.40,9.74,0.00,1.00,-96.00,-14.40 --86.40,-14.40,9.70,0.00,1.00,-76.80,-14.40 --81.60,-14.40,9.66,0.00,1.00,-57.60,-14.40 --76.80,-14.40,9.62,0.00,1.00,-43.20,-14.40 --72.00,-14.40,9.58,0.00,1.00,-33.60,-14.40 --67.20,-14.40,9.54,0.00,1.00,-28.80,-14.40 --62.40,-9.60,9.50,0.00,1.00,-24.00,-14.40 --57.60,-9.60,9.46,0.00,1.00,-19.20,-9.60 --52.80,-9.60,9.42,0.00,1.00,-14.40,-9.60 --48.00,-9.60,9.38,0.00,1.00,-14.40,-9.60 --43.20,-9.60,9.34,0.00,1.00,-14.40,-9.60 --38.40,-9.60,9.30,0.00,1.00,-9.60,-9.60 --33.60,-9.60,9.26,0.00,1.00,-9.60,-4.80 --28.80,-4.80,9.22,0.00,1.00,-4.80,-4.80 --24.00,-4.80,9.18,0.00,1.00,-4.80,-4.80 --19.20,-4.80,9.14,0.00,1.00,-4.80,-4.80 --14.40,-4.80,9.10,0.00,1.00,-4.80,-0.00 --9.60,-0.00,9.06,0.00,1.00,-0.00,-0.00 --4.80,-0.00,9.02,0.00,1.00,-0.00,0.00 -0.00,0.00,8.98,0.00,1.00,0.00,0.00 -4.80,0.00,8.94,0.00,1.00,0.00,0.00 -9.60,0.00,8.90,0.00,1.00,0.00,0.00 -14.40,0.00,8.86,0.00,1.00,0.00,4.80 -19.20,4.80,8.82,0.00,1.00,4.80,4.80 -24.00,4.80,8.78,0.00,1.00,4.80,4.80 -28.80,4.80,8.74,0.00,1.00,4.80,4.80 -33.60,4.80,8.70,0.00,1.00,4.80,4.80 -38.40,4.80,8.66,0.00,1.00,4.80,4.80 -43.20,4.80,8.62,0.00,1.00,9.60,4.80 -48.00,4.80,8.58,0.00,1.00,9.60,9.60 -52.80,4.80,8.54,0.00,1.00,9.60,9.60 -57.60,4.80,8.50,0.00,1.00,14.40,9.60 -62.40,9.60,8.46,0.00,1.00,14.40,9.60 -67.20,9.60,8.42,0.00,1.00,19.20,9.60 -72.00,9.60,8.38,0.00,1.00,24.00,9.60 -76.80,9.60,8.34,0.00,1.00,33.60,9.60 -81.60,9.60,8.30,0.00,1.00,43.20,9.60 -86.40,9.60,8.26,0.00,1.00,67.20,9.60 -91.20,9.60,8.22,0.00,1.00,96.00,9.60 -96.00,9.60,8.18,0.00,1.00,124.80,9.60 -100.80,9.60,8.14,0.00,1.00,144.00,9.60 -105.60,9.60,8.10,0.00,1.00,153.60,9.60 -110.40,9.60,8.06,0.00,1.00,158.40,9.60 -115.20,9.60,8.02,0.00,1.00,163.20,9.60 -120.00,9.60,7.98,0.00,1.00,168.00,9.60 -124.80,4.80,7.94,0.00,1.00,168.00,9.60 -129.60,4.80,7.90,0.00,1.00,168.00,4.80 -134.40,4.80,7.86,0.00,1.00,172.80,4.80 -139.20,4.80,7.82,0.00,1.00,172.80,4.80 -144.00,4.80,7.78,0.00,1.00,172.80,4.80 -148.80,4.80,7.74,0.00,1.00,172.80,4.80 -153.60,4.80,7.70,0.00,1.00,177.60,4.80 -158.40,4.80,7.66,0.00,1.00,177.60,4.80 -163.20,4.80,7.62,0.00,1.00,177.60,0.00 -168.00,0.00,7.58,0.00,1.00,177.60,0.00 -172.80,0.00,7.54,0.00,1.00,177.60,0.00 -177.60,0.00,7.50,0.00,1.00,177.60,-0.00 --177.60,-0.00,7.46,0.00,1.00,-177.60,-0.00 --172.80,-0.00,7.42,0.00,1.00,-177.60,-0.00 --168.00,-0.00,7.38,0.00,1.00,-177.60,-4.80 --163.20,-4.80,7.34,0.00,1.00,-177.60,-4.80 --158.40,-4.80,7.30,0.00,1.00,-177.60,-4.80 --153.60,-4.80,7.26,0.00,1.00,-177.60,-4.80 --148.80,-4.80,7.22,0.00,1.00,-172.80,-4.80 --144.00,-4.80,7.18,0.00,1.00,-172.80,-4.80 --139.20,-4.80,7.14,0.00,1.00,-172.80,-4.80 --134.40,-4.80,7.10,0.00,1.00,-172.80,-9.60 --129.60,-4.80,7.06,0.00,1.00,-168.00,-9.60 --124.80,-4.80,7.02,0.00,1.00,-168.00,-9.60 --120.00,-9.60,6.98,0.00,1.00,-168.00,-9.60 --115.20,-9.60,6.94,0.00,1.00,-163.20,-9.60 --110.40,-9.60,6.90,0.00,1.00,-158.40,-9.60 --105.60,-9.60,6.86,0.00,1.00,-153.60,-9.60 --100.80,-9.60,6.82,0.00,1.00,-144.00,-9.60 --96.00,-9.60,6.78,0.00,1.00,-124.80,-9.60 --91.20,-9.60,6.74,0.00,1.00,-96.00,-9.60 --86.40,-9.60,6.70,0.00,1.00,-67.20,-9.60 --81.60,-9.60,6.66,0.00,1.00,-43.20,-9.60 --76.80,-9.60,6.62,0.00,1.00,-33.60,-9.60 --72.00,-9.60,6.58,0.00,1.00,-24.00,-9.60 --67.20,-9.60,6.54,0.00,1.00,-19.20,-9.60 --62.40,-9.60,6.50,0.00,1.00,-14.40,-9.60 --57.60,-4.80,6.46,0.00,1.00,-14.40,-9.60 --52.80,-4.80,6.42,0.00,1.00,-9.60,-4.80 --48.00,-4.80,6.38,0.00,1.00,-9.60,-4.80 --43.20,-4.80,6.34,0.00,1.00,-9.60,-4.80 --38.40,-4.80,6.30,0.00,1.00,-4.80,-4.80 --33.60,-4.80,6.26,0.00,1.00,-4.80,-4.80 --28.80,-4.80,6.22,0.00,1.00,-4.80,-4.80 --24.00,-4.80,6.18,0.00,1.00,-4.80,-4.80 --19.20,-4.80,6.14,0.00,1.00,-4.80,-0.00 --14.40,-0.00,6.10,0.00,1.00,-0.00,-0.00 --9.60,-0.00,6.06,0.00,1.00,-0.00,-0.00 --4.80,-0.00,6.02,0.00,1.00,-0.00,0.00 -0.00,0.00,5.97,0.00,1.00,0.00,0.00 -4.80,0.00,5.93,0.00,1.00,0.00,0.00 -9.60,0.00,5.89,0.00,1.00,0.00,0.00 -14.40,0.00,5.85,0.00,1.00,0.00,0.00 -19.20,0.00,5.81,0.00,1.00,0.00,0.00 -24.00,0.00,5.77,0.00,1.00,0.00,0.00 -28.80,0.00,5.73,0.00,1.00,0.00,4.80 -33.60,0.00,5.69,0.00,1.00,0.00,4.80 -38.40,0.00,5.65,0.00,1.00,4.80,4.80 -43.20,4.80,5.61,0.00,1.00,4.80,4.80 -48.00,4.80,5.57,0.00,1.00,4.80,4.80 -52.80,4.80,5.53,0.00,1.00,4.80,4.80 -57.60,4.80,5.49,0.00,1.00,4.80,4.80 -62.40,4.80,5.45,0.00,1.00,4.80,4.80 -67.20,4.80,5.41,0.00,1.00,9.60,4.80 -72.00,4.80,5.37,0.00,1.00,9.60,4.80 -76.80,4.80,5.33,0.00,1.00,14.40,4.80 -81.60,4.80,5.29,0.00,1.00,24.00,4.80 -86.40,4.80,5.25,0.00,1.00,43.20,4.80 -91.20,4.80,5.21,0.00,1.00,110.40,4.80 -96.00,4.80,5.17,0.00,1.00,148.80,4.80 -100.80,4.80,5.13,0.00,1.00,163.20,4.80 -105.60,4.80,5.09,0.00,1.00,168.00,4.80 -110.40,4.80,5.05,0.00,1.00,172.80,4.80 -115.20,4.80,5.01,0.00,1.00,172.80,4.80 -120.00,4.80,4.97,0.00,1.00,172.80,4.80 -124.80,4.80,4.93,0.00,1.00,172.80,4.80 -129.60,4.80,4.89,0.00,1.00,177.60,4.80 -134.40,4.80,4.85,0.00,1.00,177.60,4.80 -139.20,0.00,4.81,0.00,1.00,177.60,4.80 -144.00,0.00,4.77,0.00,1.00,177.60,4.80 -148.80,0.00,4.73,0.00,1.00,177.60,0.00 -153.60,0.00,4.69,0.00,1.00,177.60,0.00 -158.40,0.00,4.65,0.00,1.00,177.60,0.00 -163.20,0.00,4.61,0.00,1.00,177.60,0.00 -168.00,0.00,4.57,0.00,1.00,177.60,0.00 -172.80,0.00,4.53,0.00,1.00,177.60,0.00 -177.60,0.00,4.49,0.00,1.00,177.60,-0.00 --177.60,-0.00,4.45,0.00,1.00,-177.60,-0.00 --172.80,-0.00,4.41,0.00,1.00,-177.60,-0.00 --168.00,-0.00,4.37,0.00,1.00,-177.60,-0.00 --163.20,-0.00,4.33,0.00,1.00,-177.60,-0.00 --158.40,-0.00,4.29,0.00,1.00,-177.60,-0.00 --153.60,-0.00,4.25,0.00,1.00,-177.60,-4.80 --148.80,-0.00,4.21,0.00,1.00,-177.60,-4.80 --144.00,-0.00,4.17,0.00,1.00,-177.60,-4.80 --139.20,-0.00,4.13,0.00,1.00,-177.60,-4.80 --134.40,-4.80,4.09,0.00,1.00,-177.60,-4.80 --129.60,-4.80,4.05,0.00,1.00,-177.60,-4.80 --124.80,-4.80,4.01,0.00,1.00,-172.80,-4.80 --120.00,-4.80,3.97,0.00,1.00,-172.80,-4.80 --115.20,-4.80,3.93,0.00,1.00,-172.80,-4.80 --110.40,-4.80,3.89,0.00,1.00,-172.80,-4.80 --105.60,-4.80,3.85,0.00,1.00,-168.00,-4.80 --100.80,-4.80,3.81,0.00,1.00,-163.20,-4.80 --96.00,-4.80,3.77,0.00,1.00,-148.80,-4.80 --91.20,-4.80,3.73,0.00,1.00,-110.40,-4.80 --86.40,-4.80,3.69,0.00,1.00,-43.20,-4.80 --81.60,-4.80,3.65,0.00,1.00,-24.00,-4.80 --76.80,-4.80,3.61,0.00,1.00,-14.40,-4.80 --72.00,-4.80,3.57,0.00,1.00,-9.60,-4.80 --67.20,-4.80,3.53,0.00,1.00,-9.60,-4.80 --62.40,-4.80,3.49,0.00,1.00,-4.80,-4.80 --57.60,-4.80,3.45,0.00,1.00,-4.80,-4.80 --52.80,-4.80,3.41,0.00,1.00,-4.80,-4.80 --48.00,-4.80,3.37,0.00,1.00,-4.80,-4.80 --43.20,-4.80,3.33,0.00,1.00,-4.80,-4.80 --38.40,-0.00,3.29,0.00,1.00,-4.80,-4.80 --33.60,-0.00,3.25,0.00,1.00,-0.00,-0.00 --28.80,-0.00,3.21,0.00,1.00,-0.00,-0.00 --24.00,-0.00,3.17,0.00,1.00,-0.00,-0.00 --19.20,-0.00,3.13,0.00,1.00,-0.00,-0.00 --14.40,-0.00,3.09,0.00,1.00,-0.00,-0.00 --9.60,-0.00,3.05,0.00,1.00,-0.00,-0.00 --4.80,-0.00,3.01,0.00,1.00,-0.00,0.00 -0.00,0.00,2.97,0.00,1.00,-0.00,0.00 -4.80,-0.00,2.93,0.00,1.00,-0.00,0.00 -9.60,-0.00,2.89,0.00,1.00,-0.00,0.00 -14.40,-0.00,2.85,0.00,1.00,-0.00,0.00 -19.20,-0.00,2.81,0.00,1.00,-0.00,0.00 -24.00,-0.00,2.77,0.00,1.00,-0.00,0.00 -28.80,-0.00,2.73,0.00,1.00,-0.00,0.00 -33.60,-0.00,2.69,0.00,1.00,-0.00,0.00 -38.40,-0.00,2.65,0.00,1.00,-0.00,0.00 -43.20,-0.00,2.61,0.00,1.00,-0.00,0.00 -48.00,-0.00,2.57,0.00,1.00,-0.00,0.00 -52.80,-0.00,2.53,0.00,1.00,-0.00,0.00 -57.60,-0.00,2.49,0.00,1.00,-0.00,0.00 -62.40,-0.00,2.45,0.00,1.00,-0.00,0.00 -67.20,-0.00,2.41,0.00,1.00,-4.80,0.00 -72.00,-0.00,2.37,0.00,1.00,-4.80,0.00 -76.80,-0.00,2.33,0.00,1.00,-4.80,0.00 -81.60,-0.00,2.29,0.00,1.00,-9.60,0.00 -86.40,-0.00,2.25,0.00,1.00,-19.20,0.00 -91.20,-0.00,2.21,0.00,1.00,-134.40,0.00 -96.00,-0.00,2.17,0.00,1.00,-168.00,0.00 -100.80,-0.00,2.13,0.00,1.00,-172.80,0.00 -105.60,-0.00,2.09,0.00,1.00,-177.60,0.00 -110.40,-0.00,2.05,0.00,1.00,-177.60,0.00 -115.20,-0.00,2.01,0.00,1.00,-177.60,0.00 -120.00,-0.00,1.96,0.00,1.00,-177.60,0.00 -124.80,-0.00,1.92,0.00,1.00,-177.60,0.00 -129.60,-0.00,1.88,0.00,1.00,-177.60,0.00 -134.40,-0.00,1.84,0.00,1.00,-177.60,0.00 -139.20,-0.00,1.80,0.00,1.00,-177.60,0.00 -144.00,-0.00,1.76,0.00,1.00,-177.60,0.00 -148.80,-0.00,1.72,0.00,1.00,-177.60,0.00 -153.60,-0.00,1.68,0.00,1.00,-177.60,0.00 -158.40,-0.00,1.64,0.00,1.00,-177.60,0.00 -163.20,-0.00,1.60,0.00,1.00,-177.60,0.00 -168.00,-0.00,1.56,0.00,1.00,-177.60,0.00 -172.80,-0.00,1.52,0.00,1.00,-177.60,0.00 -177.60,-0.00,1.48,0.00,1.00,-177.60,0.00 --177.60,0.00,1.44,0.00,1.00,177.60,0.00 --172.80,0.00,1.40,0.00,1.00,177.60,0.00 --168.00,0.00,1.36,0.00,1.00,177.60,0.00 --163.20,0.00,1.32,0.00,1.00,177.60,0.00 --158.40,0.00,1.28,0.00,1.00,177.60,0.00 --153.60,0.00,1.24,0.00,1.00,177.60,0.00 --148.80,0.00,1.20,0.00,1.00,177.60,0.00 --144.00,0.00,1.16,0.00,1.00,177.60,0.00 --139.20,0.00,1.12,0.00,1.00,177.60,0.00 --134.40,0.00,1.08,0.00,1.00,177.60,0.00 --129.60,0.00,1.04,0.00,1.00,177.60,0.00 --124.80,0.00,1.00,0.00,1.00,177.60,0.00 --120.00,0.00,0.96,0.00,1.00,177.60,0.00 --115.20,0.00,0.92,0.00,1.00,177.60,0.00 --110.40,0.00,0.88,0.00,1.00,177.60,0.00 --105.60,0.00,0.84,0.00,1.00,177.60,0.00 --100.80,0.00,0.80,0.00,1.00,172.80,0.00 --96.00,0.00,0.76,0.00,1.00,168.00,0.00 --91.20,0.00,0.72,0.00,1.00,134.40,0.00 --86.40,0.00,0.68,0.00,1.00,19.20,0.00 --81.60,0.00,0.64,0.00,1.00,9.60,0.00 --76.80,0.00,0.60,0.00,1.00,4.80,0.00 --72.00,0.00,0.56,0.00,1.00,4.80,0.00 --67.20,0.00,0.52,0.00,1.00,4.80,0.00 --62.40,0.00,0.48,0.00,1.00,0.00,0.00 --57.60,0.00,0.44,0.00,1.00,0.00,0.00 --52.80,0.00,0.40,0.00,1.00,0.00,0.00 --48.00,0.00,0.36,0.00,1.00,0.00,0.00 --43.20,0.00,0.32,0.00,1.00,0.00,0.00 --38.40,0.00,0.28,0.00,1.00,0.00,0.00 --33.60,0.00,0.24,0.00,1.00,0.00,0.00 --28.80,0.00,0.20,0.00,1.00,0.00,0.00 --24.00,0.00,0.16,0.00,1.00,0.00,0.00 --19.20,0.00,0.12,0.00,1.00,0.00,0.00 --14.40,0.00,0.08,0.00,1.00,0.00,0.00 --9.60,0.00,0.04,0.00,1.00,0.00,0.00 --4.80,0.00,0.00,0.00,1.00,0.00,0.00 +-0.00,0.00,0.00,0.00,1.00,0.00,4.80,0 +-0.00,4.80,0.06,0.00,1.00,4.80,9.60,0 +-0.00,9.60,0.13,0.00,1.00,9.60,14.40,0 +-0.00,14.40,0.19,0.00,1.00,14.40,19.20,0 +-0.00,19.20,0.26,0.00,1.00,19.20,24.00,0 +-0.00,24.00,0.32,0.00,1.00,24.00,28.80,0 +-0.00,28.80,0.39,0.00,1.00,28.80,33.60,0 +-0.00,33.60,0.45,0.00,1.00,33.60,38.40,0 +-0.00,38.40,0.51,0.00,1.00,38.40,43.20,0 +-0.00,43.20,0.58,0.00,1.00,43.20,48.00,0 +-0.00,48.00,0.64,0.00,1.00,48.00,52.80,0 +-0.00,52.80,0.71,0.00,1.00,52.80,57.60,0 +-0.00,57.60,0.77,0.00,1.00,57.60,62.40,0 +-0.00,62.40,0.84,0.00,1.00,62.40,67.20,0 +-0.00,67.20,0.90,0.00,1.00,67.20,72.00,0 +-0.00,72.00,0.96,0.00,1.00,72.00,76.80,0 +-0.00,76.80,1.03,0.00,1.00,76.80,81.60,0 +-0.00,81.60,1.09,0.00,1.00,81.60,86.40,0 +-0.00,86.40,1.16,0.00,1.00,86.40,86.40,0 +-177.60,89.20,1.22,0.00,1.00,91.20,81.60,0 +-177.60,86.40,1.29,0.00,1.00,96.00,76.80,0 +-177.60,81.60,1.35,0.00,1.00,100.80,72.00,0 +-177.60,76.80,1.41,0.00,1.00,105.60,67.20,0 +-177.60,72.00,1.48,0.00,1.00,110.40,62.40,0 +-177.60,67.20,1.54,0.00,1.00,115.20,57.60,0 +177.60,62.40,1.61,0.00,1.00,120.00,52.80,0 +177.60,57.60,1.67,0.00,1.00,124.80,48.00,0 +177.60,52.80,1.73,0.00,1.00,129.60,43.20,0 +177.60,48.00,1.80,0.00,1.00,134.40,38.40,0 +177.60,43.20,1.86,0.00,1.00,139.20,33.60,0 +177.60,38.40,1.93,0.00,1.00,144.00,28.80,0 +177.60,33.60,1.99,0.00,1.00,148.80,24.00,0 +177.60,28.80,2.06,0.00,1.00,153.60,19.20,0 +177.60,24.00,2.12,0.00,1.00,158.40,14.40,0 +177.60,19.20,2.18,0.00,1.00,163.20,9.60,0 +177.60,14.40,2.25,0.00,1.00,168.00,4.80,0 +177.60,9.60,2.31,0.00,1.00,172.80,0.00,0 +177.60,4.80,2.38,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,2.44,0.00,1.00,-177.60,-4.80,0 +-177.60,-4.80,2.51,0.00,1.00,-172.80,-9.60,0 +-177.60,-9.60,2.57,0.00,1.00,-168.00,-14.40,0 +-177.60,-14.40,2.63,0.00,1.00,-163.20,-19.20,0 +-177.60,-19.20,2.70,0.00,1.00,-158.40,-24.00,0 +-177.60,-24.00,2.76,0.00,1.00,-153.60,-28.80,0 +-177.60,-28.80,2.83,0.00,1.00,-148.80,-33.60,0 +-177.60,-33.60,2.89,0.00,1.00,-144.00,-38.40,0 +-177.60,-38.40,2.96,0.00,1.00,-139.20,-43.20,0 +-177.60,-48.00,3.02,0.00,1.00,-134.40,-48.00,0 +-177.60,-48.00,3.08,0.00,1.00,-129.60,-52.80,0 +-177.60,-52.80,3.15,0.00,1.00,-124.80,-57.60,0 +-177.60,-57.60,3.21,0.00,1.00,-120.00,-62.40,0 +177.60,-62.40,3.28,0.00,1.00,-115.20,-67.20,0 +177.60,-67.20,3.34,0.00,1.00,-110.40,-72.00,0 +177.60,-76.80,3.41,0.00,1.00,-105.60,-76.80,0 +177.60,-76.80,3.47,0.00,1.00,-100.80,-81.60,0 +177.60,-86.40,3.53,0.00,1.00,-96.00,-86.40,0 +177.60,-89.20,3.60,0.00,1.00,-91.20,-86.40,0 +0.00,-86.40,3.66,0.00,1.00,-86.40,-81.60,0 +0.00,-81.60,3.73,0.00,1.00,-81.60,-76.80,0 +0.00,-76.80,3.79,0.00,1.00,-76.80,-72.00,0 +0.00,-72.00,3.86,0.00,1.00,-72.00,-67.20,0 +0.00,-67.20,3.92,0.00,1.00,-67.20,-62.40,0 +0.00,-62.40,3.98,0.00,1.00,-62.40,-57.60,0 +0.00,-57.60,4.05,0.00,1.00,-57.60,-52.80,0 +0.00,-52.80,4.11,0.00,1.00,-52.80,-48.00,0 +0.00,-48.00,4.18,0.00,1.00,-48.00,-43.20,0 +0.00,-43.20,4.24,0.00,1.00,-43.20,-38.40,0 +0.00,-38.40,4.31,0.00,1.00,-38.40,-33.60,0 +0.00,-33.60,4.37,0.00,1.00,-33.60,-28.80,0 +0.00,-28.80,4.43,0.00,1.00,-28.80,-24.00,0 +0.00,-24.00,4.50,0.00,1.00,-24.00,-19.20,0 +0.00,-19.20,4.56,0.00,1.00,-19.20,-14.40,0 +0.00,-14.40,4.63,0.00,1.00,-14.40,-9.60,0 +0.00,-9.60,4.69,0.00,1.00,-9.60,-4.80,0 +0.00,-4.80,4.76,0.00,1.00,-4.80,0.00,0 +0.00,0.00,4.82,0.00,1.00,0.00,4.80,0 +0.00,4.80,4.88,0.00,1.00,4.80,9.60,0 +0.00,9.60,4.95,0.00,1.00,9.60,14.40,0 +0.00,14.40,5.01,0.00,1.00,14.40,19.20,0 +0.00,19.20,5.08,0.00,1.00,19.20,24.00,0 +0.00,24.00,5.14,0.00,1.00,24.00,28.80,0 +4.80,28.80,5.20,0.00,1.00,28.80,33.60,0 +4.80,33.60,5.27,0.00,1.00,33.60,38.40,0 +4.80,38.40,5.33,0.00,1.00,38.40,43.20,0 +4.80,43.20,5.40,0.00,1.00,43.20,48.00,0 +4.80,48.00,5.46,0.00,1.00,48.00,52.80,0 +4.80,52.80,5.53,0.00,1.00,52.80,57.60,0 +9.60,57.60,5.59,0.00,1.00,57.60,62.40,0 +9.60,62.40,5.65,0.00,1.00,62.40,67.20,0 +9.60,67.20,5.72,0.00,1.00,67.20,72.00,0 +14.40,72.00,5.78,0.00,1.00,72.00,76.80,0 +19.20,76.80,5.85,0.00,1.00,76.80,81.60,0 +28.80,81.60,5.91,0.00,1.00,81.60,86.40,0 +52.80,86.40,5.98,0.00,1.00,86.40,86.40,0 +105.60,86.40,6.04,0.00,1.00,91.20,81.60,0 +139.20,81.60,6.10,0.00,1.00,96.00,76.80,0 +158.40,76.80,6.17,0.00,1.00,100.80,72.00,0 +163.20,72.00,6.23,0.00,1.00,105.60,67.20,0 +168.00,67.20,6.30,0.00,1.00,110.40,62.40,0 +168.00,62.40,6.36,0.00,1.00,115.20,57.60,0 +172.80,57.60,6.43,0.00,1.00,120.00,52.80,0 +172.80,52.80,6.49,0.00,1.00,124.80,48.00,0 +172.80,48.00,6.55,0.00,1.00,129.60,43.20,0 +172.80,43.20,6.62,0.00,1.00,134.40,38.40,0 +177.60,38.40,6.68,0.00,1.00,139.20,33.60,0 +177.60,33.60,6.75,0.00,1.00,144.00,28.80,0 +177.60,28.80,6.81,0.00,1.00,148.80,24.00,0 +177.60,24.00,6.88,0.00,1.00,153.60,19.20,0 +177.60,19.20,6.94,0.00,1.00,158.40,14.40,0 +177.60,14.40,7.00,0.00,1.00,163.20,9.60,0 +177.60,9.60,7.07,0.00,1.00,168.00,4.80,0 +177.60,4.80,7.13,0.00,1.00,172.80,0.00,0 +177.60,0.00,7.20,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,7.26,0.00,1.00,-177.60,-4.80,0 +-177.60,-4.80,7.33,0.00,1.00,-172.80,-9.60,0 +-177.60,-9.60,7.39,0.00,1.00,-168.00,-14.40,0 +-177.60,-14.40,7.45,0.00,1.00,-163.20,-19.20,0 +-177.60,-19.20,7.52,0.00,1.00,-158.40,-24.00,0 +-177.60,-24.00,7.58,0.00,1.00,-153.60,-28.80,0 +-177.60,-28.80,7.65,0.00,1.00,-148.80,-33.60,0 +-177.60,-33.60,7.71,0.00,1.00,-144.00,-38.40,0 +-177.60,-38.40,7.78,0.00,1.00,-139.20,-43.20,0 +-172.80,-43.20,7.84,0.00,1.00,-134.40,-48.00,0 +-172.80,-48.00,7.90,0.00,1.00,-129.60,-52.80,0 +-172.80,-52.80,7.97,0.00,1.00,-124.80,-57.60,0 +-172.80,-57.60,8.03,0.00,1.00,-120.00,-62.40,0 +-168.00,-62.40,8.10,0.00,1.00,-115.20,-67.20,0 +-168.00,-67.20,8.16,0.00,1.00,-110.40,-72.00,0 +-163.20,-72.00,8.22,0.00,1.00,-105.60,-76.80,0 +-158.40,-76.80,8.29,0.00,1.00,-100.80,-81.60,0 +-139.20,-81.60,8.35,0.00,1.00,-96.00,-86.40,0 +-105.60,-86.40,8.42,0.00,1.00,-91.20,-86.40,0 +-52.80,-86.40,8.48,0.00,1.00,-86.40,-81.60,0 +-28.80,-81.60,8.55,0.00,1.00,-81.60,-76.80,0 +-19.20,-76.80,8.61,0.00,1.00,-76.80,-72.00,0 +-14.40,-72.00,8.67,0.00,1.00,-72.00,-67.20,0 +-9.60,-67.20,8.74,0.00,1.00,-67.20,-62.40,0 +-9.60,-62.40,8.80,0.00,1.00,-62.40,-57.60,0 +-9.60,-57.60,8.87,0.00,1.00,-57.60,-52.80,0 +-4.80,-52.80,8.93,0.00,1.00,-52.80,-48.00,0 +-4.80,-48.00,9.00,0.00,1.00,-48.00,-43.20,0 +-4.80,-43.20,9.06,0.00,1.00,-43.20,-38.40,0 +-4.80,-38.40,9.12,0.00,1.00,-38.40,-33.60,0 +-4.80,-33.60,9.19,0.00,1.00,-33.60,-28.80,0 +-4.80,-28.80,9.25,0.00,1.00,-28.80,-24.00,0 +-0.00,-24.00,9.32,0.00,1.00,-24.00,-19.20,0 +-0.00,-19.20,9.38,0.00,1.00,-19.20,-14.40,0 +-0.00,-14.40,9.45,0.00,1.00,-14.40,-9.60,0 +-0.00,-9.60,9.51,0.00,1.00,-9.60,-4.80,0 +-0.00,-4.80,9.57,0.00,1.00,-4.80,0.00,0 +0.00,0.00,9.64,0.00,1.00,0.00,4.80,0 +0.00,4.80,9.70,0.00,1.00,4.80,9.60,0 +0.00,9.60,9.77,0.00,1.00,9.60,14.40,0 +4.80,14.40,9.83,0.00,1.00,14.40,19.20,0 +4.80,19.20,9.90,0.00,1.00,19.20,24.00,0 +4.80,24.00,9.96,0.00,1.00,24.00,28.80,0 +4.80,28.80,10.02,0.00,1.00,28.80,33.60,0 +4.80,33.60,10.09,0.00,1.00,33.60,38.40,0 +9.60,38.40,10.15,0.00,1.00,38.40,43.20,0 +9.60,43.20,10.22,0.00,1.00,43.20,48.00,0 +9.60,48.00,10.28,0.00,1.00,48.00,52.80,0 +14.40,52.80,10.35,0.00,1.00,52.80,57.60,0 +14.40,57.60,10.41,0.00,1.00,57.60,62.40,0 +19.20,62.40,10.47,0.00,1.00,62.40,67.20,0 +24.00,67.20,10.54,0.00,1.00,67.20,72.00,0 +28.80,72.00,10.60,0.00,1.00,72.00,72.00,0 +33.60,72.00,10.67,0.00,1.00,76.80,76.80,0 +48.00,76.80,10.73,0.00,1.00,81.60,81.60,0 +67.20,81.60,10.80,0.00,1.00,86.40,81.60,0 +96.00,81.60,10.86,0.00,1.00,91.20,81.60,0 +120.00,76.80,10.92,0.00,1.00,96.00,76.80,0 +139.20,76.80,10.99,0.00,1.00,100.80,72.00,0 +148.80,72.00,11.05,0.00,1.00,105.60,67.20,0 +153.60,67.20,11.12,0.00,1.00,110.40,62.40,0 +158.40,62.40,11.18,0.00,1.00,115.20,57.60,0 +163.20,57.60,11.24,0.00,1.00,120.00,52.80,0 +168.00,52.80,11.31,0.00,1.00,124.80,48.00,0 +168.00,48.00,11.37,0.00,1.00,129.60,43.20,0 +168.00,43.20,11.44,0.00,1.00,134.40,38.40,0 +172.80,38.40,11.50,0.00,1.00,139.20,33.60,0 +172.80,33.60,11.57,0.00,1.00,144.00,28.80,0 +172.80,28.80,11.63,0.00,1.00,148.80,24.00,0 +177.60,24.00,11.69,0.00,1.00,153.60,19.20,0 +177.60,19.20,11.76,0.00,1.00,158.40,14.40,0 +177.60,14.40,11.82,0.00,1.00,163.20,9.60,0 +177.60,9.60,11.89,0.00,1.00,168.00,4.80,0 +177.60,4.80,11.95,0.00,1.00,172.80,0.00,0 +177.60,0.00,12.02,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,12.08,0.00,1.00,-177.60,-4.80,0 +-177.60,-4.80,12.14,0.00,1.00,-172.80,-9.60,0 +-177.60,-9.60,12.21,0.00,1.00,-168.00,-14.40,0 +-177.60,-14.40,12.27,0.00,1.00,-163.20,-19.20,0 +-177.60,-19.20,12.34,0.00,1.00,-158.40,-24.00,0 +-177.60,-24.00,12.40,0.00,1.00,-153.60,-28.80,0 +-172.80,-28.80,12.47,0.00,1.00,-148.80,-33.60,0 +-172.80,-33.60,12.53,0.00,1.00,-144.00,-38.40,0 +-172.80,-38.40,12.59,0.00,1.00,-139.20,-43.20,0 +-168.00,-43.20,12.66,0.00,1.00,-134.40,-48.00,0 +-168.00,-48.00,12.72,0.00,1.00,-129.60,-52.80,0 +-168.00,-52.80,12.79,0.00,1.00,-124.80,-57.60,0 +-163.20,-57.60,12.85,0.00,1.00,-120.00,-62.40,0 +-158.40,-62.40,12.92,0.00,1.00,-115.20,-67.20,0 +-153.60,-67.20,12.98,0.00,1.00,-110.40,-72.00,0 +-148.80,-72.00,13.04,0.00,1.00,-105.60,-76.80,0 +-139.20,-76.80,13.11,0.00,1.00,-100.80,-81.60,0 +-120.00,-76.80,13.17,0.00,1.00,-96.00,-81.60,0 +-96.00,-81.60,13.24,0.00,1.00,-91.20,-81.60,0 +-67.20,-81.60,13.30,0.00,1.00,-86.40,-76.80,0 +-48.00,-76.80,13.37,0.00,1.00,-81.60,-72.00,0 +-33.60,-72.00,13.43,0.00,1.00,-76.80,-72.00,0 +-28.80,-72.00,13.49,0.00,1.00,-72.00,-67.20,0 +-24.00,-67.20,13.56,0.00,1.00,-67.20,-62.40,0 +-19.20,-62.40,13.62,0.00,1.00,-62.40,-57.60,0 +-14.40,-57.60,13.69,0.00,1.00,-57.60,-52.80,0 +-14.40,-52.80,13.75,0.00,1.00,-52.80,-48.00,0 +-9.60,-48.00,13.82,0.00,1.00,-48.00,-43.20,0 +-9.60,-43.20,13.88,0.00,1.00,-43.20,-38.40,0 +-9.60,-38.40,13.94,0.00,1.00,-38.40,-33.60,0 +-4.80,-33.60,14.01,0.00,1.00,-33.60,-28.80,0 +-4.80,-28.80,14.07,0.00,1.00,-28.80,-24.00,0 +-4.80,-24.00,14.14,0.00,1.00,-24.00,-19.20,0 +-4.80,-19.20,14.20,0.00,1.00,-19.20,-14.40,0 +-4.80,-14.40,14.27,0.00,1.00,-14.40,-9.60,0 +-0.00,-9.60,14.33,0.00,1.00,-9.60,-4.80,0 +-0.00,-4.80,14.39,0.00,1.00,-4.80,0.00,0 +0.00,0.00,14.46,0.00,1.00,0.00,4.80,0 +0.00,4.80,14.52,0.00,1.00,4.80,9.60,0 +4.80,9.60,14.59,0.00,1.00,9.60,14.40,0 +4.80,14.40,14.65,0.00,1.00,14.40,19.20,0 +4.80,19.20,14.71,0.00,1.00,19.20,24.00,0 +4.80,24.00,14.78,0.00,1.00,24.00,28.80,0 +9.60,28.80,14.84,0.00,1.00,28.80,33.60,0 +9.60,33.60,14.91,0.00,1.00,33.60,38.40,0 +9.60,38.40,14.97,0.00,1.00,38.40,43.20,0 +14.40,43.20,15.04,0.00,1.00,43.20,48.00,0 +14.40,48.00,15.10,0.00,1.00,48.00,52.80,0 +19.20,52.80,15.16,0.00,1.00,52.80,57.60,0 +19.20,52.80,15.23,0.00,1.00,57.60,57.60,0 +24.00,57.60,15.29,0.00,1.00,62.40,62.40,0 +28.80,62.40,15.36,0.00,1.00,67.20,67.20,0 +38.40,67.20,15.42,0.00,1.00,72.00,72.00,0 +48.00,72.00,15.49,0.00,1.00,76.80,72.00,0 +57.60,72.00,15.55,0.00,1.00,81.60,76.80,0 +76.80,76.80,15.61,0.00,1.00,86.40,76.80,0 +96.00,76.80,15.68,0.00,1.00,91.20,76.80,0 +115.20,76.80,15.74,0.00,1.00,96.00,72.00,0 +129.60,72.00,15.81,0.00,1.00,100.80,72.00,0 +139.20,67.20,15.87,0.00,1.00,105.60,67.20,0 +144.00,67.20,15.94,0.00,1.00,110.40,62.40,0 +153.60,62.40,16.00,0.00,1.00,115.20,57.60,0 +158.40,57.60,16.00,0.00,1.00,120.00,52.80,0 +158.40,52.80,15.94,0.00,1.00,124.80,48.00,0 +163.20,48.00,15.87,0.00,1.00,129.60,43.20,0 +168.00,43.20,15.81,0.00,1.00,134.40,38.40,0 +168.00,38.40,15.74,0.00,1.00,139.20,33.60,0 +168.00,33.60,15.68,0.00,1.00,144.00,28.80,0 +172.80,28.80,15.61,0.00,1.00,148.80,24.00,0 +172.80,24.00,15.55,0.00,1.00,153.60,19.20,0 +172.80,19.20,15.49,0.00,1.00,158.40,14.40,0 +177.60,14.40,15.42,0.00,1.00,163.20,9.60,0 +177.60,9.60,15.36,0.00,1.00,168.00,4.80,0 +177.60,4.80,15.29,0.00,1.00,172.80,0.00,0 +177.60,0.00,15.23,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,15.16,0.00,1.00,-177.60,-4.80,0 +-177.60,-4.80,15.10,0.00,1.00,-172.80,-9.60,0 +-177.60,-9.60,15.04,0.00,1.00,-168.00,-14.40,0 +-177.60,-14.40,14.97,0.00,1.00,-163.20,-19.20,0 +-172.80,-19.20,14.91,0.00,1.00,-158.40,-24.00,0 +-172.80,-24.00,14.84,0.00,1.00,-153.60,-28.80,0 +-172.80,-28.80,14.78,0.00,1.00,-148.80,-33.60,0 +-168.00,-33.60,14.71,0.00,1.00,-144.00,-38.40,0 +-168.00,-38.40,14.65,0.00,1.00,-139.20,-43.20,0 +-168.00,-43.20,14.59,0.00,1.00,-134.40,-48.00,0 +-163.20,-48.00,14.52,0.00,1.00,-129.60,-52.80,0 +-158.40,-52.80,14.46,0.00,1.00,-124.80,-57.60,0 +-158.40,-57.60,14.39,0.00,1.00,-120.00,-62.40,0 +-153.60,-62.40,14.33,0.00,1.00,-115.20,-67.20,0 +-144.00,-67.20,14.27,0.00,1.00,-110.40,-72.00,0 +-139.20,-67.20,14.20,0.00,1.00,-105.60,-72.00,0 +-129.60,-72.00,14.14,0.00,1.00,-100.80,-76.80,0 +-115.20,-76.80,14.07,0.00,1.00,-96.00,-76.80,0 +-96.00,-76.80,14.01,0.00,1.00,-91.20,-76.80,0 +-76.80,-76.80,13.94,0.00,1.00,-86.40,-72.00,0 +-57.60,-72.00,13.88,0.00,1.00,-81.60,-72.00,0 +-48.00,-72.00,13.82,0.00,1.00,-76.80,-67.20,0 +-38.40,-67.20,13.75,0.00,1.00,-72.00,-62.40,0 +-28.80,-62.40,13.69,0.00,1.00,-67.20,-57.60,0 +-24.00,-57.60,13.62,0.00,1.00,-62.40,-57.60,0 +-19.20,-52.80,13.56,0.00,1.00,-57.60,-52.80,0 +-19.20,-52.80,13.49,0.00,1.00,-52.80,-48.00,0 +-14.40,-48.00,13.43,0.00,1.00,-48.00,-43.20,0 +-14.40,-43.20,13.37,0.00,1.00,-43.20,-38.40,0 +-9.60,-38.40,13.30,0.00,1.00,-38.40,-33.60,0 +-9.60,-33.60,13.24,0.00,1.00,-33.60,-28.80,0 +-9.60,-28.80,13.17,0.00,1.00,-28.80,-24.00,0 +-4.80,-24.00,13.11,0.00,1.00,-24.00,-19.20,0 +-4.80,-19.20,13.04,0.00,1.00,-19.20,-14.40,0 +-4.80,-14.40,12.98,0.00,1.00,-14.40,-9.60,0 +-4.80,-9.60,12.92,0.00,1.00,-9.60,-4.80,0 +-0.00,-4.80,12.85,0.00,1.00,-4.80,0.00,0 +0.00,0.00,12.79,0.00,1.00,0.00,4.80,0 +0.00,4.80,12.72,0.00,1.00,4.80,9.60,0 +4.80,9.60,12.66,0.00,1.00,9.60,14.40,0 +4.80,14.40,12.59,0.00,1.00,14.40,19.20,0 +4.80,19.20,12.53,0.00,1.00,19.20,24.00,0 +9.60,24.00,12.47,0.00,1.00,24.00,28.80,0 +9.60,28.80,12.40,0.00,1.00,28.80,33.60,0 +14.40,33.60,12.34,0.00,1.00,33.60,38.40,0 +14.40,33.60,12.27,0.00,1.00,38.40,38.40,0 +19.20,38.40,12.21,0.00,1.00,43.20,43.20,0 +19.20,43.20,12.14,0.00,1.00,48.00,48.00,0 +24.00,48.00,12.08,0.00,1.00,52.80,52.80,0 +28.80,52.80,12.02,0.00,1.00,57.60,57.60,0 +33.60,57.60,11.95,0.00,1.00,62.40,62.40,0 +38.40,62.40,11.89,0.00,1.00,67.20,62.40,0 +43.20,62.40,11.82,0.00,1.00,72.00,67.20,0 +52.80,67.20,11.76,0.00,1.00,76.80,72.00,0 +67.20,67.20,11.69,0.00,1.00,81.60,72.00,0 +76.80,72.00,11.63,0.00,1.00,86.40,72.00,0 +96.00,72.00,11.57,0.00,1.00,91.20,72.00,0 +105.60,72.00,11.50,0.00,1.00,96.00,67.20,0 +120.00,67.20,11.44,0.00,1.00,100.80,67.20,0 +129.60,67.20,11.37,0.00,1.00,105.60,62.40,0 +139.20,62.40,11.31,0.00,1.00,110.40,57.60,0 +144.00,57.60,11.24,0.00,1.00,115.20,57.60,0 +148.80,52.80,11.18,0.00,1.00,120.00,52.80,0 +153.60,52.80,11.12,0.00,1.00,124.80,48.00,0 +158.40,48.00,11.05,0.00,1.00,129.60,43.20,0 +163.20,43.20,10.99,0.00,1.00,134.40,38.40,0 +163.20,38.40,10.92,0.00,1.00,139.20,33.60,0 +168.00,33.60,10.86,0.00,1.00,144.00,28.80,0 +168.00,28.80,10.80,0.00,1.00,148.80,24.00,0 +172.80,24.00,10.73,0.00,1.00,153.60,19.20,0 +172.80,19.20,10.67,0.00,1.00,158.40,14.40,0 +172.80,14.40,10.60,0.00,1.00,163.20,9.60,0 +177.60,9.60,10.54,0.00,1.00,168.00,4.80,0 +177.60,4.80,10.47,0.00,1.00,172.80,0.00,0 +177.60,0.00,10.41,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,10.35,0.00,1.00,-177.60,-4.80,0 +-177.60,-4.80,10.28,0.00,1.00,-172.80,-9.60,0 +-177.60,-9.60,10.22,0.00,1.00,-168.00,-14.40,0 +-172.80,-14.40,10.15,0.00,1.00,-163.20,-19.20,0 +-172.80,-19.20,10.09,0.00,1.00,-158.40,-24.00,0 +-172.80,-24.00,10.02,0.00,1.00,-153.60,-28.80,0 +-168.00,-28.80,9.96,0.00,1.00,-148.80,-33.60,0 +-168.00,-33.60,9.90,0.00,1.00,-144.00,-38.40,0 +-163.20,-38.40,9.83,0.00,1.00,-139.20,-43.20,0 +-163.20,-43.20,9.77,0.00,1.00,-134.40,-48.00,0 +-158.40,-48.00,9.70,0.00,1.00,-129.60,-52.80,0 +-153.60,-52.80,9.64,0.00,1.00,-124.80,-57.60,0 +-148.80,-52.80,9.57,0.00,1.00,-120.00,-57.60,0 +-144.00,-57.60,9.51,0.00,1.00,-115.20,-62.40,0 +-139.20,-62.40,9.45,0.00,1.00,-110.40,-67.20,0 +-129.60,-67.20,9.38,0.00,1.00,-105.60,-67.20,0 +-120.00,-67.20,9.32,0.00,1.00,-100.80,-72.00,0 +-105.60,-72.00,9.25,0.00,1.00,-96.00,-72.00,0 +-96.00,-72.00,9.19,0.00,1.00,-91.20,-72.00,0 +-76.80,-72.00,9.12,0.00,1.00,-86.40,-72.00,0 +-67.20,-67.20,9.06,0.00,1.00,-81.60,-67.20,0 +-52.80,-67.20,9.00,0.00,1.00,-76.80,-62.40,0 +-43.20,-62.40,8.93,0.00,1.00,-72.00,-62.40,0 +-38.40,-62.40,8.87,0.00,1.00,-67.20,-57.60,0 +-33.60,-57.60,8.80,0.00,1.00,-62.40,-52.80,0 +-28.80,-52.80,8.74,0.00,1.00,-57.60,-48.00,0 +-24.00,-48.00,8.67,0.00,1.00,-52.80,-43.20,0 +-19.20,-43.20,8.61,0.00,1.00,-48.00,-38.40,0 +-19.20,-38.40,8.55,0.00,1.00,-43.20,-38.40,0 +-14.40,-33.60,8.48,0.00,1.00,-38.40,-33.60,0 +-14.40,-33.60,8.42,0.00,1.00,-33.60,-28.80,0 +-9.60,-28.80,8.35,0.00,1.00,-28.80,-24.00,0 +-9.60,-24.00,8.29,0.00,1.00,-24.00,-19.20,0 +-4.80,-19.20,8.22,0.00,1.00,-19.20,-14.40,0 +-4.80,-14.40,8.16,0.00,1.00,-14.40,-9.60,0 +-4.80,-9.60,8.10,0.00,1.00,-9.60,-4.80,0 +-0.00,-4.80,8.03,0.00,1.00,-4.80,0.00,0 +0.00,0.00,7.97,0.00,1.00,0.00,4.80,0 +0.00,4.80,7.90,0.00,1.00,4.80,9.60,0 +4.80,9.60,7.84,0.00,1.00,9.60,14.40,0 +4.80,14.40,7.78,0.00,1.00,14.40,19.20,0 +9.60,19.20,7.71,0.00,1.00,19.20,24.00,0 +9.60,24.00,7.65,0.00,1.00,24.00,24.00,0 +14.40,24.00,7.58,0.00,1.00,28.80,28.80,0 +14.40,28.80,7.52,0.00,1.00,33.60,33.60,0 +19.20,33.60,7.45,0.00,1.00,33.60,38.40,0 +19.20,38.40,7.39,0.00,1.00,38.40,43.20,0 +24.00,43.20,7.33,0.00,1.00,43.20,48.00,0 +28.80,48.00,7.26,0.00,1.00,48.00,52.80,0 +33.60,52.80,7.20,0.00,1.00,57.60,52.80,0 +38.40,52.80,7.13,0.00,1.00,62.40,57.60,0 +43.20,57.60,7.07,0.00,1.00,67.20,62.40,0 +52.80,62.40,7.00,0.00,1.00,72.00,62.40,0 +62.40,62.40,6.94,0.00,1.00,76.80,67.20,0 +72.00,62.40,6.88,0.00,1.00,81.60,67.20,0 +81.60,67.20,6.81,0.00,1.00,86.40,67.20,0 +91.20,67.20,6.75,0.00,1.00,91.20,67.20,0 +105.60,67.20,6.68,0.00,1.00,96.00,67.20,0 +115.20,62.40,6.62,0.00,1.00,100.80,62.40,0 +124.80,62.40,6.55,0.00,1.00,105.60,57.60,0 +134.40,57.60,6.49,0.00,1.00,110.40,57.60,0 +139.20,57.60,6.43,0.00,1.00,115.20,52.80,0 +144.00,52.80,6.36,0.00,1.00,120.00,48.00,0 +148.80,48.00,6.30,0.00,1.00,129.60,43.20,0 +153.60,43.20,6.23,0.00,1.00,134.40,43.20,0 +158.40,38.40,6.17,0.00,1.00,139.20,38.40,0 +158.40,38.40,6.10,0.00,1.00,144.00,33.60,0 +163.20,33.60,6.04,0.00,1.00,148.80,28.80,0 +168.00,28.80,5.98,0.00,1.00,148.80,24.00,0 +168.00,24.00,5.91,0.00,1.00,153.60,19.20,0 +172.80,19.20,5.85,0.00,1.00,158.40,14.40,0 +172.80,14.40,5.78,0.00,1.00,163.20,9.60,0 +172.80,9.60,5.72,0.00,1.00,168.00,4.80,0 +177.60,4.80,5.65,0.00,1.00,172.80,0.00,0 +177.60,0.00,5.59,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,5.53,0.00,1.00,-177.60,-4.80,0 +-177.60,-4.80,5.46,0.00,1.00,-172.80,-9.60,0 +-172.80,-9.60,5.40,0.00,1.00,-168.00,-14.40,0 +-172.80,-14.40,5.33,0.00,1.00,-163.20,-19.20,0 +-172.80,-19.20,5.27,0.00,1.00,-158.40,-24.00,0 +-168.00,-24.00,5.20,0.00,1.00,-153.60,-28.80,0 +-168.00,-28.80,5.14,0.00,1.00,-148.80,-33.60,0 +-163.20,-33.60,5.08,0.00,1.00,-148.80,-38.40,0 +-158.40,-38.40,5.01,0.00,1.00,-144.00,-43.20,0 +-158.40,-38.40,4.95,0.00,1.00,-139.20,-43.20,0 +-153.60,-43.20,4.88,0.00,1.00,-134.40,-48.00,0 +-148.80,-48.00,4.82,0.00,1.00,-129.60,-52.80,0 +-144.00,-52.80,4.76,0.00,1.00,-120.00,-57.60,0 +-139.20,-57.60,4.69,0.00,1.00,-115.20,-57.60,0 +-134.40,-57.60,4.63,0.00,1.00,-110.40,-62.40,0 +-124.80,-62.40,4.56,0.00,1.00,-105.60,-67.20,0 +-115.20,-62.40,4.50,0.00,1.00,-100.80,-67.20,0 +-105.60,-67.20,4.43,0.00,1.00,-96.00,-67.20,0 +-91.20,-67.20,4.37,0.00,1.00,-91.20,-67.20,0 +-81.60,-67.20,4.31,0.00,1.00,-86.40,-67.20,0 +-72.00,-62.40,4.24,0.00,1.00,-81.60,-62.40,0 +-62.40,-62.40,4.18,0.00,1.00,-76.80,-62.40,0 +-52.80,-62.40,4.11,0.00,1.00,-72.00,-57.60,0 +-43.20,-57.60,4.05,0.00,1.00,-67.20,-52.80,0 +-38.40,-52.80,3.98,0.00,1.00,-62.40,-52.80,0 +-33.60,-52.80,3.92,0.00,1.00,-57.60,-48.00,0 +-28.80,-48.00,3.86,0.00,1.00,-48.00,-43.20,0 +-24.00,-43.20,3.79,0.00,1.00,-43.20,-38.40,0 +-19.20,-38.40,3.73,0.00,1.00,-38.40,-33.60,0 +-19.20,-33.60,3.66,0.00,1.00,-33.60,-28.80,0 +-14.40,-28.80,3.60,0.00,1.00,-33.60,-24.00,0 +-14.40,-24.00,3.53,0.00,1.00,-28.80,-24.00,0 +-9.60,-24.00,3.47,0.00,1.00,-24.00,-19.20,0 +-9.60,-19.20,3.41,0.00,1.00,-19.20,-14.40,0 +-4.80,-14.40,3.34,0.00,1.00,-14.40,-9.60,0 +-4.80,-9.60,3.28,0.00,1.00,-9.60,-4.80,0 +-0.00,-4.80,3.21,0.00,1.00,-4.80,0.00,0 +0.00,0.00,3.15,0.00,1.00,0.00,4.80,0 +0.00,4.80,3.08,0.00,1.00,4.80,9.60,0 +4.80,9.60,3.02,0.00,1.00,9.60,14.40,0 +4.80,14.40,2.96,0.00,1.00,14.40,19.20,0 +9.60,14.40,2.89,0.00,1.00,19.20,19.20,0 +14.40,19.20,2.83,0.00,1.00,19.20,24.00,0 +14.40,24.00,2.76,0.00,1.00,24.00,28.80,0 +19.20,28.80,2.70,0.00,1.00,28.80,33.60,0 +19.20,33.60,2.63,0.00,1.00,33.60,38.40,0 +24.00,38.40,2.57,0.00,1.00,38.40,43.20,0 +28.80,38.40,2.51,0.00,1.00,43.20,43.20,0 +33.60,43.20,2.44,0.00,1.00,48.00,48.00,0 +38.40,48.00,2.38,0.00,1.00,52.80,52.80,0 +43.20,52.80,2.31,0.00,1.00,57.60,52.80,0 +48.00,52.80,2.25,0.00,1.00,62.40,57.60,0 +57.60,57.60,2.18,0.00,1.00,72.00,57.60,0 +62.40,57.60,2.12,0.00,1.00,76.80,62.40,0 +72.00,62.40,2.06,0.00,1.00,81.60,62.40,0 +81.60,62.40,1.99,0.00,1.00,86.40,62.40,0 +91.20,62.40,1.93,0.00,1.00,91.20,62.40,0 +100.80,62.40,1.86,0.00,1.00,96.00,62.40,0 +110.40,57.60,1.80,0.00,1.00,100.80,57.60,0 +120.00,57.60,1.73,0.00,1.00,105.60,57.60,0 +129.60,57.60,1.67,0.00,1.00,115.20,52.80,0 +134.40,52.80,1.61,0.00,1.00,120.00,48.00,0 +139.20,48.00,1.54,0.00,1.00,124.80,48.00,0 +144.00,48.00,1.48,0.00,1.00,129.60,43.20,0 +148.80,43.20,1.41,0.00,1.00,134.40,38.40,0 +153.60,38.40,1.35,0.00,1.00,139.20,33.60,0 +158.40,33.60,1.29,0.00,1.00,144.00,33.60,0 +158.40,28.80,1.22,0.00,1.00,148.80,28.80,0 +163.20,28.80,1.16,0.00,1.00,153.60,24.00,0 +168.00,24.00,1.09,0.00,1.00,158.40,19.20,0 +168.00,19.20,1.03,0.00,1.00,163.20,14.40,0 +172.80,14.40,0.96,0.00,1.00,163.20,9.60,0 +172.80,9.60,0.90,0.00,1.00,168.00,4.80,0 +177.60,4.80,0.84,0.00,1.00,172.80,0.00,0 +177.60,0.00,0.77,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,0.71,0.00,1.00,-177.60,-4.80,0 +-177.60,-4.80,0.64,0.00,1.00,-172.80,-9.60,0 +-172.80,-9.60,0.58,0.00,1.00,-168.00,-14.40,0 +-172.80,-14.40,0.51,0.00,1.00,-163.20,-19.20,0 +-168.00,-19.20,0.45,0.00,1.00,-163.20,-24.00,0 +-168.00,-24.00,0.39,0.00,1.00,-158.40,-28.80,0 +-163.20,-28.80,0.32,0.00,1.00,-153.60,-33.60,0 +-158.40,-28.80,0.26,0.00,1.00,-148.80,-33.60,0 +-158.40,-33.60,0.19,0.00,1.00,-144.00,-38.40,0 +-153.60,-38.40,0.13,0.00,1.00,-139.20,-43.20,0 +-148.80,-43.20,0.06,0.00,1.00,-134.40,-48.00,0 +-144.00,-48.00,0.00,0.00,1.00,-129.60,-48.00,0 +-139.20,-48.00,0.00,0.00,1.00,-124.80,-52.80,0 +-134.40,-52.80,0.16,0.00,1.00,-120.00,-57.60,0 +-129.60,-57.60,0.32,0.00,1.00,-115.20,-57.60,0 +-120.00,-57.60,0.48,0.00,1.00,-105.60,-62.40,0 +-110.40,-57.60,0.65,0.00,1.00,-100.80,-62.40,0 +-100.80,-62.40,0.81,0.00,1.00,-96.00,-62.40,0 +-91.20,-62.40,0.97,0.00,1.00,-91.20,-62.40,0 +-81.60,-62.40,1.13,0.00,1.00,-86.40,-62.40,0 +-72.00,-62.40,1.29,0.00,1.00,-81.60,-57.60,0 +-62.40,-57.60,1.45,0.00,1.00,-76.80,-57.60,0 +-57.60,-57.60,1.62,0.00,1.00,-72.00,-52.80,0 +-48.00,-52.80,1.78,0.00,1.00,-62.40,-52.80,0 +-43.20,-52.80,1.94,0.00,1.00,-57.60,-48.00,0 +-38.40,-48.00,2.10,0.00,1.00,-52.80,-43.20,0 +-33.60,-43.20,2.26,0.00,1.00,-48.00,-43.20,0 +-28.80,-38.40,2.42,0.00,1.00,-43.20,-38.40,0 +-24.00,-38.40,2.59,0.00,1.00,-38.40,-33.60,0 +-19.20,-33.60,2.75,0.00,1.00,-33.60,-28.80,0 +-19.20,-28.80,2.91,0.00,1.00,-28.80,-24.00,0 +-14.40,-24.00,3.07,0.00,1.00,-24.00,-19.20,0 +-14.40,-19.20,3.23,0.00,1.00,-19.20,-19.20,0 +-9.60,-14.40,3.39,0.00,1.00,-19.20,-14.40,0 +-4.80,-14.40,3.56,0.00,1.00,-14.40,-9.60,0 +-4.80,-9.60,3.72,0.00,1.00,-9.60,-4.80,0 +-0.00,-4.80,3.88,0.00,1.00,-4.80,0.00,0 +0.00,0.00,4.04,0.00,1.00,0.00,4.80,0 +4.80,4.80,4.20,0.00,1.00,4.80,9.60,0 +4.80,9.60,4.36,0.00,1.00,9.60,14.40,0 +9.60,9.60,4.53,0.00,1.00,14.40,14.40,0 +9.60,14.40,4.69,0.00,1.00,14.40,19.20,0 +14.40,19.20,4.85,0.00,1.00,19.20,24.00,0 +19.20,24.00,5.01,0.00,1.00,24.00,28.80,0 +19.20,28.80,5.17,0.00,1.00,28.80,33.60,0 +24.00,28.80,5.33,0.00,1.00,33.60,33.60,0 +28.80,33.60,5.49,0.00,1.00,38.40,38.40,0 +33.60,38.40,5.66,0.00,1.00,43.20,43.20,0 +38.40,43.20,5.82,0.00,1.00,48.00,43.20,0 +43.20,43.20,5.98,0.00,1.00,52.80,48.00,0 +48.00,48.00,6.14,0.00,1.00,57.60,52.80,0 +52.80,48.00,6.30,0.00,1.00,62.40,52.80,0 +57.60,52.80,6.46,0.00,1.00,67.20,57.60,0 +67.20,52.80,6.63,0.00,1.00,72.00,57.60,0 +76.80,57.60,6.79,0.00,1.00,81.60,57.60,0 +81.60,57.60,6.95,0.00,1.00,86.40,57.60,0 +91.20,57.60,7.11,0.00,1.00,91.20,57.60,0 +100.80,57.60,7.27,0.00,1.00,96.00,57.60,0 +110.40,52.80,7.43,0.00,1.00,100.80,52.80,0 +115.20,52.80,7.60,0.00,1.00,110.40,52.80,0 +124.80,52.80,7.76,0.00,1.00,115.20,48.00,0 +129.60,48.00,7.92,0.00,1.00,120.00,48.00,0 +134.40,48.00,8.08,0.00,1.00,124.80,43.20,0 +139.20,43.20,8.24,0.00,1.00,129.60,38.40,0 +144.00,38.40,8.40,0.00,1.00,134.40,38.40,0 +148.80,38.40,8.57,0.00,1.00,139.20,33.60,0 +153.60,33.60,8.73,0.00,1.00,144.00,28.80,0 +158.40,28.80,8.89,0.00,1.00,148.80,24.00,0 +163.20,24.00,9.05,0.00,1.00,153.60,24.00,0 +163.20,24.00,9.21,0.00,1.00,158.40,19.20,0 +168.00,19.20,9.37,0.00,1.00,163.20,14.40,0 +172.80,14.40,9.54,0.00,1.00,168.00,9.60,0 +172.80,9.60,9.70,0.00,1.00,168.00,4.80,0 +177.60,4.80,9.86,0.00,1.00,172.80,0.00,0 +177.60,0.00,10.02,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,10.18,0.00,1.00,-177.60,-4.80,0 +-177.60,-4.80,10.34,0.00,1.00,-172.80,-9.60,0 +-172.80,-9.60,10.51,0.00,1.00,-168.00,-14.40,0 +-172.80,-14.40,10.67,0.00,1.00,-168.00,-19.20,0 +-168.00,-19.20,10.83,0.00,1.00,-163.20,-24.00,0 +-163.20,-24.00,10.99,0.00,1.00,-158.40,-24.00,0 +-163.20,-24.00,11.15,0.00,1.00,-153.60,-28.80,0 +-158.40,-28.80,11.31,0.00,1.00,-148.80,-33.60,0 +-153.60,-33.60,11.47,0.00,1.00,-144.00,-38.40,0 +-148.80,-38.40,11.64,0.00,1.00,-139.20,-38.40,0 +-144.00,-38.40,11.80,0.00,1.00,-134.40,-43.20,0 +-139.20,-43.20,11.96,0.00,1.00,-129.60,-48.00,0 +-134.40,-48.00,12.12,0.00,1.00,-124.80,-48.00,0 +-129.60,-48.00,12.28,0.00,1.00,-120.00,-52.80,0 +-124.80,-52.80,12.44,0.00,1.00,-115.20,-52.80,0 +-115.20,-52.80,12.61,0.00,1.00,-110.40,-57.60,0 +-110.40,-52.80,12.77,0.00,1.00,-100.80,-57.60,0 +-100.80,-57.60,12.93,0.00,1.00,-96.00,-57.60,0 +-91.20,-57.60,13.09,0.00,1.00,-91.20,-57.60,0 +-81.60,-57.60,13.25,0.00,1.00,-86.40,-57.60,0 +-76.80,-57.60,13.41,0.00,1.00,-81.60,-57.60,0 +-67.20,-52.80,13.58,0.00,1.00,-72.00,-52.80,0 +-57.60,-52.80,13.74,0.00,1.00,-67.20,-52.80,0 +-52.80,-48.00,13.90,0.00,1.00,-62.40,-48.00,0 +-48.00,-48.00,14.06,0.00,1.00,-57.60,-43.20,0 +-43.20,-43.20,14.22,0.00,1.00,-52.80,-43.20,0 +-38.40,-43.20,14.38,0.00,1.00,-48.00,-38.40,0 +-33.60,-38.40,14.55,0.00,1.00,-43.20,-33.60,0 +-28.80,-33.60,14.71,0.00,1.00,-38.40,-33.60,0 +-24.00,-28.80,14.87,0.00,1.00,-33.60,-28.80,0 +-19.20,-28.80,15.03,0.00,1.00,-28.80,-24.00,0 +-19.20,-24.00,15.19,0.00,1.00,-24.00,-19.20,0 +-14.40,-19.20,15.35,0.00,1.00,-19.20,-14.40,0 +-9.60,-14.40,15.52,0.00,1.00,-14.40,-14.40,0 +-9.60,-9.60,15.68,0.00,1.00,-14.40,-9.60,0 +-4.80,-9.60,15.84,0.00,1.00,-9.60,-4.80,0 +-4.80,-4.80,16.00,0.00,1.00,-4.80,0.00,0 +0.00,0.00,16.00,0.00,1.00,0.00,4.80,0 +4.80,4.80,15.84,0.00,1.00,4.80,9.60,0 +4.80,9.60,15.68,0.00,1.00,9.60,9.60,0 +9.60,9.60,15.52,0.00,1.00,9.60,14.40,0 +14.40,14.40,15.35,0.00,1.00,14.40,19.20,0 +14.40,19.20,15.19,0.00,1.00,19.20,24.00,0 +19.20,24.00,15.03,0.00,1.00,24.00,24.00,0 +24.00,24.00,14.87,0.00,1.00,28.80,28.80,0 +24.00,28.80,14.71,0.00,1.00,33.60,33.60,0 +28.80,33.60,14.55,0.00,1.00,38.40,38.40,0 +33.60,33.60,14.38,0.00,1.00,43.20,38.40,0 +38.40,38.40,14.22,0.00,1.00,48.00,43.20,0 +43.20,43.20,14.06,0.00,1.00,52.80,43.20,0 +48.00,43.20,13.90,0.00,1.00,57.60,48.00,0 +57.60,48.00,13.74,0.00,1.00,62.40,48.00,0 +62.40,48.00,13.58,0.00,1.00,67.20,52.80,0 +67.20,48.00,13.41,0.00,1.00,72.00,52.80,0 +76.80,52.80,13.25,0.00,1.00,81.60,52.80,0 +86.40,52.80,13.09,0.00,1.00,86.40,52.80,0 +91.20,52.80,12.93,0.00,1.00,91.20,52.80,0 +100.80,52.80,12.77,0.00,1.00,96.00,52.80,0 +105.60,48.00,12.61,0.00,1.00,105.60,48.00,0 +115.20,48.00,12.44,0.00,1.00,110.40,48.00,0 +120.00,48.00,12.28,0.00,1.00,115.20,48.00,0 +124.80,43.20,12.12,0.00,1.00,120.00,43.20,0 +134.40,43.20,11.96,0.00,1.00,124.80,43.20,0 +139.20,38.40,11.80,0.00,1.00,129.60,38.40,0 +144.00,38.40,11.64,0.00,1.00,134.40,33.60,0 +148.80,33.60,11.47,0.00,1.00,139.20,33.60,0 +153.60,28.80,11.31,0.00,1.00,144.00,28.80,0 +153.60,28.80,11.15,0.00,1.00,148.80,24.00,0 +158.40,24.00,10.99,0.00,1.00,153.60,19.20,0 +163.20,19.20,10.83,0.00,1.00,158.40,19.20,0 +168.00,14.40,10.67,0.00,1.00,163.20,14.40,0 +168.00,14.40,10.51,0.00,1.00,168.00,9.60,0 +172.80,9.60,10.34,0.00,1.00,172.80,4.80,0 +177.60,4.80,10.18,0.00,1.00,172.80,0.00,0 +177.60,0.00,10.02,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,9.86,0.00,1.00,-177.60,-4.80,0 +-177.60,-4.80,9.70,0.00,1.00,-172.80,-9.60,0 +-172.80,-9.60,9.54,0.00,1.00,-172.80,-14.40,0 +-168.00,-14.40,9.37,0.00,1.00,-168.00,-19.20,0 +-168.00,-14.40,9.21,0.00,1.00,-163.20,-19.20,0 +-163.20,-19.20,9.05,0.00,1.00,-158.40,-24.00,0 +-158.40,-24.00,8.89,0.00,1.00,-153.60,-28.80,0 +-153.60,-28.80,8.73,0.00,1.00,-148.80,-33.60,0 +-153.60,-28.80,8.57,0.00,1.00,-144.00,-33.60,0 +-148.80,-33.60,8.40,0.00,1.00,-139.20,-38.40,0 +-144.00,-38.40,8.24,0.00,1.00,-134.40,-43.20,0 +-139.20,-38.40,8.08,0.00,1.00,-129.60,-43.20,0 +-134.40,-43.20,7.92,0.00,1.00,-124.80,-48.00,0 +-124.80,-43.20,7.76,0.00,1.00,-120.00,-48.00,0 +-120.00,-48.00,7.60,0.00,1.00,-115.20,-48.00,0 +-115.20,-48.00,7.43,0.00,1.00,-110.40,-52.80,0 +-105.60,-48.00,7.27,0.00,1.00,-105.60,-52.80,0 +-100.80,-52.80,7.11,0.00,1.00,-96.00,-52.80,0 +-91.20,-52.80,6.95,0.00,1.00,-91.20,-52.80,0 +-86.40,-52.80,6.79,0.00,1.00,-86.40,-52.80,0 +-76.80,-52.80,6.63,0.00,1.00,-81.60,-52.80,0 +-67.20,-48.00,6.46,0.00,1.00,-72.00,-48.00,0 +-62.40,-48.00,6.30,0.00,1.00,-67.20,-48.00,0 +-57.60,-48.00,6.14,0.00,1.00,-62.40,-43.20,0 +-48.00,-43.20,5.98,0.00,1.00,-57.60,-43.20,0 +-43.20,-43.20,5.82,0.00,1.00,-52.80,-38.40,0 +-38.40,-38.40,5.66,0.00,1.00,-48.00,-38.40,0 +-33.60,-33.60,5.49,0.00,1.00,-43.20,-33.60,0 +-28.80,-33.60,5.33,0.00,1.00,-38.40,-28.80,0 +-24.00,-28.80,5.17,0.00,1.00,-33.60,-24.00,0 +-24.00,-24.00,5.01,0.00,1.00,-28.80,-24.00,0 +-19.20,-24.00,4.85,0.00,1.00,-24.00,-19.20,0 +-14.40,-19.20,4.69,0.00,1.00,-19.20,-14.40,0 +-14.40,-14.40,4.53,0.00,1.00,-14.40,-9.60,0 +-9.60,-9.60,4.36,0.00,1.00,-9.60,-9.60,0 +-4.80,-9.60,4.20,0.00,1.00,-9.60,-4.80,0 +-4.80,-4.80,4.04,0.00,1.00,-4.80,0.00,0 +0.00,0.00,3.88,0.00,1.00,0.00,4.80,0 +4.80,4.80,3.72,0.00,1.00,4.80,4.80,0 +4.80,4.80,3.56,0.00,1.00,4.80,9.60,0 +9.60,9.60,3.39,0.00,1.00,9.60,14.40,0 +14.40,14.40,3.23,0.00,1.00,14.40,19.20,0 +19.20,19.20,3.07,0.00,1.00,19.20,19.20,0 +19.20,19.20,2.91,0.00,1.00,24.00,24.00,0 +24.00,24.00,2.75,0.00,1.00,24.00,28.80,0 +28.80,28.80,2.59,0.00,1.00,28.80,28.80,0 +33.60,28.80,2.42,0.00,1.00,33.60,33.60,0 +38.40,33.60,2.26,0.00,1.00,38.40,38.40,0 +43.20,33.60,2.10,0.00,1.00,43.20,38.40,0 +48.00,38.40,1.94,0.00,1.00,48.00,43.20,0 +52.80,38.40,1.78,0.00,1.00,52.80,43.20,0 +57.60,43.20,1.62,0.00,1.00,62.40,43.20,0 +62.40,43.20,1.45,0.00,1.00,67.20,48.00,0 +72.00,43.20,1.29,0.00,1.00,72.00,48.00,0 +76.80,48.00,1.13,0.00,1.00,76.80,48.00,0 +86.40,48.00,0.97,0.00,1.00,86.40,48.00,0 +91.20,48.00,0.81,0.00,1.00,91.20,48.00,0 +100.80,48.00,0.65,0.00,1.00,96.00,48.00,0 +105.60,48.00,0.48,0.00,1.00,105.60,48.00,0 +110.40,43.20,0.32,0.00,1.00,110.40,43.20,0 +120.00,43.20,0.16,0.00,1.00,115.20,43.20,0 +124.80,43.20,0.00,0.00,1.00,124.80,38.40,0 +129.60,38.40,0.00,0.00,1.00,129.60,38.40,0 +134.40,38.40,0.04,0.00,1.00,134.40,33.60,0 +139.20,33.60,0.08,0.00,1.00,139.20,33.60,0 +144.00,33.60,0.12,0.00,1.00,144.00,28.80,0 +148.80,28.80,0.16,0.00,1.00,148.80,24.00,0 +153.60,24.00,0.20,0.00,1.00,153.60,24.00,0 +158.40,24.00,0.24,0.00,1.00,158.40,19.20,0 +163.20,19.20,0.28,0.00,1.00,158.40,14.40,0 +163.20,14.40,0.32,0.00,1.00,163.20,14.40,0 +168.00,14.40,0.36,0.00,1.00,168.00,9.60,0 +172.80,9.60,0.40,0.00,1.00,172.80,4.80,0 +172.80,4.80,0.44,0.00,1.00,172.80,0.00,0 +177.60,0.00,0.48,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,0.52,0.00,1.00,-177.60,-4.80,0 +-172.80,-4.80,0.56,0.00,1.00,-172.80,-9.60,0 +-172.80,-9.60,0.60,0.00,1.00,-172.80,-14.40,0 +-168.00,-14.40,0.64,0.00,1.00,-168.00,-14.40,0 +-163.20,-14.40,0.68,0.00,1.00,-163.20,-19.20,0 +-163.20,-19.20,0.72,0.00,1.00,-158.40,-24.00,0 +-158.40,-24.00,0.76,0.00,1.00,-158.40,-24.00,0 +-153.60,-24.00,0.80,0.00,1.00,-153.60,-28.80,0 +-148.80,-28.80,0.84,0.00,1.00,-148.80,-33.60,0 +-144.00,-33.60,0.88,0.00,1.00,-144.00,-33.60,0 +-139.20,-33.60,0.92,0.00,1.00,-139.20,-38.40,0 +-134.40,-38.40,0.96,0.00,1.00,-134.40,-38.40,0 +-129.60,-38.40,1.00,0.00,1.00,-129.60,-43.20,0 +-124.80,-43.20,1.04,0.00,1.00,-124.80,-43.20,0 +-120.00,-43.20,1.08,0.00,1.00,-115.20,-48.00,0 +-110.40,-43.20,1.12,0.00,1.00,-110.40,-48.00,0 +-105.60,-48.00,1.16,0.00,1.00,-105.60,-48.00,0 +-100.80,-48.00,1.20,0.00,1.00,-96.00,-48.00,0 +-91.20,-48.00,1.24,0.00,1.00,-91.20,-48.00,0 +-86.40,-48.00,1.28,0.00,1.00,-86.40,-48.00,0 +-76.80,-48.00,1.32,0.00,1.00,-76.80,-48.00,0 +-72.00,-43.20,1.36,0.00,1.00,-72.00,-43.20,0 +-62.40,-43.20,1.40,0.00,1.00,-67.20,-43.20,0 +-57.60,-43.20,1.44,0.00,1.00,-62.40,-43.20,0 +-52.80,-38.40,1.48,0.00,1.00,-52.80,-38.40,0 +-48.00,-38.40,1.52,0.00,1.00,-48.00,-38.40,0 +-43.20,-33.60,1.56,0.00,1.00,-43.20,-33.60,0 +-38.40,-33.60,1.60,0.00,1.00,-38.40,-28.80,0 +-33.60,-28.80,1.64,0.00,1.00,-33.60,-28.80,0 +-28.80,-28.80,1.68,0.00,1.00,-28.80,-24.00,0 +-24.00,-24.00,1.72,0.00,1.00,-24.00,-19.20,0 +-19.20,-19.20,1.76,0.00,1.00,-24.00,-19.20,0 +-19.20,-19.20,1.80,0.00,1.00,-19.20,-14.40,0 +-14.40,-14.40,1.84,0.00,1.00,-14.40,-9.60,0 +-9.60,-9.60,1.88,0.00,1.00,-9.60,-4.80,0 +-4.80,-4.80,1.92,0.00,1.00,-4.80,-4.80,0 +-4.80,-4.80,1.96,0.00,1.00,-4.80,0.00,0 +0.00,0.00,2.01,0.00,1.00,0.00,4.80,0 +4.80,4.80,2.05,0.00,1.00,4.80,4.80,0 +4.80,4.80,2.09,0.00,1.00,4.80,9.60,0 +9.60,9.60,2.13,0.00,1.00,9.60,14.40,0 +14.40,14.40,2.17,0.00,1.00,14.40,14.40,0 +19.20,14.40,2.21,0.00,1.00,14.40,19.20,0 +24.00,19.20,2.25,0.00,1.00,19.20,24.00,0 +24.00,24.00,2.29,0.00,1.00,24.00,24.00,0 +28.80,24.00,2.33,0.00,1.00,28.80,28.80,0 +33.60,28.80,2.37,0.00,1.00,33.60,28.80,0 +38.40,28.80,2.41,0.00,1.00,38.40,33.60,0 +43.20,33.60,2.45,0.00,1.00,43.20,33.60,0 +48.00,33.60,2.49,0.00,1.00,48.00,38.40,0 +52.80,38.40,2.53,0.00,1.00,52.80,38.40,0 +62.40,38.40,2.57,0.00,1.00,57.60,38.40,0 +67.20,38.40,2.61,0.00,1.00,62.40,43.20,0 +72.00,38.40,2.65,0.00,1.00,72.00,43.20,0 +76.80,43.20,2.69,0.00,1.00,76.80,43.20,0 +86.40,43.20,2.73,0.00,1.00,86.40,43.20,0 +91.20,43.20,2.77,0.00,1.00,91.20,43.20,0 +96.00,43.20,2.81,0.00,1.00,100.80,43.20,0 +105.60,43.20,2.85,0.00,1.00,105.60,43.20,0 +110.40,38.40,2.89,0.00,1.00,110.40,38.40,0 +115.20,38.40,2.93,0.00,1.00,120.00,38.40,0 +120.00,38.40,2.97,0.00,1.00,124.80,38.40,0 +129.60,33.60,3.01,0.00,1.00,129.60,33.60,0 +134.40,33.60,3.05,0.00,1.00,134.40,33.60,0 +139.20,28.80,3.09,0.00,1.00,139.20,28.80,0 +144.00,28.80,3.13,0.00,1.00,144.00,28.80,0 +148.80,24.00,3.17,0.00,1.00,148.80,24.00,0 +153.60,24.00,3.21,0.00,1.00,153.60,19.20,0 +153.60,19.20,3.25,0.00,1.00,158.40,19.20,0 +158.40,19.20,3.29,0.00,1.00,163.20,14.40,0 +163.20,14.40,3.33,0.00,1.00,163.20,9.60,0 +168.00,9.60,3.37,0.00,1.00,168.00,9.60,0 +172.80,9.60,3.41,0.00,1.00,172.80,4.80,0 +172.80,4.80,3.45,0.00,1.00,172.80,0.00,0 +177.60,0.00,3.49,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,3.53,0.00,1.00,-177.60,-4.80,0 +-172.80,-4.80,3.57,0.00,1.00,-172.80,-9.60,0 +-172.80,-9.60,3.61,0.00,1.00,-172.80,-9.60,0 +-168.00,-9.60,3.65,0.00,1.00,-168.00,-14.40,0 +-163.20,-14.40,3.69,0.00,1.00,-163.20,-19.20,0 +-158.40,-19.20,3.73,0.00,1.00,-163.20,-19.20,0 +-153.60,-19.20,3.77,0.00,1.00,-158.40,-24.00,0 +-153.60,-24.00,3.81,0.00,1.00,-153.60,-28.80,0 +-148.80,-24.00,3.85,0.00,1.00,-148.80,-28.80,0 +-144.00,-28.80,3.89,0.00,1.00,-144.00,-33.60,0 +-139.20,-28.80,3.93,0.00,1.00,-139.20,-33.60,0 +-134.40,-33.60,3.97,0.00,1.00,-134.40,-38.40,0 +-129.60,-33.60,4.01,0.00,1.00,-129.60,-38.40,0 +-120.00,-38.40,4.05,0.00,1.00,-124.80,-38.40,0 +-115.20,-38.40,4.09,0.00,1.00,-120.00,-43.20,0 +-110.40,-38.40,4.13,0.00,1.00,-110.40,-43.20,0 +-105.60,-43.20,4.17,0.00,1.00,-105.60,-43.20,0 +-96.00,-43.20,4.21,0.00,1.00,-100.80,-43.20,0 +-91.20,-43.20,4.25,0.00,1.00,-91.20,-43.20,0 +-86.40,-43.20,4.29,0.00,1.00,-86.40,-43.20,0 +-76.80,-43.20,4.33,0.00,1.00,-76.80,-43.20,0 +-72.00,-38.40,4.37,0.00,1.00,-72.00,-38.40,0 +-67.20,-38.40,4.41,0.00,1.00,-62.40,-38.40,0 +-62.40,-38.40,4.45,0.00,1.00,-57.60,-38.40,0 +-52.80,-38.40,4.49,0.00,1.00,-52.80,-33.60,0 +-48.00,-33.60,4.53,0.00,1.00,-48.00,-33.60,0 +-43.20,-33.60,4.57,0.00,1.00,-43.20,-28.80,0 +-38.40,-28.80,4.61,0.00,1.00,-38.40,-28.80,0 +-33.60,-28.80,4.65,0.00,1.00,-33.60,-24.00,0 +-28.80,-24.00,4.69,0.00,1.00,-28.80,-24.00,0 +-24.00,-24.00,4.73,0.00,1.00,-24.00,-19.20,0 +-24.00,-19.20,4.77,0.00,1.00,-19.20,-14.40,0 +-19.20,-14.40,4.81,0.00,1.00,-14.40,-14.40,0 +-14.40,-14.40,4.85,0.00,1.00,-14.40,-9.60,0 +-9.60,-9.60,4.89,0.00,1.00,-9.60,-4.80,0 +-4.80,-4.80,4.93,0.00,1.00,-4.80,-4.80,0 +-4.80,-4.80,4.97,0.00,1.00,-4.80,0.00,0 +0.00,0.00,5.01,0.00,1.00,0.00,4.80,0 +4.80,4.80,5.05,0.00,1.00,4.80,4.80,0 +9.60,4.80,5.09,0.00,1.00,4.80,9.60,0 +9.60,9.60,5.13,0.00,1.00,9.60,9.60,0 +14.40,9.60,5.17,0.00,1.00,9.60,14.40,0 +19.20,14.40,5.21,0.00,1.00,14.40,19.20,0 +24.00,19.20,5.25,0.00,1.00,19.20,19.20,0 +28.80,19.20,5.29,0.00,1.00,24.00,24.00,0 +33.60,24.00,5.33,0.00,1.00,24.00,24.00,0 +38.40,24.00,5.37,0.00,1.00,28.80,28.80,0 +43.20,28.80,5.41,0.00,1.00,33.60,28.80,0 +48.00,28.80,5.45,0.00,1.00,38.40,33.60,0 +52.80,28.80,5.49,0.00,1.00,43.20,33.60,0 +57.60,33.60,5.53,0.00,1.00,48.00,33.60,0 +62.40,33.60,5.57,0.00,1.00,52.80,38.40,0 +67.20,33.60,5.61,0.00,1.00,62.40,38.40,0 +72.00,38.40,5.65,0.00,1.00,67.20,38.40,0 +81.60,38.40,5.69,0.00,1.00,76.80,38.40,0 +86.40,38.40,5.73,0.00,1.00,86.40,38.40,0 +91.20,38.40,5.77,0.00,1.00,91.20,38.40,0 +96.00,38.40,5.81,0.00,1.00,100.80,38.40,0 +105.60,38.40,5.85,0.00,1.00,105.60,38.40,0 +110.40,33.60,5.89,0.00,1.00,115.20,33.60,0 +115.20,33.60,5.93,0.00,1.00,120.00,33.60,0 +120.00,33.60,5.97,0.00,1.00,129.60,33.60,0 +124.80,33.60,6.02,0.00,1.00,134.40,28.80,0 +129.60,28.80,6.06,0.00,1.00,139.20,28.80,0 +134.40,28.80,6.10,0.00,1.00,144.00,24.00,0 +139.20,24.00,6.14,0.00,1.00,148.80,24.00,0 +144.00,24.00,6.18,0.00,1.00,153.60,19.20,0 +148.80,19.20,6.22,0.00,1.00,158.40,19.20,0 +153.60,19.20,6.26,0.00,1.00,158.40,14.40,0 +158.40,14.40,6.30,0.00,1.00,163.20,14.40,0 +163.20,14.40,6.34,0.00,1.00,168.00,9.60,0 +168.00,9.60,6.38,0.00,1.00,168.00,9.60,0 +168.00,9.60,6.42,0.00,1.00,172.80,4.80,0 +172.80,4.80,6.46,0.00,1.00,177.60,0.00,0 +177.60,0.00,6.50,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,6.54,0.00,1.00,-177.60,-4.80,0 +-172.80,-4.80,6.58,0.00,1.00,-177.60,-9.60,0 +-168.00,-9.60,6.62,0.00,1.00,-172.80,-9.60,0 +-168.00,-9.60,6.66,0.00,1.00,-168.00,-14.40,0 +-163.20,-14.40,6.70,0.00,1.00,-168.00,-14.40,0 +-158.40,-14.40,6.74,0.00,1.00,-163.20,-19.20,0 +-153.60,-19.20,6.78,0.00,1.00,-158.40,-19.20,0 +-148.80,-19.20,6.82,0.00,1.00,-158.40,-24.00,0 +-144.00,-24.00,6.86,0.00,1.00,-153.60,-24.00,0 +-139.20,-24.00,6.90,0.00,1.00,-148.80,-28.80,0 +-134.40,-28.80,6.94,0.00,1.00,-144.00,-28.80,0 +-129.60,-28.80,6.98,0.00,1.00,-139.20,-33.60,0 +-124.80,-33.60,7.02,0.00,1.00,-134.40,-33.60,0 +-120.00,-33.60,7.06,0.00,1.00,-129.60,-33.60,0 +-115.20,-33.60,7.10,0.00,1.00,-120.00,-38.40,0 +-110.40,-33.60,7.14,0.00,1.00,-115.20,-38.40,0 +-105.60,-38.40,7.18,0.00,1.00,-105.60,-38.40,0 +-96.00,-38.40,7.22,0.00,1.00,-100.80,-38.40,0 +-91.20,-38.40,7.26,0.00,1.00,-91.20,-38.40,0 +-86.40,-38.40,7.30,0.00,1.00,-86.40,-38.40,0 +-81.60,-38.40,7.34,0.00,1.00,-76.80,-38.40,0 +-72.00,-38.40,7.38,0.00,1.00,-67.20,-38.40,0 +-67.20,-33.60,7.42,0.00,1.00,-62.40,-33.60,0 +-62.40,-33.60,7.46,0.00,1.00,-52.80,-33.60,0 +-57.60,-33.60,7.50,0.00,1.00,-48.00,-33.60,0 +-52.80,-28.80,7.54,0.00,1.00,-43.20,-28.80,0 +-48.00,-28.80,7.58,0.00,1.00,-38.40,-28.80,0 +-43.20,-28.80,7.62,0.00,1.00,-33.60,-24.00,0 +-38.40,-24.00,7.66,0.00,1.00,-28.80,-24.00,0 +-33.60,-24.00,7.70,0.00,1.00,-24.00,-19.20,0 +-28.80,-19.20,7.74,0.00,1.00,-24.00,-19.20,0 +-24.00,-19.20,7.78,0.00,1.00,-19.20,-14.40,0 +-19.20,-14.40,7.82,0.00,1.00,-14.40,-9.60,0 +-14.40,-9.60,7.86,0.00,1.00,-9.60,-9.60,0 +-9.60,-9.60,7.90,0.00,1.00,-9.60,-4.80,0 +-9.60,-4.80,7.94,0.00,1.00,-4.80,-4.80,0 +-4.80,-4.80,7.98,0.00,1.00,-4.80,0.00,0 +0.00,0.00,8.02,0.00,1.00,0.00,4.80,0 +4.80,4.80,8.06,0.00,1.00,4.80,4.80,0 +9.60,4.80,8.10,0.00,1.00,4.80,9.60,0 +14.40,9.60,8.14,0.00,1.00,9.60,9.60,0 +14.40,9.60,8.18,0.00,1.00,9.60,14.40,0 +19.20,14.40,8.22,0.00,1.00,14.40,14.40,0 +24.00,14.40,8.26,0.00,1.00,14.40,19.20,0 +28.80,19.20,8.30,0.00,1.00,19.20,19.20,0 +33.60,19.20,8.34,0.00,1.00,24.00,24.00,0 +38.40,19.20,8.38,0.00,1.00,28.80,24.00,0 +43.20,24.00,8.42,0.00,1.00,28.80,24.00,0 +48.00,24.00,8.46,0.00,1.00,33.60,28.80,0 +52.80,28.80,8.50,0.00,1.00,38.40,28.80,0 +57.60,28.80,8.54,0.00,1.00,48.00,28.80,0 +62.40,28.80,8.58,0.00,1.00,52.80,33.60,0 +67.20,28.80,8.62,0.00,1.00,57.60,33.60,0 +76.80,33.60,8.66,0.00,1.00,67.20,33.60,0 +81.60,33.60,8.70,0.00,1.00,76.80,33.60,0 +86.40,33.60,8.74,0.00,1.00,81.60,33.60,0 +91.20,33.60,8.78,0.00,1.00,91.20,33.60,0 +96.00,33.60,8.82,0.00,1.00,100.80,33.60,0 +100.80,33.60,8.86,0.00,1.00,110.40,33.60,0 +110.40,28.80,8.90,0.00,1.00,115.20,33.60,0 +115.20,28.80,8.94,0.00,1.00,124.80,28.80,0 +120.00,28.80,8.98,0.00,1.00,129.60,28.80,0 +124.80,28.80,9.02,0.00,1.00,139.20,28.80,0 +129.60,24.00,9.06,0.00,1.00,144.00,24.00,0 +134.40,24.00,9.10,0.00,1.00,148.80,24.00,0 +139.20,24.00,9.14,0.00,1.00,153.60,19.20,0 +144.00,19.20,9.18,0.00,1.00,153.60,19.20,0 +148.80,19.20,9.22,0.00,1.00,158.40,14.40,0 +153.60,14.40,9.26,0.00,1.00,163.20,14.40,0 +158.40,14.40,9.30,0.00,1.00,163.20,9.60,0 +163.20,9.60,9.34,0.00,1.00,168.00,9.60,0 +168.00,9.60,9.38,0.00,1.00,172.80,4.80,0 +168.00,4.80,9.42,0.00,1.00,172.80,4.80,0 +172.80,4.80,9.46,0.00,1.00,177.60,0.00,0 +177.60,0.00,9.50,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,9.54,0.00,1.00,-177.60,-4.80,0 +-172.80,-4.80,9.58,0.00,1.00,-177.60,-4.80,0 +-168.00,-4.80,9.62,0.00,1.00,-172.80,-9.60,0 +-168.00,-9.60,9.66,0.00,1.00,-172.80,-9.60,0 +-163.20,-9.60,9.70,0.00,1.00,-168.00,-14.40,0 +-158.40,-14.40,9.74,0.00,1.00,-163.20,-14.40,0 +-153.60,-14.40,9.78,0.00,1.00,-163.20,-19.20,0 +-148.80,-19.20,9.82,0.00,1.00,-158.40,-19.20,0 +-144.00,-19.20,9.86,0.00,1.00,-153.60,-24.00,0 +-139.20,-24.00,9.90,0.00,1.00,-153.60,-24.00,0 +-134.40,-24.00,9.94,0.00,1.00,-148.80,-28.80,0 +-129.60,-24.00,9.98,0.00,1.00,-144.00,-28.80,0 +-124.80,-28.80,10.03,0.00,1.00,-139.20,-28.80,0 +-120.00,-28.80,10.07,0.00,1.00,-129.60,-33.60,0 +-115.20,-28.80,10.11,0.00,1.00,-124.80,-33.60,0 +-110.40,-28.80,10.15,0.00,1.00,-115.20,-33.60,0 +-100.80,-33.60,10.19,0.00,1.00,-110.40,-33.60,0 +-96.00,-33.60,10.23,0.00,1.00,-100.80,-33.60,0 +-91.20,-33.60,10.27,0.00,1.00,-91.20,-33.60,0 +-86.40,-33.60,10.31,0.00,1.00,-81.60,-33.60,0 +-81.60,-33.60,10.35,0.00,1.00,-76.80,-33.60,0 +-76.80,-33.60,10.39,0.00,1.00,-67.20,-33.60,0 +-67.20,-28.80,10.43,0.00,1.00,-57.60,-28.80,0 +-62.40,-28.80,10.47,0.00,1.00,-52.80,-28.80,0 +-57.60,-28.80,10.51,0.00,1.00,-48.00,-28.80,0 +-52.80,-28.80,10.55,0.00,1.00,-38.40,-24.00,0 +-48.00,-24.00,10.59,0.00,1.00,-33.60,-24.00,0 +-43.20,-24.00,10.63,0.00,1.00,-28.80,-24.00,0 +-38.40,-19.20,10.67,0.00,1.00,-28.80,-19.20,0 +-33.60,-19.20,10.71,0.00,1.00,-24.00,-19.20,0 +-28.80,-19.20,10.75,0.00,1.00,-19.20,-14.40,0 +-24.00,-14.40,10.79,0.00,1.00,-14.40,-14.40,0 +-19.20,-14.40,10.83,0.00,1.00,-14.40,-9.60,0 +-14.40,-9.60,10.87,0.00,1.00,-9.60,-9.60,0 +-14.40,-9.60,10.91,0.00,1.00,-9.60,-4.80,0 +-9.60,-4.80,10.95,0.00,1.00,-4.80,-4.80,0 +-4.80,-4.80,10.99,0.00,1.00,-4.80,0.00,0 +0.00,0.00,11.03,0.00,1.00,0.00,0.00,0 +4.80,0.00,11.07,0.00,1.00,0.00,4.80,0 +9.60,4.80,11.11,0.00,1.00,4.80,4.80,0 +14.40,4.80,11.15,0.00,1.00,4.80,9.60,0 +19.20,9.60,11.19,0.00,1.00,9.60,9.60,0 +19.20,9.60,11.23,0.00,1.00,9.60,14.40,0 +24.00,14.40,11.27,0.00,1.00,14.40,14.40,0 +28.80,14.40,11.31,0.00,1.00,19.20,19.20,0 +33.60,14.40,11.35,0.00,1.00,19.20,19.20,0 +38.40,19.20,11.39,0.00,1.00,24.00,19.20,0 +43.20,19.20,11.43,0.00,1.00,28.80,24.00,0 +48.00,24.00,11.47,0.00,1.00,33.60,24.00,0 +52.80,24.00,11.51,0.00,1.00,38.40,24.00,0 +57.60,24.00,11.55,0.00,1.00,43.20,24.00,0 +62.40,24.00,11.59,0.00,1.00,48.00,28.80,0 +72.00,24.00,11.63,0.00,1.00,52.80,28.80,0 +76.80,28.80,11.67,0.00,1.00,62.40,28.80,0 +81.60,28.80,11.71,0.00,1.00,72.00,28.80,0 +86.40,28.80,11.75,0.00,1.00,81.60,28.80,0 +91.20,28.80,11.79,0.00,1.00,91.20,28.80,0 +96.00,28.80,11.83,0.00,1.00,100.80,28.80,0 +100.80,28.80,11.87,0.00,1.00,110.40,28.80,0 +105.60,28.80,11.91,0.00,1.00,120.00,28.80,0 +110.40,24.00,11.95,0.00,1.00,129.60,24.00,0 +120.00,24.00,11.99,0.00,1.00,134.40,24.00,0 +124.80,24.00,12.03,0.00,1.00,139.20,24.00,0 +129.60,24.00,12.07,0.00,1.00,144.00,24.00,0 +134.40,19.20,12.11,0.00,1.00,148.80,19.20,0 +139.20,19.20,12.15,0.00,1.00,153.60,19.20,0 +144.00,19.20,12.19,0.00,1.00,158.40,14.40,0 +148.80,14.40,12.23,0.00,1.00,163.20,14.40,0 +153.60,14.40,12.27,0.00,1.00,163.20,14.40,0 +158.40,9.60,12.31,0.00,1.00,168.00,9.60,0 +158.40,9.60,12.35,0.00,1.00,168.00,9.60,0 +163.20,9.60,12.39,0.00,1.00,172.80,4.80,0 +168.00,4.80,12.43,0.00,1.00,172.80,4.80,0 +172.80,4.80,12.47,0.00,1.00,177.60,0.00,0 +177.60,0.00,12.51,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,12.55,0.00,1.00,-177.60,-4.80,0 +-172.80,-4.80,12.59,0.00,1.00,-177.60,-4.80,0 +-168.00,-4.80,12.63,0.00,1.00,-172.80,-9.60,0 +-163.20,-9.60,12.67,0.00,1.00,-172.80,-9.60,0 +-158.40,-9.60,12.71,0.00,1.00,-168.00,-14.40,0 +-158.40,-9.60,12.75,0.00,1.00,-168.00,-14.40,0 +-153.60,-14.40,12.79,0.00,1.00,-163.20,-14.40,0 +-148.80,-14.40,12.83,0.00,1.00,-163.20,-19.20,0 +-144.00,-19.20,12.87,0.00,1.00,-158.40,-19.20,0 +-139.20,-19.20,12.91,0.00,1.00,-153.60,-24.00,0 +-134.40,-19.20,12.95,0.00,1.00,-148.80,-24.00,0 +-129.60,-24.00,12.99,0.00,1.00,-144.00,-24.00,0 +-124.80,-24.00,13.03,0.00,1.00,-139.20,-24.00,0 +-120.00,-24.00,13.07,0.00,1.00,-134.40,-28.80,0 +-110.40,-24.00,13.11,0.00,1.00,-129.60,-28.80,0 +-105.60,-28.80,13.15,0.00,1.00,-120.00,-28.80,0 +-100.80,-28.80,13.19,0.00,1.00,-110.40,-28.80,0 +-96.00,-28.80,13.23,0.00,1.00,-100.80,-28.80,0 +-91.20,-28.80,13.27,0.00,1.00,-91.20,-28.80,0 +-86.40,-28.80,13.31,0.00,1.00,-81.60,-28.80,0 +-81.60,-28.80,13.35,0.00,1.00,-72.00,-28.80,0 +-76.80,-28.80,13.39,0.00,1.00,-62.40,-28.80,0 +-72.00,-24.00,13.43,0.00,1.00,-52.80,-24.00,0 +-62.40,-24.00,13.47,0.00,1.00,-48.00,-24.00,0 +-57.60,-24.00,13.51,0.00,1.00,-43.20,-24.00,0 +-52.80,-24.00,13.55,0.00,1.00,-38.40,-24.00,0 +-48.00,-24.00,13.59,0.00,1.00,-33.60,-19.20,0 +-43.20,-19.20,13.63,0.00,1.00,-28.80,-19.20,0 +-38.40,-19.20,13.67,0.00,1.00,-24.00,-19.20,0 +-33.60,-14.40,13.71,0.00,1.00,-19.20,-14.40,0 +-28.80,-14.40,13.75,0.00,1.00,-19.20,-14.40,0 +-24.00,-14.40,13.79,0.00,1.00,-14.40,-9.60,0 +-19.20,-9.60,13.83,0.00,1.00,-9.60,-9.60,0 +-19.20,-9.60,13.87,0.00,1.00,-9.60,-4.80,0 +-14.40,-4.80,13.91,0.00,1.00,-4.80,-4.80,0 +-9.60,-4.80,13.95,0.00,1.00,-4.80,-0.00,0 +-4.80,-0.00,13.99,0.00,1.00,-0.00,0.00,0 +0.00,0.00,14.04,0.00,1.00,0.00,0.00,0 +4.80,0.00,14.08,0.00,1.00,0.00,4.80,0 +9.60,4.80,14.12,0.00,1.00,4.80,4.80,0 +14.40,4.80,14.16,0.00,1.00,4.80,9.60,0 +19.20,9.60,14.20,0.00,1.00,9.60,9.60,0 +24.00,9.60,14.24,0.00,1.00,9.60,9.60,0 +28.80,9.60,14.28,0.00,1.00,14.40,14.40,0 +33.60,14.40,14.32,0.00,1.00,14.40,14.40,0 +38.40,14.40,14.36,0.00,1.00,19.20,14.40,0 +43.20,14.40,14.40,0.00,1.00,19.20,19.20,0 +48.00,14.40,14.44,0.00,1.00,24.00,19.20,0 +52.80,19.20,14.48,0.00,1.00,28.80,19.20,0 +57.60,19.20,14.52,0.00,1.00,33.60,19.20,0 +62.40,19.20,14.56,0.00,1.00,38.40,24.00,0 +67.20,19.20,14.60,0.00,1.00,43.20,24.00,0 +72.00,24.00,14.64,0.00,1.00,48.00,24.00,0 +76.80,24.00,14.68,0.00,1.00,57.60,24.00,0 +81.60,24.00,14.72,0.00,1.00,67.20,24.00,0 +86.40,24.00,14.76,0.00,1.00,81.60,24.00,0 +91.20,24.00,14.80,0.00,1.00,91.20,24.00,0 +96.00,24.00,14.84,0.00,1.00,105.60,24.00,0 +100.80,24.00,14.88,0.00,1.00,115.20,24.00,0 +105.60,24.00,14.92,0.00,1.00,124.80,24.00,0 +110.40,19.20,14.96,0.00,1.00,134.40,19.20,0 +115.20,19.20,15.00,0.00,1.00,139.20,19.20,0 +120.00,19.20,15.04,0.00,1.00,144.00,19.20,0 +124.80,19.20,15.08,0.00,1.00,148.80,19.20,0 +129.60,19.20,15.12,0.00,1.00,153.60,19.20,0 +134.40,14.40,15.16,0.00,1.00,158.40,14.40,0 +139.20,14.40,15.20,0.00,1.00,163.20,14.40,0 +144.00,14.40,15.24,0.00,1.00,163.20,14.40,0 +148.80,9.60,15.28,0.00,1.00,168.00,9.60,0 +153.60,9.60,15.32,0.00,1.00,168.00,9.60,0 +158.40,9.60,15.36,0.00,1.00,172.80,4.80,0 +163.20,4.80,15.40,0.00,1.00,172.80,4.80,0 +168.00,4.80,15.44,0.00,1.00,177.60,4.80,0 +172.80,4.80,15.48,0.00,1.00,177.60,0.00,0 +177.60,0.00,15.52,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,15.56,0.00,1.00,-177.60,-4.80,0 +-172.80,-4.80,15.60,0.00,1.00,-177.60,-4.80,0 +-168.00,-4.80,15.64,0.00,1.00,-177.60,-4.80,0 +-163.20,-4.80,15.68,0.00,1.00,-172.80,-9.60,0 +-158.40,-9.60,15.72,0.00,1.00,-172.80,-9.60,0 +-153.60,-9.60,15.76,0.00,1.00,-168.00,-14.40,0 +-148.80,-9.60,15.80,0.00,1.00,-168.00,-14.40,0 +-144.00,-14.40,15.84,0.00,1.00,-163.20,-14.40,0 +-139.20,-14.40,15.88,0.00,1.00,-163.20,-19.20,0 +-134.40,-14.40,15.92,0.00,1.00,-158.40,-19.20,0 +-129.60,-19.20,15.96,0.00,1.00,-153.60,-19.20,0 +-124.80,-19.20,16.00,0.00,1.00,-148.80,-19.20,0 +-120.00,-19.20,16.00,0.00,1.00,-144.00,-19.20,0 +-115.20,-19.20,15.96,0.00,1.00,-139.20,-24.00,0 +-110.40,-19.20,15.92,0.00,1.00,-134.40,-24.00,0 +-105.60,-24.00,15.88,0.00,1.00,-124.80,-24.00,0 +-100.80,-24.00,15.84,0.00,1.00,-115.20,-24.00,0 +-96.00,-24.00,15.80,0.00,1.00,-105.60,-24.00,0 +-91.20,-24.00,15.76,0.00,1.00,-91.20,-24.00,0 +-86.40,-24.00,15.72,0.00,1.00,-81.60,-24.00,0 +-81.60,-24.00,15.68,0.00,1.00,-67.20,-24.00,0 +-76.80,-24.00,15.64,0.00,1.00,-57.60,-24.00,0 +-72.00,-24.00,15.60,0.00,1.00,-48.00,-24.00,0 +-67.20,-19.20,15.56,0.00,1.00,-43.20,-19.20,0 +-62.40,-19.20,15.52,0.00,1.00,-38.40,-19.20,0 +-57.60,-19.20,15.48,0.00,1.00,-33.60,-19.20,0 +-52.80,-19.20,15.44,0.00,1.00,-28.80,-19.20,0 +-48.00,-14.40,15.40,0.00,1.00,-24.00,-14.40,0 +-43.20,-14.40,15.36,0.00,1.00,-19.20,-14.40,0 +-38.40,-14.40,15.32,0.00,1.00,-19.20,-14.40,0 +-33.60,-14.40,15.28,0.00,1.00,-14.40,-9.60,0 +-28.80,-9.60,15.24,0.00,1.00,-14.40,-9.60,0 +-24.00,-9.60,15.20,0.00,1.00,-9.60,-9.60,0 +-19.20,-9.60,15.16,0.00,1.00,-9.60,-4.80,0 +-14.40,-4.80,15.12,0.00,1.00,-4.80,-4.80,0 +-9.60,-4.80,15.08,0.00,1.00,-4.80,-0.00,0 +-4.80,-0.00,15.04,0.00,1.00,-0.00,0.00,0 +0.00,0.00,15.00,0.00,1.00,0.00,0.00,0 +4.80,0.00,14.96,0.00,1.00,0.00,4.80,0 +9.60,4.80,14.92,0.00,1.00,4.80,4.80,0 +14.40,4.80,14.88,0.00,1.00,4.80,4.80,0 +19.20,4.80,14.84,0.00,1.00,4.80,9.60,0 +24.00,9.60,14.80,0.00,1.00,9.60,9.60,0 +28.80,9.60,14.76,0.00,1.00,9.60,9.60,0 +33.60,9.60,14.72,0.00,1.00,9.60,9.60,0 +38.40,9.60,14.68,0.00,1.00,14.40,14.40,0 +43.20,14.40,14.64,0.00,1.00,14.40,14.40,0 +48.00,14.40,14.60,0.00,1.00,19.20,14.40,0 +52.80,14.40,14.56,0.00,1.00,24.00,14.40,0 +57.60,14.40,14.52,0.00,1.00,24.00,19.20,0 +62.40,14.40,14.48,0.00,1.00,28.80,19.20,0 +67.20,14.40,14.44,0.00,1.00,38.40,19.20,0 +72.00,19.20,14.40,0.00,1.00,43.20,19.20,0 +76.80,19.20,14.36,0.00,1.00,52.80,19.20,0 +81.60,19.20,14.32,0.00,1.00,62.40,19.20,0 +86.40,19.20,14.28,0.00,1.00,76.80,19.20,0 +91.20,19.20,14.24,0.00,1.00,96.00,19.20,0 +96.00,19.20,14.20,0.00,1.00,110.40,19.20,0 +100.80,19.20,14.16,0.00,1.00,120.00,19.20,0 +105.60,19.20,14.12,0.00,1.00,134.40,19.20,0 +110.40,19.20,14.08,0.00,1.00,139.20,19.20,0 +115.20,14.40,14.04,0.00,1.00,148.80,14.40,0 +120.00,14.40,13.99,0.00,1.00,153.60,14.40,0 +124.80,14.40,13.95,0.00,1.00,158.40,14.40,0 +129.60,14.40,13.91,0.00,1.00,158.40,14.40,0 +134.40,14.40,13.87,0.00,1.00,163.20,14.40,0 +139.20,9.60,13.83,0.00,1.00,163.20,9.60,0 +144.00,9.60,13.79,0.00,1.00,168.00,9.60,0 +148.80,9.60,13.75,0.00,1.00,168.00,9.60,0 +153.60,9.60,13.71,0.00,1.00,172.80,4.80,0 +158.40,4.80,13.67,0.00,1.00,172.80,4.80,0 +163.20,4.80,13.63,0.00,1.00,172.80,4.80,0 +168.00,4.80,13.59,0.00,1.00,177.60,0.00,0 +172.80,0.00,13.55,0.00,1.00,177.60,0.00,0 +177.60,0.00,13.51,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,13.47,0.00,1.00,-177.60,-0.00,0 +-172.80,-0.00,13.43,0.00,1.00,-177.60,-4.80,0 +-168.00,-4.80,13.39,0.00,1.00,-177.60,-4.80,0 +-163.20,-4.80,13.35,0.00,1.00,-172.80,-4.80,0 +-158.40,-4.80,13.31,0.00,1.00,-172.80,-9.60,0 +-153.60,-9.60,13.27,0.00,1.00,-172.80,-9.60,0 +-148.80,-9.60,13.23,0.00,1.00,-168.00,-9.60,0 +-144.00,-9.60,13.19,0.00,1.00,-168.00,-14.40,0 +-139.20,-9.60,13.15,0.00,1.00,-163.20,-14.40,0 +-134.40,-14.40,13.11,0.00,1.00,-163.20,-14.40,0 +-129.60,-14.40,13.07,0.00,1.00,-158.40,-14.40,0 +-124.80,-14.40,13.03,0.00,1.00,-158.40,-14.40,0 +-120.00,-14.40,12.99,0.00,1.00,-153.60,-19.20,0 +-115.20,-14.40,12.95,0.00,1.00,-148.80,-19.20,0 +-110.40,-19.20,12.91,0.00,1.00,-139.20,-19.20,0 +-105.60,-19.20,12.87,0.00,1.00,-134.40,-19.20,0 +-100.80,-19.20,12.83,0.00,1.00,-120.00,-19.20,0 +-96.00,-19.20,12.79,0.00,1.00,-110.40,-19.20,0 +-91.20,-19.20,12.75,0.00,1.00,-96.00,-19.20,0 +-86.40,-19.20,12.71,0.00,1.00,-76.80,-19.20,0 +-81.60,-19.20,12.67,0.00,1.00,-62.40,-19.20,0 +-76.80,-19.20,12.63,0.00,1.00,-52.80,-19.20,0 +-72.00,-19.20,12.59,0.00,1.00,-43.20,-19.20,0 +-67.20,-14.40,12.55,0.00,1.00,-38.40,-19.20,0 +-62.40,-14.40,12.51,0.00,1.00,-28.80,-14.40,0 +-57.60,-14.40,12.47,0.00,1.00,-24.00,-14.40,0 +-52.80,-14.40,12.43,0.00,1.00,-24.00,-14.40,0 +-48.00,-14.40,12.39,0.00,1.00,-19.20,-14.40,0 +-43.20,-14.40,12.35,0.00,1.00,-14.40,-9.60,0 +-38.40,-9.60,12.31,0.00,1.00,-14.40,-9.60,0 +-33.60,-9.60,12.27,0.00,1.00,-9.60,-9.60,0 +-28.80,-9.60,12.23,0.00,1.00,-9.60,-9.60,0 +-24.00,-9.60,12.19,0.00,1.00,-9.60,-4.80,0 +-19.20,-4.80,12.15,0.00,1.00,-4.80,-4.80,0 +-14.40,-4.80,12.11,0.00,1.00,-4.80,-4.80,0 +-9.60,-4.80,12.07,0.00,1.00,-4.80,-0.00,0 +-4.80,-0.00,12.03,0.00,1.00,-0.00,0.00,0 +0.00,0.00,11.99,0.00,1.00,0.00,0.00,0 +4.80,0.00,11.95,0.00,1.00,0.00,0.00,0 +9.60,0.00,11.91,0.00,1.00,0.00,4.80,0 +14.40,4.80,11.87,0.00,1.00,4.80,4.80,0 +19.20,4.80,11.83,0.00,1.00,4.80,4.80,0 +24.00,4.80,11.79,0.00,1.00,4.80,4.80,0 +28.80,4.80,11.75,0.00,1.00,4.80,9.60,0 +33.60,9.60,11.71,0.00,1.00,9.60,9.60,0 +38.40,9.60,11.67,0.00,1.00,9.60,9.60,0 +43.20,9.60,11.63,0.00,1.00,14.40,9.60,0 +48.00,9.60,11.59,0.00,1.00,14.40,9.60,0 +52.80,9.60,11.55,0.00,1.00,14.40,14.40,0 +57.60,9.60,11.51,0.00,1.00,19.20,14.40,0 +62.40,9.60,11.47,0.00,1.00,24.00,14.40,0 +67.20,14.40,11.43,0.00,1.00,28.80,14.40,0 +72.00,14.40,11.39,0.00,1.00,33.60,14.40,0 +76.80,14.40,11.35,0.00,1.00,43.20,14.40,0 +81.60,14.40,11.31,0.00,1.00,57.60,14.40,0 +86.40,14.40,11.27,0.00,1.00,76.80,14.40,0 +91.20,14.40,11.23,0.00,1.00,96.00,14.40,0 +96.00,14.40,11.19,0.00,1.00,115.20,14.40,0 +100.80,14.40,11.15,0.00,1.00,129.60,14.40,0 +105.60,14.40,11.11,0.00,1.00,139.20,14.40,0 +110.40,14.40,11.07,0.00,1.00,148.80,14.40,0 +115.20,9.60,11.03,0.00,1.00,153.60,14.40,0 +120.00,9.60,10.99,0.00,1.00,158.40,9.60,0 +124.80,9.60,10.95,0.00,1.00,163.20,9.60,0 +129.60,9.60,10.91,0.00,1.00,163.20,9.60,0 +134.40,9.60,10.87,0.00,1.00,168.00,9.60,0 +139.20,9.60,10.83,0.00,1.00,168.00,9.60,0 +144.00,9.60,10.79,0.00,1.00,172.80,9.60,0 +148.80,4.80,10.75,0.00,1.00,172.80,4.80,0 +153.60,4.80,10.71,0.00,1.00,172.80,4.80,0 +158.40,4.80,10.67,0.00,1.00,172.80,4.80,0 +163.20,4.80,10.63,0.00,1.00,177.60,4.80,0 +168.00,4.80,10.59,0.00,1.00,177.60,0.00,0 +172.80,0.00,10.55,0.00,1.00,177.60,0.00,0 +177.60,0.00,10.51,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,10.47,0.00,1.00,-177.60,-0.00,0 +-172.80,-0.00,10.43,0.00,1.00,-177.60,-4.80,0 +-168.00,-4.80,10.39,0.00,1.00,-177.60,-4.80,0 +-163.20,-4.80,10.35,0.00,1.00,-177.60,-4.80,0 +-158.40,-4.80,10.31,0.00,1.00,-172.80,-4.80,0 +-153.60,-4.80,10.27,0.00,1.00,-172.80,-9.60,0 +-148.80,-4.80,10.23,0.00,1.00,-172.80,-9.60,0 +-144.00,-9.60,10.19,0.00,1.00,-172.80,-9.60,0 +-139.20,-9.60,10.15,0.00,1.00,-168.00,-9.60,0 +-134.40,-9.60,10.11,0.00,1.00,-168.00,-9.60,0 +-129.60,-9.60,10.07,0.00,1.00,-163.20,-9.60,0 +-124.80,-9.60,10.03,0.00,1.00,-163.20,-14.40,0 +-120.00,-9.60,9.98,0.00,1.00,-158.40,-14.40,0 +-115.20,-9.60,9.94,0.00,1.00,-153.60,-14.40,0 +-110.40,-14.40,9.90,0.00,1.00,-148.80,-14.40,0 +-105.60,-14.40,9.86,0.00,1.00,-139.20,-14.40,0 +-100.80,-14.40,9.82,0.00,1.00,-129.60,-14.40,0 +-96.00,-14.40,9.78,0.00,1.00,-115.20,-14.40,0 +-91.20,-14.40,9.74,0.00,1.00,-96.00,-14.40,0 +-86.40,-14.40,9.70,0.00,1.00,-76.80,-14.40,0 +-81.60,-14.40,9.66,0.00,1.00,-57.60,-14.40,0 +-76.80,-14.40,9.62,0.00,1.00,-43.20,-14.40,0 +-72.00,-14.40,9.58,0.00,1.00,-33.60,-14.40,0 +-67.20,-14.40,9.54,0.00,1.00,-28.80,-14.40,0 +-62.40,-9.60,9.50,0.00,1.00,-24.00,-14.40,0 +-57.60,-9.60,9.46,0.00,1.00,-19.20,-9.60,0 +-52.80,-9.60,9.42,0.00,1.00,-14.40,-9.60,0 +-48.00,-9.60,9.38,0.00,1.00,-14.40,-9.60,0 +-43.20,-9.60,9.34,0.00,1.00,-14.40,-9.60,0 +-38.40,-9.60,9.30,0.00,1.00,-9.60,-9.60,0 +-33.60,-9.60,9.26,0.00,1.00,-9.60,-4.80,0 +-28.80,-4.80,9.22,0.00,1.00,-4.80,-4.80,0 +-24.00,-4.80,9.18,0.00,1.00,-4.80,-4.80,0 +-19.20,-4.80,9.14,0.00,1.00,-4.80,-4.80,0 +-14.40,-4.80,9.10,0.00,1.00,-4.80,-0.00,0 +-9.60,-0.00,9.06,0.00,1.00,-0.00,-0.00,0 +-4.80,-0.00,9.02,0.00,1.00,-0.00,0.00,0 +0.00,0.00,8.98,0.00,1.00,0.00,0.00,0 +4.80,0.00,8.94,0.00,1.00,0.00,0.00,0 +9.60,0.00,8.90,0.00,1.00,0.00,0.00,0 +14.40,0.00,8.86,0.00,1.00,0.00,4.80,0 +19.20,4.80,8.82,0.00,1.00,4.80,4.80,0 +24.00,4.80,8.78,0.00,1.00,4.80,4.80,0 +28.80,4.80,8.74,0.00,1.00,4.80,4.80,0 +33.60,4.80,8.70,0.00,1.00,4.80,4.80,0 +38.40,4.80,8.66,0.00,1.00,4.80,4.80,0 +43.20,4.80,8.62,0.00,1.00,9.60,4.80,0 +48.00,4.80,8.58,0.00,1.00,9.60,9.60,0 +52.80,4.80,8.54,0.00,1.00,9.60,9.60,0 +57.60,4.80,8.50,0.00,1.00,14.40,9.60,0 +62.40,9.60,8.46,0.00,1.00,14.40,9.60,0 +67.20,9.60,8.42,0.00,1.00,19.20,9.60,0 +72.00,9.60,8.38,0.00,1.00,24.00,9.60,0 +76.80,9.60,8.34,0.00,1.00,33.60,9.60,0 +81.60,9.60,8.30,0.00,1.00,43.20,9.60,0 +86.40,9.60,8.26,0.00,1.00,67.20,9.60,0 +91.20,9.60,8.22,0.00,1.00,96.00,9.60,0 +96.00,9.60,8.18,0.00,1.00,124.80,9.60,0 +100.80,9.60,8.14,0.00,1.00,144.00,9.60,0 +105.60,9.60,8.10,0.00,1.00,153.60,9.60,0 +110.40,9.60,8.06,0.00,1.00,158.40,9.60,0 +115.20,9.60,8.02,0.00,1.00,163.20,9.60,0 +120.00,9.60,7.98,0.00,1.00,168.00,9.60,0 +124.80,4.80,7.94,0.00,1.00,168.00,9.60,0 +129.60,4.80,7.90,0.00,1.00,168.00,4.80,0 +134.40,4.80,7.86,0.00,1.00,172.80,4.80,0 +139.20,4.80,7.82,0.00,1.00,172.80,4.80,0 +144.00,4.80,7.78,0.00,1.00,172.80,4.80,0 +148.80,4.80,7.74,0.00,1.00,172.80,4.80,0 +153.60,4.80,7.70,0.00,1.00,177.60,4.80,0 +158.40,4.80,7.66,0.00,1.00,177.60,4.80,0 +163.20,4.80,7.62,0.00,1.00,177.60,0.00,0 +168.00,0.00,7.58,0.00,1.00,177.60,0.00,0 +172.80,0.00,7.54,0.00,1.00,177.60,0.00,0 +177.60,0.00,7.50,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,7.46,0.00,1.00,-177.60,-0.00,0 +-172.80,-0.00,7.42,0.00,1.00,-177.60,-0.00,0 +-168.00,-0.00,7.38,0.00,1.00,-177.60,-4.80,0 +-163.20,-4.80,7.34,0.00,1.00,-177.60,-4.80,0 +-158.40,-4.80,7.30,0.00,1.00,-177.60,-4.80,0 +-153.60,-4.80,7.26,0.00,1.00,-177.60,-4.80,0 +-148.80,-4.80,7.22,0.00,1.00,-172.80,-4.80,0 +-144.00,-4.80,7.18,0.00,1.00,-172.80,-4.80,0 +-139.20,-4.80,7.14,0.00,1.00,-172.80,-4.80,0 +-134.40,-4.80,7.10,0.00,1.00,-172.80,-9.60,0 +-129.60,-4.80,7.06,0.00,1.00,-168.00,-9.60,0 +-124.80,-4.80,7.02,0.00,1.00,-168.00,-9.60,0 +-120.00,-9.60,6.98,0.00,1.00,-168.00,-9.60,0 +-115.20,-9.60,6.94,0.00,1.00,-163.20,-9.60,0 +-110.40,-9.60,6.90,0.00,1.00,-158.40,-9.60,0 +-105.60,-9.60,6.86,0.00,1.00,-153.60,-9.60,0 +-100.80,-9.60,6.82,0.00,1.00,-144.00,-9.60,0 +-96.00,-9.60,6.78,0.00,1.00,-124.80,-9.60,0 +-91.20,-9.60,6.74,0.00,1.00,-96.00,-9.60,0 +-86.40,-9.60,6.70,0.00,1.00,-67.20,-9.60,0 +-81.60,-9.60,6.66,0.00,1.00,-43.20,-9.60,0 +-76.80,-9.60,6.62,0.00,1.00,-33.60,-9.60,0 +-72.00,-9.60,6.58,0.00,1.00,-24.00,-9.60,0 +-67.20,-9.60,6.54,0.00,1.00,-19.20,-9.60,0 +-62.40,-9.60,6.50,0.00,1.00,-14.40,-9.60,0 +-57.60,-4.80,6.46,0.00,1.00,-14.40,-9.60,0 +-52.80,-4.80,6.42,0.00,1.00,-9.60,-4.80,0 +-48.00,-4.80,6.38,0.00,1.00,-9.60,-4.80,0 +-43.20,-4.80,6.34,0.00,1.00,-9.60,-4.80,0 +-38.40,-4.80,6.30,0.00,1.00,-4.80,-4.80,0 +-33.60,-4.80,6.26,0.00,1.00,-4.80,-4.80,0 +-28.80,-4.80,6.22,0.00,1.00,-4.80,-4.80,0 +-24.00,-4.80,6.18,0.00,1.00,-4.80,-4.80,0 +-19.20,-4.80,6.14,0.00,1.00,-4.80,-0.00,0 +-14.40,-0.00,6.10,0.00,1.00,-0.00,-0.00,0 +-9.60,-0.00,6.06,0.00,1.00,-0.00,-0.00,0 +-4.80,-0.00,6.02,0.00,1.00,-0.00,0.00,0 +0.00,0.00,5.97,0.00,1.00,0.00,0.00,0 +4.80,0.00,5.93,0.00,1.00,0.00,0.00,0 +9.60,0.00,5.89,0.00,1.00,0.00,0.00,0 +14.40,0.00,5.85,0.00,1.00,0.00,0.00,0 +19.20,0.00,5.81,0.00,1.00,0.00,0.00,0 +24.00,0.00,5.77,0.00,1.00,0.00,0.00,0 +28.80,0.00,5.73,0.00,1.00,0.00,4.80,0 +33.60,0.00,5.69,0.00,1.00,0.00,4.80,0 +38.40,0.00,5.65,0.00,1.00,4.80,4.80,0 +43.20,4.80,5.61,0.00,1.00,4.80,4.80,0 +48.00,4.80,5.57,0.00,1.00,4.80,4.80,0 +52.80,4.80,5.53,0.00,1.00,4.80,4.80,0 +57.60,4.80,5.49,0.00,1.00,4.80,4.80,0 +62.40,4.80,5.45,0.00,1.00,4.80,4.80,0 +67.20,4.80,5.41,0.00,1.00,9.60,4.80,0 +72.00,4.80,5.37,0.00,1.00,9.60,4.80,0 +76.80,4.80,5.33,0.00,1.00,14.40,4.80,0 +81.60,4.80,5.29,0.00,1.00,24.00,4.80,0 +86.40,4.80,5.25,0.00,1.00,43.20,4.80,0 +91.20,4.80,5.21,0.00,1.00,110.40,4.80,0 +96.00,4.80,5.17,0.00,1.00,148.80,4.80,0 +100.80,4.80,5.13,0.00,1.00,163.20,4.80,0 +105.60,4.80,5.09,0.00,1.00,168.00,4.80,0 +110.40,4.80,5.05,0.00,1.00,172.80,4.80,0 +115.20,4.80,5.01,0.00,1.00,172.80,4.80,0 +120.00,4.80,4.97,0.00,1.00,172.80,4.80,0 +124.80,4.80,4.93,0.00,1.00,172.80,4.80,0 +129.60,4.80,4.89,0.00,1.00,177.60,4.80,0 +134.40,4.80,4.85,0.00,1.00,177.60,4.80,0 +139.20,0.00,4.81,0.00,1.00,177.60,4.80,0 +144.00,0.00,4.77,0.00,1.00,177.60,4.80,0 +148.80,0.00,4.73,0.00,1.00,177.60,0.00,0 +153.60,0.00,4.69,0.00,1.00,177.60,0.00,0 +158.40,0.00,4.65,0.00,1.00,177.60,0.00,0 +163.20,0.00,4.61,0.00,1.00,177.60,0.00,0 +168.00,0.00,4.57,0.00,1.00,177.60,0.00,0 +172.80,0.00,4.53,0.00,1.00,177.60,0.00,0 +177.60,0.00,4.49,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,4.45,0.00,1.00,-177.60,-0.00,0 +-172.80,-0.00,4.41,0.00,1.00,-177.60,-0.00,0 +-168.00,-0.00,4.37,0.00,1.00,-177.60,-0.00,0 +-163.20,-0.00,4.33,0.00,1.00,-177.60,-0.00,0 +-158.40,-0.00,4.29,0.00,1.00,-177.60,-0.00,0 +-153.60,-0.00,4.25,0.00,1.00,-177.60,-4.80,0 +-148.80,-0.00,4.21,0.00,1.00,-177.60,-4.80,0 +-144.00,-0.00,4.17,0.00,1.00,-177.60,-4.80,0 +-139.20,-0.00,4.13,0.00,1.00,-177.60,-4.80,0 +-134.40,-4.80,4.09,0.00,1.00,-177.60,-4.80,0 +-129.60,-4.80,4.05,0.00,1.00,-177.60,-4.80,0 +-124.80,-4.80,4.01,0.00,1.00,-172.80,-4.80,0 +-120.00,-4.80,3.97,0.00,1.00,-172.80,-4.80,0 +-115.20,-4.80,3.93,0.00,1.00,-172.80,-4.80,0 +-110.40,-4.80,3.89,0.00,1.00,-172.80,-4.80,0 +-105.60,-4.80,3.85,0.00,1.00,-168.00,-4.80,0 +-100.80,-4.80,3.81,0.00,1.00,-163.20,-4.80,0 +-96.00,-4.80,3.77,0.00,1.00,-148.80,-4.80,0 +-91.20,-4.80,3.73,0.00,1.00,-110.40,-4.80,0 +-86.40,-4.80,3.69,0.00,1.00,-43.20,-4.80,0 +-81.60,-4.80,3.65,0.00,1.00,-24.00,-4.80,0 +-76.80,-4.80,3.61,0.00,1.00,-14.40,-4.80,0 +-72.00,-4.80,3.57,0.00,1.00,-9.60,-4.80,0 +-67.20,-4.80,3.53,0.00,1.00,-9.60,-4.80,0 +-62.40,-4.80,3.49,0.00,1.00,-4.80,-4.80,0 +-57.60,-4.80,3.45,0.00,1.00,-4.80,-4.80,0 +-52.80,-4.80,3.41,0.00,1.00,-4.80,-4.80,0 +-48.00,-4.80,3.37,0.00,1.00,-4.80,-4.80,0 +-43.20,-4.80,3.33,0.00,1.00,-4.80,-4.80,0 +-38.40,-0.00,3.29,0.00,1.00,-4.80,-4.80,0 +-33.60,-0.00,3.25,0.00,1.00,-0.00,-0.00,0 +-28.80,-0.00,3.21,0.00,1.00,-0.00,-0.00,0 +-24.00,-0.00,3.17,0.00,1.00,-0.00,-0.00,0 +-19.20,-0.00,3.13,0.00,1.00,-0.00,-0.00,0 +-14.40,-0.00,3.09,0.00,1.00,-0.00,-0.00,0 +-9.60,-0.00,3.05,0.00,1.00,-0.00,-0.00,0 +-4.80,-0.00,3.01,0.00,1.00,-0.00,0.00,0 +0.00,0.00,2.97,0.00,1.00,-0.00,0.00,0 +4.80,-0.00,2.93,0.00,1.00,-0.00,0.00,0 +9.60,-0.00,2.89,0.00,1.00,-0.00,0.00,0 +14.40,-0.00,2.85,0.00,1.00,-0.00,0.00,0 +19.20,-0.00,2.81,0.00,1.00,-0.00,0.00,0 +24.00,-0.00,2.77,0.00,1.00,-0.00,0.00,0 +28.80,-0.00,2.73,0.00,1.00,-0.00,0.00,0 +33.60,-0.00,2.69,0.00,1.00,-0.00,0.00,0 +38.40,-0.00,2.65,0.00,1.00,-0.00,0.00,0 +43.20,-0.00,2.61,0.00,1.00,-0.00,0.00,0 +48.00,-0.00,2.57,0.00,1.00,-0.00,0.00,0 +52.80,-0.00,2.53,0.00,1.00,-0.00,0.00,0 +57.60,-0.00,2.49,0.00,1.00,-0.00,0.00,0 +62.40,-0.00,2.45,0.00,1.00,-0.00,0.00,0 +67.20,-0.00,2.41,0.00,1.00,-4.80,0.00,0 +72.00,-0.00,2.37,0.00,1.00,-4.80,0.00,0 +76.80,-0.00,2.33,0.00,1.00,-4.80,0.00,0 +81.60,-0.00,2.29,0.00,1.00,-9.60,0.00,0 +86.40,-0.00,2.25,0.00,1.00,-19.20,0.00,0 +91.20,-0.00,2.21,0.00,1.00,-134.40,0.00,0 +96.00,-0.00,2.17,0.00,1.00,-168.00,0.00,0 +100.80,-0.00,2.13,0.00,1.00,-172.80,0.00,0 +105.60,-0.00,2.09,0.00,1.00,-177.60,0.00,0 +110.40,-0.00,2.05,0.00,1.00,-177.60,0.00,0 +115.20,-0.00,2.01,0.00,1.00,-177.60,0.00,0 +120.00,-0.00,1.96,0.00,1.00,-177.60,0.00,0 +124.80,-0.00,1.92,0.00,1.00,-177.60,0.00,0 +129.60,-0.00,1.88,0.00,1.00,-177.60,0.00,0 +134.40,-0.00,1.84,0.00,1.00,-177.60,0.00,0 +139.20,-0.00,1.80,0.00,1.00,-177.60,0.00,0 +144.00,-0.00,1.76,0.00,1.00,-177.60,0.00,0 +148.80,-0.00,1.72,0.00,1.00,-177.60,0.00,0 +153.60,-0.00,1.68,0.00,1.00,-177.60,0.00,0 +158.40,-0.00,1.64,0.00,1.00,-177.60,0.00,0 +163.20,-0.00,1.60,0.00,1.00,-177.60,0.00,0 +168.00,-0.00,1.56,0.00,1.00,-177.60,0.00,0 +172.80,-0.00,1.52,0.00,1.00,-177.60,0.00,0 +177.60,-0.00,1.48,0.00,1.00,-177.60,0.00,0 +-177.60,0.00,1.44,0.00,1.00,177.60,0.00,0 +-172.80,0.00,1.40,0.00,1.00,177.60,0.00,0 +-168.00,0.00,1.36,0.00,1.00,177.60,0.00,0 +-163.20,0.00,1.32,0.00,1.00,177.60,0.00,0 +-158.40,0.00,1.28,0.00,1.00,177.60,0.00,0 +-153.60,0.00,1.24,0.00,1.00,177.60,0.00,0 +-148.80,0.00,1.20,0.00,1.00,177.60,0.00,0 +-144.00,0.00,1.16,0.00,1.00,177.60,0.00,0 +-139.20,0.00,1.12,0.00,1.00,177.60,0.00,0 +-134.40,0.00,1.08,0.00,1.00,177.60,0.00,0 +-129.60,0.00,1.04,0.00,1.00,177.60,0.00,0 +-124.80,0.00,1.00,0.00,1.00,177.60,0.00,0 +-120.00,0.00,0.96,0.00,1.00,177.60,0.00,0 +-115.20,0.00,0.92,0.00,1.00,177.60,0.00,0 +-110.40,0.00,0.88,0.00,1.00,177.60,0.00,0 +-105.60,0.00,0.84,0.00,1.00,177.60,0.00,0 +-100.80,0.00,0.80,0.00,1.00,172.80,0.00,0 +-96.00,0.00,0.76,0.00,1.00,168.00,0.00,0 +-91.20,0.00,0.72,0.00,1.00,134.40,0.00,0 +-86.40,0.00,0.68,0.00,1.00,19.20,0.00,0 +-81.60,0.00,0.64,0.00,1.00,9.60,0.00,0 +-76.80,0.00,0.60,0.00,1.00,4.80,0.00,0 +-72.00,0.00,0.56,0.00,1.00,4.80,0.00,0 +-67.20,0.00,0.52,0.00,1.00,4.80,0.00,0 +-62.40,0.00,0.48,0.00,1.00,0.00,0.00,0 +-57.60,0.00,0.44,0.00,1.00,0.00,0.00,0 +-52.80,0.00,0.40,0.00,1.00,0.00,0.00,0 +-48.00,0.00,0.36,0.00,1.00,0.00,0.00,0 +-43.20,0.00,0.32,0.00,1.00,0.00,0.00,0 +-38.40,0.00,0.28,0.00,1.00,0.00,0.00,0 +-33.60,0.00,0.24,0.00,1.00,0.00,0.00,0 +-28.80,0.00,0.20,0.00,1.00,0.00,0.00,0 +-24.00,0.00,0.16,0.00,1.00,0.00,0.00,0 +-19.20,0.00,0.12,0.00,1.00,0.00,0.00,0 +-14.40,0.00,0.08,0.00,1.00,0.00,0.00,0 +-9.60,0.00,0.04,0.00,1.00,0.00,0.00,0 +-4.80,0.00,0.00,0.00,1.00,0.00,0.00,0 diff --git a/tests/renderer/data/ism_0a_0e.csv b/tests/renderer/data/ism_0a_0e.csv index 7772c8c916..56a82f0fe3 100644 --- a/tests/renderer/data/ism_0a_0e.csv +++ b/tests/renderer/data/ism_0a_0e.csv @@ -1,750 +1,749 @@ -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 -- GitLab From b69164d21c2b51b0a27b8b4bc3e7f777a46b5698 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Mon, 15 May 2023 10:21:00 +0200 Subject: [PATCH 155/331] accept define MASA_PARAMBIN_SF_MAP, fix compile error when JBM_TSM_ON_TCS is deactivated --- lib_com/ivas_prot.h | 14 - lib_com/options.h | 3 - lib_dec/ivas_dirac_dec.c | 202 +++------ lib_dec/ivas_dirac_output_synthesis_dec.c | 187 +------- lib_dec/ivas_masa_dec.c | 27 -- lib_dec/ivas_stat_dec.h | 3 - lib_rend/ivas_dirac_dec_binaural_functions.c | 448 +------------------ 7 files changed, 76 insertions(+), 808 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 6b550685e9..4e84d455ea 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3814,15 +3814,9 @@ void ivas_dirac_dec_output_synthesis_process_slot( const int16_t *azimuth, const int16_t *elevation, const float *diffuseness, -#ifndef MASA_PARAMBIN_SF_MAP - const uint16_t coherence_flag, -#endif #endif DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ #ifdef JBM_TSM_ON_TCS -#ifndef MASA_PARAMBIN_SF_MAP - MASA_DECODER_HANDLE hMasa, -#endif const int16_t sh_rot_max_order, #endif const float *p_Rmat, /* i : rotation matrix */ @@ -5198,19 +5192,11 @@ void ivas_masa_prerender( #ifndef FIX_355_REFACTOR_PARAMBIN_TO_5MS void ivas_spar_param_to_masa_param_mapping_sf( Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ -#ifdef MASA_PARAMBIN_SF_MAP int16_t azimuth[CLDFB_NO_CHANNELS_MAX], int16_t elevation[CLDFB_NO_CHANNELS_MAX], float energy_ratio1[CLDFB_NO_CHANNELS_MAX], float spreadCoherence[CLDFB_NO_CHANNELS_MAX], float surroundingCoherence[CLDFB_NO_CHANNELS_MAX], -#else - int16_t azimuth[][CLDFB_NO_CHANNELS_MAX], - int16_t elevation[][CLDFB_NO_CHANNELS_MAX], - float energy_ratio1[][CLDFB_NO_CHANNELS_MAX], - float spreadCoherence[][CLDFB_NO_CHANNELS_MAX], - float surroundingCoherence[][CLDFB_NO_CHANNELS_MAX], -#endif float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /* i : Input audio in CLDFB domain, imag */ ); diff --git a/lib_com/options.h b/lib_com/options.h index fc468a6f25..3ea4170c7b 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -218,9 +218,6 @@ #define VARIABLE_SPEED_DECODING /* FhG: variable speed decoding employing the JBM functioniality */ #define JBM_TSM_ON_TCS /* FhG: run the TSM part of JBM on the TCs instead of the final output pcm waveforms */ -#ifdef JBM_TSM_ON_TCS -#define MASA_PARAMBIN_SF_MAP -#endif /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index a19acac344..861b7da545 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -183,10 +183,6 @@ ivas_error ivas_dirac_dec_config( num_outputs_diff_old = 0; num_protos_diff_old = 0; -#if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) - hDirAC->voip_active = st_ivas->hDecoderConfig->voip_active; -#endif - nchan_transport_orig = st_ivas->nchan_transport; if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && !( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) { @@ -950,17 +946,10 @@ ivas_error ivas_dirac_dec_config( { int16_t map_idx; set_s( hDirAC->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); -#ifdef MASA_PARAMBIN_SF_MAP for ( map_idx = 0; map_idx < DEFAULT_JBM_SUBFRAMES_5MS; map_idx++ ) { hDirAC->render_to_md_map[map_idx] = map_idx; } -#else - for ( map_idx = 0; map_idx < DEFAULT_JBM_CLDFB_TIMESLOTS; map_idx++ ) - { - hDirAC->render_to_md_map[map_idx] = map_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME; - } -#endif } #endif } @@ -972,17 +961,10 @@ ivas_error ivas_dirac_dec_config( { int16_t map_idx; set_s( hDirAC->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); -#ifdef MASA_PARAMBIN_SF_MAP for ( map_idx = 0; map_idx < DEFAULT_JBM_SUBFRAMES_5MS; map_idx++ ) { hDirAC->render_to_md_map[map_idx] = map_idx; } -#else - for ( map_idx = 0; map_idx < DEFAULT_JBM_CLDFB_TIMESLOTS; map_idx++ ) - { - hDirAC->render_to_md_map[map_idx] = map_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME; - } -#endif } #endif } @@ -2646,20 +2628,16 @@ void ivas_dirac_dec_set_md_map( /* set mapping according to dirac_read_idx */ set_s( hDirAC->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); -#ifdef MASA_PARAMBIN_SF_MAP + if ( hDirAC->hConfig == NULL || hDirAC->hConfig->dec_param_estim == 0 ) { ivas_jbm_dec_get_md_map( DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbTs, num_slots_in_subfr, 0, hDirAC->dirac_md_buffer_length, hDirAC->render_to_md_map ); } else { -#endif ivas_jbm_dec_get_md_map( DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbTs, num_slots_in_subfr, hDirAC->dirac_read_idx, hDirAC->dirac_md_buffer_length, hDirAC->render_to_md_map ); -#ifdef MASA_PARAMBIN_SF_MAP } -#endif -#ifdef MASA_PARAMBIN_SF_MAP if ( hDirAC->hConfig == NULL || hDirAC->hConfig->dec_param_estim == 0 ) { float tmp; @@ -2677,7 +2655,6 @@ void ivas_dirac_dec_set_md_map( } set_s( &hDirAC->render_to_md_map[hDirAC->nb_subframes], 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME - hDirAC->nb_subframes ); } -#endif return; } @@ -2934,7 +2911,6 @@ void ivas_dirac_dec_render_sf( { #endif #ifdef JBM_TSM_ON_TCS -#ifdef MASA_PARAMBIN_SF_MAP if ( hDirAC->hConfig->dec_param_estim == FALSE ) { md_idx = hDirAC->render_to_md_map[subframe_idx]; @@ -2943,13 +2919,8 @@ void ivas_dirac_dec_render_sf( { md_idx = hDirAC->render_to_md_map[slot_idx_start]; } -#else - md_idx = hDirAC->render_to_md_map[slot_idx_start]; -#endif #endif #ifdef JBM_TSM_ON_TCS - - /* Another workaround for self test BE */ if ( st_ivas->hHeadTrackData && st_ivas->hDecoderConfig->voip_active == 0 ) { @@ -2973,17 +2944,15 @@ void ivas_dirac_dec_render_sf( } /* copy parameters into local buffers*/ -#ifdef MASA_PARAMBIN_SF_MAP + if ( hDirAC->hConfig->dec_param_estim == TRUE ) { -#endif for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) { mvs2s( hDirAC->azimuth[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], azimuth[slot_idx], hDirAC->num_freq_bands ); mvs2s( hDirAC->elevation[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], elevation[slot_idx], hDirAC->num_freq_bands ); mvr2r( hDirAC->diffuseness_vector[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], diffuseness_vector[slot_idx], hDirAC->num_freq_bands ); } -#ifdef MASA_PARAMBIN_SF_MAP } else { @@ -2994,7 +2963,7 @@ void ivas_dirac_dec_render_sf( mvr2r( hDirAC->diffuseness_vector[hDirAC->render_to_md_map[subframe_idx]], diffuseness_vector[slot_idx], hDirAC->num_freq_bands ); } } -#endif + #endif if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) @@ -3046,11 +3015,7 @@ void ivas_dirac_dec_render_sf( p_Rmat = 0; } -#if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) - if ( st_ivas->hDecoderConfig->voip_active == 0 && hDirAC->hConfig->dec_param_estim == FALSE ) -#else - if ( hDirAC->hConfig->dec_param_estim == FALSE ) -#endif + if ( hDirAC->hConfig->dec_param_estim == FALSE ) { /* compute response */ @@ -3091,11 +3056,7 @@ void ivas_dirac_dec_render_sf( { ivas_dirac_dec_compute_gain_factors( hDirAC->num_freq_bands, #ifdef JBM_TSM_ON_TCS -#ifdef MASA_PARAMBIN_SF_MAP hDirAC->diffuseness_vector[md_idx], -#else - diffuseness_vector[0], -#endif #else hDirAC->diffuseness_vector[hDirAC->dirac_read_idx], #endif @@ -3224,7 +3185,6 @@ void ivas_dirac_dec_render_sf( st_ivas->cldfbAnaDec[ch] ); #endif - } #endif } } @@ -3239,7 +3199,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS st_ivas->hTcBuffer->tc[1], #else - &( output_f[1][L_FRAME48k - L_FRAME16k] ), + &( output_f[1][L_FRAME48k - L_FRAME16k] ), #endif Cldfb_RealBuffer[1][0], Cldfb_ImagBuffer[1][0], @@ -3258,7 +3218,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS md_idx, #else - subframe_idx, + subframe_idx, #endif nchan_transport ); } @@ -3375,8 +3335,8 @@ void ivas_dirac_dec_render_sf( azimuth[slot_idx], elevation[slot_idx] #else - hDirAC->azimuth[hDirAC->dirac_estimator_idx], - hDirAC->elevation[hDirAC->dirac_estimator_idx] + hDirAC->azimuth[hDirAC->dirac_estimator_idx], + hDirAC->elevation[hDirAC->dirac_estimator_idx] #endif ); @@ -3388,7 +3348,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS diffuseness_vector[slot_idx] #else - hDirAC->diffuseness_vector[hDirAC->dirac_estimator_idx] + hDirAC->diffuseness_vector[hDirAC->dirac_estimator_idx] #endif ); @@ -3559,59 +3519,47 @@ void ivas_dirac_dec_render_sf( ); } #else - if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order > 0 ) - { - ivas_dirac_dec_output_synthesis_process_slot( reference_power, - p_onset_filter, - azimuth[slot_idx], - elevation[slot_idx], - diffuseness_vector[slot_idx], -#ifndef MASA_PARAMBIN_SF_MAP - coherence_flag, -#endif - hDirAC, -#ifndef MASA_PARAMBIN_SF_MAP - st_ivas->hMasa, -#endif - st_ivas->hHeadTrackData->shd_rot_max_order, - p_Rmat, - st_ivas->hVBAPdata, - hDirAC->hOutSetup, - nchan_transport, - md_idx, + if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order > 0 ) + { + ivas_dirac_dec_output_synthesis_process_slot( reference_power, + p_onset_filter, + azimuth[slot_idx], + elevation[slot_idx], + diffuseness_vector[slot_idx], + hDirAC, + st_ivas->hHeadTrackData->shd_rot_max_order, + p_Rmat, + st_ivas->hVBAPdata, + hDirAC->hOutSetup, + nchan_transport, + md_idx, #ifdef HODIRAC - st_ivas->sba_analysis_order > 1 && - st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k + st_ivas->sba_analysis_order > 1 && + st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k #endif - ); - } - else - { - ivas_dirac_dec_output_synthesis_process_slot( reference_power, - p_onset_filter, - azimuth[slot_idx], - elevation[slot_idx], - diffuseness_vector[slot_idx], -#ifndef MASA_PARAMBIN_SF_MAP - coherence_flag, -#endif - hDirAC, -#ifndef MASA_PARAMBIN_SF_MAP - st_ivas->hMasa, -#endif - 0, - 0, - st_ivas->hVBAPdata, - hDirAC->hOutSetup, - nchan_transport, - md_idx, + ); + } + else + { + ivas_dirac_dec_output_synthesis_process_slot( reference_power, + p_onset_filter, + azimuth[slot_idx], + elevation[slot_idx], + diffuseness_vector[slot_idx], + hDirAC, + 0, + 0, + st_ivas->hVBAPdata, + hDirAC->hOutSetup, + nchan_transport, + md_idx, #ifdef HODIRAC - st_ivas->sba_analysis_order > 1 && - st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k + st_ivas->sba_analysis_order > 1 && + st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k #endif - ); - } + ); + } #endif if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) @@ -3634,7 +3582,7 @@ void ivas_dirac_dec_render_sf( #endif #ifdef JBM_TSM_ON_TCS ivas_dirac_dec_output_synthesis_get_interpolator( &hDirAC->h_output_synthesis_psd_params, hDirAC->subframe_nbslots[subframe_idx] ); -#ifdef MASA_PARAMBIN_SF_MAP + if ( hDirAC->hConfig->dec_param_estim == FALSE ) { md_idx = hDirAC->render_to_md_map[subframe_idx]; @@ -3643,11 +3591,7 @@ void ivas_dirac_dec_render_sf( { md_idx = hDirAC->render_to_md_map[slot_idx_start]; } -#else - md_idx = hDirAC->render_to_md_map[slot_idx_start]; -#endif -#ifdef MASA_PARAMBIN_SF_MAP /* Workaround for BE (should be gone when #393 is adressed and diffuseness index in the gain SHD renderer with HO-DirAC is fixed) */ /* :TODO: remove */ /* get the correct md index for the diffuseness in direction smoothing and HO-DirAC, it is always the first slot of the next subframe*/ @@ -3674,24 +3618,7 @@ void ivas_dirac_dec_render_sf( md_idx = hDirAC->render_to_md_map[subframe_idx + 1]; } } -#else - if ( slot_idx_start + hDirAC->subframe_nbslots[subframe_idx] == hDirAC->num_slots ) - { - /* we are at the end, get the next one using the normal dirac read idx...*/ - if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 ) - { - md_idx = ( hDirAC->dirac_read_idx + DEFAULT_JBM_CLDFB_TIMESLOTS ) % hDirAC->dirac_md_buffer_length; - } - else - { - md_idx = ( hDirAC->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % hDirAC->dirac_md_buffer_length; - } - } - else - { - md_idx = hDirAC->render_to_md_map[slot_idx_start + hDirAC->subframe_nbslots[subframe_idx]]; - } -#endif + #endif if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { @@ -3755,7 +3682,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS index_slot = slot_idx_start_cldfb_synth; #else - index_slot = subframe_idx * hDirAC->subframe_nbslots; + index_slot = subframe_idx * hDirAC->subframe_nbslots; #endif if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) @@ -3781,7 +3708,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS for ( i = 0; i < hDirAC->subframe_nbslots[subframe_idx]; i++ ) #else - for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) #endif { RealBuffer[i] = Cldfb_RealBuffer_Binaural[ch][i]; @@ -3795,11 +3722,11 @@ void ivas_dirac_dec_render_sf( hDirAC->num_freq_bands * hDirAC->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[ch] ); #else - cldfbSynthesis( RealBuffer, - ImagBuffer, - &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), - hDirAC->num_freq_bands * hDirAC->subframe_nbslots, - st_ivas->cldfbSynDec[ch] ); + cldfbSynthesis( RealBuffer, + ImagBuffer, + &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), + hDirAC->num_freq_bands * hDirAC->subframe_nbslots, + st_ivas->cldfbSynDec[ch] ); #endif } } @@ -3810,7 +3737,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) #else - for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ ) + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ ) #endif { mvr2r( Cldfb_RealBuffer[ch][slot_idx], pppQMfFrame_ts_re[ch][slot_idx], hDirAC->num_freq_bands ); @@ -3846,7 +3773,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS const int16_t num_samples_subframe = hDirAC->num_freq_bands * hDirAC->subframe_nbslots[subframe_idx]; #else - const int16_t num_samples_subframe = hDirAC->num_freq_bands * hDirAC->subframe_nbslots; + const int16_t num_samples_subframe = hDirAC->num_freq_bands * hDirAC->subframe_nbslots; #endif /* Move the separated and the LFE channels to temporary variables as spatial synthesis may overwrite current channels */ @@ -3877,7 +3804,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS for ( i = 0; i < hDirAC->subframe_nbslots[subframe_idx]; i++ ) #else - for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) #endif { RealBuffer[i] = Cldfb_RealBuffer[idx_in][i]; @@ -3907,7 +3834,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS for ( i = 0; i < hDirAC->subframe_nbslots[subframe_idx]; i++ ) #else - for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) #endif { RealBuffer[i] = Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS - 1][i]; @@ -3916,7 +3843,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[hDirAC->hOutSetup.nchan_out_woLFE + idx_lfe] ); #else - cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots, st_ivas->cldfbSynDec[hDirAC->hOutSetup.nchan_out_woLFE + idx_lfe] ); + cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots, st_ivas->cldfbSynDec[hDirAC->hOutSetup.nchan_out_woLFE + idx_lfe] ); #endif } else if ( st_ivas->mc_mode == MC_MODE_MCMASA && hDirAC->hOutSetup.separateChannelEnabled ) @@ -3928,7 +3855,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS set_zero( &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->subframe_nbslots[subframe_idx] * hDirAC->num_freq_bands ); #else - set_zero( &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->subframe_nbslots * hDirAC->num_freq_bands ); + set_zero( &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->subframe_nbslots * hDirAC->num_freq_bands ); #endif } @@ -3948,7 +3875,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS for ( i = 0; i < hDirAC->subframe_nbslots[subframe_idx]; i++ ) #else - for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) #endif { RealBuffer[i] = Cldfb_RealBuffer[idx_in][i]; @@ -3957,7 +3884,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[idx_in] ); #else - cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots, st_ivas->cldfbSynDec[idx_in] ); + cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots, st_ivas->cldfbSynDec[idx_in] ); #endif idx_in++; } @@ -3972,7 +3899,6 @@ void ivas_dirac_dec_render_sf( } #endif - pop_wmops(); return; @@ -4698,8 +4624,8 @@ static void protoSignalComputation4( proto_frame_f[2 * l * num_freq_bands + 2 * k] += RealBuffer[n][0][k] * mtx_hoa_decoder[l * 16 + sba_map_tc_ind[n]]; proto_frame_f[2 * l * num_freq_bands + 2 * k + 1] += ImagBuffer[n][0][k] * mtx_hoa_decoder[l * 16 + sba_map_tc_ind[n]]; #else - proto_frame_f[2 * l * num_freq_bands + 2 * k] += RealBuffer[n][0][k] * mtx_hoa_decoder[l * 16 + sba_map_tc[n]]; - proto_frame_f[2 * l * num_freq_bands + 2 * k + 1] += ImagBuffer[n][0][k] * mtx_hoa_decoder[l * 16 + sba_map_tc[n]]; + proto_frame_f[2 * l * num_freq_bands + 2 * k] += RealBuffer[n][0][k] * mtx_hoa_decoder[l * 16 + sba_map_tc[n]]; + proto_frame_f[2 * l * num_freq_bands + 2 * k + 1] += ImagBuffer[n][0][k] * mtx_hoa_decoder[l * 16 + sba_map_tc[n]]; #endif } } diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c index e7ccaeaba7..275f56a40e 100644 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -581,15 +581,9 @@ void ivas_dirac_dec_output_synthesis_process_slot( const int16_t *azimuth, const int16_t *elevation, const float *diffuseness, -#ifndef MASA_PARAMBIN_SF_MAP - const uint16_t coherence_flag, -#endif #endif DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ #ifdef JBM_TSM_ON_TCS -#ifndef MASA_PARAMBIN_SF_MAP - MASA_DECODER_HANDLE hMasa, -#endif const int16_t sh_rot_max_order, #endif const float *p_Rmat, /* i : rotation matrix */ @@ -613,12 +607,6 @@ void ivas_dirac_dec_output_synthesis_process_slot( int16_t diff_start_band; #ifndef JBM_TSM_ON_TCS const float *diffuseness; -#endif -#if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) - float dirEne; - float surCohEner; - float surCohRatio[CLDFB_NO_CHANNELS_MAX]; - int16_t i, l; #endif DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params; DIRAC_OUTPUT_SYNTHESIS_STATE *h_dirac_output_synthesis_state; @@ -723,90 +711,18 @@ void ivas_dirac_dec_output_synthesis_process_slot( } else // ( hDirAC->hConfig->dec_param_estim == TRUE ) #endif -#if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) - if ( hDirAC->hConfig->dec_param_estim == TRUE || hDirAC->voip_active == 1 ) -#else if ( hDirAC->hConfig->dec_param_estim == TRUE ) -#endif { -#if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) - if ( hDirAC->voip_active == 1 ) - { - if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) - { - ivas_dirac_dec_compute_gain_factors( num_freq_bands, - diffuseness, - h_dirac_output_synthesis_params->max_band_decorr, - h_dirac_output_synthesis_state->direct_power_factor, - h_dirac_output_synthesis_state->diffuse_power_factor ); - v_multc( h_dirac_output_synthesis_state->direct_power_factor, - 0.25f, - h_dirac_output_synthesis_state->direct_power_factor, - num_freq_bands ); - v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, - 0.25f, - h_dirac_output_synthesis_state->diffuse_power_factor, - num_freq_bands ); - if ( coherence_flag ) - { - for ( i = 0; i < hDirAC->num_freq_bands; i++ ) - { - surCohRatio[i] = hDirAC->surroundingCoherence[md_idx][i]; - } - } - else - { - set_zero( surCohRatio, hDirAC->num_freq_bands ); - } - } - else - { - - - /* compute reference and diffuse power factor for this frame */ - - ivas_dirac_dec_compute_power_factors( num_freq_bands, - diffuseness, - h_dirac_output_synthesis_params->max_band_decorr, - h_dirac_output_synthesis_state->direct_power_factor, - h_dirac_output_synthesis_state->diffuse_power_factor ); - - if ( coherence_flag ) - { - for ( i = 0; i < hDirAC->num_freq_bands; i++ ) - { - dirEne = hDirAC->h_output_synthesis_psd_state.direct_power_factor[i]; - surCohEner = hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] * hDirAC->surroundingCoherence[md_idx][i]; - hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] -= surCohEner; - hDirAC->h_output_synthesis_psd_state.direct_power_factor[i] += surCohEner; - - surCohRatio[i] = surCohEner / ( 1e-12f + dirEne + surCohEner ); - } - } - else - { - set_zero( surCohRatio, hDirAC->num_freq_bands ); - } - } - } -#endif /* compute direct responses */ + /* compute direct responses */ #ifdef JBM_TSM_ON_TCS ivas_dirac_dec_compute_directional_responses( hDirAC, hVBAPdata, -#ifdef MASA_PARAMBIN_SF_MAP NULL, -#else - hMasa, -#endif azimuth, elevation, md_idx, -#ifdef MASA_PARAMBIN_SF_MAP NULL, -#else - coherence_flag ? surCohRatio : NULL, -#endif sh_rot_max_order, p_Rmat #ifdef HODIRAC @@ -830,10 +746,6 @@ void ivas_dirac_dec_output_synthesis_process_slot( if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { -#if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) - if ( hDirAC->voip_active == 0 ) - { -#endif ivas_dirac_dec_compute_gain_factors( num_freq_bands, diffuseness, h_dirac_output_synthesis_params->max_band_decorr, @@ -849,16 +761,8 @@ void ivas_dirac_dec_output_synthesis_process_slot( 0.25f, h_dirac_output_synthesis_state->diffuse_power_factor, num_freq_bands ); -#if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) - } -#endif - /*Direct gain*/ -#if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) - if ( hDirAC->hConfig->dec_param_estim == TRUE ) - { -#endif for ( ch_idx = 0; ch_idx < min( 4, nchan_transport ); ch_idx++ ) { int16_t k; @@ -895,34 +799,7 @@ void ivas_dirac_dec_output_synthesis_process_slot( } } } -#if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) - } - else - { - for ( ch_idx = 0; ch_idx < min( 4, nchan_transport ); ch_idx++ ) - { - v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, 4.0f, aux_buf, num_freq_bands ); - v_mult( aux_buf, - aux_buf, - aux_buf, - num_freq_bands ); - v_multc( aux_buf, - h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f, - aux_buf, - num_freq_bands_diff ); - v_multc( &aux_buf[num_freq_bands_diff], - h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f, - &aux_buf[num_freq_bands_diff], - num_freq_bands - num_freq_bands_diff ); - for ( l = 0; l < num_freq_bands; l++ ) - { - aux_buf[l] = 0.25f * sqrtf( 1.f + aux_buf[l] ); - } - v_add( aux_buf, &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands], &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands], num_freq_bands ); - } - } -#endif /*Directional gain (panning)*/ for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_dir; ch_idx++ ) { @@ -956,18 +833,11 @@ void ivas_dirac_dec_output_synthesis_process_slot( else { /* compute reference and diffuse power factor for this frame */ -#if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) - if ( hDirAC->voip_active == 0 ) - { -#endif ivas_dirac_dec_compute_power_factors( num_freq_bands, diffuseness, h_dirac_output_synthesis_params->max_band_decorr, h_dirac_output_synthesis_state->direct_power_factor, h_dirac_output_synthesis_state->diffuse_power_factor ); -#if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) - } -#endif } } @@ -987,11 +857,7 @@ void ivas_dirac_dec_output_synthesis_process_slot( } /* process other PSDs only slot wise for 4 transport channels */ -#if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) - if ( hDirAC->hConfig->dec_param_estim == TRUE || hDirAC->voip_active == 1 ) -#else if ( hDirAC->hConfig->dec_param_estim == TRUE ) -#endif { computeTargetPSDs_direct( num_channels_dir, num_freq_bands, h_dirac_output_synthesis_state->direct_power_factor, reference_power, h_dirac_output_synthesis_state->direct_responses, h_dirac_output_synthesis_state->direct_responses_square, h_dirac_output_synthesis_state->cy_auto_dir_smooth, h_dirac_output_synthesis_state->cy_cross_dir_smooth ); @@ -1130,11 +996,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( } else #endif -#if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) - if ( hDirAC->voip_active == 0 && hDirAC->hConfig->dec_param_estim == FALSE ) -#else if ( hDirAC->hConfig->dec_param_estim == FALSE ) -#endif { /*Direct gain*/ for ( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ ) @@ -1556,11 +1418,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( /*-----------------------------------------------------------------* * compute target PSDs *-----------------------------------------------------------------*/ -#if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) - if ( hDirAC->hConfig->enc_param_start_band == 0 && hDirAC->voip_active == 0 ) -#else if ( hDirAC->hConfig->enc_param_start_band == 0 ) -#endif { diff_start_band = h_dirac_output_synthesis_params->use_onset_filters == 1 ? h_dirac_output_synthesis_params->max_band_decorr : 0; @@ -1842,44 +1700,21 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( *-----------------------------------------------------------------*/ /* store estimates for next synthesis block */ -#if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) - if ( hDirAC->voip_active == 1 ) - { - mvr2r( gains_dir, h_dirac_output_synthesis_state->gains_dir_prev, num_freq_bands * hDirAC->num_outputs_dir ); - mvr2r( gains_diff, h_dirac_output_synthesis_state->gains_diff_prev, num_freq_bands * hDirAC->num_outputs_dir ); + mvr2r( gains_dir, h_dirac_output_synthesis_state->gains_dir_prev, num_freq_bands * nchan_out_woLFE ); + mvr2r( gains_diff, h_dirac_output_synthesis_state->gains_diff_prev, num_freq_bands * nchan_out_woLFE ); - /* reset values */ - set_zero( h_dirac_output_synthesis_state->proto_power_smooth, num_freq_bands * hDirAC->num_outputs_dir ); + /* reset values */ + set_zero( h_dirac_output_synthesis_state->proto_power_smooth, num_freq_bands * num_protos_dir ); - if ( h_dirac_output_synthesis_state->proto_power_diff_smooth != NULL ) - { - set_zero( h_dirac_output_synthesis_state->proto_power_diff_smooth, h_dirac_output_synthesis_params->max_band_decorr * hDirAC->num_outputs_dir ); - } - - set_zero( h_dirac_output_synthesis_state->cy_auto_dir_smooth, num_freq_bands * hDirAC->num_outputs_dir ); - set_zero( h_dirac_output_synthesis_state->cy_cross_dir_smooth, num_freq_bands * hDirAC->num_outputs_dir ); - set_zero( h_dirac_output_synthesis_state->cy_auto_diff_smooth, num_freq_bands * hDirAC->num_outputs_dir ); - } - else + if ( h_dirac_output_synthesis_state->proto_power_diff_smooth != NULL ) { -#endif - mvr2r( gains_dir, h_dirac_output_synthesis_state->gains_dir_prev, num_freq_bands * nchan_out_woLFE ); - mvr2r( gains_diff, h_dirac_output_synthesis_state->gains_diff_prev, num_freq_bands * nchan_out_woLFE ); - - /* reset values */ - set_zero( h_dirac_output_synthesis_state->proto_power_smooth, num_freq_bands * num_protos_dir ); + set_zero( h_dirac_output_synthesis_state->proto_power_diff_smooth, h_dirac_output_synthesis_params->max_band_decorr * nchan_out_woLFE ); + } - if ( h_dirac_output_synthesis_state->proto_power_diff_smooth != NULL ) - { - set_zero( h_dirac_output_synthesis_state->proto_power_diff_smooth, h_dirac_output_synthesis_params->max_band_decorr * nchan_out_woLFE ); - } + set_zero( h_dirac_output_synthesis_state->cy_auto_dir_smooth, num_freq_bands * nchan_out_woLFE ); + set_zero( h_dirac_output_synthesis_state->cy_cross_dir_smooth, num_freq_bands * nchan_out_woLFE ); + set_zero( h_dirac_output_synthesis_state->cy_auto_diff_smooth, num_freq_bands * nchan_out_woLFE ); - set_zero( h_dirac_output_synthesis_state->cy_auto_dir_smooth, num_freq_bands * nchan_out_woLFE ); - set_zero( h_dirac_output_synthesis_state->cy_cross_dir_smooth, num_freq_bands * nchan_out_woLFE ); - set_zero( h_dirac_output_synthesis_state->cy_auto_diff_smooth, num_freq_bands * nchan_out_woLFE ); -#if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) - } -#endif pop_wmops(); return; diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 7f79dae5fc..e69cedc6a2 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -1300,19 +1300,11 @@ ivas_error ivas_masa_dec_reconfigure( *-------------------------------------------------------------------*/ void ivas_spar_param_to_masa_param_mapping_sf( Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ -#ifdef MASA_PARAMBIN_SF_MAP int16_t azimuth[CLDFB_NO_CHANNELS_MAX], int16_t elevation[CLDFB_NO_CHANNELS_MAX], float energy_ratio1[CLDFB_NO_CHANNELS_MAX], float spreadCoherence[CLDFB_NO_CHANNELS_MAX], float surroundingCoherence[CLDFB_NO_CHANNELS_MAX], -#else - int16_t azimuth[][CLDFB_NO_CHANNELS_MAX], - int16_t elevation[][CLDFB_NO_CHANNELS_MAX], - float energy_ratio1[][CLDFB_NO_CHANNELS_MAX], - float spreadCoherence[][CLDFB_NO_CHANNELS_MAX], - float surroundingCoherence[][CLDFB_NO_CHANNELS_MAX], -#endif float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /* i : Input audio in CLDFB domain, imag */ ) @@ -1493,21 +1485,13 @@ void ivas_spar_param_to_masa_param_mapping_sf( ratio = I / fmaxf( 1e-12f, E ); /* Energy ratio */ ratio = fmaxf( 0.0f, fminf( 1.0f, ratio ) ); -#ifdef MASA_PARAMBIN_SF_MAP azimuth[bin] = (int16_t) roundf( azi / PI_OVER_180 ); elevation[bin] = (int16_t) roundf( ele / PI_OVER_180 ); energy_ratio1[bin] = ratio; spreadCoherence[bin] = 0.0f; surroundingCoherence[bin] = 0.0f; -#else - azimuth[0][bin] = (int16_t) roundf( azi / PI_OVER_180 ); - elevation[0][bin] = (int16_t) roundf( ele / PI_OVER_180 ); - energy_ratio1[0][bin] = ratio; - spreadCoherence[0][bin] = 0.0f; - surroundingCoherence[0][bin] = 0.0f; -#endif /* Determine directional distribution of the indirect audio based on the SPAR mixing matrices (and the transport audio signals when 2 TC) */ if ( hDiffuseDist != NULL ) { @@ -1547,17 +1531,6 @@ void ivas_spar_param_to_masa_param_mapping_sf( } } -#ifndef MASA_PARAMBIN_SF_MAP - for ( slot_idx = 1; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) - { - mvs2s( azimuth[0], azimuth[slot_idx], nBins ); - mvs2s( elevation[0], elevation[slot_idx], nBins ); - mvr2r( spreadCoherence[0], spreadCoherence[slot_idx], nBins ); - mvr2r( surroundingCoherence[0], surroundingCoherence[slot_idx], nBins ); - mvr2r( energy_ratio1[0], energy_ratio1[slot_idx], nBins ); - } -#endif - return; } #endif diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index d7200955ad..a928563240 100755 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -645,9 +645,6 @@ typedef struct ivas_dirac_dec_data_structure int16_t slots_rendered; int16_t num_slots; int16_t render_to_md_map[MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME]; -#if defined( JBM_TSM_ON_TCS ) && !defined( MASA_PARAMBIN_SF_MAP ) - int16_t voip_active; -#endif #else int16_t subframe_nbslots; #endif diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index a04a06d507..06fd160bb2 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -133,15 +133,10 @@ static void ivas_dirac_dec_binaural_process_output_sf( Decoder_Struct *st_ivas, static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked_sf( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const uint8_t slotEnd, const uint8_t nBins, float Rmat[3][3] ); -#ifdef MASA_PARAMBIN_SF_MAP static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices_sf( Decoder_Struct *st_ivas, float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], int16_t azimuth[CLDFB_NO_CHANNELS_MAX], int16_t elevation[CLDFB_NO_CHANNELS_MAX], float energy_ratio1[CLDFB_NO_CHANNELS_MAX], float spreadCoherence[CLDFB_NO_CHANNELS_MAX], float surroundingCoherence[CLDFB_NO_CHANNELS_MAX], float Rmat[3][3] ); -#else -static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices_sf( Decoder_Struct *st_ivas, float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], int16_t azimuth[][CLDFB_NO_CHANNELS_MAX], int16_t elevation[][CLDFB_NO_CHANNELS_MAX], float energy_ratio1[][CLDFB_NO_CHANNELS_MAX], float spreadCoherence[][CLDFB_NO_CHANNELS_MAX], float surroundingCoherence[][CLDFB_NO_CHANNELS_MAX], float Rmat[3][3] ); -#endif static void ivas_dirac_dec_binaural_internal_sf( Decoder_Struct *st_ivas, float *output_f[], const int16_t nchan_transport ); - static void ivas_dirac_dec_decorrelate_slot_sf( DIRAC_DEC_HANDLE hDirAC, const int8_t slot, float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float decRe[][CLDFB_NO_CHANNELS_MAX], float decIm[][CLDFB_NO_CHANNELS_MAX] ); #endif #endif @@ -688,23 +683,12 @@ static void ivas_dirac_dec_binaural_internal_sf( float Cldfb_RealBuffer_in[2 * BINAURAL_CHANNELS][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; float Cldfb_ImagBuffer_in[2 * BINAURAL_CHANNELS][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; /* local copies of azi, ele, diffuseness */ -#ifdef MASA_PARAMBIN_SF_MAP int16_t azimuth[CLDFB_NO_CHANNELS_MAX]; int16_t elevation[CLDFB_NO_CHANNELS_MAX]; float spreadCoherence[CLDFB_NO_CHANNELS_MAX]; float surroundingCoherence[CLDFB_NO_CHANNELS_MAX]; float energy_ratio1[CLDFB_NO_CHANNELS_MAX]; -#else - int16_t azimuth[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; - int16_t elevation[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; - float spreadCoherence[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; - float surroundingCoherence[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; - float energy_ratio1[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; -#endif float Rmat[3][3]; -#ifndef MASA_PARAMBIN_SF_MAP - uint16_t slot_idx; -#endif uint16_t subframe_idx, slot_idx_start; int16_t max_band_decorr; DIFFUSE_DISTRIBUTION_DATA diffuseDistData; @@ -736,22 +720,12 @@ static void ivas_dirac_dec_binaural_internal_sf( subframe_idx = hDirAC->subframes_rendered; /* copy parameters into local buffers*/ -#ifdef MASA_PARAMBIN_SF_MAP mvs2s( hDirAC->azimuth[hDirAC->render_to_md_map[subframe_idx]], azimuth, hDirAC->num_freq_bands ); mvs2s( hDirAC->elevation[hDirAC->render_to_md_map[subframe_idx]], elevation, hDirAC->num_freq_bands ); mvr2r( hDirAC->spreadCoherence[hDirAC->render_to_md_map[subframe_idx]], spreadCoherence, hDirAC->num_freq_bands ); mvr2r( hDirAC->surroundingCoherence[hDirAC->render_to_md_map[subframe_idx]], surroundingCoherence, hDirAC->num_freq_bands ); mvr2r( hDirAC->energy_ratio1[hDirAC->render_to_md_map[subframe_idx]], energy_ratio1, hDirAC->num_freq_bands ); -#else - for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) - { - mvs2s( hDirAC->azimuth[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], azimuth[slot_idx], hDirAC->num_freq_bands ); - mvs2s( hDirAC->elevation[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], elevation[slot_idx], hDirAC->num_freq_bands ); - mvr2r( hDirAC->spreadCoherence[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], spreadCoherence[slot_idx], hDirAC->num_freq_bands ); - mvr2r( hDirAC->surroundingCoherence[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], surroundingCoherence[slot_idx], hDirAC->num_freq_bands ); - mvr2r( hDirAC->energy_ratio1[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], energy_ratio1[slot_idx], hDirAC->num_freq_bands ); - } -#endif + /* CLDFB Analysis of input */ for ( slot = 0; slot < hDirAC->subframe_nbslots[hDirAC->subframes_rendered]; slot++ ) { @@ -1435,10 +1409,7 @@ static void ivas_dirac_dec_decorrelate_slot_sf( return; } -#endif -#ifndef FIX_355_REFACTOR_PARAMBIN_TO_5MS -#ifdef MASA_PARAMBIN_SF_MAP static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices_sf( Decoder_Struct *st_ivas, float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], @@ -1841,423 +1812,6 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric return; } - -#else -static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices_sf( - Decoder_Struct *st_ivas, - float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], - float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], - int16_t azimuth[][CLDFB_NO_CHANNELS_MAX], - int16_t elevation[][CLDFB_NO_CHANNELS_MAX], - float energy_ratio1[][CLDFB_NO_CHANNELS_MAX], - float spreadCoherence[][CLDFB_NO_CHANNELS_MAX], - float surroundingCoherence[][CLDFB_NO_CHANNELS_MAX], - float Rmat[3][3] ) -{ - uint8_t ch, bin; - uint8_t separateCenterChannelRendering; - int16_t nBins, idx; - float frameMeanDiffusenessEneWeight[CLDFB_NO_CHANNELS_MAX]; - DIRAC_DEC_HANDLE hDirAC; - DIRAC_DEC_BIN_HANDLE h; - float IIReneLimiterFactor; - float qualityBasedSmFactor; - float lowBitRateEQ[CLDFB_NO_CHANNELS_MAX]; - uint8_t applyLowBitRateEQ; - int16_t slot_idx_start, slot_idx, subframe_idx; - float subFrameTotalEne[CLDFB_NO_CHANNELS_MAX]; - int16_t md_idx; - float slot_ratio; - - hDirAC = st_ivas->hDirAC; - h = st_ivas->hDiracDecBin; - separateCenterChannelRendering = st_ivas->hOutSetup.separateChannelEnabled; - nBins = hDirAC->num_freq_bands; /* Actually bins */ - slot_idx_start = hDirAC->slots_rendered; - subframe_idx = hDirAC->subframes_rendered; - slot_ratio = 1.0f / (float) hDirAC->subframe_nbslots[subframe_idx]; - - set_zero( h->ChCrossRe, nBins ); - set_zero( h->ChCrossIm, nBins ); - set_zero( h->ChCrossReOut, nBins ); - set_zero( h->ChCrossImOut, nBins ); - for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - set_zero( h->ChEne[ch], nBins ); - set_zero( h->ChEneOut[ch], nBins ); - } - set_zero( h->frameMeanDiffuseness, nBins ); - - set_zero( frameMeanDiffusenessEneWeight, CLDFB_NO_CHANNELS_MAX ); - - /* Determine EQ for low bit rates (13.2 and 16.4 kbps) */ - applyLowBitRateEQ = 0; - if ( ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == MC_FORMAT ) && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE ) - { - applyLowBitRateEQ = 1; - if ( st_ivas->hDecoderConfig->ivas_total_brate == IVAS_16k4 ) - { - for ( bin = 0; bin < LOW_BIT_RATE_BINAURAL_EQ_BINS; bin++ ) - { - lowBitRateEQ[bin + LOW_BIT_RATE_BINAURAL_EQ_OFFSET] = lowBitRateBinauralEQ[bin] * 0.5f + 0.5f; - } - } - else - { - for ( bin = 0; bin < LOW_BIT_RATE_BINAURAL_EQ_BINS; bin++ ) - { - lowBitRateEQ[bin + LOW_BIT_RATE_BINAURAL_EQ_OFFSET] = lowBitRateBinauralEQ[bin]; - } - } - } - - - set_zero( subFrameTotalEne, CLDFB_NO_CHANNELS_MAX ); - /* Formulate input and target covariance matrices combining all subframes */ - for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) - { - - - /* Calculate input covariance matrix */ - - - for ( bin = 0; bin < nBins; bin++ ) - { - for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - float instEne; - - instEne = ( inRe[ch][slot_idx][bin] * inRe[ch][slot_idx][bin] ); - instEne += ( inIm[ch][slot_idx][bin] * inIm[ch][slot_idx][bin] ); - h->ChEne[ch][bin] += instEne; - subFrameTotalEne[bin] += instEne; - } - h->ChCrossRe[bin] += inRe[0][slot_idx][bin] * inRe[1][slot_idx][bin]; - h->ChCrossRe[bin] += inIm[0][slot_idx][bin] * inIm[1][slot_idx][bin]; - h->ChCrossIm[bin] += inRe[0][slot_idx][bin] * inIm[1][slot_idx][bin]; - h->ChCrossIm[bin] -= inIm[0][slot_idx][bin] * inRe[1][slot_idx][bin]; - } - } - - /* Apply EQ at low bit rates */ - if ( applyLowBitRateEQ ) - { - int16_t lastEqBin = LOW_BIT_RATE_BINAURAL_EQ_OFFSET + LOW_BIT_RATE_BINAURAL_EQ_BINS - 1; - - for ( bin = LOW_BIT_RATE_BINAURAL_EQ_OFFSET; bin < lastEqBin; bin++ ) - { - subFrameTotalEne[bin] *= lowBitRateEQ[bin]; - } - for ( ; bin < nBins; bin++ ) - { - subFrameTotalEne[bin] *= lowBitRateEQ[lastEqBin]; - } - } - - if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->nchan_transport == 2 ) - { - float tempRe, tempIm; - - set_zero( subFrameTotalEne, CLDFB_NO_CHANNELS_MAX ); - - for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) - { - - - for ( bin = 0; bin < nBins; bin++ ) - { - tempRe = inRe[0][slot_idx][bin] + inRe[1][slot_idx][bin]; - tempIm = inIm[0][slot_idx][bin] + inIm[1][slot_idx][bin]; - subFrameTotalEne[bin] += tempRe * tempRe + tempIm * tempIm; - } - } - } - - for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) - { - md_idx = hDirAC->render_to_md_map[slot_idx + slot_idx_start]; - /* Determine target covariance matrix containing target binaural properties */ - for ( bin = 0; bin < nBins; bin++ ) - { - float diffuseness = 1.0f; /* ratio1 and ratio2 are subtracted from diffuseness further below */ - float surCoh = 0.0f, spreadCoh = 0.0f; /* Default values if spreadSurroundCoherenceApplied == false */ - float diffEne, dirEne, meanEnePerCh; - uint16_t dirIndex; - - /* When BINAURAL_ROOM is not indicated, hBinaural->earlyPartEneCorrection[bin] values are all 1.0f. - * When BINAURAL_ROOM is indicated, the binaural audio output is based on combined use of the - * HRTF data set and a BRIR-based data set. The HRTF data set is spectrally corrected to match - * the early spectrum of the BRIR data, using the spectral correction data in - * hBinaural->earlyPartEneCorrection[bin], based on the BRIR set. */ - meanEnePerCh = h->earlyPartEneCorrection[bin] * subFrameTotalEne[bin] / 2.0f; - - /* Determine direct part target covariance matrix (for 1 or 2 directions) */ - for ( dirIndex = 0; dirIndex < hDirAC->numSimultaneousDirections; dirIndex++ ) - { - int16_t aziDeg, eleDeg; - float lRealp, lImagp, rRealp, rImagp; - float lRealpTmp, lImagpTmp, rRealpTmp, rImagpTmp; - float hrtfEne[BINAURAL_CHANNELS], hrtfCrossRe, hrtfCrossIm, ratio; - - if ( dirIndex == 0 ) /* For first of the two simultaneous directions */ - { - aziDeg = azimuth[slot_idx][bin]; - eleDeg = elevation[slot_idx][bin]; - ratio = energy_ratio1[slot_idx][bin]; - spreadCoh = spreadCoherence[slot_idx][bin]; - } - else /* For second of the two simultaneous directions */ - { - aziDeg = hDirAC->azimuth2[md_idx][bin]; - eleDeg = hDirAC->elevation2[md_idx][bin]; - ratio = hDirAC->energy_ratio2[md_idx][bin]; - spreadCoh = hDirAC->spreadCoherence2[md_idx][bin]; - } - diffuseness -= ratio; /* diffuseness = 1 - ratio1 - ratio2 */ - - if ( separateCenterChannelRendering ) - { - /* In masa + mono rendering mode, the center directions originate from phantom sources, so the - * spread coherence is increased */ - float aziRad, eleRad, doaVectorX, spatialAngleDeg, altSpreadCoh; - - aziRad = (float) aziDeg * PI_OVER_180; - eleRad = (float) eleDeg * PI_OVER_180; - doaVectorX = cosf( aziRad ) * cosf( eleRad ); - spatialAngleDeg = acosf( doaVectorX ) * _180_OVER_PI; - altSpreadCoh = 1.0f - ( spatialAngleDeg / 30.0f ); - spreadCoh = max( spreadCoh, altSpreadCoh ); - } - - getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, h->renderStereoOutputInsteadOfBinaural, Rmat ); - - if ( h->renderStereoOutputInsteadOfBinaural ) - { - /* Synthesizing spread coherence is not needed for stereo loudspeaker output, - * as directional sound is reproduced with two loudspeakers in any case */ - spreadCoh = 0.0f; - } - - if ( spreadCoh > 0.0f ) - { - float centerMul, sidesMul; - float hrtfEneCenter, hrtfEneSides, hrtfEneRealized, eneCorrectionFactor; - float w1, w2, w3, eq; - - hrtfEneCenter = ( lRealp * lRealp ) + ( lImagp * lImagp ) + ( rRealp * rRealp ) + ( rImagp * rImagp ); - - /* Spread coherence is synthesized as coherent sources at 30 degree horizontal spacing. - * The following formulas determine the gains for these sources. - * spreadCoh = 0: Only panning - * spreadCoh = 0.5: Three sources coherent panning (e.g. 30 0 -30 deg azi) - * spreadCoh = 1.0: Two sources coherent panning with gap (as above, but center is silent) */ - if ( spreadCoh < 0.5f ) - { - /* 0.0f < spreadCoh < 0.5f */ - sidesMul = 0.5774f * spreadCoh * 2.0f; /* sqrt(1/3) = 0.5774f */ - centerMul = 1.0f - ( spreadCoh * 2.0f ) + sidesMul; - } - else - { - /* 0.5f <= spreadCoh < 1.0f */ - centerMul = 2.0f - ( 2.0f * spreadCoh ); - sidesMul = inv_sqrt( centerMul + 2.0f ); - centerMul *= sidesMul; - } - - /* Apply the gain for the center source of the three coherent sources */ - lRealp *= centerMul; - lImagp *= centerMul; - rRealp *= centerMul; - rImagp *= centerMul; - - /* Apply the gain for the left source of the three coherent sources */ - getDirectPartGains( bin, aziDeg + 30, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat ); - - hrtfEneSides = ( lRealpTmp * lRealpTmp ) + ( lImagpTmp * lImagpTmp ) + ( rRealpTmp * rRealpTmp ) + ( rImagpTmp * rImagpTmp ); - lRealp += sidesMul * lRealpTmp; - lImagp += sidesMul * lImagpTmp; - rRealp += sidesMul * rRealpTmp; - rImagp += sidesMul * rImagpTmp; - - /* Apply the gain for the right source of the three coherent sources. - * -30 degrees to 330 wrapping due to internal functions. */ - getDirectPartGains( bin, aziDeg + 330, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat ); - - hrtfEneSides += ( lRealpTmp * lRealpTmp ) + ( lImagpTmp * lImagpTmp ) + ( rRealpTmp * rRealpTmp ) + ( rImagpTmp * rImagpTmp ); - lRealp += sidesMul * lRealpTmp; - lImagp += sidesMul * lImagpTmp; - rRealp += sidesMul * rRealpTmp; - rImagp += sidesMul * rImagpTmp; - - /* Formulate an eneCorrectionFactor that compensates for the coherent summation of the HRTFs */ - hrtfEneRealized = ( lRealp * lRealp ) + ( lImagp * lImagp ) + ( rRealp * rRealp ) + ( rImagp * rImagp ); - eneCorrectionFactor = ( ( hrtfEneSides * sidesMul * sidesMul ) + - ( hrtfEneCenter * centerMul * centerMul ) ) / - max( 1e-12f, hrtfEneRealized ); - - /* Weighting factors to determine appropriate target spectrum for spread coherent sound */ - if ( spreadCoh < 0.5 ) - { - w1 = 1.0f - 2.0f * spreadCoh; - w2 = 2.0f * spreadCoh; - w3 = 0.0f; - } - else - { - w1 = 0.0f; - w2 = 2.0f - 2.0f * spreadCoh; - w3 = 2.0f * spreadCoh - 1.0f; - } - - if ( ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) ) - { - idx = min( bin, MASA_NUM_DEFINED_SUR_SPR_COH_ENE_BINS - 1 ); - - /* Apply the target spectrum to the eneCorrectionFactor */ - if ( separateCenterChannelRendering ) /* spreadCoh mostly originates from phantom sources in separate channel rendering mode */ - { - eneCorrectionFactor *= w1 * 1.0f + ( w2 + w3 ) * spreadCohEne1[idx]; - } - else - { - eneCorrectionFactor *= w1 * 1.0f + w2 * spreadCohEne05[idx] + w3 * spreadCohEne1[idx]; - } - } - - /* Equalize the spread coherent combined HRTFs */ - eq = min( 4.0f, sqrtf( eneCorrectionFactor ) ); - lRealp *= eq; - lImagp *= eq; - rRealp *= eq; - rImagp *= eq; - } - - hrtfEne[0] = ( lRealp * lRealp ) + ( lImagp * lImagp ); - hrtfEne[1] = ( rRealp * rRealp ) + ( rImagp * rImagp ); - hrtfCrossRe = ( lRealp * rRealp ) + ( lImagp * rImagp ); - hrtfCrossIm = ( -lImagp * rRealp ) + ( lRealp * rImagp ); - - /* Add direct part (1 or 2) covariance matrix */ - dirEne = slot_ratio * ratio * meanEnePerCh; - h->ChEneOut[0][bin] += dirEne * hrtfEne[0]; /* Dir ene part*/ - h->ChEneOut[1][bin] += dirEne * hrtfEne[1]; - h->ChCrossReOut[bin] += dirEne * hrtfCrossRe; /* Dir cross re */ - h->ChCrossImOut[bin] += dirEne * hrtfCrossIm; /* Dir cross im */ - } - - /* Add diffuse / ambient part covariance matrix */ - diffuseness = max( 0.0f, diffuseness ); - diffEne = slot_ratio * diffuseness * meanEnePerCh; - surCoh = surroundingCoherence[slot_idx][bin]; - if ( ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) ) - { - if ( !h->renderStereoOutputInsteadOfBinaural ) - { - idx = min( bin, MASA_NUM_DEFINED_SUR_SPR_COH_ENE_BINS - 1 ); - /* Apply target spectrum that emphasizes low frequencies when the sound is surround coherent */ - diffEne *= ( 1.0f - surCoh ) + surCoh * surCohEne[idx]; - } - } - h->ChEneOut[0][bin] += diffEne; /* Diff ene part*/ - h->ChEneOut[1][bin] += diffEne; - - if ( h->renderStereoOutputInsteadOfBinaural ) - { - /* When rendering stereo, ambience (except for surround coherent sound) has zero ICC. */ - h->ChCrossReOut[bin] += surCoh * diffEne; - } - else /* When rendering binaural, ambience has frequency dependent ICC. */ - { - if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && bin < BINAURAL_COHERENCE_DIFFERENCE_BINS ) - { - float diffuseFieldCoherence; - diffuseFieldCoherence = hDirAC->hDiffuseDist->diffuseRatioX[0][bin] * h->diffuseFieldCoherenceX[bin] + hDirAC->hDiffuseDist->diffuseRatioY[0][bin] * h->diffuseFieldCoherenceY[bin] + hDirAC->hDiffuseDist->diffuseRatioZ[0][bin] * h->diffuseFieldCoherenceZ[bin]; - h->ChCrossReOut[bin] += ( ( 1.0f - surCoh ) * diffuseFieldCoherence + surCoh ) * diffEne; - } - else - { - h->ChCrossReOut[bin] += ( ( 1.0f - surCoh ) * h->diffuseFieldCoherence[bin] + surCoh ) * diffEne; - } - } - - /* Store parameters for formulating average diffuseness over frame */ - h->frameMeanDiffuseness[bin] += diffEne; - frameMeanDiffusenessEneWeight[bin] += slot_ratio * meanEnePerCh; - } - } - - /* Formulate average diffuseness over frame */ - for ( bin = 0; bin < nBins; bin++ ) - { - h->frameMeanDiffuseness[bin] /= fmaxf( 1e-12f, frameMeanDiffusenessEneWeight[bin] ); - } - - /* Determine encoding quality based additional smoothing factor */ - qualityBasedSmFactor = 1.0f; - if ( st_ivas->hMasa != NULL ) - { - qualityBasedSmFactor = st_ivas->hMasa->data.dir_decode_quality; - qualityBasedSmFactor *= qualityBasedSmFactor; - } - - /* Temporal IIR-type smoothing of covariance matrices */ - if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE ) - { - IIReneLimiterFactor = 16.0f + ( 1.0f - qualityBasedSmFactor ); - } - else - { - IIReneLimiterFactor = 8.0f + ( 1.0f - qualityBasedSmFactor ); - } - for ( bin = 0; bin < nBins; bin++ ) - { - float eneRatio, IIReneLimiter; - - /* Temporally smooth cov mtx estimates for resulting mixing matrix stability. The design principle is that - * the energy history (IIR) must not be more than double of the current frame energy. This provides more - * robust performance at energy offsets when compared to typical IIR averaging. */ - eneRatio = ( h->ChEne[0][bin] + h->ChEne[1][bin] ) / fmaxf( 1e-12f, ( h->ChEnePrev[0][bin] + h->ChEnePrev[1][bin] ) ); - IIReneLimiter = fminf( 1.0f, eneRatio * IIReneLimiterFactor ); - - h->ChCrossRe[bin] *= qualityBasedSmFactor; - h->ChCrossIm[bin] *= qualityBasedSmFactor; - h->ChCrossReOut[bin] *= qualityBasedSmFactor; - h->ChCrossImOut[bin] *= qualityBasedSmFactor; - - for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - h->ChEne[ch][bin] *= qualityBasedSmFactor; - h->ChEneOut[ch][bin] *= qualityBasedSmFactor; - } - - h->ChCrossRe[bin] += IIReneLimiter * h->ChCrossRePrev[bin]; - h->ChCrossIm[bin] += IIReneLimiter * h->ChCrossImPrev[bin]; - h->ChCrossReOut[bin] += IIReneLimiter * h->ChCrossReOutPrev[bin]; - h->ChCrossImOut[bin] += IIReneLimiter * h->ChCrossImOutPrev[bin]; - - for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - h->ChEne[ch][bin] += IIReneLimiter * h->ChEnePrev[ch][bin]; - h->ChEneOut[ch][bin] += IIReneLimiter * h->ChEneOutPrev[ch][bin]; - } - - /* Store energy values and coefficients for next round */ - h->ChCrossRePrev[bin] = h->ChCrossRe[bin]; - h->ChCrossImPrev[bin] = h->ChCrossIm[bin]; - h->ChCrossReOutPrev[bin] = h->ChCrossReOut[bin]; - h->ChCrossImOutPrev[bin] = h->ChCrossImOut[bin]; - - for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - h->ChEnePrev[ch][bin] = h->ChEne[ch][bin]; - h->ChEneOutPrev[ch][bin] = h->ChEneOut[ch][bin]; - } - } - - return; -} -#endif #endif #endif -- GitLab From 5a0ea5bccfaa927fde58793a64287152e10d459d Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Mon, 15 May 2023 10:23:53 +0200 Subject: [PATCH 156/331] clang-format --- lib_dec/ivas_dirac_output_synthesis_dec.c | 100 +++++++++++----------- 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c index 275f56a40e..a7bb8e504d 100644 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -711,7 +711,7 @@ void ivas_dirac_dec_output_synthesis_process_slot( } else // ( hDirAC->hConfig->dec_param_estim == TRUE ) #endif - if ( hDirAC->hConfig->dec_param_estim == TRUE ) + if ( hDirAC->hConfig->dec_param_estim == TRUE ) { /* compute direct responses */ @@ -746,59 +746,59 @@ void ivas_dirac_dec_output_synthesis_process_slot( if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { - ivas_dirac_dec_compute_gain_factors( num_freq_bands, - diffuseness, - h_dirac_output_synthesis_params->max_band_decorr, - h_dirac_output_synthesis_state->direct_power_factor, - h_dirac_output_synthesis_state->diffuse_power_factor ); + ivas_dirac_dec_compute_gain_factors( num_freq_bands, + diffuseness, + h_dirac_output_synthesis_params->max_band_decorr, + h_dirac_output_synthesis_state->direct_power_factor, + h_dirac_output_synthesis_state->diffuse_power_factor ); - v_multc( h_dirac_output_synthesis_state->direct_power_factor, - 0.25f, - h_dirac_output_synthesis_state->direct_power_factor, - num_freq_bands ); - v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, - 0.25f, - h_dirac_output_synthesis_state->diffuse_power_factor, - num_freq_bands ); + v_multc( h_dirac_output_synthesis_state->direct_power_factor, + 0.25f, + h_dirac_output_synthesis_state->direct_power_factor, + num_freq_bands ); + v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, + 0.25f, + h_dirac_output_synthesis_state->diffuse_power_factor, + num_freq_bands ); /*Direct gain*/ - for ( ch_idx = 0; ch_idx < min( 4, nchan_transport ); ch_idx++ ) + for ( ch_idx = 0; ch_idx < min( 4, nchan_transport ); ch_idx++ ) + { + int16_t k; + if ( ch_idx != 0 ) { - int16_t k; - if ( ch_idx != 0 ) - { - float a, b, c; + float a, b, c; - /*Directonal sound gain nrg compensation*/ - for ( k = 0; k < num_freq_bands_diff; k++ ) - { - a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; - b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); - c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ); /*Diffuseness modellling nrg compensation*/ - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); - } - for ( ; k < num_freq_bands; k++ ) - { - a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; - b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); - c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ); /*Diffuseness modellling nrg compensation*/ - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); - } + /*Directonal sound gain nrg compensation*/ + for ( k = 0; k < num_freq_bands_diff; k++ ) + { + a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; + b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); + c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ); /*Diffuseness modellling nrg compensation*/ + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); } - else + for ( ; k < num_freq_bands; k++ ) { - /*Diffuseness modellling nrg compensation*/ - for ( k = 0; k < num_freq_bands_diff; k++ ) - { - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ) ); - } - for ( ; k < num_freq_bands; k++ ) - { - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ) ); - } + a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; + b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); + c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ); /*Diffuseness modellling nrg compensation*/ + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); } } + else + { + /*Diffuseness modellling nrg compensation*/ + for ( k = 0; k < num_freq_bands_diff; k++ ) + { + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ) ); + } + for ( ; k < num_freq_bands; k++ ) + { + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ) ); + } + } + } /*Directional gain (panning)*/ for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_dir; ch_idx++ ) @@ -833,11 +833,11 @@ void ivas_dirac_dec_output_synthesis_process_slot( else { /* compute reference and diffuse power factor for this frame */ - ivas_dirac_dec_compute_power_factors( num_freq_bands, - diffuseness, - h_dirac_output_synthesis_params->max_band_decorr, - h_dirac_output_synthesis_state->direct_power_factor, - h_dirac_output_synthesis_state->diffuse_power_factor ); + ivas_dirac_dec_compute_power_factors( num_freq_bands, + diffuseness, + h_dirac_output_synthesis_params->max_band_decorr, + h_dirac_output_synthesis_state->direct_power_factor, + h_dirac_output_synthesis_state->diffuse_power_factor ); } } @@ -996,7 +996,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( } else #endif - if ( hDirAC->hConfig->dec_param_estim == FALSE ) + if ( hDirAC->hConfig->dec_param_estim == FALSE ) { /*Direct gain*/ for ( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ ) -- GitLab From 16cad58cd142bf060bbf6670f6ef1a80b6a9960a Mon Sep 17 00:00:00 2001 From: knj Date: Mon, 15 May 2023 10:51:09 +0200 Subject: [PATCH 157/331] set artifact lifetime explicitly (default is buggy) --- .gitlab-ci.yml | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a5f33f3c6f..b629f1c7a3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -13,8 +13,6 @@ variables: default: interruptible: true # Make all jobs by default interruptible - artifacts: - expire_in: 2 weeks # This sets when pipelines are created. Jobs have more specific rules to restrict them. workflow: @@ -328,6 +326,7 @@ codec-smoke-test: - if cat smoke_test_output_hrtf.txt | grep -c "failed"; then echo "Smoke test with external hrtf files failed"; exit 1; fi artifacts: name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" + expire_in: 1 week paths: - smoke_test_output.txt - smoke_test_output_plc.txt @@ -352,6 +351,7 @@ codec-msan: - if [ $run_errors != 0 ] ; then echo "Run errors in self_test.py with Clang memory-sanitizer"; exit 1; fi artifacts: name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" + expire_in: 1 week paths: - scripts/ref/logs/ - test_output.txt @@ -374,6 +374,7 @@ codec-asan: - if [ $run_errors != 0 ] ; then echo "Run errors in self_test.py with Clang address-sanitizer"; exit 1; fi artifacts: name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" + expire_in: 1 week paths: - scripts/ref/logs/ - test_output.txt @@ -391,6 +392,7 @@ renderer-smoke-test: - python3 -m pytest -q -n auto -rA --junit-xml=report-junit.xml tests/renderer/test_renderer.py artifacts: name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results" + expire_in: 1 week when: always paths: - report-junit.xml @@ -414,6 +416,7 @@ renderer-asan: artifacts: name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results" + expire_in: 1 week when: always paths: - report-junit.xml @@ -437,6 +440,7 @@ renderer-msan: artifacts: name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results" + expire_in: 1 week when: always paths: - report-junit.xml @@ -490,6 +494,7 @@ renderer-pytest-on-merge-request: - 123 artifacts: name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results" + expire_in: 2 week when: always paths: - report-junit.xml @@ -540,6 +545,7 @@ ivas-pytest-on-merge-request: - 123 artifacts: name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" + expire_in: 2 week when: always paths: - report-junit.xml @@ -586,6 +592,7 @@ evs-pytest-on-merge-request: - 123 artifacts: name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" + expire_in: 2 week when: always paths: - report-junit-evs.xml @@ -644,6 +651,7 @@ clang-format-check: - exit $format_problems artifacts: + expire_in: 2 days paths: - tmp-formatting-fix/ when: on_failure @@ -776,6 +784,7 @@ codec-comparison-on-main-push: - 123 artifacts: name: "main-push--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" + expire_in: 2 week when: always paths: - report-junit.xml @@ -797,6 +806,7 @@ codec-comparison-on-main-push: - sanitizer_test_main artifacts: name: "$CI_JOB_NAME--main--sha-$CI_COMMIT_SHORT_SHA" + expire_in: 1 week when: always paths: - ep_015.g192 @@ -1060,6 +1070,7 @@ coverage-test-on-main-scheduled: stage: test artifacts: name: "$CI_JOB_NAME--$CI_COMMIT_REF_NAME--sha-$CI_COMMIT_SHA" + expire_in: 1 week paths: - $CI_JOB_NAME-public -- GitLab From f88ec7013b795d9d72245697b410279ee834ff3a Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Mon, 15 May 2023 10:56:18 +0200 Subject: [PATCH 158/331] clang-format --- lib_rend/ivas_objectRenderer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 5d9689f4f7..83db832937 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -454,7 +454,7 @@ void TDREND_Update_object_positions( #ifdef JBM_TSM_ON_TCS float *output[] #else - float output[][L_FRAME48k] /* i/o: SCE/MC channels */ + float output[][L_FRAME48k] /* i/o: SCE/MC channels */ #endif ) { -- GitLab From 2d409d26efd2d901e9c5d831b7cbcaf37b036d3e Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 15 May 2023 11:27:33 +0200 Subject: [PATCH 159/331] add description to the define --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 941aa03d65..556b6f79b0 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -223,7 +223,7 @@ #define VARIABLE_SPEED_DECODING /* FhG: variable speed decoding employing the JBM functioniality */ #define JBM_TSM_ON_TCS /* FhG: run the TSM part of JBM on the TCs instead of the final output pcm waveforms */ -#define FIX_DTX_428 +#define FIX_DTX_428 /* FhG: fix for issue 428, crash with DTX and bitrate switching */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ -- GitLab From ce2bcf46371055d1a0f77e877238a32068656d5e Mon Sep 17 00:00:00 2001 From: emerit Date: Mon, 15 May 2023 11:32:41 +0200 Subject: [PATCH 160/331] Add 2 new tests for testing non diegetic feature --- scripts/config/self_test.prm | 11 + .../testv/stvISM_with_no_diegetic_switch.csv | 1500 +++++++++++++++++ 2 files changed, 1511 insertions(+) create mode 100644 scripts/testv/stvISM_with_no_diegetic_switch.csv diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index 429abcf2e6..32f44fdbf0 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -1024,3 +1024,14 @@ networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit ../IVAS_cod -mc 5_1 384000 48 testv/stv51MC48c.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 ../IVAS_dec -Tracefile tracefile_dec -VOIP 7_1_4 48 netsimoutput testv/stv51MC48c.wav_MC51_384000_48-48_7_1_4_JBM5.tst + + + +// NON DIEGETiC PAN at 60 kbps, 48kHz in, 48kHz out, STEREO out +../IVAS_cod 64000 48 testv/stv48c.wav bit +../IVAS_dec -non_diegetic_pan -0.5 48 bit testv/stv48c.pcm_MONO_64000_48-48_STEREO_NON-DIEGETIC-PAN_-0.5.tst + +// 4 ISM with extended metadata and non diegetic pan object switching bitrate 256 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL out +../IVAS_cod -dtx -ism +4 testv/stvISM1.csv NULL testv/stvISM_with_no_diegetic_switch.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit +../IVAS_dec BINAURAL 48 bit testv/stv+4ISM48s+non_diegetic_pan.wav_brate_sw_48-48_DTX_binaural.tst + diff --git a/scripts/testv/stvISM_with_no_diegetic_switch.csv b/scripts/testv/stvISM_with_no_diegetic_switch.csv new file mode 100644 index 0000000000..35698d046f --- /dev/null +++ b/scripts/testv/stvISM_with_no_diegetic_switch.csv @@ -0,0 +1,1500 @@ +0.00,4.80,16.00,0.00,1.00,0.00,0.00 +0.00,9.60,15.98,0.00,1.00,-177.60,4.80 +0.00,14.40,15.96,0.00,1.00,4.80,9.60 +0.00,19.20,15.94,0.00,1.00,-168.00,14.40 +0.00,24.00,15.91,0.00,1.00,14.40,19.20 +0.00,28.80,15.89,0.00,1.00,-163.20,24.00 +0.00,33.60,15.87,0.00,1.00,19.20,28.80 +0.00,38.40,15.85,0.00,1.00,-153.60,33.60 +0.00,43.20,15.83,0.00,1.00,28.80,38.40 +0.00,48.00,15.81,0.00,1.00,-148.80,43.20 +0.00,52.80,15.79,0.00,1.00,38.40,48.00 +0.00,57.60,15.77,0.00,1.00,-139.20,52.80 +0.00,62.40,15.74,0.00,1.00,48.00,57.60 +4.80,67.20,15.72,0.00,1.00,-124.80,62.40 +4.80,72.00,15.70,0.00,1.00,57.60,67.20 +4.80,76.80,15.68,0.00,1.00,-115.20,72.00 +9.60,81.60,15.66,0.00,1.00,72.00,76.80 +19.20,86.40,15.64,0.00,1.00,-100.80,81.60 +134.40,86.40,15.62,0.00,1.00,86.40,86.40 +168.00,81.60,15.59,0.00,1.00,-86.40,89.20 +172.80,76.80,15.57,0.00,1.00,100.80,86.40 +177.60,72.00,15.55,0.00,1.00,-76.80,81.60 +177.60,67.20,15.53,0.00,1.00,110.40,76.80 +177.60,62.40,15.51,0.00,1.00,-62.40,72.00 +177.60,57.60,15.49,0.00,1.00,124.80,67.20 +177.60,52.80,15.47,0.00,1.00,-52.80,62.40 +177.60,48.00,15.44,0.00,1.00,134.40,57.60 +177.60,43.20,15.42,0.00,1.00,-38.40,52.80 +177.60,38.40,15.40,0.00,1.00,144.00,48.00 +177.60,33.60,15.38,0.00,1.00,-33.60,43.20 +177.60,28.80,15.36,0.00,1.00,153.60,38.40 +177.60,24.00,15.34,0.00,1.00,-24.00,33.60 +177.60,19.20,15.32,0.00,1.00,158.40,28.80 +177.60,14.40,15.30,0.00,1.00,-14.40,24.00 +177.60,9.60,15.27,0.00,1.00,168.00,19.20 +177.60,4.80,15.25,0.00,1.00,-9.60,14.40 +177.60,0.00,15.23,0.00,1.00,172.80,9.60 +-177.60,-0.00,15.21,0.00,1.00,-0.00,4.80 +-177.60,-4.80,15.19,0.00,1.00,-177.60,-0.00 +-177.60,-9.60,15.17,0.00,1.00,4.80,-4.80 +-177.60,-14.40,15.15,0.00,1.00,-172.80,-9.60 +-177.60,-19.20,15.12,0.00,1.00,14.40,-14.40 +-177.60,-24.00,15.10,0.00,1.00,-163.20,-19.20 +-177.60,-28.80,15.08,0.00,1.00,19.20,-24.00 +-177.60,-33.60,15.06,0.00,1.00,-158.40,-28.80 +-177.60,-38.40,15.04,0.00,1.00,28.80,-33.60 +-177.60,-43.20,15.02,0.00,1.00,-148.80,-38.40 +-177.60,-48.00,15.00,0.00,1.00,33.60,-48.00 +-177.60,-52.80,14.97,0.00,1.00,-139.20,-48.00 +-177.60,-57.60,14.95,0.00,1.00,43.20,-52.80 +-177.60,-62.40,14.93,0.00,1.00,-129.60,-57.60 +-177.60,-67.20,14.91,0.00,1.00,57.60,-62.40 +-177.60,-72.00,14.89,0.00,1.00,-120.00,-67.20 +-172.80,-76.80,14.87,0.00,1.00,67.20,-76.80 +-168.00,-81.60,14.85,0.00,1.00,-105.60,-76.80 +-134.40,-86.40,14.83,0.00,1.00,81.60,-86.40 +-19.20,-86.40,14.80,0.00,1.00,-91.20,-89.20 +-9.60,-81.60,14.78,0.00,1.00,96.00,-86.40 +-4.80,-76.80,14.76,0.00,1.00,-76.80,-81.60 +-4.80,-72.00,14.74,0.00,1.00,110.40,-76.80 +-4.80,-67.20,14.72,0.00,1.00,-67.20,-72.00 +-0.00,-62.40,14.70,0.00,1.00,120.00,-67.20 +-0.00,-57.60,14.68,0.00,1.00,-52.80,-62.40 +-0.00,-52.80,14.65,0.00,1.00,129.60,-57.60 +-0.00,-48.00,14.63,0.00,1.00,-43.20,-52.80 +-0.00,-43.20,14.61,0.00,1.00,144.00,-48.00 +-0.00,-38.40,14.59,0.00,1.00,-33.60,-43.20 +-0.00,-33.60,14.57,0.00,1.00,148.80,-38.40 +-0.00,-28.80,14.55,0.00,1.00,-24.00,-33.60 +-0.00,-24.00,14.53,0.00,1.00,158.40,-28.80 +-0.00,-19.20,14.50,0.00,1.00,-19.20,-24.00 +-0.00,-14.40,14.48,0.00,1.00,168.00,-19.20 +-0.00,-9.60,14.46,0.00,1.00,-9.60,-14.40 +-0.00,-4.80,14.44,0.00,1.00,172.80,-9.60 +-0.00,0.00,14.42,0.00,1.00,-4.80,-4.80 +-0.00,4.80,14.40,0.00,1.00,0.00,0.00 +-0.00,9.60,14.38,0.00,1.00,-177.60,4.80 +-0.00,14.40,14.36,0.00,1.00,9.60,9.60 +-0.00,19.20,14.33,0.00,1.00,-168.00,14.40 +-0.00,24.00,14.31,0.00,1.00,14.40,19.20 +-0.00,28.80,14.29,0.00,1.00,-163.20,24.00 +-0.00,33.60,14.27,0.00,1.00,24.00,28.80 +-4.80,38.40,14.25,0.00,1.00,-153.60,33.60 +-4.80,43.20,14.23,0.00,1.00,28.80,38.40 +-4.80,48.00,14.21,0.00,1.00,-144.00,43.20 +-4.80,52.80,14.18,0.00,1.00,38.40,48.00 +-4.80,57.60,14.16,0.00,1.00,-134.40,52.80 +-4.80,62.40,14.14,0.00,1.00,48.00,57.60 +-9.60,67.20,14.12,0.00,1.00,-124.80,62.40 +-9.60,72.00,14.10,0.00,1.00,62.40,67.20 +-14.40,76.80,14.08,0.00,1.00,-115.20,72.00 +-24.00,81.60,14.06,0.00,1.00,72.00,76.80 +-43.20,86.40,14.03,0.00,1.00,-100.80,81.60 +-110.40,86.40,14.01,0.00,1.00,86.40,86.40 +-148.80,81.60,13.99,0.00,1.00,-86.40,86.40 +-163.20,76.80,13.97,0.00,1.00,96.00,81.60 +-168.00,72.00,13.95,0.00,1.00,-76.80,76.80 +-172.80,67.20,13.93,0.00,1.00,110.40,72.00 +-172.80,62.40,13.91,0.00,1.00,-62.40,67.20 +-172.80,57.60,13.89,0.00,1.00,120.00,62.40 +-172.80,52.80,13.86,0.00,1.00,-52.80,57.60 +-177.60,48.00,13.84,0.00,1.00,134.40,52.80 +-177.60,43.20,13.82,0.00,1.00,-43.20,48.00 +-177.60,38.40,13.80,0.00,1.00,144.00,43.20 +-177.60,33.60,13.78,0.00,1.00,-33.60,38.40 +-177.60,28.80,13.76,0.00,1.00,148.80,33.60 +-177.60,24.00,13.74,0.00,1.00,-24.00,28.80 +-177.60,19.20,13.71,0.00,1.00,158.40,24.00 +-177.60,14.40,13.69,0.00,1.00,-19.20,19.20 +-177.60,9.60,13.67,0.00,1.00,168.00,14.40 +-177.60,4.80,13.65,0.00,1.00,-9.60,9.60 +-177.60,0.00,13.63,0.00,1.00,172.80,4.80 +177.60,-0.00,13.61,0.00,1.00,-0.00,0.00 +177.60,-4.80,13.59,0.00,1.00,-177.60,-0.00 +177.60,-9.60,13.56,0.00,1.00,4.80,-4.80 +177.60,-14.40,13.54,0.00,1.00,-172.80,-9.60 +177.60,-19.20,13.52,0.00,1.00,14.40,-14.40 +177.60,-24.00,13.50,0.00,1.00,-163.20,-19.20 +177.60,-28.80,13.48,0.00,1.00,19.20,-24.00 +177.60,-33.60,13.46,0.00,1.00,-153.60,-28.80 +177.60,-38.40,13.44,0.00,1.00,28.80,-33.60 +177.60,-43.20,13.42,0.00,1.00,-148.80,-38.40 +177.60,-48.00,13.39,0.00,1.00,38.40,-43.20 +172.80,-52.80,13.37,0.00,1.00,-139.20,-48.00 +172.80,-57.60,13.35,0.00,1.00,48.00,-52.80 +172.80,-62.40,13.33,0.00,1.00,-124.80,-57.60 +172.80,-67.20,13.31,0.00,1.00,57.60,-62.40 +168.00,-72.00,13.29,0.00,1.00,-115.20,-67.20 +163.20,-76.80,13.27,0.00,1.00,72.00,-72.00 +148.80,-81.60,13.24,0.00,1.00,-105.60,-76.80 +110.40,-86.40,13.22,0.00,1.00,81.60,-81.60 +43.20,-86.40,13.20,0.00,1.00,-91.20,-86.40 +24.00,-81.60,13.18,0.00,1.00,96.00,-86.40 +14.40,-76.80,13.16,0.00,1.00,-76.80,-81.60 +9.60,-72.00,13.14,0.00,1.00,105.60,-76.80 +9.60,-67.20,13.12,0.00,1.00,-67.20,-72.00 +4.80,-62.40,13.09,0.00,1.00,120.00,-67.20 +4.80,-57.60,13.07,0.00,1.00,-57.60,-62.40 +4.80,-52.80,13.05,0.00,1.00,129.60,-57.60 +4.80,-48.00,13.03,0.00,1.00,-43.20,-52.80 +4.80,-43.20,13.01,0.00,1.00,139.20,-48.00 +4.80,-38.40,12.99,0.00,1.00,-33.60,-43.20 +0.00,-33.60,12.97,0.00,1.00,148.80,-38.40 +0.00,-28.80,12.95,0.00,1.00,-28.80,-33.60 +0.00,-24.00,12.92,0.00,1.00,158.40,-28.80 +0.00,-19.20,12.90,0.00,1.00,-19.20,-24.00 +0.00,-14.40,12.88,0.00,1.00,163.20,-19.20 +0.00,-9.60,12.86,0.00,1.00,-9.60,-14.40 +0.00,-4.80,12.84,0.00,1.00,172.80,-9.60 +0.00,0.00,12.82,0.00,1.00,-4.80,-4.80 +-0.00,4.80,12.80,0.00,1.00,0.00,0.00 +-0.00,9.60,12.77,0.00,1.00,-177.60,4.80 +-0.00,14.40,12.75,0.00,1.00,9.60,9.60 +-4.80,19.20,12.73,0.00,1.00,-168.00,14.40 +-4.80,24.00,12.71,0.00,1.00,14.40,19.20 +-4.80,28.80,12.69,0.00,1.00,-158.40,24.00 +-4.80,33.60,12.67,0.00,1.00,24.00,28.80 +-4.80,38.40,12.65,0.00,1.00,-153.60,33.60 +-9.60,43.20,12.62,0.00,1.00,33.60,38.40 +-9.60,48.00,12.60,0.00,1.00,-144.00,43.20 +-9.60,52.80,12.58,0.00,1.00,43.20,48.00 +-14.40,57.60,12.56,0.00,1.00,-134.40,52.80 +-14.40,62.40,12.54,0.00,1.00,52.80,57.60 +-19.20,67.20,12.52,0.00,1.00,-124.80,62.40 +-24.00,72.00,12.50,0.00,1.00,62.40,67.20 +-33.60,72.00,12.48,0.00,1.00,-110.40,72.00 +-43.20,76.80,12.45,0.00,1.00,72.00,72.00 +-67.20,81.60,12.43,0.00,1.00,-100.80,76.80 +-96.00,81.60,12.41,0.00,1.00,86.40,81.60 +-124.80,81.60,12.39,0.00,1.00,-86.40,81.60 +-144.00,76.80,12.37,0.00,1.00,96.00,76.80 +-153.60,72.00,12.35,0.00,1.00,-76.80,76.80 +-158.40,67.20,12.33,0.00,1.00,110.40,72.00 +-163.20,62.40,12.30,0.00,1.00,-67.20,67.20 +-168.00,57.60,12.28,0.00,1.00,120.00,62.40 +-168.00,52.80,12.26,0.00,1.00,-52.80,57.60 +-168.00,48.00,12.24,0.00,1.00,129.60,52.80 +-172.80,43.20,12.22,0.00,1.00,-43.20,48.00 +-172.80,38.40,12.20,0.00,1.00,139.20,43.20 +-172.80,33.60,12.18,0.00,1.00,-33.60,38.40 +-172.80,28.80,12.15,0.00,1.00,148.80,33.60 +-177.60,24.00,12.13,0.00,1.00,-24.00,28.80 +-177.60,19.20,12.11,0.00,1.00,158.40,24.00 +-177.60,14.40,12.09,0.00,1.00,-19.20,19.20 +-177.60,9.60,12.07,0.00,1.00,168.00,14.40 +-177.60,4.80,12.05,0.00,1.00,-9.60,9.60 +-177.60,0.00,12.03,0.00,1.00,172.80,4.80 +177.60,-0.00,12.01,0.00,1.00,-0.00,0.00 +177.60,-4.80,11.98,0.00,1.00,-177.60,-0.00 +177.60,-9.60,11.96,0.00,1.00,4.80,-4.80 +177.60,-14.40,11.94,0.00,1.00,-168.00,-9.60 +177.60,-19.20,11.92,0.00,1.00,14.40,-14.40 +177.60,-24.00,11.90,0.00,1.00,-163.20,-19.20 +172.80,-28.80,11.88,0.00,1.00,24.00,-24.00 +172.80,-33.60,11.86,0.00,1.00,-153.60,-28.80 +172.80,-38.40,11.83,0.00,1.00,28.80,-33.60 +172.80,-43.20,11.81,0.00,1.00,-144.00,-38.40 +168.00,-48.00,11.79,0.00,1.00,38.40,-43.20 +168.00,-52.80,11.77,0.00,1.00,-134.40,-48.00 +168.00,-57.60,11.75,0.00,1.00,48.00,-52.80 +163.20,-62.40,11.73,0.00,1.00,-124.80,-57.60 +158.40,-67.20,11.71,0.00,1.00,62.40,-62.40 +153.60,-72.00,11.68,0.00,1.00,-115.20,-67.20 +144.00,-76.80,11.66,0.00,1.00,72.00,-72.00 +124.80,-81.60,11.64,0.00,1.00,-100.80,-76.80 +96.00,-81.60,11.62,0.00,1.00,81.60,-76.80 +67.20,-81.60,11.60,0.00,1.00,-91.20,-81.60 +43.20,-76.80,11.58,0.00,1.00,96.00,-81.60 +33.60,-72.00,11.56,0.00,1.00,-81.60,-76.80 +24.00,-72.00,11.54,0.00,1.00,105.60,-72.00 +19.20,-67.20,11.51,0.00,1.00,-67.20,-72.00 +14.40,-62.40,11.49,0.00,1.00,115.20,-67.20 +14.40,-57.60,11.47,0.00,1.00,-57.60,-62.40 +9.60,-52.80,11.45,0.00,1.00,129.60,-57.60 +9.60,-48.00,11.43,0.00,1.00,-48.00,-52.80 +9.60,-43.20,11.41,0.00,1.00,139.20,-48.00 +4.80,-38.40,11.39,0.00,1.00,-38.40,-43.20 +4.80,-33.60,11.36,0.00,1.00,148.80,-38.40 +4.80,-28.80,11.34,0.00,1.00,-28.80,-33.60 +4.80,-24.00,11.32,0.00,1.00,153.60,-28.80 +4.80,-19.20,11.30,0.00,1.00,-19.20,-24.00 +0.00,-14.40,11.28,0.00,1.00,163.20,-19.20 +0.00,-9.60,11.26,0.00,1.00,-9.60,-14.40 +0.00,-4.80,11.24,0.00,1.00,172.80,-9.60 +0.00,0.00,11.21,0.00,1.00,-4.80,-4.80 +-0.00,4.80,11.19,0.00,1.00,0.00,0.00 +-0.00,9.60,11.17,0.00,1.00,-177.60,4.80 +-4.80,14.40,11.15,0.00,1.00,9.60,9.60 +-4.80,19.20,11.13,0.00,1.00,-168.00,14.40 +-4.80,24.00,11.11,0.00,1.00,14.40,19.20 +-4.80,28.80,11.09,0.00,1.00,-158.40,24.00 +-9.60,33.60,11.07,0.00,1.00,24.00,28.80 +-9.60,38.40,11.04,0.00,1.00,-148.80,33.60 +-14.40,43.20,11.02,0.00,1.00,33.60,38.40 +-14.40,48.00,11.00,0.00,1.00,-139.20,43.20 +-14.40,52.80,10.98,0.00,1.00,43.20,48.00 +-19.20,57.60,10.96,0.00,1.00,-129.60,52.80 +-24.00,57.60,10.94,0.00,1.00,52.80,52.80 +-28.80,62.40,10.92,0.00,1.00,-120.00,57.60 +-33.60,67.20,10.89,0.00,1.00,62.40,62.40 +-43.20,72.00,10.87,0.00,1.00,-110.40,67.20 +-57.60,72.00,10.85,0.00,1.00,76.80,72.00 +-76.80,76.80,10.83,0.00,1.00,-100.80,72.00 +-96.00,76.80,10.81,0.00,1.00,86.40,76.80 +-115.20,76.80,10.79,0.00,1.00,-86.40,76.80 +-129.60,72.00,10.77,0.00,1.00,96.00,76.80 +-139.20,72.00,10.74,0.00,1.00,-76.80,72.00 +-148.80,67.20,10.72,0.00,1.00,105.60,67.20 +-153.60,62.40,10.70,0.00,1.00,-67.20,67.20 +-158.40,57.60,10.68,0.00,1.00,120.00,62.40 +-163.20,52.80,10.66,0.00,1.00,-57.60,57.60 +-163.20,48.00,10.64,0.00,1.00,129.60,52.80 +-168.00,43.20,10.62,0.00,1.00,-48.00,48.00 +-168.00,38.40,10.60,0.00,1.00,139.20,43.20 +-172.80,33.60,10.57,0.00,1.00,-38.40,38.40 +-172.80,28.80,10.55,0.00,1.00,148.80,33.60 +-172.80,24.00,10.53,0.00,1.00,-28.80,28.80 +-172.80,19.20,10.51,0.00,1.00,158.40,24.00 +-177.60,14.40,10.49,0.00,1.00,-19.20,19.20 +-177.60,9.60,10.47,0.00,1.00,163.20,14.40 +-177.60,4.80,10.45,0.00,1.00,-9.60,9.60 +-177.60,0.00,10.42,0.00,1.00,172.80,4.80 +177.60,-0.00,10.40,0.00,1.00,-0.00,0.00 +177.60,-4.80,10.38,0.00,1.00,-177.60,-0.00 +177.60,-9.60,10.36,0.00,1.00,4.80,-4.80 +177.60,-14.40,10.34,0.00,1.00,-168.00,-9.60 +172.80,-19.20,10.32,0.00,1.00,14.40,-14.40 +172.80,-24.00,10.30,0.00,1.00,-163.20,-19.20 +172.80,-28.80,10.28,0.00,1.00,24.00,-24.00 +172.80,-33.60,10.25,0.00,1.00,-153.60,-28.80 +168.00,-38.40,10.23,0.00,1.00,33.60,-33.60 +168.00,-43.20,10.21,0.00,1.00,-144.00,-38.40 +163.20,-48.00,10.19,0.00,1.00,43.20,-43.20 +163.20,-52.80,10.17,0.00,1.00,-134.40,-48.00 +158.40,-57.60,10.15,0.00,1.00,52.80,-52.80 +153.60,-62.40,10.13,0.00,1.00,-124.80,-57.60 +148.80,-67.20,10.10,0.00,1.00,62.40,-62.40 +139.20,-72.00,10.08,0.00,1.00,-115.20,-67.20 +129.60,-72.00,10.06,0.00,1.00,72.00,-67.20 +115.20,-76.80,10.04,0.00,1.00,-100.80,-72.00 +96.00,-76.80,10.02,0.00,1.00,81.60,-76.80 +76.80,-76.80,10.00,0.00,1.00,-91.20,-76.80 +57.60,-72.00,9.98,0.00,1.00,96.00,-76.80 +43.20,-72.00,9.95,0.00,1.00,-81.60,-72.00 +33.60,-67.20,9.93,0.00,1.00,105.60,-72.00 +28.80,-62.40,9.91,0.00,1.00,-67.20,-67.20 +24.00,-57.60,9.89,0.00,1.00,115.20,-62.40 +19.20,-57.60,9.87,0.00,1.00,-57.60,-57.60 +14.40,-52.80,9.85,0.00,1.00,124.80,-52.80 +14.40,-48.00,9.83,0.00,1.00,-48.00,-52.80 +14.40,-43.20,9.81,0.00,1.00,134.40,-48.00 +9.60,-38.40,9.78,0.00,1.00,-38.40,-43.20 +9.60,-33.60,9.76,0.00,1.00,144.00,-38.40 +4.80,-28.80,9.74,0.00,1.00,-28.80,-33.60 +4.80,-24.00,9.72,0.00,1.00,153.60,-28.80 +4.80,-19.20,9.70,0.00,1.00,-19.20,-24.00 +4.80,-14.40,9.68,0.00,1.00,163.20,-19.20 +0.00,-9.60,9.66,0.00,1.00,-14.40,-14.40 +0.00,-4.80,9.63,0.00,1.00,172.80,-9.60 +0.00,0.00,9.61,0.00,1.00,-4.80,-4.80 +-0.00,4.80,9.59,0.00,1.00,0.00,0.00 +-4.80,9.60,9.57,0.00,1.00,-177.60,4.80 +-4.80,14.40,9.55,0.00,1.00,9.60,9.60 +-4.80,19.20,9.53,0.00,1.00,-168.00,14.40 +-9.60,24.00,9.51,0.00,1.00,19.20,19.20 +-9.60,28.80,9.48,0.00,1.00,-158.40,24.00 +-9.60,33.60,9.46,0.00,1.00,24.00,28.80 +-14.40,38.40,9.44,0.00,1.00,-148.80,33.60 +-14.40,38.40,9.42,0.00,1.00,33.60,33.60 +-19.20,43.20,9.40,0.00,1.00,-139.20,38.40 +-24.00,48.00,9.38,0.00,1.00,43.20,43.20 +-24.00,52.80,9.36,0.00,1.00,-129.60,48.00 +-28.80,57.60,9.34,0.00,1.00,52.80,52.80 +-38.40,62.40,9.31,0.00,1.00,-120.00,57.60 +-43.20,62.40,9.29,0.00,1.00,67.20,62.40 +-52.80,67.20,9.27,0.00,1.00,-110.40,62.40 +-62.40,72.00,9.25,0.00,1.00,76.80,67.20 +-76.80,72.00,9.23,0.00,1.00,-100.80,67.20 +-96.00,72.00,9.21,0.00,1.00,86.40,72.00 +-110.40,72.00,9.19,0.00,1.00,-86.40,72.00 +-120.00,67.20,9.16,0.00,1.00,96.00,72.00 +-134.40,67.20,9.14,0.00,1.00,-76.80,67.20 +-139.20,62.40,9.12,0.00,1.00,105.60,67.20 +-148.80,57.60,9.10,0.00,1.00,-67.20,62.40 +-153.60,57.60,9.08,0.00,1.00,115.20,57.60 +-158.40,52.80,9.06,0.00,1.00,-57.60,52.80 +-158.40,48.00,9.04,0.00,1.00,129.60,52.80 +-163.20,43.20,9.01,0.00,1.00,-48.00,48.00 +-163.20,38.40,8.99,0.00,1.00,139.20,43.20 +-168.00,33.60,8.97,0.00,1.00,-38.40,38.40 +-168.00,28.80,8.95,0.00,1.00,148.80,33.60 +-172.80,24.00,8.93,0.00,1.00,-28.80,28.80 +-172.80,19.20,8.91,0.00,1.00,153.60,24.00 +-172.80,14.40,8.89,0.00,1.00,-19.20,19.20 +-177.60,9.60,8.87,0.00,1.00,163.20,14.40 +-177.60,4.80,8.84,0.00,1.00,-9.60,9.60 +-177.60,0.00,8.82,0.00,1.00,172.80,4.80 +177.60,-0.00,8.80,0.00,1.00,-0.00,0.00 +177.60,-4.80,8.78,0.00,1.00,-177.60,-0.00 +177.60,-9.60,8.76,0.00,1.00,4.80,-4.80 +172.80,-14.40,8.74,0.00,1.00,-168.00,-9.60 +172.80,-19.20,8.72,0.00,1.00,14.40,-14.40 +172.80,-24.00,8.69,0.00,1.00,-158.40,-19.20 +168.00,-28.80,8.67,0.00,1.00,24.00,-24.00 +168.00,-33.60,8.65,0.00,1.00,-153.60,-28.80 +163.20,-38.40,8.63,0.00,1.00,33.60,-33.60 +163.20,-43.20,8.61,0.00,1.00,-144.00,-38.40 +158.40,-48.00,8.59,0.00,1.00,43.20,-43.20 +158.40,-52.80,8.57,0.00,1.00,-134.40,-48.00 +153.60,-57.60,8.54,0.00,1.00,52.80,-52.80 +148.80,-57.60,8.52,0.00,1.00,-124.80,-52.80 +139.20,-62.40,8.50,0.00,1.00,62.40,-57.60 +134.40,-67.20,8.48,0.00,1.00,-110.40,-62.40 +120.00,-67.20,8.46,0.00,1.00,72.00,-67.20 +110.40,-72.00,8.44,0.00,1.00,-100.80,-67.20 +96.00,-72.00,8.42,0.00,1.00,81.60,-72.00 +76.80,-72.00,8.40,0.00,1.00,-91.20,-72.00 +62.40,-72.00,8.37,0.00,1.00,96.00,-72.00 +52.80,-67.20,8.35,0.00,1.00,-81.60,-67.20 +43.20,-62.40,8.33,0.00,1.00,105.60,-67.20 +38.40,-62.40,8.31,0.00,1.00,-72.00,-62.40 +28.80,-57.60,8.29,0.00,1.00,115.20,-62.40 +24.00,-52.80,8.27,0.00,1.00,-57.60,-57.60 +24.00,-48.00,8.25,0.00,1.00,124.80,-52.80 +19.20,-43.20,8.22,0.00,1.00,-48.00,-48.00 +14.40,-38.40,8.20,0.00,1.00,134.40,-43.20 +14.40,-38.40,8.18,0.00,1.00,-38.40,-38.40 +9.60,-33.60,8.16,0.00,1.00,144.00,-33.60 +9.60,-28.80,8.14,0.00,1.00,-28.80,-33.60 +9.60,-24.00,8.12,0.00,1.00,153.60,-28.80 +4.80,-19.20,8.10,0.00,1.00,-24.00,-24.00 +4.80,-14.40,8.07,0.00,1.00,163.20,-19.20 +4.80,-9.60,8.05,0.00,1.00,-14.40,-14.40 +0.00,-4.80,8.03,0.00,1.00,172.80,-9.60 +0.00,0.00,8.01,0.00,1.00,-4.80,-4.80 +-0.00,4.80,7.99,0.00,1.00,0.00,0.00 +-4.80,9.60,7.97,0.00,1.00,-177.60,4.80 +-4.80,14.40,7.95,0.00,1.00,9.60,9.60 +-9.60,19.20,7.93,0.00,1.00,-168.00,14.40 +-9.60,24.00,7.90,0.00,1.00,19.20,19.20 +-14.40,24.00,7.88,0.00,1.00,-158.40,24.00 +-14.40,28.80,7.86,0.00,1.00,28.80,24.00 +-19.20,33.60,7.84,0.00,1.00,-148.80,28.80 +-19.20,38.40,7.82,0.00,1.00,38.40,33.60 +-24.00,43.20,7.80,0.00,1.00,-139.20,38.40 +-28.80,48.00,7.78,0.00,1.00,48.00,43.20 +-33.60,52.80,7.75,0.00,1.00,-129.60,48.00 +-38.40,52.80,7.73,0.00,1.00,57.60,52.80 +-43.20,57.60,7.71,0.00,1.00,-120.00,52.80 +-48.00,62.40,7.69,0.00,1.00,67.20,57.60 +-57.60,62.40,7.67,0.00,1.00,-110.40,62.40 +-67.20,67.20,7.65,0.00,1.00,76.80,62.40 +-81.60,67.20,7.63,0.00,1.00,-100.80,62.40 +-91.20,67.20,7.60,0.00,1.00,86.40,67.20 +-105.60,67.20,7.58,0.00,1.00,-86.40,67.20 +-115.20,67.20,7.56,0.00,1.00,96.00,67.20 +-124.80,62.40,7.54,0.00,1.00,-76.80,62.40 +-134.40,57.60,7.52,0.00,1.00,105.60,62.40 +-139.20,57.60,7.50,0.00,1.00,-67.20,57.60 +-144.00,52.80,7.48,0.00,1.00,115.20,57.60 +-148.80,48.00,7.46,0.00,1.00,-57.60,52.80 +-153.60,43.20,7.43,0.00,1.00,124.80,48.00 +-158.40,43.20,7.41,0.00,1.00,-48.00,43.20 +-163.20,38.40,7.39,0.00,1.00,134.40,38.40 +-163.20,33.60,7.37,0.00,1.00,-38.40,38.40 +-168.00,28.80,7.35,0.00,1.00,144.00,33.60 +-168.00,24.00,7.33,0.00,1.00,-28.80,28.80 +-172.80,19.20,7.31,0.00,1.00,153.60,24.00 +-172.80,14.40,7.28,0.00,1.00,-19.20,19.20 +-177.60,9.60,7.26,0.00,1.00,163.20,14.40 +-177.60,4.80,7.24,0.00,1.00,-9.60,9.60 +-177.60,0.00,7.22,0.00,1.00,172.80,4.80 +177.60,-0.00,7.20,0.00,1.00,-0.00,0.00 +177.60,-4.80,7.18,0.00,1.00,-177.60,-0.00 +177.60,-9.60,7.16,0.00,1.00,4.80,-4.80 +172.80,-14.40,7.13,0.00,1.00,-168.00,-9.60 +172.80,-19.20,7.11,0.00,1.00,14.40,-14.40 +168.00,-24.00,7.09,0.00,1.00,-158.40,-19.20 +168.00,-28.80,7.07,0.00,1.00,24.00,-24.00 +163.20,-33.60,7.05,0.00,1.00,-148.80,-28.80 +163.20,-38.40,7.03,0.00,1.00,33.60,-33.60 +158.40,-43.20,7.01,0.00,1.00,-139.20,-38.40 +153.60,-43.20,6.99,0.00,1.00,43.20,-38.40 +148.80,-48.00,6.96,0.00,1.00,-129.60,-43.20 +144.00,-52.80,6.94,0.00,1.00,52.80,-48.00 +139.20,-57.60,6.92,0.00,1.00,-120.00,-52.80 +134.40,-57.60,6.90,0.00,1.00,62.40,-57.60 +124.80,-62.40,6.88,0.00,1.00,-110.40,-57.60 +115.20,-67.20,6.86,0.00,1.00,72.00,-62.40 +105.60,-67.20,6.84,0.00,1.00,-100.80,-62.40 +91.20,-67.20,6.81,0.00,1.00,81.60,-67.20 +81.60,-67.20,6.79,0.00,1.00,-91.20,-67.20 +67.20,-67.20,6.77,0.00,1.00,96.00,-67.20 +57.60,-62.40,6.75,0.00,1.00,-81.60,-62.40 +48.00,-62.40,6.73,0.00,1.00,105.60,-62.40 +43.20,-57.60,6.71,0.00,1.00,-72.00,-62.40 +38.40,-52.80,6.69,0.00,1.00,115.20,-57.60 +33.60,-52.80,6.66,0.00,1.00,-62.40,-52.80 +28.80,-48.00,6.64,0.00,1.00,124.80,-52.80 +24.00,-43.20,6.62,0.00,1.00,-52.80,-48.00 +19.20,-38.40,6.60,0.00,1.00,134.40,-43.20 +19.20,-33.60,6.58,0.00,1.00,-43.20,-38.40 +14.40,-28.80,6.56,0.00,1.00,144.00,-33.60 +14.40,-24.00,6.54,0.00,1.00,-33.60,-28.80 +9.60,-24.00,6.52,0.00,1.00,153.60,-24.00 +9.60,-19.20,6.49,0.00,1.00,-24.00,-24.00 +4.80,-14.40,6.47,0.00,1.00,163.20,-19.20 +4.80,-9.60,6.45,0.00,1.00,-14.40,-14.40 +0.00,-4.80,6.43,0.00,1.00,172.80,-9.60 +0.00,0.00,6.41,0.00,1.00,-4.80,-4.80 +-0.00,4.80,6.39,0.00,1.00,0.00,0.00 +-4.80,9.60,6.37,0.00,1.00,-177.60,4.80 +-4.80,14.40,6.34,0.00,1.00,9.60,9.60 +-9.60,19.20,6.32,0.00,1.00,-168.00,14.40 +-9.60,19.20,6.30,0.00,1.00,19.20,14.40 +-14.40,24.00,6.28,0.00,1.00,-158.40,19.20 +-19.20,28.80,6.26,0.00,1.00,28.80,24.00 +-19.20,33.60,6.24,0.00,1.00,-148.80,28.80 +-24.00,38.40,6.22,0.00,1.00,38.40,33.60 +-28.80,43.20,6.19,0.00,1.00,-139.20,38.40 +-33.60,43.20,6.17,0.00,1.00,48.00,38.40 +-38.40,48.00,6.15,0.00,1.00,-129.60,43.20 +-43.20,52.80,6.13,0.00,1.00,57.60,48.00 +-48.00,52.80,6.11,0.00,1.00,-120.00,52.80 +-52.80,57.60,6.09,0.00,1.00,67.20,52.80 +-62.40,57.60,6.07,0.00,1.00,-110.40,57.60 +-72.00,62.40,6.05,0.00,1.00,76.80,57.60 +-81.60,62.40,6.02,0.00,1.00,-100.80,62.40 +-91.20,62.40,6.00,0.00,1.00,86.40,62.40 +-100.80,62.40,5.98,0.00,1.00,-86.40,62.40 +-110.40,62.40,5.96,0.00,1.00,96.00,62.40 +-120.00,57.60,5.94,0.00,1.00,-76.80,57.60 +-129.60,57.60,5.92,0.00,1.00,105.60,57.60 +-134.40,52.80,5.90,0.00,1.00,-67.20,57.60 +-139.20,48.00,5.87,0.00,1.00,115.20,52.80 +-144.00,48.00,5.85,0.00,1.00,-57.60,48.00 +-148.80,43.20,5.83,0.00,1.00,124.80,48.00 +-153.60,38.40,5.81,0.00,1.00,-48.00,43.20 +-158.40,33.60,5.79,0.00,1.00,134.40,38.40 +-163.20,33.60,5.77,0.00,1.00,-38.40,33.60 +-163.20,28.80,5.75,0.00,1.00,144.00,28.80 +-168.00,24.00,5.72,0.00,1.00,-28.80,28.80 +-168.00,19.20,5.70,0.00,1.00,153.60,24.00 +-172.80,14.40,5.68,0.00,1.00,-19.20,19.20 +-172.80,9.60,5.66,0.00,1.00,163.20,14.40 +-177.60,4.80,5.64,0.00,1.00,-9.60,9.60 +-177.60,0.00,5.62,0.00,1.00,172.80,4.80 +177.60,-0.00,5.60,0.00,1.00,-0.00,0.00 +177.60,-4.80,5.58,0.00,1.00,-177.60,-0.00 +172.80,-9.60,5.55,0.00,1.00,4.80,-4.80 +172.80,-14.40,5.53,0.00,1.00,-168.00,-9.60 +168.00,-19.20,5.51,0.00,1.00,14.40,-14.40 +168.00,-24.00,5.49,0.00,1.00,-158.40,-19.20 +163.20,-28.80,5.47,0.00,1.00,24.00,-24.00 +163.20,-33.60,5.45,0.00,1.00,-148.80,-28.80 +158.40,-33.60,5.43,0.00,1.00,33.60,-28.80 +153.60,-38.40,5.40,0.00,1.00,-139.20,-33.60 +148.80,-43.20,5.38,0.00,1.00,43.20,-38.40 +144.00,-48.00,5.36,0.00,1.00,-129.60,-43.20 +139.20,-48.00,5.34,0.00,1.00,52.80,-48.00 +134.40,-52.80,5.32,0.00,1.00,-120.00,-48.00 +129.60,-57.60,5.30,0.00,1.00,62.40,-52.80 +120.00,-57.60,5.28,0.00,1.00,-110.40,-57.60 +110.40,-62.40,5.26,0.00,1.00,72.00,-57.60 +100.80,-62.40,5.23,0.00,1.00,-100.80,-57.60 +91.20,-62.40,5.21,0.00,1.00,81.60,-62.40 +81.60,-62.40,5.19,0.00,1.00,-91.20,-62.40 +72.00,-62.40,5.17,0.00,1.00,96.00,-62.40 +62.40,-57.60,5.15,0.00,1.00,-81.60,-62.40 +52.80,-57.60,5.13,0.00,1.00,105.60,-57.60 +48.00,-52.80,5.11,0.00,1.00,-72.00,-57.60 +43.20,-52.80,5.08,0.00,1.00,115.20,-52.80 +38.40,-48.00,5.06,0.00,1.00,-62.40,-52.80 +33.60,-43.20,5.04,0.00,1.00,124.80,-48.00 +28.80,-43.20,5.02,0.00,1.00,-52.80,-43.20 +24.00,-38.40,5.00,0.00,1.00,134.40,-38.40 +19.20,-33.60,4.98,0.00,1.00,-43.20,-38.40 +19.20,-28.80,4.96,0.00,1.00,144.00,-33.60 +14.40,-24.00,4.93,0.00,1.00,-33.60,-28.80 +9.60,-19.20,4.91,0.00,1.00,153.60,-24.00 +9.60,-19.20,4.89,0.00,1.00,-24.00,-19.20 +4.80,-14.40,4.87,0.00,1.00,163.20,-14.40 +4.80,-9.60,4.85,0.00,1.00,-14.40,-14.40 +0.00,-4.80,4.83,0.00,1.00,172.80,-9.60 +0.00,0.00,4.81,0.00,1.00,-4.80,-4.80 +-4.80,4.80,4.79,0.00,1.00,0.00,0.00 +-4.80,9.60,4.76,0.00,1.00,-177.60,4.80 +-9.60,14.40,4.74,0.00,1.00,9.60,9.60 +-9.60,14.40,4.72,0.00,1.00,-168.00,9.60 +-14.40,19.20,4.70,0.00,1.00,19.20,14.40 +-14.40,24.00,4.68,0.00,1.00,-158.40,19.20 +-19.20,28.80,4.66,0.00,1.00,28.80,24.00 +-24.00,33.60,4.64,0.00,1.00,-148.80,28.80 +-28.80,33.60,4.61,0.00,1.00,38.40,28.80 +-28.80,38.40,4.59,0.00,1.00,-139.20,33.60 +-33.60,43.20,4.57,0.00,1.00,48.00,38.40 +-38.40,43.20,4.55,0.00,1.00,-129.60,43.20 +-48.00,48.00,4.53,0.00,1.00,57.60,43.20 +-52.80,52.80,4.51,0.00,1.00,-120.00,48.00 +-57.60,52.80,4.49,0.00,1.00,67.20,48.00 +-67.20,57.60,4.46,0.00,1.00,-110.40,52.80 +-76.80,57.60,4.44,0.00,1.00,76.80,52.80 +-81.60,57.60,4.42,0.00,1.00,-100.80,57.60 +-91.20,57.60,4.40,0.00,1.00,86.40,57.60 +-100.80,57.60,4.38,0.00,1.00,-86.40,57.60 +-110.40,57.60,4.36,0.00,1.00,96.00,57.60 +-115.20,52.80,4.34,0.00,1.00,-76.80,52.80 +-124.80,52.80,4.32,0.00,1.00,105.60,52.80 +-129.60,48.00,4.29,0.00,1.00,-67.20,52.80 +-139.20,48.00,4.27,0.00,1.00,115.20,48.00 +-144.00,43.20,4.25,0.00,1.00,-57.60,48.00 +-148.80,38.40,4.23,0.00,1.00,124.80,43.20 +-153.60,38.40,4.21,0.00,1.00,-48.00,38.40 +-153.60,33.60,4.19,0.00,1.00,134.40,38.40 +-158.40,28.80,4.17,0.00,1.00,-38.40,33.60 +-163.20,24.00,4.14,0.00,1.00,144.00,28.80 +-163.20,24.00,4.12,0.00,1.00,-28.80,24.00 +-168.00,19.20,4.10,0.00,1.00,153.60,24.00 +-172.80,14.40,4.08,0.00,1.00,-19.20,19.20 +-172.80,9.60,4.06,0.00,1.00,163.20,14.40 +-177.60,4.80,4.04,0.00,1.00,-9.60,9.60 +-177.60,0.00,4.02,0.00,1.00,172.80,4.80 +177.60,-0.00,3.99,0.00,1.00,-0.00,0.00 +177.60,-4.80,3.97,0.00,1.00,-177.60,-0.00 +172.80,-9.60,3.95,0.00,1.00,4.80,-4.80 +172.80,-14.40,3.93,0.00,1.00,-168.00,-9.60 +168.00,-19.20,3.91,0.00,1.00,14.40,-14.40 +163.20,-24.00,3.89,0.00,1.00,-158.40,-19.20 +163.20,-24.00,3.87,0.00,1.00,24.00,-24.00 +158.40,-28.80,3.85,0.00,1.00,-148.80,-24.00 +153.60,-33.60,3.82,0.00,1.00,33.60,-28.80 +153.60,-38.40,3.80,0.00,1.00,-139.20,-33.60 +148.80,-38.40,3.78,0.00,1.00,43.20,-38.40 +144.00,-43.20,3.76,0.00,1.00,-129.60,-38.40 +139.20,-48.00,3.74,0.00,1.00,52.80,-43.20 +129.60,-48.00,3.72,0.00,1.00,-120.00,-48.00 +124.80,-52.80,3.70,0.00,1.00,62.40,-48.00 +115.20,-52.80,3.67,0.00,1.00,-110.40,-52.80 +110.40,-57.60,3.65,0.00,1.00,72.00,-52.80 +100.80,-57.60,3.63,0.00,1.00,-100.80,-52.80 +91.20,-57.60,3.61,0.00,1.00,81.60,-57.60 +81.60,-57.60,3.59,0.00,1.00,-91.20,-57.60 +76.80,-57.60,3.57,0.00,1.00,96.00,-57.60 +67.20,-57.60,3.55,0.00,1.00,-81.60,-57.60 +57.60,-52.80,3.52,0.00,1.00,105.60,-52.80 +52.80,-52.80,3.50,0.00,1.00,-72.00,-52.80 +48.00,-48.00,3.48,0.00,1.00,115.20,-48.00 +38.40,-43.20,3.46,0.00,1.00,-62.40,-48.00 +33.60,-43.20,3.44,0.00,1.00,124.80,-43.20 +28.80,-38.40,3.42,0.00,1.00,-52.80,-43.20 +28.80,-33.60,3.40,0.00,1.00,134.40,-38.40 +24.00,-33.60,3.38,0.00,1.00,-43.20,-33.60 +19.20,-28.80,3.35,0.00,1.00,144.00,-28.80 +14.40,-24.00,3.33,0.00,1.00,-33.60,-28.80 +14.40,-19.20,3.31,0.00,1.00,153.60,-24.00 +9.60,-14.40,3.29,0.00,1.00,-24.00,-19.20 +9.60,-14.40,3.27,0.00,1.00,163.20,-14.40 +4.80,-9.60,3.25,0.00,1.00,-14.40,-9.60 +4.80,-4.80,3.23,0.00,1.00,172.80,-9.60 +0.00,0.00,3.20,0.00,1.00,-4.80,-4.80 +-4.80,4.80,3.18,0.00,1.00,0.00,0.00 +-4.80,9.60,3.16,0.00,1.00,-177.60,4.80 +-9.60,9.60,3.14,0.00,1.00,9.60,9.60 +-9.60,14.40,3.12,0.00,1.00,-168.00,9.60 +-14.40,19.20,3.10,0.00,1.00,19.20,14.40 +-19.20,24.00,3.08,0.00,1.00,-158.40,19.20 +-24.00,24.00,3.05,0.00,1.00,28.80,24.00 +-24.00,28.80,3.03,0.00,1.00,-148.80,24.00 +-28.80,33.60,3.01,0.00,1.00,38.40,28.80 +-33.60,38.40,2.99,0.00,1.00,-139.20,33.60 +-38.40,38.40,2.97,0.00,1.00,48.00,33.60 +-43.20,43.20,2.95,0.00,1.00,-129.60,38.40 +-48.00,43.20,2.93,0.00,1.00,57.60,43.20 +-52.80,48.00,2.91,0.00,1.00,-120.00,43.20 +-62.40,48.00,2.88,0.00,1.00,67.20,48.00 +-67.20,52.80,2.86,0.00,1.00,-110.40,48.00 +-76.80,52.80,2.84,0.00,1.00,76.80,48.00 +-86.40,52.80,2.82,0.00,1.00,-100.80,52.80 +-91.20,52.80,2.80,0.00,1.00,86.40,52.80 +-100.80,52.80,2.78,0.00,1.00,-86.40,52.80 +-105.60,52.80,2.76,0.00,1.00,96.00,52.80 +-115.20,48.00,2.73,0.00,1.00,-76.80,48.00 +-120.00,48.00,2.71,0.00,1.00,105.60,48.00 +-129.60,48.00,2.69,0.00,1.00,-67.20,48.00 +-134.40,43.20,2.67,0.00,1.00,115.20,43.20 +-139.20,43.20,2.65,0.00,1.00,-57.60,43.20 +-144.00,38.40,2.63,0.00,1.00,124.80,38.40 +-148.80,33.60,2.61,0.00,1.00,-48.00,38.40 +-153.60,33.60,2.58,0.00,1.00,134.40,33.60 +-158.40,28.80,2.56,0.00,1.00,-38.40,28.80 +-158.40,24.00,2.54,0.00,1.00,144.00,28.80 +-163.20,19.20,2.52,0.00,1.00,-28.80,24.00 +-168.00,19.20,2.50,0.00,1.00,153.60,19.20 +-168.00,14.40,2.48,0.00,1.00,-19.20,14.40 +-172.80,9.60,2.46,0.00,1.00,163.20,14.40 +-177.60,4.80,2.44,0.00,1.00,-9.60,9.60 +-177.60,0.00,2.41,0.00,1.00,172.80,4.80 +177.60,-0.00,2.39,0.00,1.00,-0.00,0.00 +177.60,-4.80,2.37,0.00,1.00,-177.60,-0.00 +172.80,-9.60,2.35,0.00,1.00,4.80,-4.80 +168.00,-14.40,2.33,0.00,1.00,-168.00,-9.60 +168.00,-19.20,2.31,0.00,1.00,14.40,-14.40 +163.20,-19.20,2.29,0.00,1.00,-158.40,-14.40 +158.40,-24.00,2.26,0.00,1.00,24.00,-19.20 +158.40,-28.80,2.24,0.00,1.00,-148.80,-24.00 +153.60,-33.60,2.22,0.00,1.00,33.60,-28.80 +148.80,-33.60,2.20,0.00,1.00,-139.20,-28.80 +144.00,-38.40,2.18,0.00,1.00,43.20,-33.60 +139.20,-43.20,2.16,0.00,1.00,-129.60,-38.40 +134.40,-43.20,2.14,0.00,1.00,52.80,-38.40 +129.60,-48.00,2.11,0.00,1.00,-120.00,-43.20 +120.00,-48.00,2.09,0.00,1.00,62.40,-43.20 +115.20,-48.00,2.07,0.00,1.00,-110.40,-48.00 +105.60,-52.80,2.05,0.00,1.00,72.00,-48.00 +100.80,-52.80,2.03,0.00,1.00,-100.80,-48.00 +91.20,-52.80,2.01,0.00,1.00,81.60,-52.80 +86.40,-52.80,1.99,0.00,1.00,-91.20,-52.80 +76.80,-52.80,1.97,0.00,1.00,96.00,-52.80 +67.20,-52.80,1.94,0.00,1.00,-81.60,-52.80 +62.40,-48.00,1.92,0.00,1.00,105.60,-48.00 +52.80,-48.00,1.90,0.00,1.00,-72.00,-48.00 +48.00,-43.20,1.88,0.00,1.00,115.20,-48.00 +43.20,-43.20,1.86,0.00,1.00,-62.40,-43.20 +38.40,-38.40,1.84,0.00,1.00,124.80,-43.20 +33.60,-38.40,1.82,0.00,1.00,-52.80,-38.40 +28.80,-33.60,1.79,0.00,1.00,134.40,-33.60 +24.00,-28.80,1.77,0.00,1.00,-43.20,-33.60 +24.00,-24.00,1.75,0.00,1.00,144.00,-28.80 +19.20,-24.00,1.73,0.00,1.00,-33.60,-24.00 +14.40,-19.20,1.71,0.00,1.00,153.60,-24.00 +9.60,-14.40,1.69,0.00,1.00,-24.00,-19.20 +9.60,-9.60,1.67,0.00,1.00,163.20,-14.40 +4.80,-9.60,1.64,0.00,1.00,-14.40,-9.60 +4.80,-4.80,1.62,0.00,1.00,172.80,-9.60 +0.00,0.00,1.60,0.00,1.00,-4.80,-4.80 +-4.80,4.80,1.58,0.00,1.00,0.00,0.00 +-4.80,4.80,1.56,0.00,1.00,-177.60,4.80 +-9.60,9.60,1.54,0.00,1.00,9.60,4.80 +-14.40,14.40,1.52,0.00,1.00,-168.00,9.60 +-14.40,19.20,1.50,0.00,1.00,19.20,14.40 +-19.20,19.20,1.47,0.00,1.00,-158.40,19.20 +-24.00,24.00,1.45,0.00,1.00,28.80,19.20 +-28.80,28.80,1.43,0.00,1.00,-148.80,24.00 +-33.60,28.80,1.41,0.00,1.00,38.40,28.80 +-38.40,33.60,1.39,0.00,1.00,-139.20,28.80 +-43.20,38.40,1.37,0.00,1.00,48.00,33.60 +-48.00,38.40,1.35,0.00,1.00,-129.60,33.60 +-52.80,43.20,1.32,0.00,1.00,57.60,38.40 +-57.60,43.20,1.30,0.00,1.00,-120.00,38.40 +-62.40,43.20,1.28,0.00,1.00,67.20,43.20 +-72.00,48.00,1.26,0.00,1.00,-110.40,43.20 +-76.80,48.00,1.24,0.00,1.00,76.80,43.20 +-86.40,48.00,1.22,0.00,1.00,-100.80,48.00 +-91.20,48.00,1.20,0.00,1.00,86.40,48.00 +-100.80,48.00,1.17,0.00,1.00,-86.40,48.00 +-105.60,48.00,1.15,0.00,1.00,96.00,48.00 +-110.40,48.00,1.13,0.00,1.00,-76.80,48.00 +-120.00,43.20,1.11,0.00,1.00,105.60,43.20 +-124.80,43.20,1.09,0.00,1.00,-67.20,43.20 +-129.60,38.40,1.07,0.00,1.00,115.20,43.20 +-134.40,38.40,1.05,0.00,1.00,-57.60,38.40 +-139.20,33.60,1.03,0.00,1.00,124.80,38.40 +-144.00,33.60,1.00,0.00,1.00,-48.00,33.60 +-148.80,28.80,0.98,0.00,1.00,134.40,33.60 +-153.60,24.00,0.96,0.00,1.00,-38.40,28.80 +-158.40,24.00,0.94,0.00,1.00,144.00,24.00 +-163.20,19.20,0.92,0.00,1.00,-28.80,24.00 +-163.20,14.40,0.90,0.00,1.00,153.60,19.20 +-168.00,14.40,0.88,0.00,1.00,-19.20,14.40 +-172.80,9.60,0.85,0.00,1.00,163.20,14.40 +-172.80,4.80,0.83,0.00,1.00,-9.60,9.60 +-177.60,0.00,0.81,0.00,1.00,172.80,4.80 +177.60,-0.00,0.79,0.00,1.00,-0.00,0.00 +172.80,-4.80,0.77,0.00,1.00,-177.60,-0.00 +172.80,-9.60,0.75,0.00,1.00,4.80,-4.80 +168.00,-14.40,0.73,0.00,1.00,-168.00,-9.60 +163.20,-14.40,0.70,0.00,1.00,14.40,-14.40 +163.20,-19.20,0.68,0.00,1.00,-158.40,-14.40 +158.40,-24.00,0.66,0.00,1.00,24.00,-19.20 +153.60,-24.00,0.64,0.00,1.00,-148.80,-24.00 +148.80,-28.80,0.62,0.00,1.00,33.60,-24.00 +144.00,-33.60,0.60,0.00,1.00,-139.20,-28.80 +139.20,-33.60,0.58,0.00,1.00,43.20,-33.60 +134.40,-38.40,0.56,0.00,1.00,-129.60,-33.60 +129.60,-38.40,0.53,0.00,1.00,52.80,-38.40 +124.80,-43.20,0.51,0.00,1.00,-120.00,-38.40 +120.00,-43.20,0.49,0.00,1.00,62.40,-43.20 +110.40,-48.00,0.47,0.00,1.00,-110.40,-43.20 +105.60,-48.00,0.45,0.00,1.00,72.00,-43.20 +100.80,-48.00,0.43,0.00,1.00,-100.80,-48.00 +91.20,-48.00,0.41,0.00,1.00,81.60,-48.00 +86.40,-48.00,0.38,0.00,1.00,-91.20,-48.00 +76.80,-48.00,0.36,0.00,1.00,96.00,-48.00 +72.00,-48.00,0.34,0.00,1.00,-81.60,-48.00 +62.40,-43.20,0.32,0.00,1.00,105.60,-43.20 +57.60,-43.20,0.30,0.00,1.00,-72.00,-43.20 +52.80,-43.20,0.28,0.00,1.00,115.20,-43.20 +48.00,-38.40,0.26,0.00,1.00,-62.40,-38.40 +43.20,-38.40,0.23,0.00,1.00,124.80,-38.40 +38.40,-33.60,0.21,0.00,1.00,-52.80,-33.60 +33.60,-28.80,0.19,0.00,1.00,134.40,-33.60 +28.80,-28.80,0.17,0.00,1.00,-43.20,-28.80 +24.00,-24.00,0.15,0.00,1.00,144.00,-28.80 +19.20,-19.20,0.13,0.00,1.00,-33.60,-24.00 +14.40,-19.20,0.11,0.00,1.00,153.60,-19.20 +14.40,-14.40,0.09,0.00,1.00,-24.00,-19.20 +9.60,-9.60,0.06,0.00,1.00,163.20,-14.40 +4.80,-4.80,0.04,0.00,1.00,-14.40,-9.60 +4.80,-4.80,0.02,0.00,1.00,172.80,-4.80 +0.00,0.00,0.00,0.00,1.00,-4.80,-4.80 +-4.80,4.80,0.00,0.00,1.00,0.00,0.00 +-4.80,4.80,0.02,0.00,1.00,-177.60,4.80 +-9.60,9.60,0.04,0.00,1.00,9.60,4.80 +-14.40,14.40,0.06,0.00,1.00,-168.00,9.60 +-19.20,14.40,0.09,0.00,1.00,19.20,14.40 +-24.00,19.20,0.11,0.00,1.00,-158.40,14.40 +-24.00,24.00,0.13,0.00,1.00,28.80,19.20 +-28.80,24.00,0.15,0.00,1.00,-148.80,24.00 +-33.60,28.80,0.17,0.00,1.00,38.40,24.00 +-38.40,28.80,0.19,0.00,1.00,-139.20,28.80 +-43.20,33.60,0.21,0.00,1.00,48.00,28.80 +-48.00,33.60,0.23,0.00,1.00,-129.60,33.60 +-52.80,38.40,0.26,0.00,1.00,57.60,33.60 +-62.40,38.40,0.28,0.00,1.00,-120.00,38.40 +-67.20,38.40,0.30,0.00,1.00,67.20,38.40 +-72.00,43.20,0.32,0.00,1.00,-110.40,38.40 +-76.80,43.20,0.34,0.00,1.00,76.80,38.40 +-86.40,43.20,0.36,0.00,1.00,-100.80,43.20 +-91.20,43.20,0.38,0.00,1.00,86.40,43.20 +-96.00,43.20,0.41,0.00,1.00,-86.40,43.20 +-105.60,43.20,0.43,0.00,1.00,96.00,43.20 +-110.40,43.20,0.45,0.00,1.00,-76.80,43.20 +-115.20,38.40,0.47,0.00,1.00,105.60,38.40 +-124.80,38.40,0.49,0.00,1.00,-67.20,38.40 +-129.60,38.40,0.51,0.00,1.00,115.20,38.40 +-134.40,33.60,0.53,0.00,1.00,-57.60,33.60 +-139.20,33.60,0.56,0.00,1.00,124.80,33.60 +-144.00,28.80,0.58,0.00,1.00,-48.00,28.80 +-148.80,28.80,0.60,0.00,1.00,134.40,28.80 +-153.60,24.00,0.62,0.00,1.00,-38.40,24.00 +-158.40,19.20,0.64,0.00,1.00,144.00,24.00 +-158.40,19.20,0.66,0.00,1.00,-28.80,19.20 +-163.20,14.40,0.68,0.00,1.00,153.60,19.20 +-168.00,9.60,0.70,0.00,1.00,-19.20,14.40 +-172.80,9.60,0.73,0.00,1.00,163.20,9.60 +-172.80,4.80,0.75,0.00,1.00,-9.60,9.60 +-177.60,0.00,0.77,0.00,1.00,172.80,4.80 +177.60,-0.00,0.79,0.00,1.00,-0.00,0.00 +172.80,-4.80,0.81,0.00,1.00,-177.60,-0.00 +172.80,-9.60,0.83,0.00,1.00,4.80,-4.80 +168.00,-9.60,0.85,0.00,1.00,-168.00,-9.60 +163.20,-14.40,0.88,0.00,1.00,14.40,-9.60 +158.40,-19.20,0.90,0.00,1.00,-158.40,-14.40 +158.40,-19.20,0.92,0.00,1.00,24.00,-19.20 +153.60,-24.00,0.94,0.00,1.00,-148.80,-19.20 +148.80,-28.80,0.96,0.00,1.00,33.60,-24.00 +144.00,-28.80,0.98,0.00,1.00,-139.20,-24.00 +139.20,-33.60,1.00,0.00,1.00,43.20,-28.80 +134.40,-33.60,1.03,0.00,1.00,-129.60,-28.80 +129.60,-38.40,1.05,0.00,1.00,52.80,-33.60 +124.80,-38.40,1.07,0.00,1.00,-120.00,-33.60 +115.20,-38.40,1.09,0.00,1.00,62.40,-38.40 +110.40,-43.20,1.11,0.00,1.00,-110.40,-38.40 +105.60,-43.20,1.13,0.00,1.00,72.00,-38.40 +96.00,-43.20,1.15,0.00,1.00,-100.80,-43.20 +91.20,-43.20,1.17,0.00,1.00,81.60,-43.20 +86.40,-43.20,1.20,0.00,1.00,-91.20,-43.20 +76.80,-43.20,1.22,0.00,1.00,96.00,-43.20 +72.00,-43.20,1.24,0.00,1.00,-81.60,-43.20 +67.20,-38.40,1.26,0.00,1.00,105.60,-38.40 +62.40,-38.40,1.28,0.00,1.00,-72.00,-38.40 +52.80,-38.40,1.30,0.00,1.00,115.20,-38.40 +48.00,-33.60,1.32,0.00,1.00,-62.40,-38.40 +43.20,-33.60,1.35,0.00,1.00,124.80,-33.60 +38.40,-28.80,1.37,0.00,1.00,-52.80,-33.60 +33.60,-28.80,1.39,0.00,1.00,134.40,-28.80 +28.80,-24.00,1.41,0.00,1.00,-43.20,-28.80 +24.00,-24.00,1.43,0.00,1.00,144.00,-24.00 +24.00,-19.20,1.45,0.00,1.00,-33.60,-24.00 +19.20,-14.40,1.47,0.00,1.00,153.60,-19.20 +14.40,-14.40,1.50,0.00,1.00,-24.00,-14.40 +9.60,-9.60,1.52,0.00,1.00,163.20,-14.40 +4.80,-4.80,1.54,0.00,1.00,-14.40,-9.60 +4.80,-4.80,1.56,0.00,1.00,172.80,-4.80 +0.00,0.00,1.58,0.00,1.00,-4.80,-4.80 +-4.80,4.80,1.60,0.00,1.00,0.00,0.00 +-9.60,4.80,1.62,0.00,1.00,-177.60,4.80 +-9.60,9.60,1.64,0.00,1.00,9.60,4.80 +-14.40,9.60,1.67,0.00,1.00,-168.00,9.60 +-19.20,14.40,1.69,0.00,1.00,19.20,9.60 +-24.00,19.20,1.71,0.00,1.00,-158.40,14.40 +-28.80,19.20,1.73,0.00,1.00,28.80,19.20 +-33.60,24.00,1.75,0.00,1.00,-148.80,19.20 +-38.40,24.00,1.77,0.00,1.00,38.40,24.00 +-43.20,28.80,1.79,0.00,1.00,-139.20,24.00 +-48.00,28.80,1.82,0.00,1.00,48.00,28.80 +-52.80,33.60,1.84,0.00,1.00,-129.60,28.80 +-57.60,33.60,1.86,0.00,1.00,57.60,28.80 +-62.40,33.60,1.88,0.00,1.00,-120.00,33.60 +-67.20,38.40,1.90,0.00,1.00,67.20,33.60 +-72.00,38.40,1.92,0.00,1.00,-110.40,33.60 +-81.60,38.40,1.94,0.00,1.00,76.80,38.40 +-86.40,38.40,1.97,0.00,1.00,-100.80,38.40 +-91.20,38.40,1.99,0.00,1.00,86.40,38.40 +-96.00,38.40,2.01,0.00,1.00,-86.40,38.40 +-105.60,38.40,2.03,0.00,1.00,96.00,38.40 +-110.40,38.40,2.05,0.00,1.00,-76.80,38.40 +-115.20,33.60,2.07,0.00,1.00,105.60,33.60 +-120.00,33.60,2.09,0.00,1.00,-67.20,33.60 +-124.80,33.60,2.11,0.00,1.00,115.20,33.60 +-129.60,28.80,2.14,0.00,1.00,-57.60,33.60 +-134.40,28.80,2.16,0.00,1.00,124.80,28.80 +-139.20,24.00,2.18,0.00,1.00,-48.00,28.80 +-144.00,24.00,2.20,0.00,1.00,134.40,24.00 +-148.80,19.20,2.22,0.00,1.00,-38.40,24.00 +-153.60,19.20,2.24,0.00,1.00,144.00,19.20 +-158.40,14.40,2.26,0.00,1.00,-28.80,19.20 +-163.20,14.40,2.29,0.00,1.00,153.60,14.40 +-168.00,9.60,2.31,0.00,1.00,-19.20,14.40 +-172.80,9.60,2.33,0.00,1.00,163.20,9.60 +-172.80,4.80,2.35,0.00,1.00,-9.60,9.60 +-177.60,0.00,2.37,0.00,1.00,172.80,4.80 +177.60,-0.00,2.39,0.00,1.00,-0.00,0.00 +172.80,-4.80,2.41,0.00,1.00,-177.60,-0.00 +172.80,-9.60,2.44,0.00,1.00,4.80,-4.80 +168.00,-9.60,2.46,0.00,1.00,-168.00,-9.60 +163.20,-14.40,2.48,0.00,1.00,14.40,-9.60 +158.40,-14.40,2.50,0.00,1.00,-158.40,-14.40 +153.60,-19.20,2.52,0.00,1.00,24.00,-14.40 +148.80,-19.20,2.54,0.00,1.00,-148.80,-19.20 +144.00,-24.00,2.56,0.00,1.00,33.60,-19.20 +139.20,-24.00,2.58,0.00,1.00,-139.20,-24.00 +134.40,-28.80,2.61,0.00,1.00,43.20,-24.00 +129.60,-28.80,2.63,0.00,1.00,-129.60,-28.80 +124.80,-33.60,2.65,0.00,1.00,52.80,-28.80 +120.00,-33.60,2.67,0.00,1.00,-120.00,-33.60 +115.20,-33.60,2.69,0.00,1.00,62.40,-33.60 +110.40,-38.40,2.71,0.00,1.00,-110.40,-33.60 +105.60,-38.40,2.73,0.00,1.00,72.00,-33.60 +96.00,-38.40,2.76,0.00,1.00,-100.80,-38.40 +91.20,-38.40,2.78,0.00,1.00,81.60,-38.40 +86.40,-38.40,2.80,0.00,1.00,-91.20,-38.40 +81.60,-38.40,2.82,0.00,1.00,96.00,-38.40 +72.00,-38.40,2.84,0.00,1.00,-81.60,-38.40 +67.20,-38.40,2.86,0.00,1.00,105.60,-38.40 +62.40,-33.60,2.88,0.00,1.00,-72.00,-33.60 +57.60,-33.60,2.91,0.00,1.00,115.20,-33.60 +52.80,-33.60,2.93,0.00,1.00,-62.40,-33.60 +48.00,-28.80,2.95,0.00,1.00,124.80,-28.80 +43.20,-28.80,2.97,0.00,1.00,-52.80,-28.80 +38.40,-24.00,2.99,0.00,1.00,134.40,-28.80 +33.60,-24.00,3.01,0.00,1.00,-43.20,-24.00 +28.80,-19.20,3.03,0.00,1.00,144.00,-24.00 +24.00,-19.20,3.05,0.00,1.00,-33.60,-19.20 +19.20,-14.40,3.08,0.00,1.00,153.60,-19.20 +14.40,-9.60,3.10,0.00,1.00,-24.00,-14.40 +9.60,-9.60,3.12,0.00,1.00,163.20,-9.60 +9.60,-4.80,3.14,0.00,1.00,-14.40,-9.60 +4.80,-4.80,3.16,0.00,1.00,172.80,-4.80 +0.00,0.00,3.18,0.00,1.00,-4.80,-4.80 +-4.80,4.80,3.20,0.00,1.00,0.00,0.00 +-9.60,4.80,3.23,0.00,1.00,-177.60,4.80 +-14.40,9.60,3.25,0.00,1.00,9.60,4.80 +-14.40,9.60,3.27,0.00,1.00,-168.00,9.60 +-19.20,14.40,3.29,0.00,1.00,19.20,9.60 +-24.00,14.40,3.31,0.00,1.00,-158.40,14.40 +-28.80,19.20,3.33,0.00,1.00,28.80,14.40 +-33.60,19.20,3.35,0.00,1.00,-148.80,19.20 +-38.40,24.00,3.38,0.00,1.00,38.40,19.20 +-43.20,24.00,3.40,0.00,1.00,-139.20,19.20 +-48.00,24.00,3.42,0.00,1.00,48.00,24.00 +-52.80,28.80,3.44,0.00,1.00,-129.60,24.00 +-57.60,28.80,3.46,0.00,1.00,57.60,28.80 +-62.40,28.80,3.48,0.00,1.00,-120.00,28.80 +-67.20,33.60,3.50,0.00,1.00,67.20,28.80 +-72.00,33.60,3.52,0.00,1.00,-110.40,28.80 +-81.60,33.60,3.55,0.00,1.00,76.80,33.60 +-86.40,33.60,3.57,0.00,1.00,-100.80,33.60 +-91.20,33.60,3.59,0.00,1.00,86.40,33.60 +-96.00,33.60,3.61,0.00,1.00,-86.40,33.60 +-100.80,33.60,3.63,0.00,1.00,96.00,33.60 +-110.40,33.60,3.65,0.00,1.00,-76.80,33.60 +-115.20,33.60,3.67,0.00,1.00,105.60,28.80 +-120.00,28.80,3.70,0.00,1.00,-67.20,28.80 +-124.80,28.80,3.72,0.00,1.00,115.20,28.80 +-129.60,28.80,3.74,0.00,1.00,-57.60,28.80 +-134.40,24.00,3.76,0.00,1.00,124.80,24.00 +-139.20,24.00,3.78,0.00,1.00,-48.00,24.00 +-144.00,19.20,3.80,0.00,1.00,134.40,24.00 +-148.80,19.20,3.82,0.00,1.00,-38.40,19.20 +-153.60,14.40,3.85,0.00,1.00,144.00,19.20 +-158.40,14.40,3.87,0.00,1.00,-28.80,14.40 +-163.20,9.60,3.89,0.00,1.00,153.60,14.40 +-168.00,9.60,3.91,0.00,1.00,-19.20,9.60 +-168.00,4.80,3.93,0.00,1.00,163.20,9.60 +-172.80,4.80,3.95,0.00,1.00,-9.60,4.80 +-177.60,0.00,3.97,0.00,1.00,172.80,4.80 +177.60,-0.00,3.99,0.00,1.00,-0.00,0.00 +172.80,-4.80,4.02,0.00,1.00,-177.60,-0.00 +168.00,-4.80,4.04,0.00,1.00,4.80,-4.80 +168.00,-9.60,4.06,0.00,1.00,-168.00,-4.80 +163.20,-9.60,4.08,0.00,1.00,14.40,-9.60 +158.40,-14.40,4.10,0.00,1.00,-158.40,-9.60 +153.60,-14.40,4.12,0.00,1.00,24.00,-14.40 +148.80,-19.20,4.14,0.00,1.00,-148.80,-14.40 +144.00,-19.20,4.17,0.00,1.00,33.60,-19.20 +139.20,-24.00,4.19,0.00,1.00,-139.20,-19.20 +134.40,-24.00,4.21,0.00,1.00,43.20,-24.00 +129.60,-28.80,4.23,0.00,1.00,-129.60,-24.00 +124.80,-28.80,4.25,0.00,1.00,52.80,-24.00 +120.00,-28.80,4.27,0.00,1.00,-120.00,-28.80 +115.20,-33.60,4.29,0.00,1.00,62.40,-28.80 +110.40,-33.60,4.32,0.00,1.00,-110.40,-28.80 +100.80,-33.60,4.34,0.00,1.00,72.00,-28.80 +96.00,-33.60,4.36,0.00,1.00,-100.80,-33.60 +91.20,-33.60,4.38,0.00,1.00,81.60,-33.60 +86.40,-33.60,4.40,0.00,1.00,-91.20,-33.60 +81.60,-33.60,4.42,0.00,1.00,96.00,-33.60 +72.00,-33.60,4.44,0.00,1.00,-81.60,-33.60 +67.20,-33.60,4.46,0.00,1.00,105.60,-33.60 +62.40,-28.80,4.49,0.00,1.00,-72.00,-28.80 +57.60,-28.80,4.51,0.00,1.00,115.20,-28.80 +52.80,-28.80,4.53,0.00,1.00,-62.40,-28.80 +48.00,-24.00,4.55,0.00,1.00,124.80,-28.80 +43.20,-24.00,4.57,0.00,1.00,-52.80,-24.00 +38.40,-24.00,4.59,0.00,1.00,134.40,-24.00 +33.60,-19.20,4.61,0.00,1.00,-43.20,-19.20 +28.80,-19.20,4.64,0.00,1.00,144.00,-19.20 +24.00,-14.40,4.66,0.00,1.00,-33.60,-19.20 +19.20,-14.40,4.68,0.00,1.00,153.60,-14.40 +14.40,-9.60,4.70,0.00,1.00,-24.00,-14.40 +14.40,-9.60,4.72,0.00,1.00,163.20,-9.60 +9.60,-4.80,4.74,0.00,1.00,-14.40,-9.60 +4.80,-4.80,4.76,0.00,1.00,172.80,-4.80 +0.00,0.00,4.79,0.00,1.00,-4.80,-4.80 +-4.80,0.00,4.81,0.00,1.00,0.00,0.00 +-9.60,4.80,4.83,0.00,1.00,-177.60,0.00 +-14.40,4.80,4.85,0.00,1.00,9.60,4.80 +-19.20,9.60,4.87,0.00,1.00,-168.00,4.80 +-19.20,9.60,4.89,0.00,1.00,19.20,9.60 +-24.00,14.40,4.91,0.00,1.00,-158.40,9.60 +-28.80,14.40,4.93,0.00,1.00,28.80,14.40 +-33.60,19.20,4.96,0.00,1.00,-148.80,14.40 +-38.40,19.20,4.98,0.00,1.00,38.40,14.40 +-43.20,19.20,5.00,0.00,1.00,-139.20,19.20 +-48.00,24.00,5.02,0.00,1.00,48.00,19.20 +-52.80,24.00,5.04,0.00,1.00,-129.60,24.00 +-57.60,24.00,5.06,0.00,1.00,57.60,24.00 +-62.40,24.00,5.08,0.00,1.00,-120.00,24.00 +-72.00,28.80,5.11,0.00,1.00,67.20,24.00 +-76.80,28.80,5.13,0.00,1.00,-110.40,24.00 +-81.60,28.80,5.15,0.00,1.00,76.80,28.80 +-86.40,28.80,5.17,0.00,1.00,-100.80,28.80 +-91.20,28.80,5.19,0.00,1.00,86.40,28.80 +-96.00,28.80,5.21,0.00,1.00,-86.40,28.80 +-100.80,28.80,5.23,0.00,1.00,96.00,28.80 +-105.60,28.80,5.26,0.00,1.00,-76.80,28.80 +-115.20,28.80,5.28,0.00,1.00,105.60,28.80 +-120.00,24.00,5.30,0.00,1.00,-67.20,24.00 +-124.80,24.00,5.32,0.00,1.00,115.20,24.00 +-129.60,24.00,5.34,0.00,1.00,-57.60,24.00 +-134.40,24.00,5.36,0.00,1.00,124.80,24.00 +-139.20,19.20,5.38,0.00,1.00,-48.00,19.20 +-144.00,19.20,5.40,0.00,1.00,134.40,19.20 +-148.80,14.40,5.43,0.00,1.00,-38.40,19.20 +-153.60,14.40,5.45,0.00,1.00,144.00,14.40 +-158.40,14.40,5.47,0.00,1.00,-28.80,14.40 +-163.20,9.60,5.49,0.00,1.00,153.60,9.60 +-163.20,9.60,5.51,0.00,1.00,-19.20,9.60 +-168.00,4.80,5.53,0.00,1.00,163.20,9.60 +-172.80,4.80,5.55,0.00,1.00,-9.60,4.80 +-177.60,0.00,5.58,0.00,1.00,172.80,4.80 +177.60,-0.00,5.60,0.00,1.00,-0.00,0.00 +172.80,-4.80,5.62,0.00,1.00,-177.60,-0.00 +168.00,-4.80,5.64,0.00,1.00,4.80,-4.80 +163.20,-9.60,5.66,0.00,1.00,-168.00,-4.80 +163.20,-9.60,5.68,0.00,1.00,14.40,-9.60 +158.40,-14.40,5.70,0.00,1.00,-158.40,-9.60 +153.60,-14.40,5.72,0.00,1.00,24.00,-9.60 +148.80,-14.40,5.75,0.00,1.00,-148.80,-14.40 +144.00,-19.20,5.77,0.00,1.00,33.60,-14.40 +139.20,-19.20,5.79,0.00,1.00,-139.20,-19.20 +134.40,-24.00,5.81,0.00,1.00,43.20,-19.20 +129.60,-24.00,5.83,0.00,1.00,-129.60,-19.20 +124.80,-24.00,5.85,0.00,1.00,52.80,-24.00 +120.00,-24.00,5.87,0.00,1.00,-120.00,-24.00 +115.20,-28.80,5.90,0.00,1.00,62.40,-24.00 +105.60,-28.80,5.92,0.00,1.00,-110.40,-24.00 +100.80,-28.80,5.94,0.00,1.00,72.00,-28.80 +96.00,-28.80,5.96,0.00,1.00,-100.80,-28.80 +91.20,-28.80,5.98,0.00,1.00,81.60,-28.80 +86.40,-28.80,6.00,0.00,1.00,-91.20,-28.80 +81.60,-28.80,6.02,0.00,1.00,96.00,-28.80 +76.80,-28.80,6.05,0.00,1.00,-81.60,-28.80 +72.00,-28.80,6.07,0.00,1.00,105.60,-28.80 +62.40,-24.00,6.09,0.00,1.00,-72.00,-24.00 +57.60,-24.00,6.11,0.00,1.00,115.20,-24.00 +52.80,-24.00,6.13,0.00,1.00,-62.40,-24.00 +48.00,-24.00,6.15,0.00,1.00,124.80,-24.00 +43.20,-19.20,6.17,0.00,1.00,-52.80,-24.00 +38.40,-19.20,6.19,0.00,1.00,134.40,-19.20 +33.60,-19.20,6.22,0.00,1.00,-43.20,-19.20 +28.80,-14.40,6.24,0.00,1.00,144.00,-14.40 +24.00,-14.40,6.26,0.00,1.00,-33.60,-14.40 +19.20,-9.60,6.28,0.00,1.00,153.60,-14.40 +19.20,-9.60,6.30,0.00,1.00,-24.00,-9.60 +14.40,-4.80,6.32,0.00,1.00,163.20,-9.60 +9.60,-4.80,6.34,0.00,1.00,-14.40,-4.80 +4.80,-0.00,6.37,0.00,1.00,172.80,-4.80 +0.00,0.00,6.39,0.00,1.00,-4.80,-0.00 +-4.80,0.00,6.41,0.00,1.00,0.00,0.00 +-9.60,4.80,6.43,0.00,1.00,-177.60,0.00 +-14.40,4.80,6.45,0.00,1.00,9.60,4.80 +-19.20,9.60,6.47,0.00,1.00,-168.00,4.80 +-24.00,9.60,6.49,0.00,1.00,19.20,9.60 +-28.80,9.60,6.52,0.00,1.00,-158.40,9.60 +-33.60,14.40,6.54,0.00,1.00,28.80,9.60 +-33.60,14.40,6.56,0.00,1.00,-148.80,14.40 +-38.40,14.40,6.58,0.00,1.00,38.40,14.40 +-43.20,19.20,6.60,0.00,1.00,-139.20,14.40 +-48.00,19.20,6.62,0.00,1.00,48.00,14.40 +-57.60,19.20,6.64,0.00,1.00,-129.60,19.20 +-62.40,19.20,6.66,0.00,1.00,57.60,19.20 +-67.20,24.00,6.69,0.00,1.00,-120.00,19.20 +-72.00,24.00,6.71,0.00,1.00,67.20,19.20 +-76.80,24.00,6.73,0.00,1.00,-110.40,24.00 +-81.60,24.00,6.75,0.00,1.00,76.80,24.00 +-86.40,24.00,6.77,0.00,1.00,-100.80,24.00 +-91.20,24.00,6.79,0.00,1.00,86.40,24.00 +-96.00,24.00,6.81,0.00,1.00,-86.40,24.00 +-100.80,24.00,6.84,0.00,1.00,96.00,24.00 +-105.60,24.00,6.86,0.00,1.00,-76.80,24.00 +-110.40,24.00,6.88,0.00,1.00,105.60,24.00 +-115.20,19.20,6.90,0.00,1.00,-67.20,19.20 +-120.00,19.20,6.92,0.00,1.00,115.20,19.20 +-129.60,19.20,6.94,0.00,1.00,-57.60,19.20 +-134.40,19.20,6.96,0.00,1.00,124.80,19.20 +-139.20,19.20,6.99,0.00,1.00,-48.00,19.20 +-144.00,14.40,7.01,0.00,1.00,134.40,14.40 +-148.80,14.40,7.03,0.00,1.00,-38.40,14.40 +-148.80,14.40,7.05,0.00,1.00,144.00,14.40 +-153.60,9.60,7.07,0.00,1.00,-28.80,9.60 +-158.40,9.60,7.09,0.00,1.00,153.60,9.60 +-163.20,4.80,7.11,0.00,1.00,-19.20,9.60 +-168.00,4.80,7.13,0.00,1.00,163.20,4.80 +-172.80,4.80,7.16,0.00,1.00,-9.60,4.80 +-177.60,0.00,7.18,0.00,1.00,172.80,4.80 +177.60,-0.00,7.20,0.00,1.00,-0.00,0.00 +172.80,-4.80,7.22,0.00,1.00,-177.60,-0.00 +168.00,-4.80,7.24,0.00,1.00,4.80,-4.80 +163.20,-4.80,7.26,0.00,1.00,-168.00,-4.80 +158.40,-9.60,7.28,0.00,1.00,14.40,-4.80 +153.60,-9.60,7.31,0.00,1.00,-158.40,-9.60 +148.80,-14.40,7.33,0.00,1.00,24.00,-9.60 +148.80,-14.40,7.35,0.00,1.00,-148.80,-9.60 +144.00,-14.40,7.37,0.00,1.00,33.60,-14.40 +139.20,-19.20,7.39,0.00,1.00,-139.20,-14.40 +134.40,-19.20,7.41,0.00,1.00,43.20,-14.40 +129.60,-19.20,7.43,0.00,1.00,-129.60,-19.20 +120.00,-19.20,7.46,0.00,1.00,52.80,-19.20 +115.20,-19.20,7.48,0.00,1.00,-120.00,-19.20 +110.40,-24.00,7.50,0.00,1.00,62.40,-19.20 +105.60,-24.00,7.52,0.00,1.00,-110.40,-19.20 +100.80,-24.00,7.54,0.00,1.00,72.00,-24.00 +96.00,-24.00,7.56,0.00,1.00,-100.80,-24.00 +91.20,-24.00,7.58,0.00,1.00,81.60,-24.00 +86.40,-24.00,7.60,0.00,1.00,-91.20,-24.00 +81.60,-24.00,7.63,0.00,1.00,96.00,-24.00 +76.80,-24.00,7.65,0.00,1.00,-81.60,-24.00 +72.00,-24.00,7.67,0.00,1.00,105.60,-24.00 +67.20,-24.00,7.69,0.00,1.00,-72.00,-24.00 +62.40,-19.20,7.71,0.00,1.00,115.20,-19.20 +57.60,-19.20,7.73,0.00,1.00,-62.40,-19.20 +48.00,-19.20,7.75,0.00,1.00,124.80,-19.20 +43.20,-19.20,7.78,0.00,1.00,-52.80,-19.20 +38.40,-14.40,7.80,0.00,1.00,134.40,-14.40 +33.60,-14.40,7.82,0.00,1.00,-43.20,-14.40 +33.60,-14.40,7.84,0.00,1.00,144.00,-14.40 +28.80,-9.60,7.86,0.00,1.00,-33.60,-14.40 +24.00,-9.60,7.88,0.00,1.00,153.60,-9.60 +19.20,-9.60,7.90,0.00,1.00,-24.00,-9.60 +14.40,-4.80,7.93,0.00,1.00,163.20,-9.60 +9.60,-4.80,7.95,0.00,1.00,-14.40,-4.80 +4.80,-0.00,7.97,0.00,1.00,172.80,-4.80 +0.00,0.00,7.99,0.00,1.00,-4.80,-0.00 +-4.80,0.00,8.01,0.00,1.00,0.00,0.00 +-9.60,4.80,8.03,0.00,1.00,-177.60,0.00 +-14.40,4.80,8.05,0.00,1.00,9.60,4.80 +-19.20,4.80,8.07,0.00,1.00,-168.00,4.80 +-24.00,9.60,8.10,0.00,1.00,19.20,4.80 +-28.80,9.60,8.12,0.00,1.00,-158.40,9.60 +-33.60,9.60,8.14,0.00,1.00,24.00,9.60 +-38.40,9.60,8.16,0.00,1.00,-148.80,9.60 +-43.20,14.40,8.18,0.00,1.00,33.60,9.60 +-48.00,14.40,8.20,0.00,1.00,-139.20,14.40 +-52.80,14.40,8.22,0.00,1.00,43.20,14.40 +-57.60,14.40,8.25,0.00,1.00,-129.60,14.40 +-62.40,19.20,8.27,0.00,1.00,52.80,14.40 +-67.20,19.20,8.29,0.00,1.00,-120.00,14.40 +-72.00,19.20,8.31,0.00,1.00,62.40,14.40 +-76.80,19.20,8.33,0.00,1.00,-110.40,19.20 +-81.60,19.20,8.35,0.00,1.00,76.80,19.20 +-86.40,19.20,8.37,0.00,1.00,-100.80,19.20 +-91.20,19.20,8.40,0.00,1.00,86.40,19.20 +-96.00,19.20,8.42,0.00,1.00,-86.40,19.20 +-100.80,19.20,8.44,0.00,1.00,96.00,19.20 +-105.60,19.20,8.46,0.00,1.00,-76.80,19.20 +-110.40,19.20,8.48,0.00,1.00,105.60,19.20 +-115.20,19.20,8.50,0.00,1.00,-67.20,19.20 +-120.00,14.40,8.52,0.00,1.00,120.00,14.40 +-124.80,14.40,8.54,0.00,1.00,-57.60,14.40 +-129.60,14.40,8.57,0.00,1.00,129.60,14.40 +-134.40,14.40,8.59,0.00,1.00,-48.00,14.40 +-139.20,14.40,8.61,0.00,1.00,139.20,14.40 +-144.00,9.60,8.63,0.00,1.00,-38.40,9.60 +-148.80,9.60,8.65,0.00,1.00,148.80,9.60 +-153.60,9.60,8.67,0.00,1.00,-28.80,9.60 +-158.40,4.80,8.69,0.00,1.00,158.40,9.60 +-163.20,4.80,8.72,0.00,1.00,-19.20,4.80 +-168.00,4.80,8.74,0.00,1.00,163.20,4.80 +-172.80,0.00,8.76,0.00,1.00,-9.60,4.80 +-177.60,0.00,8.78,0.00,1.00,172.80,0.00 +177.60,-0.00,8.80,0.00,1.00,-0.00,0.00 +172.80,-0.00,8.82,0.00,1.00,-177.60,-0.00 +168.00,-4.80,8.84,0.00,1.00,4.80,-0.00 +163.20,-4.80,8.87,0.00,1.00,-168.00,-4.80 +158.40,-4.80,8.89,0.00,1.00,14.40,-4.80 +153.60,-9.60,8.91,0.00,1.00,-158.40,-4.80 +148.80,-9.60,8.93,0.00,1.00,24.00,-9.60 +144.00,-9.60,8.95,0.00,1.00,-153.60,-9.60 +139.20,-14.40,8.97,0.00,1.00,33.60,-9.60 +134.40,-14.40,8.99,0.00,1.00,-144.00,-9.60 +129.60,-14.40,9.01,0.00,1.00,43.20,-14.40 +124.80,-14.40,9.04,0.00,1.00,-134.40,-14.40 +120.00,-14.40,9.06,0.00,1.00,52.80,-14.40 +115.20,-19.20,9.08,0.00,1.00,-124.80,-14.40 +110.40,-19.20,9.10,0.00,1.00,62.40,-14.40 +105.60,-19.20,9.12,0.00,1.00,-110.40,-19.20 +100.80,-19.20,9.14,0.00,1.00,72.00,-19.20 +96.00,-19.20,9.16,0.00,1.00,-100.80,-19.20 +91.20,-19.20,9.19,0.00,1.00,81.60,-19.20 +86.40,-19.20,9.21,0.00,1.00,-91.20,-19.20 +81.60,-19.20,9.23,0.00,1.00,96.00,-19.20 +76.80,-19.20,9.25,0.00,1.00,-81.60,-19.20 +72.00,-19.20,9.27,0.00,1.00,105.60,-19.20 +67.20,-19.20,9.29,0.00,1.00,-72.00,-19.20 +62.40,-19.20,9.31,0.00,1.00,115.20,-14.40 +57.60,-14.40,9.34,0.00,1.00,-57.60,-14.40 +52.80,-14.40,9.36,0.00,1.00,124.80,-14.40 +48.00,-14.40,9.38,0.00,1.00,-48.00,-14.40 +43.20,-14.40,9.40,0.00,1.00,134.40,-14.40 +38.40,-9.60,9.42,0.00,1.00,-38.40,-14.40 +33.60,-9.60,9.44,0.00,1.00,144.00,-9.60 +28.80,-9.60,9.46,0.00,1.00,-28.80,-9.60 +24.00,-9.60,9.48,0.00,1.00,153.60,-9.60 +19.20,-4.80,9.51,0.00,1.00,-24.00,-9.60 +14.40,-4.80,9.53,0.00,1.00,163.20,-4.80 +9.60,-4.80,9.55,0.00,1.00,-14.40,-4.80 +4.80,-0.00,9.57,0.00,1.00,172.80,-4.80 +0.00,0.00,9.59,0.00,1.00,-4.80,-0.00 +-4.80,0.00,9.61,0.00,1.00,0.00,0.00 +-9.60,0.00,9.63,0.00,1.00,-177.60,0.00 +-14.40,4.80,9.66,0.00,1.00,9.60,0.00 +-19.20,4.80,9.68,0.00,1.00,-168.00,4.80 +-24.00,4.80,9.70,0.00,1.00,14.40,4.80 +-28.80,4.80,9.72,0.00,1.00,-158.40,4.80 +-33.60,9.60,9.74,0.00,1.00,24.00,4.80 +-38.40,9.60,9.76,0.00,1.00,-148.80,9.60 +-43.20,9.60,9.78,0.00,1.00,33.60,9.60 +-48.00,9.60,9.81,0.00,1.00,-139.20,9.60 +-52.80,9.60,9.83,0.00,1.00,43.20,9.60 +-57.60,14.40,9.85,0.00,1.00,-129.60,9.60 +-62.40,14.40,9.87,0.00,1.00,52.80,9.60 +-67.20,14.40,9.89,0.00,1.00,-120.00,9.60 +-72.00,14.40,9.91,0.00,1.00,62.40,14.40 +-76.80,14.40,9.93,0.00,1.00,-110.40,14.40 +-81.60,14.40,9.95,0.00,1.00,76.80,14.40 +-86.40,14.40,9.98,0.00,1.00,-100.80,14.40 +-91.20,14.40,10.00,0.00,1.00,86.40,14.40 +-96.00,14.40,10.02,0.00,1.00,-86.40,14.40 +-100.80,14.40,10.04,0.00,1.00,96.00,14.40 +-105.60,14.40,10.06,0.00,1.00,-76.80,14.40 +-110.40,14.40,10.08,0.00,1.00,110.40,14.40 +-115.20,14.40,10.10,0.00,1.00,-67.20,14.40 +-120.00,14.40,10.13,0.00,1.00,120.00,9.60 +-124.80,9.60,10.15,0.00,1.00,-57.60,9.60 +-129.60,9.60,10.17,0.00,1.00,129.60,9.60 +-134.40,9.60,10.19,0.00,1.00,-48.00,9.60 +-139.20,9.60,10.21,0.00,1.00,139.20,9.60 +-144.00,9.60,10.23,0.00,1.00,-38.40,9.60 +-148.80,9.60,10.25,0.00,1.00,148.80,9.60 +-153.60,4.80,10.28,0.00,1.00,-28.80,4.80 +-158.40,4.80,10.30,0.00,1.00,158.40,4.80 +-163.20,4.80,10.32,0.00,1.00,-19.20,4.80 +-168.00,4.80,10.34,0.00,1.00,168.00,4.80 +-172.80,0.00,10.36,0.00,1.00,-9.60,4.80 +-177.60,0.00,10.38,0.00,1.00,172.80,0.00 +177.60,-0.00,10.40,0.00,1.00,-0.00,0.00 +172.80,-0.00,10.42,0.00,1.00,-177.60,-0.00 +168.00,-4.80,10.45,0.00,1.00,4.80,-0.00 +163.20,-4.80,10.47,0.00,1.00,-168.00,-4.80 +158.40,-4.80,10.49,0.00,1.00,14.40,-4.80 +153.60,-4.80,10.51,0.00,1.00,-163.20,-4.80 +148.80,-9.60,10.53,0.00,1.00,24.00,-4.80 +144.00,-9.60,10.55,0.00,1.00,-153.60,-4.80 +139.20,-9.60,10.57,0.00,1.00,33.60,-9.60 +134.40,-9.60,10.60,0.00,1.00,-144.00,-9.60 +129.60,-9.60,10.62,0.00,1.00,43.20,-9.60 +124.80,-9.60,10.64,0.00,1.00,-134.40,-9.60 +120.00,-14.40,10.66,0.00,1.00,52.80,-9.60 +115.20,-14.40,10.68,0.00,1.00,-124.80,-9.60 +110.40,-14.40,10.70,0.00,1.00,62.40,-9.60 +105.60,-14.40,10.72,0.00,1.00,-115.20,-14.40 +100.80,-14.40,10.74,0.00,1.00,72.00,-14.40 +96.00,-14.40,10.77,0.00,1.00,-100.80,-14.40 +91.20,-14.40,10.79,0.00,1.00,81.60,-14.40 +86.40,-14.40,10.81,0.00,1.00,-91.20,-14.40 +81.60,-14.40,10.83,0.00,1.00,96.00,-14.40 +76.80,-14.40,10.85,0.00,1.00,-81.60,-14.40 +72.00,-14.40,10.87,0.00,1.00,105.60,-14.40 +67.20,-14.40,10.89,0.00,1.00,-67.20,-14.40 +62.40,-14.40,10.92,0.00,1.00,115.20,-14.40 +57.60,-14.40,10.94,0.00,1.00,-57.60,-9.60 +52.80,-9.60,10.96,0.00,1.00,124.80,-9.60 +48.00,-9.60,10.98,0.00,1.00,-48.00,-9.60 +43.20,-9.60,11.00,0.00,1.00,134.40,-9.60 +38.40,-9.60,11.02,0.00,1.00,-38.40,-9.60 +33.60,-9.60,11.04,0.00,1.00,144.00,-9.60 +28.80,-4.80,11.07,0.00,1.00,-28.80,-9.60 +24.00,-4.80,11.09,0.00,1.00,153.60,-4.80 +19.20,-4.80,11.11,0.00,1.00,-19.20,-4.80 +14.40,-4.80,11.13,0.00,1.00,163.20,-4.80 +9.60,-0.00,11.15,0.00,1.00,-14.40,-4.80 +4.80,-0.00,11.17,0.00,1.00,172.80,-0.00 +0.00,0.00,11.19,0.00,1.00,-4.80,-0.00 +-4.80,0.00,11.21,0.00,1.00,0.00,0.00 +-9.60,0.00,11.24,0.00,1.00,-177.60,0.00 +-14.40,0.00,11.26,0.00,1.00,9.60,0.00 +-19.20,4.80,11.28,0.00,1.00,-168.00,0.00 +-24.00,4.80,11.30,0.00,1.00,14.40,4.80 +-28.80,4.80,11.32,0.00,1.00,-158.40,4.80 +-33.60,4.80,11.34,0.00,1.00,24.00,4.80 +-38.40,4.80,11.36,0.00,1.00,-153.60,4.80 +-43.20,4.80,11.39,0.00,1.00,33.60,4.80 +-48.00,4.80,11.41,0.00,1.00,-144.00,4.80 +-52.80,9.60,11.43,0.00,1.00,43.20,4.80 +-57.60,9.60,11.45,0.00,1.00,-134.40,4.80 +-62.40,9.60,11.47,0.00,1.00,52.80,4.80 +-67.20,9.60,11.49,0.00,1.00,-124.80,9.60 +-72.00,9.60,11.51,0.00,1.00,62.40,9.60 +-76.80,9.60,11.54,0.00,1.00,-110.40,9.60 +-81.60,9.60,11.56,0.00,1.00,72.00,9.60 +-86.40,9.60,11.58,0.00,1.00,-100.80,9.60 +-91.20,9.60,11.60,0.00,1.00,86.40,9.60 +-96.00,9.60,11.62,0.00,1.00,-86.40,9.60 +-100.80,9.60,11.64,0.00,1.00,96.00,9.60 +-105.60,9.60,11.66,0.00,1.00,-76.80,9.60 +-110.40,9.60,11.68,0.00,1.00,110.40,9.60 +-115.20,9.60,11.71,0.00,1.00,-67.20,9.60 +-120.00,9.60,11.73,0.00,1.00,120.00,9.60 +-124.80,9.60,11.75,0.00,1.00,-52.80,9.60 +-129.60,9.60,11.77,0.00,1.00,129.60,4.80 +-134.40,4.80,11.79,0.00,1.00,-43.20,4.80 +-139.20,4.80,11.81,0.00,1.00,139.20,4.80 +-144.00,4.80,11.83,0.00,1.00,-33.60,4.80 +-148.80,4.80,11.86,0.00,1.00,148.80,4.80 +-153.60,4.80,11.88,0.00,1.00,-24.00,4.80 +-158.40,4.80,11.90,0.00,1.00,158.40,4.80 +-163.20,4.80,11.92,0.00,1.00,-19.20,4.80 +-168.00,0.00,11.94,0.00,1.00,168.00,4.80 +-172.80,0.00,11.96,0.00,1.00,-9.60,0.00 +-177.60,0.00,11.98,0.00,1.00,172.80,0.00 +177.60,-0.00,12.01,0.00,1.00,-0.00,0.00 +172.80,-0.00,12.03,0.00,1.00,-177.60,-0.00 +168.00,-0.00,12.05,0.00,1.00,4.80,-0.00 +163.20,-4.80,12.07,0.00,1.00,-168.00,-0.00 +158.40,-4.80,12.09,0.00,1.00,14.40,-4.80 +153.60,-4.80,12.11,0.00,1.00,-163.20,-4.80 +148.80,-4.80,12.13,0.00,1.00,24.00,-4.80 +144.00,-4.80,12.15,0.00,1.00,-153.60,-4.80 +139.20,-4.80,12.18,0.00,1.00,28.80,-4.80 +134.40,-4.80,12.20,0.00,1.00,-144.00,-4.80 +129.60,-9.60,12.22,0.00,1.00,38.40,-4.80 +124.80,-9.60,12.24,0.00,1.00,-134.40,-4.80 +120.00,-9.60,12.26,0.00,1.00,48.00,-4.80 +115.20,-9.60,12.28,0.00,1.00,-124.80,-9.60 +110.40,-9.60,12.30,0.00,1.00,57.60,-9.60 +105.60,-9.60,12.33,0.00,1.00,-115.20,-9.60 +100.80,-9.60,12.35,0.00,1.00,72.00,-9.60 +96.00,-9.60,12.37,0.00,1.00,-105.60,-9.60 +91.20,-9.60,12.39,0.00,1.00,81.60,-9.60 +86.40,-9.60,12.41,0.00,1.00,-91.20,-9.60 +81.60,-9.60,12.43,0.00,1.00,96.00,-9.60 +76.80,-9.60,12.45,0.00,1.00,-81.60,-9.60 +72.00,-9.60,12.48,0.00,1.00,105.60,-9.60 +67.20,-9.60,12.50,0.00,1.00,-67.20,-9.60 +62.40,-9.60,12.52,0.00,1.00,120.00,-9.60 +57.60,-9.60,12.54,0.00,1.00,-57.60,-9.60 +52.80,-9.60,12.56,0.00,1.00,129.60,-4.80 +48.00,-4.80,12.58,0.00,1.00,-48.00,-4.80 +43.20,-4.80,12.60,0.00,1.00,139.20,-4.80 +38.40,-4.80,12.62,0.00,1.00,-38.40,-4.80 +33.60,-4.80,12.65,0.00,1.00,148.80,-4.80 +28.80,-4.80,12.67,0.00,1.00,-28.80,-4.80 +24.00,-4.80,12.69,0.00,1.00,158.40,-4.80 +19.20,-4.80,12.71,0.00,1.00,-19.20,-4.80 +14.40,-0.00,12.73,0.00,1.00,163.20,-4.80 +9.60,-0.00,12.75,0.00,1.00,-9.60,-0.00 +4.80,-0.00,12.77,0.00,1.00,172.80,-0.00 +0.00,0.00,12.80,0.00,1.00,-4.80,-0.00 +-4.80,0.00,12.82,0.00,1.00,0.00,0.00 +-9.60,0.00,12.84,0.00,1.00,-177.60,0.00 +-14.40,0.00,12.86,0.00,1.00,9.60,0.00 +-19.20,0.00,12.88,0.00,1.00,-168.00,0.00 +-24.00,0.00,12.90,0.00,1.00,14.40,0.00 +-28.80,0.00,12.92,0.00,1.00,-163.20,0.00 +-33.60,4.80,12.95,0.00,1.00,24.00,0.00 +-38.40,4.80,12.97,0.00,1.00,-153.60,0.00 +-43.20,4.80,12.99,0.00,1.00,28.80,0.00 +-48.00,4.80,13.01,0.00,1.00,-144.00,4.80 +-52.80,4.80,13.03,0.00,1.00,38.40,4.80 +-57.60,4.80,13.05,0.00,1.00,-134.40,4.80 +-62.40,4.80,13.07,0.00,1.00,48.00,4.80 +-67.20,4.80,13.09,0.00,1.00,-124.80,4.80 +-72.00,4.80,13.12,0.00,1.00,62.40,4.80 +-76.80,4.80,13.14,0.00,1.00,-115.20,4.80 +-81.60,4.80,13.16,0.00,1.00,72.00,4.80 +-86.40,4.80,13.18,0.00,1.00,-100.80,4.80 +-91.20,4.80,13.20,0.00,1.00,86.40,4.80 +-96.00,4.80,13.22,0.00,1.00,-86.40,4.80 +-100.80,4.80,13.24,0.00,1.00,96.00,4.80 +-105.60,4.80,13.27,0.00,1.00,-76.80,4.80 +-110.40,4.80,13.29,0.00,1.00,110.40,4.80 +-115.20,4.80,13.31,0.00,1.00,-62.40,4.80 +-120.00,4.80,13.33,0.00,1.00,120.00,4.80 +-124.80,4.80,13.35,0.00,1.00,-52.80,4.80 +-129.60,4.80,13.37,0.00,1.00,134.40,4.80 +-134.40,4.80,13.39,0.00,1.00,-43.20,4.80 +-139.20,4.80,13.42,0.00,1.00,144.00,4.80 +-144.00,4.80,13.44,0.00,1.00,-33.60,0.00 +-148.80,4.80,13.46,0.00,1.00,153.60,0.00 +-153.60,0.00,13.48,0.00,1.00,-24.00,0.00 +-158.40,0.00,13.50,0.00,1.00,158.40,0.00 +-163.20,0.00,13.52,0.00,1.00,-14.40,0.00 +-168.00,0.00,13.54,0.00,1.00,168.00,0.00 +-172.80,0.00,13.56,0.00,1.00,-9.60,0.00 +-177.60,0.00,13.59,0.00,1.00,172.80,0.00 +177.60,-0.00,13.61,0.00,1.00,-0.00,0.00 +172.80,-0.00,13.63,0.00,1.00,-177.60,-0.00 +168.00,-0.00,13.65,0.00,1.00,4.80,-0.00 +163.20,-0.00,13.67,0.00,1.00,-172.80,-0.00 +158.40,-0.00,13.69,0.00,1.00,14.40,-0.00 +153.60,-0.00,13.71,0.00,1.00,-163.20,-0.00 +148.80,-4.80,13.74,0.00,1.00,19.20,-0.00 +144.00,-4.80,13.76,0.00,1.00,-153.60,-0.00 +139.20,-4.80,13.78,0.00,1.00,28.80,-0.00 +134.40,-4.80,13.80,0.00,1.00,-148.80,-0.00 +129.60,-4.80,13.82,0.00,1.00,38.40,-4.80 +124.80,-4.80,13.84,0.00,1.00,-139.20,-4.80 +120.00,-4.80,13.86,0.00,1.00,48.00,-4.80 +115.20,-4.80,13.89,0.00,1.00,-129.60,-4.80 +110.40,-4.80,13.91,0.00,1.00,57.60,-4.80 +105.60,-4.80,13.93,0.00,1.00,-115.20,-4.80 +100.80,-4.80,13.95,0.00,1.00,67.20,-4.80 +96.00,-4.80,13.97,0.00,1.00,-105.60,-4.80 +91.20,-4.80,13.99,0.00,1.00,81.60,-4.80 +86.40,-4.80,14.01,0.00,1.00,-91.20,-4.80 +81.60,-4.80,14.03,0.00,1.00,96.00,-4.80 +76.80,-4.80,14.06,0.00,1.00,-76.80,-4.80 +72.00,-4.80,14.08,0.00,1.00,105.60,-4.80 +67.20,-4.80,14.10,0.00,1.00,-67.20,-4.80 +62.40,-4.80,14.12,0.00,1.00,120.00,-4.80 +57.60,-4.80,14.14,0.00,1.00,-52.80,-4.80 +52.80,-4.80,14.16,0.00,1.00,129.60,-4.80 +48.00,-4.80,14.18,0.00,1.00,-43.20,-4.80 +43.20,-4.80,14.21,0.00,1.00,139.20,-4.80 +38.40,-4.80,14.23,0.00,1.00,-33.60,-4.80 +33.60,-4.80,14.25,0.00,1.00,148.80,-0.00 +28.80,-0.00,14.27,0.00,1.00,-28.80,-0.00 +24.00,-0.00,14.29,0.00,1.00,158.40,-0.00 +19.20,-0.00,14.31,0.00,1.00,-19.20,-0.00 +14.40,-0.00,14.33,0.00,1.00,163.20,-0.00 +9.60,-0.00,14.36,0.00,1.00,-9.60,-0.00 +4.80,-0.00,14.38,0.00,1.00,172.80,-0.00 +0.00,0.00,14.40,0.00,1.00,-4.80,-0.00 +-4.80,0.00,14.42,0.00,1.00,0.00,0.00 +-9.60,0.00,14.44,0.00,1.00,-177.60,-0.00 +-14.40,0.00,14.46,0.00,1.00,4.80,-0.00 +-19.20,0.00,14.48,0.00,1.00,-168.00,-0.00 +-24.00,0.00,14.50,0.00,1.00,14.40,-0.00 +-28.80,0.00,14.53,0.00,1.00,-163.20,-0.00 +-33.60,0.00,14.55,0.00,1.00,19.20,-0.00 +-38.40,0.00,14.57,0.00,1.00,-153.60,-0.00 +-43.20,0.00,14.59,0.00,1.00,28.80,-0.00 +-48.00,0.00,14.61,0.00,1.00,-148.80,-0.00 +-52.80,0.00,14.63,0.00,1.00,38.40,-0.00 +-57.60,0.00,14.65,0.00,1.00,-139.20,-0.00 +-62.40,0.00,14.68,0.00,1.00,48.00,-0.00 +-67.20,0.00,14.70,0.00,1.00,-124.80,-0.00 +-72.00,0.00,14.72,0.00,1.00,57.60,-0.00 +-76.80,0.00,14.74,0.00,1.00,-115.20,-0.00 +-81.60,0.00,14.76,0.00,1.00,72.00,-0.00 +-86.40,0.00,14.78,0.00,1.00,-100.80,-0.00 +-91.20,0.00,14.80,0.00,1.00,86.40,-0.00 +-96.00,0.00,14.83,0.00,1.00,-86.40,-0.00 +-100.80,0.00,14.85,0.00,1.00,100.80,-0.00 +-105.60,0.00,14.87,0.00,1.00,-76.80,-0.00 +-110.40,0.00,14.89,0.00,1.00,110.40,-0.00 +-115.20,0.00,14.91,0.00,1.00,-62.40,-0.00 +-120.00,0.00,14.93,0.00,1.00,124.80,-0.00 +-124.80,0.00,14.95,0.00,1.00,-48.00,-0.00 +-129.60,0.00,14.97,0.00,1.00,134.40,-0.00 +-134.40,0.00,15.00,0.00,1.00,-38.40,-0.00 +-139.20,0.00,15.02,0.00,1.00,144.00,-0.00 +-144.00,0.00,15.04,0.00,1.00,-28.80,-0.00 +-148.80,0.00,15.06,0.00,1.00,153.60,-0.00 +-153.60,0.00,15.08,0.00,1.00,-24.00,-0.00 +-158.40,0.00,15.10,0.00,1.00,163.20,-0.00 +-163.20,0.00,15.12,0.00,1.00,-14.40,-0.00 +-168.00,0.00,15.15,0.00,1.00,168.00,-0.00 +-172.80,0.00,15.17,0.00,1.00,-9.60,-0.00 +-177.60,0.00,15.19,0.00,1.00,172.80,-0.00 +177.60,0.00,15.21,0.00,1.00,-0.00,-0.00 +172.80,0.00,15.23,0.00,1.00,-177.60,0.00 +168.00,0.00,15.25,0.00,1.00,4.80,0.00 +163.20,0.00,15.27,0.00,1.00,-172.80,0.00 +158.40,0.00,15.30,0.00,1.00,9.60,0.00 +153.60,0.00,15.32,0.00,1.00,-163.20,0.00 +148.80,0.00,15.34,0.00,1.00,19.20,0.00 +144.00,0.00,15.36,0.00,1.00,-158.40,0.00 +139.20,0.00,15.38,0.00,1.00,28.80,0.00 +134.40,0.00,15.40,0.00,1.00,-148.80,0.00 +129.60,0.00,15.42,0.00,1.00,33.60,0.00 +124.80,0.00,15.44,0.00,1.00,-139.20,0.00 +120.00,0.00,15.47,0.00,1.00,43.20,0.00 +115.20,0.00,15.49,0.00,1.00,-129.60,0.00 +110.40,0.00,15.51,0.00,1.00,57.60,0.00 +105.60,0.00,15.53,0.00,1.00,-120.00,0.00 +100.80,0.00,15.55,0.00,1.00,67.20,0.00 +96.00,0.00,15.57,0.00,1.00,-105.60,0.00 +91.20,0.00,15.59,0.00,1.00,81.60,0.00 +86.40,0.00,15.62,0.00,1.00,-91.20,0.00 +81.60,0.00,15.64,0.00,1.00,96.00,0.00 +76.80,0.00,15.66,0.00,1.00,-76.80,0.00 +72.00,0.00,15.68,0.00,1.00,110.40,0.00 +67.20,0.00,15.70,0.00,1.00,-67.20,0.00 +62.40,0.00,15.72,0.00,1.00,120.00,0.00 +57.60,0.00,15.74,0.00,1.00,-52.80,0.00 +52.80,0.00,15.77,0.00,1.00,134.40,0.00 +48.00,0.00,15.79,0.00,1.00,-43.20,0.00 +43.20,0.00,15.81,0.00,1.00,144.00,0.00 +38.40,0.00,15.83,0.00,1.00,-33.60,0.00 +33.60,0.00,15.85,0.00,1.00,153.60,0.00 +28.80,0.00,15.87,0.00,1.00,-24.00,0.00 +24.00,0.00,15.89,0.00,1.00,158.40,0.00 +19.20,0.00,15.91,0.00,1.00,-19.20,0.00 +14.40,0.00,15.94,0.00,1.00,168.00,0.00 +9.60,0.00,15.96,0.00,1.00,-9.60,0.00 +4.80,0.00,15.98,0.00,1.00,172.80,0.00 +0.00,0.00,16.00,0.00,1.00,-4.80,0.00 -- GitLab From bdcaa35566ffa6edbd4c3b4da0b635953868ab45 Mon Sep 17 00:00:00 2001 From: emerit Date: Mon, 15 May 2023 11:33:47 +0200 Subject: [PATCH 161/331] correction filename test output --- scripts/config/self_test.prm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index 32f44fdbf0..81fe3cff88 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -1033,5 +1033,5 @@ networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit // 4 ISM with extended metadata and non diegetic pan object switching bitrate 256 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL out ../IVAS_cod -dtx -ism +4 testv/stvISM1.csv NULL testv/stvISM_with_no_diegetic_switch.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit -../IVAS_dec BINAURAL 48 bit testv/stv+4ISM48s+non_diegetic_pan.wav_brate_sw_48-48_DTX_binaural.tst +../IVAS_dec BINAURAL 48 bit testv/stv+4ISM48s+non_diegetic_pan.wav_brate_256000-48_DTX_binaural.tst -- GitLab From 4e65c8a2a0d6862abc2e43f0e08182c29e6ee013 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 15 May 2023 11:42:35 +0200 Subject: [PATCH 162/331] optimize bugfix code --- lib_enc/ivas_sba_enc.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index 9547564d37..d013df5f4e 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -258,14 +258,15 @@ ivas_error ivas_sba_enc_reconfigure( if ( st_ivas->hQMetaData->q_direction->cfg.nbands != nbands_old || st_ivas->hQMetaData->no_directions != ndir_old ) { int16_t dir, j, i; + IVAS_QDIRECTION *q_direction = st_ivas->hQMetaData->q_direction; for ( dir = 0; dir < st_ivas->hQMetaData->no_directions; dir++ ) { - for ( j = 0; j < st_ivas->hQMetaData->q_direction[dir].cfg.nbands; j++ ) + for ( j = 0; j < q_direction[dir].cfg.nbands; j++ ) { for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) { - st_ivas->hQMetaData->q_direction[dir].band_data[j].energy_ratio_index[i] = 0; - st_ivas->hQMetaData->q_direction[dir].band_data[j].energy_ratio_index_mod[i] = 0; + q_direction[dir].band_data[j].energy_ratio_index[i] = 0; + q_direction[dir].band_data[j].energy_ratio_index_mod[i] = 0; } } } -- GitLab From 0e6b46c06f4989fdd83e06a3e1b7735857f8e92a Mon Sep 17 00:00:00 2001 From: Sumeyra Kanik Date: Mon, 15 May 2023 11:47:02 +0200 Subject: [PATCH 163/331] Update object position at subframe level --- lib_com/ivas_ism_com.c | 8 ++++++ lib_dec/ivas_dec.c | 3 +++ lib_dec/ivas_ism_metadata_dec.c | 9 +------ lib_rend/ivas_objectRenderer.c | 36 ++++++++++++++++++++++---- lib_rend/ivas_objectRenderer_sources.c | 7 +++++ lib_rend/ivas_prot_rend.h | 6 +++++ 6 files changed, 56 insertions(+), 13 deletions(-) diff --git a/lib_com/ivas_ism_com.c b/lib_com/ivas_ism_com.c index 38a34a15bd..d2d0d7ec3a 100644 --- a/lib_com/ivas_ism_com.c +++ b/lib_com/ivas_ism_com.c @@ -337,6 +337,14 @@ void ivas_ism_reset_metadata( hIsmMeta->yaw = 0.0f; hIsmMeta->pitch = 0.0f; hIsmMeta->radius = 1.0f; +#ifdef FIX_356_ISM_METADATA_SYNC + // st_ivas->hIsmMetaData[ch]->last_true_radius = 1.0f; + hIsmMeta->prev_azimuth = 0.0f; + hIsmMeta->prev_elevation = 0.0f; + hIsmMeta->prev_radius = 1.0f; + hIsmMeta->prev_yaw = 0.0f; + hIsmMeta->prev_pitch = 0.0f; +#endif return; } diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index 11cc33af48..43f3c7e0ef 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -227,6 +227,9 @@ ivas_error ivas_dec( /* Binaural rendering */ if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) { +#ifdef FIX_356_ISM_METADATA_SYNC + dbgwrite( &output[0], sizeof( float ), L_FRAME48k, 1, "out.float" ); +#endif if ( ( ivas_td_binaural_renderer( st_ivas, output, output_frame ) ) != IVAS_ERR_OK ) { return error; diff --git a/lib_dec/ivas_ism_metadata_dec.c b/lib_dec/ivas_ism_metadata_dec.c index a2a79e29bb..1ffba4b282 100644 --- a/lib_dec/ivas_ism_metadata_dec.c +++ b/lib_dec/ivas_ism_metadata_dec.c @@ -556,14 +556,7 @@ ivas_error ivas_ism_metadata_dec_create( st_ivas->hIsmMetaData[ch]->last_true_azimuth = 0; st_ivas->hIsmMetaData[ch]->last_true_elevation = 0; -#ifdef FIX_356_ISM_METADATA_SYNC - // st_ivas->hIsmMetaData[ch]->last_true_radius = 1.0f; - st_ivas->hIsmMetaData[ch]->prev_azimuth = 0.0f; - st_ivas->hIsmMetaData[ch]->prev_elevation = 0.0f; - st_ivas->hIsmMetaData[ch]->prev_radius = 1.0f; - st_ivas->hIsmMetaData[ch]->prev_yaw = 0.0f; - st_ivas->hIsmMetaData[ch]->prev_pitch = 0.0f; -#endif + ivas_ism_reset_metadata( st_ivas->hIsmMetaData[ch] ); } diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 4e837f3818..ccfd61fa7e 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -286,6 +286,17 @@ ivas_error ivas_td_binaural_renderer_unwrap( subframe_length = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES; #ifdef FIX_356_ISM_METADATA_SYNC + int16_t c_indx, nS; + c_indx = 0; + for (nS = 0; nS < num_src; nS++) + { + if ( !( ivas_format == MC_FORMAT && nS == lfe_idx ) ) /* Skip LFE for MC */ + { + hBinRendererTd->Sources[c_indx]->InputFrame_p = output[nS]; + hBinRendererTd->Sources[c_indx]->SrcRend_p->InputAvailable = TRUE; + c_indx++; + } + } TDREND_Update_object_positions( hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, Opt_delay_comp, output ); #else /* Update object position(s) */ @@ -312,7 +323,11 @@ ivas_error ivas_td_binaural_renderer_unwrap( } /* Render subframe */ +#ifdef FIX_356_ISM_METADATA_SYNC + if ( ( error = TDREND_GetMix( hBinRendererTd, output, subframe_update, subframe_length, subframe_idx ) ) != IVAS_ERR_OK ) +#else if ( ( error = TDREND_GetMix( hBinRendererTd, output, subframe_length, subframe_idx ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -339,8 +354,11 @@ ivas_error ivas_td_binaural_renderer_unwrap( ivas_error TDREND_GetMix( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ float output[][L_FRAME48k], /* i/o: ISM object synth / rendered output in 0,1 */ - const int16_t subframe_length, /* i/o: subframe length */ - const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ +#ifdef FIX_356_ISM_METADATA_SYNC + const int16_t subframe_update, +#endif + const int16_t subframe_length, /* i/o: subframe length */ + const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ ) { int16_t i; @@ -375,7 +393,13 @@ ivas_error TDREND_GetMix( if ( hBinRendererTd->Listener_p->PoseUpdated || SrcSpatial_p->Updated ) { TDREND_SRC_REND_UpdateFiltersFromSpatialParams( hBinRendererTd, SrcRend_p, SrcSpatial_p, Src_p->hrf_left_prev, - Src_p->hrf_right_prev, hrf_left_delta, hrf_right_delta, &intp_count, &Src_p->filterlength, &Src_p->itd, &Src_p->Gain, Src_p, subframe_idx ); + Src_p->hrf_right_prev, hrf_left_delta, hrf_right_delta, &intp_count, &Src_p->filterlength, &Src_p->itd, &Src_p->Gain, Src_p, +#ifdef FIX_356_ISM_METADATA_SYNC + subframe_update, +#endif + subframe_idx + + ); } /* Render source if needed */ @@ -446,16 +470,19 @@ void TDREND_Update_object_positions( DirAtten_p = hBinRendererTd->DirAtten_p; /* For each source, write the frame data to the source object*/ +#ifndef FIX_356_ISM_METADATA_SYNC c_indx = 0; +#endif for ( nS = 0; nS < num_src; nS++ ) { +#ifndef FIX_356_ISM_METADATA_SYNC if ( !( in_format == MC_FORMAT && nS == lfe_idx ) ) /* Skip LFE for MC */ { hBinRendererTd->Sources[c_indx]->InputFrame_p = output[nS]; hBinRendererTd->Sources[c_indx]->SrcRend_p->InputAvailable = TRUE; c_indx++; } - +#endif if ( in_format == ISM_FORMAT ) { /* Update the source positions */ @@ -485,7 +512,6 @@ void TDREND_Update_object_positions( TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING ); TDREND_MIX_SRC_SetDir( hBinRendererTd, nS, Dir ); - } } diff --git a/lib_rend/ivas_objectRenderer_sources.c b/lib_rend/ivas_objectRenderer_sources.c index 4b58104c17..27c6b55e2d 100644 --- a/lib_rend/ivas_objectRenderer_sources.c +++ b/lib_rend/ivas_objectRenderer_sources.c @@ -259,6 +259,9 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams( int16_t *itd, /* o: ITD value */ float *Gain, /* o: Gain value */ TDREND_SRC_t *Src_p, /* i/o: Source pointer */ +#ifdef FIX_356_ISM_METADATA_SYNC + const int16_t subframe_update, +#endif const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ ) { @@ -353,7 +356,11 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams( azim_delta = ( azim_delta > 180.0f ) ? ( azim_delta - 360 ) : ( ( azim_delta < -180.0f ) ? ( azim_delta + 360 ) : ( azim_delta ) ); /* map to -180:180 range */ *intp_count = min( MAX_INTERPOLATION_STEPS, max( (int16_t) ( fabsf( azim_delta ) * MAX_ANGULAR_STEP_INV ), (int16_t) ( fabsf( elev_delta ) * MAX_ANGULAR_STEP_INV ) ) ); +#ifdef FIX_356_ISM_METADATA_SYNC + if ( ( *intp_count > 0 ) && subframe_idx == subframe_update ) +#else if ( ( *intp_count > 0 ) && subframe_idx == 0 ) +#endif { /* Set deltas for interpolation */ v_sub( hrf_left, hrf_left_prev, hrf_left_delta, *filterlength ); diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 81839e17ac..689a96e866 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -281,6 +281,9 @@ void ivas_td_binaural_close( ivas_error TDREND_GetMix( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ float output[][L_FRAME48k], /* i/o: ISM object synth / rendered output in 0,1 */ +#ifdef FIX_356_ISM_METADATA_SYNC + const int16_t Opt_delay_comp, +#endif const int16_t subframe_length, /* i/o: subframe length */ const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ ); @@ -372,6 +375,9 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams( int16_t *itd, /* o: ITD value */ float *Gain, /* o: Gain value */ TDREND_SRC_t *Src_p, +#ifdef FIX_356_ISM_METADATA_SYNC + const int16_t subframe_update, +#endif const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ ); -- GitLab From ea2b4ed8acfa0c2cf51a043dfccd2b3e8a8e64dc Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Mon, 15 May 2023 13:26:15 +0200 Subject: [PATCH 164/331] Amend ivas_modes.json and ci/smoke_test.sh to trigger expand ISM coverage, including extended metadata --- ci/smoke_test.sh | 2 +- scripts/config/ivas_modes.json | 76 ++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 1 deletion(-) diff --git a/ci/smoke_test.sh b/ci/smoke_test.sh index d3206fce1a..3d88f146e3 100755 --- a/ci/smoke_test.sh +++ b/ci/smoke_test.sh @@ -55,7 +55,7 @@ fi cfg=./scripts/config/ci_linux.json dly_profile=./scripts/dly_error_profiles/dly_error_profile_10.dat -ism_md_cmd="--metadata_files /usr/local/testv/stvISM1.csv /usr/local/testv/stvISM2.csv /usr/local/testv/stvISM3.csv /usr/local/testv/stvISM4.csv" +ism_md_cmd="--metadata_files /usr/local/ltv/stvISM1.csv /usr/local/ltv/stvISM2.csv /usr/local/ltv/stvISM3.csv /usr/local/ltv/stvISM4.csv" if [ $BUILD -eq 1 ];then # Enable memory macros to find unbalanced memory allocations/deallocations diff --git a/scripts/config/ivas_modes.json b/scripts/config/ivas_modes.json index ab08c4e5cd..b0d98fc08d 100644 --- a/scripts/config/ivas_modes.json +++ b/scripts/config/ivas_modes.json @@ -2316,18 +2316,30 @@ "mono": false, "bitrates": { "wb": [ + 13200, + 16400, + 24400, + 32000, + 48000, 64000, 80000, 96000, 128000 ], "swb": [ + 13200, + 16400, + 24400, + 32000, + 48000, 64000, 80000, 96000, 128000 ], "fb": [ + 32000, + 48000, 64000, 80000, 96000, @@ -2359,18 +2371,30 @@ "mono": false, "bitrates": { "wb": [ + 13200, + 16400, + 24400, + 32000, + 48000, 64000, 80000, 96000, 128000 ], "swb": [ + 13200, + 16400, + 24400, + 32000, + 48000, 64000, 80000, 96000, 128000 ], "fb": [ + 32000, + 48000, 64000, 80000, 96000, @@ -2403,6 +2427,10 @@ "mono": false, "bitrates": { "wb": [ + 16400, + 24400, + 32000, + 48000, 64000, 80000, 96000, @@ -2412,6 +2440,10 @@ 256000 ], "swb": [ + 16400, + 24400, + 32000, + 48000, 64000, 80000, 96000, @@ -2421,6 +2453,8 @@ 256000 ], "fb": [ + 32000, + 48000, 64000, 80000, 96000, @@ -2455,6 +2489,10 @@ "mono": false, "bitrates": { "wb": [ + 16400, + 24400, + 32000, + 48000, 64000, 80000, 96000, @@ -2464,6 +2502,10 @@ 256000 ], "swb": [ + 16400, + 24400, + 32000, + 48000, 64000, 80000, 96000, @@ -2473,6 +2515,8 @@ 256000 ], "fb": [ + 32000, + 48000, 64000, 80000, 96000, @@ -2508,6 +2552,9 @@ "mono": false, "bitrates": { "wb": [ + 24400, + 32000, + 48000, 64000, 80000, 96000, @@ -2518,6 +2565,9 @@ 384000 ], "swb": [ + 24400, + 32000, + 48000, 64000, 80000, 96000, @@ -2528,6 +2578,8 @@ 384000 ], "fb": [ + 32000, + 48000, 64000, 80000, 96000, @@ -2563,6 +2615,9 @@ "mono": false, "bitrates": { "wb": [ + 24400, + 32000, + 48000, 64000, 80000, 96000, @@ -2573,6 +2628,9 @@ 384000 ], "swb": [ + 24400, + 32000, + 48000, 64000, 80000, 96000, @@ -2583,6 +2641,8 @@ 384000 ], "fb": [ + 32000, + 48000, 64000, 80000, 96000, @@ -2619,6 +2679,9 @@ "mono": false, "bitrates": { "wb": [ + 24400, + 32000, + 48000, 64000, 80000, 96000, @@ -2630,6 +2693,9 @@ 512000 ], "swb": [ + 24400, + 32000, + 48000, 64000, 80000, 96000, @@ -2641,6 +2707,8 @@ 512000 ], "fb": [ + 32000, + 48000, 64000, 80000, 96000, @@ -2677,6 +2745,9 @@ "mono": false, "bitrates": { "wb": [ + 24400, + 32000, + 48000, 64000, 80000, 96000, @@ -2688,6 +2759,9 @@ 512000 ], "swb": [ + 24400, + 32000, + 48000, 64000, 80000, 96000, @@ -2699,6 +2773,8 @@ 512000 ], "fb": [ + 32000, + 48000, 64000, 80000, 96000, -- GitLab From 38ae0a6d3928009b87accbbad616b29b46142e3a Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 15 May 2023 13:29:56 +0200 Subject: [PATCH 165/331] fix compiler warning --- lib_dec/ivas_dirac_dec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 5c574713da..7581d8e352 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -3017,7 +3017,7 @@ void ivas_dirac_dec_render_sf( #endif } } -#ifdef JBM_TSM_ON_TCS +#if defined( JBM_TSM_ON_TCS ) & !defined( FIX_642) else if ( !st_ivas->hHeadTrackData ) #else else -- GitLab From 15be0a5c92f1a304199903ae1fabd186ce7dc857 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Mon, 15 May 2023 13:32:09 +0200 Subject: [PATCH 166/331] Correct names on metadata test files in ci/smoke_test.sh --- ci/smoke_test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/smoke_test.sh b/ci/smoke_test.sh index 3d88f146e3..9e22fce70a 100755 --- a/ci/smoke_test.sh +++ b/ci/smoke_test.sh @@ -55,7 +55,7 @@ fi cfg=./scripts/config/ci_linux.json dly_profile=./scripts/dly_error_profiles/dly_error_profile_10.dat -ism_md_cmd="--metadata_files /usr/local/ltv/stvISM1.csv /usr/local/ltv/stvISM2.csv /usr/local/ltv/stvISM3.csv /usr/local/ltv/stvISM4.csv" +ism_md_cmd="--metadata_files /usr/local/ltv/ltvISM1.csv /usr/local/ltv/ltvISM2.csv /usr/local/ltv/ltvISM3.csv /usr/local/ltv/ltvISM4.csv" if [ $BUILD -eq 1 ];then # Enable memory macros to find unbalanced memory allocations/deallocations -- GitLab From c2158e6511c52b286b9c9602c702c31d03c3bcab Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 15 May 2023 14:08:01 +0200 Subject: [PATCH 167/331] fix asan error in DirAC head rotation --- lib_dec/ivas_dirac_dec.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 7581d8e352..3d7b2bfc58 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -2995,15 +2995,11 @@ void ivas_dirac_dec_render_sf( { num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; #ifdef JBM_TSM_ON_TCS -#ifndef FIX_642 for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) -#endif #else for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ ) #endif -#ifndef FIX_642 { -#endif #ifdef JBM_TSM_ON_TCS rotateAziEle_DirAC( azimuth[slot_idx], elevation[slot_idx], num_freq_bands, hDirAC->num_freq_bands, p_Rmat ); #else @@ -3012,9 +3008,7 @@ void ivas_dirac_dec_render_sf( /* Todo: This access to azimuth & elevation may use wrong indices as access should probably be based on hDirAC->dirac_read_idx */ rotateAziEle_DirAC( hDirAC->azimuth[index_slot], hDirAC->elevation[index_slot], num_freq_bands, hDirAC->num_freq_bands, p_Rmat ); #endif -#ifndef FIX_642 } -#endif } } #if defined( JBM_TSM_ON_TCS ) & !defined( FIX_642) -- GitLab From a9413a894be5119f013d325ca3ee99b3d871e9b4 Mon Sep 17 00:00:00 2001 From: Sumeyra Kanik Date: Mon, 15 May 2023 14:25:55 +0200 Subject: [PATCH 168/331] Code cleanup, always update subframe 2 --- apps/decoder.c | 4 --- lib_com/ivas_ism_com.c | 8 ----- lib_com/ivas_stat_com.h | 7 ---- lib_dec/ivas_dec.c | 3 -- lib_dec/ivas_ism_metadata_dec.c | 8 ----- lib_dec/ivas_objectRenderer_internal.c | 4 --- lib_dec/ivas_stat_dec.h | 3 -- lib_dec/lib_dec.c | 11 ------ lib_dec/lib_dec.h | 6 +--- lib_rend/ivas_objectRenderer.c | 50 +++++--------------------- lib_rend/ivas_prot_rend.h | 13 ------- lib_rend/lib_rend.c | 38 -------------------- 12 files changed, 10 insertions(+), 145 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index e1a5c2a66b..5a37e9bd4a 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -354,11 +354,7 @@ int main( /*------------------------------------------------------------------------------------------* * Configure the decoder *------------------------------------------------------------------------------------------*/ -#ifdef FIX_356_ISM_METADATA_SYNC - if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.renderConfigEnabled, arg.delayCompensationEnabled ) ) != IVAS_ERR_OK ) -#else if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.renderConfigEnabled ) ) != IVAS_ERR_OK ) -#endif { fprintf( stderr, "\nConfigure failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; diff --git a/lib_com/ivas_ism_com.c b/lib_com/ivas_ism_com.c index d2d0d7ec3a..38a34a15bd 100644 --- a/lib_com/ivas_ism_com.c +++ b/lib_com/ivas_ism_com.c @@ -337,14 +337,6 @@ void ivas_ism_reset_metadata( hIsmMeta->yaw = 0.0f; hIsmMeta->pitch = 0.0f; hIsmMeta->radius = 1.0f; -#ifdef FIX_356_ISM_METADATA_SYNC - // st_ivas->hIsmMetaData[ch]->last_true_radius = 1.0f; - hIsmMeta->prev_azimuth = 0.0f; - hIsmMeta->prev_elevation = 0.0f; - hIsmMeta->prev_radius = 1.0f; - hIsmMeta->prev_yaw = 0.0f; - hIsmMeta->prev_pitch = 0.0f; -#endif return; } diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index 20073e6dd9..f1bf01cc73 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -78,13 +78,6 @@ typedef struct #ifdef FIX_435_ISM_MERGE_BUG float last_true_radius; /* last true Q radius value */ #endif -#ifdef FIX_356_ISM_METADATA_SYNC - float prev_azimuth; - float prev_elevation; - float prev_radius; - float prev_yaw; - float prev_pitch; -#endif } ISM_METADATA_FRAME, *ISM_METADATA_HANDLE; diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index 43f3c7e0ef..11cc33af48 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -227,9 +227,6 @@ ivas_error ivas_dec( /* Binaural rendering */ if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) { -#ifdef FIX_356_ISM_METADATA_SYNC - dbgwrite( &output[0], sizeof( float ), L_FRAME48k, 1, "out.float" ); -#endif if ( ( ivas_td_binaural_renderer( st_ivas, output, output_frame ) ) != IVAS_ERR_OK ) { return error; diff --git a/lib_dec/ivas_ism_metadata_dec.c b/lib_dec/ivas_ism_metadata_dec.c index 1ffba4b282..7a61424a1f 100644 --- a/lib_dec/ivas_ism_metadata_dec.c +++ b/lib_dec/ivas_ism_metadata_dec.c @@ -244,14 +244,6 @@ ivas_error ivas_ism_metadata_dec( /* Read ISM present flags (one per object) */ for ( ch = 0; ch < *nchan_transport; ch++ ) { -#ifdef FIX_356_ISM_METADATA_SYNC - hIsmMeta[ch]->prev_azimuth = hIsmMeta[ch]->azimuth; - hIsmMeta[ch]->prev_elevation = hIsmMeta[ch]->elevation; - hIsmMeta[ch]->prev_radius = hIsmMeta[ch]->radius; - hIsmMeta[ch]->prev_yaw = hIsmMeta[ch]->yaw; - hIsmMeta[ch]->prev_pitch = hIsmMeta[ch]->pitch; - -#endif ism_imp[ch] = get_next_indice( st0, ISM_METADATA_FLAG_BITS ); if ( ism_imp[ch] > ISM_NO_META ) diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index 9ce51cffba..f1c1fc04f2 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -75,10 +75,6 @@ ivas_error ivas_td_binaural_renderer( st_ivas->hReverb, st_ivas->transport_config, st_ivas->hBinRendererTd, st_ivas->nchan_transport, LFE_CHANNEL, st_ivas->ivas_format, -#ifdef FIX_356_ISM_METADATA_SYNC - st_ivas->hIsmMetaData, st_ivas->hDecoderConfig->Opt_delay_comp, st_ivas->hRenderConfig->directivity, st_ivas->hDecoderConfig->Opt_Headrotation, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Quaternions : NULL, -#else st_ivas->hIsmMetaData, st_ivas->hDecoderConfig->Opt_Headrotation, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Quaternions : NULL, -#endif ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Pos : NULL, output, output_frame ); } diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 39e13e771a..ad453cd5bd 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -1145,9 +1145,6 @@ typedef struct decoder_config_structure int16_t orientation_tracking; /* indicates orientation tracking type */ float no_diegetic_pan; int16_t Opt_AMR_WB; /* flag indicating AMR-WB IO mode */ -#ifdef FIX_356_ISM_METADATA_SYNC - int16_t Opt_delay_comp; /* flag indicating delay compensation active */ -#endif /* temp. development parameters */ #ifdef DEBUGGING diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 5791fda0c6..99529372eb 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -226,9 +226,6 @@ static void init_decoder_config( hDecoderConfig->Opt_RendConfigCustom = 0; hDecoderConfig->orientation_tracking = orientation_tracking; hDecoderConfig->no_diegetic_pan = no_diegetic_pan; -#ifdef FIX_356_ISM_METADATA_SYNC - hDecoderConfig->Opt_delay_comp = 0; -#endif return; } @@ -391,12 +388,7 @@ ivas_error IVAS_DEC_Configure( const int16_t customLsOutputEnabled, /* i : enable custom loudspeaker setup handle */ const int16_t hrtfReaderEnabled, /* i : enable HRTF binary file input */ const int16_t enableHeadRotation, /* i : enable head rotation for binaural output */ -#ifdef FIX_356_ISM_METADATA_SYNC - const int16_t renderConfigEnabled, /* i : enable Renderer config. file for binaural output */ - const int16_t delayCompensationEnabled /* i : enable delay compensation */ -#else const int16_t renderConfigEnabled /* i : enable Renderer config. file for binaural output */ -#endif ) { Decoder_Struct *st_ivas; @@ -446,9 +438,6 @@ ivas_error IVAS_DEC_Configure( hDecoderConfig->Opt_Headrotation = enableHeadRotation; hDecoderConfig->Opt_HRTF_binary = hrtfReaderEnabled; hDecoderConfig->Opt_RendConfigCustom = renderConfigEnabled; -#ifdef FIX_356_ISM_METADATA_SYNC - hDecoderConfig->Opt_delay_comp = delayCompensationEnabled; -#endif /* Set decoder parameters to initial values */ if ( ( error = ivas_init_decoder_front( st_ivas ) ) != IVAS_ERR_OK ) diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index 16aa8a66dd..3950f44e03 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -130,12 +130,8 @@ ivas_error IVAS_DEC_Configure( const int16_t customLsOutputEnabled, /* i : enable custom loudspeaker setup handle */ const int16_t hrtfReaderEnabled, /* i : enable HRTF binary file input */ const int16_t enableHeadRotation, /* i : enable head rotation for binaural output */ -#ifdef FIX_356_ISM_METADATA_SYNC - const int16_t renderConfigEnabled, /* i : enable Renderer config. file for binaural output */ - const int16_t delayCompensationEnabled /* i : enable delay compensation */ -#else const int16_t renderConfigEnabled /* i : enable Renderer config. file for binaural output */ -#endif + ); void IVAS_DEC_Close( diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index ccfd61fa7e..91dc7c5d2e 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -256,10 +256,6 @@ ivas_error ivas_td_binaural_renderer_unwrap( const int16_t lfe_idx, /* i : LFE channel index */ const IVAS_FORMAT ivas_format, /* i : IVAS format */ ISM_METADATA_HANDLE *hIsmMetaData, /* i : ISM metadata handle */ -#ifdef FIX_356_ISM_METADATA_SYNC - const int16_t Opt_delay_comp, /* i : Delay compensation flag */ - const float *directivity, /* i : Directivity pattern (used for ISM) */ -#endif const int16_t Opt_Headrotation, /* i : Head rotation flag */ const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ @@ -271,23 +267,16 @@ ivas_error ivas_td_binaural_renderer_unwrap( int16_t subframe_idx; float reverb_signal[BINAURAL_CHANNELS][L_FRAME48k]; ivas_error error; -#ifdef FIX_356_ISM_METADATA_SYNC - int16_t subframe_update; - if ( Opt_delay_comp ) - { - subframe_update = 0; - } - else - { - subframe_update = 2; /* To be verified */ - } -#endif subframe_length = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES; #ifdef FIX_356_ISM_METADATA_SYNC + int16_t subframe_update; int16_t c_indx, nS; + + subframe_update = 2; c_indx = 0; + for (nS = 0; nS < num_src; nS++) { if ( !( ivas_format == MC_FORMAT && nS == lfe_idx ) ) /* Skip LFE for MC */ @@ -297,18 +286,18 @@ ivas_error ivas_td_binaural_renderer_unwrap( c_indx++; } } - TDREND_Update_object_positions( hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, Opt_delay_comp, output ); #else /* Update object position(s) */ TDREND_Update_object_positions( hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, output ); #endif + for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) { #ifdef FIX_356_ISM_METADATA_SYNC - if ( !Opt_delay_comp && subframe_idx == subframe_update ) + if ( subframe_idx == subframe_update ) { /* Update object position(s) */ - TDREND_Update_object_positions( hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, !Opt_delay_comp, output ); + TDREND_Update_object_positions( hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, output ); } #endif /* Update the listener's location/orientation */ @@ -455,9 +444,6 @@ void TDREND_Update_object_positions( const int16_t lfe_idx, /* i : Input LFE index */ const IVAS_FORMAT in_format, /* i : Format of input sources */ const ISM_METADATA_HANDLE *hIsmMetaData, /* i : Input metadata for ISM objects */ -#ifdef FIX_356_ISM_METADATA_SYNC - const int16_t Opt_delay_comp, -#endif float output[][L_FRAME48k] /* i/o: SCE/MC channels */ ) { @@ -487,21 +473,9 @@ void TDREND_Update_object_positions( { /* Update the source positions */ /* Source position and direction */ -#ifdef FIX_356_ISM_METADATA_SYNC - if ( !Opt_delay_comp ) - { - angles_to_vec( hIsmMetaData[nS]->prev_radius, hIsmMetaData[nS]->prev_azimuth, hIsmMetaData[nS]->prev_elevation, Pos ); - angles_to_vec( 1.0f, hIsmMetaData[nS]->prev_yaw, hIsmMetaData[nS]->prev_pitch, Dir ); - } - else - { - angles_to_vec( hIsmMetaData[nS]->radius, hIsmMetaData[nS]->azimuth, hIsmMetaData[nS]->elevation, Pos ); - angles_to_vec( 1.0f, hIsmMetaData[nS]->yaw, hIsmMetaData[nS]->pitch, Dir ); - } -#else angles_to_vec( hIsmMetaData[nS]->radius, hIsmMetaData[nS]->azimuth, hIsmMetaData[nS]->elevation, Pos ); angles_to_vec( 1.0f, hIsmMetaData[nS]->yaw, hIsmMetaData[nS]->pitch, Dir ); -#endif + /* Source directivity info */ DirAtten_p->ConeInnerAngle = 360.0f; DirAtten_p->ConeOuterAngle = 360.0f; @@ -638,9 +612,6 @@ ivas_error ivas_td_binaural_renderer_ext( const IVAS_REND_HeadRotData *headRotData, /* i : Input head positions */ const IVAS_REND_AudioObjectPosition *currentPos, /* i : Object position */ const REVERB_HANDLE hReverb, /* i : Reverberator handle */ -#ifdef FIX_356_ISM_METADATA_SYNC - const int16_t Opt_delay_comp, /* i : Delay compensation flag */ -#endif const int16_t output_frame, /* i : output frame length */ float output[][L_FRAME48k] /* i/o: SCE channels / Binaural synthesis */ ) @@ -690,11 +661,8 @@ ivas_error ivas_td_binaural_renderer_ext( hIsmMetaData[0]->radius = currentPos->radius; } -#ifdef FIX_356_ISM_METADATA_SYNC - if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, Opt_delay_comp, NULL, headRotData->headRotEnabled, -#else + if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, -#endif ( headRotData != NULL ) ? headRotData->headPositions : NULL, ( headRotData != NULL ) ? headRotData->Pos : NULL, output, output_frame ) ) != IVAS_ERR_OK ) { diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 689a96e866..a9697688a8 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -228,10 +228,6 @@ ivas_error ivas_td_binaural_renderer_unwrap( const int16_t lfe_idx, /* i : LFE channel index */ const IVAS_FORMAT ivas_format, /* i : IVAS format */ ISM_METADATA_HANDLE *hIsmMetaData, /* i : ISM metadata handle */ -#ifdef FIX_356_ISM_METADATA_SYNC - const int16_t Opt_delay_comp, /* i : Delay compensation flag */ - const float *directivity, /* i : Directivity pattern (used for ISM) */ -#endif const int16_t Opt_Headrotation, /* i : Head rotation flag */ const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ @@ -246,9 +242,6 @@ ivas_error ivas_td_binaural_renderer_ext( const IVAS_REND_HeadRotData *headRotData, /* i : Input head positions */ const IVAS_REND_AudioObjectPosition *currentPos, /* i : Object position */ const REVERB_HANDLE hReverb, /* i : Reverberator handle */ -#ifdef FIX_356_ISM_METADATA_SYNC - const int16_t Opt_delay_comp, /* i : Delay compensation flag */ -#endif const int16_t output_frame, /* i : output frame length */ float output[][L_FRAME48k] /* i/o: SCE channels / Binaural synthesis */ ); @@ -281,9 +274,6 @@ void ivas_td_binaural_close( ivas_error TDREND_GetMix( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ float output[][L_FRAME48k], /* i/o: ISM object synth / rendered output in 0,1 */ -#ifdef FIX_356_ISM_METADATA_SYNC - const int16_t Opt_delay_comp, -#endif const int16_t subframe_length, /* i/o: subframe length */ const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ ); @@ -301,9 +291,6 @@ void TDREND_Update_object_positions( const int16_t lfe_idx, /* i : Input LFE index */ const IVAS_FORMAT in_format, /* i : Format of input sources */ const ISM_METADATA_HANDLE *hIsmMetaData, /* i : Input metadata for ISM objects */ -#ifdef FIX_356_ISM_METADATA_SYNC - const int16_t Opt_delay_comp, -#endif float output[][L_FRAME48k] /* i/o: SCE/MC channels */ ); diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index da2c7c2023..7744a6582b 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -191,9 +191,6 @@ struct IVAS_REND int8_t rendererConfigEnabled; RENDER_CONFIG_DATA *hRendererConfig; /* Renderer config pointer */ -#ifdef FIX_356_ISM_METADATA_SYNC - int8_t delayCompensationEnabled; -#endif }; @@ -4307,9 +4304,6 @@ static ivas_error rotateFrameSba( static ivas_error renderIsmToBinaural( const input_ism *ismInput, -#ifdef FIX_356_ISM_METADATA_SYNC - const int8_t delayCompensationEnabled, -#endif IVAS_REND_AudioBuffer outAudio ) { float tmpTDRendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; @@ -4326,9 +4320,6 @@ static ivas_error renderIsmToBinaural( ismInput->base.ctx.pHeadRotData, &ismInput->currentPos, ismInput->hReverb, -#ifdef FIX_356_ISM_METADATA_SYNC - (int16_t) delayCompensationEnabled, -#endif outAudio.config.numSamplesPerChannel, tmpTDRendBuffer ) ) != IVAS_ERR_OK ) { @@ -4344,9 +4335,6 @@ static ivas_error renderIsmToBinaural( static ivas_error renderIsmToBinauralRoom( input_ism *ismInput, -#ifdef FIX_356_ISM_METADATA_SYNC - const int8_t delayCompensationEnabled, -#endif IVAS_REND_AudioBuffer outAudio ) { int16_t i; @@ -4379,9 +4367,6 @@ static ivas_error renderIsmToBinauralRoom( ismInput->base.ctx.pHeadRotData, &ismInput->currentPos, ismInput->hReverb, -#ifdef FIX_356_ISM_METADATA_SYNC - (int16_t) delayCompensationEnabled, -#endif outAudio.config.numSamplesPerChannel, tmpRendBuffer ) ) != IVAS_ERR_OK ) { @@ -4590,9 +4575,6 @@ static ivas_error renderIsmToSba( static ivas_error renderInputIsm( input_ism *ismInput, const IVAS_REND_AudioConfig outConfig, -#ifdef FIX_356_ISM_METADATA_SYNC - const int8_t delayCompensationEnabled, -#endif const IVAS_REND_AudioBuffer outAudio ) { ivas_error error; @@ -4622,18 +4604,10 @@ static ivas_error renderInputIsm( switch ( outConfig ) { case IVAS_REND_AUDIO_CONFIG_BINAURAL: -#ifdef FIX_356_ISM_METADATA_SYNC - error = renderIsmToBinaural( ismInput, delayCompensationEnabled, outAudio ); -#else error = renderIsmToBinaural( ismInput, outAudio ); -#endif break; case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: -#ifdef FIX_356_ISM_METADATA_SYNC - error = renderIsmToBinauralRoom( ismInput, delayCompensationEnabled, outAudio ); -#else error = renderIsmToBinauralRoom( ismInput, outAudio ); -#endif break; default: return IVAS_ERR_INVALID_OUTPUT_FORMAT; @@ -4667,11 +4641,7 @@ static ivas_error renderActiveInputsIsm( continue; } -#ifdef FIX_356_ISM_METADATA_SYNC - if ( ( error = renderInputIsm( pCurrentInput, hIvasRend->outputConfig, hIvasRend->delayCompensationEnabled, outAudio ) ) != IVAS_ERR_OK ) -#else if ( ( error = renderInputIsm( pCurrentInput, hIvasRend->outputConfig, outAudio ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -4750,11 +4720,7 @@ static ivas_error renderMcToBinaural( copyBufferTo2dArray( mcInput->base.inputBuffer, tmpRendBuffer ); if ( ( error = ivas_td_binaural_renderer_ext( &mcInput->tdRendWrapper, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, NULL, -#ifdef FIX_356_ISM_METADATA_SYNC - mcInput->hReverb, 1, mcInput->base.inputBuffer.config.numSamplesPerChannel, tmpRendBuffer ) ) != IVAS_ERR_OK ) -#else mcInput->hReverb, mcInput->base.inputBuffer.config.numSamplesPerChannel, tmpRendBuffer ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -4824,11 +4790,7 @@ static ivas_error renderMcToBinauralRoom( copyBufferTo2dArray( mcInput->base.inputBuffer, tmpRendBuffer ); if ( ( error = ivas_td_binaural_renderer_ext( &mcInput->tdRendWrapper, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, -#ifdef FIX_356_ISM_METADATA_SYNC - NULL, mcInput->hReverb, 1, mcInput->base.inputBuffer.config.numSamplesPerChannel, tmpRendBuffer ) ) != IVAS_ERR_OK ) -#else NULL, mcInput->hReverb, mcInput->base.inputBuffer.config.numSamplesPerChannel, tmpRendBuffer ) ) != IVAS_ERR_OK ) -#endif { return error; } -- GitLab From 073374813acad115285dbffd0576ab2e7190916f Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 15 May 2023 14:27:30 +0200 Subject: [PATCH 169/331] fix formatting --- lib_dec/ivas_dirac_dec.c | 200 +++++++++++++++++++-------------------- 1 file changed, 100 insertions(+), 100 deletions(-) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 3d7b2bfc58..cb7c9f5b9a 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -268,7 +268,7 @@ ivas_error ivas_dirac_dec_config( if ( flag_config == DIRAC_OPEN ) { - hDirAC->slot_size = ( int16_t )( ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX ); + hDirAC->slot_size = (int16_t) ( ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX ); #ifdef JBM_TSM_ON_TCS set_s( hDirAC->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); set_s( hDirAC->subframe_nbslots, JBM_CLDFB_SLOTS_IN_SUBFRAME, DEFAULT_JBM_SUBFRAMES_5MS ); @@ -277,7 +277,7 @@ ivas_error ivas_dirac_dec_config( hDirAC->slots_rendered = 0; hDirAC->num_slots = DEFAULT_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME; #else - hDirAC->subframe_nbslots = ( int16_t )( CLDFB_NO_COL_MAX * 5.f / 20.f + 0.5f ); + hDirAC->subframe_nbslots = (int16_t) ( CLDFB_NO_COL_MAX * 5.f / 20.f + 0.5f ); hDirAC->nb_subframes = CLDFB_NO_COL_MAX / hDirAC->subframe_nbslots; assert( hDirAC->nb_subframes <= MAX_PARAM_SPATIAL_SUBFRAMES ); #endif @@ -374,7 +374,7 @@ ivas_error ivas_dirac_dec_config( if ( flag_config == DIRAC_OPEN ) { - hDirAC->num_freq_bands = ( int16_t )( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); + hDirAC->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); if ( ( hDirAC->frequency_axis = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); @@ -1886,7 +1886,7 @@ void ivas_dirac_dec_read_BS( if ( !st->bfi && ivas_total_brate > IVAS_SID_5k2 ) { next_bit_pos_orig = st->next_bit_pos; - st->next_bit_pos = ( int16_t )( ivas_total_brate / FRAMES_PER_SEC - 1 ); + st->next_bit_pos = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC - 1 ); /* 1 bit flag for signaling metadata to read */ b = st->bit_stream[( st->next_bit_pos )--]; @@ -1990,7 +1990,7 @@ void ivas_dirac_dec_read_BS( next_bit_pos_orig = st->next_bit_pos; /* subtract mode signaling bits, since bitstream was moved after mode reading */ - st->next_bit_pos = ( int16_t )( ivas_total_brate / FRAMES_PER_SEC - 1 - SID_FORMAT_NBITS ); + st->next_bit_pos = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC - 1 - SID_FORMAT_NBITS ); /* 1 bit flag for SPAR/DirAC, already read in read format function */ b = st->bit_stream[( st->next_bit_pos )--]; ( *nb_bits )++; @@ -2417,14 +2417,14 @@ void ivas_qmetadata_to_dirac( #ifdef HODIRAC if ( hodirac ) { - azi = ( int16_t )( azimuth + 0.5f ); - ele = ( int16_t )( elevation + 0.5f ); + azi = (int16_t) ( azimuth + 0.5f ); + ele = (int16_t) ( elevation + 0.5f ); } else #endif { - azi = ( int16_t )( azimuth + rand_triangular_signed( seed_ptr ) * dirac_dithering_azi_scale[diff_idx] + 0.5f ); - ele = ( int16_t )( elevation + rand_triangular_signed( seed_ptr ) * dirac_dithering_ele_scale[diff_idx] + 0.5f ); + azi = (int16_t) ( azimuth + rand_triangular_signed( seed_ptr ) * dirac_dithering_azi_scale[diff_idx] + 0.5f ); + ele = (int16_t) ( elevation + rand_triangular_signed( seed_ptr ) * dirac_dithering_ele_scale[diff_idx] + 0.5f ); /* limit the elevation to [-90, 90] */ ele = min( 90, ele ); ele = max( -90, ele ); @@ -2878,10 +2878,10 @@ void ivas_dirac_dec_render_sf( { for ( i = 0; i < output_frame; i++ ) { - tmp[nchan_transport * i + n] = ( int16_t )( output_f[n][i] + 0.5f ); + tmp[nchan_transport * i + n] = (int16_t) ( output_f[n][i] + 0.5f ); } } - sprintf( file_name, "./res/ivas_dirac_dec_DMX%d.%d.pcm", nchan_transport, ( int16_t )( output_frame * 0.05 ) ); + sprintf( file_name, "./res/ivas_dirac_dec_DMX%d.%d.pcm", nchan_transport, (int16_t) ( output_frame * 0.05 ) ); dbgwrite( tmp, sizeof( int16_t ), nchan_transport * output_frame, 1, file_name ); } #endif @@ -2978,13 +2978,13 @@ void ivas_dirac_dec_render_sf( } #ifdef JBM_TSM_ON_TCS - if ( st_ivas->hHeadTrackData + if ( st_ivas->hHeadTrackData #ifndef FIX_642 - && st_ivas->hDecoderConfig->voip_active == 1 + && st_ivas->hDecoderConfig->voip_active == 1 #endif - ) + ) #else - if ( st_ivas->hHeadTrackData ) + if ( st_ivas->hHeadTrackData ) #endif { QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[st_ivas->hHeadTrackData->num_quaternions++], st_ivas->hHeadTrackData->Rmat ); @@ -2997,24 +2997,24 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) #else - for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ ) + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ ) #endif { #ifdef JBM_TSM_ON_TCS rotateAziEle_DirAC( azimuth[slot_idx], elevation[slot_idx], num_freq_bands, hDirAC->num_freq_bands, p_Rmat ); #else - /* note, this seems wrong since it does not take the dirac read ptr into account */ - index_slot = subframe_idx * hDirAC->subframe_nbslots + slot_idx; - /* Todo: This access to azimuth & elevation may use wrong indices as access should probably be based on hDirAC->dirac_read_idx */ - rotateAziEle_DirAC( hDirAC->azimuth[index_slot], hDirAC->elevation[index_slot], num_freq_bands, hDirAC->num_freq_bands, p_Rmat ); + /* note, this seems wrong since it does not take the dirac read ptr into account */ + index_slot = subframe_idx * hDirAC->subframe_nbslots + slot_idx; + /* Todo: This access to azimuth & elevation may use wrong indices as access should probably be based on hDirAC->dirac_read_idx */ + rotateAziEle_DirAC( hDirAC->azimuth[index_slot], hDirAC->elevation[index_slot], num_freq_bands, hDirAC->num_freq_bands, p_Rmat ); #endif } } } -#if defined( JBM_TSM_ON_TCS ) & !defined( FIX_642) +#if defined( JBM_TSM_ON_TCS ) & !defined( FIX_642 ) else if ( !st_ivas->hHeadTrackData ) #else - else + else #endif { p_Rmat = 0; @@ -3030,7 +3030,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS diffuseness_vector[0], #else - hDirAC->diffuseness_vector[hDirAC->dirac_read_idx], + hDirAC->diffuseness_vector[hDirAC->dirac_read_idx], #endif hDirAC->h_output_synthesis_psd_params.max_band_decorr, hDirAC->h_output_synthesis_psd_state.direct_power_factor, @@ -3044,7 +3044,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS surCohEner = hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] * hDirAC->surroundingCoherence[md_idx][i]; #else - surCohEner = hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] * hDirAC->surroundingCoherence[hDirAC->dirac_read_idx][i]; + surCohEner = hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] * hDirAC->surroundingCoherence[hDirAC->dirac_read_idx][i]; #endif hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] -= surCohEner; hDirAC->h_output_synthesis_psd_state.direct_power_factor[i] += surCohEner; @@ -3063,7 +3063,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS hDirAC->diffuseness_vector[md_idx], #else - hDirAC->diffuseness_vector[hDirAC->dirac_read_idx], + hDirAC->diffuseness_vector[hDirAC->dirac_read_idx], #endif hDirAC->h_output_synthesis_psd_params.max_band_decorr, hDirAC->h_output_synthesis_psd_state.direct_power_factor, @@ -3076,7 +3076,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS surCohRatio[i] = hDirAC->surroundingCoherence[md_idx][i]; #else - surCohRatio[i] = hDirAC->surroundingCoherence[hDirAC->dirac_read_idx][i]; + surCohRatio[i] = hDirAC->surroundingCoherence[hDirAC->dirac_read_idx][i]; #endif } } @@ -3131,7 +3131,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) #else - for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ ) + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ ) #endif { #ifdef JBM_TSM_ON_TCS @@ -3145,7 +3145,7 @@ void ivas_dirac_dec_render_sf( md_idx = hDirAC->render_to_md_map[subframe_idx]; } #else - index_slot = subframe_idx * hDirAC->subframe_nbslots + slot_idx; + index_slot = subframe_idx * hDirAC->subframe_nbslots + slot_idx; #endif if ( st_ivas->sba_mode == SBA_MODE_SPAR ) @@ -3177,17 +3177,17 @@ void ivas_dirac_dec_render_sf( #endif #else #ifdef SPAR_TUNING - cldfbAnalysis_ts( &( output_f[hDirAC->sba_map_tc[ch]][hDirAC->num_freq_bands * index_slot] ), - Cldfb_RealBuffer[ch][0], - Cldfb_ImagBuffer[ch][0], - hDirAC->num_freq_bands, - st_ivas->cldfbAnaDec[ch] ); + cldfbAnalysis_ts( &( output_f[hDirAC->sba_map_tc[ch]][hDirAC->num_freq_bands * index_slot] ), + Cldfb_RealBuffer[ch][0], + Cldfb_ImagBuffer[ch][0], + hDirAC->num_freq_bands, + st_ivas->cldfbAnaDec[ch] ); #else - cldfbAnalysis_ts( &( output_f[sba_map_tc[ch]][hDirAC->num_freq_bands * index_slot] ), - Cldfb_RealBuffer[ch][0], - Cldfb_ImagBuffer[ch][0], - hDirAC->num_freq_bands, - st_ivas->cldfbAnaDec[ch] ); + cldfbAnalysis_ts( &( output_f[sba_map_tc[ch]][hDirAC->num_freq_bands * index_slot] ), + Cldfb_RealBuffer[ch][0], + Cldfb_ImagBuffer[ch][0], + hDirAC->num_freq_bands, + st_ivas->cldfbAnaDec[ch] ); #endif #endif @@ -3204,7 +3204,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS st_ivas->hTcBuffer->tc[1], #else - &( output_f[1][L_FRAME48k - L_FRAME16k] ), + &( output_f[1][L_FRAME48k - L_FRAME16k] ), #endif Cldfb_RealBuffer[1][0], Cldfb_ImagBuffer[1][0], @@ -3223,7 +3223,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS md_idx, #else - subframe_idx, + subframe_idx, #endif nchan_transport ); } @@ -3340,8 +3340,8 @@ void ivas_dirac_dec_render_sf( azimuth[slot_idx], elevation[slot_idx] #else - hDirAC->azimuth[hDirAC->dirac_estimator_idx], - hDirAC->elevation[hDirAC->dirac_estimator_idx] + hDirAC->azimuth[hDirAC->dirac_estimator_idx], + hDirAC->elevation[hDirAC->dirac_estimator_idx] #endif ); @@ -3353,7 +3353,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS diffuseness_vector[slot_idx] #else - hDirAC->diffuseness_vector[hDirAC->dirac_estimator_idx] + hDirAC->diffuseness_vector[hDirAC->dirac_estimator_idx] #endif ); @@ -3524,47 +3524,47 @@ void ivas_dirac_dec_render_sf( ); } #else - if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order > 0 ) - { - ivas_dirac_dec_output_synthesis_process_slot( reference_power, - p_onset_filter, - azimuth[slot_idx], - elevation[slot_idx], - diffuseness_vector[slot_idx], - hDirAC, - st_ivas->hHeadTrackData->shd_rot_max_order, - p_Rmat, - st_ivas->hVBAPdata, - hDirAC->hOutSetup, - nchan_transport, - md_idx, + if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order > 0 ) + { + ivas_dirac_dec_output_synthesis_process_slot( reference_power, + p_onset_filter, + azimuth[slot_idx], + elevation[slot_idx], + diffuseness_vector[slot_idx], + hDirAC, + st_ivas->hHeadTrackData->shd_rot_max_order, + p_Rmat, + st_ivas->hVBAPdata, + hDirAC->hOutSetup, + nchan_transport, + md_idx, #ifdef HODIRAC - st_ivas->sba_analysis_order > 1 && - st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k + st_ivas->sba_analysis_order > 1 && + st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k #endif - ); - } - else - { - ivas_dirac_dec_output_synthesis_process_slot( reference_power, - p_onset_filter, - azimuth[slot_idx], - elevation[slot_idx], - diffuseness_vector[slot_idx], - hDirAC, - 0, - 0, - st_ivas->hVBAPdata, - hDirAC->hOutSetup, - nchan_transport, - md_idx, + ); + } + else + { + ivas_dirac_dec_output_synthesis_process_slot( reference_power, + p_onset_filter, + azimuth[slot_idx], + elevation[slot_idx], + diffuseness_vector[slot_idx], + hDirAC, + 0, + 0, + st_ivas->hVBAPdata, + hDirAC->hOutSetup, + nchan_transport, + md_idx, #ifdef HODIRAC - st_ivas->sba_analysis_order > 1 && - st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k + st_ivas->sba_analysis_order > 1 && + st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k #endif - ); - } + ); + } #endif if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) @@ -3687,7 +3687,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS index_slot = slot_idx_start_cldfb_synth; #else - index_slot = subframe_idx * hDirAC->subframe_nbslots; + index_slot = subframe_idx * hDirAC->subframe_nbslots; #endif if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) @@ -3713,7 +3713,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS for ( i = 0; i < hDirAC->subframe_nbslots[subframe_idx]; i++ ) #else - for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) #endif { RealBuffer[i] = Cldfb_RealBuffer_Binaural[ch][i]; @@ -3727,11 +3727,11 @@ void ivas_dirac_dec_render_sf( hDirAC->num_freq_bands * hDirAC->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[ch] ); #else - cldfbSynthesis( RealBuffer, - ImagBuffer, - &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), - hDirAC->num_freq_bands * hDirAC->subframe_nbslots, - st_ivas->cldfbSynDec[ch] ); + cldfbSynthesis( RealBuffer, + ImagBuffer, + &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), + hDirAC->num_freq_bands * hDirAC->subframe_nbslots, + st_ivas->cldfbSynDec[ch] ); #endif } } @@ -3742,7 +3742,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) #else - for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ ) + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ ) #endif { mvr2r( Cldfb_RealBuffer[ch][slot_idx], pppQMfFrame_ts_re[ch][slot_idx], hDirAC->num_freq_bands ); @@ -3778,7 +3778,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS const int16_t num_samples_subframe = hDirAC->num_freq_bands * hDirAC->subframe_nbslots[subframe_idx]; #else - const int16_t num_samples_subframe = hDirAC->num_freq_bands * hDirAC->subframe_nbslots; + const int16_t num_samples_subframe = hDirAC->num_freq_bands * hDirAC->subframe_nbslots; #endif /* Move the separated and the LFE channels to temporary variables as spatial synthesis may overwrite current channels */ @@ -3809,7 +3809,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS for ( i = 0; i < hDirAC->subframe_nbslots[subframe_idx]; i++ ) #else - for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) #endif { RealBuffer[i] = Cldfb_RealBuffer[idx_in][i]; @@ -3839,7 +3839,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS for ( i = 0; i < hDirAC->subframe_nbslots[subframe_idx]; i++ ) #else - for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) #endif { RealBuffer[i] = Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS - 1][i]; @@ -3848,7 +3848,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[hDirAC->hOutSetup.nchan_out_woLFE + idx_lfe] ); #else - cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots, st_ivas->cldfbSynDec[hDirAC->hOutSetup.nchan_out_woLFE + idx_lfe] ); + cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots, st_ivas->cldfbSynDec[hDirAC->hOutSetup.nchan_out_woLFE + idx_lfe] ); #endif } else if ( st_ivas->mc_mode == MC_MODE_MCMASA && hDirAC->hOutSetup.separateChannelEnabled ) @@ -3860,7 +3860,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS set_zero( &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->subframe_nbslots[subframe_idx] * hDirAC->num_freq_bands ); #else - set_zero( &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->subframe_nbslots * hDirAC->num_freq_bands ); + set_zero( &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->subframe_nbslots * hDirAC->num_freq_bands ); #endif } @@ -3880,7 +3880,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS for ( i = 0; i < hDirAC->subframe_nbslots[subframe_idx]; i++ ) #else - for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) #endif { RealBuffer[i] = Cldfb_RealBuffer[idx_in][i]; @@ -3889,7 +3889,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[idx_in] ); #else - cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots, st_ivas->cldfbSynDec[idx_in] ); + cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots, st_ivas->cldfbSynDec[idx_in] ); #endif idx_in++; } @@ -4629,8 +4629,8 @@ static void protoSignalComputation4( proto_frame_f[2 * l * num_freq_bands + 2 * k] += RealBuffer[n][0][k] * mtx_hoa_decoder[l * 16 + sba_map_tc_ind[n]]; proto_frame_f[2 * l * num_freq_bands + 2 * k + 1] += ImagBuffer[n][0][k] * mtx_hoa_decoder[l * 16 + sba_map_tc_ind[n]]; #else - proto_frame_f[2 * l * num_freq_bands + 2 * k] += RealBuffer[n][0][k] * mtx_hoa_decoder[l * 16 + sba_map_tc[n]]; - proto_frame_f[2 * l * num_freq_bands + 2 * k + 1] += ImagBuffer[n][0][k] * mtx_hoa_decoder[l * 16 + sba_map_tc[n]]; + proto_frame_f[2 * l * num_freq_bands + 2 * k] += RealBuffer[n][0][k] * mtx_hoa_decoder[l * 16 + sba_map_tc[n]]; + proto_frame_f[2 * l * num_freq_bands + 2 * k + 1] += ImagBuffer[n][0][k] * mtx_hoa_decoder[l * 16 + sba_map_tc[n]]; #endif } } @@ -4773,8 +4773,8 @@ static void computeDirectionAngles( z = *( intensity_real_z++ ) * intensityNorm; } radius = sqrtf( x * x + y * y ); - azimuth[k] = ( int16_t )( max( -180.0f, min( 180.0f, atan2f( y, x ) / EVS_PI * 180.0f ) ) + 0.5f ); - elevation[k] = ( int16_t )( max( -90.0f, min( 180.0f, atan2f( z, radius ) / EVS_PI * 180.0f ) ) + 0.5f ); + azimuth[k] = (int16_t) ( max( -180.0f, min( 180.0f, atan2f( y, x ) / EVS_PI * 180.0f ) ) + 0.5f ); + elevation[k] = (int16_t) ( max( -90.0f, min( 180.0f, atan2f( z, radius ) / EVS_PI * 180.0f ) ) + 0.5f ); } return; @@ -5059,8 +5059,8 @@ static void rotateAziEle_DirAC( dv_r_2 = p_Rmat[6] * dv_0 + p_Rmat[7] * dv_1 + p_Rmat[8] * dv_2; /*Conversion spherical to cartesian coordinates*/ - azi[b] = ( int16_t )( atan2f( dv_r_1, dv_r_0 ) * _180_OVER_PI ); - ele[b] = ( int16_t )( atan2f( dv_r_2, sqrtf( dv_r_0 * dv_r_0 + dv_r_1 * dv_r_1 ) ) * _180_OVER_PI ); + azi[b] = (int16_t) ( atan2f( dv_r_1, dv_r_0 ) * _180_OVER_PI ); + ele[b] = (int16_t) ( atan2f( dv_r_2, sqrtf( dv_r_0 * dv_r_0 + dv_r_1 * dv_r_1 ) ) * _180_OVER_PI ); } pop_wmops(); -- GitLab From 17652aadbef1e93a2b7282e88c2a089806e46332 Mon Sep 17 00:00:00 2001 From: Vidhya V P <100825@ittiam.com> Date: Mon, 15 May 2023 18:52:09 +0530 Subject: [PATCH 170/331] Moved the added test cases in param file [x] Added the new test cases to SBA pytests --- scripts/config/self_test.prm | 7 ----- tests/test_param_file.py | 35 ++------------------- tests/test_sba_bs_dec_plc.py | 19 +++++++++-- tests/test_sba_bs_enc.py | 61 ++++++++++++++++++++++++++++++------ 4 files changed, 70 insertions(+), 52 deletions(-) diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index 5ed7f65782..429abcf2e6 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -649,13 +649,6 @@ ../IVAS_dec HOA3 32 bit testv/stv3OA32c.wav_sw_32-32_DTX_HOA3.tst -// SBA FOA at 13.2 kbps , 32kHz in, 32kHz out, DTX on, BINAURAL out, SID as first frame -../IVAS_cod -dtx -sba 1 13200 32 testv/stvFOA32c.wav bit -../IVAS_dec BINAURAL 32 bit testv/stvFOA32c.wav_BINAURAL_13200_32-32_DTX_SID.tst - -// SBA FOA at 24.4 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL out, SID as first frame -../IVAS_cod -dtx -sba 1 24400 32 testv/stvFOA32c.wav bit -../IVAS_dec BINAURAL 32 bit testv/stvFOA32c.wav_BINAURAL_13200_32-32_DTX_SID.tst // MASA 1dir 1TC at 13.2 kbps, 48kHz in, 48kHz out, BINAURAL out ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 13200 48 testv/stv1MASA1TC48c.wav bit diff --git a/tests/test_param_file.py b/tests/test_param_file.py index 96bb83b1b4..7774d59403 100644 --- a/tests/test_param_file.py +++ b/tests/test_param_file.py @@ -43,7 +43,7 @@ from cmp_pcm import cmp_pcm from cut_pcm import cut_samples from conftest import EncoderFrontend, DecoderFrontend from testconfig import PARAM_FILE -from cut_bs import cut_bs + VALID_DEC_OUTPUT_CONF = [ "MONO", @@ -162,17 +162,6 @@ def test_param_file_tests( sba_br_switching_dtx = 1 cut_file = pre_proc_input(testv_file, fs) testv_file = cut_file - #SID - sba_dtx_first_SID = 0 - if ( - bitrate.isdigit() - and "-dtx" in enc_opts.split() - and "-sba" in enc_opts.split() - and "SID" in tag_str.split('_') - ): - sba_dtx_first_SID = 1 - cut_file = pre_proc_input(testv_file, fs) - testv_file = cut_file # bitrate can be a filename: remove leading "../" if bitrate.startswith("../"): @@ -199,27 +188,7 @@ def test_param_file_tests( enc_split, update_ref, ) - # SID : Update bitstream - if sba_dtx_first_SID == 1: - dut_out_dir = f"{dut_base_path}/param_file/enc" - ref_out_dir = f"{reference_path}/param_file/enc" - ref_out_file = f"{ref_out_dir}/{bitstream_file}" - dut_out_file = f"{dut_out_dir}/{bitstream_file}" - ref_out_file_cut = ref_out_file +"_cut" - dut_out_file_cut = dut_out_file +"_cut" - - if update_ref == 1 or update_ref == 2 and not os.path.exists(ref_out_file): - with open(ref_out_file, "rb") as fp_in: - with open(ref_out_file_cut, "wb") as fp_out: - fr_cnt, cut_cnt = cut_bs(fp_in, fp_out, 0, True) - if update_ref in [0, 2]: - with open(dut_out_file, "rb") as fp_in: - with open(dut_out_file_cut, "wb") as fp_out: - fr_cnt, cut_cnt = cut_bs(fp_in, fp_out, 0, True) - - bitstream_file = bitstream_file +"_cut" - - if sba_br_switching_dtx == 1 or sba_dtx_first_SID == 1: + if sba_br_switching_dtx == 1: is_exist = os.path.exists(cut_file) if is_exist: os.remove(cut_file) diff --git a/tests/test_sba_bs_dec_plc.py b/tests/test_sba_bs_dec_plc.py index 4920a9c59c..47e2c02680 100644 --- a/tests/test_sba_bs_dec_plc.py +++ b/tests/test_sba_bs_dec_plc.py @@ -45,7 +45,7 @@ from conftest import DecoderFrontend tag_list = ['stvFOA'] plc_patterns = ['PLperc12mblen5', 'PLperc40mblen50', 'PLperc42mblen2'] dtx_set = ['0', '1'] -ivas_br_list = ['32000', '64000', '96000', '256000'] +ivas_br_list = ['13200','16400','32000', '64000', '96000', '256000'] sampling_rate_list = ['48', '32', '16'] agc_list = [-1, 0, 1] @@ -89,10 +89,18 @@ def test_sba_plc_system( fs, agc ): - if dtx == '1' and ivas_br not in ['32000', '64000']: + SID = 0 + if dtx == '1' and ivas_br not in ['13200', '64000']: # skip high bitrates for DTX until DTX issue is resolved pytest.skip() - + if ivas_br == '13200' or ivas_br == '16400': + if dtx == '0' and agc == 1: + pytest.skip() + if ivas_br == '13200' or ivas_br == '16400': + if dtx == '1' and agc == 0 and fs != '16': + SID = 1 + else: + pytest.skip() tag = tag + fs + 'c' # dec @@ -106,6 +114,7 @@ def test_sba_plc_system( fs, ivas_br, dtx, + SID, plc_pattern, update_ref, agc, @@ -125,6 +134,7 @@ def sba_dec_plc( sampling_rate, ivas_br, dtx, + SID, plc_pattern, update_ref, agc, @@ -147,6 +157,9 @@ def sba_dec_plc( plc_file = f"{test_vector_path}/{plc_pattern}.g192" ref_in_pkt = f"{reference_path}/sba_bs/pkt/{tag_out}.pkt" ref_in_pkt_dutenc = f"{reference_path}/sba_bs/pkt/{tag_out}_dutenc.pkt" + if SID == 1: + ref_in_pkt = f"{reference_path}/sba_bs/pkt/{tag_out}_SID_cut.pkt" + ref_in_pkt_dutenc = f"{reference_path}/sba_bs/pkt/{tag_out}_SID_dutenc_cut.pkt" dut_out_raw = f"{dut_out_dir}/{plc_tag_out}.raw" ref_out_raw = f"{ref_out_dir}/{plc_tag_out}.raw" diff --git a/tests/test_sba_bs_enc.py b/tests/test_sba_bs_enc.py index 6825ee12ba..6ad6b6e9f3 100644 --- a/tests/test_sba_bs_enc.py +++ b/tests/test_sba_bs_enc.py @@ -42,8 +42,9 @@ import pytest from cmp_pcm import cmp_pcm from cut_pcm import cut_samples from conftest import EncoderFrontend, DecoderFrontend - +from cut_bs import cut_bs # params + tag_list = ['stvFOA'] tag_list_HOA2 = ['stv2OA'] tag_list_HOA3 = ['stv3OA'] @@ -53,7 +54,7 @@ dtx_set = ['0', '1'] dict_fsample_bw = {'48': '3', '32': '2', '16': '1'} dict_bw_idx = {'FB': '3', 'SWB': '2', 'WB': '1'} dict_bw_tag = {'SWB': '_ForceSWB', 'WB': '_ForceWB'} -ivas_br_FOA = ['32000','64000', '96000', '160000', '256000', '384000', '512000','sw_24k4_256k.bin'] +ivas_br_FOA = ['13200','16400','32000','64000', '96000', '160000', '256000', '384000', '512000','sw_24k4_256k.bin'] ivas_br_HOA2 = ['256000', '384000', '512000'] ivas_br_HOA3 = ['256000', '384000', '512000'] @@ -116,6 +117,7 @@ def test_bypass_enc( fs, ivas_br, dtx, + None, max_bw, bypass, agc, @@ -134,6 +136,7 @@ def test_bypass_enc( fs, ivas_br, dtx, + None, max_bw, bypass, agc, @@ -166,12 +169,17 @@ def test_sba_enc_system( fs, agc, ): - if dtx == '1' and ivas_br not in ['32000', '64000']: + SID = 0 + if dtx == '1' and ivas_br not in ['13200', '64000']: # skip high bitrates for DTX until DTX issue is resolved pytest.skip() if ivas_br == 'sw_24k4_256k.bin' and agc != 1: - pytest.skip() - + pytest.skip() + if ivas_br == '13200' or ivas_br == '16400': + if dtx == '1' and agc == 0 and fs != '16': + SID = 1 + else: + pytest.skip() tag = tag + fs + 'c' max_bw = "FB" bypass = -1 @@ -195,6 +203,7 @@ def test_sba_enc_system( fs, ivas_br, dtx, + SID, max_bw, bypass, agc, @@ -215,6 +224,7 @@ def test_sba_enc_system( fs, ivas_br, dtx, + SID, max_bw, bypass, agc, @@ -262,6 +272,7 @@ def test_spar_hoa2_enc_system( fs, ivas_br, dtx, + None, max_bw, bypass, agc, @@ -279,6 +290,7 @@ def test_spar_hoa2_enc_system( fs, ivas_br, dtx, + None, max_bw, bypass, agc, @@ -326,6 +338,7 @@ def test_spar_hoa3_enc_system( fs, ivas_br, dtx, + None, max_bw, bypass, agc, @@ -343,6 +356,7 @@ def test_spar_hoa3_enc_system( fs, ivas_br, dtx, + None, max_bw, bypass, agc, @@ -375,6 +389,8 @@ def test_sba_enc_BWforce_system( if dtx == '1' and ivas_br not in ['32000', '64000']: # skip high bitrates for DTX until DTX issue is resolved pytest.skip() + if ivas_br == '13200' or ivas_br == '16400': + pytest.skip() if ivas_br == 'sw_24k4_256k.bin': pytest.skip() fs = sample_rate_bw_idx[0] @@ -397,6 +413,7 @@ def test_sba_enc_BWforce_system( fs, ivas_br, dtx, + None, bw, bypass, agc, @@ -415,6 +432,7 @@ def test_sba_enc_BWforce_system( fs, ivas_br, dtx, + None, bw, bypass, agc, @@ -437,6 +455,7 @@ def sba_enc( sampling_rate, ivas_br, dtx, + SID, ivas_max_bw, bypass, agc, @@ -468,16 +487,23 @@ def sba_enc( short_tag_ext = "" if agc != -1: short_tag_ext += f'_AGC{agc}' + if SID == 1: + short_tag_ext += f'_SID' # we update only bypass = 0/2 (bypass 1 is the same as the baseline) if bypass in [0, 2]: short_tag_ext += f"_pca{bypass}" # to avoid conflicting names in case of parallel test execution, differentiate all cases long_tag_ext = f"_AGC{agc}" if agc != -1 else "_AGC-unspecified" long_tag_ext += f"_pca{bypass}" + if SID == 1: + long_tag_ext += f"_SID" dut_pkt_file = f"{dut_out_dir}/{tag_out}{long_tag_ext}.pkt" ref_pkt_file = f"{ref_out_dir}/{tag_out}{short_tag_ext}.pkt" ref_pkt_file_dutenc = f"{ref_out_dir}/{tag_out}{short_tag_ext}_dutenc.pkt" - + if SID == 1: + dut_pkt_file_cut = f"{dut_out_dir}/{tag_out}{long_tag_ext}_cut.pkt" + ref_pkt_file_cut = f"{ref_out_dir}/{tag_out}{short_tag_ext}_cut.pkt" + ref_pkt_file_dutenc_cut = f"{ref_out_dir}/{tag_out}{short_tag_ext}_dutenc_cut.pkt" input_path = f"{test_vector_path}/{tag_in}{in_extension}" agc_op = agc if agc != -1 else None bypass_mode = bypass if bypass >= 0 else None @@ -539,7 +565,21 @@ def sba_enc( dtx_mode=dtx_mode, ) - + if SID == 1: + if ref_encoder_path: + with open(ref_pkt_file, "rb") as fp_in: + with open(ref_pkt_file_cut, "wb") as fp_out: + fr_cnt, cut_cnt = cut_bs(fp_in, fp_out, 0, True) + with open(ref_pkt_file_dutenc, "rb") as fp_in: + with open(ref_pkt_file_dutenc_cut, "wb") as fp_out: + fr_cnt, cut_cnt = cut_bs(fp_in, fp_out, 0, True) + os.remove(ref_pkt_file) + os.remove(ref_pkt_file_dutenc) + if update_ref == 0: + with open(dut_pkt_file, "rb") as fp_in: + with open(dut_pkt_file_cut, "wb") as fp_out: + fr_cnt, cut_cnt = cut_bs(fp_in, fp_out, 0, True) + os.remove(dut_pkt_file) def sba_dec( decoder_frontend, ref_decoder_path, @@ -549,6 +589,7 @@ def sba_dec( sampling_rate, ivas_br, dtx, + SID, ivas_max_bw, bypass, agc, @@ -571,11 +612,13 @@ def sba_dec( # we update only bypass = 0/2 (bypass 1 is the same as the baseline) if bypass in [0, 2]: short_tag_ext += f"_pca{bypass}" - + if SID == 1: + short_tag_ext += f'_SID_cut' # to avoid conflicting names in case of parallel test execution, differentiate all cases long_tag_ext = f"_AGC{agc}" if agc != -1 else "_AGC-unspecified" long_tag_ext += f"_pca{bypass}" - + if SID == 1: + long_tag_ext += f"_SID_cut" dut_out_dir = f"{dut_base_path}/sba_bs/raw" ref_out_dir = f"{reference_path}/sba_bs/raw" -- GitLab From 44c939b9e6c6930d4c4648c734297bc1fd22dce1 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 15 May 2023 15:57:02 +0200 Subject: [PATCH 171/331] fix compile errors --- lib_dec/ivas_dirac_output_synthesis_dec.c | 11 ------- lib_dec/ivas_sba_dec.c | 4 +-- lib_dec/ivas_spar_decoder.c | 35 +++++++++++------------ 3 files changed, 19 insertions(+), 31 deletions(-) diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c index 465be590d5..4728b786fc 100755 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -730,17 +730,6 @@ void ivas_dirac_dec_output_synthesis_process_slot( #ifdef HODIRAC , hodirac_flag - ); -#else - ivas_dirac_dec_compute_directional_responses( hDirAC, - hVBAPdata, - NULL, - NULL, - 2, - p_Rmat -#ifdef HODIRAC - , - 0 #endif ); #endif diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 9aac38052d..0dcaec91da 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -401,7 +401,7 @@ ivas_error ivas_sba_dec_reconfigure( else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) { tc_nchan_to_allocate = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order -#ifdef SPAR_TUNING +#ifdef HODIRAC , st_ivas->hDecoderConfig->ivas_total_brate #endif @@ -498,7 +498,7 @@ void ivas_sba_dec_render( hSpar = st_ivas->hSpar; nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order -#ifdef SPAR_TUNING +#ifdef HODIRAC , st_ivas->hDecoderConfig->ivas_total_brate #endif diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 8ad8164b94..567dec439f 100755 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -78,12 +78,12 @@ ivas_error ivas_spar_dec_open( error = IVAS_ERR_OK; sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); - num_channels_internal = ivas_sba_get_nchan_metadata( sba_order_internal -#ifdef HODIRAC - , - st_ivas->hDecoderConfig->ivas_total_brate + +#ifndef HODRIAC + num_channels_internal = ivas_sba_get_nchan_metadata( sba_order_internal ); +#else + num_channels_internal = ivas_sba_get_nchan_metadata( sba_order_internal, st_ivas->hDecoderConfig->ivas_total_brate ); #endif - ); hSpar = st_ivas->hSpar; @@ -328,7 +328,7 @@ ivas_error ivas_spar_dec( bit_stream_orig = st0->bit_stream; next_bit_pos_orig = st0->next_bit_pos; - last_bit_pos = (int16_t) ( ( hDecoderConfig->ivas_total_brate / FRAMES_PER_SEC ) - 1 ); + last_bit_pos = ( int16_t )( ( hDecoderConfig->ivas_total_brate / FRAMES_PER_SEC ) - 1 ); if ( !st0->bfi && hDecoderConfig->ivas_total_brate == IVAS_SID_5k2 ) { last_bit_pos -= SID_FORMAT_NBITS; @@ -356,7 +356,7 @@ ivas_error ivas_spar_dec( { int16_t zero_pad_bits; *nb_bits_read += SID_FORMAT_NBITS; - zero_pad_bits = (int16_t) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - *nb_bits_read; + zero_pad_bits = ( int16_t )( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - *nb_bits_read; assert( zero_pad_bits <= 1 ); *nb_bits_read += zero_pad_bits; } @@ -537,7 +537,7 @@ void ivas_spar_get_cldfb_gains( weights = hSpar->hFbMixer->cldfb_cross_fade; cf_cldfb_start = (int16_t) ceil( ( cf_start - decfb_delay / 2 ) / (float) stride - 0.5f ); - cf_cldfb_end = (int16_t) ( ( cf_start - decfb_delay / 2 + cf_len ) / (float) stride - 0.5f ); + cf_cldfb_end = ( int16_t )( ( cf_start - decfb_delay / 2 + cf_len ) / (float) stride - 0.5f ); num_cf_slots = cf_cldfb_end - cf_cldfb_start + 1; num_samples = num_cf_slots * stride + pt_len - stride; @@ -855,7 +855,7 @@ static float ivas_spar_get_cldfb_slot_gain( encfb_delay = IVAS_FB_ENC_DELAY_NS; decfb_delay = IVAS_FB_DEC_DELAY_NS; xfade_start_ns = hSpar->hFbMixer->cross_fade_start_offset / output_Fs * 1000000000.f - encfb_delay + decfb_delay * 0.5f; - xfade_delay_subframes = (int16_t) ( xfade_start_ns / ( FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ) ); + xfade_delay_subframes = ( int16_t )( xfade_start_ns / ( FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ) ); i_hist = 4 - xfade_delay_subframes; split_band = SPAR_DIRAC_SPLIT_START_BAND; @@ -1150,7 +1150,7 @@ void ivas_spar_dec_agc_pca( if ( hSpar->hMdDec->td_decorr_flag ) { num_in_ingest = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order -#ifdef SPAR_TUNING +#ifdef HODIRAC , st_ivas->hDecoderConfig->ivas_total_brate #endif @@ -1225,7 +1225,7 @@ void ivas_spar_dec_set_render_params( nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, st_ivas->bfi -#ifdef SPAR_TUNING +#ifdef HODIRAC , ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate ) #endif @@ -1254,10 +1254,10 @@ void ivas_spar_dec_digest_tc( int16_t nchan_internal, ch; int16_t nSamplesLeftForTD, default_frame; /* TD decorrelator */ - default_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + default_frame = ( int16_t )( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); nSamplesLeftForTD = nSamplesForRendering; nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order -#ifdef SPAR_TUNING +#ifdef HODIRAC , st_ivas->hDecoderConfig->ivas_total_brate #endif @@ -1272,7 +1272,7 @@ void ivas_spar_dec_digest_tc( { int16_t nSamplesToDecorr = min( nSamplesLeftForTD, default_frame ); ivas_td_decorr_process( hSpar->hTdDecorr, p_tc, pPcm_tmp, nSamplesToDecorr ); -#ifdef SPAR_TUNING +#ifdef HODIRAC if ( hSpar->hTdDecorr->num_apd_outputs >= ( nchan_internal - nchan_transport ) ) { for ( ch = 0; ch < nchan_internal - nchan_transport; ch++ ) @@ -1349,7 +1349,7 @@ void ivas_spar_dec_upmixer( if ( hSpar->hMdDec->td_decorr_flag ) { ivas_td_decorr_process( hSpar->hTdDecorr, st_ivas->hTcBuffer->tc, pPcm_tmp, output_frame ); -#ifdef SPAR_TUNING +#ifdef HODIRAC if ( hSpar->hTdDecorr->num_apd_outputs >= ( nchan_internal - nchan_transport ) ) { for ( i = 0; i < nchan_internal - nchan_transport; i++ ) @@ -1502,8 +1502,7 @@ void ivas_spar_dec_upmixer( for ( i = 0; i < nchan_transport; i++ ) { tmp = roundf( output[i][j] * PCM16_TO_FLT_FAC ); - pcm = ( tmp > MAX16B_FLT ) ? MAX16B : ( tmp < MIN16B_FLT ) ? MIN16B - : (short) tmp; + pcm = ( tmp > MAX16B_FLT ) ? MAX16B : ( tmp < MIN16B_FLT ) ? MIN16B : (short) tmp; dbgwrite( &pcm, sizeof( int16_t ), 1, 1, "dmx_dec.raw" ); } } @@ -1831,7 +1830,7 @@ void ivas_spar_dec_upmixer( /* we have crossed an unadapted parameter sf border, update previous mixing matrices */ int16_t md_sf = md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME; split_band = SPAR_DIRAC_SPLIT_START_BAND; -#ifdef SPAR_TUNING +#ifdef HODIRAC md_sf = ( num_md_sub_frames == MAX_PARAM_SPATIAL_SUBFRAMES ) ? md_sf : 0; #endif if ( split_band < IVAS_MAX_NUM_BANDS ) -- GitLab From a3cf297b8641341bd0e37b453134ccfbebbb35dd Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 15 May 2023 16:12:32 +0200 Subject: [PATCH 172/331] fix compile error --- lib_dec/ivas_spar_decoder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 567dec439f..0579e7d0bf 100755 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -79,7 +79,7 @@ ivas_error ivas_spar_dec_open( error = IVAS_ERR_OK; sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); -#ifndef HODRIAC +#ifndef HODIRAC num_channels_internal = ivas_sba_get_nchan_metadata( sba_order_internal ); #else num_channels_internal = ivas_sba_get_nchan_metadata( sba_order_internal, st_ivas->hDecoderConfig->ivas_total_brate ); -- GitLab From 740814d0beb09f76faba233c3c1c84a2344d1ad5 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Mon, 15 May 2023 16:34:06 +0200 Subject: [PATCH 173/331] fix for JBM EVS BE --- lib_dec/jbm_pcmdsp_apa.c | 45 +++++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/lib_dec/jbm_pcmdsp_apa.c b/lib_dec/jbm_pcmdsp_apa.c index 713c2327a0..c224b4cfbf 100644 --- a/lib_dec/jbm_pcmdsp_apa.c +++ b/lib_dec/jbm_pcmdsp_apa.c @@ -1237,22 +1237,27 @@ static bool shrink_frm( energy = -65; quality = 5; #ifdef JBM_TSM_ON_TCS - xtract = maxScaling; - /* take samples already in the renderer buf into account */ - xtract += ps->l_r_buf; - /* snap to renderer time slot borders */ - xtract -= ( ps->l_ts - ( l_frm - xtract + ps->l_r_buf ) % ps->l_ts ); - while ( xtract < 0 ) + if ( ps->evs_compat_mode == false ) { - xtract += ps->l_ts; - } - while ( xtract > ( s_end - ps->num_channels ) ) - { - /* exceeded the possible shrinking, go back one renderer ts*/ - xtract -= ps->l_ts; + + xtract = maxScaling; + /* take samples already in the renderer buf into account */ + xtract += ps->l_r_buf; + /* snap to renderer time slot borders */ + xtract -= ( ps->l_ts - ( l_frm - xtract + ps->l_r_buf ) % ps->l_ts ); + while ( xtract < 0 ) + { + xtract += ps->l_ts; + } + while ( xtract > ( s_end - ps->num_channels ) ) + { + /* exceeded the possible shrinking, go back one renderer ts*/ + xtract -= ps->l_ts; + } } -#else - if ( maxScaling != 0U && s_end > maxScaling + 1 ) + else +#endif + if ( maxScaling != 0U && s_end > maxScaling + 1 ) { xtract = maxScaling; } @@ -1261,7 +1266,6 @@ static bool shrink_frm( /* set to last valid element (i.e. element[len - 1] but note for stereo last element is last pair of samples) */ xtract = s_end - ps->num_channels; } -#endif } else { @@ -1485,10 +1489,13 @@ static bool extend_frm( quality = 5; xtract[n] = s_start + ps->num_channels; #ifdef JBM_TSM_ON_TCS - /* take renderer buffer samples into accout */ - xtract[n] += ps->l_r_buf; - /* snap to next renderer time slot border to resynchronize */ - xtract[n] -= ( ( N - 1 ) * l_seg - xtract[n] + ps->l_r_buf ) % ps->l_ts; + if ( ps->evs_compat_mode == false ) + { + /* take renderer buffer samples into accout */ + xtract[n] += ps->l_r_buf; + /* snap to next renderer time slot border to resynchronize */ + xtract[n] -= ( ( N - 1 ) * l_seg - xtract[n] + ps->l_r_buf ) % ps->l_ts; + } #endif } else -- GitLab From 0b4b1f9d9e3124073180ee8ac5b7a6ef73fa3686 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 15 May 2023 16:44:16 +0200 Subject: [PATCH 174/331] fix formatting --- lib_dec/ivas_dirac_dec.c | 40 +++++++++++------------ lib_dec/ivas_dirac_output_synthesis_dec.c | 2 +- lib_dec/ivas_spar_decoder.c | 15 +++++---- 3 files changed, 29 insertions(+), 28 deletions(-) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index bde57cd067..c5485119ba 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -3404,8 +3404,8 @@ void ivas_dirac_dec_render_sf( st_ivas->hHeadTrackData->shd_rot_max_order, p_Rmat #ifdef HODIRAC - , - hodirac_flag + , + hodirac_flag #endif ); } @@ -3423,8 +3423,8 @@ void ivas_dirac_dec_render_sf( 0, NULL #ifdef HODIRAC - , - hodirac_flag + , + hodirac_flag #endif ); } @@ -3572,21 +3572,21 @@ void ivas_dirac_dec_render_sf( #ifdef HODIRAC case 11: #endif - case 8: - case 6: - case 4: - protoSignalComputation4( Cldfb_RealBuffer, Cldfb_ImagBuffer, - hDirAC->proto_frame_f, - hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f, - reference_power, - hDirAC->h_output_synthesis_psd_state.proto_power_smooth, - slot_idx, hDirAC->num_outputs_diff, - hDirAC->num_freq_bands, - hDirAC->hoa_decoder, - nchan_transport + case 8: + case 6: + case 4: + protoSignalComputation4( Cldfb_RealBuffer, Cldfb_ImagBuffer, + hDirAC->proto_frame_f, + hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f, + reference_power, + hDirAC->h_output_synthesis_psd_state.proto_power_smooth, + slot_idx, hDirAC->num_outputs_diff, + hDirAC->num_freq_bands, + hDirAC->hoa_decoder, + nchan_transport #ifdef HODIRAC - , - hDirAC->sba_map_tc + , + hDirAC->sba_map_tc #endif ); break; @@ -3842,7 +3842,7 @@ void ivas_dirac_dec_render_sf( nchan_transport, md_idx, #ifdef HODIRAC - hodirac_flag + hodirac_flag #endif ); @@ -3862,7 +3862,7 @@ void ivas_dirac_dec_render_sf( nchan_transport, md_idx, #ifdef HODIRAC - hodirac_flag + hodirac_flag #endif ); } diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c index 4728b786fc..f88b5f5f3a 100755 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -597,7 +597,7 @@ void ivas_dirac_dec_output_synthesis_process_slot( #endif #ifdef HODIRAC , - const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ #endif ) { diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 0579e7d0bf..d1104594a1 100755 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -82,7 +82,7 @@ ivas_error ivas_spar_dec_open( #ifndef HODIRAC num_channels_internal = ivas_sba_get_nchan_metadata( sba_order_internal ); #else - num_channels_internal = ivas_sba_get_nchan_metadata( sba_order_internal, st_ivas->hDecoderConfig->ivas_total_brate ); + num_channels_internal = ivas_sba_get_nchan_metadata( sba_order_internal, st_ivas->hDecoderConfig->ivas_total_brate ); #endif hSpar = st_ivas->hSpar; @@ -328,7 +328,7 @@ ivas_error ivas_spar_dec( bit_stream_orig = st0->bit_stream; next_bit_pos_orig = st0->next_bit_pos; - last_bit_pos = ( int16_t )( ( hDecoderConfig->ivas_total_brate / FRAMES_PER_SEC ) - 1 ); + last_bit_pos = (int16_t) ( ( hDecoderConfig->ivas_total_brate / FRAMES_PER_SEC ) - 1 ); if ( !st0->bfi && hDecoderConfig->ivas_total_brate == IVAS_SID_5k2 ) { last_bit_pos -= SID_FORMAT_NBITS; @@ -356,7 +356,7 @@ ivas_error ivas_spar_dec( { int16_t zero_pad_bits; *nb_bits_read += SID_FORMAT_NBITS; - zero_pad_bits = ( int16_t )( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - *nb_bits_read; + zero_pad_bits = (int16_t) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - *nb_bits_read; assert( zero_pad_bits <= 1 ); *nb_bits_read += zero_pad_bits; } @@ -537,7 +537,7 @@ void ivas_spar_get_cldfb_gains( weights = hSpar->hFbMixer->cldfb_cross_fade; cf_cldfb_start = (int16_t) ceil( ( cf_start - decfb_delay / 2 ) / (float) stride - 0.5f ); - cf_cldfb_end = ( int16_t )( ( cf_start - decfb_delay / 2 + cf_len ) / (float) stride - 0.5f ); + cf_cldfb_end = (int16_t) ( ( cf_start - decfb_delay / 2 + cf_len ) / (float) stride - 0.5f ); num_cf_slots = cf_cldfb_end - cf_cldfb_start + 1; num_samples = num_cf_slots * stride + pt_len - stride; @@ -855,7 +855,7 @@ static float ivas_spar_get_cldfb_slot_gain( encfb_delay = IVAS_FB_ENC_DELAY_NS; decfb_delay = IVAS_FB_DEC_DELAY_NS; xfade_start_ns = hSpar->hFbMixer->cross_fade_start_offset / output_Fs * 1000000000.f - encfb_delay + decfb_delay * 0.5f; - xfade_delay_subframes = ( int16_t )( xfade_start_ns / ( FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ) ); + xfade_delay_subframes = (int16_t) ( xfade_start_ns / ( FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ) ); i_hist = 4 - xfade_delay_subframes; split_band = SPAR_DIRAC_SPLIT_START_BAND; @@ -1254,7 +1254,7 @@ void ivas_spar_dec_digest_tc( int16_t nchan_internal, ch; int16_t nSamplesLeftForTD, default_frame; /* TD decorrelator */ - default_frame = ( int16_t )( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + default_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); nSamplesLeftForTD = nSamplesForRendering; nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order #ifdef HODIRAC @@ -1502,7 +1502,8 @@ void ivas_spar_dec_upmixer( for ( i = 0; i < nchan_transport; i++ ) { tmp = roundf( output[i][j] * PCM16_TO_FLT_FAC ); - pcm = ( tmp > MAX16B_FLT ) ? MAX16B : ( tmp < MIN16B_FLT ) ? MIN16B : (short) tmp; + pcm = ( tmp > MAX16B_FLT ) ? MAX16B : ( tmp < MIN16B_FLT ) ? MIN16B + : (short) tmp; dbgwrite( &pcm, sizeof( int16_t ), 1, 1, "dmx_dec.raw" ); } } -- GitLab From ed32cc34ec9628e14c7e53d7617f7321055dc48c Mon Sep 17 00:00:00 2001 From: Vidhya V P <100825@ittiam.com> Date: Tue, 16 May 2023 12:29:14 +0530 Subject: [PATCH 175/331] Revoked a few changes [x] To avoid unnecessary skipping of test cases. --- tests/test_sba_bs_dec_plc.py | 2 +- tests/test_sba_bs_enc.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_sba_bs_dec_plc.py b/tests/test_sba_bs_dec_plc.py index 47e2c02680..46139da622 100644 --- a/tests/test_sba_bs_dec_plc.py +++ b/tests/test_sba_bs_dec_plc.py @@ -90,7 +90,7 @@ def test_sba_plc_system( agc ): SID = 0 - if dtx == '1' and ivas_br not in ['13200', '64000']: + if dtx == '1' and ivas_br not in ['13200','16400','32000', '64000']: # skip high bitrates for DTX until DTX issue is resolved pytest.skip() if ivas_br == '13200' or ivas_br == '16400': diff --git a/tests/test_sba_bs_enc.py b/tests/test_sba_bs_enc.py index 6ad6b6e9f3..9f0a6fed36 100644 --- a/tests/test_sba_bs_enc.py +++ b/tests/test_sba_bs_enc.py @@ -170,7 +170,7 @@ def test_sba_enc_system( agc, ): SID = 0 - if dtx == '1' and ivas_br not in ['13200', '64000']: + if dtx == '1' and ivas_br not in ['13200','16400','32000','64000']: # skip high bitrates for DTX until DTX issue is resolved pytest.skip() if ivas_br == 'sw_24k4_256k.bin' and agc != 1: @@ -386,7 +386,7 @@ def test_sba_enc_BWforce_system( tag, sample_rate_bw_idx, ): - if dtx == '1' and ivas_br not in ['32000', '64000']: + if dtx == '1' and ivas_br not in ['32000','64000']: # skip high bitrates for DTX until DTX issue is resolved pytest.skip() if ivas_br == '13200' or ivas_br == '16400': -- GitLab From 7a2a54c2286f8d6d077b39de5d9b1af34cfe5fbf Mon Sep 17 00:00:00 2001 From: Vidhya V P <100825@ittiam.com> Date: Tue, 16 May 2023 12:58:17 +0530 Subject: [PATCH 176/331] Resolving merge conflicts --- lib_rend/ivas_dirac_dec_binaural_functions.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 182f15668f..06fd160bb2 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -3579,12 +3579,9 @@ static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( const uint8_t slotEnd, const uint8_t nBins, #endif -<<<<<<< HEAD -======= #ifdef JBM_TSM_ON_TCS const int16_t nSlots, #endif ->>>>>>> main float Rmat[3][3] ) { #ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS -- GitLab From b0f7b2b46d0ae57b191ca41a93a0b499d1345aeb Mon Sep 17 00:00:00 2001 From: Vidhya V P <100825@ittiam.com> Date: Tue, 16 May 2023 13:30:28 +0530 Subject: [PATCH 177/331] Minor clean-up changes --- tests/test_sba_bs_dec_plc.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/test_sba_bs_dec_plc.py b/tests/test_sba_bs_dec_plc.py index 46139da622..8dae57823f 100644 --- a/tests/test_sba_bs_dec_plc.py +++ b/tests/test_sba_bs_dec_plc.py @@ -93,9 +93,6 @@ def test_sba_plc_system( if dtx == '1' and ivas_br not in ['13200','16400','32000', '64000']: # skip high bitrates for DTX until DTX issue is resolved pytest.skip() - if ivas_br == '13200' or ivas_br == '16400': - if dtx == '0' and agc == 1: - pytest.skip() if ivas_br == '13200' or ivas_br == '16400': if dtx == '1' and agc == 0 and fs != '16': SID = 1 -- GitLab From 0b89205060702911b010d6787683218928fc9a1b Mon Sep 17 00:00:00 2001 From: emerit Date: Tue, 16 May 2023 11:33:45 +0200 Subject: [PATCH 178/331] correct wrong csv file uploaded --- .../testv/stvISM_with_no_diegetic_switch.csv | 3000 ++++++++--------- 1 file changed, 1500 insertions(+), 1500 deletions(-) diff --git a/scripts/testv/stvISM_with_no_diegetic_switch.csv b/scripts/testv/stvISM_with_no_diegetic_switch.csv index 35698d046f..ee0e797637 100644 --- a/scripts/testv/stvISM_with_no_diegetic_switch.csv +++ b/scripts/testv/stvISM_with_no_diegetic_switch.csv @@ -1,1500 +1,1500 @@ -0.00,4.80,16.00,0.00,1.00,0.00,0.00 -0.00,9.60,15.98,0.00,1.00,-177.60,4.80 -0.00,14.40,15.96,0.00,1.00,4.80,9.60 -0.00,19.20,15.94,0.00,1.00,-168.00,14.40 -0.00,24.00,15.91,0.00,1.00,14.40,19.20 -0.00,28.80,15.89,0.00,1.00,-163.20,24.00 -0.00,33.60,15.87,0.00,1.00,19.20,28.80 -0.00,38.40,15.85,0.00,1.00,-153.60,33.60 -0.00,43.20,15.83,0.00,1.00,28.80,38.40 -0.00,48.00,15.81,0.00,1.00,-148.80,43.20 -0.00,52.80,15.79,0.00,1.00,38.40,48.00 -0.00,57.60,15.77,0.00,1.00,-139.20,52.80 -0.00,62.40,15.74,0.00,1.00,48.00,57.60 -4.80,67.20,15.72,0.00,1.00,-124.80,62.40 -4.80,72.00,15.70,0.00,1.00,57.60,67.20 -4.80,76.80,15.68,0.00,1.00,-115.20,72.00 -9.60,81.60,15.66,0.00,1.00,72.00,76.80 -19.20,86.40,15.64,0.00,1.00,-100.80,81.60 -134.40,86.40,15.62,0.00,1.00,86.40,86.40 -168.00,81.60,15.59,0.00,1.00,-86.40,89.20 -172.80,76.80,15.57,0.00,1.00,100.80,86.40 -177.60,72.00,15.55,0.00,1.00,-76.80,81.60 -177.60,67.20,15.53,0.00,1.00,110.40,76.80 -177.60,62.40,15.51,0.00,1.00,-62.40,72.00 -177.60,57.60,15.49,0.00,1.00,124.80,67.20 -177.60,52.80,15.47,0.00,1.00,-52.80,62.40 -177.60,48.00,15.44,0.00,1.00,134.40,57.60 -177.60,43.20,15.42,0.00,1.00,-38.40,52.80 -177.60,38.40,15.40,0.00,1.00,144.00,48.00 -177.60,33.60,15.38,0.00,1.00,-33.60,43.20 -177.60,28.80,15.36,0.00,1.00,153.60,38.40 -177.60,24.00,15.34,0.00,1.00,-24.00,33.60 -177.60,19.20,15.32,0.00,1.00,158.40,28.80 -177.60,14.40,15.30,0.00,1.00,-14.40,24.00 -177.60,9.60,15.27,0.00,1.00,168.00,19.20 -177.60,4.80,15.25,0.00,1.00,-9.60,14.40 -177.60,0.00,15.23,0.00,1.00,172.80,9.60 --177.60,-0.00,15.21,0.00,1.00,-0.00,4.80 --177.60,-4.80,15.19,0.00,1.00,-177.60,-0.00 --177.60,-9.60,15.17,0.00,1.00,4.80,-4.80 --177.60,-14.40,15.15,0.00,1.00,-172.80,-9.60 --177.60,-19.20,15.12,0.00,1.00,14.40,-14.40 --177.60,-24.00,15.10,0.00,1.00,-163.20,-19.20 --177.60,-28.80,15.08,0.00,1.00,19.20,-24.00 --177.60,-33.60,15.06,0.00,1.00,-158.40,-28.80 --177.60,-38.40,15.04,0.00,1.00,28.80,-33.60 --177.60,-43.20,15.02,0.00,1.00,-148.80,-38.40 --177.60,-48.00,15.00,0.00,1.00,33.60,-48.00 --177.60,-52.80,14.97,0.00,1.00,-139.20,-48.00 --177.60,-57.60,14.95,0.00,1.00,43.20,-52.80 --177.60,-62.40,14.93,0.00,1.00,-129.60,-57.60 --177.60,-67.20,14.91,0.00,1.00,57.60,-62.40 --177.60,-72.00,14.89,0.00,1.00,-120.00,-67.20 --172.80,-76.80,14.87,0.00,1.00,67.20,-76.80 --168.00,-81.60,14.85,0.00,1.00,-105.60,-76.80 --134.40,-86.40,14.83,0.00,1.00,81.60,-86.40 --19.20,-86.40,14.80,0.00,1.00,-91.20,-89.20 --9.60,-81.60,14.78,0.00,1.00,96.00,-86.40 --4.80,-76.80,14.76,0.00,1.00,-76.80,-81.60 --4.80,-72.00,14.74,0.00,1.00,110.40,-76.80 --4.80,-67.20,14.72,0.00,1.00,-67.20,-72.00 --0.00,-62.40,14.70,0.00,1.00,120.00,-67.20 --0.00,-57.60,14.68,0.00,1.00,-52.80,-62.40 --0.00,-52.80,14.65,0.00,1.00,129.60,-57.60 --0.00,-48.00,14.63,0.00,1.00,-43.20,-52.80 --0.00,-43.20,14.61,0.00,1.00,144.00,-48.00 --0.00,-38.40,14.59,0.00,1.00,-33.60,-43.20 --0.00,-33.60,14.57,0.00,1.00,148.80,-38.40 --0.00,-28.80,14.55,0.00,1.00,-24.00,-33.60 --0.00,-24.00,14.53,0.00,1.00,158.40,-28.80 --0.00,-19.20,14.50,0.00,1.00,-19.20,-24.00 --0.00,-14.40,14.48,0.00,1.00,168.00,-19.20 --0.00,-9.60,14.46,0.00,1.00,-9.60,-14.40 --0.00,-4.80,14.44,0.00,1.00,172.80,-9.60 --0.00,0.00,14.42,0.00,1.00,-4.80,-4.80 --0.00,4.80,14.40,0.00,1.00,0.00,0.00 --0.00,9.60,14.38,0.00,1.00,-177.60,4.80 --0.00,14.40,14.36,0.00,1.00,9.60,9.60 --0.00,19.20,14.33,0.00,1.00,-168.00,14.40 --0.00,24.00,14.31,0.00,1.00,14.40,19.20 --0.00,28.80,14.29,0.00,1.00,-163.20,24.00 --0.00,33.60,14.27,0.00,1.00,24.00,28.80 --4.80,38.40,14.25,0.00,1.00,-153.60,33.60 --4.80,43.20,14.23,0.00,1.00,28.80,38.40 --4.80,48.00,14.21,0.00,1.00,-144.00,43.20 --4.80,52.80,14.18,0.00,1.00,38.40,48.00 --4.80,57.60,14.16,0.00,1.00,-134.40,52.80 --4.80,62.40,14.14,0.00,1.00,48.00,57.60 --9.60,67.20,14.12,0.00,1.00,-124.80,62.40 --9.60,72.00,14.10,0.00,1.00,62.40,67.20 --14.40,76.80,14.08,0.00,1.00,-115.20,72.00 --24.00,81.60,14.06,0.00,1.00,72.00,76.80 --43.20,86.40,14.03,0.00,1.00,-100.80,81.60 --110.40,86.40,14.01,0.00,1.00,86.40,86.40 --148.80,81.60,13.99,0.00,1.00,-86.40,86.40 --163.20,76.80,13.97,0.00,1.00,96.00,81.60 --168.00,72.00,13.95,0.00,1.00,-76.80,76.80 --172.80,67.20,13.93,0.00,1.00,110.40,72.00 --172.80,62.40,13.91,0.00,1.00,-62.40,67.20 --172.80,57.60,13.89,0.00,1.00,120.00,62.40 --172.80,52.80,13.86,0.00,1.00,-52.80,57.60 --177.60,48.00,13.84,0.00,1.00,134.40,52.80 --177.60,43.20,13.82,0.00,1.00,-43.20,48.00 --177.60,38.40,13.80,0.00,1.00,144.00,43.20 --177.60,33.60,13.78,0.00,1.00,-33.60,38.40 --177.60,28.80,13.76,0.00,1.00,148.80,33.60 --177.60,24.00,13.74,0.00,1.00,-24.00,28.80 --177.60,19.20,13.71,0.00,1.00,158.40,24.00 --177.60,14.40,13.69,0.00,1.00,-19.20,19.20 --177.60,9.60,13.67,0.00,1.00,168.00,14.40 --177.60,4.80,13.65,0.00,1.00,-9.60,9.60 --177.60,0.00,13.63,0.00,1.00,172.80,4.80 -177.60,-0.00,13.61,0.00,1.00,-0.00,0.00 -177.60,-4.80,13.59,0.00,1.00,-177.60,-0.00 -177.60,-9.60,13.56,0.00,1.00,4.80,-4.80 -177.60,-14.40,13.54,0.00,1.00,-172.80,-9.60 -177.60,-19.20,13.52,0.00,1.00,14.40,-14.40 -177.60,-24.00,13.50,0.00,1.00,-163.20,-19.20 -177.60,-28.80,13.48,0.00,1.00,19.20,-24.00 -177.60,-33.60,13.46,0.00,1.00,-153.60,-28.80 -177.60,-38.40,13.44,0.00,1.00,28.80,-33.60 -177.60,-43.20,13.42,0.00,1.00,-148.80,-38.40 -177.60,-48.00,13.39,0.00,1.00,38.40,-43.20 -172.80,-52.80,13.37,0.00,1.00,-139.20,-48.00 -172.80,-57.60,13.35,0.00,1.00,48.00,-52.80 -172.80,-62.40,13.33,0.00,1.00,-124.80,-57.60 -172.80,-67.20,13.31,0.00,1.00,57.60,-62.40 -168.00,-72.00,13.29,0.00,1.00,-115.20,-67.20 -163.20,-76.80,13.27,0.00,1.00,72.00,-72.00 -148.80,-81.60,13.24,0.00,1.00,-105.60,-76.80 -110.40,-86.40,13.22,0.00,1.00,81.60,-81.60 -43.20,-86.40,13.20,0.00,1.00,-91.20,-86.40 -24.00,-81.60,13.18,0.00,1.00,96.00,-86.40 -14.40,-76.80,13.16,0.00,1.00,-76.80,-81.60 -9.60,-72.00,13.14,0.00,1.00,105.60,-76.80 -9.60,-67.20,13.12,0.00,1.00,-67.20,-72.00 -4.80,-62.40,13.09,0.00,1.00,120.00,-67.20 -4.80,-57.60,13.07,0.00,1.00,-57.60,-62.40 -4.80,-52.80,13.05,0.00,1.00,129.60,-57.60 -4.80,-48.00,13.03,0.00,1.00,-43.20,-52.80 -4.80,-43.20,13.01,0.00,1.00,139.20,-48.00 -4.80,-38.40,12.99,0.00,1.00,-33.60,-43.20 -0.00,-33.60,12.97,0.00,1.00,148.80,-38.40 -0.00,-28.80,12.95,0.00,1.00,-28.80,-33.60 -0.00,-24.00,12.92,0.00,1.00,158.40,-28.80 -0.00,-19.20,12.90,0.00,1.00,-19.20,-24.00 -0.00,-14.40,12.88,0.00,1.00,163.20,-19.20 -0.00,-9.60,12.86,0.00,1.00,-9.60,-14.40 -0.00,-4.80,12.84,0.00,1.00,172.80,-9.60 -0.00,0.00,12.82,0.00,1.00,-4.80,-4.80 --0.00,4.80,12.80,0.00,1.00,0.00,0.00 --0.00,9.60,12.77,0.00,1.00,-177.60,4.80 --0.00,14.40,12.75,0.00,1.00,9.60,9.60 --4.80,19.20,12.73,0.00,1.00,-168.00,14.40 --4.80,24.00,12.71,0.00,1.00,14.40,19.20 --4.80,28.80,12.69,0.00,1.00,-158.40,24.00 --4.80,33.60,12.67,0.00,1.00,24.00,28.80 --4.80,38.40,12.65,0.00,1.00,-153.60,33.60 --9.60,43.20,12.62,0.00,1.00,33.60,38.40 --9.60,48.00,12.60,0.00,1.00,-144.00,43.20 --9.60,52.80,12.58,0.00,1.00,43.20,48.00 --14.40,57.60,12.56,0.00,1.00,-134.40,52.80 --14.40,62.40,12.54,0.00,1.00,52.80,57.60 --19.20,67.20,12.52,0.00,1.00,-124.80,62.40 --24.00,72.00,12.50,0.00,1.00,62.40,67.20 --33.60,72.00,12.48,0.00,1.00,-110.40,72.00 --43.20,76.80,12.45,0.00,1.00,72.00,72.00 --67.20,81.60,12.43,0.00,1.00,-100.80,76.80 --96.00,81.60,12.41,0.00,1.00,86.40,81.60 --124.80,81.60,12.39,0.00,1.00,-86.40,81.60 --144.00,76.80,12.37,0.00,1.00,96.00,76.80 --153.60,72.00,12.35,0.00,1.00,-76.80,76.80 --158.40,67.20,12.33,0.00,1.00,110.40,72.00 --163.20,62.40,12.30,0.00,1.00,-67.20,67.20 --168.00,57.60,12.28,0.00,1.00,120.00,62.40 --168.00,52.80,12.26,0.00,1.00,-52.80,57.60 --168.00,48.00,12.24,0.00,1.00,129.60,52.80 --172.80,43.20,12.22,0.00,1.00,-43.20,48.00 --172.80,38.40,12.20,0.00,1.00,139.20,43.20 --172.80,33.60,12.18,0.00,1.00,-33.60,38.40 --172.80,28.80,12.15,0.00,1.00,148.80,33.60 --177.60,24.00,12.13,0.00,1.00,-24.00,28.80 --177.60,19.20,12.11,0.00,1.00,158.40,24.00 --177.60,14.40,12.09,0.00,1.00,-19.20,19.20 --177.60,9.60,12.07,0.00,1.00,168.00,14.40 --177.60,4.80,12.05,0.00,1.00,-9.60,9.60 --177.60,0.00,12.03,0.00,1.00,172.80,4.80 -177.60,-0.00,12.01,0.00,1.00,-0.00,0.00 -177.60,-4.80,11.98,0.00,1.00,-177.60,-0.00 -177.60,-9.60,11.96,0.00,1.00,4.80,-4.80 -177.60,-14.40,11.94,0.00,1.00,-168.00,-9.60 -177.60,-19.20,11.92,0.00,1.00,14.40,-14.40 -177.60,-24.00,11.90,0.00,1.00,-163.20,-19.20 -172.80,-28.80,11.88,0.00,1.00,24.00,-24.00 -172.80,-33.60,11.86,0.00,1.00,-153.60,-28.80 -172.80,-38.40,11.83,0.00,1.00,28.80,-33.60 -172.80,-43.20,11.81,0.00,1.00,-144.00,-38.40 -168.00,-48.00,11.79,0.00,1.00,38.40,-43.20 -168.00,-52.80,11.77,0.00,1.00,-134.40,-48.00 -168.00,-57.60,11.75,0.00,1.00,48.00,-52.80 -163.20,-62.40,11.73,0.00,1.00,-124.80,-57.60 -158.40,-67.20,11.71,0.00,1.00,62.40,-62.40 -153.60,-72.00,11.68,0.00,1.00,-115.20,-67.20 -144.00,-76.80,11.66,0.00,1.00,72.00,-72.00 -124.80,-81.60,11.64,0.00,1.00,-100.80,-76.80 -96.00,-81.60,11.62,0.00,1.00,81.60,-76.80 -67.20,-81.60,11.60,0.00,1.00,-91.20,-81.60 -43.20,-76.80,11.58,0.00,1.00,96.00,-81.60 -33.60,-72.00,11.56,0.00,1.00,-81.60,-76.80 -24.00,-72.00,11.54,0.00,1.00,105.60,-72.00 -19.20,-67.20,11.51,0.00,1.00,-67.20,-72.00 -14.40,-62.40,11.49,0.00,1.00,115.20,-67.20 -14.40,-57.60,11.47,0.00,1.00,-57.60,-62.40 -9.60,-52.80,11.45,0.00,1.00,129.60,-57.60 -9.60,-48.00,11.43,0.00,1.00,-48.00,-52.80 -9.60,-43.20,11.41,0.00,1.00,139.20,-48.00 -4.80,-38.40,11.39,0.00,1.00,-38.40,-43.20 -4.80,-33.60,11.36,0.00,1.00,148.80,-38.40 -4.80,-28.80,11.34,0.00,1.00,-28.80,-33.60 -4.80,-24.00,11.32,0.00,1.00,153.60,-28.80 -4.80,-19.20,11.30,0.00,1.00,-19.20,-24.00 -0.00,-14.40,11.28,0.00,1.00,163.20,-19.20 -0.00,-9.60,11.26,0.00,1.00,-9.60,-14.40 -0.00,-4.80,11.24,0.00,1.00,172.80,-9.60 -0.00,0.00,11.21,0.00,1.00,-4.80,-4.80 --0.00,4.80,11.19,0.00,1.00,0.00,0.00 --0.00,9.60,11.17,0.00,1.00,-177.60,4.80 --4.80,14.40,11.15,0.00,1.00,9.60,9.60 --4.80,19.20,11.13,0.00,1.00,-168.00,14.40 --4.80,24.00,11.11,0.00,1.00,14.40,19.20 --4.80,28.80,11.09,0.00,1.00,-158.40,24.00 --9.60,33.60,11.07,0.00,1.00,24.00,28.80 --9.60,38.40,11.04,0.00,1.00,-148.80,33.60 --14.40,43.20,11.02,0.00,1.00,33.60,38.40 --14.40,48.00,11.00,0.00,1.00,-139.20,43.20 --14.40,52.80,10.98,0.00,1.00,43.20,48.00 --19.20,57.60,10.96,0.00,1.00,-129.60,52.80 --24.00,57.60,10.94,0.00,1.00,52.80,52.80 --28.80,62.40,10.92,0.00,1.00,-120.00,57.60 --33.60,67.20,10.89,0.00,1.00,62.40,62.40 --43.20,72.00,10.87,0.00,1.00,-110.40,67.20 --57.60,72.00,10.85,0.00,1.00,76.80,72.00 --76.80,76.80,10.83,0.00,1.00,-100.80,72.00 --96.00,76.80,10.81,0.00,1.00,86.40,76.80 --115.20,76.80,10.79,0.00,1.00,-86.40,76.80 --129.60,72.00,10.77,0.00,1.00,96.00,76.80 --139.20,72.00,10.74,0.00,1.00,-76.80,72.00 --148.80,67.20,10.72,0.00,1.00,105.60,67.20 --153.60,62.40,10.70,0.00,1.00,-67.20,67.20 --158.40,57.60,10.68,0.00,1.00,120.00,62.40 --163.20,52.80,10.66,0.00,1.00,-57.60,57.60 --163.20,48.00,10.64,0.00,1.00,129.60,52.80 --168.00,43.20,10.62,0.00,1.00,-48.00,48.00 --168.00,38.40,10.60,0.00,1.00,139.20,43.20 --172.80,33.60,10.57,0.00,1.00,-38.40,38.40 --172.80,28.80,10.55,0.00,1.00,148.80,33.60 --172.80,24.00,10.53,0.00,1.00,-28.80,28.80 --172.80,19.20,10.51,0.00,1.00,158.40,24.00 --177.60,14.40,10.49,0.00,1.00,-19.20,19.20 --177.60,9.60,10.47,0.00,1.00,163.20,14.40 --177.60,4.80,10.45,0.00,1.00,-9.60,9.60 --177.60,0.00,10.42,0.00,1.00,172.80,4.80 -177.60,-0.00,10.40,0.00,1.00,-0.00,0.00 -177.60,-4.80,10.38,0.00,1.00,-177.60,-0.00 -177.60,-9.60,10.36,0.00,1.00,4.80,-4.80 -177.60,-14.40,10.34,0.00,1.00,-168.00,-9.60 -172.80,-19.20,10.32,0.00,1.00,14.40,-14.40 -172.80,-24.00,10.30,0.00,1.00,-163.20,-19.20 -172.80,-28.80,10.28,0.00,1.00,24.00,-24.00 -172.80,-33.60,10.25,0.00,1.00,-153.60,-28.80 -168.00,-38.40,10.23,0.00,1.00,33.60,-33.60 -168.00,-43.20,10.21,0.00,1.00,-144.00,-38.40 -163.20,-48.00,10.19,0.00,1.00,43.20,-43.20 -163.20,-52.80,10.17,0.00,1.00,-134.40,-48.00 -158.40,-57.60,10.15,0.00,1.00,52.80,-52.80 -153.60,-62.40,10.13,0.00,1.00,-124.80,-57.60 -148.80,-67.20,10.10,0.00,1.00,62.40,-62.40 -139.20,-72.00,10.08,0.00,1.00,-115.20,-67.20 -129.60,-72.00,10.06,0.00,1.00,72.00,-67.20 -115.20,-76.80,10.04,0.00,1.00,-100.80,-72.00 -96.00,-76.80,10.02,0.00,1.00,81.60,-76.80 -76.80,-76.80,10.00,0.00,1.00,-91.20,-76.80 -57.60,-72.00,9.98,0.00,1.00,96.00,-76.80 -43.20,-72.00,9.95,0.00,1.00,-81.60,-72.00 -33.60,-67.20,9.93,0.00,1.00,105.60,-72.00 -28.80,-62.40,9.91,0.00,1.00,-67.20,-67.20 -24.00,-57.60,9.89,0.00,1.00,115.20,-62.40 -19.20,-57.60,9.87,0.00,1.00,-57.60,-57.60 -14.40,-52.80,9.85,0.00,1.00,124.80,-52.80 -14.40,-48.00,9.83,0.00,1.00,-48.00,-52.80 -14.40,-43.20,9.81,0.00,1.00,134.40,-48.00 -9.60,-38.40,9.78,0.00,1.00,-38.40,-43.20 -9.60,-33.60,9.76,0.00,1.00,144.00,-38.40 -4.80,-28.80,9.74,0.00,1.00,-28.80,-33.60 -4.80,-24.00,9.72,0.00,1.00,153.60,-28.80 -4.80,-19.20,9.70,0.00,1.00,-19.20,-24.00 -4.80,-14.40,9.68,0.00,1.00,163.20,-19.20 -0.00,-9.60,9.66,0.00,1.00,-14.40,-14.40 -0.00,-4.80,9.63,0.00,1.00,172.80,-9.60 -0.00,0.00,9.61,0.00,1.00,-4.80,-4.80 --0.00,4.80,9.59,0.00,1.00,0.00,0.00 --4.80,9.60,9.57,0.00,1.00,-177.60,4.80 --4.80,14.40,9.55,0.00,1.00,9.60,9.60 --4.80,19.20,9.53,0.00,1.00,-168.00,14.40 --9.60,24.00,9.51,0.00,1.00,19.20,19.20 --9.60,28.80,9.48,0.00,1.00,-158.40,24.00 --9.60,33.60,9.46,0.00,1.00,24.00,28.80 --14.40,38.40,9.44,0.00,1.00,-148.80,33.60 --14.40,38.40,9.42,0.00,1.00,33.60,33.60 --19.20,43.20,9.40,0.00,1.00,-139.20,38.40 --24.00,48.00,9.38,0.00,1.00,43.20,43.20 --24.00,52.80,9.36,0.00,1.00,-129.60,48.00 --28.80,57.60,9.34,0.00,1.00,52.80,52.80 --38.40,62.40,9.31,0.00,1.00,-120.00,57.60 --43.20,62.40,9.29,0.00,1.00,67.20,62.40 --52.80,67.20,9.27,0.00,1.00,-110.40,62.40 --62.40,72.00,9.25,0.00,1.00,76.80,67.20 --76.80,72.00,9.23,0.00,1.00,-100.80,67.20 --96.00,72.00,9.21,0.00,1.00,86.40,72.00 --110.40,72.00,9.19,0.00,1.00,-86.40,72.00 --120.00,67.20,9.16,0.00,1.00,96.00,72.00 --134.40,67.20,9.14,0.00,1.00,-76.80,67.20 --139.20,62.40,9.12,0.00,1.00,105.60,67.20 --148.80,57.60,9.10,0.00,1.00,-67.20,62.40 --153.60,57.60,9.08,0.00,1.00,115.20,57.60 --158.40,52.80,9.06,0.00,1.00,-57.60,52.80 --158.40,48.00,9.04,0.00,1.00,129.60,52.80 --163.20,43.20,9.01,0.00,1.00,-48.00,48.00 --163.20,38.40,8.99,0.00,1.00,139.20,43.20 --168.00,33.60,8.97,0.00,1.00,-38.40,38.40 --168.00,28.80,8.95,0.00,1.00,148.80,33.60 --172.80,24.00,8.93,0.00,1.00,-28.80,28.80 --172.80,19.20,8.91,0.00,1.00,153.60,24.00 --172.80,14.40,8.89,0.00,1.00,-19.20,19.20 --177.60,9.60,8.87,0.00,1.00,163.20,14.40 --177.60,4.80,8.84,0.00,1.00,-9.60,9.60 --177.60,0.00,8.82,0.00,1.00,172.80,4.80 -177.60,-0.00,8.80,0.00,1.00,-0.00,0.00 -177.60,-4.80,8.78,0.00,1.00,-177.60,-0.00 -177.60,-9.60,8.76,0.00,1.00,4.80,-4.80 -172.80,-14.40,8.74,0.00,1.00,-168.00,-9.60 -172.80,-19.20,8.72,0.00,1.00,14.40,-14.40 -172.80,-24.00,8.69,0.00,1.00,-158.40,-19.20 -168.00,-28.80,8.67,0.00,1.00,24.00,-24.00 -168.00,-33.60,8.65,0.00,1.00,-153.60,-28.80 -163.20,-38.40,8.63,0.00,1.00,33.60,-33.60 -163.20,-43.20,8.61,0.00,1.00,-144.00,-38.40 -158.40,-48.00,8.59,0.00,1.00,43.20,-43.20 -158.40,-52.80,8.57,0.00,1.00,-134.40,-48.00 -153.60,-57.60,8.54,0.00,1.00,52.80,-52.80 -148.80,-57.60,8.52,0.00,1.00,-124.80,-52.80 -139.20,-62.40,8.50,0.00,1.00,62.40,-57.60 -134.40,-67.20,8.48,0.00,1.00,-110.40,-62.40 -120.00,-67.20,8.46,0.00,1.00,72.00,-67.20 -110.40,-72.00,8.44,0.00,1.00,-100.80,-67.20 -96.00,-72.00,8.42,0.00,1.00,81.60,-72.00 -76.80,-72.00,8.40,0.00,1.00,-91.20,-72.00 -62.40,-72.00,8.37,0.00,1.00,96.00,-72.00 -52.80,-67.20,8.35,0.00,1.00,-81.60,-67.20 -43.20,-62.40,8.33,0.00,1.00,105.60,-67.20 -38.40,-62.40,8.31,0.00,1.00,-72.00,-62.40 -28.80,-57.60,8.29,0.00,1.00,115.20,-62.40 -24.00,-52.80,8.27,0.00,1.00,-57.60,-57.60 -24.00,-48.00,8.25,0.00,1.00,124.80,-52.80 -19.20,-43.20,8.22,0.00,1.00,-48.00,-48.00 -14.40,-38.40,8.20,0.00,1.00,134.40,-43.20 -14.40,-38.40,8.18,0.00,1.00,-38.40,-38.40 -9.60,-33.60,8.16,0.00,1.00,144.00,-33.60 -9.60,-28.80,8.14,0.00,1.00,-28.80,-33.60 -9.60,-24.00,8.12,0.00,1.00,153.60,-28.80 -4.80,-19.20,8.10,0.00,1.00,-24.00,-24.00 -4.80,-14.40,8.07,0.00,1.00,163.20,-19.20 -4.80,-9.60,8.05,0.00,1.00,-14.40,-14.40 -0.00,-4.80,8.03,0.00,1.00,172.80,-9.60 -0.00,0.00,8.01,0.00,1.00,-4.80,-4.80 --0.00,4.80,7.99,0.00,1.00,0.00,0.00 --4.80,9.60,7.97,0.00,1.00,-177.60,4.80 --4.80,14.40,7.95,0.00,1.00,9.60,9.60 --9.60,19.20,7.93,0.00,1.00,-168.00,14.40 --9.60,24.00,7.90,0.00,1.00,19.20,19.20 --14.40,24.00,7.88,0.00,1.00,-158.40,24.00 --14.40,28.80,7.86,0.00,1.00,28.80,24.00 --19.20,33.60,7.84,0.00,1.00,-148.80,28.80 --19.20,38.40,7.82,0.00,1.00,38.40,33.60 --24.00,43.20,7.80,0.00,1.00,-139.20,38.40 --28.80,48.00,7.78,0.00,1.00,48.00,43.20 --33.60,52.80,7.75,0.00,1.00,-129.60,48.00 --38.40,52.80,7.73,0.00,1.00,57.60,52.80 --43.20,57.60,7.71,0.00,1.00,-120.00,52.80 --48.00,62.40,7.69,0.00,1.00,67.20,57.60 --57.60,62.40,7.67,0.00,1.00,-110.40,62.40 --67.20,67.20,7.65,0.00,1.00,76.80,62.40 --81.60,67.20,7.63,0.00,1.00,-100.80,62.40 --91.20,67.20,7.60,0.00,1.00,86.40,67.20 --105.60,67.20,7.58,0.00,1.00,-86.40,67.20 --115.20,67.20,7.56,0.00,1.00,96.00,67.20 --124.80,62.40,7.54,0.00,1.00,-76.80,62.40 --134.40,57.60,7.52,0.00,1.00,105.60,62.40 --139.20,57.60,7.50,0.00,1.00,-67.20,57.60 --144.00,52.80,7.48,0.00,1.00,115.20,57.60 --148.80,48.00,7.46,0.00,1.00,-57.60,52.80 --153.60,43.20,7.43,0.00,1.00,124.80,48.00 --158.40,43.20,7.41,0.00,1.00,-48.00,43.20 --163.20,38.40,7.39,0.00,1.00,134.40,38.40 --163.20,33.60,7.37,0.00,1.00,-38.40,38.40 --168.00,28.80,7.35,0.00,1.00,144.00,33.60 --168.00,24.00,7.33,0.00,1.00,-28.80,28.80 --172.80,19.20,7.31,0.00,1.00,153.60,24.00 --172.80,14.40,7.28,0.00,1.00,-19.20,19.20 --177.60,9.60,7.26,0.00,1.00,163.20,14.40 --177.60,4.80,7.24,0.00,1.00,-9.60,9.60 --177.60,0.00,7.22,0.00,1.00,172.80,4.80 -177.60,-0.00,7.20,0.00,1.00,-0.00,0.00 -177.60,-4.80,7.18,0.00,1.00,-177.60,-0.00 -177.60,-9.60,7.16,0.00,1.00,4.80,-4.80 -172.80,-14.40,7.13,0.00,1.00,-168.00,-9.60 -172.80,-19.20,7.11,0.00,1.00,14.40,-14.40 -168.00,-24.00,7.09,0.00,1.00,-158.40,-19.20 -168.00,-28.80,7.07,0.00,1.00,24.00,-24.00 -163.20,-33.60,7.05,0.00,1.00,-148.80,-28.80 -163.20,-38.40,7.03,0.00,1.00,33.60,-33.60 -158.40,-43.20,7.01,0.00,1.00,-139.20,-38.40 -153.60,-43.20,6.99,0.00,1.00,43.20,-38.40 -148.80,-48.00,6.96,0.00,1.00,-129.60,-43.20 -144.00,-52.80,6.94,0.00,1.00,52.80,-48.00 -139.20,-57.60,6.92,0.00,1.00,-120.00,-52.80 -134.40,-57.60,6.90,0.00,1.00,62.40,-57.60 -124.80,-62.40,6.88,0.00,1.00,-110.40,-57.60 -115.20,-67.20,6.86,0.00,1.00,72.00,-62.40 -105.60,-67.20,6.84,0.00,1.00,-100.80,-62.40 -91.20,-67.20,6.81,0.00,1.00,81.60,-67.20 -81.60,-67.20,6.79,0.00,1.00,-91.20,-67.20 -67.20,-67.20,6.77,0.00,1.00,96.00,-67.20 -57.60,-62.40,6.75,0.00,1.00,-81.60,-62.40 -48.00,-62.40,6.73,0.00,1.00,105.60,-62.40 -43.20,-57.60,6.71,0.00,1.00,-72.00,-62.40 -38.40,-52.80,6.69,0.00,1.00,115.20,-57.60 -33.60,-52.80,6.66,0.00,1.00,-62.40,-52.80 -28.80,-48.00,6.64,0.00,1.00,124.80,-52.80 -24.00,-43.20,6.62,0.00,1.00,-52.80,-48.00 -19.20,-38.40,6.60,0.00,1.00,134.40,-43.20 -19.20,-33.60,6.58,0.00,1.00,-43.20,-38.40 -14.40,-28.80,6.56,0.00,1.00,144.00,-33.60 -14.40,-24.00,6.54,0.00,1.00,-33.60,-28.80 -9.60,-24.00,6.52,0.00,1.00,153.60,-24.00 -9.60,-19.20,6.49,0.00,1.00,-24.00,-24.00 -4.80,-14.40,6.47,0.00,1.00,163.20,-19.20 -4.80,-9.60,6.45,0.00,1.00,-14.40,-14.40 -0.00,-4.80,6.43,0.00,1.00,172.80,-9.60 -0.00,0.00,6.41,0.00,1.00,-4.80,-4.80 --0.00,4.80,6.39,0.00,1.00,0.00,0.00 --4.80,9.60,6.37,0.00,1.00,-177.60,4.80 --4.80,14.40,6.34,0.00,1.00,9.60,9.60 --9.60,19.20,6.32,0.00,1.00,-168.00,14.40 --9.60,19.20,6.30,0.00,1.00,19.20,14.40 --14.40,24.00,6.28,0.00,1.00,-158.40,19.20 --19.20,28.80,6.26,0.00,1.00,28.80,24.00 --19.20,33.60,6.24,0.00,1.00,-148.80,28.80 --24.00,38.40,6.22,0.00,1.00,38.40,33.60 --28.80,43.20,6.19,0.00,1.00,-139.20,38.40 --33.60,43.20,6.17,0.00,1.00,48.00,38.40 --38.40,48.00,6.15,0.00,1.00,-129.60,43.20 --43.20,52.80,6.13,0.00,1.00,57.60,48.00 --48.00,52.80,6.11,0.00,1.00,-120.00,52.80 --52.80,57.60,6.09,0.00,1.00,67.20,52.80 --62.40,57.60,6.07,0.00,1.00,-110.40,57.60 --72.00,62.40,6.05,0.00,1.00,76.80,57.60 --81.60,62.40,6.02,0.00,1.00,-100.80,62.40 --91.20,62.40,6.00,0.00,1.00,86.40,62.40 --100.80,62.40,5.98,0.00,1.00,-86.40,62.40 --110.40,62.40,5.96,0.00,1.00,96.00,62.40 --120.00,57.60,5.94,0.00,1.00,-76.80,57.60 --129.60,57.60,5.92,0.00,1.00,105.60,57.60 --134.40,52.80,5.90,0.00,1.00,-67.20,57.60 --139.20,48.00,5.87,0.00,1.00,115.20,52.80 --144.00,48.00,5.85,0.00,1.00,-57.60,48.00 --148.80,43.20,5.83,0.00,1.00,124.80,48.00 --153.60,38.40,5.81,0.00,1.00,-48.00,43.20 --158.40,33.60,5.79,0.00,1.00,134.40,38.40 --163.20,33.60,5.77,0.00,1.00,-38.40,33.60 --163.20,28.80,5.75,0.00,1.00,144.00,28.80 --168.00,24.00,5.72,0.00,1.00,-28.80,28.80 --168.00,19.20,5.70,0.00,1.00,153.60,24.00 --172.80,14.40,5.68,0.00,1.00,-19.20,19.20 --172.80,9.60,5.66,0.00,1.00,163.20,14.40 --177.60,4.80,5.64,0.00,1.00,-9.60,9.60 --177.60,0.00,5.62,0.00,1.00,172.80,4.80 -177.60,-0.00,5.60,0.00,1.00,-0.00,0.00 -177.60,-4.80,5.58,0.00,1.00,-177.60,-0.00 -172.80,-9.60,5.55,0.00,1.00,4.80,-4.80 -172.80,-14.40,5.53,0.00,1.00,-168.00,-9.60 -168.00,-19.20,5.51,0.00,1.00,14.40,-14.40 -168.00,-24.00,5.49,0.00,1.00,-158.40,-19.20 -163.20,-28.80,5.47,0.00,1.00,24.00,-24.00 -163.20,-33.60,5.45,0.00,1.00,-148.80,-28.80 -158.40,-33.60,5.43,0.00,1.00,33.60,-28.80 -153.60,-38.40,5.40,0.00,1.00,-139.20,-33.60 -148.80,-43.20,5.38,0.00,1.00,43.20,-38.40 -144.00,-48.00,5.36,0.00,1.00,-129.60,-43.20 -139.20,-48.00,5.34,0.00,1.00,52.80,-48.00 -134.40,-52.80,5.32,0.00,1.00,-120.00,-48.00 -129.60,-57.60,5.30,0.00,1.00,62.40,-52.80 -120.00,-57.60,5.28,0.00,1.00,-110.40,-57.60 -110.40,-62.40,5.26,0.00,1.00,72.00,-57.60 -100.80,-62.40,5.23,0.00,1.00,-100.80,-57.60 -91.20,-62.40,5.21,0.00,1.00,81.60,-62.40 -81.60,-62.40,5.19,0.00,1.00,-91.20,-62.40 -72.00,-62.40,5.17,0.00,1.00,96.00,-62.40 -62.40,-57.60,5.15,0.00,1.00,-81.60,-62.40 -52.80,-57.60,5.13,0.00,1.00,105.60,-57.60 -48.00,-52.80,5.11,0.00,1.00,-72.00,-57.60 -43.20,-52.80,5.08,0.00,1.00,115.20,-52.80 -38.40,-48.00,5.06,0.00,1.00,-62.40,-52.80 -33.60,-43.20,5.04,0.00,1.00,124.80,-48.00 -28.80,-43.20,5.02,0.00,1.00,-52.80,-43.20 -24.00,-38.40,5.00,0.00,1.00,134.40,-38.40 -19.20,-33.60,4.98,0.00,1.00,-43.20,-38.40 -19.20,-28.80,4.96,0.00,1.00,144.00,-33.60 -14.40,-24.00,4.93,0.00,1.00,-33.60,-28.80 -9.60,-19.20,4.91,0.00,1.00,153.60,-24.00 -9.60,-19.20,4.89,0.00,1.00,-24.00,-19.20 -4.80,-14.40,4.87,0.00,1.00,163.20,-14.40 -4.80,-9.60,4.85,0.00,1.00,-14.40,-14.40 -0.00,-4.80,4.83,0.00,1.00,172.80,-9.60 -0.00,0.00,4.81,0.00,1.00,-4.80,-4.80 --4.80,4.80,4.79,0.00,1.00,0.00,0.00 --4.80,9.60,4.76,0.00,1.00,-177.60,4.80 --9.60,14.40,4.74,0.00,1.00,9.60,9.60 --9.60,14.40,4.72,0.00,1.00,-168.00,9.60 --14.40,19.20,4.70,0.00,1.00,19.20,14.40 --14.40,24.00,4.68,0.00,1.00,-158.40,19.20 --19.20,28.80,4.66,0.00,1.00,28.80,24.00 --24.00,33.60,4.64,0.00,1.00,-148.80,28.80 --28.80,33.60,4.61,0.00,1.00,38.40,28.80 --28.80,38.40,4.59,0.00,1.00,-139.20,33.60 --33.60,43.20,4.57,0.00,1.00,48.00,38.40 --38.40,43.20,4.55,0.00,1.00,-129.60,43.20 --48.00,48.00,4.53,0.00,1.00,57.60,43.20 --52.80,52.80,4.51,0.00,1.00,-120.00,48.00 --57.60,52.80,4.49,0.00,1.00,67.20,48.00 --67.20,57.60,4.46,0.00,1.00,-110.40,52.80 --76.80,57.60,4.44,0.00,1.00,76.80,52.80 --81.60,57.60,4.42,0.00,1.00,-100.80,57.60 --91.20,57.60,4.40,0.00,1.00,86.40,57.60 --100.80,57.60,4.38,0.00,1.00,-86.40,57.60 --110.40,57.60,4.36,0.00,1.00,96.00,57.60 --115.20,52.80,4.34,0.00,1.00,-76.80,52.80 --124.80,52.80,4.32,0.00,1.00,105.60,52.80 --129.60,48.00,4.29,0.00,1.00,-67.20,52.80 --139.20,48.00,4.27,0.00,1.00,115.20,48.00 --144.00,43.20,4.25,0.00,1.00,-57.60,48.00 --148.80,38.40,4.23,0.00,1.00,124.80,43.20 --153.60,38.40,4.21,0.00,1.00,-48.00,38.40 --153.60,33.60,4.19,0.00,1.00,134.40,38.40 --158.40,28.80,4.17,0.00,1.00,-38.40,33.60 --163.20,24.00,4.14,0.00,1.00,144.00,28.80 --163.20,24.00,4.12,0.00,1.00,-28.80,24.00 --168.00,19.20,4.10,0.00,1.00,153.60,24.00 --172.80,14.40,4.08,0.00,1.00,-19.20,19.20 --172.80,9.60,4.06,0.00,1.00,163.20,14.40 --177.60,4.80,4.04,0.00,1.00,-9.60,9.60 --177.60,0.00,4.02,0.00,1.00,172.80,4.80 -177.60,-0.00,3.99,0.00,1.00,-0.00,0.00 -177.60,-4.80,3.97,0.00,1.00,-177.60,-0.00 -172.80,-9.60,3.95,0.00,1.00,4.80,-4.80 -172.80,-14.40,3.93,0.00,1.00,-168.00,-9.60 -168.00,-19.20,3.91,0.00,1.00,14.40,-14.40 -163.20,-24.00,3.89,0.00,1.00,-158.40,-19.20 -163.20,-24.00,3.87,0.00,1.00,24.00,-24.00 -158.40,-28.80,3.85,0.00,1.00,-148.80,-24.00 -153.60,-33.60,3.82,0.00,1.00,33.60,-28.80 -153.60,-38.40,3.80,0.00,1.00,-139.20,-33.60 -148.80,-38.40,3.78,0.00,1.00,43.20,-38.40 -144.00,-43.20,3.76,0.00,1.00,-129.60,-38.40 -139.20,-48.00,3.74,0.00,1.00,52.80,-43.20 -129.60,-48.00,3.72,0.00,1.00,-120.00,-48.00 -124.80,-52.80,3.70,0.00,1.00,62.40,-48.00 -115.20,-52.80,3.67,0.00,1.00,-110.40,-52.80 -110.40,-57.60,3.65,0.00,1.00,72.00,-52.80 -100.80,-57.60,3.63,0.00,1.00,-100.80,-52.80 -91.20,-57.60,3.61,0.00,1.00,81.60,-57.60 -81.60,-57.60,3.59,0.00,1.00,-91.20,-57.60 -76.80,-57.60,3.57,0.00,1.00,96.00,-57.60 -67.20,-57.60,3.55,0.00,1.00,-81.60,-57.60 -57.60,-52.80,3.52,0.00,1.00,105.60,-52.80 -52.80,-52.80,3.50,0.00,1.00,-72.00,-52.80 -48.00,-48.00,3.48,0.00,1.00,115.20,-48.00 -38.40,-43.20,3.46,0.00,1.00,-62.40,-48.00 -33.60,-43.20,3.44,0.00,1.00,124.80,-43.20 -28.80,-38.40,3.42,0.00,1.00,-52.80,-43.20 -28.80,-33.60,3.40,0.00,1.00,134.40,-38.40 -24.00,-33.60,3.38,0.00,1.00,-43.20,-33.60 -19.20,-28.80,3.35,0.00,1.00,144.00,-28.80 -14.40,-24.00,3.33,0.00,1.00,-33.60,-28.80 -14.40,-19.20,3.31,0.00,1.00,153.60,-24.00 -9.60,-14.40,3.29,0.00,1.00,-24.00,-19.20 -9.60,-14.40,3.27,0.00,1.00,163.20,-14.40 -4.80,-9.60,3.25,0.00,1.00,-14.40,-9.60 -4.80,-4.80,3.23,0.00,1.00,172.80,-9.60 -0.00,0.00,3.20,0.00,1.00,-4.80,-4.80 --4.80,4.80,3.18,0.00,1.00,0.00,0.00 --4.80,9.60,3.16,0.00,1.00,-177.60,4.80 --9.60,9.60,3.14,0.00,1.00,9.60,9.60 --9.60,14.40,3.12,0.00,1.00,-168.00,9.60 --14.40,19.20,3.10,0.00,1.00,19.20,14.40 --19.20,24.00,3.08,0.00,1.00,-158.40,19.20 --24.00,24.00,3.05,0.00,1.00,28.80,24.00 --24.00,28.80,3.03,0.00,1.00,-148.80,24.00 --28.80,33.60,3.01,0.00,1.00,38.40,28.80 --33.60,38.40,2.99,0.00,1.00,-139.20,33.60 --38.40,38.40,2.97,0.00,1.00,48.00,33.60 --43.20,43.20,2.95,0.00,1.00,-129.60,38.40 --48.00,43.20,2.93,0.00,1.00,57.60,43.20 --52.80,48.00,2.91,0.00,1.00,-120.00,43.20 --62.40,48.00,2.88,0.00,1.00,67.20,48.00 --67.20,52.80,2.86,0.00,1.00,-110.40,48.00 --76.80,52.80,2.84,0.00,1.00,76.80,48.00 --86.40,52.80,2.82,0.00,1.00,-100.80,52.80 --91.20,52.80,2.80,0.00,1.00,86.40,52.80 --100.80,52.80,2.78,0.00,1.00,-86.40,52.80 --105.60,52.80,2.76,0.00,1.00,96.00,52.80 --115.20,48.00,2.73,0.00,1.00,-76.80,48.00 --120.00,48.00,2.71,0.00,1.00,105.60,48.00 --129.60,48.00,2.69,0.00,1.00,-67.20,48.00 --134.40,43.20,2.67,0.00,1.00,115.20,43.20 --139.20,43.20,2.65,0.00,1.00,-57.60,43.20 --144.00,38.40,2.63,0.00,1.00,124.80,38.40 --148.80,33.60,2.61,0.00,1.00,-48.00,38.40 --153.60,33.60,2.58,0.00,1.00,134.40,33.60 --158.40,28.80,2.56,0.00,1.00,-38.40,28.80 --158.40,24.00,2.54,0.00,1.00,144.00,28.80 --163.20,19.20,2.52,0.00,1.00,-28.80,24.00 --168.00,19.20,2.50,0.00,1.00,153.60,19.20 --168.00,14.40,2.48,0.00,1.00,-19.20,14.40 --172.80,9.60,2.46,0.00,1.00,163.20,14.40 --177.60,4.80,2.44,0.00,1.00,-9.60,9.60 --177.60,0.00,2.41,0.00,1.00,172.80,4.80 -177.60,-0.00,2.39,0.00,1.00,-0.00,0.00 -177.60,-4.80,2.37,0.00,1.00,-177.60,-0.00 -172.80,-9.60,2.35,0.00,1.00,4.80,-4.80 -168.00,-14.40,2.33,0.00,1.00,-168.00,-9.60 -168.00,-19.20,2.31,0.00,1.00,14.40,-14.40 -163.20,-19.20,2.29,0.00,1.00,-158.40,-14.40 -158.40,-24.00,2.26,0.00,1.00,24.00,-19.20 -158.40,-28.80,2.24,0.00,1.00,-148.80,-24.00 -153.60,-33.60,2.22,0.00,1.00,33.60,-28.80 -148.80,-33.60,2.20,0.00,1.00,-139.20,-28.80 -144.00,-38.40,2.18,0.00,1.00,43.20,-33.60 -139.20,-43.20,2.16,0.00,1.00,-129.60,-38.40 -134.40,-43.20,2.14,0.00,1.00,52.80,-38.40 -129.60,-48.00,2.11,0.00,1.00,-120.00,-43.20 -120.00,-48.00,2.09,0.00,1.00,62.40,-43.20 -115.20,-48.00,2.07,0.00,1.00,-110.40,-48.00 -105.60,-52.80,2.05,0.00,1.00,72.00,-48.00 -100.80,-52.80,2.03,0.00,1.00,-100.80,-48.00 -91.20,-52.80,2.01,0.00,1.00,81.60,-52.80 -86.40,-52.80,1.99,0.00,1.00,-91.20,-52.80 -76.80,-52.80,1.97,0.00,1.00,96.00,-52.80 -67.20,-52.80,1.94,0.00,1.00,-81.60,-52.80 -62.40,-48.00,1.92,0.00,1.00,105.60,-48.00 -52.80,-48.00,1.90,0.00,1.00,-72.00,-48.00 -48.00,-43.20,1.88,0.00,1.00,115.20,-48.00 -43.20,-43.20,1.86,0.00,1.00,-62.40,-43.20 -38.40,-38.40,1.84,0.00,1.00,124.80,-43.20 -33.60,-38.40,1.82,0.00,1.00,-52.80,-38.40 -28.80,-33.60,1.79,0.00,1.00,134.40,-33.60 -24.00,-28.80,1.77,0.00,1.00,-43.20,-33.60 -24.00,-24.00,1.75,0.00,1.00,144.00,-28.80 -19.20,-24.00,1.73,0.00,1.00,-33.60,-24.00 -14.40,-19.20,1.71,0.00,1.00,153.60,-24.00 -9.60,-14.40,1.69,0.00,1.00,-24.00,-19.20 -9.60,-9.60,1.67,0.00,1.00,163.20,-14.40 -4.80,-9.60,1.64,0.00,1.00,-14.40,-9.60 -4.80,-4.80,1.62,0.00,1.00,172.80,-9.60 -0.00,0.00,1.60,0.00,1.00,-4.80,-4.80 --4.80,4.80,1.58,0.00,1.00,0.00,0.00 --4.80,4.80,1.56,0.00,1.00,-177.60,4.80 --9.60,9.60,1.54,0.00,1.00,9.60,4.80 --14.40,14.40,1.52,0.00,1.00,-168.00,9.60 --14.40,19.20,1.50,0.00,1.00,19.20,14.40 --19.20,19.20,1.47,0.00,1.00,-158.40,19.20 --24.00,24.00,1.45,0.00,1.00,28.80,19.20 --28.80,28.80,1.43,0.00,1.00,-148.80,24.00 --33.60,28.80,1.41,0.00,1.00,38.40,28.80 --38.40,33.60,1.39,0.00,1.00,-139.20,28.80 --43.20,38.40,1.37,0.00,1.00,48.00,33.60 --48.00,38.40,1.35,0.00,1.00,-129.60,33.60 --52.80,43.20,1.32,0.00,1.00,57.60,38.40 --57.60,43.20,1.30,0.00,1.00,-120.00,38.40 --62.40,43.20,1.28,0.00,1.00,67.20,43.20 --72.00,48.00,1.26,0.00,1.00,-110.40,43.20 --76.80,48.00,1.24,0.00,1.00,76.80,43.20 --86.40,48.00,1.22,0.00,1.00,-100.80,48.00 --91.20,48.00,1.20,0.00,1.00,86.40,48.00 --100.80,48.00,1.17,0.00,1.00,-86.40,48.00 --105.60,48.00,1.15,0.00,1.00,96.00,48.00 --110.40,48.00,1.13,0.00,1.00,-76.80,48.00 --120.00,43.20,1.11,0.00,1.00,105.60,43.20 --124.80,43.20,1.09,0.00,1.00,-67.20,43.20 --129.60,38.40,1.07,0.00,1.00,115.20,43.20 --134.40,38.40,1.05,0.00,1.00,-57.60,38.40 --139.20,33.60,1.03,0.00,1.00,124.80,38.40 --144.00,33.60,1.00,0.00,1.00,-48.00,33.60 --148.80,28.80,0.98,0.00,1.00,134.40,33.60 --153.60,24.00,0.96,0.00,1.00,-38.40,28.80 --158.40,24.00,0.94,0.00,1.00,144.00,24.00 --163.20,19.20,0.92,0.00,1.00,-28.80,24.00 --163.20,14.40,0.90,0.00,1.00,153.60,19.20 --168.00,14.40,0.88,0.00,1.00,-19.20,14.40 --172.80,9.60,0.85,0.00,1.00,163.20,14.40 --172.80,4.80,0.83,0.00,1.00,-9.60,9.60 --177.60,0.00,0.81,0.00,1.00,172.80,4.80 -177.60,-0.00,0.79,0.00,1.00,-0.00,0.00 -172.80,-4.80,0.77,0.00,1.00,-177.60,-0.00 -172.80,-9.60,0.75,0.00,1.00,4.80,-4.80 -168.00,-14.40,0.73,0.00,1.00,-168.00,-9.60 -163.20,-14.40,0.70,0.00,1.00,14.40,-14.40 -163.20,-19.20,0.68,0.00,1.00,-158.40,-14.40 -158.40,-24.00,0.66,0.00,1.00,24.00,-19.20 -153.60,-24.00,0.64,0.00,1.00,-148.80,-24.00 -148.80,-28.80,0.62,0.00,1.00,33.60,-24.00 -144.00,-33.60,0.60,0.00,1.00,-139.20,-28.80 -139.20,-33.60,0.58,0.00,1.00,43.20,-33.60 -134.40,-38.40,0.56,0.00,1.00,-129.60,-33.60 -129.60,-38.40,0.53,0.00,1.00,52.80,-38.40 -124.80,-43.20,0.51,0.00,1.00,-120.00,-38.40 -120.00,-43.20,0.49,0.00,1.00,62.40,-43.20 -110.40,-48.00,0.47,0.00,1.00,-110.40,-43.20 -105.60,-48.00,0.45,0.00,1.00,72.00,-43.20 -100.80,-48.00,0.43,0.00,1.00,-100.80,-48.00 -91.20,-48.00,0.41,0.00,1.00,81.60,-48.00 -86.40,-48.00,0.38,0.00,1.00,-91.20,-48.00 -76.80,-48.00,0.36,0.00,1.00,96.00,-48.00 -72.00,-48.00,0.34,0.00,1.00,-81.60,-48.00 -62.40,-43.20,0.32,0.00,1.00,105.60,-43.20 -57.60,-43.20,0.30,0.00,1.00,-72.00,-43.20 -52.80,-43.20,0.28,0.00,1.00,115.20,-43.20 -48.00,-38.40,0.26,0.00,1.00,-62.40,-38.40 -43.20,-38.40,0.23,0.00,1.00,124.80,-38.40 -38.40,-33.60,0.21,0.00,1.00,-52.80,-33.60 -33.60,-28.80,0.19,0.00,1.00,134.40,-33.60 -28.80,-28.80,0.17,0.00,1.00,-43.20,-28.80 -24.00,-24.00,0.15,0.00,1.00,144.00,-28.80 -19.20,-19.20,0.13,0.00,1.00,-33.60,-24.00 -14.40,-19.20,0.11,0.00,1.00,153.60,-19.20 -14.40,-14.40,0.09,0.00,1.00,-24.00,-19.20 -9.60,-9.60,0.06,0.00,1.00,163.20,-14.40 -4.80,-4.80,0.04,0.00,1.00,-14.40,-9.60 -4.80,-4.80,0.02,0.00,1.00,172.80,-4.80 -0.00,0.00,0.00,0.00,1.00,-4.80,-4.80 --4.80,4.80,0.00,0.00,1.00,0.00,0.00 --4.80,4.80,0.02,0.00,1.00,-177.60,4.80 --9.60,9.60,0.04,0.00,1.00,9.60,4.80 --14.40,14.40,0.06,0.00,1.00,-168.00,9.60 --19.20,14.40,0.09,0.00,1.00,19.20,14.40 --24.00,19.20,0.11,0.00,1.00,-158.40,14.40 --24.00,24.00,0.13,0.00,1.00,28.80,19.20 --28.80,24.00,0.15,0.00,1.00,-148.80,24.00 --33.60,28.80,0.17,0.00,1.00,38.40,24.00 --38.40,28.80,0.19,0.00,1.00,-139.20,28.80 --43.20,33.60,0.21,0.00,1.00,48.00,28.80 --48.00,33.60,0.23,0.00,1.00,-129.60,33.60 --52.80,38.40,0.26,0.00,1.00,57.60,33.60 --62.40,38.40,0.28,0.00,1.00,-120.00,38.40 --67.20,38.40,0.30,0.00,1.00,67.20,38.40 --72.00,43.20,0.32,0.00,1.00,-110.40,38.40 --76.80,43.20,0.34,0.00,1.00,76.80,38.40 --86.40,43.20,0.36,0.00,1.00,-100.80,43.20 --91.20,43.20,0.38,0.00,1.00,86.40,43.20 --96.00,43.20,0.41,0.00,1.00,-86.40,43.20 --105.60,43.20,0.43,0.00,1.00,96.00,43.20 --110.40,43.20,0.45,0.00,1.00,-76.80,43.20 --115.20,38.40,0.47,0.00,1.00,105.60,38.40 --124.80,38.40,0.49,0.00,1.00,-67.20,38.40 --129.60,38.40,0.51,0.00,1.00,115.20,38.40 --134.40,33.60,0.53,0.00,1.00,-57.60,33.60 --139.20,33.60,0.56,0.00,1.00,124.80,33.60 --144.00,28.80,0.58,0.00,1.00,-48.00,28.80 --148.80,28.80,0.60,0.00,1.00,134.40,28.80 --153.60,24.00,0.62,0.00,1.00,-38.40,24.00 --158.40,19.20,0.64,0.00,1.00,144.00,24.00 --158.40,19.20,0.66,0.00,1.00,-28.80,19.20 --163.20,14.40,0.68,0.00,1.00,153.60,19.20 --168.00,9.60,0.70,0.00,1.00,-19.20,14.40 --172.80,9.60,0.73,0.00,1.00,163.20,9.60 --172.80,4.80,0.75,0.00,1.00,-9.60,9.60 --177.60,0.00,0.77,0.00,1.00,172.80,4.80 -177.60,-0.00,0.79,0.00,1.00,-0.00,0.00 -172.80,-4.80,0.81,0.00,1.00,-177.60,-0.00 -172.80,-9.60,0.83,0.00,1.00,4.80,-4.80 -168.00,-9.60,0.85,0.00,1.00,-168.00,-9.60 -163.20,-14.40,0.88,0.00,1.00,14.40,-9.60 -158.40,-19.20,0.90,0.00,1.00,-158.40,-14.40 -158.40,-19.20,0.92,0.00,1.00,24.00,-19.20 -153.60,-24.00,0.94,0.00,1.00,-148.80,-19.20 -148.80,-28.80,0.96,0.00,1.00,33.60,-24.00 -144.00,-28.80,0.98,0.00,1.00,-139.20,-24.00 -139.20,-33.60,1.00,0.00,1.00,43.20,-28.80 -134.40,-33.60,1.03,0.00,1.00,-129.60,-28.80 -129.60,-38.40,1.05,0.00,1.00,52.80,-33.60 -124.80,-38.40,1.07,0.00,1.00,-120.00,-33.60 -115.20,-38.40,1.09,0.00,1.00,62.40,-38.40 -110.40,-43.20,1.11,0.00,1.00,-110.40,-38.40 -105.60,-43.20,1.13,0.00,1.00,72.00,-38.40 -96.00,-43.20,1.15,0.00,1.00,-100.80,-43.20 -91.20,-43.20,1.17,0.00,1.00,81.60,-43.20 -86.40,-43.20,1.20,0.00,1.00,-91.20,-43.20 -76.80,-43.20,1.22,0.00,1.00,96.00,-43.20 -72.00,-43.20,1.24,0.00,1.00,-81.60,-43.20 -67.20,-38.40,1.26,0.00,1.00,105.60,-38.40 -62.40,-38.40,1.28,0.00,1.00,-72.00,-38.40 -52.80,-38.40,1.30,0.00,1.00,115.20,-38.40 -48.00,-33.60,1.32,0.00,1.00,-62.40,-38.40 -43.20,-33.60,1.35,0.00,1.00,124.80,-33.60 -38.40,-28.80,1.37,0.00,1.00,-52.80,-33.60 -33.60,-28.80,1.39,0.00,1.00,134.40,-28.80 -28.80,-24.00,1.41,0.00,1.00,-43.20,-28.80 -24.00,-24.00,1.43,0.00,1.00,144.00,-24.00 -24.00,-19.20,1.45,0.00,1.00,-33.60,-24.00 -19.20,-14.40,1.47,0.00,1.00,153.60,-19.20 -14.40,-14.40,1.50,0.00,1.00,-24.00,-14.40 -9.60,-9.60,1.52,0.00,1.00,163.20,-14.40 -4.80,-4.80,1.54,0.00,1.00,-14.40,-9.60 -4.80,-4.80,1.56,0.00,1.00,172.80,-4.80 -0.00,0.00,1.58,0.00,1.00,-4.80,-4.80 --4.80,4.80,1.60,0.00,1.00,0.00,0.00 --9.60,4.80,1.62,0.00,1.00,-177.60,4.80 --9.60,9.60,1.64,0.00,1.00,9.60,4.80 --14.40,9.60,1.67,0.00,1.00,-168.00,9.60 --19.20,14.40,1.69,0.00,1.00,19.20,9.60 --24.00,19.20,1.71,0.00,1.00,-158.40,14.40 --28.80,19.20,1.73,0.00,1.00,28.80,19.20 --33.60,24.00,1.75,0.00,1.00,-148.80,19.20 --38.40,24.00,1.77,0.00,1.00,38.40,24.00 --43.20,28.80,1.79,0.00,1.00,-139.20,24.00 --48.00,28.80,1.82,0.00,1.00,48.00,28.80 --52.80,33.60,1.84,0.00,1.00,-129.60,28.80 --57.60,33.60,1.86,0.00,1.00,57.60,28.80 --62.40,33.60,1.88,0.00,1.00,-120.00,33.60 --67.20,38.40,1.90,0.00,1.00,67.20,33.60 --72.00,38.40,1.92,0.00,1.00,-110.40,33.60 --81.60,38.40,1.94,0.00,1.00,76.80,38.40 --86.40,38.40,1.97,0.00,1.00,-100.80,38.40 --91.20,38.40,1.99,0.00,1.00,86.40,38.40 --96.00,38.40,2.01,0.00,1.00,-86.40,38.40 --105.60,38.40,2.03,0.00,1.00,96.00,38.40 --110.40,38.40,2.05,0.00,1.00,-76.80,38.40 --115.20,33.60,2.07,0.00,1.00,105.60,33.60 --120.00,33.60,2.09,0.00,1.00,-67.20,33.60 --124.80,33.60,2.11,0.00,1.00,115.20,33.60 --129.60,28.80,2.14,0.00,1.00,-57.60,33.60 --134.40,28.80,2.16,0.00,1.00,124.80,28.80 --139.20,24.00,2.18,0.00,1.00,-48.00,28.80 --144.00,24.00,2.20,0.00,1.00,134.40,24.00 --148.80,19.20,2.22,0.00,1.00,-38.40,24.00 --153.60,19.20,2.24,0.00,1.00,144.00,19.20 --158.40,14.40,2.26,0.00,1.00,-28.80,19.20 --163.20,14.40,2.29,0.00,1.00,153.60,14.40 --168.00,9.60,2.31,0.00,1.00,-19.20,14.40 --172.80,9.60,2.33,0.00,1.00,163.20,9.60 --172.80,4.80,2.35,0.00,1.00,-9.60,9.60 --177.60,0.00,2.37,0.00,1.00,172.80,4.80 -177.60,-0.00,2.39,0.00,1.00,-0.00,0.00 -172.80,-4.80,2.41,0.00,1.00,-177.60,-0.00 -172.80,-9.60,2.44,0.00,1.00,4.80,-4.80 -168.00,-9.60,2.46,0.00,1.00,-168.00,-9.60 -163.20,-14.40,2.48,0.00,1.00,14.40,-9.60 -158.40,-14.40,2.50,0.00,1.00,-158.40,-14.40 -153.60,-19.20,2.52,0.00,1.00,24.00,-14.40 -148.80,-19.20,2.54,0.00,1.00,-148.80,-19.20 -144.00,-24.00,2.56,0.00,1.00,33.60,-19.20 -139.20,-24.00,2.58,0.00,1.00,-139.20,-24.00 -134.40,-28.80,2.61,0.00,1.00,43.20,-24.00 -129.60,-28.80,2.63,0.00,1.00,-129.60,-28.80 -124.80,-33.60,2.65,0.00,1.00,52.80,-28.80 -120.00,-33.60,2.67,0.00,1.00,-120.00,-33.60 -115.20,-33.60,2.69,0.00,1.00,62.40,-33.60 -110.40,-38.40,2.71,0.00,1.00,-110.40,-33.60 -105.60,-38.40,2.73,0.00,1.00,72.00,-33.60 -96.00,-38.40,2.76,0.00,1.00,-100.80,-38.40 -91.20,-38.40,2.78,0.00,1.00,81.60,-38.40 -86.40,-38.40,2.80,0.00,1.00,-91.20,-38.40 -81.60,-38.40,2.82,0.00,1.00,96.00,-38.40 -72.00,-38.40,2.84,0.00,1.00,-81.60,-38.40 -67.20,-38.40,2.86,0.00,1.00,105.60,-38.40 -62.40,-33.60,2.88,0.00,1.00,-72.00,-33.60 -57.60,-33.60,2.91,0.00,1.00,115.20,-33.60 -52.80,-33.60,2.93,0.00,1.00,-62.40,-33.60 -48.00,-28.80,2.95,0.00,1.00,124.80,-28.80 -43.20,-28.80,2.97,0.00,1.00,-52.80,-28.80 -38.40,-24.00,2.99,0.00,1.00,134.40,-28.80 -33.60,-24.00,3.01,0.00,1.00,-43.20,-24.00 -28.80,-19.20,3.03,0.00,1.00,144.00,-24.00 -24.00,-19.20,3.05,0.00,1.00,-33.60,-19.20 -19.20,-14.40,3.08,0.00,1.00,153.60,-19.20 -14.40,-9.60,3.10,0.00,1.00,-24.00,-14.40 -9.60,-9.60,3.12,0.00,1.00,163.20,-9.60 -9.60,-4.80,3.14,0.00,1.00,-14.40,-9.60 -4.80,-4.80,3.16,0.00,1.00,172.80,-4.80 -0.00,0.00,3.18,0.00,1.00,-4.80,-4.80 --4.80,4.80,3.20,0.00,1.00,0.00,0.00 --9.60,4.80,3.23,0.00,1.00,-177.60,4.80 --14.40,9.60,3.25,0.00,1.00,9.60,4.80 --14.40,9.60,3.27,0.00,1.00,-168.00,9.60 --19.20,14.40,3.29,0.00,1.00,19.20,9.60 --24.00,14.40,3.31,0.00,1.00,-158.40,14.40 --28.80,19.20,3.33,0.00,1.00,28.80,14.40 --33.60,19.20,3.35,0.00,1.00,-148.80,19.20 --38.40,24.00,3.38,0.00,1.00,38.40,19.20 --43.20,24.00,3.40,0.00,1.00,-139.20,19.20 --48.00,24.00,3.42,0.00,1.00,48.00,24.00 --52.80,28.80,3.44,0.00,1.00,-129.60,24.00 --57.60,28.80,3.46,0.00,1.00,57.60,28.80 --62.40,28.80,3.48,0.00,1.00,-120.00,28.80 --67.20,33.60,3.50,0.00,1.00,67.20,28.80 --72.00,33.60,3.52,0.00,1.00,-110.40,28.80 --81.60,33.60,3.55,0.00,1.00,76.80,33.60 --86.40,33.60,3.57,0.00,1.00,-100.80,33.60 --91.20,33.60,3.59,0.00,1.00,86.40,33.60 --96.00,33.60,3.61,0.00,1.00,-86.40,33.60 --100.80,33.60,3.63,0.00,1.00,96.00,33.60 --110.40,33.60,3.65,0.00,1.00,-76.80,33.60 --115.20,33.60,3.67,0.00,1.00,105.60,28.80 --120.00,28.80,3.70,0.00,1.00,-67.20,28.80 --124.80,28.80,3.72,0.00,1.00,115.20,28.80 --129.60,28.80,3.74,0.00,1.00,-57.60,28.80 --134.40,24.00,3.76,0.00,1.00,124.80,24.00 --139.20,24.00,3.78,0.00,1.00,-48.00,24.00 --144.00,19.20,3.80,0.00,1.00,134.40,24.00 --148.80,19.20,3.82,0.00,1.00,-38.40,19.20 --153.60,14.40,3.85,0.00,1.00,144.00,19.20 --158.40,14.40,3.87,0.00,1.00,-28.80,14.40 --163.20,9.60,3.89,0.00,1.00,153.60,14.40 --168.00,9.60,3.91,0.00,1.00,-19.20,9.60 --168.00,4.80,3.93,0.00,1.00,163.20,9.60 --172.80,4.80,3.95,0.00,1.00,-9.60,4.80 --177.60,0.00,3.97,0.00,1.00,172.80,4.80 -177.60,-0.00,3.99,0.00,1.00,-0.00,0.00 -172.80,-4.80,4.02,0.00,1.00,-177.60,-0.00 -168.00,-4.80,4.04,0.00,1.00,4.80,-4.80 -168.00,-9.60,4.06,0.00,1.00,-168.00,-4.80 -163.20,-9.60,4.08,0.00,1.00,14.40,-9.60 -158.40,-14.40,4.10,0.00,1.00,-158.40,-9.60 -153.60,-14.40,4.12,0.00,1.00,24.00,-14.40 -148.80,-19.20,4.14,0.00,1.00,-148.80,-14.40 -144.00,-19.20,4.17,0.00,1.00,33.60,-19.20 -139.20,-24.00,4.19,0.00,1.00,-139.20,-19.20 -134.40,-24.00,4.21,0.00,1.00,43.20,-24.00 -129.60,-28.80,4.23,0.00,1.00,-129.60,-24.00 -124.80,-28.80,4.25,0.00,1.00,52.80,-24.00 -120.00,-28.80,4.27,0.00,1.00,-120.00,-28.80 -115.20,-33.60,4.29,0.00,1.00,62.40,-28.80 -110.40,-33.60,4.32,0.00,1.00,-110.40,-28.80 -100.80,-33.60,4.34,0.00,1.00,72.00,-28.80 -96.00,-33.60,4.36,0.00,1.00,-100.80,-33.60 -91.20,-33.60,4.38,0.00,1.00,81.60,-33.60 -86.40,-33.60,4.40,0.00,1.00,-91.20,-33.60 -81.60,-33.60,4.42,0.00,1.00,96.00,-33.60 -72.00,-33.60,4.44,0.00,1.00,-81.60,-33.60 -67.20,-33.60,4.46,0.00,1.00,105.60,-33.60 -62.40,-28.80,4.49,0.00,1.00,-72.00,-28.80 -57.60,-28.80,4.51,0.00,1.00,115.20,-28.80 -52.80,-28.80,4.53,0.00,1.00,-62.40,-28.80 -48.00,-24.00,4.55,0.00,1.00,124.80,-28.80 -43.20,-24.00,4.57,0.00,1.00,-52.80,-24.00 -38.40,-24.00,4.59,0.00,1.00,134.40,-24.00 -33.60,-19.20,4.61,0.00,1.00,-43.20,-19.20 -28.80,-19.20,4.64,0.00,1.00,144.00,-19.20 -24.00,-14.40,4.66,0.00,1.00,-33.60,-19.20 -19.20,-14.40,4.68,0.00,1.00,153.60,-14.40 -14.40,-9.60,4.70,0.00,1.00,-24.00,-14.40 -14.40,-9.60,4.72,0.00,1.00,163.20,-9.60 -9.60,-4.80,4.74,0.00,1.00,-14.40,-9.60 -4.80,-4.80,4.76,0.00,1.00,172.80,-4.80 -0.00,0.00,4.79,0.00,1.00,-4.80,-4.80 --4.80,0.00,4.81,0.00,1.00,0.00,0.00 --9.60,4.80,4.83,0.00,1.00,-177.60,0.00 --14.40,4.80,4.85,0.00,1.00,9.60,4.80 --19.20,9.60,4.87,0.00,1.00,-168.00,4.80 --19.20,9.60,4.89,0.00,1.00,19.20,9.60 --24.00,14.40,4.91,0.00,1.00,-158.40,9.60 --28.80,14.40,4.93,0.00,1.00,28.80,14.40 --33.60,19.20,4.96,0.00,1.00,-148.80,14.40 --38.40,19.20,4.98,0.00,1.00,38.40,14.40 --43.20,19.20,5.00,0.00,1.00,-139.20,19.20 --48.00,24.00,5.02,0.00,1.00,48.00,19.20 --52.80,24.00,5.04,0.00,1.00,-129.60,24.00 --57.60,24.00,5.06,0.00,1.00,57.60,24.00 --62.40,24.00,5.08,0.00,1.00,-120.00,24.00 --72.00,28.80,5.11,0.00,1.00,67.20,24.00 --76.80,28.80,5.13,0.00,1.00,-110.40,24.00 --81.60,28.80,5.15,0.00,1.00,76.80,28.80 --86.40,28.80,5.17,0.00,1.00,-100.80,28.80 --91.20,28.80,5.19,0.00,1.00,86.40,28.80 --96.00,28.80,5.21,0.00,1.00,-86.40,28.80 --100.80,28.80,5.23,0.00,1.00,96.00,28.80 --105.60,28.80,5.26,0.00,1.00,-76.80,28.80 --115.20,28.80,5.28,0.00,1.00,105.60,28.80 --120.00,24.00,5.30,0.00,1.00,-67.20,24.00 --124.80,24.00,5.32,0.00,1.00,115.20,24.00 --129.60,24.00,5.34,0.00,1.00,-57.60,24.00 --134.40,24.00,5.36,0.00,1.00,124.80,24.00 --139.20,19.20,5.38,0.00,1.00,-48.00,19.20 --144.00,19.20,5.40,0.00,1.00,134.40,19.20 --148.80,14.40,5.43,0.00,1.00,-38.40,19.20 --153.60,14.40,5.45,0.00,1.00,144.00,14.40 --158.40,14.40,5.47,0.00,1.00,-28.80,14.40 --163.20,9.60,5.49,0.00,1.00,153.60,9.60 --163.20,9.60,5.51,0.00,1.00,-19.20,9.60 --168.00,4.80,5.53,0.00,1.00,163.20,9.60 --172.80,4.80,5.55,0.00,1.00,-9.60,4.80 --177.60,0.00,5.58,0.00,1.00,172.80,4.80 -177.60,-0.00,5.60,0.00,1.00,-0.00,0.00 -172.80,-4.80,5.62,0.00,1.00,-177.60,-0.00 -168.00,-4.80,5.64,0.00,1.00,4.80,-4.80 -163.20,-9.60,5.66,0.00,1.00,-168.00,-4.80 -163.20,-9.60,5.68,0.00,1.00,14.40,-9.60 -158.40,-14.40,5.70,0.00,1.00,-158.40,-9.60 -153.60,-14.40,5.72,0.00,1.00,24.00,-9.60 -148.80,-14.40,5.75,0.00,1.00,-148.80,-14.40 -144.00,-19.20,5.77,0.00,1.00,33.60,-14.40 -139.20,-19.20,5.79,0.00,1.00,-139.20,-19.20 -134.40,-24.00,5.81,0.00,1.00,43.20,-19.20 -129.60,-24.00,5.83,0.00,1.00,-129.60,-19.20 -124.80,-24.00,5.85,0.00,1.00,52.80,-24.00 -120.00,-24.00,5.87,0.00,1.00,-120.00,-24.00 -115.20,-28.80,5.90,0.00,1.00,62.40,-24.00 -105.60,-28.80,5.92,0.00,1.00,-110.40,-24.00 -100.80,-28.80,5.94,0.00,1.00,72.00,-28.80 -96.00,-28.80,5.96,0.00,1.00,-100.80,-28.80 -91.20,-28.80,5.98,0.00,1.00,81.60,-28.80 -86.40,-28.80,6.00,0.00,1.00,-91.20,-28.80 -81.60,-28.80,6.02,0.00,1.00,96.00,-28.80 -76.80,-28.80,6.05,0.00,1.00,-81.60,-28.80 -72.00,-28.80,6.07,0.00,1.00,105.60,-28.80 -62.40,-24.00,6.09,0.00,1.00,-72.00,-24.00 -57.60,-24.00,6.11,0.00,1.00,115.20,-24.00 -52.80,-24.00,6.13,0.00,1.00,-62.40,-24.00 -48.00,-24.00,6.15,0.00,1.00,124.80,-24.00 -43.20,-19.20,6.17,0.00,1.00,-52.80,-24.00 -38.40,-19.20,6.19,0.00,1.00,134.40,-19.20 -33.60,-19.20,6.22,0.00,1.00,-43.20,-19.20 -28.80,-14.40,6.24,0.00,1.00,144.00,-14.40 -24.00,-14.40,6.26,0.00,1.00,-33.60,-14.40 -19.20,-9.60,6.28,0.00,1.00,153.60,-14.40 -19.20,-9.60,6.30,0.00,1.00,-24.00,-9.60 -14.40,-4.80,6.32,0.00,1.00,163.20,-9.60 -9.60,-4.80,6.34,0.00,1.00,-14.40,-4.80 -4.80,-0.00,6.37,0.00,1.00,172.80,-4.80 -0.00,0.00,6.39,0.00,1.00,-4.80,-0.00 --4.80,0.00,6.41,0.00,1.00,0.00,0.00 --9.60,4.80,6.43,0.00,1.00,-177.60,0.00 --14.40,4.80,6.45,0.00,1.00,9.60,4.80 --19.20,9.60,6.47,0.00,1.00,-168.00,4.80 --24.00,9.60,6.49,0.00,1.00,19.20,9.60 --28.80,9.60,6.52,0.00,1.00,-158.40,9.60 --33.60,14.40,6.54,0.00,1.00,28.80,9.60 --33.60,14.40,6.56,0.00,1.00,-148.80,14.40 --38.40,14.40,6.58,0.00,1.00,38.40,14.40 --43.20,19.20,6.60,0.00,1.00,-139.20,14.40 --48.00,19.20,6.62,0.00,1.00,48.00,14.40 --57.60,19.20,6.64,0.00,1.00,-129.60,19.20 --62.40,19.20,6.66,0.00,1.00,57.60,19.20 --67.20,24.00,6.69,0.00,1.00,-120.00,19.20 --72.00,24.00,6.71,0.00,1.00,67.20,19.20 --76.80,24.00,6.73,0.00,1.00,-110.40,24.00 --81.60,24.00,6.75,0.00,1.00,76.80,24.00 --86.40,24.00,6.77,0.00,1.00,-100.80,24.00 --91.20,24.00,6.79,0.00,1.00,86.40,24.00 --96.00,24.00,6.81,0.00,1.00,-86.40,24.00 --100.80,24.00,6.84,0.00,1.00,96.00,24.00 --105.60,24.00,6.86,0.00,1.00,-76.80,24.00 --110.40,24.00,6.88,0.00,1.00,105.60,24.00 --115.20,19.20,6.90,0.00,1.00,-67.20,19.20 --120.00,19.20,6.92,0.00,1.00,115.20,19.20 --129.60,19.20,6.94,0.00,1.00,-57.60,19.20 --134.40,19.20,6.96,0.00,1.00,124.80,19.20 --139.20,19.20,6.99,0.00,1.00,-48.00,19.20 --144.00,14.40,7.01,0.00,1.00,134.40,14.40 --148.80,14.40,7.03,0.00,1.00,-38.40,14.40 --148.80,14.40,7.05,0.00,1.00,144.00,14.40 --153.60,9.60,7.07,0.00,1.00,-28.80,9.60 --158.40,9.60,7.09,0.00,1.00,153.60,9.60 --163.20,4.80,7.11,0.00,1.00,-19.20,9.60 --168.00,4.80,7.13,0.00,1.00,163.20,4.80 --172.80,4.80,7.16,0.00,1.00,-9.60,4.80 --177.60,0.00,7.18,0.00,1.00,172.80,4.80 -177.60,-0.00,7.20,0.00,1.00,-0.00,0.00 -172.80,-4.80,7.22,0.00,1.00,-177.60,-0.00 -168.00,-4.80,7.24,0.00,1.00,4.80,-4.80 -163.20,-4.80,7.26,0.00,1.00,-168.00,-4.80 -158.40,-9.60,7.28,0.00,1.00,14.40,-4.80 -153.60,-9.60,7.31,0.00,1.00,-158.40,-9.60 -148.80,-14.40,7.33,0.00,1.00,24.00,-9.60 -148.80,-14.40,7.35,0.00,1.00,-148.80,-9.60 -144.00,-14.40,7.37,0.00,1.00,33.60,-14.40 -139.20,-19.20,7.39,0.00,1.00,-139.20,-14.40 -134.40,-19.20,7.41,0.00,1.00,43.20,-14.40 -129.60,-19.20,7.43,0.00,1.00,-129.60,-19.20 -120.00,-19.20,7.46,0.00,1.00,52.80,-19.20 -115.20,-19.20,7.48,0.00,1.00,-120.00,-19.20 -110.40,-24.00,7.50,0.00,1.00,62.40,-19.20 -105.60,-24.00,7.52,0.00,1.00,-110.40,-19.20 -100.80,-24.00,7.54,0.00,1.00,72.00,-24.00 -96.00,-24.00,7.56,0.00,1.00,-100.80,-24.00 -91.20,-24.00,7.58,0.00,1.00,81.60,-24.00 -86.40,-24.00,7.60,0.00,1.00,-91.20,-24.00 -81.60,-24.00,7.63,0.00,1.00,96.00,-24.00 -76.80,-24.00,7.65,0.00,1.00,-81.60,-24.00 -72.00,-24.00,7.67,0.00,1.00,105.60,-24.00 -67.20,-24.00,7.69,0.00,1.00,-72.00,-24.00 -62.40,-19.20,7.71,0.00,1.00,115.20,-19.20 -57.60,-19.20,7.73,0.00,1.00,-62.40,-19.20 -48.00,-19.20,7.75,0.00,1.00,124.80,-19.20 -43.20,-19.20,7.78,0.00,1.00,-52.80,-19.20 -38.40,-14.40,7.80,0.00,1.00,134.40,-14.40 -33.60,-14.40,7.82,0.00,1.00,-43.20,-14.40 -33.60,-14.40,7.84,0.00,1.00,144.00,-14.40 -28.80,-9.60,7.86,0.00,1.00,-33.60,-14.40 -24.00,-9.60,7.88,0.00,1.00,153.60,-9.60 -19.20,-9.60,7.90,0.00,1.00,-24.00,-9.60 -14.40,-4.80,7.93,0.00,1.00,163.20,-9.60 -9.60,-4.80,7.95,0.00,1.00,-14.40,-4.80 -4.80,-0.00,7.97,0.00,1.00,172.80,-4.80 -0.00,0.00,7.99,0.00,1.00,-4.80,-0.00 --4.80,0.00,8.01,0.00,1.00,0.00,0.00 --9.60,4.80,8.03,0.00,1.00,-177.60,0.00 --14.40,4.80,8.05,0.00,1.00,9.60,4.80 --19.20,4.80,8.07,0.00,1.00,-168.00,4.80 --24.00,9.60,8.10,0.00,1.00,19.20,4.80 --28.80,9.60,8.12,0.00,1.00,-158.40,9.60 --33.60,9.60,8.14,0.00,1.00,24.00,9.60 --38.40,9.60,8.16,0.00,1.00,-148.80,9.60 --43.20,14.40,8.18,0.00,1.00,33.60,9.60 --48.00,14.40,8.20,0.00,1.00,-139.20,14.40 --52.80,14.40,8.22,0.00,1.00,43.20,14.40 --57.60,14.40,8.25,0.00,1.00,-129.60,14.40 --62.40,19.20,8.27,0.00,1.00,52.80,14.40 --67.20,19.20,8.29,0.00,1.00,-120.00,14.40 --72.00,19.20,8.31,0.00,1.00,62.40,14.40 --76.80,19.20,8.33,0.00,1.00,-110.40,19.20 --81.60,19.20,8.35,0.00,1.00,76.80,19.20 --86.40,19.20,8.37,0.00,1.00,-100.80,19.20 --91.20,19.20,8.40,0.00,1.00,86.40,19.20 --96.00,19.20,8.42,0.00,1.00,-86.40,19.20 --100.80,19.20,8.44,0.00,1.00,96.00,19.20 --105.60,19.20,8.46,0.00,1.00,-76.80,19.20 --110.40,19.20,8.48,0.00,1.00,105.60,19.20 --115.20,19.20,8.50,0.00,1.00,-67.20,19.20 --120.00,14.40,8.52,0.00,1.00,120.00,14.40 --124.80,14.40,8.54,0.00,1.00,-57.60,14.40 --129.60,14.40,8.57,0.00,1.00,129.60,14.40 --134.40,14.40,8.59,0.00,1.00,-48.00,14.40 --139.20,14.40,8.61,0.00,1.00,139.20,14.40 --144.00,9.60,8.63,0.00,1.00,-38.40,9.60 --148.80,9.60,8.65,0.00,1.00,148.80,9.60 --153.60,9.60,8.67,0.00,1.00,-28.80,9.60 --158.40,4.80,8.69,0.00,1.00,158.40,9.60 --163.20,4.80,8.72,0.00,1.00,-19.20,4.80 --168.00,4.80,8.74,0.00,1.00,163.20,4.80 --172.80,0.00,8.76,0.00,1.00,-9.60,4.80 --177.60,0.00,8.78,0.00,1.00,172.80,0.00 -177.60,-0.00,8.80,0.00,1.00,-0.00,0.00 -172.80,-0.00,8.82,0.00,1.00,-177.60,-0.00 -168.00,-4.80,8.84,0.00,1.00,4.80,-0.00 -163.20,-4.80,8.87,0.00,1.00,-168.00,-4.80 -158.40,-4.80,8.89,0.00,1.00,14.40,-4.80 -153.60,-9.60,8.91,0.00,1.00,-158.40,-4.80 -148.80,-9.60,8.93,0.00,1.00,24.00,-9.60 -144.00,-9.60,8.95,0.00,1.00,-153.60,-9.60 -139.20,-14.40,8.97,0.00,1.00,33.60,-9.60 -134.40,-14.40,8.99,0.00,1.00,-144.00,-9.60 -129.60,-14.40,9.01,0.00,1.00,43.20,-14.40 -124.80,-14.40,9.04,0.00,1.00,-134.40,-14.40 -120.00,-14.40,9.06,0.00,1.00,52.80,-14.40 -115.20,-19.20,9.08,0.00,1.00,-124.80,-14.40 -110.40,-19.20,9.10,0.00,1.00,62.40,-14.40 -105.60,-19.20,9.12,0.00,1.00,-110.40,-19.20 -100.80,-19.20,9.14,0.00,1.00,72.00,-19.20 -96.00,-19.20,9.16,0.00,1.00,-100.80,-19.20 -91.20,-19.20,9.19,0.00,1.00,81.60,-19.20 -86.40,-19.20,9.21,0.00,1.00,-91.20,-19.20 -81.60,-19.20,9.23,0.00,1.00,96.00,-19.20 -76.80,-19.20,9.25,0.00,1.00,-81.60,-19.20 -72.00,-19.20,9.27,0.00,1.00,105.60,-19.20 -67.20,-19.20,9.29,0.00,1.00,-72.00,-19.20 -62.40,-19.20,9.31,0.00,1.00,115.20,-14.40 -57.60,-14.40,9.34,0.00,1.00,-57.60,-14.40 -52.80,-14.40,9.36,0.00,1.00,124.80,-14.40 -48.00,-14.40,9.38,0.00,1.00,-48.00,-14.40 -43.20,-14.40,9.40,0.00,1.00,134.40,-14.40 -38.40,-9.60,9.42,0.00,1.00,-38.40,-14.40 -33.60,-9.60,9.44,0.00,1.00,144.00,-9.60 -28.80,-9.60,9.46,0.00,1.00,-28.80,-9.60 -24.00,-9.60,9.48,0.00,1.00,153.60,-9.60 -19.20,-4.80,9.51,0.00,1.00,-24.00,-9.60 -14.40,-4.80,9.53,0.00,1.00,163.20,-4.80 -9.60,-4.80,9.55,0.00,1.00,-14.40,-4.80 -4.80,-0.00,9.57,0.00,1.00,172.80,-4.80 -0.00,0.00,9.59,0.00,1.00,-4.80,-0.00 --4.80,0.00,9.61,0.00,1.00,0.00,0.00 --9.60,0.00,9.63,0.00,1.00,-177.60,0.00 --14.40,4.80,9.66,0.00,1.00,9.60,0.00 --19.20,4.80,9.68,0.00,1.00,-168.00,4.80 --24.00,4.80,9.70,0.00,1.00,14.40,4.80 --28.80,4.80,9.72,0.00,1.00,-158.40,4.80 --33.60,9.60,9.74,0.00,1.00,24.00,4.80 --38.40,9.60,9.76,0.00,1.00,-148.80,9.60 --43.20,9.60,9.78,0.00,1.00,33.60,9.60 --48.00,9.60,9.81,0.00,1.00,-139.20,9.60 --52.80,9.60,9.83,0.00,1.00,43.20,9.60 --57.60,14.40,9.85,0.00,1.00,-129.60,9.60 --62.40,14.40,9.87,0.00,1.00,52.80,9.60 --67.20,14.40,9.89,0.00,1.00,-120.00,9.60 --72.00,14.40,9.91,0.00,1.00,62.40,14.40 --76.80,14.40,9.93,0.00,1.00,-110.40,14.40 --81.60,14.40,9.95,0.00,1.00,76.80,14.40 --86.40,14.40,9.98,0.00,1.00,-100.80,14.40 --91.20,14.40,10.00,0.00,1.00,86.40,14.40 --96.00,14.40,10.02,0.00,1.00,-86.40,14.40 --100.80,14.40,10.04,0.00,1.00,96.00,14.40 --105.60,14.40,10.06,0.00,1.00,-76.80,14.40 --110.40,14.40,10.08,0.00,1.00,110.40,14.40 --115.20,14.40,10.10,0.00,1.00,-67.20,14.40 --120.00,14.40,10.13,0.00,1.00,120.00,9.60 --124.80,9.60,10.15,0.00,1.00,-57.60,9.60 --129.60,9.60,10.17,0.00,1.00,129.60,9.60 --134.40,9.60,10.19,0.00,1.00,-48.00,9.60 --139.20,9.60,10.21,0.00,1.00,139.20,9.60 --144.00,9.60,10.23,0.00,1.00,-38.40,9.60 --148.80,9.60,10.25,0.00,1.00,148.80,9.60 --153.60,4.80,10.28,0.00,1.00,-28.80,4.80 --158.40,4.80,10.30,0.00,1.00,158.40,4.80 --163.20,4.80,10.32,0.00,1.00,-19.20,4.80 --168.00,4.80,10.34,0.00,1.00,168.00,4.80 --172.80,0.00,10.36,0.00,1.00,-9.60,4.80 --177.60,0.00,10.38,0.00,1.00,172.80,0.00 -177.60,-0.00,10.40,0.00,1.00,-0.00,0.00 -172.80,-0.00,10.42,0.00,1.00,-177.60,-0.00 -168.00,-4.80,10.45,0.00,1.00,4.80,-0.00 -163.20,-4.80,10.47,0.00,1.00,-168.00,-4.80 -158.40,-4.80,10.49,0.00,1.00,14.40,-4.80 -153.60,-4.80,10.51,0.00,1.00,-163.20,-4.80 -148.80,-9.60,10.53,0.00,1.00,24.00,-4.80 -144.00,-9.60,10.55,0.00,1.00,-153.60,-4.80 -139.20,-9.60,10.57,0.00,1.00,33.60,-9.60 -134.40,-9.60,10.60,0.00,1.00,-144.00,-9.60 -129.60,-9.60,10.62,0.00,1.00,43.20,-9.60 -124.80,-9.60,10.64,0.00,1.00,-134.40,-9.60 -120.00,-14.40,10.66,0.00,1.00,52.80,-9.60 -115.20,-14.40,10.68,0.00,1.00,-124.80,-9.60 -110.40,-14.40,10.70,0.00,1.00,62.40,-9.60 -105.60,-14.40,10.72,0.00,1.00,-115.20,-14.40 -100.80,-14.40,10.74,0.00,1.00,72.00,-14.40 -96.00,-14.40,10.77,0.00,1.00,-100.80,-14.40 -91.20,-14.40,10.79,0.00,1.00,81.60,-14.40 -86.40,-14.40,10.81,0.00,1.00,-91.20,-14.40 -81.60,-14.40,10.83,0.00,1.00,96.00,-14.40 -76.80,-14.40,10.85,0.00,1.00,-81.60,-14.40 -72.00,-14.40,10.87,0.00,1.00,105.60,-14.40 -67.20,-14.40,10.89,0.00,1.00,-67.20,-14.40 -62.40,-14.40,10.92,0.00,1.00,115.20,-14.40 -57.60,-14.40,10.94,0.00,1.00,-57.60,-9.60 -52.80,-9.60,10.96,0.00,1.00,124.80,-9.60 -48.00,-9.60,10.98,0.00,1.00,-48.00,-9.60 -43.20,-9.60,11.00,0.00,1.00,134.40,-9.60 -38.40,-9.60,11.02,0.00,1.00,-38.40,-9.60 -33.60,-9.60,11.04,0.00,1.00,144.00,-9.60 -28.80,-4.80,11.07,0.00,1.00,-28.80,-9.60 -24.00,-4.80,11.09,0.00,1.00,153.60,-4.80 -19.20,-4.80,11.11,0.00,1.00,-19.20,-4.80 -14.40,-4.80,11.13,0.00,1.00,163.20,-4.80 -9.60,-0.00,11.15,0.00,1.00,-14.40,-4.80 -4.80,-0.00,11.17,0.00,1.00,172.80,-0.00 -0.00,0.00,11.19,0.00,1.00,-4.80,-0.00 --4.80,0.00,11.21,0.00,1.00,0.00,0.00 --9.60,0.00,11.24,0.00,1.00,-177.60,0.00 --14.40,0.00,11.26,0.00,1.00,9.60,0.00 --19.20,4.80,11.28,0.00,1.00,-168.00,0.00 --24.00,4.80,11.30,0.00,1.00,14.40,4.80 --28.80,4.80,11.32,0.00,1.00,-158.40,4.80 --33.60,4.80,11.34,0.00,1.00,24.00,4.80 --38.40,4.80,11.36,0.00,1.00,-153.60,4.80 --43.20,4.80,11.39,0.00,1.00,33.60,4.80 --48.00,4.80,11.41,0.00,1.00,-144.00,4.80 --52.80,9.60,11.43,0.00,1.00,43.20,4.80 --57.60,9.60,11.45,0.00,1.00,-134.40,4.80 --62.40,9.60,11.47,0.00,1.00,52.80,4.80 --67.20,9.60,11.49,0.00,1.00,-124.80,9.60 --72.00,9.60,11.51,0.00,1.00,62.40,9.60 --76.80,9.60,11.54,0.00,1.00,-110.40,9.60 --81.60,9.60,11.56,0.00,1.00,72.00,9.60 --86.40,9.60,11.58,0.00,1.00,-100.80,9.60 --91.20,9.60,11.60,0.00,1.00,86.40,9.60 --96.00,9.60,11.62,0.00,1.00,-86.40,9.60 --100.80,9.60,11.64,0.00,1.00,96.00,9.60 --105.60,9.60,11.66,0.00,1.00,-76.80,9.60 --110.40,9.60,11.68,0.00,1.00,110.40,9.60 --115.20,9.60,11.71,0.00,1.00,-67.20,9.60 --120.00,9.60,11.73,0.00,1.00,120.00,9.60 --124.80,9.60,11.75,0.00,1.00,-52.80,9.60 --129.60,9.60,11.77,0.00,1.00,129.60,4.80 --134.40,4.80,11.79,0.00,1.00,-43.20,4.80 --139.20,4.80,11.81,0.00,1.00,139.20,4.80 --144.00,4.80,11.83,0.00,1.00,-33.60,4.80 --148.80,4.80,11.86,0.00,1.00,148.80,4.80 --153.60,4.80,11.88,0.00,1.00,-24.00,4.80 --158.40,4.80,11.90,0.00,1.00,158.40,4.80 --163.20,4.80,11.92,0.00,1.00,-19.20,4.80 --168.00,0.00,11.94,0.00,1.00,168.00,4.80 --172.80,0.00,11.96,0.00,1.00,-9.60,0.00 --177.60,0.00,11.98,0.00,1.00,172.80,0.00 -177.60,-0.00,12.01,0.00,1.00,-0.00,0.00 -172.80,-0.00,12.03,0.00,1.00,-177.60,-0.00 -168.00,-0.00,12.05,0.00,1.00,4.80,-0.00 -163.20,-4.80,12.07,0.00,1.00,-168.00,-0.00 -158.40,-4.80,12.09,0.00,1.00,14.40,-4.80 -153.60,-4.80,12.11,0.00,1.00,-163.20,-4.80 -148.80,-4.80,12.13,0.00,1.00,24.00,-4.80 -144.00,-4.80,12.15,0.00,1.00,-153.60,-4.80 -139.20,-4.80,12.18,0.00,1.00,28.80,-4.80 -134.40,-4.80,12.20,0.00,1.00,-144.00,-4.80 -129.60,-9.60,12.22,0.00,1.00,38.40,-4.80 -124.80,-9.60,12.24,0.00,1.00,-134.40,-4.80 -120.00,-9.60,12.26,0.00,1.00,48.00,-4.80 -115.20,-9.60,12.28,0.00,1.00,-124.80,-9.60 -110.40,-9.60,12.30,0.00,1.00,57.60,-9.60 -105.60,-9.60,12.33,0.00,1.00,-115.20,-9.60 -100.80,-9.60,12.35,0.00,1.00,72.00,-9.60 -96.00,-9.60,12.37,0.00,1.00,-105.60,-9.60 -91.20,-9.60,12.39,0.00,1.00,81.60,-9.60 -86.40,-9.60,12.41,0.00,1.00,-91.20,-9.60 -81.60,-9.60,12.43,0.00,1.00,96.00,-9.60 -76.80,-9.60,12.45,0.00,1.00,-81.60,-9.60 -72.00,-9.60,12.48,0.00,1.00,105.60,-9.60 -67.20,-9.60,12.50,0.00,1.00,-67.20,-9.60 -62.40,-9.60,12.52,0.00,1.00,120.00,-9.60 -57.60,-9.60,12.54,0.00,1.00,-57.60,-9.60 -52.80,-9.60,12.56,0.00,1.00,129.60,-4.80 -48.00,-4.80,12.58,0.00,1.00,-48.00,-4.80 -43.20,-4.80,12.60,0.00,1.00,139.20,-4.80 -38.40,-4.80,12.62,0.00,1.00,-38.40,-4.80 -33.60,-4.80,12.65,0.00,1.00,148.80,-4.80 -28.80,-4.80,12.67,0.00,1.00,-28.80,-4.80 -24.00,-4.80,12.69,0.00,1.00,158.40,-4.80 -19.20,-4.80,12.71,0.00,1.00,-19.20,-4.80 -14.40,-0.00,12.73,0.00,1.00,163.20,-4.80 -9.60,-0.00,12.75,0.00,1.00,-9.60,-0.00 -4.80,-0.00,12.77,0.00,1.00,172.80,-0.00 -0.00,0.00,12.80,0.00,1.00,-4.80,-0.00 --4.80,0.00,12.82,0.00,1.00,0.00,0.00 --9.60,0.00,12.84,0.00,1.00,-177.60,0.00 --14.40,0.00,12.86,0.00,1.00,9.60,0.00 --19.20,0.00,12.88,0.00,1.00,-168.00,0.00 --24.00,0.00,12.90,0.00,1.00,14.40,0.00 --28.80,0.00,12.92,0.00,1.00,-163.20,0.00 --33.60,4.80,12.95,0.00,1.00,24.00,0.00 --38.40,4.80,12.97,0.00,1.00,-153.60,0.00 --43.20,4.80,12.99,0.00,1.00,28.80,0.00 --48.00,4.80,13.01,0.00,1.00,-144.00,4.80 --52.80,4.80,13.03,0.00,1.00,38.40,4.80 --57.60,4.80,13.05,0.00,1.00,-134.40,4.80 --62.40,4.80,13.07,0.00,1.00,48.00,4.80 --67.20,4.80,13.09,0.00,1.00,-124.80,4.80 --72.00,4.80,13.12,0.00,1.00,62.40,4.80 --76.80,4.80,13.14,0.00,1.00,-115.20,4.80 --81.60,4.80,13.16,0.00,1.00,72.00,4.80 --86.40,4.80,13.18,0.00,1.00,-100.80,4.80 --91.20,4.80,13.20,0.00,1.00,86.40,4.80 --96.00,4.80,13.22,0.00,1.00,-86.40,4.80 --100.80,4.80,13.24,0.00,1.00,96.00,4.80 --105.60,4.80,13.27,0.00,1.00,-76.80,4.80 --110.40,4.80,13.29,0.00,1.00,110.40,4.80 --115.20,4.80,13.31,0.00,1.00,-62.40,4.80 --120.00,4.80,13.33,0.00,1.00,120.00,4.80 --124.80,4.80,13.35,0.00,1.00,-52.80,4.80 --129.60,4.80,13.37,0.00,1.00,134.40,4.80 --134.40,4.80,13.39,0.00,1.00,-43.20,4.80 --139.20,4.80,13.42,0.00,1.00,144.00,4.80 --144.00,4.80,13.44,0.00,1.00,-33.60,0.00 --148.80,4.80,13.46,0.00,1.00,153.60,0.00 --153.60,0.00,13.48,0.00,1.00,-24.00,0.00 --158.40,0.00,13.50,0.00,1.00,158.40,0.00 --163.20,0.00,13.52,0.00,1.00,-14.40,0.00 --168.00,0.00,13.54,0.00,1.00,168.00,0.00 --172.80,0.00,13.56,0.00,1.00,-9.60,0.00 --177.60,0.00,13.59,0.00,1.00,172.80,0.00 -177.60,-0.00,13.61,0.00,1.00,-0.00,0.00 -172.80,-0.00,13.63,0.00,1.00,-177.60,-0.00 -168.00,-0.00,13.65,0.00,1.00,4.80,-0.00 -163.20,-0.00,13.67,0.00,1.00,-172.80,-0.00 -158.40,-0.00,13.69,0.00,1.00,14.40,-0.00 -153.60,-0.00,13.71,0.00,1.00,-163.20,-0.00 -148.80,-4.80,13.74,0.00,1.00,19.20,-0.00 -144.00,-4.80,13.76,0.00,1.00,-153.60,-0.00 -139.20,-4.80,13.78,0.00,1.00,28.80,-0.00 -134.40,-4.80,13.80,0.00,1.00,-148.80,-0.00 -129.60,-4.80,13.82,0.00,1.00,38.40,-4.80 -124.80,-4.80,13.84,0.00,1.00,-139.20,-4.80 -120.00,-4.80,13.86,0.00,1.00,48.00,-4.80 -115.20,-4.80,13.89,0.00,1.00,-129.60,-4.80 -110.40,-4.80,13.91,0.00,1.00,57.60,-4.80 -105.60,-4.80,13.93,0.00,1.00,-115.20,-4.80 -100.80,-4.80,13.95,0.00,1.00,67.20,-4.80 -96.00,-4.80,13.97,0.00,1.00,-105.60,-4.80 -91.20,-4.80,13.99,0.00,1.00,81.60,-4.80 -86.40,-4.80,14.01,0.00,1.00,-91.20,-4.80 -81.60,-4.80,14.03,0.00,1.00,96.00,-4.80 -76.80,-4.80,14.06,0.00,1.00,-76.80,-4.80 -72.00,-4.80,14.08,0.00,1.00,105.60,-4.80 -67.20,-4.80,14.10,0.00,1.00,-67.20,-4.80 -62.40,-4.80,14.12,0.00,1.00,120.00,-4.80 -57.60,-4.80,14.14,0.00,1.00,-52.80,-4.80 -52.80,-4.80,14.16,0.00,1.00,129.60,-4.80 -48.00,-4.80,14.18,0.00,1.00,-43.20,-4.80 -43.20,-4.80,14.21,0.00,1.00,139.20,-4.80 -38.40,-4.80,14.23,0.00,1.00,-33.60,-4.80 -33.60,-4.80,14.25,0.00,1.00,148.80,-0.00 -28.80,-0.00,14.27,0.00,1.00,-28.80,-0.00 -24.00,-0.00,14.29,0.00,1.00,158.40,-0.00 -19.20,-0.00,14.31,0.00,1.00,-19.20,-0.00 -14.40,-0.00,14.33,0.00,1.00,163.20,-0.00 -9.60,-0.00,14.36,0.00,1.00,-9.60,-0.00 -4.80,-0.00,14.38,0.00,1.00,172.80,-0.00 -0.00,0.00,14.40,0.00,1.00,-4.80,-0.00 --4.80,0.00,14.42,0.00,1.00,0.00,0.00 --9.60,0.00,14.44,0.00,1.00,-177.60,-0.00 --14.40,0.00,14.46,0.00,1.00,4.80,-0.00 --19.20,0.00,14.48,0.00,1.00,-168.00,-0.00 --24.00,0.00,14.50,0.00,1.00,14.40,-0.00 --28.80,0.00,14.53,0.00,1.00,-163.20,-0.00 --33.60,0.00,14.55,0.00,1.00,19.20,-0.00 --38.40,0.00,14.57,0.00,1.00,-153.60,-0.00 --43.20,0.00,14.59,0.00,1.00,28.80,-0.00 --48.00,0.00,14.61,0.00,1.00,-148.80,-0.00 --52.80,0.00,14.63,0.00,1.00,38.40,-0.00 --57.60,0.00,14.65,0.00,1.00,-139.20,-0.00 --62.40,0.00,14.68,0.00,1.00,48.00,-0.00 --67.20,0.00,14.70,0.00,1.00,-124.80,-0.00 --72.00,0.00,14.72,0.00,1.00,57.60,-0.00 --76.80,0.00,14.74,0.00,1.00,-115.20,-0.00 --81.60,0.00,14.76,0.00,1.00,72.00,-0.00 --86.40,0.00,14.78,0.00,1.00,-100.80,-0.00 --91.20,0.00,14.80,0.00,1.00,86.40,-0.00 --96.00,0.00,14.83,0.00,1.00,-86.40,-0.00 --100.80,0.00,14.85,0.00,1.00,100.80,-0.00 --105.60,0.00,14.87,0.00,1.00,-76.80,-0.00 --110.40,0.00,14.89,0.00,1.00,110.40,-0.00 --115.20,0.00,14.91,0.00,1.00,-62.40,-0.00 --120.00,0.00,14.93,0.00,1.00,124.80,-0.00 --124.80,0.00,14.95,0.00,1.00,-48.00,-0.00 --129.60,0.00,14.97,0.00,1.00,134.40,-0.00 --134.40,0.00,15.00,0.00,1.00,-38.40,-0.00 --139.20,0.00,15.02,0.00,1.00,144.00,-0.00 --144.00,0.00,15.04,0.00,1.00,-28.80,-0.00 --148.80,0.00,15.06,0.00,1.00,153.60,-0.00 --153.60,0.00,15.08,0.00,1.00,-24.00,-0.00 --158.40,0.00,15.10,0.00,1.00,163.20,-0.00 --163.20,0.00,15.12,0.00,1.00,-14.40,-0.00 --168.00,0.00,15.15,0.00,1.00,168.00,-0.00 --172.80,0.00,15.17,0.00,1.00,-9.60,-0.00 --177.60,0.00,15.19,0.00,1.00,172.80,-0.00 -177.60,0.00,15.21,0.00,1.00,-0.00,-0.00 -172.80,0.00,15.23,0.00,1.00,-177.60,0.00 -168.00,0.00,15.25,0.00,1.00,4.80,0.00 -163.20,0.00,15.27,0.00,1.00,-172.80,0.00 -158.40,0.00,15.30,0.00,1.00,9.60,0.00 -153.60,0.00,15.32,0.00,1.00,-163.20,0.00 -148.80,0.00,15.34,0.00,1.00,19.20,0.00 -144.00,0.00,15.36,0.00,1.00,-158.40,0.00 -139.20,0.00,15.38,0.00,1.00,28.80,0.00 -134.40,0.00,15.40,0.00,1.00,-148.80,0.00 -129.60,0.00,15.42,0.00,1.00,33.60,0.00 -124.80,0.00,15.44,0.00,1.00,-139.20,0.00 -120.00,0.00,15.47,0.00,1.00,43.20,0.00 -115.20,0.00,15.49,0.00,1.00,-129.60,0.00 -110.40,0.00,15.51,0.00,1.00,57.60,0.00 -105.60,0.00,15.53,0.00,1.00,-120.00,0.00 -100.80,0.00,15.55,0.00,1.00,67.20,0.00 -96.00,0.00,15.57,0.00,1.00,-105.60,0.00 -91.20,0.00,15.59,0.00,1.00,81.60,0.00 -86.40,0.00,15.62,0.00,1.00,-91.20,0.00 -81.60,0.00,15.64,0.00,1.00,96.00,0.00 -76.80,0.00,15.66,0.00,1.00,-76.80,0.00 -72.00,0.00,15.68,0.00,1.00,110.40,0.00 -67.20,0.00,15.70,0.00,1.00,-67.20,0.00 -62.40,0.00,15.72,0.00,1.00,120.00,0.00 -57.60,0.00,15.74,0.00,1.00,-52.80,0.00 -52.80,0.00,15.77,0.00,1.00,134.40,0.00 -48.00,0.00,15.79,0.00,1.00,-43.20,0.00 -43.20,0.00,15.81,0.00,1.00,144.00,0.00 -38.40,0.00,15.83,0.00,1.00,-33.60,0.00 -33.60,0.00,15.85,0.00,1.00,153.60,0.00 -28.80,0.00,15.87,0.00,1.00,-24.00,0.00 -24.00,0.00,15.89,0.00,1.00,158.40,0.00 -19.20,0.00,15.91,0.00,1.00,-19.20,0.00 -14.40,0.00,15.94,0.00,1.00,168.00,0.00 -9.60,0.00,15.96,0.00,1.00,-9.60,0.00 -4.80,0.00,15.98,0.00,1.00,172.80,0.00 -0.00,0.00,16.00,0.00,1.00,-4.80,0.00 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,0 +-4.42,0.00,1.00,0.00,1.00,0.00,0.00,0 +-8.83,0.00,1.00,0.00,1.00,0.00,0.00,0 +-13.24,0.00,1.00,0.00,1.00,0.00,0.00,0 +-17.64,0.00,1.00,0.00,1.00,0.00,0.00,0 +-22.03,0.00,1.00,0.00,1.00,0.00,0.00,0 +-26.41,0.00,1.00,0.00,1.00,0.00,0.00,0 +-30.77,0.00,1.00,0.00,1.00,0.00,0.00,0 +-35.12,0.00,1.00,0.00,1.00,0.00,0.00,0 +-39.44,0.00,1.00,0.00,1.00,0.00,0.00,0 +-43.74,0.00,1.00,0.00,1.00,0.00,0.00,0 +-48.01,0.00,1.00,0.00,1.00,0.00,0.00,0 +-52.25,0.00,1.00,0.00,1.00,0.00,0.00,0 +-56.46,0.00,1.00,0.00,1.00,0.00,0.00,0 +-60.64,0.00,1.00,0.00,1.00,0.00,0.00,0 +-64.78,0.00,1.00,0.00,1.00,0.00,0.00,0 +-68.88,0.00,1.00,0.00,1.00,0.00,0.00,0 +-72.94,0.00,1.00,0.00,1.00,0.00,0.00,0 +-76.96,0.00,1.00,0.00,1.00,0.00,0.00,0 +-80.93,0.00,1.00,0.00,1.00,0.00,0.00,0 +-84.85,0.00,1.00,0.00,1.00,0.00,0.00,0 +-88.72,0.00,1.00,0.00,1.00,0.00,0.00,0 +-92.54,0.00,1.00,0.00,1.00,0.00,0.00,0 +-96.30,0.00,1.00,0.00,1.00,0.00,0.00,0 +-100.00,0.00,1.00,0.00,1.00,0.00,0.00,0 +-103.65,0.00,1.00,0.00,1.00,0.00,0.00,0 +-107.23,0.00,1.00,0.00,1.00,0.00,0.00,0 +-110.74,0.00,1.00,0.00,1.00,0.00,0.00,0 +-114.19,0.00,1.00,0.00,1.00,0.00,0.00,0 +-117.57,0.00,1.00,0.00,1.00,0.00,0.00,0 +-120.88,0.00,1.00,0.00,1.00,0.00,0.00,0 +-124.12,0.00,1.00,0.00,1.00,0.00,0.00,0 +-127.28,0.00,1.00,0.00,1.00,0.00,0.00,0 +-130.36,0.00,1.00,0.00,1.00,0.00,0.00,0 +-133.37,0.00,1.00,0.00,1.00,0.00,0.00,0 +-136.30,0.00,1.00,0.00,1.00,0.00,0.00,0 +-139.14,0.00,1.00,0.00,1.00,0.00,0.00,0 +-141.90,0.00,1.00,0.00,1.00,0.00,0.00,0 +-144.58,0.00,1.00,0.00,1.00,0.00,0.00,0 +-147.17,0.00,1.00,0.00,1.00,0.00,0.00,0 +-149.66,0.00,1.00,0.00,1.00,0.00,0.00,0 +-152.07,0.00,1.00,0.00,1.00,0.00,0.00,0 +-154.39,0.00,1.00,0.00,1.00,0.00,0.00,0 +-156.62,0.00,1.00,0.00,1.00,0.00,0.00,0 +-158.75,0.00,1.00,0.00,1.00,0.00,0.00,0 +-160.78,0.00,1.00,0.00,1.00,0.00,0.00,0 +-162.72,0.00,1.00,0.00,1.00,0.00,0.00,0 +-164.56,0.00,1.00,0.00,1.00,0.00,0.00,0 +-166.30,0.00,1.00,0.00,1.00,0.00,0.00,0 +-167.94,0.00,1.00,0.00,1.00,0.00,0.00,0 +-169.48,0.00,1.00,0.00,1.00,0.00,0.00,0 +-170.92,0.00,1.00,0.00,1.00,0.00,0.00,0 +-172.25,0.00,1.00,0.00,1.00,0.00,0.00,0 +-173.48,0.00,1.00,0.00,1.00,0.00,0.00,0 +-174.61,0.00,1.00,0.00,1.00,0.00,0.00,0 +-175.63,0.00,1.00,0.00,1.00,0.00,0.00,0 +-176.54,0.00,1.00,0.00,1.00,0.00,0.00,0 +-177.35,0.00,1.00,0.00,1.00,0.00,0.00,0 +-178.05,0.00,1.00,0.00,1.00,0.00,0.00,0 +-178.65,0.00,1.00,0.00,1.00,0.00,0.00,0 +-179.13,0.00,1.00,0.00,1.00,0.00,0.00,0 +-179.51,0.00,1.00,0.00,1.00,0.00,0.00,0 +-179.78,0.00,1.00,0.00,1.00,0.00,0.00,0 +-179.95,0.00,1.00,0.00,1.00,0.00,0.00,0 +-180.00,0.00,1.00,0.00,1.00,0.00,0.00,0 +-179.95,0.00,1.00,0.00,1.00,0.00,0.00,0 +-179.78,0.00,1.00,0.00,1.00,0.00,0.00,0 +-179.51,0.00,1.00,0.00,1.00,0.00,0.00,0 +-179.13,0.00,1.00,0.00,1.00,0.00,0.00,0 +-178.65,0.00,1.00,0.00,1.00,0.00,0.00,0 +-178.05,0.00,1.00,0.00,1.00,0.00,0.00,0 +-177.35,0.00,1.00,0.00,1.00,0.00,0.00,0 +-88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +-85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +-84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +-81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +-77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +-76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +-74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +-73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +-72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +-70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +-69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +-65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +-63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +-62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +-60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +-57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +-55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +-51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +-40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +-36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +-26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +-24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +-19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +-17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +-15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +-11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +-8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +-4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +-2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +-4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +-6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +-8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +-13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +-15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +-19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +-21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +-24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +-28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +-30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +-40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +-44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +-55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +-58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +-60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +-63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +-65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +-66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +-68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +-72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +-73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +-74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +-76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +-77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +-78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +-79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +-85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +-84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +-81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +-77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +-76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +-74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +-73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +-72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +-70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +-69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +-65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +-63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +-62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +-60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +-57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +-55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +-51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +-40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +-36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +-52.25,0.00,1.00,0.00,1.00,0.00,0.00,0 +-48.01,0.00,1.00,0.00,1.00,0.00,0.00,0 +-43.74,0.00,1.00,0.00,1.00,0.00,0.00,0 +-39.44,0.00,1.00,0.00,1.00,0.00,0.00,0 +-35.12,0.00,1.00,0.00,1.00,0.00,0.00,0 +-30.77,0.00,1.00,0.00,1.00,0.00,0.00,0 +-26.41,0.00,1.00,0.00,1.00,0.00,0.00,0 +-22.03,0.00,1.00,0.00,1.00,0.00,0.00,0 +-17.64,0.00,1.00,0.00,1.00,0.00,0.00,0 +-13.24,0.00,1.00,0.00,1.00,0.00,0.00,0 +-8.83,0.00,1.00,0.00,1.00,0.00,0.00,0 +-4.42,0.00,1.00,0.00,1.00,0.00,0.00,0 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,0 +4.42,0.00,1.00,0.00,1.00,0.00,0.00,0 +8.83,0.00,1.00,0.00,1.00,0.00,0.00,0 +13.24,0.00,1.00,0.00,1.00,0.00,0.00,0 +17.64,0.00,1.00,0.00,1.00,0.00,0.00,0 +22.03,0.00,1.00,0.00,1.00,0.00,0.00,0 +26.41,0.00,1.00,0.00,1.00,0.00,0.00,0 +30.77,0.00,1.00,0.00,1.00,0.00,0.00,0 +35.12,0.00,1.00,0.00,1.00,0.00,0.00,0 +39.44,0.00,1.00,0.00,1.00,0.00,0.00,0 +43.74,0.00,1.00,0.00,1.00,0.00,0.00,0 +48.01,0.00,1.00,0.00,1.00,0.00,0.00,0 +52.25,0.00,1.00,0.00,1.00,0.00,0.00,0 +56.46,0.00,1.00,0.00,1.00,0.00,0.00,0 +60.64,0.00,1.00,0.00,1.00,0.00,0.00,0 +64.78,0.00,1.00,0.00,1.00,0.00,0.00,0 +68.88,0.00,1.00,0.00,1.00,0.00,0.00,0 +72.94,0.00,1.00,0.00,1.00,0.00,0.00,0 +76.96,0.00,1.00,0.00,1.00,0.00,0.00,0 +80.93,0.00,1.00,0.00,1.00,0.00,0.00,0 +84.85,0.00,1.00,0.00,1.00,0.00,0.00,0 +88.72,0.00,1.00,0.00,1.00,0.00,0.00,0 +92.54,0.00,1.00,0.00,1.00,0.00,0.00,0 +96.30,0.00,1.00,0.00,1.00,0.00,0.00,0 +100.00,0.00,1.00,0.00,1.00,0.00,0.00,0 +103.65,0.00,1.00,0.00,1.00,0.00,0.00,0 +107.23,0.00,1.00,0.00,1.00,0.00,0.00,0 +110.74,0.00,1.00,0.00,1.00,0.00,0.00,0 +114.19,0.00,1.00,0.00,1.00,0.00,0.00,0 +117.57,0.00,1.00,0.00,1.00,0.00,0.00,0 +120.88,0.00,1.00,0.00,1.00,0.00,0.00,0 +124.12,0.00,1.00,0.00,1.00,0.00,0.00,0 +127.28,0.00,1.00,0.00,1.00,0.00,0.00,0 +130.36,0.00,1.00,0.00,1.00,0.00,0.00,0 +133.37,0.00,1.00,0.00,1.00,0.00,0.00,0 +136.30,0.00,1.00,0.00,1.00,0.00,0.00,0 +139.14,0.00,1.00,0.00,1.00,0.00,0.00,0 +141.90,0.00,1.00,0.00,1.00,0.00,0.00,0 +144.58,0.00,1.00,0.00,1.00,0.00,0.00,0 +147.17,0.00,1.00,0.00,1.00,0.00,0.00,0 +149.66,0.00,1.00,0.00,1.00,0.00,0.00,0 +152.07,0.00,1.00,0.00,1.00,0.00,0.00,0 +154.39,0.00,1.00,0.00,1.00,0.00,0.00,0 +156.62,0.00,1.00,0.00,1.00,0.00,0.00,0 +158.75,0.00,1.00,0.00,1.00,0.00,0.00,0 +160.78,0.00,1.00,0.00,1.00,0.00,0.00,0 +162.72,0.00,1.00,0.00,1.00,0.00,0.00,0 +164.56,0.00,1.00,0.00,1.00,0.00,0.00,0 +166.30,0.00,1.00,0.00,1.00,0.00,0.00,0 +167.94,0.00,1.00,0.00,1.00,0.00,0.00,0 +169.48,0.00,1.00,0.00,1.00,0.00,0.00,0 +170.92,0.00,1.00,0.00,1.00,0.00,0.00,0 +172.25,0.00,1.00,0.00,1.00,0.00,0.00,0 +173.48,0.00,1.00,0.00,1.00,0.00,0.00,0 +174.61,0.00,1.00,0.00,1.00,0.00,0.00,0 +175.63,0.00,1.00,0.00,1.00,0.00,0.00,0 +176.54,0.00,1.00,0.00,1.00,0.00,0.00,0 +177.35,0.00,1.00,0.00,1.00,0.00,0.00,0 +178.05,0.00,1.00,0.00,1.00,0.00,0.00,0 +178.65,0.00,1.00,0.00,1.00,0.00,0.00,0 +179.13,0.00,1.00,0.00,1.00,0.00,0.00,0 +179.51,0.00,1.00,0.00,1.00,0.00,0.00,0 +179.78,0.00,1.00,0.00,1.00,0.00,0.00,0 +179.95,0.00,1.00,0.00,1.00,0.00,0.00,0 +180.00,0.00,1.00,0.00,1.00,0.00,0.00,0 +179.95,0.00,1.00,0.00,1.00,0.00,0.00,0 +179.78,0.00,1.00,0.00,1.00,0.00,0.00,0 +179.51,0.00,1.00,0.00,1.00,0.00,0.00,0 +179.13,0.00,1.00,0.00,1.00,0.00,0.00,0 +178.65,0.00,1.00,0.00,1.00,0.00,0.00,0 +178.05,0.00,1.00,0.00,1.00,0.00,0.00,0 +177.35,0.00,1.00,0.00,1.00,0.00,0.00,0 +176.54,0.00,1.00,0.00,1.00,0.00,0.00,0 +175.63,0.00,1.00,0.00,1.00,0.00,0.00,0 +174.61,0.00,1.00,0.00,1.00,0.00,0.00,0 +173.48,0.00,1.00,0.00,1.00,0.00,0.00,0 +172.25,0.00,1.00,0.00,1.00,0.00,0.00,0 +170.92,0.00,1.00,0.00,1.00,0.00,0.00,0 +169.48,0.00,1.00,0.00,1.00,0.00,0.00,0 +167.94,0.00,1.00,0.00,1.00,0.00,0.00,0 +166.30,0.00,1.00,0.00,1.00,0.00,0.00,0 +164.56,0.00,1.00,0.00,1.00,0.00,0.00,0 +162.72,0.00,1.00,0.00,1.00,0.00,0.00,0 +160.78,0.00,1.00,0.00,1.00,0.00,0.00,0 +158.75,0.00,1.00,0.00,1.00,0.00,0.00,0 +156.62,0.00,1.00,0.00,1.00,0.00,0.00,0 +154.39,0.00,1.00,0.00,1.00,0.00,0.00,0 +152.07,0.00,1.00,0.00,1.00,0.00,0.00,0 +74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +-4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +-6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +-8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +-13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +-15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +-19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +-21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +-24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +-28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +-30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +-40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +-44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +-55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +-58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +-60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +-63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +-65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +-66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +-68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +-72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +-73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +-74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +-76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +-77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +-78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +-79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +-85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +-84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +-81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +-77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +-76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +-74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +-73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +-72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +-70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +-69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +-65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +-63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +-62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +-60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +-57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +-55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +-51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +-40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +-36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +-26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +-24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +-19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +-17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +-15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +-11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +-8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +-4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +-2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +-4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +-6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +-8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +-13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +-15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +-19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +-21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +-24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +-28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +-30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +-40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +-44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +-55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +-58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +-60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +-63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +-65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +-66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +-68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +-72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +-73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +-74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +-76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +-77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +-78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +-79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +-85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +-84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +-81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +-77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +-76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +-74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +-73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +-72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +-70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +-69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +-65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +-63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +-62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +-60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +-57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +-55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +-51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +-40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +-36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +-26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +-24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +-19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +-17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +-15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +-11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +-8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +-4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +-2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +-4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +-6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +-8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +-13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +-15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +-19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +-21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +-24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +-28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +-30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +-40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +-44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +-55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +-58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +-60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +-63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +-65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +-66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +-68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +-72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +-73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +-74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +-76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +-77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +-78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +-79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +-85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +-84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +-81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +-77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +-76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +-74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +-73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +-72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +-70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +-69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +-65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +-63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +-62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +-60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +-57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +-55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +-51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +-40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +-36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +-26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +-24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +-19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +-17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +-15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +-11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +-8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +-4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +-2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +-4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +-6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +-8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +-13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +-15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +-19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +-21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +-24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +-28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +-30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +-40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +-44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +-55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +-58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +-60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +-63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +-65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +-66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +-68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +-72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +-73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +-74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +-76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +-77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +-78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +-79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +-85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +-84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +-81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +-77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +-76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +-74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +-73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +-72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +-70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 -- GitLab From e8cd4496cce2e1140fd2a77c9f4db84d9db0297b Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Tue, 16 May 2023 11:42:55 +0200 Subject: [PATCH 179/331] fix decoder crash with stereo output from SBA at 512 kbps --- lib_com/ivas_prot.h | 8 +++++ lib_com/options.h | 2 ++ lib_dec/ivas_cpe_dec.c | 7 ++++- lib_dec/ivas_sba_dirac_stereo_dec.c | 27 ++++++++++++++-- lib_dec/ivas_stereo_dft_dec.c | 49 +++++++++++++++++------------ 5 files changed, 69 insertions(+), 24 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 672b5a7441..88ddd63edc 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -1322,6 +1322,10 @@ void stereo_dft_dec( const int16_t cross_fade_start_offset, /* i : SPAR mixer delay compensation */ const int32_t output_Fs, /* i : Fs for delay calculation */ const int16_t nchan_transport /* i : number of transpor channels */ +#ifdef FIX_STEREO_474 + , + const int16_t num_md_sub_frames /* i: number of MD subframes */ +#endif ); void stereo_dft_res_ecu( @@ -3561,6 +3565,10 @@ void ivas_sba_dirac_stereo_smooth_parameters( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD handle for upmixing */ const int16_t cross_fade_start_offset, /* i : SPAR mixer delay compensation */ const int32_t output_Fs /* i : Fs for delay calculation */ +#ifdef FIX_STEREO_474 + , + const int16_t num_md_sub_frames /* i : number of subframes in mixing matrix */ +#endif ); void ivas_sba2mc_cldfb( diff --git a/lib_com/options.h b/lib_com/options.h index 09e65fa5ab..d7362b0749 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -209,6 +209,8 @@ #define FIX_DTX_428 /* FhG: fix for issue 428, crash with DTX and bitrate switching */ +#define FIX_STEREO_474 /* FhG fix for issue 574, crash with SBA to stereo output at 512 kbps */ + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_cpe_dec.c b/lib_dec/ivas_cpe_dec.c index 186d1c4c7d..350251df70 100755 --- a/lib_dec/ivas_cpe_dec.c +++ b/lib_dec/ivas_cpe_dec.c @@ -405,7 +405,12 @@ ivas_error ivas_cpe_dec( } else { - stereo_dft_dec( hCPE->hStereoDft, sts[0], DFT, hCPE->input_mem[1], hCPE->hStereoCng, 0, 0, 0, 0, 0, 0 ); + stereo_dft_dec( hCPE->hStereoDft, sts[0], DFT, hCPE->input_mem[1], hCPE->hStereoCng, 0, 0, 0, 0, 0, 0 +#ifdef FIX_STEREO_474 + , + MAX_PARAM_SPATIAL_SUBFRAMES +#endif + ); } /* synthesis iFFT */ diff --git a/lib_dec/ivas_sba_dirac_stereo_dec.c b/lib_dec/ivas_sba_dirac_stereo_dec.c index 0894920480..61f67cca0a 100644 --- a/lib_dec/ivas_sba_dirac_stereo_dec.c +++ b/lib_dec/ivas_sba_dirac_stereo_dec.c @@ -147,7 +147,7 @@ static int16_t ivas_sba_dirac_stereo_band_config( nbands = 5; } - num_cldfb_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); + num_cldfb_bands = ( int16_t )( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); bins_per_cldfb_band = NFFT / ( 2 * num_cldfb_bands ); @@ -693,6 +693,10 @@ void ivas_sba_dirac_stereo_smooth_parameters( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD handle for upmixing */ const int16_t cross_fade_start_offset, /* i : SPAR mixer delay compensation */ const int32_t output_Fs /* i : Fs for delay calculation */ +#ifdef FIX_STEREO_474 + , + const int16_t num_md_sub_frames /* i : number of subframes in mixing matrix */ +#endif ) { int16_t i, j, k, i_sf; @@ -732,9 +736,12 @@ void ivas_sba_dirac_stereo_smooth_parameters( float xfade_start_ns; int16_t xfade_delay_subframes; int16_t i_hist; +#ifdef FIX_STEREO_474 + int16_t md_sf; +#endif xfade_start_ns = cross_fade_start_offset / (float) output_Fs * 1000000000.f - IVAS_FB_ENC_DELAY_NS; - xfade_delay_subframes = (int16_t) ( xfade_start_ns / ( FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ) ); + xfade_delay_subframes = ( int16_t )( xfade_start_ns / ( FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ) ); i_hist = 4 - xfade_delay_subframes; @@ -742,6 +749,11 @@ void ivas_sba_dirac_stereo_smooth_parameters( { for ( i_sf = k * 2; i_sf < ( k + 1 ) * 2; i_sf++ ) { + +#ifdef FIX_STEREO_474 + md_sf = ( num_md_sub_frames == MAX_PARAM_SPATIAL_SUBFRAMES ) ? i_sf : 0; +#endif + if ( hStereoDft->first_frame ) { for ( i = 0; i < 2; i++ ) @@ -786,7 +798,11 @@ void ivas_sba_dirac_stereo_smooth_parameters( { for ( b = 0; b < hStereoDft->nbands; b++ ) { +#ifdef FIX_STEREO_474 + hMdDec->mixer_mat_prev[4][i][j][b] = hMdDec->mixer_mat[i][j][b + md_sf * IVAS_MAX_NUM_BANDS]; +#else hMdDec->mixer_mat_prev[4][i][j][b] = hMdDec->mixer_mat[i][j][b + i_sf * IVAS_MAX_NUM_BANDS]; +#endif } } } @@ -881,7 +897,12 @@ void ivas_sba_dirac_stereo_dec( stereo_dft_dec( hStereoDft, hCPE->hCoreCoder[0], DFT, NULL, NULL, 1 /*st_ivas->sba_dirac_stereo_flag*/, sba_mono_flag, ( st_ivas->hSpar != NULL && !mcmasa ) ? st_ivas->hSpar->hMdDec : NULL, ( st_ivas->hSpar != NULL && !mcmasa ) ? st_ivas->hSpar->hFbMixer->cross_fade_start_offset : 0, - st_ivas->hDecoderConfig->output_Fs, st_ivas->nchan_transport ); + st_ivas->hDecoderConfig->output_Fs, st_ivas->nchan_transport +#ifdef FIX_STEREO_474 + , + ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate ) +#endif + ); /* DFT synthesis */ stereo_dft_dec_synthesize( hCPE, DFT, 0, output[0], output_frame ); diff --git a/lib_dec/ivas_stereo_dft_dec.c b/lib_dec/ivas_stereo_dft_dec.c index 08ca989f3d..6719fff8a7 100644 --- a/lib_dec/ivas_stereo_dft_dec.c +++ b/lib_dec/ivas_stereo_dft_dec.c @@ -316,21 +316,21 @@ static void stereo_dft_dec_open( ) { /*Sizes*/ - hStereoDft->N = (int16_t) ( STEREO_DFT_HOP_MAX * output_Fs / 48000 ); + hStereoDft->N = ( int16_t )( STEREO_DFT_HOP_MAX * output_Fs / 48000 ); /*Init. DFT sizes*/ - hStereoDft->NFFT = (int16_t) ( STEREO_DFT32MS_N_MAX * output_Fs / 48000 ); + hStereoDft->NFFT = ( int16_t )( STEREO_DFT32MS_N_MAX * output_Fs / 48000 ); hStereoDft->dft_trigo_8k = dft_trigo_32k; hStereoDft->dft_trigo_12k8 = dft_trigo_12k8; hStereoDft->dft_trigo_16k = dft_trigo_32k; - hStereoDft->dft32ms_ovl = (int16_t) ( ( STEREO_DFT32MS_OVL_MAX * output_Fs ) / 48000 ); + hStereoDft->dft32ms_ovl = ( int16_t )( ( STEREO_DFT32MS_OVL_MAX * output_Fs ) / 48000 ); hStereoDft->win232ms_8k = dft_win232ms_8k; hStereoDft->win232ms_12k8 = dft_win232ms_12k8; hStereoDft->win232ms_16k = dft_win232ms_16k; - hStereoDft->dft32ms_ovl2 = (int16_t) ( ( STEREO_DFT32MS_OVL2_MAX * output_Fs ) / 48000 ); + hStereoDft->dft32ms_ovl2 = ( int16_t )( ( STEREO_DFT32MS_OVL2_MAX * output_Fs ) / 48000 ); hStereoDft->win32ms_8k = dft_win232ms_8k + 1; hStereoDft->win32ms_12k8 = dft_win232ms_12k8 + 1; hStereoDft->win32ms_16k = dft_win232ms_16k + 1; @@ -825,7 +825,7 @@ void stereo_dft_dec_analyze( pInput = pInput_buff + offset; for ( i = 0; i < 2 * N; i++ ) { - tmp[i] = (int16_t) ( pInput[i] + 0.5f ); + tmp[i] = ( int16_t )( pInput[i] + 0.5f ); } if ( ana_type != DFT_STEREO_DEC_ANA_BPF ) { @@ -1012,7 +1012,7 @@ void stereo_dft_dec_synthesize( if ( hCPE->stereo_switching_counter == 0 ) { /* Set the level of dispersion */ - hCPE->NbFrameMod = (int16_t) ( 12.0f * max( -0.1f, min( 0.4, hCPE->lt_es_em ) ) + 1.2f + 0.5f ); /* -0.1: -0.4 ; -0.1 -> 0, 0.4 -> 6*/ + hCPE->NbFrameMod = ( int16_t )( 12.0f * max( -0.1f, min( 0.4, hCPE->lt_es_em ) ) + 1.2f + 0.5f ); /* -0.1: -0.4 ; -0.1 -> 0, 0.4 -> 6*/ } moffset = max( 0, 6 - hCPE->NbFrameMod ); @@ -1101,7 +1101,7 @@ void stereo_dft_dec_synthesize( for ( i = 0; i < output_frame; i++ ) { - tmp[i] = (int16_t) ( output[i] + 0.5f ); + tmp[i] = ( int16_t )( output[i] + 0.5f ); } sprintf( file_name, "./res/stereo_dft_ch%d_output.pcm", chan ); dbgwrite( tmp, sizeof( int16_t ), output_frame, 1, file_name ); @@ -1131,6 +1131,10 @@ void stereo_dft_dec( const int16_t cross_fade_start_offset, /* i : SPAR mixer delay compensation */ const int32_t output_Fs, /* i : Fs for delay calculation */ const int16_t nchan_transport /* i : number of transpor channels */ +#ifdef FIX_STEREO_474 + , + const int16_t num_md_sub_frames /* i: number of MD subframes */ +#endif ) { int16_t i, k, b, N_div, stop; @@ -1164,7 +1168,7 @@ void stereo_dft_dec( float DFT_W, DFT_Y; - output_frame = (int16_t) ( st0->output_Fs / FRAMES_PER_SEC ); + output_frame = ( int16_t )( st0->output_Fs / FRAMES_PER_SEC ); /*------------------------------------------------------------------* * Initialization @@ -1181,10 +1185,10 @@ void stereo_dft_dec( #ifdef DEBUG_MODE_DFT { int16_t tmps; - int16_t tmp_output_frame = (int16_t) ( st0->output_Fs / FRAMES_PER_SEC ); + int16_t tmp_output_frame = ( int16_t )( st0->output_Fs / FRAMES_PER_SEC ); dbgwrite( &( hStereoDft->attackPresent ), sizeof( int16_t ), 1, tmp_output_frame, "res/stereo_attack.pcm" ); dbgwrite( &( hStereoDft->trans ), sizeof( int16_t ), 1, tmp_output_frame, "res/stereo_trans.pcm" ); - tmps = (int16_t) ( 100.f * ( st0->stab_fac ) + 0.5f ); + tmps = ( int16_t )( 100.f * ( st0->stab_fac ) + 0.5f ); dbgwrite( &tmps, sizeof( int16_t ), 1, tmp_output_frame, "res/stereo_stab.pcm" ); } #endif @@ -1208,7 +1212,12 @@ void stereo_dft_dec( ivas_sba_dirac_stereo_smooth_parameters( hStereoDft, hMdDec, cross_fade_start_offset, - output_Fs ); + output_Fs +#ifdef FIX_STEREO_474 + , + num_md_sub_frames +#endif + ); } else { @@ -1821,7 +1830,7 @@ void stereo_dft_dec_res( for ( i = 0; i < L_FRAME8k; i++ ) { - tmp[i] = (int16_t) ( win[i] ); + tmp[i] = ( int16_t )( win[i] ); } dbgwrite( tmp, sizeof( int16_t ), L_FRAME8k, 1, "./res/stereo_dft_dec_res_decoded.pcm" ); } @@ -2054,7 +2063,7 @@ void stereo_dft_dec_read_BS( } hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->band_res[k_offset]][hStereoDft->res_cod_mode[k_offset]]; - hStereoDft->res_cod_line_max = (int16_t) ( 0.5f + ( hStereoDft->band_limits[hStereoDft->res_cod_band_max] - 1 ) * 2.f * output_frame / (float) ( hStereoDft->NFFT ) ); + hStereoDft->res_cod_line_max = ( int16_t )( 0.5f + ( hStereoDft->band_limits[hStereoDft->res_cod_band_max] - 1 ) * 2.f * output_frame / (float) ( hStereoDft->NFFT ) ); hStereoDft->res_cod_line_max = 8 * ( hStereoDft->res_cod_line_max / 8 ); hStereoDft->res_pred_band_min = max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max ); @@ -2454,7 +2463,7 @@ void stereo_dft_dec_read_BS( if ( ivas_total_brate == IVAS_SID_5k2 && ivas_format != MASA_FORMAT ) { - *nb_bits = (int16_t) ( ( element_brate - SID_2k40 ) / FRAMES_PER_SEC ); /* => hCPE->hCoreCoder[0]->total_brate = SID_2k40; */ + *nb_bits = ( int16_t )( ( element_brate - SID_2k40 ) / FRAMES_PER_SEC ); /* => hCPE->hCoreCoder[0]->total_brate = SID_2k40; */ } { *total_brate = element_brate - ( *nb_bits * FRAMES_PER_SEC ); @@ -2503,7 +2512,7 @@ static void stereo_dft_compute_td_stefi_params( return; } - bin0 = (int16_t) ( samp_ratio * hStereoDft->NFFT / 2 + .5 ); + bin0 = ( int16_t )( samp_ratio * hStereoDft->NFFT / 2 + .5 ); bin0 = min( bin0, hStereoDft->band_limits[hStereoDft->nbands] ); b = hStereoDft->nbands; while ( hStereoDft->band_limits[b] > bin0 ) @@ -2607,7 +2616,7 @@ void stereo_dft_generate_res_pred( /* In ACELP mode the downmix signal is not available in bandwidth extension area. * * Therefore, the downmix energy in the corresponding subbands is estimated. */ - bin0 = (int16_t) ( samp_ratio * hStereoDft->NFFT / 2 + .5 ); + bin0 = ( int16_t )( samp_ratio * hStereoDft->NFFT / 2 + .5 ); bin0 = min( bin0, hStereoDft->band_limits[hStereoDft->nbands] ); b = hStereoDft->nbands; while ( hStereoDft->band_limits[b] >= bin0 ) @@ -2677,7 +2686,7 @@ void stereo_dft_generate_res_pred( for ( b = lb_stefi_start_band; b <= band0; b++ ) { d_short_ind = STEREO_DFT_PAST_MAX - STEREO_DFT_STEFFI_DELAY_SHORT + b % 2; - d_long_ind = max( 4, (int16_t) ( ( STEREO_DFT_PAST_MAX + 4 - 1 ) * ( (float) b / ( hStereoDft->nbands - 1 ) ) + 0.5f ) ) - 4; + d_long_ind = max( 4, ( int16_t )( ( STEREO_DFT_PAST_MAX + 4 - 1 ) * ( (float) b / ( hStereoDft->nbands - 1 ) ) + 0.5f ) ) - 4; /* make sure d_short really corresponds to a shorter or equally long delay than d_long (e.g. not always the case for * STEREO_DFT_STEFFI_DELAY_SHORT=3 and STEREO_DFT_STEFFI_DELAY_LONG=4)*/ d_short_ind = max( d_short_ind, d_long_ind ); @@ -2825,7 +2834,7 @@ void stereo_dft_generate_res_pred( { /* TCX/HQ core -> TCX/HQ core: business as usual */ d_short_ind = STEREO_DFT_PAST_MAX - STEREO_DFT_STEFFI_DELAY_SHORT + b % 2; - d_long_ind = max( 4, (int16_t) ( ( STEREO_DFT_PAST_MAX + 4 - 1 ) * ( (float) b / ( hStereoDft->nbands - 1 ) ) + 0.5f ) ) - 4; + d_long_ind = max( 4, ( int16_t )( ( STEREO_DFT_PAST_MAX + 4 - 1 ) * ( (float) b / ( hStereoDft->nbands - 1 ) ) + 0.5f ) ) - 4; /* make sure d_short really corresponds to a shorter or equally long delay than d_long (e.g. not always the case for * STEREO_DFT_STEFFI_DELAY_SHORT=3 and STEREO_DFT_STEFFI_DELAY_LONG=4)*/ d_short_ind = max( d_short_ind, d_long_ind ); @@ -3105,8 +3114,8 @@ void stereo_dft_dec_smooth_parameters( hStereoDft->res_gains_ind[0][b] = hStereoDft->res_gains_ind[0][b + STEREO_DFT_BAND_MAX]; /*stereo_dft_dequantize_res_gains_f(&hStereoDft->res_gains_ind[0][b], &hStereoDft->res_gains_ind[1][b+STEREO_DFT_BAND_MAX],hStereoDft->side_gain+(k+k_offset)*STEREO_DFT_BAND_MAX+b, hStereoDft->res_pred_gain+(k+k_offset)*STEREO_DFT_BAND_MAX+b, 1);*/ - tmps1 = (int16_t) ( hStereoDft->res_gains_ind[0][b] ); - tmps2 = (int16_t) ( hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] ); + tmps1 = ( int16_t )( hStereoDft->res_gains_ind[0][b] ); + tmps2 = ( int16_t )( hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] ); stereo_dft_dequantize_res_gains( &tmps1, &tmps2, hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 ); if ( hStereoDft->attackPresent ) -- GitLab From 7e27b51c9e6fe984346478b408628c9a1a601e8d Mon Sep 17 00:00:00 2001 From: Simon Plain Date: Tue, 16 May 2023 11:54:58 +0200 Subject: [PATCH 180/331] Fix #469: ParamUpmix with bitrate switch --- lib_com/options.h | 2 ++ lib_dec/ivas_mct_dec.c | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 09e65fa5ab..de0967fc1a 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -196,6 +196,8 @@ #define FIX_441_SBA_PARAMBIN_GAINS /* Nokia: Fix issue 441 by changing gains in SBA path of parametric binauralizer */ #define MC_PARAMUPMIX_MODE /* Dlb: Contribution 39: Multichannel Parametric Upmix */ +#define FIX_469_BRSWITCH_PUPMIX /* Dlb: Fix issue 469 for Param Upmix bitrate switching */ + #define HODIRAC /* FhG: Contribution 32: Sector-based HO-DirAC method for SBA at high bitrates */ #define DIRAC_ALLOC_HARM /* VA: harmonize DirAC parameters allocation/deallocation */ diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index 0dd2552c0f..19a0909461 100755 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -815,8 +815,17 @@ static ivas_error ivas_mc_dec_reconfig( /* remove ls conversion if it was allocated by ParamMC */ ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion ); } + #ifdef MC_PARAMUPMIX_MODE +#ifdef FIX_469_BRSWITCH_PUPMIX + if ( last_mc_mode == MC_MODE_PARAMUPMIX ) + { + ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) ); + ivas_ls_setup_conversion_close( &( st_ivas->hLsSetUpConversion ) ); + } +#else ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) ); +#endif #endif /* De-allocate McMasa-related handles */ ivas_masa_dec_close( &( st_ivas->hMasa ) ); -- GitLab From 96e608103dab3ced40d630a863276e3d5fcb1f08 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Tue, 16 May 2023 12:42:19 +0200 Subject: [PATCH 181/331] fix formatting --- lib_dec/ivas_cpe_dec.c | 8 +++--- lib_dec/ivas_sba_dirac_stereo_dec.c | 14 +++++----- lib_dec/ivas_stereo_dft_dec.c | 40 ++++++++++++++--------------- 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/lib_dec/ivas_cpe_dec.c b/lib_dec/ivas_cpe_dec.c index 350251df70..3717501c83 100755 --- a/lib_dec/ivas_cpe_dec.c +++ b/lib_dec/ivas_cpe_dec.c @@ -405,12 +405,12 @@ ivas_error ivas_cpe_dec( } else { - stereo_dft_dec( hCPE->hStereoDft, sts[0], DFT, hCPE->input_mem[1], hCPE->hStereoCng, 0, 0, 0, 0, 0, 0 + stereo_dft_dec( hCPE->hStereoDft, sts[0], DFT, hCPE->input_mem[1], hCPE->hStereoCng, 0, 0, 0, 0, 0, 0 #ifdef FIX_STEREO_474 - , - MAX_PARAM_SPATIAL_SUBFRAMES + , + MAX_PARAM_SPATIAL_SUBFRAMES #endif - ); + ); } /* synthesis iFFT */ diff --git a/lib_dec/ivas_sba_dirac_stereo_dec.c b/lib_dec/ivas_sba_dirac_stereo_dec.c index 61f67cca0a..3ae5461932 100644 --- a/lib_dec/ivas_sba_dirac_stereo_dec.c +++ b/lib_dec/ivas_sba_dirac_stereo_dec.c @@ -147,7 +147,7 @@ static int16_t ivas_sba_dirac_stereo_band_config( nbands = 5; } - num_cldfb_bands = ( int16_t )( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); + num_cldfb_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); bins_per_cldfb_band = NFFT / ( 2 * num_cldfb_bands ); @@ -741,7 +741,7 @@ void ivas_sba_dirac_stereo_smooth_parameters( #endif xfade_start_ns = cross_fade_start_offset / (float) output_Fs * 1000000000.f - IVAS_FB_ENC_DELAY_NS; - xfade_delay_subframes = ( int16_t )( xfade_start_ns / ( FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ) ); + xfade_delay_subframes = (int16_t) ( xfade_start_ns / ( FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ) ); i_hist = 4 - xfade_delay_subframes; @@ -799,7 +799,7 @@ void ivas_sba_dirac_stereo_smooth_parameters( for ( b = 0; b < hStereoDft->nbands; b++ ) { #ifdef FIX_STEREO_474 - hMdDec->mixer_mat_prev[4][i][j][b] = hMdDec->mixer_mat[i][j][b + md_sf * IVAS_MAX_NUM_BANDS]; + hMdDec->mixer_mat_prev[4][i][j][b] = hMdDec->mixer_mat[i][j][b + md_sf * IVAS_MAX_NUM_BANDS]; #else hMdDec->mixer_mat_prev[4][i][j][b] = hMdDec->mixer_mat[i][j][b + i_sf * IVAS_MAX_NUM_BANDS]; #endif @@ -897,12 +897,12 @@ void ivas_sba_dirac_stereo_dec( stereo_dft_dec( hStereoDft, hCPE->hCoreCoder[0], DFT, NULL, NULL, 1 /*st_ivas->sba_dirac_stereo_flag*/, sba_mono_flag, ( st_ivas->hSpar != NULL && !mcmasa ) ? st_ivas->hSpar->hMdDec : NULL, ( st_ivas->hSpar != NULL && !mcmasa ) ? st_ivas->hSpar->hFbMixer->cross_fade_start_offset : 0, - st_ivas->hDecoderConfig->output_Fs, st_ivas->nchan_transport + st_ivas->hDecoderConfig->output_Fs, st_ivas->nchan_transport #ifdef FIX_STEREO_474 - , - ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate ) + , + ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate ) #endif - ); + ); /* DFT synthesis */ stereo_dft_dec_synthesize( hCPE, DFT, 0, output[0], output_frame ); diff --git a/lib_dec/ivas_stereo_dft_dec.c b/lib_dec/ivas_stereo_dft_dec.c index 6719fff8a7..cf5542f1e0 100644 --- a/lib_dec/ivas_stereo_dft_dec.c +++ b/lib_dec/ivas_stereo_dft_dec.c @@ -316,21 +316,21 @@ static void stereo_dft_dec_open( ) { /*Sizes*/ - hStereoDft->N = ( int16_t )( STEREO_DFT_HOP_MAX * output_Fs / 48000 ); + hStereoDft->N = (int16_t) ( STEREO_DFT_HOP_MAX * output_Fs / 48000 ); /*Init. DFT sizes*/ - hStereoDft->NFFT = ( int16_t )( STEREO_DFT32MS_N_MAX * output_Fs / 48000 ); + hStereoDft->NFFT = (int16_t) ( STEREO_DFT32MS_N_MAX * output_Fs / 48000 ); hStereoDft->dft_trigo_8k = dft_trigo_32k; hStereoDft->dft_trigo_12k8 = dft_trigo_12k8; hStereoDft->dft_trigo_16k = dft_trigo_32k; - hStereoDft->dft32ms_ovl = ( int16_t )( ( STEREO_DFT32MS_OVL_MAX * output_Fs ) / 48000 ); + hStereoDft->dft32ms_ovl = (int16_t) ( ( STEREO_DFT32MS_OVL_MAX * output_Fs ) / 48000 ); hStereoDft->win232ms_8k = dft_win232ms_8k; hStereoDft->win232ms_12k8 = dft_win232ms_12k8; hStereoDft->win232ms_16k = dft_win232ms_16k; - hStereoDft->dft32ms_ovl2 = ( int16_t )( ( STEREO_DFT32MS_OVL2_MAX * output_Fs ) / 48000 ); + hStereoDft->dft32ms_ovl2 = (int16_t) ( ( STEREO_DFT32MS_OVL2_MAX * output_Fs ) / 48000 ); hStereoDft->win32ms_8k = dft_win232ms_8k + 1; hStereoDft->win32ms_12k8 = dft_win232ms_12k8 + 1; hStereoDft->win32ms_16k = dft_win232ms_16k + 1; @@ -825,7 +825,7 @@ void stereo_dft_dec_analyze( pInput = pInput_buff + offset; for ( i = 0; i < 2 * N; i++ ) { - tmp[i] = ( int16_t )( pInput[i] + 0.5f ); + tmp[i] = (int16_t) ( pInput[i] + 0.5f ); } if ( ana_type != DFT_STEREO_DEC_ANA_BPF ) { @@ -1012,7 +1012,7 @@ void stereo_dft_dec_synthesize( if ( hCPE->stereo_switching_counter == 0 ) { /* Set the level of dispersion */ - hCPE->NbFrameMod = ( int16_t )( 12.0f * max( -0.1f, min( 0.4, hCPE->lt_es_em ) ) + 1.2f + 0.5f ); /* -0.1: -0.4 ; -0.1 -> 0, 0.4 -> 6*/ + hCPE->NbFrameMod = (int16_t) ( 12.0f * max( -0.1f, min( 0.4, hCPE->lt_es_em ) ) + 1.2f + 0.5f ); /* -0.1: -0.4 ; -0.1 -> 0, 0.4 -> 6*/ } moffset = max( 0, 6 - hCPE->NbFrameMod ); @@ -1101,7 +1101,7 @@ void stereo_dft_dec_synthesize( for ( i = 0; i < output_frame; i++ ) { - tmp[i] = ( int16_t )( output[i] + 0.5f ); + tmp[i] = (int16_t) ( output[i] + 0.5f ); } sprintf( file_name, "./res/stereo_dft_ch%d_output.pcm", chan ); dbgwrite( tmp, sizeof( int16_t ), output_frame, 1, file_name ); @@ -1133,7 +1133,7 @@ void stereo_dft_dec( const int16_t nchan_transport /* i : number of transpor channels */ #ifdef FIX_STEREO_474 , - const int16_t num_md_sub_frames /* i: number of MD subframes */ + const int16_t num_md_sub_frames /* i: number of MD subframes */ #endif ) { @@ -1168,7 +1168,7 @@ void stereo_dft_dec( float DFT_W, DFT_Y; - output_frame = ( int16_t )( st0->output_Fs / FRAMES_PER_SEC ); + output_frame = (int16_t) ( st0->output_Fs / FRAMES_PER_SEC ); /*------------------------------------------------------------------* * Initialization @@ -1185,10 +1185,10 @@ void stereo_dft_dec( #ifdef DEBUG_MODE_DFT { int16_t tmps; - int16_t tmp_output_frame = ( int16_t )( st0->output_Fs / FRAMES_PER_SEC ); + int16_t tmp_output_frame = (int16_t) ( st0->output_Fs / FRAMES_PER_SEC ); dbgwrite( &( hStereoDft->attackPresent ), sizeof( int16_t ), 1, tmp_output_frame, "res/stereo_attack.pcm" ); dbgwrite( &( hStereoDft->trans ), sizeof( int16_t ), 1, tmp_output_frame, "res/stereo_trans.pcm" ); - tmps = ( int16_t )( 100.f * ( st0->stab_fac ) + 0.5f ); + tmps = (int16_t) ( 100.f * ( st0->stab_fac ) + 0.5f ); dbgwrite( &tmps, sizeof( int16_t ), 1, tmp_output_frame, "res/stereo_stab.pcm" ); } #endif @@ -1830,7 +1830,7 @@ void stereo_dft_dec_res( for ( i = 0; i < L_FRAME8k; i++ ) { - tmp[i] = ( int16_t )( win[i] ); + tmp[i] = (int16_t) ( win[i] ); } dbgwrite( tmp, sizeof( int16_t ), L_FRAME8k, 1, "./res/stereo_dft_dec_res_decoded.pcm" ); } @@ -2063,7 +2063,7 @@ void stereo_dft_dec_read_BS( } hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->band_res[k_offset]][hStereoDft->res_cod_mode[k_offset]]; - hStereoDft->res_cod_line_max = ( int16_t )( 0.5f + ( hStereoDft->band_limits[hStereoDft->res_cod_band_max] - 1 ) * 2.f * output_frame / (float) ( hStereoDft->NFFT ) ); + hStereoDft->res_cod_line_max = (int16_t) ( 0.5f + ( hStereoDft->band_limits[hStereoDft->res_cod_band_max] - 1 ) * 2.f * output_frame / (float) ( hStereoDft->NFFT ) ); hStereoDft->res_cod_line_max = 8 * ( hStereoDft->res_cod_line_max / 8 ); hStereoDft->res_pred_band_min = max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max ); @@ -2463,7 +2463,7 @@ void stereo_dft_dec_read_BS( if ( ivas_total_brate == IVAS_SID_5k2 && ivas_format != MASA_FORMAT ) { - *nb_bits = ( int16_t )( ( element_brate - SID_2k40 ) / FRAMES_PER_SEC ); /* => hCPE->hCoreCoder[0]->total_brate = SID_2k40; */ + *nb_bits = (int16_t) ( ( element_brate - SID_2k40 ) / FRAMES_PER_SEC ); /* => hCPE->hCoreCoder[0]->total_brate = SID_2k40; */ } { *total_brate = element_brate - ( *nb_bits * FRAMES_PER_SEC ); @@ -2512,7 +2512,7 @@ static void stereo_dft_compute_td_stefi_params( return; } - bin0 = ( int16_t )( samp_ratio * hStereoDft->NFFT / 2 + .5 ); + bin0 = (int16_t) ( samp_ratio * hStereoDft->NFFT / 2 + .5 ); bin0 = min( bin0, hStereoDft->band_limits[hStereoDft->nbands] ); b = hStereoDft->nbands; while ( hStereoDft->band_limits[b] > bin0 ) @@ -2616,7 +2616,7 @@ void stereo_dft_generate_res_pred( /* In ACELP mode the downmix signal is not available in bandwidth extension area. * * Therefore, the downmix energy in the corresponding subbands is estimated. */ - bin0 = ( int16_t )( samp_ratio * hStereoDft->NFFT / 2 + .5 ); + bin0 = (int16_t) ( samp_ratio * hStereoDft->NFFT / 2 + .5 ); bin0 = min( bin0, hStereoDft->band_limits[hStereoDft->nbands] ); b = hStereoDft->nbands; while ( hStereoDft->band_limits[b] >= bin0 ) @@ -2686,7 +2686,7 @@ void stereo_dft_generate_res_pred( for ( b = lb_stefi_start_band; b <= band0; b++ ) { d_short_ind = STEREO_DFT_PAST_MAX - STEREO_DFT_STEFFI_DELAY_SHORT + b % 2; - d_long_ind = max( 4, ( int16_t )( ( STEREO_DFT_PAST_MAX + 4 - 1 ) * ( (float) b / ( hStereoDft->nbands - 1 ) ) + 0.5f ) ) - 4; + d_long_ind = max( 4, (int16_t) ( ( STEREO_DFT_PAST_MAX + 4 - 1 ) * ( (float) b / ( hStereoDft->nbands - 1 ) ) + 0.5f ) ) - 4; /* make sure d_short really corresponds to a shorter or equally long delay than d_long (e.g. not always the case for * STEREO_DFT_STEFFI_DELAY_SHORT=3 and STEREO_DFT_STEFFI_DELAY_LONG=4)*/ d_short_ind = max( d_short_ind, d_long_ind ); @@ -2834,7 +2834,7 @@ void stereo_dft_generate_res_pred( { /* TCX/HQ core -> TCX/HQ core: business as usual */ d_short_ind = STEREO_DFT_PAST_MAX - STEREO_DFT_STEFFI_DELAY_SHORT + b % 2; - d_long_ind = max( 4, ( int16_t )( ( STEREO_DFT_PAST_MAX + 4 - 1 ) * ( (float) b / ( hStereoDft->nbands - 1 ) ) + 0.5f ) ) - 4; + d_long_ind = max( 4, (int16_t) ( ( STEREO_DFT_PAST_MAX + 4 - 1 ) * ( (float) b / ( hStereoDft->nbands - 1 ) ) + 0.5f ) ) - 4; /* make sure d_short really corresponds to a shorter or equally long delay than d_long (e.g. not always the case for * STEREO_DFT_STEFFI_DELAY_SHORT=3 and STEREO_DFT_STEFFI_DELAY_LONG=4)*/ d_short_ind = max( d_short_ind, d_long_ind ); @@ -3114,8 +3114,8 @@ void stereo_dft_dec_smooth_parameters( hStereoDft->res_gains_ind[0][b] = hStereoDft->res_gains_ind[0][b + STEREO_DFT_BAND_MAX]; /*stereo_dft_dequantize_res_gains_f(&hStereoDft->res_gains_ind[0][b], &hStereoDft->res_gains_ind[1][b+STEREO_DFT_BAND_MAX],hStereoDft->side_gain+(k+k_offset)*STEREO_DFT_BAND_MAX+b, hStereoDft->res_pred_gain+(k+k_offset)*STEREO_DFT_BAND_MAX+b, 1);*/ - tmps1 = ( int16_t )( hStereoDft->res_gains_ind[0][b] ); - tmps2 = ( int16_t )( hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] ); + tmps1 = (int16_t) ( hStereoDft->res_gains_ind[0][b] ); + tmps2 = (int16_t) ( hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] ); stereo_dft_dequantize_res_gains( &tmps1, &tmps2, hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 ); if ( hStereoDft->attackPresent ) -- GitLab From db676f088c033bec5182b5ec9dd10973bb21ee48 Mon Sep 17 00:00:00 2001 From: Sumeyra Kanik Date: Tue, 16 May 2023 13:50:10 +0200 Subject: [PATCH 182/331] Correct the delay printout for decoder --- lib_com/ivas_cnst.h | 3 +++ lib_dec/lib_dec.c | 8 ++++++++ lib_rend/ivas_objectRenderer.c | 19 ++----------------- lib_rend/ivas_objectRenderer_sources.c | 5 +---- lib_rend/ivas_prot_rend.h | 3 --- 5 files changed, 14 insertions(+), 24 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 91f1127788..4a6cc1dba9 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -364,6 +364,9 @@ typedef enum #endif #define ISM_EXTENDED_METADATA_BITS 1 #define ISM_METADATA_RS_MAX_FRAMES 5 /* Number of frames with opposite extended metadata flags before switching */ +#ifdef FIX_356_ISM_METADATA_SYNC +#define ISM_METADATA_DELAY_SUBFRAME 2 /* Number of subframes to delay metadata to sync with audio */ +#endif /* Parametric ISM */ #define MAX_PARAM_ISM_NBANDS 11 diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 17c718bb48..4e535f98d7 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1594,6 +1594,14 @@ ivas_error IVAS_DEC_GetDelay( nSamples[2] = (int16_t) roundf( (float) st_ivas->binaural_latency_ns * hDecoderConfig->output_Fs / 1000000000.f ); nSamples[0] = nSamples[1] + nSamples[2]; +#ifdef FIX_356_ISM_METADATA_SYNC + if (st_ivas->ivas_format == ISM_FORMAT) + { + /* note: in ISM, all delay is compensated at the decoder by default, so subtract the encoder delay for print-out */ + nSamples[1] -= NS2SA(hDecoderConfig->output_Fs, IVAS_ENC_DELAY_NS); + } +#endif + *timeScale = hDecoderConfig->output_Fs; return IVAS_ERR_OK; diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index a857bf1170..3129eaca4f 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -290,10 +290,7 @@ ivas_error ivas_td_binaural_renderer_unwrap( subframe_length = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES; #ifdef FIX_356_ISM_METADATA_SYNC - int16_t subframe_update; int16_t c_indx, nS; - - subframe_update = 2; c_indx = 0; for (nS = 0; nS < num_src; nS++) @@ -313,7 +310,7 @@ ivas_error ivas_td_binaural_renderer_unwrap( for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) { #ifdef FIX_356_ISM_METADATA_SYNC - if ( subframe_idx == subframe_update ) + if ( subframe_idx == ISM_METADATA_DELAY_SUBFRAME ) { /* Update object position(s) */ TDREND_Update_object_positions( hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, output ); @@ -335,11 +332,7 @@ ivas_error ivas_td_binaural_renderer_unwrap( } /* Render subframe */ -#ifdef FIX_356_ISM_METADATA_SYNC - if ( ( error = TDREND_GetMix( hBinRendererTd, output, subframe_update, subframe_length, subframe_idx ) ) != IVAS_ERR_OK ) -#else if ( ( error = TDREND_GetMix( hBinRendererTd, output, subframe_length, subframe_idx ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -369,9 +362,6 @@ ivas_error TDREND_GetMix( float *output[], /* i/o: ISM object synth / rendered output in 0,1 */ #else float output[][L_FRAME48k], /* i/o: ISM object synth / rendered output in 0,1 */ -#endif -#ifdef FIX_356_ISM_METADATA_SYNC - const int16_t subframe_update, #endif const int16_t subframe_length, /* i/o: subframe length */ const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ @@ -418,12 +408,7 @@ ivas_error TDREND_GetMix( { TDREND_SRC_REND_UpdateFiltersFromSpatialParams( hBinRendererTd, SrcRend_p, SrcSpatial_p, Src_p->hrf_left_prev, Src_p->hrf_right_prev, hrf_left_delta, hrf_right_delta, &intp_count, &Src_p->filterlength, &Src_p->itd, &Src_p->Gain, Src_p, -#ifdef FIX_356_ISM_METADATA_SYNC - subframe_update, -#endif - subframe_idx - - ); + subframe_idx ); } /* Render source if needed */ diff --git a/lib_rend/ivas_objectRenderer_sources.c b/lib_rend/ivas_objectRenderer_sources.c index 27c6b55e2d..f622764482 100644 --- a/lib_rend/ivas_objectRenderer_sources.c +++ b/lib_rend/ivas_objectRenderer_sources.c @@ -259,9 +259,6 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams( int16_t *itd, /* o: ITD value */ float *Gain, /* o: Gain value */ TDREND_SRC_t *Src_p, /* i/o: Source pointer */ -#ifdef FIX_356_ISM_METADATA_SYNC - const int16_t subframe_update, -#endif const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ ) { @@ -357,7 +354,7 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams( *intp_count = min( MAX_INTERPOLATION_STEPS, max( (int16_t) ( fabsf( azim_delta ) * MAX_ANGULAR_STEP_INV ), (int16_t) ( fabsf( elev_delta ) * MAX_ANGULAR_STEP_INV ) ) ); #ifdef FIX_356_ISM_METADATA_SYNC - if ( ( *intp_count > 0 ) && subframe_idx == subframe_update ) + if ( ( *intp_count > 0 ) && subframe_idx == ISM_METADATA_DELAY_SUBFRAME ) #else if ( ( *intp_count > 0 ) && subframe_idx == 0 ) #endif diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 5e25aa0da3..b43a048f38 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -389,9 +389,6 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams( int16_t *itd, /* o: ITD value */ float *Gain, /* o: Gain value */ TDREND_SRC_t *Src_p, -#ifdef FIX_356_ISM_METADATA_SYNC - const int16_t subframe_update, -#endif const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ ); -- GitLab From 93283e8abeac3d1f8a9cafd364c2828e6b4bda04 Mon Sep 17 00:00:00 2001 From: Sumeyra Kanik Date: Tue, 16 May 2023 15:23:35 +0200 Subject: [PATCH 183/331] Fix for overriding initial directivity default values --- lib_rend/lib_rend.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index c091ed15ff..671b7822ec 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -3740,6 +3740,9 @@ int16_t IVAS_REND_GetRenderConfig( hRCout->room_acoustics.nBands = hRCin->roomAcoustics.nBands; hRCout->room_acoustics.acousticPreDelay = hRCin->roomAcoustics.acousticPreDelay; hRCout->room_acoustics.inputPreDelay = hRCin->roomAcoustics.inputPreDelay; +#ifdef FIX_463_TD_RENDERER_DIRECTIVITY_RESET + mvr2r( hRCin->directivity, hRCout->directivity, 3 ); +#endif mvr2r( hRCin->roomAcoustics.pFc_input, hRCout->room_acoustics.pFc_input, CLDFB_NO_CHANNELS_MAX ); mvr2r( hRCin->roomAcoustics.pAcoustic_rt60, hRCout->room_acoustics.pAcoustic_rt60, CLDFB_NO_CHANNELS_MAX ); @@ -3766,9 +3769,8 @@ int16_t IVAS_REND_FeedRenderConfig( { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - hRenderConfig = hIvasRend->hRendererConfig; - mvr2r( renderConfig.directivity, hRenderConfig->directivity, 3 ); + #ifdef DEBUGGING hRenderConfig->renderer_type_override = RENDER_TYPE_OVERRIDE_NONE; if ( renderConfig.renderer_type_override == IVAS_RENDER_TYPE_OVERRIDE_FASTCONV ) -- GitLab From 6aee116631b5ce6b957f2c12e06608ac59af45db Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 16 May 2023 16:44:29 +0200 Subject: [PATCH 184/331] code reduction within FIX_356_ISM_METADATA_SYNC --- lib_com/delay_comp.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/lib_com/delay_comp.c b/lib_com/delay_comp.c index 29af982512..518a28aba7 100644 --- a/lib_com/delay_comp.c +++ b/lib_com/delay_comp.c @@ -69,14 +69,15 @@ int32_t get_delay( { delay = IVAS_ENC_DELAY_NS; - if ( ivas_format == MASA_FORMAT ) +#ifdef FIX_356_ISM_METADATA_SYNC + if ( ivas_format == ISM_FORMAT || ivas_format == MASA_FORMAT ) { - delay = 0; /* All delay is compensated in the decoder with MASA */ + delay = 0; /* All delay is compensated in the decoder with MASA/ISM */ } -#ifdef FIX_356_ISM_METADATA_SYNC - if (ivas_format == ISM_FORMAT) +#else + if ( ivas_format == MASA_FORMAT ) { - delay = 0; /* All delay is compensated in the decoder with ISM */ + delay = 0; /* All delay is compensated in the decoder with MASA */ } #endif } @@ -110,15 +111,15 @@ int32_t get_delay( delay += IVAS_FB_DEC_DELAY_NS; } - - if ( ivas_format == MASA_FORMAT ) +#ifdef FIX_356_ISM_METADATA_SYNC + if ( ivas_format == ISM_FORMAT || ivas_format == MASA_FORMAT ) { - delay += IVAS_ENC_DELAY_NS; /* Compensate also the encoder delay in the decoder with MASA */ + delay += IVAS_ENC_DELAY_NS; /* Compensate also the encoder delay in the decoder with ISM/MASA */ } -#ifdef FIX_356_ISM_METADATA_SYNC - if (ivas_format == ISM_FORMAT) +#else + if ( ivas_format == MASA_FORMAT ) { - delay += IVAS_ENC_DELAY_NS; /* Compensate also the encoder delay in the decoder with ISM */ + delay += IVAS_ENC_DELAY_NS; /* Compensate also the encoder delay in the decoder with MASA */ } #endif } -- GitLab From 824d802d5902ebd43224418e77ea4772e350f7d6 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Tue, 16 May 2023 16:50:05 +0200 Subject: [PATCH 185/331] fix synthesis config for DirAC LS output at high bitrates --- lib_com/options.h | 2 ++ lib_dec/ivas_dirac_dec.c | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index f7ee9e9c7c..ffde84d5d3 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -214,6 +214,8 @@ #define FIX_STEREO_474 /* FhG fix for issue 574, crash with SBA to stereo output at 512 kbps */ +#define FIX_DIRAC_LS_SYNTHESIS_CONFIG_479 /* FhG: fix for issue 479, broken LS output with DirAC at high BRs */ + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index c5485119ba..fa3e5b4a3e 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -526,7 +526,11 @@ ivas_error ivas_dirac_dec_config( } - if ( nchan_transport_orig > 2 && hDirAC->hOutSetup.is_loudspeaker_setup && st_ivas->renderer_type == RENDERER_DIRAC ) + if ( nchan_transport_orig > 2 && hDirAC->hOutSetup.is_loudspeaker_setup && st_ivas->renderer_type == RENDERER_DIRAC +#ifdef FIX_DIRAC_LS_SYNTHESIS_CONFIG + && !ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) +#endif + ) { hDirAC->synthesisConf = DIRAC_SYNTHESIS_PSD_LS; hDirAC->panningConf = DIRAC_PANNING_VBAP; -- GitLab From 0a6223abc4bf2a70715344dfa93b8ccd6b342998 Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 16 May 2023 16:50:58 +0200 Subject: [PATCH 186/331] fix warnings + clang-formatting --- lib_com/ivas_stat_com.h | 6 +++--- lib_dec/ivas_objectRenderer_internal.c | 5 +++++ lib_dec/lib_dec.c | 6 +++--- lib_rend/ivas_objectRenderer.c | 21 ++++++++++++++------- lib_rend/ivas_prot_rend.h | 7 ++++++- 5 files changed, 31 insertions(+), 14 deletions(-) diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index 6e98a6ba3c..1414051f51 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -61,9 +61,9 @@ typedef struct #ifdef ISM_NON_DIEGETIC_PAN int16_t non_diegetic_flag; /* Non-diegetic (non-headtracked) object flag */ #endif - float azimuth; /* azimuth value read from the input metadata file */ - float elevation; /* elevation value read from the input metadata file */ - float radius; /* radius value read from the input metadata file */ + float azimuth; /* azimuth value read from the input metadata file */ + float elevation; /* elevation value read from the input metadata file */ + float radius; /* radius value read from the input metadata file */ float yaw; /* yaw value read from the input metadata file */ float pitch; /* pitch value read from the input metadata file */ ISM_METADATA_ANGLE position_angle; /* Angle structs for azimuth and elevation */ diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index 873c75938a..6d701be0a5 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -129,8 +129,13 @@ void ObjRenderIVASSubframe( for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) { output_frame = st_ivas->hTcBuffer->subframe_nbslots[subframe_idx] * st_ivas->hTcBuffer->n_samples_granularity; + /* Update object position(s) */ +#ifdef FIX_356_ISM_METADATA_SYNC + TDREND_Update_object_positions( st_ivas->hBinRendererTd, st_ivas->nchan_transport, st_ivas->ivas_format, st_ivas->hIsmMetaData ); +#else TDREND_Update_object_positions( st_ivas->hBinRendererTd, st_ivas->nchan_transport, LFE_CHANNEL, st_ivas->ivas_format, st_ivas->hIsmMetaData, tc_local ); +#endif /* Update the listener's location/orientation */ TDREND_Update_listener_orientation( st_ivas->hBinRendererTd, diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 4e535f98d7..7eb660a6b3 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1594,11 +1594,11 @@ ivas_error IVAS_DEC_GetDelay( nSamples[2] = (int16_t) roundf( (float) st_ivas->binaural_latency_ns * hDecoderConfig->output_Fs / 1000000000.f ); nSamples[0] = nSamples[1] + nSamples[2]; -#ifdef FIX_356_ISM_METADATA_SYNC - if (st_ivas->ivas_format == ISM_FORMAT) +#ifdef FIX_356_ISM_METADATA_SYNC + if ( st_ivas->ivas_format == ISM_FORMAT ) { /* note: in ISM, all delay is compensated at the decoder by default, so subtract the encoder delay for print-out */ - nSamples[1] -= NS2SA(hDecoderConfig->output_Fs, IVAS_ENC_DELAY_NS); + nSamples[1] -= NS2SA( hDecoderConfig->output_Fs, IVAS_ENC_DELAY_NS ); } #endif diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 3129eaca4f..a7a8df5eed 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -293,7 +293,7 @@ ivas_error ivas_td_binaural_renderer_unwrap( int16_t c_indx, nS; c_indx = 0; - for (nS = 0; nS < num_src; nS++) + for ( nS = 0; nS < num_src; nS++ ) { if ( !( ivas_format == MC_FORMAT && nS == lfe_idx ) ) /* Skip LFE for MC */ { @@ -313,7 +313,7 @@ ivas_error ivas_td_binaural_renderer_unwrap( if ( subframe_idx == ISM_METADATA_DELAY_SUBFRAME ) { /* Update object position(s) */ - TDREND_Update_object_positions( hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, output ); + TDREND_Update_object_positions( hBinRendererTd, num_src, ivas_format, hIsmMetaData ); } #endif /* Update the listener's location/orientation */ @@ -471,21 +471,28 @@ static void TDREND_Clear_Update_flags( void TDREND_Update_object_positions( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o : TD Renderer handle */ const int16_t num_src, /* i : number of sources to render */ - const int16_t lfe_idx, /* i : Input LFE index */ - const IVAS_FORMAT in_format, /* i : Format of input sources */ - const ISM_METADATA_HANDLE *hIsmMetaData, /* i : Input metadata for ISM objects */ +#ifndef FIX_356_ISM_METADATA_SYNC + const int16_t lfe_idx, /* i : Input LFE index */ +#endif + const IVAS_FORMAT in_format, /* i : Format of input sources */ + const ISM_METADATA_HANDLE *hIsmMetaData /* i : Input metadata for ISM objects */ +#ifndef FIX_356_ISM_METADATA_SYNC + , #ifdef JBM_TSM_ON_TCS float *output[] #else float output[][L_FRAME48k] /* i/o: SCE/MC channels */ #endif +#endif ) { TDREND_DirAtten_t *DirAtten_p; int16_t nS; float Pos[3]; float Dir[3]; +#ifndef FIX_356_ISM_METADATA_SYNC int16_t c_indx; +#endif DirAtten_p = hBinRendererTd->DirAtten_p; @@ -661,8 +668,8 @@ ivas_error ivas_td_binaural_renderer_ext( const IVAS_REND_HeadRotData *headRotData, /* i : Input head positions */ const IVAS_REND_AudioObjectPosition *currentPos, /* i : Object position */ const REVERB_HANDLE hReverb, /* i : Reverberator handle */ - const int16_t output_frame, /* i : output frame length */ - float output[][L_FRAME48k] /* i/o: SCE channels / Binaural synthesis */ + const int16_t output_frame, /* i : output frame length */ + float output[][L_FRAME48k] /* i/o: SCE channels / Binaural synthesis */ ) { ISM_METADATA_FRAME hIsmMetaDataFrame; diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index b43a048f38..2c1ac1394b 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -311,14 +311,19 @@ void TDREND_Update_listener_orientation( void TDREND_Update_object_positions( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o : TD Renderer handle */ const int16_t num_src, /* i : number of sources to render */ +#ifndef FIX_356_ISM_METADATA_SYNC const int16_t lfe_idx, /* i : Input LFE index */ +#endif const IVAS_FORMAT in_format, /* i : Format of input sources */ - const ISM_METADATA_HANDLE *hIsmMetaData, /* i : Input metadata for ISM objects */ + const ISM_METADATA_HANDLE *hIsmMetaData /* i : Input metadata for ISM objects */ +#ifndef FIX_356_ISM_METADATA_SYNC + , #ifdef JBM_TSM_ON_TCS float *output[] /* i/o: SCE/MC channels */ #else float output[][L_FRAME48k] /* i/o: SCE/MC channels */ #endif +#endif ); void BSplineModelEvalDealloc( -- GitLab From f6fb2f2c9886e42c8cf23974edeb1b9691444447 Mon Sep 17 00:00:00 2001 From: knj Date: Tue, 16 May 2023 17:05:11 +0200 Subject: [PATCH 187/331] add fix for MDCT-Stereo PLC fadeout with TD concealment --- lib_com/ivas_cnst.h | 3 +++ lib_com/options.h | 1 + lib_dec/er_dec_tcx.c | 21 ++++++++++++++++++++- 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index f6369235a6..b5e3964319 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -885,6 +885,9 @@ enum fea_names #define MDCT_ST_PLC_FADEOUT_MIN_NOISE_NRG 0.001f #define MDCT_ST_PLC_FADEOUT_MAX_CONC_FRAME 2 * FRAMES_PER_SEC #define MDCT_ST_PLC_FADEOUT_TO_ZERO_LEN 20 +#ifdef FIX_MDCT_ST_PLC_FADEOUT_DELAY +#define MDCT_ST_PLC_FADEOUT_DELAY_4_LSP_FADE 3 +#endif typedef enum { EQUAL_CORES, diff --git a/lib_com/options.h b/lib_com/options.h index f7ee9e9c7c..23d3060986 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -213,6 +213,7 @@ #define FIX_DTX_428 /* FhG: fix for issue 428, crash with DTX and bitrate switching */ #define FIX_STEREO_474 /* FhG fix for issue 574, crash with SBA to stereo output at 512 kbps */ +#define FIX_MDCT_ST_PLC_FADEOUT_DELAY /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/er_dec_tcx.c b/lib_dec/er_dec_tcx.c index 1ce3bf2035..e29d8e22b9 100644 --- a/lib_dec/er_dec_tcx.c +++ b/lib_dec/er_dec_tcx.c @@ -551,20 +551,39 @@ void con_tcx( mvr2r( synth - M, buf, M ); mvr2r( buf, mem_syn, M ); - if ( A_cng != NULL ) { +#ifdef FIX_MDCT_ST_PLC_FADEOUT_DELAY + float alpha_delayed; + + alpha_delayed = 1.0f; + if (st->nbLostCmpt > MDCT_ST_PLC_FADEOUT_DELAY_4_LSP_FADE) + { + alpha_delayed = Damping_fact( st->core_ext_mode, st->nbLostCmpt - MDCT_ST_PLC_FADEOUT_DELAY_4_LSP_FADE, st->last_good, st->stab_fac, &( st->lp_gainp ), ACELP_CORE ); + } + + if ( st->plcBackgroundNoiseUpdated && alpha_delayed != 1.0f ) +#else if ( st->plcBackgroundNoiseUpdated && alpha != 1.0f ) +#endif { float lsp_local[M], lsp_fade[M], alpha_inv; +#ifdef FIX_MDCT_ST_PLC_FADEOUT_DELAY + alpha_inv = 1.0f - alpha_delayed; +#else alpha_inv = 1.0f - alpha; +#endif a2lsp_stab( A_local, lsp_local, lsp_local ); for ( i = 0; i < M; i++ ) { +#ifdef FIX_MDCT_ST_PLC_FADEOUT_DELAY + lsp_fade[i] = alpha_delayed * lsp_local[i] + alpha_inv * st->lspold_cng[i]; +#else lsp_fade[i] = alpha * lsp_local[i] + alpha_inv * st->lspold_cng[i]; +#endif } lsp2a_stab( lsp_fade, A_local, M ); -- GitLab From 19073465f65b79a6eec38969240a1cd3fd1bf4c9 Mon Sep 17 00:00:00 2001 From: Eleni Fotopoulou Date: Tue, 16 May 2023 17:11:36 +0200 Subject: [PATCH 188/331] revert chage in stereo classifier --- lib_enc/ivas_stereo_classifier.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/lib_enc/ivas_stereo_classifier.c b/lib_enc/ivas_stereo_classifier.c index 5e7d3a1623..9a54a9ed6d 100644 --- a/lib_enc/ivas_stereo_classifier.c +++ b/lib_enc/ivas_stereo_classifier.c @@ -62,8 +62,8 @@ #define XTALK_INTERCEPT_TD -1.770983f #define XTALK_INTERCEPT_DFT -0.758556f -#define EDGE_MAX_LEN 30 /* maximum length of buffer for edge detection */ -#define REDGE_MAX_LEN 30 /* maximum length of buffer for rising edge detection */ +#define EDGE_MAX_LEN 30 /* maximum length of buffer for edge detection */ +#define REDGE_MAX_LEN 30 /* maximum length of buffer for rising edge detection */ #define CLASSIFIER_ITD_THRES 8 /* ITD threshold in samples that enables classifier to switch */ @@ -998,13 +998,7 @@ void xtalk_classifier_dft( printf( "\nSwitch DFT-stereo -> TD-LR on frame %d\n", frame ); #endif } - else if ( -#ifdef HYBRID_ITD_MAX - hCPE->element_brate > IVAS_16k4 -#else - hCPE->element_brate >= IVAS_16k4 -#endif - && hStereoClassif->xtalk_decision == 0 && abs( itd ) > STEREO_DFT_ITD_MAX && ( hCPE->hCoreCoder[0]->lp_speech - hCPE->hCoreCoder[0]->lp_noise ) > 25.0f ) + else if ( hCPE->element_brate >= IVAS_16k4 && hStereoClassif->xtalk_decision == 0 && abs( itd ) > STEREO_DFT_ITD_MAX && ( hCPE->hCoreCoder[0]->lp_speech - hCPE->hCoreCoder[0]->lp_noise ) > 25.0f ) { hStereoClassif->xtalk_decision = 1; } -- GitLab From 93e57c84b5ec598763a41c6899ff69a327b905b6 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Tue, 16 May 2023 17:15:53 +0200 Subject: [PATCH 189/331] fix formatting --- lib_dec/ivas_dirac_dec.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index fa3e5b4a3e..2801c9c146 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -529,8 +529,8 @@ ivas_error ivas_dirac_dec_config( if ( nchan_transport_orig > 2 && hDirAC->hOutSetup.is_loudspeaker_setup && st_ivas->renderer_type == RENDERER_DIRAC #ifdef FIX_DIRAC_LS_SYNTHESIS_CONFIG && !ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) -#endif - ) +#endif + ) { hDirAC->synthesisConf = DIRAC_SYNTHESIS_PSD_LS; hDirAC->panningConf = DIRAC_PANNING_VBAP; -- GitLab From b0e3fcc7458c736b54d9ce24c89a15771ccb196d Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 16 May 2023 17:23:43 +0200 Subject: [PATCH 190/331] add initialization of "orientation_tracking" parameter --- apps/renderer.c | 1 - lib_dec/lib_dec.c | 7 +++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/renderer.c b/apps/renderer.c index 44cbeb0f36..4fcd3f92e1 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -1439,7 +1439,6 @@ static bool parseOrientationTracking( #endif ) { - to_upper( value ); if ( strcmp( value, "NONE" ) == 0 ) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index bac60476a2..c5d1173c8d 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -156,7 +156,7 @@ ivas_error IVAS_DEC_Open( , float no_diegetic_pan /* i : non diegetic panning gain */ #endif - ) +) { IVAS_DEC_HANDLE hIvasDec; Decoder_Struct *st_ivas; @@ -289,7 +289,9 @@ static void init_decoder_config( hDecoderConfig->Opt_HRTF_binary = 0; hDecoderConfig->Opt_Headrotation = 0; hDecoderConfig->Opt_RendConfigCustom = 0; -#ifndef FIX_439_OTR_PARAMS +#ifdef FIX_439_OTR_PARAMS + hDecoderConfig->orientation_tracking = HEAD_ORIENT_TRK_NONE; +#else hDecoderConfig->orientation_tracking = orientation_tracking; #endif #ifdef NON_DIEGETIC_PAN @@ -2804,6 +2806,7 @@ static ivas_error printConfigInfo_dec( } } #endif + #ifdef NON_DIEGETIC_PAN if ( st_ivas->hDecoderConfig->Opt_non_diegetic_pan ) { -- GitLab From 69c6748c1b28b2a66f791cde1c498b17399490a7 Mon Sep 17 00:00:00 2001 From: knj Date: Tue, 16 May 2023 17:24:45 +0200 Subject: [PATCH 191/331] apply clang format --- lib_dec/er_dec_tcx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/er_dec_tcx.c b/lib_dec/er_dec_tcx.c index e29d8e22b9..fb797f92c9 100644 --- a/lib_dec/er_dec_tcx.c +++ b/lib_dec/er_dec_tcx.c @@ -557,7 +557,7 @@ void con_tcx( float alpha_delayed; alpha_delayed = 1.0f; - if (st->nbLostCmpt > MDCT_ST_PLC_FADEOUT_DELAY_4_LSP_FADE) + if ( st->nbLostCmpt > MDCT_ST_PLC_FADEOUT_DELAY_4_LSP_FADE ) { alpha_delayed = Damping_fact( st->core_ext_mode, st->nbLostCmpt - MDCT_ST_PLC_FADEOUT_DELAY_4_LSP_FADE, st->last_good, st->stab_fac, &( st->lp_gainp ), ACELP_CORE ); } -- GitLab From b927f0ef0eb84c65836de664a245c028e3394404 Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 16 May 2023 17:27:03 +0200 Subject: [PATCH 192/331] clang-format --- lib_com/common_api_types.h | 10 +++++----- lib_dec/ivas_stat_dec.h | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib_com/common_api_types.h b/lib_com/common_api_types.h index 1040817ea1..3b9a331908 100644 --- a/lib_com/common_api_types.h +++ b/lib_com/common_api_types.h @@ -99,11 +99,11 @@ typedef struct #ifdef FIX_439_OTR_PARAMS typedef enum { - HEAD_ORIENT_TRK_NONE, - HEAD_ORIENT_TRK_REF, - HEAD_ORIENT_TRK_AVG, - HEAD_ORIENT_TRK_REF_VEC, - HEAD_ORIENT_TRK_REF_VEC_LEV + HEAD_ORIENT_TRK_NONE, + HEAD_ORIENT_TRK_REF, + HEAD_ORIENT_TRK_AVG, + HEAD_ORIENT_TRK_REF_VEC, + HEAD_ORIENT_TRK_REF_VEC_LEV } HEAD_ORIENT_TRK_T; #endif diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 7177c34b76..727b01c0ed 100755 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -1220,9 +1220,9 @@ typedef struct decoder_config_structure int16_t Opt_Headrotation; /* indicates whether head-rotation is used */ int16_t Opt_RendConfigCustom; /* indicates whether Renderer configuration custom setup is used */ #ifdef FIX_439_OTR_PARAMS - HEAD_ORIENT_TRK_T orientation_tracking; /* indicates orientation tracking type */ + HEAD_ORIENT_TRK_T orientation_tracking; /* indicates orientation tracking type */ #else - int16_t orientation_tracking; /* indicates orientation tracking type */ + int16_t orientation_tracking; /* indicates orientation tracking type */ #endif #ifdef NON_DIEGETIC_PAN int16_t Opt_non_diegetic_pan; /* indicates diegetic or not */ -- GitLab From 1f6f54591b7d2a7fe829b0e170a2e4a6cc99149e Mon Sep 17 00:00:00 2001 From: Eleni Fotopoulou Date: Tue, 16 May 2023 19:59:25 +0200 Subject: [PATCH 193/331] clang format --- lib_enc/ivas_stereo_classifier.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_enc/ivas_stereo_classifier.c b/lib_enc/ivas_stereo_classifier.c index 9a54a9ed6d..d4d0b310b6 100644 --- a/lib_enc/ivas_stereo_classifier.c +++ b/lib_enc/ivas_stereo_classifier.c @@ -62,8 +62,8 @@ #define XTALK_INTERCEPT_TD -1.770983f #define XTALK_INTERCEPT_DFT -0.758556f -#define EDGE_MAX_LEN 30 /* maximum length of buffer for edge detection */ -#define REDGE_MAX_LEN 30 /* maximum length of buffer for rising edge detection */ +#define EDGE_MAX_LEN 30 /* maximum length of buffer for edge detection */ +#define REDGE_MAX_LEN 30 /* maximum length of buffer for rising edge detection */ #define CLASSIFIER_ITD_THRES 8 /* ITD threshold in samples that enables classifier to switch */ -- GitLab From 5b9b506c8c766d068b13fac5c2dbbbcbb9a57970 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Tue, 16 May 2023 23:21:52 +0300 Subject: [PATCH 194/331] Adds several fixes to HBR MASA metadata path. Addresses issues 438 and 477 as well. --- lib_com/ivas_cnst.h | 3 ++ lib_com/ivas_masa_com.c | 37 +++++++++++-- lib_com/ivas_prot.h | 21 +++++--- lib_com/ivas_stat_com.h | 3 ++ lib_com/options.h | 1 + lib_dec/ivas_masa_dec.c | 38 ++++++++++++- lib_dec/ivas_qmetadata_dec.c | 101 ++++++++++++++++++++++++++++++++--- lib_enc/ivas_masa_enc.c | 66 ++++++++++++++++++++++- lib_enc/ivas_qmetadata_enc.c | 29 ++++++++-- 9 files changed, 274 insertions(+), 25 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index b5e3964319..bad8207658 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1235,6 +1235,9 @@ enum #define MASA_MAX_BITS_HR 2000 /* max. bit-budget for MASA metadata in HR mode*/ #define HR_MASA_ER_LEVELS 16 #endif +#ifdef FIX_HBR_MASAMETA +#define MAX_REDUCED_NBANDS 18 /* max number of subbands that is less than the default value 24 */ +#endif #define LIMIT_ER_ELEVATION_ENC 4 #define LIMIT_ER_SIMPLE_ENC 6 diff --git a/lib_com/ivas_masa_com.c b/lib_com/ivas_masa_com.c index 7c0955436d..0a87a384c7 100644 --- a/lib_com/ivas_masa_com.c +++ b/lib_com/ivas_masa_com.c @@ -313,20 +313,33 @@ void masa_sample_rate_band_correction( MASA_CODEC_CONFIG *config, /* i/o: MASA codec config */ int16_t *band_mapping, /* i/o: Band mapping used and modified */ IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: QMetadata structure for modification */ - const int32_t sampling_rate /* i : Sampling rate */ - , +#ifdef FIX_HBR_MASAMETA + const uint8_t maxBand, /* i : max band */ + uint8_t is_encoder, /* i: signals if called at encoder */ +#else + const int32_t sampling_rate, /* i : Sampling rate */ +#endif MASA_DECODER_EXT_OUT_META_HANDLE hExtOutMeta /* i/o: MASA decoder metadata ext out buffer */ ) { uint8_t band, sf; +#ifdef FIX_HBR_MASAMETA + int16_t highBand; +#else int16_t maxBin, highBand, maxBand; +#endif uint8_t numBands48k; +#ifdef FIX_HBR_MASAMETA + if ( maxBand == MASA_FREQUENCY_BANDS - 1 ) +#else if ( sampling_rate == 48000 ) +#endif { return; } +#ifndef FIX_HBR_MASAMETA /* Find maximum band usable at this sample rate */ maxBin = (int16_t) ( CLDFB_NO_CHANNELS_MAX * sampling_rate / 48000 ); maxBand = 0; @@ -335,7 +348,7 @@ void masa_sample_rate_band_correction( maxBand++; } maxBand--; - +#endif numBands48k = config->numCodingBands; for ( band = 1; band < config->numCodingBands + 1; band++ ) @@ -345,7 +358,21 @@ void masa_sample_rate_band_correction( if ( highBand >= maxBand ) { config->numCodingBands = band; + hQMetaData->numCodingBands = band; +#ifdef FIX_HBR_MASAMETA + if ( !is_encoder ) + { + if ( hQMetaData->q_direction->cfg.nbands > band ) + { + hQMetaData->q_direction->cfg.nbands = band; + } + if ( hQMetaData->no_directions == 2 && hQMetaData->q_direction[1].cfg.nbands > band ) + { + hQMetaData->q_direction[1].cfg.nbands = band; + } + } +#endif band_mapping[band] = maxBand; break; } @@ -393,7 +420,11 @@ void masa_sample_rate_band_correction( /* in decoder, zero the EXT out MASA meta buffer */ for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) { +#ifdef FIX_HBR_MASAMETA + for ( band = hQMetaData->numCodingBands; band < MASA_FREQUENCY_BANDS; band++ ) +#else for ( band = config->numCodingBands; band < MASA_FREQUENCY_BANDS; band++ ) +#endif { hExtOutMeta->directionIndex[0][sf][band] = SPH_IDX_FRONT; hExtOutMeta->directToTotalRatio[0][sf][band] = 0u; diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 5d4faf0eb0..b1dec1ed42 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3188,9 +3188,13 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: hQMetaData handle */ uint16_t *bitstream, /* i : bitstream */ int16_t *index, /* i/o: bitstream position */ - const SPHERICAL_GRID_DATA *sph_grid16, /* i : spherical grid for deindexing */ - const int16_t bits_sph_idx, - const int16_t bits_sp_coh + SPHERICAL_GRID_DATA *sph_grid16, /* i: spherical grid for deindexing */ + int16_t bits_sph_idx, + int16_t bits_sp_coh +#ifdef FIX_HBR_MASAMETA + , + uint8_t ncoding_bands_config +#endif ); #endif @@ -3504,7 +3508,7 @@ int16_t ivas_sba_get_nchan_metadata( void ivas_sba_get_spar_hoa_ch_ind( const int16_t num_md_chs, /* i : number of MD channels */ const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] + int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] ); /*! r: flag indicating to code SPAR HOA MD for all bands */ @@ -3512,7 +3516,7 @@ void ivas_sba_get_spar_hoa_md_flag( const int16_t sba_order, /* i : Ambisonic (SBA) order */ const int32_t ivas_total_brate, /* i : IVAS total bitrate */ int16_t *spar_hoa_md_flag, - int16_t *spar_hoa_dirac2spar_md_flag + int16_t *spar_hoa_dirac2spar_md_flag ); #else /*! r: flag indicating to code SPAR HOA MD for all bands */ @@ -5218,8 +5222,13 @@ void masa_sample_rate_band_correction( MASA_CODEC_CONFIG *config, /* i/o: MASA codec config */ int16_t *band_mapping, /* i/o: Band mapping used and modified */ IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: QMetadata structure for modification */ +#ifdef FIX_HBR_MASAMETA + const uint8_t maxBand, /* i : max band */ + uint8_t is_encoder, /* i: signals if called at encoder */ +#else const int32_t sampling_rate, /* i : sampling rate */ - MASA_DECODER_EXT_OUT_META_HANDLE hExtOutMeta /* i/o: MASA decoder metadata ext out buffer */ +#endif + MASA_DECODER_EXT_OUT_META_HANDLE hExtOutMeta /* i/o: MASA decoder metadata ext out buffer */ ); void invdct4_transform( diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index e2f2e0f1f2..b92a346ecc 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -481,6 +481,9 @@ typedef struct int16_t nbands; int16_t nblocks; int16_t start_band; +#ifdef FIX_HBR_MASAMETA + uint8_t inactiveBands; +#endif int16_t search_effort; MC_LS_SETUP mc_ls_setup; diff --git a/lib_com/options.h b/lib_com/options.h index 4150e91a5d..3ca08cbe54 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -220,6 +220,7 @@ #define HYBRID_ITD_MAX /* FhG: Improvement for DFT-stereo for cases with large ITDs */ +#define FIX_HBR_MASAMETA /* Nokia: Fixes to HBR MASA metadata at 384 and 512 kbps. Addresses issues 438 and 477 as well. */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 2c9fcbd008..51bf96934c 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -201,11 +201,20 @@ ivas_error ivas_masa_decode( { if ( ivas_total_brate >= IVAS_512k ) { - *nb_bits_read += ivas_qmetadata_dec_decode_hr_384_512( hQMetaData, st->bit_stream, &st->next_bit_pos, hMasa->data.sph_grid16, 16, 4 ); + *nb_bits_read += ivas_qmetadata_dec_decode_hr_384_512( hQMetaData, st->bit_stream, &st->next_bit_pos, hMasa->data.sph_grid16, 16, 4 +#ifdef FIX_HBR_MASAMETA + , hMasa->config.numCodingBands +#endif + ); } else { - *nb_bits_read += ivas_qmetadata_dec_decode_hr_384_512( hQMetaData, st->bit_stream, &st->next_bit_pos, hMasa->data.sph_grid16, 11, 3 ); + *nb_bits_read += ivas_qmetadata_dec_decode_hr_384_512( hQMetaData, st->bit_stream, &st->next_bit_pos, hMasa->data.sph_grid16, 11, 3 +#ifdef FIX_HBR_MASAMETA + , + hMasa->config.numCodingBands +#endif + ); } } else @@ -505,6 +514,10 @@ static ivas_error ivas_masa_dec_config( { int16_t i; MASA_DECODER_HANDLE hMasa; +#ifdef FIX_HBR_MASAMETA + uint8_t maxBand; + int16_t maxBin; +#endif ivas_error error; error = IVAS_ERR_OK; @@ -555,6 +568,26 @@ static ivas_error ivas_masa_dec_config( ivas_set_qmetadata_maxbit_req( st_ivas->hQMetaData, st_ivas->ivas_format ); +#ifdef FIX_HBR_MASAMETA + /* Find maximum band usable */ + maxBin = (int16_t) ( st_ivas->hDecoderConfig->output_Fs * INV_CLDFB_BANDWIDTH ); + maxBand = 0; + while ( MASA_band_grouping_24[maxBand] <= maxBin && maxBand < MASA_FREQUENCY_BANDS ) + { + maxBand++; + } + maxBand--; + + if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL ) + { + /* need to apply the sampling rate correction also for the EXT output MASA meta buffer */ + masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, maxBand, ( 0 || ( st_ivas->hDecoderConfig->ivas_total_brate <= IVAS_256k ) ), hMasa->data.extOutMeta ); + } + else + { + masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, maxBand, ( 0 || ( st_ivas->hDecoderConfig->ivas_total_brate <= IVAS_256k ) ), NULL ); + } +#else if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL ) { /* need to apply the sampling rate correction also for the EXT output MASA meta buffer */ @@ -564,6 +597,7 @@ static ivas_error ivas_masa_dec_config( { masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, st_ivas->hDecoderConfig->output_Fs, NULL ); } +#endif return error; } diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index 5480f73a33..21700eb297 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -806,12 +806,17 @@ int16_t ivas_qmetadata_dec_decode( /*! r: number of bits read */ int16_t ivas_qmetadata_dec_decode_hr_384_512( - IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: hQMetaData handle */ - uint16_t *bitstream, /* i : bitstream */ - int16_t *index, /* i/o: bitstream position */ - const SPHERICAL_GRID_DATA *sph_grid16, /* i : spherical grid for deindexing */ - const int16_t bits_sph_idx, - const int16_t bits_sp_coh ) + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: hQMetaData handle */ + uint16_t *bitstream, /* i : bitstream */ + int16_t *index, /* i/o: bitstream position */ + SPHERICAL_GRID_DATA *sph_grid16, /* i: spherical grid for deindexing */ + int16_t bits_sph_idx, + int16_t bits_sp_coh +#ifdef FIX_HBR_MASAMETA + , + uint8_t ncoding_bands_config +#endif +) { int16_t d, b, m; int16_t bits_diff_sum; @@ -821,7 +826,10 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( int16_t bits_no_dirs_coh, bits_sur_coherence; uint16_t all_coherence_zero; int16_t p[MASA_MAXIMUM_CODING_SUBBANDS], dif_p[MASA_MAXIMUM_CODING_SUBBANDS]; - +#ifdef FIX_HBR_MASAMETA + int16_t codedBands, sf_nbands0, sf_nbands1; + sf_nbands1 = 1; +#endif #ifdef DEBUG_MODE_QMETADATA static FILE *pF = NULL; static FILE *pF_azi = NULL; @@ -845,7 +853,57 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( #endif start_index_0 = *index; +#ifdef FIX_HBR_MASAMETA + /* read number of higher inactive/not encoded bands */ + if ( bitstream[( *index )--] ) + { + codedBands = ncoding_bands_config - ivas_qmetadata_DecodeExtendedGR( bitstream, index, MASA_MAXIMUM_CODING_SUBBANDS, 1 ) - 1; + } + else + { + codedBands = ncoding_bands_config; + } + for ( b = codedBands; b < ncoding_bands_config; b++ ) + { + for ( m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES; m++ ) + { + hQMetaData->q_direction[0].band_data[b].azimuth[m] = 0.0f; + hQMetaData->q_direction[0].band_data[b].elevation[m] = 0.0f; + hQMetaData->q_direction[0].band_data[b].energy_ratio[m] = 0.0f; + + if ( hQMetaData->coherence_flag && hQMetaData->q_direction[0].coherence_band_data != NULL ) + { + hQMetaData->q_direction[0].coherence_band_data[b].spread_coherence[m] = 0u; + } + + if ( hQMetaData->no_directions == 2 ) + { + hQMetaData->q_direction[1].band_data[b].azimuth[m] = 0.0f; + hQMetaData->q_direction[1].band_data[b].elevation[m] = 0.0f; + hQMetaData->q_direction[1].band_data[b].energy_ratio[m] = 0.0f; + + if ( hQMetaData->coherence_flag && hQMetaData->q_direction[1].coherence_band_data != NULL ) + { + hQMetaData->q_direction[1].coherence_band_data[b].spread_coherence[m] = 0u; + } + } + + if ( hQMetaData->coherence_flag && hQMetaData->surcoh_band_data != NULL ) + { + hQMetaData->surcoh_band_data[b].surround_coherence[m] = 0u; + } + } + + if ( hQMetaData->no_directions == 2 ) + { + hQMetaData->twoDirBands[b] = 0; + } + } + sf_nbands0 = hQMetaData->q_direction[0].cfg.nbands; + + hQMetaData->q_direction[0].cfg.nbands = codedBands; +#endif /*Coherence flag decoding*/ bits_no_dirs_coh = 0; all_coherence_zero = 1; @@ -867,12 +925,23 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( { /* Read which bands have 2 directions */ hQMetaData->q_direction[1].cfg.nbands = hQMetaData->numTwoDirBands; +#ifdef FIX_HBR_MASAMETA + sf_nbands1 = hQMetaData->q_direction[1].cfg.nbands; + if ( hQMetaData->q_direction[1].cfg.nbands > codedBands ) + { + hQMetaData->q_direction[1].cfg.nbands = codedBands; + } +#endif set_c( (int8_t *) hQMetaData->twoDirBands, 0, hQMetaData->q_direction[0].cfg.nbands ); d = *index; dif_p[0] = ivas_qmetadata_DecodeExtendedGR( bitstream, index, MASA_MAXIMUM_CODING_SUBBANDS, 0 ); p[0] = dif_p[0]; hQMetaData->twoDirBands[p[0]] = 1; +#ifdef FIX_HBR_MASAMETA + for ( b = 1; b < hQMetaData->q_direction[1].cfg.nbands; b++ ) +#else for ( b = 1; b < hQMetaData->numTwoDirBands; b++ ) +#endif { dif_p[b] = ivas_qmetadata_DecodeExtendedGR( bitstream, index, MASA_MAXIMUM_CODING_SUBBANDS, 0 ); p[b] = p[b - 1] + dif_p[b] + 1; @@ -881,6 +950,16 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( bits_no_dirs_coh += ( d - *index ); } +#ifdef FIX_HBR_MASAMETA + if ( bits_sph_idx == 16 && hQMetaData->no_directions == 2 ) + { + sf_nbands1 = hQMetaData->q_direction[1].cfg.nbands; + if ( hQMetaData->q_direction[1].cfg.nbands > codedBands ) + { + hQMetaData->q_direction[1].cfg.nbands = codedBands; + } + } +#endif bits_diff_sum = ivas_qmetadata_entropy_decode_diffuseness_hr_512( bitstream, index, &( hQMetaData->q_direction[0] ) ); if ( hQMetaData->no_directions == 2 ) @@ -1109,6 +1188,14 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( hQMetaData->dir_comp_ratio = 1.0f; } +#ifdef FIX_HBR_MASAMETA + hQMetaData->q_direction[0].cfg.nbands = sf_nbands0; + if ( hQMetaData->no_directions == 2 ) + { + hQMetaData->q_direction[1].cfg.nbands = sf_nbands1; + } +#endif + return ( start_index_0 - *index ); } diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 2527fa91aa..33147283dd 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -507,6 +507,10 @@ ivas_error ivas_masa_enc_config( uint8_t coherencePresent; uint8_t isActualTwoDir; /* Flag to tell that when there are two directions present in metadata, they both contain meaningful information. */ int32_t ivas_total_brate; +#ifdef FIX_HBR_MASAMETA + uint8_t maxBand; + int16_t maxBin, sf; +#endif ivas_error error; #ifdef HR_METADATA SPHERICAL_GRID_DATA *sphGrid; @@ -647,7 +651,55 @@ ivas_error ivas_masa_enc_config( ivas_set_qmetadata_maxbit_req( hQMetaData, ivas_format ); +#ifdef FIX_HBR_MASAMETA + /* Find maximum band usable */ + maxBin = (int16_t) ( st_ivas->hEncoderConfig->input_Fs * INV_CLDFB_BANDWIDTH ); + maxBand = 0; + while ( MASA_band_grouping_24[maxBand] <= maxBin && maxBand < MASA_FREQUENCY_BANDS ) + { + maxBand++; + } + maxBand--; + + if ( ivas_total_brate > IVAS_256k ) + { + int16_t continueLoop = 1; + while ( maxBand > 5 && continueLoop ) + { + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + if ( hMasa->data.energy[sf][maxBand] > 100000 ) + { + continueLoop = 0; + break; + } + } + if ( continueLoop ) + { + maxBand--; + } + } + + if ( maxBand == MASA_MAXIMUM_CODING_SUBBANDS - 1 ) + { + st_ivas->hQMetaData->q_direction->cfg.inactiveBands = 0; + } + else + { + st_ivas->hQMetaData->q_direction->cfg.inactiveBands = hMasa->config.numCodingBands - maxBand; + } + } + masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, hQMetaData, maxBand, (ivas_total_brate < IVAS_384k), NULL ); + + if ( hMasa->config.numTwoDirBands >= hMasa->config.numCodingBands ) + { + hMasa->config.numTwoDirBands = hMasa->config.numCodingBands; + set_c( (int8_t *) hMasa->data.twoDirBands, 1, hMasa->config.numCodingBands ); + } + +#else masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, hQMetaData, st_ivas->hEncoderConfig->input_Fs, NULL ); +#endif /* Transmit stereo signals using a mono downmix at lowest bitrates */ if ( ivas_format == MASA_FORMAT && st_ivas->nCPE == 1 && st_ivas->hCPE[0]->hStereoDft != NULL && st_ivas->hCPE[0]->hStereoDft->hConfig != NULL ) @@ -754,8 +806,11 @@ static void combine_freqbands_and_subframes( } } } - +#ifdef FIX_HBR_MASAMETA + if ( numCodingBands <= MAX_REDUCED_NBANDS) +#else if ( numCodingBands < MASA_FREQUENCY_BANDS ) +#endif { /* reduce metadata *frequency* resolution. time resolution is not touched */ for ( i = 0; i < numDirections; i++ ) @@ -2292,6 +2347,9 @@ static void masa_metadata_direction_alignment( { /* swap the metadata of the two directions in this TF-tile */ float tmp_val; +#ifdef FIX_HBR_MASAMETA + uint16_t tmp_int_val; +#endif tmp_val = hMeta->directional_meta[0].azimuth[sf][band]; hMeta->directional_meta[0].azimuth[sf][band] = hMeta->directional_meta[1].azimuth[sf][band]; hMeta->directional_meta[1].azimuth[sf][band] = tmp_val; @@ -2299,7 +2357,11 @@ static void masa_metadata_direction_alignment( tmp_val = hMeta->directional_meta[0].elevation[sf][band]; hMeta->directional_meta[0].elevation[sf][band] = hMeta->directional_meta[1].elevation[sf][band]; hMeta->directional_meta[1].elevation[sf][band] = tmp_val; - +#ifdef FIX_HBR_MASAMETA + tmp_int_val = hMeta->directional_meta[0].spherical_index[sf][band]; + hMeta->directional_meta[0].spherical_index[sf][band] = hMeta->directional_meta[1].spherical_index[sf][band]; + hMeta->directional_meta[1].spherical_index[sf][band] = tmp_int_val; +#endif tmp_val = hMeta->directional_meta[0].energy_ratio[sf][band]; hMeta->directional_meta[0].energy_ratio[sf][band] = hMeta->directional_meta[1].energy_ratio[sf][band]; hMeta->directional_meta[1].energy_ratio[sf][band] = tmp_val; diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index 64d5b8e6aa..cfa81333e7 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -787,7 +787,19 @@ ivas_error ivas_qmetadata_enc_encode_hr_384_512( /* Check if coherence should be encoded */ all_coherence_zero = 1; bits_no_dirs_coh = 0; - + #ifdef FIX_HBR_MASAMETA + if ( hQMetaData->q_direction->cfg.inactiveBands > 0 ) + { + push_next_indice( hMetaData, 1, 1 ); + /* write the number of inactive higher bands */ + ivas_qmetadata_encode_extended_gr( hMetaData, hQMetaData->q_direction->cfg.inactiveBands - 1, MASA_MAXIMUM_CODING_SUBBANDS, 1 ); + } + else + { + /* no change */ + push_next_indice( hMetaData, 0, 1 ); + } +#endif if ( hQMetaData->coherence_flag ) { all_coherence_zero = hQMetaData->all_coherence_zero; @@ -956,7 +968,16 @@ ivas_error ivas_qmetadata_enc_encode_hr_384_512( } } } - +#ifdef FIX_HBR_MASAMETA + if ( hQMetaData->q_direction->cfg.inactiveBands > 0 ) + { + hQMetaData->q_direction[0].cfg.nbands += hQMetaData->q_direction->cfg.inactiveBands; + if ( ndirections > 1 ) + { + hQMetaData->q_direction[1].cfg.nbands += hQMetaData->q_direction->cfg.inactiveBands; + } + } +#endif return error; } #endif @@ -4683,9 +4704,7 @@ static int16_t coherence_coding_length( if ( sum_s( no_cv, coding_subbands ) > MASA_COH_LIMIT_2IDX ) { -#ifdef DEBUGGING - assert( coding_subbands % 2 == 0 ); -#endif + no_cb = 1; half_coding_subbands = coding_subbands / 2; for ( j = 0; j < half_coding_subbands; j++ ) -- GitLab From 98386a5ce1e33e0a9cac0875620ab32600aff98b Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Tue, 16 May 2023 23:34:28 +0300 Subject: [PATCH 195/331] Apply clang format --- lib_com/ivas_masa_com.c | 6 +++--- lib_dec/ivas_masa_dec.c | 9 +++++---- lib_enc/ivas_masa_enc.c | 6 +++--- lib_enc/ivas_qmetadata_enc.c | 2 +- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/lib_com/ivas_masa_com.c b/lib_com/ivas_masa_com.c index 0a87a384c7..59b24050b8 100644 --- a/lib_com/ivas_masa_com.c +++ b/lib_com/ivas_masa_com.c @@ -314,10 +314,10 @@ void masa_sample_rate_band_correction( int16_t *band_mapping, /* i/o: Band mapping used and modified */ IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: QMetadata structure for modification */ #ifdef FIX_HBR_MASAMETA - const uint8_t maxBand, /* i : max band */ - uint8_t is_encoder, /* i: signals if called at encoder */ + const uint8_t maxBand, /* i : max band */ + uint8_t is_encoder, /* i: signals if called at encoder */ #else - const int32_t sampling_rate, /* i : Sampling rate */ + const int32_t sampling_rate, /* i : Sampling rate */ #endif MASA_DECODER_EXT_OUT_META_HANDLE hExtOutMeta /* i/o: MASA decoder metadata ext out buffer */ ) diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 51bf96934c..bd89b36295 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -201,19 +201,20 @@ ivas_error ivas_masa_decode( { if ( ivas_total_brate >= IVAS_512k ) { - *nb_bits_read += ivas_qmetadata_dec_decode_hr_384_512( hQMetaData, st->bit_stream, &st->next_bit_pos, hMasa->data.sph_grid16, 16, 4 + *nb_bits_read += ivas_qmetadata_dec_decode_hr_384_512( hQMetaData, st->bit_stream, &st->next_bit_pos, hMasa->data.sph_grid16, 16, 4 #ifdef FIX_HBR_MASAMETA - , hMasa->config.numCodingBands + , + hMasa->config.numCodingBands #endif ); } else { - *nb_bits_read += ivas_qmetadata_dec_decode_hr_384_512( hQMetaData, st->bit_stream, &st->next_bit_pos, hMasa->data.sph_grid16, 11, 3 + *nb_bits_read += ivas_qmetadata_dec_decode_hr_384_512( hQMetaData, st->bit_stream, &st->next_bit_pos, hMasa->data.sph_grid16, 11, 3 #ifdef FIX_HBR_MASAMETA , hMasa->config.numCodingBands -#endif +#endif ); } } diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 33147283dd..6bc1388c9c 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -689,14 +689,14 @@ ivas_error ivas_masa_enc_config( st_ivas->hQMetaData->q_direction->cfg.inactiveBands = hMasa->config.numCodingBands - maxBand; } } - masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, hQMetaData, maxBand, (ivas_total_brate < IVAS_384k), NULL ); + masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, hQMetaData, maxBand, ( ivas_total_brate < IVAS_384k ), NULL ); if ( hMasa->config.numTwoDirBands >= hMasa->config.numCodingBands ) { hMasa->config.numTwoDirBands = hMasa->config.numCodingBands; set_c( (int8_t *) hMasa->data.twoDirBands, 1, hMasa->config.numCodingBands ); } - + #else masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, hQMetaData, st_ivas->hEncoderConfig->input_Fs, NULL ); #endif @@ -807,7 +807,7 @@ static void combine_freqbands_and_subframes( } } #ifdef FIX_HBR_MASAMETA - if ( numCodingBands <= MAX_REDUCED_NBANDS) + if ( numCodingBands <= MAX_REDUCED_NBANDS ) #else if ( numCodingBands < MASA_FREQUENCY_BANDS ) #endif diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index cfa81333e7..d783b4e0d5 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -787,7 +787,7 @@ ivas_error ivas_qmetadata_enc_encode_hr_384_512( /* Check if coherence should be encoded */ all_coherence_zero = 1; bits_no_dirs_coh = 0; - #ifdef FIX_HBR_MASAMETA +#ifdef FIX_HBR_MASAMETA if ( hQMetaData->q_direction->cfg.inactiveBands > 0 ) { push_next_indice( hMetaData, 1, 1 ); -- GitLab From 31fc667ee345e97f8d39aae1681a345e7a372eb2 Mon Sep 17 00:00:00 2001 From: Shikha Shetgeri <100861@ittiam.com> Date: Wed, 17 May 2023 11:30:59 +0530 Subject: [PATCH 196/331] pipeline_fix_1 --- tests/test_sba_bs_dec_plc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_sba_bs_dec_plc.py b/tests/test_sba_bs_dec_plc.py index ae757eccf4..e969b28407 100644 --- a/tests/test_sba_bs_dec_plc.py +++ b/tests/test_sba_bs_dec_plc.py @@ -91,7 +91,7 @@ def test_sba_plc_system( # skip high bitrates for DTX until DTX issue is resolved pytest.skip() if ivas_br == '13200' or ivas_br == '16400': - if dtx == '1' and agc == 0 and fs != '16': + if dtx == '1' and fs != '16': SID = 1 else: pytest.skip() -- GitLab From 28ced4cc3a8eda01c3850cf04221348fc91e74b8 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Wed, 17 May 2023 10:56:09 +0300 Subject: [PATCH 197/331] Fixes issue 482 --- lib_com/options.h | 1 + lib_rend/lib_rend.c | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 4150e91a5d..fa2513c335 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -220,6 +220,7 @@ #define HYBRID_ITD_MAX /* FhG: Improvement for DFT-stereo for cases with large ITDs */ +#define FIX_482_DUMMYDEC_INIT /* Nokia: fix issue #428: missing inits for dummyDec in IVAS_rend */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index ef5561ca98..10f6872ed6 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -2495,6 +2495,11 @@ static DecoderDummy *initDecoderDummy( decDummy->hMasa = NULL; decDummy->hDiracDecBin = NULL; decDummy->hQMetaData = NULL; +#ifdef FIX_482_DUMMYDEC_INIT + decDummy->hHrtfParambin = NULL; + decDummy->hHeadTrackData = NULL; + decDummy->hDirAC = NULL; +#endif #ifdef JBM_TSM_ON_TCS decDummy->hTcBuffer = NULL; #endif @@ -2511,6 +2516,19 @@ static DecoderDummy *initDecoderDummy( decDummy->hHeadTrackData->Rmat_prev[i][i] = 1.0f; } +#ifdef FIX_482_DUMMYDEC_INIT + set_zero( decDummy->hHeadTrackData->chEneIIR[0], MASA_FREQUENCY_BANDS ); + set_zero( decDummy->hHeadTrackData->chEneIIR[1], MASA_FREQUENCY_BANDS ); + set_zero( decDummy->hHeadTrackData->procChEneIIR[0], MASA_FREQUENCY_BANDS ); + set_zero( decDummy->hHeadTrackData->procChEneIIR[1], MASA_FREQUENCY_BANDS ); + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + decDummy->hHeadTrackData->Quaternions[i].w = 1.0f; + decDummy->hHeadTrackData->Quaternions[i].x = 0.0f; + decDummy->hHeadTrackData->Quaternions[i].y = 0.0f; + decDummy->hHeadTrackData->Quaternions[i].z = 0.0f; + } +#endif decDummy->hHeadTrackData->num_quaternions = 0; decDummy->hHeadTrackData->lrSwitchInterpVal = 0.0f; decDummy->hHeadTrackData->lrSwitchedCurrent = 0; -- GitLab From 5fae92c8be850607e78d3f77a8c9d9589d47f4de Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 16 May 2023 10:04:25 +0200 Subject: [PATCH 198/331] typo in comments --- lib_dec/lib_dec.c | 6 ++---- lib_dec/lib_dec.h | 4 ++-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 17c718bb48..a8689a5bf8 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -535,8 +535,8 @@ ivas_error IVAS_DEC_Configure( ivas_error IVAS_DEC_EnableVoIP( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ #ifdef VARIABLE_SPEED_DECODING - const IVAS_DEC_VOIP_MODE voipMode, /* i : VoIP or varable speed */ - const uint16_t speedFac, /* i : speed factor for varable speed */ + const IVAS_DEC_VOIP_MODE voipMode, /* i : VoIP or variable speed */ + const uint16_t speedFac, /* i : speed factor for variable speed */ #endif const int16_t jbmSafetyMargin, /* i : allowed delay reserve for JBM, in milliseconds */ const IVAS_DEC_INPUT_FORMAT inputFormat /* i : format of the input bitstream */ @@ -557,11 +557,9 @@ ivas_error IVAS_DEC_EnableVoIP( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - hDecoderConfig = hIvasDec->st_ivas->hDecoderConfig; hIvasDec->Opt_VOIP = 1; - #ifdef JBM_TSM_ON_TCS hDecoderConfig->voip_active = 1; #endif diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index fd8735dda6..8151f581c5 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -266,8 +266,8 @@ ivas_error IVAS_DEC_VoIP_Flush( ivas_error IVAS_DEC_EnableVoIP( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ #ifdef VARIABLE_SPEED_DECODING - const IVAS_DEC_VOIP_MODE voipMode, /* i : VoIP or varable speed */ - const uint16_t speedFac, /* i : speed factor for varable speed */ + const IVAS_DEC_VOIP_MODE voipMode, /* i : VoIP or variable speed */ + const uint16_t speedFac, /* i : speed factor for variable speed */ #endif const int16_t jbmSafetyMargin, /* i : allowed delay reserve for JBM, in milliseconds */ const IVAS_DEC_INPUT_FORMAT inputFormat /* i : format of the input bitstream */ -- GitLab From d1648520de1bf46db7f2495a2f34053bb1dd1b7a Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 16 May 2023 09:53:43 +0200 Subject: [PATCH 199/331] VARIABLE_SPEED_DECODING: formal improvements --- apps/decoder.c | 4 +-- lib_com/ivas_prot.h | 4 +-- lib_dec/ivas_jbm_dec.c | 21 ++++++++++++--- lib_dec/ivas_objectRenderer_internal.c | 9 ++++--- lib_dec/lib_dec.c | 37 +++++++++++++++++++++++--- readme.txt | 2 ++ 6 files changed, 62 insertions(+), 15 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 9b6b856765..449e08223f 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -1010,7 +1010,7 @@ static bool parseCmdlIVAS_dec( else if ( strcmp( argv_to_upper, "-VS" ) == 0 ) { i++; - int tmp = 100; + int32_t tmp = 100; arg->variableSpeedMode = true; if ( i < argc - 3 ) { @@ -1037,7 +1037,7 @@ static bool parseCmdlIVAS_dec( else if ( strcmp( argv_to_upper, "-VOIP_FRAMESIZE" ) == 0 ) { i++; - int tmp; + int32_t tmp; if ( i < argc - 3 ) { if ( !is_digits_only( argv[i] ) ) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 5d4faf0eb0..b832c03e70 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5715,10 +5715,10 @@ ivas_error ivas_td_binaural_renderer( ); #ifdef JBM_TSM_ON_TCS -void ObjRenderIVASSubframe( +ivas_error ivas_td_binaural_renderer_sf( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ float *output[], /* i/o: SCE channels / Binaural synthesis */ - const int16_t output_frame /* i : output frame length */ + const int16_t n_samples_granularity /* i : granularity of the renderer/buffer */ ); #endif diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index f33a5e01e6..6c58e143bb 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -716,6 +716,7 @@ ivas_error ivas_jbm_dec_render( else /* ISM_MODE_DISC */ { *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); + /* Loudspeaker or Ambisonics rendering */ if ( st_ivas->renderer_type == RENDERER_TD_PANNING || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { @@ -731,7 +732,9 @@ ivas_error ivas_jbm_dec_render( /* Binaural rendering */ if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) { - ObjRenderIVASSubframe( st_ivas, p_output, *nSamplesRendered ); + if ( ( ivas_td_binaural_renderer_sf( st_ivas, p_output, *nSamplesRendered ) ) != IVAS_ERR_OK ) + { + return error; } else if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { @@ -834,7 +837,11 @@ ivas_error ivas_jbm_dec_render( } else if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) { - ObjRenderIVASSubframe( st_ivas, p_output, *nSamplesRendered ); + if ( ( ivas_td_binaural_renderer_sf( st_ivas, p_output, *nSamplesRendered ) ) != IVAS_ERR_OK ) + { + return error; + } + ivas_binaural_add_LFE( st_ivas, *nSamplesRendered, st_ivas->hTcBuffer->tc, p_output ); } } @@ -995,7 +1002,9 @@ ivas_error ivas_jbm_dec_flush_renderer( /* Binaural rendering */ if ( renderer_type_old == RENDERER_BINAURAL_OBJECTS_TD ) { - ObjRenderIVASSubframe( st_ivas, p_output, hTcBuffer->n_samples_granularity ); + if ( ( ivas_td_binaural_renderer_sf( st_ivas, p_output, hTcBuffer->n_samples_granularity ) ) != IVAS_ERR_OK ) + { + return error; } else if ( renderer_type_old == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { @@ -1050,7 +1059,11 @@ ivas_error ivas_jbm_dec_flush_renderer( } else if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) { - ObjRenderIVASSubframe( st_ivas, p_output, hTcBuffer->n_samples_granularity ); + if ( ( ivas_td_binaural_renderer_sf( st_ivas, p_output, hTcBuffer->n_samples_granularity ) ) != IVAS_ERR_OK ) + { + return error; + } + ivas_binaural_add_LFE( st_ivas, hTcBuffer->n_samples_granularity, st_ivas->hTcBuffer->tc, p_output ); } } diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index 873c75938a..ff65660697 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -85,16 +85,17 @@ ivas_error ivas_td_binaural_renderer( #ifdef JBM_TSM_ON_TCS /*---------------------------------------------------------------------* - * ObjRenderIVASFrame() + * ivas_td_binaural_renderer_sf() * * Receives the current frames for the object streams, updates metadata * and renders the current frame. *---------------------------------------------------------------------*/ -void ObjRenderIVASSubframe( +ivas_error ivas_td_binaural_renderer_sf( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ float *output[], /* i/o: SCE channels / Binaural synthesis */ - const int16_t n_samples_asked ) + const int16_t n_samples_granularity /* i : granularity of the renderer/buffer */ +) { int16_t first_sf, last_sf, subframe_idx; float reverb_signal[BINAURAL_CHANNELS][L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; @@ -116,7 +117,7 @@ void ObjRenderIVASSubframe( } slot_size = st_ivas->hTcBuffer->n_samples_granularity; /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ - slots_to_render = min( st_ivas->hTcBuffer->num_slots - st_ivas->hTcBuffer->slots_rendered, n_samples_asked / slot_size ); + slots_to_render = min( st_ivas->hTcBuffer->num_slots - st_ivas->hTcBuffer->slots_rendered, n_samples_granularity / slot_size ); first_sf = st_ivas->hTcBuffer->subframes_rendered; last_sf = first_sf; st_ivas->hTcBuffer->slots_rendered += slots_to_render; diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index a8689a5bf8..99c6c20e01 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1889,6 +1889,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( return IVAS_ERR_VS_FRAME_NEEDED; } #endif + #ifdef JBM_TSM_ON_TCS if ( hVoIP->nSamplesAvailableNext == 0 ) { @@ -1907,6 +1908,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( extBufferedTime_ms = extBufferedSamples * 1000 / hDecoderConfig->output_Fs; dataUnit = NULL; + #ifdef VARIABLE_SPEED_DECODING if ( hVoIP->mode == IVAS_DEC_VOIP_MODE_VOIP ) { @@ -1966,6 +1968,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( #ifdef VARIABLE_SPEED_DECODING } #endif + /* decode */ if ( !hIvasDec->hasBeenFedFirstGoodFrame ) { @@ -2060,6 +2063,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( hVoIP->lastDecodedWasActive = 1; } #endif + /* limit scale to range supported by time scaler */ if ( scale < APA_MIN_SCALE ) { @@ -3195,14 +3199,30 @@ static ivas_error input_format_API_to_internal( return IVAS_ERR_OK; } + #ifdef JBM_TSM_ON_TCS -static int16_t IVAS_DEC_VoIP_GetRenderGranularity( Decoder_Struct *st_ivas ) +/*---------------------------------------------------------------------* + * IVAS_DEC_VoIP_GetRenderGranularity() + * + * + *---------------------------------------------------------------------*/ + +static int16_t IVAS_DEC_VoIP_GetRenderGranularity( + Decoder_Struct *st_ivas ) { return st_ivas->hTcBuffer->n_samples_granularity; } -static JBM_RENDERER_TYPE IVAS_DEC_VoIP_GetRendererConfig( IVAS_DEC_HANDLE hIvasDec ) + +/*---------------------------------------------------------------------* + * IVAS_DEC_VoIP_GetRendererConfig() + * + * + *---------------------------------------------------------------------*/ + +static JBM_RENDERER_TYPE IVAS_DEC_VoIP_GetRendererConfig( + IVAS_DEC_HANDLE hIvasDec ) { JBM_RENDERER_TYPE rendererType; rendererType = JBM_RENDERER_NONE; @@ -3219,7 +3239,17 @@ static JBM_RENDERER_TYPE IVAS_DEC_VoIP_GetRendererConfig( IVAS_DEC_HANDLE hIvasD return rendererType; } -ivas_error IVAS_DEC_VoIP_reconfigure( IVAS_DEC_HANDLE hIvasDec, const uint16_t nTransportChannels, const uint16_t l_ts ) + +/*---------------------------------------------------------------------* + * IVAS_DEC_VoIP_reconfigure() + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_VoIP_reconfigure( + IVAS_DEC_HANDLE hIvasDec, + const uint16_t nTransportChannels, + const uint16_t l_ts ) { IVAS_DEC_VOIP *hVoIP; @@ -3240,6 +3270,7 @@ ivas_error IVAS_DEC_VoIP_reconfigure( IVAS_DEC_HANDLE hIvasDec, const uint16_t n #else startQuality = 1.0f; #endif + /* get current renderer type*/ hVoIP->rendererType = IVAS_DEC_VoIP_GetRendererConfig( hIvasDec ); hDecoderConfig = hIvasDec->st_ivas->hDecoderConfig; diff --git a/readme.txt b/readme.txt index 21a5a19e79..5660aa353f 100644 --- a/readme.txt +++ b/readme.txt @@ -245,6 +245,8 @@ Options: The decoder may read rtpdump files containing TS26.445 Annex A.2.2 EVS RTP Payload Format. The SDP parameter hf_only is required. Reading RFC4867 AMR/AMR-WB RTP payload format is not supported. +-VS fac : Varaible Speed mode: change speed of playout fac as integer in percent. + fac<100 faster, fac>100 slower -Tracefile TF : VoIP mode: Generate trace file named TF -fec_cfg_file : Optimal channel aware configuration computed by the JBM as described in Section 6.3.1 of TS26.448. The output is -- GitLab From b3a3a4fe3d64bed8ee85e6f1f5962d7c77e5e9a9 Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 15 May 2023 12:30:31 +0200 Subject: [PATCH 200/331] JBM_TSM_ON_TCS: formal improvements --- Workspace_msvc/lib_com.vcxproj | 2 +- Workspace_msvc/lib_debug.vcxproj | 2 +- Workspace_msvc/lib_dec.vcxproj | 2 +- Workspace_msvc/lib_enc.vcxproj | 2 +- Workspace_msvc/lib_rend.vcxproj | 2 +- lib_com/ivas_prot.h | 125 +++++++++++++------------- lib_dec/ivas_jbm_dec.c | 145 ++++++++++++++++++++++++++----- 7 files changed, 192 insertions(+), 88 deletions(-) diff --git a/Workspace_msvc/lib_com.vcxproj b/Workspace_msvc/lib_com.vcxproj index bfe36b1f48..23aa2ae3f0 100644 --- a/Workspace_msvc/lib_com.vcxproj +++ b/Workspace_msvc/lib_com.vcxproj @@ -78,7 +78,7 @@ Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;%(AdditionalIncludeDirectories) + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) EnableFastChecks diff --git a/Workspace_msvc/lib_debug.vcxproj b/Workspace_msvc/lib_debug.vcxproj index 9b7b580661..3b648fae04 100644 --- a/Workspace_msvc/lib_debug.vcxproj +++ b/Workspace_msvc/lib_debug.vcxproj @@ -73,7 +73,7 @@ Disabled - ..\lib_com;..\lib_debug;..\lib_util;%(AdditionalIncludeDirectories) + ..\lib_com;..\lib_debug;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) false diff --git a/Workspace_msvc/lib_dec.vcxproj b/Workspace_msvc/lib_dec.vcxproj index 760621d7a4..80910aa5e7 100644 --- a/Workspace_msvc/lib_dec.vcxproj +++ b/Workspace_msvc/lib_dec.vcxproj @@ -89,7 +89,7 @@ Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_util;..\lib_rend;%(AdditionalIncludeDirectories) + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) EnableFastChecks diff --git a/Workspace_msvc/lib_enc.vcxproj b/Workspace_msvc/lib_enc.vcxproj index d9f8e974f0..3378ac10f0 100644 --- a/Workspace_msvc/lib_enc.vcxproj +++ b/Workspace_msvc/lib_enc.vcxproj @@ -89,7 +89,7 @@ Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;%(AdditionalIncludeDirectories) + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) EnableFastChecks diff --git a/Workspace_msvc/lib_rend.vcxproj b/Workspace_msvc/lib_rend.vcxproj index 4bd0ca9a93..865652649a 100644 --- a/Workspace_msvc/lib_rend.vcxproj +++ b/Workspace_msvc/lib_rend.vcxproj @@ -89,7 +89,7 @@ Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_util;%(AdditionalIncludeDirectories) + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) EnableFastChecks diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index b832c03e70..363b0ca4e3 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -263,11 +263,11 @@ uint32_t ivas_syn_output( #ifdef JBM_TSM_ON_TCS void ivas_syn_output_f( - float *synth[], /* i/o: float synthesis signal */ - const int16_t output_frame, /* i : output frame length (one channel) */ - const int16_t n_channels, /* i : number of output channels */ - float *synth_out /* o : integer 16 bits synthesis signal */ - ); + float *synth[], /* i/o: float synthesis signal */ + const int16_t output_frame, /* i : output frame length (one channel) */ + const int16_t n_channels, /* i : number of output channels */ + float *synth_out /* o : integer 16 bits synthesis signal */ +); #endif void ivas_initialize_handles_enc( @@ -312,10 +312,10 @@ ivas_error ivas_dec( ivas_error ivas_dec_setup( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ - #ifdef JBM_TSM_ON_TCS +#ifdef JBM_TSM_ON_TCS , - uint16_t *nSamplesRendered, /* o : number of samples flushed from the previous frame (JBM) */ - int16_t *data /* o : flushed PCM samples */ + uint16_t *nSamplesRendered, /* o : number of samples flushed from the previous frame (JBM) */ + int16_t *data /* o : flushed PCM samples */ #endif ); @@ -759,102 +759,107 @@ void dtx_read_padding_bits( const int16_t num_bits ); + #ifdef JBM_TSM_ON_TCS /*----------------------------------------------------------------------------------* * JBM prototypes *----------------------------------------------------------------------------------*/ ivas_error ivas_jbm_dec_tc( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - float *data /* o : output synthesis signal */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *data /* o : output synthesis signal */ ); ivas_error ivas_jbm_dec_render( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const uint16_t nSamplesAsked, /* i : number of samples wanted */ - uint16_t *nSamplesRendered, /* o : number of samples rendered */ - uint16_t *nSamplesAvailableNext, /* o : number of samples still available in the rendering pipeline */ - int16_t *data /* o : output synthesis signal */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const uint16_t nSamplesAsked, /* i : number of samples wanted */ + uint16_t *nSamplesRendered, /* o : number of samples rendered */ + uint16_t *nSamplesAvailableNext, /* o : number of samples still available in the rendering pipeline */ + int16_t *data /* o : output synthesis signal */ ); ivas_error ivas_jbm_dec_flush_renderer( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const int16_t tc_granularity_new, /* i : new renderer granularity */ - const RENDERER_TYPE renderer_type_old, /* i : old renderer type */ - const AUDIO_CONFIG intern_config_old, /* i : old internal config */ - const IVAS_OUTPUT_SETUP_HANDLE hIntSetupOld, /* i : old internal output setup */ - const MC_MODE mc_mode_old, /* i : old MC mode */ - const ISM_MODE ism_mode_old, /* i : old ISM mode */ - uint16_t *nSamplesRendered, /* o : number of samples flushed */ - int16_t *data /* o : rendered samples */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t tc_granularity_new, /* i : new renderer granularity */ + const RENDERER_TYPE renderer_type_old, /* i : old renderer type */ + const AUDIO_CONFIG intern_config_old, /* i : old internal config */ + const IVAS_OUTPUT_SETUP_HANDLE hIntSetupOld, /* i : old internal output setup */ + const MC_MODE mc_mode_old, /* i : old MC mode */ + const ISM_MODE ism_mode_old, /* i : old ISM mode */ + uint16_t *nSamplesRendered, /* o : number of samples flushed */ + int16_t *data /* o : rendered samples */ ); ivas_error ivas_jbm_dec_feed_tc_to_renderer( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const int16_t nSamplesForRendering, /* i: : number of TC samples available for rendering */ - int16_t *nSamplesResidual, /* o: : number of samples not fitting into the renderer grid and buffer for the next call*/ - float *data /* i/o: transport channels/output synthesis signal */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t nSamplesForRendering, /* i : number of TC samples available for rendering */ + int16_t *nSamplesResidual, /* o : number of samples not fitting into the renderer grid and buffer for the next call*/ + float *data /* i/o: transport channels/output synthesis signal */ ); ivas_error ivas_jbm_dec_set_discard_samples( - Decoder_Struct *st_ivas /* i/o: main IVAS decoder structre */ + Decoder_Struct *st_ivas /* i/o: main IVAS decoder structre */ ); void ivas_jbm_dec_get_adapted_linear_interpolator( - const int16_t default_interp_length, /* i : default length of the (full-frame) interpolator */ - const int16_t interp_length, /* i : length of the interpolator to be created */ - float *interpolator /* o : the interpolator */ + const int16_t default_interp_length, /* i : default length of the (full-frame) interpolator */ + const int16_t interp_length, /* i : length of the interpolator to be created */ + float *interpolator /* o : the interpolator */ ); void ivas_jbm_dec_get_adapted_subframes( - const int16_t nCldfbTs, /* i : number of time slots in the current frame */ - int16_t *subframe_nbslots, /* i/o: subframe grid */ - int16_t *nb_subframes /* i/o: number of subframes in the frame */ + const int16_t nCldfbTs, /* i : number of time slots in the current frame */ + int16_t *subframe_nbslots, /* i/o: subframe grid */ + int16_t *nb_subframes /* i/o: number of subframes in the frame */ ); void ivas_jbm_dec_get_md_map( - const int16_t default_len, /* i : default frame length in metadata slots */ - const int16_t len, /* i : length of the modfied frames in metadata slots */ - const int16_t subframe_len, /* i : default length of a subframe */ - const int16_t offset, /* i : current read offset into the md buffer */ - const int16_t buf_len, /* i : length of the metadata buffer */ - int16_t *map /* o : metadata index map */ + const int16_t default_len, /* i : default frame length in metadata slots */ + const int16_t len, /* i : length of the modfied frames in metadata slots */ + const int16_t subframe_len, /* i : default length of a subframe */ + const int16_t offset, /* i : current read offset into the md buffer */ + const int16_t buf_len, /* i : length of the metadata buffer */ + int16_t *map /* o : metadata index map */ ); -int16_t ivas_jbm_dec_get_num_tc_channels( Decoder_Struct *st_ivas ); /* i : IVAS decoder handle */ +int16_t ivas_jbm_dec_get_num_tc_channels( + Decoder_Struct *st_ivas /* i : IVAS decoder handle */ +); TC_BUFFER_MODE ivas_jbm_dec_get_tc_buffer_mode( - Decoder_Struct *st_ivas /* i : IVAS decoder handle */ + Decoder_Struct *st_ivas /* i : IVAS decoder handle */ ); -int16_t ivas_jbm_dec_get_render_granularity( /* o : render granularity */ - const RENDERER_TYPE rendererType, /* i : renderer type */ - const int32_t output_Fs /* i : sampling rate */ +/*! r: render granularity */ +int16_t ivas_jbm_dec_get_render_granularity( + const RENDERER_TYPE rendererType, /* i : renderer type */ + const int32_t output_Fs /* i : sampling rate */ ); ivas_error ivas_jbm_dec_tc_buffer_open( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const TC_BUFFER_MODE tc_buffer_mode, /* i : buffer mode */ - const int16_t nchan_transport_jbm, /* i : number of real transport channels */ - const int16_t nchan_transport_internal, /* i : number of totally buffered channels */ - const int16_t nchan_full, /* i : nubmer of channels to fully store */ - const int16_t n_samples_granularity /* i : granularity of the renderer/buffer */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const TC_BUFFER_MODE tc_buffer_mode, /* i : buffer mode */ + const int16_t nchan_transport_jbm, /* i : number of real transport channels */ + const int16_t nchan_transport_internal, /* i : number of totally buffered channels */ + const int16_t nchan_full, /* i : nubmer of channels to fully store */ + const int16_t n_samples_granularity /* i : granularity of the renderer/buffer */ ); ivas_error ivas_jbm_dec_tc_buffer_reconfigure( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const TC_BUFFER_MODE tc_buffer_mode, /* i : new buffer mode */ - const int16_t nchan_transport_jbm, /* i : new number of real transport channels */ - const int16_t nchan_transport_internal, /* i : new number of totally buffered channels */ - const int16_t nchan_full, /* i : new number of channels to fully store */ - const int16_t n_samples_granularity /* i : new granularity of the renderer/buffer */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const TC_BUFFER_MODE tc_buffer_mode, /* i : new buffer mode */ + const int16_t nchan_transport_jbm, /* i : new number of real transport channels */ + const int16_t nchan_transport_internal, /* i : new number of totally buffered channels */ + const int16_t nchan_full, /* i : new number of channels to fully store */ + const int16_t n_samples_granularity /* i : new granularity of the renderer/buffer */ ); void ivas_jbm_dec_tc_buffer_close( - DECODER_TC_BUFFER_HANDLE *phTcBuffer /* i/o: TC buffer handle */ + DECODER_TC_BUFFER_HANDLE *phTcBuffer /* i/o: TC buffer handle */ ); + void ivas_jbm_dec_td_renderers_adapt_subframes( - Decoder_Struct *st_ivas + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); #endif diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 6c58e143bb..1105b42e71 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -51,15 +51,18 @@ /*-----------------------------------------------------------------------* * Local function prototypes *-----------------------------------------------------------------------*/ + static void ivas_jbm_dec_copy_tc( Decoder_Struct *st_ivas, const int16_t nSamplesForRendering, int16_t *nSamplesResidual, float *data, float *tc_digest_f[] ); + static void ivas_jbm_dec_tc_buffer_playout( Decoder_Struct *st_ivas, const uint16_t nSamplesAsked, uint16_t *nSamplesRendered, float *output[] ); /*--------------------------------------------------------------------------* * ivas_jbm_dec_tc() * - * Principal IVAS decoder routine, decoding of metadata and transport channels + * Principal IVAS JBM decoder routine, decoding of metadata and transport channels *--------------------------------------------------------------------------*/ + ivas_error ivas_jbm_dec_tc( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ float *data /* o : transport channel signal */ @@ -535,10 +538,11 @@ ivas_error ivas_jbm_dec_tc( return error; } + /*--------------------------------------------------------------------------* * ivas_jbm_dec_feed_tc_to_renderer() * - * Feed decoded transport channels and metadata to the IVAS renderer routine + * Feed decoded transport channels and metadata to the IVAS JBM renderer routine *--------------------------------------------------------------------------*/ ivas_error ivas_jbm_dec_feed_tc_to_renderer( @@ -623,8 +627,9 @@ ivas_error ivas_jbm_dec_feed_tc_to_renderer( /*--------------------------------------------------------------------------* * ivas_dec_render() * - * Principal IVAS rendering routine + * Principal IVAS JBM rendering routine *--------------------------------------------------------------------------*/ + ivas_error ivas_jbm_dec_render( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const uint16_t nSamplesAsked, /* i : number of samples wanted */ @@ -633,7 +638,6 @@ ivas_error ivas_jbm_dec_render( int16_t *data /* o : output synthesis signal */ ) { - int16_t n, nchan_out; int16_t nchan_transport; float output[MAX_OUTPUT_CHANNELS][L_FRAME48k]; /* 'float' buffer for output synthesis, MAX_OUTPUT_CHANNELS channels */ /* IVAS_fmToDo: buffer can be allocated dynamically based on the actual number of output channels */ @@ -658,6 +662,7 @@ ivas_error ivas_jbm_dec_render( nchan_transport = st_ivas->hTcBuffer->nchan_transport_jbm; output_config = st_ivas->hDecoderConfig->output_config; nSamplesAskedLocal = nSamplesAsked + st_ivas->hTcBuffer->n_samples_discard; + for ( n = 0; n < MAX_OUTPUT_CHANNELS; n++ ) { p_output[n] = &output[n][0]; @@ -820,6 +825,7 @@ ivas_error ivas_jbm_dec_render( { return error; } + ivas_binaural_add_LFE( st_ivas, *nSamplesRendered, st_ivas->hTcBuffer->tc, p_output ); } else if ( st_ivas->renderer_type == RENDERER_MC ) @@ -851,8 +857,6 @@ ivas_error ivas_jbm_dec_render( } else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) { - - /* Rendering */ int16_t offset = st_ivas->hDirAC->slots_rendered * st_ivas->hDirAC->slot_size; nchan_remapped = st_ivas->nchan_transport; @@ -864,7 +868,6 @@ ivas_error ivas_jbm_dec_render( { ivas_dirac_dec_render( st_ivas, nchan_remapped, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ); - if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) { /* we still need to copy the separate channel if available */ @@ -906,8 +909,10 @@ ivas_error ivas_jbm_dec_render( * - compensation for saturation * - float to integer conversion *----------------------------------------------------------------*/ + st_ivas->hTcBuffer->n_samples_available -= *nSamplesRendered; st_ivas->hTcBuffer->n_samples_rendered += *nSamplesRendered; + if ( st_ivas->hTcBuffer->n_samples_discard > 0 ) { for ( n = 0; n < MAX_OUTPUT_CHANNELS; n++ ) @@ -937,6 +942,7 @@ ivas_error ivas_jbm_dec_render( * * Flush samples if renderer granularity changes on a bitrate change *--------------------------------------------------------------------------*/ + ivas_error ivas_jbm_dec_flush_renderer( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const int16_t tc_granularity_new, /* i : new renderer granularity */ @@ -970,7 +976,8 @@ ivas_error ivas_jbm_dec_flush_renderer( assert( n_samples_still_available < tc_granularity_new ); if ( n_slots_still_available ) { - int ch_idx; + int16_t ch_idx; + /* render what is still there with zero padding */ for ( ch_idx = 0; ch_idx < hTcBuffer->nchan_buffer_full; ch_idx++ ) { @@ -979,6 +986,7 @@ ivas_error ivas_jbm_dec_flush_renderer( set_zero( hTcBuffer->tc[ch_idx] + n_samples_to_render, hTcBuffer->n_samples_granularity - n_samples_to_render ); mvr2r( hTcBuffer->tc[ch_idx] + hTcBuffer->n_samples_rendered + n_samples_to_render, hTcBuffer->tc[ch_idx] + hTcBuffer->n_samples_granularity, n_samples_still_available ); } + /* simple change of the slot info */ hTcBuffer->num_slots = 1; hTcBuffer->nb_subframes = 1; @@ -1010,7 +1018,9 @@ ivas_error ivas_jbm_dec_flush_renderer( { /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */ set_f( st_ivas->hIsmRendererData->interpolator, 1.0f, hTcBuffer->n_samples_granularity ); + ivas_ism_render_sf( st_ivas, p_output, hTcBuffer->n_samples_granularity ); + if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, @@ -1055,6 +1065,7 @@ ivas_error ivas_jbm_dec_flush_renderer( { return error; } + ivas_binaural_add_LFE( st_ivas, hTcBuffer->n_samples_granularity, st_ivas->hTcBuffer->tc, p_output ); } else if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) @@ -1064,6 +1075,7 @@ ivas_error ivas_jbm_dec_flush_renderer( return error; } + ivas_binaural_add_LFE( st_ivas, hTcBuffer->n_samples_granularity, st_ivas->hTcBuffer->tc, p_output ); } } @@ -1095,6 +1107,7 @@ ivas_error ivas_jbm_dec_flush_renderer( * * Set number of samples to discard in the first subframe if the renderer granularity changes on a bitrate change *--------------------------------------------------------------------------*/ + ivas_error ivas_jbm_dec_set_discard_samples( Decoder_Struct *st_ivas /* i/o: main IVAS decoder structre */ ) @@ -1113,9 +1126,11 @@ ivas_error ivas_jbm_dec_set_discard_samples( /* set last subframes number to max to ensure correct continuation */ st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->nb_subframes - 1] = nMaxSlotsPerSubframe; } + return error; } + /*--------------------------------------------------------------------------* * ivas_jbm_dec_get_adapted_linear_interpolator() * @@ -1154,13 +1169,17 @@ void ivas_jbm_dec_get_adapted_linear_interpolator( { set_f( interpolator, 0.0f, idx + 1 ); } + + return; } + /*--------------------------------------------------------------------------* * ivas_jbm_dec_get_adapted_subframes() * * Get an interpolator that is adapted to time scale modified IVAS frame *--------------------------------------------------------------------------*/ + void ivas_jbm_dec_get_adapted_subframes( const int16_t nCldfbTs, /* i : number of time slots in the current frame */ int16_t *subframe_nbslots, /* i/o: subframe grid */ @@ -1169,6 +1188,7 @@ void ivas_jbm_dec_get_adapted_subframes( { uint16_t nSlotsInLastSubframe, nSlotsInFirstSubframe; uint16_t nCldfbSlotsLocal = nCldfbTs; + /* get last subframe size from previous frame, determine how many slots have to be processed in the first subframe (i.e. potential leftover of a 5ms subframe) */ nSlotsInFirstSubframe = ( PARAM_MC_MAX_NSLOTS_IN_SUBFRAME - subframe_nbslots[*nb_subframes - 1] ); @@ -1178,10 +1198,13 @@ void ivas_jbm_dec_get_adapted_subframes( *nb_subframes = 1; nCldfbSlotsLocal -= nSlotsInFirstSubframe; } + *nb_subframes += (int16_t) ceilf( (float) nCldfbSlotsLocal / (float) PARAM_MC_MAX_NSLOTS_IN_SUBFRAME ); nSlotsInLastSubframe = nCldfbSlotsLocal % PARAM_MC_MAX_NSLOTS_IN_SUBFRAME; + set_s( subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); set_s( subframe_nbslots, PARAM_MC_MAX_NSLOTS_IN_SUBFRAME, *nb_subframes ); + if ( nSlotsInFirstSubframe > 0 ) { subframe_nbslots[0] = nSlotsInFirstSubframe; @@ -1190,14 +1213,17 @@ void ivas_jbm_dec_get_adapted_subframes( { subframe_nbslots[*nb_subframes - 1] = nSlotsInLastSubframe; } + return; } + /*--------------------------------------------------------------------------* * ivas_jbm_dec_get_adapted_linear_interpolator() * * Get an meta data map adapted to a time scale modified IVAS frame *--------------------------------------------------------------------------*/ + void ivas_jbm_dec_get_md_map( const int16_t default_len, /* i : default frame length in metadata slots */ const int16_t len, /* i : length of the modfied frames in metadata slots */ @@ -1209,19 +1235,19 @@ void ivas_jbm_dec_get_md_map( { int16_t jbm_segment_len, map_idx, src_idx, src_idx_map; float dec, src_idx_f; + #ifdef DEBUGGING assert( default_len % 2 == 0 ); #endif - jbm_segment_len = ( default_len >> 1 ); dec = 1.0f / default_len; - for ( map_idx = len - 1, src_idx = default_len - 1; map_idx >= jbm_segment_len; map_idx--, src_idx-- ) { src_idx_map = max( 0, src_idx / subframe_len ); map[map_idx] = ( offset + src_idx_map ) % buf_len; } + /* changed part (first segment), interpolate index to parameters (we do not want to interpolate and smooth acutal direction/diffuseness values even more) */ if ( src_idx >= 0 ) @@ -1239,14 +1265,20 @@ void ivas_jbm_dec_get_md_map( { set_s( map, offset, map_idx + 1 ); } + + return; } + /*--------------------------------------------------------------------------* * ivas_jbm_dec_get_num_tc_channels() * * Get the number of transport channels provided by the JBM transport channel decode function *--------------------------------------------------------------------------*/ -int16_t ivas_jbm_dec_get_num_tc_channels( Decoder_Struct *st_ivas ) /* i : IVAS decoder handle */ + +int16_t ivas_jbm_dec_get_num_tc_channels( + Decoder_Struct *st_ivas /* i : IVAS decoder handle */ +) { int16_t num_tc; int32_t ivas_total_brate; @@ -1342,12 +1374,14 @@ int16_t ivas_jbm_dec_get_num_tc_channels( Decoder_Struct *st_ivas ) /* i : IVAS return num_tc; } + /*--------------------------------------------------------------------------* * ivas_jbm_dec_copy_tc() * * Copy interleaved transport chnannels to the correct buffers, update the TC * buffer handle *--------------------------------------------------------------------------*/ + void ivas_jbm_dec_copy_tc( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const int16_t nSamplesForRendering, /* i : number of samples to digest */ @@ -1362,7 +1396,6 @@ void ivas_jbm_dec_copy_tc( int16_t n_ch_full_copy; int16_t n_ch_res_copy; - hTcBuffer = st_ivas->hTcBuffer; n_samples_still_available = hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered; hTcBuffer->n_samples_buffered = n_samples_still_available + nSamplesForRendering + hTcBuffer->n_samples_discard; @@ -1393,12 +1426,22 @@ void ivas_jbm_dec_copy_tc( } } hTcBuffer->n_samples_rendered = 0; + return; } -int16_t ivas_jbm_dec_get_render_granularity( const RENDERER_TYPE rendererType, - const int32_t output_Fs ) +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_get_render_granularity() + * + * + *--------------------------------------------------------------------------*/ + +/*! r: render granularity */ +int16_t ivas_jbm_dec_get_render_granularity( + const RENDERER_TYPE rendererType, /* i : renderer type */ + const int32_t output_Fs /* i : sampling rate */ +) { int16_t render_granularity; @@ -1414,11 +1457,13 @@ int16_t ivas_jbm_dec_get_render_granularity( const RENDERER_TYPE rendererType, return render_granularity; } + /*--------------------------------------------------------------------------* * ivas_jbm_dec_tc_buffer_open() * - * open and initialize the transport channel buffer + * open and initialize JBM transport channel buffer *--------------------------------------------------------------------------*/ + ivas_error ivas_jbm_dec_tc_buffer_open( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const TC_BUFFER_MODE tc_buffer_mode, /* i : buffer mode */ @@ -1443,8 +1488,9 @@ ivas_error ivas_jbm_dec_tc_buffer_open( if ( ( hTcBuffer = (DECODER_TC_BUFFER_HANDLE) malloc( sizeof( DECODER_TC_BUFFER ) ) ) == NULL ) { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TC Buffer\n" ) ); + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM TC Buffer\n" ) ); } + hTcBuffer->tc_buffer_mode = tc_buffer_mode; hTcBuffer->nchan_transport_jbm = nchan_transport_jbm; hTcBuffer->nchan_transport_internal = nchan_transport_internal; @@ -1478,11 +1524,16 @@ ivas_error ivas_jbm_dec_tc_buffer_open( int16_t n_samp_full = ( NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) + hTcBuffer->n_samples_granularity - 1 ); int16_t n_samp_residual = hTcBuffer->n_samples_granularity - 1; int32_t offset; + nsamp_to_allocate = hTcBuffer->nchan_buffer_full * n_samp_full; nsamp_to_allocate += nchan_residual * n_samp_residual; - hTcBuffer->tc_buffer = (float *) malloc( nsamp_to_allocate * sizeof( float ) ); + if ( ( hTcBuffer->tc_buffer = (float *) malloc( nsamp_to_allocate * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM TC Buffer\n" ) ); + } set_zero( hTcBuffer->tc_buffer, nsamp_to_allocate ); offset = 0; + for ( ch_idx = 0; ch_idx < hTcBuffer->nchan_buffer_full; ch_idx++ ) { hTcBuffer->tc[ch_idx] = &hTcBuffer->tc_buffer[offset]; @@ -1500,14 +1551,17 @@ ivas_error ivas_jbm_dec_tc_buffer_open( } st_ivas->hTcBuffer = hTcBuffer; + return error; } + /*--------------------------------------------------------------------------* * ivas_jbm_dec_tc_buffer_reconfigure() * - * open and initialize the transport channel buffer + * open and initialize JBM transport channel buffer *--------------------------------------------------------------------------*/ + ivas_error ivas_jbm_dec_tc_buffer_reconfigure( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const TC_BUFFER_MODE tc_buffer_mode, /* i : new buffer mode */ @@ -1574,7 +1628,12 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( n_samp_residual = hTcBuffer->n_samples_granularity - 1; nsamp_to_allocate = hTcBuffer->nchan_buffer_full * n_samp_full; nsamp_to_allocate += nchan_residual * n_samp_residual; - hTcBuffer->tc_buffer = (float *) malloc( nsamp_to_allocate * sizeof( float ) ); + + if ( ( hTcBuffer->tc_buffer = (float *) malloc( nsamp_to_allocate * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM TC Buffer\n" ) ); + } + set_zero( hTcBuffer->tc_buffer, nsamp_to_allocate ); offset = 0; for ( ch_idx = 0; ch_idx < hTcBuffer->nchan_buffer_full; ch_idx++ ) @@ -1595,7 +1654,14 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( return error; } -void ivas_jbm_dec_tc_buffer_playout( + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_tc_buffer_playout() + * + * + *--------------------------------------------------------------------------*/ + +static void ivas_jbm_dec_tc_buffer_playout( Decoder_Struct *st_ivas, const uint16_t nSamplesAsked, uint16_t *nSamplesRendered, @@ -1605,6 +1671,7 @@ void ivas_jbm_dec_tc_buffer_playout( int16_t ch_idx, slot_size, slots_to_render, first_sf, last_sf; slot_size = st_ivas->hTcBuffer->n_samples_granularity; + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ slots_to_render = min( st_ivas->hTcBuffer->num_slots - st_ivas->hTcBuffer->slots_rendered, nSamplesAsked / slot_size ); st_ivas->hTcBuffer->slots_rendered += slots_to_render; @@ -1622,8 +1689,17 @@ void ivas_jbm_dec_tc_buffer_playout( } st_ivas->hTcBuffer->subframes_rendered = last_sf; + + return; } + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_tc_buffer_close() + * + * Close JBM transport channel buffer + *--------------------------------------------------------------------------*/ + void ivas_jbm_dec_tc_buffer_close( DECODER_TC_BUFFER_HANDLE *phTcBuffer /* i/o: TC buffer handle */ ) @@ -1645,20 +1721,31 @@ void ivas_jbm_dec_tc_buffer_close( free( *phTcBuffer ); *phTcBuffer = NULL; } + return; } + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_td_renderers_adapt_subframes() + * + * Close JBM transport channel buffer + *--------------------------------------------------------------------------*/ + void ivas_jbm_dec_td_renderers_adapt_subframes( - Decoder_Struct *st_ivas ) + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) { int16_t nMaxSlotsPerSubframe, nSlotsAvailable; uint16_t nSlotsInLastSubframe, nSlotsInFirstSubframe; + nMaxSlotsPerSubframe = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / st_ivas->hTcBuffer->n_samples_granularity; nSlotsAvailable = st_ivas->hTcBuffer->n_samples_available / st_ivas->hTcBuffer->n_samples_granularity; st_ivas->hTcBuffer->num_slots = nSlotsAvailable; st_ivas->hTcBuffer->n_samples_available = nSlotsAvailable * st_ivas->hTcBuffer->n_samples_granularity; nSlotsInFirstSubframe = nMaxSlotsPerSubframe - st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->nb_subframes - 1]; st_ivas->hTcBuffer->nb_subframes = 0; + if ( nSlotsInFirstSubframe > 0 ) { st_ivas->hTcBuffer->nb_subframes = 1; @@ -1668,19 +1755,32 @@ void ivas_jbm_dec_td_renderers_adapt_subframes( nSlotsInLastSubframe = nSlotsAvailable % nMaxSlotsPerSubframe; set_s( st_ivas->hTcBuffer->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); set_s( st_ivas->hTcBuffer->subframe_nbslots, nMaxSlotsPerSubframe, st_ivas->hTcBuffer->nb_subframes ); + if ( nSlotsInFirstSubframe > 0 ) { st_ivas->hTcBuffer->subframe_nbslots[0] = nSlotsInFirstSubframe; } + if ( nSlotsInLastSubframe > 0 ) { st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->nb_subframes - 1] = nSlotsInLastSubframe; } + st_ivas->hTcBuffer->slots_rendered = 0; st_ivas->hTcBuffer->subframes_rendered = 0; + + return; } -TC_BUFFER_MODE ivas_jbm_dec_get_tc_buffer_mode( Decoder_Struct *st_ivas ) +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_get_tc_buffer_mode() + * + * + *--------------------------------------------------------------------------*/ + +TC_BUFFER_MODE ivas_jbm_dec_get_tc_buffer_mode( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) { TC_BUFFER_MODE buffer_mode; buffer_mode = TC_BUFFER_MODE_BUFFER; @@ -1749,7 +1849,6 @@ TC_BUFFER_MODE ivas_jbm_dec_get_tc_buffer_mode( Decoder_Struct *st_ivas ) #endif } - return buffer_mode; } #endif -- GitLab From 54e9ced6fe82b6b7f563f9e92c48ecc8f4edff90 Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 15 May 2023 18:30:44 +0200 Subject: [PATCH 201/331] formal issues within JBM_TSM_ON_TCS --- apps/decoder.c | 20 +--- lib_com/fd_cng_com.c | 2 +- lib_com/ivas_cnst.h | 1 + lib_com/ivas_prot.h | 22 ++-- lib_com/ivas_td_decorr.c | 2 +- lib_dec/fd_cng_dec.c | 2 - lib_dec/ivas_binRenderer_internal.c | 14 ++- lib_dec/ivas_dirac_dec.c | 41 +++++-- lib_dec/ivas_dirac_output_synthesis_cov.c | 15 ++- lib_dec/ivas_init_dec.c | 23 ++-- lib_dec/ivas_ism_dec.c | 13 ++- lib_dec/ivas_ism_dtx_dec.c | 1 + lib_dec/ivas_ism_param_dec.c | 112 ++++++++++++++----- lib_dec/ivas_ism_renderer.c | 11 +- lib_dec/ivas_jbm_dec.c | 98 ++++++---------- lib_dec/ivas_masa_dec.c | 6 +- lib_dec/ivas_mct_dec.c | 5 +- lib_dec/ivas_objectRenderer_internal.c | 28 ++++- lib_dec/ivas_out_setup_conversion.c | 2 +- lib_dec/ivas_sba_dec.c | 45 +++++++- lib_dec/ivas_sba_rendering_internal.c | 5 +- lib_dec/ivas_spar_decoder.c | 55 ++++++++- lib_dec/ivas_stat_dec.h | 13 ++- lib_dec/jbm_pcmdsp_apa.c | 4 +- lib_dec/lib_dec.c | 46 ++++++-- lib_dec/lib_dec.h | 18 +-- lib_rend/ivas_crend.c | 42 ++++--- lib_rend/ivas_dirac_dec_binaural_functions.c | 41 +++++-- lib_rend/ivas_objectRenderer.c | 3 +- lib_rend/ivas_prot_rend.h | 52 ++++----- lib_rend/ivas_rotation.c | 2 +- lib_rend/ivas_sba_rendering.c | 3 + lib_rend/lib_rend.c | 9 +- 33 files changed, 505 insertions(+), 251 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 449e08223f..b4a840b10c 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -84,7 +84,6 @@ static #endif #ifdef JBM_TSM_ON_TCS #define JBM_FRONTEND_FETCH_FRAMESIZE_MS 20 -#define FRAME_SIZE_NS 20000000L #endif typedef struct @@ -2574,6 +2573,7 @@ static ivas_error decodeVariableSpeed( #endif nSamplesAvailableNext = 0; nOutSamples = (int16_t) ( arg.output_Fs / 1000 * VARIABLE_SPEED_FETCH_FRAMESIZE_MS ); + /*------------------------------------------------------------------------------------------* * Loop for every packet (frame) of bitstream data * - Read the bitstream packet @@ -2641,13 +2641,10 @@ static ivas_error decodeVariableSpeed( /* decode and get samples */ do { - error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, - pcmBuf, 0, - &nSamplesAvailableNext + error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, pcmBuf, 0, &nSamplesAvailableNext #ifdef SUPPORT_JBM_TRACEFILE , - writeJbmTraceFileFrameWrapper, - jbmTraceWriter + writeJbmTraceFileFrameWrapper, jbmTraceWriter #endif ); if ( error != IVAS_ERR_OK && error != IVAS_ERR_VS_FRAME_NEEDED ) @@ -2746,7 +2743,6 @@ static ivas_error decodeVariableSpeed( } } - /* Write current frame */ if ( decodedGoodFrame ) { @@ -2833,6 +2829,7 @@ static ivas_error decodeVariableSpeed( /*------------------------------------------------------------------------------------------* * Flush what is still left in the VoIP Buffers.... *------------------------------------------------------------------------------------------*/ + while ( nSamplesAvailableNext > 0 ) { int16_t nSamplesFlushed; @@ -2893,25 +2890,19 @@ static ivas_error decodeVariableSpeed( } /* decode and get samples */ - if ( ( error = IVAS_DEC_VoIP_Flush( hIvasDec, nOutSamples, - pcmBuf, - &nSamplesAvailableNext, - &nSamplesFlushed ) ) != IVAS_ERR_OK ) + if ( ( error = IVAS_DEC_VoIP_Flush( hIvasDec, nOutSamples, pcmBuf, &nSamplesAvailableNext, &nSamplesFlushed ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError in IVAS_DEC_VoIP_Flush: %s\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } - /* Write current frame */ - if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, nSamplesFlushed * nOutChannels ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nOutput audio file writer error\n" ); goto cleanup; } - /* Write ISm metadata to external file(s) */ if ( decodedGoodFrame && arg.outputFormat == IVAS_DEC_OUTPUT_EXT ) { @@ -2969,6 +2960,7 @@ static ivas_error decodeVariableSpeed( #endif } } + /*------------------------------------------------------------------------------------------* * Printouts after decoding has finished *------------------------------------------------------------------------------------------*/ diff --git a/lib_com/fd_cng_com.c b/lib_com/fd_cng_com.c index 99ae9894f4..e31ce67d13 100644 --- a/lib_com/fd_cng_com.c +++ b/lib_com/fd_cng_com.c @@ -966,7 +966,6 @@ void SynthesisSTFT_dirac( mvr2r( olapBuffer + hFdCngCom->frameSize, olapBuffer, hFdCngCom->frameSize ); set_f( olapBuffer + hFdCngCom->frameSize, 0.0f, hFdCngCom->frameSize ); /*olapBuffer, fftBuffer, olapWin*/ - for ( i = hFdCngCom->frameSize / 4; i < 3 * hFdCngCom->frameSize / 4; i++ ) { olapBuffer[i] += fftBuffer[i] * olapWin[i - hFdCngCom->frameSize / 4]; @@ -1009,6 +1008,7 @@ void SynthesisSTFT_dirac( } #endif + /*------------------------------------------------------------------- * mhvals() * diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index b5e3964319..9cd8475d41 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -219,6 +219,7 @@ typedef enum #define MAX_JBM_L_FRAME_NS 40000000L #define MAX_SPAR_INTERNAL_CHANNELS IVAS_SPAR_MAX_CH #define MAX_CLDFB_DIGEST_CHANNELS 4 + typedef enum { TC_BUFFER_MODE_NONE = 0, diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 363b0ca4e3..32a6db03b6 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -767,7 +767,7 @@ void dtx_read_padding_bits( ivas_error ivas_jbm_dec_tc( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - float *data /* o : output synthesis signal */ + float *data /* o : output synthesis signals */ ); ivas_error ivas_jbm_dec_render( @@ -841,7 +841,7 @@ ivas_error ivas_jbm_dec_tc_buffer_open( const TC_BUFFER_MODE tc_buffer_mode, /* i : buffer mode */ const int16_t nchan_transport_jbm, /* i : number of real transport channels */ const int16_t nchan_transport_internal, /* i : number of totally buffered channels */ - const int16_t nchan_full, /* i : nubmer of channels to fully store */ + const int16_t nchan_full, /* i : number of channels to fully store */ const int16_t n_samples_granularity /* i : granularity of the renderer/buffer */ ); @@ -1023,7 +1023,7 @@ ivas_error ivas_ism_dec_config( const ISM_MODE last_ism_mode /* i/o: last ISM mode */ #ifdef JBM_TSM_ON_TCS , - uint16_t *nSamplesRendered, /* o : number of samples flushed on renderer change */ + uint16_t *nSamplesRendered, /* o : number of samples flushed on renderer change*/ int16_t *data /* o : flushed PCM samples */ #endif ); @@ -1044,7 +1044,7 @@ void ivas_param_ism_dec( #ifdef JBM_TSM_ON_TCS void ivas_ism_dec_digest_tc( - Decoder_Struct *st_ivas + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); void ivas_param_ism_dec_digest_tc( @@ -3462,7 +3462,7 @@ ivas_error ivas_sba_digest_tc( const int16_t nCldfbSlots, /* i : number of CLDFB slots */ const int16_t nSamplesForRendering, /* i : number of samples provided */ float *data[] /* i : transport channel samples */ - ); +); #endif void ivas_init_dec_get_num_cldfb_instances( @@ -3698,7 +3698,8 @@ void generate_masking_noise_lb_dirac( void ivas_dirac_dec_set_md_map( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - int16_t nCldfbTs ); + const int16_t nCldfbTs /* i : number of CLDFB time slots */ +); void ivas_dirac_dec( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ @@ -4581,7 +4582,7 @@ void ivas_spar_dec_agc_pca( void ivas_spar_dec_set_render_map( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - int16_t nCldfbTs + const int16_t nCldfbTs /* i : number of CLDFB time slots */ ); void ivas_spar_dec_set_render_params( @@ -5304,8 +5305,9 @@ void ivas_binaural_cldfb( #ifdef JBM_TSM_ON_TCS void ivas_binaural_cldfb_sf( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const int16_t n_samples_to_render, + const int16_t n_samples_to_render, /* i : output frame length per channel */ float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ + ); #endif @@ -5404,6 +5406,8 @@ void ivas_ism2sba_sf( const int16_t sba_order /* i : Ambisonic (SBA) order */ ); #endif + + /*----------------------------------------------------------------------------------* * Amplitude Panning VBAP prototypes *----------------------------------------------------------------------------------*/ @@ -5479,7 +5483,7 @@ void ivas_ls_setup_conversion_process_mdct_param_mc( void ivas_lssetupconversion_process_param_mc( Decoder_Struct *st_ivas, /* i/o: LS setup conversion renderer handle */ #ifdef JBM_TSM_ON_TCS - int16_t num_timeslots, /* i : number of time slots to process */ + const int16_t num_timeslots, /* i : number of time slots to process */ #endif float Cldfb_RealBuffer_InOut[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals */ float Cldfb_ImagBuffer_InOut[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals */ diff --git a/lib_com/ivas_td_decorr.c b/lib_com/ivas_td_decorr.c index 9a08c06f6a..7714915177 100644 --- a/lib_com/ivas_td_decorr.c +++ b/lib_com/ivas_td_decorr.c @@ -480,7 +480,7 @@ static void ivas_td_decorr_APD_sections( void ivas_td_decorr_process( ivas_td_decorr_state_t *hTdDecorr, /* i/o: SPAR Covar. decoder handle */ #ifdef JBM_TSM_ON_TCS - float *pcm_in[], + float *pcm_in[], /* i : input audio channels */ #else float pcm_in[][L_FRAME48k], /* i : input audio channels */ #endif diff --git a/lib_dec/fd_cng_dec.c b/lib_dec/fd_cng_dec.c index 7f8eba27c0..8b62e54a8d 100644 --- a/lib_dec/fd_cng_dec.c +++ b/lib_dec/fd_cng_dec.c @@ -1829,7 +1829,6 @@ void generate_masking_noise_lb_dirac( n_samples_out = hFdCngCom->frameSize / DEFAULT_JBM_CLDFB_TIMESLOTS * nCldfbTs; n_samples_start = 0; - /*LB CLDFB - CNA from STFT*/ #ifdef DEBUG_MODE_DIRAC { @@ -1951,7 +1950,6 @@ void generate_masking_noise_lb_dirac( return; } - #endif diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index bfe0a4bb53..5de5f881fa 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -997,17 +997,19 @@ void ivas_binaural_cldfb( return; } + + #ifdef JBM_TSM_ON_TCS /*-------------------------------------------------------------------------* - * ivas_binaural_cldfb() + * ivas_binaural_cldfb_sf() * * Perform CLDFB analysis, fastconv binaural rendering and CLDFB synthesis *-------------------------------------------------------------------------*/ void ivas_binaural_cldfb_sf( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const int16_t n_samples_to_render, - float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t n_samples_to_render, /* i : output frame length per channel */ + float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ ) { float Cldfb_RealBuffer[MAX_INTERN_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; @@ -1021,6 +1023,7 @@ void ivas_binaural_cldfb_sf( /* Implement a 5 msec loops */ maxBand = (int16_t) ( ( CLDFB_NO_CHANNELS_MAX * st_ivas->hDecoderConfig->output_Fs ) / 48000 ); slot_size = st_ivas->hTcBuffer->nb_subframes; + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ slots_to_render = min( st_ivas->hTcBuffer->num_slots - st_ivas->hTcBuffer->slots_rendered, n_samples_to_render / slot_size ); first_sf = st_ivas->hTcBuffer->subframes_rendered; @@ -1028,6 +1031,7 @@ void ivas_binaural_cldfb_sf( slot_index_start = st_ivas->hTcBuffer->slots_rendered; slot_index_start_cldfb = 0; st_ivas->hTcBuffer->slots_rendered += slots_to_render; + while ( slots_to_render > 0 ) { slots_to_render -= st_ivas->hTcBuffer->subframe_nbslots[last_sf]; @@ -1086,7 +1090,9 @@ void ivas_binaural_cldfb_sf( slot_index_start += st_ivas->hTcBuffer->subframe_nbslots[subframeIdx]; slot_index_start_cldfb += st_ivas->hTcBuffer->subframe_nbslots[subframeIdx]; } + st_ivas->hTcBuffer->subframes_rendered = last_sf; + return; } #endif diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 2801c9c146..51122aa40a 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -2898,9 +2898,11 @@ void ivas_qmetadata_to_dirac( * * Set metadata index mapping for DirAC *------------------------------------------------------------------------*/ + void ivas_dirac_dec_set_md_map( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - int16_t nCldfbTs ) + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t nCldfbTs /* i : number of CLDFB time slots */ +) { int16_t num_slots_in_subfr; DIRAC_DEC_HANDLE hDirAC; @@ -2942,6 +2944,7 @@ void ivas_dirac_dec_set_md_map( { float tmp; int16_t sf_idx, slot_idx, slot_idx_abs; + slot_idx_abs = 0; for ( sf_idx = 0; sf_idx < hDirAC->nb_subframes; sf_idx++ ) { @@ -2953,17 +2956,20 @@ void ivas_dirac_dec_set_md_map( } hDirAC->render_to_md_map[sf_idx] = ( (int16_t) roundf( tmp / (float) hDirAC->subframe_nbslots[sf_idx] ) + hDirAC->dirac_read_idx ) % hDirAC->dirac_md_buffer_length; } + set_s( &hDirAC->render_to_md_map[hDirAC->nb_subframes], 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME - hDirAC->nb_subframes ); } return; } + /*------------------------------------------------------------------------- * ivas_dirac_dec() * * DirAC decoding process *------------------------------------------------------------------------*/ + void ivas_dirac_dec( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ @@ -2982,17 +2988,21 @@ void ivas_dirac_dec( { output_f_local[n] = &output_f[n][0]; } + for ( n = 0; n < nchan_transport; n++ ) { st_ivas->hTcBuffer->tc[n] = output_f[n]; } + if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->sba_mode != SBA_MODE_SPAR ) { Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; st_ivas->hTcBuffer->tc[nchan_transport] = &cng_td_buffer[0]; generate_masking_noise_lb_dirac( st->hFdCngDec->hFdCngCom, st_ivas->hTcBuffer->tc[1], DEFAULT_JBM_CLDFB_TIMESLOTS, st->cna_dirac_flag && st->flag_cna ); } + ivas_dirac_dec_set_md_map( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS ); + for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) { ivas_dirac_dec_render_sf( st_ivas, output_f_local, nchan_transport, NULL, NULL ); @@ -3001,6 +3011,7 @@ void ivas_dirac_dec( output_f_local[n] += n_samples_sf; } } + if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 ) { st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_CLDFB_TIMESLOTS ) % st_ivas->hDirAC->dirac_md_buffer_length; @@ -3021,13 +3032,20 @@ void ivas_dirac_dec( return; } + +/*------------------------------------------------------------------------- + * ivas_dirac_dec_render() + * + * DirAC decoding renderer process + *------------------------------------------------------------------------*/ + void ivas_dirac_dec_render( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const int16_t nchan_transport, /* i : number of transport channels */ - const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ - uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ - uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ - float *output_f[] /* o : rendered time signal */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t nchan_transport, /* i : number of transport channels */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ ) { int16_t slots_to_render, first_sf, last_sf, subframe_idx; @@ -3046,16 +3064,19 @@ void ivas_dirac_dec_render( output_f_local[ch] = output_f[ch]; } slot_size = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ slots_to_render = min( hDirAC->num_slots - hDirAC->slots_rendered, nSamplesAsked / slot_size ); *nSamplesRendered = slots_to_render * slot_size; first_sf = hDirAC->subframes_rendered; last_sf = first_sf; + while ( slots_to_render > 0 ) { slots_to_render -= hDirAC->subframe_nbslots[last_sf]; last_sf++; } + #ifdef DEBUGGING assert( slots_to_render == 0 ); #endif @@ -3079,16 +3100,20 @@ void ivas_dirac_dec_render( st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % st_ivas->hDirAC->dirac_md_buffer_length; } } + *nSamplesAvailable = ( hDirAC->num_slots - hDirAC->slots_rendered ) * slot_size; + return; } #endif + /*------------------------------------------------------------------------- * ivas_dirac_dec() * * DirAC decoding process *------------------------------------------------------------------------*/ + #ifndef JBM_TSM_ON_TCS void ivas_dirac_dec( #else diff --git a/lib_dec/ivas_dirac_output_synthesis_cov.c b/lib_dec/ivas_dirac_output_synthesis_cov.c index 892cfe4acb..44a9d7e597 100644 --- a/lib_dec/ivas_dirac_output_synthesis_cov.c +++ b/lib_dec/ivas_dirac_output_synthesis_cov.c @@ -104,8 +104,12 @@ ivas_error ivas_dirac_dec_output_synthesis_cov_open( set_zero( h_dirac_output_synthesis_state->cx_old[idx], nchan_in * nchan_in ); set_zero( h_dirac_output_synthesis_state->cy_old[idx], nchan_out * nchan_out ); set_zero( h_dirac_output_synthesis_state->mixing_matrix_old[idx], nchan_out * nchan_in ); + #ifdef JBM_TSM_ON_TCS - h_dirac_output_synthesis_state->mixing_matrix[idx] = (float *) malloc( nchan_out * nchan_in * sizeof( float ) ); + if ( ( h_dirac_output_synthesis_state->mixing_matrix[idx] = (float *) malloc( nchan_out * nchan_in * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis matrix\n" ) ); + } set_zero( h_dirac_output_synthesis_state->mixing_matrix[idx], nchan_out * nchan_in ); #endif } @@ -118,6 +122,7 @@ ivas_error ivas_dirac_dec_output_synthesis_cov_open( h_dirac_output_synthesis_state->mixing_matrix[idx] = NULL; #endif } + for ( idx = 0; idx < num_param_bands_residual; idx++ ) { if ( ( h_dirac_output_synthesis_state->mixing_matrix_res_old[idx] = (float *) malloc( nchan_out * nchan_out * sizeof( float ) ) ) == NULL ) @@ -125,8 +130,12 @@ ivas_error ivas_dirac_dec_output_synthesis_cov_open( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis covariance\n" ) ); } set_zero( h_dirac_output_synthesis_state->mixing_matrix_res_old[idx], nchan_out * nchan_out ); + #ifdef JBM_TSM_ON_TCS - h_dirac_output_synthesis_state->mixing_matrix_res[idx] = (float *) malloc( nchan_out * nchan_out * sizeof( float ) ); + if ( ( h_dirac_output_synthesis_state->mixing_matrix_res[idx] = (float *) malloc( nchan_out * nchan_out * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis matrix\n" ) ); + } set_zero( h_dirac_output_synthesis_state->mixing_matrix_res[idx], nchan_out * nchan_out ); #endif } @@ -158,6 +167,7 @@ ivas_error ivas_dirac_dec_output_synthesis_cov_open( return IVAS_ERR_OK; } + #ifdef JBM_TSM_ON_TCS /*-------------------------------------------------------------------* * ivas_dirac_dec_output_synthesis_cov_open() @@ -285,6 +295,7 @@ void ivas_dirac_dec_output_synthesis_cov_close( free( h_dirac_output_synthesis_state->mixing_matrix_res_old[idx] ); h_dirac_output_synthesis_state->mixing_matrix_res_old[idx] = NULL; } + #ifdef JBM_TSM_ON_TCS if ( h_dirac_output_synthesis_state->mixing_matrix[idx] != NULL ) { diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index ef9cbdf54b..5b20676539 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -680,6 +680,9 @@ ivas_error ivas_init_decoder( int16_t i, k, n; int16_t sce_id, cpe_id; int16_t numCldfbAnalyses, numCldfbSyntheses; +#ifdef JBM_TSM_ON_TCS + int16_t granularity, n_channels_transport_jbm; +#endif int32_t output_Fs, ivas_total_brate; int32_t binauralization_delay_ns; AUDIO_CONFIG output_config; @@ -1334,13 +1337,13 @@ ivas_error ivas_init_decoder( return error; } } + #ifdef JBM_TSM_ON_TCS if ( st_ivas->hDecoderConfig->voip_active ) { - int16_t granularity; - int16_t n_channels_transport_jbm; granularity = NS2SA( st_ivas->hDecoderConfig->output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ); n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, n_channels_transport_jbm, n_channels_transport_jbm, n_channels_transport_jbm, granularity ) ) != IVAS_ERR_OK ) { return error; @@ -1379,13 +1382,13 @@ ivas_error ivas_init_decoder( } st_ivas->binaural_latency_ns = st_ivas->hCrendWrapper->binaural_latency_ns; + #ifdef JBM_TSM_ON_TCS if ( st_ivas->hDecoderConfig->voip_active ) { - int16_t granularity; - int16_t n_channels_transport_jbm; granularity = NS2SA( st_ivas->hDecoderConfig->output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ); n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, n_channels_transport_jbm, n_channels_transport_jbm, n_channels_transport_jbm, granularity ) ) != IVAS_ERR_OK ) { return error; @@ -1414,6 +1417,7 @@ ivas_error ivas_init_decoder( /*-----------------------------------------------------------------* * LFE handles for rendering after rendering to adjust LFE delay to binaural filter delay *-----------------------------------------------------------------*/ + #ifdef MC_PARAMUPMIX_MODE if ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) #else @@ -1489,15 +1493,21 @@ ivas_error ivas_init_decoder( } #ifdef JBM_TSM_ON_TCS + /*-----------------------------------------------------------------* + * Allocate and initialize JBM struct + buffer + *-----------------------------------------------------------------*/ + if ( st_ivas->hDecoderConfig->voip_active && st_ivas->hTcBuffer == NULL ) { /* no module has yet open the TC buffer, open a default one */ - int16_t n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, ivas_jbm_dec_get_tc_buffer_mode( st_ivas ), n_channels_transport_jbm, n_channels_transport_jbm, n_channels_transport_jbm, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) { return error; } } + if ( st_ivas->hTcBuffer == NULL ) { /* we need the handle anyway, but without the buffer*/ @@ -1511,9 +1521,6 @@ ivas_error ivas_init_decoder( return error; } -#ifdef JBM_TSM_ON_TCS - -#endif /*------------------------------------------------------------------------- * destroy_core_dec() diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index 5706261093..7414b19a3b 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -55,8 +55,8 @@ static ivas_error ivas_ism_bitrate_switching( const ISM_MODE last_ism_mode /* i : last ISM mode */ #ifdef JBM_TSM_ON_TCS , - uint16_t *nSamplesRendered, - int16_t *data + uint16_t *nSamplesRendered, /* o : number of samples rendered */ + int16_t *data /* o : rendered samples */ #endif ) { @@ -66,7 +66,6 @@ static ivas_error ivas_ism_bitrate_switching( #ifdef FIX_416_ISM_BR_SWITCHING int16_t numCldfbAnalyses_old, numCldfbSyntheses_old, ism_mode; #endif - #ifdef JBM_TSM_ON_TCS TC_BUFFER_MODE tc_buffer_mode_new; int16_t tc_nchan_tc_new; @@ -151,9 +150,11 @@ static ivas_error ivas_ism_bitrate_switching( st_ivas->hTcBuffer->slots_rendered = st_ivas->hDirAC->slots_rendered; mvs2s( st_ivas->hDirAC->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); } + /* JBM: when granularity goes down (e.g. Discrete ISM with TD Obj Renderer -> ParamISM with binaural fastconv render what still fits in the new granularity */ tc_granularity_new = ivas_jbm_dec_get_render_granularity( st_ivas->renderer_type, st_ivas->hDecoderConfig->output_Fs ); + if ( tc_granularity_new < st_ivas->hTcBuffer->n_samples_granularity ) { if ( ( error = ivas_jbm_dec_flush_renderer( st_ivas, tc_granularity_new, renderer_type_old, intern_config_old, &hIntSetupOld, MC_MODE_NONE, last_ism_mode, nSamplesRendered, data ) ) != IVAS_ERR_OK ) @@ -316,6 +317,7 @@ static ivas_error ivas_ism_bitrate_switching( /*-----------------------------------------------------------------* * Reconfigure TC buffer *-----------------------------------------------------------------*/ + if ( st_ivas->hDecoderConfig->voip_active == 1 ) { int16_t tc_nchan_full_new; @@ -326,15 +328,18 @@ static ivas_error ivas_ism_bitrate_switching( tc_nchan_tc_new = ivas_jbm_dec_get_num_tc_channels( st_ivas ); tc_nchan_allocate_new = tc_nchan_tc_new; tc_nchan_full_new = tc_nchan_tc_new; + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) { tc_nchan_allocate_new = 2 * BINAURAL_CHANNELS; tc_nchan_full_new = tc_nchan_allocate_new; } + if ( st_ivas->ism_mode == ISM_MODE_PARAM && ( st_ivas->renderer_type != RENDERER_MONO_DOWNMIX && st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) { tc_nchan_full_new = 0; } + /* reconfigure buffer */ if ( hTcBuffer->tc_buffer_mode != tc_buffer_mode_new || hTcBuffer->nchan_transport_jbm != tc_nchan_tc_new || hTcBuffer->nchan_buffer_full != tc_nchan_full_new || hTcBuffer->nchan_transport_internal != tc_nchan_allocate_new ) @@ -344,6 +349,7 @@ static ivas_error ivas_ism_bitrate_switching( return error; } } + /* transfer subframe info from central tc buffer to ParamMC or McMASA (DirAC) */ if ( st_ivas->hDirAC != NULL ) { @@ -351,6 +357,7 @@ static ivas_error ivas_ism_bitrate_switching( st_ivas->hDirAC->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered; st_ivas->hDirAC->num_slots = st_ivas->hTcBuffer->num_slots; st_ivas->hDirAC->slots_rendered = st_ivas->hTcBuffer->slots_rendered; + mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hDirAC->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); } } diff --git a/lib_dec/ivas_ism_dtx_dec.c b/lib_dec/ivas_ism_dtx_dec.c index b2bc737fa2..daf4b4b3ed 100644 --- a/lib_dec/ivas_ism_dtx_dec.c +++ b/lib_dec/ivas_ism_dtx_dec.c @@ -133,6 +133,7 @@ ivas_error ivas_ism_dtx_dec( ism_mode_bstr = (ISM_MODE) ( idx + 1 ); st_ivas->ism_mode = ism_mode_bstr; } + #ifdef JBM_TSM_ON_TCS if ( ( error = ivas_ism_dec_config( st_ivas, last_ism_mode, NULL, NULL ) ) != IVAS_ERR_OK ) #else diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index 7e0f65a663..667ecd088c 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -157,6 +157,7 @@ static void ivas_ism_get_proto_matrix( return; } + #ifdef JBM_TSM_ON_TCS static void ivas_param_ism_collect_slot( DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ @@ -185,9 +186,11 @@ static void ivas_param_ism_collect_slot( ref_power[bin_idx] += tmp; } } + return; } + static void ivas_param_ism_compute_mixing_matrix( const int16_t nchan_ism, /* i : number of ISM channels */ DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ @@ -404,6 +407,7 @@ static void ivas_param_ism_compute_mixing_matrix( } #endif + #ifdef JBM_TSM_ON_TCS static void ivas_param_ism_render_slot( DIRAC_DEC_HANDLE hDirAC, @@ -822,9 +826,16 @@ ivas_error ivas_param_ism_dec_open( } else { - hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc = (float *) malloc( MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hDirAC->num_freq_bands * sizeof( float ) ); + if ( ( hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc = (float *) malloc( MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM JBM Rendering handle\n" ) ); + } set_zero( hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc, MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hDirAC->num_freq_bands ); - hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc = (float *) malloc( MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hDirAC->num_freq_bands * sizeof( float ) ); + + if ( ( hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc = (float *) malloc( MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM JBM Rendering handle\n" ) ); + } set_zero( hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc, MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hDirAC->num_freq_bands ); } if ( st_ivas->hTcBuffer == NULL ) @@ -1287,6 +1298,7 @@ void ivas_param_ism_dec( RealBuffer[i] = Cldfb_RealBuffer[idx_in][i]; ImagBuffer[i] = Cldfb_ImagBuffer[idx_in][i]; } + #ifdef JBM_TSM_ON_TCS cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][slot_idx_start * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[ch] ); @@ -1325,21 +1337,29 @@ void ivas_param_ism_dec( } #ifdef JBM_TSM_ON_TCS + +/*-------------------------------------------------------------------------* + * ivas_ism_dec_digest_tc() + * + * + *-------------------------------------------------------------------------*/ + void ivas_ism_dec_digest_tc( - Decoder_Struct *st_ivas ) + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) { ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); - if ( - st_ivas->renderer_type == RENDERER_TD_PANNING || - st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || - st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || - st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || - ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM && st_ivas->hDecoderConfig->Opt_Headrotation == 0 ) ) + if ( st_ivas->renderer_type == RENDERER_TD_PANNING || + st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || + st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || + st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || + ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM && st_ivas->hDecoderConfig->Opt_Headrotation == 0 ) ) { int16_t i, num_objects; int16_t azimuth, elevation; + /* we have a full frame interpolator, adapt it */ /* for BE testing */ if ( ( st_ivas->hDecoderConfig->output_Fs / (int32_t) FRAMES_PER_SECOND ) == st_ivas->hTcBuffer->n_samples_available ) @@ -1372,6 +1392,7 @@ void ivas_ism_dec_digest_tc( for ( i = 0; i < num_objects; i++ ) { mvr2r( st_ivas->hIsmRendererData->gains[i], st_ivas->hIsmRendererData->prev_gains[i], MAX_OUTPUT_CHANNELS ); + if ( st_ivas->intern_config == AUDIO_CONFIG_STEREO ) { ivas_ism_get_stereo_gains( st_ivas->hIsmMetaData[i]->azimuth, @@ -1384,15 +1405,15 @@ void ivas_ism_dec_digest_tc( // TODO tmu review when #215 is resolved azimuth = (int16_t) floorf( st_ivas->hIsmMetaData[i]->azimuth + 0.5f ); elevation = (int16_t) floorf( st_ivas->hIsmMetaData[i]->elevation + 0.5f ); + if ( ( st_ivas->renderer_type == RENDERER_TD_PANNING || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) && st_ivas->hHeadTrackData == NULL ) { - - if ( st_ivas->hIntSetup.is_planar_setup ) { /* If no elevation support in output format, then rendering should be done with zero elevation */ elevation = 0; } + if ( st_ivas->hEFAPdata != NULL ) { efap_determine_gains( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains[i], azimuth, elevation, EFAP_MODE_EFAP ); @@ -1406,13 +1427,21 @@ void ivas_ism_dec_digest_tc( } } } + return; } + +/*-------------------------------------------------------------------------* + * ivas_param_ism_dec_digest_tc() + * + * + *-------------------------------------------------------------------------*/ + void ivas_param_ism_dec_digest_tc( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const uint16_t nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ - float *transport_channels_f[] /* i : synthesized core-coder transport channels/DirAC output */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ + float *transport_channels_f[] /* i : synthesized core-coder transport channels/DirAC output */ ) { int16_t ch, nchan_transport, nchan_out, nchan_out_woLFE, i; @@ -1422,7 +1451,6 @@ void ivas_param_ism_dec_digest_tc( float cx_diag[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_DMX]; /* Direct Response/EFAP Gains */ float direct_response[MAX_NUM_OBJECTS][PARAM_ISM_MAX_CHAN]; - DIRAC_DEC_HANDLE hDirAC; /* Initialization */ @@ -1541,21 +1569,27 @@ void ivas_param_ism_dec_digest_tc( /* Compute mixing matrix */ ivas_param_ism_compute_mixing_matrix( st_ivas->nchan_ism, hDirAC, st_ivas->hISMDTX, direct_response, nchan_transport, nchan_out_woLFE, cx_diag, ref_power, hDirAC->hParamIsmRendering->mixing_matrix_lin ); - pop_wmops(); return; } -static void ivas_ism_param_dec_render_sf( Decoder_Struct *st_ivas, - IVAS_OUTPUT_SETUP hSetup, - const int16_t nchan_transport, - const int16_t nchan_out, - const int16_t nchan_out_woLFE, - float *output_f[] /* o : rendered time signal */ + +/*-------------------------------------------------------------------------* + * ivas_ism_param_dec_render_sf() + * + * + *-------------------------------------------------------------------------*/ + +static void ivas_ism_param_dec_render_sf( + Decoder_Struct *st_ivas, + IVAS_OUTPUT_SETUP hSetup, + const int16_t nchan_transport, + const int16_t nchan_out, + const int16_t nchan_out_woLFE, + float *output_f[] /* o : rendered time signal */ ) { - int16_t ch, slot_idx, i, index_slot; /* CLDFB Output Buffers */ float Cldfb_RealBuffer[PARAM_ISM_MAX_CHAN][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; @@ -1593,7 +1627,6 @@ static void ivas_ism_param_dec_render_sf( Decoder_Struct *st_ivas, Cldfb_ImagBuffer_in[ch] = &hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc[index_slot * hDirAC->num_freq_bands * nchan_transport + ch * hDirAC->num_freq_bands]; } - /* Compute bandwise rendering to target LS using covariance rendering */ ivas_param_ism_render_slot( hDirAC, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, Cldfb_RealBuffer, Cldfb_ImagBuffer, hDirAC->hParamIsmRendering->mixing_matrix_lin, index_slot, slot_idx, @@ -1630,16 +1663,26 @@ static void ivas_ism_param_dec_render_sf( Decoder_Struct *st_ivas, idx_in++; } } + hDirAC->slots_rendered += hDirAC->subframe_nbslots[subframe_idx]; hDirAC->subframes_rendered++; + + return; } + +/*-------------------------------------------------------------------------* + * ivas_param_ism_dec_render() + * + * + *-------------------------------------------------------------------------*/ + void ivas_param_ism_dec_render( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ - uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ - uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ - float *output_f[] /* o : rendered time signal */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ ) { int16_t ch, slots_to_render, first_sf, last_sf, subframe_idx; @@ -1667,11 +1710,13 @@ void ivas_param_ism_dec_render( nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; } slot_size = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ slots_to_render = min( hDirAC->num_slots - hDirAC->slots_rendered, nSamplesAsked / slot_size ); *nSamplesRendered = slots_to_render * slot_size; first_sf = hDirAC->subframes_rendered; last_sf = first_sf; + while ( slots_to_render > 0 ) { slots_to_render -= hDirAC->subframe_nbslots[last_sf]; @@ -1680,10 +1725,12 @@ void ivas_param_ism_dec_render( #ifdef DEBUGGING assert( slots_to_render == 0 ); #endif + for ( ch = 0; ch < nchan_out; ch++ ) { output_f_local[ch] = &output_f[ch][0]; } + for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) { ivas_ism_param_dec_render_sf( st_ivas, hSetup, nchan_transport, nchan_out, nchan_out_woLFE, output_f_local ); @@ -1693,6 +1740,7 @@ void ivas_param_ism_dec_render( output_f_local[ch] += n_samples_sf; } } + if ( hDirAC->slots_rendered == hDirAC->num_slots ) { /* copy the memories */ @@ -1714,10 +1762,11 @@ void ivas_param_ism_dec_render( st_ivas->hIsmMetaData[ch]->elevation = st_ivas->hDirAC->elevation_values[ch]; } } + *nSamplesAvailable = ( hDirAC->num_slots - hDirAC->slots_rendered ) * slot_size; + return; } - #endif @@ -1766,6 +1815,7 @@ void ivas_param_ism_params_to_masa_param_mapping( hDirAC->numSimultaneousDirections = 1; azimuth[0] = (int16_t) roundf( hDirAC->azimuth_values[0] ); elevation[0] = (int16_t) roundf( hDirAC->elevation_values[0] ); + for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) { for ( bin_idx = 0; bin_idx < nBins; bin_idx++ ) @@ -1809,6 +1859,7 @@ void ivas_param_ism_params_to_masa_param_mapping( } } } + for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) { for ( bin_idx = 0; bin_idx < nBins; bin_idx++ ) @@ -1825,6 +1876,7 @@ void ivas_param_ism_params_to_masa_param_mapping( hDirAC->numSimultaneousDirections = 1; azimuth[0] = (int16_t) roundf( hDirAC->azimuth_values[0] ); elevation[0] = (int16_t) roundf( hDirAC->elevation_values[0] ); + for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) { for ( bin_idx = 0; bin_idx < nBins; bin_idx++ ) diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index 95c153fc80..f9461f894b 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -109,6 +109,7 @@ ivas_error ivas_ism_renderer_open( st_ivas->hIsmRendererData->interpolator[i] = (float) i / ( (float) interpolator_length - 1 ); } #endif + return error; } @@ -233,6 +234,12 @@ void ivas_ism_render( } #ifdef JBM_TSM_ON_TCS +/*-------------------------------------------------------------------------* + * ivas_ism_render_sf() + * + * Object rendering process + *-------------------------------------------------------------------------*/ + void ivas_ism_render_sf( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ float *output_f[], /* i/o: core-coder transport channels/object output */ @@ -263,6 +270,7 @@ void ivas_ism_render_sf( { /* Calculate rotation matrix from the quaternion */ QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[st_ivas->hHeadTrackData->num_quaternions++], Rmat ); + ivas_jbm_dec_get_adapted_linear_interpolator( n_samples_to_render, n_samples_to_render, st_ivas->hIsmRendererData->interpolator ); @@ -271,7 +279,6 @@ void ivas_ism_render_sf( for ( i = 0; i < num_objects; i++ ) { - /* Head rotation: rotate the object positions depending the head's orientation */ if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 ) { @@ -302,6 +309,7 @@ void ivas_ism_render_sf( output_f[j2][k] += ( *( g1++ ) * gain + g2 * prev_gain ) * *( tc++ ); } } + /* update here only in case of head rotation */ if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 ) { @@ -309,6 +317,7 @@ void ivas_ism_render_sf( } } } + return; } #endif diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 1105b42e71..867dada3e0 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -65,7 +65,7 @@ static void ivas_jbm_dec_tc_buffer_playout( Decoder_Struct *st_ivas, const uint1 ivas_error ivas_jbm_dec_tc( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - float *data /* o : transport channel signal */ + float *data /* o : transport channel signals */ ) { int16_t n, output_frame, nchan_out; @@ -153,7 +153,6 @@ ivas_error ivas_jbm_dec_tc( } else if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { - // VE: call ivas_ism_metadata_dec() with 'st_ivas' - TBD if ( ( error = ivas_ism_metadata_dec( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, st_ivas->hDirAC->hParamIsm, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt ) ) != IVAS_ERR_OK ) { return error; @@ -212,13 +211,7 @@ ivas_error ivas_jbm_dec_tc( if ( st_ivas->hQMetaData != NULL ) { st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; - ivas_dirac_dec_read_BS( - ivas_total_brate, - st, - st_ivas->hDirAC, - st_ivas->hQMetaData, - &nb_bits_metadata[0], - st_ivas->sba_mode, + ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, #ifdef HODIRAC st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_256k, #endif @@ -547,8 +540,8 @@ ivas_error ivas_jbm_dec_tc( ivas_error ivas_jbm_dec_feed_tc_to_renderer( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const int16_t nSamplesForRendering, /* i: : number of TC samples available for rendering */ - int16_t *nSamplesResidual, /* o: : number of samples not fitting into the renderer grid and buffer for the next call*/ + const int16_t nSamplesForRendering, /* i : number of TC samples available for rendering */ + int16_t *nSamplesResidual, /* o : number of samples not fitting into the renderer grid and buffer for the next call*/ float *data /* i : transport channels */ ) { @@ -741,20 +734,11 @@ ivas_error ivas_jbm_dec_render( { return error; } + } else if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { - if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, - AUDIO_CONFIG_7_1_4, - AUDIO_CONFIG_BINAURAL_ROOM, - st_ivas->hDecoderConfig, - NULL, - NULL, - NULL, - st_ivas->hTcBuffer, - p_output, - p_output, - *nSamplesRendered, - output_Fs ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, st_ivas->hDecoderConfig, NULL, NULL, + NULL, st_ivas->hTcBuffer, p_output, p_output, *nSamplesRendered, output_Fs ) ) != IVAS_ERR_OK ) { return error; } @@ -771,6 +755,7 @@ ivas_error ivas_jbm_dec_render( else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) { nchan_remapped = nchan_transport; + /* Loudspeakers, Ambisonics or Binaural rendering */ if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) { @@ -810,18 +795,8 @@ ivas_error ivas_jbm_dec_render( /* Rendering */ if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { - if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, - st_ivas->intern_config, - st_ivas->hOutSetup.output_config, - st_ivas->hDecoderConfig, - st_ivas->hHeadTrackData, - &st_ivas->hIntSetup, - st_ivas->hEFAPdata, - st_ivas->hTcBuffer, - p_tc, - p_output, - *nSamplesRendered, - output_Fs ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hHeadTrackData, + &st_ivas->hIntSetup, st_ivas->hEFAPdata, st_ivas->hTcBuffer, p_tc, p_output, *nSamplesRendered, output_Fs ) ) != IVAS_ERR_OK ) { return error; } @@ -967,6 +942,7 @@ ivas_error ivas_jbm_dec_flush_renderer( *nSamplesRendered = 0; hTcBuffer = st_ivas->hTcBuffer; + /* get number of possible slots in new granularity */ n_samples_still_available = hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered; n_slots_still_available = n_samples_still_available / tc_granularity_new; @@ -974,6 +950,7 @@ ivas_error ivas_jbm_dec_flush_renderer( n_samples_to_render = *nSamplesRendered; n_samples_still_available -= n_samples_to_render; assert( n_samples_still_available < tc_granularity_new ); + if ( n_slots_still_available ) { int16_t ch_idx; @@ -1014,6 +991,7 @@ ivas_error ivas_jbm_dec_flush_renderer( { return error; } + } else if ( renderer_type_old == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */ @@ -1021,21 +999,12 @@ ivas_error ivas_jbm_dec_flush_renderer( ivas_ism_render_sf( st_ivas, p_output, hTcBuffer->n_samples_granularity ); - if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, - AUDIO_CONFIG_7_1_4, - AUDIO_CONFIG_BINAURAL_ROOM, - st_ivas->hDecoderConfig, - NULL, - NULL, - NULL, - st_ivas->hTcBuffer, - p_output, - p_output, - hTcBuffer->n_samples_granularity, - st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, st_ivas->hDecoderConfig, NULL, NULL, + NULL, st_ivas->hTcBuffer, p_output, p_output, hTcBuffer->n_samples_granularity, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) { return error; } + ivas_binaural_add_LFE( st_ivas, hTcBuffer->n_samples_granularity, p_output, p_output ); } } @@ -1050,18 +1019,8 @@ ivas_error ivas_jbm_dec_flush_renderer( { if ( renderer_type_old == RENDERER_BINAURAL_MIXER_CONV || renderer_type_old == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { - if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, - intern_config_old, - st_ivas->hOutSetup.output_config, - st_ivas->hDecoderConfig, - st_ivas->hHeadTrackData, - hIntSetupOld, - st_ivas->hEFAPdata, - st_ivas->hTcBuffer, - hTcBuffer->tc, - p_output, - hTcBuffer->n_samples_granularity, - st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, intern_config_old, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hHeadTrackData, hIntSetupOld, + st_ivas->hEFAPdata, st_ivas->hTcBuffer, hTcBuffer->tc, p_output, hTcBuffer->n_samples_granularity, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) { return error; } @@ -1102,6 +1061,7 @@ ivas_error ivas_jbm_dec_flush_renderer( return error; } + /*--------------------------------------------------------------------------* * ivas_jbm_dec_set_discard_samples() * @@ -1157,6 +1117,7 @@ void ivas_jbm_dec_get_adapted_linear_interpolator( { interpolator[idx] = max( 0.0f, interpolator[idx + 1] - dec ); } + if ( interpolator[idx + 1] > 0.0f ) { dec = interpolator[idx + 1] / ( jbm_segment_len + 1 ); @@ -1209,6 +1170,7 @@ void ivas_jbm_dec_get_adapted_subframes( { subframe_nbslots[0] = nSlotsInFirstSubframe; } + if ( nSlotsInLastSubframe > 0 ) { subframe_nbslots[*nb_subframes - 1] = nSlotsInLastSubframe; @@ -1382,12 +1344,12 @@ int16_t ivas_jbm_dec_get_num_tc_channels( * buffer handle *--------------------------------------------------------------------------*/ -void ivas_jbm_dec_copy_tc( +static void ivas_jbm_dec_copy_tc( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const int16_t nSamplesForRendering, /* i : number of samples to digest */ int16_t *nSamplesResidual, /* o : number of samples that will be left for the next frame */ float *data, /* i : (interleaved) transport channel samples */ - float *tc_digest_f[] /* o : samples that will be directly digestest (eg. by CLDFB) */ + float *tc_digest_f[] /* o : samples that will be directly digested (e.g. by CLDFB) */ ) { int16_t ch; @@ -1413,6 +1375,7 @@ void ivas_jbm_dec_copy_tc( hTcBuffer->tc[ch][n_samples_still_available + hTcBuffer->n_samples_discard + m] = data[m * st_ivas->hTcBuffer->nchan_transport_jbm + ch]; } } + if ( n_ch_res_copy > 0 ) { for ( ; ch < hTcBuffer->nchan_transport_jbm; ch++ ) @@ -1425,6 +1388,7 @@ void ivas_jbm_dec_copy_tc( mvr2r( tc_digest_f[ch] + hTcBuffer->n_samples_available, hTcBuffer->tc[ch], *nSamplesResidual ); } } + hTcBuffer->n_samples_rendered = 0; return; @@ -1469,7 +1433,7 @@ ivas_error ivas_jbm_dec_tc_buffer_open( const TC_BUFFER_MODE tc_buffer_mode, /* i : buffer mode */ const int16_t nchan_transport_jbm, /* i : number of real transport channels */ const int16_t nchan_transport_internal, /* i : number of totally buffered channels */ - const int16_t nchan_full, /* i : nubmer of channels to fully store */ + const int16_t nchan_full, /* i : number of channels to fully store */ const int16_t n_samples_granularity /* i : granularity of the renderer/buffer */ ) { @@ -1527,13 +1491,14 @@ ivas_error ivas_jbm_dec_tc_buffer_open( nsamp_to_allocate = hTcBuffer->nchan_buffer_full * n_samp_full; nsamp_to_allocate += nchan_residual * n_samp_residual; + if ( ( hTcBuffer->tc_buffer = (float *) malloc( nsamp_to_allocate * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM TC Buffer\n" ) ); } set_zero( hTcBuffer->tc_buffer, nsamp_to_allocate ); - offset = 0; + offset = 0; for ( ch_idx = 0; ch_idx < hTcBuffer->nchan_buffer_full; ch_idx++ ) { hTcBuffer->tc[ch_idx] = &hTcBuffer->tc_buffer[offset]; @@ -1619,8 +1584,10 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( hTcBuffer->nchan_buffer_full = nchan_full; nchan_residual = nchan_transport_internal - nchan_full; hTcBuffer->n_samples_granularity = n_samples_granularity; +#ifdef DEBUGGING /* what is remaining from last frames needs always be smaller than n_samples_granularity */ assert( ( hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered ) < n_samples_granularity ); +#endif /* realloc buffers */ free( hTcBuffer->tc_buffer ); @@ -1633,8 +1600,8 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM TC Buffer\n" ) ); } - set_zero( hTcBuffer->tc_buffer, nsamp_to_allocate ); + offset = 0; for ( ch_idx = 0; ch_idx < hTcBuffer->nchan_buffer_full; ch_idx++ ) { @@ -1678,11 +1645,13 @@ static void ivas_jbm_dec_tc_buffer_playout( *nSamplesRendered = (uint16_t) slots_to_render * slot_size; first_sf = st_ivas->hTcBuffer->subframes_rendered; last_sf = first_sf; + while ( slots_to_render > 0 ) { slots_to_render -= st_ivas->hTcBuffer->subframe_nbslots[last_sf]; last_sf++; } + for ( ch_idx = 0; ch_idx < st_ivas->hTcBuffer->nchan_transport_jbm; ch_idx++ ) { mvr2r( st_ivas->hTcBuffer->tc[ch_idx] + st_ivas->hTcBuffer->n_samples_rendered, output[ch_idx], *nSamplesRendered ); @@ -1772,6 +1741,7 @@ void ivas_jbm_dec_td_renderers_adapt_subframes( return; } + /*--------------------------------------------------------------------------* * ivas_jbm_dec_get_tc_buffer_mode() * diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 2c9fcbd008..2ce96b635c 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -411,11 +411,13 @@ ivas_error ivas_masa_dec_open( { int16_t nchan_to_allocate; TC_BUFFER_MODE buffer_mode; + buffer_mode = TC_BUFFER_MODE_RENDERER; if ( st_ivas->mc_mode == MC_MODE_MCMASA && ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO ) ) { buffer_mode = TC_BUFFER_MODE_BUFFER; } + nchan_to_allocate = ivas_jbm_dec_get_num_tc_channels( st_ivas ); if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, buffer_mode, nchan_to_allocate, nchan_to_allocate, nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) { @@ -1278,11 +1280,13 @@ ivas_error ivas_masa_dec_reconfigure( buffer_mode_new = ivas_jbm_dec_get_tc_buffer_mode( st_ivas ); tc_nchan_transport = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + tc_nchan_to_allocate = tc_nchan_transport; if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) { tc_nchan_to_allocate = 2 * BINAURAL_CHANNELS; } + if ( tc_nchan_transport != st_ivas->hTcBuffer->nchan_transport_jbm || tc_nchan_to_allocate != st_ivas->hTcBuffer->nchan_transport_internal || buffer_mode_new != st_ivas->hTcBuffer->tc_buffer_mode ) { if ( ( error = ivas_jbm_dec_tc_buffer_reconfigure( st_ivas, buffer_mode_new, tc_nchan_transport, tc_nchan_to_allocate, tc_nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) @@ -1292,6 +1296,7 @@ ivas_error ivas_masa_dec_reconfigure( } } #endif + return error; } @@ -1571,7 +1576,6 @@ void ivas_spar_param_to_masa_param_mapping( float slot_fac; #endif - /* Set values */ hDirAC = st_ivas->hDirAC; hDirAC->numSimultaneousDirections = 1; diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index 19a0909461..90b7496b62 100755 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -927,7 +927,6 @@ static ivas_error ivas_mc_dec_reconfig( } #endif - if ( last_mc_mode == MC_MODE_MCT ) { if ( st_ivas->hMCT != NULL && st_ivas->nchan_transport <= CPE_CHANNELS ) @@ -1331,6 +1330,7 @@ static ivas_error ivas_mc_dec_reconfig( /*-----------------------------------------------------------------* * Reconfigure TC buffer *-----------------------------------------------------------------*/ + if ( st_ivas->hDecoderConfig->voip_active == 1 ) { int16_t tc_nchan_full_new; @@ -1350,6 +1350,7 @@ static ivas_error ivas_mc_dec_reconfig( { tc_nchan_full_new = 0; } + /* reconfigure buffer */ if ( hTcBuffer->tc_buffer_mode != tc_buffer_mode_new || hTcBuffer->nchan_transport_jbm != tc_nchan_tc_new || hTcBuffer->nchan_buffer_full != tc_nchan_full_new || hTcBuffer->nchan_transport_internal != tc_nchan_allocate_new || @@ -1360,6 +1361,7 @@ static ivas_error ivas_mc_dec_reconfig( return error; } } + /* transfer subframe info from central tc buffer to ParamMC or McMASA (DirAC) */ if ( st_ivas->hDirAC != NULL ) { @@ -1379,5 +1381,6 @@ static ivas_error ivas_mc_dec_reconfig( } } #endif + return error; } diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index ff65660697..bc4ad29025 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -83,6 +83,7 @@ ivas_error ivas_td_binaural_renderer( ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Pos : NULL, output, output_frame ); } + #ifdef JBM_TSM_ON_TCS /*---------------------------------------------------------------------* * ivas_td_binaural_renderer_sf() @@ -103,24 +104,31 @@ ivas_error ivas_td_binaural_renderer_sf( float *output_f_local[BINAURAL_CHANNELS]; float *tc_local[MAX_TRANSPORT_CHANNELS]; int16_t ch, slot_size, slots_to_render, output_frame; + ivas_error error; + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { p_reverb_signal[ch] = reverb_signal[ch]; } + for ( ch = 0; ch < st_ivas->hTcBuffer->nchan_transport_internal; ch++ ) { tc_local[ch] = st_ivas->hTcBuffer->tc[ch] + st_ivas->hTcBuffer->n_samples_rendered; } + for ( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ ) { output_f_local[ch] = output[ch]; } + slot_size = st_ivas->hTcBuffer->n_samples_granularity; + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ slots_to_render = min( st_ivas->hTcBuffer->num_slots - st_ivas->hTcBuffer->slots_rendered, n_samples_granularity / slot_size ); first_sf = st_ivas->hTcBuffer->subframes_rendered; last_sf = first_sf; st_ivas->hTcBuffer->slots_rendered += slots_to_render; + while ( slots_to_render > 0 ) { slots_to_render -= st_ivas->hTcBuffer->subframe_nbslots[last_sf]; @@ -130,22 +138,28 @@ ivas_error ivas_td_binaural_renderer_sf( for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) { output_frame = st_ivas->hTcBuffer->subframe_nbslots[subframe_idx] * st_ivas->hTcBuffer->n_samples_granularity; + /* Update object position(s) */ TDREND_Update_object_positions( st_ivas->hBinRendererTd, st_ivas->nchan_transport, LFE_CHANNEL, st_ivas->ivas_format, st_ivas->hIsmMetaData, tc_local ); /* Update the listener's location/orientation */ - TDREND_Update_listener_orientation( st_ivas->hBinRendererTd, - st_ivas->hDecoderConfig->Opt_Headrotation, + TDREND_Update_listener_orientation( st_ivas->hBinRendererTd, st_ivas->hDecoderConfig->Opt_Headrotation, ( st_ivas->hHeadTrackData != NULL ) ? &st_ivas->hHeadTrackData->Quaternions[0] : NULL, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Pos : NULL ); if ( ( st_ivas->hRenderConfig != NULL ) && ( st_ivas->hRenderConfig->roomAcoustics.late_reverb_on ) ) { - ivas_reverb_process( st_ivas->hReverb, st_ivas->transport_config, 0, tc_local, p_reverb_signal, 0 ); + if ( ( error = ivas_reverb_process( st_ivas->hReverb, st_ivas->transport_config, 0, tc_local, p_reverb_signal, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } } /* Render subframe */ - TDREND_GetMix( st_ivas->hBinRendererTd, output_f_local, output_frame, 0 ); + if ( ( error = TDREND_GetMix( st_ivas->hBinRendererTd, output_f_local, output_frame, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } if ( st_ivas->hRenderConfig != NULL ) /* Renderer Configuration not enabled in TD standalone renderer */ { @@ -156,16 +170,20 @@ ivas_error ivas_td_binaural_renderer_sf( v_add( reverb_signal[1], output_f_local[1], output_f_local[1], output_frame ); } } + for ( ch = 0; ch < st_ivas->hTcBuffer->nchan_transport_internal; ch++ ) { tc_local[ch] += output_frame; } + for ( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ ) { output_f_local[ch] += output_frame; } } + st_ivas->hTcBuffer->subframes_rendered = last_sf; - return; + + return IVAS_ERR_OK; } #endif diff --git a/lib_dec/ivas_out_setup_conversion.c b/lib_dec/ivas_out_setup_conversion.c index 3f95113f60..1d6db5eebf 100644 --- a/lib_dec/ivas_out_setup_conversion.c +++ b/lib_dec/ivas_out_setup_conversion.c @@ -1161,7 +1161,7 @@ void ivas_ls_setup_conversion_process_mdct_param_mc( void ivas_lssetupconversion_process_param_mc( Decoder_Struct *st_ivas, /* i/o: LS setup conversion renderer handle */ #ifdef JBM_TSM_ON_TCS - int16_t num_timeslots, + const int16_t num_timeslots, #endif float Cldfb_RealBuffer_InOut[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals */ float Cldfb_ImagBuffer_InOut[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals */ diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 0dcaec91da..581262fc52 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -201,6 +201,7 @@ ivas_error ivas_sba_dec_reconfigure( hSpar = st_ivas->hSpar; st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); + #ifdef JBM_TSM_ON_TCS /* synchronize subframe info */ st_ivas->hSpar->num_slots = st_ivas->hTcBuffer->num_slots; @@ -291,6 +292,7 @@ ivas_error ivas_sba_dec_reconfigure( { return error; } + #ifdef JBM_TSM_ON_TCS /* synchronize subframe info */ st_ivas->hDirAC->num_slots = st_ivas->hTcBuffer->num_slots; @@ -377,8 +379,9 @@ ivas_error ivas_sba_dec_reconfigure( #ifdef JBM_TSM_ON_TCS /*-----------------------------------------------------------------* - * TC buffer + * JBM TC buffer *-----------------------------------------------------------------*/ + if ( st_ivas->hDecoderConfig->voip_active == 1 ) { int16_t tc_nchan_to_allocate; @@ -424,10 +427,17 @@ ivas_error ivas_sba_dec_reconfigure( } } #endif + return error; } #ifdef JBM_TSM_ON_TCS +/*-------------------------------------------------------------------* + * ivas_sba_dec_digest_tc() + * + * + *-------------------------------------------------------------------*/ + ivas_error ivas_sba_dec_digest_tc( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ const int16_t nCldfbSlots, /* i : number of CLDFB slots */ @@ -445,22 +455,27 @@ ivas_error ivas_sba_dec_digest_tc( { ivas_dirac_dec_set_md_map( st_ivas, nCldfbSlots ); } + if ( st_ivas->sba_mode == SBA_MODE_SPAR ) { ivas_spar_dec_digest_tc( st_ivas, st_ivas->nchan_transport, nCldfbSlots, nSamplesForRendering ); } + if ( st_ivas->hDiracDecBin != NULL && ( st_ivas->hDiracDecBin->useTdDecorr ) ) { int16_t nSamplesLeftForTD, default_frame; float *decorr_signal[BINAURAL_CHANNELS]; float *p_tc[2 * BINAURAL_CHANNELS]; + default_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); nSamplesLeftForTD = nSamplesForRendering; + for ( ch_idx = 0; ch_idx < BINAURAL_CHANNELS; ch_idx++ ) { decorr_signal[ch_idx] = st_ivas->hTcBuffer->tc[ch_idx + BINAURAL_CHANNELS]; p_tc[ch_idx] = st_ivas->hTcBuffer->tc[ch_idx]; } + while ( nSamplesLeftForTD ) { int16_t nSamplesToDecorr = min( nSamplesLeftForTD, default_frame ); @@ -473,21 +488,30 @@ ivas_error ivas_sba_dec_digest_tc( nSamplesLeftForTD -= nSamplesToDecorr; } } + /* if we have a late CNG generation, do it here */ if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->sba_mode != SBA_MODE_SPAR ) { Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; generate_masking_noise_lb_dirac( st->hFdCngDec->hFdCngCom, st_ivas->hTcBuffer->tc[1], nCldfbSlots, st->cna_dirac_flag && st->flag_cna ); } + return error; } + +/*-------------------------------------------------------------------* + * ivas_sba_dec_render() + * + * + *-------------------------------------------------------------------*/ + void ivas_sba_dec_render( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ - uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ - uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ - float *output_f[] /* o : rendered time signal */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ ) { int16_t slots_to_render, first_sf, last_sf, subframe_idx; @@ -503,7 +527,9 @@ void ivas_sba_dec_render( st_ivas->hDecoderConfig->ivas_total_brate #endif ); + nchan_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; + #ifdef DEBUGGING assert( hSpar ); #endif @@ -511,12 +537,15 @@ void ivas_sba_dec_render( { output_f_local[ch] = output_f[ch]; } + slot_size = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ slots_to_render = min( hSpar->num_slots - hSpar->slots_rendered, nSamplesAsked / slot_size ); *nSamplesRendered = slots_to_render * slot_size; first_sf = hSpar->subframes_rendered; last_sf = first_sf; + while ( slots_to_render > 0 ) { slots_to_render -= hSpar->subframe_nbslots[last_sf]; @@ -525,9 +554,11 @@ void ivas_sba_dec_render( #ifdef DEBUGGING assert( slots_to_render == 0 ); #endif + for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) { int16_t n_samples_sf = slot_size * hSpar->subframe_nbslots[subframe_idx]; + ivas_spar_dec_upmixer_sf( st_ivas, output_f_local, nchan_internal ); for ( ch = 0; ch < nchan_out; ch++ ) { @@ -539,6 +570,7 @@ void ivas_sba_dec_render( { ivas_sba_linear_renderer( output_f, *nSamplesRendered, st_ivas->hIntSetup.nchan_out_woLFE, st_ivas->hDecoderConfig->output_config, st_ivas->hOutSetup, st_ivas->hoa_dec_mtx ); } + if ( st_ivas->hDirAC != NULL && hSpar->slots_rendered == hSpar->num_slots ) { if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 ) @@ -550,6 +582,7 @@ void ivas_sba_dec_render( st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % st_ivas->hDirAC->dirac_md_buffer_length; } } + *nSamplesAvailable = ( hSpar->num_slots - hSpar->slots_rendered ) * slot_size; return; diff --git a/lib_dec/ivas_sba_rendering_internal.c b/lib_dec/ivas_sba_rendering_internal.c index 6d71f1f8b8..5fe6c91312 100644 --- a/lib_dec/ivas_sba_rendering_internal.c +++ b/lib_dec/ivas_sba_rendering_internal.c @@ -92,6 +92,7 @@ void ivas_sba2mc_cldfb( g = hoa_dec_mtx[SBA_NHARM_HOA3 * n + m]; p_realOut = realOut[n]; p_imagOut = imagOut[n]; + #ifdef JBM_TSM_ON_TCS for ( iBlock = 0; iBlock < nb_timeslots; iBlock++ ) #else @@ -115,6 +116,7 @@ void ivas_sba2mc_cldfb( { p_realOut = realOut[n]; p_imagOut = imagOut[n]; + #ifdef JBM_TSM_ON_TCS for ( iBlock = 0; iBlock < nb_timeslots; iBlock++ ) #else @@ -429,7 +431,6 @@ void ivas_sba_upmixer_renderer( const int16_t output_frame /* i : output frame length */ ) { - int16_t nchan_internal; #ifndef JBM_TSM_ON_TCS int16_t i; @@ -466,10 +467,12 @@ void ivas_sba_upmixer_renderer( #ifdef JBM_TSM_ON_TCS float *output_f[MAX_OUTPUT_CHANNELS]; int16_t ch; + for ( ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++ ) { output_f[ch] = output[ch]; } + ivas_sba_linear_renderer( output_f, output_frame, st_ivas->hIntSetup.nchan_out_woLFE, st_ivas->hDecoderConfig->output_config, st_ivas->hOutSetup, st_ivas->hoa_dec_mtx ); #else ivas_sba_linear_renderer( output, output_frame, st_ivas->hIntSetup.nchan_out_woLFE, st_ivas->hDecoderConfig->output_config, st_ivas->hOutSetup, st_ivas->hoa_dec_mtx ); diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index d1104594a1..6f70700113 100755 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -213,6 +213,7 @@ ivas_error ivas_spar_dec_open( hSpar->subframes_rendered = 0; hSpar->slots_rendered = 0; hSpar->num_slots = DEFAULT_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME; + /* init render timeslot mapping */ { int16_t map_idx; @@ -222,6 +223,7 @@ ivas_error ivas_spar_dec_open( hSpar->render_to_md_map[map_idx] = map_idx; } } + /* allocate transport channels*/ if ( st_ivas->hDecoderConfig->voip_active == 1 && st_ivas->hTcBuffer == NULL ) { @@ -1115,14 +1117,20 @@ static void ivas_spar_calc_smooth_facs( return; } + #ifdef JBM_TSM_ON_TCS +/*-------------------------------------------------------------------* + * ivas_spar_dec_agc_pca() + * + * + *-------------------------------------------------------------------*/ + void ivas_spar_dec_agc_pca( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ float output[][L_FRAME48k], /* i/o: input/output audio channels */ const int16_t output_frame /* i : output frame length */ ) { - int16_t nchan_transport; int16_t num_in_ingest; DECODER_CONFIG_HANDLE hDecoderConfig; @@ -1160,6 +1168,7 @@ void ivas_spar_dec_agc_pca( { num_in_ingest = nchan_transport; } + /*---------------------------------------------------------------------* * AGC *---------------------------------------------------------------------*/ @@ -1179,12 +1188,21 @@ void ivas_spar_dec_agc_pca( #endif } pop_wmops(); + return; } + +/*-------------------------------------------------------------------* + * ivas_spar_dec_set_render_map() + * + * + *-------------------------------------------------------------------*/ + void ivas_spar_dec_set_render_map( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - int16_t nCldfbTs ) + const int16_t nCldfbTs /* i : number of CLDFB time slots */ +) { SPAR_DEC_HANDLE hSpar; @@ -1203,6 +1221,8 @@ void ivas_spar_dec_set_render_map( return; } + + /*-------------------------------------------------------------------* * ivas_spar_dec_upmixer() * @@ -1219,11 +1239,14 @@ void ivas_spar_dec_set_render_params( int16_t num_bands_out; hSpar = st_ivas->hSpar; + /*---------------------------------------------------------------------* * Gen umx mat *---------------------------------------------------------------------*/ + nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; + ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, st_ivas->bfi #ifdef HODIRAC , @@ -1236,6 +1259,13 @@ void ivas_spar_dec_set_render_params( return; } + +/*-------------------------------------------------------------------* + * ivas_spar_dec_digest_tc() + * + * + *-------------------------------------------------------------------*/ + void ivas_spar_dec_digest_tc( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ const int16_t nchan_transport, /* i : number of transport channels */ @@ -1253,6 +1283,7 @@ void ivas_spar_dec_digest_tc( float *p_tc[MAX_SPAR_INTERNAL_CHANNELS]; int16_t nchan_internal, ch; int16_t nSamplesLeftForTD, default_frame; + /* TD decorrelator */ default_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); nSamplesLeftForTD = nSamplesForRendering; @@ -1262,6 +1293,7 @@ void ivas_spar_dec_digest_tc( st_ivas->hDecoderConfig->ivas_total_brate #endif ); + for ( ch = 0; ch < nchan_internal; ch++ ) { pPcm_tmp[ch] = Pcm_tmp[ch]; @@ -1271,6 +1303,7 @@ void ivas_spar_dec_digest_tc( while ( nSamplesLeftForTD ) { int16_t nSamplesToDecorr = min( nSamplesLeftForTD, default_frame ); + ivas_td_decorr_process( hSpar->hTdDecorr, p_tc, pPcm_tmp, nSamplesToDecorr ); #ifdef HODIRAC if ( hSpar->hTdDecorr->num_apd_outputs >= ( nchan_internal - nchan_transport ) ) @@ -1301,16 +1334,23 @@ void ivas_spar_dec_digest_tc( { p_tc[ch] += nSamplesToDecorr; } + nSamplesLeftForTD -= nSamplesToDecorr; } } ivas_spar_dec_set_render_params( st_ivas, nCldfbSlots ); - return; } + +/*-------------------------------------------------------------------* + * ivas_spar_dec_upmixer() + * + * + *-------------------------------------------------------------------*/ + void ivas_spar_dec_upmixer( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ float output[][L_FRAME48k], /* i/o: input/output audio channels */ @@ -1330,10 +1370,12 @@ void ivas_spar_dec_upmixer( nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; nchan_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; n_samples_sf = JBM_CLDFB_SLOTS_IN_SUBFRAME * NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + for ( n = 0; n < MAX_OUTPUT_CHANNELS; n++ ) { output_f_local[n] = &output[n][0]; } + for ( n = 0; n < nchan_internal; n++ ) { st_ivas->hTcBuffer->tc[n] = output[n]; @@ -1342,10 +1384,12 @@ void ivas_spar_dec_upmixer( /*---------------------------------------------------------------------* * TD decorrelation *---------------------------------------------------------------------*/ + for ( i = 0; i < nchan_internal; i++ ) { pPcm_tmp[i] = Pcm_tmp[i]; } + if ( hSpar->hMdDec->td_decorr_flag ) { ivas_td_decorr_process( hSpar->hTdDecorr, st_ivas->hTcBuffer->tc, pPcm_tmp, output_frame ); @@ -1376,7 +1420,6 @@ void ivas_spar_dec_upmixer( #endif } - ivas_spar_dec_set_render_params( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS ); if ( st_ivas->hDirAC != 0 ) @@ -1392,10 +1435,12 @@ void ivas_spar_dec_upmixer( output_f_local[n] += n_samples_sf; } } + for ( n = 0; n < nchan_internal; n++ ) { st_ivas->hTcBuffer->tc[n] = NULL; } + if ( st_ivas->hDirAC != 0 ) { if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 ) @@ -1407,6 +1452,7 @@ void ivas_spar_dec_upmixer( st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % st_ivas->hDirAC->dirac_md_buffer_length; } } + return; } #endif @@ -1418,6 +1464,7 @@ void ivas_spar_dec_upmixer( * * IVAS SPAR upmixer *-------------------------------------------------------------------*/ + void ivas_spar_dec_upmixer_sf( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ float *output[], /* o : output audio channels */ diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 98df8c3dca..711c55b160 100755 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -440,6 +440,7 @@ typedef struct param_ism_rendering float *Cldfb_RealBuffer_tc; float *Cldfb_ImagBuffer_tc; #endif + } PARAM_ISM_RENDERING_DATA, *PARAM_ISM_RENDERING_HANDLE; @@ -1259,8 +1260,11 @@ typedef struct decoder_tc_buffer_structure int16_t slots_rendered; int16_t num_slots; int16_t n_samples_discard; /* number of samples to discard from the beginning of the output */ + } DECODER_TC_BUFFER, *DECODER_TC_BUFFER_HANDLE; #endif + + /*----------------------------------------------------------------------------------* * * Main IVAS decoder structure @@ -1350,6 +1354,11 @@ typedef struct Decoder_Struct RENDER_CONFIG_DATA *hRenderConfig; /* Renderer config pointer */ int32_t binaural_latency_ns; /* Binauralization latency in ns */ +#ifdef JBM_TSM_ON_TCS + /* JBM module */ + DECODER_TC_BUFFER_HANDLE hTcBuffer; /* JBM handle */ +#endif + #ifdef DEBUGGING int32_t noClipping; /* number of clipped samples */ #endif @@ -1357,10 +1366,6 @@ typedef struct Decoder_Struct int16_t ism_extmeta_active; /* Extended metadata active in decoder */ int16_t ism_extmeta_cnt; /* Change frame counter for extended metadata */ - -#ifdef JBM_TSM_ON_TCS - DECODER_TC_BUFFER_HANDLE hTcBuffer; -#endif } Decoder_Struct; /* clang-format on */ diff --git a/lib_dec/jbm_pcmdsp_apa.c b/lib_dec/jbm_pcmdsp_apa.c index c224b4cfbf..9742a01183 100644 --- a/lib_dec/jbm_pcmdsp_apa.c +++ b/lib_dec/jbm_pcmdsp_apa.c @@ -412,7 +412,9 @@ bool apa_set_renderer_residual_samples( return 0; } -bool apa_set_evs_compat_mode( apa_state_t *ps, bool mode ) +bool apa_set_evs_compat_mode( + apa_state_t *ps, + bool mode ) { /* make sure pointer is valid */ if ( ps == NULL ) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 99c6c20e01..62e83686a0 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -279,6 +279,7 @@ static void init_decoder_config( #ifdef JBM_TSM_ON_TCS hDecoderConfig->voip_active = 0; #endif + return; } @@ -580,7 +581,6 @@ ivas_error IVAS_DEC_EnableVoIP( #endif #endif - #ifndef JBM_TSM_ON_TCS assert( hDecoderConfig->nchan_out > 0 && "EXT output not yet supported in VoIP mode" ); #endif @@ -610,6 +610,7 @@ ivas_error IVAS_DEC_EnableVoIP( #else hIvasDec->hVoIP->nSamplesFrame = (uint16_t) ( hDecoderConfig->output_Fs * hDecoderConfig->nchan_out / FRAMES_PER_SEC ); #endif + #ifdef JBM_TSM_ON_TCS /* postpone init of the buffers until we know the real number of TCs*/ hIvasDec->hVoIP->apaExecBuffer = NULL; @@ -678,7 +679,6 @@ ivas_error IVAS_DEC_EnableVoIP( #endif #ifdef JBM_TSM_ON_TCS - /* postpone init of time scaler until we know the real number of TCs */ hIvasDec->hVoIP->hTimeScaler = NULL; /* create output pcm fifo*/ @@ -931,6 +931,7 @@ static ivas_error IVAS_DEC_Setup( return error; } + /*---------------------------------------------------------------------* * IVAS_DEC_GetTcSamples( ) * @@ -1999,6 +2000,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( #ifdef JBM_TSM_ON_TCS uint16_t l_ts = 1; uint16_t nSamplesRendered_loop; + /* setup ivas decoder and get the number of TCs */ /* might render some remaining samples from the previous frame too if the renderer granularity changed */ if ( hVoIP->hFifoOut ) @@ -2020,11 +2022,13 @@ ivas_error IVAS_DEC_VoIP_GetSamples( return error; } } + nSamplesRendered += nSamplesRendered_loop; if ( nTransportChannels != hVoIP->nTransportChannelsOld ) { IVAS_DEC_VoIP_reconfigure( hIvasDec, nTransportChannels, l_ts ); } + /* decode TCs only */ if ( ( error = IVAS_DEC_GetTcSamples( hIvasDec, hVoIP->apaExecBuffer, &nOutSamplesElse ) ) != IVAS_ERR_OK ) { @@ -2119,10 +2123,12 @@ ivas_error IVAS_DEC_VoIP_GetSamples( { /* render IVAS frames */ int16_t nResidualSamples; + if ( ( error = IVAS_DEC_RendererFeedTcSamples( hIvasDec, nSamplesTcsScaled, &nResidualSamples, hVoIP->apaExecBuffer ) ) != IVAS_ERR_OK ) { return error; } + /* feed residual samples to TSM for the next call */ if ( apa_set_renderer_residual_samples( hVoIP->hTimeScaler, (uint16_t) nResidualSamples ) != 0 ) { @@ -2160,6 +2166,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( #endif #ifdef JBM_TSM_ON_TCS } + if ( hIvasDec->hasBeenFedFirstGoodFrame && hVoIP->rendererType != JBM_RENDERER_NONE ) { uint16_t nSamplesRendered_loop; @@ -2167,12 +2174,15 @@ ivas_error IVAS_DEC_VoIP_GetSamples( if ( hVoIP->hFifoOut ) { int16_t rendererPcmBuf[( MAX_OUTPUT_CHANNELS * L_FRAME_MAX * APA_MAX_SCALE ) / 100]; + nSamplesToRender = nSamplesPerChannel - pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoOut ); + /* render IVAS frames */ if ( ( error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesRendered_loop, &hVoIP->nSamplesAvailableNext, rendererPcmBuf ) ) != IVAS_ERR_OK ) { return error; } + if ( pcmdsp_fifo_write( hVoIP->hFifoOut, (uint8_t *) rendererPcmBuf, nSamplesRendered_loop ) != 0 ) { return IVAS_ERR_UNKNOWN; @@ -2181,13 +2191,16 @@ ivas_error IVAS_DEC_VoIP_GetSamples( else { nSamplesToRender = nSamplesPerChannel - nSamplesRendered; + /* render IVAS frames directly to the output buffer */ if ( ( error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesRendered_loop, &hVoIP->nSamplesAvailableNext, pcmBuf + nSamplesRendered * nOutChannels ) ) != IVAS_ERR_OK ) { return error; } } + nSamplesRendered += nSamplesRendered_loop; + #ifdef VARIABLE_SPEED_DECODING if ( hVoIP->mode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED && hVoIP->nSamplesAvailableNext == 0 ) { @@ -2202,12 +2215,14 @@ ivas_error IVAS_DEC_VoIP_GetSamples( else { hVoIP->nSamplesAvailableNext = max( 0, pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoOut ) - nSamplesPerChannel ); + #ifdef VARIABLE_SPEED_DECODING if ( hVoIP->mode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED && hVoIP->nSamplesAvailableNext < nSamplesPerChannel ) { hVoIP->needNewFrame = true; } #endif + hVoIP->nSamplesAvailableNext = 0; } #endif @@ -2270,6 +2285,7 @@ ivas_error IVAS_DEC_VoIP_Flush( uint16_t nSamplesToRender; uint16_t nSamplesFlushedLocal; #endif + error = IVAS_ERR_OK; hVoIP = hIvasDec->hVoIP; @@ -2278,6 +2294,7 @@ ivas_error IVAS_DEC_VoIP_Flush( #else *nSamplesFlushed = min( nSamplesPerChannel, pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoAfterTimeScaler ) ); #endif + #ifdef JBM_TSM_ON_TCS if ( hVoIP->rendererType == JBM_RENDERER_NONE ) { @@ -2301,25 +2318,28 @@ ivas_error IVAS_DEC_VoIP_Flush( } else { - nSamplesToRender = (uint16_t) *nSamplesFlushed; /* render IVAS frames */ if ( ( error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesFlushedLocal, &hVoIP->nSamplesAvailableNext, rendererPcmBuf ) ) != IVAS_ERR_OK ) { return error; } + if ( pcmdsp_fifo_write( hVoIP->hFifoOut, (uint8_t *) rendererPcmBuf, nSamplesFlushedLocal ) != 0 ) { return IVAS_ERR_UNKNOWN; } + if ( pcmdsp_fifo_read( hVoIP->hFifoOut, nSamplesFlushedLocal, (uint8_t *) pcmBuf ) != 0 ) { return IVAS_ERR_UNKNOWN; } + *nSamplesAvailableNext = hVoIP->nSamplesAvailableNext; *nSamplesFlushed = (int16_t) nSamplesFlushedLocal; } #endif + return error; } #endif @@ -2335,7 +2355,7 @@ bool IVAS_DEC_VoIP_IsEmpty( IVAS_DEC_HANDLE hIvasDec /* i/o: IVAS decoder handle */ #ifdef JBM_TSM_ON_TCS , - int16_t nSamplesAsked + const int16_t nSamplesAsked #endif ) { @@ -2389,6 +2409,7 @@ static void IVAS_DEC_Close_VoIP( #else pcmdsp_fifo_destroy( &hVoIP->hFifoAfterTimeScaler ); #endif + if ( hVoIP->apaExecBuffer != NULL ) { free( hVoIP->apaExecBuffer ); @@ -2974,7 +2995,6 @@ static ivas_error evs_dec_main( /* BE workaround */ int16_t pcm_buf_local[L_FRAME48k]; - /* convert 'float' output data to 'short' */ #ifdef DEBUGGING st_ivas->noClipping += @@ -3008,6 +3028,7 @@ static ivas_error evs_dec_main( #ifdef JBM_TSM_ON_TCS } #endif + return error; } @@ -3255,7 +3276,6 @@ ivas_error IVAS_DEC_VoIP_reconfigure( IVAS_DEC_VOIP *hVoIP; ivas_error error; - hVoIP = hIvasDec->hVoIP; if ( hIvasDec->hVoIP->hTimeScaler == NULL ) @@ -3298,12 +3318,13 @@ ivas_error IVAS_DEC_VoIP_reconfigure( { return IVAS_ERR_INIT_ERROR; } - hIvasDec->hVoIP->apaExecBuffer = malloc( sizeof( float ) * APA_BUF_PER_CHANNEL * nTransportChannels ); - set_zero( hIvasDec->hVoIP->apaExecBuffer, APA_BUF_PER_CHANNEL * nTransportChannels ); - if ( hIvasDec->hVoIP->apaExecBuffer == NULL ) + + if ( ( hIvasDec->hVoIP->apaExecBuffer = malloc( sizeof( float ) * APA_BUF_PER_CHANNEL * nTransportChannels ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate VoIP handle" ); } + set_zero( hIvasDec->hVoIP->apaExecBuffer, APA_BUF_PER_CHANNEL * nTransportChannels ); + if ( apa_init( &hIvasDec->hVoIP->hTimeScaler, nTransportChannels ) != IVAS_ERR_OK || apa_set_rate( hIvasDec->hVoIP->hTimeScaler, hDecoderConfig->output_Fs ) != 0 || @@ -3313,6 +3334,7 @@ ivas_error IVAS_DEC_VoIP_reconfigure( { return IVAS_ERR_INIT_ERROR; } + if ( hVoIP->hFifoOut == NULL && hVoIP->rendererType == JBM_RENDERER_NONE ) { /* we still need the FIFO out buffer */ @@ -3332,6 +3354,7 @@ ivas_error IVAS_DEC_VoIP_reconfigure( } } #endif + if ( hIvasDec->mode == IVAS_DEC_MODE_EVS ) { if ( apa_set_evs_compat_mode( hIvasDec->hVoIP->hTimeScaler, true ) != 0 ) @@ -3349,12 +3372,11 @@ ivas_error IVAS_DEC_VoIP_reconfigure( /* realloc apa_exe_buffer */ free( hIvasDec->hVoIP->apaExecBuffer ); - hIvasDec->hVoIP->apaExecBuffer = malloc( sizeof( float ) * APA_BUF_PER_CHANNEL * nTransportChannels ); - set_zero( hIvasDec->hVoIP->apaExecBuffer, APA_BUF_PER_CHANNEL * nTransportChannels ); - if ( hIvasDec->hVoIP->apaExecBuffer == NULL ) + if ( ( hIvasDec->hVoIP->apaExecBuffer = malloc( sizeof( float ) * APA_BUF_PER_CHANNEL * nTransportChannels ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate VoIP handle" ); } + set_zero( hIvasDec->hVoIP->apaExecBuffer, APA_BUF_PER_CHANNEL * nTransportChannels ); } hIvasDec->hVoIP->nTransportChannelsOld = (uint8_t) nTransportChannels; diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index 8151f581c5..9e098992a5 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -229,8 +229,8 @@ ivas_error IVAS_DEC_VoIP_FeedFrame( #ifdef VARIABLE_SPEED_DECODING /*! r: error code */ ivas_error IVAS_DEC_VoIP_SetScale( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - const int16_t scale /* i : TSM scale to set */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const int16_t scale /* i : TSM scale to set */ ); #endif @@ -242,7 +242,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( const uint32_t systemTimestamp_ms /* i : current system timestamp */ #if defined( JBM_TSM_ON_TCS ) || defined(VARIABLE_SPEED_DECODING ) , - uint16_t *sampleAvailableNext /* o : samples available for the next call */ + uint16_t *sampleAvailableNext /* o : samples available for the next call */ #endif #ifdef SUPPORT_JBM_TRACEFILE , JbmTraceFileWriterFn jbmWriterFn, @@ -252,11 +252,11 @@ ivas_error IVAS_DEC_VoIP_GetSamples( #if defined( JBM_TSM_ON_TCS ) || defined(VARIABLE_SPEED_DECODING ) ivas_error IVAS_DEC_VoIP_Flush( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - const int16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ - int16_t *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */ - uint16_t *nSamplesAvailableNext, /* o : number of samples still available */ - int16_t *nSamplesFlushed /* o : number of samples flushed */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const int16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ + int16_t *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */ + uint16_t *nSamplesAvailableNext, /* o : number of samples still available */ + int16_t *nSamplesFlushed /* o : number of samples flushed */ ); #endif @@ -386,7 +386,7 @@ bool IVAS_DEC_VoIP_IsEmpty( IVAS_DEC_HANDLE hIvasDec /* i/o: IVAS decoder handle */ #ifdef JBM_TSM_ON_TCS , - int16_t nSamplesAsked + const int16_t nSamplesAsked #endif ); diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index a7572aea3f..76e7b36d02 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -1145,12 +1145,14 @@ ivas_error ivas_rend_crendProcess( output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC ); subframe_len = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES; + #ifdef JBM_TSM_ON_TCS for ( i = 0; i < BINAURAL_CHANNELS; i++ ) { p_pcm_tmp[i] = pcm_tmp[i]; } #endif + for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) { if ( hDecoderConfig && hDecoderConfig->Opt_Headrotation && hHeadTrackData && hHeadTrackData->num_quaternions >= 0 ) @@ -1212,20 +1214,28 @@ ivas_error ivas_rend_crendProcess( return IVAS_ERR_OK; } + #ifdef JBM_TSM_ON_TCS +/*-----------------------------------------------------------------------------------------* + * Function ivas_rend_crendProcessSubframe() + * + * + *-----------------------------------------------------------------------------------------*/ + ivas_error ivas_rend_crendProcessSubframe( - const CREND_WRAPPER *pCrend, - const AUDIO_CONFIG inConfig, - const AUDIO_CONFIG outConfig, - DECODER_CONFIG_HANDLE hDecoderConfig, - HEAD_TRACK_DATA_HANDLE hHeadTrackData, - IVAS_OUTPUT_SETUP_HANDLE hIntSetup, - EFAP_HANDLE hEFAPdata, - DECODER_TC_BUFFER_HANDLE hTcBuffer, - float *input_f[], - float *output[], /* i/o: input/output audio channels */ - const int16_t n_samples_to_render, - const int32_t output_Fs ) + const CREND_WRAPPER *pCrend, /* i/o: Crend wrapper handle */ + const AUDIO_CONFIG inConfig, /* i : input audio configuration */ + const AUDIO_CONFIG outConfig, /* i : output audio configuration */ + const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : decoder config. structure */ + const HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : Head tracking data structure */ + const IVAS_OUTPUT_SETUP_HANDLE hIntSetup, /* i : internal setup handle */ + const EFAP_HANDLE hEFAPdata, /* i : EFAP handle */ + DECODER_TC_BUFFER_HANDLE hTcBuffer, /* i/o: JBM handle */ + float *input_f[], /* i : transport channels */ + float *output[], /* i/o: input/output audio channels */ + const int16_t n_samples_to_render, /* i : output frame length per channel */ + const int32_t output_Fs /* i : output sampling rate */ +) { int16_t subframe_idx, subframe_len; int16_t nchan_out, nchan_in, ch, first_sf, last_sf, slot_size, slots_to_render; @@ -1245,10 +1255,12 @@ ivas_error ivas_rend_crendProcessSubframe( in_config = getIvasAudioConfigFromRendAudioConfig( inRendConfig ); inConfigType = getAudioConfigType( inRendConfig ); + if ( ( error = getAudioConfigNumChannels( outRendConfig, &nchan_out ) ) != IVAS_ERR_OK ) { return error; } + if ( ( error = getAudioConfigNumChannels( inRendConfig, &nchan_in ) ) != IVAS_ERR_OK ) { return error; @@ -1258,17 +1270,20 @@ ivas_error ivas_rend_crendProcessSubframe( { tc_local[ch] = input_f[ch]; } + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { p_pcm_tmp[ch] = pcm_tmp[ch]; } slot_size = hTcBuffer->n_samples_granularity; + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ slots_to_render = min( hTcBuffer->num_slots - hTcBuffer->slots_rendered, n_samples_to_render / slot_size ); first_sf = hTcBuffer->subframes_rendered; last_sf = first_sf; hTcBuffer->slots_rendered += slots_to_render; + while ( slots_to_render > 0 ) { slots_to_render -= hTcBuffer->subframe_nbslots[last_sf]; @@ -1278,9 +1293,9 @@ ivas_error ivas_rend_crendProcessSubframe( for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) { subframe_len = hTcBuffer->subframe_nbslots[subframe_idx] * hTcBuffer->n_samples_granularity; + if ( hDecoderConfig && hDecoderConfig->Opt_Headrotation && hHeadTrackData && hHeadTrackData->num_quaternions >= 0 ) { - /* Rotation in SHD for: MC with elevation (5_1_2 / 5_1_4 / 7_1_4) -> BINAURAL SBA SPAR -> BINAURAL or BINAURAL_ROOM @@ -1331,7 +1346,6 @@ ivas_error ivas_rend_crendProcessSubframe( mvr2r( pcm_tmp[ch], output[ch], n_samples_to_render ); } - hTcBuffer->subframes_rendered = last_sf; pop_wmops(); diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 06fd160bb2..ec05cab974 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -140,6 +140,8 @@ static void ivas_dirac_dec_binaural_internal_sf( Decoder_Struct *st_ivas, float static void ivas_dirac_dec_decorrelate_slot_sf( DIRAC_DEC_HANDLE hDirAC, const int8_t slot, float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float decRe[][CLDFB_NO_CHANNELS_MAX], float decIm[][CLDFB_NO_CHANNELS_MAX] ); #endif #endif + + /*------------------------------------------------------------------------- * ivas_dirac_dec_init_binaural_data() * @@ -408,8 +410,7 @@ ivas_error ivas_dirac_dec_init_binaural_data( return error; } } - -#endif /* JBM_TMS_ON_TCS*/ +#endif return IVAS_ERR_OK; } @@ -489,14 +490,21 @@ ivas_error ivas_dirac_dec_binaural_copy_hrtfs( return IVAS_ERR_OK; } + #ifdef JBM_TSM_ON_TCS +/*------------------------------------------------------------------------- + * void ivas_dirac_dec_binaural_render() + * + * + *------------------------------------------------------------------------*/ + void ivas_dirac_dec_binaural_render( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ - uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ - uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ - const int16_t nchan_transport, - float *output_f[] /* o : rendered time signal */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + const int16_t nchan_transport, /* i : number of transport channels */ + float *output_f[] /* o : rendered time signal */ ) { int16_t slots_to_render, first_sf, last_sf, subframe_idx; @@ -515,16 +523,19 @@ void ivas_dirac_dec_binaural_render( output_f_local[ch] = output_f[ch]; } slot_size = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ slots_to_render = min( hDirAC->num_slots - hDirAC->slots_rendered, nSamplesAsked / slot_size ); *nSamplesRendered = slots_to_render * slot_size; first_sf = hDirAC->subframes_rendered; last_sf = first_sf; + while ( slots_to_render > 0 ) { slots_to_render -= hDirAC->subframe_nbslots[last_sf]; last_sf++; } + #ifdef DEBUGGING assert( slots_to_render == 0 ); #endif @@ -541,16 +552,19 @@ void ivas_dirac_dec_binaural_render( output_f_local[ch] += n_samples_sf; } } + if ( hDirAC->slots_rendered == hDirAC->num_slots ) { st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % st_ivas->hDirAC->dirac_md_buffer_length; } + *nSamplesAvailable = ( hDirAC->num_slots - hDirAC->slots_rendered ) * slot_size; return; } #endif + /*------------------------------------------------------------------------- * ivas_dirac_dec_binaural() * @@ -612,14 +626,15 @@ void ivas_dirac_dec_binaural( #endif } output_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + #ifdef JBM_TSM_ON_TCS - { - ivas_td_decorr_process( st_ivas->hDiracDecBin->hTdDecorr, p_output, decorr_signal, output_frame ); - } + ivas_td_decorr_process( st_ivas->hDiracDecBin->hTdDecorr, p_output, decorr_signal, output_frame ); + #else ivas_td_decorr_process( st_ivas->hDiracDecBin->hTdDecorr, output_f, decorr_signal, output_frame ); #endif } + #ifdef JBM_TSM_ON_TCS if ( nchan_transport == 1 && st_ivas->nchan_transport != 2 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ) { @@ -634,7 +649,9 @@ void ivas_dirac_dec_binaural( { #ifdef JBM_TSM_ON_TCS int16_t n_samples_sf = slot_size * st_ivas->hDirAC->subframe_nbslots[subframe]; + ivas_dirac_dec_binaural_internal( st_ivas, p_output, nchan_transport, subframe ); + for ( ch = 0; ch < 2 * BINAURAL_CHANNELS; ch++ ) { p_output[ch] += n_samples_sf; @@ -658,12 +675,14 @@ void ivas_dirac_dec_binaural( ivas_dirac_dec_binaural_internal( st_ivas, output_f, nchan_transport, 0u, (uint8_t) MAX_PARAM_SPATIAL_SUBFRAMES ); } #endif + #ifdef JBM_TSM_ON_TCS for ( ch = 0; ch < 2 * BINAURAL_CHANNELS; ch++ ) { st_ivas->hTcBuffer->tc[ch] = NULL; } #endif + return; } diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index e163862eeb..cd81110511 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -316,7 +316,6 @@ ivas_error ivas_td_binaural_renderer_unwrap( } } - if ( hReverb != NULL && hReverb->pConfig.roomAcoustics.late_reverb_on ) { /* add reverb to rendered signals */ @@ -452,7 +451,7 @@ void TDREND_Update_object_positions( const IVAS_FORMAT in_format, /* i : Format of input sources */ const ISM_METADATA_HANDLE *hIsmMetaData, /* i : Input metadata for ISM objects */ #ifdef JBM_TSM_ON_TCS - float *output[] + float *output[] /* i/o: SCE/MC channels */ #else float output[][L_FRAME48k] /* i/o: SCE/MC channels */ #endif diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index b43a048f38..77a170c044 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -171,12 +171,12 @@ void ivas_dirac_dec_binaural( #ifdef JBM_TSM_ON_TCS void ivas_dirac_dec_binaural_render( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ - uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ - uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ - const int16_t nchan_transport, - float *output_f[] /* o : rendered time signal */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + const int16_t nchan_transport, /* i : number of transport channels */ + float *output_f[] /* o : rendered time signal */ ); #endif @@ -247,7 +247,7 @@ ivas_error ivas_td_binaural_renderer_unwrap( const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ #ifdef JBM_TSM_ON_TCS - float *output[], /* i/o: SCE channels / Binaural synthesis */ + float *output[], /* i/o: SCE channels / Binaural synthesis */ #else float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ #endif @@ -524,7 +524,8 @@ void ivas_rend_closeCrend( CREND_WRAPPER_HANDLE *pCrend ); ivas_error ivas_rend_initCrendWrapper( - CREND_WRAPPER_HANDLE *pCrend ); + CREND_WRAPPER_HANDLE *pCrend +); ivas_error ivas_rend_crendProcess( const CREND_WRAPPER *pCrend, @@ -535,7 +536,7 @@ ivas_error ivas_rend_crendProcess( IVAS_OUTPUT_SETUP_HANDLE hIntSetup, EFAP_HANDLE hEFAPdata, #ifdef JBM_TSM_ON_TCS - float *output[], /* i/o: input/output audio channels */ + float *output[], /* i/o: input/output audio channels */ #else float output[][L_FRAME48k], /* i/o: input/output audio channels */ #endif @@ -544,18 +545,19 @@ ivas_error ivas_rend_crendProcess( #ifdef JBM_TSM_ON_TCS ivas_error ivas_rend_crendProcessSubframe( - const CREND_WRAPPER *pCrend, - const AUDIO_CONFIG inConfig, - const AUDIO_CONFIG outConfig, - DECODER_CONFIG_HANDLE hDecoderConfig, - HEAD_TRACK_DATA_HANDLE hHeadTrackData, - IVAS_OUTPUT_SETUP_HANDLE hIntSetup, - EFAP_HANDLE hEFAPdata, - DECODER_TC_BUFFER_HANDLE hTcBuffer, - float *input_f[], - float *output[], /* i/o: input/output audio channels */ - const int16_t n_samples_to_render, - const int32_t output_Fs ); + const CREND_WRAPPER *pCrend, /* i/o: Crend wrapper handle */ + const AUDIO_CONFIG inConfig, /* i : input audio configuration */ + const AUDIO_CONFIG outConfig, /* i : output audio configuration */ + const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : decoder config. structure */ + const HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : Head tracking data structure */ + const IVAS_OUTPUT_SETUP_HANDLE hIntSetup, /* i : internal setup handle */ + const EFAP_HANDLE hEFAPdata, /* i : EFAP handle */ + DECODER_TC_BUFFER_HANDLE hTcBuffer, /* i/o: JBM handle */ + float *input_f[], /* i : transport channels */ + float *output[], /* i/o: input/output audio channels */ + const int16_t n_samples_to_render, /* i : output frame length per channel */ + const int32_t output_Fs /* i : output sampling rate */ +); #endif @@ -651,8 +653,8 @@ ivas_error ivas_reverb_process( const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */ const int16_t mix_signals, /* i : add reverb to output signal */ #ifdef JBM_TSM_ON_TCS - float *pcm_in[], /* i : the PCM audio to apply reverb on */ - float *pcm_out[], /* o : the PCM audio with reverb applied */ + float *pcm_in[], /* i : the PCM audio to apply reverb on */ + float *pcm_out[], /* o : the PCM audio with reverb applied */ #else float pcm_in[][L_FRAME48k], /* i : the PCM audio to apply reverb on */ float pcm_out[][L_FRAME48k], /* o : the PCM audio with reverb applied */ @@ -892,7 +894,7 @@ void rotateFrame_shd( void rotateFrame_sd( HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ #ifdef JBM_TSM_ON_TCS - float *output[], /* i/o: unrotated SD signal buffer in TD */ + float *output[], /* i/o: unrotated SD signal buffer in TD */ #else float output[][L_FRAME48k], /* i/o: unrotated SD signal buffer in TD */ #endif @@ -908,7 +910,7 @@ void rotateFrame_shd_cldfb( float Rmat[3][3], /* i : real-space rotation matrix */ const int16_t nInChannels, /* i : number of channels */ #ifdef JBM_TSM_ON_TCS - const int16_t numTimeSlots, /* i : number of time slots to process */ + const int16_t numTimeSlots, /* i : number of time slots to process */ #endif const int16_t shd_rot_max_order /* i : split-order rotation method */ ); diff --git a/lib_rend/ivas_rotation.c b/lib_rend/ivas_rotation.c index 5719e2ffdd..29f638bf68 100644 --- a/lib_rend/ivas_rotation.c +++ b/lib_rend/ivas_rotation.c @@ -511,7 +511,7 @@ void rotateFrame_shd_cldfb( float Rmat[3][3], /* i : real-space rotation matrix */ const int16_t nInChannels, /* i : number of channels */ #ifdef JBM_TSM_ON_TCS - const int16_t numTimeSlots, + const int16_t numTimeSlots, /* i : number of time slots to process */ #endif const int16_t shd_rot_max_order /* i : split-order rotation method */ ) diff --git a/lib_rend/ivas_sba_rendering.c b/lib_rend/ivas_sba_rendering.c index c549461c37..7affa9a913 100644 --- a/lib_rend/ivas_sba_rendering.c +++ b/lib_rend/ivas_sba_rendering.c @@ -93,10 +93,12 @@ void ivas_sba_prototype_renderer_sf( outChEnd = 2; } slot_idx_start = hSpar->slots_rendered; + /* Apply mixing matrix */ for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) { int16_t md_idx = hSpar->render_to_md_map[ts + slot_idx_start]; + /* determine SPAR parameters for this time slot */ ivas_spar_get_parameters( hSpar, hDecoderConfig, md_idx, numch_out, numch_in, num_spar_bands, mixer_mat ); @@ -202,6 +204,7 @@ void ivas_sba_prototype_renderer_sf( } #endif + #ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS void ivas_sba_prototype_renderer( Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index ef5561ca98..98e7ce2a10 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -4422,6 +4422,7 @@ static ivas_error renderIsmToBinauralRoom( const IVAS_REND_HeadRotData *headRotData; #ifdef JBM_TSM_ON_TCS float *p_tmpRendBuffer[MAX_OUTPUT_CHANNELS]; + for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) { p_tmpRendBuffer[i] = tmpRendBuffer[i]; @@ -4804,10 +4805,10 @@ static ivas_error renderMcToBinaural( IVAS_REND_AudioConfig inConfig; ivas_error error; IVAS_REND_AudioBuffer tmpRotBuffer; - #ifdef JBM_TSM_ON_TCS float *p_tmpRendBuffer[MAX_OUTPUT_CHANNELS]; int16_t i; + for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) { p_tmpRendBuffer[i] = tmpRendBuffer[i]; @@ -4888,10 +4889,10 @@ static ivas_error renderMcToBinauralRoom( IVAS_REND_AudioConfig inConfig; ivas_error error; IVAS_REND_AudioBuffer tmpRotBuffer; - #ifdef JBM_TSM_ON_TCS float *p_tmpRendBuffer[MAX_OUTPUT_CHANNELS]; int16_t i; + for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) { p_tmpRendBuffer[i] = tmpRendBuffer[i]; @@ -4975,7 +4976,6 @@ static ivas_error renderMcCustomLsToBinauralRoom( IVAS_REND_AudioBuffer tmpRotBuffer; IVAS_REND_AudioBuffer tmpMcBuffer; IVAS_REND_AudioBuffer *tmpBufPtr; - #ifdef JBM_TSM_ON_TCS float *p_tmpCrendBuffer[MAX_OUTPUT_CHANNELS]; #endif @@ -5231,10 +5231,8 @@ static ivas_error renderSbaToBinaural( IVAS_REND_AudioBuffer outAudio ) { float tmpCrendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; - ivas_error error; IVAS_REND_AudioBuffer tmpRotBuffer; - #ifdef JBM_TSM_ON_TCS float *p_tmpCrendBuffer[MAX_OUTPUT_CHANNELS]; int16_t i; @@ -5303,7 +5301,6 @@ static ivas_error renderSbaToBinauralRoom( IVAS_REND_AudioBuffer tmpRotBuffer; IVAS_REND_AudioBuffer tmpMcBuffer; IVAS_REND_AudioBuffer *tmpBufPtr; - #ifdef JBM_TSM_ON_TCS float *p_tmpCrendBuffer[MAX_OUTPUT_CHANNELS]; #endif -- GitLab From c86d5fa6c02cc950cb4eb64a460b3935e82f9616 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 17 May 2023 10:47:39 +0200 Subject: [PATCH 202/331] formal issues improvements (foramtting, comments, return error for malloc()) --- apps/decoder.c | 3 +- lib_com/fd_cng_com.c | 1 + lib_com/ivas_prot.h | 236 +++++++++++----------- lib_com/ivas_tools.c | 2 + lib_com/options.h | 4 +- lib_dec/fd_cng_dec.c | 1 + lib_dec/ivas_binRenderer_internal.c | 1 + lib_dec/ivas_dec.c | 22 +- lib_dec/ivas_dirac_dec.c | 49 ++--- lib_dec/ivas_dirac_output_synthesis_cov.c | 9 +- lib_dec/ivas_ism_param_dec.c | 2 + lib_dec/ivas_jbm_dec.c | 24 ++- lib_dec/ivas_mc_param_dec.c | 24 ++- lib_dec/ivas_objectRenderer_internal.c | 6 +- lib_dec/ivas_sba_dec.c | 5 +- lib_dec/ivas_spar_decoder.c | 3 + lib_dec/ivas_stat_dec.h | 2 +- lib_dec/lib_dec.c | 9 +- lib_rend/ivas_sba_rendering.c | 11 +- 19 files changed, 229 insertions(+), 185 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index b4a840b10c..62c72fea0e 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -2279,8 +2279,7 @@ static ivas_error decodeVoIP( /* decode and get samples */ - if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, - pcmBuf, systemTime_ms + if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, pcmBuf, systemTime_ms #if defined( JBM_TSM_ON_TCS ) || defined( VARIABLE_SPEED_DECODING ) , &nSamplesAvailableNext diff --git a/lib_com/fd_cng_com.c b/lib_com/fd_cng_com.c index e31ce67d13..f0408ea3dd 100644 --- a/lib_com/fd_cng_com.c +++ b/lib_com/fd_cng_com.c @@ -940,6 +940,7 @@ void SynthesisSTFT( return; } + #ifdef JBM_TSM_ON_TCS /*------------------------------------------------------------------- * SynthesisSTFT_dirac() diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 32a6db03b6..80480d9916 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -252,9 +252,9 @@ ivas_error ivas_compute_core_buffers( /*! r: number of clipped samples */ uint32_t ivas_syn_output( #ifdef JBM_TSM_ON_TCS - float *synth[], /* i/o: float synthesis signal */ + float *synth[], /* i/o: float synthesis signal */ #else - float synth[][L_FRAME48k], /* i/o: float synthesis signal */ + float synth[][L_FRAME48k], /* i/o: float synthesis signal */ #endif const int16_t output_frame, /* i : output frame length (one channel) */ const int16_t n_channels, /* i : number of output channels */ @@ -863,6 +863,7 @@ void ivas_jbm_dec_td_renderers_adapt_subframes( ); #endif + /*----------------------------------------------------------------------------------* * ISM prototypes *----------------------------------------------------------------------------------*/ @@ -1024,7 +1025,7 @@ ivas_error ivas_ism_dec_config( #ifdef JBM_TSM_ON_TCS , uint16_t *nSamplesRendered, /* o : number of samples flushed on renderer change*/ - int16_t *data /* o : flushed PCM samples */ + int16_t *data /* o : flushed PCM samples */ #endif ); @@ -1048,17 +1049,17 @@ void ivas_ism_dec_digest_tc( ); void ivas_param_ism_dec_digest_tc( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const uint16_t nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ - float *transport_channels_f[] /* i : synthesized core-coder transport channels/DirAC output */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ + float *transport_channels_f[] /* i : synthesized core-coder transport channels/DirAC output */ ); void ivas_param_ism_dec_render( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ - uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ - uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ - float *output_f[] /* o : rendered time signal */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ ); #endif @@ -3457,11 +3458,11 @@ ivas_error ivas_sba_dec_reconfigure( #ifdef JBM_TSM_ON_TCS ivas_error ivas_sba_digest_tc( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const int16_t nchan_transport, /* i : number of transport channels */ - const int16_t nCldfbSlots, /* i : number of CLDFB slots */ - const int16_t nSamplesForRendering, /* i : number of samples provided */ - float *data[] /* i : transport channel samples */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int16_t nCldfbSlots, /* i : number of CLDFB slots */ + const int16_t nSamplesForRendering, /* i : number of samples provided */ + float *data[] /* i : transport channel samples */ ); #endif @@ -3690,32 +3691,32 @@ void ivas_dirac_dec_read_BS( #ifdef JBM_TSM_ON_TCS void generate_masking_noise_lb_dirac( - HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ - float *tdBuffer, /* i/o: time-domain signal, if NULL no LB-CNA */ - const int16_t nCldfbTs, /* i : number of CLDFB slots that will be rendered */ - const int16_t cna_flag /* i : CNA flag for LB and HB */ + HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ + float *tdBuffer, /* i/o: time-domain signal, if NULL no LB-CNA */ + const int16_t nCldfbTs, /* i : number of CLDFB slots that will be rendered */ + const int16_t cna_flag /* i : CNA flag for LB and HB */ ); void ivas_dirac_dec_set_md_map( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const int16_t nCldfbTs /* i : number of CLDFB time slots */ ); void ivas_dirac_dec( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ - const int16_t nchan_transport /* i : number of transport channels */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ + const int16_t nchan_transport /* i : number of transport channels */ ); #endif #ifdef JBM_TSM_ON_TCS void ivas_dirac_dec_render( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const int16_t nchan_transport, /* i : number of transport channels */ - const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ - uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ - uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ - float *output_f[] /* o : rendered time signal */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t nchan_transport, /* i : number of transport channels */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ ); #endif @@ -3726,9 +3727,9 @@ void ivas_dirac_dec_render_sf( #endif Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ #ifdef JBM_TSM_ON_TCS - float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ + float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ #else - float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ + float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ #endif const int16_t nchan_transport, /* i : number of transport channels */ float *pppQMfFrame_ts_re[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX], @@ -3891,7 +3892,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ const int16_t nchan_transport, /* i : number of transport channels */ #ifdef JBM_TSM_ON_TCS - const int16_t nbslots, /* i : number of slots to process */ + const int16_t nbslots, /* i : number of slots to process */ #endif const float *onset_filter #ifdef HODIRAC @@ -3904,12 +3905,12 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( ); void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( - float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX],/* i : LS signals */ - float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX],/* i : LS signals */ - DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ + float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX],/* i : LS signals */ + float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX],/* i : LS signals */ + DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ #ifdef JBM_TSM_ON_TCS - const int16_t nbslots, /* i : number of slots to process */ - const int16_t diff_md_idx, /* i : md slot idx of diffuseness to use */ + const int16_t nbslots, /* i : number of slots to process */ + const int16_t diff_md_idx, /* i : md slot idx of diffuseness to use */ #endif float *reference_power_smooth, float qualityBasedSmFactor @@ -3955,8 +3956,8 @@ void ivas_dirac_dec_compute_directional_responses( const int16_t md_idx, #endif const float *surCohRatio, - const int16_t shd_rot_max_order, /* i : split-order rotation method */ - const float *p_Rmat /* i : rotation matrix */ + const int16_t shd_rot_max_order, /* i : split-order rotation method */ + const float *p_Rmat /* i : rotation matrix */ #ifdef HODIRAC , const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ @@ -4096,17 +4097,17 @@ void ivas_param_mc_dec_read_BS( #ifdef JBM_TSM_ON_TCS void ivas_param_mc_dec_digest_tc( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const uint8_t nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ - float *transport_channels_f[] /* i : synthesized core-coder transport channels/DirAC output */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint8_t nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ + float *transport_channels_f[] /* i : synthesized core-coder transport channels/DirAC output */ ); void ivas_param_mc_dec_render( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ - uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ - uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ - float *output_f[] /* o : rendered time signal */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ ); #endif @@ -4115,7 +4116,7 @@ void ivas_param_mc_dec( #ifdef JBM_TSM_ON_TCS float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ #else - float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */ + float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */ #endif ); @@ -4249,8 +4250,9 @@ ivas_error ivas_dirac_dec_output_synthesis_cov_open( #ifdef JBM_TSM_ON_TCS void ivas_dirac_dec_output_synthesis_get_interpolator( - DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params, /* i/o: handle for the covariance synthesis parameters */ - const uint16_t interp_length ); + DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params, /* i/o: handle for the covariance synthesis parameters */ + const uint16_t interp_length /* i : interpolator length */ +); #endif void ivas_dirac_dec_output_synthesis_cov_init( @@ -4268,8 +4270,8 @@ void ivas_dirac_dec_output_synthesis_cov_close( void ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot( #ifdef JBM_TSM_ON_TCS - float *RealBuffer, /* i : input channel filter bank samples (real part) */ - float *ImagBuffer, /* i : input channel filter bank samples (imaginary part */ + float *RealBuffer, /* i : input channel filter bank samples (real part) */ + float *ImagBuffer, /* i : input channel filter bank samples (imaginary part */ #else float RealBuffer[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (real part) */ float ImagBuffer[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (imaginary part */ @@ -4280,14 +4282,14 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot( const int16_t nchan_in /* i : number of input channels */ #ifndef JBM_TSM_ON_TCS , - const int16_t idx_slot /* i : index of the slot to be added to the input covariance */ + const int16_t idx_slot /* i : index of the slot to be added to the input covariance */ #endif ); void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot( #ifdef JBM_TSM_ON_TCS - float *Cldfb_RealBuffer_in, /* i : input channel filter bank samples (real part) */ - float *Cldfb_ImagBuffer_in, /* i : input channel filter bank samples (imaginary part) */ + float *Cldfb_RealBuffer_in, /* i : input channel filter bank samples (real part) */ + float *Cldfb_ImagBuffer_in, /* i : input channel filter bank samples (imaginary part) */ #else float Cldfb_RealBuffer_in[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : CLDFB samples of the transport channels (real part) */ float Cldfb_ImagBuffer_in[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : CLDFB samples of the transport channels (imaginary part) */ @@ -4295,17 +4297,17 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot( float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (real part) */ float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (imaginary part) */ #ifdef JBM_TSM_ON_TCS - float *mixing_matrix[], /* i : parameter band wise mixing matrices (direct part) */ - float *mixing_matrix_res[], /* i : parameter band wise mixing matrices (residual part) */ + float *mixing_matrix[], /* i : parameter band wise mixing matrices (direct part) */ + float *mixing_matrix_res[], /* i : parameter band wise mixing matrices (residual part) */ #else float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], /* i : parameter band wise mixing matrices (direct part) */ float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], /* i : parameter band wise mixing matrices (residual part) */ #endif - const uint16_t slot_idx_sfr, /* i : time slot index for the current slot within the current subframe */ - const uint16_t slot_idx_tot, /* i : time slot index for the current slot within the frame */ - const int16_t nX, /* i : number of input channels */ - const int16_t nY, /* i : number of output channels */ - PARAM_MC_DEC_HANDLE hParamMC /* i : handle to the Parametric MC decoder state */ + const uint16_t slot_idx_sfr, /* i : time slot index for the current slot within the current subframe */ + const uint16_t slot_idx_tot, /* i : time slot index for the current slot within the frame */ + const int16_t nX, /* i : number of input channels */ + const int16_t nY, /* i : number of output channels */ + PARAM_MC_DEC_HANDLE hParamMC /* i : handle to the Parametric MC decoder state */ ); int16_t computeMixingMatricesISM( @@ -4390,7 +4392,7 @@ void ivas_sba_upmixer_renderer( ivas_error ivas_sba_linear_renderer( #ifdef JBM_TSM_ON_TCS - float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ + float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ #else float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ #endif @@ -4411,7 +4413,7 @@ void ivas_sba_mix_matrix_determiner( #ifdef JBM_TSM_ON_TCS void ivas_sba_prototype_renderer_sf( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /* i : Input audio in CLDFB domain, imag */ ); @@ -4575,46 +4577,46 @@ int16_t ivas_is_res_channel( #ifdef JBM_TSM_ON_TCS void ivas_spar_dec_agc_pca( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - float output[][L_FRAME48k], /* i/o: input/output audio channels */ - const int16_t output_frame /* i : output frame length */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float output[][L_FRAME48k], /* i/o: input/output audio channels */ + const int16_t output_frame /* i : output frame length */ ); void ivas_spar_dec_set_render_map( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const int16_t nCldfbTs /* i : number of CLDFB time slots */ ); void ivas_spar_dec_set_render_params( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const int16_t n_cldfb_slots /* i : number of cldfb slots in this frame */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t n_cldfb_slots /* i : number of cldfb slots in this frame */ ); void ivas_spar_dec_digest_tc( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const int16_t nchan_transport, /* i : number of transport channels */ - const int16_t nCldfbSlots, /* i : number of CLDFB slots */ - const int16_t nSamplesForRendering /* i : number of samples provided */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int16_t nCldfbSlots, /* i : number of CLDFB slots */ + const int16_t nSamplesForRendering /* i : number of samples provided */ ); ivas_error ivas_sba_dec_digest_tc( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const int16_t nCldfbSlots, /* i : number of CLDFB slots */ - const int16_t nSamplesForRendering /* i : number of samples provided */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t nCldfbSlots, /* i : number of CLDFB slots */ + const int16_t nSamplesForRendering /* i : number of samples provided */ ); void ivas_sba_dec_render( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ - uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ - uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ - float *output_f[] /* o : rendered time signal */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ ); void ivas_spar_dec_upmixer_sf( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - float *output[], /* o : output audio channels */ - const int16_t nchan_internal /* i : number of internal channels */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float *output[], /* o : output audio channels */ + const int16_t nchan_internal /* i : number of internal channels */ ); #endif @@ -4711,7 +4713,7 @@ void ivas_get_spar_md_from_dirac( #ifdef HODIRAC int16_t ivas_get_spar_dec_md_num_subframes( - const int16_t sba_order, /* i : Ambisonic (SBA) order */ + const int16_t sba_order, /* i : Ambisonic (SBA) order */ const int32_t ivas_total_brate ); #endif @@ -5250,7 +5252,7 @@ void ivas_masa_prerender( #ifdef JBM_TSM_ON_TCS #ifndef FIX_355_REFACTOR_PARAMBIN_TO_5MS void ivas_spar_param_to_masa_param_mapping_sf( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ int16_t azimuth[CLDFB_NO_CHANNELS_MAX], int16_t elevation[CLDFB_NO_CHANNELS_MAX], float energy_ratio1[CLDFB_NO_CHANNELS_MAX], @@ -5304,9 +5306,9 @@ void ivas_binaural_cldfb( #ifdef JBM_TSM_ON_TCS void ivas_binaural_cldfb_sf( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const int16_t n_samples_to_render, /* i : output frame length per channel */ - float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ + float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ ); #endif @@ -5328,8 +5330,8 @@ void ivas_binaural_add_LFE( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ int16_t output_frame, /* i : length of input frame */ #ifdef JBM_TSM_ON_TCS - float *input_f[], /* i : transport channels */ - float *output_f[] /* o : synthesized core-coder transport channels/DirAC output */ + float *input_f[], /* i : transport channels */ + float *output_f[] /* o : synthesized core-coder transport channels/DirAC output */ #else float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */ #endif @@ -5347,7 +5349,7 @@ ivas_error ivas_ism_renderer_open( void ivas_ism_render( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ #ifdef JBM_TSM_ON_TCS - float *output_f[], /* i/o: core-coder transport channels/object output */ + float *output_f[], /* i/o: core-coder transport channels/object output */ #else float output_f[][L_FRAME48k], /* i/o: core-coder transport channels/object output */ #endif @@ -5356,9 +5358,9 @@ void ivas_ism_render( #ifdef JBM_TSM_ON_TCS void ivas_ism_render_sf( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - float *output_f[], /* i/o: core-coder transport channels/object output */ - const int16_t n_samples_to_render /* i : output frame length per channel */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output_f[], /* i/o: core-coder transport channels/object output */ + const int16_t n_samples_to_render /* i : output frame length per channel */ ); #endif @@ -5372,10 +5374,10 @@ void ivas_ism_get_stereo_gains( void ivas_mc2sba( IVAS_OUTPUT_SETUP hIntSetup, /* i : Format of decoder output */ #ifdef JBM_TSM_ON_TCS - float *in_buffer_td[], /* i : MC signals (on input) and the HOA3 (on output) */ - float *buffer_td[], /* o : MC signals (on input) and the HOA3 (on output) */ + float *in_buffer_td[], /* i : MC signals (on input) and the HOA3 (on output) */ + float *buffer_td[], /* o : MC signals (on input) and the HOA3 (on output) */ #else - float buffer_td[][L_FRAME48k], /* i/o: MC signals (on input) and the HOA3 (on output) */ + float buffer_td[][L_FRAME48k], /* i/o: MC signals (on input) and the HOA3 (on output) */ #endif const int16_t output_frame, /* i : output frame length per channel */ const int16_t sba_order, /* i : SBA order */ @@ -5384,9 +5386,9 @@ void ivas_mc2sba( void ivas_ism2sba( #ifdef JBM_TSM_ON_TCS - float *buffer_td[], /* i/o: TD signal buffers */ + float *buffer_td[], /* i/o: TD signal buffers */ #else - float buffer_td[][L_FRAME48k], /* i/o: TD signal buffers */ + float buffer_td[][L_FRAME48k], /* i/o: TD signal buffers */ #endif ISM_RENDERER_HANDLE hIsmRendererData, /* i/o: renderer data */ const ISM_METADATA_HANDLE hIsmMetaData[], /* i : object metadata */ @@ -5397,13 +5399,13 @@ void ivas_ism2sba( #ifdef JBM_TSM_ON_TCS void ivas_ism2sba_sf( - float *buffer_in[], /* i : TC buffer */ - float *buffer_out[], /* o : TD signal buffers */ - ISM_RENDERER_HANDLE hIsmRendererData, /* i/o: renderer data */ - const int16_t num_objects, /* i : number of objects */ - const int16_t n_samples_to_render, /* i : output frame length per channel */ - const int16_t offset, /* i : offset for the interpolatr */ - const int16_t sba_order /* i : Ambisonic (SBA) order */ + float *buffer_in[], /* i : TC buffer */ + float *buffer_out[], /* o : TD signal buffers */ + ISM_RENDERER_HANDLE hIsmRendererData, /* i/o: renderer data */ + const int16_t num_objects, /* i : number of objects */ + const int16_t n_samples_to_render, /* i : output frame length per channel */ + const int16_t offset, /* i : offset for the interpolatr */ + const int16_t sba_order /* i : Ambisonic (SBA) order */ ); #endif @@ -5463,10 +5465,10 @@ void ivas_ls_setup_conversion( #endif const int16_t output_frame, /* i : frame length */ #ifdef JBM_TSM_ON_TCS - float *input[], /* i : LS input/output synthesis signal */ - float *output[] /* i/o: LS input/output synthesis signal */ + float *input[], /* i : LS input/output synthesis signal */ + float *output[] /* i/o: LS input/output synthesis signal */ #else - float output[][L_FRAME48k] /* i/o: LS input/output synthesis signal */ + float output[][L_FRAME48k] /* i/o: LS input/output synthesis signal */ #endif ); @@ -5481,9 +5483,9 @@ void ivas_ls_setup_conversion_process_mdct_param_mc( ); void ivas_lssetupconversion_process_param_mc( - Decoder_Struct *st_ivas, /* i/o: LS setup conversion renderer handle */ + Decoder_Struct *st_ivas, /* i/o: LS setup conversion renderer handle */ #ifdef JBM_TSM_ON_TCS - const int16_t num_timeslots, /* i : number of time slots to process */ + const int16_t num_timeslots, /* i : number of time slots to process */ #endif float Cldfb_RealBuffer_InOut[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals */ float Cldfb_ImagBuffer_InOut[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals */ @@ -5716,17 +5718,17 @@ ivas_error ivas_td_binaural_open( ivas_error ivas_td_binaural_renderer( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ #ifdef JBM_TSM_ON_TCS - float *output[], /* i/o: SCE channels / Binaural synthesis */ + float *output[], /* i/o: SCE channels / Binaural synthesis */ #else - float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ + float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ #endif const int16_t output_frame /* i : output frame length */ ); #ifdef JBM_TSM_ON_TCS ivas_error ivas_td_binaural_renderer_sf( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - float *output[], /* i/o: SCE channels / Binaural synthesis */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output[], /* i/o: SCE channels / Binaural synthesis */ const int16_t n_samples_granularity /* i : granularity of the renderer/buffer */ ); #endif diff --git a/lib_com/ivas_tools.c b/lib_com/ivas_tools.c index ce4abafeb5..cf59a751a6 100644 --- a/lib_com/ivas_tools.c +++ b/lib_com/ivas_tools.c @@ -163,6 +163,7 @@ uint32_t ivas_syn_output( return noClipping; } + #ifdef JBM_TSM_ON_TCS /*-------------------------------------------------------------------* * ivas_syn_output_f() @@ -197,6 +198,7 @@ void ivas_syn_output_f( } #endif + /*-------------------------------------------------------------------* * mvr2r_inc() * diff --git a/lib_com/options.h b/lib_com/options.h index 4150e91a5d..a14c7b8033 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -208,8 +208,8 @@ #define FIX_642 /* FhG: Fix for issue 642, buggy DoA-array access in DirAC head rotation*/ #define FIX_443_FD_CNG_INIT /* FhG: correct bitrate value for FD-CNG init */ -#define VARIABLE_SPEED_DECODING /* FhG: variable speed decoding employing the JBM functioniality */ -#define JBM_TSM_ON_TCS /* FhG: run the TSM part of JBM on the TCs instead of the final output pcm waveforms */ +#define VARIABLE_SPEED_DECODING /* FhG: Contribution 37: variable speed decoding employing the JBM functioniality */ +#define JBM_TSM_ON_TCS /* FhG: Contribution 37: run the TSM part of JBM on the TCs instead of the final output pcm waveforms */ #define FIX_DTX_428 /* FhG: fix for issue 428, crash with DTX and bitrate switching */ diff --git a/lib_dec/fd_cng_dec.c b/lib_dec/fd_cng_dec.c index 8b62e54a8d..0921f0bee2 100644 --- a/lib_dec/fd_cng_dec.c +++ b/lib_dec/fd_cng_dec.c @@ -1798,6 +1798,7 @@ void generate_stereo_masking_noise( return; } + #ifdef JBM_TSM_ON_TCS /*------------------------------------------------------------------- * generate_masking_noise_hf_cldfb() diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 5de5f881fa..c0a79befaf 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -1073,6 +1073,7 @@ void ivas_binaural_cldfb_sf( #else ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); #endif + /* Implement CLDFB synthesis */ for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index 0af1699564..7f163fdb1f 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -297,13 +297,7 @@ ivas_error ivas_dec( } else if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { - if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, - AUDIO_CONFIG_7_1_4, - AUDIO_CONFIG_BINAURAL_ROOM, - NULL, - NULL, - NULL, - NULL, + if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, NULL, NULL, NULL, NULL, #ifdef JBM_TSM_ON_TCS p_output, #else @@ -570,13 +564,8 @@ ivas_error ivas_dec( /* Rendering */ if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { - if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, - st_ivas->intern_config, - st_ivas->hOutSetup.output_config, - st_ivas->hDecoderConfig, - st_ivas->hHeadTrackData, - &st_ivas->hIntSetup, - st_ivas->hEFAPdata, + if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, + st_ivas->hHeadTrackData, &st_ivas->hIntSetup, st_ivas->hEFAPdata, #ifdef JBM_TSM_ON_TCS p_output, #else @@ -624,6 +613,7 @@ ivas_error ivas_dec( { return error; } + ivas_binaural_add_LFE( st_ivas, output_frame, p_output, p_output ); #else if ( ( ivas_td_binaural_renderer( st_ivas, output, output_frame ) ) != IVAS_ERR_OK ) @@ -679,6 +669,7 @@ ivas_error ivas_dec( { return error; } + #ifdef JBM_TSM_ON_TCS ivas_binaural_add_LFE( st_ivas, output_frame, p_output, p_output ); #else @@ -722,6 +713,7 @@ ivas_error ivas_dec( { return error; } + #ifdef JBM_TSM_ON_TCS ivas_binaural_add_LFE( st_ivas, output_frame, p_output, p_output ); #else @@ -897,6 +889,7 @@ ivas_error ivas_dec( * - compensation for saturation * - float to integer conversion *----------------------------------------------------------------*/ + #ifdef JBM_TSM_ON_TCS ivas_limiter_dec( st_ivas->hLimiter, p_output, nchan_out, output_frame, st_ivas->BER_detect ); @@ -912,6 +905,7 @@ ivas_error ivas_dec( #endif ivas_syn_output( output, output_frame, nchan_out, data ); #endif + /*----------------------------------------------------------------* * Common updates *----------------------------------------------------------------*/ diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 51122aa40a..1f40d8e58f 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -282,6 +282,9 @@ ivas_error ivas_dirac_dec_config( int16_t nchan_transport_orig; #ifdef HODIRAC int16_t hodirac_flag; +#endif +#ifdef JBM_TSM_ON_TCS + int16_t map_idx; #endif DIRAC_CONFIG_FLAG flag_config; @@ -1133,29 +1136,26 @@ ivas_error ivas_dirac_dec_config( if ( st_ivas->mc_mode == MC_MODE_MCMASA ) { hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES; + #ifdef JBM_TSM_ON_TCS + set_s( hDirAC->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); + for ( map_idx = 0; map_idx < DEFAULT_JBM_SUBFRAMES_5MS; map_idx++ ) { - int16_t map_idx; - set_s( hDirAC->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); - for ( map_idx = 0; map_idx < DEFAULT_JBM_SUBFRAMES_5MS; map_idx++ ) - { - hDirAC->render_to_md_map[map_idx] = map_idx; - } + hDirAC->render_to_md_map[map_idx] = map_idx; } + #endif } else if ( st_ivas->ivas_format == MASA_FORMAT ) { hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR; hDirAC->dirac_bs_md_write_idx = DELAY_MASA_PARAM_DEC_SFR; + #ifdef JBM_TSM_ON_TCS + set_s( hDirAC->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); + for ( map_idx = 0; map_idx < DEFAULT_JBM_SUBFRAMES_5MS; map_idx++ ) { - int16_t map_idx; - set_s( hDirAC->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); - for ( map_idx = 0; map_idx < DEFAULT_JBM_SUBFRAMES_5MS; map_idx++ ) - { - hDirAC->render_to_md_map[map_idx] = map_idx; - } + hDirAC->render_to_md_map[map_idx] = map_idx; } #endif } @@ -1181,13 +1181,11 @@ ivas_error ivas_dirac_dec_config( hDirAC->dirac_estimator_idx = 0; } #ifdef JBM_TSM_ON_TCS + + set_s( hDirAC->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); + for ( map_idx = 0; map_idx < DEFAULT_JBM_CLDFB_TIMESLOTS; map_idx++ ) { - int16_t map_idx; - set_s( hDirAC->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); - for ( map_idx = 0; map_idx < DEFAULT_JBM_CLDFB_TIMESLOTS; map_idx++ ) - { - hDirAC->render_to_md_map[map_idx] = hDirAC->dirac_read_idx + map_idx * num_slots_in_subfr / JBM_CLDFB_SLOTS_IN_SUBFRAME; - } + hDirAC->render_to_md_map[map_idx] = hDirAC->dirac_read_idx + map_idx * num_slots_in_subfr / JBM_CLDFB_SLOTS_IN_SUBFRAME; } #endif } @@ -1501,6 +1499,7 @@ ivas_error ivas_dirac_dec_config( } } #endif + #ifdef JBM_TSM_ON_TCS /* allocate transport channels*/ if ( flag_config == DIRAC_OPEN ) @@ -1527,7 +1526,6 @@ ivas_error ivas_dirac_dec_config( } } } - #endif /* JBM_TMS_ON_TCS*/ return error; @@ -2622,6 +2620,7 @@ void ivas_qmetadata_to_dirac( band_end = band_grouping[band + 1]; #ifdef JBM_TSM_ON_TCS tmp_write_idx_param_band = hDirAC->dirac_bs_md_write_idx; + for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) #else for ( block = 0; block < hDirAC->nb_subframes; block++ ) @@ -2638,6 +2637,7 @@ void ivas_qmetadata_to_dirac( #endif hDirAC->spreadCoherence[block][b] = 0.0f; hDirAC->surroundingCoherence[block][b] = 0.0f; + #ifdef JBM_TSM_ON_TCS if ( hDirAC->hConfig->dec_param_estim == FALSE ) { @@ -2834,6 +2834,7 @@ void ivas_qmetadata_to_dirac( for ( b = band_grouping[band]; b < hDirAC->num_freq_bands; b++ ) { tmp_write_idx_band = hDirAC->dirac_bs_md_write_idx; + #ifdef JBM_TSM_ON_TCS for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) #else @@ -2901,7 +2902,7 @@ void ivas_qmetadata_to_dirac( void ivas_dirac_dec_set_md_map( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const int16_t nCldfbTs /* i : number of CLDFB time slots */ + const int16_t nCldfbTs /* i : number of CLDFB time slots */ ) { int16_t num_slots_in_subfr; @@ -3326,6 +3327,7 @@ void ivas_dirac_dec_render_sf( if ( st_ivas->hHeadTrackData->shd_rot_max_order == 0 ) { num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; + #ifdef JBM_TSM_ON_TCS for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) #else @@ -3354,7 +3356,6 @@ void ivas_dirac_dec_render_sf( if ( hDirAC->hConfig->dec_param_estim == FALSE ) { - /* compute response */ if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) { @@ -3418,7 +3419,6 @@ void ivas_dirac_dec_render_sf( } } - if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 1 ) { ivas_dirac_dec_compute_directional_responses( hDirAC, @@ -3459,7 +3459,6 @@ void ivas_dirac_dec_render_sf( } } - #ifdef JBM_TSM_ON_TCS for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) #else @@ -3909,6 +3908,7 @@ void ivas_dirac_dec_render_sf( } #endif } + #ifndef JBM_TSM_ON_TCS if ( hDirAC->hConfig->dec_param_estim == 0 ) { @@ -3984,8 +3984,9 @@ void ivas_dirac_dec_render_sf( qualityBasedSmFactor = st_ivas->hMasa->data.dir_decode_quality; qualityBasedSmFactor *= qualityBasedSmFactor; } + #ifdef JBM_TSM_ON_TCS - /* Workaround for BE (should be gone when #393 is adressed) */ + /* ToDo: Workaround for BE (should be gone when #393 is adressed) */ if ( hDirAC->hConfig->dec_param_estim == 1 ) { num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; diff --git a/lib_dec/ivas_dirac_output_synthesis_cov.c b/lib_dec/ivas_dirac_output_synthesis_cov.c index 44a9d7e597..ffe6fea382 100644 --- a/lib_dec/ivas_dirac_output_synthesis_cov.c +++ b/lib_dec/ivas_dirac_output_synthesis_cov.c @@ -170,14 +170,15 @@ ivas_error ivas_dirac_dec_output_synthesis_cov_open( #ifdef JBM_TSM_ON_TCS /*-------------------------------------------------------------------* - * ivas_dirac_dec_output_synthesis_cov_open() + * ivas_dirac_dec_output_synthesis_get_interpolator() + * * - * Sets up the state and parameters for the Covariance Synthesis *-------------------------------------------------------------------*/ void ivas_dirac_dec_output_synthesis_get_interpolator( - DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params, /* i/o: handle for the covariance synthesis parameters */ - const uint16_t interp_length ) + DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params, /* i/o: handle for the covariance synthesis parameters */ + const uint16_t interp_length /* i : interpolator length */ +) { int16_t idx; diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index 667ecd088c..92c6de6e87 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -446,6 +446,7 @@ static void ivas_param_ism_render_slot( } #endif + static void ivas_param_ism_rendering( DIRAC_DEC_HANDLE hDirAC, float Cldfb_RealBuffer_in[PARAM_ISM_MAX_DMX][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], @@ -811,6 +812,7 @@ ivas_error ivas_param_ism_dec_open( st_ivas->hISMDTX.dtx_flag = 0; st_ivas->hDirAC = hDirAC; + #ifdef JBM_TSM_ON_TCS if ( st_ivas->hDecoderConfig->voip_active ) { diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 867dada3e0..edec404d2f 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -64,7 +64,7 @@ static void ivas_jbm_dec_tc_buffer_playout( Decoder_Struct *st_ivas, const uint1 *--------------------------------------------------------------------------*/ ivas_error ivas_jbm_dec_tc( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ float *data /* o : transport channel signals */ ) { @@ -132,6 +132,7 @@ ivas_error ivas_jbm_dec_tc( { hp20( output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); } + if ( st_ivas->renderer_type == RENDERER_MC && st_ivas->hDecoderConfig->nchan_out == 1 ) { #ifdef MC_PARAMUPMIX_MODE @@ -213,9 +214,9 @@ ivas_error ivas_jbm_dec_tc( st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, #ifdef HODIRAC - st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_256k, + st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_256k, #endif - st_ivas->hSpar->dirac_to_spar_md_bands ); + st_ivas->hSpar->dirac_to_spar_md_bands ); } if ( ( error = ivas_spar_dec( st_ivas, nb_bits_metadata ) ) != IVAS_ERR_OK ) @@ -539,10 +540,10 @@ ivas_error ivas_jbm_dec_tc( *--------------------------------------------------------------------------*/ ivas_error ivas_jbm_dec_feed_tc_to_renderer( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const int16_t nSamplesForRendering, /* i : number of TC samples available for rendering */ int16_t *nSamplesResidual, /* o : number of samples not fitting into the renderer grid and buffer for the next call*/ - float *data /* i : transport channels */ + float *data /* i : transport channels */ ) { @@ -733,7 +734,7 @@ ivas_error ivas_jbm_dec_render( if ( ( ivas_td_binaural_renderer_sf( st_ivas, p_output, *nSamplesRendered ) ) != IVAS_ERR_OK ) { return error; - } + } } else if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { @@ -742,6 +743,7 @@ ivas_error ivas_jbm_dec_render( { return error; } + ivas_binaural_add_LFE( st_ivas, *nSamplesRendered, p_output, p_output ); } #ifdef DEBUGGING @@ -770,7 +772,11 @@ ivas_error ivas_jbm_dec_render( { mvr2r( st_ivas->hTcBuffer->tc[n] + st_ivas->hTcBuffer->n_samples_rendered, p_output[n], *nSamplesRendered ); } - ivas_sba_linear_renderer( p_output, *nSamplesRendered, nchan_remapped, output_config, st_ivas->hOutSetup, st_ivas->hoa_dec_mtx ); + + if ( ( error = ivas_sba_linear_renderer( p_output, *nSamplesRendered, nchan_remapped, output_config, st_ivas->hOutSetup, st_ivas->hoa_dec_mtx ) ) != IVAS_ERR_OK ) + { + return error; + } } else if ( st_ivas->renderer_type == RENDERER_DIRAC ) { @@ -850,6 +856,7 @@ ivas_error ivas_jbm_dec_render( { mvr2r( st_ivas->hTcBuffer->tc[LFE_CHANNEL - 1] + offset, output[st_ivas->hOutSetup.separateChannelIndex], *nSamplesRendered ); } + ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, *nSamplesRendered, st_ivas->hOutSetup.ambisonics_order, 0.f ); } else if ( st_ivas->intern_config == AUDIO_CONFIG_5_1 && ( output_config == AUDIO_CONFIG_5_1_2 || output_config == AUDIO_CONFIG_5_1_4 || output_config == AUDIO_CONFIG_7_1 ) ) @@ -860,6 +867,7 @@ ivas_error ivas_jbm_dec_render( } } } + /* copy discrete C and TD LFE from internal TC to output */ if ( st_ivas->hOutSetup.separateChannelEnabled ) { @@ -990,7 +998,7 @@ ivas_error ivas_jbm_dec_flush_renderer( if ( ( ivas_td_binaural_renderer_sf( st_ivas, p_output, hTcBuffer->n_samples_granularity ) ) != IVAS_ERR_OK ) { return error; - } + } } else if ( renderer_type_old == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index d19e2d33cc..6f2c6dc671 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -481,10 +481,18 @@ ivas_error ivas_param_mc_dec_open( #ifdef JBM_TSM_ON_TCS if ( st_ivas->hDecoderConfig->voip_active && hParamMC->synthesis_conf != PARAM_MC_SYNTH_MONO_STEREO ) { - hParamMC->Cldfb_RealBuffer_tc = (float *) malloc( MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hParamMC->num_freq_bands * sizeof( float ) ); + if ( ( hParamMC->Cldfb_RealBuffer_tc = (float *) malloc( MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC JBM\n" ) ); + } set_zero( hParamMC->Cldfb_RealBuffer_tc, MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hParamMC->num_freq_bands ); - hParamMC->Cldfb_ImagBuffer_tc = (float *) malloc( MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hParamMC->num_freq_bands * sizeof( float ) ); + + if ( ( hParamMC->Cldfb_ImagBuffer_tc = (float *) malloc( MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC JBM\n" ) ); + } set_zero( hParamMC->Cldfb_ImagBuffer_tc, MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hParamMC->num_freq_bands ); + if ( st_ivas->hTcBuffer == NULL ) { if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, nchan_transport, nchan_transport, 0, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) @@ -498,6 +506,7 @@ ivas_error ivas_param_mc_dec_open( hParamMC->Cldfb_RealBuffer_tc = NULL; hParamMC->Cldfb_ImagBuffer_tc = NULL; } + hParamMC->subframes_rendered = 0; hParamMC->slots_rendered = 0; #endif @@ -652,7 +661,6 @@ ivas_error ivas_param_mc_dec_reconfig( hParamMC->slot_size = (int16_t) ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX; hParamMC->subframe_nbslots = CLDFB_NO_COL_MAX / PARAM_MC_NSUBFRAMES_DEC; #endif - hParamMC->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); hParamMC->max_band_energy_compensation = hParamMC->num_freq_bands; @@ -1408,7 +1416,14 @@ void ivas_param_mc_dec_read_BS( return; } + #ifdef JBM_TSM_ON_TCS +/*------------------------------------------------------------------------- + * ivas_param_mc_dec_digest_tc() + * + * + *------------------------------------------------------------------------*/ + void ivas_param_mc_dec_digest_tc( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ const uint8_t nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ @@ -1552,6 +1567,7 @@ void ivas_param_mc_dec_digest_tc( return; } + /*------------------------------------------------------------------------- * ivas_param_mc_dec() * @@ -1833,11 +1849,13 @@ void ivas_param_mc_dec_render( } #endif + /*------------------------------------------------------------------------- * ivas_param_mc_dec() * * Parametric MC decoding process *------------------------------------------------------------------------*/ + #ifdef JBM_TSM_ON_TCS void ivas_param_mc_dec( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index bc4ad29025..d84df109d5 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -93,8 +93,8 @@ ivas_error ivas_td_binaural_renderer( *---------------------------------------------------------------------*/ ivas_error ivas_td_binaural_renderer_sf( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - float *output[], /* i/o: SCE channels / Binaural synthesis */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output[], /* i/o: SCE channels / Binaural synthesis */ const int16_t n_samples_granularity /* i : granularity of the renderer/buffer */ ) { @@ -152,7 +152,7 @@ ivas_error ivas_td_binaural_renderer_sf( if ( ( error = ivas_reverb_process( st_ivas->hReverb, st_ivas->transport_config, 0, tc_local, p_reverb_signal, 0 ) ) != IVAS_ERR_OK ) { return error; - } + } } /* Render subframe */ diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 581262fc52..97e532836f 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -129,6 +129,7 @@ ivas_error ivas_sba_dec_reconfigure( * Set SBA high-level parameters * Save old SBA high-level parameters *-----------------------------------------------------------------*/ + ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); nchan_hp20_old = getNumChanSynthesis( st_ivas ); nSCE_old = st_ivas->nSCE; @@ -137,6 +138,7 @@ ivas_error ivas_sba_dec_reconfigure( sba_dirac_stereo_flag_old = st_ivas->sba_dirac_stereo_flag; st_ivas->sba_analysis_order = ivas_sba_get_analysis_order( ivas_total_brate, st_ivas->sba_order ); + #ifdef JBM_TSM_ON_TCS /* save old */ if ( st_ivas->hDirAC == NULL && st_ivas->hSpar != NULL ) @@ -210,6 +212,7 @@ ivas_error ivas_sba_dec_reconfigure( st_ivas->hSpar->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered; mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hSpar->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); #endif + if ( st_ivas->nchan_transport == 1 ) { st_ivas->element_mode_init = IVAS_SCE; @@ -435,7 +438,7 @@ ivas_error ivas_sba_dec_reconfigure( /*-------------------------------------------------------------------* * ivas_sba_dec_digest_tc() * - * + * *-------------------------------------------------------------------*/ ivas_error ivas_sba_dec_digest_tc( diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 6f70700113..39dc870e9b 100755 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -1872,6 +1872,7 @@ void ivas_spar_dec_upmixer( cldfb_in_ts_im[out_ch][ts][cldfb_band] = out_im[out_ch]; } } + #ifdef JBM_TSM_ON_TCS if ( ( ( slot_idx_start + ts + 1 ) == hSpar->num_slots ) || ( ( md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME ) != ( hSpar->render_to_md_map[ts + slot_idx_start + 1] / JBM_CLDFB_SLOTS_IN_SUBFRAME ) ) ) { @@ -2030,10 +2031,12 @@ void ivas_spar_dec_upmixer( #ifndef JBM_TSM_ON_TCS } #endif + #ifdef JBM_TSM_ON_TCS hSpar->slots_rendered += hSpar->subframe_nbslots[hSpar->subframes_rendered]; hSpar->subframes_rendered++; #endif + pop_wmops(); return; diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 711c55b160..0e7a9ae856 100755 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -1356,7 +1356,7 @@ typedef struct Decoder_Struct #ifdef JBM_TSM_ON_TCS /* JBM module */ - DECODER_TC_BUFFER_HANDLE hTcBuffer; /* JBM handle */ + DECODER_TC_BUFFER_HANDLE hTcBuffer; /* JBM structure */ #endif #ifdef DEBUGGING diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 62e83686a0..a170a8b393 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -907,6 +907,7 @@ static ivas_error IVAS_DEC_Setup( Decoder_Struct *st_ivas; st_ivas = hIvasDec->st_ivas; + /*----------------------------------------------------------------* * IVAS decoder setup * - read IVAS format signaling @@ -2271,11 +2272,11 @@ ivas_error IVAS_DEC_VoIP_GetSamples( #if defined( VARIABLE_SPEED_DECODING ) || defined( JBM_TSM_ON_TCS ) ivas_error IVAS_DEC_VoIP_Flush( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - const int16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const int16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ int16_t *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */ - uint16_t *nSamplesAvailableNext, /* o : number of samples still available */ - int16_t *nSamplesFlushed /* o : number of samples flushed */ + uint16_t *nSamplesAvailableNext, /* o : number of samples still available */ + int16_t *nSamplesFlushed /* o : number of samples flushed */ ) { ivas_error error; diff --git a/lib_rend/ivas_sba_rendering.c b/lib_rend/ivas_sba_rendering.c index 7affa9a913..4baae9d082 100644 --- a/lib_rend/ivas_sba_rendering.c +++ b/lib_rend/ivas_sba_rendering.c @@ -44,13 +44,13 @@ #include "wmc_auto.h" +#ifdef JBM_TSM_ON_TCS /*-------------------------------------------------------------------* - * ivas_sba_prototype_renderer() + * ivas_sba_prototype_renderer_sf() * * Render prototype audio signals using SBA mixing matrices *-------------------------------------------------------------------*/ -#ifdef JBM_TSM_ON_TCS void ivas_sba_prototype_renderer_sf( Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ @@ -206,6 +206,12 @@ void ivas_sba_prototype_renderer_sf( #ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS +/*-------------------------------------------------------------------* + * ivas_sba_prototype_renderer() + * + * Render prototype audio signals using SBA mixing matrices + *-------------------------------------------------------------------*/ + void ivas_sba_prototype_renderer( Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ @@ -329,6 +335,7 @@ void ivas_sba_prototype_renderer( inIm[out_ch][ts][cldfb_band] = out_im[out_ch]; } } + #ifdef JBM_TSM_ON_TCS /* Update mixing matrices */ if ( ( ( slot_idx_start + ts + 1 ) == hSpar->num_slots ) || ( ( md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME ) != ( hSpar->render_to_md_map[ts + slot_idx_start + 1] / JBM_CLDFB_SLOTS_IN_SUBFRAME ) ) ) -- GitLab From 2abbd763ad7d989ce053cae18577849972b7b172 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 17 May 2023 10:51:42 +0200 Subject: [PATCH 203/331] typo in print-out --- apps/decoder.c | 2 +- readme.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 62c72fea0e..e44bc61764 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -1365,7 +1365,7 @@ static void usage_dec( void ) fprintf( stdout, "-VOIP_no_bad_frame : VoIP mode: do not put out bad frames in the beginning as silence \n" ); #endif #ifdef VARIABLE_SPEED_DECODING - fprintf( stdout, "-VS fac : Varaible Speed mode: change speed of playout fac as integer in percent. fac<100 faster, fac>100 slower\n" ); + fprintf( stdout, "-VS fac : Variable Speed mode: change speed of playout fac as integer in percent. fac<100 faster, fac>100 slower\n" ); #endif #ifdef JBM_TSM_ON_TCS #ifdef DEBUG_JBM_CMD_OPTION diff --git a/readme.txt b/readme.txt index 5660aa353f..45cde4e9d0 100644 --- a/readme.txt +++ b/readme.txt @@ -245,7 +245,7 @@ Options: The decoder may read rtpdump files containing TS26.445 Annex A.2.2 EVS RTP Payload Format. The SDP parameter hf_only is required. Reading RFC4867 AMR/AMR-WB RTP payload format is not supported. --VS fac : Varaible Speed mode: change speed of playout fac as integer in percent. +-VS fac : Variable Speed mode: change speed of playout fac as integer in percent. fac<100 faster, fac>100 slower -Tracefile TF : VoIP mode: Generate trace file named TF -fec_cfg_file : Optimal channel aware configuration computed by the JBM -- GitLab From 5364eb337b42d7e84517540a1cbe73c863723fba Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 17 May 2023 11:22:18 +0200 Subject: [PATCH 204/331] HO-DirAC/HO-MASA merge improvements --- lib_com/ivas_masa_com.c | 21 +++++++++++++++++---- lib_com/ivas_prot.h | 15 --------------- lib_dec/ivas_jbm_dec.c | 4 ++-- lib_enc/ivas_spar_encoder.c | 4 ++-- 4 files changed, 21 insertions(+), 23 deletions(-) diff --git a/lib_com/ivas_masa_com.c b/lib_com/ivas_masa_com.c index 7c0955436d..6be68475c1 100644 --- a/lib_com/ivas_masa_com.c +++ b/lib_com/ivas_masa_com.c @@ -49,7 +49,20 @@ *---------------------------------------------------------------*/ #define MASA_EXTRA_BAND_META_BITS 40 -#define MASA_SMALL_INC_META_BITS 10 + +#define MASA_SMALL_INC_META_BITS 10 + + +#ifdef HR_METADATA +/*--------------------------------------------------------------- + * Local prototypes + *---------------------------------------------------------------*/ + +static int16_t quantize_theta_masa( float x, const int16_t no_cb, float *xhat ); + +static int16_t quantize_phi_masa( float phi, const int16_t flag_delta, float *phi_hat, const int16_t n ); + +#endif /*--------------------------------------------------------------- @@ -451,7 +464,7 @@ uint16_t index_theta_phi_16( sign_th = 1; } - id_th = quantize_theta( abs_theta, gridData->no_theta, &theta_hat ); + id_th = quantize_theta_masa( abs_theta, gridData->no_theta, &theta_hat ); if ( gridData->no_theta > 1 ) { if ( gridData->no_phi[id_th] > 1 ) @@ -519,7 +532,7 @@ uint16_t index_theta_phi_16( *------------------------------------------------------------------------*/ /*! r: output index */ -int16_t quantize_theta( +static int16_t quantize_theta_masa( float x, /* i : theta value to be quantized */ const int16_t no_cb, /* i : number of codewords */ float *xhat /* o : quantized value */ @@ -561,7 +574,7 @@ int16_t quantize_theta( *------------------------------------------------------------------------*/ /*! r: index azimuth */ -int16_t quantize_phi_masa( +static int16_t quantize_phi_masa( float phi, /* i : azimuth value */ const int16_t flag_delta, /* i : flag indicating if the azimuth codebook is translated or not */ float *phi_hat, /* o : quantized azimuth */ diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 5d4faf0eb0..1766c64cf6 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3135,21 +3135,6 @@ uint16_t index_theta_phi_16( float * p_phi, /* i/o: input azimuth to be indexed */ const SPHERICAL_GRID_DATA *gridData /* i : generated grid data */ ); - -/*! r: output index */ -int16_t quantize_theta( - float x, /* i : theta value to be quantized */ - const int16_t no_cb, /* i : number of codewords */ - float *xhat /* o : quantized value */ -); - -/*! r: index azimuth */ -int16_t quantize_phi_masa( - float phi, /* i : azimuth value */ - const int16_t flag_delta, /* i : flag indicating if the azimuth codebook is translated or not */ - float *phi_hat, /* o : quantized azimuth */ - const int16_t n /* i : azimuth codebook size */ -); #endif void reset_metadata_spatial( diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index f33a5e01e6..6c32c6bc88 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -192,7 +192,7 @@ ivas_error ivas_jbm_dec_tc( { ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, #ifdef HODIRAC - st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_256k, + ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ), #endif 0 ); } @@ -217,7 +217,7 @@ ivas_error ivas_jbm_dec_tc( &nb_bits_metadata[0], st_ivas->sba_mode, #ifdef HODIRAC - st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_256k, + ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ), #endif st_ivas->hSpar->dirac_to_spar_md_bands ); } diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index a7c359b7c9..3d6280fcf9 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -609,8 +609,8 @@ static ivas_error ivas_spar_enc_process( ivas_dirac_param_est_enc( st_ivas->hDirAC, hQMetaData->q_direction, hQMetaData->useLowerRes, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, st_ivas->sba_mode #ifdef HODIRAC , - st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_256k, - st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_256k ? HOA2_CHANNELS : FOA_CHANNELS + ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ), + ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ? HOA2_CHANNELS : FOA_CHANNELS #endif ); -- GitLab From 039a66b4566f873c89f8b65c16bb160997a8ae78 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 17 May 2023 09:37:57 +0000 Subject: [PATCH 205/331] Update decoder.c: initialize bool data type parameter to 'false' instead of 0 --- apps/decoder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/decoder.c b/apps/decoder.c index e44bc61764..852e0bf373 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -858,7 +858,7 @@ static bool parseCmdlIVAS_dec( arg->no_diegetic_pan = 0.f; #endif #ifdef VARIABLE_SPEED_DECODING - arg->variableSpeedMode = 0; + arg->variableSpeedMode = false; arg->tsmScale = 100; arg->tsmScaleFileEnabled = false; arg->tsmScaleFileName = NULL; -- GitLab From 8fbd3627ff5189474e3249d59ff0d84fcd41510b Mon Sep 17 00:00:00 2001 From: Sumeyra Kanik Date: Wed, 17 May 2023 15:17:46 +0200 Subject: [PATCH 206/331] Keep subframe update idx as a variable, not constant --- lib_com/ivas_cnst.h | 3 --- lib_dec/ivas_objectRenderer_internal.c | 8 +++++++- lib_rend/ivas_objectRenderer.c | 25 +++++++++++++++++++++---- lib_rend/ivas_objectRenderer_sources.c | 6 +++++- lib_rend/ivas_prot_rend.h | 8 ++++++++ 5 files changed, 41 insertions(+), 9 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 57052ad950..f6369235a6 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -364,9 +364,6 @@ typedef enum #endif #define ISM_EXTENDED_METADATA_BITS 1 #define ISM_METADATA_RS_MAX_FRAMES 5 /* Number of frames with opposite extended metadata flags before switching */ -#ifdef FIX_356_ISM_METADATA_SYNC -#define ISM_METADATA_DELAY_SUBFRAME 2 /* Number of subframes to delay metadata to sync with audio */ -#endif /* Parametric ISM */ #define MAX_PARAM_ISM_NBANDS 11 diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index 6d701be0a5..47f950a550 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -102,6 +102,9 @@ void ObjRenderIVASSubframe( float *output_f_local[BINAURAL_CHANNELS]; float *tc_local[MAX_TRANSPORT_CHANNELS]; int16_t ch, slot_size, slots_to_render, output_frame; +#ifdef FIX_356_ISM_METADATA_SYNC + int16_t subframe_update = 0; +#endif for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { p_reverb_signal[ch] = reverb_signal[ch]; @@ -149,8 +152,11 @@ void ObjRenderIVASSubframe( } /* Render subframe */ +#ifdef FIX_356_ISM_METADATA_SYNC + TDREND_GetMix( st_ivas->hBinRendererTd, output_f_local, output_frame, 0, subframe_update ); +#else TDREND_GetMix( st_ivas->hBinRendererTd, output_f_local, output_frame, 0 ); - +#endif if ( st_ivas->hRenderConfig != NULL ) /* Renderer Configuration not enabled in TD standalone renderer */ { if ( st_ivas->hRenderConfig->roomAcoustics.late_reverb_on ) diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index a7a8df5eed..6214f74670 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -290,7 +290,8 @@ ivas_error ivas_td_binaural_renderer_unwrap( subframe_length = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES; #ifdef FIX_356_ISM_METADATA_SYNC - int16_t c_indx, nS; + int16_t c_indx, nS, subframe_update; + subframe_update = 2; c_indx = 0; for ( nS = 0; nS < num_src; nS++ ) @@ -310,7 +311,7 @@ ivas_error ivas_td_binaural_renderer_unwrap( for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) { #ifdef FIX_356_ISM_METADATA_SYNC - if ( subframe_idx == ISM_METADATA_DELAY_SUBFRAME ) + if ( subframe_idx == subframe_update ) { /* Update object position(s) */ TDREND_Update_object_positions( hBinRendererTd, num_src, ivas_format, hIsmMetaData ); @@ -332,7 +333,11 @@ ivas_error ivas_td_binaural_renderer_unwrap( } /* Render subframe */ +#ifdef FIX_356_ISM_METADATA_SYNC + if ( ( error = TDREND_GetMix( hBinRendererTd, output, subframe_length, subframe_idx, subframe_update ) ) != IVAS_ERR_OK ) +#else if ( ( error = TDREND_GetMix( hBinRendererTd, output, subframe_length, subframe_idx ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -365,6 +370,10 @@ ivas_error TDREND_GetMix( #endif const int16_t subframe_length, /* i/o: subframe length */ const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ +#ifdef FIX_356_ISM_METADATA_SYNC + , + const int16_t subframe_update +#endif ) { int16_t i; @@ -379,7 +388,10 @@ ivas_error TDREND_GetMix( #ifdef ISM_NON_DIEGETIC_PAN float pan_left, pan_right; #endif - +#ifdef FIX_356_ISM_METADATA_SYNC + int16_t subframe_update_flag; + subframe_update_flag = subframe_idx == subframe_update; +#endif error = IVAS_ERR_OK; /* Clear the output buffer to accumulate rendered sources */ @@ -408,7 +420,12 @@ ivas_error TDREND_GetMix( { TDREND_SRC_REND_UpdateFiltersFromSpatialParams( hBinRendererTd, SrcRend_p, SrcSpatial_p, Src_p->hrf_left_prev, Src_p->hrf_right_prev, hrf_left_delta, hrf_right_delta, &intp_count, &Src_p->filterlength, &Src_p->itd, &Src_p->Gain, Src_p, - subframe_idx ); +#ifdef FIX_356_ISM_METADATA_SYNC + subframe_update_flag +#else + subframe_idx +#endif + ); } /* Render source if needed */ diff --git a/lib_rend/ivas_objectRenderer_sources.c b/lib_rend/ivas_objectRenderer_sources.c index f622764482..35f8f90668 100644 --- a/lib_rend/ivas_objectRenderer_sources.c +++ b/lib_rend/ivas_objectRenderer_sources.c @@ -259,7 +259,11 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams( int16_t *itd, /* o: ITD value */ float *Gain, /* o: Gain value */ TDREND_SRC_t *Src_p, /* i/o: Source pointer */ +#ifdef FIX_356_ISM_METADATA_SYNC + const int16_t subframe_update_flag +#else const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ +#endif ) { TDREND_MIX_Listener_t *Listener_p; @@ -354,7 +358,7 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams( *intp_count = min( MAX_INTERPOLATION_STEPS, max( (int16_t) ( fabsf( azim_delta ) * MAX_ANGULAR_STEP_INV ), (int16_t) ( fabsf( elev_delta ) * MAX_ANGULAR_STEP_INV ) ) ); #ifdef FIX_356_ISM_METADATA_SYNC - if ( ( *intp_count > 0 ) && subframe_idx == ISM_METADATA_DELAY_SUBFRAME ) + if ( ( *intp_count > 0 ) && subframe_update_flag ) #else if ( ( *intp_count > 0 ) && subframe_idx == 0 ) #endif diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 2c1ac1394b..f8738a2c8a 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -299,6 +299,10 @@ ivas_error TDREND_GetMix( #endif const int16_t subframe_length, /* i/o: subframe length */ const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ +#ifdef FIX_356_ISM_METADATA_SYNC + , + const int16_t subframe_update /* Number of subframes to delay metadata to sync with audio */ +#endif ); void TDREND_Update_listener_orientation( @@ -394,7 +398,11 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams( int16_t *itd, /* o: ITD value */ float *Gain, /* o: Gain value */ TDREND_SRC_t *Src_p, +#ifdef FIX_356_ISM_METADATA_SYNC + const int16_t subframe_update_flag /* i : Flag to determine update subframe idx */ +#else const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ +#endif ); ivas_error TDREND_SRC_Alloc( -- GitLab From 27bf2432a7463f3efb50e49c5a1572ee3303c150 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 17 May 2023 15:39:38 +0200 Subject: [PATCH 207/331] Added fix FIX_462_HRTF_FILE_BR_SWITCH_MEM_ERR to do proper deallocation of structures allocated by HRTF file reading --- lib_com/options.h | 2 +- lib_dec/ivas_ism_dec.c | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 660b511c72..b9fc00c571 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -220,7 +220,7 @@ #define FIX_DIRAC_LS_SYNTHESIS_CONFIG_479 /* FhG: fix for issue 479, broken LS output with DirAC at high BRs */ #define HYBRID_ITD_MAX /* FhG: Improvement for DFT-stereo for cases with large ITDs */ - +#define FIX_462_HRTF_FILE_BR_SWITCH_MEM_ERR /* Eri: Fix for issue 462: Use-of-uninitialized memory in external HRTF deallocation in decoder together with BR switching */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index 5706261093..a09efdb92f 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -41,7 +41,9 @@ #include "debug.h" #endif #include "wmc_auto.h" - +#ifdef FIX_462_HRTF_FILE_BR_SWITCH_MEM_ERR +#include "hrtf_file_reader.h" +#endif /*-------------------------------------------------------------------------* * ivas_ism_bitrate_switching() @@ -260,6 +262,9 @@ static ivas_error ivas_ism_bitrate_switching( } /* Close the TD Binaural renderer */ +#ifdef FIX_462_HRTF_FILE_BR_SWITCH_MEM_ERR + dealloc_HRTF_binary( st_ivas->hBinRendererTd->HrFiltSet_p ); +#endif if ( st_ivas->hBinRendererTd != NULL ) { ivas_td_binaural_close( &st_ivas->hBinRendererTd ); -- GitLab From 5cc82a60fd4debbf99cea8463202f56c200a8e50 Mon Sep 17 00:00:00 2001 From: Sumeyra Kanik Date: Wed, 17 May 2023 15:40:40 +0200 Subject: [PATCH 208/331] Reverse subframe update to 0 --- lib_rend/ivas_objectRenderer.c | 791 ++++++++++++++++++++++++- lib_rend/ivas_objectRenderer_sources.c | 2 +- 2 files changed, 791 insertions(+), 2 deletions(-) diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index f36a229fd9..a69ca69c5c 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -291,7 +291,796 @@ ivas_error ivas_td_binaural_renderer_unwrap( #ifdef FIX_356_ISM_METADATA_SYNC int16_t c_indx, nS, subframe_update; - subframe_update = 2; + subframe_update = 0; + c_indx = 0; + + for ( nS = 0; nS < num_src; nS++ ) + { + if ( !( ivas_format == MC_FORMAT && nS == lfe_idx ) ) /* Skip LFE for MC */ + { + hBinRendererTd->Sources[c_indx]->InputFrame_p = output[nS]; + hBinRendererTd->Sources[c_indx]->SrcRend_p->InputAvailable = TRUE; + c_indx++; + } + } +#else + /* Update object position(s) */ + TDREND_Update_object_positions( hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, output ); +#endif + + for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) + { +#ifdef FIX_356_ISM_METADATA_SYNC + if ( subframe_idx == subframe_update ) + { + /* Update object position(s) */ + TDREND_Update_object_positions( hBinRendererTd, num_src, ivas_format, hIsmMetaData ); + } +#endif + /* Update the listener's location/orientation */ + TDREND_Update_listener_orientation( hBinRendererTd, Opt_Headrotation, ( Quaternions != NULL ) ? &Quaternions[subframe_idx] : NULL, ( Pos != NULL ) ? &Pos[subframe_idx] : NULL ); + + if ( hReverb != NULL && hReverb->pConfig.roomAcoustics.late_reverb_on ) + { +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_reverb_process( hReverb, transport_config, 0, output, p_reverb_signal, subframe_idx ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_reverb_process( hReverb, transport_config, 0, output, reverb_signal, subframe_idx ) ) != IVAS_ERR_OK ) +#endif + { + return error; + } + } + + /* Render subframe */ +#ifdef FIX_356_ISM_METADATA_SYNC + if ( ( error = TDREND_GetMix( hBinRendererTd, output, subframe_length, subframe_idx, subframe_update ) ) != IVAS_ERR_OK ) +#else + if ( ( error = TDREND_GetMix( hBinRendererTd, output, subframe_length, subframe_idx ) ) != IVAS_ERR_OK ) +#endif + { + return error; + } + } + + + if ( hReverb != NULL && hReverb->pConfig.roomAcoustics.late_reverb_on ) + { + /* add reverb to rendered signals */ + v_add( reverb_signal[0], output[0], output[0], output_frame ); + v_add( reverb_signal[1], output[1], output[1], output_frame ); + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * TDREND_GetMix() + * + * Render one 5 ms subframe from the mixer + *---------------------------------------------------------------------*/ + +ivas_error TDREND_GetMix( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ +#ifdef JBM_TSM_ON_TCS + float *output[], /* i/o: ISM object synth / rendered output in 0,1 */ +#else + float output[][L_FRAME48k], /* i/o: ISM object synth / rendered output in 0,1 */ +#endif + const int16_t subframe_length, /* i/o: subframe length */ + const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ +#ifdef FIX_356_ISM_METADATA_SYNC + , + const int16_t subframe_update +#endif +) +{ + int16_t i; + TDREND_SRC_t *Src_p; + TDREND_SRC_SPATIAL_t *SrcSpatial_p; + TDREND_SRC_REND_t *SrcRend_p; + ivas_error error; + float output_buf[2][L_SPATIAL_SUBFR_48k]; /* Temp buffer for left/right rendered signal */ + float hrf_left_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; + float hrf_right_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; + int16_t intp_count; +#ifdef ISM_NON_DIEGETIC_PAN + float pan_left, pan_right; +#endif +#ifdef FIX_356_ISM_METADATA_SYNC + int16_t subframe_update_flag; + subframe_update_flag = subframe_idx == subframe_update; +#endif + error = IVAS_ERR_OK; + + /* Clear the output buffer to accumulate rendered sources */ + set_f( output_buf[0], 0.0f, subframe_length ); + set_f( output_buf[1], 0.0f, subframe_length ); + + /* Clear interpolation buffers and counter */ + set_f( hrf_left_delta, 0.0f, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); + set_f( hrf_right_delta, 0.0f, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); + intp_count = 0; + + /* Create the mix */ + /* Loop through the source list and render each source */ + for ( i = 0; i < hBinRendererTd->NumOfSrcs; i++ ) + { + Src_p = hBinRendererTd->Sources[i]; + SrcSpatial_p = Src_p->SrcSpatial_p; + SrcRend_p = Src_p->SrcRend_p; + + /* Update rendering params if needed */ +#ifdef ISM_NON_DIEGETIC_PAN + if ( ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING ) && ( hBinRendererTd->Listener_p->PoseUpdated || SrcSpatial_p->Updated ) ) +#else + if ( hBinRendererTd->Listener_p->PoseUpdated || SrcSpatial_p->Updated ) +#endif + { + TDREND_SRC_REND_UpdateFiltersFromSpatialParams( hBinRendererTd, SrcRend_p, SrcSpatial_p, Src_p->hrf_left_prev, + Src_p->hrf_right_prev, hrf_left_delta, hrf_right_delta, &intp_count, &Src_p->filterlength, &Src_p->itd, &Src_p->Gain, Src_p, +#ifdef FIX_356_ISM_METADATA_SYNC + subframe_update_flag +#else + subframe_idx +#endif + ); + } + + /* Render source if needed */ + if ( ( SrcRend_p->InputAvailable == TRUE ) && ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING ) ) + { + error = TDREND_REND_RenderSourceHRFilt( Src_p, hrf_left_delta, hrf_right_delta, intp_count, output_buf, subframe_length ); + } + +#ifdef ISM_NON_DIEGETIC_PAN + if ( ( SrcRend_p->InputAvailable == TRUE ) && ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING_NON_DIEGETIC ) ) + { + pan_left = ( SrcSpatial_p->Pos_p[1] + 1.f ) * 0.5f; + pan_right = 1.f - pan_left; + v_multc_acc( &Src_p->InputFrame_p[subframe_idx * subframe_length], pan_left, output_buf[0], subframe_length ); + v_multc_acc( &Src_p->InputFrame_p[subframe_idx * subframe_length], pan_right, output_buf[1], subframe_length ); + } +#endif + } + + /* Populate output variable */ + mvr2r( output_buf[0], output[0] + subframe_idx * subframe_length, subframe_length ); /* Left */ + mvr2r( output_buf[1], output[1] + subframe_idx * subframe_length, subframe_length ); /* Right */ + + /* Clear the PoseUpdated and Source position update flags */ + TDREND_Clear_Update_flags( hBinRendererTd ); + + return error; +} + + +/*---------------------------------------------------------------------* + * TDREND_Clear_Update_flags() + * + * Initializes the audio mixer module + *---------------------------------------------------------------------*/ + +static void TDREND_Clear_Update_flags( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd /* i/o: TD renderer handle */ +) +{ + int16_t i; + + hBinRendererTd->Listener_p->PoseUpdated = FALSE; + + for ( i = 0; i < hBinRendererTd->NumOfSrcs; i++ ) + { + hBinRendererTd->Sources[i]->SrcSpatial_p->Updated = FALSE; + } + + return; +} + + +/*---------------------------------------------------------------------* + * TDREND_Update_object_positions() + * + * Update object position(s) + *---------------------------------------------------------------------*/ + +void TDREND_Update_object_positions( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o : TD Renderer handle */ + const int16_t num_src, /* i : number of sources to render */ +#ifndef FIX_356_ISM_METADATA_SYNC + const int16_t lfe_idx, /* i : Input LFE index */ +#endif + const IVAS_FORMAT in_format, /* i : Format of input sources */ + const ISM_METADATA_HANDLE *hIsmMetaData /* i : Input metadata for ISM objects */ +#ifndef FIX_356_ISM_METADATA_SYNC + , +#ifdef JBM_TSM_ON_TCS + float *output[] +#else + float output[][L_FRAME48k] /* i/o: SCE/MC channels */ +#endif +#endif +) +{ + TDREND_DirAtten_t *DirAtten_p; + int16_t nS; + float Pos[3]; + float Dir[3]; +#ifndef FIX_356_ISM_METADATA_SYNC + int16_t c_indx; +#endif + + DirAtten_p = hBinRendererTd->DirAtten_p; + + /* For each source, write the frame data to the source object*/ +#ifndef FIX_356_ISM_METADATA_SYNC + c_indx = 0; +#endif + for ( nS = 0; nS < num_src; nS++ ) + { +#ifndef FIX_356_ISM_METADATA_SYNC + if ( !( in_format == MC_FORMAT && nS == lfe_idx ) ) /* Skip LFE for MC */ + { + hBinRendererTd->Sources[c_indx]->InputFrame_p = output[nS]; + hBinRendererTd->Sources[c_indx]->SrcRend_p->InputAvailable = TRUE; + c_indx++; + } +#endif + if ( in_format == ISM_FORMAT ) + { + /* Update the source positions */ + /* Source position and direction */ + angles_to_vec( hIsmMetaData[nS]->radius, hIsmMetaData[nS]->azimuth, hIsmMetaData[nS]->elevation, Pos ); + angles_to_vec( 1.0f, hIsmMetaData[nS]->yaw, hIsmMetaData[nS]->pitch, Dir ); + +#ifndef FIX_463_TD_RENDERER_DIRECTIVITY_RESET + + /* Source directivity info */ + DirAtten_p->ConeInnerAngle = 360.0f; + DirAtten_p->ConeOuterAngle = 360.0f; + DirAtten_p->ConeOuterGain = 1.0f; +#endif + + TDREND_MIX_SRC_SetPos( hBinRendererTd, nS, Pos ); + TDREND_MIX_SRC_SetDirAtten( hBinRendererTd, nS, DirAtten_p ); + +#ifdef ISM_NON_DIEGETIC_PAN + if ( hIsmMetaData[nS]->non_diegetic_flag ) + { + Pos[0] = 0; + Pos[1] = hIsmMetaData[nS]->azimuth / 90.f; + Pos[2] = 0; + TDREND_MIX_SRC_SetPos( hBinRendererTd, nS, Pos ); + TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING_NON_DIEGETIC ); + } + else + { + TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING ); + } +#else + TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING ); +#endif + TDREND_MIX_SRC_SetDir( hBinRendererTd, nS, Dir ); + } + } + + return; +} + + +/*---------------------------------------------------------------------* + * TDREND_Update_listener_orientation() + * + * Update listener orientation (s) + *---------------------------------------------------------------------*/ + +void TDREND_Update_listener_orientation( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD Renderer handle */ + const int16_t headRotEnabled, /* i : Headrotation flag */ + const IVAS_QUATERNION *headPosition, /* i : Listener orientation */ + const IVAS_VECTOR3 *Pos /* i : Listener Position */ +) +{ + float FrontVec[3]; + float UpVec[3]; + float Rmat[3][3]; + float Pos_p[3]; + + if ( headRotEnabled ) + { + /* Obtain head rotation matrix */ + QuatToRotMat( *headPosition, Rmat ); + /* Apply rotation matrix to looking vector [1;0;0] */ + FrontVec[0] = Rmat[0][0]; + FrontVec[1] = Rmat[0][1]; + FrontVec[2] = Rmat[0][2]; + /* Apply rotation matrix to up vector [0;0;1] */ + UpVec[0] = Rmat[2][0]; + UpVec[1] = Rmat[2][1]; + UpVec[2] = Rmat[2][2]; + /* Input position */ + Pos_p[0] = ( *Pos ).x; + Pos_p[1] = ( *Pos ).y; + Pos_p[2] = ( *Pos ).z; + } + else + { + /* Oriented with looking vector along the x axis */ + FrontVec[0] = 1.0f; + FrontVec[1] = 0.0f; + FrontVec[2] = 0.0f; + /* Oriented with up vector along the z axis */ + UpVec[0] = 0.0f; + UpVec[1] = 0.0f; + UpVec[2] = 1.0f; + /* Listener at the origin */ + Pos_p[0] = 0.0f; + Pos_p[1] = 0.0f; + Pos_p[2] = 0.0f; + } + + /* Set the listener position and orientation:*/ + TDREND_MIX_LIST_SetPos( hBinRendererTd, Pos_p ); + TDREND_MIX_LIST_SetOrient( hBinRendererTd, FrontVec, UpVec ); + + return; +} + + +/*---------------------------------------------------------------------* + * ivas_td_binaural_open_ext() + * + * + *---------------------------------------------------------------------*/ + +ivas_error ivas_td_binaural_open_ext( + TDREND_WRAPPER *pTDRend, + IVAS_REND_AudioConfig inConfig, + RENDER_CONFIG_DATA *hRendCfg, /* i : Renderer configuration */ + LSSETUP_CUSTOM_STRUCT *customLsInput, + const int32_t outFs ) +{ + int16_t nchan_transport; + AUDIO_CONFIG transport_config; + IVAS_FORMAT ivas_format; + IVAS_OUTPUT_SETUP hTransSetup; + ivas_error error; + float *directivity = NULL; + + if ( inConfig != IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) + { + if ( ( error = getAudioConfigNumChannels( inConfig, &nchan_transport ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + nchan_transport = customLsInput->num_spk; + } + + transport_config = getIvasAudioConfigFromRendAudioConfig( inConfig ); + ivas_format = ( getAudioConfigType( inConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ? MC_FORMAT : ISM_FORMAT; + hTransSetup.ls_azimuth = customLsInput->ls_azimuth; + hTransSetup.ls_elevation = customLsInput->ls_elevation; + + if ( NULL != hRendCfg ) + { + directivity = hRendCfg->directivity; + } + + return ivas_td_binaural_open_unwrap( &pTDRend->hHrtfTD, outFs, nchan_transport, ivas_format, transport_config, directivity, hTransSetup, &pTDRend->hBinRendererTd, &pTDRend->binaural_latency_ns ); +} + + +/*---------------------------------------------------------------------* + * ivas_td_binaural_renderer_ext() + * + * Receives the current frames for the object streams, updates metadata + * and renders the current frame. + *---------------------------------------------------------------------*/ + +ivas_error ivas_td_binaural_renderer_ext( + const TDREND_WRAPPER *pTDRend, /* i : TD Renderer wrapper structure */ + const IVAS_REND_AudioConfig inConfig, /* i : Input audio configuration */ + const LSSETUP_CUSTOM_STRUCT *customLsInput, /* i : Input custom loudspeaker layout */ + const IVAS_REND_HeadRotData *headRotData, /* i : Input head positions */ + const IVAS_REND_AudioObjectPosition *currentPos, /* i : Object position */ + const REVERB_HANDLE hReverb, /* i : Reverberator handle */ + const int16_t output_frame, /* i : output frame length */ + float output[][L_FRAME48k] /* i/o: SCE channels / Binaural synthesis */ +) +{ + ISM_METADATA_FRAME hIsmMetaDataFrame; + ISM_METADATA_HANDLE hIsmMetaData[1]; + int16_t lfe_idx; + int16_t num_src; + IVAS_FORMAT ivas_format; + IVAS_REND_AudioConfigType inConfigType; + AUDIO_CONFIG transport_config; + ivas_error error; +#ifdef JBM_TSM_ON_TCS + float *p_output[MAX_OUTPUT_CHANNELS]; + int16_t ch; + + for ( ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++ ) + { + p_output[ch] = output[ch]; + } +#endif + + push_wmops( "ivas_td_binaural_renderer_ext" ); + + inConfigType = getAudioConfigType( inConfig ); + lfe_idx = LFE_CHANNEL; + hIsmMetaData[0] = NULL; + + if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) + { + ivas_format = MC_FORMAT; + transport_config = getIvasAudioConfigFromRendAudioConfig( inConfig ); + if ( inConfig != IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) + { + if ( ( error = getAudioConfigNumChannels( inConfig, &num_src ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + lfe_idx = ( customLsInput->num_lfe > 0 ) ? customLsInput->lfe_idx[0] : -1; + num_src = customLsInput->num_spk + customLsInput->num_lfe; + } + } + else + { + ivas_format = ISM_FORMAT; + num_src = 1; + transport_config = AUDIO_CONFIG_ISM1; + hIsmMetaData[0] = &hIsmMetaDataFrame; + hIsmMetaData[0]->azimuth = currentPos->azimuth; + hIsmMetaData[0]->elevation = currentPos->elevation; + hIsmMetaData[0]->yaw = currentPos->yaw; + hIsmMetaData[0]->pitch = currentPos->pitch; + hIsmMetaData[0]->radius = currentPos->radius; +#ifdef ISM_NON_DIEGETIC_PAN + hIsmMetaData[0]->non_diegetic_flag = currentPos->non_diegetic_flag; +#endif + } + +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, + ( headRotData != NULL ) ? headRotData->headPositions : NULL, + ( headRotData != NULL ) ? headRotData->Pos : NULL, p_output, output_frame ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, + ( headRotData != NULL ) ? headRotData->headPositions : NULL, + ( headRotData != NULL ) ? headRotData->Pos : NULL, output, output_frame ) ) != IVAS_ERR_OK ) + +#endif + { + return error; + } + + pop_wmops(); + + return IVAS_ERR_OK; +} + +/*---------------------------------------------------------------------* + * angles_to_vec() + * + * Convert azimuth and elevation angles to position/orientation vector + *---------------------------------------------------------------------*/ + +static void angles_to_vec( + const float radius, /* i : radius */ + const float azimuth, /* i : Azimuth angle */ + const float elevation, /* i : Elevation angle */ + float *vec /* o : Pos/Dir vector */ +) +{ + vec[0] = radius * cosf( elevation * PI_OVER_180 ) * cosf( azimuth * PI_OVER_180 ); + vec[1] = radius * cosf( elevation * PI_OVER_180 ) * sinf( azimuth * PI_OVER_180 ); + vec[2] = radius * sinf( elevation * PI_OVER_180 ); + + return; +} +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "ivas_stat_rend.h" +#include +#include "options.h" +#include "prot.h" +#ifdef ISM_NON_DIEGETIC_PAN +#include "ivas_prot.h" +#endif +#include "ivas_prot_rend.h" +#include +#include "ivas_rom_com.h" +#ifdef DEBUGGING +#include "debug.h" +#endif +#include "wmc_auto.h" + + +/*---------------------------------------------------------------------* + * Local function prototypes + *---------------------------------------------------------------------*/ + + +static void TDREND_Clear_Update_flags( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd ); + +static void angles_to_vec( const float radius, const float azimuth, const float elevation, float *vec ); + + +/*---------------------------------------------------------------------* + * ivas_td_binaural_open_unwrap() + * + * Call TD open/init function without st_ivas + *---------------------------------------------------------------------*/ + +ivas_error ivas_td_binaural_open_unwrap( + TDREND_HRFILT_FiltSet_t **hHrtfTD, /* i/o: HR filter model (from file or NULL) */ + const int32_t output_Fs, /* i : Output sampling rate */ + const int16_t nchan_transport, /* i : Number of channels */ + const IVAS_FORMAT ivas_format, /* i : IVAS format (ISM/MC) */ + const AUDIO_CONFIG transport_config, /* i : Transport configuration */ + const float *directivity, /* i : Directivity pattern (used for ISM) */ + const IVAS_OUTPUT_SETUP hTransSetup, /* i : Loudspeaker layout */ + BINAURAL_TD_OBJECT_RENDERER_HANDLE *hBinRendererTd, /* o : TD renderer handle */ + int32_t *binaural_latency_ns /* i : Binauralization delay */ +) +{ + BINAURAL_TD_OBJECT_RENDERER_HANDLE pBinRendTd; + TDREND_PosType_t PosType; + int16_t nS; + int16_t SrcInd[MAX_NUM_TDREND_CHANNELS]; + const float *ls_azimuth, *ls_elevation; + float Pos[3]; + float Dir[3]; + TDREND_DirAtten_t *DirAtten_p; + int16_t nchan_rend; + ivas_error error; + + error = IVAS_ERR_OK; + + if ( ( pBinRendTd = malloc( sizeof( BINAURAL_TD_OBJECT_RENDERER ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD renderer\n" ) ); + } + if ( ( pBinRendTd->TdRend_MixSpatSpec_p = malloc( sizeof( TDREND_MixSpatSpec_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD renderer\n" ) ); + } + if ( ( pBinRendTd->DirAtten_p = malloc( sizeof( TDREND_DirAtten_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD renderer\n" ) ); + } + if ( ( pBinRendTd->Listener_p = malloc( sizeof( TDREND_MIX_Listener_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD renderer\n" ) ); + } + + pBinRendTd->NumOfSrcs = 0; + pBinRendTd->MaxSrcInd = -1; + + /* Mixer spatial setup */ + pBinRendTd->TdRend_MixSpatSpec_p->UseCommonDistAttenModel = TRUE; + pBinRendTd->TdRend_MixSpatSpec_p->DistAttenModel = 0; /* 0=Turned off, else use TDREND_DIST_ATTEN_MODEL_INV_DIST_CLAMPED */ + + if ( ( error = TDREND_MIX_Init( pBinRendTd, hHrtfTD, pBinRendTd->TdRend_MixSpatSpec_p, output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Set the attenuation (or can set MixSpatSpec.DistAttenModel above) */ + if ( ( error = TDREND_MIX_SetDistAttenModel( pBinRendTd, TDREND_DIST_ATTEN_MODEL_INV_DIST_CLAMPED ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Add sources to module and mixer, headphones */ + PosType = TDREND_POSTYPE_ABSOLUTE; /* or TDREND_POSTYPE_RELATIVE_TO_LISTENER */ + + nchan_rend = nchan_transport; + if ( ( ivas_format == MC_FORMAT ) && ( transport_config != AUDIO_CONFIG_LS_CUSTOM ) ) + { + nchan_rend--; /* Skip LFE channel -- added to the others */ + } + + for ( nS = 0; nS < nchan_rend; nS++ ) + { + if ( ( error = TDREND_MIX_AddSrc( pBinRendTd, &SrcInd[nS], PosType ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( ivas_format == MC_FORMAT ) + { + switch ( transport_config ) + { + case AUDIO_CONFIG_5_1: + ls_azimuth = ls_azimuth_CICP6; + ls_elevation = ls_elevation_CICP6; + break; + case AUDIO_CONFIG_7_1: + ls_azimuth = ls_azimuth_CICP12; + ls_elevation = ls_elevation_CICP12; + break; + case AUDIO_CONFIG_5_1_2: + ls_azimuth = ls_azimuth_CICP14; + ls_elevation = ls_elevation_CICP14; + break; + case AUDIO_CONFIG_5_1_4: + ls_azimuth = ls_azimuth_CICP16; + ls_elevation = ls_elevation_CICP16; + break; + case AUDIO_CONFIG_7_1_4: + ls_azimuth = ls_azimuth_CICP19; + ls_elevation = ls_elevation_CICP19; + break; + case AUDIO_CONFIG_LS_CUSTOM: + ls_azimuth = hTransSetup.ls_azimuth; + ls_elevation = hTransSetup.ls_elevation; + break; + default: + ls_azimuth = NULL; + ls_elevation = NULL; + } + + DirAtten_p = pBinRendTd->DirAtten_p; + + for ( nS = 0; nS < nchan_rend; nS++ ) + { + /* Set source positions according to loudspeaker layout */ + angles_to_vec( 1.0f, ls_azimuth[nS], ls_elevation[nS], Pos ); + Dir[0] = 1.0f; + Dir[1] = 0.0f; + Dir[2] = 0.0f; + + /* Source directivity info */ + DirAtten_p->ConeInnerAngle = 360.0f; + DirAtten_p->ConeOuterAngle = 360.0f; + DirAtten_p->ConeOuterGain = 1.0f; + + TDREND_MIX_SRC_SetPos( pBinRendTd, nS, Pos ); + TDREND_MIX_SRC_SetDir( pBinRendTd, nS, Dir ); + TDREND_MIX_SRC_SetPlayState( pBinRendTd, nS, TDREND_PLAYSTATUS_PLAYING ); + TDREND_MIX_SRC_SetDirAtten( pBinRendTd, nS, DirAtten_p ); + } + } + if ( ivas_format == ISM_FORMAT ) + { + DirAtten_p = pBinRendTd->DirAtten_p; + if ( NULL == directivity ) + { + DirAtten_p->ConeInnerAngle = 360.0f; /* Front cone */ + DirAtten_p->ConeOuterAngle = 360.0f; /* Back cone */ + DirAtten_p->ConeOuterGain = 1.0f; /* Back attenuation */ + } + else + { + DirAtten_p->ConeInnerAngle = directivity[0]; + DirAtten_p->ConeOuterAngle = directivity[1]; + DirAtten_p->ConeOuterGain = directivity[2]; + } + + for ( nS = 0; nS < nchan_rend; nS++ ) + { + TDREND_MIX_SRC_SetDirAtten( pBinRendTd, nS, DirAtten_p ); + } + } + + *hBinRendererTd = pBinRendTd; + *binaural_latency_ns = (int32_t) ( ( *hBinRendererTd )->HrFiltSet_p->latency_s * 1000000000.f ); + + return error; +} + + +/*---------------------------------------------------------------------* + * ivas_td_binaural_close() + * + * Close TD Object binaural renderer + *---------------------------------------------------------------------*/ + +void ivas_td_binaural_close( + BINAURAL_TD_OBJECT_RENDERER_HANDLE *hBinRendererTd /* i/o: TD binaural object renderer handle */ +) +{ + if ( hBinRendererTd == NULL || *hBinRendererTd == NULL ) + { + return; + } + + free( ( *hBinRendererTd )->TdRend_MixSpatSpec_p ); + free( ( *hBinRendererTd )->DirAtten_p ); + + TDREND_MIX_Dealloc( *hBinRendererTd ); + + free( *hBinRendererTd ); + *hBinRendererTd = NULL; + + return; +} + +/*---------------------------------------------------------------------* + * ivas_td_binaural_renderer_unwrap() + * + * Call ivas_td_binaural_renderer() without st_ivas. + *---------------------------------------------------------------------*/ + +ivas_error ivas_td_binaural_renderer_unwrap( + const REVERB_HANDLE hReverb, /* i : Reverberator handle */ + const AUDIO_CONFIG transport_config, /* i : Transport configuration */ + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD binaural object renderer handle */ + const int16_t num_src, /* i : number of sources to render */ + const int16_t lfe_idx, /* i : LFE channel index */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + ISM_METADATA_HANDLE *hIsmMetaData, /* i : ISM metadata handle */ + const int16_t Opt_Headrotation, /* i : Head rotation flag */ + const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ + const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ +#ifdef JBM_TSM_ON_TCS + float *output[], /* i/o: SCE channels / Binaural synthesis */ +#else + float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ +#endif + const int16_t output_frame /* i : output frame length */ +) +{ + int16_t subframe_length; + int16_t subframe_idx; + float reverb_signal[BINAURAL_CHANNELS][L_FRAME48k]; + ivas_error error; +#ifdef JBM_TSM_ON_TCS + float *p_reverb_signal[BINAURAL_CHANNELS]; + int16_t ch; + + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + p_reverb_signal[ch] = reverb_signal[ch]; + } +#endif + + subframe_length = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES; + +#ifdef FIX_356_ISM_METADATA_SYNC + int16_t c_indx, nS, subframe_update; + subframe_update = 0; c_indx = 0; for ( nS = 0; nS < num_src; nS++ ) diff --git a/lib_rend/ivas_objectRenderer_sources.c b/lib_rend/ivas_objectRenderer_sources.c index 35f8f90668..a565bc08b5 100644 --- a/lib_rend/ivas_objectRenderer_sources.c +++ b/lib_rend/ivas_objectRenderer_sources.c @@ -262,7 +262,7 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams( #ifdef FIX_356_ISM_METADATA_SYNC const int16_t subframe_update_flag #else - const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ + const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ #endif ) { -- GitLab From 96bf30fb66c6b1c318bdb3ec3e8849d0c510e3f8 Mon Sep 17 00:00:00 2001 From: Sumeyra Kanik Date: Wed, 17 May 2023 15:48:39 +0200 Subject: [PATCH 209/331] Fix crash Reverse subframe update to 0 --- lib_rend/ivas_objectRenderer.c | 789 --------------------------------- 1 file changed, 789 deletions(-) diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index a69ca69c5c..36e187870f 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -787,792 +787,3 @@ static void angles_to_vec( return; } -/****************************************************************************************************** - - (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -#include "ivas_stat_rend.h" -#include -#include "options.h" -#include "prot.h" -#ifdef ISM_NON_DIEGETIC_PAN -#include "ivas_prot.h" -#endif -#include "ivas_prot_rend.h" -#include -#include "ivas_rom_com.h" -#ifdef DEBUGGING -#include "debug.h" -#endif -#include "wmc_auto.h" - - -/*---------------------------------------------------------------------* - * Local function prototypes - *---------------------------------------------------------------------*/ - - -static void TDREND_Clear_Update_flags( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd ); - -static void angles_to_vec( const float radius, const float azimuth, const float elevation, float *vec ); - - -/*---------------------------------------------------------------------* - * ivas_td_binaural_open_unwrap() - * - * Call TD open/init function without st_ivas - *---------------------------------------------------------------------*/ - -ivas_error ivas_td_binaural_open_unwrap( - TDREND_HRFILT_FiltSet_t **hHrtfTD, /* i/o: HR filter model (from file or NULL) */ - const int32_t output_Fs, /* i : Output sampling rate */ - const int16_t nchan_transport, /* i : Number of channels */ - const IVAS_FORMAT ivas_format, /* i : IVAS format (ISM/MC) */ - const AUDIO_CONFIG transport_config, /* i : Transport configuration */ - const float *directivity, /* i : Directivity pattern (used for ISM) */ - const IVAS_OUTPUT_SETUP hTransSetup, /* i : Loudspeaker layout */ - BINAURAL_TD_OBJECT_RENDERER_HANDLE *hBinRendererTd, /* o : TD renderer handle */ - int32_t *binaural_latency_ns /* i : Binauralization delay */ -) -{ - BINAURAL_TD_OBJECT_RENDERER_HANDLE pBinRendTd; - TDREND_PosType_t PosType; - int16_t nS; - int16_t SrcInd[MAX_NUM_TDREND_CHANNELS]; - const float *ls_azimuth, *ls_elevation; - float Pos[3]; - float Dir[3]; - TDREND_DirAtten_t *DirAtten_p; - int16_t nchan_rend; - ivas_error error; - - error = IVAS_ERR_OK; - - if ( ( pBinRendTd = malloc( sizeof( BINAURAL_TD_OBJECT_RENDERER ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD renderer\n" ) ); - } - if ( ( pBinRendTd->TdRend_MixSpatSpec_p = malloc( sizeof( TDREND_MixSpatSpec_t ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD renderer\n" ) ); - } - if ( ( pBinRendTd->DirAtten_p = malloc( sizeof( TDREND_DirAtten_t ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD renderer\n" ) ); - } - if ( ( pBinRendTd->Listener_p = malloc( sizeof( TDREND_MIX_Listener_t ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD renderer\n" ) ); - } - - pBinRendTd->NumOfSrcs = 0; - pBinRendTd->MaxSrcInd = -1; - - /* Mixer spatial setup */ - pBinRendTd->TdRend_MixSpatSpec_p->UseCommonDistAttenModel = TRUE; - pBinRendTd->TdRend_MixSpatSpec_p->DistAttenModel = 0; /* 0=Turned off, else use TDREND_DIST_ATTEN_MODEL_INV_DIST_CLAMPED */ - - if ( ( error = TDREND_MIX_Init( pBinRendTd, hHrtfTD, pBinRendTd->TdRend_MixSpatSpec_p, output_Fs ) ) != IVAS_ERR_OK ) - { - return error; - } - - /* Set the attenuation (or can set MixSpatSpec.DistAttenModel above) */ - if ( ( error = TDREND_MIX_SetDistAttenModel( pBinRendTd, TDREND_DIST_ATTEN_MODEL_INV_DIST_CLAMPED ) ) != IVAS_ERR_OK ) - { - return error; - } - - /* Add sources to module and mixer, headphones */ - PosType = TDREND_POSTYPE_ABSOLUTE; /* or TDREND_POSTYPE_RELATIVE_TO_LISTENER */ - - nchan_rend = nchan_transport; - if ( ( ivas_format == MC_FORMAT ) && ( transport_config != AUDIO_CONFIG_LS_CUSTOM ) ) - { - nchan_rend--; /* Skip LFE channel -- added to the others */ - } - - for ( nS = 0; nS < nchan_rend; nS++ ) - { - if ( ( error = TDREND_MIX_AddSrc( pBinRendTd, &SrcInd[nS], PosType ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - if ( ivas_format == MC_FORMAT ) - { - switch ( transport_config ) - { - case AUDIO_CONFIG_5_1: - ls_azimuth = ls_azimuth_CICP6; - ls_elevation = ls_elevation_CICP6; - break; - case AUDIO_CONFIG_7_1: - ls_azimuth = ls_azimuth_CICP12; - ls_elevation = ls_elevation_CICP12; - break; - case AUDIO_CONFIG_5_1_2: - ls_azimuth = ls_azimuth_CICP14; - ls_elevation = ls_elevation_CICP14; - break; - case AUDIO_CONFIG_5_1_4: - ls_azimuth = ls_azimuth_CICP16; - ls_elevation = ls_elevation_CICP16; - break; - case AUDIO_CONFIG_7_1_4: - ls_azimuth = ls_azimuth_CICP19; - ls_elevation = ls_elevation_CICP19; - break; - case AUDIO_CONFIG_LS_CUSTOM: - ls_azimuth = hTransSetup.ls_azimuth; - ls_elevation = hTransSetup.ls_elevation; - break; - default: - ls_azimuth = NULL; - ls_elevation = NULL; - } - - DirAtten_p = pBinRendTd->DirAtten_p; - - for ( nS = 0; nS < nchan_rend; nS++ ) - { - /* Set source positions according to loudspeaker layout */ - angles_to_vec( 1.0f, ls_azimuth[nS], ls_elevation[nS], Pos ); - Dir[0] = 1.0f; - Dir[1] = 0.0f; - Dir[2] = 0.0f; - - /* Source directivity info */ - DirAtten_p->ConeInnerAngle = 360.0f; - DirAtten_p->ConeOuterAngle = 360.0f; - DirAtten_p->ConeOuterGain = 1.0f; - - TDREND_MIX_SRC_SetPos( pBinRendTd, nS, Pos ); - TDREND_MIX_SRC_SetDir( pBinRendTd, nS, Dir ); - TDREND_MIX_SRC_SetPlayState( pBinRendTd, nS, TDREND_PLAYSTATUS_PLAYING ); - TDREND_MIX_SRC_SetDirAtten( pBinRendTd, nS, DirAtten_p ); - } - } - if ( ivas_format == ISM_FORMAT ) - { - DirAtten_p = pBinRendTd->DirAtten_p; - if ( NULL == directivity ) - { - DirAtten_p->ConeInnerAngle = 360.0f; /* Front cone */ - DirAtten_p->ConeOuterAngle = 360.0f; /* Back cone */ - DirAtten_p->ConeOuterGain = 1.0f; /* Back attenuation */ - } - else - { - DirAtten_p->ConeInnerAngle = directivity[0]; - DirAtten_p->ConeOuterAngle = directivity[1]; - DirAtten_p->ConeOuterGain = directivity[2]; - } - - for ( nS = 0; nS < nchan_rend; nS++ ) - { - TDREND_MIX_SRC_SetDirAtten( pBinRendTd, nS, DirAtten_p ); - } - } - - *hBinRendererTd = pBinRendTd; - *binaural_latency_ns = (int32_t) ( ( *hBinRendererTd )->HrFiltSet_p->latency_s * 1000000000.f ); - - return error; -} - - -/*---------------------------------------------------------------------* - * ivas_td_binaural_close() - * - * Close TD Object binaural renderer - *---------------------------------------------------------------------*/ - -void ivas_td_binaural_close( - BINAURAL_TD_OBJECT_RENDERER_HANDLE *hBinRendererTd /* i/o: TD binaural object renderer handle */ -) -{ - if ( hBinRendererTd == NULL || *hBinRendererTd == NULL ) - { - return; - } - - free( ( *hBinRendererTd )->TdRend_MixSpatSpec_p ); - free( ( *hBinRendererTd )->DirAtten_p ); - - TDREND_MIX_Dealloc( *hBinRendererTd ); - - free( *hBinRendererTd ); - *hBinRendererTd = NULL; - - return; -} - -/*---------------------------------------------------------------------* - * ivas_td_binaural_renderer_unwrap() - * - * Call ivas_td_binaural_renderer() without st_ivas. - *---------------------------------------------------------------------*/ - -ivas_error ivas_td_binaural_renderer_unwrap( - const REVERB_HANDLE hReverb, /* i : Reverberator handle */ - const AUDIO_CONFIG transport_config, /* i : Transport configuration */ - BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD binaural object renderer handle */ - const int16_t num_src, /* i : number of sources to render */ - const int16_t lfe_idx, /* i : LFE channel index */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - ISM_METADATA_HANDLE *hIsmMetaData, /* i : ISM metadata handle */ - const int16_t Opt_Headrotation, /* i : Head rotation flag */ - const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ - const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ -#ifdef JBM_TSM_ON_TCS - float *output[], /* i/o: SCE channels / Binaural synthesis */ -#else - float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ -#endif - const int16_t output_frame /* i : output frame length */ -) -{ - int16_t subframe_length; - int16_t subframe_idx; - float reverb_signal[BINAURAL_CHANNELS][L_FRAME48k]; - ivas_error error; -#ifdef JBM_TSM_ON_TCS - float *p_reverb_signal[BINAURAL_CHANNELS]; - int16_t ch; - - for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - p_reverb_signal[ch] = reverb_signal[ch]; - } -#endif - - subframe_length = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES; - -#ifdef FIX_356_ISM_METADATA_SYNC - int16_t c_indx, nS, subframe_update; - subframe_update = 0; - c_indx = 0; - - for ( nS = 0; nS < num_src; nS++ ) - { - if ( !( ivas_format == MC_FORMAT && nS == lfe_idx ) ) /* Skip LFE for MC */ - { - hBinRendererTd->Sources[c_indx]->InputFrame_p = output[nS]; - hBinRendererTd->Sources[c_indx]->SrcRend_p->InputAvailable = TRUE; - c_indx++; - } - } -#else - /* Update object position(s) */ - TDREND_Update_object_positions( hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, output ); -#endif - - for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) - { -#ifdef FIX_356_ISM_METADATA_SYNC - if ( subframe_idx == subframe_update ) - { - /* Update object position(s) */ - TDREND_Update_object_positions( hBinRendererTd, num_src, ivas_format, hIsmMetaData ); - } -#endif - /* Update the listener's location/orientation */ - TDREND_Update_listener_orientation( hBinRendererTd, Opt_Headrotation, ( Quaternions != NULL ) ? &Quaternions[subframe_idx] : NULL, ( Pos != NULL ) ? &Pos[subframe_idx] : NULL ); - - if ( hReverb != NULL && hReverb->pConfig.roomAcoustics.late_reverb_on ) - { -#ifdef JBM_TSM_ON_TCS - if ( ( error = ivas_reverb_process( hReverb, transport_config, 0, output, p_reverb_signal, subframe_idx ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_reverb_process( hReverb, transport_config, 0, output, reverb_signal, subframe_idx ) ) != IVAS_ERR_OK ) -#endif - { - return error; - } - } - - /* Render subframe */ -#ifdef FIX_356_ISM_METADATA_SYNC - if ( ( error = TDREND_GetMix( hBinRendererTd, output, subframe_length, subframe_idx, subframe_update ) ) != IVAS_ERR_OK ) -#else - if ( ( error = TDREND_GetMix( hBinRendererTd, output, subframe_length, subframe_idx ) ) != IVAS_ERR_OK ) -#endif - { - return error; - } - } - - - if ( hReverb != NULL && hReverb->pConfig.roomAcoustics.late_reverb_on ) - { - /* add reverb to rendered signals */ - v_add( reverb_signal[0], output[0], output[0], output_frame ); - v_add( reverb_signal[1], output[1], output[1], output_frame ); - } - - return IVAS_ERR_OK; -} - - -/*---------------------------------------------------------------------* - * TDREND_GetMix() - * - * Render one 5 ms subframe from the mixer - *---------------------------------------------------------------------*/ - -ivas_error TDREND_GetMix( - BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ -#ifdef JBM_TSM_ON_TCS - float *output[], /* i/o: ISM object synth / rendered output in 0,1 */ -#else - float output[][L_FRAME48k], /* i/o: ISM object synth / rendered output in 0,1 */ -#endif - const int16_t subframe_length, /* i/o: subframe length */ - const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ -#ifdef FIX_356_ISM_METADATA_SYNC - , - const int16_t subframe_update -#endif -) -{ - int16_t i; - TDREND_SRC_t *Src_p; - TDREND_SRC_SPATIAL_t *SrcSpatial_p; - TDREND_SRC_REND_t *SrcRend_p; - ivas_error error; - float output_buf[2][L_SPATIAL_SUBFR_48k]; /* Temp buffer for left/right rendered signal */ - float hrf_left_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; - float hrf_right_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; - int16_t intp_count; -#ifdef ISM_NON_DIEGETIC_PAN - float pan_left, pan_right; -#endif -#ifdef FIX_356_ISM_METADATA_SYNC - int16_t subframe_update_flag; - subframe_update_flag = subframe_idx == subframe_update; -#endif - error = IVAS_ERR_OK; - - /* Clear the output buffer to accumulate rendered sources */ - set_f( output_buf[0], 0.0f, subframe_length ); - set_f( output_buf[1], 0.0f, subframe_length ); - - /* Clear interpolation buffers and counter */ - set_f( hrf_left_delta, 0.0f, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); - set_f( hrf_right_delta, 0.0f, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); - intp_count = 0; - - /* Create the mix */ - /* Loop through the source list and render each source */ - for ( i = 0; i < hBinRendererTd->NumOfSrcs; i++ ) - { - Src_p = hBinRendererTd->Sources[i]; - SrcSpatial_p = Src_p->SrcSpatial_p; - SrcRend_p = Src_p->SrcRend_p; - - /* Update rendering params if needed */ -#ifdef ISM_NON_DIEGETIC_PAN - if ( ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING ) && ( hBinRendererTd->Listener_p->PoseUpdated || SrcSpatial_p->Updated ) ) -#else - if ( hBinRendererTd->Listener_p->PoseUpdated || SrcSpatial_p->Updated ) -#endif - { - TDREND_SRC_REND_UpdateFiltersFromSpatialParams( hBinRendererTd, SrcRend_p, SrcSpatial_p, Src_p->hrf_left_prev, - Src_p->hrf_right_prev, hrf_left_delta, hrf_right_delta, &intp_count, &Src_p->filterlength, &Src_p->itd, &Src_p->Gain, Src_p, -#ifdef FIX_356_ISM_METADATA_SYNC - subframe_update_flag -#else - subframe_idx -#endif - ); - } - - /* Render source if needed */ - if ( ( SrcRend_p->InputAvailable == TRUE ) && ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING ) ) - { - error = TDREND_REND_RenderSourceHRFilt( Src_p, hrf_left_delta, hrf_right_delta, intp_count, output_buf, subframe_length ); - } - -#ifdef ISM_NON_DIEGETIC_PAN - if ( ( SrcRend_p->InputAvailable == TRUE ) && ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING_NON_DIEGETIC ) ) - { - pan_left = ( SrcSpatial_p->Pos_p[1] + 1.f ) * 0.5f; - pan_right = 1.f - pan_left; - v_multc_acc( &Src_p->InputFrame_p[subframe_idx * subframe_length], pan_left, output_buf[0], subframe_length ); - v_multc_acc( &Src_p->InputFrame_p[subframe_idx * subframe_length], pan_right, output_buf[1], subframe_length ); - } -#endif - } - - /* Populate output variable */ - mvr2r( output_buf[0], output[0] + subframe_idx * subframe_length, subframe_length ); /* Left */ - mvr2r( output_buf[1], output[1] + subframe_idx * subframe_length, subframe_length ); /* Right */ - - /* Clear the PoseUpdated and Source position update flags */ - TDREND_Clear_Update_flags( hBinRendererTd ); - - return error; -} - - -/*---------------------------------------------------------------------* - * TDREND_Clear_Update_flags() - * - * Initializes the audio mixer module - *---------------------------------------------------------------------*/ - -static void TDREND_Clear_Update_flags( - BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd /* i/o: TD renderer handle */ -) -{ - int16_t i; - - hBinRendererTd->Listener_p->PoseUpdated = FALSE; - - for ( i = 0; i < hBinRendererTd->NumOfSrcs; i++ ) - { - hBinRendererTd->Sources[i]->SrcSpatial_p->Updated = FALSE; - } - - return; -} - - -/*---------------------------------------------------------------------* - * TDREND_Update_object_positions() - * - * Update object position(s) - *---------------------------------------------------------------------*/ - -void TDREND_Update_object_positions( - BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o : TD Renderer handle */ - const int16_t num_src, /* i : number of sources to render */ -#ifndef FIX_356_ISM_METADATA_SYNC - const int16_t lfe_idx, /* i : Input LFE index */ -#endif - const IVAS_FORMAT in_format, /* i : Format of input sources */ - const ISM_METADATA_HANDLE *hIsmMetaData /* i : Input metadata for ISM objects */ -#ifndef FIX_356_ISM_METADATA_SYNC - , -#ifdef JBM_TSM_ON_TCS - float *output[] -#else - float output[][L_FRAME48k] /* i/o: SCE/MC channels */ -#endif -#endif -) -{ - TDREND_DirAtten_t *DirAtten_p; - int16_t nS; - float Pos[3]; - float Dir[3]; -#ifndef FIX_356_ISM_METADATA_SYNC - int16_t c_indx; -#endif - - DirAtten_p = hBinRendererTd->DirAtten_p; - - /* For each source, write the frame data to the source object*/ -#ifndef FIX_356_ISM_METADATA_SYNC - c_indx = 0; -#endif - for ( nS = 0; nS < num_src; nS++ ) - { -#ifndef FIX_356_ISM_METADATA_SYNC - if ( !( in_format == MC_FORMAT && nS == lfe_idx ) ) /* Skip LFE for MC */ - { - hBinRendererTd->Sources[c_indx]->InputFrame_p = output[nS]; - hBinRendererTd->Sources[c_indx]->SrcRend_p->InputAvailable = TRUE; - c_indx++; - } -#endif - if ( in_format == ISM_FORMAT ) - { - /* Update the source positions */ - /* Source position and direction */ - angles_to_vec( hIsmMetaData[nS]->radius, hIsmMetaData[nS]->azimuth, hIsmMetaData[nS]->elevation, Pos ); - angles_to_vec( 1.0f, hIsmMetaData[nS]->yaw, hIsmMetaData[nS]->pitch, Dir ); - -#ifndef FIX_463_TD_RENDERER_DIRECTIVITY_RESET - - /* Source directivity info */ - DirAtten_p->ConeInnerAngle = 360.0f; - DirAtten_p->ConeOuterAngle = 360.0f; - DirAtten_p->ConeOuterGain = 1.0f; -#endif - - TDREND_MIX_SRC_SetPos( hBinRendererTd, nS, Pos ); - TDREND_MIX_SRC_SetDirAtten( hBinRendererTd, nS, DirAtten_p ); - -#ifdef ISM_NON_DIEGETIC_PAN - if ( hIsmMetaData[nS]->non_diegetic_flag ) - { - Pos[0] = 0; - Pos[1] = hIsmMetaData[nS]->azimuth / 90.f; - Pos[2] = 0; - TDREND_MIX_SRC_SetPos( hBinRendererTd, nS, Pos ); - TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING_NON_DIEGETIC ); - } - else - { - TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING ); - } -#else - TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING ); -#endif - TDREND_MIX_SRC_SetDir( hBinRendererTd, nS, Dir ); - } - } - - return; -} - - -/*---------------------------------------------------------------------* - * TDREND_Update_listener_orientation() - * - * Update listener orientation (s) - *---------------------------------------------------------------------*/ - -void TDREND_Update_listener_orientation( - BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD Renderer handle */ - const int16_t headRotEnabled, /* i : Headrotation flag */ - const IVAS_QUATERNION *headPosition, /* i : Listener orientation */ - const IVAS_VECTOR3 *Pos /* i : Listener Position */ -) -{ - float FrontVec[3]; - float UpVec[3]; - float Rmat[3][3]; - float Pos_p[3]; - - if ( headRotEnabled ) - { - /* Obtain head rotation matrix */ - QuatToRotMat( *headPosition, Rmat ); - /* Apply rotation matrix to looking vector [1;0;0] */ - FrontVec[0] = Rmat[0][0]; - FrontVec[1] = Rmat[0][1]; - FrontVec[2] = Rmat[0][2]; - /* Apply rotation matrix to up vector [0;0;1] */ - UpVec[0] = Rmat[2][0]; - UpVec[1] = Rmat[2][1]; - UpVec[2] = Rmat[2][2]; - /* Input position */ - Pos_p[0] = ( *Pos ).x; - Pos_p[1] = ( *Pos ).y; - Pos_p[2] = ( *Pos ).z; - } - else - { - /* Oriented with looking vector along the x axis */ - FrontVec[0] = 1.0f; - FrontVec[1] = 0.0f; - FrontVec[2] = 0.0f; - /* Oriented with up vector along the z axis */ - UpVec[0] = 0.0f; - UpVec[1] = 0.0f; - UpVec[2] = 1.0f; - /* Listener at the origin */ - Pos_p[0] = 0.0f; - Pos_p[1] = 0.0f; - Pos_p[2] = 0.0f; - } - - /* Set the listener position and orientation:*/ - TDREND_MIX_LIST_SetPos( hBinRendererTd, Pos_p ); - TDREND_MIX_LIST_SetOrient( hBinRendererTd, FrontVec, UpVec ); - - return; -} - - -/*---------------------------------------------------------------------* - * ivas_td_binaural_open_ext() - * - * - *---------------------------------------------------------------------*/ - -ivas_error ivas_td_binaural_open_ext( - TDREND_WRAPPER *pTDRend, - IVAS_REND_AudioConfig inConfig, - RENDER_CONFIG_DATA *hRendCfg, /* i : Renderer configuration */ - LSSETUP_CUSTOM_STRUCT *customLsInput, - const int32_t outFs ) -{ - int16_t nchan_transport; - AUDIO_CONFIG transport_config; - IVAS_FORMAT ivas_format; - IVAS_OUTPUT_SETUP hTransSetup; - ivas_error error; - float *directivity = NULL; - - if ( inConfig != IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) - { - if ( ( error = getAudioConfigNumChannels( inConfig, &nchan_transport ) ) != IVAS_ERR_OK ) - { - return error; - } - } - else - { - nchan_transport = customLsInput->num_spk; - } - - transport_config = getIvasAudioConfigFromRendAudioConfig( inConfig ); - ivas_format = ( getAudioConfigType( inConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ? MC_FORMAT : ISM_FORMAT; - hTransSetup.ls_azimuth = customLsInput->ls_azimuth; - hTransSetup.ls_elevation = customLsInput->ls_elevation; - - if ( NULL != hRendCfg ) - { - directivity = hRendCfg->directivity; - } - - return ivas_td_binaural_open_unwrap( &pTDRend->hHrtfTD, outFs, nchan_transport, ivas_format, transport_config, directivity, hTransSetup, &pTDRend->hBinRendererTd, &pTDRend->binaural_latency_ns ); -} - - -/*---------------------------------------------------------------------* - * ivas_td_binaural_renderer_ext() - * - * Receives the current frames for the object streams, updates metadata - * and renders the current frame. - *---------------------------------------------------------------------*/ - -ivas_error ivas_td_binaural_renderer_ext( - const TDREND_WRAPPER *pTDRend, /* i : TD Renderer wrapper structure */ - const IVAS_REND_AudioConfig inConfig, /* i : Input audio configuration */ - const LSSETUP_CUSTOM_STRUCT *customLsInput, /* i : Input custom loudspeaker layout */ - const IVAS_REND_HeadRotData *headRotData, /* i : Input head positions */ - const IVAS_REND_AudioObjectPosition *currentPos, /* i : Object position */ - const REVERB_HANDLE hReverb, /* i : Reverberator handle */ - const int16_t output_frame, /* i : output frame length */ - float output[][L_FRAME48k] /* i/o: SCE channels / Binaural synthesis */ -) -{ - ISM_METADATA_FRAME hIsmMetaDataFrame; - ISM_METADATA_HANDLE hIsmMetaData[1]; - int16_t lfe_idx; - int16_t num_src; - IVAS_FORMAT ivas_format; - IVAS_REND_AudioConfigType inConfigType; - AUDIO_CONFIG transport_config; - ivas_error error; -#ifdef JBM_TSM_ON_TCS - float *p_output[MAX_OUTPUT_CHANNELS]; - int16_t ch; - - for ( ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++ ) - { - p_output[ch] = output[ch]; - } -#endif - - push_wmops( "ivas_td_binaural_renderer_ext" ); - - inConfigType = getAudioConfigType( inConfig ); - lfe_idx = LFE_CHANNEL; - hIsmMetaData[0] = NULL; - - if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) - { - ivas_format = MC_FORMAT; - transport_config = getIvasAudioConfigFromRendAudioConfig( inConfig ); - if ( inConfig != IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) - { - if ( ( error = getAudioConfigNumChannels( inConfig, &num_src ) ) != IVAS_ERR_OK ) - { - return error; - } - } - else - { - lfe_idx = ( customLsInput->num_lfe > 0 ) ? customLsInput->lfe_idx[0] : -1; - num_src = customLsInput->num_spk + customLsInput->num_lfe; - } - } - else - { - ivas_format = ISM_FORMAT; - num_src = 1; - transport_config = AUDIO_CONFIG_ISM1; - hIsmMetaData[0] = &hIsmMetaDataFrame; - hIsmMetaData[0]->azimuth = currentPos->azimuth; - hIsmMetaData[0]->elevation = currentPos->elevation; - hIsmMetaData[0]->yaw = currentPos->yaw; - hIsmMetaData[0]->pitch = currentPos->pitch; - hIsmMetaData[0]->radius = currentPos->radius; -#ifdef ISM_NON_DIEGETIC_PAN - hIsmMetaData[0]->non_diegetic_flag = currentPos->non_diegetic_flag; -#endif - } - -#ifdef JBM_TSM_ON_TCS - if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, - ( headRotData != NULL ) ? headRotData->headPositions : NULL, - ( headRotData != NULL ) ? headRotData->Pos : NULL, p_output, output_frame ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, - ( headRotData != NULL ) ? headRotData->headPositions : NULL, - ( headRotData != NULL ) ? headRotData->Pos : NULL, output, output_frame ) ) != IVAS_ERR_OK ) - -#endif - { - return error; - } - - pop_wmops(); - - return IVAS_ERR_OK; -} - -/*---------------------------------------------------------------------* - * angles_to_vec() - * - * Convert azimuth and elevation angles to position/orientation vector - *---------------------------------------------------------------------*/ - -static void angles_to_vec( - const float radius, /* i : radius */ - const float azimuth, /* i : Azimuth angle */ - const float elevation, /* i : Elevation angle */ - float *vec /* o : Pos/Dir vector */ -) -{ - vec[0] = radius * cosf( elevation * PI_OVER_180 ) * cosf( azimuth * PI_OVER_180 ); - vec[1] = radius * cosf( elevation * PI_OVER_180 ) * sinf( azimuth * PI_OVER_180 ); - vec[2] = radius * sinf( elevation * PI_OVER_180 ); - - return; -} -- GitLab From a3c49f124f51332598a608d5b343144549b8b760 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 17 May 2023 16:31:27 +0200 Subject: [PATCH 210/331] Change FIX_462_HRTF_FILE_BR_SWITCH_MEM_ERR such that it does not deallocate HRTFs loaded from file --- lib_dec/ivas_ism_dec.c | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index a09efdb92f..4a4da1c1e8 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -41,9 +41,6 @@ #include "debug.h" #endif #include "wmc_auto.h" -#ifdef FIX_462_HRTF_FILE_BR_SWITCH_MEM_ERR -#include "hrtf_file_reader.h" -#endif /*-------------------------------------------------------------------------* * ivas_ism_bitrate_switching() @@ -196,10 +193,20 @@ static ivas_error ivas_ism_bitrate_switching( ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); /* Open the TD Binaural renderer */ +#ifdef FIX_462_HRTF_FILE_BR_SWITCH_MEM_ERR + if ( st_ivas->hHrtfTD == NULL ) + { + if ( ( error = ivas_td_binaural_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } +#else if ( ( error = ivas_td_binaural_open( st_ivas ) ) != IVAS_ERR_OK ) { return error; } +#endif } else { @@ -263,8 +270,19 @@ static ivas_error ivas_ism_bitrate_switching( /* Close the TD Binaural renderer */ #ifdef FIX_462_HRTF_FILE_BR_SWITCH_MEM_ERR - dealloc_HRTF_binary( st_ivas->hBinRendererTd->HrFiltSet_p ); -#endif + if ( st_ivas->hBinRendererTd->HrFiltSet_p->ModelParams.modelROM == TRUE ) + { + if ( st_ivas->hBinRendererTd != NULL ) + { + ivas_td_binaural_close( &st_ivas->hBinRendererTd ); + } + + if ( st_ivas->hHrtfTD != NULL ) + { + st_ivas->hHrtfTD = NULL; + } + } +#else if ( st_ivas->hBinRendererTd != NULL ) { ivas_td_binaural_close( &st_ivas->hBinRendererTd ); @@ -274,6 +292,7 @@ static ivas_error ivas_ism_bitrate_switching( { st_ivas->hHrtfTD = NULL; } +#endif } else { -- GitLab From b4912c8d602b2ecaabeeb19120ff165ddebca974 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 17 May 2023 16:33:38 +0200 Subject: [PATCH 211/331] introduce "hodirac_flag" in functions with multiple calls of ivas_get_hodirac_flag() --- lib_dec/ivas_dirac_dec.c | 3 +-- lib_dec/ivas_jbm_dec.c | 10 ++++++++-- lib_enc/ivas_spar_encoder.c | 15 ++++++++++----- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 2801c9c146..0921137856 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -295,7 +295,6 @@ ivas_error ivas_dirac_dec_config( hodirac_flag = ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ); #endif - if ( flag_config == DIRAC_RECONFIGURE ) { hDirAC = st_ivas->hDirAC; @@ -528,7 +527,7 @@ ivas_error ivas_dirac_dec_config( if ( nchan_transport_orig > 2 && hDirAC->hOutSetup.is_loudspeaker_setup && st_ivas->renderer_type == RENDERER_DIRAC #ifdef FIX_DIRAC_LS_SYNTHESIS_CONFIG - && !ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) + && !hodirac_flag #endif ) { diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 6c32c6bc88..c94ef4e667 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -69,6 +69,9 @@ ivas_error ivas_jbm_dec_tc( Decoder_State *st; /* used for bitstream handling */ float output[MAX_TRANSPORT_CHANNELS][L_FRAME48k]; /* 'float' buffer for transport channels, MAX_TRANSPORT_CHANNELS channels */ /* IVAS_fmToDo: buffer can be allocated dynamically based on the actual number of output channels */ int16_t nchan_remapped; +#ifdef HODIRAC + int16_t hodirac_flag; +#endif float output_lfe_ch[L_FRAME48k]; int16_t nb_bits_metadata[MAX_SCE]; int32_t output_Fs, ivas_total_brate; @@ -88,6 +91,9 @@ ivas_error ivas_jbm_dec_tc( nchan_out = st_ivas->hTcBuffer->nchan_transport_jbm; output_config = st_ivas->hDecoderConfig->output_config; ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; +#ifdef HODIRAC + hodirac_flag = ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ); +#endif output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC ); @@ -192,7 +198,7 @@ ivas_error ivas_jbm_dec_tc( { ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, #ifdef HODIRAC - ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ), + hodirac_flag, #endif 0 ); } @@ -217,7 +223,7 @@ ivas_error ivas_jbm_dec_tc( &nb_bits_metadata[0], st_ivas->sba_mode, #ifdef HODIRAC - ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ), + hodirac_flag, #endif st_ivas->hSpar->dirac_to_spar_md_bands ); } diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 3d6280fcf9..fa3350aee1 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -429,10 +429,11 @@ static ivas_error ivas_spar_enc_process( float pcm_tmp[IVAS_SPAR_MAX_CH][L_FRAME48k * 2]; float *p_pcm_tmp[IVAS_SPAR_MAX_CH]; #endif - int16_t i, j, b, i_ts, input_frame, dtx_vad; int16_t transient_det[2]; - +#ifdef HODIRAC + int16_t hodirac_flag; +#endif int32_t ivas_total_brate, input_Fs; float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; float *cov_dtx_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; @@ -605,12 +606,16 @@ static ivas_error ivas_spar_enc_process( /*-----------------------------------------------------------------------------------------* * DirAC encoding *-----------------------------------------------------------------------------------------*/ + /*tyagiri: TODO: HODIRAC should be disabled for 256 kbps and outputs should be BE w.r.t baseline*/ +#ifdef HODIRAC + hodirac_flag = ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ); +#endif + ivas_dirac_param_est_enc( st_ivas->hDirAC, hQMetaData->q_direction, hQMetaData->useLowerRes, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, st_ivas->sba_mode #ifdef HODIRAC , - ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ), - ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ? HOA2_CHANNELS : FOA_CHANNELS + hodirac_flag, hodirac_flag ? HOA2_CHANNELS : FOA_CHANNELS #endif ); @@ -626,7 +631,7 @@ static ivas_error ivas_spar_enc_process( ivas_qmetadata_enc_encode( hMetaData, hQMetaData #ifdef HODIRAC , - ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) + hodirac_flag #endif ); } -- GitLab From 6718d738d46192a082b98d858c535ed1ba37e909 Mon Sep 17 00:00:00 2001 From: Sumeyra Kanik Date: Wed, 17 May 2023 17:20:29 +0200 Subject: [PATCH 212/331] =?UTF-8?q?Delay=20=C3=ADsm=20metadata=20only=20fo?= =?UTF-8?q?r=20decoder/renderer,=20not=20for=20Ivas=5Frend?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib_dec/ivas_objectRenderer_internal.c | 11 +++++++++- lib_rend/ivas_objectRenderer.c | 30 ++++++++++++++++++++------ lib_rend/ivas_prot_rend.h | 3 +++ 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index 47f950a550..0867bf22ce 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -75,12 +75,21 @@ ivas_error ivas_td_binaural_renderer( const int16_t output_frame /* i : output frame length */ ) { +#ifdef FIX_356_ISM_METADATA_SYNC + int16_t ism_md_subframe_update = 2; return ivas_td_binaural_renderer_unwrap( + st_ivas->hReverb, + st_ivas->transport_config, + st_ivas->hBinRendererTd, st_ivas->nchan_transport, LFE_CHANNEL, st_ivas->ivas_format, + st_ivas->hIsmMetaData, st_ivas->hDecoderConfig->Opt_Headrotation, (st_ivas->hHeadTrackData != NULL) ? st_ivas->hHeadTrackData->Quaternions : NULL, + (st_ivas->hHeadTrackData != NULL) ? st_ivas->hHeadTrackData->Pos : NULL, ism_md_subframe_update, output, output_frame); +#else return ivas_td_binaural_renderer_unwrap( st_ivas->hReverb, st_ivas->transport_config, st_ivas->hBinRendererTd, st_ivas->nchan_transport, LFE_CHANNEL, st_ivas->ivas_format, st_ivas->hIsmMetaData, st_ivas->hDecoderConfig->Opt_Headrotation, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Quaternions : NULL, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Pos : NULL, output, output_frame ); +#endif } #ifdef JBM_TSM_ON_TCS @@ -103,7 +112,7 @@ void ObjRenderIVASSubframe( float *tc_local[MAX_TRANSPORT_CHANNELS]; int16_t ch, slot_size, slots_to_render, output_frame; #ifdef FIX_356_ISM_METADATA_SYNC - int16_t subframe_update = 0; + int16_t subframe_update = 0; /* Number of subframes to delay metadata to sync with audio */ #endif for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 36e187870f..3db591d094 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -265,6 +265,9 @@ ivas_error ivas_td_binaural_renderer_unwrap( const int16_t Opt_Headrotation, /* i : Head rotation flag */ const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ +#ifdef FIX_356_ISM_METADATA_SYNC + const int16_t ism_md_subframe_update, /* i: Number of subframes to delay ism metadata to sync with audio */ +#endif #ifdef JBM_TSM_ON_TCS float *output[], /* i/o: SCE channels / Binaural synthesis */ #else @@ -290,8 +293,7 @@ ivas_error ivas_td_binaural_renderer_unwrap( subframe_length = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES; #ifdef FIX_356_ISM_METADATA_SYNC - int16_t c_indx, nS, subframe_update; - subframe_update = 0; + int16_t c_indx, nS; c_indx = 0; for ( nS = 0; nS < num_src; nS++ ) @@ -311,7 +313,7 @@ ivas_error ivas_td_binaural_renderer_unwrap( for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) { #ifdef FIX_356_ISM_METADATA_SYNC - if ( subframe_idx == subframe_update ) + if ( subframe_idx == ism_md_subframe_update ) { /* Update object position(s) */ TDREND_Update_object_positions( hBinRendererTd, num_src, ivas_format, hIsmMetaData ); @@ -334,7 +336,7 @@ ivas_error ivas_td_binaural_renderer_unwrap( /* Render subframe */ #ifdef FIX_356_ISM_METADATA_SYNC - if ( ( error = TDREND_GetMix( hBinRendererTd, output, subframe_length, subframe_idx, subframe_update ) ) != IVAS_ERR_OK ) + if ( ( error = TDREND_GetMix( hBinRendererTd, output, subframe_length, subframe_idx, ism_md_subframe_update ) ) != IVAS_ERR_OK ) #else if ( ( error = TDREND_GetMix( hBinRendererTd, output, subframe_length, subframe_idx ) ) != IVAS_ERR_OK ) #endif @@ -372,7 +374,7 @@ ivas_error TDREND_GetMix( const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ #ifdef FIX_356_ISM_METADATA_SYNC , - const int16_t subframe_update + const int16_t ism_md_subframe_update /* Number of subframes to delay ism metadata to sync with audio */ #endif ) { @@ -390,7 +392,7 @@ ivas_error TDREND_GetMix( #endif #ifdef FIX_356_ISM_METADATA_SYNC int16_t subframe_update_flag; - subframe_update_flag = subframe_idx == subframe_update; + subframe_update_flag = subframe_idx == ism_md_subframe_update; #endif error = IVAS_ERR_OK; @@ -700,6 +702,9 @@ ivas_error ivas_td_binaural_renderer_ext( IVAS_REND_AudioConfigType inConfigType; AUDIO_CONFIG transport_config; ivas_error error; +#ifdef FIX_356_ISM_METADATA_SYNC + int16_t ism_md_subframe_update = 0; +#endif #ifdef JBM_TSM_ON_TCS float *p_output[MAX_OUTPUT_CHANNELS]; int16_t ch; @@ -750,14 +755,25 @@ ivas_error ivas_td_binaural_renderer_ext( } #ifdef JBM_TSM_ON_TCS +#ifdef FIX_356_ISM_METADATA_SYNC + if( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, + ( headRotData != NULL ) ? headRotData->headPositions : NULL, + ( headRotData != NULL ) ? headRotData->Pos : NULL, ism_md_subframe_update, p_output, output_frame ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, ( headRotData != NULL ) ? headRotData->headPositions : NULL, ( headRotData != NULL ) ? headRotData->Pos : NULL, p_output, output_frame ) ) != IVAS_ERR_OK ) +#endif +#else +#ifdef FIX_356_ISM_METADATA_SYNC + if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, + ( headRotData != NULL ) ? headRotData->headPositions : NULL, + ( headRotData != NULL ) ? headRotData->Pos : NULL, ism_md_subframe_update, output, output_frame ) ) != IVAS_ERR_OK ) #else if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, ( headRotData != NULL ) ? headRotData->headPositions : NULL, ( headRotData != NULL ) ? headRotData->Pos : NULL, output, output_frame ) ) != IVAS_ERR_OK ) - +#endif #endif { return error; diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 6a4f8fb125..9de3ca2345 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -246,6 +246,9 @@ ivas_error ivas_td_binaural_renderer_unwrap( const int16_t Opt_Headrotation, /* i : Head rotation flag */ const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ +#ifdef FIX_356_ISM_METADATA_SYNC + const int16_t ism_md_subframe_update, +#endif #ifdef JBM_TSM_ON_TCS float *output[], /* i/o: SCE channels / Binaural synthesis */ #else -- GitLab From fce08feb09356dccdd40b4433eb07b460f45e5b5 Mon Sep 17 00:00:00 2001 From: Sumeyra Kanik Date: Wed, 17 May 2023 17:26:44 +0200 Subject: [PATCH 213/331] Format fix --- lib_dec/ivas_objectRenderer_internal.c | 11 ++++++----- lib_rend/ivas_prot_rend.h | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index 0867bf22ce..3f7d05a07a 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -81,9 +81,10 @@ ivas_error ivas_td_binaural_renderer( st_ivas->hReverb, st_ivas->transport_config, st_ivas->hBinRendererTd, st_ivas->nchan_transport, LFE_CHANNEL, st_ivas->ivas_format, - st_ivas->hIsmMetaData, st_ivas->hDecoderConfig->Opt_Headrotation, (st_ivas->hHeadTrackData != NULL) ? st_ivas->hHeadTrackData->Quaternions : NULL, - (st_ivas->hHeadTrackData != NULL) ? st_ivas->hHeadTrackData->Pos : NULL, ism_md_subframe_update, output, output_frame); -#else return ivas_td_binaural_renderer_unwrap( + st_ivas->hIsmMetaData, st_ivas->hDecoderConfig->Opt_Headrotation, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Quaternions : NULL, + ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Pos : NULL, ism_md_subframe_update, output, output_frame ); +#else + return ivas_td_binaural_renderer_unwrap( st_ivas->hReverb, st_ivas->transport_config, st_ivas->hBinRendererTd, st_ivas->nchan_transport, LFE_CHANNEL, st_ivas->ivas_format, @@ -112,7 +113,7 @@ void ObjRenderIVASSubframe( float *tc_local[MAX_TRANSPORT_CHANNELS]; int16_t ch, slot_size, slots_to_render, output_frame; #ifdef FIX_356_ISM_METADATA_SYNC - int16_t subframe_update = 0; /* Number of subframes to delay metadata to sync with audio */ + int16_t ism_md_subframe_update = 0; /* Number of subframes to delay metadata to sync with audio */ #endif for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { @@ -162,7 +163,7 @@ void ObjRenderIVASSubframe( /* Render subframe */ #ifdef FIX_356_ISM_METADATA_SYNC - TDREND_GetMix( st_ivas->hBinRendererTd, output_f_local, output_frame, 0, subframe_update ); + TDREND_GetMix( st_ivas->hBinRendererTd, output_f_local, output_frame, 0, ism_md_subframe_update ); #else TDREND_GetMix( st_ivas->hBinRendererTd, output_f_local, output_frame, 0 ); #endif diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 9de3ca2345..03131430ed 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -304,7 +304,7 @@ ivas_error TDREND_GetMix( const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ #ifdef FIX_356_ISM_METADATA_SYNC , - const int16_t subframe_update /* Number of subframes to delay metadata to sync with audio */ + const int16_t ism_md_subframe_update /* Number of subframes to delay metadata to sync with audio */ #endif ); -- GitLab From 9be6e473e600dd29551e519bc1369d708734cd70 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 17 May 2023 17:31:30 +0200 Subject: [PATCH 214/331] Fix for HRTF external file rate switching, when bit rate starts below TD renderer bit rate --- lib_dec/ivas_ism_dec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index 4a4da1c1e8..b8a97ad846 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -194,7 +194,7 @@ static ivas_error ivas_ism_bitrate_switching( /* Open the TD Binaural renderer */ #ifdef FIX_462_HRTF_FILE_BR_SWITCH_MEM_ERR - if ( st_ivas->hHrtfTD == NULL ) + if ( st_ivas->hHrtfTD == NULL || st_ivas->hBinRendererTd == NULL ) { if ( ( error = ivas_td_binaural_open( st_ivas ) ) != IVAS_ERR_OK ) { -- GitLab From 27d36320b54c6fb2d5359c352f9149c17c86f1b9 Mon Sep 17 00:00:00 2001 From: Sumeyra Kanik Date: Wed, 17 May 2023 17:39:32 +0200 Subject: [PATCH 215/331] Format fix --- lib_rend/ivas_objectRenderer.c | 805 +++++++++++++++++++++++++++++++++ 1 file changed, 805 insertions(+) diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 3db591d094..0eec81b692 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -803,3 +803,808 @@ static void angles_to_vec( return; } +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "ivas_stat_rend.h" +#include +#include "options.h" +#include "prot.h" +#ifdef ISM_NON_DIEGETIC_PAN +#include "ivas_prot.h" +#endif +#include "ivas_prot_rend.h" +#include +#include "ivas_rom_com.h" +#ifdef DEBUGGING +#include "debug.h" +#endif +#include "wmc_auto.h" + + +/*---------------------------------------------------------------------* + * Local function prototypes + *---------------------------------------------------------------------*/ + + +static void TDREND_Clear_Update_flags( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd ); + +static void angles_to_vec( const float radius, const float azimuth, const float elevation, float *vec ); + + +/*---------------------------------------------------------------------* + * ivas_td_binaural_open_unwrap() + * + * Call TD open/init function without st_ivas + *---------------------------------------------------------------------*/ + +ivas_error ivas_td_binaural_open_unwrap( + TDREND_HRFILT_FiltSet_t **hHrtfTD, /* i/o: HR filter model (from file or NULL) */ + const int32_t output_Fs, /* i : Output sampling rate */ + const int16_t nchan_transport, /* i : Number of channels */ + const IVAS_FORMAT ivas_format, /* i : IVAS format (ISM/MC) */ + const AUDIO_CONFIG transport_config, /* i : Transport configuration */ + const float *directivity, /* i : Directivity pattern (used for ISM) */ + const IVAS_OUTPUT_SETUP hTransSetup, /* i : Loudspeaker layout */ + BINAURAL_TD_OBJECT_RENDERER_HANDLE *hBinRendererTd, /* o : TD renderer handle */ + int32_t *binaural_latency_ns /* i : Binauralization delay */ +) +{ + BINAURAL_TD_OBJECT_RENDERER_HANDLE pBinRendTd; + TDREND_PosType_t PosType; + int16_t nS; + int16_t SrcInd[MAX_NUM_TDREND_CHANNELS]; + const float *ls_azimuth, *ls_elevation; + float Pos[3]; + float Dir[3]; + TDREND_DirAtten_t *DirAtten_p; + int16_t nchan_rend; + ivas_error error; + + error = IVAS_ERR_OK; + + if ( ( pBinRendTd = malloc( sizeof( BINAURAL_TD_OBJECT_RENDERER ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD renderer\n" ) ); + } + if ( ( pBinRendTd->TdRend_MixSpatSpec_p = malloc( sizeof( TDREND_MixSpatSpec_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD renderer\n" ) ); + } + if ( ( pBinRendTd->DirAtten_p = malloc( sizeof( TDREND_DirAtten_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD renderer\n" ) ); + } + if ( ( pBinRendTd->Listener_p = malloc( sizeof( TDREND_MIX_Listener_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD renderer\n" ) ); + } + + pBinRendTd->NumOfSrcs = 0; + pBinRendTd->MaxSrcInd = -1; + + /* Mixer spatial setup */ + pBinRendTd->TdRend_MixSpatSpec_p->UseCommonDistAttenModel = TRUE; + pBinRendTd->TdRend_MixSpatSpec_p->DistAttenModel = 0; /* 0=Turned off, else use TDREND_DIST_ATTEN_MODEL_INV_DIST_CLAMPED */ + + if ( ( error = TDREND_MIX_Init( pBinRendTd, hHrtfTD, pBinRendTd->TdRend_MixSpatSpec_p, output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Set the attenuation (or can set MixSpatSpec.DistAttenModel above) */ + if ( ( error = TDREND_MIX_SetDistAttenModel( pBinRendTd, TDREND_DIST_ATTEN_MODEL_INV_DIST_CLAMPED ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Add sources to module and mixer, headphones */ + PosType = TDREND_POSTYPE_ABSOLUTE; /* or TDREND_POSTYPE_RELATIVE_TO_LISTENER */ + + nchan_rend = nchan_transport; + if ( ( ivas_format == MC_FORMAT ) && ( transport_config != AUDIO_CONFIG_LS_CUSTOM ) ) + { + nchan_rend--; /* Skip LFE channel -- added to the others */ + } + + for ( nS = 0; nS < nchan_rend; nS++ ) + { + if ( ( error = TDREND_MIX_AddSrc( pBinRendTd, &SrcInd[nS], PosType ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( ivas_format == MC_FORMAT ) + { + switch ( transport_config ) + { + case AUDIO_CONFIG_5_1: + ls_azimuth = ls_azimuth_CICP6; + ls_elevation = ls_elevation_CICP6; + break; + case AUDIO_CONFIG_7_1: + ls_azimuth = ls_azimuth_CICP12; + ls_elevation = ls_elevation_CICP12; + break; + case AUDIO_CONFIG_5_1_2: + ls_azimuth = ls_azimuth_CICP14; + ls_elevation = ls_elevation_CICP14; + break; + case AUDIO_CONFIG_5_1_4: + ls_azimuth = ls_azimuth_CICP16; + ls_elevation = ls_elevation_CICP16; + break; + case AUDIO_CONFIG_7_1_4: + ls_azimuth = ls_azimuth_CICP19; + ls_elevation = ls_elevation_CICP19; + break; + case AUDIO_CONFIG_LS_CUSTOM: + ls_azimuth = hTransSetup.ls_azimuth; + ls_elevation = hTransSetup.ls_elevation; + break; + default: + ls_azimuth = NULL; + ls_elevation = NULL; + } + + DirAtten_p = pBinRendTd->DirAtten_p; + + for ( nS = 0; nS < nchan_rend; nS++ ) + { + /* Set source positions according to loudspeaker layout */ + angles_to_vec( 1.0f, ls_azimuth[nS], ls_elevation[nS], Pos ); + Dir[0] = 1.0f; + Dir[1] = 0.0f; + Dir[2] = 0.0f; + + /* Source directivity info */ + DirAtten_p->ConeInnerAngle = 360.0f; + DirAtten_p->ConeOuterAngle = 360.0f; + DirAtten_p->ConeOuterGain = 1.0f; + + TDREND_MIX_SRC_SetPos( pBinRendTd, nS, Pos ); + TDREND_MIX_SRC_SetDir( pBinRendTd, nS, Dir ); + TDREND_MIX_SRC_SetPlayState( pBinRendTd, nS, TDREND_PLAYSTATUS_PLAYING ); + TDREND_MIX_SRC_SetDirAtten( pBinRendTd, nS, DirAtten_p ); + } + } + if ( ivas_format == ISM_FORMAT ) + { + DirAtten_p = pBinRendTd->DirAtten_p; + if ( NULL == directivity ) + { + DirAtten_p->ConeInnerAngle = 360.0f; /* Front cone */ + DirAtten_p->ConeOuterAngle = 360.0f; /* Back cone */ + DirAtten_p->ConeOuterGain = 1.0f; /* Back attenuation */ + } + else + { + DirAtten_p->ConeInnerAngle = directivity[0]; + DirAtten_p->ConeOuterAngle = directivity[1]; + DirAtten_p->ConeOuterGain = directivity[2]; + } + + for ( nS = 0; nS < nchan_rend; nS++ ) + { + TDREND_MIX_SRC_SetDirAtten( pBinRendTd, nS, DirAtten_p ); + } + } + + *hBinRendererTd = pBinRendTd; + *binaural_latency_ns = (int32_t) ( ( *hBinRendererTd )->HrFiltSet_p->latency_s * 1000000000.f ); + + return error; +} + + +/*---------------------------------------------------------------------* + * ivas_td_binaural_close() + * + * Close TD Object binaural renderer + *---------------------------------------------------------------------*/ + +void ivas_td_binaural_close( + BINAURAL_TD_OBJECT_RENDERER_HANDLE *hBinRendererTd /* i/o: TD binaural object renderer handle */ +) +{ + if ( hBinRendererTd == NULL || *hBinRendererTd == NULL ) + { + return; + } + + free( ( *hBinRendererTd )->TdRend_MixSpatSpec_p ); + free( ( *hBinRendererTd )->DirAtten_p ); + + TDREND_MIX_Dealloc( *hBinRendererTd ); + + free( *hBinRendererTd ); + *hBinRendererTd = NULL; + + return; +} + +/*---------------------------------------------------------------------* + * ivas_td_binaural_renderer_unwrap() + * + * Call ivas_td_binaural_renderer() without st_ivas. + *---------------------------------------------------------------------*/ + +ivas_error ivas_td_binaural_renderer_unwrap( + const REVERB_HANDLE hReverb, /* i : Reverberator handle */ + const AUDIO_CONFIG transport_config, /* i : Transport configuration */ + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD binaural object renderer handle */ + const int16_t num_src, /* i : number of sources to render */ + const int16_t lfe_idx, /* i : LFE channel index */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + ISM_METADATA_HANDLE *hIsmMetaData, /* i : ISM metadata handle */ + const int16_t Opt_Headrotation, /* i : Head rotation flag */ + const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ + const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ +#ifdef FIX_356_ISM_METADATA_SYNC + const int16_t ism_md_subframe_update, /* i: Number of subframes to delay ism metadata to sync with audio */ +#endif +#ifdef JBM_TSM_ON_TCS + float *output[], /* i/o: SCE channels / Binaural synthesis */ +#else + float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ +#endif + const int16_t output_frame /* i : output frame length */ +) +{ + int16_t subframe_length; + int16_t subframe_idx; + float reverb_signal[BINAURAL_CHANNELS][L_FRAME48k]; + ivas_error error; +#ifdef JBM_TSM_ON_TCS + float *p_reverb_signal[BINAURAL_CHANNELS]; + int16_t ch; + + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + p_reverb_signal[ch] = reverb_signal[ch]; + } +#endif + + subframe_length = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES; + +#ifdef FIX_356_ISM_METADATA_SYNC + int16_t c_indx, nS; + c_indx = 0; + + for ( nS = 0; nS < num_src; nS++ ) + { + if ( !( ivas_format == MC_FORMAT && nS == lfe_idx ) ) /* Skip LFE for MC */ + { + hBinRendererTd->Sources[c_indx]->InputFrame_p = output[nS]; + hBinRendererTd->Sources[c_indx]->SrcRend_p->InputAvailable = TRUE; + c_indx++; + } + } +#else + /* Update object position(s) */ + TDREND_Update_object_positions( hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, output ); +#endif + + for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) + { +#ifdef FIX_356_ISM_METADATA_SYNC + if ( subframe_idx == ism_md_subframe_update ) + { + /* Update object position(s) */ + TDREND_Update_object_positions( hBinRendererTd, num_src, ivas_format, hIsmMetaData ); + } +#endif + /* Update the listener's location/orientation */ + TDREND_Update_listener_orientation( hBinRendererTd, Opt_Headrotation, ( Quaternions != NULL ) ? &Quaternions[subframe_idx] : NULL, ( Pos != NULL ) ? &Pos[subframe_idx] : NULL ); + + if ( hReverb != NULL && hReverb->pConfig.roomAcoustics.late_reverb_on ) + { +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_reverb_process( hReverb, transport_config, 0, output, p_reverb_signal, subframe_idx ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_reverb_process( hReverb, transport_config, 0, output, reverb_signal, subframe_idx ) ) != IVAS_ERR_OK ) +#endif + { + return error; + } + } + + /* Render subframe */ +#ifdef FIX_356_ISM_METADATA_SYNC + if ( ( error = TDREND_GetMix( hBinRendererTd, output, subframe_length, subframe_idx, ism_md_subframe_update ) ) != IVAS_ERR_OK ) +#else + if ( ( error = TDREND_GetMix( hBinRendererTd, output, subframe_length, subframe_idx ) ) != IVAS_ERR_OK ) +#endif + { + return error; + } + } + + + if ( hReverb != NULL && hReverb->pConfig.roomAcoustics.late_reverb_on ) + { + /* add reverb to rendered signals */ + v_add( reverb_signal[0], output[0], output[0], output_frame ); + v_add( reverb_signal[1], output[1], output[1], output_frame ); + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * TDREND_GetMix() + * + * Render one 5 ms subframe from the mixer + *---------------------------------------------------------------------*/ + +ivas_error TDREND_GetMix( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ +#ifdef JBM_TSM_ON_TCS + float *output[], /* i/o: ISM object synth / rendered output in 0,1 */ +#else + float output[][L_FRAME48k], /* i/o: ISM object synth / rendered output in 0,1 */ +#endif + const int16_t subframe_length, /* i/o: subframe length */ + const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ +#ifdef FIX_356_ISM_METADATA_SYNC + , + const int16_t ism_md_subframe_update /* Number of subframes to delay ism metadata to sync with audio */ +#endif +) +{ + int16_t i; + TDREND_SRC_t *Src_p; + TDREND_SRC_SPATIAL_t *SrcSpatial_p; + TDREND_SRC_REND_t *SrcRend_p; + ivas_error error; + float output_buf[2][L_SPATIAL_SUBFR_48k]; /* Temp buffer for left/right rendered signal */ + float hrf_left_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; + float hrf_right_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; + int16_t intp_count; +#ifdef ISM_NON_DIEGETIC_PAN + float pan_left, pan_right; +#endif +#ifdef FIX_356_ISM_METADATA_SYNC + int16_t subframe_update_flag; + subframe_update_flag = subframe_idx == ism_md_subframe_update; +#endif + error = IVAS_ERR_OK; + + /* Clear the output buffer to accumulate rendered sources */ + set_f( output_buf[0], 0.0f, subframe_length ); + set_f( output_buf[1], 0.0f, subframe_length ); + + /* Clear interpolation buffers and counter */ + set_f( hrf_left_delta, 0.0f, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); + set_f( hrf_right_delta, 0.0f, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); + intp_count = 0; + + /* Create the mix */ + /* Loop through the source list and render each source */ + for ( i = 0; i < hBinRendererTd->NumOfSrcs; i++ ) + { + Src_p = hBinRendererTd->Sources[i]; + SrcSpatial_p = Src_p->SrcSpatial_p; + SrcRend_p = Src_p->SrcRend_p; + + /* Update rendering params if needed */ +#ifdef ISM_NON_DIEGETIC_PAN + if ( ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING ) && ( hBinRendererTd->Listener_p->PoseUpdated || SrcSpatial_p->Updated ) ) +#else + if ( hBinRendererTd->Listener_p->PoseUpdated || SrcSpatial_p->Updated ) +#endif + { + TDREND_SRC_REND_UpdateFiltersFromSpatialParams( hBinRendererTd, SrcRend_p, SrcSpatial_p, Src_p->hrf_left_prev, + Src_p->hrf_right_prev, hrf_left_delta, hrf_right_delta, &intp_count, &Src_p->filterlength, &Src_p->itd, &Src_p->Gain, Src_p, +#ifdef FIX_356_ISM_METADATA_SYNC + subframe_update_flag +#else + subframe_idx +#endif + ); + } + + /* Render source if needed */ + if ( ( SrcRend_p->InputAvailable == TRUE ) && ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING ) ) + { + error = TDREND_REND_RenderSourceHRFilt( Src_p, hrf_left_delta, hrf_right_delta, intp_count, output_buf, subframe_length ); + } + +#ifdef ISM_NON_DIEGETIC_PAN + if ( ( SrcRend_p->InputAvailable == TRUE ) && ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING_NON_DIEGETIC ) ) + { + pan_left = ( SrcSpatial_p->Pos_p[1] + 1.f ) * 0.5f; + pan_right = 1.f - pan_left; + v_multc_acc( &Src_p->InputFrame_p[subframe_idx * subframe_length], pan_left, output_buf[0], subframe_length ); + v_multc_acc( &Src_p->InputFrame_p[subframe_idx * subframe_length], pan_right, output_buf[1], subframe_length ); + } +#endif + } + + /* Populate output variable */ + mvr2r( output_buf[0], output[0] + subframe_idx * subframe_length, subframe_length ); /* Left */ + mvr2r( output_buf[1], output[1] + subframe_idx * subframe_length, subframe_length ); /* Right */ + + /* Clear the PoseUpdated and Source position update flags */ + TDREND_Clear_Update_flags( hBinRendererTd ); + + return error; +} + + +/*---------------------------------------------------------------------* + * TDREND_Clear_Update_flags() + * + * Initializes the audio mixer module + *---------------------------------------------------------------------*/ + +static void TDREND_Clear_Update_flags( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd /* i/o: TD renderer handle */ +) +{ + int16_t i; + + hBinRendererTd->Listener_p->PoseUpdated = FALSE; + + for ( i = 0; i < hBinRendererTd->NumOfSrcs; i++ ) + { + hBinRendererTd->Sources[i]->SrcSpatial_p->Updated = FALSE; + } + + return; +} + + +/*---------------------------------------------------------------------* + * TDREND_Update_object_positions() + * + * Update object position(s) + *---------------------------------------------------------------------*/ + +void TDREND_Update_object_positions( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o : TD Renderer handle */ + const int16_t num_src, /* i : number of sources to render */ +#ifndef FIX_356_ISM_METADATA_SYNC + const int16_t lfe_idx, /* i : Input LFE index */ +#endif + const IVAS_FORMAT in_format, /* i : Format of input sources */ + const ISM_METADATA_HANDLE *hIsmMetaData /* i : Input metadata for ISM objects */ +#ifndef FIX_356_ISM_METADATA_SYNC + , +#ifdef JBM_TSM_ON_TCS + float *output[] +#else + float output[][L_FRAME48k] /* i/o: SCE/MC channels */ +#endif +#endif +) +{ + TDREND_DirAtten_t *DirAtten_p; + int16_t nS; + float Pos[3]; + float Dir[3]; +#ifndef FIX_356_ISM_METADATA_SYNC + int16_t c_indx; +#endif + + DirAtten_p = hBinRendererTd->DirAtten_p; + + /* For each source, write the frame data to the source object*/ +#ifndef FIX_356_ISM_METADATA_SYNC + c_indx = 0; +#endif + for ( nS = 0; nS < num_src; nS++ ) + { +#ifndef FIX_356_ISM_METADATA_SYNC + if ( !( in_format == MC_FORMAT && nS == lfe_idx ) ) /* Skip LFE for MC */ + { + hBinRendererTd->Sources[c_indx]->InputFrame_p = output[nS]; + hBinRendererTd->Sources[c_indx]->SrcRend_p->InputAvailable = TRUE; + c_indx++; + } +#endif + if ( in_format == ISM_FORMAT ) + { + /* Update the source positions */ + /* Source position and direction */ + angles_to_vec( hIsmMetaData[nS]->radius, hIsmMetaData[nS]->azimuth, hIsmMetaData[nS]->elevation, Pos ); + angles_to_vec( 1.0f, hIsmMetaData[nS]->yaw, hIsmMetaData[nS]->pitch, Dir ); + +#ifndef FIX_463_TD_RENDERER_DIRECTIVITY_RESET + + /* Source directivity info */ + DirAtten_p->ConeInnerAngle = 360.0f; + DirAtten_p->ConeOuterAngle = 360.0f; + DirAtten_p->ConeOuterGain = 1.0f; +#endif + + TDREND_MIX_SRC_SetPos( hBinRendererTd, nS, Pos ); + TDREND_MIX_SRC_SetDirAtten( hBinRendererTd, nS, DirAtten_p ); + +#ifdef ISM_NON_DIEGETIC_PAN + if ( hIsmMetaData[nS]->non_diegetic_flag ) + { + Pos[0] = 0; + Pos[1] = hIsmMetaData[nS]->azimuth / 90.f; + Pos[2] = 0; + TDREND_MIX_SRC_SetPos( hBinRendererTd, nS, Pos ); + TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING_NON_DIEGETIC ); + } + else + { + TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING ); + } +#else + TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING ); +#endif + TDREND_MIX_SRC_SetDir( hBinRendererTd, nS, Dir ); + } + } + + return; +} + + +/*---------------------------------------------------------------------* + * TDREND_Update_listener_orientation() + * + * Update listener orientation (s) + *---------------------------------------------------------------------*/ + +void TDREND_Update_listener_orientation( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD Renderer handle */ + const int16_t headRotEnabled, /* i : Headrotation flag */ + const IVAS_QUATERNION *headPosition, /* i : Listener orientation */ + const IVAS_VECTOR3 *Pos /* i : Listener Position */ +) +{ + float FrontVec[3]; + float UpVec[3]; + float Rmat[3][3]; + float Pos_p[3]; + + if ( headRotEnabled ) + { + /* Obtain head rotation matrix */ + QuatToRotMat( *headPosition, Rmat ); + /* Apply rotation matrix to looking vector [1;0;0] */ + FrontVec[0] = Rmat[0][0]; + FrontVec[1] = Rmat[0][1]; + FrontVec[2] = Rmat[0][2]; + /* Apply rotation matrix to up vector [0;0;1] */ + UpVec[0] = Rmat[2][0]; + UpVec[1] = Rmat[2][1]; + UpVec[2] = Rmat[2][2]; + /* Input position */ + Pos_p[0] = ( *Pos ).x; + Pos_p[1] = ( *Pos ).y; + Pos_p[2] = ( *Pos ).z; + } + else + { + /* Oriented with looking vector along the x axis */ + FrontVec[0] = 1.0f; + FrontVec[1] = 0.0f; + FrontVec[2] = 0.0f; + /* Oriented with up vector along the z axis */ + UpVec[0] = 0.0f; + UpVec[1] = 0.0f; + UpVec[2] = 1.0f; + /* Listener at the origin */ + Pos_p[0] = 0.0f; + Pos_p[1] = 0.0f; + Pos_p[2] = 0.0f; + } + + /* Set the listener position and orientation:*/ + TDREND_MIX_LIST_SetPos( hBinRendererTd, Pos_p ); + TDREND_MIX_LIST_SetOrient( hBinRendererTd, FrontVec, UpVec ); + + return; +} + + +/*---------------------------------------------------------------------* + * ivas_td_binaural_open_ext() + * + * + *---------------------------------------------------------------------*/ + +ivas_error ivas_td_binaural_open_ext( + TDREND_WRAPPER *pTDRend, + IVAS_REND_AudioConfig inConfig, + RENDER_CONFIG_DATA *hRendCfg, /* i : Renderer configuration */ + LSSETUP_CUSTOM_STRUCT *customLsInput, + const int32_t outFs ) +{ + int16_t nchan_transport; + AUDIO_CONFIG transport_config; + IVAS_FORMAT ivas_format; + IVAS_OUTPUT_SETUP hTransSetup; + ivas_error error; + float *directivity = NULL; + + if ( inConfig != IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) + { + if ( ( error = getAudioConfigNumChannels( inConfig, &nchan_transport ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + nchan_transport = customLsInput->num_spk; + } + + transport_config = getIvasAudioConfigFromRendAudioConfig( inConfig ); + ivas_format = ( getAudioConfigType( inConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ? MC_FORMAT : ISM_FORMAT; + hTransSetup.ls_azimuth = customLsInput->ls_azimuth; + hTransSetup.ls_elevation = customLsInput->ls_elevation; + + if ( NULL != hRendCfg ) + { + directivity = hRendCfg->directivity; + } + + return ivas_td_binaural_open_unwrap( &pTDRend->hHrtfTD, outFs, nchan_transport, ivas_format, transport_config, directivity, hTransSetup, &pTDRend->hBinRendererTd, &pTDRend->binaural_latency_ns ); +} + + +/*---------------------------------------------------------------------* + * ivas_td_binaural_renderer_ext() + * + * Receives the current frames for the object streams, updates metadata + * and renders the current frame. + *---------------------------------------------------------------------*/ + +ivas_error ivas_td_binaural_renderer_ext( + const TDREND_WRAPPER *pTDRend, /* i : TD Renderer wrapper structure */ + const IVAS_REND_AudioConfig inConfig, /* i : Input audio configuration */ + const LSSETUP_CUSTOM_STRUCT *customLsInput, /* i : Input custom loudspeaker layout */ + const IVAS_REND_HeadRotData *headRotData, /* i : Input head positions */ + const IVAS_REND_AudioObjectPosition *currentPos, /* i : Object position */ + const REVERB_HANDLE hReverb, /* i : Reverberator handle */ + const int16_t output_frame, /* i : output frame length */ + float output[][L_FRAME48k] /* i/o: SCE channels / Binaural synthesis */ +) +{ + ISM_METADATA_FRAME hIsmMetaDataFrame; + ISM_METADATA_HANDLE hIsmMetaData[1]; + int16_t lfe_idx; + int16_t num_src; + IVAS_FORMAT ivas_format; + IVAS_REND_AudioConfigType inConfigType; + AUDIO_CONFIG transport_config; + ivas_error error; +#ifdef FIX_356_ISM_METADATA_SYNC + int16_t ism_md_subframe_update = 0; +#endif +#ifdef JBM_TSM_ON_TCS + float *p_output[MAX_OUTPUT_CHANNELS]; + int16_t ch; + + for ( ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++ ) + { + p_output[ch] = output[ch]; + } +#endif + + push_wmops( "ivas_td_binaural_renderer_ext" ); + + inConfigType = getAudioConfigType( inConfig ); + lfe_idx = LFE_CHANNEL; + hIsmMetaData[0] = NULL; + + if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) + { + ivas_format = MC_FORMAT; + transport_config = getIvasAudioConfigFromRendAudioConfig( inConfig ); + if ( inConfig != IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) + { + if ( ( error = getAudioConfigNumChannels( inConfig, &num_src ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + lfe_idx = ( customLsInput->num_lfe > 0 ) ? customLsInput->lfe_idx[0] : -1; + num_src = customLsInput->num_spk + customLsInput->num_lfe; + } + } + else + { + ivas_format = ISM_FORMAT; + num_src = 1; + transport_config = AUDIO_CONFIG_ISM1; + hIsmMetaData[0] = &hIsmMetaDataFrame; + hIsmMetaData[0]->azimuth = currentPos->azimuth; + hIsmMetaData[0]->elevation = currentPos->elevation; + hIsmMetaData[0]->yaw = currentPos->yaw; + hIsmMetaData[0]->pitch = currentPos->pitch; + hIsmMetaData[0]->radius = currentPos->radius; +#ifdef ISM_NON_DIEGETIC_PAN + hIsmMetaData[0]->non_diegetic_flag = currentPos->non_diegetic_flag; +#endif + } + +#ifdef JBM_TSM_ON_TCS +#ifdef FIX_356_ISM_METADATA_SYNC + if( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, + ( headRotData != NULL ) ? headRotData->headPositions : NULL, + ( headRotData != NULL ) ? headRotData->Pos : NULL, ism_md_subframe_update, p_output, output_frame ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, + ( headRotData != NULL ) ? headRotData->headPositions : NULL, + ( headRotData != NULL ) ? headRotData->Pos : NULL, p_output, output_frame ) ) != IVAS_ERR_OK ) +#endif +#else +#ifdef FIX_356_ISM_METADATA_SYNC + if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, + ( headRotData != NULL ) ? headRotData->headPositions : NULL, + ( headRotData != NULL ) ? headRotData->Pos : NULL, ism_md_subframe_update, output, output_frame ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, + ( headRotData != NULL ) ? headRotData->headPositions : NULL, + ( headRotData != NULL ) ? headRotData->Pos : NULL, output, output_frame ) ) != IVAS_ERR_OK ) +#endif +#endif + { + return error; + } + + pop_wmops(); + + return IVAS_ERR_OK; +} + +/*---------------------------------------------------------------------* + * angles_to_vec() + * + * Convert azimuth and elevation angles to position/orientation vector + *---------------------------------------------------------------------*/ + +static void angles_to_vec( + const float radius, /* i : radius */ + const float azimuth, /* i : Azimuth angle */ + const float elevation, /* i : Elevation angle */ + float *vec /* o : Pos/Dir vector */ +) +{ + vec[0] = radius * cosf( elevation * PI_OVER_180 ) * cosf( azimuth * PI_OVER_180 ); + vec[1] = radius * cosf( elevation * PI_OVER_180 ) * sinf( azimuth * PI_OVER_180 ); + vec[2] = radius * sinf( elevation * PI_OVER_180 ); + + return; +} -- GitLab From 29758324c77b07bda930d4a764bbad566fd250da Mon Sep 17 00:00:00 2001 From: Sumeyra Kanik Date: Wed, 17 May 2023 17:45:54 +0200 Subject: [PATCH 216/331] Fix crash Formatting issue --- lib_rend/ivas_objectRenderer.c | 805 --------------------------------- 1 file changed, 805 deletions(-) diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 0eec81b692..3db591d094 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -803,808 +803,3 @@ static void angles_to_vec( return; } -/****************************************************************************************************** - - (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -#include "ivas_stat_rend.h" -#include -#include "options.h" -#include "prot.h" -#ifdef ISM_NON_DIEGETIC_PAN -#include "ivas_prot.h" -#endif -#include "ivas_prot_rend.h" -#include -#include "ivas_rom_com.h" -#ifdef DEBUGGING -#include "debug.h" -#endif -#include "wmc_auto.h" - - -/*---------------------------------------------------------------------* - * Local function prototypes - *---------------------------------------------------------------------*/ - - -static void TDREND_Clear_Update_flags( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd ); - -static void angles_to_vec( const float radius, const float azimuth, const float elevation, float *vec ); - - -/*---------------------------------------------------------------------* - * ivas_td_binaural_open_unwrap() - * - * Call TD open/init function without st_ivas - *---------------------------------------------------------------------*/ - -ivas_error ivas_td_binaural_open_unwrap( - TDREND_HRFILT_FiltSet_t **hHrtfTD, /* i/o: HR filter model (from file or NULL) */ - const int32_t output_Fs, /* i : Output sampling rate */ - const int16_t nchan_transport, /* i : Number of channels */ - const IVAS_FORMAT ivas_format, /* i : IVAS format (ISM/MC) */ - const AUDIO_CONFIG transport_config, /* i : Transport configuration */ - const float *directivity, /* i : Directivity pattern (used for ISM) */ - const IVAS_OUTPUT_SETUP hTransSetup, /* i : Loudspeaker layout */ - BINAURAL_TD_OBJECT_RENDERER_HANDLE *hBinRendererTd, /* o : TD renderer handle */ - int32_t *binaural_latency_ns /* i : Binauralization delay */ -) -{ - BINAURAL_TD_OBJECT_RENDERER_HANDLE pBinRendTd; - TDREND_PosType_t PosType; - int16_t nS; - int16_t SrcInd[MAX_NUM_TDREND_CHANNELS]; - const float *ls_azimuth, *ls_elevation; - float Pos[3]; - float Dir[3]; - TDREND_DirAtten_t *DirAtten_p; - int16_t nchan_rend; - ivas_error error; - - error = IVAS_ERR_OK; - - if ( ( pBinRendTd = malloc( sizeof( BINAURAL_TD_OBJECT_RENDERER ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD renderer\n" ) ); - } - if ( ( pBinRendTd->TdRend_MixSpatSpec_p = malloc( sizeof( TDREND_MixSpatSpec_t ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD renderer\n" ) ); - } - if ( ( pBinRendTd->DirAtten_p = malloc( sizeof( TDREND_DirAtten_t ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD renderer\n" ) ); - } - if ( ( pBinRendTd->Listener_p = malloc( sizeof( TDREND_MIX_Listener_t ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD renderer\n" ) ); - } - - pBinRendTd->NumOfSrcs = 0; - pBinRendTd->MaxSrcInd = -1; - - /* Mixer spatial setup */ - pBinRendTd->TdRend_MixSpatSpec_p->UseCommonDistAttenModel = TRUE; - pBinRendTd->TdRend_MixSpatSpec_p->DistAttenModel = 0; /* 0=Turned off, else use TDREND_DIST_ATTEN_MODEL_INV_DIST_CLAMPED */ - - if ( ( error = TDREND_MIX_Init( pBinRendTd, hHrtfTD, pBinRendTd->TdRend_MixSpatSpec_p, output_Fs ) ) != IVAS_ERR_OK ) - { - return error; - } - - /* Set the attenuation (or can set MixSpatSpec.DistAttenModel above) */ - if ( ( error = TDREND_MIX_SetDistAttenModel( pBinRendTd, TDREND_DIST_ATTEN_MODEL_INV_DIST_CLAMPED ) ) != IVAS_ERR_OK ) - { - return error; - } - - /* Add sources to module and mixer, headphones */ - PosType = TDREND_POSTYPE_ABSOLUTE; /* or TDREND_POSTYPE_RELATIVE_TO_LISTENER */ - - nchan_rend = nchan_transport; - if ( ( ivas_format == MC_FORMAT ) && ( transport_config != AUDIO_CONFIG_LS_CUSTOM ) ) - { - nchan_rend--; /* Skip LFE channel -- added to the others */ - } - - for ( nS = 0; nS < nchan_rend; nS++ ) - { - if ( ( error = TDREND_MIX_AddSrc( pBinRendTd, &SrcInd[nS], PosType ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - if ( ivas_format == MC_FORMAT ) - { - switch ( transport_config ) - { - case AUDIO_CONFIG_5_1: - ls_azimuth = ls_azimuth_CICP6; - ls_elevation = ls_elevation_CICP6; - break; - case AUDIO_CONFIG_7_1: - ls_azimuth = ls_azimuth_CICP12; - ls_elevation = ls_elevation_CICP12; - break; - case AUDIO_CONFIG_5_1_2: - ls_azimuth = ls_azimuth_CICP14; - ls_elevation = ls_elevation_CICP14; - break; - case AUDIO_CONFIG_5_1_4: - ls_azimuth = ls_azimuth_CICP16; - ls_elevation = ls_elevation_CICP16; - break; - case AUDIO_CONFIG_7_1_4: - ls_azimuth = ls_azimuth_CICP19; - ls_elevation = ls_elevation_CICP19; - break; - case AUDIO_CONFIG_LS_CUSTOM: - ls_azimuth = hTransSetup.ls_azimuth; - ls_elevation = hTransSetup.ls_elevation; - break; - default: - ls_azimuth = NULL; - ls_elevation = NULL; - } - - DirAtten_p = pBinRendTd->DirAtten_p; - - for ( nS = 0; nS < nchan_rend; nS++ ) - { - /* Set source positions according to loudspeaker layout */ - angles_to_vec( 1.0f, ls_azimuth[nS], ls_elevation[nS], Pos ); - Dir[0] = 1.0f; - Dir[1] = 0.0f; - Dir[2] = 0.0f; - - /* Source directivity info */ - DirAtten_p->ConeInnerAngle = 360.0f; - DirAtten_p->ConeOuterAngle = 360.0f; - DirAtten_p->ConeOuterGain = 1.0f; - - TDREND_MIX_SRC_SetPos( pBinRendTd, nS, Pos ); - TDREND_MIX_SRC_SetDir( pBinRendTd, nS, Dir ); - TDREND_MIX_SRC_SetPlayState( pBinRendTd, nS, TDREND_PLAYSTATUS_PLAYING ); - TDREND_MIX_SRC_SetDirAtten( pBinRendTd, nS, DirAtten_p ); - } - } - if ( ivas_format == ISM_FORMAT ) - { - DirAtten_p = pBinRendTd->DirAtten_p; - if ( NULL == directivity ) - { - DirAtten_p->ConeInnerAngle = 360.0f; /* Front cone */ - DirAtten_p->ConeOuterAngle = 360.0f; /* Back cone */ - DirAtten_p->ConeOuterGain = 1.0f; /* Back attenuation */ - } - else - { - DirAtten_p->ConeInnerAngle = directivity[0]; - DirAtten_p->ConeOuterAngle = directivity[1]; - DirAtten_p->ConeOuterGain = directivity[2]; - } - - for ( nS = 0; nS < nchan_rend; nS++ ) - { - TDREND_MIX_SRC_SetDirAtten( pBinRendTd, nS, DirAtten_p ); - } - } - - *hBinRendererTd = pBinRendTd; - *binaural_latency_ns = (int32_t) ( ( *hBinRendererTd )->HrFiltSet_p->latency_s * 1000000000.f ); - - return error; -} - - -/*---------------------------------------------------------------------* - * ivas_td_binaural_close() - * - * Close TD Object binaural renderer - *---------------------------------------------------------------------*/ - -void ivas_td_binaural_close( - BINAURAL_TD_OBJECT_RENDERER_HANDLE *hBinRendererTd /* i/o: TD binaural object renderer handle */ -) -{ - if ( hBinRendererTd == NULL || *hBinRendererTd == NULL ) - { - return; - } - - free( ( *hBinRendererTd )->TdRend_MixSpatSpec_p ); - free( ( *hBinRendererTd )->DirAtten_p ); - - TDREND_MIX_Dealloc( *hBinRendererTd ); - - free( *hBinRendererTd ); - *hBinRendererTd = NULL; - - return; -} - -/*---------------------------------------------------------------------* - * ivas_td_binaural_renderer_unwrap() - * - * Call ivas_td_binaural_renderer() without st_ivas. - *---------------------------------------------------------------------*/ - -ivas_error ivas_td_binaural_renderer_unwrap( - const REVERB_HANDLE hReverb, /* i : Reverberator handle */ - const AUDIO_CONFIG transport_config, /* i : Transport configuration */ - BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD binaural object renderer handle */ - const int16_t num_src, /* i : number of sources to render */ - const int16_t lfe_idx, /* i : LFE channel index */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - ISM_METADATA_HANDLE *hIsmMetaData, /* i : ISM metadata handle */ - const int16_t Opt_Headrotation, /* i : Head rotation flag */ - const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ - const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ -#ifdef FIX_356_ISM_METADATA_SYNC - const int16_t ism_md_subframe_update, /* i: Number of subframes to delay ism metadata to sync with audio */ -#endif -#ifdef JBM_TSM_ON_TCS - float *output[], /* i/o: SCE channels / Binaural synthesis */ -#else - float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ -#endif - const int16_t output_frame /* i : output frame length */ -) -{ - int16_t subframe_length; - int16_t subframe_idx; - float reverb_signal[BINAURAL_CHANNELS][L_FRAME48k]; - ivas_error error; -#ifdef JBM_TSM_ON_TCS - float *p_reverb_signal[BINAURAL_CHANNELS]; - int16_t ch; - - for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - p_reverb_signal[ch] = reverb_signal[ch]; - } -#endif - - subframe_length = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES; - -#ifdef FIX_356_ISM_METADATA_SYNC - int16_t c_indx, nS; - c_indx = 0; - - for ( nS = 0; nS < num_src; nS++ ) - { - if ( !( ivas_format == MC_FORMAT && nS == lfe_idx ) ) /* Skip LFE for MC */ - { - hBinRendererTd->Sources[c_indx]->InputFrame_p = output[nS]; - hBinRendererTd->Sources[c_indx]->SrcRend_p->InputAvailable = TRUE; - c_indx++; - } - } -#else - /* Update object position(s) */ - TDREND_Update_object_positions( hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, output ); -#endif - - for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) - { -#ifdef FIX_356_ISM_METADATA_SYNC - if ( subframe_idx == ism_md_subframe_update ) - { - /* Update object position(s) */ - TDREND_Update_object_positions( hBinRendererTd, num_src, ivas_format, hIsmMetaData ); - } -#endif - /* Update the listener's location/orientation */ - TDREND_Update_listener_orientation( hBinRendererTd, Opt_Headrotation, ( Quaternions != NULL ) ? &Quaternions[subframe_idx] : NULL, ( Pos != NULL ) ? &Pos[subframe_idx] : NULL ); - - if ( hReverb != NULL && hReverb->pConfig.roomAcoustics.late_reverb_on ) - { -#ifdef JBM_TSM_ON_TCS - if ( ( error = ivas_reverb_process( hReverb, transport_config, 0, output, p_reverb_signal, subframe_idx ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_reverb_process( hReverb, transport_config, 0, output, reverb_signal, subframe_idx ) ) != IVAS_ERR_OK ) -#endif - { - return error; - } - } - - /* Render subframe */ -#ifdef FIX_356_ISM_METADATA_SYNC - if ( ( error = TDREND_GetMix( hBinRendererTd, output, subframe_length, subframe_idx, ism_md_subframe_update ) ) != IVAS_ERR_OK ) -#else - if ( ( error = TDREND_GetMix( hBinRendererTd, output, subframe_length, subframe_idx ) ) != IVAS_ERR_OK ) -#endif - { - return error; - } - } - - - if ( hReverb != NULL && hReverb->pConfig.roomAcoustics.late_reverb_on ) - { - /* add reverb to rendered signals */ - v_add( reverb_signal[0], output[0], output[0], output_frame ); - v_add( reverb_signal[1], output[1], output[1], output_frame ); - } - - return IVAS_ERR_OK; -} - - -/*---------------------------------------------------------------------* - * TDREND_GetMix() - * - * Render one 5 ms subframe from the mixer - *---------------------------------------------------------------------*/ - -ivas_error TDREND_GetMix( - BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ -#ifdef JBM_TSM_ON_TCS - float *output[], /* i/o: ISM object synth / rendered output in 0,1 */ -#else - float output[][L_FRAME48k], /* i/o: ISM object synth / rendered output in 0,1 */ -#endif - const int16_t subframe_length, /* i/o: subframe length */ - const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ -#ifdef FIX_356_ISM_METADATA_SYNC - , - const int16_t ism_md_subframe_update /* Number of subframes to delay ism metadata to sync with audio */ -#endif -) -{ - int16_t i; - TDREND_SRC_t *Src_p; - TDREND_SRC_SPATIAL_t *SrcSpatial_p; - TDREND_SRC_REND_t *SrcRend_p; - ivas_error error; - float output_buf[2][L_SPATIAL_SUBFR_48k]; /* Temp buffer for left/right rendered signal */ - float hrf_left_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; - float hrf_right_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; - int16_t intp_count; -#ifdef ISM_NON_DIEGETIC_PAN - float pan_left, pan_right; -#endif -#ifdef FIX_356_ISM_METADATA_SYNC - int16_t subframe_update_flag; - subframe_update_flag = subframe_idx == ism_md_subframe_update; -#endif - error = IVAS_ERR_OK; - - /* Clear the output buffer to accumulate rendered sources */ - set_f( output_buf[0], 0.0f, subframe_length ); - set_f( output_buf[1], 0.0f, subframe_length ); - - /* Clear interpolation buffers and counter */ - set_f( hrf_left_delta, 0.0f, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); - set_f( hrf_right_delta, 0.0f, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); - intp_count = 0; - - /* Create the mix */ - /* Loop through the source list and render each source */ - for ( i = 0; i < hBinRendererTd->NumOfSrcs; i++ ) - { - Src_p = hBinRendererTd->Sources[i]; - SrcSpatial_p = Src_p->SrcSpatial_p; - SrcRend_p = Src_p->SrcRend_p; - - /* Update rendering params if needed */ -#ifdef ISM_NON_DIEGETIC_PAN - if ( ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING ) && ( hBinRendererTd->Listener_p->PoseUpdated || SrcSpatial_p->Updated ) ) -#else - if ( hBinRendererTd->Listener_p->PoseUpdated || SrcSpatial_p->Updated ) -#endif - { - TDREND_SRC_REND_UpdateFiltersFromSpatialParams( hBinRendererTd, SrcRend_p, SrcSpatial_p, Src_p->hrf_left_prev, - Src_p->hrf_right_prev, hrf_left_delta, hrf_right_delta, &intp_count, &Src_p->filterlength, &Src_p->itd, &Src_p->Gain, Src_p, -#ifdef FIX_356_ISM_METADATA_SYNC - subframe_update_flag -#else - subframe_idx -#endif - ); - } - - /* Render source if needed */ - if ( ( SrcRend_p->InputAvailable == TRUE ) && ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING ) ) - { - error = TDREND_REND_RenderSourceHRFilt( Src_p, hrf_left_delta, hrf_right_delta, intp_count, output_buf, subframe_length ); - } - -#ifdef ISM_NON_DIEGETIC_PAN - if ( ( SrcRend_p->InputAvailable == TRUE ) && ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING_NON_DIEGETIC ) ) - { - pan_left = ( SrcSpatial_p->Pos_p[1] + 1.f ) * 0.5f; - pan_right = 1.f - pan_left; - v_multc_acc( &Src_p->InputFrame_p[subframe_idx * subframe_length], pan_left, output_buf[0], subframe_length ); - v_multc_acc( &Src_p->InputFrame_p[subframe_idx * subframe_length], pan_right, output_buf[1], subframe_length ); - } -#endif - } - - /* Populate output variable */ - mvr2r( output_buf[0], output[0] + subframe_idx * subframe_length, subframe_length ); /* Left */ - mvr2r( output_buf[1], output[1] + subframe_idx * subframe_length, subframe_length ); /* Right */ - - /* Clear the PoseUpdated and Source position update flags */ - TDREND_Clear_Update_flags( hBinRendererTd ); - - return error; -} - - -/*---------------------------------------------------------------------* - * TDREND_Clear_Update_flags() - * - * Initializes the audio mixer module - *---------------------------------------------------------------------*/ - -static void TDREND_Clear_Update_flags( - BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd /* i/o: TD renderer handle */ -) -{ - int16_t i; - - hBinRendererTd->Listener_p->PoseUpdated = FALSE; - - for ( i = 0; i < hBinRendererTd->NumOfSrcs; i++ ) - { - hBinRendererTd->Sources[i]->SrcSpatial_p->Updated = FALSE; - } - - return; -} - - -/*---------------------------------------------------------------------* - * TDREND_Update_object_positions() - * - * Update object position(s) - *---------------------------------------------------------------------*/ - -void TDREND_Update_object_positions( - BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o : TD Renderer handle */ - const int16_t num_src, /* i : number of sources to render */ -#ifndef FIX_356_ISM_METADATA_SYNC - const int16_t lfe_idx, /* i : Input LFE index */ -#endif - const IVAS_FORMAT in_format, /* i : Format of input sources */ - const ISM_METADATA_HANDLE *hIsmMetaData /* i : Input metadata for ISM objects */ -#ifndef FIX_356_ISM_METADATA_SYNC - , -#ifdef JBM_TSM_ON_TCS - float *output[] -#else - float output[][L_FRAME48k] /* i/o: SCE/MC channels */ -#endif -#endif -) -{ - TDREND_DirAtten_t *DirAtten_p; - int16_t nS; - float Pos[3]; - float Dir[3]; -#ifndef FIX_356_ISM_METADATA_SYNC - int16_t c_indx; -#endif - - DirAtten_p = hBinRendererTd->DirAtten_p; - - /* For each source, write the frame data to the source object*/ -#ifndef FIX_356_ISM_METADATA_SYNC - c_indx = 0; -#endif - for ( nS = 0; nS < num_src; nS++ ) - { -#ifndef FIX_356_ISM_METADATA_SYNC - if ( !( in_format == MC_FORMAT && nS == lfe_idx ) ) /* Skip LFE for MC */ - { - hBinRendererTd->Sources[c_indx]->InputFrame_p = output[nS]; - hBinRendererTd->Sources[c_indx]->SrcRend_p->InputAvailable = TRUE; - c_indx++; - } -#endif - if ( in_format == ISM_FORMAT ) - { - /* Update the source positions */ - /* Source position and direction */ - angles_to_vec( hIsmMetaData[nS]->radius, hIsmMetaData[nS]->azimuth, hIsmMetaData[nS]->elevation, Pos ); - angles_to_vec( 1.0f, hIsmMetaData[nS]->yaw, hIsmMetaData[nS]->pitch, Dir ); - -#ifndef FIX_463_TD_RENDERER_DIRECTIVITY_RESET - - /* Source directivity info */ - DirAtten_p->ConeInnerAngle = 360.0f; - DirAtten_p->ConeOuterAngle = 360.0f; - DirAtten_p->ConeOuterGain = 1.0f; -#endif - - TDREND_MIX_SRC_SetPos( hBinRendererTd, nS, Pos ); - TDREND_MIX_SRC_SetDirAtten( hBinRendererTd, nS, DirAtten_p ); - -#ifdef ISM_NON_DIEGETIC_PAN - if ( hIsmMetaData[nS]->non_diegetic_flag ) - { - Pos[0] = 0; - Pos[1] = hIsmMetaData[nS]->azimuth / 90.f; - Pos[2] = 0; - TDREND_MIX_SRC_SetPos( hBinRendererTd, nS, Pos ); - TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING_NON_DIEGETIC ); - } - else - { - TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING ); - } -#else - TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING ); -#endif - TDREND_MIX_SRC_SetDir( hBinRendererTd, nS, Dir ); - } - } - - return; -} - - -/*---------------------------------------------------------------------* - * TDREND_Update_listener_orientation() - * - * Update listener orientation (s) - *---------------------------------------------------------------------*/ - -void TDREND_Update_listener_orientation( - BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD Renderer handle */ - const int16_t headRotEnabled, /* i : Headrotation flag */ - const IVAS_QUATERNION *headPosition, /* i : Listener orientation */ - const IVAS_VECTOR3 *Pos /* i : Listener Position */ -) -{ - float FrontVec[3]; - float UpVec[3]; - float Rmat[3][3]; - float Pos_p[3]; - - if ( headRotEnabled ) - { - /* Obtain head rotation matrix */ - QuatToRotMat( *headPosition, Rmat ); - /* Apply rotation matrix to looking vector [1;0;0] */ - FrontVec[0] = Rmat[0][0]; - FrontVec[1] = Rmat[0][1]; - FrontVec[2] = Rmat[0][2]; - /* Apply rotation matrix to up vector [0;0;1] */ - UpVec[0] = Rmat[2][0]; - UpVec[1] = Rmat[2][1]; - UpVec[2] = Rmat[2][2]; - /* Input position */ - Pos_p[0] = ( *Pos ).x; - Pos_p[1] = ( *Pos ).y; - Pos_p[2] = ( *Pos ).z; - } - else - { - /* Oriented with looking vector along the x axis */ - FrontVec[0] = 1.0f; - FrontVec[1] = 0.0f; - FrontVec[2] = 0.0f; - /* Oriented with up vector along the z axis */ - UpVec[0] = 0.0f; - UpVec[1] = 0.0f; - UpVec[2] = 1.0f; - /* Listener at the origin */ - Pos_p[0] = 0.0f; - Pos_p[1] = 0.0f; - Pos_p[2] = 0.0f; - } - - /* Set the listener position and orientation:*/ - TDREND_MIX_LIST_SetPos( hBinRendererTd, Pos_p ); - TDREND_MIX_LIST_SetOrient( hBinRendererTd, FrontVec, UpVec ); - - return; -} - - -/*---------------------------------------------------------------------* - * ivas_td_binaural_open_ext() - * - * - *---------------------------------------------------------------------*/ - -ivas_error ivas_td_binaural_open_ext( - TDREND_WRAPPER *pTDRend, - IVAS_REND_AudioConfig inConfig, - RENDER_CONFIG_DATA *hRendCfg, /* i : Renderer configuration */ - LSSETUP_CUSTOM_STRUCT *customLsInput, - const int32_t outFs ) -{ - int16_t nchan_transport; - AUDIO_CONFIG transport_config; - IVAS_FORMAT ivas_format; - IVAS_OUTPUT_SETUP hTransSetup; - ivas_error error; - float *directivity = NULL; - - if ( inConfig != IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) - { - if ( ( error = getAudioConfigNumChannels( inConfig, &nchan_transport ) ) != IVAS_ERR_OK ) - { - return error; - } - } - else - { - nchan_transport = customLsInput->num_spk; - } - - transport_config = getIvasAudioConfigFromRendAudioConfig( inConfig ); - ivas_format = ( getAudioConfigType( inConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ? MC_FORMAT : ISM_FORMAT; - hTransSetup.ls_azimuth = customLsInput->ls_azimuth; - hTransSetup.ls_elevation = customLsInput->ls_elevation; - - if ( NULL != hRendCfg ) - { - directivity = hRendCfg->directivity; - } - - return ivas_td_binaural_open_unwrap( &pTDRend->hHrtfTD, outFs, nchan_transport, ivas_format, transport_config, directivity, hTransSetup, &pTDRend->hBinRendererTd, &pTDRend->binaural_latency_ns ); -} - - -/*---------------------------------------------------------------------* - * ivas_td_binaural_renderer_ext() - * - * Receives the current frames for the object streams, updates metadata - * and renders the current frame. - *---------------------------------------------------------------------*/ - -ivas_error ivas_td_binaural_renderer_ext( - const TDREND_WRAPPER *pTDRend, /* i : TD Renderer wrapper structure */ - const IVAS_REND_AudioConfig inConfig, /* i : Input audio configuration */ - const LSSETUP_CUSTOM_STRUCT *customLsInput, /* i : Input custom loudspeaker layout */ - const IVAS_REND_HeadRotData *headRotData, /* i : Input head positions */ - const IVAS_REND_AudioObjectPosition *currentPos, /* i : Object position */ - const REVERB_HANDLE hReverb, /* i : Reverberator handle */ - const int16_t output_frame, /* i : output frame length */ - float output[][L_FRAME48k] /* i/o: SCE channels / Binaural synthesis */ -) -{ - ISM_METADATA_FRAME hIsmMetaDataFrame; - ISM_METADATA_HANDLE hIsmMetaData[1]; - int16_t lfe_idx; - int16_t num_src; - IVAS_FORMAT ivas_format; - IVAS_REND_AudioConfigType inConfigType; - AUDIO_CONFIG transport_config; - ivas_error error; -#ifdef FIX_356_ISM_METADATA_SYNC - int16_t ism_md_subframe_update = 0; -#endif -#ifdef JBM_TSM_ON_TCS - float *p_output[MAX_OUTPUT_CHANNELS]; - int16_t ch; - - for ( ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++ ) - { - p_output[ch] = output[ch]; - } -#endif - - push_wmops( "ivas_td_binaural_renderer_ext" ); - - inConfigType = getAudioConfigType( inConfig ); - lfe_idx = LFE_CHANNEL; - hIsmMetaData[0] = NULL; - - if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) - { - ivas_format = MC_FORMAT; - transport_config = getIvasAudioConfigFromRendAudioConfig( inConfig ); - if ( inConfig != IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) - { - if ( ( error = getAudioConfigNumChannels( inConfig, &num_src ) ) != IVAS_ERR_OK ) - { - return error; - } - } - else - { - lfe_idx = ( customLsInput->num_lfe > 0 ) ? customLsInput->lfe_idx[0] : -1; - num_src = customLsInput->num_spk + customLsInput->num_lfe; - } - } - else - { - ivas_format = ISM_FORMAT; - num_src = 1; - transport_config = AUDIO_CONFIG_ISM1; - hIsmMetaData[0] = &hIsmMetaDataFrame; - hIsmMetaData[0]->azimuth = currentPos->azimuth; - hIsmMetaData[0]->elevation = currentPos->elevation; - hIsmMetaData[0]->yaw = currentPos->yaw; - hIsmMetaData[0]->pitch = currentPos->pitch; - hIsmMetaData[0]->radius = currentPos->radius; -#ifdef ISM_NON_DIEGETIC_PAN - hIsmMetaData[0]->non_diegetic_flag = currentPos->non_diegetic_flag; -#endif - } - -#ifdef JBM_TSM_ON_TCS -#ifdef FIX_356_ISM_METADATA_SYNC - if( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, - ( headRotData != NULL ) ? headRotData->headPositions : NULL, - ( headRotData != NULL ) ? headRotData->Pos : NULL, ism_md_subframe_update, p_output, output_frame ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, - ( headRotData != NULL ) ? headRotData->headPositions : NULL, - ( headRotData != NULL ) ? headRotData->Pos : NULL, p_output, output_frame ) ) != IVAS_ERR_OK ) -#endif -#else -#ifdef FIX_356_ISM_METADATA_SYNC - if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, - ( headRotData != NULL ) ? headRotData->headPositions : NULL, - ( headRotData != NULL ) ? headRotData->Pos : NULL, ism_md_subframe_update, output, output_frame ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, - ( headRotData != NULL ) ? headRotData->headPositions : NULL, - ( headRotData != NULL ) ? headRotData->Pos : NULL, output, output_frame ) ) != IVAS_ERR_OK ) -#endif -#endif - { - return error; - } - - pop_wmops(); - - return IVAS_ERR_OK; -} - -/*---------------------------------------------------------------------* - * angles_to_vec() - * - * Convert azimuth and elevation angles to position/orientation vector - *---------------------------------------------------------------------*/ - -static void angles_to_vec( - const float radius, /* i : radius */ - const float azimuth, /* i : Azimuth angle */ - const float elevation, /* i : Elevation angle */ - float *vec /* o : Pos/Dir vector */ -) -{ - vec[0] = radius * cosf( elevation * PI_OVER_180 ) * cosf( azimuth * PI_OVER_180 ); - vec[1] = radius * cosf( elevation * PI_OVER_180 ) * sinf( azimuth * PI_OVER_180 ); - vec[2] = radius * sinf( elevation * PI_OVER_180 ); - - return; -} -- GitLab From c6be522ed0147e383b119482d6170beb1a2ee77f Mon Sep 17 00:00:00 2001 From: Sumeyra Kanik Date: Wed, 17 May 2023 17:55:27 +0200 Subject: [PATCH 217/331] Fix clang format --- lib_rend/ivas_objectRenderer.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 3db591d094..edf15aa1d1 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -756,9 +756,9 @@ ivas_error ivas_td_binaural_renderer_ext( #ifdef JBM_TSM_ON_TCS #ifdef FIX_356_ISM_METADATA_SYNC - if( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, - ( headRotData != NULL ) ? headRotData->headPositions : NULL, - ( headRotData != NULL ) ? headRotData->Pos : NULL, ism_md_subframe_update, p_output, output_frame ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, + ( headRotData != NULL ) ? headRotData->headPositions : NULL, + ( headRotData != NULL ) ? headRotData->Pos : NULL, ism_md_subframe_update, p_output, output_frame ) ) != IVAS_ERR_OK ) #else if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, ( headRotData != NULL ) ? headRotData->headPositions : NULL, -- GitLab From 8d0cf2c5a53ffc7a5f31f6239e1548bf98b5c445 Mon Sep 17 00:00:00 2001 From: "Brown, Stefanie" Date: Thu, 18 May 2023 12:24:38 +1000 Subject: [PATCH 218/331] Low bitrate SBA tuning fix to ensure worst case SPAR MD bitstream and ivas_spar_br_table_consts[] core codec worst case bitrate values agree. --- lib_com/ivas_rom_com.c | 9 ++++++++- lib_com/options.h | 2 ++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index e0ccc3005b..dea512d50d 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -889,13 +889,20 @@ const ivas_spar_br_table_t ivas_spar_br_table_consts[IVAS_SPAR_BR_TABLE_LEN] = { /* When AGC is ON additional (AGC_BITS_PER_CH+1) bits may be taken from each core-coder channel so minimum core-coder bitrate per channel can be min core-coder bitrates as per the table - AGC_BITS_PER_CH */ - /* preferred tuning (3.2/4.9kbps) with/out TDD */ { 13200, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0, +#ifdef FIX_487_LOWRATE_SBA_TUNING_FIX + { { 10000, 8150, 13150 } }, +#else { { 10000, 8300, 13150 } }, +#endif { { 15, 1, 5, 1 },{ 15, 1, 3, 1 },{ 7, 1, 3, 1 } }, 0, 0, 0 }, { 16400, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0, +#ifdef FIX_487_LOWRATE_SBA_TUNING_FIX + { { 13200, 11350, 16350 } }, +#else { { 13200, 11500, 16350 } }, +#endif { { 15, 1, 5, 1 },{ 15, 1, 3, 1 },{ 7, 1, 3, 1 } }, 0, 0, 0 }, { 24400, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0,{ { 16400, 14850, 24350 } }, { { 15, 1, 5, 1 },{ 15, 1, 3, 1 },{ 7, 1, 3, 1 } }, 0, 0, 0 }, diff --git a/lib_com/options.h b/lib_com/options.h index 660b511c72..be54df0c71 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -221,6 +221,8 @@ #define HYBRID_ITD_MAX /* FhG: Improvement for DFT-stereo for cases with large ITDs */ +#define FIX_487_LOWRATE_SBA_TUNING_FIX /* Dlb: TUning fix for low bitrate cases to match theoretical longest SPAR MD bitstream */ + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ -- GitLab From 65c1d78b6749408f85dd5aa0734b82016bf8f031 Mon Sep 17 00:00:00 2001 From: rtyag Date: Thu, 18 May 2023 15:45:14 +1000 Subject: [PATCH 219/331] VLBR fixes and HO DIRAC fixes --- lib_com/ivas_cnst.h | 3 --- lib_com/ivas_prot.h | 4 ++++ lib_com/ivas_rom_com.c | 8 ++++++++ lib_com/ivas_spar_com.c | 26 ++++++++++++++++++++------ lib_com/options.h | 2 ++ lib_dec/ivas_spar_md_dec.c | 9 +++++---- lib_enc/ivas_sba_enc.c | 2 +- lib_enc/ivas_spar_encoder.c | 7 +++---- lib_enc/ivas_spar_md_enc.c | 6 +++--- 9 files changed, 46 insertions(+), 21 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index dacb3e555b..97080fb29e 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1791,9 +1791,6 @@ typedef enum #define IVAS_FB_BANDS_12 12 #define IVAS_FB_BANDS_20 20 #define IVAS_MAX_NUM_BANDS IVAS_FB_BANDS_12 -#ifdef ARITH_HUFF_CODER_CHANGES_1 -#define IVAS_MAX_NUM_BANDS_VLBR 6 -#endif #define IVAS_MAX_NUM_FB_BANDS IVAS_FB_BANDS_20 #define IVAS_FB_12_1MS_LEN ( IVAS_FB_12_1MS_48K_END_BINS_BAND_0 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_0 ) + ( IVAS_FB_12_1MS_48K_END_BINS_BAND_1 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_1 ) + ( IVAS_FB_12_1MS_48K_END_BINS_BAND_2 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_2 ) + ( IVAS_FB_12_1MS_48K_END_BINS_BAND_3 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_3 ) + ( IVAS_FB_12_1MS_48K_END_BINS_BAND_4 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_4 ) + ( IVAS_FB_12_1MS_48K_END_BINS_BAND_5 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_5 ) + ( IVAS_FB_12_1MS_48K_END_BINS_BAND_6 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_6 ) + ( IVAS_FB_12_1MS_48K_END_BINS_BAND_7 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_7 ) + ( IVAS_FB_12_1MS_48K_END_BINS_BAND_8 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_8 ) + ( IVAS_FB_12_1MS_48K_END_BINS_BAND_9 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_9 ) + ( IVAS_FB_12_1MS_48K_END_BINS_BAND_10 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_10 ) + ( IVAS_FB_12_1MS_48K_END_BINS_BAND_11 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_11 ) #define IVAS_16K_12BANDS_ACTIVE_BANDS 10 diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 9bdc94ea01..43a9db87b0 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -4476,6 +4476,10 @@ void ivas_spar_set_bitrate_config( ivas_spar_md_com_cfg *pSpar_md_cfg, /* i/o: SPAR MD config. handle */ const int16_t table_idx, /* i : config. table index */ const int16_t num_bands /* i : number of bands */ +#ifdef ARITH_HUFF_CODER_CHANGES_1 + , + const int16_t dirac2spar_md_flag +#endif #ifdef ARITH_HUFF_CODER_CHANGES , const int16_t enc_flag, diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index a4c8283712..385ab52dc9 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -891,11 +891,19 @@ const ivas_spar_br_table_t ivas_spar_br_table_consts[IVAS_SPAR_BR_TABLE_LEN] = so minimum core-coder bitrate per channel can be min core-coder bitrates as per the table - AGC_BITS_PER_CH */ /* preferred tuning (3.2/4.9kbps) with/out TDD */ { 13200, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0, +#ifdef FIX_487_LOWRATE_SBA_TUNING_FIX + { { 10000, 8150, 13150 } }, +#else { { 10000, 8300, 13150 } }, +#endif { { 15, 1, 5, 1 },{ 15, 1, 3, 1 },{ 7, 1, 3, 1 } }, 0, 0, 0 }, { 16400, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0, +#ifdef FIX_487_LOWRATE_SBA_TUNING_FIX + { { 13200, 11350, 16350 } }, +#else { { 13200, 11500, 16350 } }, +#endif { { 15, 1, 5, 1 },{ 15, 1, 3, 1 },{ 7, 1, 3, 1 } }, 0, 0, 0 }, { 24400, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0,{ { 16400, 14850, 24350 } }, { { 15, 1, 5, 1 },{ 15, 1, 3, 1 },{ 7, 1, 3, 1 } }, 0, 0, 0 }, diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index b7e82e7fd3..4cda031d61 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -2136,6 +2136,10 @@ void ivas_spar_set_bitrate_config( ivas_spar_md_com_cfg *pSpar_md_cfg, /* i/o: SPAR MD config. handle */ const int16_t table_idx, /* i : config. table index */ const int16_t num_bands /* i : number of bands */ +#ifdef ARITH_HUFF_CODER_CHANGES_1 + , + const int16_t dirac2spar_md_flag +#endif #ifdef ARITH_HUFF_CODER_CHANGES , const int16_t enc_flag, @@ -2154,6 +2158,9 @@ void ivas_spar_set_bitrate_config( int16_t wc_coarse_strat; int16_t n_input, n_dmx, n_dec; int16_t quant_strat; +#endif +#ifdef ARITH_HUFF_CODER_CHANGES_1 + int16_t bands_bw; #endif pSpar_md_cfg->nchan_transport = ivas_spar_br_table_consts[table_idx].nchan_transport; @@ -2201,18 +2208,17 @@ void ivas_spar_set_bitrate_config( #ifdef ARITH_HUFF_CODER_CHANGES_1 if ( ivas_total_brate < IVAS_24k4 ) { - pSpar_md_cfg->tgt_bits_per_blk = (int16_t) ceilf( ( 1.0f * pSpar_md_cfg->tgt_bits_per_blk * num_bands ) / IVAS_MAX_NUM_BANDS_VLBR ); - pSpar_md_cfg->max_bits_per_blk = (int16_t) ceilf( ( 1.0f * pSpar_md_cfg->max_bits_per_blk * num_bands ) / IVAS_MAX_NUM_BANDS_VLBR ); + bands_bw = 2; } else { - pSpar_md_cfg->tgt_bits_per_blk = (int16_t) ceilf( ( 1.0f * pSpar_md_cfg->tgt_bits_per_blk * num_bands ) / IVAS_MAX_NUM_BANDS ); - pSpar_md_cfg->max_bits_per_blk = (int16_t) ceilf( ( 1.0f * pSpar_md_cfg->max_bits_per_blk * num_bands ) / IVAS_MAX_NUM_BANDS ); + bands_bw = 1; } -#else +#endif + pSpar_md_cfg->tgt_bits_per_blk = (int16_t) ceilf( ( 1.0f * pSpar_md_cfg->tgt_bits_per_blk * num_bands ) / IVAS_MAX_NUM_BANDS ); pSpar_md_cfg->max_bits_per_blk = (int16_t) ceilf( ( 1.0f * pSpar_md_cfg->max_bits_per_blk * num_bands ) / IVAS_MAX_NUM_BANDS ); -#endif + pSpar_md_cfg->tgt_bits_per_blk += md_coding_bits_header; pSpar_md_cfg->max_bits_per_blk += md_coding_bits_header; @@ -2229,7 +2235,12 @@ void ivas_spar_set_bitrate_config( quant_strat = QUANT_STRAT_2; } +#ifdef ARITH_HUFF_CODER_CHANGES_1 + num_PR_bits_dirac_bands = ( dirac2spar_md_flag == 1 ) ? num_bands - SPAR_DIRAC_SPLIT_START_BAND : 0; + num_PR_bits_dirac_bands /= bands_bw; +#else num_PR_bits_dirac_bands = num_bands - SPAR_DIRAC_SPLIT_START_BAND; +#endif num_PR_bits_dirac_bands = max( 0, num_PR_bits_dirac_bands ); num_PR_bits_dirac_bands *= DIRAC_TO_SPAR_HBR_PRED_CHS; @@ -2243,6 +2254,9 @@ void ivas_spar_set_bitrate_config( bits_P = (int16_t) ceilf( log2f( ivas_spar_br_table_consts[table_idx].q_lvls[quant_strat][2] ) ) * ( n_dec ); wc_coarse_strat = bits_PR + bits_C + bits_P; wc_coarse_strat *= num_bands; +#ifdef ARITH_HUFF_CODER_CHANGES_1 + wc_coarse_strat /= bands_bw; +#endif wc_coarse_strat -= num_PR_bits_dirac_bands; wc_coarse_strat += md_coding_bits_header; diff --git a/lib_com/options.h b/lib_com/options.h index f3a390981d..7c0368540a 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -229,6 +229,8 @@ #define FIX_DTX_428 /* FhG: fix for issue 428, crash with DTX and bitrate switching */ +#define FIX_487_LOWRATE_SBA_TUNING_FIX + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index c7f370820a..e548e49f04 100755 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -525,12 +525,13 @@ ivas_error ivas_spar_md_dec_init( #ifdef SPAR_TUNING ivas_sba_get_spar_hoa_ch_ind( num_channels, hDecoderConfig->ivas_total_brate, hMdDec->HOA_md_ind ); #endif -#ifdef ARITH_HUFF_CODER_CHANGES_1 - hMdDec->spar_md.num_bands = ( hMdDec->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : ( ( hDecoderConfig->ivas_total_brate < IVAS_24k4 ) ? IVAS_MAX_NUM_BANDS_VLBR : min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ) ); -#else + hMdDec->spar_md.num_bands = ( hMdDec->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); -#endif ivas_spar_set_bitrate_config( &hMdDec->spar_md_cfg, hMdDec->table_idx, hMdDec->spar_md.num_bands +#ifdef ARITH_HUFF_CODER_CHANGES_1 + , + hMdDec->spar_hoa_dirac2spar_md_flag +#endif #ifdef ARITH_HUFF_CODER_CHANGES , 0, 0, 0 diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index fb11600f48..8659e7c3e5 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -292,7 +292,7 @@ int16_t ivas_sba_get_max_md_bits( Encoder_Struct *st_ivas ) { int16_t max_md_bits; -#ifndef ARITH_HUFF_CODER_CHANGES +#ifndef ARITH_HUFF_CODER_CHANGES_1 max_md_bits = min( st_ivas->hQMetaData->metadata_max_bits + 1, 500 ); // TODO: remove 500 once max MD bits has been defined at all bitrates in DirAC #else int16_t max_bits; diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 8f8bb73601..b910d6fd9f 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -613,7 +613,6 @@ static ivas_error ivas_spar_enc_process( /*-----------------------------------------------------------------------------------------* * DirAC encoding *-----------------------------------------------------------------------------------------*/ - /*tyagiri: TODO: HODIRAC should be disabled for 256 kbps and outputs should be BE w.r.t baseline*/ ivas_dirac_param_est_enc( st_ivas->hDirAC, hQMetaData->q_direction, hQMetaData->useLowerRes, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, st_ivas->sba_mode #ifdef HODIRAC , @@ -734,10 +733,10 @@ static ivas_error ivas_spar_enc_process( else { ivas_spar_set_bitrate_config( &hSpar->hMdEnc->spar_md_cfg, table_idx, -#ifndef ARITH_HUFF_CODER_CHANGES_1 ( hSpar->hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND -#else - ( hSpar->hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : ( ivas_total_brate < IVAS_24k4 ? IVAS_MAX_NUM_BANDS_VLBR : SPAR_DIRAC_SPLIT_START_BAND ) +#ifdef ARITH_HUFF_CODER_CHANGES_1 + , + hSpar->hMdEnc->spar_hoa_dirac2spar_md_flag #endif #ifdef ARITH_HUFF_CODER_CHANGES , diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index c4bfb3b7d2..35bfca23fb 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -341,10 +341,10 @@ ivas_error ivas_spar_md_enc_init( table_idx = ivas_get_spar_table_idx( hEncoderConfig->ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL ); ivas_spar_set_bitrate_config( &hMdEnc->spar_md_cfg, table_idx, -#ifndef ARITH_HUFF_CODER_CHANGES_1 ( hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND -#else - ( hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : ( hEncoderConfig->ivas_total_brate < IVAS_24k4 ? IVAS_MAX_NUM_BANDS_VLBR : SPAR_DIRAC_SPLIT_START_BAND ) +#ifdef ARITH_HUFF_CODER_CHANGES_1 + , + hMdEnc->spar_hoa_dirac2spar_md_flag #endif #ifdef ARITH_HUFF_CODER_CHANGES , -- GitLab From acf5cd1517be2ab0d2a76eba4b84a3a5a9998ba0 Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 18 May 2023 12:12:34 +0200 Subject: [PATCH 220/331] remove outdated "tyagiri: TODO" comment --- lib_enc/ivas_spar_encoder.c | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index fa3350aee1..954995d10e 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -607,7 +607,6 @@ static ivas_error ivas_spar_enc_process( * DirAC encoding *-----------------------------------------------------------------------------------------*/ - /*tyagiri: TODO: HODIRAC should be disabled for 256 kbps and outputs should be BE w.r.t baseline*/ #ifdef HODIRAC hodirac_flag = ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ); #endif -- GitLab From d2fc2f439e7651ba3c9f42199c796d904582377c Mon Sep 17 00:00:00 2001 From: Shikha Shetgeri <100861@ittiam.com> Date: Thu, 18 May 2023 16:47:44 +0530 Subject: [PATCH 221/331] Addressing review comments --- tests/test_sba_bs_dec_plc.py | 7 +++++++ tests/test_sba_bs_enc.py | 36 ++++++++++++++++++++++++++++++++++-- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/tests/test_sba_bs_dec_plc.py b/tests/test_sba_bs_dec_plc.py index e969b28407..f3468a6053 100644 --- a/tests/test_sba_bs_dec_plc.py +++ b/tests/test_sba_bs_dec_plc.py @@ -96,6 +96,9 @@ def test_sba_plc_system( else: pytest.skip() tag = tag + fs + 'c' + gain_flag = -1 + if ivas_br in ['13200','16400','32000']: + gain_flag = 1 # dec sba_dec_plc( @@ -111,6 +114,7 @@ def test_sba_plc_system( SID, plc_pattern, update_ref, + gain_flag, keep_files, ) @@ -130,12 +134,15 @@ def sba_dec_plc( SID, plc_pattern, update_ref, + gain_flag, keep_files, ): # ------------ run cmd ------------ tag_out = f"{tag}_ivasbr{ivas_br[:-3]}k_DTX{dtx}" + if gain_flag != -1: + tag_out += f'_Gain{gain_flag}' plc_tag_out = f"{tag_out}_{plc_pattern}" dut_out_dir = f"{dut_base_path}/sba_bs/raw" diff --git a/tests/test_sba_bs_enc.py b/tests/test_sba_bs_enc.py index 778b6c0c79..7f59dfdf71 100644 --- a/tests/test_sba_bs_enc.py +++ b/tests/test_sba_bs_enc.py @@ -100,6 +100,7 @@ def test_bypass_enc( ivas_br = '256000' dtx = '0' max_bw = "FB" + gain_flag = -1 sba_order = "+1" output_config = "FOA" @@ -120,6 +121,7 @@ def test_bypass_enc( bypass, sba_order, update_ref, + gain_flag, cut_testv=True ) @@ -138,6 +140,7 @@ def test_bypass_enc( bypass, output_config, update_ref, + gain_flag, keep_files, ) @@ -164,6 +167,9 @@ def test_sba_enc_system( fs, ): SID = 0 + gain_flag = -1 + if ivas_br in ['13200','16400','32000']: + gain_flag = 1 if dtx == '1' and ivas_br not in ['13200','16400','32000','64000']: # skip high bitrates for DTX until DTX issue is resolved pytest.skip() @@ -179,6 +185,8 @@ def test_sba_enc_system( bypass = -1 sba_order = "+1" output_config = "FOA" + if gain_flag == 1: + cut_gain = "16.0" if dtx == '1': cut_gain = ".004" else: @@ -200,6 +208,7 @@ def test_sba_enc_system( bypass, sba_order, update_ref, + gain_flag, cut_gain=cut_gain, create_dutenc=True, cut_testv=True @@ -220,6 +229,7 @@ def test_sba_enc_system( bypass, output_config, update_ref, + gain_flag, keep_files, ) @@ -242,6 +252,7 @@ def test_spar_hoa2_enc_system( ): fs = '48' dtx = '0' + gain_flag = -1 tag = tag + fs + 'c' max_bw = "FB" @@ -266,6 +277,7 @@ def test_spar_hoa2_enc_system( bypass, sba_order, update_ref, + gain_flag, ) # dec @@ -283,6 +295,7 @@ def test_spar_hoa2_enc_system( bypass, output_config, update_ref, + gain_flag, keep_files, ) @@ -305,6 +318,8 @@ def test_spar_hoa3_enc_system( ): fs = '48' dtx = '0' + gain_flag = -1 + tag = tag + fs + 'c' max_bw = "FB" bypass = -1 @@ -328,6 +343,7 @@ def test_spar_hoa3_enc_system( bypass, sba_order, update_ref, + gain_flag, ) # dec @@ -345,6 +361,7 @@ def test_spar_hoa3_enc_system( bypass, output_config, update_ref, + gain_flag, keep_files, ) @@ -380,6 +397,7 @@ def test_sba_enc_BWforce_system( bw = sample_rate_bw_idx[1] tag = tag + fs + 'c' bypass = -1 + gain_flag = -1 sba_order = "+1" output_config = "FOA" @@ -400,6 +418,7 @@ def test_sba_enc_BWforce_system( bypass, sba_order, update_ref, + gain_flag, cut_testv=True ) @@ -418,6 +437,7 @@ def test_sba_enc_BWforce_system( bypass, output_config, update_ref, + gain_flag, keep_files, ) @@ -440,6 +460,7 @@ def sba_enc( bypass, sba_order, update_ref, + gain_flag, cut_gain='1.0', create_dutenc=False, cut_testv=False @@ -464,13 +485,18 @@ def sba_enc( if ivas_br == 'sw_24k4_256k.bin': ivas_br = f"{br_switch_file_path}/sw_24k4_256k.bin" short_tag_ext = "" + if gain_flag != -1: + short_tag_ext += f'_Gain{gain_flag}' if SID == 1: short_tag_ext += f'_SID' # we update only bypass = 0/2 (bypass 1 is the same as the baseline) if bypass in [0, 2]: short_tag_ext += f"_pca{bypass}" # to avoid conflicting names in case of parallel test execution, differentiate all cases - long_tag_ext = f"_pca{bypass}" + if gain_flag != -1: + long_tag_ext = f"_Gain{gain_flag}" + else: + long_tag_ext = f"_pca{bypass}" if SID == 1: long_tag_ext += f"_SID" dut_pkt_file = f"{dut_out_dir}/{tag_out}{long_tag_ext}.pkt" @@ -566,6 +592,7 @@ def sba_dec( bypass, output_config, update_ref, + gain_flag, keep_files, ): @@ -578,13 +605,18 @@ def sba_dec( tag_out = f"{tag}_ivasbr{ivas_br[:-3]}k_DTX{dtx}" short_tag_ext = "" + if gain_flag != -1: + short_tag_ext += f'_Gain{gain_flag}' # we update only bypass = 0/2 (bypass 1 is the same as the baseline) if bypass in [0, 2]: short_tag_ext += f"_pca{bypass}" if SID == 1: short_tag_ext += f'_SID_cut' # to avoid conflicting names in case of parallel test execution, differentiate all cases - long_tag_ext = f"_pca{bypass}" + if gain_flag != -1: + long_tag_ext = f"_Gain{gain_flag}" + else: + long_tag_ext = f"_pca{bypass}" if SID == 1: long_tag_ext += f"_SID_cut" dut_out_dir = f"{dut_base_path}/sba_bs/raw" -- GitLab From 2020b81ab4fc4195fd0a152170fe11245ecaa6c7 Mon Sep 17 00:00:00 2001 From: Simon Plain Date: Thu, 18 May 2023 14:18:34 +0200 Subject: [PATCH 222/331] Fix #468 for 16kHz ParamUpmix --- lib_com/options.h | 1 + lib_enc/ivas_mc_paramupmix_enc.c | 26 ++++++++++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index be54df0c71..e993f90ec2 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -198,6 +198,7 @@ #define MC_PARAMUPMIX_MODE /* Dlb: Contribution 39: Multichannel Parametric Upmix */ #define FIX_469_BRSWITCH_PUPMIX /* Dlb: Fix issue 469 for Param Upmix bitrate switching */ +#define FIX_468_16KHZ_PUPMIX /* Dlb: Fix issue 468 for Param Upmix at 16kHz sampling rate */ #define HODIRAC /* FhG: Contribution 32: Sector-based HO-DirAC method for SBA at high bitrates */ #define DIRAC_ALLOC_HARM /* VA: harmonize DirAC parameters allocation/deallocation */ diff --git a/lib_enc/ivas_mc_paramupmix_enc.c b/lib_enc/ivas_mc_paramupmix_enc.c index 6363ee3b13..9c62d1d6a0 100644 --- a/lib_enc/ivas_mc_paramupmix_enc.c +++ b/lib_enc/ivas_mc_paramupmix_enc.c @@ -734,6 +734,9 @@ static void ivas_mc_paramupmix_param_est_enc( int16_t l_ts; int16_t b, i, j, ts, bnd; +#ifdef FIX_468_16KHZ_PUPMIX + int16_t maxbands; +#endif int16_t transient_det[MC_PARAMUPMIX_COMBINATIONS][2]; int16_t transient_det_l[2], transient_det_r[2]; @@ -823,11 +826,18 @@ static void ivas_mc_paramupmix_param_est_enc( ivas_enc_cov_handler_process( hMCParamUpmix->hCovEnc[b], pp_in_fr_real, pp_in_fr_imag, cov_real, cov_dtx_real, hMCParamUpmix->hFbMixer->pFb, 0, hMCParamUpmix->hFbMixer->pFb->filterbank_num_bands, MC_PARAMUPMIX_NCH, 0 /*dtx_vad*/, transient_det[b] ); #endif } - +#ifdef FIX_468_16KHZ_PUPMIX + maxbands = hMCParamUpmix->hFbMixer->pFb->filterbank_num_bands; + for ( b = 0; b < MC_PARAMUPMIX_COMBINATIONS; b++ ) + { + for ( bnd = 0; bnd < maxbands; bnd++ ) + { +#else for ( b = 0; b < MC_PARAMUPMIX_COMBINATIONS; b++ ) { for ( bnd = 0; bnd < IVAS_MAX_NUM_BANDS; bnd++ ) { +#endif rxy = hMCParamUpmix->cov_real[b][1][0][bnd]; ryy = hMCParamUpmix->cov_real[b][1][1][bnd]; cmat = rxy / ( ryy + EPSILON ); @@ -841,7 +851,19 @@ static void ivas_mc_paramupmix_param_est_enc( betas[b][bnd] = (float) 2.0 * wetaux; } } - +#ifdef FIX_468_16KHZ_PUPMIX + if ( maxbands < IVAS_MAX_NUM_BANDS ) + { + for ( b = 0; b < MC_PARAMUPMIX_COMBINATIONS; b++ ) + { + for ( bnd = maxbands; bnd < IVAS_MAX_NUM_BANDS; bnd++ ) + { + alphas[b][bnd] = 0.0; + betas[b][bnd] = 0.0; + } + } + } +#endif return; } -- GitLab From d8e924265ca51765eeb6895b2742dc154cfbe725 Mon Sep 17 00:00:00 2001 From: malenov Date: Thu, 18 May 2023 15:33:18 +0200 Subject: [PATCH 223/331] cleanup: bring back the default macro BITSTREAM_INDICES_MEMORY --- lib_com/options.h | 6 +++++- lib_enc/lib_enc.c | 12 ++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index fafe4307e6..8b948ff5c6 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -133,7 +133,11 @@ #define BASOP_NOGLOB /* Disable global symbols in BASOPs, Overflow/Carry in BASOPs disabled, additional BASOPs in case of Overflow */ #define IND_LIST_DYN /* VA: Issue 18: Dynamic allocation of ind_list[] and ind_list_metadata[] based on # of transport channels */ -//#define DEBUG_IND_LIST +/*#define DEBUG_IND_LIST*/ + +#ifndef IND_LIST_DYN +#define BITSTREAM_INDICES_MEMORY /* Don't count memory for bitstream Indice at the encoder - it is a temporary solution for development only */ +#endif #define LSF_RE_USE_SECONDARY_CHANNEL /* TD stereo Secondary channel LSF Q improvement */ #ifdef LSF_RE_USE_SECONDARY_CHANNEL diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 6e4313e5a2..767750389e 100644 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -125,7 +125,13 @@ ivas_error IVAS_ENC_Open( * Allocate and initialize IVAS application encoder handle *-----------------------------------------------------------------*/ +#ifdef BITSTREAM_INDICES_MEMORY +#define WMC_TOOL_SKIP if ( ( *phIvasEnc = (IVAS_ENC_HANDLE) malloc( sizeof( struct IVAS_ENC ) ) ) == NULL ) +#undef WMC_TOOL_SKIP +#else + if ( ( *phIvasEnc = (IVAS_ENC_HANDLE) malloc( sizeof( struct IVAS_ENC ) ) ) == NULL ) +#endif { return IVAS_ERR_FAILED_ALLOC; } @@ -238,7 +244,13 @@ void IVAS_ENC_Close( ( *phIvasEnc )->st_ivas = NULL; +#ifdef BITSTREAM_INDICES_MEMORY +#define WMC_TOOL_SKIP free( *phIvasEnc ); +#undef WMC_TOOL_SKIP +#else + free( *phIvasEnc ); +#endif *phIvasEnc = NULL; phIvasEnc = NULL; -- GitLab From 238a397f0fff44da5cae0006a175469327e920c1 Mon Sep 17 00:00:00 2001 From: malenov Date: Thu, 18 May 2023 15:53:24 +0200 Subject: [PATCH 224/331] avoid reset_indices_enc() in MC_PARAMUPMIX_MODE --- lib_enc/ivas_init_enc.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index 6ca627e58d..1a53481270 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -686,6 +686,7 @@ ivas_error ivas_init_encoder( return error; } +#ifndef IND_LIST_DYN for ( n = 0; n < CPE_CHANNELS; n++ ) { /* we need the correct bitstream also for the LFE channel since it might become a proper coded channel when @@ -699,6 +700,7 @@ ivas_error ivas_init_encoder( st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[st_ivas->nSCE]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA ); } +#endif } if ( ( error = create_mct_enc( st_ivas ) ) != IVAS_ERR_OK ) -- GitLab From 5ee9f16dcce5b0fc5502d71850a8efcaa698e05f Mon Sep 17 00:00:00 2001 From: Vidhya V P <100825@ittiam.com> Date: Fri, 19 May 2023 12:59:12 +0530 Subject: [PATCH 225/331] Minor change --- lib_enc/ivas_sba_enc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index 8659e7c3e5..36c3ceaa1a 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -296,7 +296,7 @@ int16_t ivas_sba_get_max_md_bits( max_md_bits = min( st_ivas->hQMetaData->metadata_max_bits + 1, 500 ); // TODO: remove 500 once max MD bits has been defined at all bitrates in DirAC #else int16_t max_bits; - if ( ( st_ivas->sba_analysis_order > 1 ) && ( st_ivas->hEncoderConfig->ivas_total_brate > IVAS_256k ) ) + if ( ivas_get_hodirac_flag( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ) ) { max_bits = 2000; } -- GitLab From cc645b5569589c48023536214077630489f75545 Mon Sep 17 00:00:00 2001 From: malenov Date: Fri, 19 May 2023 10:40:41 +0200 Subject: [PATCH 226/331] set correct pointer in ind_list_realloc() --- lib_com/bitstream.c | 37 +++++++++++++++------------ lib_enc/init_enc.c | 2 +- lib_enc/ivas_corecoder_enc_reconfig.c | 2 +- lib_enc/ivas_cpe_enc.c | 2 +- lib_enc/ivas_sce_enc.c | 2 +- lib_enc/ivas_spar_md_enc.c | 2 +- lib_enc/ivas_stereo_td_enc.c | 2 +- lib_enc/lib_enc.c | 8 +++--- lib_enc/stat_enc.h | 2 +- 9 files changed, 31 insertions(+), 28 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index fc00482955..741095d2a3 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -244,12 +244,12 @@ ivas_error ind_list_realloc( /* move indices from the old list to the new list */ for ( i = 0; i < min( max_num_indices, *( hBstr->ivas_max_num_indices ) ); i++ ) { - if ( hBstr->ivas_ind_list_zero[i].nb_bits > -1 ) + if ( (* hBstr->ivas_ind_list_zero)[i].nb_bits > -1 ) { - new_ind_list[i].id = hBstr->ivas_ind_list_zero[i].id; - new_ind_list[i].value = hBstr->ivas_ind_list_zero[i].value; + new_ind_list[i].id = ( *hBstr->ivas_ind_list_zero )[i].id; + new_ind_list[i].value = ( *hBstr->ivas_ind_list_zero )[i].value; } - new_ind_list[i].nb_bits = hBstr->ivas_ind_list_zero[i].nb_bits; + new_ind_list[i].nb_bits = ( *hBstr->ivas_ind_list_zero )[i].nb_bits; } /* reset nb_bits of all other indices to -1 */ @@ -259,14 +259,14 @@ ivas_error ind_list_realloc( } /* get the current position inside the old list */ - ind_list_pos = (int16_t) ( hBstr->ind_list - hBstr->ivas_ind_list_zero ); + ind_list_pos = ( int16_t )( hBstr->ind_list - ( *hBstr->ivas_ind_list_zero ) ); /* free the old list */ - free( hBstr->ivas_ind_list_zero ); + free( ( *hBstr->ivas_ind_list_zero ) ); /* set pointers in the new list */ hBstr->ind_list = &new_ind_list[ind_list_pos]; - hBstr->ivas_ind_list_zero = new_ind_list; + *( hBstr->ivas_ind_list_zero ) = new_ind_list; /* set the new maximum number of indices */ *( hBstr->ivas_max_num_indices ) = max_num_indices; @@ -730,7 +730,7 @@ int16_t get_ivas_max_num_indices_metadata( /* o { if ( ivas_total_brate <= IVAS_16k4 ) { - return 40; + return 60; } else { @@ -749,7 +749,7 @@ int16_t get_ivas_max_num_indices_metadata( /* o } else { - return 30; + return 80; } } else if ( ivas_format == SBA_FORMAT ) @@ -776,11 +776,11 @@ int16_t get_ivas_max_num_indices_metadata( /* o } else if ( ivas_total_brate <= IVAS_384k ) { - return 1000; + return 1500; } else { - return 1000; + return 2000; } } else if ( ivas_format == MASA_FORMAT ) @@ -819,11 +819,11 @@ int16_t get_ivas_max_num_indices_metadata( /* o } else if ( ivas_total_brate <= IVAS_384k ) { - return 850; + return 1000; } else { - return 900; + return 1500; } } else if ( ivas_format == MC_FORMAT ) @@ -846,7 +846,7 @@ int16_t get_ivas_max_num_indices_metadata( /* o } else { - return 60; + return 300; } } @@ -910,13 +910,15 @@ ivas_error check_ind_list_limits( BSTR_ENC_HANDLE hBstr /* i/o: encoder bitstream handle */ ) { + Indice *ivas_ind_list_zero, *ivas_ind_list_last; ivas_error error; error = IVAS_ERR_OK; + ivas_ind_list_zero = *( hBstr->ivas_ind_list_zero ); /* check, if the maximum number of indices has been reached and re-allocate the buffer */ /* the re-allocation can be avoided by increasing the limits in get_ivas_max_num_indices() or get_ivas_max_num_indices_metadata() */ - if ( ( &hBstr->ind_list[hBstr->nb_ind_tot] - hBstr->ivas_ind_list_zero ) >= *( hBstr->ivas_max_num_indices ) ) + if ( ( &hBstr->ind_list[hBstr->nb_ind_tot] - ivas_ind_list_zero ) >= *( hBstr->ivas_max_num_indices ) ) { #ifdef DEBUGGING fprintf( stderr, "Warning: The maximum number of indices %d has been exceeded in frame %d! Increase the limits in get_ivas_max_num_indices() or get_max_num_indices_metadata().\n", *( hBstr->ivas_max_num_indices ), frame ); @@ -935,12 +937,13 @@ ivas_error check_ind_list_limits( fprintf( stderr, "Warning: Trying to overwrite an existing indice ID = %d in frame %d!\n", hBstr->ind_list[hBstr->nb_ind_tot].id, frame ); #endif /* move the pointer to the next available empty slot */ - while ( hBstr->ind_list[0].nb_bits > 0 && hBstr->ind_list < &hBstr->ivas_ind_list_zero[*( hBstr->ivas_max_num_indices )] ) + ivas_ind_list_last = &ivas_ind_list_zero[*( hBstr->ivas_max_num_indices )]; + while ( hBstr->ind_list[0].nb_bits > 0 && hBstr->ind_list < ivas_ind_list_last ) { hBstr->ind_list++; } - if ( hBstr->ind_list >= &hBstr->ivas_ind_list_zero[*( hBstr->ivas_max_num_indices )] ) + if ( hBstr->ind_list >= ivas_ind_list_last ) { #ifdef DEBUGGING fprintf( stderr, "Warning: The maximum number of indices %d has been exceeded in frame %d! Increase the limits in get_ivas_max_num_indices() or get_max_num_indices_metadata().\n", *( hBstr->ivas_max_num_indices ), frame ); diff --git a/lib_enc/init_enc.c b/lib_enc/init_enc.c index 5c04e65e7e..42b4e8957d 100644 --- a/lib_enc/init_enc.c +++ b/lib_enc/init_enc.c @@ -119,7 +119,7 @@ ivas_error init_encoder( #ifdef IND_LIST_DYN /* set pointer to the buffer of indices */ st->hBstr->ind_list = st_ivas->ind_list; - st->hBstr->ivas_ind_list_zero = st_ivas->ind_list; + st->hBstr->ivas_ind_list_zero = &st_ivas->ind_list; st->hBstr->ivas_max_num_indices = &st_ivas->ivas_max_num_indices; st->hBstr->nb_ind_tot = 0; st->hBstr->nb_bits_tot = 0; diff --git a/lib_enc/ivas_corecoder_enc_reconfig.c b/lib_enc/ivas_corecoder_enc_reconfig.c index cb59732244..f838fe36d3 100644 --- a/lib_enc/ivas_corecoder_enc_reconfig.c +++ b/lib_enc/ivas_corecoder_enc_reconfig.c @@ -552,7 +552,7 @@ ivas_error ivas_corecoder_enc_reconfig( #ifdef IND_LIST_DYN /* set pointer to the buffer of metadata indices */ st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->ind_list = st_ivas->ind_list_metadata; - st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->ivas_ind_list_zero = st_ivas->ind_list_metadata; + st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->ivas_ind_list_zero = &st_ivas->ind_list_metadata; st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->ivas_max_num_indices = &st_ivas->ivas_max_num_indices_metadata; st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->nb_ind_tot = 0; st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->nb_bits_tot = 0; diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index af11d07706..85448a6e4f 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -821,7 +821,7 @@ ivas_error create_cpe_enc( #ifdef IND_LIST_DYN /* set pointer to the buffer of metadata indices */ hCPE->hMetaData->ind_list = st_ivas->ind_list_metadata; - hCPE->hMetaData->ivas_ind_list_zero = st_ivas->ind_list_metadata; + hCPE->hMetaData->ivas_ind_list_zero = &st_ivas->ind_list_metadata; hCPE->hMetaData->ivas_max_num_indices = &st_ivas->ivas_max_num_indices_metadata; reset_indices_enc( hCPE->hMetaData, st_ivas->ivas_max_num_indices_metadata ); #endif diff --git a/lib_enc/ivas_sce_enc.c b/lib_enc/ivas_sce_enc.c index 649d378ce0..1b3eac4f1a 100644 --- a/lib_enc/ivas_sce_enc.c +++ b/lib_enc/ivas_sce_enc.c @@ -316,7 +316,7 @@ ivas_error create_sce_enc( #ifdef IND_LIST_DYN /* set pointer to the buffer of metadata indices */ hSCE->hMetaData->ind_list = st_ivas->ind_list_metadata; - hSCE->hMetaData->ivas_ind_list_zero = st_ivas->ind_list_metadata; + hSCE->hMetaData->ivas_ind_list_zero = &st_ivas->ind_list_metadata; hSCE->hMetaData->ivas_max_num_indices = &st_ivas->ivas_max_num_indices_metadata; reset_indices_enc( hSCE->hMetaData, st_ivas->ivas_max_num_indices_metadata ); #endif diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index 6a0573081d..d96526375f 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -651,7 +651,7 @@ ivas_error ivas_spar_md_enc_process( #ifdef IND_LIST_DYN max_num_indices_tmp = MAX_BITS_METADATA; hMetaData_tmp.ivas_max_num_indices = &max_num_indices_tmp; - hMetaData_tmp.ivas_ind_list_zero = ind_list_tmp; + hMetaData_tmp.ivas_ind_list_zero = (Indice **) ( &hMetaData_tmp.ind_list ); #endif /* Save state of metadata bitstream buffer */ diff --git a/lib_enc/ivas_stereo_td_enc.c b/lib_enc/ivas_stereo_td_enc.c index 28cb1dfeb1..2357e307c5 100644 --- a/lib_enc/ivas_stereo_td_enc.c +++ b/lib_enc/ivas_stereo_td_enc.c @@ -126,7 +126,7 @@ void stereo_td_init_enc( #ifdef IND_LIST_DYN hStereoTD->tdm_hBstr_tmp.ind_list = hStereoTD->tdm_ind_list_tmp; - hStereoTD->tdm_hBstr_tmp.ivas_ind_list_zero = hStereoTD->tdm_ind_list_tmp; + hStereoTD->tdm_hBstr_tmp.ivas_ind_list_zero = (Indice **) ( &hStereoTD->tdm_hBstr_tmp.ind_list ); hStereoTD->max_ind_tdm_tmp = MAX_IND_TDM_TMP; hStereoTD->tdm_hBstr_tmp.ivas_max_num_indices = &hStereoTD->max_ind_tdm_tmp; reset_indices_enc( &hStereoTD->tdm_hBstr_tmp, MAX_IND_TDM_TMP ); diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index ed985b8360..f39a621ef9 100755 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -1206,12 +1206,12 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( for ( n = 0; n < st_ivas->nSCE; n++ ) { st_ivas->hSCE[n]->hCoreCoder[0]->hBstr->ind_list = st_ivas->ind_list; - st_ivas->hSCE[n]->hCoreCoder[0]->hBstr->ivas_ind_list_zero = st_ivas->ind_list; + st_ivas->hSCE[n]->hCoreCoder[0]->hBstr->ivas_ind_list_zero = &st_ivas->ind_list; if ( st_ivas->hSCE[n]->hMetaData != NULL ) { st_ivas->hSCE[n]->hMetaData->ind_list = st_ivas->ind_list_metadata; - st_ivas->hSCE[n]->hMetaData->ivas_ind_list_zero = st_ivas->ind_list_metadata; + st_ivas->hSCE[n]->hMetaData->ivas_ind_list_zero = &st_ivas->ind_list_metadata; } } @@ -1220,13 +1220,13 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { st_ivas->hCPE[n]->hCoreCoder[ch]->hBstr->ind_list = st_ivas->ind_list; - st_ivas->hCPE[n]->hCoreCoder[ch]->hBstr->ivas_ind_list_zero = st_ivas->ind_list; + st_ivas->hCPE[n]->hCoreCoder[ch]->hBstr->ivas_ind_list_zero = &st_ivas->ind_list; } if ( st_ivas->hCPE[n]->hMetaData != NULL ) { st_ivas->hCPE[n]->hMetaData->ind_list = st_ivas->ind_list_metadata; - st_ivas->hCPE[n]->hMetaData->ivas_ind_list_zero = st_ivas->ind_list_metadata; + st_ivas->hCPE[n]->hMetaData->ivas_ind_list_zero = &st_ivas->ind_list_metadata; } } } diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index fe4b00d849..60d14dce0b 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -83,7 +83,7 @@ typedef struct bitstream_enc_data_structure #endif #ifdef IND_LIST_DYN int16_t *ivas_max_num_indices; /* maximum total number of indices in the list */ - Indice *ivas_ind_list_zero; /* beginning of the buffer of indices */ + Indice **ivas_ind_list_zero; /* beginning of the buffer of indices */ #endif } BSTR_ENC_DATA, *BSTR_ENC_HANDLE; -- GitLab From 550696b2fd6ac42c9b81f2c49f09abeed5d728ce Mon Sep 17 00:00:00 2001 From: malenov Date: Fri, 19 May 2023 10:55:25 +0200 Subject: [PATCH 227/331] clang format + removal of debugging code --- apps/encoder.c | 2 -- lib_com/bitstream.c | 4 ++-- lib_com/options.h | 1 - lib_enc/evs_enc.c | 16 ++-------------- lib_enc/ivas_core_enc.c | 26 -------------------------- lib_enc/ivas_cpe_enc.c | 6 +++--- lib_enc/ivas_ism_enc.c | 2 +- lib_enc/ivas_mdct_core_enc.c | 2 +- lib_enc/lib_enc.c | 25 ------------------------- lib_enc/stat_enc.h | 2 +- 10 files changed, 10 insertions(+), 76 deletions(-) diff --git a/apps/encoder.c b/apps/encoder.c index 57ce805850..a23970a270 100644 --- a/apps/encoder.c +++ b/apps/encoder.c @@ -757,12 +757,10 @@ int main( } frame++; -#ifndef DEBUG_IND_LIST if ( !arg.quietModeEnabled ) { fprintf( stdout, "%-8d\b\b\b\b\b\b\b\b", frame ); } -#endif #ifdef WMOPS update_mem(); diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index 741095d2a3..38c5baf953 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -244,7 +244,7 @@ ivas_error ind_list_realloc( /* move indices from the old list to the new list */ for ( i = 0; i < min( max_num_indices, *( hBstr->ivas_max_num_indices ) ); i++ ) { - if ( (* hBstr->ivas_ind_list_zero)[i].nb_bits > -1 ) + if ( ( *hBstr->ivas_ind_list_zero )[i].nb_bits > -1 ) { new_ind_list[i].id = ( *hBstr->ivas_ind_list_zero )[i].id; new_ind_list[i].value = ( *hBstr->ivas_ind_list_zero )[i].value; @@ -259,7 +259,7 @@ ivas_error ind_list_realloc( } /* get the current position inside the old list */ - ind_list_pos = ( int16_t )( hBstr->ind_list - ( *hBstr->ivas_ind_list_zero ) ); + ind_list_pos = (int16_t) ( hBstr->ind_list - ( *hBstr->ivas_ind_list_zero ) ); /* free the old list */ free( ( *hBstr->ivas_ind_list_zero ) ); diff --git a/lib_com/options.h b/lib_com/options.h index 5fbdacacdb..c9216048ab 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -135,7 +135,6 @@ #define BASOP_NOGLOB /* Disable global symbols in BASOPs, Overflow/Carry in BASOPs disabled, additional BASOPs in case of Overflow */ #define IND_LIST_DYN /* VA: Issue 18: Dynamic allocation of ind_list[] and ind_list_metadata[] based on # of transport channels */ -/*#define DEBUG_IND_LIST*/ #ifndef IND_LIST_DYN #define BITSTREAM_INDICES_MEMORY /* Don't count memory for bitstream Indice at the encoder - it is a temporary solution for development only */ diff --git a/lib_enc/evs_enc.c b/lib_enc/evs_enc.c index e5457f1d0e..c45bb444f3 100644 --- a/lib_enc/evs_enc.c +++ b/lib_enc/evs_enc.c @@ -99,12 +99,11 @@ ivas_error evs_enc( int16_t pitch_orig[3]; /* original open-loop pitch values that might be altered in core_acelp_tcx20_switching() within MODE2 */ #endif ivas_error error; -#ifdef DEBUG_IND_LIST - int16_t old_nb_ind; -#endif + error = IVAS_ERR_OK; push_wmops( "evs_enc" ); + /*------------------------------------------------------------------* * Initialization *-----------------------------------------------------------------*/ @@ -383,10 +382,6 @@ ivas_error evs_enc( *---------------------------------------------------------------------*/ push_wmops( "BWE_encoding" ); -#ifdef DEBUG_IND_LIST - old_nb_ind = st->hBstr->nb_ind_tot; -#endif - if ( st->input_Fs >= 16000 && st->bwidth < SWB ) { /* Common pre-processing for WB TBE and WB BWE */ @@ -508,13 +503,6 @@ ivas_error evs_enc( st->codec_mode = MODE2; } -#ifdef DEBUG_IND_LIST - if ( st->hBstr->nb_ind_tot - old_nb_ind > 0 ) - { - fprintf( stdout, "Total number of allocated indices (BWE): %d, bitrate: %d, #indices: %d\n", st->extl, st->extl_brate, st->hBstr->nb_ind_tot - old_nb_ind ); - } -#endif - #ifdef DEBUG_MODE_INFO dbgwrite( &st->codec_mode, sizeof( int16_t ), 1, input_frame, "res/codec" ); dbgwrite( &st->core, sizeof( int16_t ), 1, input_frame, "res/core" ); diff --git a/lib_enc/ivas_core_enc.c b/lib_enc/ivas_core_enc.c index f99b27cb29..639722b41e 100644 --- a/lib_enc/ivas_core_enc.c +++ b/lib_enc/ivas_core_enc.c @@ -105,9 +105,6 @@ ivas_error ivas_core_enc( ivas_error error; #ifdef IND_LIST_DYN int16_t max_num_indices_BWE; -#ifdef DEBUG_IND_LIST - int16_t old_nb_ind; -#endif #endif push_wmops( "ivas_core_enc" ); @@ -322,10 +319,6 @@ ivas_error ivas_core_enc( { st = sts[n]; -#ifdef DEBUG_IND_LIST - old_nb_ind = st->hBstr->nb_ind_tot; -#endif - /*---------------------------------------------------------------------* * Postprocessing for ACELP/HQ core switching *---------------------------------------------------------------------*/ @@ -432,26 +425,7 @@ ivas_error ivas_core_enc( updt_enc_common( st ); } -#ifdef DEBUG_IND_LIST - if ( sts[n]->hBstr->nb_ind_tot - old_nb_ind > 0 ) - { - fprintf( stdout, "Total number of allocated indices (BWE): %d, bitrate: %d, #indices: %d\n", sts[n]->extl, sts[n]->extl_brate, sts[n]->hBstr->nb_ind_tot - old_nb_ind ); - } -#endif - } - -#ifdef IND_LIST_DYN -#ifdef DEBUG_IND_LIST - for ( n = 0; n < n_CoreChannels; n++ ) - { - if ( sts[n]->hBstr->nb_ind_tot > 0 ) - { - fprintf( stdout, "Total number of allocated indices (core): %d, bitrate: %d, #indices: %d\n", sts[n]->core, sts[n]->total_brate, sts[n]->hBstr->nb_ind_tot ); - } } -#endif -#endif - #ifdef DEBUG_MODE_INFO for ( n = 0; n < n_CoreChannels; n++ ) diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index 85448a6e4f..ab4a36cb5f 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -843,9 +843,9 @@ ivas_error create_cpe_enc( st->mct_chan_mode = MCT_CHAN_MODE_REGULAR; if ( ( error = init_encoder( st, #ifdef IND_LIST_DYN - st_ivas, -#endif - n, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 0, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) + st_ivas, +#endif + n, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 0, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_enc/ivas_ism_enc.c b/lib_enc/ivas_ism_enc.c index ffceb71607..bfa1342bb5 100644 --- a/lib_enc/ivas_ism_enc.c +++ b/lib_enc/ivas_ism_enc.c @@ -88,7 +88,7 @@ ivas_error ivas_ism_enc( int16_t nchan_ism, dtx_flag, sid_flag, flag_noisy_speech; int16_t md_diff_flag[MAX_NUM_OBJECTS]; #ifdef IND_LIST_DYN - Encoder_State* prev_st = NULL; + Encoder_State *prev_st = NULL; #endif ivas_error error; diff --git a/lib_enc/ivas_mdct_core_enc.c b/lib_enc/ivas_mdct_core_enc.c index 0f13402ca1..b3f76cc4ab 100644 --- a/lib_enc/ivas_mdct_core_enc.c +++ b/lib_enc/ivas_mdct_core_enc.c @@ -1424,7 +1424,7 @@ void ivas_mdct_quant_coder( #ifdef IND_LIST_DYN /* update the pointer to the buffer of indices of the second channel */ - if (ch > 0) + if ( ch > 0 ) { st->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; } diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index f39a621ef9..3da409f6ae 100755 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -1272,31 +1272,6 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( } } - -#ifdef DEBUG_IND_LIST - int16_t total_nb_ind = 0; - for ( i = 0; i < st_ivas->ivas_max_num_indices; i++ ) - { - if ( st_ivas->ind_list[i].nb_bits > -1 ) - { - total_nb_ind++; - } - } - - fprintf( stdout, "Total number of allocated indices (codec): IVAS format: %d, bitrate: %d, #indices: %d\n", hEncoderConfig->ivas_format, hEncoderConfig->ivas_total_brate, total_nb_ind ); - - total_nb_ind = 0; - for ( i = 0; i < st_ivas->ivas_max_num_indices_metadata; i++ ) - { - if ( st_ivas->ind_list_metadata[i].nb_bits > -1 ) - { - total_nb_ind++; - } - } - - fprintf( stdout, "Total number of allocated indices (metadata): IVAS format: %d, bitrate: %d, #indices: %d\n", hEncoderConfig->ivas_format, hEncoderConfig->ivas_total_brate, total_nb_ind ); -#endif - /* write indices into bitstream buffer */ write_indices_ivas( st_ivas, outputBitStream, numOutBits ); diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index 60d14dce0b..77c0ea3d34 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -83,7 +83,7 @@ typedef struct bitstream_enc_data_structure #endif #ifdef IND_LIST_DYN int16_t *ivas_max_num_indices; /* maximum total number of indices in the list */ - Indice **ivas_ind_list_zero; /* beginning of the buffer of indices */ + Indice **ivas_ind_list_zero; /* beginning of the buffer of indices */ #endif } BSTR_ENC_DATA, *BSTR_ENC_HANDLE; -- GitLab From baff7159ba767ebed9d01ce8f0697be38c415776 Mon Sep 17 00:00:00 2001 From: Vladimir Malenovsky Date: Fri, 19 May 2023 11:06:05 +0200 Subject: [PATCH 228/331] more clang foratting --- lib_enc/ivas_core_enc.c | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_enc/ivas_core_enc.c b/lib_enc/ivas_core_enc.c index 639722b41e..6536ee333e 100644 --- a/lib_enc/ivas_core_enc.c +++ b/lib_enc/ivas_core_enc.c @@ -424,7 +424,6 @@ ivas_error ivas_core_enc( { updt_enc_common( st ); } - } #ifdef DEBUG_MODE_INFO -- GitLab From 095a68a4157089f9c176d63209fc0f110901526d Mon Sep 17 00:00:00 2001 From: Simon Plain Date: Fri, 19 May 2023 11:15:25 +0200 Subject: [PATCH 229/331] Fix covariance smoothing for ParamUpmix --- lib_com/cnst.h | 8 ++++ lib_com/ivas_cov_smooth.c | 77 +++++++++++++++++++++++++------- lib_com/ivas_prot.h | 6 +++ lib_com/options.h | 2 + lib_enc/ivas_enc_cov_handler.c | 21 +++++++++ lib_enc/ivas_mc_paramupmix_enc.c | 4 ++ lib_enc/ivas_spar_encoder.c | 4 ++ 7 files changed, 106 insertions(+), 16 deletions(-) diff --git a/lib_com/cnst.h b/lib_com/cnst.h index cd3aa07c48..709308bcae 100644 --- a/lib_com/cnst.h +++ b/lib_com/cnst.h @@ -2244,5 +2244,13 @@ enum VOIP_RTPDUMP }; +#ifdef FIX_489_COV_SMOOTHING +enum +{ + COV_SMOOTH_SPAR, + COV_SMOOTH_MC +}; +#endif + /* clang-format on */ #endif /* CNST_H */ diff --git a/lib_com/ivas_cov_smooth.c b/lib_com/ivas_cov_smooth.c index 7a24396606..21c5ed0b0e 100644 --- a/lib_com/ivas_cov_smooth.c +++ b/lib_com/ivas_cov_smooth.c @@ -39,6 +39,10 @@ #include "wmc_auto.h" #include "prot.h" +#ifdef FIX_489_COV_SMOOTHING +#include "cnst.h" +#endif + #define BAND_SMOOTH_REST_START_IDX ( 2 ) /*-----------------------------------------------------------------------------------------* * Function ivas_set_up_cov_smoothing() @@ -51,6 +55,10 @@ static void ivas_set_up_cov_smoothing( ivas_filterbank_t *pFb, const float max_update_rate, const int16_t min_pool_size +#ifdef FIX_489_COV_SMOOTHING + , + const int16_t smooth_mode /* i : flag multichannel vs SPAR */ +#endif #ifndef FIX_331_ALL_BRS , const int16_t nchan_inp /* i : number of input channels */ @@ -93,9 +101,8 @@ static void ivas_set_up_cov_smoothing( } } } - else -#ifndef FIX_331_ALL_BRS - if ( nchan_inp <= FOA_CHANNELS ) +#ifdef FIX_489_COV_SMOOTHING + else if ( smooth_mode == COV_SMOOTH_MC ) { for ( j = 0; j < pFb->filterbank_num_bands; j++ ) { @@ -118,25 +125,52 @@ static void ivas_set_up_cov_smoothing( else { #endif - for ( j = 0; j < pFb->filterbank_num_bands; j++ ) +#ifndef FIX_331_ALL_BRS + if ( nchan_inp <= FOA_CHANNELS ) { - float update_factor; - float *p_bin_to_band; - int16_t active_bins; - update_factor = 0.0f; - p_bin_to_band = pFb->fb_bin_to_band.pp_short_stride_bin_to_band[j]; - active_bins = pFb->fb_bin_to_band.p_short_stride_num_bins_per_band[j]; - for ( k = 0; k < active_bins; k++ ) + for ( j = 0; j < pFb->filterbank_num_bands; j++ ) { - update_factor += p_bin_to_band[k]; + float update_factor; + update_factor = 0.0f; + + for ( k = 0; k < pFb->fb_bin_to_band.pFb_active_bins_per_band[j]; k++ ) + { + update_factor += pFb->fb_bin_to_band.pFb_bin_to_band[j][k]; + } + + hCovState->pSmoothing_factor[j] = update_factor / min_pool_size; + + if ( hCovState->pSmoothing_factor[j] > max_update_rate ) + { + hCovState->pSmoothing_factor[j] = max_update_rate; + } } - hCovState->pSmoothing_factor[j] = update_factor / min_pool_size; - hCovState->pSmoothing_factor[j] *= ( j + 1 ) * 0.75f; - if ( hCovState->pSmoothing_factor[j] > max_update_rate ) + } + else + { +#endif + for ( j = 0; j < pFb->filterbank_num_bands; j++ ) { - hCovState->pSmoothing_factor[j] = max_update_rate; + float update_factor; + float *p_bin_to_band; + int16_t active_bins; + update_factor = 0.0f; + p_bin_to_band = pFb->fb_bin_to_band.pp_short_stride_bin_to_band[j]; + active_bins = pFb->fb_bin_to_band.p_short_stride_num_bins_per_band[j]; + for ( k = 0; k < active_bins; k++ ) + { + update_factor += p_bin_to_band[k]; + } + hCovState->pSmoothing_factor[j] = update_factor / min_pool_size; + hCovState->pSmoothing_factor[j] *= ( j + 1 ) * 0.75f; + if ( hCovState->pSmoothing_factor[j] > max_update_rate ) + { + hCovState->pSmoothing_factor[j] = max_update_rate; + } } +#ifdef FIX_489_COV_SMOOTHING } +#endif #ifndef FIX_331_ALL_BRS } #endif @@ -158,6 +192,9 @@ ivas_error ivas_spar_covar_smooth_enc_open( ivas_filterbank_t *pFb, /* i/o: FB handle */ const int16_t nchan_inp /* i : number of input channels */ , +#ifdef FIX_489_COV_SMOOTHING + int16_t smooth_mode, +#endif const int32_t ivas_total_brate /* i : IVAS total bitrate */ ) { @@ -188,9 +225,17 @@ ivas_error ivas_spar_covar_smooth_enc_open( #ifndef FIX_331_ALL_BRS +#ifdef FIX_489_COV_SMOOTHING + ivas_set_up_cov_smoothing( hCovState, pFb, cov_smooth_cfg->max_update_rate, cov_smooth_cfg->min_pool_size, smooth_mode, ivas_total_brate ); +#else ivas_set_up_cov_smoothing( hCovState, pFb, cov_smooth_cfg->max_update_rate, cov_smooth_cfg->min_pool_size, nchan_inp, ivas_total_brate ); +#endif +#else +#ifdef FIX_489_COV_SMOOTHING + ivas_set_up_cov_smoothing( hCovState, pFb, cov_smooth_cfg->max_update_rate, cov_smooth_cfg->min_pool_size, smooth_mode, ivas_total_brate ); #else ivas_set_up_cov_smoothing( hCovState, pFb, cov_smooth_cfg->max_update_rate, cov_smooth_cfg->min_pool_size, ivas_total_brate ); +#endif #endif *hCovState_out = hCovState; diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 5d4faf0eb0..092851d49e 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -4794,6 +4794,9 @@ ivas_error ivas_spar_covar_enc_open( const int32_t input_Fs, /* i : input sampling rate */ const int16_t nchan_inp /* i : number of input channels */ , +#ifdef FIX_489_COV_SMOOTHING + int16_t smooth_mode, +#endif const int32_t ivas_total_brate /* i : IVAS total bitrate */ ); @@ -4826,6 +4829,9 @@ ivas_error ivas_spar_covar_smooth_enc_open( ivas_filterbank_t *pFb, /* i/o: FB handle */ const int16_t nchan_inp /* i : number of input channels */ , +#ifdef FIX_489_COV_SMOOTHING + int16_t smooth_mode, +#endif const int32_t ivas_total_brate /* i : IVAS total bitrate */ ); diff --git a/lib_com/options.h b/lib_com/options.h index be54df0c71..a31105684b 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -223,6 +223,8 @@ #define FIX_487_LOWRATE_SBA_TUNING_FIX /* Dlb: TUning fix for low bitrate cases to match theoretical longest SPAR MD bitstream */ +#define FIX_489_COV_SMOOTHING /* Dlb: Fix covariance smoothing for ParamUpmix */ + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_enc/ivas_enc_cov_handler.c b/lib_enc/ivas_enc_cov_handler.c index 6575d751a9..9b3337126f 100644 --- a/lib_enc/ivas_enc_cov_handler.c +++ b/lib_enc/ivas_enc_cov_handler.c @@ -75,6 +75,9 @@ ivas_error ivas_spar_covar_enc_open( const int32_t input_Fs, /* i : input sampling rate */ const int16_t nchan_inp /* i : number of input channels */ , +#ifdef FIX_489_COV_SMOOTHING + int16_t smooth_mode, +#endif const int32_t ivas_total_brate /* i : IVAS total bitrate */ ) { @@ -92,6 +95,15 @@ ivas_error ivas_spar_covar_enc_open( cov_smooth_cfg.max_bands = IVAS_MAX_NUM_BANDS; cov_smooth_cfg.max_update_rate = MAX_UPDATE_RATE; cov_smooth_cfg.min_pool_size = MIN_POOL_SIZE; +#ifdef FIX_489_COV_SMOOTHING +#ifdef MC_PARAMUPMIX_MODE + if ( smooth_mode == COV_SMOOTH_MC ) + { + cov_smooth_cfg.max_update_rate = 1.0f; + cov_smooth_cfg.min_pool_size = 20; + } +#endif +#else #ifdef MC_PARAMUPMIX_MODE if ( nchan_inp == 3 ) /* to discriminate between SPAR and mc there could be a better solution */ { @@ -99,8 +111,13 @@ ivas_error ivas_spar_covar_enc_open( cov_smooth_cfg.min_pool_size = 20; } #endif +#endif +#ifdef FIX_489_COV_SMOOTHING + if ( ( error = ivas_spar_covar_smooth_enc_open( &hCovState->pCov_state, &cov_smooth_cfg, pFb, nchan_inp, smooth_mode, ivas_total_brate ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_spar_covar_smooth_enc_open( &hCovState->pCov_state, &cov_smooth_cfg, pFb, nchan_inp, ivas_total_brate ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -108,7 +125,11 @@ ivas_error ivas_spar_covar_enc_open( cov_smooth_cfg.max_update_rate = MAX_UPDATE_RATE_DTX; cov_smooth_cfg.min_pool_size = MIN_POOL_SIZE_DTX; +#ifdef FIX_489_COV_SMOOTHING + if ( ( error = ivas_spar_covar_smooth_enc_open( &hCovState->pCov_dtx_state, &cov_smooth_cfg, pFb, nchan_inp, smooth_mode, ivas_total_brate ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_spar_covar_smooth_enc_open( &hCovState->pCov_dtx_state, &cov_smooth_cfg, pFb, nchan_inp, ivas_total_brate ) ) != IVAS_ERR_OK ) +#endif { return error; } diff --git a/lib_enc/ivas_mc_paramupmix_enc.c b/lib_enc/ivas_mc_paramupmix_enc.c index 6363ee3b13..945f5af665 100644 --- a/lib_enc/ivas_mc_paramupmix_enc.c +++ b/lib_enc/ivas_mc_paramupmix_enc.c @@ -211,7 +211,11 @@ ivas_error ivas_mc_paramupmix_enc_open( for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) { /* Covariance handle */ +#ifdef FIX_489_COV_SMOOTHING + if ( ( error = ivas_spar_covar_enc_open( &( hMCParamUpmix->hCovEnc[i] ), hMCParamUpmix->hFbMixer->pFb, input_Fs, MC_PARAMUPMIX_NCH + 1, COV_SMOOTH_MC, st_ivas->hEncoderConfig->ivas_total_brate ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_spar_covar_enc_open( &( hMCParamUpmix->hCovEnc[i] ), hMCParamUpmix->hFbMixer->pFb, input_Fs, MC_PARAMUPMIX_NCH + 1, st_ivas->hEncoderConfig->ivas_total_brate ) ) != IVAS_ERR_OK ) +#endif { return error; } diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index a7c359b7c9..362acbf2aa 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -146,7 +146,11 @@ ivas_error ivas_spar_enc_open( } /* Covariance handle */ +#ifdef FIX_489_COV_SMOOTHING + if ( ( error = ivas_spar_covar_enc_open( &( hSpar->hCovEnc ), hSpar->hFbMixer->pFb, input_Fs, nchan_inp, COV_SMOOTH_SPAR, hEncoderConfig->ivas_total_brate ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_spar_covar_enc_open( &( hSpar->hCovEnc ), hSpar->hFbMixer->pFb, input_Fs, nchan_inp, hEncoderConfig->ivas_total_brate ) ) != IVAS_ERR_OK ) +#endif { return error; } -- GitLab From f73c8d9fe32ad799f3a5bb97cb1ef0dee0083468 Mon Sep 17 00:00:00 2001 From: malenov Date: Fri, 19 May 2023 11:30:26 +0200 Subject: [PATCH 230/331] reintroduce DEBUG_IND_LIST - just to see if CI job passes without error message --- lib_com/bitstream.c | 8 ++++++++ lib_com/options.h | 1 + 2 files changed, 9 insertions(+) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index 38c5baf953..d62248e818 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -922,6 +922,10 @@ ivas_error check_ind_list_limits( { #ifdef DEBUGGING fprintf( stderr, "Warning: The maximum number of indices %d has been exceeded in frame %d! Increase the limits in get_ivas_max_num_indices() or get_max_num_indices_metadata().\n", *( hBstr->ivas_max_num_indices ), frame ); + +#ifdef DEBUG_IND_LIST + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Max number of indices exceeded!" ); +#endif #endif /* reallocate the buffer of indices with increased limit */ @@ -947,6 +951,10 @@ ivas_error check_ind_list_limits( { #ifdef DEBUGGING fprintf( stderr, "Warning: The maximum number of indices %d has been exceeded in frame %d! Increase the limits in get_ivas_max_num_indices() or get_max_num_indices_metadata().\n", *( hBstr->ivas_max_num_indices ), frame ); + +#ifdef DEBUG_IND_LIST + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Max number of indices exceeded!" ); +#endif #endif /* no available empty slot -> need to re-allocate the buffer */ diff --git a/lib_com/options.h b/lib_com/options.h index c9216048ab..e265384a4f 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -135,6 +135,7 @@ #define BASOP_NOGLOB /* Disable global symbols in BASOPs, Overflow/Carry in BASOPs disabled, additional BASOPs in case of Overflow */ #define IND_LIST_DYN /* VA: Issue 18: Dynamic allocation of ind_list[] and ind_list_metadata[] based on # of transport channels */ +#define DEBUG_IND_LIST #ifndef IND_LIST_DYN #define BITSTREAM_INDICES_MEMORY /* Don't count memory for bitstream Indice at the encoder - it is a temporary solution for development only */ -- GitLab From 3bd6cbc4f7561b66d559a46f6e9c9ddf0db36812 Mon Sep 17 00:00:00 2001 From: malenov Date: Fri, 19 May 2023 11:48:19 +0200 Subject: [PATCH 231/331] everything OK -> clear DEBUG_IND_LIST --- lib_com/bitstream.c | 8 -------- lib_com/options.h | 1 - 2 files changed, 9 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index d62248e818..38c5baf953 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -922,10 +922,6 @@ ivas_error check_ind_list_limits( { #ifdef DEBUGGING fprintf( stderr, "Warning: The maximum number of indices %d has been exceeded in frame %d! Increase the limits in get_ivas_max_num_indices() or get_max_num_indices_metadata().\n", *( hBstr->ivas_max_num_indices ), frame ); - -#ifdef DEBUG_IND_LIST - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Max number of indices exceeded!" ); -#endif #endif /* reallocate the buffer of indices with increased limit */ @@ -951,10 +947,6 @@ ivas_error check_ind_list_limits( { #ifdef DEBUGGING fprintf( stderr, "Warning: The maximum number of indices %d has been exceeded in frame %d! Increase the limits in get_ivas_max_num_indices() or get_max_num_indices_metadata().\n", *( hBstr->ivas_max_num_indices ), frame ); - -#ifdef DEBUG_IND_LIST - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Max number of indices exceeded!" ); -#endif #endif /* no available empty slot -> need to re-allocate the buffer */ diff --git a/lib_com/options.h b/lib_com/options.h index e265384a4f..c9216048ab 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -135,7 +135,6 @@ #define BASOP_NOGLOB /* Disable global symbols in BASOPs, Overflow/Carry in BASOPs disabled, additional BASOPs in case of Overflow */ #define IND_LIST_DYN /* VA: Issue 18: Dynamic allocation of ind_list[] and ind_list_metadata[] based on # of transport channels */ -#define DEBUG_IND_LIST #ifndef IND_LIST_DYN #define BITSTREAM_INDICES_MEMORY /* Don't count memory for bitstream Indice at the encoder - it is a temporary solution for development only */ -- GitLab From 1da4a40f1f46ab0d57128eb6a6f476556eaae063 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Fri, 19 May 2023 14:52:44 +0300 Subject: [PATCH 232/331] Fixes issue 490 by removing unnecessary condition. --- lib_com/options.h | 1 + lib_dec/ivas_masa_dec.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index be54df0c71..366b45ccd5 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -223,6 +223,7 @@ #define FIX_487_LOWRATE_SBA_TUNING_FIX /* Dlb: TUning fix for low bitrate cases to match theoretical longest SPAR MD bitstream */ +#define FIX_490_MASA_2TC_LBR_DTX /* Nokia: Fixes issue 490 by correcting condition. */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 2c9fcbd008..44cc172041 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -581,7 +581,11 @@ void ivas_masa_prerender( const int16_t output_frame /* i : output frame length per channel */ ) { +#ifdef FIX_490_MASA_2TC_LBR_DTX + if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->nchan_transport == 2 && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE ) +#else if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->nchan_transport == 2 && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_SID_5k2 ) +#endif { if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL ) { -- GitLab From ecbf511c1ac846d02144f0f1ef7a592c71f9e3d3 Mon Sep 17 00:00:00 2001 From: malenov Date: Fri, 19 May 2023 14:07:50 +0200 Subject: [PATCH 233/331] insert assert() message to catch siatuations when ind_list[] runs out of memory -> must be replaced with a warning message before the finalization of the IVAS codec --- lib_com/bitstream.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index 38c5baf953..86e1615d5a 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -921,7 +921,9 @@ ivas_error check_ind_list_limits( if ( ( &hBstr->ind_list[hBstr->nb_ind_tot] - ivas_ind_list_zero ) >= *( hBstr->ivas_max_num_indices ) ) { #ifdef DEBUGGING - fprintf( stderr, "Warning: The maximum number of indices %d has been exceeded in frame %d! Increase the limits in get_ivas_max_num_indices() or get_max_num_indices_metadata().\n", *( hBstr->ivas_max_num_indices ), frame ); + /* TODO: replace with the warning message below before the finalization of the IVAS codec */ + /* fprintf( stderr, "Warning: The maximum number of indices %d has been exceeded in frame %d! Increase the limits in get_ivas_max_num_indices() or get_max_num_indices_metadata().\n", *( hBstr->ivas_max_num_indices ), frame ); */ + assert( 0 && "The maximum number of indices has been exceeded! Increase the limits in get_ivas_max_num_indices() or get_max_num_indices_metadata()." ); #endif /* reallocate the buffer of indices with increased limit */ @@ -946,7 +948,9 @@ ivas_error check_ind_list_limits( if ( hBstr->ind_list >= ivas_ind_list_last ) { #ifdef DEBUGGING - fprintf( stderr, "Warning: The maximum number of indices %d has been exceeded in frame %d! Increase the limits in get_ivas_max_num_indices() or get_max_num_indices_metadata().\n", *( hBstr->ivas_max_num_indices ), frame ); + /* TODO: replace with the warning message below before the finalization of the IVAS codec */ + /* fprintf( stderr, "Warning: The maximum number of indices %d has been exceeded in frame %d! Increase the limits in get_ivas_max_num_indices() or get_max_num_indices_metadata().\n", *( hBstr->ivas_max_num_indices ), frame ); */ + assert( 0 && "The maximum number of indices has been exceeded! Increase the limits in get_ivas_max_num_indices() or get_max_num_indices_metadata()." ); #endif /* no available empty slot -> need to re-allocate the buffer */ -- GitLab From fe198d7aedfb1f38ae24536addbc7a3b9311a3f1 Mon Sep 17 00:00:00 2001 From: Shikha Shetgeri <100861@ittiam.com> Date: Fri, 19 May 2023 18:52:07 +0530 Subject: [PATCH 234/331] Addressing review comments --- tests/test_sba_bs_dec_plc.py | 17 ++++++++++------- tests/test_sba_bs_enc.py | 19 +++++++++++-------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/tests/test_sba_bs_dec_plc.py b/tests/test_sba_bs_dec_plc.py index f3468a6053..9b1a927259 100644 --- a/tests/test_sba_bs_dec_plc.py +++ b/tests/test_sba_bs_dec_plc.py @@ -46,7 +46,9 @@ tag_list = ['stvFOA'] plc_patterns = ['PLperc12mblen5', 'PLperc40mblen50', 'PLperc42mblen2'] dtx_set = ['0', '1'] ivas_br_list = ['13200','16400','32000', '64000', '96000', '256000'] +ivas_br_list_1 = ['13200','16400','24400','32000', '64000', '96000', '256000'] sampling_rate_list = ['48', '32', '16'] +gain_list = [-1, 0, 1] AbsTol = '0' @@ -67,11 +69,12 @@ def check_and_makedir(dir_path): # -> the reference generation for this test (reference decoder output) needs to be done after completion of test_sba_enc_system # -> therefore the marker create_ref_part2 @pytest.mark.create_ref_part2 -@pytest.mark.parametrize("ivas_br", ivas_br_list) +@pytest.mark.parametrize("ivas_br", ivas_br_list_1) @pytest.mark.parametrize("dtx", dtx_set) @pytest.mark.parametrize("tag", tag_list) @pytest.mark.parametrize("plc_pattern", plc_patterns) @pytest.mark.parametrize("fs", sampling_rate_list) +@pytest.mark.parametrize("gain_flag", gain_list) def test_sba_plc_system( dut_decoder_frontend: DecoderFrontend, test_vector_path, @@ -84,21 +87,21 @@ def test_sba_plc_system( dtx, tag, plc_pattern, - fs + fs, + gain_flag ): SID = 0 - if dtx == '1' and ivas_br not in ['13200','16400','32000', '64000']: + if dtx == '1' and ivas_br not in ['13200','16400','24400','32000', '64000']: # skip high bitrates for DTX until DTX issue is resolved pytest.skip() if ivas_br == '13200' or ivas_br == '16400': - if dtx == '1' and fs != '16': + if dtx == '1' and gain_flag == 0 and fs != '16': SID = 1 else: pytest.skip() + if gain_flag == 1 and ivas_br not in ['13200','16400','24400','32000']: + pytest.skip() tag = tag + fs + 'c' - gain_flag = -1 - if ivas_br in ['13200','16400','32000']: - gain_flag = 1 # dec sba_dec_plc( diff --git a/tests/test_sba_bs_enc.py b/tests/test_sba_bs_enc.py index 7f59dfdf71..c6f769b8f2 100644 --- a/tests/test_sba_bs_enc.py +++ b/tests/test_sba_bs_enc.py @@ -57,9 +57,11 @@ dict_bw_tag = {'SWB': '_ForceSWB', 'WB': '_ForceWB'} ivas_br_FOA = ['13200','16400','32000','64000', '96000', '160000', '256000', '384000', '512000','sw_24k4_256k.bin'] ivas_br_HOA2 = ['256000', '384000', '512000'] ivas_br_HOA3 = ['256000', '384000', '512000'] +ivas_br_list_1 = ['13200','16400','24400','32000','64000', '96000', '160000', '256000', '384000', '512000','sw_24k4_256k.bin'] sample_rate_list = ['48', '32', '16'] bypass_list = [1, 2] +gain_list = [-1, 0, 1] sample_rate_bw_idx_list = [('48', 'SWB'), ('48', 'WB'), ('32', 'WB')] @@ -146,10 +148,11 @@ def test_bypass_enc( @pytest.mark.create_ref -@pytest.mark.parametrize("ivas_br", ivas_br_FOA) +@pytest.mark.parametrize("ivas_br", ivas_br_list_1) @pytest.mark.parametrize("dtx", dtx_set) @pytest.mark.parametrize("tag", tag_list) @pytest.mark.parametrize("fs", sample_rate_list) +@pytest.mark.parametrize("gain_flag", gain_list) def test_sba_enc_system( dut_encoder_frontend: EncoderFrontend, dut_decoder_frontend: DecoderFrontend, @@ -165,21 +168,21 @@ def test_sba_enc_system( dtx, tag, fs, + gain_flag, ): SID = 0 - gain_flag = -1 - if ivas_br in ['13200','16400','32000']: - gain_flag = 1 - if dtx == '1' and ivas_br not in ['13200','16400','32000','64000']: + if dtx == '1' and ivas_br not in ['13200','16400','24400','32000','64000']: # skip high bitrates for DTX until DTX issue is resolved pytest.skip() - if ivas_br == 'sw_24k4_256k.bin': + if ivas_br == 'sw_24k4_256k.bin' and gain_flag != 1: pytest.skip() if ivas_br == '13200' or ivas_br == '16400': - if dtx == '1' and fs != '16': + if dtx == '1' and gain_flag == 0 and fs != '16': SID = 1 else: pytest.skip() + if gain_flag == 1 and ivas_br not in ['13200','16400','24400','32000']: + pytest.skip() tag = tag + fs + 'c' max_bw = "FB" bypass = -1 @@ -187,7 +190,7 @@ def test_sba_enc_system( output_config = "FOA" if gain_flag == 1: cut_gain = "16.0" - if dtx == '1': + elif dtx == '1': cut_gain = ".004" else: cut_gain = "1.0" -- GitLab From 48e2c068c89c44020e9d1147d9cf25650c010611 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 19:42:01 +0200 Subject: [PATCH 235/331] [cleanup] accept ISM_NON_DIEGETIC_PAN, NON_DIEGETIC_PAN --- apps/decoder.c | 57 --------------------- apps/renderer.c | 66 ------------------------ lib_com/common_api_types.h | 4 -- lib_com/ivas_cnst.h | 16 ------ lib_com/ivas_ism_com.c | 9 ---- lib_com/ivas_prot.h | 6 --- lib_com/ivas_stat_com.h | 2 - lib_com/options.h | 2 - lib_dec/ivas_dec.c | 6 --- lib_dec/ivas_init_dec.c | 6 --- lib_dec/ivas_ism_dec.c | 4 -- lib_dec/ivas_ism_metadata_dec.c | 37 -------------- lib_dec/ivas_ism_renderer.c | 4 -- lib_dec/ivas_output_config.c | 6 --- lib_dec/ivas_stat_dec.h | 4 -- lib_dec/lib_dec.c | 89 --------------------------------- lib_dec/lib_dec.h | 8 --- lib_enc/ivas_ism_enc.c | 4 -- lib_enc/ivas_ism_metadata_enc.c | 36 ------------- lib_enc/lib_enc.c | 4 -- lib_rend/ivas_objectRenderer.c | 16 ------ lib_rend/lib_rend.c | 22 -------- lib_rend/lib_rend.h | 4 -- lib_util/cmdln_parser.c | 8 --- lib_util/ism_file_reader.c | 13 ----- lib_util/ism_file_writer.c | 4 -- 26 files changed, 437 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index ca91fd1bf5..993e53d746 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -117,12 +117,8 @@ typedef struct bool customLsOutputEnabled; char *customLsSetupFilename; int16_t orientation_tracking; -#ifdef NON_DIEGETIC_PAN int16_t Opt_non_diegetic_pan; float non_diegetic_pan_gain; -#else - float no_diegetic_pan; -#endif bool renderConfigEnabled; char *renderConfigFilename; #ifdef COMPLEXITY_LEVEL_INDICATION @@ -227,17 +223,9 @@ int main( *------------------------------------------------------------------------------------------*/ #ifdef FIX_439_OTR_PARAMS -#ifdef NON_DIEGETIC_PAN if ( ( error = IVAS_DEC_Open( &hIvasDec, arg.decMode ) ) != IVAS_ERR_OK ) #else - if ( ( error = IVAS_DEC_Open( &hIvasDec, arg.decMode, arg.no_diegetic_pan ) ) != IVAS_ERR_OK ) -#endif -#else -#ifdef NON_DIEGETIC_PAN if ( ( error = IVAS_DEC_Open( &hIvasDec, arg.decMode, arg.orientation_tracking ) ) != IVAS_ERR_OK ) -#else - if ( ( error = IVAS_DEC_Open( &hIvasDec, arg.decMode, arg.orientation_tracking, arg.no_diegetic_pan ) ) != IVAS_ERR_OK ) -#endif #endif { fprintf( stderr, "Open failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); @@ -404,17 +392,9 @@ int main( *------------------------------------------------------------------------------------------*/ #ifdef FIX_439_OTR_PARAMS -#ifdef NON_DIEGETIC_PAN if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.orientation_tracking, arg.renderConfigEnabled, arg.Opt_non_diegetic_pan, arg.non_diegetic_pan_gain ) ) != IVAS_ERR_OK ) #else - if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.orientation_tracking, arg.renderConfigEnabled ) ) != IVAS_ERR_OK ) -#endif -#else -#ifdef NON_DIEGETIC_PAN if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.renderConfigEnabled, arg.Opt_non_diegetic_pan, arg.non_diegetic_pan_gain ) ) != IVAS_ERR_OK ) -#else - if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.renderConfigEnabled ) ) != IVAS_ERR_OK ) -#endif #endif { fprintf( stderr, "\nConfigure failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); @@ -868,12 +848,8 @@ static bool parseCmdlIVAS_dec( arg->renderConfigFilename = NULL; arg->inputFormat = IVAS_DEC_INPUT_FORMAT_G192; -#ifdef NON_DIEGETIC_PAN arg->Opt_non_diegetic_pan = 0; arg->non_diegetic_pan_gain = 0.f; -#else - arg->no_diegetic_pan = 0.f; -#endif #ifdef VARIABLE_SPEED_DECODING arg->variableSpeedMode = 0; arg->tsmScale = 100; @@ -1172,56 +1148,27 @@ static bool parseCmdlIVAS_dec( else if ( strcmp( argv_to_upper, "-NON_DIEGETIC_PAN" ) == 0 ) { i++; -#ifdef NON_DIEGETIC_PAN arg->Opt_non_diegetic_pan = 1; -#else - if ( argc - i <= 4 || ( argv[i][0] == '-' ) ) - { - fprintf( stderr, "Error: Argument for panning option not specified!\n\n" ); - usage_dec(); - return false; - } -#endif strncpy( argv_to_upper, argv[i], sizeof( argv_to_upper ) - 1 ); argv_to_upper[sizeof( argv_to_upper ) - 1] = '\0'; -#ifdef NON_DIEGETIC_PAN to_upper( argv_to_upper ); -#endif if ( ( strcmp( argv_to_upper, "CENTER" ) == 0 ) || ( strchr( argv_to_upper, 'C' ) != NULL ) ) { -#ifdef NON_DIEGETIC_PAN arg->non_diegetic_pan_gain = 0.f; -#else - arg->no_diegetic_pan = 0.f; -#endif } else if ( ( strcmp( argv_to_upper, "LEFT" ) == 0 ) || ( strchr( argv_to_upper, 'L' ) != NULL ) ) { -#ifdef NON_DIEGETIC_PAN arg->non_diegetic_pan_gain = 1.f; -#else - arg->no_diegetic_pan = 1.f; -#endif } else if ( ( strcmp( argv_to_upper, "RIGHT" ) == 0 ) || ( strchr( argv_to_upper, 'R' ) != NULL ) ) { -#ifdef NON_DIEGETIC_PAN arg->non_diegetic_pan_gain = -1.f; -#else - arg->no_diegetic_pan = -1.f; -#endif } else { -#ifdef NON_DIEGETIC_PAN arg->non_diegetic_pan_gain = (float) atof( argv_to_upper ) / 90.f; if ( arg->non_diegetic_pan_gain > 1.0f || arg->non_diegetic_pan_gain < -1.0f ) -#else - arg->no_diegetic_pan = (float) atof( argv_to_upper ); - - if ( arg->no_diegetic_pan > 1.0f || arg->no_diegetic_pan < -1.0f ) -#endif { fprintf( stderr, "Error: Incorrect value for panning gain value specified: %s\n\n", argv[i] ); usage_dec(); @@ -1277,25 +1224,21 @@ static bool parseCmdlIVAS_dec( arg->customLsSetupFilename = argv[i]; } i++; -#ifdef NON_DIEGETIC_PAN if ( ( arg->Opt_non_diegetic_pan ) && ( arg->outputFormat != IVAS_DEC_OUTPUT_STEREO ) ) { fprintf( stderr, "Error: non-diegetic panning is supported in stereo only\n\n" ); usage_dec(); return false; } -#endif } else { arg->outputFormat = IVAS_DEC_OUTPUT_MONO; arg->decMode = IVAS_DEC_MODE_EVS; -#ifdef NON_DIEGETIC_PAN if ( ( arg->Opt_non_diegetic_pan ) ) { arg->outputFormat = IVAS_DEC_OUTPUT_STEREO; } -#endif } /*-----------------------------------------------------------------* diff --git a/apps/renderer.c b/apps/renderer.c index 4fcd3f92e1..91f3cfab1e 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -140,12 +140,8 @@ typedef struct #else int8_t orientationTracking; #endif -#ifdef NON_DIEGETIC_PAN int16_t nonDiegeticPan; float nonDiegeticPanGain; -#else - float noDiegeticPan; -#endif bool delayCompensationEnabled; bool quietModeEnabled; bool sceneDescriptionInput; @@ -560,7 +556,6 @@ int main( CmdlnArgs args = parseCmdlnArgs( argc, argv ); -#ifdef NON_DIEGETIC_PAN if ( args.nonDiegeticPan && !( ( args.inConfig.numAudioObjects == 0 && args.inConfig.multiChannelBuses[0].audioConfig == IVAS_REND_AUDIO_CONFIG_MONO ) || ( args.inConfig.numAudioObjects > 0 && args.inConfig.audioObjects[0].audioConfig == IVAS_REND_AUDIO_CONFIG_OBJECT && args.inConfig.numAudioObjects == 1 ) ) ) { @@ -573,7 +568,6 @@ int main( fprintf( stderr, "\ninvalid configuration - non-diegetic panning requires stereo output\n" ); exit( -1 ); } -#endif positionProvider = IsmPositionProvider_open(); @@ -689,11 +683,7 @@ int main( IVAS_REND_InputId sbaIds[RENDERER_MAX_SBA_INPUTS] = { 0 }; IVAS_REND_InputId masaIds[RENDERER_MAX_MASA_INPUTS] = { 0 }; -#ifdef NON_DIEGETIC_PAN if ( ( error = IVAS_REND_Open( &hIvasRend, args.sampleRate, args.outConfig.audioConfig, args.nonDiegeticPan, args.nonDiegeticPanGain ) ) != IVAS_ERR_OK ) -#else - if ( ( error = IVAS_REND_Open( &hIvasRend, args.sampleRate, args.outConfig.audioConfig ) ) != IVAS_ERR_OK ) -#endif { fprintf( stderr, "Error opening renderer handle: %s\n", ivas_error_to_string( error ) ); exit( -1 ); @@ -1366,7 +1356,6 @@ static bool parseOutConfig( return true; } -#ifdef NON_DIEGETIC_PAN static bool parseDiegeticPan( char *value, float *nonDiegeticPan ) @@ -1397,37 +1386,6 @@ static bool parseDiegeticPan( } return true; -#else -static bool parseDiegeticPan( - char *value, - float *noDiegeticPan ) -{ - to_upper( value ); - - if ( ( strcmp( value, "CENTER" ) == 0 ) || ( strchr( value, 'C' ) != NULL ) ) - { - *noDiegeticPan = 0.f; - } - else if ( ( strcmp( value, "LEFT" ) == 0 ) || ( strchr( value, 'L' ) != NULL ) ) - { - *noDiegeticPan = -1.f; - } - else if ( ( strcmp( value, "RIGHT" ) == 0 ) || ( strchr( value, 'R' ) != NULL ) ) - { - *noDiegeticPan = 1.f; - } - else - { - *noDiegeticPan = (float) atof( value ); - - if ( *noDiegeticPan > 1.0f || *noDiegeticPan < -1.0f ) - { - fprintf( stderr, "Error: Incorrect value for panning option argument specified!\n\n" ); - return false; - } - } - return false; -#endif } static bool parseOrientationTracking( @@ -1708,12 +1666,8 @@ static CmdlnArgs defaultArgs( #else args.orientationTracking = IVAS_ORIENT_TRK_NONE; #endif -#ifdef NON_DIEGETIC_PAN args.nonDiegeticPan = 0; args.nonDiegeticPanGain = 0.f; -#else - args.noDiegeticPan = 0.0f; -#endif args.delayCompensationEnabled = true; args.quietModeEnabled = false; @@ -1805,18 +1759,12 @@ static void parseOption( break; case CmdLnOptionId_nonDiegeticPan: assert( numOptionValues == 1 ); -#ifdef NON_DIEGETIC_PAN if ( !parseDiegeticPan( optionValues[0], &args->nonDiegeticPanGain ) ) -#else - if ( !parseDiegeticPan( optionValues[0], &args->noDiegeticPan ) ) -#endif { fprintf( stderr, "Unknown option for diegetic panning: %s\n", optionValues[0] ); exit( -1 ); } -#ifdef NON_DIEGETIC_PAN args->nonDiegeticPan = 1; -#endif break; case CmdLnOptionId_orientationTracking: assert( numOptionValues == 1 ); @@ -1931,9 +1879,7 @@ void getMetadataFromFileReader( objectMetadataBuffer->positions[objIdx].radius = ismMetadata.radius; objectMetadataBuffer->positions[objIdx].yaw = ismMetadata.yaw; objectMetadataBuffer->positions[objIdx].pitch = ismMetadata.pitch; -#ifdef ISM_NON_DIEGETIC_PAN objectMetadataBuffer->positions[objIdx].non_diegetic_flag = ismMetadata.non_diegetic_flag; -#endif return; } @@ -1991,9 +1937,7 @@ static void IsmPositionProvider_getNextFrame( objectMetadataBuffer->positions[objIdx].radius = 1.0f; objectMetadataBuffer->positions[objIdx].yaw = 0.0f; objectMetadataBuffer->positions[objIdx].pitch = 0.0f; -#ifdef ISM_NON_DIEGETIC_PAN objectMetadataBuffer->positions[objIdx].non_diegetic_flag = 0; -#endif } /* Wrap azimuth to lie within (-180, 180] range */ @@ -2255,22 +2199,14 @@ static void parseObjectPosition( { char *endptr; int16_t read_values; -#ifdef ISM_NON_DIEGETIC_PAN float meta_prm[8] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f }; -#else - float meta_prm[7] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f }; -#endif readNextMetadataChunk( line, "," ); *positionDuration = (uint16_t) strtol( line, &endptr, 10 ); readNextMetadataChunk( line, "\n" ); -#ifdef ISM_NON_DIEGETIC_PAN read_values = (int16_t) sscanf( line, "%f,%f,%f,%f,%f,%f,%f,%f", &meta_prm[0], &meta_prm[1], &meta_prm[2], &meta_prm[3], &meta_prm[4], &meta_prm[5], &meta_prm[6], &meta_prm[7] ); -#else - read_values = (int16_t) sscanf( line, "%f,%f,%f,%f,%f,%f,%f", &meta_prm[0], &meta_prm[1], &meta_prm[2], &meta_prm[3], &meta_prm[4], &meta_prm[5], &meta_prm[6] ); -#endif if ( read_values < 2 ) { @@ -2283,9 +2219,7 @@ static void parseObjectPosition( position->radius = meta_prm[2]; position->yaw = meta_prm[5]; position->pitch = meta_prm[6]; -#ifdef ISM_NON_DIEGETIC_PAN position->non_diegetic_flag = (int16_t) meta_prm[7]; -#endif return; } diff --git a/lib_com/common_api_types.h b/lib_com/common_api_types.h index 3b9a331908..33ddc9e881 100644 --- a/lib_com/common_api_types.h +++ b/lib_com/common_api_types.h @@ -80,9 +80,7 @@ typedef struct _IVAS_ISM_METADATA float gainFactor; float yaw; float pitch; -#ifdef ISM_NON_DIEGETIC_PAN int16_t non_diegetic_flag; -#endif } IVAS_ISM_METADATA; typedef struct @@ -131,9 +129,7 @@ typedef struct float radius; float yaw; float pitch; -#ifdef ISM_NON_DIEGETIC_PAN int16_t non_diegetic_flag; -#endif } IVAS_REND_AudioObjectPosition; typedef struct _IVAS_ROOM_ACOUSTICS_CONFIG diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 5757b0c53d..74dc745786 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -156,12 +156,8 @@ typedef enum RENDERER_MCMASA_MONO_STEREO, RENDERER_PARAM_ISM, RENDERER_BINAURAL_MIXER_CONV, -#if defined NON_DIEGETIC_PAN || defined ISM_NON_DIEGETIC_PAN RENDERER_BINAURAL_MIXER_CONV_ROOM, RENDERER_NON_DIEGETIC_DOWNMIX -#else - RENDERER_BINAURAL_MIXER_CONV_ROOM -#endif } RENDERER_TYPE; @@ -175,9 +171,7 @@ typedef enum #define HEAD_ROTATION_HOA_ORDER 3 /* HOA 3rd order */ #define MAX_CICP_CHANNELS 16 /* max channels for loudspeaker layouts (16 for custom layouts)*/ #define MAX_OUTPUT_CHANNELS 16 /* Maximum number of output channels (HOA 3rd order) */ -#ifdef NON_DIEGETIC_PAN #define MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN 2 /* Maximum number of output channels with non diegetic panning */ -#endif #define BINAURAL_CHANNELS 2 /* number of channels for binaural output configuration */ #define CPE_CHANNELS 2 /* number of CPE (stereo) channels */ @@ -366,9 +360,7 @@ typedef enum #define ISM_RADIUS_MIN 0.0f #define ISM_RADIUS_DELTA 0.25f /* Max radius = (2^ISM_RADIUS_NBITS-1)*0.25 = 15.75 */ #define ISM_EXTENDED_METADATA_BRATE IVAS_64k -#ifdef ISM_NON_DIEGETIC_PAN #define ISM_METADATA_IS_NDP_BITS 1 -#endif #define ISM_EXTENDED_METADATA_BITS 1 #define ISM_METADATA_RS_MAX_FRAMES 5 /* Number of frames with opposite extended metadata flags before switching */ @@ -410,9 +402,7 @@ enum { IND_ISM_NUM_OBJECTS, IND_ISM_EXTENDED_FLAG = IND_ISM_NUM_OBJECTS + MAX_NUM_OBJECTS, -#ifdef ISM_NON_DIEGETIC_PAN IND_ISM_EXTENDED_NDP_FLAG, -#endif IND_ISM_METADATA_FLAG, IND_ISM_VAD_FLAG = IND_ISM_METADATA_FLAG + MAX_NUM_OBJECTS, IND_ISM_NOISY_SPEECH_FLAG = IND_ISM_VAD_FLAG + MAX_NUM_OBJECTS, @@ -421,9 +411,7 @@ enum /* ------------- loop for objects -------------- */ TAG_ISM_LOOP_START = IND_ISM_DTX_COH_SCA + MAX_NUM_OBJECTS, -#ifdef ISM_NON_DIEGETIC_PAN IND_ISM_NDP_FLAG = TAG_ISM_LOOP_START, -#endif IND_ISM_AZIMUTH_DIFF_FLAG = TAG_ISM_LOOP_START, IND_ISM_AZIMUTH = TAG_ISM_LOOP_START, IND_ISM_ELEVATION_DIFF_FLAG = TAG_ISM_LOOP_START, @@ -1621,12 +1609,8 @@ typedef enum typedef enum { TDREND_PLAYSTATUS_INITIAL, -#ifdef ISM_NON_DIEGETIC_PAN TDREND_PLAYSTATUS_PLAYING, TDREND_PLAYSTATUS_PLAYING_NON_DIEGETIC -#else - TDREND_PLAYSTATUS_PLAYING -#endif } TDREND_PlayStatus_t; typedef enum diff --git a/lib_com/ivas_ism_com.c b/lib_com/ivas_ism_com.c index d14b252fd8..8ba31fcaa3 100644 --- a/lib_com/ivas_ism_com.c +++ b/lib_com/ivas_ism_com.c @@ -92,9 +92,7 @@ ivas_error ivas_ism_config( const int16_t nchan_transport, /* i : number of transport channels */ const int16_t nchan_ism, /* i : number of objects */ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ -#ifdef ISM_NON_DIEGETIC_PAN const int16_t ism_extended_metadata_flag, /* i : extended metadata flag */ -#endif const int16_t localVAD[MAX_NUM_OBJECTS], /* i : local VAD flag */ const int16_t ism_imp[], /* i : ISM importance flags */ int32_t element_brate[], /* o : element bitrate per object */ @@ -139,12 +137,10 @@ ivas_error ivas_ism_config( { nb_bits_metadata[0] += ISM_EXTENDED_METADATA_BITS; -#ifdef ISM_NON_DIEGETIC_PAN if ( ism_extended_metadata_flag ) { nb_bits_metadata[0] += ISM_METADATA_IS_NDP_BITS; } -#endif } nb_bits_metadata[0] += n_ISms * ISM_METADATA_FLAG_BITS + nchan_ism; @@ -347,10 +343,8 @@ void ivas_ism_reset_metadata( hIsmMeta->yaw = 0.0f; hIsmMeta->pitch = 0.0f; hIsmMeta->radius = 1.0f; -#ifdef ISM_NON_DIEGETIC_PAN hIsmMeta->ism_metadata_flag = 0; hIsmMeta->non_diegetic_flag = 0; -#endif return; } @@ -366,9 +360,6 @@ void ivas_ism_reset_metadata_API( ISM_METADATA_HANDLE hIsmMeta /* i/o: ISM metadata handle */ ) { -#ifndef ISM_NON_DIEGETIC_PAN - hIsmMeta->ism_metadata_flag = 0; -#endif ivas_ism_reset_metadata( hIsmMeta ); return; diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 27790e039d..4c04418eea 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -869,9 +869,7 @@ ivas_error ivas_ism_config( const int16_t nchan_transport, /* i : number of transport channels */ const int16_t nchan_ism, /* i : number of objects */ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ -#ifdef ISM_NON_DIEGETIC_PAN const int16_t ism_extended_metadata_flag, /* i : extended metadata flag */ -#endif const int16_t localVAD[MAX_NUM_OBJECTS], /* i : local VAD flag */ const int16_t ism_imp[], /* i : ISM importance flags */ int32_t element_brate[], /* o : element bitrate per object */ @@ -912,12 +910,8 @@ ivas_error ivas_set_ism_metadata( const float elevation, /* i : elevation value */ const float radius_meta, /* i : radius */ const float yaw, /* i : yaw */ -#ifdef ISM_NON_DIEGETIC_PAN const float pitch, /* i : pitch */ const int16_t non_diegetic_flag /* i : non-diegetic object flag */ -#else - const float pitch /* i : pitch */ -#endif ); ivas_error ivas_ism_metadata_enc_create( diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index e2f2e0f1f2..0e06e30e89 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -58,9 +58,7 @@ typedef struct { int16_t ism_metadata_flag; /* flag whether metadata are coded in particular frame of particular object */ int16_t last_ism_metadata_flag; /* last frame ism_metadata_flag */ -#ifdef ISM_NON_DIEGETIC_PAN int16_t non_diegetic_flag; /* Non-diegetic (non-headtracked) object flag */ -#endif float azimuth; /* azimuth value read from the input metadata file */ float elevation; /* azimuth value read from the input metadata file */ float radius; diff --git a/lib_com/options.h b/lib_com/options.h index cbbccd5ec3..5dc7cc347d 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -142,8 +142,6 @@ #define DISABLE_ADAP_RES_COD_TMP /* temporary fix for IVAS-403, disables adaptive residual coding */ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ -#define NON_DIEGETIC_PAN /* Orange: Contribution 34: non diegetic panning in decoder */ -#define ISM_NON_DIEGETIC_PAN /* Orange: Contribution 34: non diegetic panning for ism objects */ #define FIX_331_ALL_BRS /*Enable the fix_331 across all the bitrates and sba modes*/ #define FIX_ISM_DTX_CNG_BWIDTH_ALT /* VA: issue 396 - alternative fix for bw changes on CNG frames in ISM DTX for objects that use the decoder-side noise estimation */ diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index 0af1699564..3458a9b196 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -64,9 +64,7 @@ ivas_error ivas_dec( int16_t nb_bits_metadata[MAX_SCE]; int32_t output_Fs, ivas_total_brate; AUDIO_CONFIG output_config; -#ifdef NON_DIEGETIC_PAN float pan_left, pan_right; -#endif ivas_error error; #ifdef JBM_TSM_ON_TCS float *p_output[MAX_OUTPUT_CHANNELS]; @@ -216,7 +214,6 @@ ivas_error ivas_dec( { ivas_mono_downmix_render_passive( st_ivas, output, output_frame ); } -#ifdef NON_DIEGETIC_PAN else if ( st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX ) { pan_left = ( st_ivas->hDecoderConfig->non_diegetic_pan_gain + 1.f ) * 0.5f; @@ -224,7 +221,6 @@ ivas_error ivas_dec( v_multc( output[0], pan_right, output[1], output_frame ); v_multc( output[0], pan_left, output[0], output_frame ); } -#endif else if ( st_ivas->renderer_type == RENDERER_PARAM_ISM || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) { ivas_param_ism_dec( st_ivas, output ); @@ -247,7 +243,6 @@ ivas_error ivas_dec( { ivas_mono_downmix_render_passive( st_ivas, output, output_frame ); } -#ifdef NON_DIEGETIC_PAN else if ( st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX ) { pan_left = ( st_ivas->hDecoderConfig->non_diegetic_pan_gain + 1.f ) * 0.5f; @@ -255,7 +250,6 @@ ivas_error ivas_dec( v_multc( output[0], pan_right, output[1], output_frame ); v_multc( output[0], pan_left, output[0], output_frame ); } -#endif else if ( st_ivas->renderer_type == RENDERER_TD_PANNING || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */ diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index d5982c63a0..a2be71d0d8 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -1404,9 +1404,7 @@ ivas_error ivas_init_decoder( if ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_DISC && ( st_ivas->renderer_type == RENDERER_TD_PANNING || -#if defined NON_DIEGETIC_PAN || defined ISM_NON_DIEGETIC_PAN st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX || -#endif st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || @@ -1987,9 +1985,7 @@ void ivas_init_dec_get_num_cldfb_instances( *numCldfbAnalyses += 2; } break; -#ifdef NON_DIEGETIC_PAN case RENDERER_NON_DIEGETIC_DOWNMIX: -#endif case RENDERER_MONO_DOWNMIX: if ( st_ivas->ivas_format == ISM_FORMAT ) { @@ -2159,12 +2155,10 @@ static ivas_error doSanityChecks_IVAS( assert( st_ivas->ivas_format != MONO_FORMAT && "\n Wrong IVAS format: MONO" ); /* Verify output configuration compatible with non-diegetic panning */ -#ifdef NON_DIEGETIC_PAN if ( st_ivas->hDecoderConfig->Opt_non_diegetic_pan && ( st_ivas->ivas_format != MONO_FORMAT ) && ( st_ivas->transport_config != AUDIO_CONFIG_ISM1 ) ) { return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Error: Non-diegetic panning not supported in this IVAS format" ); } -#endif /* Verify stereo output configuration */ if ( st_ivas->ivas_format == STEREO_FORMAT ) diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index 5706261093..796e94cfeb 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -90,11 +90,7 @@ static ivas_error ivas_ism_bitrate_switching( st_ivas->ism_mode = ism_mode; #endif -#ifdef ISM_NON_DIEGETIC_PAN if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->nchan_ism, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->nchan_ism, NULL, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) -#endif { return error; } diff --git a/lib_dec/ivas_ism_metadata_dec.c b/lib_dec/ivas_ism_metadata_dec.c index b7bf89e026..9787500a7f 100644 --- a/lib_dec/ivas_ism_metadata_dec.c +++ b/lib_dec/ivas_ism_metadata_dec.c @@ -48,11 +48,7 @@ * Local functions *-----------------------------------------------------------------------*/ -#ifdef ISM_NON_DIEGETIC_PAN static void decode_angle_indices( DEC_CORE_HANDLE st0, ISM_METADATA_ANGLE_HANDLE angle, const int16_t non_diegetic_flag, int16_t *flag_abs_azimuth ); -#else -static void decode_angle_indices( DEC_CORE_HANDLE st0, ISM_METADATA_ANGLE_HANDLE angle, int16_t *flag_abs_azimuth ); -#endif static int16_t decode_radius( DEC_CORE_HANDLE st0, int16_t *last_radius_idx, int16_t *flag_abs_radius ); @@ -161,9 +157,7 @@ ivas_error ivas_ism_metadata_dec( int32_t element_brate[MAX_NUM_OBJECTS], total_brate[MAX_NUM_OBJECTS]; DEC_CORE_HANDLE st0; int16_t ism_extmeta_bitstream; -#ifdef ISM_NON_DIEGETIC_PAN int16_t non_diegetic_flag_global; -#endif float yaw, pitch, radius; int16_t flag_abs_radius; int16_t flag_abs_orientation; @@ -193,9 +187,7 @@ ivas_error ivas_ism_metadata_dec( next_bit_pos_orig = st0->next_bit_pos; st0->next_bit_pos = 0; ism_extmeta_bitstream = 0; -#ifdef ISM_NON_DIEGETIC_PAN non_diegetic_flag_global = 0; -#endif /* reverse the bitstream for easier reading of indices */ for ( i = 0; i < min( MAX_BITS_METADATA, last_bit_pos ); i++ ) @@ -236,13 +228,11 @@ ivas_error ivas_ism_metadata_dec( { ism_extmeta_bitstream = get_next_indice( st0, ISM_EXTENDED_METADATA_BITS ); -#ifdef ISM_NON_DIEGETIC_PAN /* read global non-diegetic object flag */ if ( ism_extmeta_bitstream ) { non_diegetic_flag_global = get_next_indice( st0, ISM_METADATA_IS_NDP_BITS ); } -#endif } /* Apply hysteresis in case rate switching causes fluctuation in presence of extended metadata */ if ( *ism_extmeta_active == -1 || *ism_extmeta_active == ism_extmeta_bitstream ) /* If first frame or bitstream matches internal state */ @@ -323,7 +313,6 @@ ivas_error ivas_ism_metadata_dec( if ( hIsmMeta[ch]->ism_metadata_flag ) { -#ifdef ISM_NON_DIEGETIC_PAN if ( non_diegetic_flag_global ) { /* read non-diegetic flag for each object */ @@ -352,9 +341,6 @@ ivas_error ivas_ism_metadata_dec( else { decode_angle_indices( st0, &( hIsmMetaData->position_angle ), hIsmMeta[ch]->non_diegetic_flag, &flag_abs_position ); -#else - decode_angle_indices( st0, &( hIsmMetaData->position_angle ), &flag_abs_position ); -#endif idx_angle1 = hIsmMetaData->position_angle.last_angle1_idx; idx_angle2 = hIsmMetaData->position_angle.last_angle2_idx; @@ -372,11 +358,7 @@ ivas_error ivas_ism_metadata_dec( /* radius/raw/pitch dequantization */ if ( ism_extmeta_bitstream ) { -#ifdef ISM_NON_DIEGETIC_PAN decode_angle_indices( st0, &( hIsmMetaData->orientation_angle ), hIsmMeta[ch]->non_diegetic_flag, &flag_abs_orientation ); -#else - decode_angle_indices( st0, &( hIsmMetaData->orientation_angle ), &flag_abs_orientation ); -#endif idx_angle1 = hIsmMetaData->orientation_angle.last_angle1_idx; idx_angle2 = hIsmMetaData->orientation_angle.last_angle2_idx; yaw = ism_dequant_meta( idx_angle1, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); @@ -405,9 +387,7 @@ ivas_error ivas_ism_metadata_dec( hIsmMetaData->last_true_azimuth = hIsmMetaData->azimuth; hIsmMetaData->last_true_elevation = hIsmMetaData->elevation; } -#ifdef ISM_NON_DIEGETIC_PAN } -#endif /* save number of metadata bits read */ if ( ism_mode == ISM_MODE_DISC ) { @@ -499,11 +479,7 @@ ivas_error ivas_ism_metadata_dec( if ( !bfi ) { -#ifdef ISM_NON_DIEGETIC_PAN if ( ( error = ivas_ism_config( ism_total_brate, *nchan_transport, nchan_ism, hIsmMeta, ism_extmeta_bitstream, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_ism_config( ism_total_brate, *nchan_transport, nchan_ism, hIsmMeta, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -613,11 +589,7 @@ ivas_error ivas_ism_metadata_dec_create( ivas_ism_reset_metadata( st_ivas->hIsmMetaData[ch] ); } -#ifdef ISM_NON_DIEGETIC_PAN if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, n_ISms, n_ISms, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, n_ISms, n_ISms, NULL, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -637,9 +609,7 @@ ivas_error ivas_ism_metadata_dec_create( static void decode_angle_indices( DEC_CORE_HANDLE st0, /* i/o: bitstream handle */ ISM_METADATA_ANGLE_HANDLE angle, /* i/o: angle handle */ -#ifdef ISM_NON_DIEGETIC_PAN const int16_t non_diegetic_flag, /* i : Non diegetic flag */ -#endif int16_t *flag_abs_angle1 /* o : Azimuth/yaw encoding mode */ ) { @@ -718,10 +688,8 @@ static void decode_angle_indices( * Elevation/pitch decoding and dequantization *----------------------------------------------------------------*/ -#ifdef ISM_NON_DIEGETIC_PAN if ( non_diegetic_flag == 0 ) { -#endif /* Decode elevation/pitch index */ if ( *flag_abs_angle1 == 0 && get_next_indice( st0, 1 ) == 1 ) /* elevation_abs_flag */ { @@ -770,13 +738,11 @@ static void decode_angle_indices( idx_angle2 = angle->last_angle2_idx; } -#ifdef ISM_NON_DIEGETIC_PAN } else { idx_angle2 = angle->last_angle2_idx; /* second MD parameter is not transmitted for non-diegetic object */ } -#endif /*----------------------------------------------------------------* * Final updates @@ -784,9 +750,6 @@ static void decode_angle_indices( angle->last_angle2_idx = idx_angle2; angle->last_angle1_idx = idx_angle1; -#ifndef ISM_NON_DIEGETIC_PAN - angle->last_angle2_idx = idx_angle2; -#endif return; } diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index 95c153fc80..3b38e2d890 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -176,11 +176,7 @@ void ivas_ism_render( else { /* Head rotation: rotate the object positions depending the head's orientation */ -#ifdef ISM_NON_DIEGETIC_PAN if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 && !st_ivas->hIsmMetaData[i]->non_diegetic_flag ) -#else - if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 ) -#endif { rotateAziEle( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &azimuth, &elevation, Rmat, st_ivas->hIntSetup.is_planar_setup ); } diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index 4092142a9a..ad831baa6b 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -276,7 +276,6 @@ void ivas_renderer_select( * Non-binaural rendering configurations *-----------------------------------------------------------------*/ -#ifdef NON_DIEGETIC_PAN else if ( st_ivas->ivas_format == MONO_FORMAT ) { if ( output_config == AUDIO_CONFIG_STEREO ) @@ -284,7 +283,6 @@ void ivas_renderer_select( *renderer_type = RENDERER_NON_DIEGETIC_DOWNMIX; } } -#endif else if ( st_ivas->ivas_format == STEREO_FORMAT ) { if ( output_config != AUDIO_CONFIG_STEREO && output_config != AUDIO_CONFIG_MONO ) @@ -294,14 +292,12 @@ void ivas_renderer_select( } else if ( st_ivas->ivas_format == ISM_FORMAT ) { -#ifdef NON_DIEGETIC_PAN if ( ( output_config == AUDIO_CONFIG_STEREO ) && ( st_ivas->hDecoderConfig->Opt_non_diegetic_pan ) ) { *renderer_type = RENDERER_NON_DIEGETIC_DOWNMIX; } else { -#endif if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { *renderer_type = RENDERER_PARAM_ISM; @@ -335,9 +331,7 @@ void ivas_renderer_select( *renderer_type = RENDERER_DISABLE; } } -#ifdef NON_DIEGETIC_PAN } -#endif } else if ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == SBA_FORMAT ) { diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 727b01c0ed..eddeeaa4da 100755 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -1224,12 +1224,8 @@ typedef struct decoder_config_structure #else int16_t orientation_tracking; /* indicates orientation tracking type */ #endif -#ifdef NON_DIEGETIC_PAN int16_t Opt_non_diegetic_pan; /* indicates diegetic or not */ float non_diegetic_pan_gain; /* non diegetic panning gain*/ -#else - float no_diegetic_pan; -#endif int16_t Opt_AMR_WB; /* flag indicating AMR-WB IO mode */ /* temp. development parameters */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index c5d1173c8d..ab6f504dcc 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -116,17 +116,9 @@ static ivas_error evs_dec_main( Decoder_Struct *st_ivas, const int16_t nOutSampl #endif static ivas_error input_format_API_to_internal( IVAS_DEC_INPUT_FORMAT input_format, int16_t *bitstream_format_internal, int16_t *sdp_hf_only, const bool is_voip_enabled ); #ifdef FIX_439_OTR_PARAMS -#ifdef NON_DIEGETIC_PAN static void init_decoder_config( DECODER_CONFIG_HANDLE hDecoderConfig ); #else -static void init_decoder_config( DECODER_CONFIG_HANDLE hDecoderConfig, const float non_diegetic_pan ); -#endif -#else -#ifdef NON_DIEGETIC_PAN static void init_decoder_config( DECODER_CONFIG_HANDLE hDecoderConfig, const int16_t orientation_tracking ); -#else -static void init_decoder_config( DECODER_CONFIG_HANDLE hDecoderConfig, const int16_t orientation_tracking, const float non_diegetic_pan ); -#endif #endif #ifdef JBM_TSM_ON_TCS static int16_t IVAS_DEC_VoIP_GetRenderGranularity( Decoder_Struct *st_ivas ); @@ -152,10 +144,6 @@ ivas_error IVAS_DEC_Open( , const int16_t orientation_tracking /* i : orientation tracking type */ #endif -#ifndef NON_DIEGETIC_PAN - , - float no_diegetic_pan /* i : non diegetic panning gain */ -#endif ) { IVAS_DEC_HANDLE hIvasDec; @@ -210,17 +198,9 @@ ivas_error IVAS_DEC_Open( /* initialize Decoder Config. handle */ #ifdef FIX_439_OTR_PARAMS -#ifdef NON_DIEGETIC_PAN init_decoder_config( hIvasDec->st_ivas->hDecoderConfig ); #else - init_decoder_config( hIvasDec->st_ivas->hDecoderConfig, no_diegetic_pan ); -#endif -#else -#ifdef NON_DIEGETIC_PAN init_decoder_config( hIvasDec->st_ivas->hDecoderConfig, orientation_tracking ); -#else - init_decoder_config( hIvasDec->st_ivas->hDecoderConfig, orientation_tracking, no_diegetic_pan ); -#endif #endif /* initialize pointers to handles to NULL */ ivas_initialize_handles_dec( st_ivas ); @@ -276,10 +256,6 @@ static void init_decoder_config( , const int16_t orientation_tracking #endif -#ifndef NON_DIEGETIC_PAN - , - const float no_diegetic_pan -#endif ) { hDecoderConfig->Opt_AMR_WB = 0; @@ -294,12 +270,8 @@ static void init_decoder_config( #else hDecoderConfig->orientation_tracking = orientation_tracking; #endif -#ifdef NON_DIEGETIC_PAN hDecoderConfig->Opt_non_diegetic_pan = 0; hDecoderConfig->non_diegetic_pan_gain = 0; -#else - hDecoderConfig->no_diegetic_pan = no_diegetic_pan; -#endif #ifdef JBM_TSM_ON_TCS hDecoderConfig->voip_active = 0; @@ -468,13 +440,9 @@ ivas_error IVAS_DEC_Configure( #ifdef FIX_439_OTR_PARAMS const HEAD_ORIENT_TRK_T orientation_tracking, /* i : head orientation tracking type */ #endif -#ifdef NON_DIEGETIC_PAN const int16_t renderConfigEnabled, /* i : enable Renderer config. file for binaural output */ const int16_t Opt_non_diegetic_pan, /* i : diegetic or not */ const float non_diegetic_pan_gain /* i : non diegetic panning gain */ -#else - const int16_t renderConfigEnabled /* i : enable Renderer config. file for binaural output */ -#endif ) { Decoder_Struct *st_ivas; @@ -492,18 +460,11 @@ ivas_error IVAS_DEC_Configure( return IVAS_ERR_WRONG_PARAMS; } -#ifdef NON_DIEGETIC_PAN if ( hIvasDec->mode == IVAS_DEC_MODE_EVS && !( ( outputFormat == IVAS_DEC_OUTPUT_MONO && Opt_non_diegetic_pan == 0 ) || ( outputFormat == IVAS_DEC_OUTPUT_STEREO && Opt_non_diegetic_pan == 1 ) ) ) { return IVAS_ERR_WRONG_MODE; } -#else - if ( hIvasDec->mode == IVAS_DEC_MODE_EVS && outputFormat != IVAS_DEC_OUTPUT_MONO ) - { - return IVAS_ERR_WRONG_MODE; - } -#endif st_ivas = hIvasDec->st_ivas; @@ -535,10 +496,8 @@ ivas_error IVAS_DEC_Configure( #endif hDecoderConfig->Opt_HRTF_binary = hrtfReaderEnabled; hDecoderConfig->Opt_RendConfigCustom = renderConfigEnabled; -#ifdef NON_DIEGETIC_PAN hDecoderConfig->Opt_non_diegetic_pan = Opt_non_diegetic_pan; hDecoderConfig->non_diegetic_pan_gain = non_diegetic_pan_gain; -#endif /* Set decoder parameters to initial values */ if ( ( error = ivas_init_decoder_front( st_ivas ) ) != IVAS_ERR_OK ) @@ -1211,9 +1170,7 @@ ivas_error IVAS_DEC_GetObjectMetadata( metadata->gainFactor = 1.f; metadata->yaw = 0.f; metadata->pitch = 0.f; -#ifdef ISM_NON_DIEGETIC_PAN metadata->non_diegetic_flag = 0; -#endif } else { @@ -1224,9 +1181,7 @@ ivas_error IVAS_DEC_GetObjectMetadata( metadata->pitch = hIsmMeta->pitch; metadata->spread = 0.f; metadata->gainFactor = 1.f; -#ifdef ISM_NON_DIEGETIC_PAN metadata->non_diegetic_flag = hIsmMeta->non_diegetic_flag; -#endif } return IVAS_ERR_OK; @@ -2697,14 +2652,12 @@ static ivas_error printConfigInfo_dec( if ( st_ivas->ivas_format == MONO_FORMAT ) { -#ifdef NON_DIEGETIC_PAN if ( st_ivas->hDecoderConfig->Opt_non_diegetic_pan ) { fprintf( stdout, "Output configuration: mono EVS bit-exact decoding to stereo\n" ); fprintf( stdout, "Non-diegetic panning: %.2f\n", st_ivas->hDecoderConfig->non_diegetic_pan_gain * 90.f ); } else -#endif { fprintf( stdout, "Output configuration: mono EVS bit-exact decoding\n" ); } @@ -2807,12 +2760,10 @@ static ivas_error printConfigInfo_dec( } #endif -#ifdef NON_DIEGETIC_PAN if ( st_ivas->hDecoderConfig->Opt_non_diegetic_pan ) { fprintf( stdout, "Non-diegetic panning: %.2f\n", st_ivas->hDecoderConfig->non_diegetic_pan_gain * 90.f ); } -#endif } return IVAS_ERR_OK; @@ -2919,15 +2870,11 @@ static ivas_error evs_dec_main( int16_t *pcmBuf ) { DEC_CORE_HANDLE *hCoreCoder; -#ifdef NON_DIEGETIC_PAN float output[MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN][L_FRAME48k]; float mixer_left, mixer_rigth; #ifdef JBM_TSM_ON_TCS float *p_output[MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN]; int16_t ch; -#endif -#else - float output[L_FRAME48k]; #endif ivas_error error; @@ -2939,12 +2886,10 @@ static ivas_error evs_dec_main( mdct_switching_dec( hCoreCoder[0] ); #ifdef JBM_TSM_ON_TCS -#ifdef NON_DIEGETIC_PAN for ( ch = 0; ch < MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN; ch++ ) { p_output[ch] = output[ch]; } -#endif #endif /* run the main EVS decoding routine */ @@ -2952,22 +2897,14 @@ static ivas_error evs_dec_main( { if ( hCoreCoder[0]->Opt_AMR_WB ) { -#ifdef NON_DIEGETIC_PAN if ( ( error = amr_wb_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output[0] ) ) != IVAS_ERR_OK ) -#else - if ( ( error = amr_wb_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output ) ) != IVAS_ERR_OK ) -#endif { return error; } } else { -#ifdef NON_DIEGETIC_PAN if ( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output[0], FRAMEMODE_NORMAL ) ) != IVAS_ERR_OK ) -#else - if ( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output, FRAMEMODE_NORMAL ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -2977,33 +2914,21 @@ static ivas_error evs_dec_main( { if ( hCoreCoder[0]->bfi == 0 ) { -#ifdef NON_DIEGETIC_PAN if ( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output[0], FRAMEMODE_NORMAL ) ) != IVAS_ERR_OK ) -#else - if ( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output, FRAMEMODE_NORMAL ) ) != IVAS_ERR_OK ) -#endif { return error; } } else if ( hCoreCoder[0]->bfi == 2 ) { -#ifdef NON_DIEGETIC_PAN if ( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output[0], FRAMEMODE_FUTURE ) ) != IVAS_ERR_OK ) -#else - if ( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output, FRAMEMODE_FUTURE ) ) != IVAS_ERR_OK ) -#endif { return error; } } else { -#ifdef NON_DIEGETIC_PAN if ( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output[0], FRAMEMODE_MISSING ) ) != IVAS_ERR_OK ) -#else - if ( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output, FRAMEMODE_MISSING ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -3012,7 +2937,6 @@ static ivas_error evs_dec_main( st_ivas->BER_detect = hCoreCoder[0]->BER_detect; -#ifdef NON_DIEGETIC_PAN if ( st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX ) { mixer_left = ( st_ivas->hDecoderConfig->non_diegetic_pan_gain + 1.f ) * 0.5f; @@ -3020,7 +2944,6 @@ static ivas_error evs_dec_main( v_multc( output[0], mixer_rigth, output[1], nOutSamples ); v_multc( output[0], mixer_left, output[0], nOutSamples ); } -#endif #ifdef JBM_TSM_ON_TCS if ( floatBuf != NULL ) @@ -3033,16 +2956,8 @@ static ivas_error evs_dec_main( #ifdef DEBUGGING st_ivas->noClipping += #endif -#ifdef NON_DIEGETIC_PAN ivas_syn_output( p_output, nOutSamples, st_ivas->hDecoderConfig->nchan_out, pcm_buf_local ); -#else - syn_output( output, nOutSamples, pcm_buf_local ); -#endif -#ifdef NON_DIEGETIC_PAN mvs2r( pcm_buf_local, floatBuf, nOutSamples * st_ivas->hDecoderConfig->nchan_out ); -#else - mvs2r( pcm_buf_local, floatBuf, nOutSamples ); -#endif } else { @@ -3050,15 +2965,11 @@ static ivas_error evs_dec_main( #ifdef DEBUGGING st_ivas->noClipping += #endif -#ifdef NON_DIEGETIC_PAN #ifdef JBM_TSM_ON_TCS ivas_syn_output( p_output, nOutSamples, st_ivas->hDecoderConfig->nchan_out, pcmBuf ); #else ivas_syn_output( output, nOutSamples, st_ivas->hDecoderConfig->nchan_out, pcmBuf ); #endif -#else - syn_output( output, nOutSamples, pcmBuf ); -#endif #ifdef JBM_TSM_ON_TCS } #endif diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index c61d3f91fd..5b10e44929 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -139,10 +139,6 @@ ivas_error IVAS_DEC_Open( , const int16_t orientation_tracking /* i : orientation tracking type */ #endif -#ifndef NON_DIEGETIC_PAN - , - float no_diegetic_pan_gain /* i : non diegetic panning gain */ -#endif ); /*! r: error code */ @@ -156,13 +152,9 @@ ivas_error IVAS_DEC_Configure( #ifdef FIX_439_OTR_PARAMS const HEAD_ORIENT_TRK_T orientation_tracking, /* i : head orientation tracking type */ #endif -#ifdef NON_DIEGETIC_PAN const int16_t renderConfigEnabled, /* i : enable Renderer config. file for binaural output */ const int16_t Opt_non_diegetic_pan, /* i : diegetic or not */ const float non_diegetic_pan_gain /* i : non diegetic panning gain */ -#else - const int16_t renderConfigEnabled /* i : enable Renderer config. file for binaural output */ -#endif ); void IVAS_DEC_Close( diff --git a/lib_enc/ivas_ism_enc.c b/lib_enc/ivas_ism_enc.c index bfa1342bb5..8780573773 100644 --- a/lib_enc/ivas_ism_enc.c +++ b/lib_enc/ivas_ism_enc.c @@ -417,11 +417,7 @@ ivas_error ivas_ism_enc_config( st_ivas->nSCE = st_ivas->nchan_transport; st_ivas->nCPE = 0; -#ifdef ISM_NON_DIEGETIC_PAN if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hEncoderConfig->nchan_inp, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hEncoderConfig->nchan_inp, NULL, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) -#endif { return error; } diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index 36d15266d2..bba796aad0 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -88,12 +88,8 @@ ivas_error ivas_set_ism_metadata( const float elevation, /* i : elevation */ const float radius_meta, /* i : radius */ const float yaw, /* i : yaw */ -#ifdef ISM_NON_DIEGETIC_PAN const float pitch, /* i : pitch */ const int16_t non_diegetic_flag /* i : non-diegetic object flag*/ -#else - const float pitch /* i : pitch */ -#endif ) { if ( hIsmMeta == NULL ) @@ -109,9 +105,7 @@ ivas_error ivas_set_ism_metadata( hIsmMeta->radius = radius_meta; hIsmMeta->yaw = yaw; hIsmMeta->pitch = pitch; -#ifdef ISM_NON_DIEGETIC_PAN hIsmMeta->non_diegetic_flag = non_diegetic_flag; -#endif return IVAS_ERR_OK; } @@ -202,9 +196,7 @@ ivas_error ivas_ism_metadata_enc( ISM_METADATA_HANDLE hIsmMetaData; int32_t element_brate[MAX_NUM_OBJECTS], total_brate[MAX_NUM_OBJECTS]; int16_t ism_metadata_flag_global; -#ifdef ISM_NON_DIEGETIC_PAN int16_t non_diegetic_flag_global; -#endif int16_t ism_imp[MAX_NUM_OBJECTS]; int16_t nbands, nblocks; ivas_error error; @@ -215,9 +207,7 @@ ivas_error ivas_ism_metadata_enc( /* initialization */ ism_metadata_flag_global = 0; -#ifdef ISM_NON_DIEGETIC_PAN non_diegetic_flag_global = 0; -#endif set_s( nb_bits_metadata, 0, nchan_transport ); set_s( flag_abs_azimuth, 0, nchan_ism ); set_s( flag_abs_elevation, 0, nchan_ism ); @@ -303,26 +293,22 @@ ivas_error ivas_ism_metadata_enc( } push_indice( hBstr, IND_ISM_NUM_OBJECTS, 0, 1 ); -#ifdef ISM_NON_DIEGETIC_PAN for ( ch = 0; ch < nchan_ism; ch++ ) { ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag; non_diegetic_flag_global |= hIsmMeta[ch]->non_diegetic_flag; } -#endif /* write extended metadata presence flag */ if ( ism_total_brate >= ISM_EXTENDED_METADATA_BRATE ) { push_indice( hBstr, IND_ISM_EXTENDED_FLAG, ism_extended_metadata_flag, ISM_EXTENDED_METADATA_BITS ); -#ifdef ISM_NON_DIEGETIC_PAN /* Write global non-diegetic object flag */ if ( ism_extended_metadata_flag ) { push_indice( hBstr, IND_ISM_EXTENDED_NDP_FLAG, non_diegetic_flag_global, ISM_EXTENDED_METADATA_BITS ); } -#endif } /* write ISM metadata flag (one per object) */ @@ -331,12 +317,6 @@ ivas_error ivas_ism_metadata_enc( push_indice( hBstr, IND_ISM_METADATA_FLAG, ism_imp[ch], ISM_METADATA_FLAG_BITS ); } -#ifndef ISM_NON_DIEGETIC_PAN - for ( ch = 0; ch < nchan_ism; ch++ ) - { - ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag; - } -#endif if ( ism_mode == ISM_MODE_DISC ) { /* write VAD flag */ @@ -378,7 +358,6 @@ ivas_error ivas_ism_metadata_enc( * Quantize and encode azimuth and elevation *----------------------------------------------------------------*/ -#ifdef ISM_NON_DIEGETIC_PAN if ( ism_extended_metadata_flag && non_diegetic_flag_global ) { /* Write non-diegetic flag for each object */ @@ -403,7 +382,6 @@ ivas_error ivas_ism_metadata_enc( } else { -#endif if ( ism_mode == ISM_MODE_DISC ) { idx_angle1_abs = ism_quant_meta( hIsmMetaData->azimuth, &valQ, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); @@ -430,9 +408,7 @@ ivas_error ivas_ism_metadata_enc( encode_angle_indices( hBstr, &( hIsmMetaData->orientation_angle ), hIsmMetaData->last_ism_metadata_flag, hSCE[0]->hCoreCoder[0]->ini_frame, idx_angle1_abs, idx_angle2_abs, &flag_abs_yaw[ch], &flag_abs_pitch[ch] ); encode_radius( hBstr, &hIsmMetaData->last_radius_idx, &hIsmMetaData->radius_diff_cnt, hIsmMetaData->last_ism_metadata_flag, idx_radius_abs, &flag_abs_radius[ch] ); } -#ifdef ISM_NON_DIEGETIC_PAN } -#endif /* save number of metadata bits written */ if ( ism_mode == ISM_MODE_DISC ) @@ -576,11 +552,7 @@ ivas_error ivas_ism_metadata_enc( * Configuration and decision about bitrates per channel *----------------------------------------------------------------*/ -#ifdef ISM_NON_DIEGETIC_PAN if ( ( error = ivas_ism_config( ism_total_brate, nchan_transport, nchan_ism, hIsmMeta, ism_extended_metadata_flag, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_ism_config( ism_total_brate, nchan_transport, nchan_ism, hIsmMeta, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -702,11 +674,7 @@ ivas_error ivas_ism_metadata_enc_create( #endif } -#ifdef ISM_NON_DIEGETIC_PAN if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, n_ISms, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, n_ISms, NULL, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -942,10 +910,8 @@ static void encode_angle_indices( * Elevation/pitch index encoding *----------------------------------------------------------------*/ -#ifdef ISM_NON_DIEGETIC_PAN if ( flag_abs_angle2 ) { -#endif idx_angle2 = idx_angle2_abs; nbits_diff_angle2 = 0; *flag_abs_angle2 = 0; /* differential coding by default */ @@ -1056,9 +1022,7 @@ static void encode_angle_indices( { push_indice( hBstr, IND_ISM_ELEVATION, idx_angle2, nbits_diff_angle2 ); } -#ifdef ISM_NON_DIEGETIC_PAN } -#endif /*----------------------------------------------------------------* * Updates diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 3da409f6ae..240cbb0e5a 100755 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -447,11 +447,7 @@ ivas_error IVAS_ENC_FeedObjectMetadata( return IVAS_ERR_INDEX_OUT_OF_BOUNDS; } -#ifdef ISM_NON_DIEGETIC_PAN error = ivas_set_ism_metadata( hIvasEnc->st_ivas->hIsmMetaData[ismIndex], metadata.azimuth, metadata.elevation, metadata.radius, metadata.yaw, metadata.pitch, metadata.non_diegetic_flag ); -#else - error = ivas_set_ism_metadata( hIvasEnc->st_ivas->hIsmMetaData[ismIndex], metadata.azimuth, metadata.elevation, metadata.radius, metadata.yaw, metadata.pitch ); -#endif if ( error != IVAS_ERR_OK ) { diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index e163862eeb..419801d6b5 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -34,9 +34,7 @@ #include #include "options.h" #include "prot.h" -#ifdef ISM_NON_DIEGETIC_PAN #include "ivas_prot.h" -#endif #include "ivas_prot_rend.h" #include #include "ivas_rom_com.h" @@ -354,9 +352,7 @@ ivas_error TDREND_GetMix( float hrf_left_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; float hrf_right_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; int16_t intp_count; -#ifdef ISM_NON_DIEGETIC_PAN float pan_left, pan_right; -#endif error = IVAS_ERR_OK; @@ -378,11 +374,7 @@ ivas_error TDREND_GetMix( SrcRend_p = Src_p->SrcRend_p; /* Update rendering params if needed */ -#ifdef ISM_NON_DIEGETIC_PAN if ( ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING ) && ( hBinRendererTd->Listener_p->PoseUpdated || SrcSpatial_p->Updated ) ) -#else - if ( hBinRendererTd->Listener_p->PoseUpdated || SrcSpatial_p->Updated ) -#endif { TDREND_SRC_REND_UpdateFiltersFromSpatialParams( hBinRendererTd, SrcRend_p, SrcSpatial_p, Src_p->hrf_left_prev, Src_p->hrf_right_prev, hrf_left_delta, hrf_right_delta, &intp_count, &Src_p->filterlength, &Src_p->itd, &Src_p->Gain, Src_p, subframe_idx ); @@ -394,7 +386,6 @@ ivas_error TDREND_GetMix( error = TDREND_REND_RenderSourceHRFilt( Src_p, hrf_left_delta, hrf_right_delta, intp_count, output_buf, subframe_length ); } -#ifdef ISM_NON_DIEGETIC_PAN if ( ( SrcRend_p->InputAvailable == TRUE ) && ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING_NON_DIEGETIC ) ) { pan_left = ( SrcSpatial_p->Pos_p[1] + 1.f ) * 0.5f; @@ -402,7 +393,6 @@ ivas_error TDREND_GetMix( v_multc_acc( &Src_p->InputFrame_p[subframe_idx * subframe_length], pan_left, output_buf[0], subframe_length ); v_multc_acc( &Src_p->InputFrame_p[subframe_idx * subframe_length], pan_right, output_buf[1], subframe_length ); } -#endif } /* Populate output variable */ @@ -494,7 +484,6 @@ void TDREND_Update_object_positions( TDREND_MIX_SRC_SetPos( hBinRendererTd, nS, Pos ); TDREND_MIX_SRC_SetDirAtten( hBinRendererTd, nS, DirAtten_p ); -#ifdef ISM_NON_DIEGETIC_PAN if ( hIsmMetaData[nS]->non_diegetic_flag ) { Pos[0] = 0; @@ -507,9 +496,6 @@ void TDREND_Update_object_positions( { TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING ); } -#else - TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING ); -#endif TDREND_MIX_SRC_SetDir( hBinRendererTd, nS, Dir ); } } @@ -693,9 +679,7 @@ ivas_error ivas_td_binaural_renderer_ext( hIsmMetaData[0]->yaw = currentPos->yaw; hIsmMetaData[0]->pitch = currentPos->pitch; hIsmMetaData[0]->radius = currentPos->radius; -#ifdef ISM_NON_DIEGETIC_PAN hIsmMetaData[0]->non_diegetic_flag = currentPos->non_diegetic_flag; -#endif } #ifdef JBM_TSM_ON_TCS diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 5becd351d6..39e4c09ada 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -118,10 +118,8 @@ typedef struct CREND_WRAPPER_HANDLE crendWrapper; REVERB_HANDLE hReverb; rotation_matrix rot_mat_prev; -#ifdef NON_DIEGETIC_PAN int16_t nonDiegeticPan; float nonDiegeticPanGain; -#endif } input_ism; typedef struct @@ -148,10 +146,8 @@ typedef struct CREND_WRAPPER_HANDLE crendWrapper; REVERB_HANDLE hReverb; rotation_gains rot_gains_prev; -#ifdef NON_DIEGETIC_PAN int16_t nonDiegeticPan; float nonDiegeticPanGain; -#endif lfe_routing lfeRouting; } input_mc; @@ -1018,9 +1014,7 @@ static IVAS_REND_AudioObjectPosition defaultObjectPosition( pos.radius = 1.0f; pos.yaw = 0.0f; pos.pitch = 0.0f; -#ifdef ISM_NON_DIEGETIC_PAN pos.non_diegetic_flag = 0; -#endif return pos; } @@ -1626,7 +1620,6 @@ static ivas_error updateMcPanGainsForMcOut( inputMc->base.inConfig == IVAS_REND_AUDIO_CONFIG_MONO || inputMc->base.inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) { -#ifdef NON_DIEGETIC_PAN if ( ( inputMc->base.inConfig == IVAS_REND_AUDIO_CONFIG_MONO ) && ( inputMc->nonDiegeticPan ) ) { inputMc->panGains[0][0] = ( inputMc->nonDiegeticPanGain + 1.f ) * 0.5f; @@ -1634,7 +1627,6 @@ static ivas_error updateMcPanGainsForMcOut( error = IVAS_ERR_OK; } else -#endif { error = initMcPanGainsWithEfap( inputMc, outConfig ); } @@ -2673,13 +2665,9 @@ static void clearInputMasa( ivas_error IVAS_REND_Open( IVAS_REND_HANDLE *phIvasRend, const int32_t outputSampleRate, -#ifdef NON_DIEGETIC_PAN const IVAS_REND_AudioConfig outConfig, const int16_t nonDiegeticPan, const float nonDiegeticPanGain -#else - const IVAS_REND_AudioConfig outConfig -#endif ) { int16_t i; @@ -2750,10 +2738,8 @@ ivas_error IVAS_REND_Open( hIvasRend->inputsIsm[i].crendWrapper = NULL; hIvasRend->inputsIsm[i].hReverb = NULL; hIvasRend->inputsIsm[i].tdRendWrapper.hBinRendererTd = NULL; -#ifdef NON_DIEGETIC_PAN hIvasRend->inputsIsm[i].nonDiegeticPan = nonDiegeticPan; hIvasRend->inputsIsm[i].nonDiegeticPanGain = nonDiegeticPanGain; -#endif } for ( i = 0; i < RENDERER_MAX_MC_INPUTS; ++i ) @@ -2763,10 +2749,8 @@ ivas_error IVAS_REND_Open( hIvasRend->inputsMc[i].crendWrapper = NULL; hIvasRend->inputsMc[i].hReverb = NULL; hIvasRend->inputsMc[i].tdRendWrapper.hBinRendererTd = NULL; -#ifdef NON_DIEGETIC_PAN hIvasRend->inputsMc[i].nonDiegeticPan = nonDiegeticPan; hIvasRend->inputsMc[i].nonDiegeticPanGain = nonDiegeticPanGain; -#endif } for ( i = 0; i < RENDERER_MAX_SBA_INPUTS; ++i ) @@ -3844,9 +3828,7 @@ int16_t IVAS_REND_FeedRenderConfig( mvr2r( renderConfig.room_acoustics.pFc_input, hRenderConfig->roomAcoustics.pFc_input, CLDFB_NO_CHANNELS_MAX ); mvr2r( renderConfig.room_acoustics.pAcoustic_rt60, hRenderConfig->roomAcoustics.pAcoustic_rt60, CLDFB_NO_CHANNELS_MAX ); mvr2r( renderConfig.room_acoustics.pAcoustic_dsr, hRenderConfig->roomAcoustics.pAcoustic_dsr, CLDFB_NO_CHANNELS_MAX ); -#ifdef ISM_NON_DIEGETIC_PAN mvr2r( renderConfig.directivity, hRenderConfig->directivity, 3 ); -#endif return IVAS_ERR_OK; } @@ -4567,7 +4549,6 @@ static ivas_error renderIsmToMc( /* TODO(sgi): Possible optimization: less processing needed if position didn't change */ if ( *ismInput->base.ctx.pOutConfig == IVAS_REND_AUDIO_CONFIG_STEREO ) { -#ifdef NON_DIEGETIC_PAN if ( ismInput->nonDiegeticPan ) { previousPanGains[0] = currentPanGains[0] = ( ismInput->nonDiegeticPanGain + 1.f ) * 0.5f; @@ -4576,7 +4557,6 @@ static ivas_error renderIsmToMc( } else { -#endif set_zero( currentPanGains, 16 ); ivas_ism_get_stereo_gains( ismInput->currentPos.azimuth, ismInput->currentPos.elevation, @@ -4588,9 +4568,7 @@ static ivas_error renderIsmToMc( ismInput->previousPos.elevation, &previousPanGains[0], &previousPanGains[1] ); -#ifdef NON_DIEGETIC_PAN } -#endif } else { diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index aaec5f4658..727a0d8928 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -134,13 +134,9 @@ typedef uint16_t IVAS_REND_InputId; ivas_error IVAS_REND_Open( IVAS_REND_HANDLE *phIvasRend, /* i/o: Pointer to renderer handle */ const int32_t outputSampleRate, /* i : output sampling rate */ -#ifdef NON_DIEGETIC_PAN const IVAS_REND_AudioConfig outConfig, /* i : output audio config */ const int16_t nonDiegeticPan, /* i : non-diegetic object flag */ const float nonDiegeticPanGain /* i : non-diegetic panning gain */ -#else - const IVAS_REND_AudioConfig outConfig /* i : output audio config */ -#endif ); /* Note: this will reset custom LFE routings set for any MC input */ diff --git a/lib_util/cmdln_parser.c b/lib_util/cmdln_parser.c index a239412f25..6ac2b0ec2d 100644 --- a/lib_util/cmdln_parser.c +++ b/lib_util/cmdln_parser.c @@ -120,11 +120,7 @@ static int16_t initOpts( static int8_t stringLooksLikeOption( const char *str ) { -#ifdef NON_DIEGETIC_PAN if ( ( str[0] == '-' ) && is_number( str ) == false ) -#else - if ( str[0] == '-' ) -#endif { return 1; } @@ -135,11 +131,7 @@ static int8_t stringLooksLikeOption( static const char *stringToOptionName( const char *str ) { -#ifdef NON_DIEGETIC_PAN while ( ( *str == '-' ) && ( ( str[1] != '0' ) || ( str[1] != '1' ) ) ) -#else - while ( *str == '-' ) -#endif { ++str; } diff --git a/lib_util/ism_file_reader.c b/lib_util/ism_file_reader.c index add6a85a7a..4e6babe4c4 100644 --- a/lib_util/ism_file_reader.c +++ b/lib_util/ism_file_reader.c @@ -36,13 +36,8 @@ #include #define META_LINE_LENGTH 200 /* max number of characters at one line of metadata input/output file */ -#ifdef ISM_NON_DIEGETIC_PAN #define NUM_ISM_METADATA_PER_LINE 8 /* Number of ISM metadata per line in a metadata file */ #define NUM_MIN_ISM_METADATA 1 /* Minimum number of metadata parameters (azimuth) */ -#else -#define NUM_ISM_METADATA_PER_LINE 7 /* Number of ISM metadata per line in a metadata file */ -#define NUM_MIN_ISM_METADATA 2 /* Minimum number of metadata parameters (azimuth and elevation) */ -#endif struct IsmFileReader @@ -100,11 +95,7 @@ ivas_error IsmFileReader_readNextFrame( { char char_buff[META_LINE_LENGTH]; float meta_prm[NUM_ISM_METADATA_PER_LINE]; -#ifdef ISM_NON_DIEGETIC_PAN const float meta_prm_default[NUM_ISM_METADATA_PER_LINE] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f }; -#else - const float meta_prm_default[NUM_ISM_METADATA_PER_LINE] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f }; -#endif char *char_ptr; int16_t i; FILE *file; @@ -157,17 +148,13 @@ ivas_error IsmFileReader_readNextFrame( ismMetadata->gainFactor = meta_prm[4]; ismMetadata->yaw = meta_prm[5]; ismMetadata->pitch = meta_prm[6]; -#ifdef ISM_NON_DIEGETIC_PAN ismMetadata->non_diegetic_flag = (int16_t) meta_prm[7]; -#endif /* verify whether the read metadata values are in an expected range */ -#ifdef ISM_NON_DIEGETIC_PAN if ( ( ismMetadata->non_diegetic_flag ) != 0 && ( ismMetadata->non_diegetic_flag != 1 ) ) { return IVAS_ERR_ISM_INVALID_METADATA_VALUE; } -#endif if ( ismMetadata->azimuth > 180 || ismMetadata->azimuth < -180 ) { diff --git a/lib_util/ism_file_writer.c b/lib_util/ism_file_writer.c index 18571aa150..470b02e698 100644 --- a/lib_util/ism_file_writer.c +++ b/lib_util/ism_file_writer.c @@ -114,11 +114,7 @@ ivas_error IsmFileWriter_writeFrame( file = ismWriter->file; /* IVAS_fmToDo: work in progress; currently position_azimuth, position_elevation, position_radius, spread, gain_factor */ -#ifdef ISM_NON_DIEGETIC_PAN snprintf( char_buff, sizeof( char_buff ), "%+07.2f,%+06.2f,%05.2f,%06.2f,%04.2f,%+07.2f,%+06.2f,%d\n", ismMetadata.azimuth, ismMetadata.elevation, ismMetadata.radius, ismMetadata.spread, ismMetadata.gainFactor, ismMetadata.yaw, ismMetadata.pitch, ismMetadata.non_diegetic_flag ); -#else - snprintf( char_buff, sizeof( char_buff ), "%+07.2f,%+06.2f,%05.2f,%06.2f,%04.2f,%+07.2f,%+06.2f\n", ismMetadata.azimuth, ismMetadata.elevation, ismMetadata.radius, ismMetadata.spread, ismMetadata.gainFactor, ismMetadata.yaw, ismMetadata.pitch ); -#endif if ( file ) { fputs( char_buff, file ); -- GitLab From 09eb95e43a89886cb7662a458c2446acd5410bda Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 19:42:58 +0200 Subject: [PATCH 236/331] [cleanup] accept FIX_331_ALL_BRS --- lib_com/ivas_cov_smooth.c | 35 ----------------------------------- lib_com/options.h | 1 - lib_enc/ivas_spar_encoder.c | 6 ------ 3 files changed, 42 deletions(-) diff --git a/lib_com/ivas_cov_smooth.c b/lib_com/ivas_cov_smooth.c index 7a24396606..e0789864dc 100644 --- a/lib_com/ivas_cov_smooth.c +++ b/lib_com/ivas_cov_smooth.c @@ -51,10 +51,6 @@ static void ivas_set_up_cov_smoothing( ivas_filterbank_t *pFb, const float max_update_rate, const int16_t min_pool_size -#ifndef FIX_331_ALL_BRS - , - const int16_t nchan_inp /* i : number of input channels */ -#endif , const int32_t ivas_total_brate ) { @@ -94,30 +90,6 @@ static void ivas_set_up_cov_smoothing( } } else -#ifndef FIX_331_ALL_BRS - if ( nchan_inp <= FOA_CHANNELS ) - { - for ( j = 0; j < pFb->filterbank_num_bands; j++ ) - { - float update_factor; - update_factor = 0.0f; - - for ( k = 0; k < pFb->fb_bin_to_band.pFb_active_bins_per_band[j]; k++ ) - { - update_factor += pFb->fb_bin_to_band.pFb_bin_to_band[j][k]; - } - - hCovState->pSmoothing_factor[j] = update_factor / min_pool_size; - - if ( hCovState->pSmoothing_factor[j] > max_update_rate ) - { - hCovState->pSmoothing_factor[j] = max_update_rate; - } - } - } - else - { -#endif for ( j = 0; j < pFb->filterbank_num_bands; j++ ) { float update_factor; @@ -137,9 +109,6 @@ static void ivas_set_up_cov_smoothing( hCovState->pSmoothing_factor[j] = max_update_rate; } } -#ifndef FIX_331_ALL_BRS - } -#endif hCovState->prior_bank_idx = -1; return; @@ -187,11 +156,7 @@ ivas_error ivas_spar_covar_smooth_enc_open( } -#ifndef FIX_331_ALL_BRS - ivas_set_up_cov_smoothing( hCovState, pFb, cov_smooth_cfg->max_update_rate, cov_smooth_cfg->min_pool_size, nchan_inp, ivas_total_brate ); -#else ivas_set_up_cov_smoothing( hCovState, pFb, cov_smooth_cfg->max_update_rate, cov_smooth_cfg->min_pool_size, ivas_total_brate ); -#endif *hCovState_out = hCovState; diff --git a/lib_com/options.h b/lib_com/options.h index 5dc7cc347d..25d8b42151 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -142,7 +142,6 @@ #define DISABLE_ADAP_RES_COD_TMP /* temporary fix for IVAS-403, disables adaptive residual coding */ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ -#define FIX_331_ALL_BRS /*Enable the fix_331 across all the bitrates and sba modes*/ #define FIX_ISM_DTX_CNG_BWIDTH_ALT /* VA: issue 396 - alternative fix for bw changes on CNG frames in ISM DTX for objects that use the decoder-side noise estimation */ #define FIX_398_MASA_DIRECTION_ALIGNMENT /* Nokia: Issue 398: in 2dir MASA, dynamically adjust directions to be consistent */ diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 4837fcbb8a..a72f40bb43 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -503,12 +503,6 @@ static ivas_error ivas_spar_enc_process( *-----------------------------------------------------------------------------------------*/ ivas_transient_det_process( hSpar->hTranDet, data_f[0], input_frame, transient_det ); -#ifndef FIX_331_ALL_BRS - if ( sba_order == 1 ) - { - transient_det[1] = transient_det[0]; - } -#endif if ( ivas_total_brate < IVAS_24k4 ) { transient_det[1] = 0; -- GitLab From 500bc9a523681fcf251dfe1c9c5d31be173a5842 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 19:43:42 +0200 Subject: [PATCH 237/331] [cleanup] accept FIX_ISM_DTX_CNG_BWIDTH_ALT --- lib_com/options.h | 1 - lib_com/prot.h | 2 -- lib_dec/acelp_core_dec.c | 11 --------- lib_dec/evs_dec.c | 4 ---- lib_dec/init_dec.c | 3 --- lib_dec/ivas_core_dec.c | 10 -------- lib_dec/ivas_init_dec.c | 2 -- lib_dec/ivas_ism_dtx_dec.c | 42 --------------------------------- lib_dec/ivas_ism_metadata_dec.c | 6 ----- lib_dec/ivas_sce_dec.c | 12 ---------- lib_dec/stat_dec.h | 3 --- 11 files changed, 96 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 25d8b42151..7249c69466 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -142,7 +142,6 @@ #define DISABLE_ADAP_RES_COD_TMP /* temporary fix for IVAS-403, disables adaptive residual coding */ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ -#define FIX_ISM_DTX_CNG_BWIDTH_ALT /* VA: issue 396 - alternative fix for bw changes on CNG frames in ISM DTX for objects that use the decoder-side noise estimation */ #define FIX_398_MASA_DIRECTION_ALIGNMENT /* Nokia: Issue 398: in 2dir MASA, dynamically adjust directions to be consistent */ #define REND_DEBUGGING_REVISION /* VA: encapsulate rendering debugging options with DEBUGGING */ diff --git a/lib_com/prot.h b/lib_com/prot.h index 6d3d0fd744..3b0a081431 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -4555,10 +4555,8 @@ ivas_error acelp_core_dec( const int16_t flag_sec_CNA, /* i : CNA flag for secondary channel */ const int16_t nchan_out, /* i : number of output channels */ STEREO_CNG_DEC_HANDLE hStereoCng /* i : stereo CNG handle */ -#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT , const int16_t read_sid_info /* i : read SID info flag */ -#endif ); void bass_psfilter_init( diff --git a/lib_dec/acelp_core_dec.c b/lib_dec/acelp_core_dec.c index f7b7465028..0c073cb9fd 100644 --- a/lib_dec/acelp_core_dec.c +++ b/lib_dec/acelp_core_dec.c @@ -75,10 +75,8 @@ ivas_error acelp_core_dec( const int16_t flag_sec_CNA, /* i : CNA flag for secondary channel */ const int16_t nchan_out, /* i : number of output channels */ STEREO_CNG_DEC_HANDLE hStereoCng /* i : stereo CNG handle */ -#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT , const int16_t read_sid_info /* i : read SID info flag */ -#endif ) { float old_exc[L_EXC_DEC], *exc; /* excitation signal buffer */ @@ -514,11 +512,7 @@ ivas_error acelp_core_dec( } else { -#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT if ( st->core_brate == SID_2k40 && st->element_mode != IVAS_CPE_MDCT ) -#else - if ( st->core_brate == SID_2k40 && st->element_mode != IVAS_CPE_MDCT && st->read_sid_info ) -#endif { FdCng_decodeSID( st ); *sid_bw = 0; @@ -535,12 +529,7 @@ ivas_error acelp_core_dec( ApplyFdCng( syn, NULL, realBuffer, imagBuffer, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); } -#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT if ( !read_sid_info ) -#else - if ( !st->read_sid_info ) - // if (!st->read_sid_info && st->cng_ism_flag) /* read_sid_info can only be 0 in ParamISM mode */ -#endif { float noise_lvl_highest; diff --git a/lib_dec/evs_dec.c b/lib_dec/evs_dec.c index 8ea2d71159..fcc1a5ec52 100644 --- a/lib_dec/evs_dec.c +++ b/lib_dec/evs_dec.c @@ -261,11 +261,7 @@ ivas_error evs_dec( if ( st->core == ACELP_CORE ) { /* ACELP core decoder */ -#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT if ( ( error = acelp_core_dec( st, NULL, synth, NULL, bwe_exc_extended, voice_factors, old_syn_12k8_16k, sharpFlag, pitch_buf, &unbits, &sid_bw, NULL, NULL, NULL, 0, EVS_MONO, 0, 0, 1, NULL, 1 ) ) != IVAS_ERR_OK ) -#else - if ( ( error = acelp_core_dec( st, NULL, synth, NULL, bwe_exc_extended, voice_factors, old_syn_12k8_16k, sharpFlag, pitch_buf, &unbits, &sid_bw, NULL, NULL, NULL, 0, EVS_MONO, 0, 0, 1, NULL ) ) != IVAS_ERR_OK ) -#endif { return error; } diff --git a/lib_dec/init_dec.c b/lib_dec/init_dec.c index 173623db65..0a28ca2a90 100644 --- a/lib_dec/init_dec.c +++ b/lib_dec/init_dec.c @@ -736,9 +736,6 @@ ivas_error init_decoder( st->cna_dirac_flag = 0; st->cng_sba_flag = 0; st->cng_ism_flag = 0; -#ifndef FIX_ISM_DTX_CNG_BWIDTH_ALT - st->read_sid_info = 1; /* by default read the sid info from bitstream */ -#endif st->is_ism_format = 0; diff --git a/lib_dec/ivas_core_dec.c b/lib_dec/ivas_core_dec.c index 516e027f90..9d6211bf8f 100644 --- a/lib_dec/ivas_core_dec.c +++ b/lib_dec/ivas_core_dec.c @@ -90,9 +90,7 @@ ivas_error ivas_core_dec( int16_t use_cldfb_for_dft; float *p_output_mem; int16_t flag_sec_CNA; -#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT int16_t read_sid_info; -#endif int16_t last_element_mode; int16_t nchan_out; float *save_hb_synth; @@ -108,9 +106,7 @@ ivas_error ivas_core_dec( use_cldfb_for_dft = 0; tdm_LRTD_flag = -1; -#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT read_sid_info = 1; /* read SID by default */ -#endif if ( hSCE != NULL ) { @@ -122,7 +118,6 @@ ivas_error ivas_core_dec( hStereoTD = NULL; p_output_mem = NULL; nchan_out = 1; -#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT if ( st_ivas != NULL && st_ivas->ivas_format == ISM_FORMAT ) { if ( st_ivas->hISMDTX.sce_id_dtx != hSCE->sce_id ) @@ -130,7 +125,6 @@ ivas_error ivas_core_dec( read_sid_info = 0; } } -#endif } else { @@ -347,11 +341,7 @@ ivas_error ivas_core_dec( if ( st->core == ACELP_CORE ) { /* ACELP core decoder */ -#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT if ( ( error = acelp_core_dec( st, output[n], synth[n], save_hb_synth, bwe_exc_extended[n], voice_factors[n], old_syn_12k8_16k[n], sharpFlag[n], pitch_buf[n], &unbits[n], &sid_bw[n], hStereoTD, tdm_lspQ_PCh, tdm_lsfQ_PCh, use_cldfb_for_dft, last_element_mode, last_element_brate, flag_sec_CNA, nchan_out, hCPE == NULL ? NULL : hCPE->hStereoCng, read_sid_info ) ) != IVAS_ERR_OK ) -#else - if ( ( error = acelp_core_dec( st, output[n], synth[n], save_hb_synth, bwe_exc_extended[n], voice_factors[n], old_syn_12k8_16k[n], sharpFlag[n], pitch_buf[n], &unbits[n], &sid_bw[n], hStereoTD, tdm_lspQ_PCh, tdm_lsfQ_PCh, use_cldfb_for_dft, last_element_mode, last_element_brate, flag_sec_CNA, nchan_out, hCPE == NULL ? NULL : hCPE->hStereoCng ) ) != IVAS_ERR_OK ) -#endif { return error; } diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index a2be71d0d8..6a4aaa462d 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -900,9 +900,7 @@ ivas_error ivas_init_decoder( st_ivas->hSCE[sce_id]->hCoreCoder[0]->is_ism_format = 1; } -#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT st_ivas->hISMDTX.sce_id_dtx = 0; -#endif if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { diff --git a/lib_dec/ivas_ism_dtx_dec.c b/lib_dec/ivas_ism_dtx_dec.c index b2bc737fa2..7c22ff2e9e 100644 --- a/lib_dec/ivas_ism_dtx_dec.c +++ b/lib_dec/ivas_ism_dtx_dec.c @@ -39,42 +39,6 @@ #endif #include "wmc_auto.h" -#ifndef FIX_ISM_DTX_CNG_BWIDTH_ALT -/*-------------------------------------------------------------------* - * ivas_ism_preprocessing() - * - * - *-------------------------------------------------------------------*/ - -static void ivas_ism_preprocessing( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const int16_t sce_id /* i : SCE # identifier */ -) -{ - Decoder_State *st; - - st = st_ivas->hSCE[sce_id]->hCoreCoder[0]; - - { - /* reset the bitstream to at least read the cng type and bandwidth for non transmitted SCE */ - st->bit_stream = st_ivas->hSCE[0]->hCoreCoder[0]->bit_stream; - st->next_bit_pos = 0; /* note: needed in paramISM -> discISM switching */ - - if ( sce_id == st_ivas->hISMDTX.sce_id_dtx ) - { - st->read_sid_info = 1; /* read the sid info from bitstream */ - } - else - { - st->read_sid_info = 0; /* do not read the sid info from bitstream but use the estimated noise */ - } - - st->cng_ism_flag = 1; - } - - return; -} -#endif /*-------------------------------------------------------------------* * ivas_ism_dtx_dec() @@ -93,9 +57,7 @@ ivas_error ivas_ism_dtx_dec( int16_t idx, flag_noisy_speech, sce_id_dtx; ISM_MODE last_ism_mode, ism_mode_bstr; ivas_error error; -#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT Decoder_State *st; -#endif ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; @@ -188,15 +150,11 @@ ivas_error ivas_ism_dtx_dec( { for ( ch = 0; ch < st_ivas->nchan_transport; ch++ ) { -#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT st = st_ivas->hSCE[ch]->hCoreCoder[0]; st->bit_stream = st_ivas->hSCE[0]->hCoreCoder[0]->bit_stream; st->next_bit_pos = 0; /* note: needed in paramISM -> discISM switching */ st->cng_ism_flag = 1; st->L_frame = min( st->L_frame, L_FRAME16k ); /* note: needed for switching from active frame with L_frame=640 to CNG in object with no SID */ -#else - ivas_ism_preprocessing( st_ivas, ch ); // VE: after the acceptance of switches, replace the function call by its content -#endif } } diff --git a/lib_dec/ivas_ism_metadata_dec.c b/lib_dec/ivas_ism_metadata_dec.c index 9787500a7f..40a9103266 100644 --- a/lib_dec/ivas_ism_metadata_dec.c +++ b/lib_dec/ivas_ism_metadata_dec.c @@ -939,12 +939,6 @@ void ivas_ism_metadata_sid_dec( hSCE[ch]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence = (float) ( idx ) / (float) ( ( 1 << nBits_coh ) - 1 ); } } -#ifndef FIX_ISM_DTX_CNG_BWIDTH_ALT - else - { - *sce_id_dtx = 0; - } -#endif if ( ism_mode == ISM_MODE_PARAM ) { diff --git a/lib_dec/ivas_sce_dec.c b/lib_dec/ivas_sce_dec.c index 9a940b9b6d..97a9b81895 100755 --- a/lib_dec/ivas_sce_dec.c +++ b/lib_dec/ivas_sce_dec.c @@ -92,18 +92,12 @@ ivas_error ivas_sce_dec( st->total_brate = ivas_total_brate - nb_bits_metadata * FRAMES_PER_SEC; assert( st->total_brate == SID_2k40 && "SCE SID must be 2.4kbps!" ); -#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT if ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->hISMDTX.sce_id_dtx != sce_id ) { st->total_brate = FRAME_NO_DATA; } -#endif } -#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT else if ( !st_ivas->bfi && ivas_total_brate == FRAME_NO_DATA ) -#else - else if ( !st_ivas->bfi && ivas_total_brate <= SID_2k40 ) -#endif { st->total_brate = FRAME_NO_DATA; } @@ -181,18 +175,12 @@ ivas_error ivas_sce_dec( { st->total_brate = ivas_total_brate - nb_bits_metadata * FRAMES_PER_SEC; -#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT if ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->hISMDTX.sce_id_dtx != sce_id ) { st->total_brate = FRAME_NO_DATA; } -#endif } -#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT else if ( !st_ivas->bfi && ivas_total_brate == FRAME_NO_DATA ) -#else - else if ( !st_ivas->bfi && ivas_total_brate <= SID_2k40 ) -#endif { st->total_brate = ivas_total_brate; } diff --git a/lib_dec/stat_dec.h b/lib_dec/stat_dec.h index 9d3adbb181..80f250cade 100644 --- a/lib_dec/stat_dec.h +++ b/lib_dec/stat_dec.h @@ -1355,9 +1355,6 @@ typedef struct Decoder_State MCT_CHAN_MODE mct_chan_mode; int16_t cng_ism_flag; /* CNG in ISM format flag */ -#ifndef FIX_ISM_DTX_CNG_BWIDTH_ALT - int16_t read_sid_info; /* For ParamISM, use the transmitted noise */ -#endif int16_t is_ism_format; /* Indication whether the codec operates in ISM format */ } Decoder_State, *DEC_CORE_HANDLE; -- GitLab From 1f8567886296b7d821eefef27d84efa97b936c61 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 19:44:23 +0200 Subject: [PATCH 238/331] [cleanup] accept FIX_398_MASA_DIRECTION_ALIGNMENT --- lib_com/options.h | 1 - lib_enc/ivas_masa_enc.c | 8 -------- lib_enc/ivas_stat_enc.h | 4 ---- 3 files changed, 13 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 7249c69466..7e329b54ef 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -143,7 +143,6 @@ #define DISABLE_ADAP_RES_COD_TMP /* temporary fix for IVAS-403, disables adaptive residual coding */ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ -#define FIX_398_MASA_DIRECTION_ALIGNMENT /* Nokia: Issue 398: in 2dir MASA, dynamically adjust directions to be consistent */ #define REND_DEBUGGING_REVISION /* VA: encapsulate rendering debugging options with DEBUGGING */ #define FIX_419_ISM_MD_FIX /* VA: Issue 419: fix the upper value limitation for parameter angle1_diff_cnt */ #define FIX_I414_OOA_CNA /* VA: Issue 414: Fixing out-of-array write operation in stereo CNA */ diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 2527fa91aa..a0769d8278 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -76,9 +76,7 @@ static uint8_t are_masa_subframes_similar( const MASA_METADATA_HANDLE frame1, co static void detect_framing_async( MASA_ENCODER_HANDLE hMasa ); -#ifdef FIX_398_MASA_DIRECTION_ALIGNMENT static void masa_metadata_direction_alignment( MASA_ENCODER_HANDLE hMasa ); -#endif /*-----------------------------------------------------------------------* * Local constants @@ -150,12 +148,10 @@ ivas_error ivas_masa_enc_open( hMasa->data.sync_state.prev_offset = 0; hMasa->data.sync_state.frame_mode = MASA_FRAME_4SF; -#ifdef FIX_398_MASA_DIRECTION_ALIGNMENT set_zero( hMasa->data.dir_align_state.previous_azi_dir1, MASA_FREQUENCY_BANDS ); set_zero( hMasa->data.dir_align_state.previous_ele_dir1, MASA_FREQUENCY_BANDS ); set_zero( hMasa->data.dir_align_state.previous_azi_dir2, MASA_FREQUENCY_BANDS ); set_zero( hMasa->data.dir_align_state.previous_ele_dir2, MASA_FREQUENCY_BANDS ); -#endif st_ivas->hMasa = hMasa; @@ -525,9 +521,7 @@ ivas_error ivas_masa_enc_config( if ( ivas_format == MASA_FORMAT ) { -#ifdef FIX_398_MASA_DIRECTION_ALIGNMENT masa_metadata_direction_alignment( hMasa ); -#endif detect_framing_async( hMasa ); /* detect the offset, set 1sf/4sf mode based on this. potentially also shift the metadata using a history buffer */ @@ -2177,7 +2171,6 @@ static void detect_framing_async( } -#ifdef FIX_398_MASA_DIRECTION_ALIGNMENT /*-------------------------------------------------------------------* * masa_metadata_direction_alignment() * @@ -2339,4 +2332,3 @@ static void masa_metadata_direction_alignment( return; } -#endif diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 35ff4b483f..c063616b4b 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -751,7 +751,6 @@ typedef struct ivas_mc_paramupmix_enc_data_structure * MASA encoder structures *----------------------------------------------------------------------------------*/ -#ifdef FIX_398_MASA_DIRECTION_ALIGNMENT typedef struct ivas_masa_dir_align_struct { float previous_azi_dir1[MASA_FREQUENCY_BANDS]; @@ -761,7 +760,6 @@ typedef struct ivas_masa_dir_align_struct float previous_ele_dir2[MASA_FREQUENCY_BANDS]; } MASA_DIR_ALIGN_STATE, *MASA_DIR_ALIGN_HANDLE; -#endif /* structure storing MASA framing sync detection and compensation data */ typedef struct ivas_masa_sync_struct @@ -791,9 +789,7 @@ typedef struct ivas_masa_encoder_data_struct MASA_SYNC_STATE sync_state; -#ifdef FIX_398_MASA_DIRECTION_ALIGNMENT MASA_DIR_ALIGN_STATE dir_align_state; -#endif } MASA_ENCODER_DATA; -- GitLab From 14d0466c11e591c30464812ecaa0f467b07be9da Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 19:45:12 +0200 Subject: [PATCH 239/331] [cleanup] accept REND_DEBUGGING_REVISION --- lib_com/options.h | 1 - lib_dec/ivas_dec.c | 4 ---- 2 files changed, 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 7e329b54ef..8def37534b 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -143,7 +143,6 @@ #define DISABLE_ADAP_RES_COD_TMP /* temporary fix for IVAS-403, disables adaptive residual coding */ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ -#define REND_DEBUGGING_REVISION /* VA: encapsulate rendering debugging options with DEBUGGING */ #define FIX_419_ISM_MD_FIX /* VA: Issue 419: fix the upper value limitation for parameter angle1_diff_cnt */ #define FIX_I414_OOA_CNA /* VA: Issue 414: Fixing out-of-array write operation in stereo CNA */ diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index 3458a9b196..3013c8541c 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -259,14 +259,10 @@ ivas_error ivas_dec( ivas_ism_render( st_ivas, output, output_frame ); #endif } -#ifdef REND_DEBUGGING_REVISION #ifdef DEBUGGING else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) #else else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) -#endif -#else - else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) #endif { /* Convert to Ambisonics; used also for ISM->HOA3->binaural rendering */ -- GitLab From 7b349f843a23ae9be1cecbff52622267fffbf581 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 19:46:08 +0200 Subject: [PATCH 240/331] [cleanup] accept FIX_419_ISM_MD_FIX --- lib_com/options.h | 1 - lib_enc/ivas_ism_metadata_enc.c | 4 ---- 2 files changed, 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 8def37534b..dc9a5ef356 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -143,7 +143,6 @@ #define DISABLE_ADAP_RES_COD_TMP /* temporary fix for IVAS-403, disables adaptive residual coding */ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ -#define FIX_419_ISM_MD_FIX /* VA: Issue 419: fix the upper value limitation for parameter angle1_diff_cnt */ #define FIX_I414_OOA_CNA /* VA: Issue 414: Fixing out-of-array write operation in stereo CNA */ diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index bba796aad0..4c8831a524 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -883,11 +883,7 @@ static void encode_angle_indices( if ( *flag_abs_angle1 == 0 ) { angle->angle1_diff_cnt++; -#ifdef FIX_419_ISM_MD_FIX angle->angle1_diff_cnt = min( angle->angle1_diff_cnt, ISM_FEC_MAX ); -#else - angle->angle2_diff_cnt = min( angle->angle2_diff_cnt, ISM_FEC_MAX ); -#endif } else { -- GitLab From 52ab50344a3e824161cd54e14a2f55aa7b8f9386 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 19:46:54 +0200 Subject: [PATCH 241/331] [cleanup] accept FIX_I414_OOA_CNA --- lib_com/cnst.h | 4 ---- lib_com/options.h | 1 - lib_dec/fd_cng_dec.c | 5 ----- lib_dec/ivas_rom_dec.c | 4 ---- lib_dec/ivas_rom_dec.h | 4 ---- lib_dec/ivas_stereo_dft_dec.c | 4 ---- lib_dec/stat_dec.h | 8 -------- 7 files changed, 30 deletions(-) diff --git a/lib_com/cnst.h b/lib_com/cnst.h index a32d202419..51399309b4 100644 --- a/lib_com/cnst.h +++ b/lib_com/cnst.h @@ -1433,11 +1433,7 @@ typedef enum _DCTTYPE #define CNA_MAX_BRATE ACELP_13k20 -#ifdef FIX_I414_OOA_CNA #define CNA_INIT_NBANDS 6 -#else -#define MAX_CNA_NBANDS 12 -#endif #define GAIN_Q_OFFSET_EVS 60.f #define GAIN_Q_OFFSET_IVAS 45.f diff --git a/lib_com/options.h b/lib_com/options.h index dc9a5ef356..70a0dd2203 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -143,7 +143,6 @@ #define DISABLE_ADAP_RES_COD_TMP /* temporary fix for IVAS-403, disables adaptive residual coding */ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ -#define FIX_I414_OOA_CNA /* VA: Issue 414: Fixing out-of-array write operation in stereo CNA */ #define SNS_MSVQ /* FhG: contribution 33 - MSVQ for SNS parameters at stereo mid bitrates */ diff --git a/lib_dec/fd_cng_dec.c b/lib_dec/fd_cng_dec.c index 7f8eba27c0..23fd63059c 100644 --- a/lib_dec/fd_cng_dec.c +++ b/lib_dec/fd_cng_dec.c @@ -158,13 +158,8 @@ void initFdCngDec( hFdCngDec->cna_ILD_LT = 0.0f; hFdCngDec->first_cna_noise_updated = 0; hFdCngDec->first_cna_noise_update_cnt = 0; -#ifdef FIX_I414_OOA_CNA hFdCngDec->cna_nbands = CNA_INIT_NBANDS; mvs2s( cna_init_bands, hFdCngDec->cna_band_limits, CNA_INIT_NBANDS + 1 ); -#else - hFdCngDec->cna_nbands = 6; - mvs2s( cna_init_bands, hFdCngDec->cna_band_limits, MAX_CNA_NBANDS + 1 ); -#endif hFdCngDec->cna_act_fact = 1.0f; hFdCngDec->cna_rescale_fact = 0.0f; hFdCngDec->cna_seed = 5687; diff --git a/lib_dec/ivas_rom_dec.c b/lib_dec/ivas_rom_dec.c index 16298dfe98..217de22406 100644 --- a/lib_dec/ivas_rom_dec.c +++ b/lib_dec/ivas_rom_dec.c @@ -226,11 +226,7 @@ const float dft_win_8k[70] = * stereo CNA tables *------------------------------------------------------------------------*/ -#ifdef FIX_I414_OOA_CNA const int16_t cna_init_bands[CNA_INIT_NBANDS + 1] = -#else -const int16_t cna_init_bands[MAX_CNA_NBANDS + 1] = -#endif { 1, 4, 14, 33, 67, 171, 320 }; diff --git a/lib_dec/ivas_rom_dec.h b/lib_dec/ivas_rom_dec.h index 05211fa94e..956882aa26 100644 --- a/lib_dec/ivas_rom_dec.h +++ b/lib_dec/ivas_rom_dec.h @@ -68,11 +68,7 @@ extern const float dft_win232ms_48k[450]; extern const float dft_win_8k[70]; -#ifdef FIX_I414_OOA_CNA extern const int16_t cna_init_bands[CNA_INIT_NBANDS + 1]; -#else -extern const int16_t cna_init_bands[MAX_CNA_NBANDS + 1]; -#endif extern const float min_smooth_gains1[SBA_DIRAC_STEREO_NUM_BANDS]; extern const float max_smooth_gains1[SBA_DIRAC_STEREO_NUM_BANDS]; diff --git a/lib_dec/ivas_stereo_dft_dec.c b/lib_dec/ivas_stereo_dft_dec.c index cf5542f1e0..02fd3a41d3 100644 --- a/lib_dec/ivas_stereo_dft_dec.c +++ b/lib_dec/ivas_stereo_dft_dec.c @@ -1605,11 +1605,7 @@ void stereo_dft_dec( if ( hStereoDft->frame_sid_nodata || st0->VAD == 0 ) { -#ifdef FIX_I414_OOA_CNA hFdCngDec->cna_band_limits[hFdCngDec->cna_nbands] = hStereoDft->band_limits[hFdCngDec->cna_nbands]; -#else - hFdCngDec->cna_band_limits[b] = hStereoDft->band_limits[hFdCngDec->cna_nbands]; -#endif } if ( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag ) diff --git a/lib_dec/stat_dec.h b/lib_dec/stat_dec.h index 80f250cade..f7401462a6 100644 --- a/lib_dec/stat_dec.h +++ b/lib_dec/stat_dec.h @@ -105,20 +105,12 @@ typedef struct float cna_LR_LT; /* stereo CNA - long-term L/R correlation factor calculated on stereo upmix */ float cna_ILD_LT; /* stereo CNA - long-term ILD factor calculated on stereo upmix */ float cna_g_state[STEREO_DFT_BAND_MAX]; /* stereo CNA - side gains from the last inactive frame */ -#ifdef FIX_I414_OOA_CNA float cna_cm[STEREO_DFT_BAND_MAX]; /* stereo CNA - coherence from the last inactive frame */ -#else - float cna_cm[STEREO_DFT_BAND_MAX + 1]; /* stereo CNA - coherence from the last inactive frame */ -#endif int16_t first_cna_noise_updated; /* stereo CNA - flag indicating that comfort noise has been properly initialized during warmup */ int16_t first_cna_noise_update_cnt; /* stereo CNA - counter of CN initialization frames */ int16_t cna_nbands; /* stereo CNA - number of frequency bands used by the CNA in DFT stereo mode */ -#ifdef FIX_I414_OOA_CNA int16_t cna_band_limits[STEREO_DFT_BAND_MAX + 1]; /* stereo CNA - band limits used by the CNA in DFT stereo mode */ -#else - int16_t cna_band_limits[MAX_CNA_NBANDS + 1]; /* stereo CNA - band limits used by the CNA in DFT stereo mode */ -#endif float cna_act_fact; /* stereo CNA - long-term signal activity factor (0-1) */ float cna_rescale_fact; /* stereo CNA - CN energy re-scaling factor to maintain decoded energy */ int16_t cna_seed; /* stereo CNA - seed for random CN generator */ -- GitLab From 39c39f49c4b9514dbe965a15a6b46ec7b49fa9f8 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 19:47:23 +0200 Subject: [PATCH 242/331] [cleanup] accept SNS_MSVQ --- lib_com/ivas_cnst.h | 2 - lib_com/ivas_prot.h | 6 --- lib_com/ivas_rom_com.c | 2 - lib_com/ivas_rom_com.h | 2 - lib_com/options.h | 1 - lib_dec/ivas_mdct_core_dec.c | 78 ------------------------------- lib_dec/ivas_sns_dec.c | 46 ------------------- lib_enc/ivas_mdct_core_enc.c | 89 ------------------------------------ lib_enc/ivas_sns_enc.c | 4 -- 9 files changed, 230 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 74dc745786..e2562508f1 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -864,14 +864,12 @@ enum fea_names #define SNS_LOW_BR_MODE -1 #define SNS_NPTS 16 /* Number of downsampled SNS parameters */ -#ifdef SNS_MSVQ #define SNS_STEREO_MODE_LR 0 #define SNS_STEREO_MODE_MS 1 #define SNS_STEREO_MODE_OFFSET_INDICES 4 #define SNS_MSVQ_NSTAGES_TCX20 4 #define SNS_MSVQ_NSTAGES_TCX10 3 #define SNS_MSVQ_NSTAGES_SIDE 2 -#endif #ifdef FIX_445_SNS_BUGFIXES #define SNS_CDBKS_BITS_4_FRAC 12 #define SNS_MEANS_BITS_4_FRAC 14 diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 4c04418eea..40ae483dfb 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -2545,7 +2545,6 @@ void sns_shape_spectrum( const int16_t L_frame /* i : frame length */ ); -#ifdef SNS_MSVQ int16_t quantize_sns( float sns_in[CPE_CHANNELS][NB_DIV][M], float snsQ_out[CPE_CHANNELS][NB_DIV][M], @@ -2560,7 +2559,6 @@ void dequantize_sns( float snsQ_out[CPE_CHANNELS][NB_DIV][M], Decoder_State **sts ); -#endif void sns_avq_cod( const float *sns, /* i : Input sns vectors */ @@ -2589,11 +2587,7 @@ void sns_avq_cod_stereo( void sns_avq_dec( int16_t *index, /* i : Quantization indices */ -#ifdef SNS_MSVQ float SNS_Q[NB_DIV][M], /* o : Quantized SNS vectors */ -#else - float *SNS_Q, /* o : Quantized SNS vectors */ -#endif #ifdef FIX_445_SNS_BUGFIXES const int16_t L_frame, #endif diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index dea512d50d..d7ff83e945 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -5629,7 +5629,6 @@ const int16_t ivas_num_active_bands[FB - WB + 1] = IVAS_16K_12BANDS_ACTIVE_BANDS, IVAS_FB_BANDS_12, IVAS_FB_BANDS_12 }; -#ifdef SNS_MSVQ const int16_t ivas_sns_cdbks_tcx20_levels[SNS_MSVQ_NSTAGES_TCX20] = { 128, 64, 32, 32 }; const int16_t ivas_sns_cdbks_tcx20_bits[SNS_MSVQ_NSTAGES_TCX20] = { 7, 6, 5, 5 }; @@ -6808,7 +6807,6 @@ const float ivas_sns_cdbks_side_tcx10_stage2[ 8 * 16 ] = { const float *const ivas_sns_cdbks_side_tcx10[SNS_MSVQ_NSTAGES_SIDE] = { ivas_sns_cdbks_side_tcx10_stage1, ivas_sns_cdbks_side_tcx10_stage2 }; #endif -#endif // SNS_MSVQ #ifdef FIX_445_SNS_BUGFIXES const int16_t sns_1st_cdbk[2][2][8 * 32] = { diff --git a/lib_com/ivas_rom_com.h b/lib_com/ivas_rom_com.h index fd8bd41a30..ccbf25df7a 100644 --- a/lib_com/ivas_rom_com.h +++ b/lib_com/ivas_rom_com.h @@ -431,7 +431,6 @@ extern const float ivas_fb_resp_cheby_ramp_16del[IVAS_FB_1MS_16K_SAMP + 1]; extern const int16_t ivas_num_active_bands[FB - WB + 1]; -#ifdef SNS_MSVQ /*------------------------------------------------------------------------------------------* * SNS MSVQ codebooks and means *------------------------------------------------------------------------------------------*/ @@ -475,7 +474,6 @@ extern const float ivas_sns_means_side_tcx20[]; extern const float *const ivas_sns_cdbks_side_tcx10[]; extern const float ivas_sns_means_side_tcx10[]; #endif -#endif #ifdef MC_PARAMUPMIX_MODE extern ACPL_QUANT_TABLE alpha_quant_table[]; diff --git a/lib_com/options.h b/lib_com/options.h index 70a0dd2203..ad51a92a41 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -145,7 +145,6 @@ -#define SNS_MSVQ /* FhG: contribution 33 - MSVQ for SNS parameters at stereo mid bitrates */ /*#define FIX_XXX_JBM_FIFO_BUFFER */ /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ #define FIX_379_GAININTP /* Eri: Adds a gain interpolation for directional/distance gain to handle abrupt changes in metadata (Non BE) */ diff --git a/lib_dec/ivas_mdct_core_dec.c b/lib_dec/ivas_mdct_core_dec.c index 81a8dda354..77c7464142 100644 --- a/lib_dec/ivas_mdct_core_dec.c +++ b/lib_dec/ivas_mdct_core_dec.c @@ -35,9 +35,7 @@ #include "options.h" #include "prot.h" #include "rom_com.h" -#ifdef SNS_MSVQ #include "ivas_rom_com.h" -#endif #ifdef DEBUGGING #include "debug.h" #endif @@ -371,7 +369,6 @@ void ivas_mdct_dec_side_bits_frame_channel( * SNS parameters *--------------------------------------------------------------------------------*/ -#ifdef SNS_MSVQ sns_low_br_mode = 0; skipped_first_channel = 0; if ( !MCT_flag && sts[0]->sr_core == 25600 && ( ( hCPE->element_brate == IVAS_48k || hCPE->element_brate == IVAS_64k ) ) ) @@ -470,44 +467,6 @@ void ivas_mdct_dec_side_bits_frame_channel( st->side_bits_frame_channel += st0->next_bit_pos - start_bit_pos_sns; } } -#else - skipped_first_channel = 0; - sns_low_br_mode = 0; - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - st = sts[ch]; - - if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) - { - skipped_first_channel = 1; - continue; - } - - start_bit_pos_sns = st0->next_bit_pos; - - if ( ch == 0 || skipped_first_channel ) - { - /* read SNS stereo mode */ - param_lpc[0][0] = get_next_indice( st0, 1 ) << 1; - - /* read low br mode flag (if it is possible to be non-zero) */ - if ( sts[0]->element_brate == IVAS_48k && !( ( sts[0]->core == TCX_20 && sts[1]->core == TCX_20 ) ) ) - { - sns_low_br_mode = get_next_indice( st0, 1 ); - } - } - - tmp = ch; - if ( ch == 1 && param_lpc[0][0] == 2 ) - { - tmp = 3; - } - - getLPCparam( st, ¶m_lpc[ch][0], st0, tmp, sns_low_br_mode && !( sts[0]->core == TCX_20 && sts[1]->core == TCX_20 ) ); - - st->side_bits_frame_channel += st0->next_bit_pos - start_bit_pos_sns; - } -#endif // SNS_MSVQ } return; @@ -543,11 +502,7 @@ void ivas_mdct_core_invQ( int16_t *prm[CPE_CHANNELS]; /* LPC */ Word16 Aind[CPE_CHANNELS][M + 1]; -#ifdef SNS_MSVQ float sns[CPE_CHANNELS][NB_DIV][M]; -#else - float lsf[CPE_CHANNELS][( NB_DIV + 1 ) * M]; -#endif /* TCX */ float xn_buf[L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX]; int16_t tcx_offset[CPE_CHANNELS]; @@ -714,7 +669,6 @@ void ivas_mdct_core_invQ( * LPC PARAMETERS *--------------------------------------------------------------------------------*/ -#ifdef SNS_MSVQ if ( bfi == 0 ) { if ( !MCT_flag && sts[0]->sr_core == 25600 && ( ( hCPE->element_brate == IVAS_48k || hCPE->element_brate == IVAS_64k ) ) ) @@ -748,34 +702,6 @@ void ivas_mdct_core_invQ( } } } -#else - if ( bfi == 0 ) - { - if ( sts[0]->core == TCX_20_CORE && sts[1]->core == TCX_20_CORE && sts[0]->mct_chan_mode != MCT_CHAN_MODE_IGNORE && sts[1]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) - { -#ifdef FIX_445_SNS_BUGFIXES - sns_avq_dec_stereo( param_lpc[0], param_lpc[1], sts[0]->L_frame, &lsf[0][M], &lsf[1][M] ); -#else - sns_avq_dec_stereo( param_lpc[0], param_lpc[1], &lsf[0][M], &lsf[1][M] ); -#endif - } - else - { - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - st = sts[ch]; - if ( st->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) - { -#ifdef FIX_445_SNS_BUGFIXES - sns_avq_dec( param_lpc[ch], &lsf[ch][M], st->L_frame, st->numlpc ); -#else - sns_avq_dec( param_lpc[ch], &lsf[ch][M], st->numlpc ); -#endif - } - } - } - } -#endif /*--------------------------------------------------------------* @@ -820,11 +746,7 @@ void ivas_mdct_core_invQ( /* Stability Factor */ if ( !bfi ) { -#ifdef SNS_MSVQ mvr2r( sns[ch][k], &Aq[ch][k * M], M ); -#else - mvr2r( &lsf[ch][( k + 1 ) * M], &Aq[ch][k * M], M ); -#endif } else { diff --git a/lib_dec/ivas_sns_dec.c b/lib_dec/ivas_sns_dec.c index 4812091ecc..ce096c12be 100644 --- a/lib_dec/ivas_sns_dec.c +++ b/lib_dec/ivas_sns_dec.c @@ -35,10 +35,8 @@ #include "prot.h" #include "ivas_prot.h" #include "rom_com.h" -#ifdef SNS_MSVQ #include "ivas_rom_com.h" #include "ivas_cnst.h" -#endif #ifdef FIX_445_SNS_BUGFIXES #include #endif @@ -154,11 +152,7 @@ static void sns_2st_dec( void sns_avq_dec( int16_t *index, /* i : Quantization indices */ -#ifdef SNS_MSVQ float SNS_Q[NB_DIV][M], /* o : Quantized SNS vectors */ -#else - float *SNS_Q, /* o : Quantized SNS vectors */ -#endif #ifdef FIX_445_SNS_BUGFIXES const int16_t L_frame, #endif @@ -168,39 +162,18 @@ void sns_avq_dec( int16_t i, nbi, last; int16_t q_type; -#ifdef SNS_MSVQ /* go from one-based indexing to zero-based indexing */ last = numlpc - 1; -#else - /* Last LPC index */ - if ( numlpc == 1 ) - { - last = 0; - } - else - { - last = M; - } -#endif index++; /* Decode last LPC */ -#ifdef SNS_MSVQ #ifdef FIX_445_SNS_BUGFIXES sns_1st_dec( *index++, numlpc, L_frame, SNS_Q[last] ); #else sns_1st_dec( *index++, SNS_Q[last] ); #endif sns_2st_dec( SNS_Q[last], index ); -#else -#ifdef FIX_445_SNS_BUGFIXES - sns_1st_dec( *index++, numplc, L_Frame & SNS_Q[last] ); -#else - sns_1st_dec( *index++, &SNS_Q[last] ); -#endif - sns_2st_dec( &SNS_Q[last], index ); -#endif nbi = 2 + index[0] + index[1]; index += nbi; @@ -211,37 +184,20 @@ void sns_avq_dec( if ( q_type == 0 ) { -#ifdef SNS_MSVQ #ifdef FIX_445_SNS_BUGFIXES sns_1st_dec( *index++, numlpc, L_frame, SNS_Q[0] ); #else sns_1st_dec( *index++, SNS_Q[0] ); #endif sns_2st_dec( SNS_Q[0], index ); -#else -#ifdef FIX_445_SNS_BUGFIXES - sns_1st_dec( *index++, numlpc, L_frame, &SNS_Q[0] ); -#else - sns_1st_dec( *index++, &SNS_Q[0] ); -#endif - sns_2st_dec( &SNS_Q[0], index ); -#endif } else if ( q_type == 1 ) { for ( i = 0; i < M; i++ ) { -#ifdef SNS_MSVQ SNS_Q[0][i] = SNS_Q[0][M + i]; -#else - SNS_Q[i] = SNS_Q[M + i]; -#endif } -#ifdef SNS_MSVQ sns_2st_dec( SNS_Q[0], index ); -#else - sns_2st_dec( &SNS_Q[0], index ); -#endif } } @@ -320,7 +276,6 @@ void sns_avq_dec_stereo( return; } -#ifdef SNS_MSVQ void dequantize_sns( int16_t indices[CPE_CHANNELS][NPRM_LPC_NEW], float snsQ_out[CPE_CHANNELS][NB_DIV][M], @@ -407,4 +362,3 @@ void dequantize_sns( } #endif } -#endif // SNS_MSVQ diff --git a/lib_enc/ivas_mdct_core_enc.c b/lib_enc/ivas_mdct_core_enc.c index b3f76cc4ab..dbabb5ead5 100644 --- a/lib_enc/ivas_mdct_core_enc.c +++ b/lib_enc/ivas_mdct_core_enc.c @@ -39,9 +39,7 @@ #include "prot.h" #include "ivas_prot.h" #include "rom_com.h" -#ifdef SNS_MSVQ #include "ivas_rom_com.h" -#endif #ifdef DEBUGGING #include "debug.h" #endif @@ -582,12 +580,10 @@ void ivas_mdct_core_whitening_enc( { int16_t n, ch, nSubframes, L_subframe, L_subframeTCX, tcx_subframe_coded_lines; float A_q[CPE_CHANNELS][NB_DIV][M + 1]; -#ifdef SNS_MSVQ int16_t sns_vq_indices[CPE_CHANNELS * NB_DIV * SNS_MSVQ_NSTAGES_TCX10]; int16_t nbits_sns; int16_t sns_stereo_mode[NB_DIV]; int16_t idx; -#endif int16_t param_lpc[CPE_CHANNELS][NPRM_LPC_NEW]; int16_t param_core[CPE_CHANNELS][2 * NPRM_DIV]; int16_t ltpBits[CPE_CHANNELS]; @@ -606,9 +602,7 @@ void ivas_mdct_core_whitening_enc( int16_t nbits_start_sns; int16_t num_sns; int8_t skipped_first_channel; -#ifdef SNS_MSVQ int16_t zero_side_flag[NB_DIV]; -#endif push_wmops( "mdct_core_whitening" ); @@ -916,7 +910,6 @@ void ivas_mdct_core_whitening_enc( sns_low_br_mode = 0; } -#ifdef SNS_MSVQ if ( !mct_on && sts[0]->sr_core == 25600 && ( ( hCPE->element_brate == IVAS_48k || hCPE->element_brate == IVAS_64k ) ) ) { nbits_sns = quantize_sns( scf, scf_q, sts, sns_vq_indices, zero_side_flag, sns_stereo_mode ); @@ -970,54 +963,6 @@ void ivas_mdct_core_whitening_enc( } } } -#else // else of SNS_MSVQ - if ( sts[0]->hTcxEnc->tcxMode == TCX_20 && sts[1]->hTcxEnc->tcxMode == TCX_20 && - sts[0]->mct_chan_mode == MCT_CHAN_MODE_REGULAR && sts[1]->mct_chan_mode == MCT_CHAN_MODE_REGULAR ) - { -#ifdef FIX_445_SNS_BUGFIXES - sns_avq_cod_stereo( scf[0][0], scf[1][0], sts[0]->L_frame, scf_q[0][0], scf_q[1][0], param_lpc[0], param_lpc[1] ); -#else - sns_avq_cod_stereo( scf[0][0], scf[1][0], scf_q[0][0], scf_q[1][0], param_lpc[0], param_lpc[1] ); -#endif - } - else - { -#ifdef DEBUG_MODE_MDCT - { - float ener_side = 0; - float ener_mid = 0; - dbgwrite( &ener_side, sizeof( float ), 1, 1, "./res/ener_side" ); - dbgwrite( &ener_mid, sizeof( float ), 1, 1, "./res/ener_mid" ); - } -#endif - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - param_lpc[ch][0] = ch; - if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) - { - continue; - } - st = sts[ch]; - - if ( st->hTcxEnc->tcxMode == TCX_20 ) - { -#ifdef FIX_445_SNS_BUGFIXES - sns_avq_cod( scf[ch][0], NULL, scf_q[ch][0], NULL, ¶m_lpc[ch][1], st->hTcxEnc->tcxMode, st->L_frame, sns_low_br_mode ); -#else - sns_avq_cod( scf[ch][0], NULL, scf_q[ch][0], NULL, ¶m_lpc[ch][1], st->hTcxEnc->tcxMode, sns_low_br_mode ); -#endif - } - else - { -#ifdef FIX_445_SNS_BUGFIXES - sns_avq_cod( scf[ch][1], scf[ch][0], scf_q[ch][1], scf_q[ch][0], ¶m_lpc[ch][1], st->hTcxEnc->tcxMode, st->L_frame, sns_low_br_mode ); -#else - sns_avq_cod( scf[ch][1], scf[ch][0], scf_q[ch][1], scf_q[ch][0], ¶m_lpc[ch][1], st->hTcxEnc->tcxMode, sns_low_br_mode ); -#endif - } - } - } -#endif // SNS_AVQ4TCX20_MSVQ4TCX10 for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { @@ -1160,7 +1105,6 @@ void ivas_mdct_core_whitening_enc( /*--------------------------------------------------------------------------------* * SNS parameters *--------------------------------------------------------------------------------*/ -#ifdef SNS_MSVQ if ( !mct_on && sts[0]->sr_core == 25600 && ( ( hCPE->element_brate == IVAS_48k || hCPE->element_brate == IVAS_64k ) ) ) { nbits_sns = 0; @@ -1251,39 +1195,6 @@ void ivas_mdct_core_whitening_enc( st->side_bits_frame_channel += hBstr->nb_bits_tot - nbits_start_sns; } } -#else // else of SNS_MSVQ - /* write SNS parameter separately since at the decoder, both channels' cores need to be decoded before, so the joint SNS decoding can be done */ - skipped_first_channel = 0; - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - st = sts[ch]; - - if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) - { - skipped_first_channel = 1; - continue; - } - - nbits_start_sns = hBstr->nb_bits_tot; - - num_sns = ( st->core == TCX_20_CORE ) ? 1 : 2; - - if ( ch == 0 || skipped_first_channel ) - { - push_next_indice( hBstr, param_lpc[0][0] >> 1, 1 ); - - if ( st->element_brate == IVAS_48k && !( ( sts[0]->core == TCX_20 && sts[1]->core == TCX_20 ) ) ) - { - /* write classifier decision to signal low br mode for SNS encoding, for all other configs, low_br mode is not possible */ - push_next_indice( hBstr, sns_low_br_mode, 1 ); - } - } - encode_lpc_avq( hBstr, num_sns, param_lpc[ch], st->core, st->element_mode ); - - st->side_bits_frame_channel += hBstr->nb_bits_tot - nbits_start_sns; - } - -#endif // MSVQ_SNS /*update pitch buffer*/ diff --git a/lib_enc/ivas_sns_enc.c b/lib_enc/ivas_sns_enc.c index 7a93e335f2..acadee46cb 100644 --- a/lib_enc/ivas_sns_enc.c +++ b/lib_enc/ivas_sns_enc.c @@ -38,10 +38,8 @@ #include "prot.h" #include "ivas_prot.h" #include "rom_com.h" -#ifdef SNS_MSVQ #include "ivas_rom_com.h" #include "ivas_cnst.h" -#endif #ifdef DEBUGGING #include "debug.h" #endif @@ -498,7 +496,6 @@ void sns_avq_cod_stereo( return; } -#ifdef SNS_MSVQ int16_t quantize_sns( float sns_in[CPE_CHANNELS][NB_DIV][M], float snsQ_out[CPE_CHANNELS][NB_DIV][M], @@ -692,4 +689,3 @@ int16_t quantize_sns( return nbits; } -#endif // SNS_MSVQ -- GitLab From 868186bc0f0c49353fff699190e83683ccd2b97b Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 19:48:16 +0200 Subject: [PATCH 243/331] [cleanup] accept FIX_379_GAININTP --- lib_com/options.h | 1 - lib_rend/ivas_objectRenderer_hrFilt.c | 10 ---------- lib_rend/ivas_objectRenderer_sfx.c | 10 ---------- lib_rend/ivas_objectRenderer_sources.c | 2 -- lib_rend/ivas_prot_rend.h | 4 ---- lib_rend/ivas_stat_rend.h | 2 -- 6 files changed, 29 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index ad51a92a41..db50e76a56 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -147,7 +147,6 @@ /*#define FIX_XXX_JBM_FIFO_BUFFER */ /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ -#define FIX_379_GAININTP /* Eri: Adds a gain interpolation for directional/distance gain to handle abrupt changes in metadata (Non BE) */ #define FIX_387_ISM_MD_FEC /* VA: Issue 387: fix MD discontinuity in ISM FEC */ #define FIX_418_SID_BITRATE /* Eri: Issue 418: Using the correct bitrate for unified stereo SID */ diff --git a/lib_rend/ivas_objectRenderer_hrFilt.c b/lib_rend/ivas_objectRenderer_hrFilt.c index 97d0b68fb8..6a2bf00278 100644 --- a/lib_rend/ivas_objectRenderer_hrFilt.c +++ b/lib_rend/ivas_objectRenderer_hrFilt.c @@ -69,21 +69,11 @@ ivas_error TDREND_REND_RenderSourceHRFilt( { float LeftOutputFrame[L_SPATIAL_SUBFR_48k]; float RightOutputFrame[L_SPATIAL_SUBFR_48k]; -#ifndef FIX_379_GAININTP - float Gain; - - Gain = ( *Src_p->SrcRend_p->DirGain_p ) * ( *Src_p->SrcRend_p->DistGain_p ); -#endif TDREND_Apply_ITD( Src_p->InputFrame_p, LeftOutputFrame, RightOutputFrame, &Src_p->previtd, Src_p->itd, Src_p->mem_itd, subframe_length ); -#ifdef FIX_379_GAININTP TDREND_firfilt( LeftOutputFrame, Src_p->hrf_left_prev, hrf_left_delta, intp_count, Src_p->mem_hrf_left, subframe_length, Src_p->filterlength, Src_p->Gain, Src_p->prevGain ); TDREND_firfilt( RightOutputFrame, Src_p->hrf_right_prev, hrf_right_delta, intp_count, Src_p->mem_hrf_right, subframe_length, Src_p->filterlength, Src_p->Gain, Src_p->prevGain ); Src_p->prevGain = Src_p->Gain; -#else - TDREND_firfilt( LeftOutputFrame, Src_p->hrf_left_prev, hrf_left_delta, intp_count, Src_p->mem_hrf_left, subframe_length, Src_p->filterlength, Gain ); - TDREND_firfilt( RightOutputFrame, Src_p->hrf_right_prev, hrf_right_delta, intp_count, Src_p->mem_hrf_right, subframe_length, Src_p->filterlength, Gain ); -#endif /* Copy to accumulative output frame */ v_add( LeftOutputFrame, output_buf[0], output_buf[0], subframe_length ); diff --git a/lib_rend/ivas_objectRenderer_sfx.c b/lib_rend/ivas_objectRenderer_sfx.c index af3231df61..20f0b33c15 100644 --- a/lib_rend/ivas_objectRenderer_sfx.c +++ b/lib_rend/ivas_objectRenderer_sfx.c @@ -236,12 +236,8 @@ void TDREND_firfilt( float *mem, /* i/o: filter memory */ const int16_t subframe_length, /* i : Length of signal */ const int16_t filterlength, /* i : Filter length */ -#ifdef FIX_379_GAININTP const float Gain, /* i : Gain */ const float prevGain /* i : Previous gain */ -#else - const float Gain /* i : Gain */ -#endif ) { float buffer[SFX_SPAT_BIN_MAX_FILTER_LENGTH - 1 + L_SUBFRAME5MS_48k]; @@ -250,13 +246,11 @@ void TDREND_firfilt( float *p_filter; float tmp; int16_t i, j; -#ifdef FIX_379_GAININTP float step, gain_tmp, gain_delta; gain_delta = ( Gain - prevGain ); step = gain_delta / ( subframe_length ); gain_tmp = prevGain; -#endif /* Handle memory */ p_signal = buffer + filterlength - 1; @@ -274,13 +268,9 @@ void TDREND_firfilt( { tmp += ( *p_filter++ ) * ( *p_tmp-- ); } -#ifdef FIX_379_GAININTP /* Apply linear gain interpolation in case of abrupt gain changes */ gain_tmp = gain_tmp + step; signal[i] = tmp * gain_tmp; -#else - signal[i] = tmp * Gain; -#endif if ( i < intp_count ) { diff --git a/lib_rend/ivas_objectRenderer_sources.c b/lib_rend/ivas_objectRenderer_sources.c index 91253748b2..0d307ea442 100644 --- a/lib_rend/ivas_objectRenderer_sources.c +++ b/lib_rend/ivas_objectRenderer_sources.c @@ -687,9 +687,7 @@ void TDREND_SRC_Init( Src_p->hrf_right_prev[0] = 1; Src_p->azim_prev = 0.0f; Src_p->elev_prev = 0.0f; -#ifdef FIX_379_GAININTP Src_p->prevGain = 1.0f; -#endif return; } diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 402b98a4d0..1b355740bf 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -498,12 +498,8 @@ void TDREND_firfilt( float *mem, /* i/o: filter memory */ const int16_t subframe_length, /* i : Length of signal */ const int16_t filterlength, /* i : Filter length */ -#ifdef FIX_379_GAININTP const float Gain, /* i : Gain */ const float prevGain /* i : Previous gain */ -#else - const float Gain /* i : Gain */ -#endif ); diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index a987a1f835..09c0bbff80 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -608,9 +608,7 @@ typedef struct float mem_hrf_left[SFX_SPAT_BIN_MAX_FILTER_LENGTH - 1]; float mem_hrf_right[SFX_SPAT_BIN_MAX_FILTER_LENGTH - 1]; float Gain; -#ifdef FIX_379_GAININTP float prevGain; -#endif } TDREND_SRC_t; /* Top level TD binaural renderer handle */ -- GitLab From 045e4e85fb5ae69ee1a523fdce61d28a3c8f63c0 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 19:48:52 +0200 Subject: [PATCH 244/331] [cleanup] accept FIX_387_ISM_MD_FEC --- lib_com/ivas_stat_com.h | 2 -- lib_com/options.h | 1 - lib_enc/ivas_ism_metadata_enc.c | 12 ------------ 3 files changed, 15 deletions(-) diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index 0e06e30e89..333e80e26f 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -74,10 +74,8 @@ typedef struct float last_true_azimuth; /* MD smoothing in DTX- last true Q azimuth value */ float last_true_elevation; /* MD smoothing in DTX- last true Q elevation value */ -#ifdef FIX_387_ISM_MD_FEC int16_t ism_md_fec_cnt_enc; /* counter of continuous frames where MD are not transmitted */ int16_t ism_md_inc_diff_cnt; /* counter of continuous frames where MD are transmitted in inactive segments when MD significantly changes */ -#endif #ifdef FIX_435_ISM_MERGE_BUG float last_true_radius; /* last true Q radius value */ #endif diff --git a/lib_com/options.h b/lib_com/options.h index db50e76a56..76daaf8fb7 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -147,7 +147,6 @@ /*#define FIX_XXX_JBM_FIFO_BUFFER */ /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ -#define FIX_387_ISM_MD_FEC /* VA: Issue 387: fix MD discontinuity in ISM FEC */ #define FIX_418_SID_BITRATE /* Eri: Issue 418: Using the correct bitrate for unified stereo SID */ #define PARAMMC_SHORT_ENC_MDFT /* FhG: Issue 410: complexity optimization for parametric Multichannel modes */ diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index 4c8831a524..3ee81050ca 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -56,11 +56,9 @@ #define ISM_MAX_RADIUS_DIFF_IDX ( ISM_RADIUS_NBITS - 1 /*zero*/ - 1 /*sign*/ ) #define ISM_FEC_MAX 10 -#ifdef FIX_387_ISM_MD_FEC #define ISM_MD_FEC_DIFF 10 #define ISM_MD_INC_DIFF_CNT_MAX 6 #define ISM_MD_FEC_CNT_MAX 25 -#endif #ifdef FIX_435_ISM_MERGE_BUG #define ISM_MD_RAD_FEC_DIFF 1 #endif @@ -235,7 +233,6 @@ ivas_error ivas_ism_metadata_enc( #else hIsmMeta[ch]->ism_metadata_flag = localVAD[ch] || hSCE[ch]->hCoreCoder[0]->lp_noise > 10; #endif -#ifdef FIX_387_ISM_MD_FEC /* in inactive frames, send MD 1) in ISM_MD_INC_DIFF_CNT_MAX consecutive frames when MD significantly change, 2) at least every ISM_MD_FEC_DIFF frames */ if ( hIsmMeta[ch]->ism_metadata_flag == 0 ) { @@ -268,7 +265,6 @@ ivas_error ivas_ism_metadata_enc( hIsmMeta[ch]->position_angle.angle1_diff_cnt = ISM_FEC_MAX; } } -#endif #ifdef FIX_435_ISM_MERGE_BUG } #endif @@ -416,11 +412,9 @@ ivas_error ivas_ism_metadata_enc( nb_bits_metadata[ch] = hBstr->nb_bits_tot - nb_bits_start; } -#ifdef FIX_387_ISM_MD_FEC /* Updates */ hIsmMeta[ch]->last_true_azimuth = hIsmMeta[ch]->azimuth; hIsmMeta[ch]->last_true_elevation = hIsmMeta[ch]->elevation; -#endif #ifdef FIX_435_ISM_MERGE_BUG hIsmMeta[ch]->last_true_radius = hIsmMeta[ch]->radius; #endif @@ -561,7 +555,6 @@ ivas_error ivas_ism_metadata_enc( { hIsmMeta[ch]->last_ism_metadata_flag = hIsmMeta[ch]->ism_metadata_flag; -#ifdef FIX_387_ISM_MD_FEC if ( hIsmMeta[ch]->ism_metadata_flag == 0 ) { hIsmMeta[ch]->ism_md_fec_cnt_enc++; @@ -572,7 +565,6 @@ ivas_error ivas_ism_metadata_enc( } hIsmMeta[ch]->ism_md_inc_diff_cnt++; hIsmMeta[ch]->ism_md_inc_diff_cnt = min( hIsmMeta[ch]->ism_md_inc_diff_cnt, ISM_MD_INC_DIFF_CNT_MAX ); -#endif } for ( ch = 0; ch < nchan_transport; ch++ ) @@ -663,12 +655,10 @@ ivas_error ivas_ism_metadata_enc_create( st_ivas->hIsmMetaData[ch]->last_azimuth = 0.0f; st_ivas->hIsmMetaData[ch]->last_elevation = 0.0f; -#ifdef FIX_387_ISM_MD_FEC st_ivas->hIsmMetaData[ch]->last_true_azimuth = 0.0f; st_ivas->hIsmMetaData[ch]->last_true_elevation = 0.0f; st_ivas->hIsmMetaData[ch]->ism_md_fec_cnt_enc = 0; st_ivas->hIsmMetaData[ch]->ism_md_inc_diff_cnt = ISM_MD_INC_DIFF_CNT_MAX; -#endif #ifdef FIX_435_ISM_MERGE_BUG st_ivas->hIsmMetaData[ch]->last_true_radius = 1.0f; #endif @@ -1157,10 +1147,8 @@ void ivas_ism_metadata_sid_enc( hIsmMetaData->position_angle.last_angle2_idx = idx_elevation << ( ISM_ELEVATION_NBITS - nBits_elevation ); } -#ifdef FIX_387_ISM_MD_FEC hIsmMetaData->ism_md_fec_cnt_enc = 0; hIsmMeta[ch]->ism_md_inc_diff_cnt = ISM_MD_INC_DIFF_CNT_MAX; -#endif } } -- GitLab From 4f52341596806efe93734e8c2b56b7d08f286031 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 19:49:40 +0200 Subject: [PATCH 245/331] [cleanup] accept FIX_418_SID_BITRATE --- lib_com/options.h | 1 - lib_dec/ivas_stereo_cng_dec.c | 8 -------- lib_enc/ivas_stereo_cng_enc.c | 8 -------- 3 files changed, 17 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 76daaf8fb7..52d8137a86 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -148,7 +148,6 @@ /*#define FIX_XXX_JBM_FIFO_BUFFER */ /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ -#define FIX_418_SID_BITRATE /* Eri: Issue 418: Using the correct bitrate for unified stereo SID */ #define PARAMMC_SHORT_ENC_MDFT /* FhG: Issue 410: complexity optimization for parametric Multichannel modes */ #define FIX_421_TD_INT_TUNE /* Eri: Issue 421: Increase use of interpolation in TD renderer filter transition */ #define FIX_419_ISM_BRATE_SW_DTX /* VA: issue 419: fix ISM Bitrate Switching with dtx */ diff --git a/lib_dec/ivas_stereo_cng_dec.c b/lib_dec/ivas_stereo_cng_dec.c index 2e31375996..c12498c015 100644 --- a/lib_dec/ivas_stereo_cng_dec.c +++ b/lib_dec/ivas_stereo_cng_dec.c @@ -90,12 +90,7 @@ void stereo_dft_dec_sid_coh( int16_t bits_tmp; int16_t b; -#ifdef FIX_418_SID_BITRATE nr_of_sid_stereo_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; -#else - /* TODO: still use old number of bits to keep bitexactness in output */ - nr_of_sid_stereo_bits = ( 4400 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; -#endif /* If the coherence is not encoded due to lack of bits set alpha to zero which leads to that the coherence */ /* from the previous frame is used. */ @@ -178,9 +173,6 @@ void stereo_dft_dec_sid_coh( ( *nb_bits )++; } -#ifndef FIX_418_SID_BITRATE - dtx_read_padding_bits( st, ( IVAS_SID_5k2 - 4400 ) / FRAMES_PER_SEC ); -#endif return; } diff --git a/lib_enc/ivas_stereo_cng_enc.c b/lib_enc/ivas_stereo_cng_enc.c index 2eb838bf5c..76f56532dc 100644 --- a/lib_enc/ivas_stereo_cng_enc.c +++ b/lib_enc/ivas_stereo_cng_enc.c @@ -173,12 +173,7 @@ void stereo_dft_enc_sid_coh( int16_t alpha_level; int16_t n; -#ifdef FIX_418_SID_BITRATE nr_of_sid_stereo_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; -#else - /* TODO: still use old number of bits to keep bitexactness in output */ - nr_of_sid_stereo_bits = ( 4400 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; -#endif zeropad = 0; /* Encode coherence vector. Find best fixed predictor by minimizing prediction error on input vector. @@ -333,9 +328,6 @@ void stereo_dft_enc_sid_coh( ( *nb_bits )++; } -#ifndef FIX_418_SID_BITRATE - push_next_indice( hBstr, zeropad, ( IVAS_SID_5k2 - 4400 ) / FRAMES_PER_SEC ); -#endif return; } -- GitLab From d81e934d80be8467fffe9d31485e6651cf3df588 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 19:52:39 +0200 Subject: [PATCH 246/331] [cleanup] accept PARAMMC_SHORT_ENC_MDFT --- lib_com/ivas_cnst.h | 4 ---- lib_com/ivas_fb_mixer.c | 4 ---- lib_com/ivas_mdft_imdft.c | 2 -- lib_com/ivas_rom_com.c | 2 -- lib_com/ivas_rom_com.h | 2 -- lib_com/options.h | 1 - lib_enc/ivas_mc_param_enc.c | 12 ------------ 7 files changed, 27 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index e2562508f1..e60895071a 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1459,9 +1459,7 @@ typedef enum #define PARAM_MC_BAND_TO_MDCT_BAND_RATIO 16 /* Ratio of resolution of CLDFB Bands to MDCT Bands */ #define PARAM_MC_SLOT_ENC_NS 2500000L #define PARAM_MC_MDFT_NO_SLOTS 8 -#ifdef PARAMMC_SHORT_ENC_MDFT #define PARAM_MC_CLDFB_TO_MDFT_FAC 2 -#endif /*----------------------------------------------------------------------------------* * LFE Coding Constants @@ -1678,9 +1676,7 @@ typedef enum #define IVAS_320_PT_LEN 320 #define IVAS_240_PT_LEN 240 #define IVAS_160_PT_LEN 160 -#ifdef PARAMMC_SHORT_ENC_MDFT #define IVAS_120_PT_LEN 120 -#endif #define IVAS_80_PT_LEN 80 #define IVAS_40_PT_LEN 40 diff --git a/lib_com/ivas_fb_mixer.c b/lib_com/ivas_fb_mixer.c index 2598a43d30..7c724c804e 100644 --- a/lib_com/ivas_fb_mixer.c +++ b/lib_com/ivas_fb_mixer.c @@ -163,11 +163,7 @@ ivas_error ivas_fb_set_cfg( { pFb_cfg->fb_latency = NS2SA( sampling_rate, DELAY_FB_1_NS ); pFb_cfg->fade_len = NS2SA( sampling_rate, DELAY_FB_1_NS ); -#ifdef PARAMMC_SHORT_ENC_MDFT pFb_cfg->prior_input_length = NS2SA( sampling_rate, DELAY_DIRAC_ENC_CMP_NS ) + NS2SA( sampling_rate, PARAM_MC_SLOT_ENC_NS ); -#else - pFb_cfg->prior_input_length = NS2SA( sampling_rate, DELAY_DIRAC_ENC_CMP_NS ) + 3 * NS2SA( sampling_rate, PARAM_MC_SLOT_ENC_NS ); -#endif } *pFb_cfg_out = pFb_cfg; diff --git a/lib_com/ivas_mdft_imdft.c b/lib_com/ivas_mdft_imdft.c index a9f5bac532..ad9d19a910 100644 --- a/lib_com/ivas_mdft_imdft.c +++ b/lib_com/ivas_mdft_imdft.c @@ -82,11 +82,9 @@ static void ivas_get_mdft_twid_factors( case IVAS_160_PT_LEN: *ppTwid = &ivas_mdft_coeff_cos_twid_160[0]; break; -#ifdef PARAMMC_SHORT_ENC_MDFT case IVAS_120_PT_LEN: *ppTwid = &ivas_mdft_coeff_cos_twid_120[0]; break; -#endif case IVAS_80_PT_LEN: *ppTwid = &ivas_mdft_coeff_cos_twid_80[0]; break; diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index d7ff83e945..5e8cf688e5 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -4055,7 +4055,6 @@ const float ivas_cos_twiddle_160[IVAS_160_PT_LEN >> 1] = 0.0760120586092433f, 0.0564205163668375f, 0.0368072229413588f, 0.0171797396307788f }; -#ifdef PARAMMC_SHORT_ENC_MDFT const float ivas_mdft_coeff_cos_twid_120[IVAS_120_PT_LEN + 1] = { 1.0000000000f, 0.9999143276f, 0.9996573250f, 0.9992290362f, 0.9986295348f, 0.9978589232f, 0.9969173337f, @@ -4077,7 +4076,6 @@ const float ivas_mdft_coeff_cos_twid_120[IVAS_120_PT_LEN + 1] = 0.1045284633f, 0.0915016187f, 0.0784590957f, 0.0654031292f, 0.0523359562f, 0.0392598158f, 0.0261769483f, 0.0130895956f, 0.0000000000f }; -#endif const float ivas_sin_twiddle_80[IVAS_80_PT_LEN >> 1] = { diff --git a/lib_com/ivas_rom_com.h b/lib_com/ivas_rom_com.h index ccbf25df7a..e65aa5d148 100644 --- a/lib_com/ivas_rom_com.h +++ b/lib_com/ivas_rom_com.h @@ -392,9 +392,7 @@ extern const float ivas_cos_twiddle_80[IVAS_80_PT_LEN >> 1]; extern const float ivas_mdft_coeff_cos_twid_240[IVAS_240_PT_LEN + 1]; extern const float ivas_mdft_coeff_cos_twid_160[IVAS_160_PT_LEN + 1]; -#ifdef PARAMMC_SHORT_ENC_MDFT extern const float ivas_mdft_coeff_cos_twid_120[IVAS_120_PT_LEN + 1]; -#endif extern const float ivas_mdft_coeff_cos_twid_80[IVAS_80_PT_LEN + 1]; extern const float ivas_mdft_coeff_cos_twid_40[IVAS_40_PT_LEN + 1]; extern const float ivas_mdft_coeff_cos_twid_960[IVAS_960_PT_LEN + 1]; diff --git a/lib_com/options.h b/lib_com/options.h index 52d8137a86..f9d8483de8 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -148,7 +148,6 @@ /*#define FIX_XXX_JBM_FIFO_BUFFER */ /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ -#define PARAMMC_SHORT_ENC_MDFT /* FhG: Issue 410: complexity optimization for parametric Multichannel modes */ #define FIX_421_TD_INT_TUNE /* Eri: Issue 421: Increase use of interpolation in TD renderer filter transition */ #define FIX_419_ISM_BRATE_SW_DTX /* VA: issue 419: fix ISM Bitrate Switching with dtx */ #define FIX_422 /* FhG: Issue 422: re-introduce fix for noisy speech buffer in ParamISM */ diff --git a/lib_enc/ivas_mc_param_enc.c b/lib_enc/ivas_mc_param_enc.c index f32a5b60d3..2574e3778c 100644 --- a/lib_enc/ivas_mc_param_enc.c +++ b/lib_enc/ivas_mc_param_enc.c @@ -204,11 +204,7 @@ ivas_error ivas_param_mc_enc_open( /* parameter band grouping: 60 band CLDFB to 240 band MDFT resolution */ for ( i = 0; i < hParamMC->hMetadataPMC.num_parameter_bands + 1; i++ ) { -#ifdef PARAMMC_SHORT_ENC_MDFT hParamMC->band_grouping[i] *= PARAM_MC_CLDFB_TO_MDFT_FAC; -#else - hParamMC->band_grouping[i] *= CLDFB_TO_MDFT_FAC; -#endif } /* set correct coded band width */ @@ -344,11 +340,7 @@ ivas_error ivas_param_mc_enc_reconfig( /* parameter band grouping: 60 band CLDFB to 240 band MDFT resolution */ for ( i = 0; i < hParamMC->hMetadataPMC.num_parameter_bands + 1; i++ ) { -#ifdef PARAMMC_SHORT_ENC_MDFT hParamMC->band_grouping[i] *= PARAM_MC_CLDFB_TO_MDFT_FAC; -#else - hParamMC->band_grouping[i] *= CLDFB_TO_MDFT_FAC; -#endif } /* set correct coded band width */ @@ -700,16 +692,12 @@ static void ivas_param_mc_param_est_enc( for ( ts = start_ts; ts < num_time_slots; ts++ ) { -#ifdef PARAMMC_SHORT_ENC_MDFT ivas_fb_mixer_get_windowed_fr( hParamMC->hFbMixer, pcm_in, p_slot_frame_f_real, p_slot_frame_f_imag, l_ts, l_ts #ifdef HODIRAC , hParamMC->hFbMixer->fb_cfg->num_in_chans #endif ); -#else - ivas_fb_mixer_get_windowed_fr( hParamMC->hFbMixer, pcm_in, p_slot_frame_f_real, p_slot_frame_f_imag, l_ts, 2 * l_ts ); -#endif ivas_fb_mixer_update_prior_input( hParamMC->hFbMixer, pcm_in, l_ts #ifdef HODIRAC , -- GitLab From 5b2099636fb746e7314e2ad82b2711a39197e4db Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 19:53:19 +0200 Subject: [PATCH 247/331] [cleanup] accept FIX_421_TD_INT_TUNE --- lib_com/ivas_cnst.h | 4 ---- lib_com/options.h | 1 - 2 files changed, 5 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index e60895071a..8ebbe2f711 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1580,11 +1580,7 @@ typedef enum #define SFX_SPAT_BIN_NUM_SUBSAMPLES 64 #define ITD_MEM_LEN (MAX_ITD + SFX_SPAT_BIN_SINC_M) #define L_SUBFRAME5MS_48k (L_FRAME48k/4) -#ifdef FIX_421_TD_INT_TUNE #define MAX_ANGULAR_STEP (0.01f) -#else -#define MAX_ANGULAR_STEP (1.0f) -#endif #define MAX_ANGULAR_STEP_INV ( 1.0f / MAX_ANGULAR_STEP ) #define MAX_INTERPOLATION_STEPS 12 diff --git a/lib_com/options.h b/lib_com/options.h index f9d8483de8..70ace601e7 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -148,7 +148,6 @@ /*#define FIX_XXX_JBM_FIFO_BUFFER */ /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ -#define FIX_421_TD_INT_TUNE /* Eri: Issue 421: Increase use of interpolation in TD renderer filter transition */ #define FIX_419_ISM_BRATE_SW_DTX /* VA: issue 419: fix ISM Bitrate Switching with dtx */ #define FIX_422 /* FhG: Issue 422: re-introduce fix for noisy speech buffer in ParamISM */ -- GitLab From 0bb0dfd513e02d87e72a765240b0c9dfe1b343e2 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 19:53:55 +0200 Subject: [PATCH 248/331] [cleanup] accept FIX_419_ISM_BRATE_SW_DTX --- lib_com/options.h | 1 - lib_dec/ivas_ism_metadata_dec.c | 5 ----- lib_enc/ivas_ism_metadata_enc.c | 5 ----- 3 files changed, 11 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 70ace601e7..06c840d6ad 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -148,7 +148,6 @@ /*#define FIX_XXX_JBM_FIFO_BUFFER */ /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ -#define FIX_419_ISM_BRATE_SW_DTX /* VA: issue 419: fix ISM Bitrate Switching with dtx */ #define FIX_422 /* FhG: Issue 422: re-introduce fix for noisy speech buffer in ParamISM */ #define ERI_MSVQ_CLEANUP /* Eri: Contribution #31 BE modularization of msvq encoder side DCT21&DCT24 within msvq_enc() */ diff --git a/lib_dec/ivas_ism_metadata_dec.c b/lib_dec/ivas_ism_metadata_dec.c index 40a9103266..3ceb50e6f9 100644 --- a/lib_dec/ivas_ism_metadata_dec.c +++ b/lib_dec/ivas_ism_metadata_dec.c @@ -488,14 +488,9 @@ ivas_error ivas_ism_metadata_dec( { hIsmMeta[ch]->last_ism_metadata_flag = hIsmMeta[ch]->ism_metadata_flag; -#ifdef FIX_419_ISM_BRATE_SW_DTX hSCE[ch]->hCoreCoder[0]->low_rate_mode = 0; -#endif if ( ism_mode == ISM_MODE_DISC ) { -#ifndef FIX_419_ISM_BRATE_SW_DTX - hSCE[ch]->hCoreCoder[0]->low_rate_mode = 0; -#endif if ( hIsmMeta[ch]->ism_metadata_flag == 0 && localVAD[ch] == 0 && ism_metadata_flag_global ) { hSCE[ch]->hCoreCoder[0]->low_rate_mode = 1; diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index 3ee81050ca..7199a77918 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -569,14 +569,9 @@ ivas_error ivas_ism_metadata_enc( for ( ch = 0; ch < nchan_transport; ch++ ) { -#ifdef FIX_419_ISM_BRATE_SW_DTX hSCE[ch]->hCoreCoder[0]->low_rate_mode = 0; -#endif if ( ism_mode == ISM_MODE_DISC ) { -#ifndef FIX_419_ISM_BRATE_SW_DTX - hSCE[ch]->hCoreCoder[0]->low_rate_mode = 0; -#endif if ( hIsmMeta[ch]->ism_metadata_flag == 0 && localVAD[ch] == 0 && ism_metadata_flag_global ) { hSCE[ch]->hCoreCoder[0]->low_rate_mode = 1; -- GitLab From c1127fd0b6ce2ca7b8984b9fca743d5d422deabc Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 19:54:23 +0200 Subject: [PATCH 249/331] [cleanup] accept FIX_422 --- lib_com/options.h | 1 - lib_enc/ivas_ism_param_enc.c | 8 -------- 2 files changed, 9 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 06c840d6ad..85435229ac 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -148,7 +148,6 @@ /*#define FIX_XXX_JBM_FIFO_BUFFER */ /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ -#define FIX_422 /* FhG: Issue 422: re-introduce fix for noisy speech buffer in ParamISM */ #define ERI_MSVQ_CLEANUP /* Eri: Contribution #31 BE modularization of msvq encoder side DCT21&DCT24 within msvq_enc() */ #define FIX_416_ISM_BR_SWITCHING /* FhG: add missing CLDFB reconfig to ISM BR switching */ diff --git a/lib_enc/ivas_ism_param_enc.c b/lib_enc/ivas_ism_param_enc.c index db7ab98b10..77fcb1b98f 100644 --- a/lib_enc/ivas_ism_param_enc.c +++ b/lib_enc/ivas_ism_param_enc.c @@ -477,11 +477,7 @@ void ivas_param_ism_compute_noisy_speech_flag( /* For the current frame, make a decision based on some core-coder flags */ if ( st_ivas->hSCE[0]->hCoreCoder[0]->flag_noisy_speech_snr && st_ivas->hSCE[1]->hCoreCoder[0]->flag_noisy_speech_snr ) { -#ifdef FIX_422 if ( st_ivas->hSCE[0]->hCoreCoder[0]->vad_flag || st_ivas->hSCE[1]->hCoreCoder[0]->vad_flag ) -#else - if ( st_ivas->hSCE[0]->hCoreCoder[0]->vad_flag && st_ivas->hSCE[1]->hCoreCoder[0]->vad_flag ) -#endif { st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i] = 0; } @@ -514,11 +510,7 @@ void ivas_param_ism_compute_noisy_speech_flag( /* For the current frame, make a decision based on some core-coder flags */ if ( st_ivas->hSCE[0]->hCoreCoder[0]->flag_noisy_speech_snr && st_ivas->hSCE[1]->hCoreCoder[0]->flag_noisy_speech_snr ) { -#ifdef FIX_422 if ( st_ivas->hSCE[0]->hCoreCoder[0]->vad_flag || st_ivas->hSCE[1]->hCoreCoder[0]->vad_flag ) -#else - if ( st_ivas->hSCE[0]->hCoreCoder[0]->vad_flag && st_ivas->hSCE[1]->hCoreCoder[0]->vad_flag ) -#endif { st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i] = 0; } -- GitLab From b30aef1b90cc7e3911ec2b5e4117555f28b2a9ce Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 19:55:02 +0200 Subject: [PATCH 250/331] [cleanup] accept ERI_MSVQ_CLEANUP --- lib_com/options.h | 1 - lib_com/prot.h | 2 - lib_enc/lsf_msvq_ma_enc.c | 212 -------------------------------------- 3 files changed, 215 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 85435229ac..3be97becf3 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -149,7 +149,6 @@ -#define ERI_MSVQ_CLEANUP /* Eri: Contribution #31 BE modularization of msvq encoder side DCT21&DCT24 within msvq_enc() */ #define FIX_416_ISM_BR_SWITCHING /* FhG: add missing CLDFB reconfig to ISM BR switching */ #define FIX_SP2A /* VA: Issue 412: Adjust threshold for the S_p2a feature in the tonal detector */ diff --git a/lib_com/prot.h b/lib_com/prot.h index 3b0a081431..e6f371c468 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -8169,7 +8169,6 @@ void extend_dctN_input( const int16_t n_cols, /* i: number of columns == truncation length */ DCTTYPE dcttype ); /* i: matrix type */ -#ifdef ERI_MSVQ_CLEANUP int16_t msvq_stage1_dct_search( /* o : (p_max , best candidate sofar ) */ const float *u, /* i : target */ const int16_t N, /* i : target length and IDCT synthesis length */ @@ -8203,7 +8202,6 @@ int16_t msvq_stage1_dct_recalc_candidates_fdcng_wb( const int16_t maxC_st1, /* i : number of candidates in stage1 */ float *dist_ptr /* i/o: updated MSE vector for stage1 */ ); -#endif void PulseResynchronization( const float *src_exc, /* i : Input excitation buffer */ diff --git a/lib_enc/lsf_msvq_ma_enc.c b/lib_enc/lsf_msvq_ma_enc.c index 0f7a798a75..13da5f91dd 100644 --- a/lib_enc/lsf_msvq_ma_enc.c +++ b/lib_enc/lsf_msvq_ma_enc.c @@ -54,7 +54,6 @@ // void dctT2_N_apply_matrix( const float *input, float *output, const int16_t dct_dim, int16_t fdcngvq_dim, const float *idctT2_24_X_matrixQ16, const int16_t matrix_1st_dim, DCTTYPE dcttype ); -#ifdef ERI_MSVQ_CLEANUP int16_t msvq_stage1_dct_search( /* o : (p_max , best candidate sofar ) */ @@ -304,7 +303,6 @@ int16_t msvq_stage1_dct_recalc_candidates_fdcng_wb( return p_max_local; } -#endif /*--------------------------------------------------------------------------* @@ -337,36 +335,9 @@ void msvq_enc( float resid_buf[2 * LSFMBEST_MAX * M_MAX], dist_buf[2 * LSFMBEST_MAX], Tmp[M_MAX]; int16_t idx_buf[2 * LSFMBEST_MAX * MAX_VQ_STAGES_USED], parents[LSFMBEST_MAX]; int16_t n, maxn, start; -#ifndef ERI_MSVQ_CLEANUP - /* buffers */ - float dct_target[FDCNG_VQ_DCT_MAXTRUNC]; - float u_mr[FDCNG_VQ_MAX_LEN]; - float u_mr_scaled[FDCNG_VQ_MAX_LEN]; - float mse_trunc_all_segms; - float mse_trunc_segm[FDCNG_VQ_DCT_NSEGM]; - float mse; - - const Word8 *cbpW8; - const Word16 *dct_col_shift_tab; - - float *st1_mse_pair; - int16_t *st1_idx_pair; - int16_t indices_st1_local[FDCNG_VQ_DCT_NSEGM * 2]; /* after stage#1 DCT search this is copied to the global indices[1][s*stages] structure */ - int16_t n_ana, p_mins[2], idx_min[2]; - DCTTYPE dcttype = DCT_T2_24_XX; - float tmp2; - - int16_t check_ind[FDCNG_VQ_DCT_NPOST]; - int16_t segm, j_full, maxC_pre; -#endif float *st1_syn_vec_ptr; /* ptr to buffer in dynRAM */ float *st1_mse_ptr; /* ptr to buffer in existing dRAM used for stage 1 candidate analysis */ -#ifdef ERI_MSVQ_CLEANUP int16_t indices_st1_local[FDCNG_VQ_DCT_NSEGM * 2]; /* after stage#1 DCT search this is copied to the global indices[1][s*stages] structure */ -#else - float res24, high_diff[FDCNG_VQ_MAX_LEN - FDCNG_VQ_MAX_LEN_WB]; - maxC_pre = ( FDCNG_VQ_DCT_NSEGM * 2 ); -#endif assert( maxC <= LSFMBEST_MAX ); assert( ( LSFMBEST_MAX * M_MAX ) > ( N * maxC ) ); /* top of resid_buf is resid[1] and used for stage#1 residuals (input target u), @@ -375,9 +346,6 @@ void msvq_enc( st1_syn_vec_ptr = &( resid_buf[1 * LSFMBEST_MAX * M_MAX] ) - FDCNG_VQ_MAX_LEN * maxC; /* reuse top of resid[0] scratch RAM for residual */ -#ifndef ERI_MSVQ_CLEANUP - dcttype = DCT_T2_24_XX; -#endif /*----------------------------------------------------------------* @@ -462,7 +430,6 @@ void msvq_enc( dist[1][j] = FLT_MAX; } -#ifdef ERI_MSVQ_CLEANUP if ( !s && applyDCT_flag != 0 ) /* means: m==1 */ { /* stage 1 candidates search in truncated dct24 domain without any weights */ @@ -495,167 +462,6 @@ void msvq_enc( indices[1][c * stages] = indices_st1_local[c]; } } -#else - if ( !s && applyDCT_flag != 0 ) /* means: m==1 */ - { /* stage 1 search in truncated dct domain without any weights */ - - n_ana = FDCNG_VQ_MAX_LEN; /* VQ stage#1 core is always using stored DCT24 coeffs */ - /*remove mean/mid fdcng stage#1 vector, in original subband domain */ - v_sub( u, cdk1r_tr_midQ_truncQ, u_mr, n_ana ); - - v_multc( u_mr, fdcng_dct_invScaleF[1], u_mr_scaled, n_ana ); /*scale up target to upscaled W8x storage domain */ - /* 16.0-->scale up from Q0 to search domain in Q4, not really needed in BASOP , impl. by shifts */ - - assert( n_ana >= FDCNG_VQ_DCT_MAXTRUNC ); /* check for WB , SWB, FB operation */ - - dctT2_N_apply_matrix( (const float *) u_mr_scaled, dct_target, min( FDCNG_VQ_DCT_MAXTRUNC, n_ana ), n_ana, invTrfMatrix, FDCNG_VQ_DCT_MAXTRUNC, dcttype ); - - mse_trunc_all_segms = 0; - mse = 0; - - /* init search state ptr's at the top */ - for ( segm = 0; segm < FDCNG_VQ_DCT_NSEGM; segm++ ) - { - /* point to a new paired location */ - st1_mse_pair = &( dist[1][2 * segm] ); /* req. ptr init +=2 */ - st1_mse_pair[0] = FLT_MAX; /* req */ - st1_mse_pair[1] = FLT_MAX; /* req */ - st1_idx_pair = &( indices_st1_local[2 * segm] ); /* +=2 */ - p_max = 0; /* req. to point to 1 or 0 */ - - /* compute segment common trunction error in dct domain */ - mse_trunc_segm[segm] = mse_trunc_all_segms; - mse_trunc_segm[segm] += sum2_f( (const float *) ( &( dct_target[cdk1_ivas_cols_per_segment[segm]] ) ), cdk1_ivas_trunc_dct_cols_per_segment[segm] ); - - cbpW8 = cdk_37bits_ivas_stage1_W8Qx_dct_sections[segm]; /* Word8 column variable Qx storage*/ - - for ( j = 0; j < cdk1_ivas_entries_per_segment[segm]; j++ ) - { - /* unweighted segmented search DCT domain loop */ - j_full = j + cdk1_ivas_cum_entries_per_segment[segm]; /* or simply use j_full++ */ - - mse = mse_trunc_segm[segm]; /* move32() init mse with with common mse truncation part */ - - dct_col_shift_tab = stage1_dct_col_syn_shift[segm]; /* ptr init */ - - for ( c2 = 0; c2 < cdk1_ivas_cols_per_segment[segm]; c2++ ) - { - -#define WMC_TOOL_SKIP - tmp = dct_target[c2] - (float) ( ( (Word16) cbpW8[c2] ) << dct_col_shift_tab[c2] ); /* Word8 storage MSE inner loop */ - LOGIC( 1 ); - SHIFT( 1 ); - ADD( 1 ); /* in BASOP: s_and(for W8->W16), shl(), sub()*/ -#undef WMC_TOOL_SKIP - - mse += tmp * tmp; /* L_mac or L_mac0() square Word16 -> Word32*/ - } - st1_mse_ptr[j_full] = mse; /* save MSE in shared dynamic 2^7=128 RAM, move32() in BASOP */ - -#define WMC_TOOL_SKIP - cbpW8 += cdk1_ivas_cols_per_segment[segm]; /* pointer increment */ -#undef WMC_TOOL_SKIP - /* overwrite with a new worst index at p_max */ - - /* The three inner loop if's below are not really properly instrumented by WMC tool */ - /* a ptr to worst index will be in use */ - if ( mse < st1_mse_pair[p_max] ) /* L_sub */ - { - st1_idx_pair[p_max] = j_full; /* simplified */ - } /* BASOP 2 ops */ - - if ( st1_idx_pair[p_max] == j_full ) /* simplified */ - { /*idx updated to j_full --> also update mse */ - st1_mse_pair[p_max] = mse; /* move32(), single BASOP */ - } /* BASOP 3 ops */ - /* avoid WC costly list management by always updating p_max, as we have only a pair to maintain */ - p_max = 0; /* move16() */ - if ( ( st1_mse_pair[0] - st1_mse_pair[1] ) < 0 ) /* L_sub()*/ - { - p_max = 1; /* move16() */ - } /* BASOP 3 ops ,Note 2 ops possible in BASOP with L_sub and L_lshr */ - - /* Note: logical shift right not available in ANSI-C */ - /* p_max = (st1_mse_pair[0] - st1_mse_pair[1]) ">>>" 31; */ - /* in java logical shift right is available as >>> , in BASOP it is L_lshr */ - - /* Cost: weighted sum with cond moves ('if') => 8 in float , 7 in BASOP with L_lshr */ - } /* j in section */ - - } /* next segment */ - - for ( j = 0; j < maxC_pre; j++ ) - { - /* compute_full mse using stored DCT24 domain MSE's */ - /* calculate MSE from stage1 inner using existing inner DCT domain variables */ - dist[1][j] *= fdcng_dct_scaleF[2]; /* single multiplication to get the MSE scale to the correct input domain */ - } - - p_max = maximum( dist[1], maxC_pre, NULL ); /* establish current worst candidate for stage#2 among all maxC_pre candidates */ - - p_mins[0] = minimum( dist[1], maxC_pre, NULL ); /* find best entry among all maxC_pre */ - tmp = dist[1][p_mins[0]]; - dist[1][p_mins[0]] = FLT_MAX; /* exclude 1st */ - - p_mins[1] = minimum( dist[1], maxC_pre, NULL ); /* find 2nd best entry */ - tmp2 = dist[1][p_mins[1]]; - dist[1][p_mins[1]] = FLT_MAX; /* exclude 2nd*/ - - dist[1][p_mins[0]] = tmp; /* restore 1st */ - dist[1][p_mins[1]] = tmp2; /* restore 2nd */ - - idx_min[0] = indices_st1_local[p_mins[0]]; - idx_min[1] = indices_st1_local[p_mins[1]]; - - - /* use global exclusion list to never reselect the two (best) mse values sofar */ - st1_mse_ptr[idx_min[0]] = FLT_MAX; /* move32() */ - st1_mse_ptr[idx_min[1]] = FLT_MAX; /* move32() */ - - /* circular MSE-neigbour list in use to potentially replace some segment search candidates */ - /* using both 1st and 2nd best neighbours in fwd and rev directions */ - check_ind[0] = cdk1_ivas_segm_neighbour_fwd[idx_min[0]]; - check_ind[1] = cdk1_ivas_segm_neighbour_rev[idx_min[0]]; - - check_ind[2] = cdk1_ivas_segm_neighbour_fwd[idx_min[1]]; - check_ind[3] = cdk1_ivas_segm_neighbour_rev[idx_min[1]]; - - check_ind[4] = cdk1_ivas_segm_neighbour_fwd[check_ind[0]]; - check_ind[5] = cdk1_ivas_segm_neighbour_rev[check_ind[1]]; - - check_ind[6] = cdk1_ivas_segm_neighbour_fwd[check_ind[2]]; - check_ind[7] = cdk1_ivas_segm_neighbour_rev[check_ind[3]]; - - for ( i = 0; i < FDCNG_VQ_DCT_NPOST; i++ ) - { - float check_mse = st1_mse_ptr[check_ind[i]] * fdcng_dct_scaleF[2]; - /* *= fdcng_dct_scaleF[2]; */ /* multiplication in use to get the float outer loop scale correct */ - - if ( check_mse < dist[1][p_max] ) - { - /* new winner , replace */ - dist[1][p_max] = check_mse; - indices_st1_local[p_max] = check_ind[i]; - st1_mse_ptr[check_ind[i]] = FLT_MAX; /* BASOP: move32() */ - p_max = maximum( dist[1], maxC_pre, NULL ); /* establish a new current worst candidate among all maxC */ - } - } - - for ( c = 0; c < maxC_pre; c++ ) - { - indices[1][c * stages] = indices_st1_local[c]; /* move established stage#1 indices to global MSVQ list structure */ - } - - /* extract the selected stage one vectors in DCT domain , apply IDCT_N and scale up */ - /*always extract full length signal(24) to be able to update WB( N==21) candidate MSE values */ - for ( c = 0; c < maxC_pre; c++ ) - { - dec_FDCNG_MSVQ_stage1( indices_st1_local[c], FDCNG_VQ_MAX_LEN, invTrfMatrix, dcttype + 1, &( st1_syn_vec_ptr[c * FDCNG_VQ_MAX_LEN] ), NULL ); - } - - assert( maxC == maxC_pre ); - } -#endif else /* non-DCT Stage #1 code below */ if ( !s ) /* means: m==1 */ @@ -784,28 +590,10 @@ void msvq_enc( essentially subtract res21^2 ,res22^2, res23^2 that was included in stage1 MSE in the DCT24 domain truncated search, excludes the waveform contributions at pos 21,22,23 to the MSE, important to keep WB MSEs update for the subsequent stages */ -#ifdef ERI_MSVQ_CLEANUP if ( s == 0 && applyDCT_flag != 0 && n == FDCNG_VQ_MAX_LEN_WB ) { p_max = msvq_stage1_dct_recalc_candidates_fdcng_wb( st1_syn_vec_ptr, u, maxC, dist[1] ); } -#else - if ( s == 0 && applyDCT_flag != 0 && n == FDCNG_VQ_MAX_LEN_WB ) - { - assert( start == 0 ); - for ( c = 0; c < maxC; c++ ) - { /* point to extended synthesis part */ - p2 = (const float *) &( st1_syn_vec_ptr[c * FDCNG_VQ_MAX_LEN + FDCNG_VQ_MAX_LEN_WB] ); /* ptr init */ - /* for stage#1 use "u" instead of the shortened resid[0], to access the extended/extrapolated input target */ - v_sub( p2, &( u[FDCNG_VQ_MAX_LEN_WB] ), high_diff, FDCNG_VQ_MAX_LEN - FDCNG_VQ_MAX_LEN_WB ); - res24 = dotp( high_diff, high_diff, FDCNG_VQ_MAX_LEN - FDCNG_VQ_MAX_LEN_WB ); /* sum squared over 3 env. values */ - - dist[1][c] -= res24; /* remove DCT24 high band error contribution */ - } - /* update p_max, as it may potentially change, due to the core DCT24 search originally optimizing over longer basis vectors than 21 */ - p_max = maximum( dist[1], maxC, NULL ); - } -#endif m = maxC; } /* for (m=1, s=0; s Date: Fri, 19 May 2023 19:55:36 +0200 Subject: [PATCH 251/331] [cleanup] accept FIX_416_ISM_BR_SWITCHING --- lib_com/options.h | 1 - lib_dec/ivas_ism_dec.c | 6 ------ 2 files changed, 7 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 3be97becf3..d112f81f1f 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -149,7 +149,6 @@ -#define FIX_416_ISM_BR_SWITCHING /* FhG: add missing CLDFB reconfig to ISM BR switching */ #define FIX_SP2A /* VA: Issue 412: Adjust threshold for the S_p2a feature in the tonal detector */ #define FIX_413_SBA_DTX /* Dlb: Fix for issue 413, SBA DTX CNG in 2TC mode*/ diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index 796e94cfeb..571da52921 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -63,9 +63,7 @@ static ivas_error ivas_ism_bitrate_switching( ivas_error error; int32_t element_brate_tmp[MAX_NUM_OBJECTS]; int16_t nSCE_old, nCPE_old; -#ifdef FIX_416_ISM_BR_SWITCHING int16_t numCldfbAnalyses_old, numCldfbSyntheses_old, ism_mode; -#endif #ifdef JBM_TSM_ON_TCS TC_BUFFER_MODE tc_buffer_mode_new; @@ -82,13 +80,11 @@ static ivas_error ivas_ism_bitrate_switching( nCPE_old = st_ivas->nCPE; nSCE_old = st_ivas->nSCE; -#ifdef FIX_416_ISM_BR_SWITCHING /* we have to temporarily set the ism mode back to the old one, otherwise this can give wrong results*/ ism_mode = st_ivas->ism_mode; st_ivas->ism_mode = last_ism_mode; ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); st_ivas->ism_mode = ism_mode; -#endif if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->nchan_ism, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) { @@ -297,7 +293,6 @@ static ivas_error ivas_ism_bitrate_switching( } } -#ifdef FIX_416_ISM_BR_SWITCHING /*-----------------------------------------------------------------* * CLDFB instances *-----------------------------------------------------------------*/ @@ -306,7 +301,6 @@ static ivas_error ivas_ism_bitrate_switching( { return error; } -#endif #ifdef JBM_TSM_ON_TCS /*-----------------------------------------------------------------* -- GitLab From f810517ba78b67f7f2b70acddccc1fc62f2b8fe4 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 19:56:18 +0200 Subject: [PATCH 252/331] [cleanup] accept FIX_SP2A --- lib_com/cnst.h | 2 -- lib_com/options.h | 1 - lib_enc/speech_music_classif.c | 8 -------- 3 files changed, 11 deletions(-) diff --git a/lib_com/cnst.h b/lib_com/cnst.h index 51399309b4..d518dff0df 100644 --- a/lib_com/cnst.h +++ b/lib_com/cnst.h @@ -1531,9 +1531,7 @@ typedef enum _DCTTYPE #define TOD_NSPEC 80 /* number of spectral bins of the tonal detector */ #define TOD_THR_MASS 0.86f /* initial value for the adaptive threshold of the tonal detector */ #define P2A_FACT 0.9f /* long-term averaging factor for peak-to-average ratio */ -#ifdef FIX_SP2A #define THR_P2A_HIGH 95.0f /* higher threshold to detect strongly peaky signals at low bitrates*/ -#endif #define THR_P2A 80.0f /* lower threshold to detect strongly peaky signals at higher bitrates */ /*----------------------------------------------------------------------------------* diff --git a/lib_com/options.h b/lib_com/options.h index d112f81f1f..8bb5908982 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -149,7 +149,6 @@ -#define FIX_SP2A /* VA: Issue 412: Adjust threshold for the S_p2a feature in the tonal detector */ #define FIX_413_SBA_DTX /* Dlb: Fix for issue 413, SBA DTX CNG in 2TC mode*/ #define FIX_417_TD_DECORR_BRATE_SW /* VA: Issue 417: fix incorrect use of TD decorrelator in bitrate switching */ diff --git a/lib_enc/speech_music_classif.c b/lib_enc/speech_music_classif.c index 80bd2d6d2a..fac0f01e4f 100644 --- a/lib_enc/speech_music_classif.c +++ b/lib_enc/speech_music_classif.c @@ -1828,9 +1828,7 @@ void ivas_smc_mode_selection( float ton; int16_t i; float S_p2a, S_max, S_ave; -#ifdef FIX_SP2A float thr_sp2a; -#endif SP_MUS_CLAS_HANDLE hSpMusClas = st->hSpMusClas; @@ -1861,7 +1859,6 @@ void ivas_smc_mode_selection( S_ave = sum_f( st->hSpMusClas->tod_lt_Bin_E, TOD_NSPEC ) / TOD_NSPEC; S_p2a = S_max - S_ave; -#ifdef FIX_SP2A if ( element_brate <= IVAS_16k4 ) { thr_sp2a = THR_P2A_HIGH; @@ -1870,14 +1867,9 @@ void ivas_smc_mode_selection( { thr_sp2a = THR_P2A; } -#endif /* initial 3-way selection of coding modes (ACELP/GSC/TCX) */ -#ifdef FIX_SP2A if ( relE > -10.0f && ( S_p2a > thr_sp2a || ton > hSpMusClas->tod_thr_lt ) ) -#else - if ( relE > -10.0f && ( S_p2a > THR_P2A || ton > hSpMusClas->tod_thr_lt ) ) -#endif { /* select TCX to encode extremely peaky signals or strongly tonal signals */ st->sp_aud_decision1 = 1; -- GitLab From 44c2de34bc903413aeb62661cf271ecc2b121df9 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 19:57:37 +0200 Subject: [PATCH 253/331] [cleanup] accept FIX_413_SBA_DTX --- lib_com/options.h | 1 - lib_dec/ivas_stereo_mdct_stereo_dec.c | 8 -------- 2 files changed, 9 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 8bb5908982..dbaf3a26af 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -150,7 +150,6 @@ -#define FIX_413_SBA_DTX /* Dlb: Fix for issue 413, SBA DTX CNG in 2TC mode*/ #define FIX_417_TD_DECORR_BRATE_SW /* VA: Issue 417: fix incorrect use of TD decorrelator in bitrate switching */ #define FIX_368_SBA_MODE /* Dlb: Fix for issue 368 */ #define FIX_427_MAXIMUM_S_INDEX /* VA: issue 427: fix return index of function maximum_s() */ diff --git a/lib_dec/ivas_stereo_mdct_stereo_dec.c b/lib_dec/ivas_stereo_mdct_stereo_dec.c index 0e788a0821..efc9ebe845 100644 --- a/lib_dec/ivas_stereo_mdct_stereo_dec.c +++ b/lib_dec/ivas_stereo_mdct_stereo_dec.c @@ -468,14 +468,7 @@ ivas_error initMdctStereoDtxData( /* Init FD-CNG */ initFdCngDec( st ); -#ifndef FIX_413_SBA_DTX - if ( ch == 1 && st->cng_sba_flag ) - { - st->hFdCngDec->hFdCngCom->seed += 3; - } -#endif } -#ifdef FIX_413_SBA_DTX if ( st->first_CNG == 0 ) { if ( ch == 1 && st->cng_sba_flag ) @@ -483,7 +476,6 @@ ivas_error initMdctStereoDtxData( st->hFdCngDec->hFdCngCom->seed += 3; } } -#endif if ( st->cldfbAna == NULL ) { -- GitLab From 51035aaafcc972406beb416946666bc1ceb17cad Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 19:58:12 +0200 Subject: [PATCH 254/331] [cleanup] accept FIX_417_TD_DECORR_BRATE_SW --- lib_com/ivas_prot.h | 7 --- lib_com/ivas_td_decorr.c | 4 -- lib_com/options.h | 1 - lib_dec/ivas_masa_dec.c | 6 -- lib_dec/ivas_mcmasa_dec.c | 13 ---- lib_dec/ivas_mct_dec.c | 12 ---- lib_dec/ivas_sba_dec.c | 2 - lib_rend/ivas_dirac_dec_binaural_functions.c | 62 -------------------- 8 files changed, 107 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 40ae483dfb..8d189157b2 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3725,7 +3725,6 @@ void ivas_dirac_dec_render_sf( #endif ); -#ifdef FIX_417_TD_DECORR_BRATE_SW ivas_error ivas_td_decorr_reconfig_dec( const IVAS_FORMAT ivas_format, /* i : IVAS format */ const int32_t ivas_total_brate, /* i : total IVAS bitrate */ @@ -3740,12 +3739,6 @@ float configure_reqularization_factor( const IVAS_FORMAT ivas_format, /* i : IVAS format */ const int32_t ivas_total_brate /* i : total IVAS bitrate */ ); -#else -ivas_error ivas_dirac_dec_init_binaural_data( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - HRTFS_PARAMBIN_HANDLE hHrtfParambin /* i : HRTF structure for rendering */ -); -#endif void computeDiffuseness_mdft( float **buffer_intensity[DIRAC_NUM_DIMS], diff --git a/lib_com/ivas_td_decorr.c b/lib_com/ivas_td_decorr.c index 9a08c06f6a..6290027df6 100644 --- a/lib_com/ivas_td_decorr.c +++ b/lib_com/ivas_td_decorr.c @@ -87,10 +87,8 @@ static const float ivas_three_pow_frac[IVAS_MAX_DECORR_APD_SECTIONS] = { }; -#ifdef FIX_417_TD_DECORR_BRATE_SW #define IVAS_TDET_DUCK_MULT_FAC_PARA_BIN ( 2.0f ) #define IVAS_TDET_DUCK_MULT_FAC_PARA_BIN_LOW_BR ( 3.0f ) -#endif /*------------------------------------------------------------------------------------------* * Local functions declaration @@ -101,7 +99,6 @@ static int16_t ivas_get_APD_filt_orders( const int16_t num_out_chans, const int3 static void ivas_td_decorr_init( ivas_td_decorr_state_t *hTdDecorr, const int16_t num_out_chans, const int16_t ducking_flag ); -#ifdef FIX_417_TD_DECORR_BRATE_SW /*------------------------------------------------------------------------- * ivas_td_decorr_reconfig_dec() * @@ -191,7 +188,6 @@ ivas_error ivas_td_decorr_reconfig_dec( return IVAS_ERR_OK; } -#endif /*------------------------------------------------------------------------- diff --git a/lib_com/options.h b/lib_com/options.h index dbaf3a26af..1bc1357a78 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -150,7 +150,6 @@ -#define FIX_417_TD_DECORR_BRATE_SW /* VA: Issue 417: fix incorrect use of TD decorrelator in bitrate switching */ #define FIX_368_SBA_MODE /* Dlb: Fix for issue 368 */ #define FIX_427_MAXIMUM_S_INDEX /* VA: issue 427: fix return index of function maximum_s() */ #define FIX_431_PARAMMC_PLC_INTERPOLATOR /* FhG: Issue 431: fix missing interpolator reset for ParamMC PCL */ diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 44cc172041..a1887a1741 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -1147,9 +1147,7 @@ ivas_error ivas_masa_dec_reconfigure( uint16_t *bit_stream; Decoder_State **sts; int32_t ivas_total_brate, last_ivas_total_brate; -#ifdef FIX_417_TD_DECORR_BRATE_SW int16_t numCldfbAnalyses_old, numCldfbSyntheses_old; -#endif ivas_error error; error = IVAS_ERR_OK; @@ -1157,9 +1155,7 @@ ivas_error ivas_masa_dec_reconfigure( ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; last_ivas_total_brate = st_ivas->hDecoderConfig->last_ivas_total_brate; -#ifdef FIX_417_TD_DECORR_BRATE_SW ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); -#endif #ifdef FIX_425_MASA_BRSW_RENDERER /* renderer might have changed, reselect */ @@ -1244,7 +1240,6 @@ ivas_error ivas_masa_dec_reconfigure( st_ivas->hDiracDecBin->reqularizationFactor = configure_reqularization_factor( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate ); } #endif -#ifdef FIX_417_TD_DECORR_BRATE_SW /*-----------------------------------------------------------------* * TD Decorrelator *-----------------------------------------------------------------*/ @@ -1269,7 +1264,6 @@ ivas_error ivas_masa_dec_reconfigure( /*-----------------------------------------------------------------* * Set-up MASA coding elements and bitrates *-----------------------------------------------------------------*/ -#endif ivas_masa_set_elements( ivas_total_brate, st_ivas->mc_mode, st_ivas->nchan_transport, st_ivas->hQMetaData, &tmp, &tmp, &tmp ); diff --git a/lib_dec/ivas_mcmasa_dec.c b/lib_dec/ivas_mcmasa_dec.c index 59d215e22c..99b3ff6874 100755 --- a/lib_dec/ivas_mcmasa_dec.c +++ b/lib_dec/ivas_mcmasa_dec.c @@ -131,7 +131,6 @@ ivas_error ivas_mcmasa_dec_reconfig( } else { -#ifdef FIX_417_TD_DECORR_BRATE_SW /* if necessary, close/open td-decorrs */ if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) ) ) != IVAS_ERR_OK ) { @@ -140,18 +139,6 @@ ivas_error ivas_mcmasa_dec_reconfig( /* regularization factor is bitrate-dependent */ st_ivas->hDiracDecBin->reqularizationFactor = configure_reqularization_factor( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate ); -#else - /* the decision for useTdDecorr is done in ivas_dirac_dec_init_binaural_data(). here, comparing against the same condition. */ - if ( st_ivas->hDiracDecBin->useTdDecorr != ( ivas_total_brate < IVAS_48k && st_ivas->nchan_transport == 1 ) ) - { - /* st_ivas->hDiracDecBin->useTdDecorr will change => close and re-open. */ - ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); - if ( ( error = ivas_dirac_dec_init_binaural_data( st_ivas, st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) - { - return error; - } - } -#endif } } diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index 19a0909461..0ad5f46d85 100755 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -1103,16 +1103,6 @@ static ivas_error ivas_mc_dec_reconfig( } -#ifndef FIX_417_TD_DECORR_BRATE_SW - /*-----------------------------------------------------------------* - * CLDFB instances - *-----------------------------------------------------------------*/ - - if ( ( error = ivas_cldfb_dec_reconfig( st_ivas, nchan_transport_old, numCldfbAnalyses_old, numCldfbSyntheses_old ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif /*-----------------------------------------------------------------* * Allocate the LFE handle that is coded seperately after the allocation of the core coders *-----------------------------------------------------------------*/ @@ -1304,7 +1294,6 @@ static ivas_error ivas_mc_dec_reconfig( #endif } -#ifdef FIX_417_TD_DECORR_BRATE_SW /*-----------------------------------------------------------------* * TD Decorrelator *-----------------------------------------------------------------*/ @@ -1325,7 +1314,6 @@ static ivas_error ivas_mc_dec_reconfig( { return error; } -#endif #ifdef JBM_TSM_ON_TCS /*-----------------------------------------------------------------* diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 0dcaec91da..7b48f1d769 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -352,7 +352,6 @@ ivas_error ivas_sba_dec_reconfigure( return error; } -#ifdef FIX_417_TD_DECORR_BRATE_SW /*-----------------------------------------------------------------* * TD Decorrelator *-----------------------------------------------------------------*/ @@ -364,7 +363,6 @@ ivas_error ivas_sba_dec_reconfigure( return error; } } -#endif /*-----------------------------------------------------------------* * CLDFB instances diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 06fd160bb2..ed9d5d3b3c 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -53,10 +53,8 @@ *------------------------------------------------------------------------*/ #define CLDFB_HALF_BIN_FREQUENCY_OFFSET 0.5f -#ifdef FIX_417_TD_DECORR_BRATE_SW #define IVAS_TDET_DUCK_MULT_FAC_PARA_BIN ( 2.0f ) #define IVAS_TDET_DUCK_MULT_FAC_PARA_BIN_LOW_BR ( 3.0f ) -#endif /* powf(0.95f, 4.0f) for sub-frame smoothing instead of CLDFB slot */ #define ADAPT_HTPROTO_IIR_FAC 0.81450625f @@ -123,9 +121,6 @@ static void matrixMul( float Are[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Ai static void matrixTransp2Mul( float Are[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Aim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Bre[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Bim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float outRe[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float outIm[BINAURAL_CHANNELS][BINAURAL_CHANNELS] ); -#ifndef FIX_417_TD_DECORR_BRATE_SW -static float configure_reqularization_factor( const IVAS_FORMAT ivas_format, const int32_t ivas_brate ); -#endif #ifdef JBM_TSM_ON_TCS #ifndef FIX_355_REFACTOR_PARAMBIN_TO_5MS @@ -202,30 +197,6 @@ ivas_error ivas_dirac_dec_init_binaural_data( hBinaural->useSubframeMode = 1; #endif -#ifndef FIX_417_TD_DECORR_BRATE_SW - hBinaural->useTdDecorr = 0; - if ( st_ivas->ivas_format == SBA_FORMAT ) - { - if ( st_ivas->nchan_transport == 1 ) - { - hBinaural->useTdDecorr = 1; - } - } - else if ( st_ivas->ivas_format == MASA_FORMAT ) - { - if ( ( st_ivas->hDecoderConfig->ivas_total_brate < IVAS_48k && st_ivas->nchan_transport == 1 ) || st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE ) - { - hBinaural->useTdDecorr = 1; - } - } - else if ( st_ivas->ivas_format == MC_FORMAT ) - { - if ( ( st_ivas->hDecoderConfig->ivas_total_brate < IVAS_48k && st_ivas->nchan_transport == 1 ) ) - { - hBinaural->useTdDecorr = 1; - } - } -#endif for ( bin = 0; bin < nBins; bin++ ) { @@ -352,7 +323,6 @@ ivas_error ivas_dirac_dec_init_binaural_data( assert( false ); } -#ifdef FIX_417_TD_DECORR_BRATE_SW if ( hBinaural->hTdDecorr == NULL ) { hBinaural->useTdDecorr = 0; @@ -362,35 +332,6 @@ ivas_error ivas_dirac_dec_init_binaural_data( { return error; } -#else - if ( hBinaural->useTdDecorr ) - { - if ( st_ivas->hDecoderConfig->ivas_total_brate >= IVAS_13k2 && st_ivas->ivas_format == SBA_FORMAT ) - { - if ( hBinaural->hTdDecorr == NULL ) - { - ivas_td_decorr_dec_open( &( hBinaural->hTdDecorr ), output_Fs, 3, 1 ); - } - - if ( st_ivas->hDecoderConfig->ivas_total_brate < IVAS_24k4 ) - { - hBinaural->hTdDecorr->pTrans_det->duck_mult_fac = IVAS_TDET_DUCK_MULT_FAC_PARA_BIN_LOW_BR; - } - else - { - hBinaural->hTdDecorr->pTrans_det->duck_mult_fac = IVAS_TDET_DUCK_MULT_FAC_PARA_BIN; - } - } - else - { - ivas_td_decorr_dec_open( &( hBinaural->hTdDecorr ), output_Fs, 3, 0 ); - } - } - else - { - ivas_td_decorr_dec_close( &( hBinaural->hTdDecorr ) ); - } -#endif hBinaural->reqularizationFactor = configure_reqularization_factor( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate ); @@ -4142,9 +4083,6 @@ static void hrtfShGetHrtf( *------------------------------------------------------------------------*/ /*! r: Configured reqularization factor value */ -#ifndef FIX_417_TD_DECORR_BRATE_SW -static -#endif float configure_reqularization_factor( const IVAS_FORMAT ivas_format, /* i : IVAS format */ -- GitLab From 73b18516da450693915afe9a78a8da5029780fc9 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 19:58:48 +0200 Subject: [PATCH 255/331] [cleanup] accept FIX_368_SBA_MODE --- lib_com/options.h | 1 - lib_enc/dtx.c | 4 ---- 2 files changed, 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 1bc1357a78..ed37541ab7 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -150,7 +150,6 @@ -#define FIX_368_SBA_MODE /* Dlb: Fix for issue 368 */ #define FIX_427_MAXIMUM_S_INDEX /* VA: issue 427: fix return index of function maximum_s() */ #define FIX_431_PARAMMC_PLC_INTERPOLATOR /* FhG: Issue 431: fix missing interpolator reset for ParamMC PCL */ #define FIX_391_SBA /* Dlb: Fix for issue 391 for SBA */ diff --git a/lib_enc/dtx.c b/lib_enc/dtx.c index df6ffe6b8f..25fca5d2de 100644 --- a/lib_enc/dtx.c +++ b/lib_enc/dtx.c @@ -64,11 +64,7 @@ #define LTE_VAR -4.0f #define MAX_BRATE_DTX_EVS ACELP_24k40 /* maximum bitrate to which the default DTX is applied in EVS; otherwise DTX is applied only in silence */ -#ifndef FIX_368_SBA_MODE -#define MAX_BRATE_DTX_IVAS IVAS_64k /* maximum bitrate to which the default DTX is applied in IVAS; otherwise DTX is applied only in silence */ -#else #define MAX_BRATE_DTX_IVAS IVAS_80k /* maximum bitrate to which the default DTX is applied in IVAS; otherwise DTX is applied only in silence */ -#endif /*-------------------------------------------------------------------* * Local function prototypes *-------------------------------------------------------------------*/ -- GitLab From fa8b10d0be2756678f592803595beb35f7846a98 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 19:59:38 +0200 Subject: [PATCH 256/331] [cleanup] accept FIX_427_MAXIMUM_S_INDEX --- lib_com/options.h | 1 - lib_com/tools.c | 2 -- 2 files changed, 3 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index ed37541ab7..945defb951 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -150,7 +150,6 @@ -#define FIX_427_MAXIMUM_S_INDEX /* VA: issue 427: fix return index of function maximum_s() */ #define FIX_431_PARAMMC_PLC_INTERPOLATOR /* FhG: Issue 431: fix missing interpolator reset for ParamMC PCL */ #define FIX_391_SBA /* Dlb: Fix for issue 391 for SBA */ #define LBR_ADAP_SMOOTHING_OPT /* FhG: Issue 436: complexity optimization of adaptive smoothing in low-bitrate SBA */ diff --git a/lib_com/tools.c b/lib_com/tools.c index b730564580..ab688adbb9 100644 --- a/lib_com/tools.c +++ b/lib_com/tools.c @@ -561,9 +561,7 @@ int16_t maximum_s( { if ( vec[i] > tmp ) { -#ifdef FIX_427_MAXIMUM_S_INDEX ind = i; -#endif tmp = vec[i]; } } -- GitLab From 9bf44294bcf72b76908a87bef60bdb38081a0085 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 20:00:15 +0200 Subject: [PATCH 257/331] [cleanup] accept FIX_431_PARAMMC_PLC_INTERPOLATOR --- lib_com/options.h | 1 - lib_dec/ivas_mc_param_dec.c | 2 -- 2 files changed, 3 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 945defb951..694dacb1a2 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -150,7 +150,6 @@ -#define FIX_431_PARAMMC_PLC_INTERPOLATOR /* FhG: Issue 431: fix missing interpolator reset for ParamMC PCL */ #define FIX_391_SBA /* Dlb: Fix for issue 391 for SBA */ #define LBR_ADAP_SMOOTHING_OPT /* FhG: Issue 436: complexity optimization of adaptive smoothing in low-bitrate SBA */ diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index d19e2d33cc..c6e0776660 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -1397,9 +1397,7 @@ void ivas_param_mc_dec_read_BS( hMetadataPMC->bAttackPresent = 0; hMetadataPMC->attackIndex = 0; #ifndef JBM_TSM_ON_TCS -#ifdef FIX_431_PARAMMC_PLC_INTERPOLATOR ivas_param_mc_dec_compute_interpolator( hMetadataPMC->bAttackPresent, hMetadataPMC->attackIndex, PARAM_MC_MAX_NSLOTS, hParamMC->h_output_synthesis_params.interpolator ); -#endif #endif } -- GitLab From 65e7a439b249791bd72b51e6decce57b8cac957c Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 20:00:52 +0200 Subject: [PATCH 258/331] [cleanup] accept FIX_391_SBA --- lib_com/ivas_dirac_com.c | 2 -- lib_com/ivas_stat_com.h | 2 -- lib_com/options.h | 1 - lib_dec/ivas_dirac_dec.c | 4 ---- 4 files changed, 9 deletions(-) diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index d0b4c5a4db..42e7c3343f 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -173,9 +173,7 @@ ivas_error ivas_dirac_config( } hConfig->enc_param_start_band = 0; hConfig->dec_param_estim = FALSE; -#ifdef FIX_391_SBA hConfig->dec_param_estim_old = hConfig->dec_param_estim; -#endif if ( ivas_format == SBA_FORMAT ) /* skip for MASA decoder */ { if ( ( error = ivas_dirac_sba_config( hQMetaData, nchan_transport, nSCE, nCPE, element_mode, ivas_total_brate, sba_order, sba_mode, hConfig->nbands - spar_dirac_split_band ) ) != IVAS_ERR_OK ) diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index 333e80e26f..3e2848348a 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -181,9 +181,7 @@ typedef struct ivas_dirac_config_data_struct { int16_t enc_param_start_band; int16_t dec_param_estim; -#ifdef FIX_391_SBA int16_t dec_param_estim_old; -#endif int16_t nbands; } DIRAC_CONFIG_DATA, *DIRAC_CONFIG_DATA_HANDLE; diff --git a/lib_com/options.h b/lib_com/options.h index 694dacb1a2..1851a5a198 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -150,7 +150,6 @@ -#define FIX_391_SBA /* Dlb: Fix for issue 391 for SBA */ #define LBR_ADAP_SMOOTHING_OPT /* FhG: Issue 436: complexity optimization of adaptive smoothing in low-bitrate SBA */ #define FIX_425_MASA_BRSW_RENDERER /* Nokia: Issue 425: renderer not reconfigure in MASA bitrate switching */ diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 2801c9c146..aac883c89d 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -1127,9 +1127,7 @@ ivas_error ivas_dirac_dec_config( hDirAC->dirac_bs_md_write_idx = 0; hDirAC->dirac_read_idx = 0; hDirAC->spar_to_dirac_write_idx = 0; -#ifdef FIX_391_SBA hDirAC->hConfig->dec_param_estim_old = hDirAC->hConfig->dec_param_estim; -#endif if ( st_ivas->mc_mode == MC_MODE_MCMASA ) { hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES; @@ -1341,7 +1339,6 @@ ivas_error ivas_dirac_dec_config( hDirAC->dithering_seed = DIRAC_DITH_SEED; st_ivas->hDirAC = hDirAC; } -#ifdef FIX_391_SBA else if ( hDirAC->hConfig->dec_param_estim_old != hDirAC->hConfig->dec_param_estim ) { int16_t num_slots_in_subfr; @@ -1500,7 +1497,6 @@ ivas_error ivas_dirac_dec_config( #endif } } -#endif #ifdef JBM_TSM_ON_TCS /* allocate transport channels*/ if ( flag_config == DIRAC_OPEN ) -- GitLab From 13f842148f39de084246716ba091de2f210db5f5 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 20:01:43 +0200 Subject: [PATCH 259/331] [cleanup] accept LBR_ADAP_SMOOTHING_OPT --- lib_com/options.h | 1 - lib_dec/ivas_spar_decoder.c | 11 ----------- lib_dec/ivas_spar_md_dec.c | 14 -------------- lib_dec/ivas_stat_dec.h | 5 ----- 4 files changed, 31 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 1851a5a198..e41dd6338f 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -150,7 +150,6 @@ -#define LBR_ADAP_SMOOTHING_OPT /* FhG: Issue 436: complexity optimization of adaptive smoothing in low-bitrate SBA */ #define FIX_425_MASA_BRSW_RENDERER /* Nokia: Issue 425: renderer not reconfigure in MASA bitrate switching */ diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index d1104594a1..21817c460f 100755 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -1713,14 +1713,7 @@ void ivas_spar_dec_upmixer( if ( ( hDecoderConfig->ivas_total_brate < IVAS_24k4 ) && ( ( hDecoderConfig->output_config == AUDIO_CONFIG_HOA2 ) || ( hDecoderConfig->output_config == AUDIO_CONFIG_HOA3 ) ) ) { -#ifdef LBR_ADAP_SMOOTHING_OPT ivas_spar_calc_smooth_facs( cldfb_in_ts_re[0], cldfb_in_ts_im[0], num_spar_bands, &hSpar->hFbMixer->pFb->fb_bin_to_band, hSpar->hMdDec->smooth_fac, hSpar->hMdDec->smooth_buf ); -#else - for ( in_ch = 0; in_ch < numch_in; in_ch++ ) - { - ivas_spar_calc_smooth_facs( cldfb_in_ts_re[in_ch], cldfb_in_ts_im[in_ch], num_spar_bands, &hSpar->hFbMixer->pFb->fb_bin_to_band, hSpar->hMdDec->smooth_fac[in_ch], hSpar->hMdDec->smooth_buf[in_ch] ); - } -#endif } #ifdef JBM_TSM_ON_TCS @@ -1744,11 +1737,7 @@ void ivas_spar_dec_upmixer( { for ( in_ch = 0; in_ch < numch_in; in_ch++ ) { -#ifdef LBR_ADAP_SMOOTHING_OPT mixer_mat[out_ch][in_ch][spar_band] = ( 1 - hSpar->hMdDec->smooth_fac[spar_band] ) * mixer_mat[out_ch][in_ch][spar_band] + hSpar->hMdDec->smooth_fac[spar_band] * hSpar->hMdDec->mixer_mat_prev2[out_ch][in_ch][spar_band]; -#else - mixer_mat[out_ch][in_ch][spar_band] = ( 1 - hSpar->hMdDec->smooth_fac[in_ch][spar_band] ) * mixer_mat[out_ch][in_ch][spar_band] + hSpar->hMdDec->smooth_fac[in_ch][spar_band] * hSpar->hMdDec->mixer_mat_prev2[out_ch][in_ch][spar_band]; -#endif hSpar->hMdDec->mixer_mat_prev2[out_ch][in_ch][spar_band] = mixer_mat[out_ch][in_ch][spar_band]; } } diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index bfca6c6280..26c9c4a448 100755 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -618,25 +618,11 @@ ivas_error ivas_spar_md_dec_init( set_f( hMdDec->spar_md.en_ratio_slow, 0.0f, IVAS_MAX_NUM_BANDS ); set_f( hMdDec->spar_md.ref_pow_slow, 0.0f, IVAS_MAX_NUM_BANDS ); -#ifdef LBR_ADAP_SMOOTHING_OPT set_zero( hMdDec->smooth_fac, IVAS_MAX_NUM_BANDS ); for ( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) { set_zero( hMdDec->smooth_buf[i], 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); } -#else - for ( i = 0; i < IVAS_SPAR_MAX_CH; i++ ) - { - set_zero( hMdDec->smooth_fac[i], IVAS_MAX_NUM_BANDS ); - } - for ( i = 0; i < IVAS_SPAR_MAX_CH; i++ ) - { - for ( j = 0; j < IVAS_MAX_NUM_BANDS; j++ ) - { - set_zero( hMdDec->smooth_buf[i][j], 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); - } - } -#endif for ( i = 0; i < IVAS_SPAR_MAX_CH; i++ ) { for ( j = 0; j < IVAS_SPAR_MAX_CH; j++ ) diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index eddeeaa4da..c10af2f657 100755 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -865,13 +865,8 @@ typedef struct ivas_spar_md_dec_state_t int16_t spar_hoa_dirac2spar_md_flag; int16_t HOA_md_ind[IVAS_SPAR_MAX_CH]; #endif -#ifdef LBR_ADAP_SMOOTHING_OPT float smooth_buf[IVAS_MAX_NUM_BANDS][2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1]; float smooth_fac[IVAS_MAX_NUM_BANDS]; -#else - float smooth_buf[IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS][2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1]; - float smooth_fac[IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; -#endif float mixer_mat_prev2[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; } ivas_spar_md_dec_state_t; -- GitLab From 0711b95062812153360a123210269aab243abd48 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 20:02:33 +0200 Subject: [PATCH 260/331] [cleanup] accept FIX_425_MASA_BRSW_RENDERER --- lib_com/options.h | 1 - lib_dec/ivas_masa_dec.c | 4 ---- 2 files changed, 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index e41dd6338f..726e4b6e58 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -151,7 +151,6 @@ -#define FIX_425_MASA_BRSW_RENDERER /* Nokia: Issue 425: renderer not reconfigure in MASA bitrate switching */ #define EUALER2QUAT_FIX /* Dlb :fix for issue 430 issue in euler2quat, sign of quat y is inverted */ #define HR_METADATA /* Nok: Contribution #45: encode directional MASA metadata with more bits at 384k and 512k */ diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index a1887a1741..15dd2e692e 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -1157,7 +1157,6 @@ ivas_error ivas_masa_dec_reconfigure( ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); -#ifdef FIX_425_MASA_BRSW_RENDERER /* renderer might have changed, reselect */ ivas_renderer_select( st_ivas ); @@ -1175,7 +1174,6 @@ ivas_error ivas_masa_dec_reconfigure( ivas_dirac_dec_close( &( st_ivas->hDirAC ) ); } /* possible reconfigure is done later */ -#endif /*-----------------------------------------------------------------* * Allocate and initialize SCE/CPE and other handles @@ -1233,13 +1231,11 @@ ivas_error ivas_masa_dec_reconfigure( } } } -#ifdef FIX_425_MASA_BRSW_RENDERER if ( st_ivas->hDiracDecBin != NULL ) { /* regularization factor is bitrate-dependent */ st_ivas->hDiracDecBin->reqularizationFactor = configure_reqularization_factor( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate ); } -#endif /*-----------------------------------------------------------------* * TD Decorrelator *-----------------------------------------------------------------*/ -- GitLab From 2f384416db089d8aae2c519c9fd34ac23c47e09a Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 20:03:15 +0200 Subject: [PATCH 261/331] [cleanup] accept EUALER2QUAT_FIX --- lib_com/options.h | 1 - lib_rend/ivas_rotation.c | 11 ----------- 2 files changed, 12 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 726e4b6e58..5dc8e4c807 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -152,7 +152,6 @@ -#define EUALER2QUAT_FIX /* Dlb :fix for issue 430 issue in euler2quat, sign of quat y is inverted */ #define HR_METADATA /* Nok: Contribution #45: encode directional MASA metadata with more bits at 384k and 512k */ #define SBA_TD_RESIDUAL /* Dlb : Issue 426: SBA encoder complexity optimization */ diff --git a/lib_rend/ivas_rotation.c b/lib_rend/ivas_rotation.c index 5719e2ffdd..6809cdee2b 100644 --- a/lib_rend/ivas_rotation.c +++ b/lib_rend/ivas_rotation.c @@ -165,24 +165,13 @@ void Euler2Quat( float cr = cosf( roll * 0.5f ); float sr = sinf( roll * 0.5f ); float cp = cosf( pitch * 0.5f ); -#ifdef EUALER2QUAT_FIX float sp = sinf( pitch * 0.5f ); -#else - float sp = sinf( -pitch * 0.5f ); -#endif float cy = cosf( yaw * 0.5f ); float sy = sinf( yaw * 0.5f ); -#ifdef EUALER2QUAT_FIX quat->w = cr * cp * cy + sr * sp * sy; quat->x = sr * cp * cy - cr * sp * sy; quat->y = sr * cp * sy + cr * sp * cy; quat->z = cr * cp * sy - sr * sp * cy; -#else - quat->w = cr * cp * cy - sr * sp * sy; - quat->x = sr * cp * cy + cr * sp * sy; - quat->y = cr * sp * cy - sr * cp * sy; - quat->z = cr * cp * sy + sr * sp * cy; -#endif return; } -- GitLab From 1146536de8780c94ff13f9174b14baf7629d80e1 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 20:05:05 +0200 Subject: [PATCH 262/331] [cleanup] accept SBA_TD_RESIDUAL --- lib_com/ivas_fb_mixer.c | 15 --------------- lib_com/options.h | 1 - lib_enc/ivas_spar_encoder.c | 17 ----------------- 3 files changed, 33 deletions(-) diff --git a/lib_com/ivas_fb_mixer.c b/lib_com/ivas_fb_mixer.c index 7c724c804e..2b7d65333d 100644 --- a/lib_com/ivas_fb_mixer.c +++ b/lib_com/ivas_fb_mixer.c @@ -230,11 +230,7 @@ ivas_error ivas_FB_mixer_open( } else { -#ifdef SBA_TD_RESIDUAL num_chs_alloc = 1; /* only W channel processed for predicting YZX */ -#else - num_chs_alloc = fb_cfg->num_out_chans; -#endif } for ( i = 0; i < num_chs_alloc; i++ ) @@ -408,11 +404,7 @@ void ivas_FB_mixer_close( } else { -#ifdef SBA_TD_RESIDUAL num_chs_alloc = 1; /* only W channel processed for predicting YZX */ -#else - num_chs_alloc = fb_cfg->num_out_chans; -#endif } if ( hFbMixer != NULL ) @@ -538,11 +530,7 @@ void ivas_fb_mixer_pcm_ingest( } else { -#ifdef SBA_TD_RESIDUAL num_chs_ingest = 1; /* forward Filterbank MDFT only on W */ -#else - num_chs_ingest = fb_cfg->num_out_chans; -#endif } for ( i = 0; i < fb_cfg->num_in_chans; i++ ) @@ -838,9 +826,6 @@ void ivas_fb_mixer_get_in_out_mapping( for ( i = 1; i < fb_cfg->num_out_chans; i++ ) { in_out_mixer_map[i][0] = 1; -#ifndef SBA_TD_RESIDUAL - in_out_mixer_map[i][order[i]] = 1; -#endif } } } diff --git a/lib_com/options.h b/lib_com/options.h index 5dc8e4c807..7b026004ec 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -153,7 +153,6 @@ #define HR_METADATA /* Nok: Contribution #45: encode directional MASA metadata with more bits at 384k and 512k */ -#define SBA_TD_RESIDUAL /* Dlb : Issue 426: SBA encoder complexity optimization */ #define FIX_357_DTX_32K /* Eri: issue 357 - Forced LP-CNG at 32k */ #define FIX_435_ISM_MERGE_BUG /* Eri: Merge bug fix for ISM NULL metadata and tcx_only cases */ diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index a72f40bb43..baf8870c5c 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -450,11 +450,7 @@ static ivas_error ivas_spar_enc_process( int16_t ts, l_ts, orig_dirac_bands, num_del_samples; float *ppIn_FR_real[IVAS_SPAR_MAX_CH], *ppIn_FR_imag[IVAS_SPAR_MAX_CH]; -#ifdef SBA_TD_RESIDUAL float wyzx_del_buf[FOA_CHANNELS][IVAS_FB_1MS_48K_SAMP]; -#else - float w_del_buf[IVAS_FB_1MS_48K_SAMP]; -#endif float dir[3], avg_dir[3]; float energySum, vecLen; #ifdef HODIRAC @@ -509,7 +505,6 @@ static ivas_error ivas_spar_enc_process( } /* store previous input samples for W in local buffer */ assert( num_del_samples <= IVAS_FB_1MS_48K_SAMP ); -#ifdef SBA_TD_RESIDUAL if ( hSpar->hFbMixer->fb_cfg->active_w_mixing == 0 ) { /* fill delay (1 ms) buffer for all Transport channels */ @@ -519,9 +514,6 @@ static ivas_error ivas_spar_enc_process( mvr2r( &hSpar->hFbMixer->ppFilterbank_prior_input[idx][hSpar->hFbMixer->fb_cfg->prior_input_length - num_del_samples], wyzx_del_buf[idx], num_del_samples ); } } -#else - mvr2r( &hSpar->hFbMixer->ppFilterbank_prior_input[0][hSpar->hFbMixer->fb_cfg->prior_input_length - num_del_samples], w_del_buf, num_del_samples ); -#endif /*-----------------------------------------------------------------------------------------* * FB mixer ingest @@ -929,7 +921,6 @@ static ivas_error ivas_spar_enc_process( #ifdef DEBUG_SBA_AUDIO_DUMP ivas_spar_dump_signal_wav( input_frame, p_pcm_tmp, NULL, nchan_transport, spar_foa_enc_wav[1], "ivas_fb_mixer_process()" ); #endif -#ifdef SBA_TD_RESIDUAL if ( hSpar->hFbMixer->fb_cfg->active_w_mixing == 0 ) { /* delayed W */ @@ -945,14 +936,6 @@ static ivas_error ivas_spar_enc_process( v_add( data_f[idx], p_pcm_tmp[i] + num_del_samples, p_pcm_tmp[i] + num_del_samples, input_frame - num_del_samples ); } } -#else - /* move delayed W into output buffer unless activeW operation*/ - if ( hSpar->hFbMixer->fb_cfg->active_w_mixing == 0 ) - { - mvr2r( w_del_buf, p_pcm_tmp[0], num_del_samples ); - mvr2r( data_f[0], p_pcm_tmp[0] + num_del_samples, input_frame - num_del_samples ); - } -#endif #if 0 /* SBA_TD_RESIDUAL */ { static FILE *fid = 0; -- GitLab From 3665992499d44c195e8ba6251309042904edce54 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 20:05:40 +0200 Subject: [PATCH 263/331] [cleanup] accept FIX_357_DTX_32K --- lib_com/options.h | 1 - lib_enc/dtx.c | 4 ---- 2 files changed, 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 7b026004ec..6fc45de264 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -154,7 +154,6 @@ #define HR_METADATA /* Nok: Contribution #45: encode directional MASA metadata with more bits at 384k and 512k */ -#define FIX_357_DTX_32K /* Eri: issue 357 - Forced LP-CNG at 32k */ #define FIX_435_ISM_MERGE_BUG /* Eri: Merge bug fix for ISM NULL metadata and tcx_only cases */ #define FIX_355_REFACTOR_PARAMBIN_TO_5MS /* Nokia: Fixes issue 355 by refactoring parametric binauralizer code to 5 ms mode */ #define FIX_411_EVS_BE_TESTS_ON_WINDOWS_FAILING /* Eri: Fix incorrect use of stack variable used for channel aware config file */ diff --git a/lib_enc/dtx.c b/lib_enc/dtx.c index 25fca5d2de..1ae231a5eb 100644 --- a/lib_enc/dtx.c +++ b/lib_enc/dtx.c @@ -234,11 +234,7 @@ void dtx( } else { -#ifdef FIX_357_DTX_32K if ( ( st->cng_type == FD_CNG && ( st->total_brate <= MAX_BRATE_DTX_EVS || ( st->element_mode != EVS_MONO && ivas_total_brate <= MAX_BRATE_DTX_IVAS ) ) ) || ( st->element_mode == IVAS_CPE_MDCT ) ) /* at highest bitrates, use exclusively LP_CNG */ -#else - if ( ( st->cng_type == FD_CNG && ( st->total_brate <= MAX_BRATE_DTX_EVS || ( st->element_mode == IVAS_SCE && ivas_total_brate <= MAX_BRATE_DTX_IVAS ) ) ) || ( st->element_mode == IVAS_CPE_MDCT ) ) /* at highest bitrates, use exclusively LP_CNG */ -#endif { if ( st->element_mode == EVS_MONO && ( st->total_brate == ACELP_9k60 || st->total_brate == ACELP_16k40 || st->total_brate == ACELP_24k40 ) ) { -- GitLab From 533e0d367808203f92b6163dd97aa3c0ccd079cd Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 20:07:01 +0200 Subject: [PATCH 264/331] [cleanup] accept FIX_435_ISM_MERGE_BUG --- lib_com/ivas_stat_com.h | 2 -- lib_com/options.h | 1 - lib_enc/ivas_ism_metadata_enc.c | 14 -------------- 3 files changed, 17 deletions(-) diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index 3e2848348a..2eb521cf58 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -76,9 +76,7 @@ typedef struct int16_t ism_md_fec_cnt_enc; /* counter of continuous frames where MD are not transmitted */ int16_t ism_md_inc_diff_cnt; /* counter of continuous frames where MD are transmitted in inactive segments when MD significantly changes */ -#ifdef FIX_435_ISM_MERGE_BUG float last_true_radius; /* last true Q radius value */ -#endif } ISM_METADATA_FRAME, *ISM_METADATA_HANDLE; diff --git a/lib_com/options.h b/lib_com/options.h index 6fc45de264..c10594ef5d 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -154,7 +154,6 @@ #define HR_METADATA /* Nok: Contribution #45: encode directional MASA metadata with more bits at 384k and 512k */ -#define FIX_435_ISM_MERGE_BUG /* Eri: Merge bug fix for ISM NULL metadata and tcx_only cases */ #define FIX_355_REFACTOR_PARAMBIN_TO_5MS /* Nokia: Fixes issue 355 by refactoring parametric binauralizer code to 5 ms mode */ #define FIX_411_EVS_BE_TESTS_ON_WINDOWS_FAILING /* Eri: Fix incorrect use of stack variable used for channel aware config file */ #define COMBINED_FORMAT_SIGNALING /* VA: Introduce a signaling bit for combined format coding */ diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index 7199a77918..c9804601bf 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -59,9 +59,7 @@ #define ISM_MD_FEC_DIFF 10 #define ISM_MD_INC_DIFF_CNT_MAX 6 #define ISM_MD_FEC_CNT_MAX 25 -#ifdef FIX_435_ISM_MERGE_BUG #define ISM_MD_RAD_FEC_DIFF 1 -#endif #define INTER_OBJECT_PARAM_CHECK ( ( ISM_FEC_MAX / 2 ) - 2 ) /* note: constant must be less than (ISM_FEC_MAX / number of coded parameters) */ @@ -225,22 +223,16 @@ ivas_error ivas_ism_metadata_enc( } else if ( ism_mode == ISM_MODE_DISC ) { -#ifdef FIX_435_ISM_MERGE_BUG if ( hIsmMeta[ch]->ism_metadata_flag == 1 ) { /* In case of low level noise for low bitrate inactive frames, do not sent metadata */ hIsmMeta[ch]->ism_metadata_flag = localVAD[ch] || hSCE[ch]->hCoreCoder[0]->lp_noise > 10 || hSCE[ch]->hCoreCoder[0]->tcxonly; -#else - hIsmMeta[ch]->ism_metadata_flag = localVAD[ch] || hSCE[ch]->hCoreCoder[0]->lp_noise > 10; -#endif /* in inactive frames, send MD 1) in ISM_MD_INC_DIFF_CNT_MAX consecutive frames when MD significantly change, 2) at least every ISM_MD_FEC_DIFF frames */ if ( hIsmMeta[ch]->ism_metadata_flag == 0 ) { if ( ( fabsf( hIsmMeta[ch]->azimuth - hIsmMeta[ch]->last_true_azimuth ) > ISM_MD_FEC_DIFF ) || ( fabsf( hIsmMeta[ch]->elevation - hIsmMeta[ch]->last_true_elevation ) > ISM_MD_FEC_DIFF ) -#ifdef FIX_435_ISM_MERGE_BUG || ( fabsf( hIsmMeta[ch]->radius - hIsmMeta[ch]->last_true_radius ) > ISM_MD_RAD_FEC_DIFF ) -#endif ) { hIsmMeta[ch]->ism_metadata_flag = 1; @@ -265,9 +257,7 @@ ivas_error ivas_ism_metadata_enc( hIsmMeta[ch]->position_angle.angle1_diff_cnt = ISM_FEC_MAX; } } -#ifdef FIX_435_ISM_MERGE_BUG } -#endif } } @@ -415,9 +405,7 @@ ivas_error ivas_ism_metadata_enc( /* Updates */ hIsmMeta[ch]->last_true_azimuth = hIsmMeta[ch]->azimuth; hIsmMeta[ch]->last_true_elevation = hIsmMeta[ch]->elevation; -#ifdef FIX_435_ISM_MERGE_BUG hIsmMeta[ch]->last_true_radius = hIsmMeta[ch]->radius; -#endif } } @@ -654,9 +642,7 @@ ivas_error ivas_ism_metadata_enc_create( st_ivas->hIsmMetaData[ch]->last_true_elevation = 0.0f; st_ivas->hIsmMetaData[ch]->ism_md_fec_cnt_enc = 0; st_ivas->hIsmMetaData[ch]->ism_md_inc_diff_cnt = ISM_MD_INC_DIFF_CNT_MAX; -#ifdef FIX_435_ISM_MERGE_BUG st_ivas->hIsmMetaData[ch]->last_true_radius = 1.0f; -#endif } if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, n_ISms, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) -- GitLab From cba6282bf95d712631328079162317ca438a185b Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 20:07:49 +0200 Subject: [PATCH 265/331] [cleanup] accept FIX_355_REFACTOR_PARAMBIN_TO_5MS --- lib_com/ivas_cnst.h | 2 - lib_com/ivas_prot.h | 22 - lib_com/options.h | 1 - lib_dec/ivas_binRenderer_internal.c | 21 - lib_dec/ivas_masa_dec.c | 480 ---- lib_rend/ivas_dirac_dec_binaural_functions.c | 2156 ++---------------- lib_rend/ivas_prot_rend.h | 33 - lib_rend/ivas_reverb.c | 220 -- lib_rend/ivas_sba_rendering.c | 96 - 9 files changed, 127 insertions(+), 2904 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 8ebbe2f711..5c8dba36b1 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -908,9 +908,7 @@ typedef enum { // VE: this should be renamed to e.g. N_SPATIAL_SUBFRAMES #define MAX_PARAM_SPATIAL_SUBFRAMES 4 /* Maximum number of subframes for parameteric spatial coding */ #define L_SPATIAL_SUBFR_48k (L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES) -#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS #define CLDFB_SLOTS_PER_SUBFRAME ( CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES ) /* Number of CLDFB slots per subframe */ -#endif /*----------------------------------------------------------------------------------* diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 8d189157b2..f5d9ed3eed 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5227,36 +5227,14 @@ void ivas_masa_prerender( ); #ifdef JBM_TSM_ON_TCS -#ifndef FIX_355_REFACTOR_PARAMBIN_TO_5MS -void ivas_spar_param_to_masa_param_mapping_sf( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ - int16_t azimuth[CLDFB_NO_CHANNELS_MAX], - int16_t elevation[CLDFB_NO_CHANNELS_MAX], - float energy_ratio1[CLDFB_NO_CHANNELS_MAX], - float spreadCoherence[CLDFB_NO_CHANNELS_MAX], - float surroundingCoherence[CLDFB_NO_CHANNELS_MAX], - float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ - float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /* i : Input audio in CLDFB domain, imag */ -); -#endif #endif -#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS void ivas_spar_param_to_masa_param_mapping( Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, imag */ const int16_t subframe /* i : Subframe to map */ ); -#else -void ivas_spar_param_to_masa_param_mapping( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ - float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ - float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, imag */ - const int16_t firstSubframe, /* i : First subframe to map */ - const int16_t nSubframes /* i : Number of subframes to map */ -); -#endif /*---------------------------------------------------------------------------------* diff --git a/lib_com/options.h b/lib_com/options.h index c10594ef5d..424902e6f1 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -154,7 +154,6 @@ #define HR_METADATA /* Nok: Contribution #45: encode directional MASA metadata with more bits at 384k and 512k */ -#define FIX_355_REFACTOR_PARAMBIN_TO_5MS /* Nokia: Fixes issue 355 by refactoring parametric binauralizer code to 5 ms mode */ #define FIX_411_EVS_BE_TESTS_ON_WINDOWS_FAILING /* Eri: Fix incorrect use of stack variable used for channel aware config file */ #define COMBINED_FORMAT_SIGNALING /* VA: Introduce a signaling bit for combined format coding */ #define FIX_446_STEREO_DMX_CRASH /* FhG: fix discrepancy with EVS code that could cause crashes in rare cases */ diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index bfe0a4bb53..d64e5d1cb5 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -433,7 +433,6 @@ static ivas_error ivas_binaural_hrtf_open( * *-------------------------------------------------------------------------*/ -#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS static void ivas_binaural_obtain_DMX( const int16_t numTimeSlots, BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: fastconv binaural renderer handle */ @@ -441,15 +440,6 @@ static void ivas_binaural_obtain_DMX( float ImagBuffer[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Contains the LS signals */ float realDMX[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float imagDMX[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] ) -#else -static void ivas_binaural_obtain_DMX( - const int16_t numTimeSlots, - BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: fastconv binaural renderer handle */ - float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : Contains the LS signals */ - float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : Contains the LS signals */ - float realDMX[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - float imagDMX[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX] ) -#endif { int16_t chIdx, bandIdx, k; @@ -1183,17 +1173,10 @@ void ivas_binRenderer( /* Obtain the binaural dmx and compute the reverb */ if ( hBinRenderer->hReverb != NULL ) { -#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS float reverbRe[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; float reverbIm[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; float inRe[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; float inIm[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; -#else - float reverbRe[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - float reverbIm[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - float inRe[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - float inIm[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; -#endif ivas_binaural_obtain_DMX( numTimeSlots, hBinRenderer, RealBuffer, ImagBuffer, inRe, inIm ); for ( chIdx = 0; chIdx < BINAURAL_CHANNELS; chIdx++ ) @@ -1205,15 +1188,11 @@ void ivas_binRenderer( } } -#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS #ifdef JBM_TSM_ON_TCS ivas_binaural_reverb_processSubframe( hBinRenderer->hReverb, BINAURAL_CHANNELS, numTimeSlots, inRe, inIm, reverbRe, reverbIm ); #else ivas_binaural_reverb_processSubframe( hBinRenderer->hReverb, BINAURAL_CHANNELS, inRe, inIm, reverbRe, reverbIm ); #endif -#else - ivas_binaural_reverb_processFrame( hBinRenderer->hReverb, BINAURAL_CHANNELS, inRe, inIm, reverbRe, reverbIm, 0u ); -#endif /* Add the conv module and reverb module output */ for ( chIdx = 0; chIdx < BINAURAL_CHANNELS; chIdx++ ) diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 15dd2e692e..38665a098d 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -1291,251 +1291,8 @@ ivas_error ivas_masa_dec_reconfigure( #ifdef JBM_TSM_ON_TCS -#ifndef FIX_355_REFACTOR_PARAMBIN_TO_5MS -/*-------------------------------------------------------------------* - * ivas_spar_param_to_masa_param_mapping() - * - * Determine MASA metadata from the SPAR metadata - *-------------------------------------------------------------------*/ -void ivas_spar_param_to_masa_param_mapping_sf( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ - int16_t azimuth[CLDFB_NO_CHANNELS_MAX], - int16_t elevation[CLDFB_NO_CHANNELS_MAX], - float energy_ratio1[CLDFB_NO_CHANNELS_MAX], - float spreadCoherence[CLDFB_NO_CHANNELS_MAX], - float surroundingCoherence[CLDFB_NO_CHANNELS_MAX], - float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ - float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /* i : Input audio in CLDFB domain, imag */ -) -{ - int16_t i, j, sf, band, bin, slot, ch, nBins, nchan_transport; - int16_t mixer_mat_index; - DIRAC_DEC_HANDLE hDirAC; - SPAR_DEC_HANDLE hSpar; - DIFFUSE_DISTRIBUTION_HANDLE hDiffuseDist; - float mixer_mat_sf_bands_real[SPAR_DIRAC_SPLIT_START_BAND][FOA_CHANNELS][FOA_CHANNELS]; - float mixer_mat_sf_bins_real[CLDFB_NO_CHANNELS_MAX][FOA_CHANNELS][FOA_CHANNELS]; - int16_t *band_grouping; - int16_t band_start, band_end; - float transportSignalEnergies[2][CLDFB_NO_CHANNELS_MAX]; - float transportSignalCrossCorrelation[CLDFB_NO_CHANNELS_MAX]; - float instEne; - float inCovarianceMtx[FOA_CHANNELS][FOA_CHANNELS]; - float foaCovarianceMtx[FOA_CHANNELS][FOA_CHANNELS]; - float Iy, Iz, Ix, E, azi, ele, I, ratio; - float diffuseGainX, diffuseGainY, diffuseGainZ, diffuseGainSum; - int16_t slot_idx_start; - int16_t slot_idx; - float slot_fac; - int16_t subframe_idx; - - - /* Set values */ - hDirAC = st_ivas->hDirAC; - hSpar = st_ivas->hSpar; - hDirAC->numSimultaneousDirections = 1; - hDiffuseDist = st_ivas->hDirAC->hDiffuseDist; - nchan_transport = st_ivas->nchan_transport; - band_grouping = hDirAC->band_grouping; - subframe_idx = hSpar->subframes_rendered; - slot_idx_start = hSpar->slots_rendered; - - /* Init arrays */ - for ( i = 0; i < FOA_CHANNELS; i++ ) - { - set_zero( inCovarianceMtx[i], FOA_CHANNELS ); - } - for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ ) - { - for ( i = 0; i < FOA_CHANNELS; i++ ) - { - for ( j = 0; j < FOA_CHANNELS; j++ ) - { - mixer_mat_sf_bands_real[band][i][j] = 0.0f; - } - } - } - - - slot_fac = 1.0f / (float) hSpar->subframe_nbslots[subframe_idx]; - - /* Delay the SPAR mixing matrices to have them synced with the audio */ - for ( slot_idx = 0; slot_idx < hSpar->subframe_nbslots[subframe_idx]; slot_idx++ ) - { - sf = hSpar->render_to_md_map[slot_idx + slot_idx_start] / JBM_CLDFB_SLOTS_IN_SUBFRAME; - if ( sf < SPAR_META_DELAY_SUBFRAMES ) - { - mixer_mat_index = sf + MAX_PARAM_SPATIAL_SUBFRAMES - SPAR_META_DELAY_SUBFRAMES + 1; - for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ ) - { - for ( i = 0; i < FOA_CHANNELS; i++ ) - { - for ( j = 0; j < FOA_CHANNELS; j++ ) - { - mixer_mat_sf_bands_real[band][i][j] += slot_fac * st_ivas->hSpar->hMdDec->mixer_mat_prev[mixer_mat_index][i][j][band]; - } - } - } - } - else - { - mixer_mat_index = sf - SPAR_META_DELAY_SUBFRAMES; - for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ ) - { - for ( i = 0; i < FOA_CHANNELS; i++ ) - { - for ( j = 0; j < FOA_CHANNELS; j++ ) - { - mixer_mat_sf_bands_real[band][i][j] += slot_fac * st_ivas->hSpar->hMdDec->mixer_mat[i][j][band + mixer_mat_index * IVAS_MAX_NUM_BANDS]; - } - } - } - } - } - - /* Map the mixing matrices from the frequency bands to frequency bins */ - bin = 0; - - for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ ) - { - band_start = band_grouping[band]; - band_end = band_grouping[band + 1]; - for ( bin = band_start; bin < band_end; bin++ ) - { - for ( i = 0; i < FOA_CHANNELS; i++ ) - { - for ( j = 0; j < FOA_CHANNELS; j++ ) - { - mixer_mat_sf_bins_real[bin][i][j] = mixer_mat_sf_bands_real[band][i][j]; - } - } - } - } - - nBins = bin; - - - /* Determine MASA metadata */ - - /* Determine transport signal energies and cross correlations when more than 1 TC */ - if ( nchan_transport == 2 ) - { - set_zero( transportSignalEnergies[0], nBins ); - set_zero( transportSignalEnergies[1], nBins ); - set_zero( transportSignalCrossCorrelation, nBins ); - for ( slot = 0; slot < hDirAC->subframe_nbslots[subframe_idx]; slot++ ) - - { - for ( bin = 0; bin < nBins; bin++ ) - { - for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - instEne = ( inRe[ch][slot][bin] * inRe[ch][slot][bin] ); - instEne += ( inIm[ch][slot][bin] * inIm[ch][slot][bin] ); - transportSignalEnergies[ch][bin] += instEne; - } - transportSignalCrossCorrelation[bin] += inRe[0][slot][bin] * inRe[1][slot][bin]; - transportSignalCrossCorrelation[bin] += inIm[0][slot][bin] * inIm[1][slot][bin]; - } - } - } - - if ( hDiffuseDist != NULL ) - { - set_zero( hDiffuseDist->diffuseRatioX, CLDFB_NO_CHANNELS_MAX ); - set_zero( hDiffuseDist->diffuseRatioY, CLDFB_NO_CHANNELS_MAX ); - set_zero( hDiffuseDist->diffuseRatioZ, CLDFB_NO_CHANNELS_MAX ); - } - - for ( bin = 0; bin < nBins; bin++ ) - { - /* Set the energy of the first transport signal */ - if ( nchan_transport == 1 ) - { - inCovarianceMtx[0][0] = 1.0f; /* In case of 1TC, fixed value can be used */ - } - else - { - inCovarianceMtx[0][0] = transportSignalEnergies[0][bin]; /* In case of 2TC, use actual energies */ - } - /* Decorrelated channels assumed to have the same energy as the source channel */ - inCovarianceMtx[1][1] = inCovarianceMtx[0][0]; - inCovarianceMtx[2][2] = inCovarianceMtx[0][0]; - inCovarianceMtx[3][3] = inCovarianceMtx[0][0]; - - /* In case residuals were transmitted, use their actual energies and cross correlations */ - if ( nchan_transport == 2 ) - { - inCovarianceMtx[1][1] = transportSignalEnergies[1][bin]; - inCovarianceMtx[0][1] = transportSignalCrossCorrelation[bin]; - inCovarianceMtx[1][0] = inCovarianceMtx[0][1]; - } - - compute_foa_cov_matrix( foaCovarianceMtx, inCovarianceMtx, mixer_mat_sf_bins_real[bin] ); - - /* Estimate MASA metadata */ - Iy = foaCovarianceMtx[0][1]; /* Intensity in Y direction */ - Iz = foaCovarianceMtx[0][2]; /* Intensity in Z direction */ - Ix = foaCovarianceMtx[0][3]; /* Intensity in X direction */ - I = sqrtf( Ix * Ix + Iy * Iy + Iz * Iz ); /* Intensity vector length */ - E = ( foaCovarianceMtx[0][0] + foaCovarianceMtx[1][1] + foaCovarianceMtx[2][2] + foaCovarianceMtx[3][3] ) / 2.0f; /* Overall energy */ - azi = atan2f( Iy, Ix ); /* Azimuth */ - ele = atan2f( Iz, sqrtf( Ix * Ix + Iy * Iy ) ); /* Elevation */ - ratio = I / fmaxf( 1e-12f, E ); /* Energy ratio */ - ratio = fmaxf( 0.0f, fminf( 1.0f, ratio ) ); - - azimuth[bin] = (int16_t) roundf( azi / PI_OVER_180 ); - elevation[bin] = (int16_t) roundf( ele / PI_OVER_180 ); - energy_ratio1[bin] = ratio; - - spreadCoherence[bin] = 0.0f; - surroundingCoherence[bin] = 0.0f; - - /* Determine directional distribution of the indirect audio based on the SPAR mixing matrices (and the transport audio signals when 2 TC) */ - if ( hDiffuseDist != NULL ) - { - if ( nchan_transport == 1 ) - { - diffuseGainY = fabsf( mixer_mat_sf_bins_real[bin][1][1] ); - diffuseGainX = fabsf( mixer_mat_sf_bins_real[bin][3][2] ); - diffuseGainZ = fabsf( mixer_mat_sf_bins_real[bin][2][3] ); - } - else if ( nchan_transport == 2 ) - { - diffuseGainY = fabsf( mixer_mat_sf_bins_real[bin][1][1] * transportSignalEnergies[1][bin] ); - diffuseGainX = fabsf( mixer_mat_sf_bins_real[bin][3][2] * transportSignalEnergies[0][bin] ) + fabsf( mixer_mat_sf_bins_real[bin][3][1] * transportSignalEnergies[1][bin] ); - diffuseGainZ = fabsf( mixer_mat_sf_bins_real[bin][2][3] * transportSignalEnergies[0][bin] ) + fabsf( mixer_mat_sf_bins_real[bin][2][1] * transportSignalEnergies[1][bin] ); - } - else - { - diffuseGainY = 1.0f; - diffuseGainX = 1.0f; - diffuseGainZ = 1.0f; - } - - diffuseGainSum = diffuseGainY + diffuseGainX + diffuseGainZ; - - if ( diffuseGainSum == 0.0f ) - { - hDiffuseDist->diffuseRatioX[bin] = 1.0f / 3.0f; - hDiffuseDist->diffuseRatioY[bin] = 1.0f / 3.0f; - hDiffuseDist->diffuseRatioZ[bin] = 1.0f / 3.0f; - } - else - { - hDiffuseDist->diffuseRatioX[bin] = diffuseGainX / ( diffuseGainSum + EPSILON ); - hDiffuseDist->diffuseRatioY[bin] = diffuseGainY / ( diffuseGainSum + EPSILON ); - hDiffuseDist->diffuseRatioZ[bin] = diffuseGainZ / ( diffuseGainSum + EPSILON ); - } - } - } - - return; -} -#endif #endif -#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS void ivas_spar_param_to_masa_param_mapping( Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ @@ -1803,243 +1560,6 @@ void ivas_spar_param_to_masa_param_mapping( return; } -#else -void ivas_spar_param_to_masa_param_mapping( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ - float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ - float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, imag */ - const int16_t firstSubframe, /* i : First subframe to map */ - const int16_t nSubframes /* i : Number of subframes to map */ -) -{ - int16_t i, j, sf, band, bin, slot, ch, nBins, nchan_transport; - int16_t mixer_mat_index; - int16_t dirac_write_idx; - DIRAC_DEC_HANDLE hDirAC; - DIFFUSE_DISTRIBUTION_HANDLE hDiffuseDist; - float mixer_mat_sf_bands_real[MAX_PARAM_SPATIAL_SUBFRAMES][SPAR_DIRAC_SPLIT_START_BAND][FOA_CHANNELS][FOA_CHANNELS]; - float mixer_mat_sf_bins_real[MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX][FOA_CHANNELS][FOA_CHANNELS]; - int16_t *band_grouping; - int16_t band_start, band_end; - float transportSignalEnergies[2][CLDFB_NO_CHANNELS_MAX]; - float transportSignalCrossCorrelation[CLDFB_NO_CHANNELS_MAX]; - float instEne; - float inCovarianceMtx[FOA_CHANNELS][FOA_CHANNELS]; - float foaCovarianceMtx[FOA_CHANNELS][FOA_CHANNELS]; - float Iy, Iz, Ix, E, azi, ele, I, ratio; - float diffuseGainX, diffuseGainY, diffuseGainZ, diffuseGainSum; -#ifdef JBM_TSM_ON_TCS - int16_t slot_idx_start; -#endif - - /* Set values */ - hDirAC = st_ivas->hDirAC; - hDirAC->numSimultaneousDirections = 1; - hDiffuseDist = st_ivas->hDirAC->hDiffuseDist; - nchan_transport = st_ivas->nchan_transport; - band_grouping = hDirAC->band_grouping; - dirac_write_idx = hDirAC->dirac_read_idx; /* Mixing matrices, from which MASA meta is determined, already have the delay compensation */ - - /* Init arrays */ - for ( i = 0; i < FOA_CHANNELS; i++ ) - { - set_zero( inCovarianceMtx[i], FOA_CHANNELS ); - } - - /* Delay the SPAR mixing matrices to have them synced with the audio */ - for ( sf = firstSubframe; sf < ( firstSubframe + nSubframes ); sf++ ) - { - if ( sf < SPAR_META_DELAY_SUBFRAMES ) - { - mixer_mat_index = sf + MAX_PARAM_SPATIAL_SUBFRAMES - SPAR_META_DELAY_SUBFRAMES + 1; - for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ ) - { - for ( i = 0; i < FOA_CHANNELS; i++ ) - { - for ( j = 0; j < FOA_CHANNELS; j++ ) - { - mixer_mat_sf_bands_real[sf][band][i][j] = st_ivas->hSpar->hMdDec->mixer_mat_prev[mixer_mat_index][i][j][band]; - } - } - } - } - else - { - mixer_mat_index = sf - SPAR_META_DELAY_SUBFRAMES; - for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ ) - { - for ( i = 0; i < FOA_CHANNELS; i++ ) - { - for ( j = 0; j < FOA_CHANNELS; j++ ) - { - mixer_mat_sf_bands_real[sf][band][i][j] = st_ivas->hSpar->hMdDec->mixer_mat[i][j][band + mixer_mat_index * IVAS_MAX_NUM_BANDS]; - } - } - } - } - } - - /* Map the mixing matrices from the frequency bands to frequency bins */ - bin = 0; - for ( sf = firstSubframe; sf < ( firstSubframe + nSubframes ); sf++ ) - { - for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ ) - { - band_start = band_grouping[band]; - band_end = band_grouping[band + 1]; - for ( bin = band_start; bin < band_end; bin++ ) - { - for ( i = 0; i < FOA_CHANNELS; i++ ) - { - for ( j = 0; j < FOA_CHANNELS; j++ ) - { - mixer_mat_sf_bins_real[sf][bin][i][j] = mixer_mat_sf_bands_real[sf][band][i][j]; - } - } - } - } - } - nBins = bin; - -#ifdef JBM_TSM_ON_TCS - slot_idx_start = st_ivas->hSpar->slots_rendered; -#endif - - /* Determine MASA metadata */ - for ( sf = firstSubframe; sf < ( firstSubframe + nSubframes ); sf++ ) - { - /* Determine transport signal energies and cross correlations when more than 1 TC */ - if ( nchan_transport == 2 ) - { - set_zero( transportSignalEnergies[0], nBins ); - set_zero( transportSignalEnergies[1], nBins ); - set_zero( transportSignalCrossCorrelation, nBins ); -#ifdef JBM_TSM_ON_TCS - for ( slot = 0; slot < (uint8_t) hDirAC->subframe_nbslots[sf]; slot++ ) -#else - for ( slot = 0; slot < (uint8_t) hDirAC->subframe_nbslots; slot++ ) -#endif - { -#ifdef JBM_TSM_ON_TCS - int16_t slotThis = slot + slot_idx_start; -#else - int16_t slotThis = slot + ( hDirAC->subframe_nbslots * sf ); -#endif - - for ( bin = 0; bin < nBins; bin++ ) - { - for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - instEne = ( inRe[ch][slotThis][bin] * inRe[ch][slotThis][bin] ); - instEne += ( inIm[ch][slotThis][bin] * inIm[ch][slotThis][bin] ); - transportSignalEnergies[ch][bin] += instEne; - } - transportSignalCrossCorrelation[bin] += inRe[0][slotThis][bin] * inRe[1][slotThis][bin]; - transportSignalCrossCorrelation[bin] += inIm[0][slotThis][bin] * inIm[1][slotThis][bin]; - } - } - } - - if ( hDiffuseDist != NULL ) - { - set_zero( hDiffuseDist->diffuseRatioX[sf], CLDFB_NO_CHANNELS_MAX ); - set_zero( hDiffuseDist->diffuseRatioY[sf], CLDFB_NO_CHANNELS_MAX ); - set_zero( hDiffuseDist->diffuseRatioZ[sf], CLDFB_NO_CHANNELS_MAX ); - } - - for ( bin = 0; bin < nBins; bin++ ) - { - /* Set the energy of the first transport signal */ - if ( nchan_transport == 1 ) - { - inCovarianceMtx[0][0] = 1.0f; /* In case of 1TC, fixed value can be used */ - } - else - { - inCovarianceMtx[0][0] = transportSignalEnergies[0][bin]; /* In case of 2TC, use actual energies */ - } - /* Decorrelated channels assumed to have the same energy as the source channel */ - inCovarianceMtx[1][1] = inCovarianceMtx[0][0]; - inCovarianceMtx[2][2] = inCovarianceMtx[0][0]; - inCovarianceMtx[3][3] = inCovarianceMtx[0][0]; - - /* In case residuals were transmitted, use their actual energies and cross correlations */ - if ( nchan_transport == 2 ) - { - inCovarianceMtx[1][1] = transportSignalEnergies[1][bin]; - inCovarianceMtx[0][1] = transportSignalCrossCorrelation[bin]; - inCovarianceMtx[1][0] = inCovarianceMtx[0][1]; - } - - compute_foa_cov_matrix( foaCovarianceMtx, inCovarianceMtx, mixer_mat_sf_bins_real[sf][bin] ); - - /* Estimate MASA metadata */ - Iy = foaCovarianceMtx[0][1]; /* Intensity in Y direction */ - Iz = foaCovarianceMtx[0][2]; /* Intensity in Z direction */ - Ix = foaCovarianceMtx[0][3]; /* Intensity in X direction */ - I = sqrtf( Ix * Ix + Iy * Iy + Iz * Iz ); /* Intensity vector length */ - E = ( foaCovarianceMtx[0][0] + foaCovarianceMtx[1][1] + foaCovarianceMtx[2][2] + foaCovarianceMtx[3][3] ) / 2.0f; /* Overall energy */ - azi = atan2f( Iy, Ix ); /* Azimuth */ - ele = atan2f( Iz, sqrtf( Ix * Ix + Iy * Iy ) ); /* Elevation */ - ratio = I / fmaxf( 1e-12f, E ); /* Energy ratio */ - ratio = fmaxf( 0.0f, fminf( 1.0f, ratio ) ); - - hDirAC->azimuth[dirac_write_idx][bin] = (int16_t) roundf( azi / PI_OVER_180 ); - hDirAC->elevation[dirac_write_idx][bin] = (int16_t) roundf( ele / PI_OVER_180 ); - hDirAC->energy_ratio1[dirac_write_idx][bin] = ratio; - hDirAC->diffuseness_vector[dirac_write_idx][bin] = 1.0f - ratio; - - hDirAC->spreadCoherence[dirac_write_idx][bin] = 0.0f; - hDirAC->surroundingCoherence[dirac_write_idx][bin] = 0.0f; - - /* Determine directional distribution of the indirect audio based on the SPAR mixing matrices (and the transport audio signals when 2 TC) */ - if ( hDiffuseDist != NULL ) - { - if ( nchan_transport == 1 ) - { - diffuseGainY = fabsf( mixer_mat_sf_bins_real[sf][bin][1][1] ); - diffuseGainX = fabsf( mixer_mat_sf_bins_real[sf][bin][3][2] ); - diffuseGainZ = fabsf( mixer_mat_sf_bins_real[sf][bin][2][3] ); - } - else if ( nchan_transport == 2 ) - { - diffuseGainY = fabsf( mixer_mat_sf_bins_real[sf][bin][1][1] * transportSignalEnergies[1][bin] ); - diffuseGainX = fabsf( mixer_mat_sf_bins_real[sf][bin][3][2] * transportSignalEnergies[0][bin] ) + fabsf( mixer_mat_sf_bins_real[sf][bin][3][1] * transportSignalEnergies[1][bin] ); - diffuseGainZ = fabsf( mixer_mat_sf_bins_real[sf][bin][2][3] * transportSignalEnergies[0][bin] ) + fabsf( mixer_mat_sf_bins_real[sf][bin][2][1] * transportSignalEnergies[1][bin] ); - } - else - { - diffuseGainY = 1.0f; - diffuseGainX = 1.0f; - diffuseGainZ = 1.0f; - } - - diffuseGainSum = diffuseGainY + diffuseGainX + diffuseGainZ; - - if ( diffuseGainSum == 0.0f ) - { - hDiffuseDist->diffuseRatioX[sf][bin] = 1.0f / 3.0f; - hDiffuseDist->diffuseRatioY[sf][bin] = 1.0f / 3.0f; - hDiffuseDist->diffuseRatioZ[sf][bin] = 1.0f / 3.0f; - } - else - { - hDiffuseDist->diffuseRatioX[sf][bin] = diffuseGainX / ( diffuseGainSum + EPSILON ); - hDiffuseDist->diffuseRatioY[sf][bin] = diffuseGainY / ( diffuseGainSum + EPSILON ); - hDiffuseDist->diffuseRatioZ[sf][bin] = diffuseGainZ / ( diffuseGainSum + EPSILON ); - } - } - } - - dirac_write_idx = ( dirac_write_idx + 1 ) % hDirAC->dirac_md_buffer_length; -#ifdef JBM_TSM_ON_TCS - slot_idx_start += st_ivas->hSpar->subframe_nbslots[sf]; -#endif - } - - return; -} -#endif /* Estimate FOA properties: foaCov = mixMtx * inCov * mixMtx' */ diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index ed9d5d3b3c..5e70957e26 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -68,7 +68,6 @@ * Local function prototypes *------------------------------------------------------------------------*/ -#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS #ifdef JBM_TSM_ON_TCS static void ivas_dirac_dec_binaural_internal( Decoder_Struct *st_ivas, float *output_f[], const int16_t nchan_transport, const int16_t subframe ); #else @@ -77,17 +76,9 @@ static void ivas_dirac_dec_binaural_internal( Decoder_Struct *st_ivas, float out static void ivas_dirac_dec_decorrelate_slot( DIRAC_DEC_HANDLE hDirAC, const int16_t slot, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float decRe[][CLDFB_NO_CHANNELS_MAX], float decIm[][CLDFB_NO_CHANNELS_MAX] ); static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( Decoder_Struct *st_ivas, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float Rmat[3][3], const int16_t subframe ); -#else -static void ivas_dirac_dec_binaural_internal( Decoder_Struct *st_ivas, float output_f[][L_FRAME48k], const int16_t nchan_transport, const uint8_t firstSubframe, const uint8_t nSubframes ); - -static void ivas_dirac_dec_decorrelate_slot( DIRAC_DEC_HANDLE hDirAC, const int8_t slot, float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float decRe[][CLDFB_NO_CHANNELS_MAX], float decIm[][CLDFB_NO_CHANNELS_MAX] ); - -static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( Decoder_Struct *st_ivas, float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float Rmat[3][3], const uint8_t firstSubframe, const uint8_t nSubFrames ); -#endif static void ivas_dirac_dec_binaural_determine_processing_matrices( Decoder_Struct *st_ivas, const int16_t max_band_decorr, float Rmat[3][3] ); -#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS #ifdef JBM_TSM_ON_TCS static void ivas_dirac_dec_binaural_process_output( Decoder_Struct *st_ivas, float *output_f[], float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t max_band_decorr, const int16_t numInChannels, const int16_t subframe ); @@ -102,14 +93,6 @@ static void adaptTransportSignalsHeadtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackD static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, float Rmat[3][3] ); #endif -#else -static void ivas_dirac_dec_binaural_process_output( Decoder_Struct *st_ivas, float output_f[][L_FRAME48k], float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], const int16_t max_band_decorr, const uint8_t numInputChannels, const uint8_t firstSlot, const uint8_t slotEnd ); - -static void adaptTransportSignalsHeadtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], const uint8_t firstSlot, const uint8_t slotEnd, const uint8_t nBins, float Rmat[3][3] ); - -static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], const uint8_t firstSlot, const uint8_t slotEnd, const uint8_t nBins, float Rmat[3][3] ); - -#endif static void formulate2x2MixingMatrix( float Ein1, float Ein2, float CinRe, float CinIm, float Eout1, float Eout2, float CoutRe, float CoutIm, float Q[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Mre[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Mim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], const float regularizationFactor ); @@ -123,17 +106,6 @@ static void matrixTransp2Mul( float Are[BINAURAL_CHANNELS][BINAURAL_CHANNELS], f #ifdef JBM_TSM_ON_TCS -#ifndef FIX_355_REFACTOR_PARAMBIN_TO_5MS -static void ivas_dirac_dec_binaural_process_output_sf( Decoder_Struct *st_ivas, float *output_f[], float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t max_band_decorr, const uint8_t numInChannels ); - -static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked_sf( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const uint8_t slotEnd, const uint8_t nBins, float Rmat[3][3] ); - -static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices_sf( Decoder_Struct *st_ivas, float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], int16_t azimuth[CLDFB_NO_CHANNELS_MAX], int16_t elevation[CLDFB_NO_CHANNELS_MAX], float energy_ratio1[CLDFB_NO_CHANNELS_MAX], float spreadCoherence[CLDFB_NO_CHANNELS_MAX], float surroundingCoherence[CLDFB_NO_CHANNELS_MAX], float Rmat[3][3] ); - -static void ivas_dirac_dec_binaural_internal_sf( Decoder_Struct *st_ivas, float *output_f[], const int16_t nchan_transport ); - -static void ivas_dirac_dec_decorrelate_slot_sf( DIRAC_DEC_HANDLE hDirAC, const int8_t slot, float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float decRe[][CLDFB_NO_CHANNELS_MAX], float decIm[][CLDFB_NO_CHANNELS_MAX] ); -#endif #endif /*------------------------------------------------------------------------- * ivas_dirac_dec_init_binaural_data() @@ -193,9 +165,6 @@ ivas_error ivas_dirac_dec_init_binaural_data( set_zero( hBinaural->ChCrossImOutPrev, nBins ); hBinaural->renderStereoOutputInsteadOfBinaural = 0; -#ifndef FIX_355_REFACTOR_PARAMBIN_TO_5MS - hBinaural->useSubframeMode = 1; -#endif for ( bin = 0; bin < nBins; bin++ ) @@ -223,7 +192,6 @@ ivas_error ivas_dirac_dec_init_binaural_data( mvr2r( hHrtfParambin->parametricEarlyPartEneCorrection, hBinaural->earlyPartEneCorrection, nBins ); /* reconfiguration needed when Reverb. parameters are changed -> close and open the handle again */ -#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS if ( hBinaural->hReverb != NULL && ( ( hBinaural->hReverb->numBins != nBins ) || ( hBinaural->hReverb->blockSize != CLDFB_SLOTS_PER_SUBFRAME ) ) ) { @@ -232,18 +200,6 @@ ivas_error ivas_dirac_dec_init_binaural_data( if ( hBinaural->hReverb == NULL ) { -#if defined( JBM_TSM_ON_TCS ) && !defined( FIX_355_REFACTOR_PARAMBIN_TO_5MS ) - int16_t reverbBlockSize = st_ivas->hDecoderConfig->voip_active ? 1 : CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; - if ( ( error = ivas_binaural_reverb_open( &hBinaural->hReverb, - nBins, - reverbBlockSize, NULL, - st_ivas->hIntSetup.output_config, - output_Fs, - RENDERER_BINAURAL_PARAMETRIC_ROOM, - st_ivas->hHrtfFastConv, - st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) - -#else if ( ( error = ivas_binaural_reverb_open( &hBinaural->hReverb, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, NULL, @@ -252,65 +208,10 @@ ivas_error ivas_dirac_dec_init_binaural_data( RENDERER_BINAURAL_PARAMETRIC_ROOM, st_ivas->hHrtfFastConv, st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) -#endif { return error; } } -#else - if ( hBinaural->hReverb != NULL && ( ( hBinaural->hReverb->numBins != nBins ) || - ( hBinaural->useSubframeMode && hBinaural->hReverb->blockSize != CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES ) || - ( !hBinaural->useSubframeMode && hBinaural->hReverb->blockSize != CLDFB_NO_COL_MAX ) ) ) - { - ivas_binaural_reverb_close( &( hBinaural->hReverb ) ); - } - - if ( hBinaural->hReverb == NULL ) - { - if ( hBinaural->useSubframeMode ) - { -#ifdef JBM_TSM_ON_TCS - reverbBlockSize = st_ivas->hDecoderConfig->voip_active ? 1 : CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; - if ( ( error = ivas_binaural_reverb_open( &hBinaural->hReverb, - nBins, - reverbBlockSize, NULL, - st_ivas->hIntSetup.output_config, - output_Fs, - RENDERER_BINAURAL_PARAMETRIC_ROOM, - st_ivas->hHrtfFastConv, - st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) - -#else - if ( ( error = ivas_binaural_reverb_open( &hBinaural->hReverb, - nBins, - CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, NULL, - st_ivas->hIntSetup.output_config, - output_Fs, - RENDERER_BINAURAL_PARAMETRIC_ROOM, - st_ivas->hHrtfFastConv, - st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) -#endif - { - return error; - } - } - else - { - if ( ( error = ivas_binaural_reverb_open( &hBinaural->hReverb, - nBins, - CLDFB_NO_COL_MAX, - NULL, - st_ivas->hIntSetup.output_config, - output_Fs, - RENDERER_BINAURAL_PARAMETRIC_ROOM, - st_ivas->hHrtfFastConv, - st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) - { - return error; - } - } - } -#endif } else if ( renderer_type == RENDERER_STEREO_PARAMETRIC ) { @@ -472,11 +373,7 @@ void ivas_dirac_dec_binaural_render( for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) { int16_t n_samples_sf = slot_size * hDirAC->subframe_nbslots[subframe_idx]; -#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS ivas_dirac_dec_binaural_internal( st_ivas, output_f_local, nchan_transport, subframe_idx ); -#else - ivas_dirac_dec_binaural_internal_sf( st_ivas, output_f_local, nchan_transport ); -#endif for ( ch = 0; ch < nchan_out; ch++ ) { output_f_local[ch] += n_samples_sf; @@ -504,9 +401,7 @@ void ivas_dirac_dec_binaural( const int16_t nchan_transport /* i : number of transport channels */ ) { -#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS int16_t subframe; -#endif #ifdef JBM_TSM_ON_TCS float cng_td_buffer[L_FRAME16k]; float *p_output[MAX_OUTPUT_CHANNELS]; @@ -570,7 +465,6 @@ void ivas_dirac_dec_binaural( } #endif -#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS for ( subframe = 0; subframe < MAX_PARAM_SPATIAL_SUBFRAMES; subframe++ ) { #ifdef JBM_TSM_ON_TCS @@ -585,20 +479,6 @@ void ivas_dirac_dec_binaural( ivas_dirac_dec_binaural_internal( st_ivas, output_f, nchan_transport, subframe ); #endif } -#else - if ( st_ivas->hDiracDecBin->useSubframeMode ) - { - uint8_t subframe; - for ( subframe = 0; subframe < MAX_PARAM_SPATIAL_SUBFRAMES; subframe++ ) - { - ivas_dirac_dec_binaural_internal( st_ivas, output_f, nchan_transport, subframe, 1u ); - } - } - else - { - ivas_dirac_dec_binaural_internal( st_ivas, output_f, nchan_transport, 0u, (uint8_t) MAX_PARAM_SPATIAL_SUBFRAMES ); - } -#endif #ifdef JBM_TSM_ON_TCS for ( ch = 0; ch < 2 * BINAURAL_CHANNELS; ch++ ) { @@ -613,209 +493,8 @@ void ivas_dirac_dec_binaural( * Local functions *------------------------------------------------------------------------*/ #ifdef JBM_TSM_ON_TCS -#ifndef FIX_355_REFACTOR_PARAMBIN_TO_5MS -static void ivas_dirac_dec_binaural_internal_sf( - Decoder_Struct *st_ivas, - float *output_f[], - const int16_t nchan_transport ) -{ - DIRAC_DEC_HANDLE hDirAC; - uint8_t slot, ch, nBins, numInChannels; - float Cldfb_RealBuffer_in[2 * BINAURAL_CHANNELS][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; - float Cldfb_ImagBuffer_in[2 * BINAURAL_CHANNELS][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; - /* local copies of azi, ele, diffuseness */ - int16_t azimuth[CLDFB_NO_CHANNELS_MAX]; - int16_t elevation[CLDFB_NO_CHANNELS_MAX]; - float spreadCoherence[CLDFB_NO_CHANNELS_MAX]; - float surroundingCoherence[CLDFB_NO_CHANNELS_MAX]; - float energy_ratio1[CLDFB_NO_CHANNELS_MAX]; - float Rmat[3][3]; - uint16_t subframe_idx, slot_idx_start; - int16_t max_band_decorr; - DIFFUSE_DISTRIBUTION_DATA diffuseDistData; - - - hDirAC = st_ivas->hDirAC; - nBins = (uint8_t) hDirAC->num_freq_bands; - - /* The input channel number at this processing function (not nchan_transport) */ - numInChannels = BINAURAL_CHANNELS; - if ( st_ivas->hOutSetup.separateChannelEnabled ) - { - numInChannels++; - } - - Rmat[0][0] = 1.0f; - Rmat[0][1] = 0.0f; - Rmat[0][2] = 0.0f; - - Rmat[1][0] = 0.0f; - Rmat[1][1] = 1.0f; - Rmat[1][2] = 0.0f; - - Rmat[2][0] = 0.0f; - Rmat[2][1] = 0.0f; - Rmat[2][2] = 1.0f; - - slot_idx_start = hDirAC->slots_rendered; - subframe_idx = hDirAC->subframes_rendered; - - /* copy parameters into local buffers*/ - mvs2s( hDirAC->azimuth[hDirAC->render_to_md_map[subframe_idx]], azimuth, hDirAC->num_freq_bands ); - mvs2s( hDirAC->elevation[hDirAC->render_to_md_map[subframe_idx]], elevation, hDirAC->num_freq_bands ); - mvr2r( hDirAC->spreadCoherence[hDirAC->render_to_md_map[subframe_idx]], spreadCoherence, hDirAC->num_freq_bands ); - mvr2r( hDirAC->surroundingCoherence[hDirAC->render_to_md_map[subframe_idx]], surroundingCoherence, hDirAC->num_freq_bands ); - mvr2r( hDirAC->energy_ratio1[hDirAC->render_to_md_map[subframe_idx]], energy_ratio1, hDirAC->num_freq_bands ); - - /* CLDFB Analysis of input */ - for ( slot = 0; slot < hDirAC->subframe_nbslots[hDirAC->subframes_rendered]; slot++ ) - { - for ( ch = 0; ch < numInChannels; ch++ ) - { - if ( ch == 0 || nchan_transport == 2 ) - { - cldfbAnalysis_ts( &( st_ivas->hTcBuffer->tc[ch][nBins * ( slot + slot_idx_start )] ), - Cldfb_RealBuffer_in[ch][slot], - Cldfb_ImagBuffer_in[ch][slot], - nBins, st_ivas->cldfbAnaDec[ch] ); - } - else if ( st_ivas->nchan_transport == 2 ) /* Stereo signal transmitted as mono with DFT stereo */ - { - /* At mono input duplicate the channel to dual-mono */ - mvr2r( Cldfb_RealBuffer_in[0][slot], Cldfb_RealBuffer_in[1][slot], nBins ); - mvr2r( Cldfb_ImagBuffer_in[0][slot], Cldfb_ImagBuffer_in[1][slot], nBins ); - } - else /* when nchan_transport == 1 and ch == 1 */ - { - /* CNA and HB FD-CNG*/ - if ( st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ) - { - int16_t numCoreBands, b; - - numCoreBands = st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->numCoreBands; - - - generate_masking_noise_dirac( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom, - st_ivas->cldfbAnaDec[1], - st_ivas->hTcBuffer->tc[nchan_transport], - Cldfb_RealBuffer_in[2][slot], Cldfb_ImagBuffer_in[2][slot], - slot + slot_idx_start, - st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->hSCE[0]->hCoreCoder[0]->flag_cna, - ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA || st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 ) && ( st_ivas->hSCE[0]->hCoreCoder[0]->cng_type == FD_CNG ) && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ); - - generate_masking_noise_dirac( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom, - st_ivas->cldfbAnaDec[1], /*nothing will be analyzed, just get cnst*/ - NULL, - Cldfb_RealBuffer_in[1][slot], Cldfb_ImagBuffer_in[1][slot], - slot + slot_idx_start, - st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->hSCE[0]->hCoreCoder[0]->flag_cna, - ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA || st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 ) && ( st_ivas->hSCE[0]->hCoreCoder[0]->cng_type == FD_CNG ) && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ); - - /* LB: Copy first channel + LB-CNG to first and second channels with same scaling (dual-mono)*/ - for ( b = 0; b < numCoreBands; b++ ) - { - Cldfb_RealBuffer_in[0][slot][b] = INV_SQRT2 * ( Cldfb_RealBuffer_in[0][slot][b] + Cldfb_RealBuffer_in[2][slot][b] ); - Cldfb_RealBuffer_in[1][slot][b] = Cldfb_RealBuffer_in[0][slot][b]; - Cldfb_ImagBuffer_in[0][slot][b] = INV_SQRT2 * ( Cldfb_ImagBuffer_in[0][slot][b] + Cldfb_ImagBuffer_in[2][slot][b] ); - Cldfb_ImagBuffer_in[1][slot][b] = Cldfb_ImagBuffer_in[0][slot][b]; - } - - /* HB: Copy first channel to second channel and add HB-CNGs with different scalings*/ - for ( ; b < nBins; b++ ) - { - Cldfb_RealBuffer_in[0][slot][b] *= INV_SQRT2; - Cldfb_RealBuffer_in[1][slot][b] = Cldfb_RealBuffer_in[0][slot][b] + 0.5f * Cldfb_RealBuffer_in[1][slot][b] + Cldfb_RealBuffer_in[0][slot][b]; - Cldfb_RealBuffer_in[0][slot][b] += 0.5f * Cldfb_RealBuffer_in[2][slot][b]; - - Cldfb_ImagBuffer_in[0][slot][b] *= INV_SQRT2; - Cldfb_ImagBuffer_in[1][slot][b] = Cldfb_ImagBuffer_in[0][slot][b] + 0.5f * Cldfb_ImagBuffer_in[1][slot][b]; - Cldfb_ImagBuffer_in[0][slot][b] += 0.5f * Cldfb_ImagBuffer_in[2][slot][b]; - } - } - else - { - /* At mono input duplicate the channel to dual-mono, and apply gain - correction to ensure same overall level as in stereo mode */ - v_multc( Cldfb_RealBuffer_in[0][slot], INV_SQRT_2, Cldfb_RealBuffer_in[0][slot], nBins ); - v_multc( Cldfb_ImagBuffer_in[0][slot], INV_SQRT_2, Cldfb_ImagBuffer_in[0][slot], nBins ); - - mvr2r( Cldfb_RealBuffer_in[0][slot], Cldfb_RealBuffer_in[1][slot], nBins ); - mvr2r( Cldfb_ImagBuffer_in[0][slot], Cldfb_ImagBuffer_in[1][slot], nBins ); - } - } - } - - if ( st_ivas->hDiracDecBin->useTdDecorr ) - { - for ( ch = BINAURAL_CHANNELS; ch < ( 2 * BINAURAL_CHANNELS ); ch++ ) - { - cldfbAnalysis_ts( &( st_ivas->hTcBuffer->tc[ch][nBins * ( slot + slot_idx_start )] ), - Cldfb_RealBuffer_in[ch][slot], - Cldfb_ImagBuffer_in[ch][slot], - nBins, st_ivas->cldfbAnaDec[ch] ); - - if ( st_ivas->nchan_transport == 1 && st_ivas->ivas_format == SBA_FORMAT ) - { - v_multc( Cldfb_RealBuffer_in[ch][slot], INV_SQRT_2, Cldfb_RealBuffer_in[ch][slot], nBins ); - v_multc( Cldfb_ImagBuffer_in[ch][slot], INV_SQRT_2, Cldfb_ImagBuffer_in[ch][slot], nBins ); - } - } - } - } - - if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR ) - { - st_ivas->hDirAC->hDiffuseDist = &diffuseDistData; - ivas_spar_param_to_masa_param_mapping_sf( st_ivas, azimuth, elevation, energy_ratio1, spreadCoherence, surroundingCoherence, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in ); - - ivas_sba_prototype_renderer_sf( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in ); - - /* we are done with SPAR, update SPAR info*/ - st_ivas->hSpar->slots_rendered += st_ivas->hSpar->subframe_nbslots[st_ivas->hSpar->subframes_rendered]; - st_ivas->hSpar->subframes_rendered++; - } - - if ( st_ivas->hHeadTrackData && st_ivas->hHeadTrackData->num_quaternions >= 0 ) - { - QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[subframe_idx], Rmat ); - - if ( nchan_transport == 2 ) - { - ivas_dirac_dec_binaural_check_and_switch_transports_headtracked_sf( st_ivas->hHeadTrackData, Cldfb_ImagBuffer_in, Cldfb_RealBuffer_in, (uint8_t) hDirAC->subframe_nbslots[subframe_idx], nBins, Rmat ); - } - } - - ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices_sf( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, azimuth, elevation, energy_ratio1, spreadCoherence, surroundingCoherence, Rmat ); - - if ( st_ivas->ivas_format == ISM_FORMAT ) - { - max_band_decorr = 0; - } - else if ( st_ivas->hDiracDecBin->useTdDecorr ) - { - max_band_decorr = CLDFB_NO_CHANNELS_MAX; - } - else - { - max_band_decorr = st_ivas->hDirAC->h_freq_domain_decorr_ap_params->max_band_decorr; - } - - ivas_dirac_dec_binaural_determine_processing_matrices( st_ivas, max_band_decorr, Rmat ); - - ivas_dirac_dec_binaural_process_output_sf( st_ivas, output_f, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, max_band_decorr, numInChannels ); - - /* we are done with DirAC, update DirAC info*/ - st_ivas->hDirAC->slots_rendered += st_ivas->hDirAC->subframe_nbslots[st_ivas->hDirAC->subframes_rendered]; - st_ivas->hDirAC->subframes_rendered++; - - st_ivas->hDirAC->hDiffuseDist = NULL; - - return; -} -#endif #endif -#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS static void ivas_dirac_dec_binaural_internal( Decoder_Struct *st_ivas, #ifdef JBM_TSM_ON_TCS @@ -1039,235 +718,29 @@ static void ivas_dirac_dec_binaural_internal( return; } -#else -static void ivas_dirac_dec_binaural_internal( - Decoder_Struct *st_ivas, - float output_f[][L_FRAME48k], - const int16_t nchan_transport, - const uint8_t firstSubframe, - const uint8_t nSubframes ) -{ - DIRAC_DEC_HANDLE hDirAC; - uint8_t slot, ch, nBins, numInChannels; - float Cldfb_RealBuffer_in[4][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - float Cldfb_ImagBuffer_in[4][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - float Rmat[3][3]; - uint8_t firstSlot, slotEnd; - int16_t max_band_decorr; - DIFFUSE_DISTRIBUTION_DATA diffuseDistData; - firstSlot = firstSubframe * ( CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES ); - slotEnd = ( firstSubframe + nSubframes ) * ( CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES ); - hDirAC = st_ivas->hDirAC; - nBins = (uint8_t) hDirAC->num_freq_bands; +static void ivas_dirac_dec_decorrelate_slot( + DIRAC_DEC_HANDLE hDirAC, + const int16_t slot, + float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float decRe[][CLDFB_NO_CHANNELS_MAX], + float decIm[][CLDFB_NO_CHANNELS_MAX] ) +{ + int16_t offset, ch, bin; + float onset_filter[BINAURAL_CHANNELS * CLDFB_NO_CHANNELS_MAX]; /* 2 ch, 60 bins */ + float decorrelatedFrameInterleaved[2 * BINAURAL_CHANNELS * CLDFB_NO_CHANNELS_MAX]; /* 2 ch, real + imag, 60 bins */ - /* The input channel number at this processing function (not nchan_transport) */ - numInChannels = BINAURAL_CHANNELS; - if ( st_ivas->hOutSetup.separateChannelEnabled ) + /* Decorrelation needs interleaved data. Copy left and right signals to proto_frame_f */ + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { - numInChannels++; - } - - Rmat[0][0] = 1.0f; - Rmat[0][1] = 0.0f; - Rmat[0][2] = 0.0f; - - Rmat[1][0] = 0.0f; - Rmat[1][1] = 1.0f; - Rmat[1][2] = 0.0f; - - Rmat[2][0] = 0.0f; - Rmat[2][1] = 0.0f; - Rmat[2][2] = 1.0f; - - /* CLDFB Analysis of input */ - for ( slot = firstSlot; slot < slotEnd; slot++ ) - { - for ( ch = 0; ch < numInChannels; ch++ ) - { - if ( ch == 0 || nchan_transport == 2 ) - { - cldfbAnalysis_ts( &( output_f[ch][nBins * slot] ), - Cldfb_RealBuffer_in[ch][slot], - Cldfb_ImagBuffer_in[ch][slot], - nBins, st_ivas->cldfbAnaDec[ch] ); - } - else if ( st_ivas->nchan_transport == 2 ) /* Stereo signal transmitted as mono with DFT stereo */ - { - /* At mono input duplicate the channel to dual-mono */ - mvr2r( Cldfb_RealBuffer_in[0][slot], Cldfb_RealBuffer_in[1][slot], nBins ); - mvr2r( Cldfb_ImagBuffer_in[0][slot], Cldfb_ImagBuffer_in[1][slot], nBins ); - } - else /* when nchan_transport == 1 and ch == 1 */ - { - /* CNA and HB FD-CNG*/ - if ( st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ) - { - int16_t numCoreBands, b; - - numCoreBands = st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->numCoreBands; - - generate_masking_noise_dirac( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom, - st_ivas->cldfbAnaDec[1], -#ifdef JBM_TSM_ON_TCS - st_ivas->hTcBuffer->tc[1], -#else - &( output_f[1][L_FRAME48k - L_FRAME16k] ), /*used as temporary static buffer for the whole frame*/ -#endif - Cldfb_RealBuffer_in[2][slot], Cldfb_ImagBuffer_in[2][slot], - slot, - st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->hSCE[0]->hCoreCoder[0]->flag_cna, - ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA || st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 ) && ( st_ivas->hSCE[0]->hCoreCoder[0]->cng_type == FD_CNG ) && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ); - - generate_masking_noise_dirac( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom, - st_ivas->cldfbAnaDec[1], /*nothing will be analyzed, just get cnst*/ - NULL, - Cldfb_RealBuffer_in[1][slot], Cldfb_ImagBuffer_in[1][slot], - slot, - st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->hSCE[0]->hCoreCoder[0]->flag_cna, - ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA || st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 ) && ( st_ivas->hSCE[0]->hCoreCoder[0]->cng_type == FD_CNG ) && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ); - - /* LB: Copy first channel + LB-CNG to first and second channels with same scaling (dual-mono)*/ - for ( b = 0; b < numCoreBands; b++ ) - { - Cldfb_RealBuffer_in[0][slot][b] = INV_SQRT2 * ( Cldfb_RealBuffer_in[0][slot][b] + Cldfb_RealBuffer_in[2][slot][b] ); - Cldfb_RealBuffer_in[1][slot][b] = Cldfb_RealBuffer_in[0][slot][b]; - Cldfb_ImagBuffer_in[0][slot][b] = INV_SQRT2 * ( Cldfb_ImagBuffer_in[0][slot][b] + Cldfb_ImagBuffer_in[2][slot][b] ); - Cldfb_ImagBuffer_in[1][slot][b] = Cldfb_ImagBuffer_in[0][slot][b]; - } - - /* HB: Copy first channel to second channel and add HB-CNGs with different scalings*/ - for ( ; b < nBins; b++ ) - { - Cldfb_RealBuffer_in[0][slot][b] *= INV_SQRT2; - Cldfb_RealBuffer_in[1][slot][b] = Cldfb_RealBuffer_in[0][slot][b] + 0.5f * Cldfb_RealBuffer_in[1][slot][b] + Cldfb_RealBuffer_in[0][slot][b]; - Cldfb_RealBuffer_in[0][slot][b] += 0.5f * Cldfb_RealBuffer_in[2][slot][b]; - - Cldfb_ImagBuffer_in[0][slot][b] *= INV_SQRT2; - Cldfb_ImagBuffer_in[1][slot][b] = Cldfb_ImagBuffer_in[0][slot][b] + 0.5f * Cldfb_ImagBuffer_in[1][slot][b]; - Cldfb_ImagBuffer_in[0][slot][b] += 0.5f * Cldfb_ImagBuffer_in[2][slot][b]; - } - } - else - { - /* At mono input duplicate the channel to dual-mono, and apply gain - correction to ensure same overall level as in stereo mode */ - v_multc( Cldfb_RealBuffer_in[0][slot], INV_SQRT_2, Cldfb_RealBuffer_in[0][slot], nBins ); - v_multc( Cldfb_ImagBuffer_in[0][slot], INV_SQRT_2, Cldfb_ImagBuffer_in[0][slot], nBins ); - - mvr2r( Cldfb_RealBuffer_in[0][slot], Cldfb_RealBuffer_in[1][slot], nBins ); - mvr2r( Cldfb_ImagBuffer_in[0][slot], Cldfb_ImagBuffer_in[1][slot], nBins ); - } - } - } - - if ( st_ivas->hDiracDecBin->useTdDecorr ) - { - for ( ch = BINAURAL_CHANNELS; ch < ( 2 * BINAURAL_CHANNELS ); ch++ ) - { - cldfbAnalysis_ts( -#ifdef JBM_TSM_ON_TCS - &( st_ivas->hTcBuffer->tc[ch][nBins * slot] ), -#else - &( output_f[ch][nBins * slot] ), -#endif - Cldfb_RealBuffer_in[ch][slot], - Cldfb_ImagBuffer_in[ch][slot], - nBins, st_ivas->cldfbAnaDec[ch] ); - - if ( st_ivas->nchan_transport == 1 && st_ivas->ivas_format == SBA_FORMAT ) - { - v_multc( Cldfb_RealBuffer_in[ch][slot], INV_SQRT_2, Cldfb_RealBuffer_in[ch][slot], nBins ); - v_multc( Cldfb_ImagBuffer_in[ch][slot], INV_SQRT_2, Cldfb_ImagBuffer_in[ch][slot], nBins ); - } - } - } - } - - if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR ) - { - st_ivas->hDirAC->hDiffuseDist = &diffuseDistData; - - ivas_spar_param_to_masa_param_mapping( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, firstSubframe, nSubframes ); - - ivas_sba_prototype_renderer( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, firstSubframe, nSubframes ); - } - - if ( st_ivas->hHeadTrackData && st_ivas->hHeadTrackData->num_quaternions >= 0 ) - { - QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[firstSubframe], Rmat ); - - if ( nchan_transport == 2 ) - { - adaptTransportSignalsHeadtracked( st_ivas->hHeadTrackData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, firstSlot, slotEnd, nBins, Rmat ); - - ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( st_ivas->hHeadTrackData, Cldfb_ImagBuffer_in, Cldfb_RealBuffer_in, firstSlot, slotEnd, nBins, Rmat ); - } - } - - ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, Rmat, firstSubframe, nSubframes ); - - if ( st_ivas->ivas_format == ISM_FORMAT ) - { - max_band_decorr = 0; - } - else if ( st_ivas->hDiracDecBin->useTdDecorr ) - { - max_band_decorr = CLDFB_NO_CHANNELS_MAX; - } - else - { - max_band_decorr = st_ivas->hDirAC->h_freq_domain_decorr_ap_params->max_band_decorr; - } - - ivas_dirac_dec_binaural_determine_processing_matrices( st_ivas, max_band_decorr, Rmat ); - - ivas_dirac_dec_binaural_process_output( st_ivas, output_f, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, max_band_decorr, numInChannels, firstSlot, slotEnd ); - - st_ivas->hDirAC->hDiffuseDist = NULL; - -#ifdef JBM_TSM_ON_TCS - st_ivas->hDirAC->slots_rendered += ( slotEnd - firstSlot ); - st_ivas->hDirAC->subframes_rendered += nSubframes; -#endif - - return; -} -#endif - - -#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS -static void ivas_dirac_dec_decorrelate_slot( - DIRAC_DEC_HANDLE hDirAC, - const int16_t slot, - float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], - float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], - float decRe[][CLDFB_NO_CHANNELS_MAX], - float decIm[][CLDFB_NO_CHANNELS_MAX] ) -#else -static void ivas_dirac_dec_decorrelate_slot( - DIRAC_DEC_HANDLE hDirAC, - const int8_t slot, - float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - float decRe[][CLDFB_NO_CHANNELS_MAX], - float decIm[][CLDFB_NO_CHANNELS_MAX] ) -#endif -{ - int16_t offset, ch, bin; - float onset_filter[BINAURAL_CHANNELS * CLDFB_NO_CHANNELS_MAX]; /* 2 ch, 60 bins */ - float decorrelatedFrameInterleaved[2 * BINAURAL_CHANNELS * CLDFB_NO_CHANNELS_MAX]; /* 2 ch, real + imag, 60 bins */ - - /* Decorrelation needs interleaved data. Copy left and right signals to proto_frame_f */ - for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - offset = hDirAC->num_freq_bands * BINAURAL_CHANNELS * ch; - for ( bin = 0; bin < hDirAC->num_freq_bands; bin++ ) - { - hDirAC->proto_frame_f[( bin * BINAURAL_CHANNELS ) + offset] = inRe[ch][slot][bin]; - hDirAC->proto_frame_f[( bin * BINAURAL_CHANNELS ) + offset + 1] = inIm[ch][slot][bin]; - } + offset = hDirAC->num_freq_bands * BINAURAL_CHANNELS * ch; + for ( bin = 0; bin < hDirAC->num_freq_bands; bin++ ) + { + hDirAC->proto_frame_f[( bin * BINAURAL_CHANNELS ) + offset] = inRe[ch][slot][bin]; + hDirAC->proto_frame_f[( bin * BINAURAL_CHANNELS ) + offset + 1] = inIm[ch][slot][bin]; + } } /* Decorrelate proto signal to decorrelatedFrameInterleaved */ @@ -1299,72 +772,19 @@ static void ivas_dirac_dec_decorrelate_slot( } #ifdef JBM_TSM_ON_TCS -#ifndef FIX_355_REFACTOR_PARAMBIN_TO_5MS -static void ivas_dirac_dec_decorrelate_slot_sf( - DIRAC_DEC_HANDLE hDirAC, - const int8_t slot, - float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], - float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], - float decRe[][CLDFB_NO_CHANNELS_MAX], - float decIm[][CLDFB_NO_CHANNELS_MAX] ) -{ - int16_t offset, ch, bin; - float onset_filter[BINAURAL_CHANNELS * CLDFB_NO_CHANNELS_MAX]; /* 2 ch, 60 bins */ - float decorrelatedFrameInterleaved[2 * BINAURAL_CHANNELS * CLDFB_NO_CHANNELS_MAX]; /* 2 ch, real + imag, 60 bins */ - - /* Decorrelation needs interleaved data. Copy left and right signals to proto_frame_f */ - for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - offset = hDirAC->num_freq_bands * BINAURAL_CHANNELS * ch; - for ( bin = 0; bin < hDirAC->num_freq_bands; bin++ ) - { - hDirAC->proto_frame_f[( bin * BINAURAL_CHANNELS ) + offset] = inRe[ch][slot][bin]; - hDirAC->proto_frame_f[( bin * BINAURAL_CHANNELS ) + offset + 1] = inIm[ch][slot][bin]; - } - } - - /* Decorrelate proto signal to decorrelatedFrameInterleaved */ - ivas_dirac_dec_decorr_process( hDirAC->num_freq_bands, - hDirAC->num_outputs_diff, - hDirAC->num_protos_diff, - hDirAC->synthesisConf, - BINAURAL_CHANNELS, - hDirAC->proto_frame_f, - hDirAC->num_protos_diff, - hDirAC->proto_index_diff, - decorrelatedFrameInterleaved, - onset_filter, - hDirAC->h_freq_domain_decorr_ap_params, - hDirAC->h_freq_domain_decorr_ap_state ); - - /* De-interleave decorrelated signals*/ - for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - offset = hDirAC->num_freq_bands * BINAURAL_CHANNELS * ch; - for ( bin = 0; bin < hDirAC->num_freq_bands; bin++ ) - { - decRe[ch][bin] = decorrelatedFrameInterleaved[( bin * BINAURAL_CHANNELS ) + offset]; - decIm[ch][bin] = decorrelatedFrameInterleaved[( bin * BINAURAL_CHANNELS ) + offset + 1]; - } - } +#endif - return; -} -static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices_sf( +static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( Decoder_Struct *st_ivas, - float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], - float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], - int16_t azimuth[CLDFB_NO_CHANNELS_MAX], - int16_t elevation[CLDFB_NO_CHANNELS_MAX], - float energy_ratio1[CLDFB_NO_CHANNELS_MAX], - float spreadCoherence[CLDFB_NO_CHANNELS_MAX], - float surroundingCoherence[CLDFB_NO_CHANNELS_MAX], - float Rmat[3][3] ) + float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float Rmat[3][3], + const int16_t subframe ) { - uint8_t ch, slot, bin; + int16_t ch, slot, bin; uint8_t separateCenterChannelRendering; - int16_t nBins, idx, subframe; + int16_t nBins, idx; float frameMeanDiffusenessEneWeight[CLDFB_NO_CHANNELS_MAX]; DIRAC_DEC_HANDLE hDirAC; DIRAC_DEC_BIN_HANDLE h; @@ -1372,15 +792,13 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric float qualityBasedSmFactor; float lowBitRateEQ[CLDFB_NO_CHANNELS_MAX]; uint8_t applyLowBitRateEQ; + int16_t dirac_read_idx; float subFrameTotalEne[CLDFB_NO_CHANNELS_MAX]; - int16_t md_idx; hDirAC = st_ivas->hDirAC; h = st_ivas->hDiracDecBin; separateCenterChannelRendering = st_ivas->hOutSetup.separateChannelEnabled; nBins = hDirAC->num_freq_bands; /* Actually bins */ - subframe = hDirAC->subframes_rendered; - md_idx = hDirAC->render_to_md_map[hDirAC->subframes_rendered]; set_zero( h->ChCrossRe, nBins ); set_zero( h->ChCrossIm, nBins ); @@ -1416,11 +834,20 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric } } - /* Formulate input and target covariance matrices combining all subframes */ + /* Formulate input and target covariance matrices for this subframe */ set_zero( subFrameTotalEne, CLDFB_NO_CHANNELS_MAX ); +#ifdef JBM_TSM_ON_TCS + dirac_read_idx = hDirAC->render_to_md_map[subframe]; +#else + dirac_read_idx = hDirAC->dirac_read_idx; +#endif /* Calculate input covariance matrix */ - for ( slot = 0; slot < (uint8_t) hDirAC->subframe_nbslots[subframe]; slot++ ) +#ifdef JBM_TSM_ON_TCS + for ( slot = 0; slot < hDirAC->subframe_nbslots[subframe]; slot++ ) +#else + for ( slot = 0; slot < hDirAC->subframe_nbslots; slot++ ) +#endif { for ( bin = 0; bin < nBins; bin++ ) { @@ -1461,7 +888,11 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric set_zero( subFrameTotalEne, CLDFB_NO_CHANNELS_MAX ); - for ( slot = 0; slot < (uint8_t) hDirAC->subframe_nbslots[subframe]; slot++ ) +#ifdef JBM_TSM_ON_TCS + for ( slot = 0; slot < hDirAC->subframe_nbslots[subframe]; slot++ ) +#else + for ( slot = 0; slot < hDirAC->subframe_nbslots; slot++ ) +#endif { for ( bin = 0; bin < nBins; bin++ ) { @@ -1478,7 +909,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric float diffuseness = 1.0f; /* ratio1 and ratio2 are subtracted from diffuseness further below */ float surCoh = 0.0f, spreadCoh = 0.0f; /* Default values if spreadSurroundCoherenceApplied == false */ float diffEne, dirEne, meanEnePerCh; - uint16_t dirIndex; + int16_t dirIndex; /* When BINAURAL_ROOM is not indicated, hBinaural->earlyPartEneCorrection[bin] values are all 1.0f. * When BINAURAL_ROOM is indicated, the binaural audio output is based on combined use of the @@ -1497,17 +928,17 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric if ( dirIndex == 0 ) /* For first of the two simultaneous directions */ { - aziDeg = azimuth[bin]; - eleDeg = elevation[bin]; - ratio = energy_ratio1[bin]; - spreadCoh = spreadCoherence[bin]; + aziDeg = hDirAC->azimuth[dirac_read_idx][bin]; + eleDeg = hDirAC->elevation[dirac_read_idx][bin]; + ratio = hDirAC->energy_ratio1[dirac_read_idx][bin]; + spreadCoh = hDirAC->spreadCoherence[dirac_read_idx][bin]; } else /* For second of the two simultaneous directions */ { - aziDeg = hDirAC->azimuth2[md_idx][bin]; - eleDeg = hDirAC->elevation2[md_idx][bin]; - ratio = hDirAC->energy_ratio2[md_idx][bin]; - spreadCoh = hDirAC->spreadCoherence2[md_idx][bin]; + aziDeg = hDirAC->azimuth2[dirac_read_idx][bin]; + eleDeg = hDirAC->elevation2[dirac_read_idx][bin]; + ratio = hDirAC->energy_ratio2[dirac_read_idx][bin]; + spreadCoh = hDirAC->spreadCoherence2[dirac_read_idx][bin]; } diffuseness -= ratio; /* diffuseness = 1 - ratio1 - ratio2 */ @@ -1645,7 +1076,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric /* Add diffuse / ambient part covariance matrix */ diffuseness = max( 0.0f, diffuseness ); diffEne = diffuseness * meanEnePerCh; - surCoh = surroundingCoherence[bin]; + surCoh = hDirAC->surroundingCoherence[dirac_read_idx][bin]; if ( ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) ) { if ( !h->renderStereoOutputInsteadOfBinaural ) @@ -1668,7 +1099,11 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && bin < BINAURAL_COHERENCE_DIFFERENCE_BINS ) { float diffuseFieldCoherence; +#ifdef JBM_TSM_ON_TCS diffuseFieldCoherence = hDirAC->hDiffuseDist->diffuseRatioX[bin] * h->diffuseFieldCoherenceX[bin] + hDirAC->hDiffuseDist->diffuseRatioY[bin] * h->diffuseFieldCoherenceY[bin] + hDirAC->hDiffuseDist->diffuseRatioZ[bin] * h->diffuseFieldCoherenceZ[bin]; +#else + diffuseFieldCoherence = hDirAC->hDiffuseDist->diffuseRatioX[subframe][bin] * h->diffuseFieldCoherenceX[bin] + hDirAC->hDiffuseDist->diffuseRatioY[subframe][bin] * h->diffuseFieldCoherenceY[bin] + hDirAC->hDiffuseDist->diffuseRatioZ[subframe][bin] * h->diffuseFieldCoherenceZ[bin]; +#endif h->ChCrossReOut[bin] += ( ( 1.0f - surCoh ) * diffuseFieldCoherence + surCoh ) * diffEne; } else @@ -1682,858 +1117,6 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric frameMeanDiffusenessEneWeight[bin] += meanEnePerCh; } - - /* Formulate average diffuseness over frame */ - for ( bin = 0; bin < nBins; bin++ ) - { - h->frameMeanDiffuseness[bin] /= fmaxf( 1e-12f, frameMeanDiffusenessEneWeight[bin] ); - } - - /* Determine encoding quality based additional smoothing factor */ - qualityBasedSmFactor = 1.0f; - if ( st_ivas->hMasa != NULL ) - { - qualityBasedSmFactor = st_ivas->hMasa->data.dir_decode_quality; - qualityBasedSmFactor *= qualityBasedSmFactor; - } - - /* Temporal IIR-type smoothing of covariance matrices */ - if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE ) - { - IIReneLimiterFactor = 16.0f + ( 1.0f - qualityBasedSmFactor ); - } - else - { - IIReneLimiterFactor = 8.0f + ( 1.0f - qualityBasedSmFactor ); - } - for ( bin = 0; bin < nBins; bin++ ) - { - float eneRatio, IIReneLimiter; - - /* Temporally smooth cov mtx estimates for resulting mixing matrix stability. The design principle is that - * the energy history (IIR) must not be more than double of the current frame energy. This provides more - * robust performance at energy offsets when compared to typical IIR averaging. */ - eneRatio = ( h->ChEne[0][bin] + h->ChEne[1][bin] ) / fmaxf( 1e-12f, ( h->ChEnePrev[0][bin] + h->ChEnePrev[1][bin] ) ); - IIReneLimiter = fminf( 1.0f, eneRatio * IIReneLimiterFactor ); - - h->ChCrossRe[bin] *= qualityBasedSmFactor; - h->ChCrossIm[bin] *= qualityBasedSmFactor; - h->ChCrossReOut[bin] *= qualityBasedSmFactor; - h->ChCrossImOut[bin] *= qualityBasedSmFactor; - - for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - h->ChEne[ch][bin] *= qualityBasedSmFactor; - h->ChEneOut[ch][bin] *= qualityBasedSmFactor; - } - - h->ChCrossRe[bin] += IIReneLimiter * h->ChCrossRePrev[bin]; - h->ChCrossIm[bin] += IIReneLimiter * h->ChCrossImPrev[bin]; - h->ChCrossReOut[bin] += IIReneLimiter * h->ChCrossReOutPrev[bin]; - h->ChCrossImOut[bin] += IIReneLimiter * h->ChCrossImOutPrev[bin]; - - for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - h->ChEne[ch][bin] += IIReneLimiter * h->ChEnePrev[ch][bin]; - h->ChEneOut[ch][bin] += IIReneLimiter * h->ChEneOutPrev[ch][bin]; - } - - /* Store energy values and coefficients for next round */ - h->ChCrossRePrev[bin] = h->ChCrossRe[bin]; - h->ChCrossImPrev[bin] = h->ChCrossIm[bin]; - h->ChCrossReOutPrev[bin] = h->ChCrossReOut[bin]; - h->ChCrossImOutPrev[bin] = h->ChCrossImOut[bin]; - - for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - h->ChEnePrev[ch][bin] = h->ChEne[ch][bin]; - h->ChEneOutPrev[ch][bin] = h->ChEneOut[ch][bin]; - } - } - - return; -} -#endif -#endif - - -#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS -static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( - Decoder_Struct *st_ivas, - float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], - float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], - float Rmat[3][3], - const int16_t subframe ) -{ - int16_t ch, slot, bin; - uint8_t separateCenterChannelRendering; - int16_t nBins, idx; - float frameMeanDiffusenessEneWeight[CLDFB_NO_CHANNELS_MAX]; - DIRAC_DEC_HANDLE hDirAC; - DIRAC_DEC_BIN_HANDLE h; - float IIReneLimiterFactor; - float qualityBasedSmFactor; - float lowBitRateEQ[CLDFB_NO_CHANNELS_MAX]; - uint8_t applyLowBitRateEQ; - int16_t dirac_read_idx; - float subFrameTotalEne[CLDFB_NO_CHANNELS_MAX]; - - hDirAC = st_ivas->hDirAC; - h = st_ivas->hDiracDecBin; - separateCenterChannelRendering = st_ivas->hOutSetup.separateChannelEnabled; - nBins = hDirAC->num_freq_bands; /* Actually bins */ - - set_zero( h->ChCrossRe, nBins ); - set_zero( h->ChCrossIm, nBins ); - set_zero( h->ChCrossReOut, nBins ); - set_zero( h->ChCrossImOut, nBins ); - for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - set_zero( h->ChEne[ch], nBins ); - set_zero( h->ChEneOut[ch], nBins ); - } - set_zero( h->frameMeanDiffuseness, nBins ); - - set_zero( frameMeanDiffusenessEneWeight, CLDFB_NO_CHANNELS_MAX ); - - /* Determine EQ for low bit rates (13.2 and 16.4 kbps) */ - applyLowBitRateEQ = 0; - if ( ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == MC_FORMAT ) && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE ) - { - applyLowBitRateEQ = 1; - if ( st_ivas->hDecoderConfig->ivas_total_brate == IVAS_16k4 ) - { - for ( bin = 0; bin < LOW_BIT_RATE_BINAURAL_EQ_BINS; bin++ ) - { - lowBitRateEQ[bin + LOW_BIT_RATE_BINAURAL_EQ_OFFSET] = lowBitRateBinauralEQ[bin] * 0.5f + 0.5f; - } - } - else - { - for ( bin = 0; bin < LOW_BIT_RATE_BINAURAL_EQ_BINS; bin++ ) - { - lowBitRateEQ[bin + LOW_BIT_RATE_BINAURAL_EQ_OFFSET] = lowBitRateBinauralEQ[bin]; - } - } - } - - /* Formulate input and target covariance matrices for this subframe */ - set_zero( subFrameTotalEne, CLDFB_NO_CHANNELS_MAX ); -#ifdef JBM_TSM_ON_TCS - dirac_read_idx = hDirAC->render_to_md_map[subframe]; -#else - dirac_read_idx = hDirAC->dirac_read_idx; -#endif - - /* Calculate input covariance matrix */ -#ifdef JBM_TSM_ON_TCS - for ( slot = 0; slot < hDirAC->subframe_nbslots[subframe]; slot++ ) -#else - for ( slot = 0; slot < hDirAC->subframe_nbslots; slot++ ) -#endif - { - for ( bin = 0; bin < nBins; bin++ ) - { - for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - float instEne; - - instEne = ( inRe[ch][slot][bin] * inRe[ch][slot][bin] ); - instEne += ( inIm[ch][slot][bin] * inIm[ch][slot][bin] ); - h->ChEne[ch][bin] += instEne; - subFrameTotalEne[bin] += instEne; - } - h->ChCrossRe[bin] += inRe[0][slot][bin] * inRe[1][slot][bin]; - h->ChCrossRe[bin] += inIm[0][slot][bin] * inIm[1][slot][bin]; - h->ChCrossIm[bin] += inRe[0][slot][bin] * inIm[1][slot][bin]; - h->ChCrossIm[bin] -= inIm[0][slot][bin] * inRe[1][slot][bin]; - } - } - - /* Apply EQ at low bit rates */ - if ( applyLowBitRateEQ ) - { - int16_t lastEqBin = LOW_BIT_RATE_BINAURAL_EQ_OFFSET + LOW_BIT_RATE_BINAURAL_EQ_BINS - 1; - - for ( bin = LOW_BIT_RATE_BINAURAL_EQ_OFFSET; bin < lastEqBin; bin++ ) - { - subFrameTotalEne[bin] *= lowBitRateEQ[bin]; - } - for ( ; bin < nBins; bin++ ) - { - subFrameTotalEne[bin] *= lowBitRateEQ[lastEqBin]; - } - } - - if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->nchan_transport == 2 ) - { - float tempRe, tempIm; - - set_zero( subFrameTotalEne, CLDFB_NO_CHANNELS_MAX ); - -#ifdef JBM_TSM_ON_TCS - for ( slot = 0; slot < hDirAC->subframe_nbslots[subframe]; slot++ ) -#else - for ( slot = 0; slot < hDirAC->subframe_nbslots; slot++ ) -#endif - { - for ( bin = 0; bin < nBins; bin++ ) - { - tempRe = inRe[0][slot][bin] + inRe[1][slot][bin]; - tempIm = inIm[0][slot][bin] + inIm[1][slot][bin]; - subFrameTotalEne[bin] += tempRe * tempRe + tempIm * tempIm; - } - } - } - - /* Determine target covariance matrix containing target binaural properties */ - for ( bin = 0; bin < nBins; bin++ ) - { - float diffuseness = 1.0f; /* ratio1 and ratio2 are subtracted from diffuseness further below */ - float surCoh = 0.0f, spreadCoh = 0.0f; /* Default values if spreadSurroundCoherenceApplied == false */ - float diffEne, dirEne, meanEnePerCh; - int16_t dirIndex; - - /* When BINAURAL_ROOM is not indicated, hBinaural->earlyPartEneCorrection[bin] values are all 1.0f. - * When BINAURAL_ROOM is indicated, the binaural audio output is based on combined use of the - * HRTF data set and a BRIR-based data set. The HRTF data set is spectrally corrected to match - * the early spectrum of the BRIR data, using the spectral correction data in - * hBinaural->earlyPartEneCorrection[bin], based on the BRIR set. */ - meanEnePerCh = h->earlyPartEneCorrection[bin] * subFrameTotalEne[bin] / 2.0f; - - /* Determine direct part target covariance matrix (for 1 or 2 directions) */ - for ( dirIndex = 0; dirIndex < hDirAC->numSimultaneousDirections; dirIndex++ ) - { - int16_t aziDeg, eleDeg; - float lRealp, lImagp, rRealp, rImagp; - float lRealpTmp, lImagpTmp, rRealpTmp, rImagpTmp; - float hrtfEne[BINAURAL_CHANNELS], hrtfCrossRe, hrtfCrossIm, ratio; - - if ( dirIndex == 0 ) /* For first of the two simultaneous directions */ - { - aziDeg = hDirAC->azimuth[dirac_read_idx][bin]; - eleDeg = hDirAC->elevation[dirac_read_idx][bin]; - ratio = hDirAC->energy_ratio1[dirac_read_idx][bin]; - spreadCoh = hDirAC->spreadCoherence[dirac_read_idx][bin]; - } - else /* For second of the two simultaneous directions */ - { - aziDeg = hDirAC->azimuth2[dirac_read_idx][bin]; - eleDeg = hDirAC->elevation2[dirac_read_idx][bin]; - ratio = hDirAC->energy_ratio2[dirac_read_idx][bin]; - spreadCoh = hDirAC->spreadCoherence2[dirac_read_idx][bin]; - } - diffuseness -= ratio; /* diffuseness = 1 - ratio1 - ratio2 */ - - if ( separateCenterChannelRendering ) - { - /* In masa + mono rendering mode, the center directions originate from phantom sources, so the - * spread coherence is increased */ - float aziRad, eleRad, doaVectorX, spatialAngleDeg, altSpreadCoh; - - aziRad = (float) aziDeg * PI_OVER_180; - eleRad = (float) eleDeg * PI_OVER_180; - doaVectorX = cosf( aziRad ) * cosf( eleRad ); - spatialAngleDeg = acosf( doaVectorX ) * _180_OVER_PI; - altSpreadCoh = 1.0f - ( spatialAngleDeg / 30.0f ); - spreadCoh = max( spreadCoh, altSpreadCoh ); - } - - getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, h->renderStereoOutputInsteadOfBinaural, Rmat ); - - if ( h->renderStereoOutputInsteadOfBinaural ) - { - /* Synthesizing spread coherence is not needed for stereo loudspeaker output, - * as directional sound is reproduced with two loudspeakers in any case */ - spreadCoh = 0.0f; - } - - if ( spreadCoh > 0.0f ) - { - float centerMul, sidesMul; - float hrtfEneCenter, hrtfEneSides, hrtfEneRealized, eneCorrectionFactor; - float w1, w2, w3, eq; - - hrtfEneCenter = ( lRealp * lRealp ) + ( lImagp * lImagp ) + ( rRealp * rRealp ) + ( rImagp * rImagp ); - - /* Spread coherence is synthesized as coherent sources at 30 degree horizontal spacing. - * The following formulas determine the gains for these sources. - * spreadCoh = 0: Only panning - * spreadCoh = 0.5: Three sources coherent panning (e.g. 30 0 -30 deg azi) - * spreadCoh = 1.0: Two sources coherent panning with gap (as above, but center is silent) */ - if ( spreadCoh < 0.5f ) - { - /* 0.0f < spreadCoh < 0.5f */ - sidesMul = 0.5774f * spreadCoh * 2.0f; /* sqrt(1/3) = 0.5774f */ - centerMul = 1.0f - ( spreadCoh * 2.0f ) + sidesMul; - } - else - { - /* 0.5f <= spreadCoh < 1.0f */ - centerMul = 2.0f - ( 2.0f * spreadCoh ); - sidesMul = inv_sqrt( centerMul + 2.0f ); - centerMul *= sidesMul; - } - - /* Apply the gain for the center source of the three coherent sources */ - lRealp *= centerMul; - lImagp *= centerMul; - rRealp *= centerMul; - rImagp *= centerMul; - - /* Apply the gain for the left source of the three coherent sources */ - getDirectPartGains( bin, aziDeg + 30, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat ); - - hrtfEneSides = ( lRealpTmp * lRealpTmp ) + ( lImagpTmp * lImagpTmp ) + ( rRealpTmp * rRealpTmp ) + ( rImagpTmp * rImagpTmp ); - lRealp += sidesMul * lRealpTmp; - lImagp += sidesMul * lImagpTmp; - rRealp += sidesMul * rRealpTmp; - rImagp += sidesMul * rImagpTmp; - - /* Apply the gain for the right source of the three coherent sources. - * -30 degrees to 330 wrapping due to internal functions. */ - getDirectPartGains( bin, aziDeg + 330, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat ); - - hrtfEneSides += ( lRealpTmp * lRealpTmp ) + ( lImagpTmp * lImagpTmp ) + ( rRealpTmp * rRealpTmp ) + ( rImagpTmp * rImagpTmp ); - lRealp += sidesMul * lRealpTmp; - lImagp += sidesMul * lImagpTmp; - rRealp += sidesMul * rRealpTmp; - rImagp += sidesMul * rImagpTmp; - - /* Formulate an eneCorrectionFactor that compensates for the coherent summation of the HRTFs */ - hrtfEneRealized = ( lRealp * lRealp ) + ( lImagp * lImagp ) + ( rRealp * rRealp ) + ( rImagp * rImagp ); - eneCorrectionFactor = ( ( hrtfEneSides * sidesMul * sidesMul ) + - ( hrtfEneCenter * centerMul * centerMul ) ) / - max( 1e-12f, hrtfEneRealized ); - - /* Weighting factors to determine appropriate target spectrum for spread coherent sound */ - if ( spreadCoh < 0.5 ) - { - w1 = 1.0f - 2.0f * spreadCoh; - w2 = 2.0f * spreadCoh; - w3 = 0.0f; - } - else - { - w1 = 0.0f; - w2 = 2.0f - 2.0f * spreadCoh; - w3 = 2.0f * spreadCoh - 1.0f; - } - - if ( ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) ) - { - idx = min( bin, MASA_NUM_DEFINED_SUR_SPR_COH_ENE_BINS - 1 ); - - /* Apply the target spectrum to the eneCorrectionFactor */ - if ( separateCenterChannelRendering ) /* spreadCoh mostly originates from phantom sources in separate channel rendering mode */ - { - eneCorrectionFactor *= w1 * 1.0f + ( w2 + w3 ) * spreadCohEne1[idx]; - } - else - { - eneCorrectionFactor *= w1 * 1.0f + w2 * spreadCohEne05[idx] + w3 * spreadCohEne1[idx]; - } - } - - /* Equalize the spread coherent combined HRTFs */ - eq = min( 4.0f, sqrtf( eneCorrectionFactor ) ); - lRealp *= eq; - lImagp *= eq; - rRealp *= eq; - rImagp *= eq; - } - - hrtfEne[0] = ( lRealp * lRealp ) + ( lImagp * lImagp ); - hrtfEne[1] = ( rRealp * rRealp ) + ( rImagp * rImagp ); - hrtfCrossRe = ( lRealp * rRealp ) + ( lImagp * rImagp ); - hrtfCrossIm = ( -lImagp * rRealp ) + ( lRealp * rImagp ); - - /* Add direct part (1 or 2) covariance matrix */ - dirEne = ratio * meanEnePerCh; - h->ChEneOut[0][bin] += dirEne * hrtfEne[0]; /* Dir ene part*/ - h->ChEneOut[1][bin] += dirEne * hrtfEne[1]; - h->ChCrossReOut[bin] += dirEne * hrtfCrossRe; /* Dir cross re */ - h->ChCrossImOut[bin] += dirEne * hrtfCrossIm; /* Dir cross im */ - } - - /* Add diffuse / ambient part covariance matrix */ - diffuseness = max( 0.0f, diffuseness ); - diffEne = diffuseness * meanEnePerCh; - surCoh = hDirAC->surroundingCoherence[dirac_read_idx][bin]; - if ( ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) ) - { - if ( !h->renderStereoOutputInsteadOfBinaural ) - { - idx = min( bin, MASA_NUM_DEFINED_SUR_SPR_COH_ENE_BINS - 1 ); - /* Apply target spectrum that emphasizes low frequencies when the sound is surround coherent */ - diffEne *= ( 1.0f - surCoh ) + surCoh * surCohEne[idx]; - } - } - h->ChEneOut[0][bin] += diffEne; /* Diff ene part*/ - h->ChEneOut[1][bin] += diffEne; - - if ( h->renderStereoOutputInsteadOfBinaural ) - { - /* When rendering stereo, ambience (except for surround coherent sound) has zero ICC. */ - h->ChCrossReOut[bin] += surCoh * diffEne; - } - else /* When rendering binaural, ambience has frequency dependent ICC. */ - { - if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && bin < BINAURAL_COHERENCE_DIFFERENCE_BINS ) - { - float diffuseFieldCoherence; -#ifdef JBM_TSM_ON_TCS - diffuseFieldCoherence = hDirAC->hDiffuseDist->diffuseRatioX[bin] * h->diffuseFieldCoherenceX[bin] + hDirAC->hDiffuseDist->diffuseRatioY[bin] * h->diffuseFieldCoherenceY[bin] + hDirAC->hDiffuseDist->diffuseRatioZ[bin] * h->diffuseFieldCoherenceZ[bin]; -#else - diffuseFieldCoherence = hDirAC->hDiffuseDist->diffuseRatioX[subframe][bin] * h->diffuseFieldCoherenceX[bin] + hDirAC->hDiffuseDist->diffuseRatioY[subframe][bin] * h->diffuseFieldCoherenceY[bin] + hDirAC->hDiffuseDist->diffuseRatioZ[subframe][bin] * h->diffuseFieldCoherenceZ[bin]; -#endif - h->ChCrossReOut[bin] += ( ( 1.0f - surCoh ) * diffuseFieldCoherence + surCoh ) * diffEne; - } - else - { - h->ChCrossReOut[bin] += ( ( 1.0f - surCoh ) * h->diffuseFieldCoherence[bin] + surCoh ) * diffEne; - } - } - - /* Store parameters for formulating average diffuseness over frame */ - h->frameMeanDiffuseness[bin] += diffEne; - frameMeanDiffusenessEneWeight[bin] += meanEnePerCh; - } - - /* Formulate average diffuseness over frame */ - for ( bin = 0; bin < nBins; bin++ ) - { - h->frameMeanDiffuseness[bin] /= fmaxf( 1e-12f, frameMeanDiffusenessEneWeight[bin] ); - } - - /* Determine encoding quality based additional smoothing factor */ - qualityBasedSmFactor = 1.0f; - if ( st_ivas->hMasa != NULL ) - { - qualityBasedSmFactor = st_ivas->hMasa->data.dir_decode_quality; - qualityBasedSmFactor *= qualityBasedSmFactor; - } - - /* Temporal IIR-type smoothing of covariance matrices */ - if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE ) - { - IIReneLimiterFactor = 16.0f + ( 1.0f - qualityBasedSmFactor ); - } - else - { - IIReneLimiterFactor = 8.0f + ( 1.0f - qualityBasedSmFactor ); - } - for ( bin = 0; bin < nBins; bin++ ) - { - float eneRatio, IIReneLimiter; - - /* Temporally smooth cov mtx estimates for resulting mixing matrix stability. The design principle is that - * the energy history (IIR) must not be more than double of the current frame energy. This provides more - * robust performance at energy offsets when compared to typical IIR averaging. */ - eneRatio = ( h->ChEne[0][bin] + h->ChEne[1][bin] ) / fmaxf( 1e-12f, ( h->ChEnePrev[0][bin] + h->ChEnePrev[1][bin] ) ); - IIReneLimiter = fminf( 1.0f, eneRatio * IIReneLimiterFactor ); - - h->ChCrossRe[bin] *= qualityBasedSmFactor; - h->ChCrossIm[bin] *= qualityBasedSmFactor; - h->ChCrossReOut[bin] *= qualityBasedSmFactor; - h->ChCrossImOut[bin] *= qualityBasedSmFactor; - - for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - h->ChEne[ch][bin] *= qualityBasedSmFactor; - h->ChEneOut[ch][bin] *= qualityBasedSmFactor; - } - - h->ChCrossRe[bin] += IIReneLimiter * h->ChCrossRePrev[bin]; - h->ChCrossIm[bin] += IIReneLimiter * h->ChCrossImPrev[bin]; - h->ChCrossReOut[bin] += IIReneLimiter * h->ChCrossReOutPrev[bin]; - h->ChCrossImOut[bin] += IIReneLimiter * h->ChCrossImOutPrev[bin]; - - for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - h->ChEne[ch][bin] += IIReneLimiter * h->ChEnePrev[ch][bin]; - h->ChEneOut[ch][bin] += IIReneLimiter * h->ChEneOutPrev[ch][bin]; - } - - /* Store energy values and coefficients for next round */ - h->ChCrossRePrev[bin] = h->ChCrossRe[bin]; - h->ChCrossImPrev[bin] = h->ChCrossIm[bin]; - h->ChCrossReOutPrev[bin] = h->ChCrossReOut[bin]; - h->ChCrossImOutPrev[bin] = h->ChCrossImOut[bin]; - - for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - h->ChEnePrev[ch][bin] = h->ChEne[ch][bin]; - h->ChEneOutPrev[ch][bin] = h->ChEneOut[ch][bin]; - } - } - - return; -} -#else -static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( - Decoder_Struct *st_ivas, - float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - float Rmat[3][3], - const uint8_t firstSubframe, - const uint8_t nSubframes ) -{ - uint8_t ch, slot, bin, subframe; - uint8_t separateCenterChannelRendering; - int16_t nBins, idx; - float frameMeanDiffusenessEneWeight[CLDFB_NO_CHANNELS_MAX]; - DIRAC_DEC_HANDLE hDirAC; - DIRAC_DEC_BIN_HANDLE h; - float IIReneLimiterFactor; - float qualityBasedSmFactor; - float lowBitRateEQ[CLDFB_NO_CHANNELS_MAX]; - uint8_t applyLowBitRateEQ; - int16_t dirac_read_idx; -#ifdef JBM_TSM_ON_TCS - int16_t slot_idx_start; -#endif - - hDirAC = st_ivas->hDirAC; - h = st_ivas->hDiracDecBin; - separateCenterChannelRendering = st_ivas->hOutSetup.separateChannelEnabled; - nBins = hDirAC->num_freq_bands; /* Actually bins */ - - set_zero( h->ChCrossRe, nBins ); - set_zero( h->ChCrossIm, nBins ); - set_zero( h->ChCrossReOut, nBins ); - set_zero( h->ChCrossImOut, nBins ); - for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - set_zero( h->ChEne[ch], nBins ); - set_zero( h->ChEneOut[ch], nBins ); - } - set_zero( h->frameMeanDiffuseness, nBins ); - - set_zero( frameMeanDiffusenessEneWeight, CLDFB_NO_CHANNELS_MAX ); - - /* Determine EQ for low bit rates (13.2 and 16.4 kbps) */ - applyLowBitRateEQ = 0; - if ( ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == MC_FORMAT ) && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE ) - { - applyLowBitRateEQ = 1; - if ( st_ivas->hDecoderConfig->ivas_total_brate == IVAS_16k4 ) - { - for ( bin = 0; bin < LOW_BIT_RATE_BINAURAL_EQ_BINS; bin++ ) - { - lowBitRateEQ[bin + LOW_BIT_RATE_BINAURAL_EQ_OFFSET] = lowBitRateBinauralEQ[bin] * 0.5f + 0.5f; - } - } - else - { - for ( bin = 0; bin < LOW_BIT_RATE_BINAURAL_EQ_BINS; bin++ ) - { - lowBitRateEQ[bin + LOW_BIT_RATE_BINAURAL_EQ_OFFSET] = lowBitRateBinauralEQ[bin]; - } - } - } - -#ifdef JBM_TSM_ON_TCS - slot_idx_start = hDirAC->slots_rendered; -#endif - - /* Formulate input and target covariance matrices combining all subframes */ - for ( subframe = firstSubframe; subframe < ( firstSubframe + nSubframes ); subframe++ ) - { - float subFrameTotalEne[CLDFB_NO_CHANNELS_MAX]; - - set_zero( subFrameTotalEne, CLDFB_NO_CHANNELS_MAX ); - - dirac_read_idx = hDirAC->dirac_read_idx; - - /* Calculate input covariance matrix */ -#ifdef JBM_TSM_ON_TCS - for ( slot = 0; slot < (uint8_t) hDirAC->subframe_nbslots[subframe]; slot++ ) -#else - for ( slot = 0; slot < (uint8_t) hDirAC->subframe_nbslots; slot++ ) -#endif - { -#ifdef JBM_TSM_ON_TCS - int16_t slotThis = slot + slot_idx_start; -#else - int16_t slotThis = slot + ( hDirAC->subframe_nbslots * subframe ); -#endif - - for ( bin = 0; bin < nBins; bin++ ) - { - for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - float instEne; - - instEne = ( inRe[ch][slotThis][bin] * inRe[ch][slotThis][bin] ); - instEne += ( inIm[ch][slotThis][bin] * inIm[ch][slotThis][bin] ); - h->ChEne[ch][bin] += instEne; - subFrameTotalEne[bin] += instEne; - } - h->ChCrossRe[bin] += inRe[0][slotThis][bin] * inRe[1][slotThis][bin]; - h->ChCrossRe[bin] += inIm[0][slotThis][bin] * inIm[1][slotThis][bin]; - h->ChCrossIm[bin] += inRe[0][slotThis][bin] * inIm[1][slotThis][bin]; - h->ChCrossIm[bin] -= inIm[0][slotThis][bin] * inRe[1][slotThis][bin]; - } - } - - /* Apply EQ at low bit rates */ - if ( applyLowBitRateEQ ) - { - int16_t lastEqBin = LOW_BIT_RATE_BINAURAL_EQ_OFFSET + LOW_BIT_RATE_BINAURAL_EQ_BINS - 1; - - for ( bin = LOW_BIT_RATE_BINAURAL_EQ_OFFSET; bin < lastEqBin; bin++ ) - { - subFrameTotalEne[bin] *= lowBitRateEQ[bin]; - } - for ( ; bin < nBins; bin++ ) - { - subFrameTotalEne[bin] *= lowBitRateEQ[lastEqBin]; - } - } - - if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->nchan_transport == 2 ) - { - float tempRe, tempIm; - - set_zero( subFrameTotalEne, CLDFB_NO_CHANNELS_MAX ); - -#ifdef JBM_TSM_ON_TCS - for ( slot = 0; slot < (uint8_t) hDirAC->subframe_nbslots[subframe]; slot++ ) -#else - for ( slot = 0; slot < (uint8_t) hDirAC->subframe_nbslots; slot++ ) -#endif - { -#ifdef JBM_TSM_ON_TCS - int16_t slotThis = slot + slot_idx_start; -#else - int16_t slotThis = slot + ( hDirAC->subframe_nbslots * subframe ); -#endif - - for ( bin = 0; bin < nBins; bin++ ) - { - tempRe = inRe[0][slotThis][bin] + inRe[1][slotThis][bin]; - tempIm = inIm[0][slotThis][bin] + inIm[1][slotThis][bin]; - subFrameTotalEne[bin] += tempRe * tempRe + tempIm * tempIm; - } - } - } - - /* Determine target covariance matrix containing target binaural properties */ - for ( bin = 0; bin < nBins; bin++ ) - { - float diffuseness = 1.0f; /* ratio1 and ratio2 are subtracted from diffuseness further below */ - float surCoh = 0.0f, spreadCoh = 0.0f; /* Default values if spreadSurroundCoherenceApplied == false */ - float diffEne, dirEne, meanEnePerCh; - uint16_t dirIndex; - - /* When BINAURAL_ROOM is not indicated, hBinaural->earlyPartEneCorrection[bin] values are all 1.0f. - * When BINAURAL_ROOM is indicated, the binaural audio output is based on combined use of the - * HRTF data set and a BRIR-based data set. The HRTF data set is spectrally corrected to match - * the early spectrum of the BRIR data, using the spectral correction data in - * hBinaural->earlyPartEneCorrection[bin], based on the BRIR set. */ - meanEnePerCh = h->earlyPartEneCorrection[bin] * subFrameTotalEne[bin] / 2.0f; - - /* Determine direct part target covariance matrix (for 1 or 2 directions) */ - for ( dirIndex = 0; dirIndex < hDirAC->numSimultaneousDirections; dirIndex++ ) - { - int16_t aziDeg, eleDeg; - float lRealp, lImagp, rRealp, rImagp; - float lRealpTmp, lImagpTmp, rRealpTmp, rImagpTmp; - float hrtfEne[BINAURAL_CHANNELS], hrtfCrossRe, hrtfCrossIm, ratio; - - if ( dirIndex == 0 ) /* For first of the two simultaneous directions */ - { - aziDeg = hDirAC->azimuth[dirac_read_idx][bin]; - eleDeg = hDirAC->elevation[dirac_read_idx][bin]; - ratio = hDirAC->energy_ratio1[dirac_read_idx][bin]; - spreadCoh = hDirAC->spreadCoherence[dirac_read_idx][bin]; - } - else /* For second of the two simultaneous directions */ - { - aziDeg = hDirAC->azimuth2[dirac_read_idx][bin]; - eleDeg = hDirAC->elevation2[dirac_read_idx][bin]; - ratio = hDirAC->energy_ratio2[dirac_read_idx][bin]; - spreadCoh = hDirAC->spreadCoherence2[dirac_read_idx][bin]; - } - diffuseness -= ratio; /* diffuseness = 1 - ratio1 - ratio2 */ - - if ( separateCenterChannelRendering ) - { - /* In masa + mono rendering mode, the center directions originate from phantom sources, so the - * spread coherence is increased */ - float aziRad, eleRad, doaVectorX, spatialAngleDeg, altSpreadCoh; - - aziRad = (float) aziDeg * PI_OVER_180; - eleRad = (float) eleDeg * PI_OVER_180; - doaVectorX = cosf( aziRad ) * cosf( eleRad ); - spatialAngleDeg = acosf( doaVectorX ) * _180_OVER_PI; - altSpreadCoh = 1.0f - ( spatialAngleDeg / 30.0f ); - spreadCoh = max( spreadCoh, altSpreadCoh ); - } - - getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, h->renderStereoOutputInsteadOfBinaural, Rmat ); - - if ( h->renderStereoOutputInsteadOfBinaural ) - { - /* Synthesizing spread coherence is not needed for stereo loudspeaker output, - * as directional sound is reproduced with two loudspeakers in any case */ - spreadCoh = 0.0f; - } - - if ( spreadCoh > 0.0f ) - { - float centerMul, sidesMul; - float hrtfEneCenter, hrtfEneSides, hrtfEneRealized, eneCorrectionFactor; - float w1, w2, w3, eq; - - hrtfEneCenter = ( lRealp * lRealp ) + ( lImagp * lImagp ) + ( rRealp * rRealp ) + ( rImagp * rImagp ); - - /* Spread coherence is synthesized as coherent sources at 30 degree horizontal spacing. - * The following formulas determine the gains for these sources. - * spreadCoh = 0: Only panning - * spreadCoh = 0.5: Three sources coherent panning (e.g. 30 0 -30 deg azi) - * spreadCoh = 1.0: Two sources coherent panning with gap (as above, but center is silent) */ - if ( spreadCoh < 0.5f ) - { - /* 0.0f < spreadCoh < 0.5f */ - sidesMul = 0.5774f * spreadCoh * 2.0f; /* sqrt(1/3) = 0.5774f */ - centerMul = 1.0f - ( spreadCoh * 2.0f ) + sidesMul; - } - else - { - /* 0.5f <= spreadCoh < 1.0f */ - centerMul = 2.0f - ( 2.0f * spreadCoh ); - sidesMul = inv_sqrt( centerMul + 2.0f ); - centerMul *= sidesMul; - } - - /* Apply the gain for the center source of the three coherent sources */ - lRealp *= centerMul; - lImagp *= centerMul; - rRealp *= centerMul; - rImagp *= centerMul; - - /* Apply the gain for the left source of the three coherent sources */ - getDirectPartGains( bin, aziDeg + 30, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat ); - - hrtfEneSides = ( lRealpTmp * lRealpTmp ) + ( lImagpTmp * lImagpTmp ) + ( rRealpTmp * rRealpTmp ) + ( rImagpTmp * rImagpTmp ); - lRealp += sidesMul * lRealpTmp; - lImagp += sidesMul * lImagpTmp; - rRealp += sidesMul * rRealpTmp; - rImagp += sidesMul * rImagpTmp; - - /* Apply the gain for the right source of the three coherent sources. - * -30 degrees to 330 wrapping due to internal functions. */ - getDirectPartGains( bin, aziDeg + 330, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat ); - - hrtfEneSides += ( lRealpTmp * lRealpTmp ) + ( lImagpTmp * lImagpTmp ) + ( rRealpTmp * rRealpTmp ) + ( rImagpTmp * rImagpTmp ); - lRealp += sidesMul * lRealpTmp; - lImagp += sidesMul * lImagpTmp; - rRealp += sidesMul * rRealpTmp; - rImagp += sidesMul * rImagpTmp; - - /* Formulate an eneCorrectionFactor that compensates for the coherent summation of the HRTFs */ - hrtfEneRealized = ( lRealp * lRealp ) + ( lImagp * lImagp ) + ( rRealp * rRealp ) + ( rImagp * rImagp ); - eneCorrectionFactor = ( ( hrtfEneSides * sidesMul * sidesMul ) + - ( hrtfEneCenter * centerMul * centerMul ) ) / - max( 1e-12f, hrtfEneRealized ); - - /* Weighting factors to determine appropriate target spectrum for spread coherent sound */ - if ( spreadCoh < 0.5 ) - { - w1 = 1.0f - 2.0f * spreadCoh; - w2 = 2.0f * spreadCoh; - w3 = 0.0f; - } - else - { - w1 = 0.0f; - w2 = 2.0f - 2.0f * spreadCoh; - w3 = 2.0f * spreadCoh - 1.0f; - } - - if ( ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) ) - { - idx = min( bin, MASA_NUM_DEFINED_SUR_SPR_COH_ENE_BINS - 1 ); - - /* Apply the target spectrum to the eneCorrectionFactor */ - if ( separateCenterChannelRendering ) /* spreadCoh mostly originates from phantom sources in separate channel rendering mode */ - { - eneCorrectionFactor *= w1 * 1.0f + ( w2 + w3 ) * spreadCohEne1[idx]; - } - else - { - eneCorrectionFactor *= w1 * 1.0f + w2 * spreadCohEne05[idx] + w3 * spreadCohEne1[idx]; - } - } - - /* Equalize the spread coherent combined HRTFs */ - eq = min( 4.0f, sqrtf( eneCorrectionFactor ) ); - lRealp *= eq; - lImagp *= eq; - rRealp *= eq; - rImagp *= eq; - } - - hrtfEne[0] = ( lRealp * lRealp ) + ( lImagp * lImagp ); - hrtfEne[1] = ( rRealp * rRealp ) + ( rImagp * rImagp ); - hrtfCrossRe = ( lRealp * rRealp ) + ( lImagp * rImagp ); - hrtfCrossIm = ( -lImagp * rRealp ) + ( lRealp * rImagp ); - - /* Add direct part (1 or 2) covariance matrix */ - dirEne = ratio * meanEnePerCh; - h->ChEneOut[0][bin] += dirEne * hrtfEne[0]; /* Dir ene part*/ - h->ChEneOut[1][bin] += dirEne * hrtfEne[1]; - h->ChCrossReOut[bin] += dirEne * hrtfCrossRe; /* Dir cross re */ - h->ChCrossImOut[bin] += dirEne * hrtfCrossIm; /* Dir cross im */ - } - - /* Add diffuse / ambient part covariance matrix */ - diffuseness = max( 0.0f, diffuseness ); - diffEne = diffuseness * meanEnePerCh; - surCoh = hDirAC->surroundingCoherence[dirac_read_idx][bin]; - if ( ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) ) - { - if ( !h->renderStereoOutputInsteadOfBinaural ) - { - idx = min( bin, MASA_NUM_DEFINED_SUR_SPR_COH_ENE_BINS - 1 ); - /* Apply target spectrum that emphasizes low frequencies when the sound is surround coherent */ - diffEne *= ( 1.0f - surCoh ) + surCoh * surCohEne[idx]; - } - } - h->ChEneOut[0][bin] += diffEne; /* Diff ene part*/ - h->ChEneOut[1][bin] += diffEne; - - if ( h->renderStereoOutputInsteadOfBinaural ) - { - /* When rendering stereo, ambience (except for surround coherent sound) has zero ICC. */ - h->ChCrossReOut[bin] += surCoh * diffEne; - } - else /* When rendering binaural, ambience has frequency dependent ICC. */ - { - if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && bin < BINAURAL_COHERENCE_DIFFERENCE_BINS ) - { - float diffuseFieldCoherence; - diffuseFieldCoherence = hDirAC->hDiffuseDist->diffuseRatioX[subframe][bin] * h->diffuseFieldCoherenceX[bin] + hDirAC->hDiffuseDist->diffuseRatioY[subframe][bin] * h->diffuseFieldCoherenceY[bin] + hDirAC->hDiffuseDist->diffuseRatioZ[subframe][bin] * h->diffuseFieldCoherenceZ[bin]; - h->ChCrossReOut[bin] += ( ( 1.0f - surCoh ) * diffuseFieldCoherence + surCoh ) * diffEne; - } - else - { - h->ChCrossReOut[bin] += ( ( 1.0f - surCoh ) * h->diffuseFieldCoherence[bin] + surCoh ) * diffEne; - } - } - - /* Store parameters for formulating average diffuseness over frame */ - h->frameMeanDiffuseness[bin] += diffEne; - frameMeanDiffusenessEneWeight[bin] += meanEnePerCh; - } - hDirAC->dirac_read_idx = ( hDirAC->dirac_read_idx + 1 ) % hDirAC->dirac_md_buffer_length; -#ifdef JBM_TSM_ON_TCS - slot_idx_start += hDirAC->subframe_nbslots[subframe]; -#endif - } - /* Formulate average diffuseness over frame */ for ( bin = 0; bin < nBins; bin++ ) { @@ -2551,11 +1134,11 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric /* Temporal IIR-type smoothing of covariance matrices */ if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE ) { - IIReneLimiterFactor = 16.0f / (float) nSubframes + ( 1.0f - qualityBasedSmFactor ); + IIReneLimiterFactor = 16.0f + ( 1.0f - qualityBasedSmFactor ); } else { - IIReneLimiterFactor = 8.0f / (float) nSubframes + ( 1.0f - qualityBasedSmFactor ); + IIReneLimiterFactor = 8.0f + ( 1.0f - qualityBasedSmFactor ); } for ( bin = 0; bin < nBins; bin++ ) { @@ -2604,7 +1187,6 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric return; } -#endif static void ivas_dirac_dec_binaural_determine_processing_matrices( @@ -2612,11 +1194,7 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices( const int16_t max_band_decorr, float Rmat[3][3] ) { -#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS int16_t chA, chB, bin; -#else - uint8_t chA, chB, bin; -#endif uint8_t separateCenterChannelRendering; int16_t nBins; DIRAC_DEC_BIN_HANDLE h; @@ -2739,334 +1317,107 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices( for ( chB = 0; chB < BINAURAL_CHANNELS; chB++ ) { h->processMtxRePrev[chA][chB][bin] = h->processMtxRe[chA][chB][bin]; - h->processMtxImPrev[chA][chB][bin] = h->processMtxIm[chA][chB][bin]; - h->processMtxDecRePrev[chA][chB][bin] = h->processMtxDecRe[chA][chB][bin]; - h->processMtxDecImPrev[chA][chB][bin] = h->processMtxDecIm[chA][chB][bin]; - - h->processMtxRe[chA][chB][bin] = Mre[chA][chB]; - h->processMtxIm[chA][chB][bin] = Mim[chA][chB]; - h->processMtxDecRe[chA][chB][bin] = MdecRe[chA][chB]; - h->processMtxDecIm[chA][chB][bin] = MdecIm[chA][chB]; - } - } - - if ( separateCenterChannelRendering ) - { - /* The rendering of the separate center channel in masa + mono mode. - * The center channel is processed with a gain factor 0.8414f to match the loudness of different processing paths */ - float lRealp, lImagp, rRealp, rImagp; - float gainFactor; - int16_t aziDeg = 0; - int16_t eleDeg = 0; - - gainFactor = 0.8414f * sqrtf( h->earlyPartEneCorrection[bin] ); - for ( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) - { - h->processMtxRePrev[chA][2][bin] = h->processMtxRe[chA][2][bin]; - h->processMtxImPrev[chA][2][bin] = h->processMtxIm[chA][2][bin]; - } - - getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, h->renderStereoOutputInsteadOfBinaural, Rmat ); - - h->processMtxRe[0][2][bin] = lRealp * gainFactor; - h->processMtxIm[0][2][bin] = lImagp * gainFactor; - h->processMtxRe[1][2][bin] = rRealp * gainFactor; - h->processMtxIm[1][2][bin] = rImagp * gainFactor; - } - } - - return; -} - -#ifdef JBM_TSM_ON_TCS -#ifndef FIX_355_REFACTOR_PARAMBIN_TO_5MS -static void ivas_dirac_dec_binaural_process_output_sf( - Decoder_Struct *st_ivas, - float *output_f[], - float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], - float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], - const int16_t max_band_decorr, - const uint8_t numInChannels ) -{ - uint8_t slot, bin, chA, chB; - int16_t nBins; - float outSlotRe[CLDFB_NO_CHANNELS_MAX], outSlotIm[CLDFB_NO_CHANNELS_MAX]; - float decSlotRe[BINAURAL_CHANNELS][CLDFB_NO_CHANNELS_MAX], decSlotIm[BINAURAL_CHANNELS][CLDFB_NO_CHANNELS_MAX]; - float reverbRe[BINAURAL_CHANNELS][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; - float reverbIm[BINAURAL_CHANNELS][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; - uint16_t numSlots; - DIRAC_DEC_BIN_HANDLE h; - float interpVal; - float *decSlotRePointer; - float *decSlotImPointer; - - numSlots = st_ivas->hDirAC->subframe_nbslots[st_ivas->hDirAC->subframes_rendered]; - h = st_ivas->hDiracDecBin; - nBins = st_ivas->hDirAC->num_freq_bands; - - - interpVal = 0.0f; - for ( slot = 0; slot < numSlots; slot++ ) - { - interpVal += 1.0f / (float) numSlots; - - if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) - { - /* Process second / room effect part of binaural output when needed */ - ivas_binaural_reverb_processSlot( st_ivas->hDiracDecBin->hReverb, numInChannels, inRe, inIm, reverbRe, reverbIm, slot ); - } - if ( !st_ivas->hDiracDecBin->useTdDecorr && max_band_decorr > 0 ) - { -#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS - ivas_dirac_dec_decorrelate_slot( st_ivas->hDirAC, slot, inRe, inIm, decSlotRe, decSlotIm ); -#else - ivas_dirac_dec_decorrelate_slot_sf( st_ivas->hDirAC, slot, inRe, inIm, decSlotRe, decSlotIm ); -#endif - } - - for ( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) - { - float *outSlotRePr, *outSlotImPr; /* Pointers needed for function call compatibility */ - - set_zero( outSlotRe, CLDFB_NO_CHANNELS_MAX ); - set_zero( outSlotIm, CLDFB_NO_CHANNELS_MAX ); - - /* Processing of the first / HRTF part of the binaural output. */ - for ( chB = 0; chB < numInChannels; chB++ ) - { - if ( st_ivas->hDiracDecBin->useTdDecorr ) - { - decSlotRePointer = inRe[chB + 2][slot]; - decSlotImPointer = inIm[chB + 2][slot]; - } - else - { - decSlotRePointer = decSlotRe[chB]; - decSlotImPointer = decSlotIm[chB]; - } - - for ( bin = 0; bin < nBins; bin++ ) - { - float gain; - - /* Mixing using the formulated processing matrix M */ - gain = ( 1.0f - interpVal ) * h->processMtxRePrev[chA][chB][bin] + - interpVal * h->processMtxRe[chA][chB][bin]; - outSlotRe[bin] += gain * inRe[chB][slot][bin]; - outSlotIm[bin] += gain * inIm[chB][slot][bin]; - - gain = ( 1.0f - interpVal ) * h->processMtxImPrev[chA][chB][bin] + - interpVal * h->processMtxIm[chA][chB][bin]; - outSlotRe[bin] -= gain * inIm[chB][slot][bin]; - outSlotIm[bin] += gain * inRe[chB][slot][bin]; - - /* Mixing decorrelated signals using the formulated residual processing matrix Mdec */ - if ( bin < max_band_decorr && chB < 2 ) - { - gain = ( 1.0f - interpVal ) * h->processMtxDecRePrev[chA][chB][bin] + - interpVal * h->processMtxDecRe[chA][chB][bin]; - outSlotRe[bin] += gain * decSlotRePointer[bin]; - outSlotIm[bin] += gain * decSlotImPointer[bin]; - - gain = ( 1.0f - interpVal ) * h->processMtxDecImPrev[chA][chB][bin] + - interpVal * h->processMtxDecIm[chA][chB][bin]; - outSlotRe[bin] -= gain * decSlotImPointer[bin]; - outSlotIm[bin] += gain * decSlotRePointer[bin]; - } - } - } - - if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) - { - /* Combine second (reverb) part with the first (HRTF) part to obtain binaural output signal with room effect */ - v_add( outSlotRe, reverbRe[chA][slot], outSlotRe, CLDFB_NO_CHANNELS_MAX ); - v_add( outSlotIm, reverbIm[chA][slot], outSlotIm, CLDFB_NO_CHANNELS_MAX ); - } - - outSlotRePr = &( outSlotRe[0] ); - outSlotImPr = &( outSlotIm[0] ); - - /* Inverse filter bank */ - cldfbSynthesis( &outSlotRePr, &outSlotImPr, &( output_f[chA][nBins * slot] ), nBins, st_ivas->cldfbSynDec[chA] ); - } - } - - return; -} -#endif -#endif - -#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS -static void ivas_dirac_dec_binaural_process_output( - Decoder_Struct *st_ivas, -#ifdef JBM_TSM_ON_TCS - float *output_f[], -#else - float output_f[][L_FRAME48k], -#endif - float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], - float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], - const int16_t max_band_decorr, - const int16_t numInChannels, - const int16_t subframe ) -{ - int16_t slot, bin, chA, chB; - int16_t nBins; - float outSlotRe[CLDFB_NO_CHANNELS_MAX], outSlotIm[CLDFB_NO_CHANNELS_MAX]; - float decSlotRe[BINAURAL_CHANNELS][CLDFB_NO_CHANNELS_MAX], decSlotIm[BINAURAL_CHANNELS][CLDFB_NO_CHANNELS_MAX]; - float reverbRe[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; - float reverbIm[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; - DIRAC_DEC_BIN_HANDLE h; - float interpVal; - float *decSlotRePointer; - float *decSlotImPointer; - int16_t offsetSamples; -#ifdef JBM_TSM_ON_TCS - int16_t nSlots; -#endif - - h = st_ivas->hDiracDecBin; - nBins = st_ivas->hDirAC->num_freq_bands; -#ifdef JBM_TSM_ON_TCS - offsetSamples = 0; - nSlots = st_ivas->hDirAC->subframe_nbslots[subframe]; -#else - offsetSamples = subframe * CLDFB_SLOTS_PER_SUBFRAME * nBins; -#endif - - if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) - { - /* Process second / room effect part of binaural output when needed */ -#ifdef JBM_TSM_ON_TCS - ivas_binaural_reverb_processSubframe( st_ivas->hDiracDecBin->hReverb, numInChannels, nSlots, inRe, inIm, reverbRe, reverbIm ); -#else - ivas_binaural_reverb_processSubframe( st_ivas->hDiracDecBin->hReverb, numInChannels, inRe, inIm, reverbRe, reverbIm ); -#endif - } - - interpVal = 0.0f; -#ifdef JBM_TSM_ON_TCS - for ( slot = 0; slot < nSlots; slot++ ) -#else - for ( slot = 0; slot < CLDFB_SLOTS_PER_SUBFRAME; slot++ ) -#endif - { -#ifdef JBM_TSM_ON_TCS - interpVal += 1.0f / (float) nSlots; -#else - interpVal += 1.0f / ( (float) CLDFB_SLOTS_PER_SUBFRAME ); -#endif - if ( !st_ivas->hDiracDecBin->useTdDecorr && max_band_decorr > 0 ) - { - ivas_dirac_dec_decorrelate_slot( st_ivas->hDirAC, slot, inRe, inIm, decSlotRe, decSlotIm ); - } - - for ( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) - { - float *outSlotRePr, *outSlotImPr; /* Pointers needed for function call compatibility */ - - set_zero( outSlotRe, CLDFB_NO_CHANNELS_MAX ); - set_zero( outSlotIm, CLDFB_NO_CHANNELS_MAX ); - - /* Processing of the first / HRTF part of the binaural output. */ - for ( chB = 0; chB < numInChannels; chB++ ) - { - if ( st_ivas->hDiracDecBin->useTdDecorr ) - { - decSlotRePointer = inRe[chB + 2][slot]; - decSlotImPointer = inIm[chB + 2][slot]; - } - else - { - decSlotRePointer = decSlotRe[chB]; - decSlotImPointer = decSlotIm[chB]; - } - - for ( bin = 0; bin < nBins; bin++ ) - { - float gain; - - /* Mixing using the formulated processing matrix M */ - gain = ( 1.0f - interpVal ) * h->processMtxRePrev[chA][chB][bin] + - interpVal * h->processMtxRe[chA][chB][bin]; - outSlotRe[bin] += gain * inRe[chB][slot][bin]; - outSlotIm[bin] += gain * inIm[chB][slot][bin]; - - gain = ( 1.0f - interpVal ) * h->processMtxImPrev[chA][chB][bin] + - interpVal * h->processMtxIm[chA][chB][bin]; - outSlotRe[bin] -= gain * inIm[chB][slot][bin]; - outSlotIm[bin] += gain * inRe[chB][slot][bin]; - - /* Mixing decorrelated signals using the formulated residual processing matrix Mdec */ - if ( bin < max_band_decorr && chB < 2 ) - { - gain = ( 1.0f - interpVal ) * h->processMtxDecRePrev[chA][chB][bin] + - interpVal * h->processMtxDecRe[chA][chB][bin]; - outSlotRe[bin] += gain * decSlotRePointer[bin]; - outSlotIm[bin] += gain * decSlotImPointer[bin]; + h->processMtxImPrev[chA][chB][bin] = h->processMtxIm[chA][chB][bin]; + h->processMtxDecRePrev[chA][chB][bin] = h->processMtxDecRe[chA][chB][bin]; + h->processMtxDecImPrev[chA][chB][bin] = h->processMtxDecIm[chA][chB][bin]; - gain = ( 1.0f - interpVal ) * h->processMtxDecImPrev[chA][chB][bin] + - interpVal * h->processMtxDecIm[chA][chB][bin]; - outSlotRe[bin] -= gain * decSlotImPointer[bin]; - outSlotIm[bin] += gain * decSlotRePointer[bin]; - } - } + h->processMtxRe[chA][chB][bin] = Mre[chA][chB]; + h->processMtxIm[chA][chB][bin] = Mim[chA][chB]; + h->processMtxDecRe[chA][chB][bin] = MdecRe[chA][chB]; + h->processMtxDecIm[chA][chB][bin] = MdecIm[chA][chB]; } + } - if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) + if ( separateCenterChannelRendering ) + { + /* The rendering of the separate center channel in masa + mono mode. + * The center channel is processed with a gain factor 0.8414f to match the loudness of different processing paths */ + float lRealp, lImagp, rRealp, rImagp; + float gainFactor; + int16_t aziDeg = 0; + int16_t eleDeg = 0; + + gainFactor = 0.8414f * sqrtf( h->earlyPartEneCorrection[bin] ); + for ( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) { - /* Combine second (reverb) part with the first (HRTF) part to obtain binaural output signal with room effect */ - v_add( outSlotRe, reverbRe[chA][slot], outSlotRe, CLDFB_NO_CHANNELS_MAX ); - v_add( outSlotIm, reverbIm[chA][slot], outSlotIm, CLDFB_NO_CHANNELS_MAX ); + h->processMtxRePrev[chA][2][bin] = h->processMtxRe[chA][2][bin]; + h->processMtxImPrev[chA][2][bin] = h->processMtxIm[chA][2][bin]; } - outSlotRePr = &( outSlotRe[0] ); - outSlotImPr = &( outSlotIm[0] ); + getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, h->renderStereoOutputInsteadOfBinaural, Rmat ); - /* Inverse filter bank */ - cldfbSynthesis( &outSlotRePr, &outSlotImPr, &( output_f[chA][nBins * slot + offsetSamples] ), nBins, st_ivas->cldfbSynDec[chA] ); + h->processMtxRe[0][2][bin] = lRealp * gainFactor; + h->processMtxIm[0][2][bin] = lImagp * gainFactor; + h->processMtxRe[1][2][bin] = rRealp * gainFactor; + h->processMtxIm[1][2][bin] = rImagp * gainFactor; } } return; } -#else + +#ifdef JBM_TSM_ON_TCS +#endif + static void ivas_dirac_dec_binaural_process_output( Decoder_Struct *st_ivas, +#ifdef JBM_TSM_ON_TCS + float *output_f[], +#else float output_f[][L_FRAME48k], - float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], +#endif + float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t max_band_decorr, - const uint8_t numInChannels, - const uint8_t firstSlot, - const uint8_t slotEnd ) + const int16_t numInChannels, + const int16_t subframe ) { - uint8_t slot, bin, chA, chB; + int16_t slot, bin, chA, chB; int16_t nBins; float outSlotRe[CLDFB_NO_CHANNELS_MAX], outSlotIm[CLDFB_NO_CHANNELS_MAX]; float decSlotRe[BINAURAL_CHANNELS][CLDFB_NO_CHANNELS_MAX], decSlotIm[BINAURAL_CHANNELS][CLDFB_NO_CHANNELS_MAX]; - float reverbRe[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - float reverbIm[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - uint8_t numSlots; + float reverbRe[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float reverbIm[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; DIRAC_DEC_BIN_HANDLE h; float interpVal; float *decSlotRePointer; float *decSlotImPointer; + int16_t offsetSamples; +#ifdef JBM_TSM_ON_TCS + int16_t nSlots; +#endif - numSlots = slotEnd - firstSlot; h = st_ivas->hDiracDecBin; nBins = st_ivas->hDirAC->num_freq_bands; +#ifdef JBM_TSM_ON_TCS + offsetSamples = 0; + nSlots = st_ivas->hDirAC->subframe_nbslots[subframe]; +#else + offsetSamples = subframe * CLDFB_SLOTS_PER_SUBFRAME * nBins; +#endif if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) { /* Process second / room effect part of binaural output when needed */ - ivas_binaural_reverb_processFrame( st_ivas->hDiracDecBin->hReverb, numInChannels, inRe, inIm, reverbRe, reverbIm, firstSlot ); +#ifdef JBM_TSM_ON_TCS + ivas_binaural_reverb_processSubframe( st_ivas->hDiracDecBin->hReverb, numInChannels, nSlots, inRe, inIm, reverbRe, reverbIm ); +#else + ivas_binaural_reverb_processSubframe( st_ivas->hDiracDecBin->hReverb, numInChannels, inRe, inIm, reverbRe, reverbIm ); +#endif } interpVal = 0.0f; - for ( slot = firstSlot; slot < ( firstSlot + numSlots ); slot++ ) +#ifdef JBM_TSM_ON_TCS + for ( slot = 0; slot < nSlots; slot++ ) +#else + for ( slot = 0; slot < CLDFB_SLOTS_PER_SUBFRAME; slot++ ) +#endif { - interpVal += 1.0f / (float) numSlots; +#ifdef JBM_TSM_ON_TCS + interpVal += 1.0f / (float) nSlots; +#else + interpVal += 1.0f / ( (float) CLDFB_SLOTS_PER_SUBFRAME ); +#endif if ( !st_ivas->hDiracDecBin->useTdDecorr && max_band_decorr > 0 ) { ivas_dirac_dec_decorrelate_slot( st_ivas->hDirAC, slot, inRe, inIm, decSlotRe, decSlotIm ); @@ -3135,121 +1486,16 @@ static void ivas_dirac_dec_binaural_process_output( outSlotImPr = &( outSlotIm[0] ); /* Inverse filter bank */ - cldfbSynthesis( &outSlotRePr, &outSlotImPr, &( output_f[chA][nBins * slot] ), nBins, st_ivas->cldfbSynDec[chA] ); + cldfbSynthesis( &outSlotRePr, &outSlotImPr, &( output_f[chA][nBins * slot + offsetSamples] ), nBins, st_ivas->cldfbSynDec[chA] ); } } return; } -#endif #ifdef JBM_TSM_ON_TCS -#ifndef FIX_355_REFACTOR_PARAMBIN_TO_5MS -static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked_sf( - HEAD_TRACK_DATA_HANDLE hHeadTrackData, - float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], - float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], - const uint8_t slotEnd, - const uint8_t nBins, - float Rmat[3][3] ) -{ - uint8_t slot, bin, ch; - float tmpVal; - - /* When not currently in prototype signal left-right switching procedure, check if such switching is needed */ - if ( hHeadTrackData->lrSwitchedNext == hHeadTrackData->lrSwitchedCurrent ) - { - float thresholdDotProduct = 0.17f; /* Corresponds to 10-degree switching threshold */ - if ( ( hHeadTrackData->lrSwitchedCurrent == 0 ) && ( Rmat[1][1] < -thresholdDotProduct ) ) - { - hHeadTrackData->lrSwitchedNext = 1; - } - if ( ( hHeadTrackData->lrSwitchedCurrent == 1 ) && ( Rmat[1][1] > thresholdDotProduct ) ) - { - hHeadTrackData->lrSwitchedNext = 0; - } - } - - /* When currently in interpolation */ - if ( hHeadTrackData->lrSwitchedNext != hHeadTrackData->lrSwitchedCurrent ) - { - for ( slot = 0; slot < slotEnd; slot++ ) - { - float switchOrderFactor, origOrderFactor; - - hHeadTrackData->lrSwitchInterpVal += 0.0025f; /* Corresponds to 0.5 seconds interpolation time */ - - if ( hHeadTrackData->lrSwitchInterpVal > 0.999f ) - { - /* Stop interpolation, reset values */ - hHeadTrackData->lrSwitchInterpVal = 0.0f; - hHeadTrackData->lrSwitchedCurrent = hHeadTrackData->lrSwitchedNext; - } - - /* Gains for determining portion of switched channel order and original channel order */ - tmpVal = (float) hHeadTrackData->lrSwitchedNext * hHeadTrackData->lrSwitchInterpVal; - tmpVal += (float) hHeadTrackData->lrSwitchedCurrent * ( 1.0f - hHeadTrackData->lrSwitchInterpVal ); - switchOrderFactor = sqrtf( tmpVal ); - origOrderFactor = sqrtf( 1.0f - tmpVal ); - - for ( bin = 0; bin < nBins; bin++ ) - { - /* determine original order (1) signals and switched order (2) signals */ - float re1[BINAURAL_CHANNELS], re2[BINAURAL_CHANNELS], im1[BINAURAL_CHANNELS], im2[BINAURAL_CHANNELS]; - - for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - re1[ch] = inRe[ch][slot][bin] * origOrderFactor; - re2[ch] = inRe[1 - ch][slot][bin] * switchOrderFactor; - im1[ch] = inIm[ch][slot][bin] * origOrderFactor; - im2[ch] = inIm[1 - ch][slot][bin] * switchOrderFactor; - } - - for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - float eneRef, ene, eq; - - /* Interpolate / mix original and switched order signals */ - inRe[ch][slot][bin] = re1[ch] + re2[ch]; - inIm[ch][slot][bin] = im1[ch] + im2[ch]; - - /* Equalize interpolated signals to preserve energy per bin */ - eneRef = ( re1[ch] * re1[ch] ) + ( re2[ch] * re2[ch] ) + ( im1[ch] * im1[ch] ) + ( im2[ch] * im2[ch] ); - ene = ( inRe[ch][slot][bin] * inRe[ch][slot][bin] ) + ( inIm[ch][slot][bin] * inIm[ch][slot][bin] ); - eq = sqrtf( eneRef / fmaxf( 1e-12f, ene ) ); - eq = fminf( 4.0f, eq ); - inRe[ch][slot][bin] *= eq; - inIm[ch][slot][bin] *= eq; - } - } - } - } - else - { - /* If not in interpolation, but in switched prototype situation, then switch left and right channels */ - if ( hHeadTrackData->lrSwitchedCurrent == 1 ) - { - for ( slot = 0; slot < slotEnd; slot++ ) - { - for ( bin = 0; bin < nBins; bin++ ) - { - tmpVal = inRe[0][slot][bin]; - inRe[0][slot][bin] = inRe[1][slot][bin]; - inRe[1][slot][bin] = tmpVal; - tmpVal = inIm[0][slot][bin]; - inIm[0][slot][bin] = inIm[1][slot][bin]; - inIm[1][slot][bin] = tmpVal; - } - } - } - } - - return; -} -#endif #endif -#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS static void adaptTransportSignalsHeadtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], @@ -3378,158 +1624,18 @@ static void adaptTransportSignalsHeadtracked( return; } -#else -static void adaptTransportSignalsHeadtracked( - HEAD_TRACK_DATA_HANDLE hHeadTrackData, - float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - const uint8_t firstSlot, - const uint8_t slotEnd, - const uint8_t nBins, - float Rmat[3][3] ) -{ - int16_t slot, ch, bin, louderCh; - float ILD, mono_factor_ILD, mono_factor_rotation, mono_factor, y_val, ene_proc, ene_target; - uint8_t n_slots_per_sf, sf_idx, n_sf; - int16_t max_band; - - /* Determine head-orientation-based mono factor. - Rmat[1][1] entry informs how close the ears are aligned according to transport signals. */ - y_val = 1.0f - fabsf( Rmat[1][1] ); - mono_factor_rotation = ( y_val - ADAPT_HTPROTO_ROT_LIM_0 ) / ( ADAPT_HTPROTO_ROT_LIM_1 - ADAPT_HTPROTO_ROT_LIM_0 ); - mono_factor_rotation = fmaxf( 0.0f, fminf( 1.0f, mono_factor_rotation ) ); - - /* Adapt transport signals in frequency bands */ - /* optimization grouping CLDFB bins into MASA bands (they are readily available in ROM and suitable for the task) AND group CLDFB slots into sub-frames */ - n_slots_per_sf = CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; - n_sf = ( slotEnd - firstSlot ) / n_slots_per_sf; - - max_band = 0; - while ( max_band < MASA_FREQUENCY_BANDS && MASA_band_grouping_24[max_band] < nBins ) - { - max_band++; - } - - for ( sf_idx = 0; sf_idx < n_sf; sf_idx++ ) - { - float eqVal; - uint8_t start_slot, stop_slot; - int16_t band_idx, bin_lo, bin_hi; - - start_slot = firstSlot + sf_idx * n_slots_per_sf; - stop_slot = start_slot + n_slots_per_sf; - - for ( band_idx = 0; band_idx < max_band; band_idx++ ) - { - float ch_nrg[2]; /* storage for input signal channel energies */ - bin_lo = MASA_band_grouping_24[band_idx]; - bin_hi = min( MASA_band_grouping_24[band_idx + 1], (int16_t) nBins ); - for ( ch = 0; ch < 2; ch++ ) - { - ch_nrg[ch] = 0.0f; - for ( slot = start_slot; slot < stop_slot; slot++ ) - { - for ( bin = bin_lo; bin < bin_hi; bin++ ) - { - ch_nrg[ch] += ( inRe[ch][slot][bin] * inRe[ch][slot][bin] ) + ( inIm[ch][slot][bin] * inIm[ch][slot][bin] ); - } - } - hHeadTrackData->chEneIIR[ch][band_idx] *= ADAPT_HTPROTO_IIR_FAC; - hHeadTrackData->chEneIIR[ch][band_idx] += ( 1.0f - ADAPT_HTPROTO_IIR_FAC ) * ch_nrg[ch]; - } - - /* Determine ILD */ - ILD = fabsf( 10.0f * log10f( fmaxf( 1e-12f, hHeadTrackData->chEneIIR[0][band_idx] ) / fmaxf( 1e-12f, hHeadTrackData->chEneIIR[1][band_idx] ) ) ); - if ( hHeadTrackData->chEneIIR[1][band_idx] > hHeadTrackData->chEneIIR[0][band_idx] ) - { - louderCh = 1; - } - else - { - louderCh = 0; - } - - /* Determine ILD-based mono factor */ - mono_factor_ILD = ( ILD - ADAPT_HTPROTO_ILD_LIM_DB0 ) / ( ADAPT_HTPROTO_ILD_LIM_DB1 - ADAPT_HTPROTO_ILD_LIM_DB0 ); - mono_factor_ILD = fmaxf( 0.0f, fminf( 1.0f, mono_factor_ILD ) ); - - /* Combine mono factors */ - mono_factor = mono_factor_ILD * mono_factor_rotation; - - /* Mix original audio and sum signal according to determined mono factor */ - for ( ch = 0; ch < 2; ch++ ) - { - if ( ch != louderCh ) - { - float band_nrg = 0.0f; - - for ( slot = start_slot; slot < stop_slot; slot++ ) - { - for ( bin = bin_lo; bin < bin_hi; bin++ ) - { - /* mono sum signal with the computed weight + rest from the original channel */ - inRe[ch][slot][bin] = mono_factor * ( inRe[0][slot][bin] + inRe[1][slot][bin] ) + ( 1.0f - mono_factor ) * inRe[ch][slot][bin]; - inIm[ch][slot][bin] = mono_factor * ( inIm[0][slot][bin] + inIm[1][slot][bin] ) + ( 1.0f - mono_factor ) * inIm[ch][slot][bin]; - band_nrg += ( inRe[ch][slot][bin] * inRe[ch][slot][bin] ) + ( inIm[ch][slot][bin] * inIm[ch][slot][bin] ); - } - } - hHeadTrackData->procChEneIIR[ch][band_idx] *= ADAPT_HTPROTO_IIR_FAC; - hHeadTrackData->procChEneIIR[ch][band_idx] += ( 1.0f - ADAPT_HTPROTO_IIR_FAC ) * band_nrg; - } - else - { - /* processed signal is input. use the original channel, so no need to compute new signals or signal energy */ - hHeadTrackData->procChEneIIR[ch][band_idx] *= ADAPT_HTPROTO_IIR_FAC; - hHeadTrackData->procChEneIIR[ch][band_idx] += ( 1.0f - ADAPT_HTPROTO_IIR_FAC ) * ch_nrg[ch]; - } - } - - /* Equalize */ - ene_target = hHeadTrackData->chEneIIR[0][band_idx] + hHeadTrackData->chEneIIR[1][band_idx]; - ene_proc = hHeadTrackData->procChEneIIR[0][band_idx] + hHeadTrackData->procChEneIIR[1][band_idx]; - eqVal = fminf( 4.0f, sqrtf( ene_target / fmaxf( 1e-12f, ene_proc ) ) ); - - for ( slot = start_slot; slot < stop_slot; slot++ ) - { - for ( ch = 0; ch < 2; ch++ ) - { - for ( bin = bin_lo; bin < bin_hi; bin++ ) - { - inRe[ch][slot][bin] *= eqVal; - inIm[ch][slot][bin] *= eqVal; - } - } - } - } - } - - return; -} -#endif static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackData, -#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, -#else - float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - const uint8_t firstSlot, - const uint8_t slotEnd, - const uint8_t nBins, -#endif #ifdef JBM_TSM_ON_TCS const int16_t nSlots, #endif float Rmat[3][3] ) { -#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS int16_t slot, bin, ch; -#else - uint8_t slot, bin, ch; -#endif float tmpVal; /* When not currently in prototype signal left-right switching procedure, check if such switching is needed */ @@ -3549,14 +1655,10 @@ static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( /* When currently in interpolation */ if ( hHeadTrackData->lrSwitchedNext != hHeadTrackData->lrSwitchedCurrent ) { -#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS #ifdef JBM_TSM_ON_TCS for ( slot = 0; slot < nSlots; slot++ ) #else for ( slot = 0; slot < CLDFB_SLOTS_PER_SUBFRAME; slot++ ) -#endif -#else - for ( slot = firstSlot; slot < slotEnd; slot++ ) #endif { float switchOrderFactor, origOrderFactor; @@ -3613,14 +1715,10 @@ static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( /* If not in interpolation, but in switched prototype situation, then switch left and right channels */ if ( hHeadTrackData->lrSwitchedCurrent == 1 ) { -#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS #ifdef JBM_TSM_ON_TCS for ( slot = 0; slot < nSlots; slot++ ) #else for ( slot = 0; slot < CLDFB_SLOTS_PER_SUBFRAME; slot++ ) -#endif -#else - for ( slot = firstSlot; slot < slotEnd; slot++ ) #endif { for ( bin = 0; bin < nBins; bin++ ) diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 1b355740bf..f8c730bd14 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -140,22 +140,12 @@ void efap_determine_gains( * SBA rendering *----------------------------------------------------------------------------------*/ -#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS void ivas_sba_prototype_renderer( Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, imag */ const int16_t subframe /* i : Subframe to render */ ); -#else -void ivas_sba_prototype_renderer( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ - float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ - float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, imag */ - const int16_t firstSubframe, /* i : First subframe to map */ - const int16_t nSubframes /* i : Number of subframes to map */ -); -#endif ivas_error ivas_sba_get_hoa_dec_matrix( const IVAS_OUTPUT_SETUP hOutSetup, /* i : target output setup */ @@ -592,7 +582,6 @@ void ivas_binaural_reverb_close( REVERB_STRUCT_HANDLE *hReverb /* i/o: binaural reverb handle */ ); -#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS void ivas_binaural_reverb_processSubframe( REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */ const int16_t numInChannels, /* i : num input channels to be processed */ @@ -604,30 +593,8 @@ void ivas_binaural_reverb_processSubframe( float outReal[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data real */ float outImag[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /* o : output CLDFB data imag */ ); -#else -void ivas_binaural_reverb_processFrame( - REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */ - const int16_t numInChannels, /* i : num input channels to be processed */ - float inReal[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data real */ - float inImag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data imag */ - float outReal[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data real */ - float outImag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data imag */ - const uint8_t offsetSamplesIO /* i : number of offset samples */ -); -#endif #ifdef JBM_TSM_ON_TCS -#ifndef FIX_355_REFACTOR_PARAMBIN_TO_5MS -void ivas_binaural_reverb_processSlot( - REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */ - const int16_t numInChannels, /* i : num inputs to be processed */ - float inReal[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data real, Comment: This change swaps two first dimensions as first dimension is not constant. */ - float inImag[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data imag */ - float outReal[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data real */ - float outImag[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data imag */ - const uint8_t offsetSamplesIO /* i : number of offset samples */ -); -#endif #endif ivas_error ivas_reverb_open( diff --git a/lib_rend/ivas_reverb.c b/lib_rend/ivas_reverb.c index 12a8b55ddb..baa83fad0e 100644 --- a/lib_rend/ivas_reverb.c +++ b/lib_rend/ivas_reverb.c @@ -1625,7 +1625,6 @@ ivas_error ivas_reverb_process( * Compute the reverberation - room effect *------------------------------------------------------------------------*/ -#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS void ivas_binaural_reverb_processSubframe( REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */ const int16_t numInChannels, /* i : num inputs to be processed */ @@ -1637,17 +1636,6 @@ void ivas_binaural_reverb_processSubframe( float outReal[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data real */ float outImag[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /* o : output CLDFB data imag */ ) -#else -void ivas_binaural_reverb_processFrame( - REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */ - const int16_t numInChannels, /* i : num inputs to be processed */ - float inReal[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data real, Comment: This change swaps two first dimensions as first dimension is not constant. */ - float inImag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data imag */ - float outReal[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data real */ - float outImag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data imag */ - const uint8_t offsetSamplesIO /* i : number of offset samples */ -) -#endif { /* Declare the required variables */ int16_t idx, bin, ch, sample, invertSampleIndex, tapIdx, *phaseShiftTypePr; @@ -1690,10 +1678,6 @@ void ivas_binaural_reverb_processFrame( for ( sample = 0; sample < hReverb->blockSize; sample++ ) #endif { -#ifndef FIX_355_REFACTOR_PARAMBIN_TO_5MS - uint16_t sampleWithOffset; - sampleWithOffset = sample + offsetSamplesIO; -#endif #ifdef JBM_TSM_ON_TCS invertSampleIndex = numSlots - sample - 1; #else @@ -1712,7 +1696,6 @@ void ivas_binaural_reverb_processFrame( /* Add every second input channel as is to the pre-delay buffer, and every second input channel with * 90 degrees phase shift to reduce energy imbalances between coherent and incoherent sounds */ -#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS for ( ch = 0; ch < numInChannels; ch++ ) { if ( ch % 2 ) @@ -1728,23 +1711,6 @@ void ivas_binaural_reverb_processFrame( } idx = ( idx + 1 ) % hReverb->preDelayBufferLength; } -#else - for ( ch = 0; ch < numInChannels; ch++ ) - { - if ( ch % 2 ) - { - v_add( hReverb->preDelayBufferReal[idx], inReal[ch][sampleWithOffset], hReverb->preDelayBufferReal[idx], hReverb->numBins ); - v_add( hReverb->preDelayBufferImag[idx], inImag[ch][sampleWithOffset], hReverb->preDelayBufferImag[idx], hReverb->numBins ); - } - else - { - v_sub( hReverb->preDelayBufferReal[idx], inImag[ch][sampleWithOffset], hReverb->preDelayBufferReal[idx], hReverb->numBins ); - v_add( hReverb->preDelayBufferImag[idx], inReal[ch][sampleWithOffset], hReverb->preDelayBufferImag[idx], hReverb->numBins ); - } - } - idx = ( idx + 1 ) % hReverb->preDelayBufferLength; - } -#endif hReverb->preDelayBufferIndex = idx; /* 3) Perform the filtering/decorrelating, using complex and sparse FIR filtering */ @@ -1847,11 +1813,6 @@ void ivas_binaural_reverb_processFrame( for ( sample = 0; sample < hReverb->blockSize; sample++ ) #endif { -#ifndef FIX_355_REFACTOR_PARAMBIN_TO_5MS - uint16_t sampleWithOffset; - - sampleWithOffset = sample + offsetSamplesIO; -#endif /* Audio was in the temporally inverted order for convolution, re-invert audio to output */ #ifdef JBM_TSM_ON_TCS invertSampleIndex = numSlots - sample - 1; @@ -1859,7 +1820,6 @@ void ivas_binaural_reverb_processFrame( invertSampleIndex = hReverb->blockSize - sample - 1; #endif -#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS for ( bin = 0; bin < hReverb->numBins; bin++ ) { outReal[ch][sample][bin] = hReverb->outputBufferReal[bin][ch][invertSampleIndex]; @@ -1870,18 +1830,6 @@ void ivas_binaural_reverb_processFrame( outReal[ch][sample][bin] = 0.0f; outImag[ch][sample][bin] = 0.0f; } -#else - for ( bin = 0; bin < hReverb->numBins; bin++ ) - { - outReal[ch][sampleWithOffset][bin] = hReverb->outputBufferReal[bin][ch][invertSampleIndex]; - outImag[ch][sampleWithOffset][bin] = hReverb->outputBufferImag[bin][ch][invertSampleIndex]; - } - for ( ; bin < CLDFB_NO_CHANNELS_MAX; bin++ ) - { - outReal[ch][sampleWithOffset][bin] = 0.0f; - outImag[ch][sampleWithOffset][bin] = 0.0f; - } -#endif } } @@ -1890,174 +1838,6 @@ void ivas_binaural_reverb_processFrame( } #ifdef JBM_TSM_ON_TCS -#ifndef FIX_355_REFACTOR_PARAMBIN_TO_5MS -/*------------------------------------------------------------------------- - * ivas_binaural_reverb_processSlot() - * - * Compute the reverberation - room effect - *------------------------------------------------------------------------*/ - -void ivas_binaural_reverb_processSlot( - REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */ - const int16_t numInChannels, /* i : num inputs to be processed */ - float inReal[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data real, Comment: This change swaps two first dimensions as first dimension is not constant. */ - float inImag[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data imag */ - float outReal[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data real */ - float outImag[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data imag */ - const uint8_t offsetSamplesIO /* i : number of offset samples */ -) -{ - /* Declare the required variables */ - int16_t idx, bin, ch, sample, invertSampleIndex, tapIdx, *phaseShiftTypePr; - float **tapRealPr, **tapImagPr; - -#ifdef DEBUGGING - assert( hReverb->blockSize == 1 ); -#endif - - push_wmops( "binaural_reverb" ); - /* 1) Rotate the data in the loop buffer of the reverberator. - * Notice that the audio at the loop buffers is at time-inverted order - * for convolution purposes later on. */ - for ( bin = 0; bin < hReverb->numBins; bin++ ) - { - /* Move the data forwards by blockSize (i.e. by the frame size of 16 CLDFB slots) */ - mvr2r( hReverb->loopBufReal[bin], hReverb->loopBufReal[bin] + hReverb->blockSize, hReverb->loopBufLength[bin] ); - mvr2r( hReverb->loopBufImag[bin], hReverb->loopBufImag[bin] + hReverb->blockSize, hReverb->loopBufLength[bin] ); - - /* Add the data from the end of the loop to the beginning, with an attenuation factor - * according to RT60. This procedure generates an IIR decaying response. The response - * is decorrelated later on. */ - v_multc( hReverb->loopBufReal[bin] + hReverb->loopBufLength[bin], hReverb->loopAttenuationFactor[bin], hReverb->loopBufReal[bin], hReverb->blockSize ); - v_multc( hReverb->loopBufImag[bin] + hReverb->loopBufLength[bin], hReverb->loopAttenuationFactor[bin], hReverb->loopBufImag[bin], hReverb->blockSize ); - } - - /* 2) Apply the determined pre-delay to the input audio, and add the delayed audio to the loop. */ - idx = hReverb->preDelayBufferIndex; - for ( sample = 0; sample < hReverb->blockSize; sample++ ) - { - uint16_t sampleWithOffset; - sampleWithOffset = sample + offsetSamplesIO; - invertSampleIndex = hReverb->blockSize - sample - 1; - for ( bin = 0; bin < hReverb->numBins; bin++ ) - { - /* Add from pre-delay buffer a sample to the loop buffer, in a time-inverted order. - * Also apply the spectral gains determined for the reverberation */ - hReverb->loopBufReal[bin][invertSampleIndex] += hReverb->preDelayBufferReal[idx][bin] * hReverb->reverbEqGains[bin]; - hReverb->loopBufImag[bin][invertSampleIndex] += hReverb->preDelayBufferImag[idx][bin] * hReverb->reverbEqGains[bin]; - hReverb->preDelayBufferReal[idx][bin] = 0.0f; - hReverb->preDelayBufferImag[idx][bin] = 0.0f; - } - - /* Add every second input channel as is to the pre-delay buffer, and every second input channel with - * 90 degrees phase shift to reduce energy imbalances between coherent and incoherent sounds */ - for ( ch = 0; ch < numInChannels; ch++ ) - { - if ( ch % 2 ) - { - v_add( hReverb->preDelayBufferReal[idx], inReal[ch][sampleWithOffset], hReverb->preDelayBufferReal[idx], hReverb->numBins ); - v_add( hReverb->preDelayBufferImag[idx], inImag[ch][sampleWithOffset], hReverb->preDelayBufferImag[idx], hReverb->numBins ); - } - else - { - v_sub( hReverb->preDelayBufferReal[idx], inImag[ch][sampleWithOffset], hReverb->preDelayBufferReal[idx], hReverb->numBins ); - v_add( hReverb->preDelayBufferImag[idx], inReal[ch][sampleWithOffset], hReverb->preDelayBufferImag[idx], hReverb->numBins ); - } - } - idx = ( idx + 1 ) % hReverb->preDelayBufferLength; - } - hReverb->preDelayBufferIndex = idx; - - /* 3) Perform the filtering/decorrelating, using complex and sparse FIR filtering */ - for ( bin = 0; bin < hReverb->numBins; bin++ ) - { - for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - /* These tap pointers have been determined to point to the loop buffer at sparse locations */ - tapRealPr = hReverb->tapPointersReal[bin][ch]; - tapImagPr = hReverb->tapPointersImag[bin][ch]; - phaseShiftTypePr = hReverb->tapPhaseShiftType[bin][ch]; - - /* Flush output */ - set_f( hReverb->outputBufferReal[bin][ch], 0.0f, hReverb->blockSize ); - set_f( hReverb->outputBufferImag[bin][ch], 0.0f, hReverb->blockSize ); - - /* Add from temporally decaying sparse tap locations the audio to the output. */ - for ( tapIdx = 0; tapIdx < hReverb->taps[bin][ch]; tapIdx++ ) - { - switch ( phaseShiftTypePr[tapIdx] ) - { - case 0: /* 0 degrees phase */ - v_add( hReverb->outputBufferReal[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferReal[bin][ch], hReverb->blockSize ); - v_add( hReverb->outputBufferImag[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferImag[bin][ch], hReverb->blockSize ); - break; - case 1: /* 90 degrees phase */ - v_sub( hReverb->outputBufferReal[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferReal[bin][ch], hReverb->blockSize ); - v_add( hReverb->outputBufferImag[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferImag[bin][ch], hReverb->blockSize ); - break; - case 2: /* 180 degrees phase */ - v_sub( hReverb->outputBufferReal[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferReal[bin][ch], hReverb->blockSize ); - v_sub( hReverb->outputBufferImag[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferImag[bin][ch], hReverb->blockSize ); - break; - default: /* 270 degrees phase */ - v_add( hReverb->outputBufferReal[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferReal[bin][ch], hReverb->blockSize ); - v_sub( hReverb->outputBufferImag[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferImag[bin][ch], hReverb->blockSize ); - break; - } - } - } - - /* Generate diffuse field binaural coherence by mixing the incoherent reverberated channels with pre-defined gains */ - if ( bin <= hReverb->highestBinauralCoherenceBin ) - { - if ( hReverb->useBinauralCoherence ) - { - for ( sample = 0; sample < hReverb->blockSize; sample++ ) - { - float leftRe, rightRe, leftIm, rightIm; - - leftRe = hReverb->binauralCoherenceDirectGains[bin] * hReverb->outputBufferReal[bin][0][sample] + hReverb->binauralCoherenceCrossmixGains[bin] * hReverb->outputBufferReal[bin][1][sample]; - rightRe = hReverb->binauralCoherenceDirectGains[bin] * hReverb->outputBufferReal[bin][1][sample] + hReverb->binauralCoherenceCrossmixGains[bin] * hReverb->outputBufferReal[bin][0][sample]; - leftIm = hReverb->binauralCoherenceDirectGains[bin] * hReverb->outputBufferImag[bin][0][sample] + hReverb->binauralCoherenceCrossmixGains[bin] * hReverb->outputBufferImag[bin][1][sample]; - rightIm = hReverb->binauralCoherenceDirectGains[bin] * hReverb->outputBufferImag[bin][1][sample] + hReverb->binauralCoherenceCrossmixGains[bin] * hReverb->outputBufferImag[bin][0][sample]; - - hReverb->outputBufferReal[bin][0][sample] = leftRe; - hReverb->outputBufferReal[bin][1][sample] = rightRe; - hReverb->outputBufferImag[bin][0][sample] = leftIm; - hReverb->outputBufferImag[bin][1][sample] = rightIm; - } - } - } - } - - /* 4) Write data to output */ - for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - for ( sample = 0; sample < hReverb->blockSize; sample++ ) - { - uint16_t sampleWithOffset; - - sampleWithOffset = sample + offsetSamplesIO; - /* Audio was in the temporally inverted order for convolution, re-invert audio to output */ - invertSampleIndex = hReverb->blockSize - sample - 1; - - for ( bin = 0; bin < hReverb->numBins; bin++ ) - { - outReal[ch][sampleWithOffset][bin] = hReverb->outputBufferReal[bin][ch][invertSampleIndex]; - outImag[ch][sampleWithOffset][bin] = hReverb->outputBufferImag[bin][ch][invertSampleIndex]; - } - for ( ; bin < CLDFB_NO_CHANNELS_MAX; bin++ ) - { - outReal[ch][sampleWithOffset][bin] = 0.0f; - outImag[ch][sampleWithOffset][bin] = 0.0f; - } - } - } - - pop_wmops(); - return; -} -#endif #endif /*------------------------------------------------------------------------- diff --git a/lib_rend/ivas_sba_rendering.c b/lib_rend/ivas_sba_rendering.c index c549461c37..eeeb505dea 100644 --- a/lib_rend/ivas_sba_rendering.c +++ b/lib_rend/ivas_sba_rendering.c @@ -202,22 +202,12 @@ void ivas_sba_prototype_renderer_sf( } #endif -#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS void ivas_sba_prototype_renderer( Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, imag */ const int16_t subframe /* i : Subframe to render */ ) -#else -void ivas_sba_prototype_renderer( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ - float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ - float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, imag */ - const int16_t firstSubframe, /* i : First subframe to map */ - const int16_t nSubframes /* i : Number of subframes to map */ -) -#endif { float mixer_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; SPAR_DEC_HANDLE hSpar; @@ -227,12 +217,7 @@ void ivas_sba_prototype_renderer( int16_t num_cldfb_bands, numch_in, numch_out; int16_t cldfb_band; int16_t out_ch, in_ch; -#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS int16_t firstInCh, inChEnd, firstOutCh, outChEnd; -#else - int16_t firstSlot, slotEnd, firstInCh, inChEnd, firstOutCh, outChEnd; - int16_t sf_idx; -#endif #ifdef JBM_TSM_ON_TCS int16_t slot_idx_start, md_idx; #endif @@ -243,10 +228,6 @@ void ivas_sba_prototype_renderer( hDecoderConfig = st_ivas->hDecoderConfig; num_spar_bands = hSpar->hFbMixer->pFb->filterbank_num_bands; -#ifndef FIX_355_REFACTOR_PARAMBIN_TO_5MS - firstSlot = firstSubframe * ( CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES ); - slotEnd = ( firstSubframe + nSubframes ) * ( CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES ); -#endif num_cldfb_bands = hSpar->hFbMixer->pFb->fb_bin_to_band.num_cldfb_bands; numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; numch_out = hSpar->hFbMixer->fb_cfg->num_out_chans; @@ -270,7 +251,6 @@ void ivas_sba_prototype_renderer( } /* Apply mixing matrix */ -#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS #ifdef JBM_TSM_ON_TCS for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) #else @@ -373,90 +353,14 @@ void ivas_sba_prototype_renderer( } } #endif -#else - for ( ts = firstSlot; ts < slotEnd; ts++ ) - { - /* determine SPAR parameters for this time slot */ - ivas_spar_get_parameters( hSpar, hDecoderConfig, ts, numch_out, numch_in, num_spar_bands, mixer_mat ); - - for ( cldfb_band = 0; cldfb_band < num_cldfb_bands; cldfb_band++ ) - { - float out_re[IVAS_SPAR_MAX_CH]; - float out_im[IVAS_SPAR_MAX_CH]; - float cldfb_par; - ivas_fb_bin_to_band_data_t *bin2band = &hSpar->hFbMixer->pFb->fb_bin_to_band; - - for ( out_ch = firstOutCh; out_ch < outChEnd; out_ch++ ) - { - out_re[out_ch] = 0.0f; - out_im[out_ch] = 0.0f; - - for ( in_ch = firstInCh; in_ch < inChEnd; in_ch++ ) - { - if ( cldfb_band < CLDFB_PAR_WEIGHT_START_BAND ) /* tuning parameter, depends on how much SPAR Filters overlap for the CLDFB bands */ - { - spar_band = bin2band->p_cldfb_map_to_spar_band[cldfb_band]; - cldfb_par = mixer_mat[out_ch][in_ch][spar_band]; - } - else - { - cldfb_par = 0.0f; - for ( spar_band = bin2band->p_spar_start_bands[cldfb_band]; spar_band < num_spar_bands; spar_band++ ) - { - /* accumulate contributions from all SPAR bands */ - cldfb_par += mixer_mat[out_ch][in_ch][spar_band] * bin2band->pp_cldfb_weights_per_spar_band[cldfb_band][spar_band]; - } - } - - out_re[out_ch] += inRe[in_ch][ts][cldfb_band] * cldfb_par; - out_im[out_ch] += inIm[in_ch][ts][cldfb_band] * cldfb_par; - } - } - - /*update CLDFB data with the parameter-modified data*/ - for ( out_ch = firstOutCh; out_ch < outChEnd; out_ch++ ) - { - inRe[out_ch][ts][cldfb_band] = out_re[out_ch]; - inIm[out_ch][ts][cldfb_band] = out_im[out_ch]; - } - } - - /* Update mixing matrices */ - if ( ( ( ts + 1 ) % MAX_PARAM_SPATIAL_SUBFRAMES ) == 0 ) - { - sf_idx = ts / MAX_PARAM_SPATIAL_SUBFRAMES; - hSpar->i_subframe++; - hSpar->i_subframe = min( hSpar->i_subframe, MAX_PARAM_SPATIAL_SUBFRAMES ); - mvr2r( hSpar->hMdDec->mixer_mat_prev[1][0][0], hSpar->hMdDec->mixer_mat_prev[0][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); - mvr2r( hSpar->hMdDec->mixer_mat_prev[2][0][0], hSpar->hMdDec->mixer_mat_prev[1][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); - mvr2r( hSpar->hMdDec->mixer_mat_prev[3][0][0], hSpar->hMdDec->mixer_mat_prev[2][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); - mvr2r( hSpar->hMdDec->mixer_mat_prev[4][0][0], hSpar->hMdDec->mixer_mat_prev[3][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); - - for ( out_ch = 0; out_ch < numch_out; out_ch++ ) - { - for ( in_ch = 0; in_ch < numch_in; in_ch++ ) - { - for ( b = 0; b < num_spar_bands; b++ ) - { - hSpar->hMdDec->mixer_mat_prev[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][b + sf_idx * IVAS_MAX_NUM_BANDS]; - } - } - } - } - } -#endif /* Create prototypes */ if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) { -#ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS #ifdef JBM_TSM_ON_TCS for ( ts = 0; ts < hSpar->subframe_nbslots[subframe]; ts++ ) #else for ( ts = 0; ts < CLDFB_SLOTS_PER_SUBFRAME; ts++ ) -#endif -#else - for ( ts = firstSlot; ts < slotEnd; ts++ ) #endif { if ( st_ivas->nchan_transport == 1 ) /* Dual mono */ -- GitLab From 880448617fb5f962c728acbe1c3beacff53426e0 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 20:09:00 +0200 Subject: [PATCH 266/331] [cleanup] accept FIX_411_EVS_BE_TESTS_ON_WINDOWS_FAILING --- apps/encoder.c | 13 ------------- lib_com/options.h | 1 - 2 files changed, 14 deletions(-) diff --git a/apps/encoder.c b/apps/encoder.c index a23970a270..7b54e4c7cb 100644 --- a/apps/encoder.c +++ b/apps/encoder.c @@ -1136,31 +1136,18 @@ static bool parseCmdlIVAS_enc( { strncpy( stmp, argv[i], sizeof( stmp ) ); stmp[sizeof( stmp ) - 1] = '\0'; -#ifdef FIX_411_EVS_BE_TESTS_ON_WINDOWS_FAILING to_upper( stmp ); if ( strcmp( stmp, "LO" ) == 0 ) -#else - to_upper( argv[i] ); - if ( strcmp( argv[i], "LO" ) == 0 ) -#endif { arg->caConfig.fec_indicator = IVAS_ENC_FEC_LO; } -#ifdef FIX_411_EVS_BE_TESTS_ON_WINDOWS_FAILING else if ( strcmp( stmp, "HI" ) == 0 ) -#else - else if ( strcmp( argv[i], "HI" ) == 0 ) -#endif { arg->caConfig.fec_indicator = IVAS_ENC_FEC_HI; } else { -#ifdef FIX_411_EVS_BE_TESTS_ON_WINDOWS_FAILING arg->ca_config_file = argv[i]; -#else - arg->ca_config_file = stmp; -#endif } i++; diff --git a/lib_com/options.h b/lib_com/options.h index 424902e6f1..94d27b7640 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -154,7 +154,6 @@ #define HR_METADATA /* Nok: Contribution #45: encode directional MASA metadata with more bits at 384k and 512k */ -#define FIX_411_EVS_BE_TESTS_ON_WINDOWS_FAILING /* Eri: Fix incorrect use of stack variable used for channel aware config file */ #define COMBINED_FORMAT_SIGNALING /* VA: Introduce a signaling bit for combined format coding */ #define FIX_446_STEREO_DMX_CRASH /* FhG: fix discrepancy with EVS code that could cause crashes in rare cases */ -- GitLab From 8114d6b5c268e75218b6b39ec884520f7c1b4275 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 20:09:37 +0200 Subject: [PATCH 267/331] [cleanup] accept COMBINED_FORMAT_SIGNALING --- lib_com/bitstream.c | 10 ---------- lib_com/ivas_cnst.h | 4 ---- lib_com/ivas_spar_com.c | 5 ----- lib_com/options.h | 1 - lib_dec/ivas_init_dec.c | 4 ---- lib_enc/ivas_init_enc.c | 6 ------ lib_enc/ivas_ism_dtx_enc.c | 4 ---- lib_enc/ivas_mct_core_enc.c | 8 -------- 8 files changed, 42 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index 86e1615d5a..d2aae93ed4 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -2928,11 +2928,7 @@ ivas_error preview_indices( k = IVAS_FORMAT_SIGNALING_NBITS; if ( st_ivas->ivas_format == MASA_FORMAT ) { -#ifdef COMBINED_FORMAT_SIGNALING k = IVAS_FORMAT_SIGNALING_NBITS_EXTENDED; -#else - k = IVAS_FORMAT_SIGNALING_NBITS_SBA; -#endif } if ( total_brate < MIN_BRATE_MDCT_STEREO ) @@ -2972,15 +2968,9 @@ ivas_error preview_indices( else if ( st_ivas->ivas_format == SBA_FORMAT ) { /* Read SBA planar flag and SBA order */ -#ifdef COMBINED_FORMAT_SIGNALING st_ivas->sba_planar = ( bit_stream[IVAS_FORMAT_SIGNALING_NBITS_EXTENDED] == 1 ); st_ivas->sba_order = ( bit_stream[IVAS_FORMAT_SIGNALING_NBITS_EXTENDED + 2] == 1 ); st_ivas->sba_order += 2 * ( bit_stream[IVAS_FORMAT_SIGNALING_NBITS_EXTENDED + 1] == 1 ); -#else - st_ivas->sba_planar = ( bit_stream[IVAS_FORMAT_SIGNALING_NBITS_SBA] == 1 ); - st_ivas->sba_order = ( bit_stream[IVAS_FORMAT_SIGNALING_NBITS_SBA + 2] == 1 ); - st_ivas->sba_order += 2 * ( bit_stream[IVAS_FORMAT_SIGNALING_NBITS_SBA + 1] == 1 ); -#endif st_ivas->sba_analysis_order = ivas_sba_get_analysis_order( total_brate, st_ivas->sba_order ); diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 5c8dba36b1..e92f0f1978 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -78,11 +78,7 @@ typedef enum *----------------------------------------------------------------------------------*/ #define IVAS_FORMAT_SIGNALING_NBITS 2 /* number of bits for signaling the IVAS format */ -#ifdef COMBINED_FORMAT_SIGNALING #define IVAS_FORMAT_SIGNALING_NBITS_EXTENDED ( IVAS_FORMAT_SIGNALING_NBITS + 1 ) -#else -#define IVAS_FORMAT_SIGNALING_NBITS_SBA ( IVAS_FORMAT_SIGNALING_NBITS + 1 ) -#endif /*----------------------------------------------------------------------------------* diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index 73d8030651..d0fd513516 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -2173,13 +2173,8 @@ void ivas_spar_set_bitrate_config( max_bits += (int16_t) ( ivas_spar_br_table_consts[table_idx].core_brs[i][1] / FRAMES_PER_SEC ); } -#ifdef COMBINED_FORMAT_SIGNALING pSpar_md_cfg->tgt_bits_per_blk = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC ) - IVAS_FORMAT_SIGNALING_NBITS_EXTENDED - SBA_PLANAR_BITS - SBA_ORDER_BITS - length - total_bits; pSpar_md_cfg->max_bits_per_blk = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC ) - IVAS_FORMAT_SIGNALING_NBITS_EXTENDED - SBA_PLANAR_BITS - SBA_ORDER_BITS - length - max_bits; -#else - pSpar_md_cfg->tgt_bits_per_blk = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC ) - IVAS_FORMAT_SIGNALING_NBITS_SBA - SBA_PLANAR_BITS - SBA_ORDER_BITS - length - total_bits; - pSpar_md_cfg->max_bits_per_blk = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC ) - IVAS_FORMAT_SIGNALING_NBITS_SBA - SBA_PLANAR_BITS - SBA_ORDER_BITS - length - max_bits; -#endif md_coding_bits_header = SPAR_NUM_CODING_STRAT_BITS + pSpar_md_cfg->quant_strat_bits; diff --git a/lib_com/options.h b/lib_com/options.h index 94d27b7640..18eb98ec6c 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -154,7 +154,6 @@ #define HR_METADATA /* Nok: Contribution #45: encode directional MASA metadata with more bits at 384k and 512k */ -#define COMBINED_FORMAT_SIGNALING /* VA: Introduce a signaling bit for combined format coding */ #define FIX_446_STEREO_DMX_CRASH /* FhG: fix discrepancy with EVS code that could cause crashes in rare cases */ #define FIX_386_CORECODER_RECONFIG_2 /* VA: Issue 386: Resolve remaining ToDo comments in CoreCoder reconfig. */ diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 6a4aaa462d..f49e0ca7df 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -385,7 +385,6 @@ static ivas_error ivas_read_format( st_ivas->ivas_format = MC_FORMAT; break; case 2: -#ifdef COMBINED_FORMAT_SIGNALING st_ivas->ivas_format = ISM_FORMAT; if ( ivas_total_brate >= IVAS_24k4 ) @@ -399,9 +398,6 @@ static ivas_error ivas_read_format( ( *num_bits_read )++; } -#else - st_ivas->ivas_format = ISM_FORMAT; -#endif break; case 3: diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index 1a53481270..8070efe3da 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -57,11 +57,7 @@ void ivas_write_format( ind = 0; nBits = IVAS_FORMAT_SIGNALING_NBITS; -#ifdef COMBINED_FORMAT_SIGNALING extra_bits = ( IVAS_FORMAT_SIGNALING_NBITS_EXTENDED - IVAS_FORMAT_SIGNALING_NBITS ); -#else - extra_bits = ( IVAS_FORMAT_SIGNALING_NBITS_SBA - IVAS_FORMAT_SIGNALING_NBITS ); -#endif switch ( st_ivas->hEncoderConfig->ivas_format ) { @@ -70,13 +66,11 @@ void ivas_write_format( break; case ISM_FORMAT: ind = 2; -#ifdef COMBINED_FORMAT_SIGNALING if ( st_ivas->hEncoderConfig->ivas_total_brate >= IVAS_24k4 ) { ind = 4; nBits += extra_bits; } -#endif break; case MC_FORMAT: ind = 1; diff --git a/lib_enc/ivas_ism_dtx_enc.c b/lib_enc/ivas_ism_dtx_enc.c index 8f856ff07e..907997cf98 100644 --- a/lib_enc/ivas_ism_dtx_enc.c +++ b/lib_enc/ivas_ism_dtx_enc.c @@ -257,7 +257,6 @@ int16_t ivas_ism_dtx_enc( /* IVAS format signaling was erased in dtx() */ if ( hSCE[0]->hCoreCoder[0]->hBstr->nb_bits_tot == 0 ) { -#ifdef COMBINED_FORMAT_SIGNALING /* replicate ivas_write_format() */ int16_t ind = 2; nBits = IVAS_FORMAT_SIGNALING_NBITS; @@ -268,9 +267,6 @@ int16_t ivas_ism_dtx_enc( } push_indice( hSCE[0]->hCoreCoder[0]->hBstr, IND_IVAS_FORMAT, ind, nBits ); -#else - push_indice( hSCE[0]->hCoreCoder[0]->hBstr, IND_IVAS_FORMAT, 2 /* == ISM format */, IVAS_FORMAT_SIGNALING_NBITS ); -#endif } } else /* ism_dtx_flag == 1 */ diff --git a/lib_enc/ivas_mct_core_enc.c b/lib_enc/ivas_mct_core_enc.c index 1d57a61e91..3bd05fca92 100644 --- a/lib_enc/ivas_mct_core_enc.c +++ b/lib_enc/ivas_mct_core_enc.c @@ -484,11 +484,7 @@ void ivas_mct_core_enc( } else if ( ivas_format == SBA_FORMAT ) { -#ifdef COMBINED_FORMAT_SIGNALING nAvailBits -= IVAS_FORMAT_SIGNALING_NBITS_EXTENDED; -#else - nAvailBits -= IVAS_FORMAT_SIGNALING_NBITS_SBA; -#endif nAvailBits -= SBA_ORDER_BITS + SBA_PLANAR_BITS; } @@ -563,11 +559,7 @@ void ivas_mct_core_enc( } #ifdef DEBUGGING -#ifdef COMBINED_FORMAT_SIGNALING format_bits = ( ivas_format == MC_FORMAT ? IVAS_FORMAT_SIGNALING_NBITS + MC_LS_SETUP_BITS : IVAS_FORMAT_SIGNALING_NBITS_EXTENDED + SBA_ORDER_BITS + SBA_PLANAR_BITS ); -#else - format_bits = ( ivas_format == MC_FORMAT ? IVAS_FORMAT_SIGNALING_NBITS + MC_LS_SETUP_BITS : IVAS_FORMAT_SIGNALING_NBITS_SBA + SBA_ORDER_BITS + SBA_PLANAR_BITS ); -#endif mct_bits += hMCT->nBitsMCT + hMCT->nchan_out_woLFE; assert( ( total_brate + ( NBITS_BWIDTH + format_bits + mct_bits + sba_meta + lfe_bits ) * FRAMES_PER_SEC ) == ivas_total_brate ); #endif -- GitLab From 9802690c3709434fad8e7ada03a705577470f938 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 20:10:15 +0200 Subject: [PATCH 268/331] [cleanup] accept FIX_446_STEREO_DMX_CRASH --- lib_com/options.h | 1 - lib_enc/ext_sig_ana.c | 6 ------ 2 files changed, 7 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 18eb98ec6c..b17c3d4273 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -154,7 +154,6 @@ #define HR_METADATA /* Nok: Contribution #45: encode directional MASA metadata with more bits at 384k and 512k */ -#define FIX_446_STEREO_DMX_CRASH /* FhG: fix discrepancy with EVS code that could cause crashes in rare cases */ #define FIX_386_CORECODER_RECONFIG_2 /* VA: Issue 386: Resolve remaining ToDo comments in CoreCoder reconfig. */ #define FIX_439_OTR_PARAMS /* Philips: Issue 439: orientation tracking parameter aspects. */ diff --git a/lib_enc/ext_sig_ana.c b/lib_enc/ext_sig_ana.c index f79fbb5f95..70706c112c 100755 --- a/lib_enc/ext_sig_ana.c +++ b/lib_enc/ext_sig_ana.c @@ -444,19 +444,13 @@ void core_signal_analysis_high_bitrate( ProcessIGF( st, hTcxEnc->spectrum[frameno], hTcxEnc->spectrum[frameno], powerSpec, transform_type[frameno] == TCX_20, frameno, 0, vad_hover_flag ); } -#ifndef FIX_446_STEREO_DMX_CRASH - /* Copy memory */ - mvr2r( lsp_new, st->lspold_enc, M ); -#endif } } -#ifdef FIX_446_STEREO_DMX_CRASH if ( st->element_mode != IVAS_CPE_MDCT ) { /* Copy memory */ mvr2r( lsp_new, st->lspold_enc, M ); } -#endif return; } -- GitLab From 91454205e94321ddf732a9c6c4edd199d7440c01 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 20:11:30 +0200 Subject: [PATCH 269/331] [cleanup] accept FIX_386_CORECODER_RECONFIG_2 --- lib_com/options.h | 1 - lib_enc/ivas_corecoder_enc_reconfig.c | 4 ---- 2 files changed, 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index b17c3d4273..f0caae3ffb 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -155,7 +155,6 @@ #define HR_METADATA /* Nok: Contribution #45: encode directional MASA metadata with more bits at 384k and 512k */ -#define FIX_386_CORECODER_RECONFIG_2 /* VA: Issue 386: Resolve remaining ToDo comments in CoreCoder reconfig. */ #define FIX_439_OTR_PARAMS /* Philips: Issue 439: orientation tracking parameter aspects. */ #define FIX_440_PARAM_ISM_DIR_NOISE /* FhG: Issue 440: Fix directional background noise becoming diffuse in ParamISM */ diff --git a/lib_enc/ivas_corecoder_enc_reconfig.c b/lib_enc/ivas_corecoder_enc_reconfig.c index f838fe36d3..439a0f6c63 100644 --- a/lib_enc/ivas_corecoder_enc_reconfig.c +++ b/lib_enc/ivas_corecoder_enc_reconfig.c @@ -399,11 +399,7 @@ ivas_error ivas_corecoder_enc_reconfig( { if ( n_CoreCoder_existing > cpe_id * CPE_CHANNELS + n ) { -#ifdef FIX_386_CORECODER_RECONFIG_2 mvr2r( input_buff[n], st_ivas->hCPE[cpe_id]->hCoreCoder[n]->input_buff, len_inp_memory ); -#else - mvr2r( input_buff[n], st_ivas->hCPE[cpe_id]->hCoreCoder[0]->input_buff, len_inp_memory ); /* TODO VoiceAge: Please check if this should be hCoreCoder[n] */ -#endif } } -- GitLab From 30ef38b4c760f72881c39049320a1f23ebc6f0a5 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 20:12:04 +0200 Subject: [PATCH 270/331] [cleanup] accept FIX_440_PARAM_ISM_DIR_NOISE --- lib_com/ivas_stat_com.h | 2 -- lib_com/options.h | 1 - lib_enc/ivas_ism_param_enc.c | 33 --------------------------------- 3 files changed, 36 deletions(-) diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index 2eb521cf58..bfde25383e 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -164,9 +164,7 @@ typedef struct ivas_param_ism_data_structure int16_t flag_noisy_speech; int16_t noisy_speech_buffer[PARAM_ISM_HYS_BUF_SIZE]; -#ifdef FIX_440_PARAM_ISM_DIR_NOISE int16_t flag_equal_energy; -#endif } PARAM_ISM_CONFIG_DATA, *PARAM_ISM_CONFIG_HANDLE; diff --git a/lib_com/options.h b/lib_com/options.h index f0caae3ffb..a08a7b8581 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -156,7 +156,6 @@ #define FIX_439_OTR_PARAMS /* Philips: Issue 439: orientation tracking parameter aspects. */ -#define FIX_440_PARAM_ISM_DIR_NOISE /* FhG: Issue 440: Fix directional background noise becoming diffuse in ParamISM */ #define LBR_SBA_DIRAC_FIX /* DLB: Bug fix for DirAC at low bitrates */ diff --git a/lib_enc/ivas_ism_param_enc.c b/lib_enc/ivas_ism_param_enc.c index 77fcb1b98f..f165245b8a 100644 --- a/lib_enc/ivas_ism_param_enc.c +++ b/lib_enc/ivas_ism_param_enc.c @@ -55,12 +55,10 @@ static void ivas_param_ism_compute_obj_parameters( int16_t i, b, m, br, mr; int16_t brange_start, brange_end, mrange_start, mrange_end, time_merge_fac; float power_ratios_m[MAX_PARAM_ISM_NBANDS][MAX_PARAM_ISM_NBLOCKS]; -#ifdef FIX_440_PARAM_ISM_DIR_NOISE float ref_power_local_frame[MAX_NUM_OBJECTS]; float tmp_ratio; set_f( ref_power_local_frame, 0, MAX_NUM_OBJECTS ); -#endif assert( nchan_ism == 3 || nchan_ism == 4 ); @@ -96,10 +94,8 @@ static void ivas_param_ism_compute_obj_parameters( ref_power_local[i] += reference_power_obj[i][mr][br]; } } -#ifdef FIX_440_PARAM_ISM_DIR_NOISE /* Sum up T/F tiles per object */ ref_power_local_frame[i] += ref_power_local[i]; -#endif } /* find two dominant objects and derive object indices for current T/F tile */ @@ -155,7 +151,6 @@ static void ivas_param_ism_compute_obj_parameters( } } -#ifdef FIX_440_PARAM_ISM_DIR_NOISE /* Check if objects have roughly equal power by comparing reference power of first object against all others*/ hParamIsm->flag_equal_energy = 1; for ( i = 1; i < nchan_ism; i++ ) @@ -175,7 +170,6 @@ static void ivas_param_ism_compute_obj_parameters( } } } -#endif return; } @@ -473,32 +467,6 @@ void ivas_param_ism_compute_noisy_speech_flag( st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i] = st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i + 1]; } -#ifndef FIX_440_PARAM_ISM_DIR_NOISE - /* For the current frame, make a decision based on some core-coder flags */ - if ( st_ivas->hSCE[0]->hCoreCoder[0]->flag_noisy_speech_snr && st_ivas->hSCE[1]->hCoreCoder[0]->flag_noisy_speech_snr ) - { - if ( st_ivas->hSCE[0]->hCoreCoder[0]->vad_flag || st_ivas->hSCE[1]->hCoreCoder[0]->vad_flag ) - { - st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i] = 0; - } - else - { - st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i] = 1; - } - } - else - { - - st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i] = 0; - } - - /* Do a decision based on hysterisis */ - st_ivas->hDirAC->hParamIsm->flag_noisy_speech = 1; - for ( i = 0; i < PARAM_ISM_HYS_BUF_SIZE; i++ ) - { - st_ivas->hDirAC->hParamIsm->flag_noisy_speech = st_ivas->hDirAC->hParamIsm->flag_noisy_speech && st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i]; - } -#else /* Set flag_noisy_speech to 0 for cases where object energies are not roughly equal */ if ( !st_ivas->hDirAC->hParamIsm->flag_equal_energy ) { @@ -531,7 +499,6 @@ void ivas_param_ism_compute_noisy_speech_flag( st_ivas->hDirAC->hParamIsm->flag_noisy_speech = st_ivas->hDirAC->hParamIsm->flag_noisy_speech && st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i]; } } -#endif return; } -- GitLab From 200194a7efff5817088e9d2b3f23f151459573b3 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 20:12:41 +0200 Subject: [PATCH 271/331] [cleanup] accept LBR_SBA_DIRAC_FIX --- lib_com/options.h | 1 - lib_enc/ivas_dirac_enc.c | 10 ---------- 2 files changed, 11 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index a08a7b8581..4ce326f710 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -157,7 +157,6 @@ #define FIX_439_OTR_PARAMS /* Philips: Issue 439: orientation tracking parameter aspects. */ -#define LBR_SBA_DIRAC_FIX /* DLB: Bug fix for DirAC at low bitrates */ #define FIX_445_SNS_BUGFIXES /* FhG: bug fix for spectral tilt in SNS computation + necessary update of codebooks and converison to fixedpoint-compatible tables */ #define FIX_447_PARAMBIN_MASA_REGU_FAC /* Nokia: Issue 447: Fix issue by adjusting regularization factor minimum value. */ diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index e3a5db6f7f..8e357d6336 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -247,7 +247,6 @@ ivas_error ivas_dirac_enc_reconfigure( /* :TODO: if the number of parameter bands change, do a meaningful mapping of parameter buffers from old to new band setting */ -#ifdef LBR_SBA_DIRAC_FIX if ( st_ivas->hQMetaData->useLowerRes ) { @@ -258,10 +257,6 @@ ivas_error ivas_dirac_enc_reconfigure( { mvs2s( DirAC_block_grouping_5ms_MDFT, hDirAC->block_grouping, MAX_PARAM_SPATIAL_SUBFRAMES + 1 ); } -#else - - mvs2s( DirAC_block_grouping, hDirAC->block_grouping, MAX_PARAM_SPATIAL_SUBFRAMES + 1 ); -#endif return error; } @@ -766,13 +761,8 @@ void ivas_dirac_param_est_enc( for ( i = 0; i < DIRAC_MAX_ANA_CHANS; i++ ) #endif { -#ifdef LBR_SBA_DIRAC_FIX mvr2r( &pp_fr_real[i][ts * l_ts], Cldfb_RealBuffer[i], l_ts ); mvr2r( &pp_fr_imag[i][ts * l_ts], Cldfb_ImagBuffer[i], l_ts ); -#else - mvr2r( &pp_fr_real[i][block_m_idx * l_ts], Cldfb_RealBuffer[i], l_ts ); - mvr2r( &pp_fr_imag[i][block_m_idx * l_ts], Cldfb_ImagBuffer[i], l_ts ); -#endif } } #ifndef HODIRAC -- GitLab From 183cce038d78347cc4d0b619932f4c4d901845fe Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 20:13:14 +0200 Subject: [PATCH 272/331] [cleanup] accept FIX_445_SNS_BUGFIXES --- lib_com/ivas_cnst.h | 2 - lib_com/ivas_prot.h | 8 - lib_com/ivas_rom_com.c | 605 ----------------------------------- lib_com/ivas_rom_com.h | 26 -- lib_com/ivas_sns_com.c | 30 -- lib_com/options.h | 1 - lib_com/rom_com.c | 71 ---- lib_com/rom_com.h | 5 - lib_dec/ivas_mdct_core_dec.c | 8 - lib_dec/ivas_sns_dec.c | 71 ---- lib_enc/ivas_mdct_core_enc.c | 16 - lib_enc/ivas_sns_enc.c | 167 ---------- 12 files changed, 1010 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index e92f0f1978..f789ae2cbf 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -866,10 +866,8 @@ enum fea_names #define SNS_MSVQ_NSTAGES_TCX20 4 #define SNS_MSVQ_NSTAGES_TCX10 3 #define SNS_MSVQ_NSTAGES_SIDE 2 -#ifdef FIX_445_SNS_BUGFIXES #define SNS_CDBKS_BITS_4_FRAC 12 #define SNS_MEANS_BITS_4_FRAC 14 -#endif #define MDCT_ST_PLC_FADEOUT_MIN_NOISE_NRG 0.001f #define MDCT_ST_PLC_FADEOUT_MAX_CONC_FRAME 2 * FRAMES_PER_SEC diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index f5d9ed3eed..993a0cc427 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -2567,18 +2567,14 @@ void sns_avq_cod( float *snsmid_q, /* o : Quantized mid-LFS vectors */ int16_t *index, /* o : Quantization indices */ const int16_t core, /* i : core */ -#ifdef FIX_445_SNS_BUGFIXES const int16_t L_frame, -#endif const int16_t low_brate_mode /* i : flag low bit operating mode */ ); void sns_avq_cod_stereo( const float *snsl, /* i : Input sns vector (left channel) */ const float *snsr, /* i : Input sns vector (right channel) */ -#ifdef FIX_445_SNS_BUGFIXES const int16_t L_frame, -#endif float *snsl_q, /* o : Quantized sns vector (left channel) */ float *snsr_q, /* o : Quantized sns vector (right channel) */ int16_t *indexl, /* o : Quantization indices (left channel) */ @@ -2588,18 +2584,14 @@ void sns_avq_cod_stereo( void sns_avq_dec( int16_t *index, /* i : Quantization indices */ float SNS_Q[NB_DIV][M], /* o : Quantized SNS vectors */ -#ifdef FIX_445_SNS_BUGFIXES const int16_t L_frame, -#endif const int16_t numlpc /* i : Number of sets of lpc */ ); void sns_avq_dec_stereo( int16_t *indexl, /* i : Quantization indices (left channel) */ int16_t *indexr, /* i : Quantization indices (right channe) */ -#ifdef FIX_445_SNS_BUGFIXES const int16_t L_frame, -#endif float *SNS_Ql, /* o : Quantized SNS vectors (left channel) */ float *SNS_Qr /* o : Quantized SNS vectors (right channe) */ ); diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index 5e8cf688e5..7672889019 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -5630,7 +5630,6 @@ const int16_t ivas_num_active_bands[FB - WB + 1] = const int16_t ivas_sns_cdbks_tcx20_levels[SNS_MSVQ_NSTAGES_TCX20] = { 128, 64, 32, 32 }; const int16_t ivas_sns_cdbks_tcx20_bits[SNS_MSVQ_NSTAGES_TCX20] = { 7, 6, 5, 5 }; -#ifdef FIX_445_SNS_BUGFIXES /* pre-rounded codebook vectors for singed Q4.12 represantation */ const float ivas_sns_cdbk_tcx20_stage1[ 128 * 16 ] = { -1.8305664f, -2.0878906f, -0.9638672f, 2.8059082f, 2.668213f, 1.1638184f, 1.390625f, 1.217041f, 1.3850098f, 0.44555664f, -0.47045898f, -0.5307617f, -0.810791f, -1.1647949f, -1.4560547f, -1.7612305f, @@ -6203,610 +6202,7 @@ const float ivas_sns_cdbks_side_tcx10_stage2[ 8 * 16 ] = { }; const float *const ivas_sns_cdbks_side_tcx10[SNS_MSVQ_NSTAGES_SIDE] = { ivas_sns_cdbks_side_tcx10_stage1, ivas_sns_cdbks_side_tcx10_stage2 }; -#else -/* codebooks trained for no adaptive tilt */ -const float ivas_sns_cdbk_tcx20_stage1[ 128 * 16 ] = { - -3.24881770f, -1.99497051f, -0.04725080f, 1.02318508f, 1.51589220f, 1.44649178f, 1.27858728f, 1.15137095f, 0.98029724f, 0.69167126f, 0.33414576f, 0.11759238f, -0.27510520f, -0.63610342f, -1.05394049f, -1.28304590f, - -3.24340413f, -4.15075396f, -2.86242117f, -1.11561919f, 1.12899983f, 1.98341478f, 0.56638511f, -0.05841474f, -0.14875192f, 0.31098029f, 1.87121037f, 0.91347082f, 1.02548459f, 1.98227488f, 1.30278860f, 0.49435585f, - 1.23065598f, 0.87793778f, 0.28294330f, 0.02972172f, 0.42574775f, 0.83386805f, 0.95758438f, 1.21299710f, 1.15042593f, 1.00234403f, 0.60083169f, -0.06520030f, -1.53941239f, -2.26801783f, -2.42116011f, -2.31126766f, - 0.06088614f, 0.02623315f, -0.61781539f, -1.23181247f, -1.40815590f, -1.42831471f, -1.44033232f, -1.33353337f, -0.99555917f, -0.36554180f, 0.55314618f, 1.56114474f, 2.01339157f, 1.99106535f, 1.51097476f, 1.10422329f, - -0.46337128f, -1.76230281f, -2.14514561f, -1.74284853f, -0.74943182f, 0.04642704f, 0.99955801f, 1.04344919f, 1.33994604f, 1.17515394f, 1.38810800f, 1.59087304f, 0.68196542f, -0.13955087f, -0.49622391f, -0.76660607f, - -2.07291483f, -1.16133507f, -1.23972694f, -1.55319745f, -1.53709378f, -0.89687815f, -0.30493476f, 0.53566030f, 0.90463531f, 1.12789938f, 1.18233130f, 1.05231063f, 0.85029894f, 0.96079862f, 1.14041844f, 1.01172838f, - 2.12762247f, 0.85938708f, 0.01404337f, -0.21119526f, -0.23292897f, -0.20800178f, 0.17965021f, 0.51517794f, 0.58450068f, 0.57289696f, 0.08413189f, -0.34604446f, -0.63957268f, -0.82541169f, -1.16686648f, -1.30738935f, - 1.40474083f, 0.32307263f, 0.16419111f, 0.38346550f, 0.50108274f, 0.37590359f, 0.08846238f, -0.23008300f, -0.45942672f, -0.45977478f, -0.43670746f, -0.36727746f, -0.35363526f, -0.33341415f, -0.31539698f, -0.28520292f, - -1.63093109f, 0.32670603f, 1.08393314f, 0.58998372f, 0.53843053f, 0.88612683f, 0.92734321f, 0.85881168f, 0.60801083f, 0.37502839f, -0.29325438f, -0.61636624f, -0.51913318f, -0.70035895f, -0.99754553f, -1.43678500f, - -1.93833343f, -0.69005518f, -0.75170110f, -1.07591216f, -1.13136476f, -0.91057037f, -0.96360579f, -0.81544927f, -0.72636191f, -0.36468519f, 0.13935276f, 1.01589488f, 1.62003238f, 2.00743696f, 2.33078654f, 2.25453582f, - 0.79346182f, 0.75880356f, 0.99941121f, 1.41339988f, 1.42679902f, 1.10135650f, 0.67724856f, 0.16701926f, -0.44226147f, -0.83565024f, -0.96240506f, -0.97710726f, -1.05267194f, -1.07354671f, -1.04194230f, -0.95191489f, - 1.32136151f, -0.10247792f, -0.44723017f, -0.36075427f, -0.71183851f, -0.78401615f, 0.03854040f, 0.61579422f, 0.72990899f, 0.74660263f, 0.27260947f, -0.45511245f, -0.57501743f, -0.20707029f, -0.10728071f, 0.02598055f, - -2.38997175f, -0.94335853f, 0.22486968f, 0.68758389f, 0.77400708f, 0.48551812f, 0.16770824f, 0.18451833f, 0.33722182f, 0.44300618f, 0.45730356f, 0.25903292f, 0.07348018f, -0.18351294f, -0.34985810f, -0.22754861f, - -0.04011386f, -2.74627791f, -2.64617639f, -2.12344376f, -1.04417531f, -1.19773434f, -1.09890378f, -1.14847926f, -1.25163399f, -1.37182360f, -0.92453053f, 0.26852562f, 2.49004087f, 5.03865317f, 3.18845554f, 4.60761675f, - 1.14142799f, 2.34150710f, 1.12597821f, 0.18025034f, -0.06854703f, 0.11882225f, -0.04029384f, -0.10117108f, -1.28130702f, -1.15721800f, 0.11730029f, 0.68335719f, -0.86449861f, -0.91274565f, -0.63726145f, -0.64560064f, - 0.13591417f, 1.45701293f, 0.18328994f, -1.33736241f, -1.63073739f, -1.11748160f, 0.33426081f, 1.38341076f, 1.23963779f, 1.15857921f, -0.19884512f, -0.46649971f, -0.23043753f, -0.16721531f, -0.08938742f, -0.65413930f, - -3.20422583f, -2.18732518f, -1.06476764f, -0.35148934f, 0.10909386f, 0.39065642f, 0.55826648f, 0.44049157f, 0.21409388f, 0.73508456f, 0.80931151f, 0.46688874f, 0.41272044f, 0.76516296f, 1.00398863f, 0.90204888f, - -2.87971458f, -4.23728027f, -0.84454748f, -0.07411834f, 0.21882417f, -1.73386520f, 0.44502397f, -0.29845675f, 0.51877264f, 1.16767994f, -0.80604089f, 1.51749444f, 2.06387385f, 2.42941495f, 1.48054035f, 1.03239888f, - 0.41502416f, 1.92937242f, 2.34493885f, 2.24663449f, 1.97723622f, 1.21219002f, 0.63995779f, 0.11201995f, -0.55860561f, -1.24739776f, -1.54711086f, -1.65155024f, -1.60927011f, -1.56104438f, -1.42473910f, -1.27765585f, - 0.97567115f, -1.33363678f, -2.33351304f, -2.63770798f, -2.22869213f, -1.57504148f, -1.07402035f, -0.47932319f, 0.18065985f, 0.66105619f, 1.18623833f, 1.66207325f, 1.92650802f, 1.89672632f, 1.54070829f, 1.63229361f, - -1.83309029f, -1.12088085f, -0.69053368f, -0.04697322f, 0.16614312f, 0.20653379f, 0.18628141f, 0.29156151f, 0.23415032f, 0.18998435f, 0.46020416f, 0.73218863f, 0.60617333f, 0.33402310f, 0.20549266f, 0.07874144f, - 1.16879643f, -0.94945093f, -1.28153207f, -1.43119528f, -1.63599975f, -1.48906283f, -0.72189452f, 0.19212127f, 0.62604095f, 0.71399312f, 0.84540884f, 0.67919451f, 0.73724815f, 0.94849167f, 0.74181449f, 0.85602585f, - 3.95026110f, 1.56392643f, -0.09370037f, -1.55546296f, -0.28400433f, 2.65160213f, 1.72026891f, -1.03325487f, -2.07533128f, -1.61929448f, -0.37408941f, -0.62936182f, -0.97909452f, -0.16160269f, -0.16361090f, -0.91725088f, - 0.53671249f, -1.03786958f, -1.08801981f, -0.37356699f, -0.22489401f, 0.02309705f, 0.14784551f, 0.19793732f, 0.12472343f, 0.09506024f, 0.05869315f, 0.14383214f, 0.10038818f, 0.25076267f, 0.40789510f, 0.63740306f, - -1.95841389f, 0.03478956f, 1.04981544f, 1.45141888f, 1.01368780f, 1.76553008f, 0.97518033f, 0.87744500f, 1.11998177f, 1.49531245f, 0.43867723f, -1.39588091f, -2.49552623f, -2.06407734f, -1.18465117f, -1.12328885f, - -1.17302983f, 0.17875585f, 0.89193716f, 1.29461477f, 1.14616923f, 0.04577007f, -0.87252250f, -0.55960184f, -0.58720665f, -0.52949712f, -0.37526793f, 0.00605696f, -0.15490600f, 0.06404177f, 0.40280720f, 0.22187871f, - 0.64131376f, 1.75231910f, 2.22508888f, 1.98484418f, 0.78172753f, -0.67005650f, -0.79535378f, 0.16537851f, 0.46442966f, -0.37889506f, -1.24009244f, -0.92537177f, -0.87140953f, -1.04472250f, -1.06971265f, -1.01948730f, - 0.34969434f, 1.41127416f, 0.95134631f, -0.49521902f, -1.13459218f, -1.02414143f, -0.54470763f, 0.04902381f, -0.01765934f, -0.09518271f, -0.07199094f, -0.00398826f, 0.14565429f, 0.17470642f, 0.18302401f, 0.12275814f, - -0.44981302f, -0.20165042f, -0.00073479f, 0.26315901f, 0.44473473f, 0.36317865f, 0.17484972f, 0.03171990f, 0.07343634f, 0.04543774f, -0.09709362f, -0.05624873f, -0.00866747f, -0.02410679f, -0.21651202f, -0.34168925f, - -1.24451525f, -1.23251652f, -1.59614073f, -2.03789978f, -1.96213854f, -1.71444999f, -1.60613134f, -1.51978903f, -1.00014591f, 0.04117804f, 1.34166006f, 2.42925461f, 2.88303472f, 2.83027230f, 2.48737677f, 1.90095093f, - 1.96467234f, 1.49818482f, 0.23737321f, -0.11314831f, -0.14050512f, -0.25201114f, -0.17389748f, -0.07042668f, -0.18426976f, -0.34937744f, -0.42674607f, -0.50442879f, -0.58679768f, -0.52836378f, -0.35445903f, -0.01579900f, - -0.99933612f, 1.11819495f, 1.29449512f, -0.02576221f, -0.61170357f, 0.30864176f, 0.87998806f, 0.96699269f, 0.98082342f, 1.27485776f, 0.52941745f, -1.29529727f, -1.88922976f, -1.36858904f, -0.37094568f, -0.79254774f, - -2.00039877f, -0.30176543f, 0.62981832f, 1.66518235f, 1.71899440f, 1.30408052f, 0.82774193f, 1.00586191f, 0.86017140f, 0.54233910f, -0.13420070f, -0.66585251f, -0.96492148f, -1.18998336f, -1.56871158f, -1.72835605f, - -2.69937742f, -3.72437438f, -3.23623013f, -0.25624354f, 1.96357307f, 2.46814215f, 3.53069303f, -1.06174110f, -1.09336853f, -0.07686535f, 1.29279961f, 1.80354460f, 1.27988399f, -0.42606045f, -0.44754574f, 0.68316996f, - -0.09822772f, 1.26120245f, 1.70052823f, 1.56502837f, 1.15694639f, 0.88838189f, 0.57465867f, 0.31853596f, 0.03466567f, -0.25958767f, -0.49911919f, -0.76007985f, -1.16055649f, -1.53569625f, -1.61195549f, -1.57472513f, - -1.14376495f, -1.43799067f, -1.45325578f, -1.52444742f, -1.38528757f, -1.09797958f, -0.89118095f, -0.62608417f, -0.00250085f, 0.94458366f, 1.51363028f, 1.81223868f, 1.83008829f, 1.56737959f, 1.18148735f, 0.71308420f, - -0.16148812f, -2.04769833f, -2.09471486f, -1.43005703f, -0.50205979f, -0.54822778f, 1.68195446f, 4.00061129f, 1.03275735f, 0.41847912f, 0.66770340f, -0.11822564f, -0.63042447f, -0.32785779f, -0.23825248f, 0.29750055f, - -3.59916102f, -3.16769339f, -2.44843270f, -2.08077491f, -1.31387103f, -0.17348440f, 0.36398119f, 1.21172207f, 1.38864588f, 1.46347831f, 1.46684451f, 1.84157730f, 1.58044756f, 1.35394187f, 1.27155115f, 0.84122764f, - 1.12168796f, 1.77011301f, 0.80501182f, -0.65059510f, -0.86885740f, -0.21223750f, 0.66413611f, 0.77827963f, 0.37800197f, -0.26796888f, -0.97801860f, -0.64966444f, -0.50047252f, -0.44549810f, -0.47750530f, -0.46641261f, - 1.69417025f, 0.14170351f, -0.30309571f, -0.50074499f, -0.60597114f, -0.65756500f, -0.62775844f, -0.41013834f, -0.07761611f, 0.16510349f, 0.25158511f, 0.34758291f, 0.28289899f, 0.29273919f, 0.09829950f, -0.09119332f, - -0.86153928f, 1.09981825f, 0.79441249f, 0.41436072f, 0.25807562f, -0.33355863f, -0.51983659f, -0.25841284f, 0.00191053f, 0.13240503f, 0.19942573f, 0.24363814f, 0.08478089f, -0.15773770f, -0.37897853f, -0.71876393f, - -3.54840520f, -3.31670990f, -2.41138986f, -1.93012869f, -1.20864357f, -0.47291818f, -0.18678664f, 0.02177990f, 0.31458995f, 0.70059621f, 1.23845973f, 1.82707181f, 2.12918865f, 2.27071260f, 2.36659938f, 2.20598371f, - -1.13771731f, 0.39368618f, 0.69608234f, 1.45165188f, 1.41884327f, 1.47720631f, 0.71071536f, 0.51669579f, 0.07379070f, -0.91725636f, -1.46431524f, -2.01818354f, -0.45034354f, -0.20458063f, -0.61685389f, 0.07057863f, - 1.94180196f, -0.43938181f, -1.45235723f, -1.62714803f, -0.56602083f, 0.17861664f, -0.11574800f, -0.55042921f, -0.26385634f, 0.14973980f, 0.40358646f, 0.57744006f, 0.91363053f, 0.71399177f, -0.04044356f, 0.17657766f, - -2.29623160f, 0.37017475f, -0.14625619f, 1.40510672f, -0.18688173f, 0.98162341f, -0.08351923f, 0.30727120f, 0.21088276f, 0.00882905f, 0.20930156f, 0.07859582f, 0.11868622f, 0.19357924f, -0.59940040f, -0.57176126f, - 0.32770546f, -2.17703619f, -2.14694909f, -1.21327174f, -0.09787592f, -0.38390569f, -0.54684876f, -0.76275935f, -1.00614562f, -1.06555455f, -0.70232123f, -0.12667989f, 0.23719344f, 0.82854727f, 3.01646153f, 5.81943998f, - 1.74451794f, 2.61728252f, 2.50084081f, 2.14806463f, 1.03256213f, -0.14230845f, -0.89600957f, -1.26996454f, -1.47590648f, -1.42717085f, -1.20779572f, -0.98498624f, -0.82778555f, -0.73610012f, -0.59428320f, -0.48095729f, - -1.63200590f, 0.23028801f, -0.00907184f, -0.79978843f, -1.00748376f, -0.12526203f, 0.79168097f, 0.90826744f, 0.57548955f, 0.65151547f, 0.37307684f, -0.12047965f, -0.13538324f, 0.00756611f, 0.31705141f, -0.02546129f, - -2.96255244f, -1.89398578f, -1.11705055f, -0.49587679f, -0.64879460f, 0.52145289f, -0.11691144f, 1.02365070f, 0.12124424f, 1.06613244f, 2.03450026f, 1.32855094f, 0.54450823f, -0.09583278f, -0.09304639f, 0.78401059f, - -2.74846388f, -3.29381816f, -1.69589747f, 0.09992536f, 1.19730664f, -0.16362356f, -0.15703004f, 0.55042720f, 0.31568131f, 0.18156842f, 0.68590339f, 1.08986889f, 1.58662197f, 1.58930878f, 0.65286724f, 0.10935410f, - 2.40977200f, 1.75366309f, 0.74979137f, 0.75357579f, 0.58888421f, 0.34045829f, 0.41658500f, 0.41731179f, 0.35825939f, 0.03048901f, -0.69808452f, -1.34206657f, -1.51950247f, -1.45414323f, -1.40318331f, -1.40180996f, - -0.45462369f, -0.79464966f, -0.73449499f, -0.64030961f, -0.59804980f, -0.52688087f, -0.50966580f, -0.32241860f, -0.22751147f, -0.05981052f, 0.18569777f, 0.50293633f, 0.68570837f, 0.93799600f, 1.18364242f, 1.37243415f, - 0.71230959f, -0.15258830f, -0.30639043f, -0.10789426f, 0.13596677f, 0.06139692f, -0.05906250f, -0.09243858f, 0.16058801f, 0.19962984f, -0.02914953f, -0.05986174f, -0.00798730f, -0.03679071f, -0.19035654f, -0.22737122f, - 0.20985119f, 0.67531452f, -0.76482923f, -1.95548615f, -2.01335569f, -1.31859418f, -0.44117933f, 0.43598020f, 0.63898416f, 0.59260283f, 0.59660664f, 0.64364003f, 0.57962656f, 0.72198795f, 0.77431143f, 0.62453906f, - 3.37266827f, 1.16546541f, 0.15487771f, 0.57979973f, 1.63054771f, 1.04524609f, -0.13961184f, -0.53246008f, -0.51061506f, -0.83238697f, -1.04232388f, -0.96061103f, -0.90339873f, -0.99671658f, -1.06027762f, -0.97020325f, - -2.45339028f, 0.22870307f, 0.50079654f, 0.82545821f, -0.45080889f, -0.16537387f, -0.25306064f, -0.33349906f, 0.26143456f, 0.09313222f, 0.86160665f, 0.75164534f, -1.22179547f, -0.18801375f, 1.02457992f, 0.51858541f, - -1.46171297f, 0.63898461f, 2.15634917f, 1.94818588f, 2.12627540f, 1.70759626f, 1.43815259f, 0.82410049f, 0.20479176f, -0.43378728f, -0.89783731f, -1.30555797f, -1.66597981f, -1.80440934f, -1.79291067f, -1.68224086f, - -0.10170911f, 1.63842605f, 2.05629785f, 1.72760611f, 0.13751598f, -1.26847816f, -1.58069540f, -1.04510855f, -0.88231099f, -0.68616151f, -0.59891556f, -0.49054331f, -0.18451655f, 0.19151542f, 0.64619056f, 0.44088718f, - -0.86655238f, 0.59030963f, 1.14256838f, 1.66795450f, 1.50058628f, 1.34944192f, 0.08257813f, 0.24901720f, -0.18852178f, -0.03650931f, -0.27994508f, -1.06110568f, -2.06900429f, -1.73358377f, -0.24057835f, -0.10665549f, - 1.50872779f, 1.31070374f, 0.39357214f, -0.46407462f, -0.92397447f, -1.13436545f, -1.23237146f, -1.13209159f, -1.03095318f, -0.62563255f, -0.17705075f, 0.30244717f, 0.51989500f, 0.80258928f, 0.87034201f, 1.01223693f, - -0.30437289f, -0.88801487f, -0.86107707f, -0.28285107f, 0.28699382f, 0.45911485f, 0.48852566f, 0.45550239f, 0.58082722f, 0.55866427f, 0.31299044f, 0.14102370f, 0.07480087f, -0.08720185f, -0.35323153f, -0.58169395f, - -2.81842263f, -2.50111842f, -2.46829445f, -2.46942172f, -2.16241013f, -1.43881623f, -1.42903221f, -0.83291045f, 0.08734224f, 1.62875243f, 2.38321450f, 2.57841755f, 2.43444406f, 2.45552669f, 2.52427006f, 2.02845861f, - 3.37066045f, 1.49218725f, 0.55470586f, 0.13748306f, -0.13402053f, -0.39589325f, -0.44410867f, -0.48568748f, -0.51085663f, -0.42397560f, -0.53871831f, -0.60800303f, -0.57632384f, -0.50071998f, -0.46558245f, -0.47114696f, - -0.62183100f, 1.32484675f, 1.39280525f, 0.63916764f, 0.07573329f, 0.57096453f, 0.11014546f, -0.13955579f, -0.60839590f, -0.77966466f, -1.07179154f, -1.77671234f, -0.71411508f, 0.13441149f, 0.72184010f, 0.74215154f, - -2.90081845f, -3.29359883f, -1.89249569f, 2.35796037f, 2.47210792f, 0.89083303f, 1.25230145f, 1.03281210f, 1.34506489f, 0.48347288f, -0.08158884f, 0.21388757f, 0.05047384f, -0.37546417f, -0.70672331f, -0.84822525f, - -0.68878586f, -3.17765901f, -2.72677654f, -0.83696096f, 1.93901658f, 2.45806994f, 0.77003930f, 0.58220309f, 0.28500621f, -0.15305225f, 0.53711675f, 0.20321993f, 0.20435459f, 0.27124049f, 0.02126411f, 0.31170327f, - 1.03813940f, 1.60082720f, 1.24608760f, 0.78739775f, 0.96747591f, 1.10068123f, 1.15134869f, 0.74915981f, 0.42167811f, 0.15553718f, -0.33259317f, -0.97385519f, -1.61082594f, -2.05590168f, -2.15737100f, -2.08778582f, - -0.64496025f, 0.35212582f, -0.04908282f, -1.05504457f, -1.19731005f, -0.73315350f, -0.66929749f, -0.60130627f, -0.33236585f, 0.23014025f, 0.69893111f, 1.09565077f, 1.08466375f, 0.94366305f, 0.65639554f, 0.22095053f, - 0.48358349f, -0.37847120f, -1.02753771f, -0.73518795f, -0.11326269f, 0.53003780f, 0.88038488f, 0.88882395f, 0.97329253f, 0.69212641f, 0.87373175f, 0.80871682f, -0.03656343f, -0.94980974f, -1.26081773f, -1.62904720f, - -2.23244251f, -1.79490434f, -1.96001543f, -2.27380061f, -2.07255037f, -1.46415033f, -1.04393033f, 0.20282312f, 1.57244767f, 1.97591827f, 1.77648956f, 1.75160994f, 1.62357252f, 1.47414518f, 1.35930993f, 1.10547779f, - 0.79628045f, 0.95200921f, 0.49234542f, 0.09199320f, -0.05724590f, -0.07118046f, -0.04634766f, -0.00096416f, -0.17970825f, -0.09563800f, -0.01779017f, 0.13120319f, -0.03610489f, -0.35895498f, -0.62415601f, -0.97574095f, - 1.23786391f, -0.05332070f, 0.12142715f, 0.41317442f, 0.15674045f, -0.23609842f, -0.45604039f, -0.60612644f, -0.72063869f, -0.65773356f, -0.45446098f, -0.19856125f, -0.01567566f, 0.31093945f, 0.48567017f, 0.67284050f, - -0.38959317f, 0.48417975f, 0.67846195f, 0.96883427f, 0.97152360f, 0.77479838f, 0.58711345f, 0.71066957f, 0.54730033f, 0.30078955f, -0.00792413f, -0.23889729f, -0.71320215f, -1.17067509f, -1.60334166f, -1.90003738f, - -0.58748774f, -1.47663922f, -1.69196885f, -1.58982061f, -1.20534794f, -0.84425696f, -0.58959522f, -0.30927859f, 0.05320947f, 0.43265601f, 0.78002809f, 1.13478063f, 1.29240277f, 1.39914925f, 1.52607187f, 1.67609674f, - 0.21900175f, 0.90198746f, 1.47152638f, 1.60585024f, 1.28627552f, 0.62955762f, -0.10179136f, -0.53979665f, -0.95849172f, -1.05549774f, -0.93249423f, -0.63224235f, -0.54606380f, -0.47048197f, -0.44721628f, -0.43012290f, - 1.16598857f, -0.44883323f, -0.35990019f, 0.55867022f, 0.76350144f, 0.40336553f, -0.17899520f, -0.32789312f, 0.39266043f, 1.31706823f, 0.14239671f, -1.37351682f, -1.43994906f, -0.44961849f, 0.22694761f, -0.39189263f, - -2.38540927f, -1.62852954f, -0.88269400f, -0.07377225f, 0.58356450f, 0.88990527f, 0.91596948f, 0.64591793f, 0.36616944f, 0.38677852f, 0.46220080f, 0.31194777f, 0.22940934f, 0.16539664f, 0.07914516f, -0.06599966f, - 0.72463355f, -0.52958069f, -1.48068920f, -1.78301927f, -1.84235585f, -1.64970240f, -1.53867955f, -1.38956832f, -1.22397576f, -0.84685537f, -0.05213558f, 1.07240247f, 1.81984926f, 2.69693629f, 2.99963897f, 3.02310102f, - 1.19409909f, 2.68519772f, 1.98964488f, 0.67968388f, -0.01774621f, -0.15701839f, -0.09104235f, 0.24620030f, -0.83163859f, -1.22467182f, -1.23467957f, -1.15083406f, -0.63344301f, -0.72619249f, -0.46989224f, -0.25766714f, - -0.36982280f, 1.17012486f, 0.65527007f, -0.63203416f, -0.41714099f, 0.81639854f, 0.54164978f, 0.77650051f, 0.59880614f, 0.82660687f, -1.04749065f, -0.62911908f, -0.34368981f, -0.45351210f, -0.51314098f, -0.97940604f, - -2.68285677f, -0.85691687f, -0.20235026f, -0.01759520f, -0.00179021f, 0.11451343f, 0.27056934f, 0.20577824f, -0.23029364f, 0.11388472f, -0.05166620f, 0.07283122f, 0.56553984f, 0.81068091f, 1.04931803f, 0.84035365f, - -1.52932955f, -1.34785922f, -0.57071683f, -0.20686289f, 0.08155976f, -0.47381873f, -0.77622457f, -0.57310159f, -0.22137986f, 0.13834100f, 0.49481460f, 0.80177416f, 0.88568748f, 1.02957744f, 1.20356068f, 1.06397834f, - 0.85311314f, 1.33739225f, 1.91363915f, 1.93231248f, 2.08304754f, 1.71778606f, 0.86773094f, 0.43475180f, 0.03661492f, -0.61728713f, -1.15699401f, -1.66982248f, -1.98244609f, -2.00151078f, -1.93416224f, -1.81416574f, - 1.60126279f, -0.81833805f, -1.38880039f, -1.40634796f, -1.32149763f, -1.28036492f, -1.07256373f, -0.72500244f, -0.46550137f, -0.10403512f, 0.28677127f, 0.67644278f, 1.00944110f, 1.34460513f, 1.63359356f, 2.03033498f, - -1.12256198f, -1.95155583f, -1.32316561f, -0.63266570f, -0.15627220f, 0.07123786f, 0.13550620f, 0.25890778f, 0.47783453f, 0.57057758f, 0.68332609f, 0.73453078f, 0.66233264f, 0.62861164f, 0.56744294f, 0.39591321f, - 0.06875844f, -0.77557401f, -1.05293353f, -1.03197877f, -0.85111938f, -0.61756528f, -0.16943921f, 0.22208891f, 0.49771452f, 0.66450860f, 0.73241467f, 0.72611275f, 0.63156506f, 0.52604468f, 0.30774149f, 0.12166125f, - 3.80400584f, 1.75988157f, 0.24665703f, -1.24851564f, -1.25633571f, 0.32422259f, 2.13094918f, 0.70439664f, -1.53713254f, -1.71622823f, -1.08819715f, -0.50716458f, -0.74087437f, -0.99402032f, -0.10491345f, 0.22326928f, - -0.65058475f, -0.32678303f, -0.20547132f, -0.11041511f, -0.11848885f, -0.20790889f, -0.31102714f, -0.27474061f, -0.20625644f, -0.08260245f, 0.09887987f, 0.33251986f, 0.41319745f, 0.49892877f, 0.56061378f, 0.59013885f, - -2.39642240f, -0.73872271f, 0.49057636f, 1.16325658f, 0.79747808f, 1.34021740f, 0.82073194f, 1.17831994f, 1.25881141f, 0.84489551f, -0.77511278f, -1.30893620f, -1.25529283f, -0.65601516f, -0.34679935f, -0.41698601f, - -0.54371008f, 0.45990001f, 0.73230478f, 1.41706822f, 1.07142705f, 0.82233755f, -0.15928811f, -0.34139895f, -0.08643862f, -0.24274513f, -0.48172279f, -0.46452865f, -0.44837803f, -0.43356299f, -0.59008965f, -0.71117480f, - -0.36854343f, 1.40608712f, 2.13291678f, 1.80061219f, 1.15989238f, -0.32896337f, -0.86683083f, -0.45937605f, -0.17796119f, -0.40226921f, -0.30363529f, -1.08494615f, -0.97269428f, -0.91102639f, -0.31526836f, -0.30799363f, - 0.16771127f, 1.28284008f, 0.25724837f, -1.11750032f, -1.04368583f, 0.13121741f, 0.10609539f, 0.02437401f, -0.56098948f, -0.38744327f, 0.07855531f, 0.20548373f, 0.06560664f, 0.24342662f, 0.39885137f, 0.14820870f, - 0.20792769f, -0.15663987f, -0.04445993f, 0.27319064f, 0.51281629f, 0.57962552f, 0.54535177f, 0.41567183f, 0.41718141f, 0.20916435f, -0.10574785f, -0.26957618f, -0.44861183f, -0.55143961f, -0.71969549f, -0.86475851f, - -2.53854175f, -2.10301056f, -1.97482174f, -2.12277877f, -1.80824545f, -1.32660134f, -1.25816793f, -0.90711327f, -0.59056817f, -0.05426883f, 0.60446374f, 1.61001048f, 2.40601840f, 3.00689095f, 3.60110855f, 3.45562566f, - 1.07778822f, 2.19172459f, 1.44013405f, 0.27222350f, 0.03173527f, -0.04691321f, 0.06376916f, 0.63907484f, -0.17949007f, 0.10010871f, -0.52495472f, -0.90729516f, -0.89428983f, -1.02410889f, -1.09546364f, -1.14404292f, - 0.76276530f, 1.59524592f, 1.47474021f, 0.18145014f, 0.13550913f, 0.88510912f, 1.03412929f, 1.01111065f, 0.77539585f, 0.20329499f, -1.35508663f, -1.83340559f, -1.40465488f, -1.14514789f, -1.16420913f, -1.15624650f, - -2.56605999f, -0.69575164f, 0.80693890f, 1.72778867f, 2.34339014f, 2.09042055f, 1.74382199f, 1.18476481f, 0.71416221f, 0.16808900f, -0.19808303f, -0.77842890f, -1.40866559f, -1.73499872f, -1.76586854f, -1.63151971f, - -0.32618212f, -2.76955063f, -2.78043449f, 0.51956703f, 4.34383806f, 1.88716237f, 4.47289205f, -0.68129863f, -1.52511041f, -1.32636741f, 0.65997777f, -0.52682311f, -0.69581956f, -0.43799624f, -0.50098243f, -0.31287245f, - 1.11744895f, 0.76474262f, 0.68913317f, 0.77356058f, 0.73021025f, 0.55480731f, 0.41334472f, 0.23384124f, 0.00040865f, -0.18384701f, -0.30336471f, -0.46628578f, -0.73968976f, -1.02792872f, -1.19473003f, -1.36165137f, - -1.09856438f, -2.65937422f, -2.23447552f, -2.36127808f, -1.92601400f, -1.29606162f, -0.86847602f, -0.41112389f, 0.27059515f, 0.62653494f, 1.25539083f, 2.16718498f, 2.40401093f, 1.97246907f, 1.87623832f, 2.28294385f, - -2.23812017f, -3.37112518f, -3.06489410f, -2.44639779f, -1.77205118f, -0.96847500f, 3.20788062f, 2.74986128f, 2.48376367f, 3.58855607f, 1.46558359f, 0.58208141f, 0.58647621f, -0.03336968f, -0.01161197f, -0.75815742f, - -3.34068874f, -3.31330139f, -3.27624195f, -3.18776773f, -2.60176738f, -1.35466356f, -0.47112724f, 0.80847853f, 1.80958348f, 2.21285031f, 2.26554713f, 2.76880679f, 2.60017886f, 2.04062204f, 1.67575322f, 1.36373732f, - 0.04677635f, 1.13691098f, 1.30914680f, 0.25672818f, 0.15799852f, 0.60568291f, 0.31771628f, 0.07597951f, -0.26589647f, -0.54972118f, -0.86844552f, -0.61094603f, -0.47072310f, -0.40511943f, -0.38309528f, -0.35299238f, - 0.22528620f, 0.31743905f, 0.31483553f, 0.17720192f, 0.16231355f, -0.06831057f, -0.29693139f, -0.45560458f, -0.21127731f, -0.08624191f, -0.20781580f, -0.12232125f, 0.08133224f, 0.09984234f, 0.03187445f, 0.03837752f, - 0.45404525f, 1.31244734f, 1.09193858f, 0.46595512f, 0.31516414f, -0.08250116f, -0.64154502f, -0.86897307f, -0.92275973f, -0.84086567f, -0.63886704f, -0.14652849f, 0.08165072f, 0.18249933f, 0.18288233f, 0.05545734f, - -2.78701578f, -2.31409561f, -1.68556203f, -1.40144529f, -0.74842449f, -0.07375189f, -0.20211385f, 0.09260002f, 0.29898930f, 0.66465229f, 0.75558861f, 0.96729187f, 1.14177838f, 1.55174084f, 1.99705535f, 1.74271247f, - -0.10464683f, -0.94242352f, -0.57955843f, 1.29762166f, 1.68516688f, 1.09852539f, 0.72099378f, 0.51323036f, -0.24285175f, -0.55888513f, -0.50577021f, -0.46366004f, -0.55836815f, -0.58550721f, -0.50078205f, -0.27308479f, - 3.45286440f, 0.59611628f, -0.69351346f, -1.14674518f, -1.07854543f, -0.89938730f, -0.76263547f, -0.52068670f, -0.36216337f, -0.17157688f, -0.01447939f, 0.15778389f, 0.27944020f, 0.35739675f, 0.34083744f, 0.46529411f, - -1.28927442f, 0.10726691f, 0.86158650f, 0.06273348f, -0.04085696f, 1.13928101f, 0.37886132f, 0.13576595f, -0.53530704f, -0.37566277f, -0.10613359f, -0.03059598f, -0.04857175f, -0.00612681f, 0.00516239f, -0.25812835f, - 2.89076531f, -0.04664344f, -1.93237643f, -2.19996964f, -1.86412035f, -1.18315371f, -1.10120931f, -1.31680378f, -1.30399765f, -1.28669610f, -0.94489947f, -0.60614659f, 1.58599312f, 0.95842154f, 2.94815038f, 5.40268579f, - 3.83455417f, 3.13869337f, 1.72510455f, 1.17236146f, 0.33356711f, 0.11348813f, -0.29704182f, -1.13829975f, -1.48383443f, -1.43388842f, -1.35163818f, -1.16938088f, -1.02627819f, -0.92590386f, -0.82058768f, -0.67091549f, - -0.93172509f, 0.85237993f, 1.34276319f, 0.25174685f, -0.79705618f, -0.63895111f, 0.21118680f, 0.97143052f, 0.70458966f, -0.18635616f, -0.52911893f, -1.85150883f, -0.43982599f, 0.04075634f, 0.50586277f, 0.49382650f, - -3.79516923f, -3.31533743f, -1.55672619f, 0.02918112f, 0.69887327f, 0.58481500f, 1.07030510f, 1.26562384f, 1.20349632f, 1.07269840f, 0.89773042f, 0.88137053f, 0.60964812f, 0.28884498f, 0.12262285f, -0.05797732f, - -0.08660073f, -3.36745835f, -3.82012977f, -2.75147711f, -0.36352096f, 0.85747874f, 1.11140604f, 0.65593665f, 0.35792228f, 0.54619342f, 0.99489751f, 1.28924616f, 0.96663509f, 1.40602119f, 1.12645860f, 1.07699149f, - 1.92634136f, 2.07569243f, 1.90024169f, 1.55333140f, 1.00662166f, 0.59662392f, 0.41735113f, 0.03712017f, -0.30033462f, -0.70147399f, -1.26150322f, -1.36946469f, -1.49306813f, -1.53593901f, -1.47859712f, -1.37294294f, - 0.41088895f, -0.68758389f, -0.85837881f, -0.86844724f, -0.85475992f, -0.88373397f, -0.82636157f, -0.54233624f, -0.33497780f, -0.06884329f, 0.24209832f, 0.60199869f, 0.83678079f, 1.05727685f, 1.27867768f, 1.49770152f, - -0.45442780f, -0.39381771f, -0.35575987f, -0.28279611f, -0.03460671f, 0.02188475f, -0.06207990f, -0.02068513f, 0.24104453f, 0.35743869f, 0.26392307f, 0.33209979f, 0.34550175f, 0.24362296f, 0.00439669f, -0.20573886f, - -1.38047831f, 0.78167658f, 0.42055729f, -0.93786054f, -1.72548724f, -1.52410071f, -0.47028251f, 0.81491117f, 0.82382622f, 0.46806997f, 0.95867097f, 0.52433344f, -0.02522016f, 0.39885676f, 0.61128096f, 0.26124617f, - 1.92925285f, 1.70790963f, 1.15526536f, 0.66461298f, 0.67490541f, 0.23892474f, -0.12861693f, -0.33635752f, -0.52286346f, -0.56868795f, -0.86695874f, -0.88842939f, -0.86631615f, -0.80495760f, -0.73812023f, -0.64956301f, - -0.46329214f, 0.55823622f, 0.34966614f, -0.14855330f, -0.35757896f, -0.52459469f, -0.85251369f, -0.95064429f, -0.99468342f, -0.76192580f, -0.41419015f, 0.12436151f, 0.64925405f, 1.13684199f, 1.33630964f, 1.31330685f, - 0.86356450f, 0.34381018f, -0.02085849f, 1.83539444f, 2.32518759f, 1.67398143f, 1.25867313f, 1.20615444f, 0.52697956f, -0.09144588f, -0.76159106f, -1.51187022f, -1.92351238f, -1.95050372f, -1.91438733f, -1.85957587f, - 1.24350337f, 2.40332737f, 1.88241131f, 1.35749721f, -0.42200494f, -1.44428015f, -1.39178301f, -0.93577948f, -0.61036359f, -0.51298915f, -0.79745508f, 0.00259692f, 0.20231677f, -0.31281818f, -0.31072767f, -0.35345154f, - -1.27391584f, 0.23665237f, 1.44085187f, 2.06602253f, 1.71605896f, 0.13376293f, -0.37509412f, 0.40922525f, 0.84118074f, 0.94717998f, -0.77859633f, -1.07717911f, -1.15385313f, -1.14774662f, -0.82654451f, -1.15800495f, - 1.30848084f, 0.08937934f, -0.37852967f, -0.65194579f, -0.75067573f, -0.79649158f, -0.77379985f, -0.60797455f, -0.51295495f, -0.32714998f, -0.08812522f, 0.24492207f, 0.48331843f, 0.72894883f, 0.89967800f, 1.13292004f, - -1.59837663f, -0.80221740f, -0.23176726f, 0.53351299f, 0.66646844f, 0.70631763f, 0.72180374f, 0.68847102f, 0.63073539f, 0.46683184f, 0.29870291f, 0.24285644f, -0.04345483f, -0.36903735f, -0.77735195f, -1.13349493f, - -3.27008180f, -3.34427840f, -3.19628867f, -2.98677397f, -2.40944350f, -1.63513906f, -1.40569428f, -0.88190894f, -0.25273952f, 0.84351501f, 1.96278949f, 2.92570176f, 3.17223429f, 3.47899460f, 3.70716828f, 3.29194486f, - 2.58466208f, 2.01534437f, 1.28252767f, 0.44865967f, -0.33100837f, -0.81011259f, -1.06701187f, -1.12743988f, -1.21505758f, -0.99337144f, -0.66853937f, -0.46093443f, -0.22132067f, 0.00996599f, 0.24481197f, 0.30882455f, - -0.62864502f, 1.04984327f, 1.56877053f, 0.77975000f, 0.01037804f, 0.92352492f, 1.12297462f, 0.76284403f, -0.16106015f, -0.21398417f, -0.62673537f, -1.68917053f, -1.60748063f, -0.79116243f, -0.06290217f, -0.43694470f -}; -const float ivas_sns_cdbk_tcx20_stage2[ 64 * 16 ] = { - -0.14487037f, 0.32346300f, 0.29798679f, -0.52393127f, -0.25671033f, 0.85717754f, -0.09030235f, -0.41110330f, -0.32938564f, -0.36580017f, -0.13142117f, -0.06404494f, 0.10671000f, 0.18731030f, 0.26606878f, 0.27885301f, - 0.52707061f, 0.35016312f, 0.54090507f, 0.82023896f, 0.46675870f, -0.60012182f, -0.76783382f, -0.39198749f, -0.17916696f, -0.17307722f, -0.10507731f, -0.09327542f, -0.12176361f, -0.12715624f, -0.11980175f, -0.02587481f, - -0.71420988f, -0.65927011f, -0.35007906f, -0.01478187f, 0.15375095f, 0.11149616f, 0.08819131f, 0.11537168f, 0.18041243f, 0.28846009f, 0.61920238f, 0.78709602f, 0.49945852f, -0.03863360f, -0.42339912f, -0.64306599f, - -0.81717379f, 0.06122156f, 0.05823003f, 0.10166328f, 0.27940347f, 0.24198679f, 0.13036228f, 0.07594383f, 0.21865219f, 0.19571948f, 0.11860502f, 0.04836758f, -0.03211315f, -0.14926357f, -0.23274285f, -0.29886216f, - -0.68529960f, -0.60305257f, -0.55080408f, -0.31252031f, 0.02732556f, 0.58303818f, 0.67638004f, 0.45008305f, 0.44400610f, 0.24064307f, 0.01598330f, -0.02342002f, -0.05864021f, -0.08903495f, -0.06326312f, -0.05142446f, - 0.89939472f, 0.31232066f, -0.27153630f, -0.52911639f, -0.58173141f, -0.63610440f, -0.61689761f, -0.43424024f, -0.23705022f, -0.00031150f, 0.15363335f, 0.19705513f, 0.25413198f, 0.35648787f, 0.53897823f, 0.59498626f, - 0.29798691f, 0.08114488f, 0.25286730f, -0.14155021f, -0.55163298f, -0.91534601f, -0.57551866f, 0.56064647f, 0.80731933f, -0.19474923f, -0.20126966f, 0.06517040f, 0.06866947f, 0.09059095f, 0.13444783f, 0.22122305f, - -0.19554741f, -1.08027678f, -0.01182563f, 0.56474090f, 0.41996725f, 0.08237738f, 0.08022205f, 0.10168343f, 0.06794579f, -0.08037661f, -0.20594204f, -0.13493371f, -0.05614077f, 0.03317273f, 0.14216415f, 0.27276933f, - -0.23050462f, -0.75246507f, -0.69868854f, -0.48346371f, -0.40917848f, -0.36594095f, -0.07600729f, 0.12198463f, 0.35806061f, 0.42664099f, 0.36253664f, 0.28721164f, 0.28501428f, 0.31580309f, 0.39290382f, 0.46609294f, - -0.67820482f, -0.00872112f, 0.40025028f, 0.70327670f, 0.42493234f, -0.57698003f, -0.97061329f, -0.62910745f, -0.24969320f, -0.09521511f, 0.04433478f, 0.16549806f, 0.17050527f, 0.26401941f, 0.52200672f, 0.51371134f, - 1.15515222f, -0.29885937f, -0.45759359f, -0.16519237f, -0.04117621f, -0.07252194f, -0.02430911f, -0.04766781f, -0.02328497f, -0.05048145f, -0.05153410f, -0.06528098f, -0.04522347f, -0.01163017f, 0.03517569f, 0.16442759f, - 1.26308471f, 0.47631737f, 0.20702857f, 0.04885555f, 0.01820924f, -0.04929548f, -0.00848071f, -0.02414509f, -0.04549576f, -0.16589601f, -0.22069993f, -0.30533811f, -0.30611208f, -0.31300078f, -0.32636395f, -0.24866742f, - -0.64451248f, -0.26649107f, 0.11640199f, 0.09050698f, -0.25875099f, -0.58989672f, -0.18201608f, 0.56293201f, 0.69520096f, 0.55973258f, 0.03137457f, -0.53909145f, -0.42689946f, 0.14106379f, 0.40632407f, 0.30412130f, - 0.15140746f, 0.14125954f, -0.08456824f, -0.13219101f, 0.06042009f, 0.33575532f, 0.35779441f, 0.19239547f, -0.11511443f, -0.41291307f, -0.06796502f, 0.62883409f, 0.54647417f, -0.03056743f, -0.64102233f, -0.92999908f, - -0.20214866f, 0.33358969f, 0.69126333f, 0.34454972f, 0.05105591f, 0.16949466f, 0.15791728f, -0.06633089f, -0.02155995f, 0.20242418f, 0.31712646f, 0.04823767f, -0.30694375f, -0.55917643f, -0.61612875f, -0.54337052f, - 0.11822897f, -0.04039421f, 0.70914148f, 0.55687588f, 0.06691609f, -0.01671241f, 0.38831368f, 0.48498674f, 0.23982281f, -0.11333950f, -0.44950589f, -0.59143612f, -0.55439378f, -0.42178388f, -0.28206333f, -0.09465644f, - -0.14336086f, 0.05638831f, -0.01441642f, -0.42382782f, -0.38698654f, 0.24817171f, 0.77752198f, 0.25906019f, -0.48986881f, -0.97798705f, -0.62796677f, 0.10790457f, 0.39301453f, 0.49075265f, 0.45648021f, 0.27511976f, - 0.57860103f, -0.01948333f, -0.01550826f, 0.52219942f, 0.68939814f, 0.35139876f, -0.01666617f, -0.21673535f, -0.47658403f, -0.68042929f, -0.65034996f, -0.34910948f, -0.19976833f, -0.03318456f, 0.13815711f, 0.37806438f, - 0.37246276f, -0.08878862f, -0.58662283f, -0.58539914f, -0.25552364f, 0.03268078f, 0.23525090f, 0.52779846f, 0.89804404f, 0.85582758f, 0.41881201f, -0.00512611f, -0.24135956f, -0.44973199f, -0.57601809f, -0.55230687f, - -0.32189259f, -0.20721675f, -0.09742343f, -0.05501794f, -0.02597120f, -0.10341441f, -0.07152803f, 0.00321003f, 0.14348106f, 0.13459909f, 0.13417173f, 0.08360042f, 0.09862647f, 0.09372765f, 0.07551569f, 0.11553216f, - 0.23782332f, 0.49257946f, 0.16314649f, -0.21082378f, -0.15908458f, 0.19948076f, 0.80829724f, 0.74048420f, 0.31470714f, -0.11736674f, -0.41702302f, -0.38958905f, -0.30642209f, -0.41287171f, -0.48993898f, -0.45339847f, - -0.64636094f, -0.04385833f, 0.14399510f, -0.43842603f, -0.73607781f, -0.26594508f, 0.62882301f, 0.35001150f, 0.28828962f, 0.02070640f, 0.04274640f, 0.10066767f, 0.01277906f, 0.02855391f, 0.23224313f, 0.28185233f, - 0.47046627f, 0.94887935f, 0.24713839f, -0.23737461f, -0.23876072f, -0.07439994f, -0.09495447f, -0.13384673f, -0.10919962f, 0.11561096f, 0.34750397f, 0.22863541f, -0.07880257f, -0.39830725f, -0.49574485f, -0.49684374f, - -0.40909559f, -0.18655327f, 0.13106838f, 0.38799987f, 0.49861722f, 0.83281701f, 0.69114756f, 0.20069371f, -0.12792677f, -0.35587040f, -0.42614275f, -0.34440943f, -0.28876141f, -0.27425834f, -0.22103645f, -0.10828931f, - -1.18999475f, -0.19958884f, -0.14983643f, 0.01470880f, -0.02795637f, -0.14641321f, -0.31784893f, -0.46245588f, -0.18208072f, 0.19701783f, 0.59261157f, 0.51921614f, 0.35016513f, 0.38054069f, 0.38692917f, 0.23498570f, - 0.09958109f, -0.26177154f, -0.09010091f, 0.31898761f, 0.75461690f, 0.12276914f, -0.81281416f, -0.78184322f, -0.24358470f, 0.82758568f, 0.36579631f, -0.14176577f, -0.08975069f, -0.12652615f, 0.12350150f, -0.06468093f, - 0.08899403f, -0.19355344f, -0.19424186f, -0.07670148f, -0.01129831f, -0.12185644f, -0.22497393f, -0.43014230f, -0.38336267f, -0.26093033f, -0.06975312f, 0.14762185f, 0.34014822f, 0.41134546f, 0.45027987f, 0.52842445f, - 0.21499436f, 0.50168679f, 0.45504898f, 0.25411634f, -0.47901658f, -0.45717782f, -0.14093183f, 0.17265389f, 0.11115764f, -0.41915721f, -0.31922857f, 0.22345448f, 0.48226916f, 0.07143490f, -0.26830399f, -0.40300051f, - 0.12687524f, 0.05171471f, -0.07690770f, 0.26252085f, 0.27712144f, 0.23952572f, 0.03309903f, 0.01500629f, 0.06484326f, 0.06571283f, -0.16817282f, -0.63246792f, -0.98935090f, -0.44804742f, 0.39837118f, 0.78015619f, - -0.27518648f, -0.48420415f, -0.24141667f, 0.57134912f, 0.65714603f, 0.42293616f, -0.10408493f, -0.38791089f, -0.61076554f, -0.57292363f, -0.09457207f, 0.54285737f, 0.61562883f, 0.23132651f, -0.13569709f, -0.13448269f, - -0.44830103f, 0.90540056f, 0.00072142f, -0.39226111f, -0.46186317f, -0.43645456f, -0.37826714f, -0.24360826f, -0.04123674f, 0.14260549f, 0.22801709f, 0.22668095f, 0.21516528f, 0.17002730f, 0.24853909f, 0.26483493f, - 0.82582984f, -0.18396730f, -0.69977925f, -0.51672827f, 0.33935958f, 1.15275754f, 0.74107352f, 0.01951258f, -0.25558033f, -0.43304939f, -0.34099848f, -0.20947442f, -0.14398117f, -0.10182217f, -0.18238069f, -0.01077166f, - -0.05956926f, -0.06776164f, 0.03443600f, -0.24779379f, -0.39446507f, 0.19355305f, 0.85153169f, -0.02976018f, -0.70253585f, 0.23290277f, 0.42513902f, -0.02301892f, -0.00892405f, -0.00056059f, -0.02586520f, -0.17730813f, - -0.10475355f, -0.12240226f, 0.23596905f, 0.84034179f, 1.10352903f, -0.04380181f, -0.55005573f, -0.07517667f, 0.38548284f, 0.23177362f, -0.44010180f, -0.37858708f, -0.16160512f, -0.18482124f, -0.37409253f, -0.36169852f, - -0.66969186f, 0.05371874f, -0.03936352f, -0.29928720f, -0.41624260f, -0.41299981f, -0.08577629f, 0.31675281f, 0.52331795f, 0.62411866f, 0.60734652f, 0.31853824f, 0.22382100f, -0.00426635f, -0.24809569f, -0.49189053f, - 0.42558925f, -0.08740923f, -0.12413315f, 0.07160194f, 0.21621681f, 0.18737853f, 0.20692231f, 0.06594840f, 0.06316038f, -0.01455973f, -0.09736051f, -0.19278266f, -0.20576965f, -0.20479396f, -0.19511934f, -0.11488934f, - 0.36293062f, -0.57831316f, -0.52476107f, -0.18291608f, 0.05956296f, 0.17827873f, 0.56052629f, 0.90619512f, 0.33375509f, -0.31016948f, -0.35518802f, -0.18057272f, -0.07051228f, -0.11858827f, -0.10671145f, 0.02648366f, - -0.47233802f, -0.10696118f, -0.17385597f, -0.31283671f, -0.54242892f, -0.48720345f, -0.41705631f, -0.17742297f, 0.04283104f, -0.05195671f, -0.10468624f, -0.03852503f, 0.06812391f, 0.59475499f, 1.17499043f, 1.00457125f, - 0.33658160f, 0.35011487f, 0.45187233f, -0.02492518f, -0.55350758f, -0.59303580f, -0.31109052f, 0.13779098f, 0.55888251f, 0.84708841f, 0.47270673f, -0.43127783f, -0.54032183f, -0.34904867f, -0.17752966f, -0.17430036f, - 0.44845114f, -0.49717161f, -0.47780018f, 0.51116217f, 0.25239415f, -0.46774617f, -0.37660723f, -0.11699702f, 0.09542037f, -0.01250943f, 0.20050057f, 0.40176439f, 0.32380431f, 0.15297561f, -0.14232876f, -0.29531216f, - 0.58997624f, 0.33423174f, -0.49272429f, -0.77991590f, -0.63691990f, -0.16375248f, 0.20892044f, 0.18843065f, 0.17599488f, 0.14061586f, 0.15322675f, 0.18367503f, 0.13457790f, 0.01264192f, -0.03498125f, -0.01399761f, - 0.11883889f, -0.17653462f, -0.07102121f, -0.16170325f, -0.31396815f, -0.45007863f, -0.66549732f, -0.56194237f, -0.04368741f, 0.74826150f, 1.05944395f, 0.45896665f, 0.13555009f, 0.05510292f, 0.02009383f, -0.15182464f, - 0.07240272f, -0.58533213f, -0.60637060f, -0.30890106f, -0.02128210f, 0.09681284f, 0.16938452f, 0.09862013f, 0.19046479f, 0.19100352f, 0.26416808f, 0.26993362f, 0.23648423f, 0.09763257f, -0.04637479f, -0.11864633f, - 1.00841842f, 0.48487093f, -0.06341281f, -0.08270476f, 0.05744570f, 0.01750478f, -0.34725114f, -0.56805040f, -0.46574885f, -0.30005483f, -0.09520550f, 0.06924440f, 0.18895007f, 0.12019539f, -0.01497133f, -0.00923003f, - -0.11951983f, -0.09981565f, -0.02725746f, -0.30082482f, 0.20230754f, 0.13666509f, -0.43246623f, 0.35244293f, 0.18119722f, 1.02992782f, -0.88125774f, 0.02331986f, 0.31122766f, -0.27229286f, 0.03194423f, -0.13559793f, - 0.30038871f, 0.08947897f, -0.39317595f, -0.46247446f, -0.42411556f, -0.42404287f, -0.31600225f, -0.23970776f, -0.22563637f, -0.14999339f, 0.24040805f, 0.88216954f, 0.90562440f, 0.49896646f, -0.00532430f, -0.27656328f, - -1.03852817f, -0.43685628f, 0.97570249f, 0.40073542f, -0.16567993f, -0.21536660f, 0.12504130f, 0.05185039f, 0.10097880f, 0.11493671f, 0.11604106f, 0.09278894f, 0.06924125f, -0.04393053f, -0.08352009f, -0.06343456f, - 0.63612744f, 0.65518210f, 0.45922163f, 0.32046049f, 0.42927283f, 0.43905062f, 0.21015594f, -0.14220340f, -0.37678678f, -0.46507109f, -0.45569496f, -0.37686899f, -0.32849396f, -0.33044372f, -0.35635326f, -0.31755504f, - 0.41636915f, 0.62005731f, 0.06636205f, -0.59228655f, 0.33311937f, 0.75787668f, 0.00941011f, -0.45161756f, -0.65103077f, -1.10958672f, -1.02188609f, -0.67703448f, 0.33622739f, 1.61684726f, 0.14432118f, 0.20285196f, - -0.54161629f, 0.29651460f, 0.48390239f, 0.54479388f, 0.45539891f, 0.27213590f, -0.06343843f, -0.24873747f, -0.31972562f, -0.38332671f, -0.30589718f, -0.21560606f, -0.11351916f, -0.04853252f, 0.04142231f, 0.14623145f, - -0.21538006f, -0.50670918f, -0.02385513f, 0.35315677f, 0.10824776f, 0.03860134f, 0.48712274f, 0.49283326f, 0.39503514f, 0.30292369f, 0.35920722f, 0.11075640f, -0.28306221f, -0.52442456f, -0.56662428f, -0.52782887f, - 0.24246654f, 0.15496835f, 0.07742345f, -0.00816546f, -0.02214009f, -0.12207666f, -0.09321134f, -0.14020839f, -0.02096415f, 0.02403039f, -0.00227972f, -0.07257466f, -0.06385085f, -0.03120190f, -0.01017645f, 0.08796095f, - 0.55718201f, 0.39817200f, 0.01585643f, -0.42726280f, -0.49946467f, -0.23926890f, 0.12647764f, 0.16539668f, -0.09322228f, -0.28903514f, -0.36248464f, -0.37621498f, -0.21830881f, 0.12546719f, 0.47757747f, 0.63913280f, - 0.07202509f, -0.30917825f, 0.26796130f, 0.18122649f, -0.74238320f, -0.65070972f, 0.20487278f, -0.03910861f, -0.13788223f, -0.13927704f, 0.30951126f, 0.22564689f, 0.18217460f, 0.23128586f, 0.20552209f, 0.13831273f, - 0.81154454f, 0.16848402f, -0.17973760f, -0.10712113f, -0.08562767f, -0.33154566f, -0.24733460f, -0.19259111f, 0.09705231f, 0.36926093f, 0.39058223f, 0.34681425f, 0.16685070f, -0.13716590f, -0.45775544f, -0.61170978f, - -1.33280729f, -0.16122649f, -0.09275794f, 0.58345947f, 0.61239977f, 0.50766167f, 0.06032890f, 0.13414746f, 0.18885722f, 0.13865434f, 0.23772269f, -0.25267260f, -0.54709895f, -0.31230173f, 0.07737009f, 0.15826345f, - -1.08561454f, -0.71787872f, -0.33522393f, 0.09636394f, 0.26521236f, 0.37639836f, 0.31311513f, 0.09537412f, -0.07885832f, -0.23990515f, -0.16502660f, 0.10895014f, 0.26463981f, 0.29732376f, 0.35578048f, 0.44934924f, - -0.29274363f, 0.08361693f, 0.01766194f, -0.22807328f, -0.16950675f, 0.28608384f, 0.00299181f, 0.07025513f, -0.20633117f, 0.48438844f, 0.91263549f, 0.04231580f, -0.66916627f, -0.44689801f, 0.06041835f, 0.05235140f, - 0.18067823f, -0.43833102f, -0.91255750f, -0.38799121f, 0.28155095f, 0.40506215f, 0.07352559f, -0.10582149f, -0.13688260f, -0.20626464f, -0.13280234f, -0.02533342f, 0.03247104f, 0.20876704f, 0.46466759f, 0.69926172f, - 0.51511088f, 0.81421556f, 0.82445640f, 0.01131859f, -0.32041051f, -0.39839079f, -0.43152495f, -0.42594915f, -0.41684800f, -0.38010709f, -0.25091606f, -0.15334343f, -0.03594408f, 0.06862608f, 0.21814936f, 0.36155722f, - -0.74835512f, -0.03907167f, -0.02730968f, 0.01017743f, 0.06598847f, 0.36210429f, 0.29611340f, 0.34006521f, 0.09628113f, -0.15142368f, -0.62878543f, -0.79996695f, -0.45331571f, 0.20593004f, 0.80186308f, 0.66970511f, - -0.25432502f, 0.38418428f, 0.43145928f, 0.30498956f, 0.19189249f, -0.25021553f, -0.53882666f, -0.61584834f, -0.43654724f, -0.03402395f, 0.45760398f, 0.60327277f, 0.53610474f, 0.16098234f, -0.30297334f, -0.63772932f, - -0.42321919f, 0.85086362f, 0.60159420f, 0.08633772f, -0.28445894f, -0.22512885f, 0.23909004f, 0.20046697f, 0.01484137f, -0.11652413f, -0.12017169f, -0.26922922f, -0.26311675f, -0.18921524f, -0.06712212f, -0.03500777f, - 0.58209071f, -0.26533411f, -0.20240535f, 0.27577532f, 0.65478295f, 0.66491349f, 0.41026256f, 0.22123940f, 0.15813271f, 0.07048989f, -0.03133192f, -0.19389440f, -0.34519672f, -0.53017394f, -0.73238212f, -0.73696843f -}; -const float ivas_sns_cdbk_tcx20_stage3[ 32 * 16 ] = { - -0.08443224f, -0.18703635f, -0.02297765f, 0.35108322f, -0.47365404f, 0.60080101f, -0.14560352f, 0.01413276f, 0.01222370f, 0.01369841f, 0.05509108f, 0.03233707f, 0.01187713f, -0.08225931f, -0.08910713f, -0.00617424f, - -0.45134081f, -0.18205893f, -0.21886586f, -0.27082278f, -0.18872267f, -0.08438255f, 0.11808124f, 0.11472340f, 0.08049694f, 0.05868671f, 0.08856118f, 0.10686811f, 0.14792971f, 0.16522330f, 0.21823435f, 0.29738868f, - -0.11328915f, 0.10130429f, -0.14943437f, 0.15645630f, 0.63935450f, 0.37821704f, -0.21310801f, -0.24867988f, -0.01659672f, 0.03328198f, -0.08180066f, -0.05657044f, 0.10906149f, 0.03196869f, -0.22137928f, -0.34878580f, - 0.05458665f, -0.05919364f, -0.13460386f, 0.10683925f, 0.02486665f, -0.03996090f, -0.07800776f, -0.00646458f, -0.21155480f, -0.27387617f, 0.02240932f, 0.70908553f, -0.66258796f, -0.11916859f, 0.46104817f, 0.20658280f, - -0.18236160f, -0.42556974f, -0.01518583f, 0.40249814f, 0.16028064f, -0.31751965f, -0.32775039f, -0.07115151f, 0.14131570f, 0.25092515f, 0.30150209f, 0.11921413f, 0.03049898f, 0.00963513f, -0.00838672f, -0.06794450f, - 0.43233298f, 0.11411029f, -0.14415844f, -0.34176452f, -0.41588457f, -0.29962161f, 0.10637969f, 0.23407196f, 0.10305969f, -0.00062410f, 0.02900924f, 0.03866877f, 0.08640844f, 0.05154612f, 0.00161694f, 0.00484903f, - -0.21512794f, 0.25425865f, 0.27105566f, -0.05213586f, -0.05906940f, -0.26548344f, -0.44413633f, 0.03920286f, 0.46845996f, 0.41236263f, -0.31903770f, -0.32961136f, 0.22647316f, 0.19335126f, -0.03700087f, -0.14356117f, - 0.21924285f, -0.02083234f, -0.21264229f, -0.32008443f, 0.85787441f, -0.31109029f, -0.11710511f, 0.15258065f, -0.05422604f, 0.04703640f, 0.03138786f, 0.00284139f, -0.14128648f, -0.12246651f, -0.12553053f, 0.11430042f, - -0.06983219f, 0.15566395f, 0.00257636f, -0.43107600f, -0.19146497f, 0.19866667f, 0.23130140f, -0.15042179f, -0.31509935f, -0.19492938f, 0.13173040f, 0.34976123f, 0.35522809f, 0.15128504f, -0.03897684f, -0.18441264f, - 0.03835343f, -0.41781092f, -0.09130119f, 0.23649600f, 0.31864720f, 0.31965077f, 0.31997092f, 0.09379415f, -0.07805132f, -0.17350540f, -0.16066354f, -0.15534991f, -0.10595695f, -0.07769963f, -0.06267573f, -0.00389790f, - -0.06072967f, -0.08529762f, -0.25895528f, -0.11410745f, -0.03994694f, 0.00520744f, 0.13029546f, 0.20924505f, 0.20033325f, 0.00128218f, -0.48912530f, -0.29001748f, 0.59798769f, 0.57708579f, -0.00334114f, -0.37991599f, - 0.67709987f, 0.24479940f, 0.09839041f, 0.09240624f, 0.04874621f, -0.07903978f, -0.10677716f, -0.20070119f, -0.12618873f, -0.06680438f, -0.05551493f, -0.11559282f, -0.11011740f, -0.12021879f, -0.12904082f, -0.05144612f, - -0.24390844f, -0.02971498f, 0.26491058f, 0.32477805f, 0.15268137f, -0.03230336f, -0.09305650f, -0.07114758f, -0.26964124f, -0.44939594f, -0.31245133f, 0.05828219f, 0.30712838f, 0.31280972f, 0.10713241f, -0.02610336f, - 0.19735739f, -0.09060264f, 0.00825537f, -0.36599055f, 0.05585799f, 0.37908316f, -0.38413173f, 0.35027949f, 0.34555851f, -0.34241207f, -0.18091006f, 0.16295794f, 0.08399265f, -0.12258257f, -0.08886776f, -0.00784505f, - 0.18552089f, -0.05448505f, -0.06090343f, 0.28995307f, -0.00222442f, -0.38233148f, -0.18031475f, 0.21268787f, 0.02073848f, -0.18932508f, -0.18523794f, -0.18812600f, -0.12671694f, 0.01228197f, 0.22055935f, 0.42792350f, - 0.12799222f, 0.22968936f, 0.03802711f, -0.14099927f, -0.08635323f, 0.16987494f, 0.35348472f, 0.04505467f, -0.26388915f, -0.34916901f, -0.22942166f, -0.17684250f, -0.08724829f, -0.00054213f, 0.12610262f, 0.24423959f, - -0.08038187f, -0.16879152f, -0.00176772f, 0.35376535f, -0.37011098f, -0.36320739f, 0.66636341f, -0.06773157f, -0.07814045f, -0.04765960f, -0.03365673f, 0.02181851f, 0.03254002f, 0.03483427f, 0.02717800f, 0.07494827f, - -0.34868864f, 0.17040333f, 0.25260784f, 0.10076787f, 0.06839398f, -0.02800665f, -0.06848675f, -0.16826923f, -0.07268923f, 0.01087754f, 0.05460110f, 0.00431011f, 0.03885215f, 0.00975901f, -0.01527130f, -0.00916121f, - 0.18571700f, 0.08336153f, 0.02979922f, -0.39409904f, -0.12098272f, 0.43026379f, -0.26722488f, -0.41282119f, 0.02970150f, 0.49897713f, 0.10843837f, -0.24094187f, -0.08115504f, 0.00006204f, 0.10433840f, 0.04656578f, - 0.00538329f, -0.07750994f, -0.10910098f, 0.04048538f, 0.03334399f, 0.28342260f, 0.14581840f, -0.24746813f, -0.34416074f, 0.06151045f, 0.68745611f, 0.19063398f, -0.23771814f, -0.28316033f, -0.12688702f, -0.02204889f, - -0.60521242f, -0.06124017f, 0.11564466f, 0.07475615f, 0.11824730f, 0.14189819f, 0.27204580f, 0.27978428f, 0.25196977f, 0.13866750f, 0.00205101f, -0.10150602f, -0.11644945f, -0.18929950f, -0.17648802f, -0.14486907f, - 0.06856566f, -0.13844197f, -0.26691240f, -0.18845012f, -0.05126065f, 0.00304429f, 0.11414309f, 0.06950182f, 0.19286717f, 0.29037166f, 0.27053650f, 0.17652627f, 0.09171994f, -0.09001258f, -0.24528745f, -0.29691120f, - -0.13004111f, 0.35130055f, 0.29363124f, -0.18853208f, -0.39468716f, -0.19791109f, -0.04383464f, 0.00894901f, 0.12616722f, 0.23070746f, 0.26441755f, 0.01948829f, -0.23089364f, -0.30363455f, -0.02382649f, 0.21869951f, - 0.11164215f, 0.03116967f, -0.06353187f, 0.16924336f, -0.01461062f, -0.19152070f, 0.03686445f, 0.20477538f, -0.03967336f, -0.32744743f, -0.17088429f, 0.63829176f, 0.35280729f, -0.43549735f, -0.27277762f, -0.02885087f, - -0.30725406f, 0.74701729f, -0.39274145f, 0.04302180f, 0.07483049f, -0.03413902f, 0.09344659f, 0.09169015f, 0.04345559f, -0.04477331f, -0.00176985f, -0.03585142f, -0.03405962f, -0.07575575f, -0.09739054f, -0.06972689f, - 0.28265268f, -0.39222951f, -0.42695953f, -0.10897533f, 0.07424889f, 0.08797478f, 0.00908971f, -0.13637855f, -0.12075776f, -0.04977985f, 0.06395383f, 0.09442120f, 0.15174794f, 0.13939497f, 0.13041070f, 0.20118587f, - -0.06637296f, 0.10778732f, -0.07433513f, -0.03524749f, -0.17212396f, -0.11995773f, 0.04291853f, -0.06480863f, -0.07793575f, 0.16559639f, 0.16476497f, -0.45667097f, -0.18714125f, 0.71725922f, 0.42534599f, -0.36907862f, - 0.15419735f, 0.13519411f, 0.37767798f, 0.23431801f, -0.02281061f, -0.05079690f, 0.14170781f, 0.09854410f, 0.01337290f, -0.01979078f, -0.01296254f, -0.03126860f, -0.07566643f, -0.16863998f, -0.32784959f, -0.44522679f, - -0.24074183f, 0.08320241f, 0.21818929f, 0.23760260f, 0.19352113f, 0.17458723f, -0.14563963f, -0.24861723f, -0.22656746f, -0.05362363f, 0.00368164f, -0.25389215f, -0.34172497f, -0.16702059f, 0.23332537f, 0.53371777f, - 0.03933551f, -0.61436501f, 0.74997308f, -0.14605678f, -0.06355008f, -0.07845237f, 0.03677743f, -0.01381658f, 0.03542562f, 0.01940321f, 0.04277388f, 0.01439240f, 0.05417023f, -0.03165523f, -0.04388511f, -0.00047013f, - 0.19660049f, -0.03582845f, -0.21224511f, -0.09633821f, 0.02140122f, 0.06690902f, 0.14753796f, 0.23491232f, 0.40075372f, 0.33318442f, -0.21453422f, -0.44835823f, -0.31995723f, -0.14770359f, -0.02720588f, 0.10087175f, - 0.22313452f, 0.23174662f, 0.13588360f, -0.01979092f, -0.17483898f, -0.36387601f, -0.35104947f, -0.34545228f, -0.17072761f, 0.01654692f, 0.12560464f, 0.14070090f, 0.18025650f, 0.13082045f, 0.10588357f, 0.13515746f -}; -const float ivas_sns_cdbk_tcx20_stage4[ 32 * 16 ] = { - -0.01178932f, -0.08216325f, 0.00009975f, 0.07861932f, 0.10639093f, 0.10607783f, -0.11972309f, 0.01910820f, -0.05635505f, 0.02765448f, -0.08840101f, -0.09623400f, 0.34917350f, -0.19835894f, -0.46938213f, 0.43528268f, - -0.08636054f, 0.13923351f, -0.15932705f, -0.10849641f, -0.02303533f, -0.23968519f, -0.02192257f, 0.50128910f, 0.27139459f, -0.07262939f, -0.06622134f, -0.01073419f, -0.04308095f, -0.05629457f, -0.03175020f, 0.00762044f, - 0.24815560f, 0.14657944f, 0.07172491f, 0.02302382f, 0.01991109f, -0.10204469f, -0.24960876f, -0.07085594f, 0.12223419f, 0.06999865f, 0.10986748f, 0.13492392f, 0.05865008f, -0.10366906f, -0.23987720f, -0.23901358f, - -0.15438243f, -0.04559005f, 0.16760111f, 0.26289859f, 0.24002732f, 0.06333052f, -0.04293731f, 0.16191749f, 0.12993586f, -0.15916904f, -0.24049436f, -0.13688115f, -0.13764233f, -0.11140102f, -0.01899323f, 0.02178000f, - -0.09362153f, -0.06475772f, -0.01949932f, -0.04249530f, -0.05109865f, 0.07410551f, -0.01006480f, 0.04753318f, -0.02781557f, 0.07745214f, 0.06146913f, -0.16546467f, -0.41512457f, 0.10097607f, 0.66727071f, -0.13886467f, - -0.07368760f, 0.36035427f, 0.21605884f, -0.01438276f, -0.11360433f, -0.05644934f, 0.03063785f, -0.05006328f, -0.07521149f, -0.13595728f, -0.01277458f, 0.04492285f, 0.01200858f, -0.04176021f, -0.04570247f, -0.04438907f, - 0.09516185f, -0.01929782f, 0.00494854f, -0.09763747f, -0.07344490f, 0.12994610f, 0.48094184f, -0.48192847f, -0.05573409f, 0.26426544f, -0.27655157f, -0.08642901f, 0.08435032f, 0.13304512f, -0.05782422f, -0.04381160f, - -0.09313450f, 0.05540574f, 0.01201341f, -0.06726039f, -0.10451812f, 0.02669040f, -0.05484815f, 0.07449424f, -0.34344135f, 0.56109258f, -0.27428709f, -0.09301413f, 0.41965904f, -0.13902794f, 0.18473846f, -0.16456202f, - 0.08693855f, 0.01453042f, -0.11107078f, 0.06241724f, 0.10204906f, -0.07064796f, -0.13846291f, 0.08293345f, -0.10757619f, -0.22863306f, 0.03213009f, 0.19644778f, 0.16452805f, 0.34110370f, 0.09006750f, -0.51675482f, - -0.18423905f, 0.01384230f, 0.26714303f, -0.40934167f, 0.39275996f, -0.01237613f, -0.25919307f, -0.08619564f, -0.04046283f, -0.01126873f, -0.01664395f, 0.01744563f, 0.10282249f, 0.09607820f, 0.04998616f, 0.07964328f, - -0.02274322f, 0.17908332f, -0.02788687f, 0.00807798f, -0.14435131f, -0.02676761f, 0.10369709f, -0.23851723f, 0.57714821f, -0.24897036f, -0.18048434f, 0.02001729f, -0.12740088f, -0.09982727f, 0.00840552f, 0.22051971f, - 0.13771932f, -0.17471600f, 0.18563016f, 0.18284665f, 0.11307352f, 0.20075992f, -0.03584593f, -0.25044388f, -0.20529947f, -0.11730357f, 0.05388263f, 0.08544750f, 0.04416102f, -0.02585125f, -0.09278592f, -0.10127474f, - 0.08834726f, 0.11313223f, -0.16483942f, -0.28318232f, -0.23943962f, -0.10440104f, -0.03978272f, -0.07375089f, -0.00562577f, 0.02329676f, 0.14600550f, 0.17681015f, 0.14410817f, 0.09264978f, 0.05695417f, 0.06971767f, - 0.14265864f, -0.42999794f, -0.17884255f, -0.08097949f, -0.04680661f, -0.04620171f, 0.02411542f, 0.04266824f, 0.15894248f, 0.24773695f, 0.15192868f, -0.01414995f, -0.13102813f, -0.07567236f, 0.04332535f, 0.19230306f, - -0.21142675f, -0.18455704f, -0.13706857f, -0.09760966f, -0.00844340f, 0.14865602f, 0.20607338f, 0.12012844f, -0.00914924f, -0.14368559f, -0.00265126f, 0.10043210f, 0.09154737f, 0.03443178f, 0.02422327f, 0.06909914f, - 0.18450361f, 0.00435351f, 0.27864126f, 0.17704943f, -0.20479796f, -0.29862599f, -0.17089168f, -0.09881143f, 0.04783000f, 0.14260548f, -0.02349078f, -0.20487241f, -0.13745683f, 0.05546335f, 0.10019847f, 0.14830206f, - 0.10317471f, -0.16998911f, 0.09734737f, 0.06796242f, -0.01161580f, -0.18371589f, -0.08936939f, 0.07107444f, -0.09565406f, -0.23557438f, 0.42834066f, 0.31175412f, -0.11511657f, -0.28572113f, -0.06889545f, 0.17599802f, - 0.11312034f, 0.08666296f, 0.02086535f, 0.12656018f, -0.12520471f, 0.04702581f, 0.39113807f, 0.09775371f, -0.00094471f, 0.08191930f, 0.07626151f, -0.13554986f, -0.29383511f, -0.25857022f, -0.15738811f, -0.06981449f, - 0.07590872f, 0.10290609f, -0.14618577f, 0.13491216f, 0.33869686f, -0.04072549f, -0.30046897f, -0.07243681f, 0.07180300f, 0.23060158f, 0.21642544f, -0.13575731f, -0.31781641f, -0.19431392f, -0.02233810f, 0.05878895f, - -0.11105764f, -0.05437616f, -0.00379085f, 0.08951467f, 0.39169243f, -0.38233560f, 0.34492699f, -0.09947370f, -0.08648526f, -0.03340088f, -0.02593483f, 0.11572014f, 0.01899877f, -0.03965890f, -0.06421047f, -0.06012863f, - -0.01630162f, 0.17784241f, -0.29989778f, 0.10469439f, 0.14861228f, -0.00722859f, -0.10711587f, -0.18435390f, -0.22539717f, -0.21441284f, 0.00336383f, 0.04362196f, 0.03914130f, 0.10650815f, 0.16959322f, 0.26133027f, - -0.45700261f, 0.07282251f, 0.00944859f, 0.03968330f, -0.02457975f, 0.11148291f, -0.02109853f, -0.18417192f, 0.02503845f, 0.10733751f, 0.21565042f, 0.09727523f, 0.00466877f, -0.01572810f, -0.00245341f, 0.02162664f, - 0.01471341f, -0.09796256f, 0.37685840f, -0.27373841f, -0.22809280f, 0.20207443f, 0.12508033f, 0.16172866f, 0.15442152f, -0.03971152f, -0.03731565f, 0.04320052f, -0.02493079f, -0.08894232f, -0.13155708f, -0.15582618f, - -0.04063466f, 0.14873431f, 0.10076527f, -0.09442471f, 0.02133939f, -0.04747602f, 0.02176493f, 0.52606315f, -0.60183613f, -0.05056878f, 0.18858100f, -0.00936749f, -0.17007143f, -0.00822640f, 0.01473704f, 0.00062041f, - -0.01851982f, 0.07661957f, -0.30452796f, 0.64817852f, -0.21819667f, -0.15094971f, -0.02014064f, 0.04976562f, 0.03988913f, 0.00229505f, -0.01596447f, -0.00497683f, 0.01888521f, 0.00912230f, -0.04741494f, -0.06406442f, - -0.18646693f, -0.25658854f, 0.20567339f, 0.06671960f, -0.24836724f, -0.23737029f, 0.03275858f, 0.09293590f, 0.06861982f, 0.01487215f, 0.10808605f, 0.17546010f, 0.16832370f, 0.12557457f, -0.00949461f, -0.12073619f, - -0.08559046f, -0.16350668f, -0.28729498f, 0.01179878f, 0.06195939f, 0.06121501f, -0.29667937f, -0.19145944f, 0.41150010f, 0.18707789f, -0.21406932f, 0.19248440f, 0.16889573f, 0.10825101f, 0.07412737f, -0.03870938f, - 0.00652202f, -0.15316918f, 0.25343593f, -0.09299964f, -0.22861167f, 0.06865193f, 0.02064443f, -0.10488496f, -0.18017250f, -0.21898191f, -0.08742146f, 0.02608617f, 0.05046582f, 0.08687786f, 0.21515984f, 0.33839723f, - 0.12533507f, 0.27191291f, 0.06056226f, -0.10872799f, 0.01799135f, 0.17589055f, -0.05514906f, -0.01148984f, 0.01373578f, -0.08944541f, -0.35717808f, -0.38014180f, 0.05531840f, 0.30742910f, 0.08016039f, -0.10620357f, - -0.01190022f, -0.24441497f, -0.07461266f, 0.02317252f, 0.05704737f, 0.16442883f, 0.06955004f, 0.05748732f, 0.05251523f, 0.22879327f, 0.21860705f, -0.37376474f, 0.03987437f, 0.33071525f, -0.23228300f, -0.30521565f, - -0.00581916f, 0.24592784f, -0.27266538f, -0.28914327f, 0.09129356f, 0.42079957f, 0.05815983f, 0.01136363f, 0.03980200f, -0.04215296f, 0.01465284f, 0.03859289f, -0.13354970f, -0.16935580f, -0.05814064f, 0.05023468f, - 0.44241891f, -0.06885632f, -0.14130761f, -0.04771012f, -0.00863562f, 0.00586591f, 0.12381405f, 0.08059256f, -0.06764947f, -0.22513354f, -0.10536820f, 0.02669478f, 0.01147300f, -0.01584685f, -0.02845628f, 0.01810479f -}; - -const float *const ivas_sns_cdbks_tcx20[SNS_MSVQ_NSTAGES_TCX20] = { ivas_sns_cdbk_tcx20_stage1, ivas_sns_cdbk_tcx20_stage2, ivas_sns_cdbk_tcx20_stage3, ivas_sns_cdbk_tcx20_stage4 }; - -const float ivas_sns_means_tcx20[M] = { - 0.9155f , 1.2408f , 1.0050f , 0.5846f, - 0.2472f , 0.1902f , 0.0984f , 0.1039f, - -0.0139f , -0.0856f , -0.4157f , -0.6148f, - -0.7026f , -0.7216f , -0.8052f , -1.0262f -}; - -const int16_t ivas_sns_cdbks_tcx10_levels[SNS_MSVQ_NSTAGES_TCX10] = { 128, 32, 8 }; -const int16_t ivas_sns_cdbks_tcx10_bits[SNS_MSVQ_NSTAGES_TCX10] = { 7, 5, 3 }; - -const float ivas_sns_cdbk_tcx10_stage1[ 128 * 16 ] = { - 0.06343891f, -0.00651786f, -0.56994713f, -0.98772396f, -1.35099293f, -1.24848646f, -1.20301995f, -0.81089507f, -0.06563095f, 1.11147581f, 1.73933309f, 1.65859611f, 1.26237806f, 0.68028141f, 0.12449909f, -0.39678907f, - -1.34007175f, -1.50272189f, -2.07958791f, -2.38322761f, -2.22156614f, -1.96435669f, -1.68760863f, -1.23664935f, -0.28772180f, 0.87765579f, 1.83822720f, 1.95281398f, 2.33671266f, 2.76119687f, 2.75790597f, 2.17899850f, - -0.51450332f, 0.69692757f, 1.90898730f, 1.89179379f, 1.41350404f, 0.03604267f, 0.02251128f, -1.04270018f, -0.97981089f, -0.36225564f, 0.14171617f, -0.32050715f, -0.56272675f, -0.38710633f, -0.74842203f, -1.19345103f, - 0.61027733f, -0.25705654f, -0.30960961f, 0.11651829f, 0.08424358f, -0.04474594f, -0.21961636f, -0.26522327f, -0.31681379f, -0.23903185f, -0.07879718f, 0.00383111f, 0.09522293f, 0.15157026f, 0.24747985f, 0.42175137f, - 0.06215930f, 0.74417332f, -0.05737044f, -0.84302341f, -0.79474372f, -0.48758880f, 0.00597663f, 0.39113473f, 0.94133689f, 1.03804127f, 0.53832521f, -0.22235026f, -0.44306288f, -0.22065599f, -0.22880587f, -0.42354568f, - -1.79298887f, -1.27561542f, -0.40453013f, 0.23597108f, 1.02842032f, 1.26211371f, 0.67302878f, 0.34945977f, 0.47749022f, 0.37809966f, 0.32913783f, 0.24544337f, -0.10938763f, -0.26555659f, -0.53889493f, -0.59219154f, - 1.13009762f, 0.63132036f, 0.20308733f, 0.12539517f, -0.05215684f, -0.59255734f, -0.72324525f, -0.47416068f, -0.34730473f, -0.17547668f, -0.01869868f, -0.01336213f, -0.03177292f, -0.01470495f, 0.12726970f, 0.22627027f, - 0.77990892f, 0.11720033f, -0.36217078f, -0.11533103f, -0.09211988f, -0.10379850f, 0.04466728f, 0.23851356f, 0.32838480f, 0.57072608f, 0.78005115f, 0.64032724f, 0.04609407f, -0.53665387f, -1.07338898f, -1.26240993f, - 0.71007500f, 1.67092184f, 0.87004285f, -0.47652190f, -0.41457815f, 1.09228787f, 1.43629613f, 1.29941339f, 0.74914490f, -0.87973861f, -1.00898687f, -0.76690679f, -0.87310138f, -0.89762148f, -1.11083002f, -1.39989674f, - 0.93106313f, -0.58060200f, -1.42018765f, -1.93078113f, -1.40332079f, -1.01406592f, -0.68270775f, -0.12421160f, -0.12818640f, 0.46306788f, 0.74384671f, 1.78170251f, 1.49298768f, 0.36128067f, 0.32905160f, 1.18106291f, - -0.34612942f, -0.05241863f, 0.63278953f, 1.64696186f, 1.83789559f, 1.82381570f, 1.71656555f, 1.45437140f, 1.06980287f, 0.39137818f, -0.16457688f, -0.79497784f, -1.78896933f, -2.38820658f, -2.55386733f, -2.48443600f, - -1.86975241f, -1.08195483f, -0.57202727f, -0.39808906f, -0.40936508f, 0.09703771f, 0.81017115f, 0.38629167f, 0.19481800f, 0.19706778f, -0.03872708f, -0.18683058f, 0.37148725f, 0.91055817f, 0.85929760f, 0.73001606f, - 0.13134993f, -0.43834896f, -0.42233235f, -0.34270675f, -0.42348478f, -0.62064185f, -0.67185252f, -0.57602218f, -0.46183286f, -0.05757593f, 0.38429775f, 0.63679540f, 0.59933007f, 0.44800121f, 0.69922041f, 1.11580320f, - -3.26282616f, -2.43458949f, -1.60312382f, -1.18490625f, -0.63841390f, -0.06739227f, 0.57790279f, 1.01010243f, 0.95682720f, 0.75035821f, 0.76084039f, 0.55166704f, 0.83933875f, 1.36392702f, 1.32925064f, 1.05103737f, - 2.94202112f, 3.01169534f, 2.23272878f, 2.33910012f, 1.97620433f, 1.92572769f, -0.00413067f, -1.30712114f, -1.48714461f, -1.62849896f, -1.56921600f, -1.60110814f, -1.73339679f, -1.81275951f, -1.69381023f, -1.59029306f, - -2.29630904f, -1.61967905f, -0.50968315f, 0.70826746f, 1.31943393f, 1.58078613f, 1.31857322f, 0.52237224f, 0.09330352f, 0.13994471f, 0.02623813f, -0.21467602f, -0.33140340f, -0.32793129f, -0.24016399f, -0.16907333f, - 1.17007844f, 1.46542856f, 1.12327460f, 0.78468376f, 0.28858044f, -0.24345469f, -0.36619581f, -0.30604001f, -0.24486928f, -0.39076408f, -0.42628982f, -0.47126418f, -0.48974406f, -0.58899141f, -0.61209496f, -0.69233731f, - 1.07869290f, -1.09624499f, -1.92296142f, -2.03260639f, -0.72727691f, 0.59938120f, 1.09296276f, -0.23244761f, -0.74213456f, -0.00394467f, 0.65433789f, 0.15922442f, 0.10516506f, 0.08483738f, 1.10833114f, 1.87468404f, - -0.45930662f, 0.49568081f, 0.92195224f, 1.70200988f, 1.24720421f, 1.19845895f, 0.75959352f, 0.23323360f, -0.27099240f, -1.38259199f, -2.25979609f, -0.92875900f, -0.06647214f, -0.58552485f, -0.33254823f, -0.27214292f, - -0.34979667f, 0.75395625f, 0.28769469f, -0.85592098f, -0.65167816f, 0.61099639f, 0.60402617f, 0.14561560f, -0.35073645f, -0.56010271f, -0.46661447f, -0.33527423f, -0.00166125f, 0.46634881f, 0.62977271f, 0.07337395f, - -0.41325825f, -0.71696540f, -0.72218212f, -0.64886200f, -0.33204525f, -0.13777071f, -0.05902665f, 0.08826462f, 0.09668422f, 0.34870144f, 0.76742933f, 1.02820877f, 0.66254418f, 0.26837143f, -0.04920095f, -0.18089312f, - -3.00863529f, -3.40420466f, -1.94263495f, -0.42577604f, 1.34874808f, 1.22039392f, -0.16945247f, -0.55999693f, 0.06330206f, 1.23795253f, 0.30477631f, 0.53425336f, 1.62154688f, 1.44462099f, 0.96061888f, 0.77448714f, - 1.81574209f, 1.72942805f, 0.78817895f, 0.12550764f, -0.50423190f, -0.81032090f, -0.83940826f, -0.95575724f, -0.70482913f, -0.32127670f, -0.08073867f, -0.13170408f, -0.16649118f, -0.08610719f, -0.03381103f, 0.17581953f, - -0.84693001f, -0.20800644f, 0.25371425f, 0.56604831f, 0.68467374f, 0.74501557f, 0.69436428f, 0.53975035f, 0.44393852f, 0.30580817f, 0.06566139f, -0.27742827f, -0.57148395f, -0.67328070f, -0.81658998f, -0.90525565f, - -0.44018762f, 0.22712975f, 1.11402502f, 1.98499541f, 1.52065113f, 0.79057891f, 0.55313940f, 0.32776632f, 0.39113088f, 0.10707747f, -0.20138118f, -0.67412788f, -1.34113027f, -1.39661518f, -1.43118002f, -1.53187281f, - -0.71632657f, -0.79492959f, -1.11328698f, -1.41494496f, -1.48929785f, -1.40383584f, -1.26657215f, -1.11367689f, -0.76426307f, 0.01056535f, 0.85354567f, 1.27473730f, 1.64108006f, 2.08311127f, 2.27822947f, 1.93586484f, - 2.05008554f, 2.18328135f, 1.98567996f, 2.35703511f, 2.27653310f, 2.41056123f, 1.36801069f, 0.12761937f, -0.59913124f, -1.45799255f, -1.89092221f, -1.99613693f, -2.20251841f, -2.33272106f, -2.21702011f, -2.06236397f, - -0.88997509f, -0.45675689f, 0.38059457f, 0.51582524f, 0.11775375f, -0.01509768f, -0.18542670f, -0.33776632f, -0.39018689f, -0.33129536f, -0.13149667f, 0.00113524f, 0.03060501f, 0.32190251f, 0.62848970f, 0.74169479f, - 1.19033790f, 0.59193623f, -0.18758267f, -0.71960274f, -0.81756997f, -0.65024529f, -0.64463404f, -0.82612299f, -0.84513928f, -0.45206413f, -0.04059069f, 0.00434486f, 0.50165507f, 1.00958611f, 0.97568033f, 0.91001135f, - -2.25864394f, -2.18529992f, -1.67272884f, -1.18053068f, -0.96703519f, -0.83661833f, -0.59641534f, -0.08623307f, 0.57868270f, 1.39398557f, 2.00205076f, 1.91429603f, 1.37348845f, 1.02732012f, 0.88340938f, 0.61027091f, - 1.13384373f, 2.01444926f, 1.64076134f, 0.39967630f, 0.11211256f, 0.60599786f, 0.41069653f, -0.08528479f, -0.18299306f, -0.80418851f, -1.03743576f, -1.04941914f, -0.88831874f, -0.76292972f, -0.67716107f, -0.82980704f, - -1.17168042f, -0.44794963f, 0.01219570f, -0.09679638f, 0.01681223f, 0.42983884f, 0.69873962f, 1.14025903f, 1.28455301f, 0.60046712f, -0.18327995f, -0.56883208f, -0.60793720f, -0.38487681f, -0.31833900f, -0.40317432f, - 0.85846316f, 0.89573242f, -0.03759975f, -0.56845446f, -0.63431292f, -0.69230128f, -0.59890012f, -0.27699442f, -0.10781577f, 0.38926803f, 0.44176667f, 0.74409936f, 0.51508281f, -0.44324047f, -0.56579214f, 0.08099815f, - -3.15663729f, -3.79941004f, -3.31993311f, -2.54887019f, -1.08297819f, 1.57490155f, 2.29511481f, 2.21386433f, 2.04448334f, 1.39028095f, 1.22351492f, 1.20294900f, 1.33557966f, 1.22044095f, 0.22504752f, -0.81835038f, - 2.10765319f, 2.66375515f, 1.73697111f, 0.50664812f, -0.22472176f, -0.63409486f, -0.65405139f, -0.71248479f, -0.73053296f, -0.87990271f, -0.82710167f, -0.73244187f, -0.64629112f, -0.47294253f, -0.23431056f, -0.26615160f, - -0.03257826f, 0.53214066f, -0.00109639f, -0.42211164f, -0.51464982f, -0.59747387f, -0.63145473f, -0.49761105f, -0.36163571f, 0.00923799f, 0.32394200f, 0.34648466f, 0.32420111f, 0.44177392f, 0.52684150f, 0.55398991f, - 0.38342101f, 0.05503415f, -0.69210895f, -1.40291256f, -1.20627913f, -0.22810180f, 0.91689677f, 1.67212414f, 1.26349034f, 0.48698570f, 0.10567292f, 0.13423949f, -0.02515828f, -0.41152165f, -0.51320898f, -0.53857267f, - -2.82653388f, -3.73292024f, -3.01554952f, 0.33800837f, 1.63071077f, 3.70049918f, 1.52548217f, -0.51327972f, -0.09119392f, 0.92240352f, 2.33190356f, 1.84268123f, -0.37179294f, -0.94969237f, -1.13179438f, 0.34106773f, - 1.56686851f, 0.88339322f, 0.31264631f, -0.04528796f, -0.42838354f, -0.20342114f, 0.40102389f, 0.54537791f, 0.35383369f, -0.18334298f, -0.75234358f, -0.76217615f, -0.36188398f, -0.46147282f, -0.54662536f, -0.31820590f, - 1.24862641f, 0.57117898f, 0.32856394f, 0.39564440f, 0.31824468f, 0.20893064f, 0.02628416f, -0.15359328f, -0.37616872f, -0.26748355f, -0.12954661f, -0.12215355f, -0.31835718f, -0.55834118f, -0.61233860f, -0.55948996f, - -0.59446013f, 0.48100057f, 1.20941553f, 0.41887505f, 0.63264306f, 1.37297652f, 1.40760513f, 0.91551762f, 0.67322895f, -0.90761879f, -1.23123057f, -0.97622159f, -0.96118737f, -0.53857839f, -0.69473239f, -1.20723297f, - -0.59728936f, -1.63533369f, -2.00769344f, -1.93041740f, -1.52949359f, -0.77428525f, -0.21146300f, 0.18478098f, 0.44962772f, 0.95017605f, 1.24326918f, 1.36658626f, 1.25105966f, 1.00442735f, 1.03660313f, 1.19944572f, - 0.32910504f, 1.16199966f, 2.05499236f, 2.56854877f, 2.45081012f, 1.66017811f, 1.01838813f, 0.51773322f, -0.06505376f, -1.14261830f, -1.77930778f, -1.94467446f, -1.83142606f, -1.76577923f, -1.67433287f, -1.55856482f, - -2.64386625f, -1.44973884f, -0.70503582f, -0.39387129f, -0.07345342f, 0.04530383f, 0.12054861f, 0.18110856f, 0.21747675f, 0.44785123f, 0.60100453f, 0.60149054f, 0.48165166f, 0.67654040f, 0.91879547f, 0.97419414f, - 0.52841759f, -0.23803980f, -0.77847320f, -1.06415798f, -1.29095335f, -0.94613842f, 0.01856631f, 0.57516289f, 0.58685158f, 0.24351075f, -0.23807950f, -0.16772309f, 0.27674343f, 0.40698887f, 0.73162063f, 1.35570347f, - -2.57939825f, -1.65066455f, -0.80960514f, -0.40285025f, -0.02550543f, 0.48071345f, 0.90391140f, 1.61193038f, 1.46090124f, 0.72305123f, 0.34664153f, 0.08297581f, -0.07460306f, 0.06306698f, -0.00946438f, -0.12110157f, - 1.93616583f, 2.87229439f, 2.28910932f, 1.18636717f, 0.28185288f, 0.08337698f, 0.52019726f, -0.70876138f, -1.13139506f, -1.42927692f, -1.07719650f, -0.84569529f, -1.10761102f, -1.14612879f, -0.78606400f, -0.93723475f, - -0.83260061f, -1.02726632f, -0.72610655f, 0.18186308f, 0.34897446f, 0.12845730f, 0.04139028f, 0.52688618f, 0.69166145f, 0.76853602f, 0.83316573f, 0.74702270f, 0.29499833f, -0.33104569f, -0.74851736f, -0.89741947f, - 2.77837874f, 1.31099865f, 0.62870774f, 0.35471489f, 0.05642577f, -0.02869061f, 0.19231930f, 0.50340721f, 0.36258783f, -0.06924684f, -0.52796695f, -0.75396481f, -0.89969036f, -1.23296254f, -1.40215690f, -1.27286039f, - -2.03034497f, -1.73876167f, -1.42952672f, -1.24259095f, -0.92252541f, -0.61137126f, -0.50926746f, -0.37515247f, -0.01804868f, 0.44616051f, 0.86247078f, 1.09558380f, 1.34244283f, 1.77606518f, 1.80302809f, 1.55183866f, - -0.13073542f, 0.74480506f, 1.75612393f, 1.94677409f, 1.45854395f, 0.14973385f, 0.41257896f, 0.78276795f, 0.53033406f, -0.97322979f, -1.31039960f, -1.18457724f, -1.39195239f, -0.74765434f, -0.89874803f, -1.14436551f, - -0.34864040f, 0.37594126f, 1.12760599f, 0.69668388f, 0.42042319f, 0.18779444f, -0.10969643f, -0.21695083f, -0.15889803f, -0.31866683f, -0.31049579f, -0.24646351f, -0.37724204f, -0.33366480f, -0.20076896f, -0.18696143f, - -0.21183487f, 0.60232151f, 0.88716970f, 0.69703105f, 0.10878166f, -0.60737034f, -0.81172315f, -0.92047926f, -0.64811892f, -0.24324457f, 0.15840527f, 0.21438269f, 0.31129327f, 0.53391758f, 0.13740501f, -0.20793704f, - -4.29885487f, -4.07150539f, -2.63799263f, -0.36599561f, 1.44131158f, 1.45858072f, -0.19422385f, -1.06386090f, -0.33862479f, 1.91691551f, 0.64172657f, 0.73115700f, 2.00475202f, 1.65789788f, 1.59229150f, 1.52642575f, - 2.70538594f, 1.21062684f, 0.58857880f, 0.37060452f, 0.32021415f, 0.15108056f, -0.18531087f, -0.47434646f, -0.64590620f, -0.70151444f, -0.68058335f, -0.63299041f, -0.53628956f, -0.62363375f, -0.52279857f, -0.34311771f, - -1.21504940f, -0.39554896f, 0.66755826f, 1.39859234f, 1.07486796f, 1.12290637f, 1.04295204f, 1.14165077f, 1.23441664f, 0.53720217f, -1.08842200f, -1.71470800f, -1.43192570f, -1.01274229f, -0.48508172f, -0.87666906f, - 0.79744189f, 0.76166108f, 0.24454768f, -0.10831092f, 0.07052421f, 0.61249105f, 1.01239329f, 0.92265182f, 0.79053239f, 0.48135056f, 0.14383439f, -0.46575922f, -0.96925167f, -1.31622221f, -1.46252773f, -1.51535724f, - 0.81612871f, -1.33697557f, -1.87521893f, -0.34596308f, 1.89973642f, 0.17905631f, -0.58156390f, -1.21825474f, -1.35128034f, -0.86896364f, -0.55987250f, -0.57592082f, -0.20226923f, 0.35191711f, 1.77194975f, 3.89749413f, - 1.63600586f, 1.88172004f, 2.47282363f, 2.31646225f, 1.68082996f, 0.43732883f, 0.54619537f, 0.53604274f, -0.42499034f, -1.38097531f, -1.67316581f, -1.66333999f, -1.66730967f, -1.61301407f, -1.62366867f, -1.46094527f, - -1.13086259f, -0.59286092f, -0.77851750f, -1.03233519f, -1.00728739f, -0.89574050f, -0.77142682f, -0.49554543f, -0.07881573f, 0.54315382f, 0.97530238f, 1.12272839f, 0.97460042f, 0.97504778f, 1.10466703f, 1.08789246f, - 2.01814493f, 0.44413768f, -0.35041288f, -0.98686383f, -1.26200527f, -1.52732432f, -1.48571248f, -1.19925108f, -0.92116223f, -0.35166881f, 0.13444272f, 0.18334560f, 0.92894956f, 1.08294765f, 1.35106569f, 1.94136698f, - -1.70233870f, -1.07878027f, -0.41699769f, -0.44160483f, -0.44460656f, -0.07853597f, -0.00754784f, 0.33653711f, 1.01426686f, 1.48915964f, 0.89682530f, 0.27439080f, 0.11875833f, 0.11843921f, 0.03694301f, -0.11490828f, - 2.92061289f, 2.48313078f, 1.67219449f, 1.01289511f, 0.89753859f, 0.94593326f, 0.70215728f, 0.23868842f, -0.29061326f, -1.00973596f, -1.40595256f, -1.63034802f, -1.68974684f, -1.71427450f, -1.62221007f, -1.51026992f, - -0.53491548f, -0.78055602f, -0.76775254f, 0.10333314f, 0.89464100f, 1.39260245f, 1.42278905f, 1.08133696f, 0.66191720f, 0.26667076f, 0.06990779f, -0.05792125f, -0.54825802f, -0.97098851f, -1.11014442f, -1.12266153f, - 0.08434699f, -0.45396949f, -0.94011771f, -1.20989965f, -1.27570370f, -1.00735662f, -0.43812010f, 0.32116477f, 0.90682311f, 1.07490930f, 1.04265682f, 0.83531254f, 0.64508330f, 0.31821119f, 0.09966431f, -0.00300507f, - -3.45239663f, -3.47846075f, -3.31323927f, -2.90259299f, -2.36355887f, -1.50192157f, -0.92288952f, -0.22530010f, 0.43258717f, 1.44935400f, 2.42148671f, 2.40769873f, 2.68306011f, 3.17878912f, 2.96783805f, 2.61954501f, - 0.48284645f, 1.41799541f, 1.97243102f, 1.59009976f, 1.22294070f, 0.43320660f, -0.04294311f, -0.31344005f, -0.66525145f, -1.13038241f, -1.07639821f, -0.88736938f, -0.84264379f, -0.79497080f, -0.64026957f, -0.72585115f, - -0.53516472f, -0.76920408f, -0.88526173f, -0.38845075f, -0.11227754f, 0.13805981f, 0.30967527f, 0.39937585f, 0.29135651f, 0.31552367f, 0.32154879f, 0.11114380f, 0.10183365f, 0.23587895f, 0.26513073f, 0.20083182f, - -0.82074713f, 0.00036242f, 0.05382877f, -0.93967714f, -1.34393534f, -0.63769734f, 0.72309703f, 0.71909478f, 0.67996995f, 0.71025231f, 0.03684615f, -0.42385779f, 0.20909277f, 0.74865506f, 0.36478854f, -0.08007303f, - -3.48156475f, -2.62401860f, -1.04625145f, 0.48561624f, 1.08462887f, 1.17430353f, 0.89095108f, 0.61098007f, 0.50455996f, 0.68603781f, 0.79217569f, 0.58623668f, 0.26474313f, 0.08681209f, -0.00104191f, -0.01416800f, - 0.84688039f, 0.96543736f, 0.75181222f, 0.42822852f, 0.24904957f, 0.14177234f, -0.40028407f, -0.85658294f, -0.99971434f, -0.98122097f, -0.75656716f, -0.49934498f, -0.24276416f, 0.09868884f, 0.51868958f, 0.73591908f, - -0.06813618f, -0.46119843f, -0.30096714f, 0.02701580f, 0.39106072f, 0.62007470f, 0.37968778f, 0.26617731f, 0.19689970f, 0.13864013f, 0.13523990f, 0.07059597f, -0.06298216f, -0.21734863f, -0.46878891f, -0.64597009f, - 0.51769554f, 1.42736951f, 1.88530137f, 0.81872770f, 0.32102451f, 1.12825115f, 1.21494458f, 1.01472394f, 0.70810844f, -0.50467729f, -1.98880367f, -2.08711611f, -1.72264586f, -0.93580475f, -0.50571272f, -1.29138527f, - 0.60536537f, -0.70354528f, -1.21617652f, -1.24262631f, -1.19828977f, -1.12565262f, -1.02203112f, -0.75894521f, -0.36826442f, 0.22795933f, 0.70544758f, 0.89015550f, 1.16228260f, 1.29703247f, 1.33542695f, 1.41186140f, - 1.04571798f, 1.61006483f, 1.19302962f, 0.57809989f, 0.71546259f, 1.30149630f, 1.62036473f, 1.44726990f, 1.32882491f, 0.70680094f, -0.39181833f, -1.57019972f, -2.33882246f, -2.53038720f, -2.43836110f, -2.27754281f, - -1.70543716f, -1.02771491f, -0.55943640f, -0.54366014f, 0.38503076f, 1.17876631f, 0.37193454f, -0.12189347f, 0.01303672f, -0.31900986f, -0.63608524f, -0.16956145f, 0.42659413f, 0.80300802f, 1.20767125f, 0.69675704f, - 1.23368326f, -0.17372473f, -0.75359852f, -0.99565343f, -0.84904797f, -0.66289765f, -0.45993622f, -0.17721316f, 0.04972474f, 0.35539595f, 0.55580381f, 0.47907626f, 0.35782172f, 0.37623101f, 0.34327632f, 0.32105845f, - -2.18352213f, -1.61901373f, -1.19957932f, -1.19527760f, -1.04950866f, -0.80750101f, -0.01092868f, 0.85242547f, 1.12490981f, 0.83609667f, 0.69994996f, 0.68985497f, 0.89390672f, 1.14712210f, 1.06776086f, 0.75330468f, - 2.33432113f, 2.91068592f, 2.96537876f, 2.14989074f, 1.35332201f, -0.15166191f, -0.61009155f, -1.11607408f, -1.38841709f, -1.32795548f, -1.18652766f, -1.19841345f, -1.27066378f, -1.28720326f, -1.20653804f, -0.97005218f, - -1.23488338f, -0.82668707f, -0.18190692f, 0.80577567f, 1.40765006f, 1.57572199f, 0.77649472f, 0.06817818f, -0.35316133f, -0.31163295f, -0.22814807f, -0.08516639f, -0.14974413f, -0.40747307f, -0.44196718f, -0.41305033f, - 1.49614141f, 2.17073361f, 1.21828130f, 0.24082715f, -0.04653730f, -0.02674890f, 0.07730547f, -0.75552212f, -0.53247648f, 0.68923075f, 0.51413502f, -1.15304142f, -1.36047405f, -1.08476009f, -0.71333064f, -0.73376398f, - -0.89704242f, -1.73833976f, -1.54624918f, -0.75197415f, -0.28436966f, -0.17513881f, -0.18327761f, -0.08090335f, 0.17526730f, 0.62711579f, 0.87938919f, 0.73687059f, 0.73766468f, 0.77613800f, 0.76077200f, 0.96407748f, - -0.74442989f, 0.06393849f, 0.79593747f, 2.27945407f, 2.65112193f, 2.16937280f, 1.04534068f, 0.40390110f, -0.66651353f, -1.35166042f, -1.46612345f, -0.64581600f, -0.65681647f, -1.60629861f, -1.31557834f, -0.95583049f, - 1.36402643f, 1.80223774f, 0.69837068f, -0.49496040f, -0.78242114f, -0.27168915f, 0.02445085f, -0.20866271f, -0.30035706f, -0.41170635f, -0.35841577f, -0.34242299f, -0.28692410f, -0.02094657f, -0.05934480f, -0.35123483f, - -1.08520561f, -0.84120058f, -0.40604501f, -0.30838475f, -0.39817946f, -0.45244145f, -0.46460261f, -0.31407296f, -0.03689281f, 0.38084328f, 0.75874597f, 0.64589942f, 0.68713572f, 0.85059140f, 0.70295555f, 0.28085506f, - -3.41901495f, -4.05624120f, -2.77833774f, -0.25403214f, 1.87889428f, 1.49402114f, -0.04104013f, -0.12322346f, 0.66403332f, 2.05218773f, 0.76725378f, 0.75987949f, 1.64445951f, 1.18046450f, 0.23904189f, -0.00834539f, - 2.34563559f, 1.85433514f, 0.92188091f, 0.00938003f, -0.66632165f, -1.24128642f, -1.45925477f, -1.45794931f, -1.45009658f, -1.08637380f, -0.53948104f, -0.13215543f, 0.79501605f, 0.54741060f, 0.55538134f, 1.00387907f, - 0.18830608f, 0.82743615f, 0.71353361f, 0.08375013f, 0.72945362f, 1.56781385f, 0.82203061f, -0.15761113f, -1.14514559f, -0.94404839f, -0.45524505f, -0.03539938f, -0.38522988f, -0.55123197f, -0.43254198f, -0.82587158f, - 0.28717168f, 1.26620628f, 1.79284485f, 0.74811924f, 0.75340319f, 0.55244948f, 0.46108770f, 0.62189892f, 0.63524206f, -0.36020964f, -0.49840190f, -0.49783437f, -1.24630499f, -1.48121128f, -1.52882801f, -1.50563245f, - 0.77651863f, -0.09801613f, -0.65368548f, -1.42314584f, -1.95826046f, -2.20248886f, -1.97940063f, -1.63600078f, -1.05805019f, -0.03308653f, 1.18890487f, 1.59425997f, 1.56951997f, 1.72023665f, 1.99206238f, 2.20063258f, - 1.86036810f, 1.95524352f, 1.65802754f, 0.51762484f, 0.32278641f, 1.41534130f, 1.58480385f, 1.00644422f, -0.43304110f, -1.52615221f, -1.54409319f, -1.50951389f, -1.44095494f, -1.33336688f, -1.41459830f, -1.11891940f, - -0.48994782f, -0.25738925f, -0.03744629f, -0.08936731f, -0.21819055f, -0.21749988f, -0.57009207f, -0.68163031f, -0.77904329f, -0.92638722f, -0.49253451f, -0.11015934f, 0.49328977f, 1.25069491f, 1.61419932f, 1.51150480f, - 2.17925129f, 0.65744215f, -0.14102877f, -0.68226531f, -0.86240255f, -0.96233313f, -0.77240075f, -0.60150667f, -0.43620670f, -0.12974041f, 0.06940761f, 0.29313968f, 0.32005914f, 0.04484663f, 0.20342365f, 0.82031433f, - -2.73276927f, -1.95293295f, -1.25302447f, -1.26607638f, -1.03464322f, -0.41097672f, 0.11299908f, 0.61306244f, 1.35234054f, 1.98785456f, 1.65758988f, 0.94482039f, 0.67093436f, 0.60201696f, 0.38959545f, 0.31920903f, - 1.99599002f, 1.78113188f, 1.60094449f, 1.49585133f, 1.05949606f, 0.38027999f, -0.00956917f, -0.37696778f, -0.58734884f, -0.88374264f, -1.14734587f, -1.24114441f, -1.17843206f, -1.09199503f, -0.92371805f, -0.87342960f, - -1.37903570f, -0.79248227f, 0.13536234f, 0.47656459f, 0.43589978f, 0.88461367f, 1.02738581f, 0.55354663f, 0.25049941f, -0.28501314f, -0.80941419f, -0.81019030f, -0.45648923f, 0.11389766f, 0.39621982f, 0.25863532f, - 2.10361489f, 0.37593562f, -0.16944555f, -0.32212923f, -0.22241176f, -0.24351656f, -0.27375398f, 0.02762124f, 0.11073362f, 0.23273069f, 0.27063497f, 0.08607178f, -0.19792432f, -0.48410706f, -0.59195084f, -0.70210352f, - -3.28081022f, -2.84286219f, -2.41405615f, -2.18965898f, -1.85813828f, -1.04835079f, -0.44771380f, 0.59206456f, 1.50301948f, 2.07448941f, 2.16550955f, 1.89856464f, 1.75678779f, 1.60095964f, 1.36941840f, 1.12077632f, - 1.20650745f, 1.87107653f, 1.86883453f, 1.42456949f, 0.48789223f, -0.72412798f, -1.11112426f, -1.49029508f, -1.30798779f, -1.39394685f, -1.21186297f, -0.51923241f, 0.01995250f, 0.34176002f, 0.40195072f, 0.13603383f, - 1.27785134f, 0.88553037f, 0.16900733f, -0.27809430f, -1.01525323f, -1.49395836f, -1.43232130f, -1.19784251f, -0.74210861f, -0.08619940f, 0.47709237f, 0.55331864f, 0.84110624f, 0.88279667f, 0.58250791f, 0.57656718f, - 0.33221429f, 1.11386403f, 0.75316099f, -0.54031614f, -1.07863165f, -0.21932249f, 1.22065947f, 1.15034668f, 1.03141160f, -0.31201434f, -1.38480174f, -0.81360834f, -0.27523041f, 0.24071536f, -0.19254386f, -1.02590322f, - -1.49213877f, -2.62687029f, -1.76800978f, 0.37484393f, 2.24342021f, 1.70797214f, 0.00785579f, -0.16576749f, 0.40170467f, 1.53774796f, 0.29192482f, 0.32972463f, 0.96040034f, 0.07052406f, -0.75744205f, -1.11588939f, - 1.68310221f, 0.62723214f, -0.21848789f, -0.50907306f, -0.77679516f, -0.86027718f, -0.37120564f, 0.20445818f, 0.27312526f, -0.13982446f, -0.56141448f, -0.66669228f, 0.06397763f, 0.19621457f, 0.32877219f, 0.72688794f, - 0.71839263f, 0.21641507f, 0.34358239f, 1.05799089f, 1.05814284f, 0.52787967f, 0.14046002f, 0.11966559f, 0.07361240f, -0.17447064f, -0.37909417f, -0.61722985f, -0.71730019f, -0.79744166f, -0.77133987f, -0.79926472f, - -0.02890014f, 0.92802997f, 1.03744813f, 0.32870919f, 0.07886022f, 0.63362031f, 0.46497182f, 0.14157700f, -0.03057580f, -0.54785692f, -1.11970728f, -1.36023434f, -0.91731394f, 0.07493639f, 0.47210281f, -0.15566707f, - -0.69638941f, -0.91666102f, -1.56178072f, -1.95501706f, -1.82786692f, -1.74880889f, -1.34684465f, 0.11048340f, 1.37545972f, 1.36714659f, 1.44286472f, 1.29857548f, 1.10826459f, 1.56371080f, 1.18624590f, 0.60061806f, - -0.68066861f, 0.38195183f, 1.51822296f, 2.21510524f, 2.33189221f, 1.97513513f, 1.15635207f, 1.51498823f, 1.49065161f, -0.27868821f, -1.78208773f, -2.20070549f, -2.26038069f, -2.05737950f, -1.59696081f, -1.72742716f, - -2.17324712f, -1.42748120f, -0.47105336f, 0.06399853f, -0.10139724f, -0.33208523f, -0.36226578f, -0.45684329f, -0.45421750f, -0.02950979f, 0.57908509f, 0.82823657f, 0.84044612f, 0.96336259f, 1.18058199f, 1.35238916f, - 0.30637595f, -0.07750454f, -0.01603143f, -0.03845729f, -0.46768884f, -0.33028351f, 0.33893858f, 0.66006523f, 0.64603598f, 0.25681503f, -0.24604284f, -0.37133227f, -0.20588021f, -0.28072164f, -0.22555667f, 0.05126849f, - -1.81904207f, -1.97008939f, -1.38138723f, -0.56721565f, 0.08439254f, 0.50012417f, 0.41461731f, 0.70946239f, 0.65844196f, 0.50418711f, 0.67016347f, 0.85608609f, 0.63818532f, 0.38340644f, 0.22816114f, 0.09050718f, - 3.82551321f, 3.02994002f, 1.79732057f, 1.05862951f, 0.33021546f, 0.01969982f, -0.57482284f, -1.10367492f, -1.21202781f, -1.06293594f, -0.97966329f, -1.01767532f, -1.10340104f, -1.13918652f, -1.02503523f, -0.84289579f, - -2.06530906f, -1.02138773f, 0.19121847f, 0.64135688f, 0.47353945f, 0.29125589f, 0.17346435f, 0.09846354f, 0.14173379f, 0.44108119f, 0.42909595f, 0.13671490f, -0.09429711f, 0.06651142f, 0.02429001f, 0.07226851f, - 1.63249192f, 0.94436017f, 0.65530634f, 0.76476367f, 1.10302458f, 1.20701875f, 0.88073298f, 0.43640158f, -0.07220279f, -0.39214092f, -0.60759685f, -0.87296187f, -1.13810886f, -1.40490240f, -1.54422408f, -1.59196182f, - -2.96354446f, -2.66922503f, -2.35080143f, -1.84250497f, -1.24255764f, -0.53451683f, -0.22318900f, 0.15923121f, 0.44185767f, 0.90571587f, 1.20883041f, 1.21786822f, 1.54160670f, 2.22751201f, 2.21090650f, 1.91281110f, - -0.09062710f, 0.80687377f, 1.69510603f, 2.38364009f, 2.08626387f, 1.00304738f, 0.66997543f, 0.04541459f, -0.35848319f, -0.80600051f, -1.65487629f, -2.04562701f, -2.03869244f, -1.11898388f, 0.04427361f, -0.62130392f, - -0.99015493f, -0.47096904f, 0.39660329f, 1.29486538f, 1.58962509f, 0.33608325f, -0.41798602f, -0.54749259f, -0.00991716f, -0.02240745f, -0.93933104f, -0.69735917f, -0.17095973f, 0.19272004f, 0.29655039f, 0.16013060f, - -0.50032252f, -0.00936927f, 0.13895740f, 0.11955067f, -0.00882381f, -0.31634261f, -0.30280409f, -0.10222302f, -0.04951847f, 0.13870349f, 0.43344396f, 0.56559398f, 0.24092822f, -0.05903140f, -0.12616386f, -0.16257807f, - -4.66891396f, -4.62476618f, -2.72504562f, -0.11626174f, 1.38983931f, 1.37676145f, 0.15183709f, -0.07491020f, 0.54070200f, 1.84266982f, 0.65624201f, 0.70100510f, 1.81013255f, 1.75739872f, 0.97189375f, 1.01141647f, - 3.82513926f, 1.74864093f, 0.71663856f, -0.06702053f, -0.46144066f, -0.68679697f, -0.83513366f, -0.69088271f, -0.63484378f, -0.48492965f, -0.30596681f, -0.27767202f, -0.29901877f, -0.55135905f, -0.55561568f, -0.43973879f, - -1.83506374f, -1.72166910f, -0.66010462f, 1.71984506f, 2.40983158f, 1.81667012f, 1.44944523f, 1.31000271f, 0.86661928f, 0.58345030f, -0.05866711f, -0.37487717f, -0.74598532f, -1.38021702f, -1.58454113f, -1.79473786f, - 0.16939787f, 1.05222199f, 0.60925979f, -0.08245082f, -0.05127361f, -0.01958411f, -0.04649851f, 0.11008216f, 0.21213694f, -0.02520358f, -0.00574917f, -0.04591061f, -0.24174211f, -0.38605009f, -0.52417208f, -0.72446423f, - -0.07063893f, -1.74970518f, -1.79098807f, -1.50819293f, -1.06029380f, -1.44474701f, -1.24662095f, -1.20341521f, -1.18506899f, -0.88327503f, -0.47818767f, 0.53478172f, 1.99588317f, 2.01785324f, 2.86156101f, 5.21105441f, - 1.18577996f, 1.82923029f, 2.00218590f, 1.75897045f, 1.55666666f, 1.15213194f, 1.02264996f, 0.58845201f, 0.39345304f, -0.25590088f, -1.11168611f, -1.75581078f, -2.05745836f, -2.20440070f, -2.14031291f, -1.96395016f, - -0.49703383f, -0.62650520f, -0.98853522f, -1.16849765f, -1.02786508f, -0.51447634f, -0.02538523f, 0.08704333f, 0.03359763f, 0.17774887f, 0.30484412f, 0.32520735f, 0.62948522f, 1.14552041f, 1.22336987f, 0.92148234f, - -0.07188198f, 0.18500810f, -0.22096354f, -0.56851679f, -0.98832362f, -1.20304996f, -1.11943691f, -1.09383807f, -0.85446062f, -0.29360582f, 0.44439822f, 0.64306330f, 1.09971537f, 1.50142342f, 1.36382024f, 1.17664847f, - -1.21730935f, -1.48884440f, -1.78500620f, -1.57607634f, -0.82775565f, -0.09612994f, 0.49933981f, 1.06136160f, 1.31463011f, 1.46090638f, 1.14896512f, 0.64320117f, 0.39111587f, 0.36061229f, 0.18325675f, -0.07226660f, - 2.30575156f, 2.37005513f, 1.37776397f, 0.78509487f, 0.18022242f, -0.13093354f, 0.22126477f, -0.11444642f, -0.35716968f, -0.59492665f, -0.35765935f, -0.44655201f, -1.03213345f, -1.27074059f, -1.44000075f, -1.49558947f, - -1.00874079f, -1.64011865f, -1.86084729f, -1.06805908f, 0.07222945f, 1.36179475f, 1.87160360f, 1.76248472f, 1.52374330f, 1.04119855f, 0.73448166f, 0.13768018f, -0.49711929f, -0.73696841f, -0.89885406f, -0.79450886f -}; -const float ivas_sns_cdbk_tcx10_stage2[ 32 * 16 ] = { - 0.30627323f, 0.48836579f, -0.02716944f, -0.47680077f, -0.52992614f, -0.25467720f, -0.13298242f, -0.14929291f, -0.14808149f, 0.08665801f, 0.28830653f, 0.27526330f, 0.09942358f, -0.01755061f, 0.03315580f, 0.15903469f, - 0.40931263f, -0.04412117f, -0.08826419f, 0.38716891f, 0.51515595f, 0.42227845f, 0.34963425f, 0.26800736f, 0.03770000f, -0.19967080f, -0.31044249f, -0.32623294f, -0.38445978f, -0.38085950f, -0.38590829f, -0.26929836f, - -0.16037262f, -0.37557223f, -0.41481262f, -0.12384627f, 0.25702942f, 0.29593484f, 0.04534352f, -0.04349856f, -0.11439445f, -0.20184919f, 0.03250628f, 0.58473249f, 1.07468564f, 0.31789485f, -0.43837532f, -0.73540590f, - -0.72021067f, 0.08601834f, 0.36444345f, 0.07734969f, -0.03855524f, -0.02016363f, 0.22787880f, 0.23660595f, -0.06162934f, -0.60111840f, -0.53416841f, -0.01411490f, 0.31545914f, 0.35328934f, 0.27371155f, 0.05520477f, - 0.17033204f, -0.13395098f, -0.17486207f, -0.16431307f, -0.15028250f, -0.16217158f, 0.20788205f, 0.78892741f, 0.82887028f, 0.27828798f, -0.09961411f, -0.26525390f, -0.29531330f, -0.31862369f, -0.30357092f, -0.20634333f, - 0.66971623f, 0.62862982f, 0.51073654f, 0.36780819f, 0.09494981f, -0.26895298f, -0.43607248f, -0.52929484f, -0.50226353f, -0.28888748f, -0.08077826f, 0.07870787f, -0.04066089f, -0.15014043f, -0.07631337f, 0.02281584f, - -0.14637266f, -0.46934298f, -0.43556714f, -0.11250329f, 0.02177593f, -0.06273200f, -0.10608254f, -0.23883852f, -0.34273025f, -0.21064510f, 0.01000878f, 0.26290329f, 0.36940740f, 0.45606583f, 0.50057089f, 0.50408231f, - -0.63822919f, -0.37848043f, -0.12025765f, 0.46869706f, 0.60287599f, 0.40487467f, 0.32284423f, 0.21760285f, 0.02923608f, 0.00961581f, 0.09146575f, 0.01422525f, -0.19921025f, -0.27268562f, -0.30705403f, -0.24552069f, - 1.00438179f, 0.03452909f, -0.36528888f, -0.16282387f, -0.17507552f, -0.16366972f, 0.01988929f, 0.04208138f, -0.09195065f, -0.12550201f, -0.13827904f, -0.15519976f, -0.13718296f, -0.04187317f, 0.11795197f, 0.33801187f, - -0.29872646f, -0.05673935f, 0.22627715f, 0.35384240f, 0.40583411f, 0.05342130f, -0.33165017f, -0.58372192f, -0.59880799f, -0.13860904f, 0.35292935f, 0.42680564f, 0.12541820f, -0.05244271f, 0.02304693f, 0.09312233f, - -0.62056798f, -0.65569894f, -0.39193684f, -0.23470135f, -0.10487732f, -0.02415277f, 0.10485475f, 0.27475842f, 0.33639795f, 0.28659695f, 0.29816270f, 0.35486347f, 0.22178257f, 0.06294332f, 0.00371302f, 0.08786182f, - -0.24167361f, 0.39335919f, 0.45401345f, -0.01359878f, -0.02799250f, 0.03219280f, -0.03498926f, 0.13917253f, 0.56998817f, 0.30076805f, -0.02861530f, -0.08301223f, -0.23268793f, -0.25582563f, -0.40349390f, -0.56760551f, - -0.25453749f, 0.20141031f, 0.13622118f, 0.02192458f, 0.01884274f, 0.35426017f, 0.30533029f, -0.04383371f, -0.03213904f, 0.48723585f, 0.26916690f, -0.57914714f, -0.86274497f, -0.46431975f, 0.21456299f, 0.22776732f, - 0.10091242f, -0.00486621f, 0.15438553f, 0.58933636f, 0.58327809f, 0.15020643f, -0.13942120f, -0.30560120f, -0.39802935f, -0.42014770f, -0.43506227f, -0.49122908f, -0.24162334f, 0.07789107f, 0.33589368f, 0.44407700f, - -0.86901291f, -0.12649490f, 0.37769660f, 0.32335451f, -0.09778731f, -0.30169760f, -0.11330902f, 0.06975956f, 0.10852794f, 0.10187023f, 0.01908335f, -0.02063501f, -0.02583787f, 0.01976747f, 0.15814638f, 0.37656868f, - 0.04263499f, 0.02090495f, 0.31860242f, 0.23302977f, -0.33090591f, -0.80333458f, -0.73651770f, -0.34102413f, 0.01204330f, 0.27818705f, 0.45925162f, 0.49138398f, 0.30213637f, 0.14165342f, -0.01743260f, -0.07061291f, - -0.33546750f, 0.07559517f, -0.29917689f, -0.73625773f, -0.65250278f, -0.17791468f, 0.36283358f, 0.41870726f, 0.25167625f, 0.10475438f, 0.03036614f, -0.11264997f, 0.02694511f, 0.35023967f, 0.42385566f, 0.26899640f, - 0.35439950f, 0.67540976f, 0.38662754f, 0.00957348f, -0.04081569f, 0.08980026f, 0.24456400f, 0.16454453f, -0.17326799f, -0.44054817f, -0.46528410f, -0.40046956f, -0.28220380f, -0.18741583f, -0.03688613f, 0.10197206f, - 0.42543134f, 0.16124378f, -0.11664388f, -0.16052109f, -0.14380996f, -0.20548992f, -0.07681681f, -0.05550879f, -0.19682147f, -0.44926335f, -0.31008693f, 0.10843293f, 0.56978845f, 0.55547148f, 0.11319503f, -0.21860065f, - -0.29805544f, -0.51653600f, -0.50993841f, -0.23042275f, 0.24667415f, 0.49673729f, 0.44572321f, 0.45012593f, 0.15926189f, -0.25316153f, -0.34302757f, -0.25146569f, -0.04585493f, 0.07882198f, 0.19017230f, 0.38094576f, - 0.32844224f, 0.41193928f, 0.40958218f, 0.23076367f, -0.27298459f, -0.73724149f, -0.33139249f, 0.20850941f, 0.29246785f, 0.02387269f, -0.22298162f, -0.22401730f, -0.10602946f, -0.10948655f, -0.04914188f, 0.14769834f, - -0.17579666f, 0.35780877f, 0.71235588f, 0.55448086f, 0.37958752f, 0.25325181f, 0.00067976f, -0.17449727f, -0.19933258f, -0.18272217f, -0.13825657f, -0.13482936f, -0.26973501f, -0.36527057f, -0.38046021f, -0.23726392f, - 0.18763378f, -0.33806505f, -0.40345471f, -0.16420458f, -0.35258917f, -0.57440801f, -0.40444473f, 0.03937379f, 0.28301143f, 0.24202773f, 0.11450746f, -0.01201630f, 0.15584175f, 0.29186178f, 0.39454798f, 0.54037647f, - 0.22483690f, -0.44980090f, -0.04869487f, 0.59069175f, 0.53952189f, -0.08294351f, -0.50222392f, -0.24118691f, 0.23316504f, 0.15935219f, -0.04441873f, 0.04368785f, -0.01936622f, -0.19829407f, -0.17269697f, -0.03162974f, - 0.86145933f, 0.21872440f, 0.03989593f, 0.02383014f, -0.09253274f, -0.16857595f, -0.11671737f, 0.08021353f, 0.06125647f, 0.12344152f, 0.23383136f, 0.23023986f, 0.00554465f, -0.33666994f, -0.57850362f, -0.58543742f, - 0.51765053f, 0.14453794f, -0.21849231f, -0.46766148f, 0.28518641f, 0.98554209f, 0.04290847f, -0.60417524f, -0.40619174f, 0.07096948f, -0.07934046f, -0.11108689f, 0.01736604f, 0.02182622f, -0.13816306f, -0.06087569f, - 0.48940455f, -0.48846716f, -0.76449136f, -0.43167975f, -0.08214146f, 0.11409731f, 0.23323066f, 0.14717357f, 0.03539665f, 0.18939153f, 0.30742449f, 0.25985980f, 0.09542412f, -0.02333196f, -0.07732568f, -0.00396539f, - -0.11187535f, 0.22479868f, 0.00043228f, -0.32181417f, -0.15096473f, 0.43016822f, 0.70121781f, 0.35219596f, -0.12050155f, -0.23287073f, 0.15265180f, 0.19690580f, -0.06424055f, -0.21596133f, -0.38579166f, -0.45435087f, - -0.22289529f, -0.33733328f, 0.06840735f, 0.09280703f, 0.04636627f, 0.21910935f, -0.03558133f, 0.03650325f, 0.61258277f, 0.50575298f, -0.41287364f, -0.69151766f, -0.55346043f, 0.16231747f, 0.54407303f, -0.03425754f, - -0.01396139f, 0.41256481f, 0.28386076f, -0.13079544f, -0.35049882f, -0.37139357f, -0.26190236f, -0.28543916f, -0.36404168f, -0.41216213f, -0.30446824f, -0.16554805f, 0.07635435f, 0.40718475f, 0.72148357f, 0.75876291f, - -0.78143464f, 0.05520810f, 0.09851993f, -0.35088396f, -0.29183273f, 0.13535467f, 0.10630173f, -0.35151176f, -0.27502696f, 0.15923208f, 0.34325564f, 0.26263384f, 0.39924614f, 0.42088604f, 0.20935571f, -0.13930422f, - -0.20363163f, -0.21557857f, -0.16300691f, -0.04183005f, -0.11100316f, -0.05771045f, 0.03898740f, 0.01316220f, 0.17362802f, 0.74914331f, 0.94477958f, 0.44778038f, -0.09421183f, -0.32736334f, -0.50631884f, -0.64682642f -}; -const float ivas_sns_cdbk_tcx10_stage3[ 8 * 16 ] = { - 0.15213764f, -0.12778955f, 0.09362990f, -0.08343056f, -0.25379718f, 0.12518895f, 0.29943288f, -0.09857322f, -0.34816031f, -0.24349585f, -0.11266650f, -0.05996015f, 0.03254247f, 0.15532134f, 0.23410563f, 0.23551447f, - -0.16242282f, -0.11097776f, -0.31747514f, -0.25628076f, 0.13836003f, 0.29861681f, 0.10506779f, 0.11734717f, 0.26608658f, 0.05454060f, -0.14603348f, -0.19239843f, 0.04173306f, 0.20966631f, 0.07432020f, -0.12015035f, - -0.05086737f, 0.14763099f, -0.10027459f, -0.32093478f, -0.17515530f, -0.18641303f, -0.27141947f, -0.07787662f, 0.00378069f, -0.04285463f, 0.10140687f, 0.34974771f, 0.30832793f, 0.10107726f, 0.07691200f, 0.13691240f, - -0.19149570f, -0.03034820f, 0.22501633f, 0.07949802f, -0.27147765f, -0.19613243f, 0.27922429f, 0.35035416f, 0.10414276f, 0.00614821f, 0.06550601f, 0.11675054f, 0.03695278f, -0.13039057f, -0.22716902f, -0.21657951f, - 0.26536712f, -0.20814302f, -0.25065997f, 0.11971631f, 0.27275427f, 0.17786545f, -0.00254739f, -0.12770659f, -0.22797897f, 0.00768447f, 0.21340357f, 0.19482691f, 0.04586545f, -0.11847485f, -0.17809566f, -0.18387694f, - 0.25667429f, 0.24654641f, 0.10151031f, -0.02938848f, -0.14360442f, -0.13987667f, -0.20754252f, -0.19670735f, 0.17496815f, 0.41594389f, 0.13093074f, -0.20541061f, -0.16236246f, 0.04068170f, -0.03728146f, -0.24508149f, - -0.08722397f, 0.02295918f, 0.00051204f, 0.07408103f, 0.14389321f, 0.06786859f, 0.00359252f, 0.11717038f, 0.08740562f, 0.00119184f, -0.07592203f, -0.11362449f, -0.31422561f, -0.38910675f, -0.02291088f, 0.48433932f, - -0.18216919f, 0.06012195f, 0.24774113f, 0.41673922f, 0.28902704f, -0.14711768f, -0.20580810f, -0.08400793f, -0.06024452f, -0.19915854f, -0.17662518f, -0.08993148f, 0.01116638f, 0.13122555f, 0.08011919f, -0.09107791f -}; - -const float *const ivas_sns_cdbks_tcx10[SNS_MSVQ_NSTAGES_TCX10] = { ivas_sns_cdbk_tcx10_stage1, ivas_sns_cdbk_tcx10_stage2, ivas_sns_cdbk_tcx10_stage3}; - -const float ivas_sns_means_tcx10[M] = { - 0.9510f , 1.1892f , 0.8969f , 0.3467f, - 0.1347f , 0.1074f , 0.0504f , -0.0790f, - -0.1305f , -0.3713f , -0.5611f , -0.5757f, - -0.4801f , -0.4108f , -0.4564f , -0.6112f -}; -const int16_t ivas_sns_cdbks_side_tcx20_levels[SNS_MSVQ_NSTAGES_SIDE] = { 32, 32 }; -const int16_t ivas_sns_cdbks_side_tcx20_bits[SNS_MSVQ_NSTAGES_SIDE] = { 5, 5 }; -const int16_t ivas_sns_cdbks_side_tcx10_levels[SNS_MSVQ_NSTAGES_SIDE] = { 32, 8 }; -const int16_t ivas_sns_cdbks_side_tcx10_bits[SNS_MSVQ_NSTAGES_SIDE] = { 5, 3 }; - -const float ivas_sns_means_side_tcx20[M] = { - -0.0181f , 0.0044f , 0.0133f , 0.0096f, - 0.0073f , 0.0038f , 0.0058f , 0.0015f, - -0.0046f , -0.0096f , -0.0099f , -0.0173f, - -0.0075f , 0.0049f , 0.0023f , 0.0141f -}; - -const float ivas_sns_cdbks_side_tcx20_stage1[ 32 * 16 ] = { - -0.09561560f, -0.07036320f, 0.02878750f, 0.03511974f, 0.17132389f, -0.03138941f, -0.33178799f, -0.21216198f, -0.04445341f, 0.02221417f, 0.02283919f, 0.03233147f, 0.08941267f, 0.12190493f, 0.12476806f, 0.13706984f, - 0.00109929f, 0.08875231f, 0.22238215f, 0.21457590f, 0.10015343f, 0.04638508f, 0.03393346f, -0.00874452f, -0.04376851f, -0.07742100f, -0.07534945f, -0.10337673f, -0.10407952f, -0.11112585f, -0.09133646f, -0.09207950f, - -0.24818594f, 0.26921203f, 0.44107852f, 0.17248048f, 0.64417785f, 0.17680036f, 0.13990282f, -0.00956079f, 0.26766161f, -0.03617849f, -0.51006953f, -0.14559280f, 0.04585566f, -0.32296828f, -0.43440915f, -0.45020472f, - -0.02603883f, -0.10893371f, -0.10500311f, -0.11573136f, -0.10145701f, 0.08950274f, 0.26393655f, 0.16421642f, 0.06653788f, 0.02055681f, 0.03165200f, -0.00660730f, -0.02920382f, -0.04413712f, -0.04586630f, -0.05342379f, - 0.42792206f, 0.05873236f, -0.03519993f, -0.02404930f, -0.02129021f, -0.02228539f, -0.05794333f, -0.05329147f, -0.02713142f, -0.02536622f, -0.01781476f, -0.04129741f, -0.03786846f, -0.04699464f, -0.04049980f, -0.03562223f, - 0.02055988f, 0.02639971f, 0.00689886f, 0.00418128f, -0.01634280f, 0.00921734f, 0.00364626f, -0.03176210f, -0.04382792f, -0.01247039f, 0.02183370f, -0.00002241f, -0.00402301f, -0.00566646f, 0.00978385f, 0.01159419f, - 0.19157117f, 0.21950742f, 0.18377101f, -0.02875442f, -0.28243126f, -0.54171973f, -0.31264637f, -0.03676636f, 0.00528891f, -0.04001921f, 0.08505054f, 0.06946939f, 0.13428842f, 0.15810925f, 0.11903950f, 0.07624180f, - -0.30190937f, -0.29575446f, -0.26060885f, -0.18754051f, -0.14798754f, -0.10966049f, -0.13245975f, -0.11017279f, -0.08153340f, -0.06447313f, 0.04034392f, 0.17641778f, 0.25731939f, 0.31027339f, 0.40673221f, 0.50101364f, - -0.47842978f, -0.03818905f, 0.07056377f, 0.03300345f, 0.02730699f, 0.05007915f, 0.02893237f, 0.02226785f, 0.04222222f, 0.04128904f, 0.03830734f, 0.01743857f, 0.03607951f, 0.02582752f, 0.04198512f, 0.04131589f, - -0.02242885f, 0.01802990f, -0.00361209f, 0.02714255f, 0.04843318f, 0.04306928f, 0.02675985f, 0.07964815f, 0.10019006f, 0.05262710f, 0.00113825f, -0.04747375f, -0.04988074f, -0.05204562f, -0.09989329f, -0.12170389f, - 0.28967652f, 0.36512749f, 0.38343313f, 0.37459919f, 0.29419461f, 0.21272806f, 0.14963422f, 0.11987446f, -0.00354946f, -0.11817788f, -0.21991893f, -0.37389500f, -0.43897693f, -0.47312318f, -0.36222971f, -0.19939667f, - -0.29847367f, -0.28024953f, -0.23616334f, -0.19456539f, -0.16497910f, -0.12215408f, -0.05213406f, 0.03088777f, 0.11427925f, 0.17777695f, 0.21315635f, 0.18382103f, 0.20758797f, 0.19478448f, 0.14014366f, 0.08628162f, - -0.01005369f, -0.03186180f, -0.07995901f, -0.10893772f, -0.11257191f, -0.10933952f, -0.06260446f, 0.01592879f, 0.06618622f, 0.08792663f, 0.09779631f, 0.06871009f, 0.06158038f, 0.04699408f, 0.04045205f, 0.02975352f, - -0.12591171f, -0.31330699f, -0.09207505f, 0.04353844f, 0.05691547f, 0.02830292f, 0.05190188f, 0.05663181f, 0.05579546f, 0.05136184f, 0.06373287f, 0.03243363f, 0.03631576f, 0.02886726f, 0.02108611f, 0.00441022f, - 0.51424359f, 0.44825357f, 0.27826391f, 0.14692419f, 0.04486213f, 0.01374316f, -0.05577450f, -0.06790050f, -0.10394906f, -0.14111342f, -0.16141165f, -0.18795338f, -0.17689540f, -0.18030471f, -0.19451666f, -0.17647134f, - 0.01250082f, -0.03513855f, -0.10558904f, -0.13589106f, -0.16642959f, -0.12403555f, -0.11639493f, -0.13504470f, -0.12448111f, -0.08902796f, 0.02742439f, 0.14597597f, 0.22586358f, 0.24372767f, 0.18517594f, 0.19136417f, - 0.00690369f, -0.06536790f, -0.04560492f, 0.17183296f, 0.06108150f, -0.14297504f, -0.10743566f, 0.00028842f, -0.00000737f, 0.01948888f, 0.04144583f, 0.01034213f, 0.01186359f, 0.01904016f, 0.01513936f, 0.00396440f, - -0.02696488f, -0.05930555f, -0.05635944f, 0.04417762f, 0.20483421f, 0.24818872f, 0.08337011f, -0.03555721f, -0.04496794f, -0.05268211f, -0.05177582f, -0.06105043f, -0.04493356f, -0.04903822f, -0.04844764f, -0.04948792f, - 0.09934599f, 0.20097988f, 0.02959104f, 0.10059414f, 0.36489123f, 0.42345991f, 0.31306867f, 0.19189664f, 0.02025838f, -0.16920767f, -0.19221388f, -0.36590851f, -0.24124038f, -0.21069901f, -0.24782116f, -0.31699542f, - -0.38302159f, -0.20867958f, -0.06199247f, 0.00929974f, -0.08763027f, 0.01230753f, 0.12845035f, 0.27194101f, 0.35480151f, 0.36726532f, 0.20142240f, -0.03957218f, -0.10891503f, -0.16235951f, -0.15207841f, -0.14123875f, - 0.29448433f, 0.27467021f, 0.21093907f, 0.02636253f, -0.10971996f, -0.06520899f, -0.09114815f, -0.19988466f, -0.25173695f, -0.21777001f, -0.19036007f, -0.10825290f, 0.00468462f, 0.07695453f, 0.14592570f, 0.20006079f, - -0.09613522f, -0.07305197f, 0.23140183f, -0.01276782f, -0.05046178f, -0.03690868f, 0.01854782f, -0.00516658f, -0.01794740f, 0.01127293f, 0.02845775f, 0.00246563f, -0.00285605f, -0.00274282f, 0.00447526f, 0.00141708f, - 0.09853152f, 0.23398475f, 0.15560679f, 0.01939291f, -0.05095939f, -0.10951335f, -0.08366621f, -0.03852663f, -0.00171258f, -0.01619636f, -0.02703945f, -0.04625883f, -0.03573599f, -0.03656223f, -0.03486191f, -0.02648302f, - -0.05407938f, -0.18042914f, -0.31075117f, -0.36223570f, -0.35545274f, -0.26114190f, -0.21540173f, -0.18652814f, -0.10764184f, -0.04326102f, 0.10627938f, 0.32432791f, 0.40043785f, 0.56193174f, 0.40395999f, 0.27998606f, - -0.22375901f, -0.11453094f, -0.06437672f, 0.02966050f, -0.06882505f, -0.02229970f, 0.00519106f, 0.04139490f, -0.21099529f, -0.00965469f, 0.01906172f, 0.06535794f, 0.27085374f, 0.36298568f, 0.13009871f, -0.21016295f, - 0.18023915f, 0.15936182f, 0.13064987f, 0.09848966f, 0.08230524f, 0.11068418f, 0.11168088f, 0.11505046f, 0.13567778f, 0.12259236f, 0.03115883f, -0.14115321f, -0.20420262f, -0.27855554f, -0.34034745f, -0.31363132f, - -0.12817652f, 0.06412346f, 0.23407500f, 0.37946648f, 0.31127015f, 0.27044470f, 0.18591463f, 0.13643852f, 0.07403884f, -0.00928348f, -0.10609226f, -0.26765738f, -0.35056732f, -0.38530570f, -0.26185421f, -0.14683496f, - -0.63004591f, -0.58451443f, -0.16857245f, -0.08058005f, -0.09034904f, 0.00601978f, 0.10036174f, 0.10417477f, 0.14447621f, 0.13945086f, 0.18409447f, 0.20139949f, 0.10118410f, 0.12033491f, 0.20454736f, 0.24801829f, - 0.09650912f, 0.15979369f, -0.02778062f, -0.21860304f, -0.09723043f, 0.03923136f, 0.06141602f, 0.00600025f, -0.03251321f, -0.01956117f, -0.01004770f, -0.01435564f, 0.01114831f, 0.01113413f, 0.01304939f, 0.02180959f, - -0.00555466f, -0.14717213f, -0.37968771f, -0.12250216f, 0.03497204f, 0.13708345f, 0.03564652f, 0.00785509f, 0.04438533f, 0.06495152f, 0.07142555f, 0.05800545f, 0.06370878f, 0.05930816f, 0.05015268f, 0.02742217f, - 0.24931986f, 0.21084678f, 0.15421842f, 0.14679305f, 0.11899038f, 0.10112391f, 0.08120544f, 0.01848917f, -0.03021656f, -0.11872087f, -0.17582510f, -0.27756371f, -0.26300284f, -0.17730239f, -0.07164775f, 0.03329224f, - -0.17764482f, -0.15058551f, -0.12627503f, -0.06547272f, -0.05935809f, -0.01277874f, 0.01723090f, -0.00829920f, -0.02788840f, 0.01142219f, 0.05531784f, 0.04254613f, 0.04730144f, 0.07050022f, 0.15526930f, 0.22871460f -}; - -const float ivas_sns_cdbks_side_tcx20_stage2[ 32 * 16 ] = { - -0.01387178f, 0.00066194f, 0.01705500f, 0.00585076f, 0.05625865f, -0.08189174f, -0.29272907f, 0.00394582f, 0.14068978f, 0.03888049f, 0.01046905f, 0.03828706f, 0.04214951f, 0.02083198f, 0.00583650f, 0.00757601f, - -0.07101791f, -0.10250166f, 0.03818920f, 0.09162373f, 0.11895681f, 0.13465195f, 0.05088923f, -0.11144198f, -0.13846971f, -0.20720284f, -0.25737659f, -0.15071919f, 0.03249921f, 0.08124332f, 0.17587328f, 0.31480317f, - 0.07163217f, 0.02904662f, 0.01959293f, 0.00805967f, 0.02343380f, 0.02069451f, 0.03232257f, 0.02206815f, 0.03462995f, 0.01790113f, -0.03778174f, -0.14048245f, -0.21681559f, -0.11035045f, 0.05755451f, 0.16849432f, - -0.10816723f, -0.02739052f, -0.08241511f, -0.08220118f, -0.07911491f, 0.04976754f, 0.10255540f, 0.23875558f, 0.25687913f, 0.03165525f, -0.15819986f, -0.14652796f, -0.00803674f, -0.00055281f, -0.01439374f, 0.02738701f, - -0.02270156f, 0.02799492f, 0.14119353f, -0.06753253f, -0.07348415f, 0.16270911f, -0.00726861f, -0.06576199f, -0.02852827f, -0.01072544f, -0.02385080f, 0.01259492f, -0.00575096f, -0.00670975f, -0.01412345f, -0.01805497f, - -0.09730804f, -0.09207854f, -0.06155676f, -0.01193574f, 0.00669004f, 0.04165295f, 0.00840306f, -0.01763756f, -0.08511468f, -0.12564582f, -0.06302424f, 0.13694410f, 0.25188182f, 0.15335399f, 0.00198570f, -0.04661036f, - -0.20229607f, 0.27055253f, 0.05937269f, 0.00423687f, 0.02212468f, -0.00979552f, -0.02654450f, -0.02737173f, -0.03263414f, -0.01695365f, -0.02587673f, -0.00157241f, -0.00766337f, -0.00946241f, 0.00474761f, -0.00086382f, - 0.06446543f, -0.26714355f, 0.12269745f, 0.02565502f, -0.00628892f, 0.00430942f, 0.00862473f, -0.00170779f, 0.00617105f, -0.00718104f, -0.01871731f, 0.01193483f, 0.00860795f, 0.00997801f, 0.02026700f, 0.01832765f, - -0.00061741f, -0.03771131f, -0.03643531f, -0.01560727f, 0.00567664f, -0.00566226f, -0.00287572f, 0.03281006f, 0.04750282f, 0.01895354f, -0.01051254f, 0.01765380f, 0.01259038f, 0.00436097f, -0.01332776f, -0.01679868f, - 0.06930783f, 0.05302917f, 0.06102093f, 0.13367091f, 0.13415662f, 0.00542245f, -0.09926086f, -0.18333294f, -0.21849319f, -0.08349384f, 0.02026711f, 0.05881583f, 0.01345789f, 0.01158885f, 0.01962784f, 0.00421544f, - 0.00361302f, -0.05045316f, -0.00509374f, 0.19082766f, -0.18804365f, -0.05470887f, 0.00052718f, -0.02162397f, -0.00194290f, 0.00166374f, 0.00419055f, 0.02490528f, 0.02211515f, 0.02768455f, 0.02704636f, 0.01929285f, - 0.02476472f, -0.00405085f, -0.02659682f, -0.08596413f, -0.06315428f, -0.06855039f, -0.07500519f, -0.05011866f, -0.06108486f, -0.00618761f, 0.05634272f, 0.08835189f, 0.05894742f, 0.06729406f, 0.07762828f, 0.06738369f, - 0.13702164f, 0.08497052f, 0.07105828f, 0.04681336f, 0.02464482f, 0.00482884f, -0.01068152f, -0.00650854f, 0.01424842f, -0.00735400f, -0.04158832f, -0.02704081f, -0.04141575f, -0.06089035f, -0.09289456f, -0.09521199f, - -0.16780678f, 0.06667456f, 0.18201515f, 0.07399154f, -0.01999438f, 0.05535422f, 0.03900328f, -0.12016656f, -0.10793461f, 0.12328733f, 0.37944090f, 0.03265145f, -0.16138072f, -0.15224770f, -0.10548425f, -0.11740339f, - -0.01321210f, -0.01125461f, -0.03726540f, 0.00275729f, -0.04632781f, -0.24449670f, 0.09996640f, 0.11060024f, 0.00843480f, 0.01020953f, 0.01323100f, 0.03866782f, 0.01652133f, 0.01477176f, 0.01931947f, 0.01807687f, - 0.04427139f, 0.07762448f, -0.03500615f, -0.18353333f, 0.15726631f, 0.06121580f, -0.02944487f, -0.01882019f, -0.02386520f, 0.00077271f, -0.01038885f, 0.00869168f, -0.00564164f, -0.00937383f, -0.01500538f, -0.01876296f, - 0.13690793f, 0.01111401f, -0.03351651f, -0.01725554f, -0.07761571f, -0.12250939f, -0.07631311f, -0.01738486f, 0.14254332f, 0.21322328f, 0.14586930f, 0.03233900f, -0.08363281f, -0.12036013f, -0.07612890f, -0.05727984f, - 0.02949784f, -0.12225020f, -0.24763790f, 0.09504104f, 0.18885156f, 0.02619185f, 0.01292378f, 0.03000215f, 0.00909582f, -0.00936785f, -0.02571287f, 0.00889712f, -0.00234566f, -0.00169068f, 0.00871879f, -0.00021486f, - -0.03852054f, -0.03889437f, -0.08884280f, -0.06896184f, 0.02214326f, 0.10225505f, 0.12832898f, 0.08401269f, 0.06576567f, 0.08182152f, 0.07603111f, 0.04006712f, -0.04791395f, -0.09454805f, -0.10354215f, -0.11920167f, - 0.00938218f, 0.04681937f, 0.08173506f, 0.03766262f, 0.00645705f, -0.03830769f, -0.01180921f, 0.28211251f, 0.02788724f, -0.25197511f, -0.12812732f, 0.01575526f, 0.01158131f, -0.01435589f, -0.04416799f, -0.03064940f, - 0.06374854f, 0.12417689f, 0.09544838f, -0.13379816f, -0.26304159f, -0.06323982f, 0.03308697f, 0.06602140f, 0.04869582f, 0.02626429f, 0.00579212f, 0.01966626f, -0.00288156f, -0.00594553f, -0.00083407f, -0.01315989f, - -0.01689007f, -0.05224654f, -0.05732359f, 0.00797541f, -0.01178359f, -0.06878838f, -0.08592686f, -0.01631491f, -0.01215461f, 0.04690048f, 0.18175850f, 0.26923595f, 0.13470179f, -0.02451530f, -0.12744548f, -0.16718270f, - -0.02187075f, -0.05395855f, -0.02263713f, -0.00045869f, 0.07200871f, 0.08343703f, 0.05673476f, -0.01486174f, 0.02824052f, 0.09407959f, 0.06117651f, -0.48782246f, -0.01849447f, 0.15501071f, 0.05869060f, 0.01072538f, - 0.38479396f, -0.04937867f, -0.07935772f, -0.02506650f, -0.02316760f, -0.02067798f, 0.02695150f, -0.00054291f, -0.05256493f, -0.03399701f, -0.04629317f, -0.01085654f, -0.01817534f, -0.02213798f, -0.01605045f, -0.01347864f, - -0.23847427f, -0.06501920f, -0.01803515f, -0.00348509f, 0.04039109f, 0.01940591f, 0.01835329f, 0.03075053f, 0.03001602f, 0.02853897f, 0.01016726f, 0.03707260f, 0.02160199f, 0.03493100f, 0.03506401f, 0.01872098f, - 0.03862266f, 0.02890076f, 0.02592629f, 0.04317070f, 0.03495444f, -0.02192080f, -0.03469867f, -0.01962511f, -0.02362473f, -0.09521267f, -0.13881717f, -0.03271523f, 0.01372571f, 0.05875682f, 0.06459397f, 0.05796305f, - -0.01487374f, 0.01485744f, 0.01264233f, 0.04546350f, 0.00733058f, 0.08289797f, 0.17793293f, 0.03071348f, -0.11739129f, -0.07170388f, -0.04800450f, -0.00719781f, -0.01613242f, -0.02445791f, -0.03329781f, -0.03877884f, - 0.06919396f, -0.04913878f, -0.23414589f, -0.32278902f, -0.15262688f, -0.02830432f, 0.05881428f, 0.05602689f, 0.08630162f, 0.08206753f, 0.05235369f, 0.05459854f, 0.02224523f, 0.07894449f, 0.13055514f, 0.09590365f, - -0.13456165f, -0.02675728f, 0.10718846f, 0.16038985f, 0.13314470f, 0.04370885f, 0.00879630f, 0.02004215f, 0.04004457f, 0.01767300f, -0.03006764f, -0.02489721f, -0.06793547f, -0.08666415f, -0.07647774f, -0.08362676f, - -0.01963376f, -0.05985601f, -0.06123515f, 0.00802984f, 0.03197310f, 0.08198580f, -0.04518129f, -0.25550460f, -0.02763673f, 0.10534295f, 0.06276998f, 0.04687612f, 0.02909544f, 0.03184387f, 0.04253063f, 0.02859974f, - -0.05005194f, 0.08455623f, 0.27160784f, 0.05333258f, -0.06395559f, -0.12989814f, -0.07303311f, -0.05166257f, -0.03661287f, -0.00149673f, -0.00090933f, 0.02163393f, 0.00899793f, -0.00065646f, -0.01328460f, -0.01856715f, - 0.08465235f, 0.18910437f, -0.17964239f, -0.01596332f, -0.01786381f, -0.02173723f, 0.00655794f, -0.00747303f, -0.01909382f, -0.01073786f, -0.01461080f, 0.01419150f, 0.00349640f, -0.00567498f, -0.00358136f, -0.00162392f -}; - -const float *const ivas_sns_cdbks_side_tcx20[SNS_MSVQ_NSTAGES_SIDE] = { ivas_sns_cdbks_side_tcx20_stage1, ivas_sns_cdbks_side_tcx20_stage2 }; - -const float ivas_sns_means_side_tcx10[M] = { - -0.0085f , 0.0070f , 0.0074f , 0.0045f, - -0.0038f , 0.0071f , 0.0040f , -0.0068f, - -0.0104f , -0.0095f , -0.0259f , -0.0163f, - 0.0127f , 0.0087f , 0.0036f , 0.0262f -}; - -const float ivas_sns_cdbks_side_tcx10_stage1[ 32 * 16 ] = { - -0.23085418f, -0.21005449f, -0.18570241f, -0.13606880f, -0.11948469f, -0.10308038f, -0.11104958f, -0.15882089f, -0.13896854f, -0.06621316f, 0.05217852f, 0.11795393f, 0.15762859f, 0.26837024f, 0.37542593f, 0.48873907f, - 0.13745600f, 0.20131847f, 0.22182278f, 0.29526068f, 0.24656821f, 0.13757111f, 0.07460669f, 0.03134436f, -0.06561883f, -0.17480962f, -0.24070771f, -0.31627147f, -0.28865063f, -0.14849001f, -0.03399112f, -0.07740884f, - -0.13299250f, -0.14002491f, -0.11936499f, -0.04179630f, -0.03438902f, 0.04431344f, 0.06951552f, 0.01403797f, 0.05531963f, -0.01394528f, -0.09745552f, 0.00448586f, 0.26823524f, 0.23321159f, 0.06675539f, -0.17590634f, - 0.06191756f, 0.11582434f, 0.13192343f, 0.09527126f, 0.08193836f, 0.01139745f, 0.03044540f, 0.11065563f, 0.07578016f, -0.02083963f, -0.07297648f, -0.08340844f, -0.07282079f, -0.12840160f, -0.18605485f, -0.15065167f, - -0.03483375f, -0.04038755f, -0.07410056f, -0.06961358f, -0.04495163f, -0.12359739f, -0.20954724f, -0.19583867f, -0.14529606f, 0.00841374f, 0.12968518f, 0.22831580f, 0.23147392f, 0.13653895f, 0.09511995f, 0.10861877f, - 0.06658553f, 0.21860187f, 0.09436141f, -0.09071645f, -0.07082980f, 0.04518200f, 0.04859027f, -0.03547180f, -0.06006165f, -0.02756024f, 0.00158143f, -0.01511772f, -0.04477551f, -0.04937419f, -0.04159366f, -0.03940128f, - 0.02864506f, -0.04039106f, -0.15284948f, -0.42538299f, -0.19236357f, 0.03104685f, 0.02253710f, 0.02311004f, 0.04867318f, 0.06745871f, 0.09338212f, 0.09710035f, 0.07856015f, 0.09301454f, 0.11632315f, 0.11113598f, - 0.14528623f, 0.29868967f, 0.46429789f, 0.54323288f, 0.40204138f, 0.26355278f, 0.17207026f, 0.09889195f, -0.00279626f, -0.16206412f, -0.29083020f, -0.40501466f, -0.54537297f, -0.46768767f, -0.27766915f, -0.23662804f, - -0.38143153f, -0.38286102f, -0.37711911f, -0.29609917f, -0.25719669f, -0.20628984f, -0.15545466f, -0.08387721f, -0.03028209f, 0.14307072f, 0.32718172f, 0.40216059f, 0.39369890f, 0.30234268f, 0.29650354f, 0.30565312f, - 0.35958422f, 0.51604595f, 0.41116626f, 0.13914238f, -0.03378266f, -0.13855653f, -0.18788816f, -0.17389274f, -0.14739128f, -0.16521614f, -0.14451729f, -0.13567903f, -0.09514774f, -0.07488226f, -0.06811874f, -0.06086662f, - -0.66004345f, -0.31718869f, -0.22177390f, -0.12449418f, -0.09939825f, 0.07331022f, 0.21408044f, 0.21558931f, 0.11208625f, 0.04257974f, -0.01807639f, 0.09442548f, 0.06053141f, 0.06888331f, 0.20357028f, 0.35591847f, - -0.16304924f, -0.12420037f, -0.04222860f, 0.05588216f, 0.18467874f, 0.32957705f, 0.39156897f, 0.27848510f, 0.13897139f, -0.02741662f, -0.14580317f, -0.19651482f, -0.22072919f, -0.18213237f, -0.12846721f, -0.14862176f, - -0.17887269f, -0.40659902f, -0.02516902f, 0.09601495f, 0.06138763f, 0.02130781f, 0.05102018f, 0.04939750f, 0.05199909f, 0.05639114f, 0.06766195f, 0.07106289f, 0.04938017f, 0.02276475f, 0.00986626f, 0.00238653f, - 0.35668951f, 0.22742896f, -0.06232152f, -0.18667516f, -0.28394315f, -0.31893226f, -0.28501785f, -0.19154472f, -0.14625471f, -0.07293625f, 0.05620192f, 0.15269426f, 0.20840665f, 0.19892856f, 0.16095072f, 0.18632539f, - -0.04935166f, -0.11272268f, 0.08233717f, 0.29988006f, 0.19331526f, 0.14054174f, 0.08680898f, -0.01410902f, -0.04313985f, -0.03494681f, -0.04540697f, -0.07243925f, -0.09250963f, -0.09472804f, -0.10148439f, -0.14204503f, - 0.18485137f, 0.25341568f, 0.21009944f, 0.20568550f, 0.20518381f, 0.27019582f, 0.21216885f, 0.00546777f, -0.00044021f, -0.10735443f, -0.20735090f, -0.14224940f, -0.09351389f, -0.09761419f, -0.36078632f, -0.53775866f, - -0.37281135f, -0.49261999f, -0.36727842f, -0.16577288f, -0.02238290f, 0.00199674f, -0.01679564f, 0.04714198f, 0.10589472f, 0.16394573f, 0.18921056f, 0.20782063f, 0.19861654f, 0.19447370f, 0.17625681f, 0.15230414f, - 0.06686853f, 0.05611921f, 0.03365910f, 0.02756852f, 0.08295478f, 0.06008045f, -0.03273553f, -0.04364718f, -0.01449926f, -0.16865975f, -0.29690154f, -0.15022460f, -0.01812698f, 0.04654261f, 0.11587511f, 0.23512676f, - 0.05629958f, -0.04922929f, -0.24893641f, -0.04282766f, 0.05664299f, 0.06157661f, 0.05406340f, 0.01868661f, -0.00352496f, -0.00155314f, 0.04576544f, 0.04384907f, 0.01829060f, 0.01451148f, 0.01064548f, -0.03425997f, - 0.00489548f, -0.00560306f, 0.00615573f, -0.00441324f, 0.02514502f, 0.02634783f, 0.01098806f, 0.01133668f, 0.06739798f, 0.14368795f, 0.11283267f, 0.01118776f, -0.08555990f, -0.10393666f, -0.11315265f, -0.10730981f, - -0.15112519f, -0.11783557f, -0.13754019f, -0.07632290f, -0.06121828f, -0.06360113f, -0.05018035f, -0.00549590f, 0.05908192f, 0.04630727f, 0.02538631f, -0.00811102f, -0.02567731f, 0.08327373f, 0.21071206f, 0.27234661f, - 0.56834545f, 0.15133540f, -0.01992277f, -0.04770211f, -0.05432411f, -0.02191499f, -0.02550971f, -0.03144176f, -0.02317891f, -0.02811835f, -0.04327235f, -0.06018613f, -0.07647819f, -0.07349573f, -0.08821391f, -0.12592196f, - -0.03137272f, -0.03974785f, -0.03770784f, -0.05600026f, -0.03191645f, -0.04815164f, -0.04304812f, 0.02455638f, 0.06207261f, 0.02331568f, -0.01876696f, -0.04473163f, -0.02498340f, 0.06425271f, 0.11960865f, 0.08262092f, - 0.45973777f, 0.45999547f, 0.38173824f, 0.22785755f, 0.16821465f, 0.17382620f, 0.20517627f, 0.04061839f, -0.12685907f, -0.26643193f, -0.37356030f, -0.36765140f, -0.32336919f, -0.29335060f, -0.29318189f, -0.07275984f, - -0.07969188f, -0.23669686f, -0.42690692f, -0.49932686f, -0.40006183f, -0.28450852f, -0.22942850f, -0.12475617f, -0.03421007f, 0.12993786f, 0.27530393f, 0.32731838f, 0.50859567f, 0.47553443f, 0.32383390f, 0.27506335f, - 0.34046042f, 0.28909102f, 0.17226731f, 0.06244214f, 0.10377957f, 0.13146006f, 0.03081777f, -0.02599206f, -0.11020633f, -0.20031818f, -0.27040991f, -0.19266314f, -0.09502591f, -0.17705982f, -0.16383079f, 0.10518781f, - -0.43345226f, 0.01054419f, 0.06653837f, 0.02899912f, 0.04789640f, 0.03995846f, 0.02631173f, 0.04744618f, 0.05142942f, 0.03249742f, 0.03044055f, 0.03518159f, 0.01592359f, 0.00998224f, -0.00417209f, -0.00552518f, - -0.35779590f, -0.24084024f, -0.08920896f, -0.01964746f, -0.04518980f, 0.07193759f, 0.22722040f, 0.28999718f, 0.39417664f, 0.30171530f, 0.12526317f, 0.00759665f, -0.11081727f, -0.17325866f, -0.19301481f, -0.18813416f, - -0.16184582f, -0.19051919f, -0.19758934f, -0.16274525f, -0.19869541f, -0.22576659f, -0.13506612f, 0.01672518f, 0.13044875f, 0.26035967f, 0.27598891f, 0.22195891f, 0.13262193f, 0.13096192f, 0.10021772f, 0.00294471f, - 0.07825952f, 0.06525092f, 0.17527642f, 0.02096373f, -0.24373383f, -0.29324959f, -0.11558339f, -0.03040273f, 0.01406029f, 0.04150557f, 0.06984124f, 0.07372710f, 0.06551062f, 0.06332513f, 0.02509070f, -0.00984142f, - 0.08701726f, 0.12843394f, 0.16700094f, 0.15034452f, 0.12947411f, -0.01656238f, -0.15483649f, -0.18970569f, -0.18557831f, -0.09352705f, -0.01998975f, -0.00988876f, 0.00753489f, 0.01530672f, 0.00965047f, -0.02467425f, - 0.26197082f, 0.21849905f, 0.21673972f, 0.16654799f, 0.18547759f, 0.16177425f, 0.16111117f, 0.20927596f, 0.18073438f, 0.03535012f, -0.14032550f, -0.22486416f, -0.33259461f, -0.40957544f, -0.38613800f, -0.30398287f -}; - -const float ivas_sns_cdbks_side_tcx10_stage2[ 8 * 16 ] = { - -0.13993218f, -0.02453874f, 0.12672628f, 0.02785695f, 0.06681568f, 0.12811808f, 0.07492973f, -0.01977524f, -0.05822869f, -0.07547464f, -0.06553072f, -0.05473233f, -0.04357434f, -0.00634272f, 0.03406826f, 0.02961442f, - -0.06711216f, -0.11444162f, -0.09789788f, -0.09123304f, -0.12190348f, -0.00995424f, 0.10989921f, 0.11555575f, 0.06002452f, 0.03801973f, 0.02047622f, 0.01721280f, 0.02414692f, 0.02829613f, 0.03827912f, 0.05063187f, - 0.05523005f, 0.03052467f, 0.03910551f, 0.05802321f, 0.02158461f, 0.03249705f, 0.04015871f, -0.00878163f, -0.05597684f, -0.02391125f, 0.03722223f, 0.06349026f, 0.02718346f, -0.07380323f, -0.12743287f, -0.11511406f, - 0.11202279f, 0.20074913f, 0.04546646f, -0.10844616f, -0.14193153f, -0.08529745f, -0.03252409f, 0.03394947f, 0.04414551f, 0.00658101f, -0.01249852f, -0.01845361f, -0.01335408f, -0.01042434f, -0.00769413f, -0.01229041f, - -0.04167890f, -0.07371348f, -0.14826543f, 0.02126701f, 0.16009313f, 0.11910639f, 0.05602141f, 0.08082496f, 0.12544839f, 0.05415940f, -0.03080142f, -0.04070302f, -0.06024186f, -0.07129750f, -0.07769974f, -0.07251926f, - -0.07457123f, -0.04115197f, -0.04049765f, -0.06857318f, -0.04225051f, -0.03861733f, -0.05120942f, -0.08876715f, -0.05537668f, 0.03678654f, 0.09038235f, 0.06681871f, 0.08915640f, 0.13108744f, 0.08129597f, 0.00548771f, - -0.05294641f, 0.03370244f, 0.16024587f, 0.17199155f, 0.02454307f, -0.13278320f, -0.13945295f, -0.04199699f, 0.00678627f, 0.02029543f, 0.00856028f, 0.00137417f, -0.01135502f, -0.03017687f, -0.02257884f, 0.00379131f, - 0.20898804f, -0.01113044f, -0.08488316f, -0.01088633f, 0.03304903f, -0.01306932f, -0.05782260f, -0.07100917f, -0.06682249f, -0.05645623f, -0.04781041f, -0.03500698f, -0.01196148f, 0.03266111f, 0.08176223f, 0.11039842f -}; - -const float *const ivas_sns_cdbks_side_tcx10[SNS_MSVQ_NSTAGES_SIDE] = { ivas_sns_cdbks_side_tcx10_stage1, ivas_sns_cdbks_side_tcx10_stage2 }; -#endif - -#ifdef FIX_445_SNS_BUGFIXES const int16_t sns_1st_cdbk[2][2][8 * 32] = { { /* split 1 */ { /* TCX 20 */ @@ -6973,7 +6369,6 @@ const int16_t sns_1st_means_32k[2][16] = { 16510, 20660, 16025, 7224, 3921, 3868, 2623, 742, -1316, -6269, -8284, -7288, -6380, -8410, -13351, -20277, } }; -#endif #ifdef MC_PARAMUPMIX_MODE ACPL_QUANT_TABLE alpha_quant_table[] = diff --git a/lib_com/ivas_rom_com.h b/lib_com/ivas_rom_com.h index e65aa5d148..539fb2488b 100644 --- a/lib_com/ivas_rom_com.h +++ b/lib_com/ivas_rom_com.h @@ -432,7 +432,6 @@ extern const int16_t ivas_num_active_bands[FB - WB + 1]; /*------------------------------------------------------------------------------------------* * SNS MSVQ codebooks and means *------------------------------------------------------------------------------------------*/ -#ifdef FIX_445_SNS_BUGFIXES extern const int16_t ivas_sns_cdbks_tcx20_levels[]; extern const int16_t ivas_sns_cdbks_tcx20_bits[]; @@ -449,41 +448,16 @@ extern const int16_t ivas_sns_cdbks_side_tcx10_bits[]; extern const float *const ivas_sns_cdbks_side_tcx20[]; extern const float *const ivas_sns_cdbks_side_tcx10[]; -#else -extern const int16_t ivas_sns_cdbks_tcx20_levels[]; -extern const int16_t ivas_sns_cdbks_tcx20_bits[]; - -extern const int16_t ivas_sns_cdbks_tcx10_levels[]; -extern const int16_t ivas_sns_cdbks_tcx10_bits[]; - -extern const float *const ivas_sns_cdbks_tcx20[]; -extern const float *const ivas_sns_cdbks_tcx10[]; - -extern const float ivas_sns_means_tcx20[]; -extern const float ivas_sns_means_tcx10[]; - -extern const int16_t ivas_sns_cdbks_side_tcx20_levels[]; -extern const int16_t ivas_sns_cdbks_side_tcx20_bits[]; -extern const int16_t ivas_sns_cdbks_side_tcx10_levels[]; -extern const int16_t ivas_sns_cdbks_side_tcx10_bits[]; - -extern const float *const ivas_sns_cdbks_side_tcx20[]; -extern const float ivas_sns_means_side_tcx20[]; -extern const float *const ivas_sns_cdbks_side_tcx10[]; -extern const float ivas_sns_means_side_tcx10[]; -#endif #ifdef MC_PARAMUPMIX_MODE extern ACPL_QUANT_TABLE alpha_quant_table[]; extern ACPL_QUANT_TABLE beta_quant_table[2][9]; #endif -#ifdef FIX_445_SNS_BUGFIXES /* means and codebooks for the split VQ in the 2-stage SNS VQ */ extern const int16_t sns_1st_cdbk[2][2][8 * 32]; extern const int16_t sns_1st_means_16k[2][16]; extern const int16_t sns_1st_means_25k6[2][16]; extern const int16_t sns_1st_means_32k[2][16]; -#endif /* IVAS_ROM_COM_H */ #endif diff --git a/lib_com/ivas_sns_com.c b/lib_com/ivas_sns_com.c index b109ef87d6..da7b37e8c5 100644 --- a/lib_com/ivas_sns_com.c +++ b/lib_com/ivas_sns_com.c @@ -36,9 +36,7 @@ #include "prot.h" #include "ivas_prot.h" #include "rom_com.h" -#ifdef FIX_445_SNS_BUGFIXES #include "ivas_rom_com.h" -#endif #include #include #ifdef DEBUGGING @@ -121,7 +119,6 @@ void sns_compute_scf( xs[FDNS_NPTS - 1] = 0.75f * x[FDNS_NPTS - 1] + 0.25f * x[FDNS_NPTS - 2]; /* Pre-emphasis */ -#ifdef FIX_445_SNS_BUGFIXES switch ( L_frame ) { case L_FRAME16k: @@ -137,33 +134,6 @@ void sns_compute_scf( tilt = 0.f; assert( !"illegal frame length in sns_compute_scf" ); } -#else - if ( L_frame == L_FRAME16k ) - { - tilt = 18.f; - } - else if ( L_frame == L_SPEC16k_EXT ) - { - tilt = 20.f; - } - else if ( L_frame == L_FRAME25_6k ) - { - tilt = 22.f; - } - else if ( L_frame == L_FRAME32k ) - { - tilt = 26.f; - } - else if ( L_frame == L_SPEC32k_EXT ) - { - tilt = 30.f; - } - else - { - tilt = 0.f; - assert( 0 && "illegal frame length in sns_compute_scf" ); - } -#endif for ( i = 0; i < FDNS_NPTS; i++ ) { diff --git a/lib_com/options.h b/lib_com/options.h index 4ce326f710..20560e187c 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -158,7 +158,6 @@ #define FIX_439_OTR_PARAMS /* Philips: Issue 439: orientation tracking parameter aspects. */ -#define FIX_445_SNS_BUGFIXES /* FhG: bug fix for spectral tilt in SNS computation + necessary update of codebooks and converison to fixedpoint-compatible tables */ #define FIX_447_PARAMBIN_MASA_REGU_FAC /* Nokia: Issue 447: Fix issue by adjusting regularization factor minimum value. */ #define FIX_441_SBA_PARAMBIN_GAINS /* Nokia: Fix issue 441 by changing gains in SBA path of parametric binauralizer */ diff --git a/lib_com/rom_com.c b/lib_com/rom_com.c index 25a5d6ee9e..e4b8ec9db9 100644 --- a/lib_com/rom_com.c +++ b/lib_com/rom_com.c @@ -22285,77 +22285,6 @@ const Word16 InvDiffTable[32] = /* Q20 */ 0x290F, 0x27A4, 0x264C, 0x2506, 0x23CF, 0x22A7, 0x218E, 0x2081 }; -#ifndef FIX_445_SNS_BUGFIXES -const float sns_vq_cdk1[8*32] = { - -2.0529254143208289e+00f, -2.0105187772519200e+00f, -1.9181418840663027e+00f, -2.0529955931580051e+00f, -1.7965682581646625e+00f, -1.2350476819733338e+00f, -7.4106681145668685e-01f, -1.3500749433562539e-01f, - +6.8395648103934958e-01f, -5.6618076612019363e-01f, -1.1629656439143417e+00f, -1.6994296999691509e+00f, -1.7665333688662666e+00f, -1.4601240490692278e+00f, -1.0934184548732562e+00f, -5.8974136946769384e-01f, - -2.7268374190678193e+00f, -2.1818157040224055e+00f, -6.0427109270377999e-01f, +3.1651466770121833e-01f, +9.3430762386407940e-01f, +1.0478771837003078e+00f, +9.9559582196380947e-01f, +1.1082403839542609e+00f, - +2.4379206786519574e+00f, +1.9640422580297323e+00f, +9.2771600149270417e-01f, +9.4135273318020941e-03f, -6.4013168732630366e-01f, -1.0138049129223088e+00f, -1.0924849368417169e+00f, -9.1129148479978594e-01f, - +8.1762121316616565e-01f, -1.9433974959365836e-02f, -4.0054937117179751e-01f, -3.9231079150228149e-01f, -2.9970406532808125e-01f, -6.2996056616087495e-02f, +3.7544100964377108e-01f, +6.3685372354777436e-01f, - +1.4734834246724329e+00f, +2.3539621556904251e+00f, +9.7194661426112050e-01f, -5.4110096556162990e-01f, -9.8129311847374545e-01f, -6.1342289097457547e-01f, +3.7249272152905366e-01f, +8.1252213656497096e-01f, - -1.2496145961286331e+00f, -3.2376394756447752e-01f, +5.1439178441534027e-02f, +1.0005059991983459e-01f, +2.3749822119608346e-01f, +4.0542724931792579e-01f, +5.1033138353497232e-01f, +5.5694404671095077e-01f, - +7.7965743766052975e-01f, +2.1917885215778097e+00f, +1.7164750043876311e+00f, +5.7945306635665195e-01f, -1.0190291924038120e-01f, -4.0418854005812310e-01f, -4.7849155803986132e-01f, -3.4725769238259874e-01f, - +6.8865034807898129e-01f, +5.7566331510263680e-01f, -7.7725260497355977e-03f, -5.3794851427474544e-01f, -7.6313855691212973e-01f, -7.8413803908382473e-01f, -7.0161107722315574e-01f, -4.8903452069978415e-01f, - +1.6928828230225725e+00f, +9.3495589460148931e-01f, +3.5426821621575499e-01f, +3.9507891687964890e-02f, -7.9631988607824541e-02f, -1.6624589421972935e-01f, -1.6180598135213178e-01f, -1.2860376999895359e-01f, - -1.6962541680165768e+00f, +4.3456061122651995e-01f, +1.0710566866483171e+00f, +1.3249974344239270e+00f, +1.0825630027900910e+00f, +9.0621333090389167e-01f, +6.5428541538000140e-01f, +6.7283424156333382e-01f, - +4.5763916137396308e+00f, +4.0870427709381518e+00f, +2.6750799962096261e+00f, +1.4487891616901025e+00f, +2.4432209950451603e-01f, -5.4383244175422862e-01f, -9.4142251186129933e-01f, -1.0862058366913647e+00f, - +1.1883989487611160e+00f, +1.1685324900978113e+00f, +9.3045980943772877e-01f, +8.3738457417173884e-01f, +6.3496480700237246e-01f, +4.6405143429051326e-01f, +3.1705534227338888e-01f, +2.0799507760170197e-01f, - +2.8980578835865609e+00f, +3.0880495072396617e+00f, +1.8680019598806248e+00f, +7.0446466488259230e-01f, +1.0107302845552169e-01f, -2.8986489567349910e-01f, -4.1462748482286188e-01f, -3.6206036514823836e-01f, - -1.7524799389036466e-01f, +1.1936698995397648e+00f, +1.6088971749375909e+00f, +1.7111901074418125e+00f, +1.4837525009734551e+00f, +5.2536808756057463e-01f, -3.1226889149907566e-01f, -3.5746958704581933e-01f, - +9.0352696786286879e-01f, +2.4731406386331605e+00f, +2.9079925242729416e+00f, +2.7918041274045429e+00f, +2.2373843929092465e+00f, +8.5208847870338755e-01f, -7.6200320575426320e-02f, -2.5316053664429367e-01f, - -1.1865763437968528e+00f, -7.4234595628060440e-01f, -6.0141100860138463e-01f, -8.5065089175547848e-01f, -8.8329724313055402e-01f, -6.5351381126344021e-01f, -5.0230651881879618e-01f, -2.3359707426927168e-01f, - +2.7673589888377261e+00f, +6.6328569264593351e-01f, -4.1472488624881343e-01f, -9.3187436659797018e-01f, -1.0754140202622839e+00f, -1.0146723389090857e+00f, -8.7888946611264573e-01f, -6.0836606213569688e-01f, - -1.8124429341308173e+00f, -9.7828066142280434e-01f, +6.5968430845517978e-01f, +2.1854499449267628e+00f, +2.2517483941731826e+00f, +2.3821501109065295e+00f, +1.9235238012956650e+00f, +1.5065083288921912e+00f, - +4.9050283992558246e+00f, +2.4264119698434983e+00f, +8.3367299614637902e-01f, -4.3119484392510427e-02f, -5.8100382033177300e-01f, -7.7353747986816990e-01f, -8.7895223350767071e-01f, -8.6819816920933113e-01f, - +6.5228388674538984e-01f, +1.1174683594915380e-01f, +1.2383281142011383e-01f, +6.0151217547540869e-01f, +9.5444246174773772e-01f, +1.2805750123888453e+00f, +9.2140926443564275e-01f, +5.7786881373204924e-01f, - +1.9490989723028713e+00f, +2.8004262751807882e+00f, +1.9081816065970161e+00f, +3.7248785750983177e-01f, +1.3095620385608037e-01f, +7.9016424306166244e-01f, +1.1640502521465221e+00f, +1.0066783002173452e+00f, - -1.0171864644867654e-01f, +1.7954757784640871e+00f, +1.8915637038163424e+00f, +1.0909542570620605e+00f, +6.1888445783828194e-01f, +7.6574083569028828e-01f, +8.9561325653114987e-01f, +8.0797624213033170e-01f, - +1.9350543800926379e+00f, +3.2339385307849722e+00f, +3.0806729276317419e+00f, +2.1684844197871249e+00f, +7.8035951982399498e-01f, -6.7854327548476567e-01f, -9.6732224945258960e-01f, -5.8068474286758409e-01f, - -1.5383985945543574e-01f, +7.1583722374971992e-01f, +5.8674384505519706e-01f, +3.7092544478085621e-01f, +1.0970155384441491e-01f, -2.3854313229153577e-02f, -5.3508967318497622e-02f, +3.3979575877473786e-02f, - +2.7095625819635165e+00f, +1.7832208238203791e+00f, +9.6783753432609421e-01f, +5.8919108500645523e-01f, +4.1191953120474317e-01f, +1.9592175852184501e-01f, -1.0134844291353281e-02f, -1.6725603195278577e-01f, - -2.6560188981865329e-01f, +1.4059113655935889e+00f, +1.9844196049902063e+00f, +2.4291429998935334e+00f, +2.2837873843112892e+00f, +1.8570922995202830e+00f, +1.2056879204230433e+00f, +8.4717915626409468e-01f, - +3.1939221203717074e+00f, +3.7963726820313615e+00f, +3.2748823221663406e+00f, +2.4724357608035472e+00f, +1.6860933687497499e+00f, +6.4628696101838046e-01f, -7.8170867286998971e-02f, -6.1406792037327973e-01f, - +1.6686627356973500e+00f, +2.4375118241337517e+00f, +2.2118134266295129e+00f, +1.4754862720822910e+00f, +1.0100987843177478e+00f, +4.8216927165041135e-01f, +5.0597779432044222e-02f, -7.2090396257990311e-02f, - +3.4953550651375287e+00f, +3.2379627985821369e+00f, +2.1155532232841976e+00f, +1.3293556793682053e+00f, +1.0159800928862721e+00f, +6.8710150035919371e-01f, +5.0950588745743997e-01f, +2.0092204555514792e-01f, - +1.6537233329850265e+00f, +1.8429927128987775e+00f, +1.5795688890212489e+00f, +1.5313117335176101e+00f, +1.4688051742099697e+00f, +1.3047757088193301e+00f, +9.3703047481911916e-01f, +6.6034404507297240e-01f, - +1.9642176175501569e+00f, +2.9388625018759811e+00f, +2.9051270203314714e+00f, +2.2145871562616142e+00f, +1.8151504726187455e+00f, +1.4766756664819134e+00f, +1.0710276243190799e+00f, +6.1861320930710639e-01f -}; - -const float sns_vq_cdk2[8*32] = { - -5.9829995937529679e-01f, -1.6330921039310822e+00f, -2.2069628561771211e+00f, -2.3101968732645872e+00f, -2.2987624447001700e+00f, -2.2585659584659474e+00f, -2.2426863949716420e+00f, -2.2717425510152180e+00f, - -1.4313340820994043e+00f, -1.7500847356351696e+00f, -1.7795938232358199e+00f, -1.7213803415353539e+00f, -1.6610776464291162e+00f, -1.6069804294990451e+00f, -1.5625217472935489e+00f, -1.5641247494491251e+00f, - -4.2712987825717169e-01f, -8.1657540705874065e-01f, -1.1438786300941690e+00f, -1.5047514473946468e+00f, -1.8039927073343207e+00f, -1.9709309014182719e+00f, -2.0721822202754367e+00f, -2.2015067008471854e+00f, - -8.8390021618372749e-01f, -9.1027146153915306e-01f, -8.4148501893353445e-01f, -7.0803242455046478e-01f, -4.0873435152568971e-01f, -5.8364530253510127e-02f, +1.5450950372912373e-01f, +2.3879767518520115e-01f, - +2.2959495262308716e-01f, -4.5380527270641730e-01f, -1.2610303555144773e+00f, -1.9593984147017431e+00f, -2.5055916891711632e+00f, -2.7888667896972388e+00f, -2.9113125863020777e+00f, -2.9748256948291001e+00f, - -1.1488842521346578e+00f, -1.3517692148186562e+00f, -1.3594824205078988e+00f, -1.2204819600745185e+00f, -9.1363085887906581e-01f, -6.8205390481915806e-01f, -5.8474638022763137e-01f, -6.3572794299637214e-01f, - -7.7093095554781843e-01f, -9.4474580908674310e-01f, -9.4836193194533303e-01f, -9.4516185118638463e-01f, -1.0483710354237581e+00f, -1.1355351751536940e+00f, -1.2428754319298756e+00f, -1.3831917119547590e+00f, - -9.3476137541952931e-01f, -7.0790164340965811e-01f, -3.3885900459516044e-01f, +8.2267549037198462e-02f, +4.8079994558165973e-01f, +8.0682939355530092e-01f, +1.0305358697421620e+00f, +1.0235050392855534e+00f, - +1.0095585388252226e+00f, -1.5967777106488176e-01f, -2.2123760679560007e+00f, -2.4162196770688293e+00f, -2.1066059048135193e+00f, -1.8818990363917070e+00f, -1.9958495939733885e+00f, -2.3481921543456847e+00f, - +9.2392277358713179e-02f, -1.8364442239470730e-01f, -5.9563356599054251e-01f, -1.0147004796192145e+00f, -1.3476180323301636e+00f, -1.5136187252106814e+00f, -1.5799100551406959e+00f, -1.7192022915180234e+00f, - -1.4222957040291027e-02f, -1.7371797028437352e-01f, -3.0805783645739226e-01f, -4.0484411256102021e-01f, -6.6432144720337050e-01f, -1.0344124279519349e+00f, -1.6814321622332238e+00f, -2.5032237993558693e+00f, - +6.8743182828212471e-02f, +3.3095426522069737e-01f, +5.0002819580392865e-01f, +5.6165737804402860e-01f, +5.0172311732338448e-01f, +3.6961533646464034e-01f, +8.5026798082935839e-02f, -3.9473330479310409e-01f, - +1.0356440140522545e+00f, +7.8065342952998484e-01f, +6.7193695552111687e-02f, -9.5261546302001587e-01f, -2.0142463788396388e+00f, -2.7767542927506610e+00f, -3.1928041080758338e+00f, -3.4042594311363201e+00f, - -6.6289350610256359e-01f, -6.3896764348680091e-01f, -5.1207254963552118e-01f, -3.6335660396488040e-01f, -2.8247932520862895e-01f, -3.1477486911353381e-01f, -4.4809778805307687e-01f, -6.9186118822875298e-01f, - +7.9969719144308171e-02f, +2.1588869900646174e-01f, +3.0323707912603959e-01f, +2.6884673422742911e-01f, +5.9642290590166340e-02f, -2.8613663980468629e-01f, -7.9406912376026706e-01f, -1.4470063450324298e+00f, - -2.0240948732059452e-01f, +2.3334712655850515e-01f, +5.7657451283939798e-01f, +7.9742677228839842e-01f, +9.3220814515190065e-01f, +1.0323450144255806e+00f, +1.0118085786908606e+00f, +7.9014188629614879e-01f, - -7.1530830084194669e-02f, -1.2396351139455990e+00f, -2.0842499795217195e+00f, -1.3035503744881123e+00f, -8.3471992091295932e-01f, -1.1295869482135590e+00f, -1.7132725973269993e+00f, -2.1802158117711343e+00f, - -1.7835942638423960e-01f, -7.1247931965515532e-01f, -1.5124017210947220e+00f, -1.9967695368388680e+00f, -1.8783401399959028e+00f, -1.4021324347049549e+00f, -1.0637376079630234e+00f, -1.1080152582418752e+00f, - +1.0480932547841233e+00f, +2.7493060468886921e-01f, -1.1919132498368252e+00f, -1.2523434724836580e+00f, -7.8936067946054767e-01f, -8.2091162445205956e-01f, -1.3128033132740213e+00f, -1.9655091841161074e+00f, - -3.3232308742031469e-01f, -2.2713591199678415e-01f, -1.4351679017954885e-01f, -1.9801985565791998e-02f, +1.0057467598256911e-01f, +2.2696827939185557e-01f, +3.0695375436198624e-01f, +2.2875897090753330e-01f, - +3.4676185796153502e-01f, -1.0768837168056489e-01f, -6.9753922421077807e-01f, -1.0937050061788010e+00f, -1.5428629138891437e+00f, -2.0449896355500123e+00f, -2.4848880613940572e+00f, -2.8583647439574880e+00f, - -1.2173513563721174e-02f, -3.2908222329502096e-01f, -7.4562386900667521e-01f, -1.0159346083066496e+00f, -9.9134754982937601e-01f, -8.0708475073517449e-01f, -5.9033001697337439e-01f, -5.3497643414524321e-01f, - -1.0362333131951586e-01f, -2.6988877087476748e-01f, -3.8890071054155473e-01f, -4.9037107401879965e-01f, -5.6504591412573135e-01f, -7.3336953439609320e-01f, -9.9258959592254403e-01f, -1.3661070412637724e+00f, - -7.9157092539986307e-01f, -3.3641122720876027e-01f, +2.9168895215304702e-01f, +1.0181013149521261e+00f, +1.5982627043961528e+00f, +1.9868228787387316e+00f, +2.1282934389276504e+00f, +1.9646952813708398e+00f, - +8.5453347281306224e-01f, +8.1178943134578940e-01f, -4.8818346255935796e-01f, -2.1067304958054955e+00f, -2.5063149014598722e+00f, -2.0640557329267200e+00f, -1.6543474135830516e+00f, -1.7651753795641250e+00f, - +6.2358146522917657e-01f, +5.4834889364422190e-01f, +1.7179524311839983e-01f, -3.5307730840525375e-01f, -7.7064726884538126e-01f, -1.0122724639555478e+00f, -1.1610381095678584e+00f, -1.4059777048358271e+00f, - +7.4374029892860283e-01f, +9.2218263151186131e-01f, +7.8921361199673412e-01f, +5.4697537641890215e-01f, +3.4695498575470718e-02f, -6.0728616781597766e-01f, -1.5817464846714542e+00f, -2.9492076413515940e+00f, - +1.0792513778563164e+00f, +1.4361817236342909e+00f, +1.4897259644477068e+00f, +1.4980968655148907e+00f, +1.3061906859741226e+00f, +9.2722643966101292e-01f, +4.6901200392574449e-01f, -8.4108696494310742e-02f, - +8.5358364275519205e-01f, +6.0645747733831856e-01f, +2.0465300574744516e-01f, -3.7181339249044437e-01f, -1.0727735914037746e+00f, -1.6784774674483536e+00f, -2.1020318554063260e+00f, -2.5024013237162377e+00f, - +1.2794365477031622e-01f, +1.2747703630869173e-01f, -4.1758739312140455e-02f, -2.4311752788462185e-01f, -3.1778646043737568e-01f, -2.8915217065224763e-01f, -2.9094454849599488e-01f, -4.4820832489443191e-01f, - +1.2951853228518271e+00f, +9.5620359941142952e-01f, +5.3144852217798388e-01f, +2.1179514725221937e-01f, -6.5987484250824083e-02f, -3.2087563737255587e-01f, -5.4468525409236357e-01f, -8.8065574221328113e-01f, - -1.0568174530545921e-02f, +8.7151888563731761e-01f, +1.5660992592896033e+00f, +1.9198797896705255e+00f, +2.0755726094083351e+00f, +2.1798356493630360e+00f, +2.0711596722334082e+00f, +1.7022476043512389e+00f -}; -#endif const float tcx_mdct_window_48[420] = { diff --git a/lib_com/rom_com.h b/lib_com/rom_com.h index 0d0f319e1d..e6284ab417 100644 --- a/lib_com/rom_com.h +++ b/lib_com/rom_com.h @@ -1341,11 +1341,6 @@ extern const Word16 invTable[INV_TABLE_SIZE + 1]; extern const Word16 sqrtTable[SQRT_TABLE_SIZE + 1]; extern const Word16 invSqrtTable[SQRT_TABLE_SIZE + 1]; -#ifndef FIX_445_SNS_BUGFIXES -extern const float sns_vq_cdk1[8 * 32]; -extern const float sns_vq_cdk2[8 * 32]; - -#endif extern const float tcx_mdct_window_48[420]; extern const float tcx_mdct_window_half_48[180]; extern const float tcx_mdct_window_trans_48[60]; diff --git a/lib_dec/ivas_mdct_core_dec.c b/lib_dec/ivas_mdct_core_dec.c index 77c7464142..becf11e070 100644 --- a/lib_dec/ivas_mdct_core_dec.c +++ b/lib_dec/ivas_mdct_core_dec.c @@ -679,11 +679,7 @@ void ivas_mdct_core_invQ( { if ( sts[0]->core == TCX_20_CORE && sts[1]->core == TCX_20_CORE && sts[0]->mct_chan_mode != MCT_CHAN_MODE_IGNORE && sts[1]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) { -#ifdef FIX_445_SNS_BUGFIXES sns_avq_dec_stereo( param_lpc[0], param_lpc[1], sts[0]->L_frame, &sns[0][0][0], &sns[1][0][0] ); -#else - sns_avq_dec_stereo( param_lpc[0], param_lpc[1], &sns[0][0][0], &sns[1][0][0] ); -#endif } else { @@ -692,11 +688,7 @@ void ivas_mdct_core_invQ( st = sts[ch]; if ( st->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) { -#ifdef FIX_445_SNS_BUGFIXES sns_avq_dec( param_lpc[ch], sns[ch], st->L_frame, st->numlpc ); -#else - sns_avq_dec( param_lpc[ch], sns[ch], st->numlpc ); -#endif } } } diff --git a/lib_dec/ivas_sns_dec.c b/lib_dec/ivas_sns_dec.c index ce096c12be..14c16a07c4 100644 --- a/lib_dec/ivas_sns_dec.c +++ b/lib_dec/ivas_sns_dec.c @@ -37,9 +37,7 @@ #include "rom_com.h" #include "ivas_rom_com.h" #include "ivas_cnst.h" -#ifdef FIX_445_SNS_BUGFIXES #include -#endif #include "wmc_auto.h" /*------------------------------------------------------------------- @@ -50,15 +48,12 @@ static void sns_1st_dec( const int16_t index, /* i : codebook index */ -#ifdef FIX_445_SNS_BUGFIXES const int16_t core, const int16_t L_frame, -#endif float *snsq /* i/o: i:prediction o:quantized sns */ ) { int16_t i; -#ifdef FIX_445_SNS_BUGFIXES const int16_t *p_dico, *means; const float cdbk_fix2float = 1.f / powf( 2, SNS_CDBKS_BITS_4_FRAC ); const float means_fix2float = 1.f / powf( 2, SNS_MEANS_BITS_4_FRAC ); @@ -79,38 +74,19 @@ static void sns_1st_dec( assert( !"illegal frame length in sns_1st_cod" ); } -#else - const float *p_dico; -#endif -#ifdef FIX_445_SNS_BUGFIXES p_dico = &sns_1st_cdbk[0][core - 1][0] + ( index % 32 ) * ( M / 2 ); -#else - p_dico = &sns_vq_cdk1[( index % 32 ) * ( M / 2 )]; -#endif for ( i = 0; i < M / 2; i++ ) { -#ifdef FIX_445_SNS_BUGFIXES snsq[i] = ( *p_dico++ ) * cdbk_fix2float + means[i] * means_fix2float; -#else - snsq[i] = *p_dico++; -#endif } -#ifdef FIX_445_SNS_BUGFIXES p_dico = &sns_1st_cdbk[1][core - 1][0] + ( index >> 5 ) * ( M / 2 ); -#else - p_dico = &sns_vq_cdk2[( index >> 5 ) * ( M / 2 )]; -#endif for ( i = M / 2; i < M; i++ ) { -#ifdef FIX_445_SNS_BUGFIXES snsq[i] = ( *p_dico++ ) * cdbk_fix2float + means[i] * means_fix2float; -#else - snsq[i] = *p_dico++; -#endif } return; @@ -153,9 +129,7 @@ static void sns_2st_dec( void sns_avq_dec( int16_t *index, /* i : Quantization indices */ float SNS_Q[NB_DIV][M], /* o : Quantized SNS vectors */ -#ifdef FIX_445_SNS_BUGFIXES const int16_t L_frame, -#endif const int16_t numlpc /* i : Number of sets of lpc */ ) { @@ -168,11 +142,7 @@ void sns_avq_dec( index++; /* Decode last LPC */ -#ifdef FIX_445_SNS_BUGFIXES sns_1st_dec( *index++, numlpc, L_frame, SNS_Q[last] ); -#else - sns_1st_dec( *index++, SNS_Q[last] ); -#endif sns_2st_dec( SNS_Q[last], index ); nbi = 2 + index[0] + index[1]; index += nbi; @@ -184,11 +154,7 @@ void sns_avq_dec( if ( q_type == 0 ) { -#ifdef FIX_445_SNS_BUGFIXES sns_1st_dec( *index++, numlpc, L_frame, SNS_Q[0] ); -#else - sns_1st_dec( *index++, SNS_Q[0] ); -#endif sns_2st_dec( SNS_Q[0], index ); } else if ( q_type == 1 ) @@ -214,9 +180,7 @@ void sns_avq_dec( void sns_avq_dec_stereo( int16_t *indexl, /* i : Quantization indices (left channel) */ int16_t *indexr, /* i : Quantization indices (right channe) */ -#ifdef FIX_445_SNS_BUGFIXES const int16_t L_frame, -#endif float *SNS_Ql, /* o : Quantized SNS vectors (left channel) */ float *SNS_Qr /* o : Quantized SNS vectors (right channe) */ ) @@ -231,11 +195,7 @@ void sns_avq_dec_stereo( { /* MS coding */ -#ifdef FIX_445_SNS_BUGFIXES sns_1st_dec( *indexl++, TCX_20_CORE, L_frame, mid_q ); -#else - sns_1st_dec( *indexl++, mid_q ); -#endif sns_2st_dec( mid_q, indexl ); for ( i = 0; i < M; i++ ) @@ -258,18 +218,10 @@ void sns_avq_dec_stereo( { /* LR decoding */ -#ifdef FIX_445_SNS_BUGFIXES sns_1st_dec( *indexl++, TCX_20_CORE, L_frame, SNS_Ql ); -#else - sns_1st_dec( *indexl++, SNS_Ql ); -#endif sns_2st_dec( SNS_Ql, indexl ); -#ifdef FIX_445_SNS_BUGFIXES sns_1st_dec( *indexr++, TCX_20_CORE, L_frame, SNS_Qr ); -#else - sns_1st_dec( *indexr++, SNS_Qr ); -#endif sns_2st_dec( SNS_Qr, indexr ); } @@ -282,9 +234,6 @@ void dequantize_sns( Decoder_State **sts ) { int16_t nSubframes, k, ch; -#ifndef FIX_445_SNS_BUGFIXES - const float *means; -#endif int16_t sns_stereo_mode[NB_DIV]; int16_t zero_side_flag[NB_DIV]; Decoder_State *st; @@ -319,14 +268,8 @@ void dequantize_sns( } nStages = SNS_MSVQ_NSTAGES_SIDE; -#ifndef FIX_445_SNS_BUGFIXES - means = ( st->core == TCX_20_CORE ) ? ivas_sns_means_side_tcx20 : ivas_sns_means_side_tcx10; -#endif msvq_dec( side_cdbks, NULL, NULL, nStages, M, M, &indices[ch][idxIndices + SNS_STEREO_MODE_OFFSET_INDICES], 0, NULL, snsQ, NULL ); -#ifndef FIX_445_SNS_BUGFIXES - v_add( snsQ, means, snsQ, M ); -#endif } else { @@ -347,18 +290,4 @@ void dequantize_sns( } } } -#ifndef FIX_445_SNS_BUGFIXES - - /* add means back */ - for ( ch = 0; ch < CPE_CHANNELS; ++ch ) - { - st = sts[ch]; - nSubframes = ( st->core == TCX_20_CORE ) ? 1 : NB_DIV; - means = ( st->core == TCX_20_CORE ) ? ivas_sns_means_tcx20 : ivas_sns_means_tcx10; - for ( k = 0; k < nSubframes; ++k ) - { - v_add( snsQ_out[ch][k], means, snsQ_out[ch][k], M ); - } - } -#endif } diff --git a/lib_enc/ivas_mdct_core_enc.c b/lib_enc/ivas_mdct_core_enc.c index dbabb5ead5..edc9ea1e50 100644 --- a/lib_enc/ivas_mdct_core_enc.c +++ b/lib_enc/ivas_mdct_core_enc.c @@ -875,11 +875,7 @@ void ivas_mdct_core_whitening_enc( chE[n] = sum_f( powerSpec, L_subframeTCX ); } -#ifdef FIX_445_SNS_BUGFIXES sns_compute_scf( powerSpec, st->hTcxCfg->psychParamsCurrent, st->L_frame, scf[ch][n] ); -#else - sns_compute_scf( powerSpec, st->hTcxCfg->psychParamsCurrent, st->last_core == ACELP_CORE ? L_subframe : st->L_frame, scf[ch][n] ); -#endif } /* MCT: detect whether there are silent channels and set mct_chan_mode accordingly */ @@ -919,11 +915,7 @@ void ivas_mdct_core_whitening_enc( if ( sts[0]->hTcxEnc->tcxMode == TCX_20 && sts[1]->hTcxEnc->tcxMode == TCX_20 && sts[0]->mct_chan_mode == MCT_CHAN_MODE_REGULAR && sts[1]->mct_chan_mode == MCT_CHAN_MODE_REGULAR ) { -#ifdef FIX_445_SNS_BUGFIXES sns_avq_cod_stereo( scf[0][0], scf[1][0], sts[0]->L_frame, scf_q[0][0], scf_q[1][0], param_lpc[0], param_lpc[1] ); -#else - sns_avq_cod_stereo( scf[0][0], scf[1][0], scf_q[0][0], scf_q[1][0], param_lpc[0], param_lpc[1] ); -#endif } else { @@ -946,19 +938,11 @@ void ivas_mdct_core_whitening_enc( if ( st->hTcxEnc->tcxMode == TCX_20 ) { -#ifdef FIX_445_SNS_BUGFIXES sns_avq_cod( scf[ch][0], NULL, scf_q[ch][0], NULL, ¶m_lpc[ch][1], st->hTcxEnc->tcxMode, st->L_frame, sns_low_br_mode ); -#else - sns_avq_cod( scf[ch][0], NULL, scf_q[ch][0], NULL, ¶m_lpc[ch][1], st->hTcxEnc->tcxMode, sns_low_br_mode ); -#endif } else { -#ifdef FIX_445_SNS_BUGFIXES sns_avq_cod( scf[ch][1], scf[ch][0], scf_q[ch][1], scf_q[ch][0], ¶m_lpc[ch][1], st->hTcxEnc->tcxMode, st->L_frame, sns_low_br_mode ); -#else - sns_avq_cod( scf[ch][1], scf[ch][0], scf_q[ch][1], scf_q[ch][0], ¶m_lpc[ch][1], st->hTcxEnc->tcxMode, sns_low_br_mode ); -#endif } } } diff --git a/lib_enc/ivas_sns_enc.c b/lib_enc/ivas_sns_enc.c index acadee46cb..5197a260b9 100644 --- a/lib_enc/ivas_sns_enc.c +++ b/lib_enc/ivas_sns_enc.c @@ -53,7 +53,6 @@ *-------------------------------------------------------------------*/ /* r : codebook index */ -#ifdef FIX_445_SNS_BUGFIXES static int16_t sns_1st_cod( const float *sns, /* i : vector to quantize */ const int16_t L_frame, @@ -141,84 +140,6 @@ static int16_t sns_1st_cod( return index; } -#else -static int16_t sns_1st_cod( - const float *sns, /* i : vector to quantize */ - float *snsq /* i/o: i:prediction o:quantized sns */ -) -{ - int16_t i, j, index; - int16_t j0, j1, index0, index1; - float dist_min, dist, temp; - const float *p_dico; - - j0 = 0; - j1 = M / 2; - dist_min = 1.0e30f; - p_dico = sns_vq_cdk1; - index0 = 0; - - for ( i = 0; i < 32; i++ ) - { - dist = 0.0; - - for ( j = j0; j < j1; j++ ) - { - temp = sns[j] - *p_dico++; - dist += temp * temp; - } - - if ( dist < dist_min ) - { - dist_min = dist; - index0 = i; - } - } - - /* quantized vector */ - p_dico = &sns_vq_cdk1[index0 * ( M / 2 )]; - - for ( j = j0; j < j1; j++ ) - { - snsq[j] = *p_dico++; /* += cause it's differential */ - } - - j0 = M / 2; - j1 = M; - dist_min = 1.0e30f; - p_dico = sns_vq_cdk2; - index1 = 0; - - for ( i = 0; i < 32; i++ ) - { - dist = 0.0; - - for ( j = j0; j < j1; j++ ) - { - temp = sns[j] - *p_dico++; - dist += temp * temp; - } - - if ( dist < dist_min ) - { - dist_min = dist; - index1 = i; - } - } - - /* quantized vector */ - p_dico = &sns_vq_cdk2[index1 * ( M / 2 )]; - - for ( j = j0; j < j1; j++ ) - { - snsq[j] = *p_dico++; /* += cause it's differential */ - } - - index = index0 + ( index1 << 5 ); - - return index; -} -#endif /*------------------------------------------------------------------- @@ -291,9 +212,7 @@ void sns_avq_cod( float *snsmid_q, /* o : Quantized mid-LFS vectors */ int16_t *index, /* o : Quantization indices */ const int16_t core, /* i : core */ -#ifdef FIX_445_SNS_BUGFIXES const int16_t L_frame, -#endif const int16_t low_brate_mode /* i : flag low bit operating mode */ ) { @@ -301,11 +220,7 @@ void sns_avq_cod( float snsmid_q0[M]; int16_t indxt[256], nbits, nbt, nit; -#ifdef FIX_445_SNS_BUGFIXES index[0] = sns_1st_cod( sns, L_frame, core, sns_q ); -#else - index[0] = sns_1st_cod( sns, sns_q ); -#endif nit = 1 + 2; if ( !low_brate_mode ) { @@ -326,11 +241,7 @@ void sns_avq_cod( { index++; -#ifdef FIX_445_SNS_BUGFIXES index[0] = sns_1st_cod( snsmid, L_frame, core, snsmid_q ); -#else - index[0] = sns_1st_cod( snsmid, snsmid_q ); -#endif nit = 1 + 2; if ( !low_brate_mode ) { @@ -387,9 +298,7 @@ void sns_avq_cod( void sns_avq_cod_stereo( const float *snsl, /* i : Input sns vector (left channel) */ const float *snsr, /* i : Input sns vector (right channel) */ -#ifdef FIX_445_SNS_BUGFIXES const int16_t L_frame, -#endif float *snsl_q, /* o : Quantized sns vector (left channel) */ float *snsr_q, /* o : Quantized sns vector (right channel) */ int16_t *indexl, /* o : Quantization indices (left channel) */ @@ -433,11 +342,7 @@ void sns_avq_cod_stereo( } /* Quantize mid */ -#ifdef FIX_445_SNS_BUGFIXES indexl[0] = sns_1st_cod( mid, L_frame, TCX_20_CORE, mid_q ); -#else - indexl[0] = sns_1st_cod( mid, mid_q ); -#endif sns_2st_cod( mid, mid_q, &indexl[1] ); /* Quantize side */ @@ -477,19 +382,11 @@ void sns_avq_cod_stereo( *indexr++ = 1; /* Quantize left */ -#ifdef FIX_445_SNS_BUGFIXES indexl[0] = sns_1st_cod( snsl, L_frame, TCX_20_CORE, snsl_q ); -#else - indexl[0] = sns_1st_cod( snsl, snsl_q ); -#endif sns_2st_cod( snsl, snsl_q, &indexl[1] ); /* Quantize right */ -#ifdef FIX_445_SNS_BUGFIXES indexr[0] = sns_1st_cod( snsr, L_frame, TCX_20_CORE, snsr_q ); -#else - indexr[0] = sns_1st_cod( snsr, snsr_q ); -#endif sns_2st_cod( snsr, snsr_q, &indexr[1] ); } @@ -508,9 +405,6 @@ int16_t quantize_sns( int16_t nbits, idxIndices; Encoder_State *st; float weights[M]; -#ifndef FIX_445_SNS_BUGFIXES - const float *means; -#endif nbits = 0; idxIndices = 0; @@ -522,7 +416,6 @@ int16_t quantize_sns( zero_side_flag[0] = 0; zero_side_flag[1] = 0; -#ifdef FIX_445_SNS_BUGFIXES /* use snsQ_out as buffer, move input vectors */ for ( ch = 0; ch < CPE_CHANNELS; ++ch ) { @@ -532,7 +425,6 @@ int16_t quantize_sns( mvr2r( sns_in[ch][k], snsQ_out[ch][k], M ); } } -#endif if ( sts[0]->core == sts[1]->core ) { @@ -540,50 +432,25 @@ int16_t quantize_sns( for ( k = 0; k < nSubframes; ++k ) { -#ifdef FIX_445_SNS_BUGFIXES float side[M]; -#else - float *side; -#endif float ener_side; -#ifdef FIX_445_SNS_BUGFIXES v_sub( snsQ_out[0][k], snsQ_out[1][k], side, M ); -#else - side = &snsQ_out[1][k][0]; - v_sub( sns_in[0][k], sns_in[1][k], side, M ); -#endif ener_side = dotp( side, side, M ); sns_stereo_mode[k] = ener_side < 12.f; zero_side_flag[k] = ener_side < 1.f; -#ifdef FIX_445_SNS_BUGFIXES if ( sns_stereo_mode[k] == SNS_STEREO_MODE_MS ) { convertToMS( M, snsQ_out[0][k], snsQ_out[1][k], 0.5f ); } -#endif } } /* prepare buffers depending on the chosen stereo mode */ -#ifndef FIX_445_SNS_BUGFIXES - /* remove means of L/R SNS parameters */ - for ( ch = 0; ch < CPE_CHANNELS; ++ch ) - { - st = sts[ch]; - nSubframes = ( st->core == TCX_20_CORE ) ? 1 : NB_DIV; - means = ( st->core == TCX_20_CORE ) ? ivas_sns_means_tcx20 : ivas_sns_means_tcx10; - for ( k = 0; k < nSubframes; ++k ) - { - v_sub( sns_in[ch][k], means, snsQ_out[ch][k], M ); - } - } -#endif -#ifdef FIX_445_SNS_BUGFIXES nSubframes = ( sts[0]->core == TCX_20_CORE ) ? 1 : NB_DIV; for ( k = 0; k < nSubframes; ++k ) { @@ -594,19 +461,6 @@ int16_t quantize_sns( convertToMS( M, snsQ_out[0][k], snsQ_out[1][k], 0.5f ); } } -#else - if ( sns_stereo_mode[0] == SNS_STEREO_MODE_MS || sns_stereo_mode[1] == SNS_STEREO_MODE_MS ) - { - nSubframes = ( sts[0]->core == TCX_20_CORE ) ? 1 : NB_DIV; - for ( k = 0; k < nSubframes; ++k ) - { - if ( sns_stereo_mode[k] == SNS_STEREO_MODE_MS ) - { - convertToMS( M, snsQ_out[0][k], snsQ_out[1][k], 0.5f ); - } - } - } -#endif for ( ch = 0; ch < CPE_CHANNELS; ++ch ) { @@ -636,16 +490,8 @@ int16_t quantize_sns( nStages = SNS_MSVQ_NSTAGES_SIDE; bits = ( st->core == TCX_20_CORE ) ? ivas_sns_cdbks_side_tcx20_bits : ivas_sns_cdbks_side_tcx10_bits; -#ifndef FIX_445_SNS_BUGFIXES - means = ( st->core == TCX_20_CORE ) ? ivas_sns_means_side_tcx20 : ivas_sns_means_side_tcx10; - - v_sub( sns_ptr, means, snsQ, M ); -#endif msvq_enc( side_cdbks, NULL, NULL, snsQ, side_levels, 3, nStages, weights, M, M, 0, NULL, &indices[idxIndices] ); msvq_dec( side_cdbks, NULL, NULL, nStages, M, M, &indices[idxIndices], 0, NULL, snsQ, NULL ); -#ifndef FIX_445_SNS_BUGFIXES - v_add( snsQ, means, snsQ, M ); -#endif } else { @@ -673,19 +519,6 @@ int16_t quantize_sns( } } -#ifndef FIX_445_SNS_BUGFIXES - /* add means back */ - for ( ch = 0; ch < CPE_CHANNELS; ++ch ) - { - st = sts[ch]; - nSubframes = ( st->core == TCX_20_CORE ) ? 1 : NB_DIV; - means = ( st->core == TCX_20_CORE ) ? ivas_sns_means_tcx20 : ivas_sns_means_tcx10; - for ( k = 0; k < nSubframes; ++k ) - { - v_add( snsQ_out[ch][k], means, snsQ_out[ch][k], M ); - } - } -#endif return nbits; } -- GitLab From 9e5cadb0a3e2b0dddde42912ba1f840e33e536af Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 20:13:41 +0200 Subject: [PATCH 273/331] [cleanup] accept FIX_447_PARAMBIN_MASA_REGU_FAC --- lib_com/options.h | 1 - lib_rend/ivas_dirac_dec_binaural_functions.c | 19 ------------------- 2 files changed, 20 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 20560e187c..05bd450eec 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -158,7 +158,6 @@ #define FIX_439_OTR_PARAMS /* Philips: Issue 439: orientation tracking parameter aspects. */ -#define FIX_447_PARAMBIN_MASA_REGU_FAC /* Nokia: Issue 447: Fix issue by adjusting regularization factor minimum value. */ #define FIX_441_SBA_PARAMBIN_GAINS /* Nokia: Fix issue 441 by changing gains in SBA path of parametric binauralizer */ #define MC_PARAMUPMIX_MODE /* Dlb: Contribution 39: Multichannel Parametric Upmix */ diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 5e70957e26..5b635ffee3 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -2192,25 +2192,10 @@ static void hrtfShGetHrtf( if ( ivas_format == MASA_FORMAT ) { -#ifdef FIX_447_PARAMBIN_MASA_REGU_FAC if ( ivas_total_brate >= IVAS_160k ) { reqularizationFactor = 0.4f; } -#else - if ( ivas_total_brate >= IVAS_256k ) - { - reqularizationFactor = 0.2f; - } - else if ( ivas_total_brate == IVAS_192k ) - { - reqularizationFactor = 0.3f; - } - else if ( ivas_total_brate == IVAS_160k ) - { - reqularizationFactor = 0.4f; - } -#endif else if ( ivas_total_brate == IVAS_128k ) { reqularizationFactor = 0.5f; @@ -2233,11 +2218,7 @@ static void hrtfShGetHrtf( { if ( ivas_total_brate >= IVAS_96k ) { -#ifdef FIX_447_PARAMBIN_MASA_REGU_FAC reqularizationFactor = 0.4f; -#else - reqularizationFactor = 0.3f; -#endif } else if ( ivas_total_brate >= IVAS_80k ) { -- GitLab From 917d28244520ee11e49fc89ab329664b35fc71f3 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 20:14:18 +0200 Subject: [PATCH 274/331] [cleanup] accept FIX_441_SBA_PARAMBIN_GAINS --- lib_com/options.h | 1 - lib_dec/ivas_dec.c | 4 ---- 2 files changed, 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 05bd450eec..bab914b7de 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -158,7 +158,6 @@ #define FIX_439_OTR_PARAMS /* Philips: Issue 439: orientation tracking parameter aspects. */ -#define FIX_441_SBA_PARAMBIN_GAINS /* Nokia: Fix issue 441 by changing gains in SBA path of parametric binauralizer */ #define MC_PARAMUPMIX_MODE /* Dlb: Contribution 39: Multichannel Parametric Upmix */ #define FIX_469_BRSWITCH_PUPMIX /* Dlb: Fix issue 469 for Param Upmix bitrate switching */ diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index 3013c8541c..a7d3d92d08 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -467,7 +467,6 @@ ivas_error ivas_dec( } else if ( st_ivas->ivas_format == SBA_FORMAT && ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) { -#ifdef FIX_441_SBA_PARAMBIN_GAINS float gain; if ( nchan_remapped == 1 ) @@ -478,9 +477,6 @@ ivas_error ivas_dec( { gain = 1.3657f; } -#else - float gain = 0.8414f; /* Todo: Temporary gain for roughly matching the loudness. To be tuned later together with other outputs. */ -#endif for ( n = 0; n < nchan_remapped; n++ ) { -- GitLab From 2ae250347eee69edf808cc59f2bfe54954a5db91 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 20:15:08 +0200 Subject: [PATCH 275/331] [cleanup] accept MC_PARAMUPMIX_MODE --- lib_com/ivas_cnst.h | 6 ------ lib_com/ivas_mc_com.c | 7 ------- lib_com/ivas_prot.h | 6 ------ lib_com/ivas_rom_com.c | 2 -- lib_com/ivas_rom_com.h | 2 -- lib_com/ivas_td_decorr.c | 4 ---- lib_com/options.h | 1 - lib_dec/init_dec.c | 4 ---- lib_dec/ivas_dec.c | 27 ------------------------ lib_dec/ivas_init_dec.c | 16 --------------- lib_dec/ivas_jbm_dec.c | 20 ------------------ lib_dec/ivas_mc_paramupmix_dec.c | 2 -- lib_dec/ivas_mct_dec.c | 20 ------------------ lib_dec/ivas_out_setup_conversion.c | 16 --------------- lib_dec/ivas_output_config.c | 18 ---------------- lib_dec/ivas_rom_dec.c | 2 -- lib_dec/ivas_rom_dec.h | 2 -- lib_dec/ivas_stat_dec.h | 4 ---- lib_dec/ivas_stereo_switching_dec.c | 4 ---- lib_enc/ivas_enc.c | 2 -- lib_enc/ivas_enc_cov_handler.c | 2 -- lib_enc/ivas_init_enc.c | 8 -------- lib_enc/ivas_mc_paramupmix_enc.c | 2 -- lib_enc/ivas_mct_enc.c | 32 ----------------------------- lib_enc/ivas_rom_enc.c | 2 -- lib_enc/ivas_rom_enc.h | 2 -- lib_enc/ivas_stat_enc.h | 4 ---- 27 files changed, 217 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index f789ae2cbf..d3e87d5f68 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1284,12 +1284,8 @@ typedef enum MC_MODE_NONE, MC_MODE_MCT, MC_MODE_PARAMMC, -#ifndef MC_PARAMUPMIX_MODE - MC_MODE_MCMASA -#else MC_MODE_MCMASA, MC_MODE_PARAMUPMIX -#endif } MC_MODE; typedef enum @@ -1349,7 +1345,6 @@ typedef enum MCT_CHAN_MODE_IGNORE } MCT_CHAN_MODE; -#ifdef MC_PARAMUPMIX_MODE /*----------------------------------------------------------------------------------* * MC Param-Upmix Mode Constants *----------------------------------------------------------------------------------*/ @@ -1399,7 +1394,6 @@ typedef struct } HUFF_NODE_TABLE; -#endif /*----------------------------------------------------------------------------------* * Parametric MC Constants *----------------------------------------------------------------------------------*/ diff --git a/lib_com/ivas_mc_com.c b/lib_com/ivas_mc_com.c index 9bda9d49a4..0001f39704 100644 --- a/lib_com/ivas_mc_com.c +++ b/lib_com/ivas_mc_com.c @@ -103,12 +103,6 @@ MC_MODE ivas_mc_mode_select( { mc_mode = MC_MODE_MCMASA; } -#ifndef MC_PARAMUPMIX_MODE - else if ( total_brate < IVAS_192k ) - { - mc_mode = MC_MODE_PARAMMC; - } -#else else if ( total_brate < IVAS_160k ) { mc_mode = MC_MODE_PARAMMC; @@ -117,7 +111,6 @@ MC_MODE ivas_mc_mode_select( { mc_mode = MC_MODE_PARAMUPMIX; } -#endif break; default: assert( 0 && "LS Setup not supported or defined for MC mode!\n" ); diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 993a0cc427..d69f9ecfe0 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3955,7 +3955,6 @@ void calculate_hodirac_sector_parameters( ); #endif -#ifdef MC_PARAMUPMIX_MODE void ivas_mc_paramupmix_enc( Encoder_Struct *st_ivas, /* i/o: IVAS Encoder handle */ BSTR_ENC_HANDLE hMetaData, /* i/o: IVAS Metadata bitstream handle */ @@ -3996,7 +3995,6 @@ void ivas_mc_paramupmix_dec_read_BS( MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, /* i/o: decoder MC Param-Upmix handle */ int16_t *nb_bits /* o : number of bits written */ ); -#endif void ivas_param_mc_metadata_open( const MC_LS_SETUP mc_ls_setup, /* i : MC ls setup */ @@ -4869,14 +4867,12 @@ void ivas_td_decorr_process( const int16_t output_frame /* i : output frame length */ ); -#ifdef MC_PARAMUPMIX_MODE void ivas_td_decorr_APD_iir_filter( ivas_td_decorr_APD_filt_state_t *filter_state, float *pIn_out, const int16_t num_APD_sections, const int16_t length ); -#endif #define IVAS_CMULT_FLOAT( in1_re, in1_im, in2_re, in2_im, out1_re, out1_im ) \ out1_re = ( in1_re * in2_re ) - ( in1_im * in2_im ); MAC(1); MULT(1); \ @@ -5404,9 +5400,7 @@ void ivas_ls_setup_conversion_close( void ivas_ls_setup_conversion( Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ -#ifdef MC_PARAMUPMIX_MODE const int16_t input_chans, /* i : number of input channels to the renderer */ -#endif const int16_t output_frame, /* i : frame length */ #ifdef JBM_TSM_ON_TCS float *input[], /* i : LS input/output synthesis signal */ diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index 7672889019..28671a3080 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -6370,7 +6370,6 @@ const int16_t sns_1st_means_32k[2][16] = { } }; -#ifdef MC_PARAMUPMIX_MODE ACPL_QUANT_TABLE alpha_quant_table[] = { { /* Alfa Fine */ @@ -6466,6 +6465,5 @@ ACPL_QUANT_TABLE beta_quant_table[2][9] = } /* End Beta Coarse #5 */ } }; -#endif /* clang-format on */ diff --git a/lib_com/ivas_rom_com.h b/lib_com/ivas_rom_com.h index 539fb2488b..b6c1797c81 100644 --- a/lib_com/ivas_rom_com.h +++ b/lib_com/ivas_rom_com.h @@ -449,10 +449,8 @@ extern const int16_t ivas_sns_cdbks_side_tcx10_bits[]; extern const float *const ivas_sns_cdbks_side_tcx20[]; extern const float *const ivas_sns_cdbks_side_tcx10[]; -#ifdef MC_PARAMUPMIX_MODE extern ACPL_QUANT_TABLE alpha_quant_table[]; extern ACPL_QUANT_TABLE beta_quant_table[2][9]; -#endif /* means and codebooks for the split VQ in the 2-stage SNS VQ */ extern const int16_t sns_1st_cdbk[2][2][8 * 32]; diff --git a/lib_com/ivas_td_decorr.c b/lib_com/ivas_td_decorr.c index 6290027df6..9285e23a22 100644 --- a/lib_com/ivas_td_decorr.c +++ b/lib_com/ivas_td_decorr.c @@ -401,11 +401,7 @@ static void ivas_td_decorr_init( * * APD IIR filter *-----------------------------------------------------------------------------------------*/ -#ifdef MC_PARAMUPMIX_MODE void ivas_td_decorr_APD_iir_filter( -#else -static void ivas_td_decorr_APD_iir_filter( -#endif ivas_td_decorr_APD_filt_state_t *filter_state, float *pIn_out, const int16_t num_APD_sections, diff --git a/lib_com/options.h b/lib_com/options.h index bab914b7de..4cab93bd8f 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -159,7 +159,6 @@ -#define MC_PARAMUPMIX_MODE /* Dlb: Contribution 39: Multichannel Parametric Upmix */ #define FIX_469_BRSWITCH_PUPMIX /* Dlb: Fix issue 469 for Param Upmix bitrate switching */ #define HODIRAC /* FhG: Contribution 32: Sector-based HO-DirAC method for SBA at high bitrates */ diff --git a/lib_dec/init_dec.c b/lib_dec/init_dec.c index 0a28ca2a90..c9997f5782 100644 --- a/lib_dec/init_dec.c +++ b/lib_dec/init_dec.c @@ -702,11 +702,7 @@ ivas_error init_decoder( * FD-CNG decoder *-----------------------------------------------------------------*/ -#ifdef MC_PARAMUPMIX_MODE if ( ( st->element_mode == IVAS_CPE_MDCT || idchan == 0 ) && mc_mode != MC_MODE_MCT && mc_mode != MC_MODE_PARAMUPMIX ) -#else - if ( ( st->element_mode == IVAS_CPE_MDCT || idchan == 0 ) && mc_mode != MC_MODE_MCT ) -#endif { /* Create FD_CNG instance */ if ( ( error = createFdCngDec( &st->hFdCngDec ) ) != IVAS_ERR_OK ) diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index a7d3d92d08..a8e4449eca 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -150,17 +150,9 @@ ivas_error ivas_dec( if ( st_ivas->renderer_type == RENDERER_MC ) { #ifdef JBM_TSM_ON_TCS -#ifdef MC_PARAMUPMIX_MODE ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output ); #else - ivas_ls_setup_conversion( st_ivas, output_frame, p_output, p_output ); -#endif -#else -#ifdef MC_PARAMUPMIX_MODE ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, output ); -#else - ivas_ls_setup_conversion( st_ivas, output_frame, output ); -#endif #endif } } @@ -582,17 +574,9 @@ ivas_error ivas_dec( else if ( st_ivas->renderer_type == RENDERER_MC ) { #ifdef JBM_TSM_ON_TCS -#ifdef MC_PARAMUPMIX_MODE ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output ); #else - ivas_ls_setup_conversion( st_ivas, output_frame, p_output, p_output ); -#endif -#else -#ifdef MC_PARAMUPMIX_MODE ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, output ); -#else - ivas_ls_setup_conversion( st_ivas, output_frame, output ); -#endif #endif } else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) @@ -620,7 +604,6 @@ ivas_error ivas_dec( #endif } } -#ifdef MC_PARAMUPMIX_MODE else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) { ivas_lfe_dec( st_ivas->hLFE, st, output_frame, st_ivas->bfi, output_lfe_ch ); @@ -715,7 +698,6 @@ ivas_error ivas_dec( #endif } } -#endif else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) { /* read Parametric MC parameters from the bitstream */ @@ -746,18 +728,9 @@ ivas_error ivas_dec( if ( output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) { #ifdef JBM_TSM_ON_TCS -#ifdef MC_PARAMUPMIX_MODE ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output ); #else - ivas_ls_setup_conversion( st_ivas, output_frame, p_output, p_output ); -#endif -#else -#ifdef MC_PARAMUPMIX_MODE ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, output ); -#else - - ivas_ls_setup_conversion( st_ivas, output_frame, output ); -#endif #endif } else diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index f49e0ca7df..2c2fa6c9f4 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -1090,7 +1090,6 @@ ivas_error ivas_init_decoder( return error; } } -#ifdef MC_PARAMUPMIX_MODE else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) { /* init EFAP for custom LS setup */ @@ -1131,7 +1130,6 @@ ivas_error ivas_init_decoder( return error; } } -#endif else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) { /* init EFAP for custom LS setup */ @@ -1413,11 +1411,7 @@ ivas_error ivas_init_decoder( /*-----------------------------------------------------------------* * LFE handles for rendering after rendering to adjust LFE delay to binaural filter delay *-----------------------------------------------------------------*/ -#ifdef MC_PARAMUPMIX_MODE if ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) -#else - if ( st_ivas->mc_mode == MC_MODE_MCT ) -#endif { binauralization_delay_ns = st_ivas->binaural_latency_ns; if ( st_ivas->hBinRenderer != NULL ) @@ -1706,9 +1700,7 @@ void ivas_initialize_handles_dec( st_ivas->hMasa = NULL; st_ivas->hQMetaData = NULL; st_ivas->hMCT = NULL; -#ifdef MC_PARAMUPMIX_MODE st_ivas->hMCParamUpmix = NULL; -#endif st_ivas->hParamMC = NULL; st_ivas->hLFE = NULL; @@ -1853,10 +1845,8 @@ void ivas_destroy_dec( /* LFE handle */ ivas_lfe_dec_close( &( st_ivas->hLFE ) ); -#ifdef MC_PARAMUPMIX_MODE /* Param-Upmix MC handle */ ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) ); -#endif /* Parametric MC handle */ ivas_param_mc_dec_close( &st_ivas->hParamMC ); @@ -2107,13 +2097,11 @@ void ivas_init_dec_get_num_cldfb_instances( default: assert( 0 && "Renderer not handled for CLDFB reservation." ); } -#ifdef MC_PARAMUPMIX_MODE if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX && st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_MONO && st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_STEREO ) { *numCldfbAnalyses = max( MC_PARAMUPMIX_MIN_CLDFB, *numCldfbAnalyses ); *numCldfbSyntheses = max( MC_PARAMUPMIX_MIN_CLDFB, *numCldfbSyntheses ); } -#endif return; } @@ -2203,11 +2191,7 @@ static ivas_error doSanityChecks_IVAS( } #ifdef DEBUGGING -#ifdef MC_PARAMUPMIX_MODE if ( ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) && ( ( st_ivas->ivas_format != MC_FORMAT && st_ivas->ivas_format != ISM_FORMAT ) || output_config != AUDIO_CONFIG_BINAURAL || ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_PARAM ) || ( st_ivas->ivas_format == MC_FORMAT && ( st_ivas->mc_mode != MC_MODE_MCT && st_ivas->mc_mode != MC_MODE_PARAMUPMIX ) ) ) ) -#else - if ( ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) && ( ( st_ivas->ivas_format != MC_FORMAT && st_ivas->ivas_format != ISM_FORMAT ) || output_config != AUDIO_CONFIG_BINAURAL || ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_PARAM ) || ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode != MC_MODE_MCT ) ) ) -#endif { return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration: Time Domain object renderer not supported in this configuration" ); } diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index f33a5e01e6..5217954a68 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -131,11 +131,7 @@ ivas_error ivas_jbm_dec_tc( } if ( st_ivas->renderer_type == RENDERER_MC && st_ivas->hDecoderConfig->nchan_out == 1 ) { -#ifdef MC_PARAMUPMIX_MODE ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output ); -#else - ivas_ls_setup_conversion( st_ivas, output_frame, p_output, p_output ); -#endif } } else if ( st_ivas->ivas_format == ISM_FORMAT ) @@ -367,11 +363,7 @@ ivas_error ivas_jbm_dec_tc( { if ( st_ivas->renderer_type == RENDERER_MC ) { -#ifdef MC_PARAMUPMIX_MODE ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output ); -#else - ivas_ls_setup_conversion( st_ivas, output_frame, p_output, p_output ); -#endif } else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) { @@ -408,11 +400,7 @@ ivas_error ivas_jbm_dec_tc( /* Rendering */ if ( output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) { -#ifdef MC_PARAMUPMIX_MODE ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output ); -#else - ivas_ls_setup_conversion( st_ivas, output_frame, p_output, p_output ); -#endif } } else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) @@ -686,11 +674,7 @@ ivas_error ivas_jbm_dec_render( if ( st_ivas->renderer_type == RENDERER_MC ) { *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); -#ifdef MC_PARAMUPMIX_MODE ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, *nSamplesRendered, p_tc, p_output ); -#else - ivas_ls_setup_conversion( st_ivas, output_frame, p_output, p_output ); -#endif } } else if ( st_ivas->ivas_format == ISM_FORMAT ) @@ -822,11 +806,7 @@ ivas_error ivas_jbm_dec_render( else if ( st_ivas->renderer_type == RENDERER_MC ) { *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); -#ifdef MC_PARAMUPMIX_MODE ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, *nSamplesRendered, p_tc, p_output ); -#else - ivas_ls_setup_conversion( st_ivas, *nSamplesRendered, p_tc, p_output ); -#endif } else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) { diff --git a/lib_dec/ivas_mc_paramupmix_dec.c b/lib_dec/ivas_mc_paramupmix_dec.c index 5b04578c84..51f8537a92 100644 --- a/lib_dec/ivas_mc_paramupmix_dec.c +++ b/lib_dec/ivas_mc_paramupmix_dec.c @@ -49,7 +49,6 @@ #include "wmc_auto.h" #include "rom_dec.h" -#ifdef MC_PARAMUPMIX_MODE /*-----------------------------------------------------------------------* * Local function prototypes *-----------------------------------------------------------------------*/ @@ -693,4 +692,3 @@ static void get_ec_data( } } -#endif diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index 0ad5f46d85..fadeee8838 100755 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -277,11 +277,7 @@ ivas_error ivas_mct_dec( #endif } /* move channels after LFE to correct output for multi-channel MCT */ -#ifdef MC_PARAMUPMIX_MODE if ( st_ivas->ivas_format == MC_FORMAT && ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) ) -#else - if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT ) -#endif { float tmp[L_FRAME48k]; @@ -352,12 +348,10 @@ ivas_error create_mct_dec( { hMCT->nchan_out_woLFE = st_ivas->nchan_transport - st_ivas->hTransSetup.num_lfe; } -#ifdef MC_PARAMUPMIX_MODE else if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) { hMCT->nchan_out_woLFE = st_ivas->nchan_transport - st_ivas->hTransSetup.num_lfe; } -#endif else { assert( !"IVAS format currently not supported for MCT" ); @@ -463,12 +457,10 @@ ivas_error mct_dec_reconfigure( { hMCT->nchan_out_woLFE = st_ivas->nchan_transport - st_ivas->hTransSetup.num_lfe; } -#ifdef MC_PARAMUPMIX_MODE else if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) { hMCT->nchan_out_woLFE = st_ivas->nchan_transport - st_ivas->hTransSetup.num_lfe; } -#endif else { assert( !"IVAS format currently not supported for MCT" ); @@ -816,7 +808,6 @@ static ivas_error ivas_mc_dec_reconfig( ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion ); } -#ifdef MC_PARAMUPMIX_MODE #ifdef FIX_469_BRSWITCH_PUPMIX if ( last_mc_mode == MC_MODE_PARAMUPMIX ) { @@ -825,7 +816,6 @@ static ivas_error ivas_mc_dec_reconfig( } #else ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) ); -#endif #endif /* De-allocate McMasa-related handles */ ivas_masa_dec_close( &( st_ivas->hMasa ) ); @@ -849,7 +839,6 @@ static ivas_error ivas_mc_dec_reconfig( } } } -#ifdef MC_PARAMUPMIX_MODE else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) { st_ivas->nSCE = 0; @@ -890,7 +879,6 @@ static ivas_error ivas_mc_dec_reconfig( assert( 0 ); } } -#endif else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) { if ( last_mc_mode != MC_MODE_PARAMMC ) @@ -962,9 +950,7 @@ static ivas_error ivas_mc_dec_reconfig( ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion ); } -#ifdef MC_PARAMUPMIX_MODE ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) ); -#endif if ( st_ivas->hParamMC != NULL ) { @@ -1059,13 +1045,11 @@ static ivas_error ivas_mc_dec_reconfig( new_brate_SCE = 0; new_brate_CPE = ( ivas_total_brate / ( st_ivas->nchan_transport - 1 ) ) * CPE_CHANNELS; } -#ifdef MC_PARAMUPMIX_MODE else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) { new_brate_SCE = 0; new_brate_CPE = ( ivas_total_brate / ( st_ivas->nchan_transport - 1 ) ) * CPE_CHANNELS; } -#endif else { new_brate_SCE = 0; /* ivas_total_brate / st_ivas->nchan_transport;*/ @@ -1106,11 +1090,7 @@ static ivas_error ivas_mc_dec_reconfig( /*-----------------------------------------------------------------* * Allocate the LFE handle that is coded seperately after the allocation of the core coders *-----------------------------------------------------------------*/ -#ifdef MC_PARAMUPMIX_MODE if ( ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) && st_ivas->hLFE == NULL ) -#else - if ( st_ivas->mc_mode == MC_MODE_MCT && st_ivas->hLFE == NULL ) -#endif { int32_t binauralization_delay_ns = st_ivas->binaural_latency_ns; if ( st_ivas->hBinRenderer != NULL ) diff --git a/lib_dec/ivas_out_setup_conversion.c b/lib_dec/ivas_out_setup_conversion.c index 3f95113f60..196638c729 100644 --- a/lib_dec/ivas_out_setup_conversion.c +++ b/lib_dec/ivas_out_setup_conversion.c @@ -312,7 +312,6 @@ ivas_error ivas_ls_setup_conversion_open( int16_t output_frame; int32_t output_Fs; int16_t nchan_out; -#ifdef MC_PARAMUPMIX_MODE int16_t paramUpmixMonoStereo; if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX && ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) ) @@ -323,7 +322,6 @@ ivas_error ivas_ls_setup_conversion_open( { paramUpmixMonoStereo = FALSE; } -#endif output_Fs = st_ivas->hDecoderConfig->output_Fs; nchan_out = st_ivas->hDecoderConfig->nchan_out; output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC ); @@ -362,7 +360,6 @@ ivas_error ivas_ls_setup_conversion_open( } else { -#ifdef MC_PARAMUPMIX_MODE if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) { if ( paramUpmixMonoStereo == TRUE ) @@ -378,9 +375,6 @@ ivas_error ivas_ls_setup_conversion_open( { inChannels = st_ivas->nchan_transport; } -#else - inChannels = st_ivas->nchan_transport; -#endif /*Initialization of MDCT bands with TCX20 resolution */ ivas_lssetupconversion_mdct_init_bands( output_frame, TCX_20_CORE, &hLsSetUpConversion->sfbOffset[0], &hLsSetUpConversion->sfbCnt ); @@ -427,7 +421,6 @@ ivas_error ivas_ls_setup_conversion_open( { if ( st_ivas->transport_config != AUDIO_CONFIG_INVALID ) { -#ifdef MC_PARAMUPMIX_MODE if ( paramUpmixMonoStereo == TRUE ) { get_ls_conversion_matrix( hLsSetUpConversion, AUDIO_CONFIG_5_1_2, st_ivas->hDecoderConfig->output_config ); @@ -436,9 +429,6 @@ ivas_error ivas_ls_setup_conversion_open( { get_ls_conversion_matrix( hLsSetUpConversion, st_ivas->transport_config, st_ivas->hDecoderConfig->output_config ); } -#else - get_ls_conversion_matrix( hLsSetUpConversion, st_ivas->transport_config, st_ivas->hDecoderConfig->output_config ); -#endif } else { @@ -506,9 +496,7 @@ void ivas_ls_setup_conversion_close( void ivas_ls_setup_conversion( Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ -#ifdef MC_PARAMUPMIX_MODE const int16_t input_chans, /* i : number of input channels to the renderer */ -#endif const int16_t output_frame, /* i : frame length */ #ifdef JBM_TSM_ON_TCS float *input[], /* i : LS input/output synthesis signal */ @@ -530,11 +518,7 @@ void ivas_ls_setup_conversion( for ( chOutIdx = 0; chOutIdx < st_ivas->hDecoderConfig->nchan_out; chOutIdx++ ) { set_zero( output_tmp[chOutIdx], output_frame ); -#ifdef MC_PARAMUPMIX_MODE for ( chInIdx = 0; chInIdx < input_chans; chInIdx++ ) -#else - for ( chInIdx = 0; chInIdx < st_ivas->nchan_transport; chInIdx++ ) -#endif { dmxCoeff = hLsSetUpConversion->dmxMtx[chInIdx][chOutIdx]; diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index ad831baa6b..2421c6730c 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -195,29 +195,17 @@ void ivas_renderer_select( *internal_config = transport_config; if ( output_config == AUDIO_CONFIG_BINAURAL ) { -#ifdef MC_PARAMUPMIX_MODE #ifdef DEBUGGING if ( ( ( ( st_ivas->transport_config == AUDIO_CONFIG_5_1 || st_ivas->transport_config == AUDIO_CONFIG_7_1 ) && st_ivas->hDecoderConfig->Opt_Headrotation ) || ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) ) && ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) && !( st_ivas->hDecoderConfig->force_rend == FORCE_CLDFB_RENDERER ) ) #else if ( ( st_ivas->transport_config == AUDIO_CONFIG_5_1 || st_ivas->transport_config == AUDIO_CONFIG_7_1 ) && st_ivas->hDecoderConfig->Opt_Headrotation && ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) ) -#endif -#else -#ifdef DEBUGGING - if ( ( ( ( st_ivas->transport_config == AUDIO_CONFIG_5_1 || st_ivas->transport_config == AUDIO_CONFIG_7_1 ) && st_ivas->hDecoderConfig->Opt_Headrotation ) || ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) ) && ( st_ivas->mc_mode == MC_MODE_MCT ) && !( st_ivas->hDecoderConfig->force_rend == FORCE_CLDFB_RENDERER ) ) -#else - if ( ( st_ivas->transport_config == AUDIO_CONFIG_5_1 || st_ivas->transport_config == AUDIO_CONFIG_7_1 ) && st_ivas->hDecoderConfig->Opt_Headrotation && ( st_ivas->mc_mode == MC_MODE_MCT ) ) -#endif #endif { *renderer_type = RENDERER_BINAURAL_OBJECTS_TD; } else { -#ifdef MC_PARAMUPMIX_MODE if ( ( st_ivas->mc_mode == MC_MODE_MCT ) || ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) ) -#else - if ( st_ivas->mc_mode == MC_MODE_MCT ) -#endif { *renderer_type = RENDERER_BINAURAL_MIXER_CONV; } @@ -245,11 +233,7 @@ void ivas_renderer_select( } else /* AUDIO_CONFIG_BINAURAL_ROOM */ { -#ifdef MC_PARAMUPMIX_MODE if ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) -#else - if ( st_ivas->mc_mode == MC_MODE_MCT ) -#endif { *renderer_type = RENDERER_BINAURAL_MIXER_CONV_ROOM; } @@ -390,7 +374,6 @@ void ivas_renderer_select( *renderer_type = RENDERER_SBA_LINEAR_ENC; } } -#ifdef MC_PARAMUPMIX_MODE else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) { *internal_config = transport_config; @@ -406,7 +389,6 @@ void ivas_renderer_select( } } } -#endif else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) { if ( output_config == AUDIO_CONFIG_FOA || output_config == AUDIO_CONFIG_HOA2 || output_config == AUDIO_CONFIG_HOA3 ) diff --git a/lib_dec/ivas_rom_dec.c b/lib_dec/ivas_rom_dec.c index 217de22406..04737f6df1 100644 --- a/lib_dec/ivas_rom_dec.c +++ b/lib_dec/ivas_rom_dec.c @@ -550,7 +550,6 @@ const float dmxmtx_table[BINAURAL_CHANNELS][11] = /* clang-format on */ -#ifdef MC_PARAMUPMIX_MODE const int16_t huff_nodes_first_band_alpha[32][2] = { /* Alpha Fine Huffman table df0 */ { -17, 1 }, @@ -838,4 +837,3 @@ HUFF_NODE_TABLE huff_nodes_dt = { { huff_nodes_beta_1D_DT, huff_nodes_beta_1D_DT_coarse } }; -#endif diff --git a/lib_dec/ivas_rom_dec.h b/lib_dec/ivas_rom_dec.h index 956882aa26..39485c8084 100644 --- a/lib_dec/ivas_rom_dec.h +++ b/lib_dec/ivas_rom_dec.h @@ -125,7 +125,6 @@ extern const int16_t sba_map_tc[8]; extern const float dmxmtx_table[BINAURAL_CHANNELS][11]; -#ifdef MC_PARAMUPMIX_MODE extern const int16_t huff_nodes_first_band_alpha[32][2]; extern const int16_t huff_nodes_first_band_alpha_coarse[16][2]; @@ -147,6 +146,5 @@ extern const int16_t huff_nodes_beta_1D_DT_coarse[8][2]; extern const HUFF_NODE_TABLE huff_nodes_df0; extern const HUFF_NODE_TABLE huff_nodes_df; extern const HUFF_NODE_TABLE huff_nodes_dt; -#endif #endif diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index c10af2f657..d4cedaaf38 100755 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -805,7 +805,6 @@ typedef struct ivas_param_mc_dec_data_structure } PARAM_MC_DEC_DATA, *PARAM_MC_DEC_HANDLE; -#ifdef MC_PARAMUPMIX_MODE /*----------------------------------------------------------------------------------* * MC Param-Upmix Mode structures *----------------------------------------------------------------------------------*/ @@ -825,7 +824,6 @@ typedef struct ivas_mc_paramupmix_dec_data_structure float *pcm_delay[MC_PARAMUPMIX_MAX_TRANSPORT_CHANS]; } MC_PARAMUPMIX_DEC_DATA, *MC_PARAMUPMIX_DEC_HANDLE; -#endif /*------------------------------------------------------------------------------------------* * SPAR decoder structures *------------------------------------------------------------------------------------------*/ @@ -1307,9 +1305,7 @@ typedef struct Decoder_Struct IVAS_QMETADATA_HANDLE hQMetaData; /* q_metadata handle */ MCT_DEC_HANDLE hMCT; /* MCT handle */ PARAM_MC_DEC_HANDLE hParamMC; /* Parametric MC handle */ -#ifdef MC_PARAMUPMIX_MODE MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix; /* MC Param-Upmix handle */ -#endif MASA_DECODER_HANDLE hMasa; /* MASA handle */ LFE_DEC_HANDLE hLFE; /* LFE handle */ diff --git a/lib_dec/ivas_stereo_switching_dec.c b/lib_dec/ivas_stereo_switching_dec.c index 898908c96e..88d82ac17b 100644 --- a/lib_dec/ivas_stereo_switching_dec.c +++ b/lib_dec/ivas_stereo_switching_dec.c @@ -963,11 +963,7 @@ ivas_error stereo_memory_dec( if ( ivas_format == MC_FORMAT && hCPE->element_mode == IVAS_CPE_MDCT ) { -#ifdef MC_PARAMUPMIX_MODE if ( mc_mode == MC_MODE_MCT || mc_mode == MC_MODE_PARAMUPMIX ) -#else - if ( mc_mode == MC_MODE_MCT ) -#endif { /* deallocate the FdCNG handle */ for ( i = 0; i < CPE_CHANNELS; ++i ) diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index 0faa86af3a..09d869a9dc 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -308,7 +308,6 @@ ivas_error ivas_enc( return error; } } -#ifdef MC_PARAMUPMIX_MODE else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) { @@ -323,7 +322,6 @@ ivas_error ivas_enc( return error; } } -#endif else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) { /* encode Parametric MC parameters and write bitstream */ diff --git a/lib_enc/ivas_enc_cov_handler.c b/lib_enc/ivas_enc_cov_handler.c index 6575d751a9..4281bc112a 100644 --- a/lib_enc/ivas_enc_cov_handler.c +++ b/lib_enc/ivas_enc_cov_handler.c @@ -92,13 +92,11 @@ ivas_error ivas_spar_covar_enc_open( cov_smooth_cfg.max_bands = IVAS_MAX_NUM_BANDS; cov_smooth_cfg.max_update_rate = MAX_UPDATE_RATE; cov_smooth_cfg.min_pool_size = MIN_POOL_SIZE; -#ifdef MC_PARAMUPMIX_MODE if ( nchan_inp == 3 ) /* to discriminate between SPAR and mc there could be a better solution */ { cov_smooth_cfg.max_update_rate = 1.0f; cov_smooth_cfg.min_pool_size = 20; } -#endif if ( ( error = ivas_spar_covar_smooth_enc_open( &hCovState->pCov_state, &cov_smooth_cfg, pFb, nchan_inp, ivas_total_brate ) ) != IVAS_ERR_OK ) { diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index 8070efe3da..d7a3d9ac30 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -203,12 +203,10 @@ int16_t getNumChanAnalysis( { n = st_ivas->hEncoderConfig->nchan_inp; } -#ifdef MC_PARAMUPMIX_MODE else if ( st_ivas->hEncoderConfig->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) { n = st_ivas->hEncoderConfig->nchan_inp; } -#endif else if ( st_ivas->hEncoderConfig->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_PARAM ) { n = st_ivas->hEncoderConfig->nchan_inp; @@ -309,10 +307,8 @@ void ivas_initialize_handles_enc( /* MCT handle */ st_ivas->hMCT = NULL; -#ifdef MC_PARAMUPMIX_MODE /* MC Param-Upmix handle */ st_ivas->hMCParamUpmix = NULL; -#endif /* Parametric MC handle */ st_ivas->hParamMC = NULL; @@ -661,7 +657,6 @@ ivas_error ivas_init_encoder( st_ivas->nchan_transport = ivas_mc_ls_setup_get_num_channels( st_ivas->hEncoderConfig->mc_input_setup ); } -#ifdef MC_PARAMUPMIX_MODE else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) { st_ivas->nSCE = 0; @@ -707,7 +702,6 @@ ivas_error ivas_init_encoder( return error; } } -#endif else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) { if ( ( error = ivas_param_mc_enc_open( st_ivas ) ) != IVAS_ERR_OK ) @@ -1100,10 +1094,8 @@ void ivas_destroy_enc( /* LFE handle */ ivas_lfe_enc_close( &( st_ivas->hLFE ) ); -#ifdef MC_PARAMUPMIX_MODE /* Param-Upmix MC handle */ ivas_mc_paramupmix_enc_close( &( st_ivas->hMCParamUpmix ), st_ivas->hEncoderConfig->input_Fs ); -#endif /* Parametric MC handle */ ivas_param_mc_enc_close( &( st_ivas->hParamMC ), st_ivas->hEncoderConfig->input_Fs ); diff --git a/lib_enc/ivas_mc_paramupmix_enc.c b/lib_enc/ivas_mc_paramupmix_enc.c index 6363ee3b13..71a157e92c 100644 --- a/lib_enc/ivas_mc_paramupmix_enc.c +++ b/lib_enc/ivas_mc_paramupmix_enc.c @@ -49,7 +49,6 @@ #endif #include "wmc_auto.h" -#ifdef MC_PARAMUPMIX_MODE /*------------------------------------------------------------------------- * Local function prototypes *------------------------------------------------------------------------*/ @@ -845,4 +844,3 @@ static void ivas_mc_paramupmix_param_est_enc( return; } -#endif diff --git a/lib_enc/ivas_mct_enc.c b/lib_enc/ivas_mct_enc.c index b9f55e25e1..af743deaa1 100644 --- a/lib_enc/ivas_mct_enc.c +++ b/lib_enc/ivas_mct_enc.c @@ -116,11 +116,7 @@ static void map_input_to_cpe_channels( pdata[i] = data[n]; i++; } -#ifdef MC_PARAMUPMIX_MODE if ( st_ivas->hEncoderConfig->ivas_format == MC_FORMAT && ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) ) -#else - if ( st_ivas->hEncoderConfig->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT ) -#endif { for ( n = LFE_CHANNEL + 1; n < st_ivas->nchan_transport; n++ ) { @@ -139,11 +135,7 @@ static void map_input_to_cpe_channels( } /* odd channel CPE*/ -#ifdef MC_PARAMUPMIX_MODE if ( ( st_ivas->nchan_transport < st_ivas->nCPE * CPE_CHANNELS ) || ( ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) && st_ivas->hMCT->nchan_out_woLFE < st_ivas->nCPE * CPE_CHANNELS ) ) -#else - if ( ( st_ivas->nchan_transport < st_ivas->nCPE * CPE_CHANNELS ) || ( st_ivas->mc_mode == MC_MODE_MCT && st_ivas->hMCT->nchan_out_woLFE < st_ivas->nCPE * CPE_CHANNELS ) ) -#endif { pdata[st_ivas->nCPE * CPE_CHANNELS - 1] = NULL; } @@ -241,19 +233,11 @@ ivas_error ivas_mct_enc( } /* joint MCT encoding */ -#ifdef MC_PARAMUPMIX_MODE ivas_mct_core_enc( ivas_format, hMCT, st_ivas->hCPE, hMCT->nchan_out_woLFE, ivas_total_brate, switch_bw, ( ivas_format == MC_FORMAT && ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) ) ? (int16_t) st_ivas->hLFE->lfe_bits : 0, st_ivas->hEncoderConfig->sba_order ); -#else - ivas_mct_core_enc( ivas_format, hMCT, st_ivas->hCPE, - hMCT->nchan_out_woLFE, - ivas_total_brate, switch_bw, - ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT ) ? (int16_t) st_ivas->hLFE->lfe_bits : 0, - st_ivas->hEncoderConfig->sba_order ); -#endif /* Spectrum quantization and coding */ for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) @@ -331,12 +315,10 @@ ivas_error create_mct_enc( { hMCT->nchan_out_woLFE = ivas_param_mc_getNumTransportChannels( ivas_total_brate, st_ivas->hEncoderConfig->mc_input_setup ); } -#ifdef MC_PARAMUPMIX_MODE else if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) { hMCT->nchan_out_woLFE = ivas_mc_paramupmix_getNumTransportChannels(); } -#endif else if ( ivas_format == SBA_FORMAT ) { hMCT->nchan_out_woLFE = ivas_sba_get_nchan( st_ivas->sba_analysis_order, st_ivas->hEncoderConfig->sba_planar ); @@ -445,12 +427,10 @@ ivas_error mct_enc_reconfigure( { hMCT->nchan_out_woLFE = st_ivas->hEncoderConfig->nchan_inp - 1; /* LFE channel is coded separately */ } -#ifdef MC_PARAMUPMIX_MODE else if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) { hMCT->nchan_out_woLFE = ivas_mc_paramupmix_getNumTransportChannels(); } -#endif else if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMMC ) { hMCT->nchan_out_woLFE = ivas_param_mc_getNumTransportChannels( ivas_total_brate, st_ivas->hEncoderConfig->mc_input_setup ); @@ -690,13 +670,11 @@ static ivas_error ivas_mc_enc_reconfig( if ( last_mc_mode != MC_MODE_MCT ) { -#ifdef MC_PARAMUPMIX_MODE if ( st_ivas->hLFE != NULL ) { /* LFE handle */ ivas_lfe_enc_close( &( st_ivas->hLFE ) ); } -#endif /* create LFE handle */ if ( ( error = ivas_create_lfe_enc( &st_ivas->hLFE, st_ivas->hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) { @@ -706,9 +684,7 @@ static ivas_error ivas_mc_enc_reconfig( /*De-allocate handles for other MC modes*/ ivas_param_mc_enc_close( &( st_ivas->hParamMC ), st_ivas->hEncoderConfig->input_Fs ); -#ifdef MC_PARAMUPMIX_MODE ivas_mc_paramupmix_enc_close( &( st_ivas->hMCParamUpmix ), st_ivas->hEncoderConfig->input_Fs ); -#endif /* De-allocate McMasa-related handles */ ivas_mcmasa_enc_close( &( st_ivas->hMcMasa ), st_ivas->hEncoderConfig->input_Fs ); @@ -717,7 +693,6 @@ static ivas_error ivas_mc_enc_reconfig( ivas_qmetadata_close( &st_ivas->hQMetaData ); } } -#ifdef MC_PARAMUPMIX_MODE else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) { st_ivas->nSCE = 0; @@ -762,7 +737,6 @@ static ivas_error ivas_mc_enc_reconfig( ivas_qmetadata_close( &st_ivas->hQMetaData ); } -#endif else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) { if ( last_mc_mode != MC_MODE_PARAMMC ) @@ -788,14 +762,12 @@ static ivas_error ivas_mc_enc_reconfig( ivas_masa_enc_close( &( st_ivas->hMasa ) ); st_ivas->hMasa = NULL; } -#ifdef MC_PARAMUPMIX_MODE ivas_mc_paramupmix_enc_close( &( st_ivas->hMCParamUpmix ), st_ivas->hEncoderConfig->input_Fs ); if ( last_mc_mode == MC_MODE_PARAMUPMIX && st_ivas->hLFE != NULL ) { /* LFE handle */ ivas_lfe_enc_close( &( st_ivas->hLFE ) ); } -#endif ivas_qmetadata_close( &st_ivas->hQMetaData ); @@ -842,14 +814,12 @@ static ivas_error ivas_mc_enc_reconfig( } ivas_param_mc_enc_close( &( st_ivas->hParamMC ), st_ivas->hEncoderConfig->input_Fs ); -#ifdef MC_PARAMUPMIX_MODE ivas_mc_paramupmix_enc_close( &( st_ivas->hMCParamUpmix ), st_ivas->hEncoderConfig->input_Fs ); if ( last_mc_mode == MC_MODE_PARAMUPMIX && st_ivas->hLFE != NULL ) { /* LFE handle */ ivas_lfe_enc_close( &( st_ivas->hLFE ) ); } -#endif if ( last_mc_mode == MC_MODE_MCT ) { @@ -924,13 +894,11 @@ static ivas_error ivas_mc_enc_reconfig( new_brate_SCE = 0; new_brate_CPE = ( st_ivas->hEncoderConfig->ivas_total_brate / ( st_ivas->nchan_transport - 1 ) ) * CPE_CHANNELS; } -#ifdef MC_PARAMUPMIX_MODE else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) { new_brate_SCE = 0; new_brate_CPE = ( st_ivas->hEncoderConfig->ivas_total_brate / ( st_ivas->nchan_transport - 1 ) ) * CPE_CHANNELS; } -#endif else { new_brate_SCE = 0; /*st_ivas->hEncoderConfig->ivas_total_brate / st_ivas->nchan_transport;*/ diff --git a/lib_enc/ivas_rom_enc.c b/lib_enc/ivas_rom_enc.c index 3a26ce03e5..4565100883 100644 --- a/lib_enc/ivas_rom_enc.c +++ b/lib_enc/ivas_rom_enc.c @@ -723,7 +723,6 @@ const float Stereo_dmx_wnd_coef_48k[L_FRAME48k] = { }; -#ifdef MC_PARAMUPMIX_MODE const HUFF_TABLE huff_alpha_table[2] = { { /* Alfa Fine */ @@ -838,6 +837,5 @@ const HUFF_TABLE huff_beta_table[2] = const int16_t mc_paramupmix_fb_remix_order[4] = {0, 1, 2, 3}; -#endif /* clang-format on */ diff --git a/lib_enc/ivas_rom_enc.h b/lib_enc/ivas_rom_enc.h index 9fe2015eee..c208259ed6 100644 --- a/lib_enc/ivas_rom_enc.h +++ b/lib_enc/ivas_rom_enc.h @@ -126,10 +126,8 @@ extern const float Stereo_dmx_s_wnd_coef_48k[L_FRAME48k >> 4]; extern const float Stereo_dmx_wnd_coef_32k[L_FRAME32k]; extern const float Stereo_dmx_wnd_coef_48k[L_FRAME48k]; -#ifdef MC_PARAMUPMIX_MODE extern const HUFF_TABLE huff_alpha_table[2]; extern const HUFF_TABLE huff_beta_table[2]; extern const int16_t mc_paramupmix_fb_remix_order[4]; -#endif #endif diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index c063616b4b..7f0c327032 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -729,7 +729,6 @@ typedef struct ivas_param_mc_enc_data_structure } PARAM_MC_ENC_DATA, *PARAM_MC_ENC_HANDLE; -#ifdef MC_PARAMUPMIX_MODE /*----------------------------------------------------------------------------------* * MC ParamUpmix Mode encoder structures *----------------------------------------------------------------------------------*/ @@ -745,7 +744,6 @@ typedef struct ivas_mc_paramupmix_enc_data_structure int32_t beta_quant_prev[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; bool first_frame; } MC_PARAMUPMIX_ENC_DATA, *MC_PARAMUPMIX_ENC_HANDLE; -#endif /*----------------------------------------------------------------------------------* * MASA encoder structures @@ -1123,9 +1121,7 @@ typedef struct IVAS_QMETADATA_HANDLE hQMetaData; /* Metadata handle for q_metadata parametric spatial coding DirAC/MASA*/ MCT_ENC_HANDLE hMCT; /* MCT handle */ PARAM_MC_ENC_HANDLE hParamMC; /* Parametric MC handle */ -#ifdef MC_PARAMUPMIX_MODE MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix; /* MC Param-Upmix handle */ -#endif MCMASA_ENC_HANDLE hMcMasa; /* Multi-channel MASA data handle */ LFE_ENC_HANDLE hLFE; /* LFE data handle */ -- GitLab From 3dc9f82fe0f97644b2a4400b54ce8cab49407e64 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 20:15:48 +0200 Subject: [PATCH 276/331] [cleanup] accept FIX_469_BRSWITCH_PUPMIX --- lib_com/options.h | 1 - lib_dec/ivas_mct_dec.c | 4 ---- 2 files changed, 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 4cab93bd8f..abda703ae7 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -159,7 +159,6 @@ -#define FIX_469_BRSWITCH_PUPMIX /* Dlb: Fix issue 469 for Param Upmix bitrate switching */ #define HODIRAC /* FhG: Contribution 32: Sector-based HO-DirAC method for SBA at high bitrates */ #define DIRAC_ALLOC_HARM /* VA: harmonize DirAC parameters allocation/deallocation */ diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index fadeee8838..6eada0e18b 100755 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -808,15 +808,11 @@ static ivas_error ivas_mc_dec_reconfig( ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion ); } -#ifdef FIX_469_BRSWITCH_PUPMIX if ( last_mc_mode == MC_MODE_PARAMUPMIX ) { ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) ); ivas_ls_setup_conversion_close( &( st_ivas->hLsSetUpConversion ) ); } -#else - ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) ); -#endif /* De-allocate McMasa-related handles */ ivas_masa_dec_close( &( st_ivas->hMasa ) ); ivas_qmetadata_close( &st_ivas->hQMetaData ); -- GitLab From cdd260fa9939e6b9527db4565906b5365c91c54e Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 20:16:28 +0200 Subject: [PATCH 277/331] [cleanup] accept HODIRAC --- lib_com/ivas_cnst.h | 16 --- lib_com/ivas_dirac_com.c | 22 +--- lib_com/ivas_fb_mixer.c | 46 ------- lib_com/ivas_prot.h | 60 +-------- lib_com/ivas_qmetadata_com.c | 6 - lib_com/ivas_rom_com.c | 28 ---- lib_com/ivas_rom_com.h | 18 --- lib_com/ivas_sba_config.c | 25 ---- lib_com/ivas_spar_com.c | 4 - lib_com/ivas_stat_com.h | 2 - lib_com/options.h | 1 - lib_dec/ivas_dec.c | 6 - lib_dec/ivas_dirac_dec.c | 139 -------------------- lib_dec/ivas_dirac_output_synthesis_dec.c | 80 +----------- lib_dec/ivas_init_dec.c | 6 - lib_dec/ivas_jbm_dec.c | 6 - lib_dec/ivas_masa_dec.c | 4 - lib_dec/ivas_output_config.c | 2 - lib_dec/ivas_qmetadata_dec.c | 12 -- lib_dec/ivas_rom_dec.c | 7 - lib_dec/ivas_rom_dec.h | 4 - lib_dec/ivas_sba_dec.c | 16 --- lib_dec/ivas_sba_rendering_internal.c | 4 - lib_dec/ivas_spar_decoder.c | 120 ----------------- lib_dec/ivas_spar_md_dec.c | 150 ---------------------- lib_dec/ivas_stat_dec.h | 4 - lib_enc/ivas_dirac_enc.c | 57 -------- lib_enc/ivas_enc.c | 6 - lib_enc/ivas_enc_cov_handler.c | 21 --- lib_enc/ivas_init_enc.c | 8 -- lib_enc/ivas_ism_param_enc.c | 6 - lib_enc/ivas_masa_enc.c | 2 - lib_enc/ivas_mc_param_enc.c | 8 -- lib_enc/ivas_mc_paramupmix_enc.c | 12 -- lib_enc/ivas_mcmasa_enc.c | 21 --- lib_enc/ivas_qmetadata_enc.c | 28 ---- lib_enc/ivas_sba_enc.c | 7 - lib_enc/ivas_spar_encoder.c | 55 -------- lib_enc/ivas_spar_md_enc.c | 34 ----- lib_enc/ivas_stat_enc.h | 7 - lib_rend/lib_rend.c | 6 - 41 files changed, 3 insertions(+), 1063 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index d3e87d5f68..6f42b17a40 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -172,9 +172,7 @@ typedef enum #define BINAURAL_CHANNELS 2 /* number of channels for binaural output configuration */ #define CPE_CHANNELS 2 /* number of CPE (stereo) channels */ #define FOA_CHANNELS 4 /* number of FOA channels */ -#ifdef HODIRAC #define HOA2_CHANNELS 9 -#endif #define MAX_NUM_OBJECTS 4 /* max. number of audio objects */ @@ -933,11 +931,7 @@ typedef enum * DirAC Constants *----------------------------------------------------------------------------------*/ -#ifdef HODIRAC #define DIRAC_MAX_ANA_CHANS 11 /* Maximum number of channels for DirAC analysis */ -#else -#define DIRAC_MAX_ANA_CHANS FOA_CHANNELS /* Maximum number of channels for DirAC analysis */ -#endif #define DIRAC_NUM_DIMS 3 /* number of directions to estimate (X,Y,Z) */ #define DIRAC_MAX_NBANDS 12 /* Maximum number of frequency bands for the DirAC Side Parameter decoding */ @@ -951,10 +945,8 @@ typedef enum #define DIRAC_NO_FB_BANDS_MAX MDFT_FB_BANDS_240 #define DELAY_DIRAC_ENC_CMP_NS_PARAM_ISM ( IVAS_ENC_DELAY_NS + IVAS_DEC_DELAY_NS ) /* == 12 ms */ -#ifdef HODIRAC #define DIRAC_HO_NUMSECTORS 2 #define NUM_ANA_SECTORS 2 -#endif /* DirAC renderer setup */ @@ -1014,16 +1006,10 @@ typedef enum #define SPAR_CONFIG_BW FB -#ifndef HODIRAC -#define IVAS_SPAR_MAX_CH (FOA_CHANNELS + 2 * ( IVAS_MAX_SBA_ORDER - 1 )) /* FOA + planar HOA */ -#else #define IVAS_SPAR_MAX_CH ((( IVAS_MAX_SBA_ORDER ) * ( IVAS_MAX_SBA_ORDER )) + 2) /* HOA2 + pHOA3*/ #define IVAS_HBR_MAX_DECOR_CHS (2) -#endif -#ifdef HODIRAC #define IVAS_SPAR_MAX_FB_IN_CHAN 11 -#endif #define IVAS_SPAR_P_LOWERTRI ((IVAS_SPAR_MAX_CH - 1) * (IVAS_SPAR_MAX_CH - 2)) >> 1 #define IVAS_SPAR_MAX_C_COEFF (IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS) * ( IVAS_SPAR_MAX_DMX_CHS - 1) @@ -1232,9 +1218,7 @@ enum #define MASA_ANGLE_TOLERANCE 0.5f #define MASA_LIMIT_NO_BANDS_SUR_COH 8 #define MINIMUM_BIT_BUDGET_NORMAL_META 100 -#ifdef HODIRAC #define DIFF_DFRATIO_2BIT_LIMIT_IDX_HODIRAC 4 -#endif #define DIFF_DFRATIO_2BIT_LIMIT_IDX 3 #define DIFF_DFRATIO_1BIT_LIMIT_IDX 6 diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index 42e7c3343f..a5964edd66 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -49,7 +49,6 @@ static uint16_t deindex_sph_idx_general( const int16_t idx_sph, const int16_t no_bits, float *theta_dec, float *phi_dec, uint16_t *p_id_phi, const MC_LS_SETUP mc_format ); -#ifdef HODIRAC /*------------------------------------------------------------------------- * ivas_get_hodirac_flag() * @@ -71,7 +70,6 @@ int16_t ivas_get_hodirac_flag( return 0; } } -#endif /*------------------------------------------------------------------------- @@ -159,12 +157,10 @@ ivas_error ivas_dirac_config( spar_dirac_split_band = min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); -#ifdef HODIRAC if ( ivas_get_hodirac_flag( ivas_total_brate, sba_order ) ) { spar_dirac_split_band = 0; } -#endif } else { @@ -199,7 +195,6 @@ ivas_error ivas_dirac_config( hConfig->enc_param_start_band = spar_dirac_split_band; } -#ifdef HODIRAC if ( ivas_get_hodirac_flag( ivas_total_brate, sba_order ) ) { hConfig->dec_param_estim = FALSE; @@ -208,7 +203,6 @@ ivas_error ivas_dirac_config( set_c( (int8_t *) hQMetaData->twoDirBands, (int8_t) 1, hQMetaData->q_direction[0].cfg.nbands ); hQMetaData->numTwoDirBands = (uint8_t) hQMetaData->q_direction[0].cfg.nbands; } -#endif } else { @@ -357,16 +351,12 @@ ivas_error ivas_dirac_sba_config( int16_t i; int16_t nbands_wb; int16_t nbands_coded; -#ifdef HODIRAC int16_t hodirac_flag; -#endif ivas_error error; error = IVAS_ERR_OK; hQMetaData->is_masa_ivas_format = 0; -#ifdef HODIRAC hodirac_flag = ivas_get_hodirac_flag( sba_total_brate, sba_order ); -#endif if ( sba_mode == SBA_MODE_SPAR ) { @@ -403,9 +393,7 @@ ivas_error ivas_dirac_sba_config( else { hQMetaData->useLowerBandRes = 0; -#ifdef HODIRAC if ( hodirac_flag == 0 ) -#endif { nbands_coded = nbands - 1; /* always combine the last two bands */ } @@ -413,18 +401,16 @@ ivas_error ivas_dirac_sba_config( { int16_t no_dirs = 1; -#ifdef HODIRAC if ( hodirac_flag ) { no_dirs = 2; } -#endif if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, nbands_coded, no_dirs, 0 ) ) != IVAS_ERR_OK ) { return error; } -#if defined( HODIRAC ) && !defined( FIX_DTX_428 ) +#if !defined( FIX_DTX_428 ) { int16_t dir, j; for ( dir = 0; dir < hQMetaData->no_directions; dir++ ) @@ -534,12 +520,10 @@ ivas_error ivas_dirac_sba_config( { { int16_t no_dirs = 1; -#ifdef HODIRAC if ( hodirac_flag ) { no_dirs = 2; } -#endif if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, 6, no_dirs, 0 ) ) != IVAS_ERR_OK ) { return error; @@ -573,13 +557,11 @@ ivas_error ivas_dirac_sba_config( { hQMetaData->q_direction[i].cfg.search_effort = 1; -#ifdef HODIRAC if ( hodirac_flag ) { hQMetaData->q_direction[i].cfg.start_band = 0; } else -#endif { hQMetaData->q_direction[i].cfg.start_band = nbands_wb; } @@ -886,7 +868,6 @@ void deindex_spherical_component( } -#ifdef HODIRAC /*---------------------------------------------------------------- * calculate_hodirac_sector_parameters() * @@ -1102,7 +1083,6 @@ void calculate_hodirac_sector_parameters( return; } -#endif /*-----------------------------------------------------------------------* diff --git a/lib_com/ivas_fb_mixer.c b/lib_com/ivas_fb_mixer.c index 2b7d65333d..e77e4e578f 100644 --- a/lib_com/ivas_fb_mixer.c +++ b/lib_com/ivas_fb_mixer.c @@ -106,10 +106,8 @@ ivas_error ivas_fb_set_cfg( const int16_t num_out_chans, /* i : number of FB output channels */ const int16_t active_w_mixing, /* i : active_w_mixing flag */ const int32_t sampling_rate /* i : sampling rate */ -#ifdef HODIRAC , const int16_t nchan_fb_in /* i : number of dirAC analysis channels*/ -#endif ) { IVAS_FB_CFG *pFb_cfg; @@ -121,9 +119,7 @@ ivas_error ivas_fb_set_cfg( pFb_cfg->num_in_chans = num_in_chans; pFb_cfg->num_out_chans = num_out_chans; -#ifdef HODIRAC pFb_cfg->nchan_fb_in = nchan_fb_in; -#endif pFb_cfg->pcm_offset = 0; /* note: in SPAR decoder, this parameter is overwritten later */ pFb_cfg->active_w_mixing = active_w_mixing; @@ -222,11 +218,7 @@ ivas_error ivas_FB_mixer_open( } else if ( fb_cfg->active_w_mixing ) { -#ifdef HODIRAC num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ); -#else - num_chs_alloc = fb_cfg->num_in_chans; -#endif } else { @@ -262,11 +254,7 @@ ivas_error ivas_FB_mixer_open( } else { -#ifdef HODIRAC num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ); -#else - num_chs_alloc = fb_cfg->num_in_chans; -#endif } for ( i = 0; i < num_chs_alloc; i++ ) @@ -281,11 +269,7 @@ ivas_error ivas_FB_mixer_open( if ( ( fb_cfg->active_w_mixing != -1 ) && ( fb_cfg->num_out_chans > 0 ) ) { float *pTemp_mem; -#ifdef HODIRAC if ( ( pTemp_mem = (float *) malloc( sizeof( float ) * fb_cfg->num_out_chans * max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ) * IVAS_MAX_NUM_BANDS ) ) == NULL ) -#else - if ( ( pTemp_mem = (float *) malloc( sizeof( float ) * fb_cfg->num_out_chans * fb_cfg->num_in_chans * IVAS_MAX_NUM_BANDS ) ) == NULL ) -#endif { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FB mixer" ); } @@ -396,11 +380,7 @@ void ivas_FB_mixer_close( } else if ( fb_cfg->active_w_mixing ) { -#ifdef HODIRAC num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ); -#else - num_chs_alloc = fb_cfg->num_in_chans; -#endif } else { @@ -429,11 +409,7 @@ void ivas_FB_mixer_close( } else { -#ifdef HODIRAC num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ); -#else - num_chs_alloc = fb_cfg->num_in_chans; -#endif } @@ -514,10 +490,8 @@ void ivas_fb_mixer_pcm_ingest( float pcm_in[][L_FRAME48k], /* i : input audio channels */ float **ppOut_pcm, /* o : output audio channels */ const int16_t frame_len /* i : frame length */ -#ifdef HODIRAC , const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] -#endif ) { int16_t i; @@ -536,15 +510,7 @@ void ivas_fb_mixer_pcm_ingest( for ( i = 0; i < fb_cfg->num_in_chans; i++ ) { mvr2r( &hFbMixer->ppFilterbank_prior_input[i][fb_cfg->prior_input_length - frame_len], ppOut_pcm[i], frame_len ); -#ifdef HODIRAC -#ifdef HODIRAC mvr2r( pcm_in[HOA_md_ind[i]], &ppOut_pcm[i][frame_len], frame_len ); -#else - mvr2r( pcm_in[HOA_keep_ind_spar[i]], &ppOut_pcm[i][frame_len], frame_len ); -#endif -#else - mvr2r( pcm_in[i], &ppOut_pcm[i][frame_len], frame_len ); -#endif } for ( i = 0; i < num_chs_ingest; i++ ) @@ -566,20 +532,14 @@ void ivas_fb_mixer_update_prior_input( IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */ float *pcm_in[], /* i : input audio channels */ const int16_t length /* i : length of time slot */ -#ifdef HODIRAC , const int16_t nchan_fb_in /* i : number of analysis channels */ -#endif ) { int16_t i; for ( i = 0; i < -#ifdef HODIRAC nchan_fb_in; -#else - hFbMixer->fb_cfg->num_in_chans; -#endif i++ ) { mvr2r( &hFbMixer->ppFilterbank_prior_input[i][length], hFbMixer->ppFilterbank_prior_input[i], hFbMixer->fb_cfg->prior_input_length - length ); @@ -603,10 +563,8 @@ void ivas_fb_mixer_get_windowed_fr( float *frame_f_imag[], /* o : imag freq domain values */ const int16_t length, /* i : number of new samples in time slot */ const int16_t mdft_len /* i : MDFT frame length */ -#ifdef HODIRAC , const int16_t nchan_fb_in /* i : number of analysis channels */ -#endif ) { int16_t ch_idx, j, offset, rev_offset; @@ -622,11 +580,7 @@ void ivas_fb_mixer_get_windowed_fr( set_zero( fr_in_block, offset ); for ( ch_idx = 0; ch_idx < -#ifdef HODIRAC nchan_fb_in -#else - hFbMixer->fb_cfg->num_in_chans -#endif ; ch_idx++ ) { diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index d69f9ecfe0..706754e1c6 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3090,10 +3090,8 @@ void mdct_read_IGF_bits( ivas_error ivas_qmetadata_enc_encode( BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ IVAS_QMETADATA *hQMetaData /* i/o: q_metadata handle */ -#ifdef HODIRAC , const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ -#endif ); #ifdef HR_METADATA @@ -3158,10 +3156,8 @@ int16_t ivas_qmetadata_dec_decode( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ uint16_t *bitstream, /* i : bitstream */ int16_t *index /* i/o: bitstream position */ -#ifdef HODIRAC , const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ -#endif ); #ifdef HR_METADATA @@ -3193,9 +3189,7 @@ void ivas_qmetadata_to_dirac( MASA_DECODER_HANDLE hMasa, /* i : MASA decoder structure */ const int32_t ivas_total_brate, /* i : IVAS total bitrate */ const SBA_MODE sba_mode, /* i : SBA mode */ -#ifdef HODIRAC const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ -#endif int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ); @@ -3398,11 +3392,9 @@ void ivas_dirac_param_est_enc( float **pp_fr_imag, const int16_t input_frame, const SBA_MODE sba_mode -#ifdef HODIRAC , const int16_t hodirac_flag, const int16_t nchan_fb_in -#endif ); @@ -3478,13 +3470,10 @@ int16_t ivas_sba_get_nchan( /*! r: number of ambisonics metadata channels */ int16_t ivas_sba_get_nchan_metadata( const int16_t sba_order /* i : Ambisonic (SBA) order */ -#ifdef HODIRAC , const int32_t ivas_total_brate -#endif ); -#ifdef HODIRAC void ivas_sba_get_spar_hoa_ch_ind( const int16_t num_md_chs, /* i : number of MD channels */ const int32_t ivas_total_brate, /* i : IVAS total bitrate */ @@ -3498,13 +3487,6 @@ void ivas_sba_get_spar_hoa_md_flag( int16_t *spar_hoa_md_flag, int16_t *spar_hoa_dirac2spar_md_flag ); -#else -/*! r: flag indicating to code SPAR HOA MD for all bands */ -int16_t ivas_sba_get_spar_hoa_md_flag( - const int16_t sba_order, /* i : Ambisonic (SBA) order */ - const int32_t ivas_total_brate /* i : IVAS total bitrate */ -); -#endif void ivas_sba_zero_vert_comp( float sba_data[][L_FRAME48k], /* i/o: SBA data frame */ @@ -3536,13 +3518,11 @@ void ivas_sba_dirac_stereo_config( STEREO_DFT_CONFIG_DATA_HANDLE hConfig /* o : DFT stereo configuration */ ); -#ifdef HODIRAC /*! r: HO-DirAC flag */ int16_t ivas_get_hodirac_flag( const int32_t ivas_total_brate, /* i : IVAS total bitrate */ const int16_t sba_order /* i : Ambisonic (SBA) order */ ); -#endif int16_t ivas_get_sba_dirac_stereo_flag( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ @@ -3661,9 +3641,7 @@ void ivas_dirac_dec_read_BS( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q metadata */ int16_t *nb_bits, /* o : number of bits read */ const SBA_MODE sba_mode, /* i : SBA mode */ -#ifdef HODIRAC const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ -#endif int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ); @@ -3811,19 +3789,15 @@ ivas_error ivas_dirac_dec_output_synthesis_open( const RENDERER_TYPE renderer_type, /* i : renderer type */ const int16_t nchan_transport, /* i : number of transport channels */ const int32_t output_Fs /* i : output sampling rate */ -#ifdef HODIRAC , const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ -#endif ); void ivas_dirac_dec_output_synthesis_init( DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ const int16_t nchan_out_woLFE /* i : number of output audio channels without LFE */ -#ifdef HODIRAC , const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ -#endif ); void ivas_dirac_dec_output_synthesis_close( @@ -3846,14 +3820,12 @@ void ivas_dirac_dec_output_synthesis_process_slot( const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ const int16_t nchan_transport /* i : number of transport channels */ -#if !defined( HODIRAC ) || defined( JBM_TSM_ON_TCS ) +#if defined( JBM_TSM_ON_TCS ) , const int16_t index_slot #endif -#ifdef HODIRAC , const int16_t hodirac_flag -#endif ); void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( @@ -3865,13 +3837,11 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( const int16_t nbslots, /* i : number of slots to process */ #endif const float *onset_filter -#ifdef HODIRAC , #ifdef JBM_TSM_ON_TCS const int16_t md_idx, #endif const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ -#endif ); void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( @@ -3928,10 +3898,8 @@ void ivas_dirac_dec_compute_directional_responses( const float *surCohRatio, const int16_t shd_rot_max_order, /* i : split-order rotation method */ const float *p_Rmat /* i : rotation matrix */ -#ifdef HODIRAC , const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ -#endif ); void ivas_dirac_dec_get_frequency_axis( @@ -3939,7 +3907,6 @@ void ivas_dirac_dec_get_frequency_axis( const int32_t output_Fs, /* i : sampling frequency */ const int16_t num_freq_bands ); /* i : number of frequency bands */ -#ifdef HODIRAC void calculate_hodirac_sector_parameters( float RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : signal vector (L+1)^2 x N_bins, real part */ float ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : signal vector, imaginary part */ @@ -3953,7 +3920,6 @@ void calculate_hodirac_sector_parameters( float *diff, /* o : array of sector diffuseness values, flat */ float *ene /* o : array of sector energy values, flat */ ); -#endif void ivas_mc_paramupmix_enc( Encoder_Struct *st_ivas, /* i/o: IVAS Encoder handle */ @@ -4678,11 +4644,9 @@ void ivas_get_spar_md_from_dirac( const int16_t active_w_vlbr ); -#ifdef HODIRAC int16_t ivas_get_spar_dec_md_num_subframes( const int16_t sba_order, /* i : Ambisonic (SBA) order */ const int32_t ivas_total_brate ); -#endif ivas_error ivas_spar_md_dec_open( ivas_spar_md_dec_state_t **hMdDec_out, /* i/o: SPAR MD decoder handle */ @@ -4736,19 +4700,15 @@ void ivas_spar_update_md_hist( void ivas_spar_smooth_md_dtx( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t num_bands_out /* i : number of output bands */ - #ifdef HODIRAC , const int16_t num_md_sub_frames /* i : number of metadata subframes */ -#endif ); void ivas_spar_setup_md_smoothing( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t num_bands_out /* i : number of output bands */ -#ifdef HODIRAC , const int16_t num_md_sub_frames /* i : number of metadata subframes */ -#endif ); void ivas_spar_dec_gen_umx_mat( @@ -4756,10 +4716,8 @@ void ivas_spar_dec_gen_umx_mat( const int16_t nchan_transport, /* i : number of transport channels */ const int16_t num_bands_out, /* i : number of output bands */ const int16_t bfi /* i : bad frame indicator */ -#ifdef HODIRAC , const int16_t num_md_sub_frames -#endif ); /* Covariance module */ @@ -4789,10 +4747,8 @@ void ivas_enc_cov_handler_process( const int16_t nchan_inp, const int16_t dtx_vad, const int16_t transient_det[2] -#ifdef HODIRAC , const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] -#endif ); ivas_error ivas_spar_covar_smooth_enc_open( @@ -5164,10 +5120,8 @@ void masa_compensate_two_dir_energy_ratio_index( const int16_t ratio_index_2, /* i : Input ratio for direction 2 */ int16_t *ratio_index_mod1, /* o : Output modified ratio for direction 1 */ int16_t *ratio_index_mod2 /* o : Output modified ratio for direction 2 */ -#ifdef HODIRAC , const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ -#endif ); void ivas_set_qmetadata_maxbit_req( @@ -5175,12 +5129,10 @@ void ivas_set_qmetadata_maxbit_req( const IVAS_FORMAT ivas_format /* i : IVAS format */ ); -#ifdef HODIRAC /*! r: Bits to be used for quantizing distribution ratio of direct-to-total ratios */ int16_t ivas_get_df_ratio_bits_hodirac( const int16_t index_diff /* i : Index of quantized diffuse-to-total ratio */ ); -#endif /*! r: Bits to be used for quantizing distribution ratio of direct-to-total ratios */ int16_t ivas_get_df_ratio_bits( @@ -5544,10 +5496,8 @@ void computeReferencePower_enc( const int16_t enc_param_start_band, /* i : first band to process */ const int16_t num_freq_bands, /* i : Number of frequency bands */ const SBA_MODE sba_mode /* i : SBA mode */ -#ifdef HODIRAC , const int16_t nchan_ana /* i : number of analysis channels */ -#endif ); ivas_error ivas_mono_dmx_renderer_open( @@ -5683,10 +5633,8 @@ ivas_error ivas_fb_set_cfg( const int16_t num_out_chans, /* i : number of FB output channels */ const int16_t active_w_mixing, /* i : active_w_mixing flag */ const int32_t sampling_Fs /* i : sampling rate */ -#ifdef HODIRAC , const int16_t nachan_dirac_ana /* i : number of DirAR analysis channels */ -#endif ); ivas_error ivas_FB_mixer_open( @@ -5707,10 +5655,8 @@ void ivas_fb_mixer_pcm_ingest( float pcm_in[][L_FRAME48k], /* i : input audio channels */ float **ppOut_pcm, /* o : output audio channels */ const int16_t frame_length /* i : frame length */ -#ifdef HODIRAC , const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] -#endif ); void ivas_dirac_enc_spar_delay_synchro( @@ -5723,10 +5669,8 @@ void ivas_fb_mixer_update_prior_input( IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */ float *pcm_in[], /* i : input audio channels */ const int16_t length /* i : length of time slot */ -#ifdef HODIRAC , const int16_t nchan_fb_in /* i : number of analysis channels */ -#endif ); void ivas_fb_mixer_get_windowed_fr( @@ -5736,10 +5680,8 @@ void ivas_fb_mixer_get_windowed_fr( float *frame_f_imag[], /* o : imag freq domain values */ const int16_t length, /* i : number of new samples in time slot */ const int16_t mdft_len /* i : MDFT frame length */ -#ifdef HODIRAC , const int16_t nchan_fb_in /* i : number of analysis channels */ -#endif ); void ivas_fb_mixer_process( diff --git a/lib_com/ivas_qmetadata_com.c b/lib_com/ivas_qmetadata_com.c index 3807236044..26dbb10df1 100644 --- a/lib_com/ivas_qmetadata_com.c +++ b/lib_com/ivas_qmetadata_com.c @@ -508,10 +508,8 @@ void masa_compensate_two_dir_energy_ratio_index( const int16_t ratio_index_2, /* i : Input ratio for direction 2 */ int16_t *ratio_index_mod1, /* o : Output modified ratio for direction 1 */ int16_t *ratio_index_mod2 /* o : Output modified ratio for direction 2 */ -#ifdef HODIRAC , const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ -#endif ) { float ratio1, ratio2; @@ -520,9 +518,7 @@ void masa_compensate_two_dir_energy_ratio_index( ratio1 = 1.0f - diffuseness_reconstructions[ratio_index_1]; ratio2 = 1.0f - diffuseness_reconstructions[ratio_index_2]; -#ifdef HODIRAC if ( !hodirac_flag ) -#endif { ratioSum = ratio1 + ratio2; if ( ratio1 >= ratio2 ) @@ -621,7 +617,6 @@ void ivas_qmetadata_direction_vector_to_azimuth_elevation( } -#ifdef HODIRAC /*------------------------------------------------------------------------- * ivas_get_df_ratio_bits_hodirac() * @@ -650,7 +645,6 @@ int16_t ivas_get_df_ratio_bits_hodirac( return dfRatio_bits; } -#endif /*--------------------------------------------------------------- * ivas_get_df_ratio_bits() diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index 28671a3080..b083210e07 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -877,9 +877,7 @@ const int16_t DirAC_block_grouping_5ms_MDFT[MAX_PARAM_SPATIAL_SUBFRAMES + 1] = 0, 1, 2, 3, 4 }; -#ifdef HODIRAC const float c_weights[DIRAC_NO_FB_BANDS_MAX] = { 9.962447e-02f, 9.627997e-01f, 9.926667e-01f, 9.981028e-01f, 9.996648e-01f, 1.000000e+00f, 9.997692e-01f, 9.992002e-01f, 9.983890e-01f, 9.973818e-01f, 9.962037e-01f, 9.948692e-01f, 9.933876e-01f, 9.917654e-01f, 9.900073e-01f, 9.881169e-01f, 9.860975e-01f, 9.839516e-01f, 9.816818e-01f, 9.792906e-01f, 9.767801e-01f, 9.741527e-01f, 9.714106e-01f, 9.685560e-01f, 9.655913e-01f, 9.625187e-01f, 9.593406e-01f, 9.560594e-01f, 9.526774e-01f, 9.491970e-01f, 9.456208e-01f, 9.419512e-01f, 9.381908e-01f, 9.343420e-01f, 9.304075e-01f, 9.263898e-01f, 9.222915e-01f, 9.181152e-01f, 9.138636e-01f, 9.095392e-01f, 9.051447e-01f, 9.006827e-01f, 8.961559e-01f, 8.915668e-01f, 8.869181e-01f, 8.822123e-01f, 8.774521e-01f, 8.726400e-01f, 8.677785e-01f, 8.628702e-01f, 8.579176e-01f, 8.529231e-01f, 8.478893e-01f, 8.428184e-01f, 8.377130e-01f, 8.325753e-01f, 8.274077e-01f, 8.222124e-01f, 8.169917e-01f, 8.117478e-01f, 8.064829e-01f, 8.011990e-01f, 7.958982e-01f, 7.905827e-01f, 7.852543e-01f, 7.799150e-01f, 7.745667e-01f, 7.692112e-01f, 7.638505e-01f, 7.584861e-01f, 7.531199e-01f, 7.477535e-01f, 7.423885e-01f, 7.370265e-01f, 7.316691e-01f, 7.263176e-01f, 7.209736e-01f, 7.156384e-01f, 7.103134e-01f, 7.049999e-01f, 6.996990e-01f, 6.944121e-01f, 6.891403e-01f, 6.838847e-01f, 6.786464e-01f, 6.734265e-01f, 6.682258e-01f, 6.630455e-01f, 6.578863e-01f, 6.527492e-01f, 6.476350e-01f, 6.425445e-01f, 6.374784e-01f, 6.324376e-01f, 6.274226e-01f, 6.224341e-01f, 6.174729e-01f, 6.125393e-01f, 6.076341e-01f, 6.027577e-01f, 5.979106e-01f, 5.930932e-01f, 5.883061e-01f, 5.835497e-01f, 5.788242e-01f, 5.741301e-01f, 5.694676e-01f, 5.648372e-01f, 5.602390e-01f, 5.556734e-01f, 5.511404e-01f, 5.466405e-01f, 5.421737e-01f, 5.377402e-01f, 5.333402e-01f, 5.289738e-01f, 5.246411e-01f, 5.203422e-01f, 5.160771e-01f, 5.118460e-01f, 5.076489e-01f, 5.034858e-01f, 4.993567e-01f, 4.952616e-01f, 4.912005e-01f, 4.871734e-01f, 4.831802e-01f, 4.792209e-01f, 4.752955e-01f, 4.714037e-01f, 4.675457e-01f, 4.637212e-01f, 4.599302e-01f, 4.561725e-01f, 4.524481e-01f, 4.487567e-01f, 4.450983e-01f, 4.414728e-01f, 4.378799e-01f, 4.343195e-01f, 4.307915e-01f, 4.272956e-01f, 4.238318e-01f, 4.203997e-01f, 4.169993e-01f, 4.136303e-01f, 4.102926e-01f, 4.069859e-01f, 4.037101e-01f, 4.004649e-01f, 3.972501e-01f, 3.940655e-01f, 3.909109e-01f, 3.877861e-01f, 3.846909e-01f, 3.816250e-01f, 3.785882e-01f, 3.755803e-01f, 3.726010e-01f, 3.696501e-01f, 3.667275e-01f, 3.638328e-01f, 3.609658e-01f, 3.581263e-01f, 3.553141e-01f, 3.525289e-01f, 3.497705e-01f, 3.470387e-01f, 3.443331e-01f, 3.416537e-01f, 3.390001e-01f, 3.363720e-01f, 3.337694e-01f, 3.311919e-01f, 3.286393e-01f, 3.261114e-01f, 3.236079e-01f, 3.211286e-01f, 3.186733e-01f, 3.162418e-01f, 3.138337e-01f, 3.114490e-01f, 3.090872e-01f, 3.067484e-01f, 3.044321e-01f, 3.021382e-01f, 2.998664e-01f, 2.976166e-01f, 2.953885e-01f, 2.931819e-01f, 2.909966e-01f, 2.888323e-01f, 2.866889e-01f, 2.845661e-01f, 2.824637e-01f, 2.803816e-01f, 2.783194e-01f, 2.762770e-01f, 2.742543e-01f, 2.722509e-01f, 2.702667e-01f, 2.683014e-01f, 2.663550e-01f, 2.644271e-01f, 2.625177e-01f, 2.606264e-01f, 2.587531e-01f, 2.568977e-01f, 2.550599e-01f, 2.532395e-01f, 2.514364e-01f, 2.496503e-01f, 2.478811e-01f, 2.461287e-01f, 2.443928e-01f, 2.426732e-01f, 2.409698e-01f, 2.392824e-01f, 2.376109e-01f, 2.359550e-01f, 2.343146e-01f, 2.326895e-01f, 2.310797e-01f, 2.294848e-01f, 2.279047e-01f, 2.263394e-01f, 2.247886e-01f, 2.232521e-01f, 2.217299e-01f, 2.202217e-01f, 2.187274e-01f, 2.172469e-01f, 2.157800e-01f, 2.143266e-01f, 2.128865e-01f, 2.114596e-01f, 2.100457e-01f, 2.086447e-01f, 2.072564e-01f, 2.058808e-01f }; -#endif /*----------------------------------------------------------------------* * SPAR ROM tables @@ -951,19 +949,11 @@ const ivas_spar_br_table_t ivas_spar_br_table_consts[IVAS_SPAR_BR_TABLE_LEN] = { 512000, 0, SBA_FOA_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 128000, 128000, 128000 },{ 128000, 128000, 128000 },{ 128000, 128000, 128000 }, {118450, 118450, 128000 } }, // not yet optimized { { 31, 1, 1, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, -#ifdef HODIRAC { 512000, 0, SBA_HOA2_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 124000, 124000, 128000 },{ 124000, 124000, 128000 },{ 125200, 118450, 128000 },{ 76300, 73000, 128000 } }, // not yet optimized { { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, { 512000, 0, SBA_HOA3_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 118000, 118000, 128000 },{ 118000, 118000, 128000 },{ 117200, 109250, 128000 },{ 72300, 69000, 128000 } }, // not yet optimized { { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, -#else - { 512000, 0, SBA_HOA2_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 128000, 128000, 128000 },{ 128000, 128000, 128000 },{ 128000, 128000, 128000 },{ 97700, 93300, 128000 } }, // not yet optimized - { { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, - - { 512000, 0, SBA_HOA3_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 128000, 128000, 128000 },{ 128000, 128000, 128000 },{ 127200, 122550, 128000 },{ 76300, 73550, 128000 } }, // not yet optimized - { { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, -#endif }; const ivas_freq_models_t ivas_arith_pred_r_consts[TOTAL_PRED_QUANT_STRATS_ARITH] = @@ -1480,31 +1470,13 @@ const int16_t dtx_pr_real_q_levels[3][3] = { { 9,9,9 },{ 9,7,9 },{ 9,5,7 } }; const int16_t pr_pr_idx_pairs[3][3][2] = { { { 0, 0 },{ 0, 0 },{ 0, 0 } },{ { 0, 0 },{ 0, 0 },{ 0, 0 } },{ { 0, 0 },{ 1, 3 },{ 0, 0 } } }; const int16_t pr_pd_idx_pairs[3][3][2] = { { { 1, 1 },{ 2, 2 },{ 3, 3 } },{ { 1, 1 },{ 3, 2 },{ 2, 0 } },{ { 2, 1 },{ 0, 0 },{ 0, 0 } } }; -#ifdef HODIRAC const int16_t remix_order_set[1][DIRAC_MAX_ANA_CHANS] = { /* WYZX --> WYXZ... */ { 0, 1, 3, 2, 4, 5, 6, 7, 8, 9, 10 } }; -#else -const int16_t remix_order_set[1][IVAS_SPAR_MAX_CH] = { /* WYZX --> WYXZ... */ - { 0, 1, 3, 2, 4, 5, 6, 7} -}; -#endif -#ifdef HODIRAC const int16_t keep_planar[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS] = { 1, 1, 1, 1, 1, 1 }; -#else -const int16_t keep_planar[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS] = { 1, 1, 1, 1 }; -#endif -#ifdef HODIRAC const int16_t HOA_keep_ind[IVAS_SPAR_MAX_FB_IN_CHAN] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 15}; -#ifdef HODIRAC const int16_t HOA_keep_ind_spar[IVAS_SPAR_MAX_CH] = {0, 1, 2, 3, 4, 8, 9, 10, 10, 10, 10}; const int16_t HOA_keep_ind_spar512[IVAS_SPAR_MAX_CH] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; -#else -const int16_t HOA_keep_ind_spar[IVAS_SPAR_MAX_CH] = {0, 1, 2, 3, 4, 8, 9, 10}; -#endif -#else -const int16_t HOA_keep_ind[IVAS_SPAR_MAX_CH] = {0, 1, 2, 3, 4, 8, 9, 15}; -#endif /*----------------------------------------------------------------------* diff --git a/lib_com/ivas_rom_com.h b/lib_com/ivas_rom_com.h index b6c1797c81..f43bacbf3b 100644 --- a/lib_com/ivas_rom_com.h +++ b/lib_com/ivas_rom_com.h @@ -161,22 +161,12 @@ extern const int16_t DirAC_band_grouping_5[5 + 1]; extern const int16_t DirAC_block_grouping[MAX_PARAM_SPATIAL_SUBFRAMES + 1]; extern const int16_t DirAC_block_grouping_5ms_MDFT[MAX_PARAM_SPATIAL_SUBFRAMES + 1]; -#ifdef HODIRAC extern const float c_weights[DIRAC_NO_FB_BANDS_MAX]; -#endif -#ifdef HODIRAC -extern const float w_nm[NUM_ANA_SECTORS][9]; -extern const float x_nm[NUM_ANA_SECTORS][9]; -extern const float y_nm[NUM_ANA_SECTORS][9]; -extern const float z_nm[NUM_ANA_SECTORS][9]; -#else -#define NUM_ANA_SECTORS 1 extern const float w_nm[NUM_ANA_SECTORS][9]; extern const float x_nm[NUM_ANA_SECTORS][9]; extern const float y_nm[NUM_ANA_SECTORS][9]; extern const float z_nm[NUM_ANA_SECTORS][9]; -#endif /*------------------------------------------------------------------------------------------* * SPAR ROM tables @@ -189,19 +179,11 @@ extern const ivas_huff_models_t ivas_huff_pred_r_consts[TOTAL_PRED_QUANT_STRATS_ extern const ivas_huff_models_t ivas_huff_drct_r_consts[TOTAL_DRCT_QUANT_STRATS]; extern const ivas_huff_models_t ivas_huff_decd_r_consts[TOTAL_DECD_QUANT_STRATS]; extern const ivas_spar_br_table_t ivas_spar_br_table_consts[IVAS_SPAR_BR_TABLE_LEN]; -#ifdef HODIRAC extern const int16_t remix_order_set[1][DIRAC_MAX_ANA_CHANS]; -#else -extern const int16_t remix_order_set[1][IVAS_SPAR_MAX_CH]; -#endif extern const int16_t keep_planar[IVAS_SPAR_MAX_CH - FOA_CHANNELS]; -#ifdef HODIRAC extern const int16_t HOA_keep_ind[IVAS_SPAR_MAX_FB_IN_CHAN]; extern const int16_t HOA_keep_ind_spar[IVAS_SPAR_MAX_CH]; extern const int16_t HOA_keep_ind_spar512[IVAS_SPAR_MAX_CH]; -#else -extern const int16_t HOA_keep_ind[IVAS_SPAR_MAX_CH]; -#endif extern const float dtx_pd_real_min_max[2]; extern const int16_t dtx_pd_real_q_levels[3][3]; diff --git a/lib_com/ivas_sba_config.c b/lib_com/ivas_sba_config.c index d0b153260b..f461be09b8 100644 --- a/lib_com/ivas_sba_config.c +++ b/lib_com/ivas_sba_config.c @@ -222,10 +222,8 @@ int16_t ivas_sba_get_nchan( /*! r: number of ambisonics metadata channels */ int16_t ivas_sba_get_nchan_metadata( const int16_t sba_order /* i : Ambisonic (SBA) order */ -#ifdef HODIRAC , const int32_t ivas_total_brate -#endif ) { int16_t nb_channels; @@ -236,7 +234,6 @@ int16_t ivas_sba_get_nchan_metadata( } else { -#ifdef HODIRAC if ( ivas_total_brate >= IVAS_512k ) { nb_channels = ( SBA_HOA2_ORDER + 1 ) * ( SBA_HOA2_ORDER + 1 ); @@ -244,7 +241,6 @@ int16_t ivas_sba_get_nchan_metadata( nb_channels = min( nb_channels, ( sba_order + 1 ) * ( sba_order + 1 ) ); } else -#endif { /* FOA + planar HOA */ nb_channels = FOA_CHANNELS + 2 * ( sba_order - 1 ); @@ -261,7 +257,6 @@ int16_t ivas_sba_get_nchan_metadata( *-------------------------------------------------------------------*/ /*! r: flag indicating to code SPAR HOA MD for all bands */ -#ifdef HODIRAC void ivas_sba_get_spar_hoa_ch_ind( const int16_t num_md_chs, /* i : number of MD channels */ const int32_t ivas_total_brate, /* i : IVAS total bitrate */ @@ -312,26 +307,6 @@ void ivas_sba_get_spar_hoa_md_flag( return; } -#else -int16_t ivas_sba_get_spar_hoa_md_flag( - const int16_t sba_order, /* i : Ambisonic (SBA) order */ - const int32_t ivas_total_brate /* i : IVAS total bitrate */ -) -{ - int16_t spar_hoa_md_flag = 0; - - if ( sba_order > 1 && ivas_total_brate >= IVAS_256k ) - { - spar_hoa_md_flag = 1; - } - else - { - spar_hoa_md_flag = 0; - } - - return spar_hoa_md_flag; -} -#endif /*-------------------------------------------------------------------* diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index d0fd513516..2830f23a56 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -1687,17 +1687,13 @@ void ivas_get_spar_md_from_dirac( remix_order = remix_order_set[hSpar_md_cfg->remix_unmix_order]; num_ch = ivas_sba_get_nchan_metadata( order -#ifdef HODIRAC , IVAS_256k /*dummy value as order is always 1 in this function*/ -#endif ); hoa2_ch = ivas_sba_get_nchan_metadata( SBA_HOA2_ORDER -#ifdef HODIRAC , IVAS_256k /*dummy value as order is always 1 in this function*/ -#endif ); foa_ch = FOA_CHANNELS; diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index bfde25383e..d290b8670a 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -717,9 +717,7 @@ typedef struct ivas_fb_mixer_cfg_t int16_t fb_latency; int16_t num_in_chans; int16_t num_out_chans; -#ifdef HODIRAC int16_t nchan_fb_in; -#endif int16_t pcm_offset; int16_t fade_len; /* this sets the stride length; no delay is introduced */ int16_t prior_input_length; diff --git a/lib_com/options.h b/lib_com/options.h index abda703ae7..b6cb6388ca 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -160,7 +160,6 @@ -#define HODIRAC /* FhG: Contribution 32: Sector-based HO-DirAC method for SBA at high bitrates */ #define DIRAC_ALLOC_HARM /* VA: harmonize DirAC parameters allocation/deallocation */ diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index a8e4449eca..76ef4c49ac 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -325,9 +325,7 @@ ivas_error ivas_dec( if ( st_ivas->ivas_format == SBA_FORMAT ) { ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, -#ifdef HODIRAC ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ), -#endif 0 ); } else @@ -345,9 +343,7 @@ ivas_error ivas_dec( st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, -#ifdef HODIRAC ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ), -#endif st_ivas->hSpar->dirac_to_spar_md_bands ); } @@ -416,10 +412,8 @@ ivas_error ivas_dec( } ivas_spar_dec_gen_umx_mat( st_ivas->hSpar->hMdDec, st_ivas->nchan_transport, IVAS_MAX_NUM_BANDS, st_ivas->bfi -#ifdef HODIRAC , ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate ) -#endif ); } diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index aac883c89d..1feea6f73e 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -52,10 +52,8 @@ *-----------------------------------------------------------------------*/ static ivas_error ivas_dirac_alloc_mem( DIRAC_DEC_HANDLE hDirAC, const RENDERER_TYPE renderer_type, DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem -#ifdef HODIRAC , const int16_t hodirac_flag -#endif ); static void ivas_dirac_free_mem( DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem ); @@ -71,10 +69,8 @@ static void protoSignalComputation1( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRA static void protoSignalComputation2( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float *proto_frame_f, float *proto_direct_buffer_f, float *reference_power, float *proto_power_smooth, const int16_t isloudspeaker, const int16_t slot_index, const int16_t num_freq_bands, MASA_STEREO_TYPE_DETECT *stereo_type_detect ); static void protoSignalComputation4( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float *proto_frame_f, float *proto_direct_buffer_f, float *reference_power, float *proto_power_smooth, const int16_t slot_index, const int16_t num_outputs_diff, const int16_t num_freq_bands, const float *mtx_hoa_decoder, const int16_t nchan_transport -#ifdef HODIRAC , const int16_t *sba_map_tc_ind -#endif ); static void ivas_dirac_dec_compute_diffuse_proto( DIRAC_DEC_HANDLE hDirAC, const int16_t slot_idx ); @@ -280,9 +276,7 @@ ivas_error ivas_dirac_dec_config( int32_t output_Fs, ivas_total_brate; ivas_error error; int16_t nchan_transport_orig; -#ifdef HODIRAC int16_t hodirac_flag; -#endif DIRAC_CONFIG_FLAG flag_config; flag_config = ( flag_config_inp == DIRAC_RECONFIGURE_MODE ) ? DIRAC_RECONFIGURE : flag_config_inp; @@ -291,9 +285,7 @@ ivas_error ivas_dirac_dec_config( hDirAC = NULL; output_Fs = st_ivas->hDecoderConfig->output_Fs; ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; -#ifdef HODIRAC hodirac_flag = ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ); -#endif if ( flag_config == DIRAC_RECONFIGURE ) @@ -333,10 +325,8 @@ ivas_error ivas_dirac_dec_config( if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && !( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) { st_ivas->nchan_transport = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order -#ifdef HODIRAC , st_ivas->hDecoderConfig->ivas_total_brate -#endif ); } @@ -429,7 +419,6 @@ ivas_error ivas_dirac_dec_config( #endif } -#ifdef HODIRAC if ( st_ivas->ivas_format == SBA_FORMAT && flag_config == DIRAC_RECONFIGURE && ( ( ivas_total_brate > IVAS_256k && st_ivas->hDecoderConfig->last_ivas_total_brate <= IVAS_256k ) || ( ivas_total_brate <= IVAS_256k && st_ivas->hDecoderConfig->last_ivas_total_brate > IVAS_256k ) ) ) { if ( st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k && hDirAC->azimuth2 == NULL ) @@ -513,13 +502,10 @@ ivas_error ivas_dirac_dec_config( #endif } } -#endif /* band config needed only for SPAR with FOA output */ if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_FOA && st_ivas->sba_mode == SBA_MODE_SPAR -#ifdef HODIRAC && !hodirac_flag -#endif ) { return IVAS_ERR_OK; @@ -681,7 +667,6 @@ ivas_error ivas_dirac_dec_config( } set_s( hDirAC->proto_index_diff, 0, hDirAC->num_outputs_diff ); -#ifdef HODIRAC hDirAC->sba_map_tc = sba_map_tc; if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR ) { @@ -690,7 +675,6 @@ ivas_error ivas_dirac_dec_config( hDirAC->sba_map_tc = sba_map_tc_512; } } -#endif if ( nchan_transport == 1 ) { @@ -797,17 +781,10 @@ ivas_error ivas_dirac_dec_config( for ( k = 0; k < min( hDirAC->num_outputs_dir, hDirAC->num_protos_dir ); k++ ) { -#ifdef HODIRAC if ( hDirAC->sba_map_tc[k] < hDirAC->num_outputs_dir ) { hDirAC->proto_index_dir[hDirAC->sba_map_tc[k]] = k; } -#else - if ( sba_map_tc[k] < hDirAC->num_outputs_dir ) - { - hDirAC->proto_index_dir[sba_map_tc[k]] = k; - } -#endif } } } @@ -984,10 +961,8 @@ ivas_error ivas_dirac_dec_config( if ( flag_config == DIRAC_OPEN ) { if ( ( ivas_dirac_dec_output_synthesis_open( hDirAC, st_ivas->renderer_type, nchan_transport, output_Fs -#ifdef HODIRAC , hodirac_flag -#endif ) ) != IVAS_ERR_OK ) { return error; @@ -999,10 +974,8 @@ ivas_error ivas_dirac_dec_config( ivas_dirac_dec_output_synthesis_close( hDirAC ); if ( ( ivas_dirac_dec_output_synthesis_open( hDirAC, st_ivas->renderer_type, nchan_transport, output_Fs -#ifdef HODIRAC , hodirac_flag -#endif ) ) != IVAS_ERR_OK ) { return error; @@ -1098,10 +1071,8 @@ ivas_error ivas_dirac_dec_config( /* output synthesis */ ivas_dirac_dec_output_synthesis_init( hDirAC, nchan_out_woLFE -#ifdef HODIRAC , hodirac_flag -#endif ); /* Allocate stack memory */ @@ -1110,10 +1081,8 @@ ivas_error ivas_dirac_dec_config( ivas_dirac_free_mem( &( hDirAC->stack_mem ) ); } if ( ( error = ivas_dirac_alloc_mem( hDirAC, st_ivas->renderer_type, &( hDirAC->stack_mem ) -#ifdef HODIRAC , hodirac_flag -#endif ) ) != IVAS_ERR_OK ) { return error; @@ -1267,9 +1236,7 @@ ivas_error ivas_dirac_dec_config( #endif if ( st_ivas->ivas_format == MASA_FORMAT -#ifdef HODIRAC || ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k ) -#endif ) { #ifdef DIRAC_ALLOC_HARM @@ -1957,17 +1924,13 @@ static ivas_error ivas_dirac_alloc_mem( DIRAC_DEC_HANDLE hDirAC, const RENDERER_TYPE renderer_type, DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem -#ifdef HODIRAC , const int16_t hodirac_flag -#endif ) { int16_t num_freq_bands, num_freq_bands_diff, size; -#ifdef HODIRAC int16_t size_ho; int16_t size_pf; -#endif int16_t num_outputs_dir, num_outputs_diff; int16_t num_protos_dir; @@ -1980,7 +1943,6 @@ static ivas_error ivas_dirac_alloc_mem( num_outputs_diff = hDirAC->num_outputs_diff; size = num_freq_bands * num_outputs_dir; -#ifdef HODIRAC if ( hodirac_flag ) { size_ho = size * DIRAC_HO_NUMSECTORS; @@ -1991,7 +1953,6 @@ static ivas_error ivas_dirac_alloc_mem( size_ho = size; size_pf = num_freq_bands; } -#endif /* PSD related buffers */ hDirAC_mem->cy_auto_dir_smooth = NULL; @@ -2038,11 +1999,7 @@ static ivas_error ivas_dirac_alloc_mem( hDirAC->h_output_synthesis_psd_state.direct_responses_square = hDirAC_mem->direct_responses_square; /* Target and smoothed nrg factors/gains */ -#ifdef HODIRAC if ( ( hDirAC_mem->cy_cross_dir_smooth = (float *) malloc( sizeof( float ) * size_ho ) ) == NULL ) -#else - if ( ( hDirAC_mem->cy_cross_dir_smooth = (float *) malloc( sizeof( float ) * size ) ) == NULL ) -#endif { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } @@ -2068,11 +2025,7 @@ static ivas_error ivas_dirac_alloc_mem( hDirAC->h_output_synthesis_psd_state.cy_auto_diff_smooth = hDirAC_mem->cy_auto_diff_smooth; /*Responses (gains/factors)*/ -#ifdef HODIRAC if ( ( hDirAC_mem->direct_responses = (float *) malloc( sizeof( float ) * size_ho ) ) == NULL ) -#else - if ( ( hDirAC_mem->direct_responses = (float *) malloc( sizeof( float ) * size ) ) == NULL ) -#endif { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } @@ -2118,19 +2071,11 @@ static ivas_error ivas_dirac_alloc_mem( if ( renderer_type != RENDERER_BINAURAL_PARAMETRIC && renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && renderer_type != RENDERER_STEREO_PARAMETRIC ) { -#ifdef HODIRAC if ( ( hDirAC_mem->direct_power_factor = (float *) malloc( sizeof( float ) * size_pf ) ) == NULL ) -#else - if ( ( hDirAC_mem->direct_power_factor = (float *) malloc( sizeof( float ) * num_freq_bands ) ) == NULL ) -#endif { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } -#ifdef HODIRAC if ( ( hDirAC_mem->diffuse_power_factor = (float *) malloc( sizeof( float ) * size_pf ) ) == NULL ) -#else - if ( ( hDirAC_mem->diffuse_power_factor = (float *) malloc( sizeof( float ) * num_freq_bands ) ) == NULL ) -#endif { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } @@ -2258,9 +2203,7 @@ void ivas_dirac_dec_read_BS( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata */ int16_t *nb_bits, /* o : number of bits read */ const SBA_MODE sba_mode, /* i : SBA mode */ -#ifdef HODIRAC const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ -#endif int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ) { @@ -2356,10 +2299,8 @@ void ivas_dirac_dec_read_BS( } *nb_bits += ivas_qmetadata_dec_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ) -#ifdef HODIRAC , hodirac_flag -#endif ); } @@ -2428,10 +2369,8 @@ void ivas_dirac_dec_read_BS( if ( hDirAC != NULL ) { ivas_qmetadata_to_dirac( hQMetaData, hDirAC, NULL, ivas_total_brate, sba_mode -#ifdef HODIRAC , hodirac_flag -#endif , dirac_to_spar_md_bands ); } @@ -2452,9 +2391,7 @@ void ivas_qmetadata_to_dirac( MASA_DECODER_HANDLE hMasa, /* i : MASA decoder structure */ const int32_t ivas_total_brate, /* i : IVAS total bitrate */ const SBA_MODE sba_mode, /* i : SBA mode */ -#ifdef HODIRAC const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ -#endif int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ) { @@ -2471,10 +2408,8 @@ void ivas_qmetadata_to_dirac( int16_t nbands = 0; int16_t nblocks = 0; int16_t qBand_idx; -#ifdef HODIRAC int16_t idx_sec = 0; int16_t no_secs = 1; -#endif q_direction = &( hQMetaData->q_direction[0] ); hDirAC->numSimultaneousDirections = hQMetaData->no_directions; @@ -2564,9 +2499,7 @@ void ivas_qmetadata_to_dirac( int16_t num_slots_in_subfr; int16_t tmp_write_idx_param_band; int16_t tmp_write_idx_band; -#ifdef HODIRAC float diffuseness_sec = 0.f; -#endif num_slots_in_subfr = hDirAC->hConfig->dec_param_estim ? CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES : 1; @@ -2586,9 +2519,6 @@ void ivas_qmetadata_to_dirac( } else { -#ifndef HODIRAC - assert( ( hQMetaData->no_directions == 1 ) && "Only 1 direction supported in SBA mode!" ); -#endif start_band = hDirAC->hConfig->enc_param_start_band; if ( sba_mode == SBA_MODE_SPAR ) @@ -2667,14 +2597,12 @@ void ivas_qmetadata_to_dirac( } /* Bands with spatial data transmitted */ -#ifdef HODIRAC if ( hodirac_flag ) { no_secs = DIRAC_HO_NUMSECTORS; } for ( idx_sec = 0; idx_sec < no_secs; idx_sec++ ) -#endif { for ( band = start_band; band < nbands; band++ ) { @@ -2710,19 +2638,11 @@ void ivas_qmetadata_to_dirac( block_qmetadata = min( block, nblocks - 1 ); block_qmetadata = max( block_qmetadata, 0 ); -#ifdef HODIRAC if ( q_direction[idx_sec].band_data[qBand_idx].azimuth[block_qmetadata] < 0.f ) { q_direction[idx_sec].band_data[qBand_idx].azimuth[block_qmetadata] += 360.f; } -#else - if ( q_direction->band_data[qBand_idx].azimuth[block_qmetadata] < 0.f ) - { - q_direction->band_data[qBand_idx].azimuth[block_qmetadata] += 360.f; - } -#endif -#ifdef HODIRAC if ( hMasa == NULL && hodirac_flag ) { azimuth = q_direction[idx_sec].band_data[qBand_idx].azimuth[block_qmetadata]; @@ -2732,7 +2652,6 @@ void ivas_qmetadata_to_dirac( assert( diffuseness_sec < 1.0001f && diffuseness_sec > -0.0001f ); } else -#endif { azimuth = q_direction->band_data[qBand_idx].azimuth[block_qmetadata]; elevation = q_direction->band_data[qBand_idx].elevation[block_qmetadata]; @@ -2742,14 +2661,12 @@ void ivas_qmetadata_to_dirac( { tmp_write_idx_band = tmp_write_idx_param_band; -#ifdef HODIRAC if ( hodirac_flag ) { azi = (int16_t) ( azimuth + 0.5f ); ele = (int16_t) ( elevation + 0.5f ); } else -#endif { azi = (int16_t) ( azimuth + rand_triangular_signed( seed_ptr ) * dirac_dithering_azi_scale[diff_idx] + 0.5f ); ele = (int16_t) ( elevation + rand_triangular_signed( seed_ptr ) * dirac_dithering_ele_scale[diff_idx] + 0.5f ); @@ -2784,7 +2701,6 @@ void ivas_qmetadata_to_dirac( hDirAC->diffuseness_vector[tmp_write_idx_band][b] = diffuseness; -#ifdef HODIRAC if ( hodirac_flag ) { if ( idx_sec == 0 ) @@ -2802,7 +2718,6 @@ void ivas_qmetadata_to_dirac( } } else -#endif { hDirAC->elevation[tmp_write_idx_band][b] = ele; hDirAC->azimuth[tmp_write_idx_band][b] = azi; @@ -3115,9 +3030,7 @@ void ivas_dirac_dec_render_sf( int16_t sf1, sf2; #endif int16_t slot_idx, index_slot; -#ifdef HODIRAC int16_t hodirac_flag; -#endif float *p_Rmat; #ifdef JBM_TSM_ON_TCS int16_t slot_idx_start, slot_idx_start_cldfb_synth, md_idx; @@ -3158,9 +3071,7 @@ void ivas_dirac_dec_render_sf( onset_filter = DirAC_mem.onset_filter; onset_filter_subframe = DirAC_mem.onset_filter + hDirAC->num_freq_bands; -#ifdef HODIRAC hodirac_flag = ivas_get_hodirac_flag( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ); -#endif if ( st_ivas->hQMetaData != NULL && st_ivas->sba_mode != SBA_MODE_SPAR ) { @@ -3403,10 +3314,8 @@ void ivas_dirac_dec_render_sf( surCohRatio, st_ivas->hHeadTrackData->shd_rot_max_order, p_Rmat -#ifdef HODIRAC , hodirac_flag -#endif ); } else @@ -3422,10 +3331,8 @@ void ivas_dirac_dec_render_sf( surCohRatio, 0, NULL -#ifdef HODIRAC , hodirac_flag -#endif ); } } @@ -3465,34 +3372,17 @@ void ivas_dirac_dec_render_sf( for ( ch = 0; ch < nchan_transport; ch++ ) { #ifdef JBM_TSM_ON_TCS -#ifdef HODIRAC cldfbAnalysis_ts( &( st_ivas->hTcBuffer->tc[hDirAC->sba_map_tc[ch]][hDirAC->num_freq_bands * index_slot] ), Cldfb_RealBuffer[ch][0], Cldfb_ImagBuffer[ch][0], hDirAC->num_freq_bands, st_ivas->cldfbAnaDec[ch] ); #else - cldfbAnalysis_ts( &( st_ivas->hTcBuffer->tc[sba_map_tc[ch]][hDirAC->num_freq_bands * index_slot] ), - Cldfb_RealBuffer[ch][0], - Cldfb_ImagBuffer[ch][0], - hDirAC->num_freq_bands, - st_ivas->cldfbAnaDec[ch] ); -#endif -#else -#ifdef HODIRAC cldfbAnalysis_ts( &( output_f[hDirAC->sba_map_tc[ch]][hDirAC->num_freq_bands * index_slot] ), Cldfb_RealBuffer[ch][0], Cldfb_ImagBuffer[ch][0], hDirAC->num_freq_bands, st_ivas->cldfbAnaDec[ch] ); -#else - cldfbAnalysis_ts( &( output_f[sba_map_tc[ch]][hDirAC->num_freq_bands * index_slot] ), - Cldfb_RealBuffer[ch][0], - Cldfb_ImagBuffer[ch][0], - hDirAC->num_freq_bands, - st_ivas->cldfbAnaDec[ch] ); - -#endif #endif } } @@ -3569,9 +3459,7 @@ void ivas_dirac_dec_render_sf( { switch ( nchan_transport ) { -#ifdef HODIRAC case 11: -#endif case 8: case 6: case 4: @@ -3584,10 +3472,8 @@ void ivas_dirac_dec_render_sf( hDirAC->num_freq_bands, hDirAC->hoa_decoder, nchan_transport -#ifdef HODIRAC , hDirAC->sba_map_tc -#endif ); break; case 2: @@ -3794,15 +3680,9 @@ void ivas_dirac_dec_render_sf( st_ivas->hVBAPdata, hDirAC->hOutSetup, nchan_transport -#ifndef HODIRAC - , - index_slot -#endif -#ifdef HODIRAC , st_ivas->sba_analysis_order > 1 && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k -#endif ); } else @@ -3814,15 +3694,9 @@ void ivas_dirac_dec_render_sf( st_ivas->hVBAPdata, hDirAC->hOutSetup, nchan_transport -#ifndef HODIRAC - , - index_slot -#endif -#ifdef HODIRAC , st_ivas->sba_analysis_order > 1 && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k -#endif ); } @@ -3841,9 +3715,7 @@ void ivas_dirac_dec_render_sf( hDirAC->hOutSetup, nchan_transport, md_idx, -#ifdef HODIRAC hodirac_flag -#endif ); } @@ -3861,9 +3733,7 @@ void ivas_dirac_dec_render_sf( hDirAC->hOutSetup, nchan_transport, md_idx, -#ifdef HODIRAC hodirac_flag -#endif ); } #endif @@ -3936,13 +3806,11 @@ void ivas_dirac_dec_render_sf( hDirAC->subframe_nbslots[subframe_idx], #endif p_onset_filter -#ifdef HODIRAC , #ifdef JBM_TSM_ON_TCS md_idx, #endif hodirac_flag -#endif ); } else @@ -4896,10 +4764,8 @@ static void protoSignalComputation4( const int16_t num_freq_bands, const float *mtx_hoa_decoder, const int16_t nchan_transport -#ifdef HODIRAC , const int16_t *sba_map_tc_ind -#endif ) { int16_t k, l; @@ -4926,13 +4792,8 @@ static void protoSignalComputation4( proto_frame_f[2 * l * num_freq_bands + 2 * k + 1] = 0.f; for ( n = 0; n < nchan_transport; n++ ) { -#ifdef HODIRAC proto_frame_f[2 * l * num_freq_bands + 2 * k] += RealBuffer[n][0][k] * mtx_hoa_decoder[l * 16 + sba_map_tc_ind[n]]; proto_frame_f[2 * l * num_freq_bands + 2 * k + 1] += ImagBuffer[n][0][k] * mtx_hoa_decoder[l * 16 + sba_map_tc_ind[n]]; -#else - proto_frame_f[2 * l * num_freq_bands + 2 * k] += RealBuffer[n][0][k] * mtx_hoa_decoder[l * 16 + sba_map_tc[n]]; - proto_frame_f[2 * l * num_freq_bands + 2 * k + 1] += ImagBuffer[n][0][k] * mtx_hoa_decoder[l * 16 + sba_map_tc[n]]; -#endif } } } diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c index f88b5f5f3a..9a63f6fbd9 100755 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -91,16 +91,12 @@ ivas_error ivas_dirac_dec_output_synthesis_open( RENDERER_TYPE renderer_type, /* i : renderer type */ const int16_t nchan_transport, /* i : number of transport channels */ const int32_t output_Fs /* i : output sampling rate */ -#ifdef HODIRAC , const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ -#endif ) { int16_t idx, ch_idx; -#ifdef HODIRAC int16_t size; -#endif float tmp; uint16_t num_diffuse_responses; float temp_alpha_synthesis[CLDFB_NO_CHANNELS_MAX]; @@ -178,7 +174,6 @@ ivas_error ivas_dirac_dec_output_synthesis_open( } /* target PSD buffers */ -#ifdef HODIRAC if ( hodirac_flag ) { size = hDirAC->num_freq_bands * hDirAC->num_outputs_dir * DIRAC_HO_NUMSECTORS; @@ -191,12 +186,6 @@ ivas_error ivas_dirac_dec_output_synthesis_open( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); } -#else - if ( ( dirac_output_synthesis_state->cy_cross_dir_smooth_prev = (float *) malloc( hDirAC->num_freq_bands * hDirAC->num_outputs_dir * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); - } -#endif if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { @@ -230,17 +219,10 @@ ivas_error ivas_dirac_dec_output_synthesis_open( } /* direct and diffuse gain buffers */ -#ifdef HODIRAC if ( ( dirac_output_synthesis_state->gains_dir_prev = (float *) malloc( size * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); } -#else - if ( ( dirac_output_synthesis_state->gains_dir_prev = (float *) malloc( hDirAC->num_freq_bands * hDirAC->num_outputs_dir * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); - } -#endif if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { @@ -387,15 +369,11 @@ ivas_error ivas_dirac_dec_output_synthesis_open( void ivas_dirac_dec_output_synthesis_init( DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ const int16_t nchan_out_woLFE /* i : number of output audio channels without LFE */ -#ifdef HODIRAC , const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ -#endif ) { -#ifdef HODIRAC int16_t size; -#endif DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params; DIRAC_OUTPUT_SYNTHESIS_STATE *h_dirac_output_synthesis_state; @@ -413,7 +391,6 @@ void ivas_dirac_dec_output_synthesis_init( set_zero( h_dirac_output_synthesis_state->cy_auto_dir_smooth_prev, hDirAC->num_freq_bands * hDirAC->num_outputs_dir ); } -#ifdef HODIRAC if ( hodirac_flag ) { size = hDirAC->num_freq_bands * hDirAC->num_outputs_dir * DIRAC_HO_NUMSECTORS; @@ -423,9 +400,6 @@ void ivas_dirac_dec_output_synthesis_init( size = hDirAC->num_freq_bands * hDirAC->num_outputs_dir; } set_zero( h_dirac_output_synthesis_state->cy_cross_dir_smooth_prev, size ); -#else - set_zero( h_dirac_output_synthesis_state->cy_cross_dir_smooth_prev, hDirAC->num_freq_bands * hDirAC->num_outputs_dir ); -#endif if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { @@ -444,11 +418,7 @@ void ivas_dirac_dec_output_synthesis_init( { set_zero( h_dirac_output_synthesis_state->proto_power_smooth_prev, hDirAC->num_freq_bands * hDirAC->num_protos_dir ); } -#ifdef HODIRAC set_zero( h_dirac_output_synthesis_state->gains_dir_prev, size ); -#else - set_zero( h_dirac_output_synthesis_state->gains_dir_prev, hDirAC->num_freq_bands * hDirAC->num_outputs_dir ); -#endif if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { @@ -591,14 +561,12 @@ void ivas_dirac_dec_output_synthesis_process_slot( const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ const int16_t nchan_transport /* i : number of transport channels*/ -#if !defined( HODIRAC ) || defined( JBM_TSM_ON_TCS ) +#if defined( JBM_TSM_ON_TCS ) , const int16_t md_idx #endif -#ifdef HODIRAC , const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ -#endif ) { int16_t num_freq_bands, num_channels_dir; @@ -635,7 +603,6 @@ void ivas_dirac_dec_output_synthesis_process_slot( num_channels_dir = hOutSetup.nchan_out_woLFE; } -#ifdef HODIRAC if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD && hodirac_flag ) { ivas_dirac_dec_compute_directional_responses( hDirAC, @@ -712,7 +679,6 @@ void ivas_dirac_dec_output_synthesis_process_slot( } } else // ( hDirAC->hConfig->dec_param_estim == TRUE ) -#endif if ( hDirAC->hConfig->dec_param_estim == TRUE ) { @@ -727,10 +693,8 @@ void ivas_dirac_dec_output_synthesis_process_slot( NULL, sh_rot_max_order, p_Rmat -#ifdef HODIRAC , hodirac_flag -#endif ); #endif @@ -873,13 +837,11 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( const int16_t nbslots, /* i : number of slots to process */ #endif const float *onset_filter -#ifdef HODIRAC , #ifdef JBM_TSM_ON_TCS const int16_t md_idx, #endif const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ -#endif ) { int16_t buf_idx, ch_idx, i, l; @@ -899,11 +861,9 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( DIRAC_OUTPUT_SYNTHESIS_STATE h_dirac_output_synthesis_state; int16_t nchan_transport_foa; int16_t ch_idx_diff; -#ifdef HODIRAC float aux_buf[CLDFB_NO_CHANNELS_MAX]; float ratio[DIRAC_HO_NUMSECTORS * CLDFB_NO_CHANNELS_MAX]; const float *diffuseness; -#endif /* collect some often used parameters */ h_dirac_output_synthesis_params = hDirAC->h_output_synthesis_psd_params; @@ -917,19 +877,16 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( num_channels_diff = hDirAC->num_outputs_diff; nchan_transport_foa = min( 4, nchan_transport ); -#ifdef HODIRAC #ifdef JBM_TSM_ON_TCS diffuseness = hDirAC->diffuseness_vector[md_idx]; #else diffuseness = hDirAC->diffuseness_vector[hDirAC->dirac_read_idx]; -#endif #endif /*-----------------------------------------------------------------* * comput target Gains *-----------------------------------------------------------------*/ -#ifdef HODIRAC if ( hodirac_flag ) { assert( hDirAC->hConfig->dec_param_estim == FALSE ); @@ -984,7 +941,6 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( } } else -#endif if ( hDirAC->hConfig->dec_param_estim == FALSE ) { /*Direct gain*/ @@ -1032,7 +988,6 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( p_gains_dir = h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev; /* Direct gains */ -#ifdef HODIRAC if ( hodirac_flag ) { for ( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ ) @@ -1049,7 +1004,6 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( } } else -#endif { for ( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ ) { @@ -1079,7 +1033,6 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( } } -#ifdef HODIRAC if ( hodirac_flag ) { p_cy_cross_dir_smooth = h_dirac_output_synthesis_state.cy_cross_dir_smooth + num_freq_bands * num_channels_dir; @@ -1109,7 +1062,6 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( } } } -#endif /*Diffuse gains*/ p_cy_auto_diff_smooth = h_dirac_output_synthesis_state.cy_auto_diff_smooth + nchan_transport_foa * num_freq_bands_diff; @@ -1157,7 +1109,6 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( /*Directional stream*/ for ( ch_idx = nchan_transport_foa; ch_idx < num_channels_dir; ch_idx++ ) { -#ifdef HODIRAC if ( hodirac_flag ) { if ( proto_direct_index[ch_idx] == 0 ) @@ -1204,7 +1155,6 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( } } else -#endif { p_proto = h_dirac_output_synthesis_state.proto_direct_buffer_f + buf_idx * 2 * num_freq_bands * num_protos_dir + @@ -1244,13 +1194,8 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( for ( l = 0; l < num_freq_bands_diff; l++ ) { g = g1 * ( *( p_gains_diff++ ) ) + g2 * ( *( p_gains_diff_prev++ ) ); -#ifdef HODIRAC output_real[l * num_channels_dir + hDirAC->sba_map_tc[ch_idx]] += g * ( *( p_proto++ ) ); /* maps ch_idx 5 to 8 */ output_imag[l * num_channels_dir + hDirAC->sba_map_tc[ch_idx]] += g * ( *( p_proto++ ) ); -#else - output_real[l * num_channels_dir + sba_map_tc[ch_idx]] += g * ( *( p_proto++ ) ); /* maps ch_idx 5 to 8 */ - output_imag[l * num_channels_dir + sba_map_tc[ch_idx]] += g * ( *( p_proto++ ) ); -#endif } } else @@ -1314,13 +1259,11 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( *-----------------------------------------------------------------*/ /* store estimates for next synthesis block */ -#ifdef HODIRAC if ( hodirac_flag ) { mvr2r( h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev, h_dirac_output_synthesis_state.gains_dir_prev, num_freq_bands * num_channels_dir * DIRAC_HO_NUMSECTORS ); } else -#endif { mvr2r( h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev, h_dirac_output_synthesis_state.gains_dir_prev, num_freq_bands * num_channels_dir ); } @@ -1328,13 +1271,11 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( mvr2r( h_dirac_output_synthesis_state.cy_auto_diff_smooth_prev, h_dirac_output_synthesis_state.gains_diff_prev, num_freq_bands_diff * num_channels_diff ); /* reset values */ -#ifdef HODIRAC if ( hodirac_flag ) { set_zero( h_dirac_output_synthesis_state.cy_cross_dir_smooth, num_freq_bands * num_channels_dir * DIRAC_HO_NUMSECTORS ); } else -#endif { set_zero( h_dirac_output_synthesis_state.cy_cross_dir_smooth, num_freq_bands * num_channels_dir ); } @@ -1889,10 +1830,8 @@ void ivas_dirac_dec_compute_directional_responses( const float *surCohRatio, const int16_t shd_rot_max_order, /* i : split-order rotation method */ const float *p_Rmat /* i : rotation matrix */ -#ifdef HODIRAC , const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ -#endif ) { int16_t k, l; @@ -1971,7 +1910,6 @@ void ivas_dirac_dec_compute_directional_responses( /* HOA3 PANNING */ if ( hDirAC->panningConf == DIRAC_PANNING_HOA3 ) { -#ifdef HODIRAC set_f( direct_response_hoa, 1.0f, MAX_OUTPUT_CHANNELS ); set_f( direct_response_dir2, 1.0f, MAX_OUTPUT_CHANNELS ); @@ -2003,22 +1941,6 @@ void ivas_dirac_dec_compute_directional_responses( mvr2r_inc( direct_response_dir2, 1, &hDirAC->h_output_synthesis_psd_state.direct_responses[k + hDirAC->num_freq_bands * num_channels_dir], hDirAC->num_freq_bands, num_channels_dir ); } } -#else - set_f( direct_response_hoa, 1.0f, MAX_OUTPUT_CHANNELS ); - if ( p_Rmat != 0 ) - { - ivas_dirac_dec_get_response_split_order( azimuth[k], elevation[k], direct_response_hoa, shd_rot_max_order, p_Rmat ); - } - else - { - ivas_dirac_dec_get_response( azimuth[k], elevation[k], direct_response_hoa, hDirAC->hOutSetup.ambisonics_order ); - } - - if ( hMasa == NULL && hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) - { - mvr2r_inc( direct_response_hoa, 1, &hDirAC->h_output_synthesis_psd_state.direct_responses[k], hDirAC->num_freq_bands, num_channels_dir ); - } -#endif else if ( ( ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) && ( hMasa != NULL ) ) || hDirAC->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD || hDirAC->synthesisConf == DIRAC_SYNTHESIS_MONO ) { diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 2c2fa6c9f4..0dd5efec70 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -944,11 +944,7 @@ ivas_error ivas_init_decoder( ivas_total_brate, st_ivas->sba_analysis_order, st_ivas->sba_mode, -#ifdef HODIRAC ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) -#else - IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND -#endif ) ) != IVAS_ERR_OK ) { return error; @@ -972,7 +968,6 @@ ivas_error ivas_init_decoder( int16_t band_grouping[IVAS_MAX_NUM_BANDS + 1]; st_ivas->hSpar->enc_param_start_band = min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); -#ifdef HODIRAC if ( ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ) { st_ivas->hSpar->enc_param_start_band = 0; @@ -980,7 +975,6 @@ ivas_error ivas_init_decoder( set_c( (int8_t *) st_ivas->hQMetaData->twoDirBands, (int8_t) 1, st_ivas->hQMetaData->q_direction[0].cfg.nbands ); st_ivas->hQMetaData->numTwoDirBands = (uint8_t) st_ivas->hQMetaData->q_direction[0].cfg.nbands; } -#endif ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (int16_t) ( st_ivas->hDecoderConfig->output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ), st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 5217954a68..f1275973f7 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -187,9 +187,7 @@ ivas_error ivas_jbm_dec_tc( if ( st_ivas->ivas_format == SBA_FORMAT ) { ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, -#ifdef HODIRAC st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_256k, -#endif 0 ); } else @@ -212,9 +210,7 @@ ivas_error ivas_jbm_dec_tc( st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, -#ifdef HODIRAC st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_256k, -#endif st_ivas->hSpar->dirac_to_spar_md_bands ); } @@ -272,10 +268,8 @@ ivas_error ivas_jbm_dec_tc( } ivas_spar_dec_gen_umx_mat( st_ivas->hSpar->hMdDec, st_ivas->nchan_transport, IVAS_MAX_NUM_BANDS, st_ivas->bfi -#ifdef HODIRAC , ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate ) -#endif ); } diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 38665a098d..2d93d23d04 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -212,10 +212,8 @@ ivas_error ivas_masa_decode( { #endif *nb_bits_read += ivas_qmetadata_dec_decode( hQMetaData, st->bit_stream, &st->next_bit_pos -#ifdef HODIRAC , 0 -#endif ); #ifdef HR_METADATA } @@ -304,10 +302,8 @@ ivas_error ivas_masa_decode( { ivas_qmetadata_to_dirac( hQMetaData, st_ivas->hDirAC, hMasa, ivas_total_brate, SBA_MODE_NONE -#ifdef HODIRAC , 0 -#endif , 0 ); } diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index 2421c6730c..feab7a351f 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -153,10 +153,8 @@ void ivas_renderer_select( { nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order -#ifdef HODIRAC , st_ivas->hDecoderConfig->ivas_total_brate -#endif ); if ( nchan_internal == 2 ) { diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index 5480f73a33..c66369e0fb 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -139,10 +139,8 @@ int16_t ivas_qmetadata_dec_decode( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: hQMetaData handle */ uint16_t *bitstream, /* i : bitstream */ int16_t *index /* i/o: bitstream position */ -#ifdef HODIRAC , const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ -#endif ) { int16_t d, b, m; @@ -230,7 +228,6 @@ int16_t ivas_qmetadata_dec_decode( bits_diff_sum = 0; bits_diff_sum += ivas_qmetadata_entropy_decode_diffuseness( bitstream, index, &( hQMetaData->q_direction[0] ), &diffuseness_index_max_ec_frame_pre[0] ); -#ifdef HODIRAC if ( hodirac_flag ) { if ( hQMetaData->no_directions == 2 ) @@ -250,7 +247,6 @@ int16_t ivas_qmetadata_dec_decode( } } else -#endif { if ( hQMetaData->no_directions == 2 ) { @@ -282,7 +278,6 @@ int16_t ivas_qmetadata_dec_decode( diffRatio = diffuseness_reconstructions[hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0]]; dfRatio_qsteps = 1 << dfRatio_bits[dir2band]; -#ifdef HODIRAC /* already encoded as total and ratios in HO-DirAC */ if ( hodirac_flag ) { @@ -291,7 +286,6 @@ int16_t ivas_qmetadata_dec_decode( dir2ratio = dfRatio; } else -#endif { dfRatio = usdequant( hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0], 0.5f, 0.5f / ( dfRatio_qsteps - 1 ) ); @@ -302,14 +296,12 @@ int16_t ivas_qmetadata_dec_decode( /* Requantize the 1 - dirRatio separately for each direction to obtain inverted dirRatio index. These are used in further decoding. */ hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0] = masa_sq( 1.0f - dir1ratio, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); -#ifdef HODIRAC if ( hodirac_flag ) { float tmp; hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0] = usquant( dir2ratio, &tmp, 0.0f, 1.f / ( DIRAC_DIFFUSE_LEVELS - 1 ), DIRAC_DIFFUSE_LEVELS ); } else -#endif { hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0] = masa_sq( 1.0f - dir2ratio, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); } @@ -369,10 +361,8 @@ int16_t ivas_qmetadata_dec_decode( index_dirRatio2Inv = hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0]; masa_compensate_two_dir_energy_ratio_index( index_dirRatio1Inv, index_dirRatio2Inv, &index_dirRatio1Inv_mod, &index_dirRatio2Inv_mod -#ifdef HODIRAC , hodirac_flag -#endif ); for ( m = 0; m < hQMetaData->q_direction[0].cfg.nblocks; m++ ) @@ -764,9 +754,7 @@ int16_t ivas_qmetadata_dec_decode( } /* Scale energy ratios that sum to over one */ -#ifdef HODIRAC if ( !hodirac_flag ) -#endif { for ( b = 0; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) { diff --git a/lib_dec/ivas_rom_dec.c b/lib_dec/ivas_rom_dec.c index 04737f6df1..c337bd288e 100644 --- a/lib_dec/ivas_rom_dec.c +++ b/lib_dec/ivas_rom_dec.c @@ -520,7 +520,6 @@ const float ap_split_frequencies[DIRAC_DECORR_NUM_SPLIT_BANDS + 1] = 0.0f, 0.125f, 0.375f, 1.0f }; -#ifdef HODIRAC const int16_t sba_map_tc[11] = { 0, 1, 2, 3, 4, 8, 9, 15, 5, 6, 7 @@ -529,12 +528,6 @@ const int16_t sba_map_tc_512[11] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 15 }; -#else -const int16_t sba_map_tc[8] = -{ - 0, 1, 2, 3, 4, 8, 9, 15 -}; -#endif /*----------------------------------------------------------------------------------* diff --git a/lib_dec/ivas_rom_dec.h b/lib_dec/ivas_rom_dec.h index 39485c8084..7a19f170c0 100644 --- a/lib_dec/ivas_rom_dec.h +++ b/lib_dec/ivas_rom_dec.h @@ -111,12 +111,8 @@ extern const float ap_lattice_coeffs_3[DIRAC_DECORR_FILTER_LEN_3 * DIRAC_MAX_NUM extern const float *const ap_lattice_coeffs[DIRAC_DECORR_NUM_SPLIT_BANDS]; extern const float ap_split_frequencies[DIRAC_DECORR_NUM_SPLIT_BANDS + 1]; -#ifdef HODIRAC extern const int16_t sba_map_tc[11]; extern const int16_t sba_map_tc_512[11]; -#else -extern const int16_t sba_map_tc[8]; -#endif /*----------------------------------------------------------------------------------* * FASTCONV and PARAMETRIC binaural renderer ROM tables diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 7b48f1d769..5b23fe456c 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -109,9 +109,7 @@ ivas_error ivas_sba_dec_reconfigure( int16_t numCldfbAnalyses_old, numCldfbSyntheses_old; int16_t sba_dirac_stereo_flag_old; int32_t ivas_total_brate; -#ifdef HODIRAC int32_t last_ivas_total_brate; -#endif RENDERER_TYPE old_renderer_type; @@ -121,9 +119,7 @@ ivas_error ivas_sba_dec_reconfigure( hDecoderConfig = st_ivas->hDecoderConfig; ivas_total_brate = hDecoderConfig->ivas_total_brate; -#ifdef HODIRAC last_ivas_total_brate = st_ivas->last_active_ivas_total_brate; -#endif /*-----------------------------------------------------------------* * Set SBA high-level parameters @@ -175,9 +171,7 @@ ivas_error ivas_sba_dec_reconfigure( } if ( nchan_transport_old != ivas_get_sba_num_TCs( ivas_total_brate, sba_order_internal ) -#ifdef HODIRAC || ( last_ivas_total_brate >= IVAS_512k && ivas_total_brate < IVAS_512k ) || ( last_ivas_total_brate < IVAS_512k && ivas_total_brate >= IVAS_512k ) -#endif ) { @@ -274,9 +268,7 @@ ivas_error ivas_sba_dec_reconfigure( } if ( ( ( st_ivas->renderer_type != RENDERER_DISABLE ) && ( st_ivas->renderer_type != RENDERER_SBA_LINEAR_DEC ) ) || ( ( hDecoderConfig->output_config != AUDIO_CONFIG_FOA ) && ( st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_STEREO ) && ( st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_MONO ) ) -#ifdef HODIRAC || ( last_ivas_total_brate > IVAS_256k && ivas_total_brate <= IVAS_256k ) || ( last_ivas_total_brate <= IVAS_256k && ivas_total_brate > IVAS_256k ) -#endif ) { DIRAC_CONFIG_FLAG flag_config; @@ -310,11 +302,7 @@ ivas_error ivas_sba_dec_reconfigure( ivas_total_brate, st_ivas->sba_analysis_order, st_ivas->sba_mode, -#ifdef HODIRAC ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) -#else - IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND -#endif ) ) != IVAS_ERR_OK ) { @@ -399,10 +387,8 @@ ivas_error ivas_sba_dec_reconfigure( else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) { tc_nchan_to_allocate = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order -#ifdef HODIRAC , st_ivas->hDecoderConfig->ivas_total_brate -#endif ); } else @@ -496,10 +482,8 @@ void ivas_sba_dec_render( hSpar = st_ivas->hSpar; nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order -#ifdef HODIRAC , st_ivas->hDecoderConfig->ivas_total_brate -#endif ); nchan_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; #ifdef DEBUGGING diff --git a/lib_dec/ivas_sba_rendering_internal.c b/lib_dec/ivas_sba_rendering_internal.c index 6d71f1f8b8..bab2e6ca7b 100644 --- a/lib_dec/ivas_sba_rendering_internal.c +++ b/lib_dec/ivas_sba_rendering_internal.c @@ -439,10 +439,8 @@ void ivas_sba_upmixer_renderer( push_wmops( "ivas_sba_upmixer_renderer" ); nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order -#ifdef HODIRAC , st_ivas->hDecoderConfig->ivas_total_brate -#endif ); #ifndef JBM_TSM_ON_TCS @@ -691,10 +689,8 @@ void ivas_sba_mix_matrix_determiner( /* Mixing matrix determiner */ num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, bfi -#ifdef HODIRAC , MAX_PARAM_SPATIAL_SUBFRAMES -#endif ); return; diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 21817c460f..056f293f12 100755 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -72,18 +72,12 @@ ivas_error ivas_spar_dec_open( IVAS_FB_CFG *fb_cfg; int16_t i, j, b, active_w_mixing; int32_t output_Fs; -#ifdef HODIRAC int16_t num_decor_chs; -#endif error = IVAS_ERR_OK; sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); -#ifndef HODIRAC - num_channels_internal = ivas_sba_get_nchan_metadata( sba_order_internal ); -#else num_channels_internal = ivas_sba_get_nchan_metadata( sba_order_internal, st_ivas->hDecoderConfig->ivas_total_brate ); -#endif hSpar = st_ivas->hSpar; @@ -97,7 +91,6 @@ ivas_error ivas_spar_dec_open( } output_Fs = st_ivas->hDecoderConfig->output_Fs; -#ifdef HODIRAC if ( num_channels_internal > ( SBA_HOA2_ORDER + 1 ) * ( SBA_HOA2_ORDER + 1 ) ) { num_decor_chs = IVAS_HBR_MAX_DECOR_CHS; @@ -106,21 +99,12 @@ ivas_error ivas_spar_dec_open( { num_decor_chs = num_channels_internal - 1; } -#endif -#ifdef HODIRAC /* TD decorr. */ if ( ( error = ivas_td_decorr_dec_open( &hSpar->hTdDecorr, output_Fs, num_decor_chs + 1, 1 ) ) != IVAS_ERR_OK ) { return error; } -#else - /* TD decorr. */ - if ( ( error = ivas_td_decorr_dec_open( &hSpar->hTdDecorr, output_Fs, num_channels_internal, 1 ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif /* MD handle */ if ( ( error = ivas_spar_md_dec_open( &hSpar->hMdDec, st_ivas->hDecoderConfig, num_channels_internal, sba_order_internal, st_ivas->sid_format ) ) != IVAS_ERR_OK ) @@ -133,10 +117,8 @@ ivas_error ivas_spar_dec_open( /* set FB config. */ active_w_mixing = -1; if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_SPAR, num_channels_internal, num_channels_internal, active_w_mixing, output_Fs -#ifdef HODIRAC , 0 -#endif ) ) != IVAS_ERR_OK ) { return error; @@ -711,9 +693,7 @@ static void ivas_spar_dec_MD( { int16_t num_channels, table_idx, num_bands_out, bfi, sba_order; int32_t ivas_total_brate; -#ifdef HODIRAC int16_t num_md_sub_frames; -#endif DECODER_CONFIG_HANDLE hDecoderConfig = st_ivas->hDecoderConfig; SPAR_DEC_HANDLE hSpar = st_ivas->hSpar; @@ -727,15 +707,11 @@ static void ivas_spar_dec_MD( bfi = st_ivas->bfi; ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; num_channels = ivas_sba_get_nchan_metadata( sba_order -#ifdef HODIRAC , ivas_total_brate -#endif ); -#ifdef HODIRAC num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order, st_ivas->hDecoderConfig->ivas_total_brate ); -#endif num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; @@ -797,10 +773,8 @@ static void ivas_spar_dec_MD( { ivas_spar_setup_md_smoothing( hSpar->hMdDec, num_bands_out -#ifdef HODIRAC , num_md_sub_frames -#endif ); } else @@ -813,10 +787,8 @@ static void ivas_spar_dec_MD( if ( !bfi ) { ivas_spar_smooth_md_dtx( hSpar->hMdDec, num_bands_out -#ifdef HODIRAC , num_md_sub_frames -#endif ); } @@ -957,10 +929,8 @@ static void ivas_spar_get_skip_mat( const int16_t num_ch_in, const int16_t num_spar_bands, int16_t skip_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] -#ifdef HODIRAC , const int16_t num_md_sub_frames -#endif ) { int16_t spar_band, out_ch, in_ch; @@ -972,7 +942,6 @@ static void ivas_spar_get_skip_mat( { skip_mat[out_ch][in_ch] = 1; skip_flag = 1; -#ifdef HODIRAC for ( i_ts = 0; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) { for ( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) @@ -1010,26 +979,6 @@ static void ivas_spar_get_skip_mat( } } } -#else - - for ( i_ts = 0; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) - { - for ( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) - { - if ( hSpar->hMdDec->mixer_mat_prev[1 + i_ts][out_ch][in_ch][spar_band] != 0.0f || hSpar->hMdDec->mixer_mat[out_ch][in_ch][spar_band + i_ts * MAX_PARAM_SPATIAL_SUBFRAMES] != 0.0f ) - { - skip_flag = 0; - break; - } - } - - if ( skip_flag == 0 ) - { - skip_mat[out_ch][in_ch] = 0; - break; - } - } -#endif } } @@ -1150,10 +1099,8 @@ void ivas_spar_dec_agc_pca( if ( hSpar->hMdDec->td_decorr_flag ) { num_in_ingest = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order -#ifdef HODIRAC , st_ivas->hDecoderConfig->ivas_total_brate -#endif ); } else @@ -1225,10 +1172,8 @@ void ivas_spar_dec_set_render_params( nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, st_ivas->bfi -#ifdef HODIRAC , ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate ) -#endif ); ivas_spar_dec_set_render_map( st_ivas, n_cldfb_slots ); @@ -1257,10 +1202,8 @@ void ivas_spar_dec_digest_tc( default_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); nSamplesLeftForTD = nSamplesForRendering; nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order -#ifdef HODIRAC , st_ivas->hDecoderConfig->ivas_total_brate -#endif ); for ( ch = 0; ch < nchan_internal; ch++ ) { @@ -1272,7 +1215,6 @@ void ivas_spar_dec_digest_tc( { int16_t nSamplesToDecorr = min( nSamplesLeftForTD, default_frame ); ivas_td_decorr_process( hSpar->hTdDecorr, p_tc, pPcm_tmp, nSamplesToDecorr ); -#ifdef HODIRAC if ( hSpar->hTdDecorr->num_apd_outputs >= ( nchan_internal - nchan_transport ) ) { for ( ch = 0; ch < nchan_internal - nchan_transport; ch++ ) @@ -1291,12 +1233,6 @@ void ivas_spar_dec_digest_tc( mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - ch], p_tc[nchan_internal - 1 - ch], nSamplesToDecorr ); } } -#else - for ( ch = 0; ch < nchan_internal - nchan_transport; ch++ ) - { - mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - ch], p_tc[nchan_internal - 1 - ch], nSamplesToDecorr ); - } -#endif for ( ch = 0; ch < nchan_internal; ch++ ) { p_tc[ch] += nSamplesToDecorr; @@ -1349,7 +1285,6 @@ void ivas_spar_dec_upmixer( if ( hSpar->hMdDec->td_decorr_flag ) { ivas_td_decorr_process( hSpar->hTdDecorr, st_ivas->hTcBuffer->tc, pPcm_tmp, output_frame ); -#ifdef HODIRAC if ( hSpar->hTdDecorr->num_apd_outputs >= ( nchan_internal - nchan_transport ) ) { for ( i = 0; i < nchan_internal - nchan_transport; i++ ) @@ -1368,12 +1303,6 @@ void ivas_spar_dec_upmixer( mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], st_ivas->hTcBuffer->tc[nchan_internal - 1 - i], output_frame ); } } -#else - for ( i = 0; i < nchan_internal - nchan_transport; i++ ) - { - mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], st_ivas->hTcBuffer->tc[nchan_internal - 1 - i], output_frame ); - } -#endif } @@ -1454,12 +1383,10 @@ void ivas_spar_dec_upmixer( int16_t b_skip_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; DECODER_CONFIG_HANDLE hDecoderConfig; SPAR_DEC_HANDLE hSpar; -#ifdef HODIRAC int16_t num_md_sub_frames; #ifndef JBM_TSM_ON_TCS int16_t md_sf_idx; #endif -#endif #ifdef JBM_TSM_ON_TCS push_wmops( "ivas_spar_dec_upmixer_sf" ); @@ -1478,9 +1405,7 @@ void ivas_spar_dec_upmixer( numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; numch_out = hSpar->hFbMixer->fb_cfg->num_out_chans; -#ifdef HODIRAC num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, hDecoderConfig->ivas_total_brate ); -#endif #ifdef JBM_TSM_ON_TCS slot_size = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); @@ -1587,7 +1512,6 @@ void ivas_spar_dec_upmixer( { ivas_td_decorr_process( hSpar->hTdDecorr, output, pPcm_tmp, output_frame ); -#ifdef HODIRAC if ( hSpar->hTdDecorr->num_apd_outputs >= ( nchan_internal - nchan_transport ) ) { for ( i = 0; i < nchan_internal - nchan_transport; i++ ) @@ -1606,12 +1530,6 @@ void ivas_spar_dec_upmixer( mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], output[nchan_internal - 1 - i], output_frame ); } } -#else - for ( i = 0; i < nchan_internal - nchan_transport; i++ ) - { - mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], output[nchan_internal - 1 - i], output_frame ); - } -#endif } #endif hSpar->hFbMixer->fb_cfg->num_in_chans = num_in_ingest; @@ -1652,10 +1570,8 @@ void ivas_spar_dec_upmixer( *---------------------------------------------------------------------*/ ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, st_ivas->bfi -#ifdef HODIRAC , num_md_sub_frames -#endif ); #endif @@ -1668,10 +1584,8 @@ void ivas_spar_dec_upmixer( /* apply parameters */ /* determine if we can skip certain data */ ivas_spar_get_skip_mat( hSpar, numch_out, numch_in, num_spar_bands, b_skip_mat -#ifdef HODIRAC , num_md_sub_frames -#endif ); /* this can be precomputed based on bitrate and format*/ numch_out_dirac = hDecoderConfig->nchan_out; @@ -1758,7 +1672,6 @@ void ivas_spar_dec_upmixer( for ( in_ch = 0; in_ch < numch_in; in_ch++ ) { -#ifdef HODIRAC if ( b_skip_mat[out_ch][in_ch] == 0 ) { if ( cldfb_band < CLDFB_PAR_WEIGHT_START_BAND ) /* tuning parameter, depends on how much SPAR Filters overlap for the CLDFB bands */ @@ -1780,31 +1693,6 @@ void ivas_spar_dec_upmixer( out_im[out_ch] += cldfb_in_ts_im[in_ch][ts][cldfb_band] * cldfb_par; } } -#else - - if ( b_skip_mat[out_ch][in_ch] ) - { - continue; - } - else if ( cldfb_band < CLDFB_PAR_WEIGHT_START_BAND ) /* tuning parameter, depends on how much SPAR Filters overlap for the CLDFB bands */ - { - spar_band = bin2band->p_cldfb_map_to_spar_band[cldfb_band]; - cldfb_par = mixer_mat[out_ch][in_ch][spar_band]; - } - else - { - cldfb_par = 0.0f; - for ( spar_band = bin2band->p_spar_start_bands[cldfb_band]; spar_band < num_spar_bands; spar_band++ ) - { - /* accumulate contributions from all SPAR bands */ - cldfb_par += mixer_mat[out_ch][in_ch][spar_band] * bin2band->pp_cldfb_weights_per_spar_band[cldfb_band][spar_band]; - } - } - - out_re[out_ch] += cldfb_in_ts_re[in_ch][ts][cldfb_band] * cldfb_par; - out_im[out_ch] += cldfb_in_ts_im[in_ch][ts][cldfb_band] * cldfb_par; - } -#endif } /*update CLDFB data with the parameter-modified data*/ @@ -1820,9 +1708,7 @@ void ivas_spar_dec_upmixer( /* we have crossed an unadapted parameter sf border, update previous mixing matrices */ int16_t md_sf = md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME; split_band = SPAR_DIRAC_SPLIT_START_BAND; -#ifdef HODIRAC md_sf = ( num_md_sub_frames == MAX_PARAM_SPATIAL_SUBFRAMES ) ? md_sf : 0; -#endif if ( split_band < IVAS_MAX_NUM_BANDS ) { mvr2r( hSpar->hMdDec->mixer_mat_prev[1][0][0], hSpar->hMdDec->mixer_mat_prev[0][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); @@ -1940,9 +1826,7 @@ void ivas_spar_dec_upmixer( #ifndef JBM_TSM_ON_TCS -#ifdef HODIRAC md_sf_idx = ( num_md_sub_frames == MAX_PARAM_SPATIAL_SUBFRAMES ) ? i_sf : 0; -#endif split_band = SPAR_DIRAC_SPLIT_START_BAND; if ( split_band < IVAS_MAX_NUM_BANDS ) { @@ -1959,11 +1843,7 @@ void ivas_spar_dec_upmixer( { for ( b = 0; b < num_spar_bands; b++ ) { -#ifdef HODIRAC hSpar->hMdDec->mixer_mat_prev[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][b + md_sf_idx * IVAS_MAX_NUM_BANDS]; -#else - hSpar->hMdDec->mixer_mat_prev[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][b + i_sf * IVAS_MAX_NUM_BANDS]; -#endif } } } diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index 26c9c4a448..a9fc187975 100755 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -64,11 +64,7 @@ static const int16_t ivas_spar_dec_plc_spatial_target[IVAS_SPAR_MAX_CH] = { 1, 0 *------------------------------------------------------------------------------------------*/ static void ivas_get_spar_matrices( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands_out, const int16_t n_ts, const int16_t bw, const int16_t dtx_vad, const int16_t nB, -#ifdef HODIRAC const int16_t numch_out, -#else - const int16_t sba_order, -#endif const int16_t active_w_vlbr ); static void ivas_decode_arith_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder_State *st, const uint16_t qsi, const int16_t nB, const int16_t bands_bw, int16_t *pDo_diff, const int16_t freq_diff, const int16_t planarCP, const int16_t strat, const int32_t ivas_total_brate ); @@ -82,22 +78,14 @@ static void ivas_get_band_idx_from_differential( ivas_spar_md_t *pSpar_md, const static void ivas_mat_col_rearrange( float in_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], const int16_t order[IVAS_SPAR_MAX_CH], const int16_t i_ts, float ***mixer_mat, const int16_t bands, const int16_t num_ch ); static void ivas_spar_dec_compute_ramp_down_post_matrix( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands, const int16_t bfi -#ifdef HODIRAC , const int16_t num_md_sub_frames -#endif ); static void ivas_spar_md_fill_invalid_bands( ivas_spar_dec_matrices_t *pSpar_coeffs, ivas_spar_dec_matrices_t *pSpar_coeffs_prev, const int16_t *valid_bands, int16_t *base_band_age, const int16_t num_bands, -#ifdef HODIRAC const int16_t numch_out -#else - const int16_t sba_order -#endif -#ifdef HODIRAC , const int16_t num_md_sub_frames -#endif ); static ivas_error ivas_spar_set_dec_config( ivas_spar_md_dec_state_t *hMdDec, const int16_t nchan_transport, float *pFC ); @@ -118,23 +106,13 @@ static void ivas_spar_dec_parse_md_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder static ivas_error ivas_spar_md_dec_matrix_open( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t num_channels /* i : number of internal channels */ -#ifdef HODIRAC , const int16_t num_md_sub_frames -#endif ) { int16_t i, j; -#ifndef HODIRAC - int16_t num_md_sub_frames; - num_md_sub_frames = MAX_PARAM_SPATIAL_SUBFRAMES; -#endif -#ifdef HODIRAC if ( ( hMdDec->spar_md.band_coeffs = (ivas_band_coeffs_t *) malloc( IVAS_MAX_NUM_BANDS * num_md_sub_frames * sizeof( ivas_band_coeffs_t ) ) ) == NULL ) -#else - if ( ( hMdDec->spar_md.band_coeffs = (ivas_band_coeffs_t *) malloc( IVAS_MAX_NUM_BANDS * MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( ivas_band_coeffs_t ) ) ) == NULL ) -#endif { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for band_coeffs in SPAR MD" ); } @@ -150,11 +128,7 @@ static ivas_error ivas_spar_md_dec_matrix_open( } for ( j = 0; j < num_channels; j++ ) { -#ifdef HODIRAC if ( ( hMdDec->mixer_mat[i][j] = (float *) malloc( num_md_sub_frames * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) -#else - if ( ( hMdDec->mixer_mat[i][j] = (float *) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) -#endif { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } @@ -173,11 +147,7 @@ static ivas_error ivas_spar_md_dec_matrix_open( } for ( j = 0; j < num_channels; j++ ) { -#ifdef HODIRAC if ( ( hMdDec->spar_coeffs.C_re[i][j] = (float *) malloc( num_md_sub_frames * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) -#else - if ( ( hMdDec->spar_coeffs.C_re[i][j] = (float *) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) -#endif { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } @@ -196,11 +166,7 @@ static ivas_error ivas_spar_md_dec_matrix_open( } for ( j = 0; j < num_channels; j++ ) { -#ifdef HODIRAC if ( ( hMdDec->spar_coeffs.P_re[i][j] = (float *) malloc( num_md_sub_frames * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) -#else - if ( ( hMdDec->spar_coeffs.P_re[i][j] = (float *) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) -#endif { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } @@ -286,7 +252,6 @@ static ivas_error ivas_spar_md_dec_matrix_open( return IVAS_ERR_OK; } -#ifdef HODIRAC int16_t ivas_get_spar_dec_md_num_subframes( const int16_t sba_order, /* i : Ambisonic (SBA) order */ const int32_t ivas_total_brate ) @@ -302,7 +267,6 @@ int16_t ivas_get_spar_dec_md_num_subframes( } return ( num_subframes ); } -#endif /*------------------------------------------------------------------------- * ivas_spar_md_dec_open() @@ -320,9 +284,7 @@ ivas_error ivas_spar_md_dec_open( { ivas_spar_md_dec_state_t *hMdDec; ivas_error error; -#ifdef HODIRAC int16_t num_md_sub_frames; -#endif error = IVAS_ERR_OK; @@ -331,14 +293,10 @@ ivas_error ivas_spar_md_dec_open( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD decoder" ); } -#ifdef HODIRAC num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order, hDecoderConfig->ivas_total_brate ); -#endif if ( ( error = ivas_spar_md_dec_matrix_open( hMdDec, num_channels -#ifdef HODIRAC , num_md_sub_frames -#endif ) ) != IVAS_ERR_OK ) { return error; @@ -516,15 +474,9 @@ ivas_error ivas_spar_md_dec_init( int16_t nchan_transport; float pFC[IVAS_MAX_NUM_BANDS], PR_minmax[2]; -#ifdef HODIRAC ivas_sba_get_spar_hoa_md_flag( sba_order, hDecoderConfig->ivas_total_brate, &hMdDec->spar_hoa_md_flag, &hMdDec->spar_hoa_dirac2spar_md_flag ); -#else - hMdDec->spar_hoa_md_flag = ivas_sba_get_spar_hoa_md_flag( sba_order, hDecoderConfig->ivas_total_brate ); -#endif -#ifdef HODIRAC ivas_sba_get_spar_hoa_ch_ind( num_channels, hDecoderConfig->ivas_total_brate, hMdDec->HOA_md_ind ); -#endif hMdDec->spar_md.num_bands = ( hMdDec->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); @@ -654,10 +606,8 @@ static ivas_error ivas_spar_set_dec_config( } nchan = ivas_sba_get_nchan_metadata( ivas_spar_br_table_consts[hMdDec->table_idx].sba_order -#ifdef HODIRAC , ivas_spar_br_table_consts[hMdDec->table_idx].ivas_total_brate -#endif ); switch ( nchan ) @@ -718,9 +668,7 @@ void ivas_spar_md_dec_process( { int16_t j, k, b, bw, dtx_vad, nB, i_ts; ivas_spar_md_dec_state_t *hMdDec; -#ifdef HODIRAC int16_t num_md_chs; -#endif int16_t num_md_sub_frames; hMdDec = st_ivas->hSpar->hMdDec; @@ -728,14 +676,8 @@ void ivas_spar_md_dec_process( int16_t active_w_vlbr; active_w_vlbr = ( st_ivas->hDecoderConfig->ivas_total_brate < IVAS_24k4 ) ? 1 : 0; -#ifdef HODIRAC num_md_chs = ivas_sba_get_nchan_metadata( sba_order, st_ivas->hDecoderConfig->ivas_total_brate ); -#endif -#ifdef HODIRAC num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order, st_ivas->hDecoderConfig->ivas_total_brate ); -#else - num_md_sub_frames = MAX_PARAM_SPATIAL_SUBFRAMES; -#endif ivas_spar_dec_parse_md_bs( hMdDec, st0, &nB, &bw, &dtx_vad, st_ivas->hDecoderConfig->ivas_total_brate, @@ -747,10 +689,8 @@ void ivas_spar_md_dec_process( int16_t num_bands = nB; int16_t num_subframes = 1, num_block_groups = 1, num_elements = 1, byte_size = sizeof( float ); int16_t num_ch = ivas_sba_get_nchan_metadata( sba_order -#ifdef HODIRAC , st_ivas->hDecoderConfig->ivas_total_brate -#endif ); for ( b = 0; b < num_bands; b++ ) { @@ -884,9 +824,7 @@ void ivas_spar_md_dec_process( }*/ #endif /* SPAR to DirAC conversion */ -#ifdef HODIRAC if ( hMdDec->spar_hoa_dirac2spar_md_flag == 1 ) -#endif { ivas_spar_to_dirac( st_ivas, hMdDec, dtx_vad, num_bands_out, bw ); } @@ -1021,11 +959,7 @@ void ivas_spar_md_dec_process( }*/ #endif /* expand DirAC MD to all time slots */ -#ifdef HODIRAC for ( i_ts = 1; i_ts < num_md_sub_frames; i_ts++ ) -#else - for ( i_ts = 1; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) -#endif { for ( b = 0; b < hMdDec->spar_md.num_bands; b++ ) { @@ -1049,16 +983,8 @@ void ivas_spar_md_dec_process( } } -#ifdef HODIRAC ivas_get_spar_matrices( hMdDec, num_bands_out, num_md_sub_frames, bw, dtx_vad, nB, -#else - ivas_get_spar_matrices( hMdDec, num_bands_out, MAX_PARAM_SPATIAL_SUBFRAMES, bw, dtx_vad, nB, -#endif -#ifdef HODIRAC num_md_chs, -#else - sba_order, -#endif active_w_vlbr ); @@ -1084,15 +1010,9 @@ void ivas_spar_md_dec_process( } ivas_spar_md_fill_invalid_bands( &hMdDec->spar_coeffs, &hMdDec->spar_coeffs_prev, &hMdDec->valid_bands[0], &hMdDec->base_band_age[0], num_bands_out, -#ifdef HODIRAC num_md_chs -#else - sba_order -#endif -#ifdef HODIRAC , num_md_sub_frames -#endif ); hMdDec->dtx_md_smoothing_cntr = 1; @@ -1113,10 +1033,8 @@ void ivas_spar_md_dec_process( void ivas_spar_smooth_md_dtx( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t num_bands_out /* i : number of output bands */ -#ifdef HODIRAC , const int16_t num_md_sub_frames /* i : number of metadata subframes */ -#endif ) { int16_t j, k, b, dmx_ch; @@ -1152,11 +1070,7 @@ void ivas_spar_smooth_md_dtx( } /* expand MD to all time slots */ -#ifdef HODIRAC for ( int16_t i_ts = 1; i_ts < num_md_sub_frames; i_ts++ ) -#else - for ( int16_t i_ts = 1; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) -#endif { for ( b = 0; b < num_bands_out; b++ ) { @@ -1196,10 +1110,8 @@ void ivas_spar_smooth_md_dtx( void ivas_spar_setup_md_smoothing( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t num_bands_out /* i : number of output bands */ -#ifdef HODIRAC , const int16_t num_md_sub_frames /* i : number of metadata subframes */ -#endif ) { /* copy the coeffs */ @@ -1252,10 +1164,8 @@ void ivas_spar_setup_md_smoothing( } ivas_spar_smooth_md_dtx( hMdDec, num_bands_out -#ifdef HODIRAC , num_md_sub_frames -#endif ); return; @@ -1336,25 +1246,14 @@ static void ivas_get_spar_matrices( const int16_t bw, const int16_t dtx_vad, const int16_t nB, -#ifdef HODIRAC const int16_t numch_out, -#else - const int16_t sba_order, -#endif const int16_t active_w_vlbr ) { -#ifndef HODIRAC - int16_t numch_out, num_bands, dmx_ch, split_band; -#else int16_t num_bands, dmx_ch, split_band; -#endif int16_t i, j, k, m, b, i_ts, active_w; const int16_t *order; float active_w_dm_fac, re; -#ifndef HODIRAC - numch_out = ivas_sba_get_nchan_metadata( sba_order ); -#endif num_bands = num_bands_out; order = remix_order_set[hMdDec->spar_md_cfg.remix_unmix_order]; @@ -1733,21 +1632,15 @@ void ivas_spar_dec_gen_umx_mat( const int16_t nchan_transport, /* i : number of transport channels */ const int16_t num_bands_out, /* i : number of output bands */ const int16_t bfi /* i : bad frame indicator */ -#ifdef HODIRAC , const int16_t num_md_sub_frames -#endif ) { int16_t i, j, b, i_ts, num_out_ch; num_out_ch = hMdDec->spar_md_cfg.num_umx_chs; -#ifdef HODIRAC for ( i_ts = 0; i_ts < num_md_sub_frames; i_ts++ ) -#else - for ( i_ts = 0; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) -#endif { if ( hMdDec->td_decorr_flag == 1 ) { @@ -1809,10 +1702,8 @@ void ivas_spar_dec_gen_umx_mat( } ivas_spar_dec_compute_ramp_down_post_matrix( hMdDec, num_bands_out, bfi -#ifdef HODIRAC , num_md_sub_frames -#endif ); return; @@ -2192,9 +2083,7 @@ static void ivas_decode_arith_bs( { pred_cell_dims[i].dim1 = ndm + ndec - 1; if ( hMdDec->spar_hoa_md_flag -#ifdef HODIRAC && hMdDec->spar_hoa_dirac2spar_md_flag -#endif ) { if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) @@ -2224,11 +2113,7 @@ static void ivas_decode_arith_bs( if ( any_diff == 1 ) { -#ifdef HODIRAC if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) -#else - if ( hMdDec->spar_hoa_md_flag ) -#endif { for ( i = 0; i < nB; i++ ) { @@ -2250,11 +2135,7 @@ static void ivas_decode_arith_bs( ivas_fill_band_coeffs_idx( hMdDec->spar_md.band_coeffs_idx, nB, symbol_arr_re, pred_cell_dims, PRED_COEFF, planarCP ); -#ifdef HODIRAC if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) -#else - if ( hMdDec->spar_hoa_md_flag ) -#endif { for ( i = 0; i < nB; i++ ) { @@ -2519,11 +2400,7 @@ static void ivas_decode_huffman_bs( drct_dim = ndec * ( ndm - 1 ); decd_dim = ndec; pred_offset = 0; -#ifdef HODIRAC if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) -#else - if ( hMdDec->spar_hoa_md_flag ) -#endif { if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) { @@ -2537,11 +2414,7 @@ static void ivas_decode_huffman_bs( &hMdDec->spar_md.band_coeffs_idx[i].pred_index_re[j] ); } -#ifdef HODIRAC if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) -#else - if ( hMdDec->spar_hoa_md_flag ) -#endif { if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) { @@ -2594,26 +2467,15 @@ static void ivas_spar_md_fill_invalid_bands( const int16_t *valid_bands, int16_t *base_band_age, const int16_t num_bands, -#ifdef HODIRAC const int16_t num_channels -#else - const int16_t sba_order -#endif -#ifdef HODIRAC , const int16_t num_md_sub_frames -#endif ) { int16_t i, j, b, all_valid; int16_t valid_band_idx[IVAS_MAX_NUM_BANDS], idx = -1; int16_t last_valid_band_idx[IVAS_MAX_NUM_BANDS]; float w = 0; -#ifndef HODIRAC - int16_t num_channels; - - num_channels = ivas_sba_get_nchan_metadata( sba_order ); -#endif set_s( valid_band_idx, 0, IVAS_MAX_NUM_BANDS ); set_s( last_valid_band_idx, 0, IVAS_MAX_NUM_BANDS ); @@ -2700,11 +2562,7 @@ static void ivas_spar_md_fill_invalid_bands( { for ( j = 0; j < num_channels; j++ ) { -#ifdef HODIRAC for ( i_ts = 1; i_ts < num_md_sub_frames; i_ts++ ) -#else - for ( i_ts = 1; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) -#endif { pSpar_coeffs->C_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = pSpar_coeffs->C_re[i][j][b]; pSpar_coeffs->P_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = pSpar_coeffs->P_re[i][j][b]; @@ -2729,10 +2587,8 @@ static void ivas_spar_dec_compute_ramp_down_post_matrix( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands_out, const int16_t bfi -#ifdef HODIRAC , const int16_t num_md_sub_frames -#endif ) { int16_t num_in_ch, num_out_ch, i, j, b; @@ -2772,11 +2628,7 @@ static void ivas_spar_dec_compute_ramp_down_post_matrix( } /* apply the post matrix */ -#ifdef HODIRAC for ( int16_t i_ts = 0; i_ts < num_md_sub_frames; i_ts++ ) -#else - for ( int16_t i_ts = 0; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) -#endif { for ( i = 0; i < num_out_ch; i++ ) { @@ -3052,9 +2904,7 @@ void ivas_spar_to_dirac( active_w_vlbr = ( st_ivas->hDecoderConfig->ivas_total_brate < IVAS_24k4 ) ? 1 : 0; if ( hDirAC != NULL -#ifdef HODIRAC && ivas_get_hodirac_flag( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ) == 0 -#endif ) { band_grouping = hDirAC->band_grouping; diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index d4cedaaf38..79a348d198 100755 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -732,9 +732,7 @@ typedef struct ivas_dirac_dec_data_structure PARAM_ISM_RENDERING_HANDLE hParamIsmRendering; IVAS_FB_MIXER_HANDLE hFbMdft; int16_t dirac_to_spar_md_bands[DIRAC_MAX_NBANDS]; -#ifdef HODIRAC const int16_t *sba_map_tc; -#endif } DIRAC_DEC_DATA, *DIRAC_DEC_HANDLE; @@ -859,10 +857,8 @@ typedef struct ivas_spar_md_dec_state_t int16_t table_idx; int16_t dtx_vad; int16_t spar_hoa_md_flag; -#ifdef HODIRAC int16_t spar_hoa_dirac2spar_md_flag; int16_t HOA_md_ind[IVAS_SPAR_MAX_CH]; -#endif float smooth_buf[IVAS_MAX_NUM_BANDS][2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1]; float smooth_fac[IVAS_MAX_NUM_BANDS]; float mixer_mat_prev2[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index 8e357d6336..2245c338ca 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -100,17 +100,11 @@ ivas_error ivas_dirac_enc_open( else { if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_DIRAC, -#ifdef HODIRAC FOA_CHANNELS -#else - DIRAC_MAX_ANA_CHANS -#endif , 0, 0, input_Fs -#ifdef HODIRAC , FOA_CHANNELS -#endif ) ) != IVAS_ERR_OK ) { return error; @@ -385,11 +379,9 @@ void ivas_dirac_enc( } ivas_dirac_param_est_enc( hDirAC, &( hQMetaData->q_direction[0] ), hQMetaData->useLowerRes, data_f, NULL, NULL, input_frame, SBA_MODE_DIRAC -#ifdef HODIRAC , 0, FOA_CHANNELS -#endif ); /* encode parameters */ @@ -403,10 +395,8 @@ void ivas_dirac_enc( } ivas_qmetadata_enc_encode( hMetaData, hQMetaData -#ifdef HODIRAC , 0 -#endif ); *nb_bits_metadata = hMetaData->nb_bits_tot; @@ -571,10 +561,8 @@ void computeReferencePower_enc( const int16_t enc_param_start_band, /* i : first band to process */ const int16_t num_freq_bands, /* i : Number of frequency bands */ const SBA_MODE sba_mode /* i : SBA mode */ -#ifdef HODIRAC , const int16_t nchan_ana /* i : number of analysis channels */ -#endif ) { int16_t brange[2]; @@ -595,11 +583,7 @@ void computeReferencePower_enc( } reference_power[i] += reference_power_W[i]; -#ifdef HODIRAC for ( ch_idx = 1; ch_idx < nchan_ana; ch_idx++ ) -#else - for ( ch_idx = 1; ch_idx < DIRAC_MAX_ANA_CHANS; ch_idx++ ) -#endif { /* abs()^2 */ for ( j = brange[0]; j < brange[1]; j++ ) @@ -637,11 +621,9 @@ void ivas_dirac_param_est_enc( float **pp_fr_imag, const int16_t input_frame, const SBA_MODE sba_mode -#ifdef HODIRAC , const int16_t hodirac_flag, const int16_t nchan_fb_in -#endif ) { int16_t i, d, ts, index, l_ts, num_freq_bands; @@ -663,18 +645,14 @@ void ivas_dirac_param_est_enc( float reference_power[CLDFB_NO_COL_MAX][DIRAC_NO_FB_BANDS_MAX]; -#ifdef HODIRAC float azi_secs[2 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS] = { 0 }; float ele_secs[2 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS] = { 0 }; float diff_secs[2 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS] = { 0 }; float ene_secs[2 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS] = { 0 }; -#endif push_wmops( "dirac_enc_param_est" ); -#ifdef HODIRAC num_freq_bands = hDirAC->hConfig->nbands; -#endif /* Initialization */ l_ts = input_frame / MAX_PARAM_SPATIAL_SUBFRAMES; @@ -697,11 +675,7 @@ void ivas_dirac_param_est_enc( } /* Copy current frame to memory for delay compensation */ -#ifdef HODIRAC for ( i = 0; i < nchan_fb_in; i++ ) -#else - for ( i = 0; i < DIRAC_MAX_ANA_CHANS; i++ ) -#endif { pcm_in[i] = &data_f[i][0]; p_Cldfb_RealBuffer[i] = &Cldfb_RealBuffer[i][0]; @@ -727,23 +701,15 @@ void ivas_dirac_param_est_enc( if ( hDirAC->hFbMixer ) { ivas_fb_mixer_get_windowed_fr( hDirAC->hFbMixer, pcm_in, p_Cldfb_RealBuffer, p_Cldfb_ImagBuffer, l_ts, l_ts -#ifdef HODIRAC , hDirAC->hFbMixer->fb_cfg->num_in_chans -#endif ); ivas_fb_mixer_update_prior_input( hDirAC->hFbMixer, pcm_in, l_ts -#ifdef HODIRAC , hDirAC->hFbMixer->fb_cfg->num_in_chans -#endif ); -#ifdef HODIRAC for ( i = 0; i < nchan_fb_in; i++ ) -#else - for ( i = 0; i < DIRAC_MAX_ANA_CHANS; i++ ) -#endif { pcm_in[i] += l_ts; } @@ -755,19 +721,12 @@ void ivas_dirac_param_est_enc( assert( pp_fr_imag ); #endif -#ifdef HODIRAC for ( i = 0; i < nchan_fb_in; i++ ) -#else - for ( i = 0; i < DIRAC_MAX_ANA_CHANS; i++ ) -#endif { mvr2r( &pp_fr_real[i][ts * l_ts], Cldfb_RealBuffer[i], l_ts ); mvr2r( &pp_fr_imag[i][ts * l_ts], Cldfb_ImagBuffer[i], l_ts ); } } -#ifndef HODIRAC - num_freq_bands = hDirAC->hConfig->nbands; -#endif computeReferencePower_enc( hDirAC->band_grouping, @@ -776,15 +735,9 @@ void ivas_dirac_param_est_enc( reference_power[ts], hDirAC->hConfig->enc_param_start_band, num_freq_bands, -#ifdef HODIRAC hodirac_flag ? SBA_MODE_DIRAC : sba_mode -#else - sba_mode -#endif -#ifdef HODIRAC , FOA_CHANNELS -#endif ); computeIntensityVector_enc( @@ -795,9 +748,7 @@ void ivas_dirac_param_est_enc( num_freq_bands, intensity_real ); -#ifdef HODIRAC if ( !hodirac_flag ) -#endif { computeDirectionVectors( intensity_real[0], @@ -822,15 +773,12 @@ void ivas_dirac_param_est_enc( computeDiffuseness_mdft( hDirAC->buffer_intensity_real, hDirAC->buffer_energy, num_freq_bands, hDirAC->no_col_avg_diff, diffuseness_vector ); -#ifdef HODIRAC if ( hodirac_flag ) { calculate_hodirac_sector_parameters( Cldfb_RealBuffer, Cldfb_ImagBuffer, l_ts, 0.20f, hDirAC->band_grouping, hDirAC->hConfig->nbands, hDirAC->hConfig->enc_param_start_band, azi_secs, ele_secs, diff_secs, ene_secs ); } -#endif -#ifdef HODIRAC if ( hodirac_flag ) { for ( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ ) @@ -840,7 +788,6 @@ void ivas_dirac_param_est_enc( } } else -#endif { for ( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ ) { @@ -857,9 +804,7 @@ void ivas_dirac_param_est_enc( } } -#ifdef HODIRAC if ( !hodirac_flag ) -#endif { @@ -899,7 +844,6 @@ void ivas_dirac_param_est_enc( } /* Sectors */ -#ifdef HODIRAC if ( hodirac_flag ) { for ( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ ) @@ -913,7 +857,6 @@ void ivas_dirac_param_est_enc( q_direction[1].band_data[band_m_idx].energy_ratio[block_m_idx] = ( 1.f - diff_secs[band_m_idx] ) / ( ( 1.f - diff_secs[band_m_idx] ) + ( 1.f - diff_secs[num_freq_bands + band_m_idx] ) + EPSILON ); } } -#endif } /* Diffuseness */ diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index 09d869a9dc..f4c7cdfd81 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -133,16 +133,10 @@ ivas_error ivas_enc( for ( i = 0; i < n; i++ ) { if ( ( ivas_format == SBA_FORMAT ) && ( st_ivas->sba_mode == SBA_MODE_SPAR ) -#ifdef HODIRAC && !( st_ivas->sba_analysis_order > 1 ) -#endif ) { -#ifdef HODIRAC hp20( data_f[HOA_keep_ind[st_ivas->hSpar->hMdEnc->HOA_md_ind[i]]], input_frame, st_ivas->mem_hp20_in[i], input_Fs ); -#else - hp20( data_f[HOA_keep_ind[i]], input_frame, st_ivas->mem_hp20_in[i], input_Fs ); -#endif } else if ( !( ivas_format == MC_FORMAT && i == LFE_CHANNEL ) ) /*TODO: is the HPF needed for LFE channel? */ { diff --git a/lib_enc/ivas_enc_cov_handler.c b/lib_enc/ivas_enc_cov_handler.c index 4281bc112a..c4d7996e17 100644 --- a/lib_enc/ivas_enc_cov_handler.c +++ b/lib_enc/ivas_enc_cov_handler.c @@ -34,9 +34,7 @@ #include "options.h" #include "prot.h" #include "ivas_prot.h" -#ifdef HODIRAC #include "ivas_rom_com.h" -#endif #ifdef DEBUGGING #include "debug.h" #endif @@ -57,10 +55,8 @@ *------------------------------------------------------------------------------------------*/ static void ivas_band_cov( float **ppIn_FR_real, float **ppIn_FR_imag, const int16_t num_chans, const int16_t num_bins, int16_t stride, float **pFb_bin_to_band, const int16_t *pFb_start_bin_per_band, const int16_t *pFb_active_bins_per_band, const int16_t start_band, const int16_t end_band, float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] -#ifdef HODIRAC , const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] -#endif ); /*------------------------------------------------------------------------- @@ -168,10 +164,8 @@ void ivas_enc_cov_handler_process( const int16_t num_ch, const int16_t dtx_vad, const int16_t transient_det[2] -#ifdef HODIRAC , const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] -#endif ) { int16_t i, j; @@ -186,10 +180,8 @@ void ivas_enc_cov_handler_process( pFb->fb_bin_to_band.p_short_stride_num_bins_per_band, start_band, end_band, cov_real -#ifdef HODIRAC , HOA_md_ind -#endif ); #ifdef DEBUG_SPAR_WRITE_OUT_COV @@ -283,10 +275,8 @@ static void ivas_band_cov( const int16_t start_band, const int16_t end_band, float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] -#ifdef HODIRAC , const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] -#endif ) { int16_t i, j, k; @@ -298,23 +288,12 @@ static void ivas_band_cov( for ( j = i; j < num_chans; j++ ) { -#ifdef HODIRAC -#ifdef HODIRAC int16_t i1 = HOA_md_ind[i]; int16_t j1 = HOA_md_ind[j]; -#else - int16_t i1 = HOA_keep_ind_spar[i]; - int16_t j1 = HOA_keep_ind_spar[j]; -#endif -#endif for ( k = 0; k < num_bins; k++ ) { -#ifdef HODIRAC pV_re[k] = ppIn_FR_real[i1][k] * ppIn_FR_real[j1][k] + ppIn_FR_imag[i1][k] * ppIn_FR_imag[j1][k]; -#else - pV_re[k] = ppIn_FR_real[i][k] * ppIn_FR_real[j][k] + ppIn_FR_imag[i][k] * ppIn_FR_imag[j][k]; -#endif } for ( k = start_band; k < end_band; k++ ) diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index d7a3d9ac30..d964428352 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -189,15 +189,7 @@ int16_t getNumChanAnalysis( n = st_ivas->nSCE + CPE_CHANNELS * st_ivas->nCPE; if ( st_ivas->hEncoderConfig->ivas_format == SBA_FORMAT ) { -#ifdef HODIRAC n = ( st_ivas->sba_analysis_order + 1 ) * ( st_ivas->sba_analysis_order + 1 ); -#else -#ifdef HODIRAC - n = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hEncoderConfig->ivas_total_brate ); -#else - n = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order ); -#endif -#endif } else if ( st_ivas->hEncoderConfig->ivas_format == MC_FORMAT && ( st_ivas->mc_mode == MC_MODE_PARAMMC || st_ivas->mc_mode == MC_MODE_MCMASA ) ) { diff --git a/lib_enc/ivas_ism_param_enc.c b/lib_enc/ivas_ism_param_enc.c index f165245b8a..85623a7067 100644 --- a/lib_enc/ivas_ism_param_enc.c +++ b/lib_enc/ivas_ism_param_enc.c @@ -300,10 +300,8 @@ ivas_error ivas_param_ism_enc_open( /* set FB config. */ if ( ( error = ivas_fb_set_cfg( &fb_cfg, ISM_FORMAT, SBA_MODE_NONE, st_ivas->hEncoderConfig->nchan_inp, 0, 0, input_Fs -#ifdef HODIRAC , 0 -#endif ) ) != IVAS_ERR_OK ) { return error; @@ -415,17 +413,13 @@ void ivas_param_ism_enc( for ( ts = 0; ts < num_time_slots; ts++ ) { ivas_fb_mixer_get_windowed_fr( hDirAC->hFbMixer, pcm_in, p_fb_RealBuffer, p_fb_ImagBuffer, l_ts, l_ts -#ifdef HODIRAC , hDirAC->hFbMixer->fb_cfg->num_in_chans -#endif ); ivas_fb_mixer_update_prior_input( hDirAC->hFbMixer, pcm_in, l_ts -#ifdef HODIRAC , hDirAC->hFbMixer->fb_cfg->num_in_chans -#endif ); for ( i = 0; i < nchan_ism; i++ ) diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index a0769d8278..3d8658052f 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -339,10 +339,8 @@ ivas_error ivas_masa_encode( { #endif ivas_qmetadata_enc_encode( hMetaData, hQMetaData -#ifdef HODIRAC , 0 -#endif ); #ifdef HR_METADATA } diff --git a/lib_enc/ivas_mc_param_enc.c b/lib_enc/ivas_mc_param_enc.c index 2574e3778c..90090e3683 100644 --- a/lib_enc/ivas_mc_param_enc.c +++ b/lib_enc/ivas_mc_param_enc.c @@ -141,10 +141,8 @@ ivas_error ivas_param_mc_enc_open( /* set FB config. */ if ( ( error = ivas_fb_set_cfg( &fb_cfg, MC_FORMAT, SBA_MODE_DIRAC, nchan_inp, 0, 0, input_Fs -#ifdef HODIRAC , 0 -#endif ) ) != IVAS_ERR_OK ) { return error; @@ -679,10 +677,8 @@ static void ivas_param_mc_param_est_enc( for ( ts = 0; ts < start_ts; ts++ ) { ivas_fb_mixer_update_prior_input( hParamMC->hFbMixer, pcm_in, l_ts -#ifdef HODIRAC , hParamMC->hFbMixer->fb_cfg->num_in_chans -#endif ); for ( i = 0; i < nchan_input; i++ ) { @@ -693,16 +689,12 @@ static void ivas_param_mc_param_est_enc( for ( ts = start_ts; ts < num_time_slots; ts++ ) { ivas_fb_mixer_get_windowed_fr( hParamMC->hFbMixer, pcm_in, p_slot_frame_f_real, p_slot_frame_f_imag, l_ts, l_ts -#ifdef HODIRAC , hParamMC->hFbMixer->fb_cfg->num_in_chans -#endif ); ivas_fb_mixer_update_prior_input( hParamMC->hFbMixer, pcm_in, l_ts -#ifdef HODIRAC , hParamMC->hFbMixer->fb_cfg->num_in_chans -#endif ); for ( i = 0; i < nchan_input; i++ ) diff --git a/lib_enc/ivas_mc_paramupmix_enc.c b/lib_enc/ivas_mc_paramupmix_enc.c index 71a157e92c..ee9bd516f6 100644 --- a/lib_enc/ivas_mc_paramupmix_enc.c +++ b/lib_enc/ivas_mc_paramupmix_enc.c @@ -185,10 +185,8 @@ ivas_error ivas_mc_paramupmix_enc_open( /* set FB config. */ /* need to set num output channels to a value > 0 to get pFb != NULL */ if ( ( error = ivas_fb_set_cfg( &fb_cfg, MC_FORMAT, SBA_MODE_SPAR, MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH, MC_PARAMUPMIX_COMBINATIONS, 0, input_Fs -#ifdef HODIRAC , 0 -#endif ) ) != IVAS_ERR_OK ) { return error; @@ -739,9 +737,7 @@ static void ivas_mc_paramupmix_param_est_enc( int16_t chan1s[4] = { 4, 5, 8, 9 }; int16_t chan2s[4] = { 6, 7, 10, 11 }; -#ifdef HODIRAC const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; -#endif for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) { @@ -778,16 +774,12 @@ static void ivas_mc_paramupmix_param_est_enc( for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) { ivas_fb_mixer_get_windowed_fr( hMCParamUpmix->hFbMixer, pcm_in, pp_in_fr_real, pp_in_fr_imag, l_ts, l_ts -#ifdef HODIRAC , hMCParamUpmix->hFbMixer->fb_cfg->num_in_chans -#endif ); ivas_fb_mixer_update_prior_input( hMCParamUpmix->hFbMixer, pcm_in, l_ts -#ifdef HODIRAC , hMCParamUpmix->hFbMixer->fb_cfg->num_in_chans -#endif ); for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH; i++ ) { @@ -816,11 +808,7 @@ static void ivas_mc_paramupmix_param_est_enc( cov_dtx_real[i][j] = hMCParamUpmix->cov_dtx_real[b][i][j]; } } -#ifdef HODIRAC ivas_enc_cov_handler_process( hMCParamUpmix->hCovEnc[b], pp_in_fr_real, pp_in_fr_imag, cov_real, cov_dtx_real, hMCParamUpmix->hFbMixer->pFb, 0, hMCParamUpmix->hFbMixer->pFb->filterbank_num_bands, MC_PARAMUPMIX_NCH, 0 /*dtx_vad*/, transient_det[b], HOA_md_ind ); -#else - ivas_enc_cov_handler_process( hMCParamUpmix->hCovEnc[b], pp_in_fr_real, pp_in_fr_imag, cov_real, cov_dtx_real, hMCParamUpmix->hFbMixer->pFb, 0, hMCParamUpmix->hFbMixer->pFb->filterbank_num_bands, MC_PARAMUPMIX_NCH, 0 /*dtx_vad*/, transient_det[b] ); -#endif } for ( b = 0; b < MC_PARAMUPMIX_COMBINATIONS; b++ ) diff --git a/lib_enc/ivas_mcmasa_enc.c b/lib_enc/ivas_mcmasa_enc.c index ba378ab1d6..9c4fbe3cfd 100644 --- a/lib_enc/ivas_mcmasa_enc.c +++ b/lib_enc/ivas_mcmasa_enc.c @@ -189,10 +189,8 @@ ivas_error ivas_mcmasa_enc_open( /* set FB config. */ if ( ( error = ivas_fb_set_cfg( &fb_cfg, MASA_FORMAT, SBA_MODE_NONE, numAnalysisChannels, 0, 0, input_Fs -#ifdef HODIRAC , 0 -#endif ) ) != IVAS_ERR_OK ) { return error; @@ -225,10 +223,8 @@ ivas_error ivas_mcmasa_enc_open( { /* Allocate and initialize FB mixer handle for LFE channel */ if ( ( error = ivas_fb_set_cfg( &fb_cfgLfe, MASA_FORMAT, SBA_MODE_NONE, 1, 0, 0, input_Fs -#ifdef HODIRAC , 0 -#endif ) ) != IVAS_ERR_OK ) { return error; @@ -755,17 +751,10 @@ void ivas_mcmasa_param_est_enc( float Chnl_ImagBuffer[MCMASA_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX]; float *p_Chnl_RealBuffer[MCMASA_MAX_ANA_CHANS]; float *p_Chnl_ImagBuffer[MCMASA_MAX_ANA_CHANS]; -#ifdef HODIRAC float Foa_RealBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX]; float Foa_ImagBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX]; float FoaEven_RealBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX]; float FoaEven_ImagBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX]; -#else - float Foa_RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX]; - float Foa_ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX]; - float FoaEven_RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX]; - float FoaEven_ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX]; -#endif float intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; float intensity_even_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; float direction_vector[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; @@ -849,16 +838,12 @@ void ivas_mcmasa_param_est_enc( for ( ts = mrange[0]; ts < mrange[1]; ts++ ) { ivas_fb_mixer_get_windowed_fr( hMcMasa->hFbMixer, pcm_in, p_Chnl_RealBuffer, p_Chnl_ImagBuffer, l_ts, l_ts -#ifdef HODIRAC , hMcMasa->hFbMixer->fb_cfg->num_in_chans -#endif ); ivas_fb_mixer_update_prior_input( hMcMasa->hFbMixer, pcm_in, l_ts -#ifdef HODIRAC , hMcMasa->hFbMixer->fb_cfg->num_in_chans -#endif ); for ( i = 0; i < numAnalysisChannels; i++ ) { @@ -1001,10 +986,8 @@ void ivas_mcmasa_param_est_enc( 0, num_freq_bands, SBA_MODE_NONE -#ifdef HODIRAC , FOA_CHANNELS -#endif ); /* Fill buffers of length "averaging_length" time slots for intensity and energy */ @@ -1735,16 +1718,12 @@ static void computeLfeEnergy( for ( ts = mrange[0]; ts < mrange[1]; ts++ ) { ivas_fb_mixer_get_windowed_fr( hMcMasa->hFbMixerLfe, pcm_in, p_Chnl_RealBuffer, p_Chnl_ImagBuffer, l_ts, l_ts -#ifdef HODIRAC , hMcMasa->hFbMixerLfe->fb_cfg->num_in_chans -#endif ); ivas_fb_mixer_update_prior_input( hMcMasa->hFbMixerLfe, pcm_in, l_ts -#ifdef HODIRAC , hMcMasa->hFbMixerLfe->fb_cfg->num_in_chans -#endif ); pcm_in[0] += l_ts; diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index 909871f8fd..d2b2d60354 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -53,10 +53,8 @@ static float direction_distance( float elevation[DIRAC_MAX_NBANDS][MAX_PARAM_SPA static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( IVAS_QMETADATA_HANDLE hQMetaData, int16_t *needed_bits, int16_t *nbits_diff, int16_t *dfRatioBits -#ifdef HODIRAC , const int16_t hodirac_flag -#endif ); static int16_t ivas_qmetadata_entropy_encode_diffuseness( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, uint16_t *diffuseness_index_max_ec_frame ); @@ -162,10 +160,8 @@ static int16_t ivas_qmetadata_quantize_coherence_hr_512( IVAS_QMETADATA *hQMetaD ivas_error ivas_qmetadata_enc_encode( BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ IVAS_QMETADATA *hQMetaData /* i/o: metadata handle */ -#ifdef HODIRAC , const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode*/ -#endif ) { int16_t i, bit_pos_start, bit_pos_start_coh; @@ -253,9 +249,7 @@ ivas_error ivas_qmetadata_enc_encode( assert( ndirections == 2 ); #endif /* Reorder 2dir bands for more efficient encoding. */ -#ifdef HODIRAC if ( !hodirac_flag ) -#endif { ivas_qmetadata_reorder_2dir_bands( hQMetaData ); } @@ -293,10 +287,8 @@ ivas_error ivas_qmetadata_enc_encode( /*Quantization of the Diffuseness */ ivas_qmetadata_quantize_diffuseness_nrg_ratios( hQMetaData, bits_dir_raw_pre, bits_diff, dfRatio_bits -#ifdef HODIRAC , hodirac_flag -#endif ); bits_diff_sum = 0; @@ -1489,10 +1481,8 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr( * which are assumed by the direction quantization system. In practice, this improves direction * accuracy when it is perceptual meaningful. */ masa_compensate_two_dir_energy_ratio_index( index_dirRatio1Inv, index_dirRatio2Inv, &index_dirRatio1Inv_mod, &index_dirRatio2Inv_mod -#ifdef HODIRAC , 0 -#endif ); for ( k = 0; k < hQMetaData->q_direction[0].cfg.nblocks; k++ ) @@ -1719,10 +1709,8 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( int16_t *needed_bits, int16_t *nbits_diff, int16_t *dfRatioBits -#ifdef HODIRAC , const int16_t hodirac_flag -#endif ) { int16_t j, k, dir2band; @@ -1747,7 +1735,6 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( * distribution factor of direct-to-total ratios (dFRatio). This is more efficient and * accurate than simple separate quantization of each direct-to-total ratio or their * separate inverses. */ -#ifdef HODIRAC if ( hodirac_flag ) { /* already encoded as total and ratios in HO-DirAC */ @@ -1755,7 +1742,6 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( dfRatio = hQMetaData->q_direction[1].band_data[dir2band].energy_ratio[0]; } else -#endif { dirRatio1 = hQMetaData->q_direction[0].band_data[j].energy_ratio[0]; dirRatio2 = hQMetaData->q_direction[1].band_data[dir2band].energy_ratio[0]; @@ -1768,13 +1754,11 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( index_diff = masa_sq( diffRatio, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); diffRatioQ = diffuseness_reconstructions[index_diff]; -#ifdef HODIRAC if ( hodirac_flag ) { dfRatio_bits = ivas_get_df_ratio_bits_hodirac( index_diff ); } else -#endif { dfRatio_bits = ivas_get_df_ratio_bits( index_diff ); } @@ -1782,7 +1766,6 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( dfRatioBits[dir2band] = dfRatio_bits; dfRatio_qsteps = ( 1 << dfRatio_bits ); -#ifdef HODIRAC if ( hodirac_flag ) { dfRatio_index = usquant( dfRatio, &dfRatioQ, 0.0f, 1.f / ( dfRatio_qsteps - 1 ), dfRatio_qsteps ); @@ -1790,7 +1773,6 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( dirRatio2Q = dfRatioQ; } else -#endif { dfRatio_index = usquant( dfRatio, &dfRatioQ, 0.5f, 0.5f / ( dfRatio_qsteps - 1 ), dfRatio_qsteps ); @@ -1811,14 +1793,12 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( } nbits_diff[0] += MASA_BITS_ER; -#ifdef HODIRAC if ( hodirac_flag ) { float tmp; index_dirRatio2Inv = usquant( dirRatio2Q, &tmp, 0.0f, 1.f / ( DIRAC_DIFFUSE_LEVELS - 1 ), DIRAC_DIFFUSE_LEVELS ); } else -#endif { index_dirRatio2Inv = masa_sq( 1.0f - dirRatio2Q, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); } @@ -1835,10 +1815,8 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( * which are assumed by the direction quantization system. In practice, this improves direction * accuracy when it is perceptual meaningful. */ masa_compensate_two_dir_energy_ratio_index( index_dirRatio1Inv, index_dirRatio2Inv, &index_dirRatio1Inv_mod, &index_dirRatio2Inv_mod -#ifdef HODIRAC , hodirac_flag -#endif ); for ( k = 0; k < hQMetaData->q_direction[0].cfg.nblocks; k++ ) @@ -5928,18 +5906,14 @@ static void ivas_qmetadata_reorder_2dir_bands( hQMetaData->q_direction[0].band_data[band].distance[sf] = hQMetaData->q_direction[1].band_data[band].distance[sf]; hQMetaData->q_direction[1].band_data[band].distance[sf] = uint8_tmp; -#ifdef HODIRAC if ( hQMetaData->coherence_flag ) -#endif { uint8_tmp = hQMetaData->q_direction[0].coherence_band_data[band].spread_coherence[sf]; hQMetaData->q_direction[0].coherence_band_data[band].spread_coherence[sf] = hQMetaData->q_direction[1].coherence_band_data[band].spread_coherence[sf]; hQMetaData->q_direction[1].coherence_band_data[band].spread_coherence[sf] = uint8_tmp; } } -#ifdef HODIRAC if ( hQMetaData->coherence_flag ) -#endif { flt_tmp = hQMetaData->q_direction[0].band_data[band].energy_ratio[0]; hQMetaData->q_direction[0].band_data[band].energy_ratio[0] = hQMetaData->q_direction[1].band_data[band].energy_ratio[0]; @@ -6090,7 +6064,6 @@ static void transform_azimuth_dir2( { hQMetaData->q_direction[1].band_data[i].azimuth[b] += 360; } -#ifdef HODIRAC if ( hQMetaData->q_direction[1].band_data[i].azimuth[b] >= 180 ) { hQMetaData->q_direction[1].band_data[i].azimuth[b] -= 360; @@ -6099,7 +6072,6 @@ static void transform_azimuth_dir2( { hQMetaData->q_direction[1].band_data[i].azimuth[b] += 360; } -#endif #ifdef DEBUGGING assert( hQMetaData->q_direction[1].band_data[i].azimuth[b] < 180 && hQMetaData->q_direction[1].band_data[i].azimuth[b] >= -180 ); #endif diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index d013df5f4e..32bf0ef38b 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -142,13 +142,8 @@ ivas_error ivas_sba_enc_reconfigure( int16_t i, n_old; float **old_mem_hp20_in; -#ifdef HODIRAC n_old = ( analysis_order_old + 1 ) * ( analysis_order_old + 1 ); n = ( st_ivas->sba_analysis_order + 1 ) * ( st_ivas->sba_analysis_order + 1 ); -#else - n_old = ivas_sba_get_nchan_metadata( analysis_order_old ); - n = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order ); -#endif if ( n > n_old ) { @@ -230,9 +225,7 @@ ivas_error ivas_sba_enc_reconfigure( hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; } if ( nchan_transport_old != st_ivas->nchan_transport -#ifdef HODIRAC || ( ivas_total_brate < IVAS_512k && hEncoderConfig->last_ivas_total_brate >= IVAS_512k ) || ( ivas_total_brate >= IVAS_512k && hEncoderConfig->last_ivas_total_brate < IVAS_512k ) -#endif ) { /* FB mixer handle */ diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index baf8870c5c..b33cf4ffa0 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -66,9 +66,7 @@ ivas_error ivas_spar_enc_open( ENCODER_CONFIG_HANDLE hEncoderConfig; IVAS_FB_CFG *fb_cfg; int16_t nchan_inp, nchan_transport, sba_order_internal; -#ifdef HODIRAC int16_t nchan_fb_in; -#endif int16_t table_idx, active_w_mixing; int32_t input_Fs, ivas_total_brate; ivas_error error; @@ -89,15 +87,12 @@ ivas_error ivas_spar_enc_open( input_Fs = hEncoderConfig->input_Fs; sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); nchan_inp = ivas_sba_get_nchan_metadata( sba_order_internal -#ifdef HODIRAC , hEncoderConfig->ivas_total_brate -#endif ); assert( nchan_inp <= hEncoderConfig->nchan_inp ); ivas_total_brate = hEncoderConfig->ivas_total_brate; -#ifdef HODIRAC nchan_fb_in = 0; if ( st_ivas->sba_analysis_order == 1 ) { @@ -115,7 +110,6 @@ ivas_error ivas_spar_enc_open( { assert( 0 && "sba_order must be 1,2, or 3!" ); } -#endif nchan_transport = ivas_get_sba_num_TCs( hEncoderConfig->ivas_total_brate, sba_order_internal ); @@ -132,10 +126,8 @@ ivas_error ivas_spar_enc_open( /* set FB config. */ active_w_mixing = ivas_spar_br_table_consts[table_idx].active_w; ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_SPAR, nchan_inp, nchan_transport, active_w_mixing, input_Fs -#ifdef HODIRAC , nchan_fb_in -#endif ); fb_cfg->remix_order = remix_order_set[hSpar->hMdEnc->spar_md_cfg.remix_unmix_order]; @@ -426,13 +418,8 @@ static ivas_error ivas_spar_enc_process( float data_f[][L_FRAME48k] /* i/o: input/transport audio channels */ ) { -#ifdef HODIRAC float pcm_tmp[DIRAC_MAX_ANA_CHANS][L_FRAME48k * 2]; float *p_pcm_tmp[DIRAC_MAX_ANA_CHANS]; -#else - float pcm_tmp[IVAS_SPAR_MAX_CH][L_FRAME48k * 2]; - float *p_pcm_tmp[IVAS_SPAR_MAX_CH]; -#endif int16_t i, j, b, i_ts, input_frame, dtx_vad; int16_t transient_det[2]; @@ -453,9 +440,7 @@ static ivas_error ivas_spar_enc_process( float wyzx_del_buf[FOA_CHANNELS][IVAS_FB_1MS_48K_SAMP]; float dir[3], avg_dir[3]; float energySum, vecLen; -#ifdef HODIRAC int16_t nchan_fb_in; -#endif push_wmops( "ivas_spar_enc_process" ); @@ -472,24 +457,18 @@ static ivas_error ivas_spar_enc_process( input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); sba_order = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); nchan_inp = ivas_sba_get_nchan_metadata( sba_order -#ifdef HODIRAC , hEncoderConfig->ivas_total_brate -#endif ); assert( nchan_inp <= hEncoderConfig->nchan_inp ); int16_t active_w_vlbr; active_w_vlbr = ( hEncoderConfig->ivas_total_brate < IVAS_24k4 ) ? 1 : 0; -#ifdef HODIRAC nchan_fb_in = hSpar->hFbMixer->fb_cfg->nchan_fb_in; nchan_transport = st_ivas->nchan_transport; for ( i = FOA_CHANNELS + 1; i < nchan_fb_in; i++ ) -#else - for ( i = FOA_CHANNELS + 1; i < nchan_inp; i++ ) -#endif { mvr2r( data_f[HOA_keep_ind[i]], data_f[i], input_frame ); } @@ -519,29 +498,19 @@ static ivas_error ivas_spar_enc_process( * FB mixer ingest *-----------------------------------------------------------------------------------------*/ -#ifdef HODIRAC for ( i = 0; i < nchan_fb_in; i++ ) -#else - for ( i = 0; i < nchan_inp; i++ ) -#endif { p_pcm_tmp[i] = pcm_tmp[i]; } /* run Filter Bank overlapping MDFT analysis first, then we can use the temporary buffer for Parameter MDFT analysis*/ ivas_fb_mixer_pcm_ingest( hSpar->hFbMixer, data_f, p_pcm_tmp, input_frame -#ifdef HODIRAC , hSpar->hMdEnc->HOA_md_ind -#endif ); /* prepare Parameter MDFT analysis */ -#ifdef HODIRAC for ( i = 0; i < nchan_fb_in; i++ ) -#else - for ( i = 0; i < nchan_inp; i++ ) -#endif { ppIn_FR_real[i] = p_pcm_tmp[i]; ppIn_FR_imag[i] = p_pcm_tmp[i] + input_frame; @@ -553,24 +522,16 @@ static ivas_error ivas_spar_enc_process( for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) { ivas_fb_mixer_get_windowed_fr( hSpar->hFbMixer, p_pcm_tmp, ppIn_FR_real, ppIn_FR_imag, l_ts, l_ts -#ifdef HODIRAC , nchan_fb_in -#endif ); ivas_fb_mixer_update_prior_input( hSpar->hFbMixer, p_pcm_tmp, l_ts -#ifdef HODIRAC , nchan_fb_in -#endif ); -#ifdef HODIRAC for ( i = 0; i < nchan_fb_in; i++ ) -#else - for ( i = 0; i < nchan_inp; i++ ) -#endif { p_pcm_tmp[i] += l_ts; ppIn_FR_real[i] += l_ts; @@ -579,11 +540,7 @@ static ivas_error ivas_spar_enc_process( } /* turn pointers back to the local buffer, needed for the following processing */ -#ifdef HODIRAC for ( i = 0; i < nchan_fb_in; i++ ) -#else - for ( i = 0; i < nchan_inp; i++ ) -#endif { ppIn_FR_real[i] = pcm_tmp[i]; ppIn_FR_imag[i] = pcm_tmp[i] + input_frame; @@ -597,11 +554,9 @@ static ivas_error ivas_spar_enc_process( *-----------------------------------------------------------------------------------------*/ /*tyagiri: TODO: HODIRAC should be disabled for 256 kbps and outputs should be BE w.r.t baseline*/ ivas_dirac_param_est_enc( st_ivas->hDirAC, hQMetaData->q_direction, hQMetaData->useLowerRes, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, st_ivas->sba_mode -#ifdef HODIRAC , st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_256k, st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_256k ? HOA2_CHANNELS : FOA_CHANNELS -#endif ); if ( hQMetaData->q_direction->cfg.nbands > 0 ) @@ -614,10 +569,8 @@ static ivas_error ivas_spar_enc_process( push_next_indice( hMetaData, 0, 1 ); ivas_qmetadata_enc_encode( hMetaData, hQMetaData -#ifdef HODIRAC , ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) -#endif ); } else @@ -625,11 +578,7 @@ static ivas_error ivas_spar_enc_process( hQMetaData->q_direction[0].cfg.nbands = DIRAC_DTX_BANDS; /* compute directions */ -#ifdef HODIRAC for ( i = 0; i < hQMetaData->q_direction[0].cfg.nblocks; i++ ) -#else - for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) -#endif { set_zero( dir, 3 ); set_zero( avg_dir, 3 ); @@ -741,10 +690,8 @@ static ivas_error ivas_spar_enc_process( nchan_inp, dtx_vad, transient_det -#ifdef HODIRAC , hSpar->hMdEnc->HOA_md_ind -#endif ); nchan_transport = st_ivas->nchan_transport; @@ -757,9 +704,7 @@ static ivas_error ivas_spar_enc_process( ivas_spar_md_enc_process( hSpar->hMdEnc, hEncoderConfig, cov_real, cov_dtx_real, hMetaData, dtx_vad, nchan_inp, sba_order, hSpar->hFbMixer->prior_mixer ); } -#ifdef HODIRAC if ( hSpar->hMdEnc->spar_hoa_dirac2spar_md_flag ) -#endif { float azi_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; float ele_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index d96526375f..1687532c82 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -120,10 +120,8 @@ ivas_error ivas_spar_md_enc_open( } num_channels = ivas_sba_get_nchan_metadata( sba_order -#ifdef HODIRAC , hEncoderConfig->ivas_total_brate -#endif ); if ( ( hMdEnc->spar_md.band_coeffs = (ivas_band_coeffs_t *) malloc( IVAS_MAX_NUM_BANDS * sizeof( ivas_band_coeffs_t ) ) ) == NULL ) @@ -319,20 +317,12 @@ ivas_error ivas_spar_md_enc_init( float PR_minmax[2]; int16_t num_channels, i, j, k; -#ifdef HODIRAC ivas_sba_get_spar_hoa_md_flag( sba_order, hEncoderConfig->ivas_total_brate, &hMdEnc->spar_hoa_md_flag, &hMdEnc->spar_hoa_dirac2spar_md_flag ); -#else - hMdEnc->spar_hoa_md_flag = ivas_sba_get_spar_hoa_md_flag( sba_order, hEncoderConfig->ivas_total_brate ); -#endif num_channels = ivas_sba_get_nchan_metadata( sba_order -#ifdef HODIRAC , hEncoderConfig->ivas_total_brate -#endif ); -#ifdef HODIRAC ivas_sba_get_spar_hoa_ch_ind( num_channels, hEncoderConfig->ivas_total_brate, hMdEnc->HOA_md_ind ); -#endif table_idx = ivas_get_spar_table_idx( hEncoderConfig->ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL ); ivas_spar_set_bitrate_config( &hMdEnc->spar_md_cfg, table_idx, ( hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND ); @@ -599,10 +589,8 @@ ivas_error ivas_spar_md_enc_process( num_quant_strats = hMdEnc->spar_md_cfg.num_quant_strats; num_ch = ivas_sba_get_nchan_metadata( sba_order -#ifdef HODIRAC , hEncoderConfig->ivas_total_brate -#endif ); active_w = hMdEnc->spar_md_cfg.active_w; nchan_transport = hMdEnc->spar_md_cfg.nchan_transport; @@ -684,11 +672,7 @@ ivas_error ivas_spar_md_enc_process( nB = num_bands; bands_bw = 1; } -#ifdef HODIRAC if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) -#else - if ( hMdEnc->spar_hoa_md_flag ) -#endif { for ( b = SPAR_DIRAC_SPLIT_START_BAND; b < num_bands; b++ ) { @@ -865,11 +849,7 @@ ivas_error ivas_spar_md_enc_process( } } -#ifdef HODIRAC if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) -#else - if ( hMdEnc->spar_hoa_md_flag ) -#endif { for ( b = SPAR_DIRAC_SPLIT_START_BAND; b < num_bands; b++ ) { @@ -1463,11 +1443,7 @@ static void ivas_get_huffman_coded_bs( pred_coeff_dim = ndm + ndec - 1; pred_offset = 0; -#ifdef HODIRAC if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) -#else - if ( hMdEnc->spar_hoa_md_flag ) -#endif { if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) { @@ -1574,9 +1550,7 @@ static void ivas_get_arith_coded_bs( { pred_cell_dims[i].dim1 = ndm + ndec - 1; if ( hMdEnc->spar_hoa_md_flag -#ifdef HODIRAC && hMdEnc->spar_hoa_dirac2spar_md_flag -#endif ) { if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) @@ -1603,11 +1577,7 @@ static void ivas_get_arith_coded_bs( break; } } -#ifdef HODIRAC if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) -#else - if ( hMdEnc->spar_hoa_md_flag ) -#endif { for ( i = 0; i < nB; i++ ) { @@ -1637,11 +1607,7 @@ static void ivas_get_arith_coded_bs( ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.pred_arith_re[qsi], &hMdEnc->arith_coeffs.pred_arith_re_diff[qsi], pDo_diff, nB, symbol_arr_re, symbol_arr_old_re, pred_cell_dims, hMetaData, any_diff ); -#ifdef HODIRAC if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) -#else - if ( hMdEnc->spar_hoa_md_flag ) -#endif { for ( i = 0; i < nB; i++ ) { diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 7f0c327032..daff0851ef 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -666,10 +666,8 @@ typedef struct ivas_spar_md_enc_state_t ivas_huff_coeffs_t huff_coeffs; int16_t table_idx; int16_t spar_hoa_md_flag; -#ifdef HODIRAC int16_t spar_hoa_dirac2spar_md_flag; int16_t HOA_md_ind[IVAS_SPAR_MAX_CH]; -#endif } ivas_spar_md_enc_state_t; /* PCA structure */ @@ -831,13 +829,8 @@ typedef struct ivas_mcmasa_enc_data_structure float **buffer_intensity_real_vert; float *buffer_energy; -#ifdef HODIRAC float chnlToFoaMtx[FOA_CHANNELS][MCMASA_MAX_ANA_CHANS]; float chnlToFoaEvenMtx[FOA_CHANNELS][MCMASA_MAX_ANA_CHANS]; -#else - float chnlToFoaMtx[DIRAC_MAX_ANA_CHANS][MCMASA_MAX_ANA_CHANS]; - float chnlToFoaEvenMtx[DIRAC_MAX_ANA_CHANS][MCMASA_MAX_ANA_CHANS]; -#endif float ls_azimuth[MCMASA_MAX_ANA_CHANS]; int16_t leftNearest[MCMASA_MAX_ANA_CHANS]; int16_t rightNearest[MCMASA_MAX_ANA_CHANS]; diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 39e4c09ada..623733e6c1 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -2209,9 +2209,7 @@ static ivas_error initMasaDummyDecForMcOut( output_config = getIvasAudioConfigFromRendAudioConfig( outConfig ); decDummy->hDecoderConfig->output_config = output_config; -#ifdef HODIRAC decDummy->sba_analysis_order = 1; -#endif decDummy->hDecoderConfig->ivas_total_brate = IVAS_512k; /* Todo Nokia: This is preventing initialization of 2TC as 1TC, should be fixed properly in ivas_dirac_dec_config() */ decDummy->sba_mode = SBA_MODE_NONE; /* Todo Nokia: This is done to prevent ivas_dirac_dec_config() to not use uninitialized value. It could be considered if this should not be even accessed when not in SBA. */ @@ -2300,9 +2298,7 @@ static ivas_error initMasaDummyDecForSbaOut( decDummy->sba_mode = SBA_MODE_NONE; /* Todo Nokia: This is done to prevent ivas_dirac_dec_config() to not use uninitialized value. It could be considered if this should not be even accessed when not in SBA. */ decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */ -#ifdef HODIRAC decDummy->sba_analysis_order = 1; -#endif ivas_output_init( &( decDummy->hOutSetup ), output_config ); ivas_output_init( &( decDummy->hIntSetup ), output_config ); @@ -2370,9 +2366,7 @@ static ivas_error initMasaDummyDecForBinauralOut( output_config = decDummy->hDecoderConfig->output_config; -#ifdef HODIRAC decDummy->sba_analysis_order = 1; -#endif decDummy->hDecoderConfig->ivas_total_brate = IVAS_512k; /* Todo Nokia: This is preventing initialization of 2TC as 1TC, should be fixed properly in ivas_dirac_dec_config() */ decDummy->sba_mode = SBA_MODE_NONE; /* Todo Nokia: This is done to prevent ivas_dirac_dec_config() to not use uninitialized value. It could be considered if this should not be even accessed when not in SBA. */ -- GitLab From 6404f58675c5b92c1290cf7538be32eb112aba35 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 20:17:04 +0200 Subject: [PATCH 278/331] [cleanup] accept DIRAC_ALLOC_HARM --- lib_com/ivas_prot.h | 4 - lib_com/options.h | 1 - lib_dec/ivas_dirac_dec.c | 464 ----------------------------------- lib_dec/ivas_ism_param_dec.c | 233 ------------------ 4 files changed, 702 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 706754e1c6..4e8f41dfc5 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3611,12 +3611,10 @@ ivas_error ivas_dirac_dec_open( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); -#ifdef DIRAC_ALLOC_HARM ivas_error ivas_dirac_allocate_parameters( DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ const int16_t params_flag /* i : set of parameters flag */ ); -#endif ivas_error ivas_dirac_dec_config( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ @@ -3627,12 +3625,10 @@ void ivas_dirac_dec_close( DIRAC_DEC_HANDLE *hDirAC /* i/o: decoder DirAC handle */ ); -#ifdef DIRAC_ALLOC_HARM void ivas_dirac_deallocate_parameters( DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ const int16_t params_flag /* i : set of parameters flag */ ); -#endif void ivas_dirac_dec_read_BS( const int32_t ivas_total_brate, /* i : IVAS total bitrate */ diff --git a/lib_com/options.h b/lib_com/options.h index b6cb6388ca..91a6f985b3 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -160,7 +160,6 @@ -#define DIRAC_ALLOC_HARM /* VA: harmonize DirAC parameters allocation/deallocation */ #define COMPLEXITY_LEVEL_INDICATION diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 1feea6f73e..4e2526ec15 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -109,7 +109,6 @@ ivas_error ivas_dirac_dec_open( } -#ifdef DIRAC_ALLOC_HARM /*------------------------------------------------------------------------- * ivas_dirac_allocate_parameters() * @@ -246,7 +245,6 @@ ivas_error ivas_dirac_allocate_parameters( return IVAS_ERR_OK; } -#endif /*------------------------------------------------------------------------- @@ -423,83 +421,14 @@ ivas_error ivas_dirac_dec_config( { if ( st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k && hDirAC->azimuth2 == NULL ) { -#ifdef DIRAC_ALLOC_HARM if ( ( error = ivas_dirac_allocate_parameters( hDirAC, 2 ) ) != IVAS_ERR_OK ) { return error; } -#else - if ( ( hDirAC->azimuth2 = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - - if ( ( hDirAC->elevation2 = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - - if ( ( hDirAC->energy_ratio2 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - - if ( ( hDirAC->spreadCoherence2 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) - { - if ( ( hDirAC->azimuth2[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - set_s( hDirAC->azimuth2[i], 0, hDirAC->num_freq_bands ); - - if ( ( hDirAC->elevation2[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - set_s( hDirAC->elevation2[i], 0, hDirAC->num_freq_bands ); - - if ( ( hDirAC->energy_ratio2[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - set_f( hDirAC->energy_ratio2[i], 0.0f, hDirAC->num_freq_bands ); - - if ( ( hDirAC->spreadCoherence2[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - set_f( hDirAC->spreadCoherence2[i], 0.0f, hDirAC->num_freq_bands ); - } -#endif } else if ( st_ivas->hDecoderConfig->ivas_total_brate <= IVAS_256k && hDirAC->azimuth2 != NULL ) { -#ifdef DIRAC_ALLOC_HARM ivas_dirac_deallocate_parameters( hDirAC, 2 ); -#else - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) - { - free( hDirAC->azimuth2[i] ); - free( hDirAC->elevation2[i] ); - free( hDirAC->energy_ratio2[i] ); - free( hDirAC->spreadCoherence2[i] ); - } - - free( hDirAC->azimuth2 ); - free( hDirAC->elevation2 ); - free( hDirAC->energy_ratio2 ); - free( hDirAC->spreadCoherence2 ); - - hDirAC->azimuth2 = NULL; - hDirAC->elevation2 = NULL; - hDirAC->energy_ratio2 = NULL; - hDirAC->spreadCoherence2 = NULL; -#endif } } @@ -1159,139 +1088,19 @@ ivas_error ivas_dirac_dec_config( #endif } -#ifdef DIRAC_ALLOC_HARM if ( ( error = ivas_dirac_allocate_parameters( hDirAC, 1 ) ) != IVAS_ERR_OK ) { return error; } -#else - if ( ( hDirAC->azimuth = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - - if ( ( hDirAC->elevation = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - - if ( ( hDirAC->diffuseness_vector = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - - if ( ( hDirAC->energy_ratio1 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - - if ( ( hDirAC->spreadCoherence = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - - if ( ( hDirAC->surroundingCoherence = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) - { - if ( ( hDirAC->azimuth[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - set_s( hDirAC->azimuth[i], 0, hDirAC->num_freq_bands ); - - if ( ( hDirAC->elevation[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - set_s( hDirAC->elevation[i], 0, hDirAC->num_freq_bands ); - - if ( ( hDirAC->diffuseness_vector[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - set_f( hDirAC->diffuseness_vector[i], 1.0f, hDirAC->num_freq_bands ); - - if ( ( hDirAC->energy_ratio1[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - set_f( hDirAC->energy_ratio1[i], 0.0f, hDirAC->num_freq_bands ); - - if ( ( hDirAC->spreadCoherence[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - set_f( hDirAC->spreadCoherence[i], 0.0f, hDirAC->num_freq_bands ); - - if ( ( hDirAC->surroundingCoherence[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - set_f( hDirAC->surroundingCoherence[i], 0.0f, hDirAC->num_freq_bands ); - } -#endif if ( st_ivas->ivas_format == MASA_FORMAT || ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k ) ) { -#ifdef DIRAC_ALLOC_HARM if ( ( error = ivas_dirac_allocate_parameters( hDirAC, 2 ) ) != IVAS_ERR_OK ) { return error; } -#else - if ( ( hDirAC->azimuth2 = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - - if ( ( hDirAC->elevation2 = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - - if ( ( hDirAC->energy_ratio2 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - - if ( ( hDirAC->spreadCoherence2 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) - { - if ( ( hDirAC->azimuth2[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - set_s( hDirAC->azimuth2[i], 0, hDirAC->num_freq_bands ); - - if ( ( hDirAC->elevation2[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - set_s( hDirAC->elevation2[i], 0, hDirAC->num_freq_bands ); - - if ( ( hDirAC->energy_ratio2[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - set_f( hDirAC->energy_ratio2[i], 0.0f, hDirAC->num_freq_bands ); - - if ( ( hDirAC->spreadCoherence2[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - set_f( hDirAC->spreadCoherence2[i], 0.0f, hDirAC->num_freq_bands ); - } -#endif } else { @@ -1314,73 +1123,7 @@ ivas_error ivas_dirac_dec_config( { if ( ( hDirAC->hConfig->dec_param_estim_old != hDirAC->hConfig->dec_param_estim ) ) { -#ifdef DIRAC_ALLOC_HARM ivas_dirac_deallocate_parameters( hDirAC, 1 ); -#else - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) - { - if ( hDirAC->azimuth[i] != NULL ) - { - free( hDirAC->azimuth[i] ); - hDirAC->azimuth[i] = NULL; - } - if ( hDirAC->elevation[i] != NULL ) - { - free( hDirAC->elevation[i] ); - hDirAC->elevation[i] = NULL; - } - if ( hDirAC->diffuseness_vector[i] != NULL ) - { - free( hDirAC->diffuseness_vector[i] ); - hDirAC->diffuseness_vector[i] = NULL; - } - if ( hDirAC->energy_ratio1[i] != NULL ) - { - free( hDirAC->energy_ratio1[i] ); - hDirAC->energy_ratio1[i] = NULL; - } - if ( hDirAC->spreadCoherence[i] != NULL ) - { - free( hDirAC->spreadCoherence[i] ); - hDirAC->spreadCoherence[i] = NULL; - } - if ( hDirAC->surroundingCoherence[i] != NULL ) - { - free( hDirAC->surroundingCoherence[i] ); - hDirAC->surroundingCoherence[i] = NULL; - } - } - if ( hDirAC->azimuth != NULL ) - { - free( hDirAC->azimuth ); - hDirAC->azimuth = NULL; - } - if ( hDirAC->elevation != NULL ) - { - free( hDirAC->elevation ); - hDirAC->elevation = NULL; - } - if ( hDirAC->diffuseness_vector != NULL ) - { - free( hDirAC->diffuseness_vector ); - hDirAC->diffuseness_vector = NULL; - } - if ( hDirAC->energy_ratio1 != NULL ) - { - free( hDirAC->energy_ratio1 ); - hDirAC->energy_ratio1 = NULL; - } - if ( hDirAC->spreadCoherence != NULL ) - { - free( hDirAC->spreadCoherence ); - hDirAC->spreadCoherence = NULL; - } - if ( hDirAC->surroundingCoherence != NULL ) - { - free( hDirAC->surroundingCoherence ); - hDirAC->surroundingCoherence = NULL; - } -#endif } hDirAC->dirac_md_buffer_length = ( MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_DIRAC_PARAM_DEC_SFR ) * num_slots_in_subfr; hDirAC->dirac_bs_md_write_idx = DELAY_DIRAC_PARAM_DEC_SFR * num_slots_in_subfr; @@ -1388,80 +1131,10 @@ ivas_error ivas_dirac_dec_config( hDirAC->dirac_read_idx = 0; hDirAC->dirac_estimator_idx = 0; -#ifdef DIRAC_ALLOC_HARM if ( ( error = ivas_dirac_allocate_parameters( hDirAC, 1 ) ) != IVAS_ERR_OK ) { return error; } -#else - if ( ( hDirAC->azimuth = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - - if ( ( hDirAC->elevation = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - - if ( ( hDirAC->diffuseness_vector = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - - if ( ( hDirAC->energy_ratio1 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - - if ( ( hDirAC->spreadCoherence = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - - if ( ( hDirAC->surroundingCoherence = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) - { - if ( ( hDirAC->azimuth[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - set_s( hDirAC->azimuth[i], 0, hDirAC->num_freq_bands ); - - if ( ( hDirAC->elevation[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - set_s( hDirAC->elevation[i], 0, hDirAC->num_freq_bands ); - - if ( ( hDirAC->diffuseness_vector[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - set_f( hDirAC->diffuseness_vector[i], 1.0f, hDirAC->num_freq_bands ); - - if ( ( hDirAC->energy_ratio1[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - set_f( hDirAC->energy_ratio1[i], 0.0f, hDirAC->num_freq_bands ); - - if ( ( hDirAC->spreadCoherence[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - set_f( hDirAC->spreadCoherence[i], 0.0f, hDirAC->num_freq_bands ); - - if ( ( hDirAC->surroundingCoherence[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - set_f( hDirAC->surroundingCoherence[i], 0.0f, hDirAC->num_freq_bands ); - } -#endif } } #ifdef JBM_TSM_ON_TCS @@ -1594,143 +1267,8 @@ void ivas_dirac_dec_close( hDirAC->buffer_energy = NULL; } -#ifdef DIRAC_ALLOC_HARM ivas_dirac_deallocate_parameters( hDirAC, 1 ); ivas_dirac_deallocate_parameters( hDirAC, 2 ); -#else - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) - { - if ( hDirAC->azimuth[i] != NULL ) - { - free( hDirAC->azimuth[i] ); - hDirAC->azimuth[i] = NULL; - } - - if ( hDirAC->elevation[i] != NULL ) - { - free( hDirAC->elevation[i] ); - hDirAC->elevation[i] = NULL; - } - if ( hDirAC->diffuseness_vector[i] != NULL ) - { - free( hDirAC->diffuseness_vector[i] ); - hDirAC->diffuseness_vector[i] = NULL; - } - } - if ( hDirAC->azimuth != NULL ) - { - free( hDirAC->azimuth ); - hDirAC->azimuth = NULL; - } - if ( hDirAC->elevation != NULL ) - { - free( hDirAC->elevation ); - hDirAC->elevation = NULL; - } - if ( hDirAC->diffuseness_vector != NULL ) - { - free( hDirAC->diffuseness_vector ); - hDirAC->diffuseness_vector = NULL; - } - - if ( hDirAC->azimuth2 != NULL ) - { - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) - { - if ( hDirAC->azimuth2[i] != NULL ) - { - free( hDirAC->azimuth2[i] ); - hDirAC->azimuth2[i] = NULL; - } - } - free( hDirAC->azimuth2 ); - hDirAC->azimuth2 = NULL; - } - - if ( hDirAC->elevation2 != NULL ) - { - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) - { - if ( hDirAC->elevation2[i] != NULL ) - { - free( hDirAC->elevation2[i] ); - hDirAC->elevation2[i] = NULL; - } - } - free( hDirAC->elevation2 ); - hDirAC->elevation2 = NULL; - } - - if ( hDirAC->energy_ratio1 != NULL ) - { - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) - { - if ( hDirAC->energy_ratio1[i] != NULL ) - { - free( hDirAC->energy_ratio1[i] ); - hDirAC->energy_ratio1[i] = NULL; - } - } - free( hDirAC->energy_ratio1 ); - hDirAC->energy_ratio1 = NULL; - } - - if ( hDirAC->energy_ratio2 != NULL ) - { - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) - { - if ( hDirAC->energy_ratio2[i] != NULL ) - { - free( hDirAC->energy_ratio2[i] ); - hDirAC->energy_ratio2[i] = NULL; - } - } - free( hDirAC->energy_ratio2 ); - hDirAC->energy_ratio2 = NULL; - } - - if ( hDirAC->spreadCoherence != NULL ) - { - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) - { - if ( hDirAC->spreadCoherence[i] != NULL ) - { - free( hDirAC->spreadCoherence[i] ); - hDirAC->spreadCoherence[i] = NULL; - } - } - free( hDirAC->spreadCoherence ); - hDirAC->spreadCoherence = NULL; - } - - if ( hDirAC->spreadCoherence2 != NULL ) - { - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) - { - if ( hDirAC->spreadCoherence2[i] != NULL ) - { - free( hDirAC->spreadCoherence2[i] ); - hDirAC->spreadCoherence2[i] = NULL; - } - } - free( hDirAC->spreadCoherence2 ); - hDirAC->spreadCoherence2 = NULL; - } - - if ( hDirAC->surroundingCoherence != NULL ) - { - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) - { - if ( hDirAC->surroundingCoherence[i] != NULL ) - { - free( hDirAC->surroundingCoherence[i] ); - hDirAC->surroundingCoherence[i] = NULL; - } - } - free( hDirAC->surroundingCoherence ); - hDirAC->surroundingCoherence = NULL; - } -#endif if ( hDirAC->masa_stereo_type_detect != NULL ) { @@ -1747,7 +1285,6 @@ void ivas_dirac_dec_close( } -#ifdef DIRAC_ALLOC_HARM /*------------------------------------------------------------------------- * ivas_dirac_deallocate_parameters() * @@ -1911,7 +1448,6 @@ void ivas_dirac_deallocate_parameters( return; } -#endif /*------------------------------------------------------------------------- diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index 7e0f65a663..5236de4109 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -689,7 +689,6 @@ ivas_error ivas_param_ism_dec_open( #ifndef JBM_TSM_ON_TCS hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES; #endif -#ifdef DIRAC_ALLOC_HARM if ( ( error = ivas_dirac_allocate_parameters( hDirAC, 1 ) ) != IVAS_ERR_OK ) { return error; @@ -699,109 +698,6 @@ ivas_error ivas_param_ism_dec_open( { return error; } -#else - if ( ( hDirAC->azimuth = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); - } - - if ( ( hDirAC->elevation = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); - } - - if ( ( hDirAC->azimuth2 = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); - } - - if ( ( hDirAC->elevation2 = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); - } - - if ( ( hDirAC->energy_ratio1 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); - } - - if ( ( hDirAC->spreadCoherence = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); - } - - if ( ( hDirAC->energy_ratio2 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); - } - - if ( ( hDirAC->spreadCoherence2 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); - } - - if ( ( hDirAC->surroundingCoherence = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); - } - - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) - { - if ( ( hDirAC->azimuth[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); - } - set_s( hDirAC->azimuth[i], 0, hDirAC->num_freq_bands ); - - if ( ( hDirAC->elevation[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); - } - set_s( hDirAC->elevation[i], 0, hDirAC->num_freq_bands ); - - if ( ( hDirAC->azimuth2[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); - } - set_s( hDirAC->azimuth2[i], 0, hDirAC->num_freq_bands ); - - if ( ( hDirAC->elevation2[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); - } - set_s( hDirAC->elevation2[i], 0, hDirAC->num_freq_bands ); - - if ( ( hDirAC->energy_ratio1[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); - } - set_f( hDirAC->energy_ratio1[i], 0.0f, hDirAC->num_freq_bands ); - - if ( ( hDirAC->spreadCoherence[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); - } - set_f( hDirAC->spreadCoherence[i], 0.0f, hDirAC->num_freq_bands ); - - if ( ( hDirAC->energy_ratio2[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); - } - set_f( hDirAC->energy_ratio2[i], 0.0f, hDirAC->num_freq_bands ); - - if ( ( hDirAC->spreadCoherence2[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); - } - set_f( hDirAC->spreadCoherence2[i], 0.0f, hDirAC->num_freq_bands ); - - if ( ( hDirAC->surroundingCoherence[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); - } - set_f( hDirAC->surroundingCoherence[i], 0.0f, hDirAC->num_freq_bands ); - } -#endif } st_ivas->hISMDTX.dtx_flag = 0; @@ -872,9 +768,6 @@ void ivas_param_ism_dec_close( AUDIO_CONFIG output_config /* i : output audio configuration */ ) { -#ifndef DIRAC_ALLOC_HARM - int16_t i; -#endif DIRAC_DEC_HANDLE hDirAC; if ( hDirAC_out == NULL || *hDirAC_out == NULL ) @@ -893,134 +786,8 @@ void ivas_param_ism_dec_close( if ( ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) { -#ifdef DIRAC_ALLOC_HARM ivas_dirac_deallocate_parameters( hDirAC, 1 ); ivas_dirac_deallocate_parameters( hDirAC, 2 ); -#else - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) - { - if ( hDirAC->azimuth[i] != NULL ) - { - free( hDirAC->azimuth[i] ); - hDirAC->azimuth[i] = NULL; - } - - if ( hDirAC->elevation[i] != NULL ) - { - free( hDirAC->elevation[i] ); - hDirAC->elevation[i] = NULL; - } - } - - if ( hDirAC->azimuth != NULL ) - { - free( hDirAC->azimuth ); - hDirAC->azimuth = NULL; - } - if ( hDirAC->elevation != NULL ) - { - free( hDirAC->elevation ); - hDirAC->elevation = NULL; - } - - if ( hDirAC->azimuth2 != NULL ) - { - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) - { - if ( hDirAC->azimuth2[i] != NULL ) - { - free( hDirAC->azimuth2[i] ); - hDirAC->azimuth2[i] = NULL; - } - } - free( hDirAC->azimuth2 ); - hDirAC->azimuth2 = NULL; - } - - if ( hDirAC->elevation2 != NULL ) - { - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) - { - if ( hDirAC->elevation2[i] != NULL ) - { - free( hDirAC->elevation2[i] ); - hDirAC->elevation2[i] = NULL; - } - } - free( hDirAC->elevation2 ); - hDirAC->elevation2 = NULL; - } - - if ( hDirAC->energy_ratio1 != NULL ) - { - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) - { - if ( hDirAC->energy_ratio1[i] != NULL ) - { - free( hDirAC->energy_ratio1[i] ); - hDirAC->energy_ratio1[i] = NULL; - } - } - free( hDirAC->energy_ratio1 ); - hDirAC->energy_ratio1 = NULL; - } - - if ( hDirAC->energy_ratio2 != NULL ) - { - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) - { - if ( hDirAC->energy_ratio2[i] != NULL ) - { - free( hDirAC->energy_ratio2[i] ); - hDirAC->energy_ratio2[i] = NULL; - } - } - free( hDirAC->energy_ratio2 ); - hDirAC->energy_ratio2 = NULL; - } - - if ( hDirAC->spreadCoherence != NULL ) - { - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) - { - if ( hDirAC->spreadCoherence[i] != NULL ) - { - free( hDirAC->spreadCoherence[i] ); - hDirAC->spreadCoherence[i] = NULL; - } - } - free( hDirAC->spreadCoherence ); - hDirAC->spreadCoherence = NULL; - } - - if ( hDirAC->spreadCoherence2 != NULL ) - { - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) - { - if ( hDirAC->spreadCoherence2[i] != NULL ) - { - free( hDirAC->spreadCoherence2[i] ); - hDirAC->spreadCoherence2[i] = NULL; - } - } - free( hDirAC->spreadCoherence2 ); - hDirAC->spreadCoherence2 = NULL; - } - - if ( hDirAC->surroundingCoherence != NULL ) - { - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) - { - if ( hDirAC->surroundingCoherence[i] != NULL ) - { - free( hDirAC->surroundingCoherence[i] ); - hDirAC->surroundingCoherence[i] = NULL; - } - } - free( hDirAC->surroundingCoherence ); - hDirAC->surroundingCoherence = NULL; - } -#endif } if ( !( output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) ) -- GitLab From dd4e471a04a9456728267c55b6eed4980d245fe3 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 20:17:34 +0200 Subject: [PATCH 279/331] [cleanup] accept COMPLEXITY_LEVEL_INDICATION --- apps/decoder.c | 8 -------- apps/encoder.c | 6 ------ lib_com/options.h | 1 - lib_dec/lib_dec.h | 2 -- lib_enc/lib_enc.h | 2 -- 5 files changed, 19 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 993e53d746..d28ce9f88f 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -121,9 +121,7 @@ typedef struct float non_diegetic_pan_gain; bool renderConfigEnabled; char *renderConfigFilename; -#ifdef COMPLEXITY_LEVEL_INDICATION IVAS_DEC_COMPLEXITY_LEVEL complexityLevel; -#endif #ifdef DEBUGGING IVAS_DEC_FORCED_REND_MODE forcedRendMode; @@ -815,9 +813,7 @@ static bool parseCmdlIVAS_dec( arg->quietModeEnabled = false; arg->delayCompensationEnabled = true; arg->voipMode = false; -#ifdef COMPLEXITY_LEVEL_INDICATION arg->complexityLevel = IVAS_DEC_COMPLEXITY_LEVEL_THREE; -#endif arg->enableHeadRotation = false; arg->headrotTrajFileName = NULL; @@ -1177,7 +1173,6 @@ static bool parseCmdlIVAS_dec( } i++; } -#ifdef COMPLEXITY_LEVEL_INDICATION else if ( strcmp( argv_to_upper, "-LEVEL" ) == 0 ) { int16_t level; @@ -1195,7 +1190,6 @@ static bool parseCmdlIVAS_dec( fprintf( stdout, "Complexity levels 1 and 2 will be defined after characterisation - default to level 3 (full functionality).\n" ); } } -#endif /*-----------------------------------------------------------------* * Option not recognized @@ -1369,11 +1363,9 @@ static void usage_dec( void ) fprintf( stdout, " containing FEC pattern (short values of 0 (good) or 1 (bad))\n" ); fprintf( stdout, " default is OFF, if this option is not used\n" ); fprintf( stdout, "-force R : Force specific binaural rendering mode, R = (TDREND, CLDFBREND),\n" ); -#ifdef COMPLEXITY_LEVEL_INDICATION fprintf( stdout, "-level level : Complexity level, level = (1, 2, 3), will be defined after characterisation. \n" ); fprintf( stdout, " Currently, all values default to level 3 (full functionality).\n" ); #endif -#endif #ifdef DEBUG_MODE_INFO #ifdef DEBUG_MODE_INFO_TWEAK fprintf( stdout, "-info : specify subfolder name for debug output\n" ); diff --git a/apps/encoder.c b/apps/encoder.c index 7b54e4c7cb..df7c0915d4 100644 --- a/apps/encoder.c +++ b/apps/encoder.c @@ -111,9 +111,7 @@ typedef struct IVAS_ENC_CHANNEL_AWARE_CONFIG caConfig; const char *ca_config_file; bool mimeOutput; -#ifdef COMPLEXITY_LEVEL_INDICATION IVAS_ENC_COMPLEXITY_LEVEL complexityLevel; -#endif #ifdef DEBUGGING IVAS_ENC_FORCED_MODE forcedMode; @@ -881,9 +879,7 @@ static void initArgStruct( EncArguments *arg ) arg->ca_config_file = NULL; arg->mimeOutput = false; arg->ism_extended_metadata = false; -#ifdef COMPLEXITY_LEVEL_INDICATION arg->complexityLevel = IVAS_ENC_COMPLEXITY_LEVEL_THREE; -#endif #ifdef DEBUGGING arg->forcedMode = IVAS_ENC_FORCE_UNFORCED; @@ -1184,7 +1180,6 @@ static bool parseCmdlIVAS_enc( } -#ifdef COMPLEXITY_LEVEL_INDICATION /*-----------------------------------------------------------------* * Complexity Level *-----------------------------------------------------------------*/ @@ -1207,7 +1202,6 @@ static bool parseCmdlIVAS_enc( fprintf( stdout, "Complexity levels 1 and 2 will be defined after characterisation - default to level 3 (full functionality).\n" ); } } -#endif /*-----------------------------------------------------------------* * IVAS Formats diff --git a/lib_com/options.h b/lib_com/options.h index 91a6f985b3..2390f711be 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -162,7 +162,6 @@ -#define COMPLEXITY_LEVEL_INDICATION #define FIX_463_TD_RENDERER_DIRECTIVITY_RESET /* Eri: Remove unintentional reset of directivity pattern */ #define FIX_642 /* FhG: Fix for issue 642, buggy DoA-array access in DirAC head rotation*/ diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index 5b10e44929..65e36b055b 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -76,14 +76,12 @@ typedef enum IVAS_DEC_INPUT_FORMAT_RTPDUMP_HF = 4, /* RTP payload: only Header-Full format without zero padding for size collision avoidance */ } IVAS_DEC_INPUT_FORMAT; -#ifdef COMPLEXITY_LEVEL_INDICATION typedef enum _IVAS_DEC_COMPLEXITY_LEVEL { IVAS_DEC_COMPLEXITY_LEVEL_ONE = 1, IVAS_DEC_COMPLEXITY_LEVEL_TWO = 2, IVAS_DEC_COMPLEXITY_LEVEL_THREE = 3 } IVAS_DEC_COMPLEXITY_LEVEL; -#endif #ifdef VARIABLE_SPEED_DECODING diff --git a/lib_enc/lib_enc.h b/lib_enc/lib_enc.h index 3a6a619f73..a4a3726b45 100644 --- a/lib_enc/lib_enc.h +++ b/lib_enc/lib_enc.h @@ -94,14 +94,12 @@ typedef enum _IVAS_ENC_MASA_VARIANT IVAS_ENC_MASA_UNDEFINED = 0xffff } IVAS_ENC_MASA_VARIANT; -#ifdef COMPLEXITY_LEVEL_INDICATION typedef enum _IVAS_ENC_COMPLEXITY_LEVEL { IVAS_ENC_COMPLEXITY_LEVEL_ONE = 1, IVAS_ENC_COMPLEXITY_LEVEL_TWO = 2, IVAS_ENC_COMPLEXITY_LEVEL_THREE = 3 } IVAS_ENC_COMPLEXITY_LEVEL; -#endif #ifdef DEBUGGING typedef enum _IVAS_ENC_STEREO_MODE -- GitLab From 2d4925c53fcaf3ca8c91335d791f1a916a7a5f4d Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 May 2023 20:27:18 +0200 Subject: [PATCH 280/331] formatting --- apps/renderer.c | 1 - lib_com/ivas_cov_smooth.c | 3 +- lib_com/ivas_fb_mixer.c | 6 +- lib_com/ivas_ism_com.c | 18 +- lib_com/ivas_sba_config.c | 3 +- lib_com/ivas_spar_com.c | 6 +- lib_com/ivas_stat_com.h | 8 +- lib_com/options.h | 25 +-- lib_dec/ivas_dec.c | 6 +- lib_dec/ivas_dirac_dec.c | 116 ++++------- lib_dec/ivas_dirac_output_synthesis_dec.c | 192 +++++++++---------- lib_dec/ivas_init_dec.c | 3 +- lib_dec/ivas_ism_metadata_dec.c | 3 +- lib_dec/ivas_jbm_dec.c | 6 +- lib_dec/ivas_masa_dec.c | 12 +- lib_dec/ivas_mc_paramupmix_dec.c | 1 - lib_dec/ivas_out_setup_conversion.c | 4 +- lib_dec/ivas_output_config.c | 6 +- lib_dec/ivas_qmetadata_dec.c | 6 +- lib_dec/ivas_rom_dec.c | 1 - lib_dec/ivas_sba_dec.c | 20 +- lib_dec/ivas_sba_rendering_internal.c | 12 +- lib_dec/ivas_sns_dec.c | 3 +- lib_dec/ivas_spar_decoder.c | 57 ++---- lib_dec/ivas_spar_md_dec.c | 71 ++----- lib_dec/ivas_stat_dec.h | 2 +- lib_dec/lib_dec.c | 2 +- lib_dec/stat_dec.h | 16 +- lib_enc/dtx.c | 4 +- lib_enc/ext_sig_ana.c | 1 - lib_enc/ivas_dirac_enc.c | 45 ++--- lib_enc/ivas_enc.c | 4 +- lib_enc/ivas_enc_cov_handler.c | 23 +-- lib_enc/ivas_ism_metadata_enc.c | 24 ++- lib_enc/ivas_ism_param_enc.c | 20 +- lib_enc/ivas_masa_enc.c | 6 +- lib_enc/ivas_mc_param_enc.c | 24 +-- lib_enc/ivas_mc_paramupmix_enc.c | 19 +- lib_enc/ivas_mcmasa_enc.c | 42 ++-- lib_enc/ivas_qmetadata_enc.c | 29 +-- lib_enc/ivas_sba_enc.c | 4 +- lib_enc/ivas_spar_encoder.c | 54 ++---- lib_enc/ivas_spar_md_enc.c | 22 +-- lib_enc/lsf_msvq_ma_enc.c | 6 +- lib_rend/ivas_dirac_dec_binaural_functions.c | 12 +- lib_rend/ivas_objectRenderer.c | 2 +- lib_rend/ivas_objectRenderer_sfx.c | 4 +- lib_rend/lib_rend.c | 3 +- lib_util/ism_file_reader.c | 6 +- 49 files changed, 351 insertions(+), 612 deletions(-) mode change 100755 => 100644 lib_dec/ivas_dirac_output_synthesis_dec.c mode change 100755 => 100644 lib_dec/ivas_sba_dec.c mode change 100755 => 100644 lib_dec/ivas_spar_decoder.c mode change 100755 => 100644 lib_dec/ivas_spar_md_dec.c mode change 100755 => 100644 lib_dec/ivas_stat_dec.h mode change 100755 => 100644 lib_enc/ext_sig_ana.c diff --git a/apps/renderer.c b/apps/renderer.c index 91f3cfab1e..3ed5d4996e 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -1385,7 +1385,6 @@ static bool parseDiegeticPan( } } return true; - } static bool parseOrientationTracking( diff --git a/lib_com/ivas_cov_smooth.c b/lib_com/ivas_cov_smooth.c index e0789864dc..1860e6ac70 100644 --- a/lib_com/ivas_cov_smooth.c +++ b/lib_com/ivas_cov_smooth.c @@ -50,8 +50,7 @@ static void ivas_set_up_cov_smoothing( ivas_cov_smooth_state_t *hCovState, ivas_filterbank_t *pFb, const float max_update_rate, - const int16_t min_pool_size - , + const int16_t min_pool_size, const int32_t ivas_total_brate ) { int16_t j, k; diff --git a/lib_com/ivas_fb_mixer.c b/lib_com/ivas_fb_mixer.c index e77e4e578f..3d0b6255c9 100644 --- a/lib_com/ivas_fb_mixer.c +++ b/lib_com/ivas_fb_mixer.c @@ -491,8 +491,7 @@ void ivas_fb_mixer_pcm_ingest( float **ppOut_pcm, /* o : output audio channels */ const int16_t frame_len /* i : frame length */ , - const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] -) + const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] ) { int16_t i; int16_t num_chs_ingest; @@ -580,8 +579,7 @@ void ivas_fb_mixer_get_windowed_fr( set_zero( fr_in_block, offset ); for ( ch_idx = 0; ch_idx < - nchan_fb_in - ; + nchan_fb_in; ch_idx++ ) { mvr2r( &hFbMixer->ppFilterbank_prior_input[ch_idx][offset + hFbMixer->fb_cfg->windowed_fr_offset], &fr_in_block[offset], n_old_samples - offset ); diff --git a/lib_com/ivas_ism_com.c b/lib_com/ivas_ism_com.c index 8ba31fcaa3..a28fb77d20 100644 --- a/lib_com/ivas_ism_com.c +++ b/lib_com/ivas_ism_com.c @@ -88,16 +88,16 @@ static void bitbudget_to_brate( *-------------------------------------------------------------------*/ ivas_error ivas_ism_config( - const int32_t ism_total_brate, /* i : ISM total bitrate */ - const int16_t nchan_transport, /* i : number of transport channels */ - const int16_t nchan_ism, /* i : number of objects */ - ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + const int32_t ism_total_brate, /* i : ISM total bitrate */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int16_t nchan_ism, /* i : number of objects */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ const int16_t ism_extended_metadata_flag, /* i : extended metadata flag */ - const int16_t localVAD[MAX_NUM_OBJECTS], /* i : local VAD flag */ - const int16_t ism_imp[], /* i : ISM importance flags */ - int32_t element_brate[], /* o : element bitrate per object */ - int32_t total_brate[], /* o : total bitrate per object */ - int16_t nb_bits_metadata[] /* i/o: number of metadata bits */ + const int16_t localVAD[MAX_NUM_OBJECTS], /* i : local VAD flag */ + const int16_t ism_imp[], /* i : ISM importance flags */ + int32_t element_brate[], /* o : element bitrate per object */ + int32_t total_brate[], /* o : total bitrate per object */ + int16_t nb_bits_metadata[] /* i/o: number of metadata bits */ ) { int16_t ch; diff --git a/lib_com/ivas_sba_config.c b/lib_com/ivas_sba_config.c index f461be09b8..e7a448315f 100644 --- a/lib_com/ivas_sba_config.c +++ b/lib_com/ivas_sba_config.c @@ -223,8 +223,7 @@ int16_t ivas_sba_get_nchan( int16_t ivas_sba_get_nchan_metadata( const int16_t sba_order /* i : Ambisonic (SBA) order */ , - const int32_t ivas_total_brate -) + const int32_t ivas_total_brate ) { int16_t nb_channels; diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index 2830f23a56..fb0f263765 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -1686,13 +1686,11 @@ void ivas_get_spar_md_from_dirac( remix_order = remix_order_set[hSpar_md_cfg->remix_unmix_order]; - num_ch = ivas_sba_get_nchan_metadata( order - , + num_ch = ivas_sba_get_nchan_metadata( order, IVAS_256k /*dummy value as order is always 1 in this function*/ ); - hoa2_ch = ivas_sba_get_nchan_metadata( SBA_HOA2_ORDER - , + hoa2_ch = ivas_sba_get_nchan_metadata( SBA_HOA2_ORDER, IVAS_256k /*dummy value as order is always 1 in this function*/ ); diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index d290b8670a..e38ad28e69 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -58,9 +58,9 @@ typedef struct { int16_t ism_metadata_flag; /* flag whether metadata are coded in particular frame of particular object */ int16_t last_ism_metadata_flag; /* last frame ism_metadata_flag */ - int16_t non_diegetic_flag; /* Non-diegetic (non-headtracked) object flag */ - float azimuth; /* azimuth value read from the input metadata file */ - float elevation; /* azimuth value read from the input metadata file */ + int16_t non_diegetic_flag; /* Non-diegetic (non-headtracked) object flag */ + float azimuth; /* azimuth value read from the input metadata file */ + float elevation; /* azimuth value read from the input metadata file */ float radius; float yaw; /* azimuth orientation value read from the input metadata file */ float pitch; /* elevation orientation value read from the input metadata file */ @@ -76,7 +76,7 @@ typedef struct int16_t ism_md_fec_cnt_enc; /* counter of continuous frames where MD are not transmitted */ int16_t ism_md_inc_diff_cnt; /* counter of continuous frames where MD are transmitted in inactive segments when MD significantly changes */ - float last_true_radius; /* last true Q radius value */ + float last_true_radius; /* last true Q radius value */ } ISM_METADATA_FRAME, *ISM_METADATA_HANDLE; diff --git a/lib_com/options.h b/lib_com/options.h index 2390f711be..00d703e68c 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -143,46 +143,23 @@ #define DISABLE_ADAP_RES_COD_TMP /* temporary fix for IVAS-403, disables adaptive residual coding */ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ - - /*#define FIX_XXX_JBM_FIFO_BUFFER */ /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ - - - - - - #define HR_METADATA /* Nok: Contribution #45: encode directional MASA metadata with more bits at 384k and 512k */ - - #define FIX_439_OTR_PARAMS /* Philips: Issue 439: orientation tracking parameter aspects. */ - - - - - - #define FIX_463_TD_RENDERER_DIRECTIVITY_RESET /* Eri: Remove unintentional reset of directivity pattern */ - #define FIX_642 /* FhG: Fix for issue 642, buggy DoA-array access in DirAC head rotation*/ - #define FIX_443_FD_CNG_INIT /* FhG: correct bitrate value for FD-CNG init */ #define VARIABLE_SPEED_DECODING /* FhG: variable speed decoding employing the JBM functioniality */ #define JBM_TSM_ON_TCS /* FhG: run the TSM part of JBM on the TCs instead of the final output pcm waveforms */ - #define FIX_DTX_428 /* FhG: fix for issue 428, crash with DTX and bitrate switching */ - #define FIX_STEREO_474 /* FhG fix for issue 574, crash with SBA to stereo output at 512 kbps */ #define FIX_MDCT_ST_PLC_FADEOUT_DELAY - #define FIX_DIRAC_LS_SYNTHESIS_CONFIG_479 /* FhG: fix for issue 479, broken LS output with DirAC at high BRs */ - #define HYBRID_ITD_MAX /* FhG: Improvement for DFT-stereo for cases with large ITDs */ - #define FIX_487_LOWRATE_SBA_TUNING_FIX /* Dlb: TUning fix for low bitrate cases to match theoretical longest SPAR MD bitstream */ - #define FIX_490_MASA_2TC_LBR_DTX /* Nokia: Fixes issue 490 by correcting condition. */ + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index 76ef4c49ac..7069e7d08f 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -411,10 +411,8 @@ ivas_error ivas_dec( ivas_pca_dec( st_ivas->hSpar->hPCA, output_frame, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate, st_ivas->bfi, output ); } - ivas_spar_dec_gen_umx_mat( st_ivas->hSpar->hMdDec, st_ivas->nchan_transport, IVAS_MAX_NUM_BANDS, st_ivas->bfi - , - ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate ) - ); + ivas_spar_dec_gen_umx_mat( st_ivas->hSpar->hMdDec, st_ivas->nchan_transport, IVAS_MAX_NUM_BANDS, st_ivas->bfi, + ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate ) ); } ivas_sba_dirac_stereo_dec( st_ivas, output, output_frame, st_ivas->ivas_format == MC_FORMAT ); diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 4e2526ec15..d69d323c9b 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -51,10 +51,7 @@ * Local function prototypes *-----------------------------------------------------------------------*/ -static ivas_error ivas_dirac_alloc_mem( DIRAC_DEC_HANDLE hDirAC, const RENDERER_TYPE renderer_type, DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem - , - const int16_t hodirac_flag -); +static ivas_error ivas_dirac_alloc_mem( DIRAC_DEC_HANDLE hDirAC, const RENDERER_TYPE renderer_type, DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem, const int16_t hodirac_flag ); static void ivas_dirac_free_mem( DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem ); @@ -68,10 +65,7 @@ static void protoSignalComputation1( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRA static void protoSignalComputation2( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float *proto_frame_f, float *proto_direct_buffer_f, float *reference_power, float *proto_power_smooth, const int16_t isloudspeaker, const int16_t slot_index, const int16_t num_freq_bands, MASA_STEREO_TYPE_DETECT *stereo_type_detect ); -static void protoSignalComputation4( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float *proto_frame_f, float *proto_direct_buffer_f, float *reference_power, float *proto_power_smooth, const int16_t slot_index, const int16_t num_outputs_diff, const int16_t num_freq_bands, const float *mtx_hoa_decoder, const int16_t nchan_transport - , - const int16_t *sba_map_tc_ind -); +static void protoSignalComputation4( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float *proto_frame_f, float *proto_direct_buffer_f, float *reference_power, float *proto_power_smooth, const int16_t slot_index, const int16_t num_outputs_diff, const int16_t num_freq_bands, const float *mtx_hoa_decoder, const int16_t nchan_transport, const int16_t *sba_map_tc_ind ); static void ivas_dirac_dec_compute_diffuse_proto( DIRAC_DEC_HANDLE hDirAC, const int16_t slot_idx ); @@ -322,10 +316,8 @@ ivas_error ivas_dirac_dec_config( nchan_transport_orig = st_ivas->nchan_transport; if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && !( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) { - st_ivas->nchan_transport = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order - , - st_ivas->hDecoderConfig->ivas_total_brate - ); + st_ivas->nchan_transport = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, + st_ivas->hDecoderConfig->ivas_total_brate ); } nchan_transport = st_ivas->nchan_transport; @@ -433,9 +425,7 @@ ivas_error ivas_dirac_dec_config( } /* band config needed only for SPAR with FOA output */ - if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_FOA && st_ivas->sba_mode == SBA_MODE_SPAR - && !hodirac_flag - ) + if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_FOA && st_ivas->sba_mode == SBA_MODE_SPAR && !hodirac_flag ) { return IVAS_ERR_OK; } @@ -889,10 +879,8 @@ ivas_error ivas_dirac_dec_config( /* output synthesis */ if ( flag_config == DIRAC_OPEN ) { - if ( ( ivas_dirac_dec_output_synthesis_open( hDirAC, st_ivas->renderer_type, nchan_transport, output_Fs - , - hodirac_flag - ) ) != IVAS_ERR_OK ) + if ( ( ivas_dirac_dec_output_synthesis_open( hDirAC, st_ivas->renderer_type, nchan_transport, output_Fs, + hodirac_flag ) ) != IVAS_ERR_OK ) { return error; } @@ -902,10 +890,8 @@ ivas_error ivas_dirac_dec_config( { ivas_dirac_dec_output_synthesis_close( hDirAC ); - if ( ( ivas_dirac_dec_output_synthesis_open( hDirAC, st_ivas->renderer_type, nchan_transport, output_Fs - , - hodirac_flag - ) ) != IVAS_ERR_OK ) + if ( ( ivas_dirac_dec_output_synthesis_open( hDirAC, st_ivas->renderer_type, nchan_transport, output_Fs, + hodirac_flag ) ) != IVAS_ERR_OK ) { return error; } @@ -999,20 +985,16 @@ ivas_error ivas_dirac_dec_config( } /* output synthesis */ - ivas_dirac_dec_output_synthesis_init( hDirAC, nchan_out_woLFE - , - hodirac_flag - ); + ivas_dirac_dec_output_synthesis_init( hDirAC, nchan_out_woLFE, + hodirac_flag ); /* Allocate stack memory */ if ( flag_config != DIRAC_OPEN ) { ivas_dirac_free_mem( &( hDirAC->stack_mem ) ); } - if ( ( error = ivas_dirac_alloc_mem( hDirAC, st_ivas->renderer_type, &( hDirAC->stack_mem ) - , - hodirac_flag - ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_dirac_alloc_mem( hDirAC, st_ivas->renderer_type, &( hDirAC->stack_mem ), + hodirac_flag ) ) != IVAS_ERR_OK ) { return error; } @@ -1093,9 +1075,7 @@ ivas_error ivas_dirac_dec_config( return error; } - if ( st_ivas->ivas_format == MASA_FORMAT - || ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k ) - ) + if ( st_ivas->ivas_format == MASA_FORMAT || ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k ) ) { if ( ( error = ivas_dirac_allocate_parameters( hDirAC, 2 ) ) != IVAS_ERR_OK ) { @@ -1459,10 +1439,8 @@ void ivas_dirac_deallocate_parameters( static ivas_error ivas_dirac_alloc_mem( DIRAC_DEC_HANDLE hDirAC, const RENDERER_TYPE renderer_type, - DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem - , - const int16_t hodirac_flag -) + DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem, + const int16_t hodirac_flag ) { int16_t num_freq_bands, num_freq_bands_diff, size; int16_t size_ho; @@ -1739,8 +1717,8 @@ void ivas_dirac_dec_read_BS( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata */ int16_t *nb_bits, /* o : number of bits read */ const SBA_MODE sba_mode, /* i : SBA mode */ - const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ - int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ + const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ + int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ) { int16_t i, j, b, dir, orig_dirac_bands; @@ -1834,10 +1812,8 @@ void ivas_dirac_dec_read_BS( hQMetaData->q_direction[0].cfg.nblocks = MAX_PARAM_SPATIAL_SUBFRAMES; } - *nb_bits += ivas_qmetadata_dec_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ) - , - hodirac_flag - ); + *nb_bits += ivas_qmetadata_dec_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), + hodirac_flag ); } #ifdef DEBUGGING @@ -1904,10 +1880,8 @@ void ivas_dirac_dec_read_BS( if ( hDirAC != NULL ) { - ivas_qmetadata_to_dirac( hQMetaData, hDirAC, NULL, ivas_total_brate, sba_mode - , - hodirac_flag - , + ivas_qmetadata_to_dirac( hQMetaData, hDirAC, NULL, ivas_total_brate, sba_mode, + hodirac_flag, dirac_to_spar_md_bands ); } @@ -1927,8 +1901,8 @@ void ivas_qmetadata_to_dirac( MASA_DECODER_HANDLE hMasa, /* i : MASA decoder structure */ const int32_t ivas_total_brate, /* i : IVAS total bitrate */ const SBA_MODE sba_mode, /* i : SBA mode */ - const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ - int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ + const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ + int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ) { int16_t block, band; @@ -2849,10 +2823,8 @@ void ivas_dirac_dec_render_sf( #endif surCohRatio, st_ivas->hHeadTrackData->shd_rot_max_order, - p_Rmat - , - hodirac_flag - ); + p_Rmat, + hodirac_flag ); } else { @@ -2866,10 +2838,8 @@ void ivas_dirac_dec_render_sf( #endif surCohRatio, 0, - NULL - , - hodirac_flag - ); + NULL, + hodirac_flag ); } } @@ -3007,10 +2977,8 @@ void ivas_dirac_dec_render_sf( slot_idx, hDirAC->num_outputs_diff, hDirAC->num_freq_bands, hDirAC->hoa_decoder, - nchan_transport - , - hDirAC->sba_map_tc - ); + nchan_transport, + hDirAC->sba_map_tc ); break; case 2: protoSignalComputation2( Cldfb_RealBuffer, Cldfb_ImagBuffer, @@ -3215,11 +3183,9 @@ void ivas_dirac_dec_render_sf( p_Rmat, st_ivas->hVBAPdata, hDirAC->hOutSetup, - nchan_transport - , + nchan_transport, st_ivas->sba_analysis_order > 1 && - st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k - ); + st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k ); } else { @@ -3229,8 +3195,7 @@ void ivas_dirac_dec_render_sf( 0, st_ivas->hVBAPdata, hDirAC->hOutSetup, - nchan_transport - , + nchan_transport, st_ivas->sba_analysis_order > 1 && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k @@ -3269,8 +3234,7 @@ void ivas_dirac_dec_render_sf( hDirAC->hOutSetup, nchan_transport, md_idx, - hodirac_flag - ); + hodirac_flag ); } #endif @@ -3341,13 +3305,11 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS hDirAC->subframe_nbslots[subframe_idx], #endif - p_onset_filter - , + p_onset_filter, #ifdef JBM_TSM_ON_TCS md_idx, #endif - hodirac_flag - ); + hodirac_flag ); } else { @@ -4299,10 +4261,8 @@ static void protoSignalComputation4( const int16_t num_outputs_diff, const int16_t num_freq_bands, const float *mtx_hoa_decoder, - const int16_t nchan_transport - , - const int16_t *sba_map_tc_ind -) + const int16_t nchan_transport, + const int16_t *sba_map_tc_ind ) { int16_t k, l; int16_t n; diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c old mode 100755 new mode 100644 index 9a63f6fbd9..1ad87d6618 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -680,120 +680,118 @@ void ivas_dirac_dec_output_synthesis_process_slot( } else // ( hDirAC->hConfig->dec_param_estim == TRUE ) if ( hDirAC->hConfig->dec_param_estim == TRUE ) - { + { - /* compute direct responses */ + /* compute direct responses */ #ifdef JBM_TSM_ON_TCS - ivas_dirac_dec_compute_directional_responses( hDirAC, - hVBAPdata, - NULL, - azimuth, - elevation, - md_idx, - NULL, - sh_rot_max_order, - p_Rmat - , - hodirac_flag - ); + ivas_dirac_dec_compute_directional_responses( hDirAC, + hVBAPdata, + NULL, + azimuth, + elevation, + md_idx, + NULL, + sh_rot_max_order, + p_Rmat, + hodirac_flag ); #endif - if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) - { - ivas_dirac_dec_compute_gain_factors( num_freq_bands, - diffuseness, - h_dirac_output_synthesis_params->max_band_decorr, - h_dirac_output_synthesis_state->direct_power_factor, - h_dirac_output_synthesis_state->diffuse_power_factor ); + if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + ivas_dirac_dec_compute_gain_factors( num_freq_bands, + diffuseness, + h_dirac_output_synthesis_params->max_band_decorr, + h_dirac_output_synthesis_state->direct_power_factor, + h_dirac_output_synthesis_state->diffuse_power_factor ); - v_multc( h_dirac_output_synthesis_state->direct_power_factor, - 0.25f, - h_dirac_output_synthesis_state->direct_power_factor, - num_freq_bands ); - v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, - 0.25f, - h_dirac_output_synthesis_state->diffuse_power_factor, - num_freq_bands ); + v_multc( h_dirac_output_synthesis_state->direct_power_factor, + 0.25f, + h_dirac_output_synthesis_state->direct_power_factor, + num_freq_bands ); + v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, + 0.25f, + h_dirac_output_synthesis_state->diffuse_power_factor, + num_freq_bands ); - /*Direct gain*/ - for ( ch_idx = 0; ch_idx < min( 4, nchan_transport ); ch_idx++ ) - { - int16_t k; - if ( ch_idx != 0 ) + /*Direct gain*/ + for ( ch_idx = 0; ch_idx < min( 4, nchan_transport ); ch_idx++ ) { - float a, b, c; - - /*Directonal sound gain nrg compensation*/ - for ( k = 0; k < num_freq_bands_diff; k++ ) + int16_t k; + if ( ch_idx != 0 ) { - a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; - b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); - c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ); /*Diffuseness modellling nrg compensation*/ - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); + float a, b, c; + + /*Directonal sound gain nrg compensation*/ + for ( k = 0; k < num_freq_bands_diff; k++ ) + { + a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; + b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); + c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ); /*Diffuseness modellling nrg compensation*/ + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); + } + for ( ; k < num_freq_bands; k++ ) + { + a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; + b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); + c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ); /*Diffuseness modellling nrg compensation*/ + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); + } } - for ( ; k < num_freq_bands; k++ ) + else { - a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; - b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); - c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ); /*Diffuseness modellling nrg compensation*/ - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); + /*Diffuseness modellling nrg compensation*/ + for ( k = 0; k < num_freq_bands_diff; k++ ) + { + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ) ); + } + for ( ; k < num_freq_bands; k++ ) + { + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ) ); + } } } - else + + /*Directional gain (panning)*/ + for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_dir; ch_idx++ ) { - /*Diffuseness modellling nrg compensation*/ - for ( k = 0; k < num_freq_bands_diff; k++ ) - { - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ) ); - } - for ( ; k < num_freq_bands; k++ ) - { - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ) ); - } + v_mult( h_dirac_output_synthesis_state->direct_power_factor, + &h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands], + aux_buf, + num_freq_bands ); + + v_add( aux_buf, + &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands], + &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands], + num_freq_bands ); } - } - /*Directional gain (panning)*/ - for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_dir; ch_idx++ ) - { - v_mult( h_dirac_output_synthesis_state->direct_power_factor, - &h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands], - aux_buf, - num_freq_bands ); - - v_add( aux_buf, - &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands], - &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands], - num_freq_bands ); - } + /*Diffuse gain*/ + for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_diff; ch_idx++ ) + { + v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, + hDirAC->diffuse_response_function[ch_idx], + aux_buf, + num_freq_bands_diff ); + + v_add( aux_buf, + &h_dirac_output_synthesis_state->cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], + &h_dirac_output_synthesis_state->cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], + num_freq_bands_diff ); + } - /*Diffuse gain*/ - for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_diff; ch_idx++ ) + return; + } + else { - v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, - hDirAC->diffuse_response_function[ch_idx], - aux_buf, - num_freq_bands_diff ); - - v_add( aux_buf, - &h_dirac_output_synthesis_state->cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], - &h_dirac_output_synthesis_state->cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], - num_freq_bands_diff ); + /* compute reference and diffuse power factor for this frame */ + ivas_dirac_dec_compute_power_factors( num_freq_bands, + diffuseness, + h_dirac_output_synthesis_params->max_band_decorr, + h_dirac_output_synthesis_state->direct_power_factor, + h_dirac_output_synthesis_state->diffuse_power_factor ); } - - return; } - else - { - /* compute reference and diffuse power factor for this frame */ - ivas_dirac_dec_compute_power_factors( num_freq_bands, - diffuseness, - h_dirac_output_synthesis_params->max_band_decorr, - h_dirac_output_synthesis_state->direct_power_factor, - h_dirac_output_synthesis_state->diffuse_power_factor ); - } - } diff_start_band = 0; if ( h_dirac_output_synthesis_params->use_onset_filters ) @@ -836,8 +834,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( #ifdef JBM_TSM_ON_TCS const int16_t nbslots, /* i : number of slots to process */ #endif - const float *onset_filter - , + const float *onset_filter, #ifdef JBM_TSM_ON_TCS const int16_t md_idx, #endif @@ -940,8 +937,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( num_freq_bands_diff ); } } - else - if ( hDirAC->hConfig->dec_param_estim == FALSE ) + else if ( hDirAC->hConfig->dec_param_estim == FALSE ) { /*Direct gain*/ for ( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ ) diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 0dd5efec70..98ddbe5ec8 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -944,8 +944,7 @@ ivas_error ivas_init_decoder( ivas_total_brate, st_ivas->sba_analysis_order, st_ivas->sba_mode, - ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) - ) ) != IVAS_ERR_OK ) + ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_dec/ivas_ism_metadata_dec.c b/lib_dec/ivas_ism_metadata_dec.c index 3ceb50e6f9..e269d1e604 100644 --- a/lib_dec/ivas_ism_metadata_dec.c +++ b/lib_dec/ivas_ism_metadata_dec.c @@ -605,7 +605,7 @@ static void decode_angle_indices( DEC_CORE_HANDLE st0, /* i/o: bitstream handle */ ISM_METADATA_ANGLE_HANDLE angle, /* i/o: angle handle */ const int16_t non_diegetic_flag, /* i : Non diegetic flag */ - int16_t *flag_abs_angle1 /* o : Azimuth/yaw encoding mode */ + int16_t *flag_abs_angle1 /* o : Azimuth/yaw encoding mode */ ) { int16_t idx_angle1, nbits_diff_angle1, diff, sgn; @@ -732,7 +732,6 @@ static void decode_angle_indices( { idx_angle2 = angle->last_angle2_idx; } - } else { diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index f1275973f7..74acc77d68 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -267,10 +267,8 @@ ivas_error ivas_jbm_dec_tc( ivas_pca_dec( st_ivas->hSpar->hPCA, output_frame, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate, st_ivas->bfi, output ); } - ivas_spar_dec_gen_umx_mat( st_ivas->hSpar->hMdDec, st_ivas->nchan_transport, IVAS_MAX_NUM_BANDS, st_ivas->bfi - , - ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate ) - ); + ivas_spar_dec_gen_umx_mat( st_ivas->hSpar->hMdDec, st_ivas->nchan_transport, IVAS_MAX_NUM_BANDS, st_ivas->bfi, + ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate ) ); } ivas_sba_dirac_stereo_dec( st_ivas, output, output_frame, st_ivas->ivas_format == MC_FORMAT ); diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 2d93d23d04..d17a5fdac7 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -211,10 +211,8 @@ ivas_error ivas_masa_decode( else { #endif - *nb_bits_read += ivas_qmetadata_dec_decode( hQMetaData, st->bit_stream, &st->next_bit_pos - , - 0 - ); + *nb_bits_read += ivas_qmetadata_dec_decode( hQMetaData, st->bit_stream, &st->next_bit_pos, + 0 ); #ifdef HR_METADATA } #endif @@ -301,10 +299,8 @@ ivas_error ivas_masa_decode( if ( st_ivas->hDirAC != NULL ) { ivas_qmetadata_to_dirac( hQMetaData, st_ivas->hDirAC, hMasa, ivas_total_brate, - SBA_MODE_NONE - , - 0 - , + SBA_MODE_NONE, + 0, 0 ); } st->next_bit_pos = next_bit_pos_orig; diff --git a/lib_dec/ivas_mc_paramupmix_dec.c b/lib_dec/ivas_mc_paramupmix_dec.c index 51f8537a92..346868ab6a 100644 --- a/lib_dec/ivas_mc_paramupmix_dec.c +++ b/lib_dec/ivas_mc_paramupmix_dec.c @@ -691,4 +691,3 @@ static void get_ec_data( dequant_beta( nParBand, parBandStart, quant_type, alphaQEnv, parQ, ab ); } } - diff --git a/lib_dec/ivas_out_setup_conversion.c b/lib_dec/ivas_out_setup_conversion.c index 196638c729..131f07090c 100644 --- a/lib_dec/ivas_out_setup_conversion.c +++ b/lib_dec/ivas_out_setup_conversion.c @@ -495,8 +495,8 @@ void ivas_ls_setup_conversion_close( *-------------------------------------------------------------------------*/ void ivas_ls_setup_conversion( - Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ - const int16_t input_chans, /* i : number of input channels to the renderer */ + Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ + const int16_t input_chans, /* i : number of input channels to the renderer */ const int16_t output_frame, /* i : frame length */ #ifdef JBM_TSM_ON_TCS float *input[], /* i : LS input/output synthesis signal */ diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index feab7a351f..e1c2621ea8 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -152,10 +152,8 @@ void ivas_renderer_select( if ( st_ivas->hDecoderConfig->Opt_Headrotation ) { - nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order - , - st_ivas->hDecoderConfig->ivas_total_brate - ); + nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, + st_ivas->hDecoderConfig->ivas_total_brate ); if ( nchan_internal == 2 ) { st_ivas->hHeadTrackData->shd_rot_max_order = 1; diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index c66369e0fb..a6fe0c0b74 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -360,10 +360,8 @@ int16_t ivas_qmetadata_dec_decode( index_dirRatio1Inv = hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0]; index_dirRatio2Inv = hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0]; - masa_compensate_two_dir_energy_ratio_index( index_dirRatio1Inv, index_dirRatio2Inv, &index_dirRatio1Inv_mod, &index_dirRatio2Inv_mod - , - hodirac_flag - ); + masa_compensate_two_dir_energy_ratio_index( index_dirRatio1Inv, index_dirRatio2Inv, &index_dirRatio1Inv_mod, &index_dirRatio2Inv_mod, + hodirac_flag ); for ( m = 0; m < hQMetaData->q_direction[0].cfg.nblocks; m++ ) { diff --git a/lib_dec/ivas_rom_dec.c b/lib_dec/ivas_rom_dec.c index c337bd288e..6a33a36aaa 100644 --- a/lib_dec/ivas_rom_dec.c +++ b/lib_dec/ivas_rom_dec.c @@ -829,4 +829,3 @@ HUFF_NODE_TABLE huff_nodes_dt = { { huff_nodes_alpha_1D_DT, huff_nodes_alpha_1D_DT_coarse }, { huff_nodes_beta_1D_DT, huff_nodes_beta_1D_DT_coarse } }; - diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c old mode 100755 new mode 100644 index 5b23fe456c..ac8bb23541 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -170,9 +170,7 @@ ivas_error ivas_sba_dec_reconfigure( hSpar->hPCA = NULL; } - if ( nchan_transport_old != ivas_get_sba_num_TCs( ivas_total_brate, sba_order_internal ) - || ( last_ivas_total_brate >= IVAS_512k && ivas_total_brate < IVAS_512k ) || ( last_ivas_total_brate < IVAS_512k && ivas_total_brate >= IVAS_512k ) - ) + if ( nchan_transport_old != ivas_get_sba_num_TCs( ivas_total_brate, sba_order_internal ) || ( last_ivas_total_brate >= IVAS_512k && ivas_total_brate < IVAS_512k ) || ( last_ivas_total_brate < IVAS_512k && ivas_total_brate >= IVAS_512k ) ) { ivas_spar_dec_close( &( st_ivas->hSpar ), hDecoderConfig->output_Fs, 1 ); @@ -267,9 +265,7 @@ ivas_error ivas_sba_dec_reconfigure( ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); } - if ( ( ( st_ivas->renderer_type != RENDERER_DISABLE ) && ( st_ivas->renderer_type != RENDERER_SBA_LINEAR_DEC ) ) || ( ( hDecoderConfig->output_config != AUDIO_CONFIG_FOA ) && ( st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_STEREO ) && ( st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_MONO ) ) - || ( last_ivas_total_brate > IVAS_256k && ivas_total_brate <= IVAS_256k ) || ( last_ivas_total_brate <= IVAS_256k && ivas_total_brate > IVAS_256k ) - ) + if ( ( ( st_ivas->renderer_type != RENDERER_DISABLE ) && ( st_ivas->renderer_type != RENDERER_SBA_LINEAR_DEC ) ) || ( ( hDecoderConfig->output_config != AUDIO_CONFIG_FOA ) && ( st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_STEREO ) && ( st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_MONO ) ) || ( last_ivas_total_brate > IVAS_256k && ivas_total_brate <= IVAS_256k ) || ( last_ivas_total_brate <= IVAS_256k && ivas_total_brate > IVAS_256k ) ) { DIRAC_CONFIG_FLAG flag_config; @@ -386,10 +382,8 @@ ivas_error ivas_sba_dec_reconfigure( } else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) { - tc_nchan_to_allocate = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order - , - st_ivas->hDecoderConfig->ivas_total_brate - ); + tc_nchan_to_allocate = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, + st_ivas->hDecoderConfig->ivas_total_brate ); } else { @@ -481,10 +475,8 @@ void ivas_sba_dec_render( float *output_f_local[MAX_OUTPUT_CHANNELS]; hSpar = st_ivas->hSpar; - nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order - , - st_ivas->hDecoderConfig->ivas_total_brate - ); + nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, + st_ivas->hDecoderConfig->ivas_total_brate ); nchan_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; #ifdef DEBUGGING assert( hSpar ); diff --git a/lib_dec/ivas_sba_rendering_internal.c b/lib_dec/ivas_sba_rendering_internal.c index bab2e6ca7b..71a5718436 100644 --- a/lib_dec/ivas_sba_rendering_internal.c +++ b/lib_dec/ivas_sba_rendering_internal.c @@ -438,10 +438,8 @@ void ivas_sba_upmixer_renderer( push_wmops( "ivas_sba_upmixer_renderer" ); - nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order - , - st_ivas->hDecoderConfig->ivas_total_brate - ); + nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, + st_ivas->hDecoderConfig->ivas_total_brate ); #ifndef JBM_TSM_ON_TCS if ( st_ivas->nchan_transport >= 3 ) @@ -688,10 +686,8 @@ void ivas_sba_mix_matrix_determiner( /* Mixing matrix determiner */ num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; - ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, bfi - , - MAX_PARAM_SPATIAL_SUBFRAMES - ); + ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, bfi, + MAX_PARAM_SPATIAL_SUBFRAMES ); return; } diff --git a/lib_dec/ivas_sns_dec.c b/lib_dec/ivas_sns_dec.c index 14c16a07c4..e11551d2a6 100644 --- a/lib_dec/ivas_sns_dec.c +++ b/lib_dec/ivas_sns_dec.c @@ -127,7 +127,7 @@ static void sns_2st_dec( *-------------------------------------------------------------------*/ void sns_avq_dec( - int16_t *index, /* i : Quantization indices */ + int16_t *index, /* i : Quantization indices */ float SNS_Q[NB_DIV][M], /* o : Quantized SNS vectors */ const int16_t L_frame, const int16_t numlpc /* i : Number of sets of lpc */ @@ -269,7 +269,6 @@ void dequantize_sns( nStages = SNS_MSVQ_NSTAGES_SIDE; msvq_dec( side_cdbks, NULL, NULL, nStages, M, M, &indices[ch][idxIndices + SNS_STEREO_MODE_OFFSET_INDICES], 0, NULL, snsQ, NULL ); - } else { diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c old mode 100755 new mode 100644 index 056f293f12..0c1948a56c --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -116,10 +116,8 @@ ivas_error ivas_spar_dec_open( /* set FB config. */ active_w_mixing = -1; - if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_SPAR, num_channels_internal, num_channels_internal, active_w_mixing, output_Fs - , - 0 - ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_SPAR, num_channels_internal, num_channels_internal, active_w_mixing, output_Fs, + 0 ) ) != IVAS_ERR_OK ) { return error; } @@ -706,10 +704,8 @@ static void ivas_spar_dec_MD( sba_order = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); bfi = st_ivas->bfi; ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; - num_channels = ivas_sba_get_nchan_metadata( sba_order - , - ivas_total_brate - ); + num_channels = ivas_sba_get_nchan_metadata( sba_order, + ivas_total_brate ); num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order, st_ivas->hDecoderConfig->ivas_total_brate ); @@ -774,8 +770,7 @@ static void ivas_spar_dec_MD( ivas_spar_setup_md_smoothing( hSpar->hMdDec, num_bands_out , - num_md_sub_frames - ); + num_md_sub_frames ); } else { @@ -786,10 +781,8 @@ static void ivas_spar_dec_MD( { if ( !bfi ) { - ivas_spar_smooth_md_dtx( hSpar->hMdDec, num_bands_out - , - num_md_sub_frames - ); + ivas_spar_smooth_md_dtx( hSpar->hMdDec, num_bands_out, + num_md_sub_frames ); } set_s( hSpar->hMdDec->valid_bands, 0, IVAS_MAX_NUM_BANDS ); @@ -928,10 +921,8 @@ static void ivas_spar_get_skip_mat( const int16_t num_ch_out, const int16_t num_ch_in, const int16_t num_spar_bands, - int16_t skip_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] - , - const int16_t num_md_sub_frames -) + int16_t skip_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + const int16_t num_md_sub_frames ) { int16_t spar_band, out_ch, in_ch; int16_t i_ts, skip_flag; @@ -1098,10 +1089,8 @@ void ivas_spar_dec_agc_pca( if ( hSpar->hMdDec->td_decorr_flag ) { - num_in_ingest = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order - , - st_ivas->hDecoderConfig->ivas_total_brate - ); + num_in_ingest = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, + st_ivas->hDecoderConfig->ivas_total_brate ); } else { @@ -1171,10 +1160,8 @@ void ivas_spar_dec_set_render_params( *---------------------------------------------------------------------*/ nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; - ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, st_ivas->bfi - , - ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate ) - ); + ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, st_ivas->bfi, + ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate ) ); ivas_spar_dec_set_render_map( st_ivas, n_cldfb_slots ); @@ -1201,10 +1188,8 @@ void ivas_spar_dec_digest_tc( /* TD decorrelator */ default_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); nSamplesLeftForTD = nSamplesForRendering; - nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order - , - st_ivas->hDecoderConfig->ivas_total_brate - ); + nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, + st_ivas->hDecoderConfig->ivas_total_brate ); for ( ch = 0; ch < nchan_internal; ch++ ) { pPcm_tmp[ch] = Pcm_tmp[ch]; @@ -1569,10 +1554,8 @@ void ivas_spar_dec_upmixer( * Gen umx mat *---------------------------------------------------------------------*/ - ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, st_ivas->bfi - , - num_md_sub_frames - ); + ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, st_ivas->bfi, + num_md_sub_frames ); #endif /*---------------------------------------------------------------------* @@ -1583,10 +1566,8 @@ void ivas_spar_dec_upmixer( /* apply parameters */ /* determine if we can skip certain data */ - ivas_spar_get_skip_mat( hSpar, numch_out, numch_in, num_spar_bands, b_skip_mat - , - num_md_sub_frames - ); /* this can be precomputed based on bitrate and format*/ + ivas_spar_get_skip_mat( hSpar, numch_out, numch_in, num_spar_bands, b_skip_mat, + num_md_sub_frames ); /* this can be precomputed based on bitrate and format*/ numch_out_dirac = hDecoderConfig->nchan_out; diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c old mode 100755 new mode 100644 index a9fc187975..5945023010 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -63,9 +63,7 @@ static const int16_t ivas_spar_dec_plc_spatial_target[IVAS_SPAR_MAX_CH] = { 1, 0 * Static functions declaration *------------------------------------------------------------------------------------------*/ -static void ivas_get_spar_matrices( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands_out, const int16_t n_ts, const int16_t bw, const int16_t dtx_vad, const int16_t nB, - const int16_t numch_out, - const int16_t active_w_vlbr ); +static void ivas_get_spar_matrices( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands_out, const int16_t n_ts, const int16_t bw, const int16_t dtx_vad, const int16_t nB, const int16_t numch_out, const int16_t active_w_vlbr ); static void ivas_decode_arith_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder_State *st, const uint16_t qsi, const int16_t nB, const int16_t bands_bw, int16_t *pDo_diff, const int16_t freq_diff, const int16_t planarCP, const int16_t strat, const int32_t ivas_total_brate ); @@ -77,16 +75,9 @@ static void ivas_get_band_idx_from_differential( ivas_spar_md_t *pSpar_md, const static void ivas_mat_col_rearrange( float in_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], const int16_t order[IVAS_SPAR_MAX_CH], const int16_t i_ts, float ***mixer_mat, const int16_t bands, const int16_t num_ch ); -static void ivas_spar_dec_compute_ramp_down_post_matrix( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands, const int16_t bfi - , - const int16_t num_md_sub_frames -); +static void ivas_spar_dec_compute_ramp_down_post_matrix( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands, const int16_t bfi, const int16_t num_md_sub_frames ); -static void ivas_spar_md_fill_invalid_bands( ivas_spar_dec_matrices_t *pSpar_coeffs, ivas_spar_dec_matrices_t *pSpar_coeffs_prev, const int16_t *valid_bands, int16_t *base_band_age, const int16_t num_bands, - const int16_t numch_out - , - const int16_t num_md_sub_frames -); +static void ivas_spar_md_fill_invalid_bands( ivas_spar_dec_matrices_t *pSpar_coeffs, ivas_spar_dec_matrices_t *pSpar_coeffs_prev, const int16_t *valid_bands, int16_t *base_band_age, const int16_t num_bands, const int16_t numch_out, const int16_t num_md_sub_frames ); static ivas_error ivas_spar_set_dec_config( ivas_spar_md_dec_state_t *hMdDec, const int16_t nchan_transport, float *pFC ); @@ -107,8 +98,7 @@ static ivas_error ivas_spar_md_dec_matrix_open( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t num_channels /* i : number of internal channels */ , - const int16_t num_md_sub_frames -) + const int16_t num_md_sub_frames ) { int16_t i, j; @@ -294,10 +284,8 @@ ivas_error ivas_spar_md_dec_open( } num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order, hDecoderConfig->ivas_total_brate ); - if ( ( error = ivas_spar_md_dec_matrix_open( hMdDec, num_channels - , - num_md_sub_frames - ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_spar_md_dec_matrix_open( hMdDec, num_channels, + num_md_sub_frames ) ) != IVAS_ERR_OK ) { return error; } @@ -605,10 +593,8 @@ static ivas_error ivas_spar_set_dec_config( hMdDec->spar_md_cfg.max_freq_per_chan[i] = ivas_spar_br_table_consts[hMdDec->table_idx].fpcs; } - nchan = ivas_sba_get_nchan_metadata( ivas_spar_br_table_consts[hMdDec->table_idx].sba_order - , - ivas_spar_br_table_consts[hMdDec->table_idx].ivas_total_brate - ); + nchan = ivas_sba_get_nchan_metadata( ivas_spar_br_table_consts[hMdDec->table_idx].sba_order, + ivas_spar_br_table_consts[hMdDec->table_idx].ivas_total_brate ); switch ( nchan ) { @@ -1010,10 +996,8 @@ void ivas_spar_md_dec_process( } ivas_spar_md_fill_invalid_bands( &hMdDec->spar_coeffs, &hMdDec->spar_coeffs_prev, &hMdDec->valid_bands[0], &hMdDec->base_band_age[0], num_bands_out, - num_md_chs - , - num_md_sub_frames - ); + num_md_chs, + num_md_sub_frames ); hMdDec->dtx_md_smoothing_cntr = 1; @@ -1163,10 +1147,8 @@ void ivas_spar_setup_md_smoothing( } } - ivas_spar_smooth_md_dtx( hMdDec, num_bands_out - , - num_md_sub_frames - ); + ivas_spar_smooth_md_dtx( hMdDec, num_bands_out, + num_md_sub_frames ); return; } @@ -1633,8 +1615,7 @@ void ivas_spar_dec_gen_umx_mat( const int16_t num_bands_out, /* i : number of output bands */ const int16_t bfi /* i : bad frame indicator */ , - const int16_t num_md_sub_frames -) + const int16_t num_md_sub_frames ) { int16_t i, j, b, i_ts, num_out_ch; @@ -1701,10 +1682,8 @@ void ivas_spar_dec_gen_umx_mat( #endif } - ivas_spar_dec_compute_ramp_down_post_matrix( hMdDec, num_bands_out, bfi - , - num_md_sub_frames - ); + ivas_spar_dec_compute_ramp_down_post_matrix( hMdDec, num_bands_out, bfi, + num_md_sub_frames ); return; } @@ -2082,9 +2061,7 @@ static void ivas_decode_arith_bs( else { pred_cell_dims[i].dim1 = ndm + ndec - 1; - if ( hMdDec->spar_hoa_md_flag - && hMdDec->spar_hoa_dirac2spar_md_flag - ) + if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) { if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) { @@ -2467,10 +2444,8 @@ static void ivas_spar_md_fill_invalid_bands( const int16_t *valid_bands, int16_t *base_band_age, const int16_t num_bands, - const int16_t num_channels - , - const int16_t num_md_sub_frames -) + const int16_t num_channels, + const int16_t num_md_sub_frames ) { int16_t i, j, b, all_valid; int16_t valid_band_idx[IVAS_MAX_NUM_BANDS], idx = -1; @@ -2586,10 +2561,8 @@ static void ivas_spar_md_fill_invalid_bands( static void ivas_spar_dec_compute_ramp_down_post_matrix( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands_out, - const int16_t bfi - , - const int16_t num_md_sub_frames -) + const int16_t bfi, + const int16_t num_md_sub_frames ) { int16_t num_in_ch, num_out_ch, i, j, b; @@ -2903,9 +2876,7 @@ void ivas_spar_to_dirac( enc_param_start_band = st_ivas->hSpar->enc_param_start_band / bw; active_w_vlbr = ( st_ivas->hDecoderConfig->ivas_total_brate < IVAS_24k4 ) ? 1 : 0; - if ( hDirAC != NULL - && ivas_get_hodirac_flag( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ) == 0 - ) + if ( hDirAC != NULL && ivas_get_hodirac_flag( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ) == 0 ) { band_grouping = hDirAC->band_grouping; #ifdef ENABLE_DITHER diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h old mode 100755 new mode 100644 index 79a348d198..af9d5da5f4 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -1215,7 +1215,7 @@ typedef struct decoder_config_structure #endif int16_t Opt_non_diegetic_pan; /* indicates diegetic or not */ float non_diegetic_pan_gain; /* non diegetic panning gain*/ - int16_t Opt_AMR_WB; /* flag indicating AMR-WB IO mode */ + int16_t Opt_AMR_WB; /* flag indicating AMR-WB IO mode */ /* temp. development parameters */ #ifdef DEBUGGING diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index ab6f504dcc..996e2afc19 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -2968,7 +2968,7 @@ static ivas_error evs_dec_main( #ifdef JBM_TSM_ON_TCS ivas_syn_output( p_output, nOutSamples, st_ivas->hDecoderConfig->nchan_out, pcmBuf ); #else - ivas_syn_output( output, nOutSamples, st_ivas->hDecoderConfig->nchan_out, pcmBuf ); + ivas_syn_output( output, nOutSamples, st_ivas->hDecoderConfig->nchan_out, pcmBuf ); #endif #ifdef JBM_TSM_ON_TCS } diff --git a/lib_dec/stat_dec.h b/lib_dec/stat_dec.h index f7401462a6..c971cf0e21 100644 --- a/lib_dec/stat_dec.h +++ b/lib_dec/stat_dec.h @@ -105,15 +105,15 @@ typedef struct float cna_LR_LT; /* stereo CNA - long-term L/R correlation factor calculated on stereo upmix */ float cna_ILD_LT; /* stereo CNA - long-term ILD factor calculated on stereo upmix */ float cna_g_state[STEREO_DFT_BAND_MAX]; /* stereo CNA - side gains from the last inactive frame */ - float cna_cm[STEREO_DFT_BAND_MAX]; /* stereo CNA - coherence from the last inactive frame */ - int16_t first_cna_noise_updated; /* stereo CNA - flag indicating that comfort noise has been properly initialized during warmup */ - int16_t first_cna_noise_update_cnt; /* stereo CNA - counter of CN initialization frames */ - int16_t cna_nbands; /* stereo CNA - number of frequency bands used by the CNA in DFT stereo mode */ + float cna_cm[STEREO_DFT_BAND_MAX]; /* stereo CNA - coherence from the last inactive frame */ + int16_t first_cna_noise_updated; /* stereo CNA - flag indicating that comfort noise has been properly initialized during warmup */ + int16_t first_cna_noise_update_cnt; /* stereo CNA - counter of CN initialization frames */ + int16_t cna_nbands; /* stereo CNA - number of frequency bands used by the CNA in DFT stereo mode */ int16_t cna_band_limits[STEREO_DFT_BAND_MAX + 1]; /* stereo CNA - band limits used by the CNA in DFT stereo mode */ - float cna_act_fact; /* stereo CNA - long-term signal activity factor (0-1) */ - float cna_rescale_fact; /* stereo CNA - CN energy re-scaling factor to maintain decoded energy */ - int16_t cna_seed; /* stereo CNA - seed for random CN generator */ + float cna_act_fact; /* stereo CNA - long-term signal activity factor (0-1) */ + float cna_rescale_fact; /* stereo CNA - CN energy re-scaling factor to maintain decoded energy */ + int16_t cna_seed; /* stereo CNA - seed for random CN generator */ int16_t flag_dtx_mode; float lp_speech; @@ -1346,7 +1346,7 @@ typedef struct Decoder_State /* MCT Channel mode indication: LFE, ignore channel? */ MCT_CHAN_MODE mct_chan_mode; - int16_t cng_ism_flag; /* CNG in ISM format flag */ + int16_t cng_ism_flag; /* CNG in ISM format flag */ int16_t is_ism_format; /* Indication whether the codec operates in ISM format */ } Decoder_State, *DEC_CORE_HANDLE; diff --git a/lib_enc/dtx.c b/lib_enc/dtx.c index 1ae231a5eb..8357dd3a82 100644 --- a/lib_enc/dtx.c +++ b/lib_enc/dtx.c @@ -63,8 +63,8 @@ #define LTE_VAR -4.0f -#define MAX_BRATE_DTX_EVS ACELP_24k40 /* maximum bitrate to which the default DTX is applied in EVS; otherwise DTX is applied only in silence */ -#define MAX_BRATE_DTX_IVAS IVAS_80k /* maximum bitrate to which the default DTX is applied in IVAS; otherwise DTX is applied only in silence */ +#define MAX_BRATE_DTX_EVS ACELP_24k40 /* maximum bitrate to which the default DTX is applied in EVS; otherwise DTX is applied only in silence */ +#define MAX_BRATE_DTX_IVAS IVAS_80k /* maximum bitrate to which the default DTX is applied in IVAS; otherwise DTX is applied only in silence */ /*-------------------------------------------------------------------* * Local function prototypes *-------------------------------------------------------------------*/ diff --git a/lib_enc/ext_sig_ana.c b/lib_enc/ext_sig_ana.c old mode 100755 new mode 100644 index 70706c112c..e76457e61c --- a/lib_enc/ext_sig_ana.c +++ b/lib_enc/ext_sig_ana.c @@ -443,7 +443,6 @@ void core_signal_analysis_high_bitrate( { ProcessIGF( st, hTcxEnc->spectrum[frameno], hTcxEnc->spectrum[frameno], powerSpec, transform_type[frameno] == TCX_20, frameno, 0, vad_hover_flag ); } - } } if ( st->element_mode != IVAS_CPE_MDCT ) diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index 2245c338ca..efeb322d85 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -100,12 +100,9 @@ ivas_error ivas_dirac_enc_open( else { if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_DIRAC, - FOA_CHANNELS - , - 0, 0, input_Fs - , - FOA_CHANNELS - ) ) != IVAS_ERR_OK ) + FOA_CHANNELS, + 0, 0, input_Fs, + FOA_CHANNELS ) ) != IVAS_ERR_OK ) { return error; } @@ -378,11 +375,9 @@ void ivas_dirac_enc( set_zero( data_f[2], input_frame ); } - ivas_dirac_param_est_enc( hDirAC, &( hQMetaData->q_direction[0] ), hQMetaData->useLowerRes, data_f, NULL, NULL, input_frame, SBA_MODE_DIRAC - , + ivas_dirac_param_est_enc( hDirAC, &( hQMetaData->q_direction[0] ), hQMetaData->useLowerRes, data_f, NULL, NULL, input_frame, SBA_MODE_DIRAC, 0, - FOA_CHANNELS - ); + FOA_CHANNELS ); /* encode parameters */ if ( sba_planar || hQMetaData->useLowerRes ) @@ -394,10 +389,8 @@ void ivas_dirac_enc( } } - ivas_qmetadata_enc_encode( hMetaData, hQMetaData - , - 0 - ); + ivas_qmetadata_enc_encode( hMetaData, hQMetaData, + 0 ); *nb_bits_metadata = hMetaData->nb_bits_tot; @@ -620,11 +613,9 @@ void ivas_dirac_param_est_enc( float **pp_fr_real, float **pp_fr_imag, const int16_t input_frame, - const SBA_MODE sba_mode - , + const SBA_MODE sba_mode, const int16_t hodirac_flag, - const int16_t nchan_fb_in -) + const int16_t nchan_fb_in ) { int16_t i, d, ts, index, l_ts, num_freq_bands; int16_t band_m_idx, block_m_idx; @@ -700,14 +691,10 @@ void ivas_dirac_param_est_enc( { if ( hDirAC->hFbMixer ) { - ivas_fb_mixer_get_windowed_fr( hDirAC->hFbMixer, pcm_in, p_Cldfb_RealBuffer, p_Cldfb_ImagBuffer, l_ts, l_ts - , - hDirAC->hFbMixer->fb_cfg->num_in_chans - ); - ivas_fb_mixer_update_prior_input( hDirAC->hFbMixer, pcm_in, l_ts - , - hDirAC->hFbMixer->fb_cfg->num_in_chans - ); + ivas_fb_mixer_get_windowed_fr( hDirAC->hFbMixer, pcm_in, p_Cldfb_RealBuffer, p_Cldfb_ImagBuffer, l_ts, l_ts, + hDirAC->hFbMixer->fb_cfg->num_in_chans ); + ivas_fb_mixer_update_prior_input( hDirAC->hFbMixer, pcm_in, l_ts, + hDirAC->hFbMixer->fb_cfg->num_in_chans ); for ( i = 0; i < nchan_fb_in; i++ ) { @@ -735,10 +722,8 @@ void ivas_dirac_param_est_enc( reference_power[ts], hDirAC->hConfig->enc_param_start_band, num_freq_bands, - hodirac_flag ? SBA_MODE_DIRAC : sba_mode - , - FOA_CHANNELS - ); + hodirac_flag ? SBA_MODE_DIRAC : sba_mode, + FOA_CHANNELS ); computeIntensityVector_enc( hDirAC, diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index f4c7cdfd81..854f638491 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -132,9 +132,7 @@ ivas_error ivas_enc( /* bypass EVS coding in float precision, emulating EVS encoder/decoder delay */ for ( i = 0; i < n; i++ ) { - if ( ( ivas_format == SBA_FORMAT ) && ( st_ivas->sba_mode == SBA_MODE_SPAR ) - && !( st_ivas->sba_analysis_order > 1 ) - ) + if ( ( ivas_format == SBA_FORMAT ) && ( st_ivas->sba_mode == SBA_MODE_SPAR ) && !( st_ivas->sba_analysis_order > 1 ) ) { hp20( data_f[HOA_keep_ind[st_ivas->hSpar->hMdEnc->HOA_md_ind[i]]], input_frame, st_ivas->mem_hp20_in[i], input_Fs ); } diff --git a/lib_enc/ivas_enc_cov_handler.c b/lib_enc/ivas_enc_cov_handler.c index c4d7996e17..2d1c5425bf 100644 --- a/lib_enc/ivas_enc_cov_handler.c +++ b/lib_enc/ivas_enc_cov_handler.c @@ -54,10 +54,7 @@ * Local functions declarations *------------------------------------------------------------------------------------------*/ -static void ivas_band_cov( float **ppIn_FR_real, float **ppIn_FR_imag, const int16_t num_chans, const int16_t num_bins, int16_t stride, float **pFb_bin_to_band, const int16_t *pFb_start_bin_per_band, const int16_t *pFb_active_bins_per_band, const int16_t start_band, const int16_t end_band, float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] - , - const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] -); +static void ivas_band_cov( float **ppIn_FR_real, float **ppIn_FR_imag, const int16_t num_chans, const int16_t num_bins, int16_t stride, float **pFb_bin_to_band, const int16_t *pFb_start_bin_per_band, const int16_t *pFb_active_bins_per_band, const int16_t start_band, const int16_t end_band, float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] ); /*------------------------------------------------------------------------- * ivas_spar_covar_enc_open() @@ -163,10 +160,8 @@ void ivas_enc_cov_handler_process( const int16_t end_band, const int16_t num_ch, const int16_t dtx_vad, - const int16_t transient_det[2] - , - const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] -) + const int16_t transient_det[2], + const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] ) { int16_t i, j; int16_t dtx_cov_flag; @@ -179,10 +174,8 @@ void ivas_enc_cov_handler_process( pFb->fb_bin_to_band.p_short_stride_start_bin_per_band, pFb->fb_bin_to_band.p_short_stride_num_bins_per_band, start_band, end_band, - cov_real - , - HOA_md_ind - ); + cov_real, + HOA_md_ind ); #ifdef DEBUG_SPAR_WRITE_OUT_COV { @@ -274,10 +267,8 @@ static void ivas_band_cov( const int16_t *pFb_active_bins_per_band, const int16_t start_band, const int16_t end_band, - float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] - , - const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] -) + float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] ) { int16_t i, j, k; float pV_re[L_FRAME48k]; diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index c9804601bf..a8c4982e4b 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -55,11 +55,11 @@ #define ISM_MAX_ELEVATION_DIFF_IDX ( ISM_ELEVATION_NBITS - 1 /*zero*/ - 1 /*sign*/ ) #define ISM_MAX_RADIUS_DIFF_IDX ( ISM_RADIUS_NBITS - 1 /*zero*/ - 1 /*sign*/ ) -#define ISM_FEC_MAX 10 -#define ISM_MD_FEC_DIFF 10 -#define ISM_MD_INC_DIFF_CNT_MAX 6 -#define ISM_MD_FEC_CNT_MAX 25 -#define ISM_MD_RAD_FEC_DIFF 1 +#define ISM_FEC_MAX 10 +#define ISM_MD_FEC_DIFF 10 +#define ISM_MD_INC_DIFF_CNT_MAX 6 +#define ISM_MD_FEC_CNT_MAX 25 +#define ISM_MD_RAD_FEC_DIFF 1 #define INTER_OBJECT_PARAM_CHECK ( ( ISM_FEC_MAX / 2 ) - 2 ) /* note: constant must be less than (ISM_FEC_MAX / number of coded parameters) */ @@ -79,11 +79,11 @@ static void encode_radius( BSTR_ENC_HANDLE hBstr, int16_t *last_radius_idx, int1 *-------------------------------------------------------------------------*/ ivas_error ivas_set_ism_metadata( - ISM_METADATA_HANDLE hIsmMeta, /* o : ISM metadata handle */ - const float azimuth, /* i : azimuth value */ - const float elevation, /* i : elevation */ - const float radius_meta, /* i : radius */ - const float yaw, /* i : yaw */ + ISM_METADATA_HANDLE hIsmMeta, /* o : ISM metadata handle */ + const float azimuth, /* i : azimuth value */ + const float elevation, /* i : elevation */ + const float radius_meta, /* i : radius */ + const float yaw, /* i : yaw */ const float pitch, /* i : pitch */ const int16_t non_diegetic_flag /* i : non-diegetic object flag*/ ) @@ -231,9 +231,7 @@ ivas_error ivas_ism_metadata_enc( if ( hIsmMeta[ch]->ism_metadata_flag == 0 ) { if ( ( fabsf( hIsmMeta[ch]->azimuth - hIsmMeta[ch]->last_true_azimuth ) > ISM_MD_FEC_DIFF ) || - ( fabsf( hIsmMeta[ch]->elevation - hIsmMeta[ch]->last_true_elevation ) > ISM_MD_FEC_DIFF ) - || ( fabsf( hIsmMeta[ch]->radius - hIsmMeta[ch]->last_true_radius ) > ISM_MD_RAD_FEC_DIFF ) - ) + ( fabsf( hIsmMeta[ch]->elevation - hIsmMeta[ch]->last_true_elevation ) > ISM_MD_FEC_DIFF ) || ( fabsf( hIsmMeta[ch]->radius - hIsmMeta[ch]->last_true_radius ) > ISM_MD_RAD_FEC_DIFF ) ) { hIsmMeta[ch]->ism_metadata_flag = 1; hIsmMeta[ch]->ism_md_inc_diff_cnt = 0; diff --git a/lib_enc/ivas_ism_param_enc.c b/lib_enc/ivas_ism_param_enc.c index 85623a7067..6afb57c155 100644 --- a/lib_enc/ivas_ism_param_enc.c +++ b/lib_enc/ivas_ism_param_enc.c @@ -299,10 +299,8 @@ ivas_error ivas_param_ism_enc_open( /* set FB config. */ - if ( ( error = ivas_fb_set_cfg( &fb_cfg, ISM_FORMAT, SBA_MODE_NONE, st_ivas->hEncoderConfig->nchan_inp, 0, 0, input_Fs - , - 0 - ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_fb_set_cfg( &fb_cfg, ISM_FORMAT, SBA_MODE_NONE, st_ivas->hEncoderConfig->nchan_inp, 0, 0, input_Fs, + 0 ) ) != IVAS_ERR_OK ) { return error; } @@ -412,15 +410,11 @@ void ivas_param_ism_enc( for ( ts = 0; ts < num_time_slots; ts++ ) { - ivas_fb_mixer_get_windowed_fr( hDirAC->hFbMixer, pcm_in, p_fb_RealBuffer, p_fb_ImagBuffer, l_ts, l_ts - , - hDirAC->hFbMixer->fb_cfg->num_in_chans - ); - - ivas_fb_mixer_update_prior_input( hDirAC->hFbMixer, pcm_in, l_ts - , - hDirAC->hFbMixer->fb_cfg->num_in_chans - ); + ivas_fb_mixer_get_windowed_fr( hDirAC->hFbMixer, pcm_in, p_fb_RealBuffer, p_fb_ImagBuffer, l_ts, l_ts, + hDirAC->hFbMixer->fb_cfg->num_in_chans ); + + ivas_fb_mixer_update_prior_input( hDirAC->hFbMixer, pcm_in, l_ts, + hDirAC->hFbMixer->fb_cfg->num_in_chans ); for ( i = 0; i < nchan_ism; i++ ) { diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 3d8658052f..2de3fa05cf 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -338,10 +338,8 @@ ivas_error ivas_masa_encode( else { #endif - ivas_qmetadata_enc_encode( hMetaData, hQMetaData - , - 0 - ); + ivas_qmetadata_enc_encode( hMetaData, hQMetaData, + 0 ); #ifdef HR_METADATA } #endif diff --git a/lib_enc/ivas_mc_param_enc.c b/lib_enc/ivas_mc_param_enc.c index 90090e3683..ff01bd3aa1 100644 --- a/lib_enc/ivas_mc_param_enc.c +++ b/lib_enc/ivas_mc_param_enc.c @@ -140,10 +140,8 @@ ivas_error ivas_param_mc_enc_open( hParamMC->dmx_factors = ivas_param_mc_conf[config_index].dmx_fac; /* set FB config. */ - if ( ( error = ivas_fb_set_cfg( &fb_cfg, MC_FORMAT, SBA_MODE_DIRAC, nchan_inp, 0, 0, input_Fs - , - 0 - ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_fb_set_cfg( &fb_cfg, MC_FORMAT, SBA_MODE_DIRAC, nchan_inp, 0, 0, input_Fs, + 0 ) ) != IVAS_ERR_OK ) { return error; } @@ -676,10 +674,8 @@ static void ivas_param_mc_param_est_enc( for ( ts = 0; ts < start_ts; ts++ ) { - ivas_fb_mixer_update_prior_input( hParamMC->hFbMixer, pcm_in, l_ts - , - hParamMC->hFbMixer->fb_cfg->num_in_chans - ); + ivas_fb_mixer_update_prior_input( hParamMC->hFbMixer, pcm_in, l_ts, + hParamMC->hFbMixer->fb_cfg->num_in_chans ); for ( i = 0; i < nchan_input; i++ ) { pcm_in[i] += l_ts; @@ -688,14 +684,10 @@ static void ivas_param_mc_param_est_enc( for ( ts = start_ts; ts < num_time_slots; ts++ ) { - ivas_fb_mixer_get_windowed_fr( hParamMC->hFbMixer, pcm_in, p_slot_frame_f_real, p_slot_frame_f_imag, l_ts, l_ts - , - hParamMC->hFbMixer->fb_cfg->num_in_chans - ); - ivas_fb_mixer_update_prior_input( hParamMC->hFbMixer, pcm_in, l_ts - , - hParamMC->hFbMixer->fb_cfg->num_in_chans - ); + ivas_fb_mixer_get_windowed_fr( hParamMC->hFbMixer, pcm_in, p_slot_frame_f_real, p_slot_frame_f_imag, l_ts, l_ts, + hParamMC->hFbMixer->fb_cfg->num_in_chans ); + ivas_fb_mixer_update_prior_input( hParamMC->hFbMixer, pcm_in, l_ts, + hParamMC->hFbMixer->fb_cfg->num_in_chans ); for ( i = 0; i < nchan_input; i++ ) { diff --git a/lib_enc/ivas_mc_paramupmix_enc.c b/lib_enc/ivas_mc_paramupmix_enc.c index ee9bd516f6..fc093c3f59 100644 --- a/lib_enc/ivas_mc_paramupmix_enc.c +++ b/lib_enc/ivas_mc_paramupmix_enc.c @@ -184,10 +184,8 @@ ivas_error ivas_mc_paramupmix_enc_open( /* set FB config. */ /* need to set num output channels to a value > 0 to get pFb != NULL */ - if ( ( error = ivas_fb_set_cfg( &fb_cfg, MC_FORMAT, SBA_MODE_SPAR, MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH, MC_PARAMUPMIX_COMBINATIONS, 0, input_Fs - , - 0 - ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_fb_set_cfg( &fb_cfg, MC_FORMAT, SBA_MODE_SPAR, MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH, MC_PARAMUPMIX_COMBINATIONS, 0, input_Fs, + 0 ) ) != IVAS_ERR_OK ) { return error; } @@ -773,14 +771,10 @@ static void ivas_mc_paramupmix_param_est_enc( l_ts = input_frame / MAX_PARAM_SPATIAL_SUBFRAMES; for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) { - ivas_fb_mixer_get_windowed_fr( hMCParamUpmix->hFbMixer, pcm_in, pp_in_fr_real, pp_in_fr_imag, l_ts, l_ts - , - hMCParamUpmix->hFbMixer->fb_cfg->num_in_chans - ); - ivas_fb_mixer_update_prior_input( hMCParamUpmix->hFbMixer, pcm_in, l_ts - , - hMCParamUpmix->hFbMixer->fb_cfg->num_in_chans - ); + ivas_fb_mixer_get_windowed_fr( hMCParamUpmix->hFbMixer, pcm_in, pp_in_fr_real, pp_in_fr_imag, l_ts, l_ts, + hMCParamUpmix->hFbMixer->fb_cfg->num_in_chans ); + ivas_fb_mixer_update_prior_input( hMCParamUpmix->hFbMixer, pcm_in, l_ts, + hMCParamUpmix->hFbMixer->fb_cfg->num_in_chans ); for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH; i++ ) { pcm_in[i] += l_ts; @@ -831,4 +825,3 @@ static void ivas_mc_paramupmix_param_est_enc( return; } - diff --git a/lib_enc/ivas_mcmasa_enc.c b/lib_enc/ivas_mcmasa_enc.c index 9c4fbe3cfd..ec3a49956b 100644 --- a/lib_enc/ivas_mcmasa_enc.c +++ b/lib_enc/ivas_mcmasa_enc.c @@ -188,10 +188,8 @@ ivas_error ivas_mcmasa_enc_open( } /* set FB config. */ - if ( ( error = ivas_fb_set_cfg( &fb_cfg, MASA_FORMAT, SBA_MODE_NONE, numAnalysisChannels, 0, 0, input_Fs - , - 0 - ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_fb_set_cfg( &fb_cfg, MASA_FORMAT, SBA_MODE_NONE, numAnalysisChannels, 0, 0, input_Fs, + 0 ) ) != IVAS_ERR_OK ) { return error; } @@ -222,10 +220,8 @@ ivas_error ivas_mcmasa_enc_open( else { /* Allocate and initialize FB mixer handle for LFE channel */ - if ( ( error = ivas_fb_set_cfg( &fb_cfgLfe, MASA_FORMAT, SBA_MODE_NONE, 1, 0, 0, input_Fs - , - 0 - ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_fb_set_cfg( &fb_cfgLfe, MASA_FORMAT, SBA_MODE_NONE, 1, 0, 0, input_Fs, + 0 ) ) != IVAS_ERR_OK ) { return error; } @@ -837,14 +833,10 @@ void ivas_mcmasa_param_est_enc( for ( ts = mrange[0]; ts < mrange[1]; ts++ ) { - ivas_fb_mixer_get_windowed_fr( hMcMasa->hFbMixer, pcm_in, p_Chnl_RealBuffer, p_Chnl_ImagBuffer, l_ts, l_ts - , - hMcMasa->hFbMixer->fb_cfg->num_in_chans - ); - ivas_fb_mixer_update_prior_input( hMcMasa->hFbMixer, pcm_in, l_ts - , - hMcMasa->hFbMixer->fb_cfg->num_in_chans - ); + ivas_fb_mixer_get_windowed_fr( hMcMasa->hFbMixer, pcm_in, p_Chnl_RealBuffer, p_Chnl_ImagBuffer, l_ts, l_ts, + hMcMasa->hFbMixer->fb_cfg->num_in_chans ); + ivas_fb_mixer_update_prior_input( hMcMasa->hFbMixer, pcm_in, l_ts, + hMcMasa->hFbMixer->fb_cfg->num_in_chans ); for ( i = 0; i < numAnalysisChannels; i++ ) { pcm_in[i] += l_ts; @@ -985,10 +977,8 @@ void ivas_mcmasa_param_est_enc( reference_power[ts], 0, num_freq_bands, - SBA_MODE_NONE - , - FOA_CHANNELS - ); + SBA_MODE_NONE, + FOA_CHANNELS ); /* Fill buffers of length "averaging_length" time slots for intensity and energy */ hMcMasa->index_buffer_intensity = ( hMcMasa->index_buffer_intensity % hMcMasa->no_col_avg_diff ) + 1; /* averaging_length = 32 */ @@ -1717,14 +1707,10 @@ static void computeLfeEnergy( for ( ts = mrange[0]; ts < mrange[1]; ts++ ) { - ivas_fb_mixer_get_windowed_fr( hMcMasa->hFbMixerLfe, pcm_in, p_Chnl_RealBuffer, p_Chnl_ImagBuffer, l_ts, l_ts - , - hMcMasa->hFbMixerLfe->fb_cfg->num_in_chans - ); - ivas_fb_mixer_update_prior_input( hMcMasa->hFbMixerLfe, pcm_in, l_ts - , - hMcMasa->hFbMixerLfe->fb_cfg->num_in_chans - ); + ivas_fb_mixer_get_windowed_fr( hMcMasa->hFbMixerLfe, pcm_in, p_Chnl_RealBuffer, p_Chnl_ImagBuffer, l_ts, l_ts, + hMcMasa->hFbMixerLfe->fb_cfg->num_in_chans ); + ivas_fb_mixer_update_prior_input( hMcMasa->hFbMixerLfe, pcm_in, l_ts, + hMcMasa->hFbMixerLfe->fb_cfg->num_in_chans ); pcm_in[0] += l_ts; /* Compute low frequency energy for LFE, for other channels it is computed in ivas_chnl_param_est_enc() */ diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index d2b2d60354..2de4509870 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -52,10 +52,7 @@ static float direction_distance( float elevation[DIRAC_MAX_NBANDS][MAX_PARAM_SPA #endif -static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( IVAS_QMETADATA_HANDLE hQMetaData, int16_t *needed_bits, int16_t *nbits_diff, int16_t *dfRatioBits - , - const int16_t hodirac_flag -); +static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( IVAS_QMETADATA_HANDLE hQMetaData, int16_t *needed_bits, int16_t *nbits_diff, int16_t *dfRatioBits, const int16_t hodirac_flag ); static int16_t ivas_qmetadata_entropy_encode_diffuseness( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, uint16_t *diffuseness_index_max_ec_frame ); @@ -286,10 +283,8 @@ ivas_error ivas_qmetadata_enc_encode( } /*Quantization of the Diffuseness */ - ivas_qmetadata_quantize_diffuseness_nrg_ratios( hQMetaData, bits_dir_raw_pre, bits_diff, dfRatio_bits - , - hodirac_flag - ); + ivas_qmetadata_quantize_diffuseness_nrg_ratios( hQMetaData, bits_dir_raw_pre, bits_diff, dfRatio_bits, + hodirac_flag ); bits_diff_sum = 0; bits_diff[0] = ivas_qmetadata_entropy_encode_diffuseness( hMetaData, &( hQMetaData->q_direction[0] ), &diffuseness_index_max_ec_frame_pre[0] ); @@ -1480,10 +1475,8 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr( * fact that with 2dir data, it is harder to achieve separate high direct-to-total ratio values * which are assumed by the direction quantization system. In practice, this improves direction * accuracy when it is perceptual meaningful. */ - masa_compensate_two_dir_energy_ratio_index( index_dirRatio1Inv, index_dirRatio2Inv, &index_dirRatio1Inv_mod, &index_dirRatio2Inv_mod - , - 0 - ); + masa_compensate_two_dir_energy_ratio_index( index_dirRatio1Inv, index_dirRatio2Inv, &index_dirRatio1Inv_mod, &index_dirRatio2Inv_mod, + 0 ); for ( k = 0; k < hQMetaData->q_direction[0].cfg.nblocks; k++ ) { @@ -1708,10 +1701,8 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( IVAS_QMETADATA_HANDLE hQMetaData, int16_t *needed_bits, int16_t *nbits_diff, - int16_t *dfRatioBits - , - const int16_t hodirac_flag -) + int16_t *dfRatioBits, + const int16_t hodirac_flag ) { int16_t j, k, dir2band; int16_t index_dirRatio1Inv, index_dirRatio2Inv, index_dirRatio1Inv_mod, index_dirRatio2Inv_mod; @@ -1814,10 +1805,8 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( * fact that with 2dir data, it is harder to achieve separate high direct-to-total ratio values * which are assumed by the direction quantization system. In practice, this improves direction * accuracy when it is perceptual meaningful. */ - masa_compensate_two_dir_energy_ratio_index( index_dirRatio1Inv, index_dirRatio2Inv, &index_dirRatio1Inv_mod, &index_dirRatio2Inv_mod - , - hodirac_flag - ); + masa_compensate_two_dir_energy_ratio_index( index_dirRatio1Inv, index_dirRatio2Inv, &index_dirRatio1Inv_mod, &index_dirRatio2Inv_mod, + hodirac_flag ); for ( k = 0; k < hQMetaData->q_direction[0].cfg.nblocks; k++ ) { diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index 32bf0ef38b..3a2dd72820 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -224,9 +224,7 @@ ivas_error ivas_sba_enc_reconfigure( { hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; } - if ( nchan_transport_old != st_ivas->nchan_transport - || ( ivas_total_brate < IVAS_512k && hEncoderConfig->last_ivas_total_brate >= IVAS_512k ) || ( ivas_total_brate >= IVAS_512k && hEncoderConfig->last_ivas_total_brate < IVAS_512k ) - ) + if ( nchan_transport_old != st_ivas->nchan_transport || ( ivas_total_brate < IVAS_512k && hEncoderConfig->last_ivas_total_brate >= IVAS_512k ) || ( ivas_total_brate >= IVAS_512k && hEncoderConfig->last_ivas_total_brate < IVAS_512k ) ) { /* FB mixer handle */ if ( hDirAC->hFbMixer != NULL ) diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index b33cf4ffa0..39d1d6ead7 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -86,10 +86,8 @@ ivas_error ivas_spar_enc_open( input_Fs = hEncoderConfig->input_Fs; sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); - nchan_inp = ivas_sba_get_nchan_metadata( sba_order_internal - , - hEncoderConfig->ivas_total_brate - ); + nchan_inp = ivas_sba_get_nchan_metadata( sba_order_internal, + hEncoderConfig->ivas_total_brate ); assert( nchan_inp <= hEncoderConfig->nchan_inp ); ivas_total_brate = hEncoderConfig->ivas_total_brate; @@ -125,10 +123,8 @@ ivas_error ivas_spar_enc_open( /* set FB config. */ active_w_mixing = ivas_spar_br_table_consts[table_idx].active_w; - ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_SPAR, nchan_inp, nchan_transport, active_w_mixing, input_Fs - , - nchan_fb_in - ); + ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_SPAR, nchan_inp, nchan_transport, active_w_mixing, input_Fs, + nchan_fb_in ); fb_cfg->remix_order = remix_order_set[hSpar->hMdEnc->spar_md_cfg.remix_unmix_order]; /* FB mixer handle */ @@ -456,10 +452,8 @@ static ivas_error ivas_spar_enc_process( input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); sba_order = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); - nchan_inp = ivas_sba_get_nchan_metadata( sba_order - , - hEncoderConfig->ivas_total_brate - ); + nchan_inp = ivas_sba_get_nchan_metadata( sba_order, + hEncoderConfig->ivas_total_brate ); assert( nchan_inp <= hEncoderConfig->nchan_inp ); int16_t active_w_vlbr; @@ -504,10 +498,8 @@ static ivas_error ivas_spar_enc_process( } /* run Filter Bank overlapping MDFT analysis first, then we can use the temporary buffer for Parameter MDFT analysis*/ - ivas_fb_mixer_pcm_ingest( hSpar->hFbMixer, data_f, p_pcm_tmp, input_frame - , - hSpar->hMdEnc->HOA_md_ind - ); + ivas_fb_mixer_pcm_ingest( hSpar->hFbMixer, data_f, p_pcm_tmp, input_frame, + hSpar->hMdEnc->HOA_md_ind ); /* prepare Parameter MDFT analysis */ for ( i = 0; i < nchan_fb_in; i++ ) @@ -521,15 +513,11 @@ static ivas_error ivas_spar_enc_process( for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) { - ivas_fb_mixer_get_windowed_fr( hSpar->hFbMixer, p_pcm_tmp, ppIn_FR_real, ppIn_FR_imag, l_ts, l_ts - , - nchan_fb_in - ); + ivas_fb_mixer_get_windowed_fr( hSpar->hFbMixer, p_pcm_tmp, ppIn_FR_real, ppIn_FR_imag, l_ts, l_ts, + nchan_fb_in ); - ivas_fb_mixer_update_prior_input( hSpar->hFbMixer, p_pcm_tmp, l_ts - , - nchan_fb_in - ); + ivas_fb_mixer_update_prior_input( hSpar->hFbMixer, p_pcm_tmp, l_ts, + nchan_fb_in ); for ( i = 0; i < nchan_fb_in; i++ ) { @@ -553,11 +541,9 @@ static ivas_error ivas_spar_enc_process( * DirAC encoding *-----------------------------------------------------------------------------------------*/ /*tyagiri: TODO: HODIRAC should be disabled for 256 kbps and outputs should be BE w.r.t baseline*/ - ivas_dirac_param_est_enc( st_ivas->hDirAC, hQMetaData->q_direction, hQMetaData->useLowerRes, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, st_ivas->sba_mode - , + ivas_dirac_param_est_enc( st_ivas->hDirAC, hQMetaData->q_direction, hQMetaData->useLowerRes, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, st_ivas->sba_mode, st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_256k, - st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_256k ? HOA2_CHANNELS : FOA_CHANNELS - ); + st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_256k ? HOA2_CHANNELS : FOA_CHANNELS ); if ( hQMetaData->q_direction->cfg.nbands > 0 ) { @@ -568,10 +554,8 @@ static ivas_error ivas_spar_enc_process( /* WB 4TC mode bit : disable for now*/ push_next_indice( hMetaData, 0, 1 ); - ivas_qmetadata_enc_encode( hMetaData, hQMetaData - , - ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) - ); + ivas_qmetadata_enc_encode( hMetaData, hQMetaData, + ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ); } else { @@ -689,10 +673,8 @@ static ivas_error ivas_spar_enc_process( hSpar->hFbMixer->pFb->filterbank_num_bands, nchan_inp, dtx_vad, - transient_det - , - hSpar->hMdEnc->HOA_md_ind - ); + transient_det, + hSpar->hMdEnc->HOA_md_ind ); nchan_transport = st_ivas->nchan_transport; /*-----------------------------------------------------------------------------------------* diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index 1687532c82..f93c9e6ca5 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -119,10 +119,8 @@ ivas_error ivas_spar_md_enc_open( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD encoder" ); } - num_channels = ivas_sba_get_nchan_metadata( sba_order - , - hEncoderConfig->ivas_total_brate - ); + num_channels = ivas_sba_get_nchan_metadata( sba_order, + hEncoderConfig->ivas_total_brate ); if ( ( hMdEnc->spar_md.band_coeffs = (ivas_band_coeffs_t *) malloc( IVAS_MAX_NUM_BANDS * sizeof( ivas_band_coeffs_t ) ) ) == NULL ) { @@ -318,10 +316,8 @@ ivas_error ivas_spar_md_enc_init( int16_t num_channels, i, j, k; ivas_sba_get_spar_hoa_md_flag( sba_order, hEncoderConfig->ivas_total_brate, &hMdEnc->spar_hoa_md_flag, &hMdEnc->spar_hoa_dirac2spar_md_flag ); - num_channels = ivas_sba_get_nchan_metadata( sba_order - , - hEncoderConfig->ivas_total_brate - ); + num_channels = ivas_sba_get_nchan_metadata( sba_order, + hEncoderConfig->ivas_total_brate ); ivas_sba_get_spar_hoa_ch_ind( num_channels, hEncoderConfig->ivas_total_brate, hMdEnc->HOA_md_ind ); table_idx = ivas_get_spar_table_idx( hEncoderConfig->ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL ); @@ -588,10 +584,8 @@ ivas_error ivas_spar_md_enc_process( float Wscale[IVAS_MAX_NUM_BANDS]; num_quant_strats = hMdEnc->spar_md_cfg.num_quant_strats; - num_ch = ivas_sba_get_nchan_metadata( sba_order - , - hEncoderConfig->ivas_total_brate - ); + num_ch = ivas_sba_get_nchan_metadata( sba_order, + hEncoderConfig->ivas_total_brate ); active_w = hMdEnc->spar_md_cfg.active_w; nchan_transport = hMdEnc->spar_md_cfg.nchan_transport; @@ -1549,9 +1543,7 @@ static void ivas_get_arith_coded_bs( else { pred_cell_dims[i].dim1 = ndm + ndec - 1; - if ( hMdEnc->spar_hoa_md_flag - && hMdEnc->spar_hoa_dirac2spar_md_flag - ) + if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) { if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) { diff --git a/lib_enc/lsf_msvq_ma_enc.c b/lib_enc/lsf_msvq_ma_enc.c index 13da5f91dd..9c7bed7629 100644 --- a/lib_enc/lsf_msvq_ma_enc.c +++ b/lib_enc/lsf_msvq_ma_enc.c @@ -54,7 +54,6 @@ // void dctT2_N_apply_matrix( const float *input, float *output, const int16_t dct_dim, int16_t fdcngvq_dim, const float *idctT2_24_X_matrixQ16, const int16_t matrix_1st_dim, DCTTYPE dcttype ); - int16_t msvq_stage1_dct_search( /* o : (p_max , best candidate sofar ) */ const float *u, /* i : target */ @@ -335,8 +334,8 @@ void msvq_enc( float resid_buf[2 * LSFMBEST_MAX * M_MAX], dist_buf[2 * LSFMBEST_MAX], Tmp[M_MAX]; int16_t idx_buf[2 * LSFMBEST_MAX * MAX_VQ_STAGES_USED], parents[LSFMBEST_MAX]; int16_t n, maxn, start; - float *st1_syn_vec_ptr; /* ptr to buffer in dynRAM */ - float *st1_mse_ptr; /* ptr to buffer in existing dRAM used for stage 1 candidate analysis */ + float *st1_syn_vec_ptr; /* ptr to buffer in dynRAM */ + float *st1_mse_ptr; /* ptr to buffer in existing dRAM used for stage 1 candidate analysis */ int16_t indices_st1_local[FDCNG_VQ_DCT_NSEGM * 2]; /* after stage#1 DCT search this is copied to the global indices[1][s*stages] structure */ assert( maxC <= LSFMBEST_MAX ); assert( ( LSFMBEST_MAX * M_MAX ) > ( N * maxC ) ); @@ -347,7 +346,6 @@ void msvq_enc( st1_syn_vec_ptr = &( resid_buf[1 * LSFMBEST_MAX * M_MAX] ) - FDCNG_VQ_MAX_LEN * maxC; /* reuse top of resid[0] scratch RAM for residual */ - /*----------------------------------------------------------------* * Allocate memory for previous (parent) and current nodes. * Parent node is indexed [0], current node is indexed [1]. diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 5b635ffee3..f19e0dbf1a 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -52,7 +52,7 @@ * Local constants *------------------------------------------------------------------------*/ -#define CLDFB_HALF_BIN_FREQUENCY_OFFSET 0.5f +#define CLDFB_HALF_BIN_FREQUENCY_OFFSET 0.5f #define IVAS_TDET_DUCK_MULT_FAC_PARA_BIN ( 2.0f ) #define IVAS_TDET_DUCK_MULT_FAC_PARA_BIN_LOW_BR ( 3.0f ) @@ -166,7 +166,6 @@ ivas_error ivas_dirac_dec_init_binaural_data( hBinaural->renderStereoOutputInsteadOfBinaural = 0; - for ( bin = 0; bin < nBins; bin++ ) { binCenterFreq = ( (float) bin + CLDFB_HALF_BIN_FREQUENCY_OFFSET ) / (float) nBins * ( (float) output_Fs / 2.0f ); @@ -2181,11 +2180,10 @@ static void hrtfShGetHrtf( *------------------------------------------------------------------------*/ /*! r: Configured reqularization factor value */ - float - configure_reqularization_factor( - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const int32_t ivas_total_brate /* i : IVAS total bitrate */ - ) +float configure_reqularization_factor( + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +) { float reqularizationFactor; reqularizationFactor = 1.0f; /* Default value */ diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 419801d6b5..f4063edc48 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -444,7 +444,7 @@ void TDREND_Update_object_positions( #ifdef JBM_TSM_ON_TCS float *output[] #else - float output[][L_FRAME48k] /* i/o: SCE/MC channels */ + float output[][L_FRAME48k] /* i/o: SCE/MC channels */ #endif ) { diff --git a/lib_rend/ivas_objectRenderer_sfx.c b/lib_rend/ivas_objectRenderer_sfx.c index 20f0b33c15..d988ad53d2 100644 --- a/lib_rend/ivas_objectRenderer_sfx.c +++ b/lib_rend/ivas_objectRenderer_sfx.c @@ -236,8 +236,8 @@ void TDREND_firfilt( float *mem, /* i/o: filter memory */ const int16_t subframe_length, /* i : Length of signal */ const int16_t filterlength, /* i : Filter length */ - const float Gain, /* i : Gain */ - const float prevGain /* i : Previous gain */ + const float Gain, /* i : Gain */ + const float prevGain /* i : Previous gain */ ) { float buffer[SFX_SPAT_BIN_MAX_FILTER_LENGTH - 1 + L_SUBFRAME5MS_48k]; diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 623733e6c1..cfea5510c9 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -2661,8 +2661,7 @@ ivas_error IVAS_REND_Open( const int32_t outputSampleRate, const IVAS_REND_AudioConfig outConfig, const int16_t nonDiegeticPan, - const float nonDiegeticPanGain -) + const float nonDiegeticPanGain ) { int16_t i; IVAS_REND_HANDLE hIvasRend; diff --git a/lib_util/ism_file_reader.c b/lib_util/ism_file_reader.c index 4e6babe4c4..7054d2081b 100644 --- a/lib_util/ism_file_reader.c +++ b/lib_util/ism_file_reader.c @@ -35,9 +35,9 @@ #include #include -#define META_LINE_LENGTH 200 /* max number of characters at one line of metadata input/output file */ -#define NUM_ISM_METADATA_PER_LINE 8 /* Number of ISM metadata per line in a metadata file */ -#define NUM_MIN_ISM_METADATA 1 /* Minimum number of metadata parameters (azimuth) */ +#define META_LINE_LENGTH 200 /* max number of characters at one line of metadata input/output file */ +#define NUM_ISM_METADATA_PER_LINE 8 /* Number of ISM metadata per line in a metadata file */ +#define NUM_MIN_ISM_METADATA 1 /* Minimum number of metadata parameters (azimuth) */ struct IsmFileReader -- GitLab From 9469bb77c850f546396f6cc10e725a84f151a05f Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Fri, 19 May 2023 22:35:39 +0300 Subject: [PATCH 281/331] Applies several fixes to address issues shown by smoke tests. --- lib_com/ivas_masa_com.c | 9 +++------ lib_com/ivas_prot.h | 6 +++--- lib_dec/ivas_masa_dec.c | 6 +++--- lib_dec/ivas_qmetadata_dec.c | 17 +++++++++-------- lib_enc/ivas_masa_enc.c | 16 +++++++++------- 5 files changed, 27 insertions(+), 27 deletions(-) diff --git a/lib_com/ivas_masa_com.c b/lib_com/ivas_masa_com.c index 59b24050b8..d2226937ff 100644 --- a/lib_com/ivas_masa_com.c +++ b/lib_com/ivas_masa_com.c @@ -330,14 +330,12 @@ void masa_sample_rate_band_correction( #endif uint8_t numBands48k; -#ifdef FIX_HBR_MASAMETA - if ( maxBand == MASA_FREQUENCY_BANDS - 1 ) -#else +#ifndef FIX_HBR_MASAMETA if ( sampling_rate == 48000 ) -#endif { return; } +#endif #ifndef FIX_HBR_MASAMETA /* Find maximum band usable at this sample rate */ @@ -358,10 +356,9 @@ void masa_sample_rate_band_correction( if ( highBand >= maxBand ) { config->numCodingBands = band; - hQMetaData->numCodingBands = band; #ifdef FIX_HBR_MASAMETA - if ( !is_encoder ) + if ( is_encoder ) { if ( hQMetaData->q_direction->cfg.nbands > band ) { diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index b1dec1ed42..931f6afec2 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3188,9 +3188,9 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: hQMetaData handle */ uint16_t *bitstream, /* i : bitstream */ int16_t *index, /* i/o: bitstream position */ - SPHERICAL_GRID_DATA *sph_grid16, /* i: spherical grid for deindexing */ - int16_t bits_sph_idx, - int16_t bits_sp_coh + const SPHERICAL_GRID_DATA *sph_grid16, /* i: spherical grid for deindexing */ + const int16_t bits_sph_idx, + const int16_t bits_sp_coh #ifdef FIX_HBR_MASAMETA , uint8_t ncoding_bands_config diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index bd89b36295..801339234d 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -573,7 +573,7 @@ static ivas_error ivas_masa_dec_config( /* Find maximum band usable */ maxBin = (int16_t) ( st_ivas->hDecoderConfig->output_Fs * INV_CLDFB_BANDWIDTH ); maxBand = 0; - while ( MASA_band_grouping_24[maxBand] <= maxBin && maxBand < MASA_FREQUENCY_BANDS ) + while ( MASA_band_grouping_24[maxBand] <= maxBin && maxBand <= MASA_FREQUENCY_BANDS ) { maxBand++; } @@ -582,11 +582,11 @@ static ivas_error ivas_masa_dec_config( if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL ) { /* need to apply the sampling rate correction also for the EXT output MASA meta buffer */ - masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, maxBand, ( 0 || ( st_ivas->hDecoderConfig->ivas_total_brate <= IVAS_256k ) ), hMasa->data.extOutMeta ); + masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, maxBand, 0, hMasa->data.extOutMeta ); } else { - masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, maxBand, ( 0 || ( st_ivas->hDecoderConfig->ivas_total_brate <= IVAS_256k ) ), NULL ); + masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, maxBand, 0, NULL ); } #else if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL ) diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index 21700eb297..82cae53234 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -806,12 +806,12 @@ int16_t ivas_qmetadata_dec_decode( /*! r: number of bits read */ int16_t ivas_qmetadata_dec_decode_hr_384_512( - IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: hQMetaData handle */ - uint16_t *bitstream, /* i : bitstream */ - int16_t *index, /* i/o: bitstream position */ - SPHERICAL_GRID_DATA *sph_grid16, /* i: spherical grid for deindexing */ - int16_t bits_sph_idx, - int16_t bits_sp_coh + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: hQMetaData handle */ + uint16_t *bitstream, /* i : bitstream */ + int16_t *index, /* i/o: bitstream position */ + const SPHERICAL_GRID_DATA *sph_grid16, /* i : spherical grid for deindexing */ + const int16_t bits_sph_idx, + const int16_t bits_sp_coh #ifdef FIX_HBR_MASAMETA , uint8_t ncoding_bands_config @@ -830,6 +830,7 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( int16_t codedBands, sf_nbands0, sf_nbands1; sf_nbands1 = 1; #endif + #ifdef DEBUG_MODE_QMETADATA static FILE *pF = NULL; static FILE *pF_azi = NULL; @@ -857,11 +858,11 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( /* read number of higher inactive/not encoded bands */ if ( bitstream[( *index )--] ) { - codedBands = ncoding_bands_config - ivas_qmetadata_DecodeExtendedGR( bitstream, index, MASA_MAXIMUM_CODING_SUBBANDS, 1 ) - 1; + codedBands = MASA_MAXIMUM_CODING_SUBBANDS - ivas_qmetadata_DecodeExtendedGR( bitstream, index, MASA_MAXIMUM_CODING_SUBBANDS, 1 ) - 1; } else { - codedBands = ncoding_bands_config; + codedBands = MASA_MAXIMUM_CODING_SUBBANDS; } for ( b = codedBands; b < ncoding_bands_config; b++ ) { diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 6bc1388c9c..39f8d32e84 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -655,7 +655,7 @@ ivas_error ivas_masa_enc_config( /* Find maximum band usable */ maxBin = (int16_t) ( st_ivas->hEncoderConfig->input_Fs * INV_CLDFB_BANDWIDTH ); maxBand = 0; - while ( MASA_band_grouping_24[maxBand] <= maxBin && maxBand < MASA_FREQUENCY_BANDS ) + while ( MASA_band_grouping_24[maxBand] <= maxBin && maxBand <= MASA_FREQUENCY_BANDS ) { maxBand++; } @@ -663,12 +663,13 @@ ivas_error ivas_masa_enc_config( if ( ivas_total_brate > IVAS_256k ) { - int16_t continueLoop = 1; + int16_t continueLoop; + continueLoop = 1; while ( maxBand > 5 && continueLoop ) { for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) { - if ( hMasa->data.energy[sf][maxBand] > 100000 ) + if ( hMasa->data.energy[sf][maxBand - 1] > 100000 ) { continueLoop = 0; break; @@ -680,16 +681,17 @@ ivas_error ivas_masa_enc_config( } } - if ( maxBand == MASA_MAXIMUM_CODING_SUBBANDS - 1 ) + if ( maxBand < MASA_MAXIMUM_CODING_SUBBANDS ) { - st_ivas->hQMetaData->q_direction->cfg.inactiveBands = 0; + st_ivas->hQMetaData->q_direction->cfg.inactiveBands = MASA_MAXIMUM_CODING_SUBBANDS - maxBand; } else { - st_ivas->hQMetaData->q_direction->cfg.inactiveBands = hMasa->config.numCodingBands - maxBand; + st_ivas->hQMetaData->q_direction->cfg.inactiveBands = 0; } } - masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, hQMetaData, maxBand, ( ivas_total_brate < IVAS_384k ), NULL ); + + masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, hQMetaData, maxBand, ivas_total_brate > IVAS_256k, NULL ); if ( hMasa->config.numTwoDirBands >= hMasa->config.numCodingBands ) { -- GitLab From 5fc0c4f5db120861cae57338a30d4334e71b43f7 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Fri, 19 May 2023 20:01:56 +0000 Subject: [PATCH 282/331] Fix asan errors. --- lib_dec/ivas_masa_dec.c | 2 +- lib_enc/ivas_masa_enc.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 801339234d..7db5f6523d 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -573,7 +573,7 @@ static ivas_error ivas_masa_dec_config( /* Find maximum band usable */ maxBin = (int16_t) ( st_ivas->hDecoderConfig->output_Fs * INV_CLDFB_BANDWIDTH ); maxBand = 0; - while ( MASA_band_grouping_24[maxBand] <= maxBin && maxBand <= MASA_FREQUENCY_BANDS ) + while ( maxBand <= MASA_FREQUENCY_BANDS && MASA_band_grouping_24[maxBand] <= maxBin ) { maxBand++; } diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 39f8d32e84..67705737a1 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -655,7 +655,7 @@ ivas_error ivas_masa_enc_config( /* Find maximum band usable */ maxBin = (int16_t) ( st_ivas->hEncoderConfig->input_Fs * INV_CLDFB_BANDWIDTH ); maxBand = 0; - while ( MASA_band_grouping_24[maxBand] <= maxBin && maxBand <= MASA_FREQUENCY_BANDS ) + while ( maxBand <= MASA_FREQUENCY_BANDS && MASA_band_grouping_24[maxBand] <= maxBin ) { maxBand++; } -- GitLab From 7401270c13ce1e9b6f19362c62dfac81d53ae5c6 Mon Sep 17 00:00:00 2001 From: rtyag Date: Mon, 22 May 2023 12:04:59 +1000 Subject: [PATCH 283/331] minor fixes in pytest --- tests/test_sba_bs_dec_plc.py | 5 ++--- tests/test_sba_bs_enc.py | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/tests/test_sba_bs_dec_plc.py b/tests/test_sba_bs_dec_plc.py index 9b1a927259..0fa6f55b2d 100644 --- a/tests/test_sba_bs_dec_plc.py +++ b/tests/test_sba_bs_dec_plc.py @@ -46,9 +46,8 @@ tag_list = ['stvFOA'] plc_patterns = ['PLperc12mblen5', 'PLperc40mblen50', 'PLperc42mblen2'] dtx_set = ['0', '1'] ivas_br_list = ['13200','16400','32000', '64000', '96000', '256000'] -ivas_br_list_1 = ['13200','16400','24400','32000', '64000', '96000', '256000'] sampling_rate_list = ['48', '32', '16'] -gain_list = [-1, 0, 1] +gain_list = [0, 1] AbsTol = '0' @@ -69,7 +68,7 @@ def check_and_makedir(dir_path): # -> the reference generation for this test (reference decoder output) needs to be done after completion of test_sba_enc_system # -> therefore the marker create_ref_part2 @pytest.mark.create_ref_part2 -@pytest.mark.parametrize("ivas_br", ivas_br_list_1) +@pytest.mark.parametrize("ivas_br", ivas_br_list) @pytest.mark.parametrize("dtx", dtx_set) @pytest.mark.parametrize("tag", tag_list) @pytest.mark.parametrize("plc_pattern", plc_patterns) diff --git a/tests/test_sba_bs_enc.py b/tests/test_sba_bs_enc.py index c6f769b8f2..b5f5a51f7f 100644 --- a/tests/test_sba_bs_enc.py +++ b/tests/test_sba_bs_enc.py @@ -57,11 +57,10 @@ dict_bw_tag = {'SWB': '_ForceSWB', 'WB': '_ForceWB'} ivas_br_FOA = ['13200','16400','32000','64000', '96000', '160000', '256000', '384000', '512000','sw_24k4_256k.bin'] ivas_br_HOA2 = ['256000', '384000', '512000'] ivas_br_HOA3 = ['256000', '384000', '512000'] -ivas_br_list_1 = ['13200','16400','24400','32000','64000', '96000', '160000', '256000', '384000', '512000','sw_24k4_256k.bin'] sample_rate_list = ['48', '32', '16'] bypass_list = [1, 2] -gain_list = [-1, 0, 1] +gain_list = [0, 1] sample_rate_bw_idx_list = [('48', 'SWB'), ('48', 'WB'), ('32', 'WB')] @@ -148,7 +147,7 @@ def test_bypass_enc( @pytest.mark.create_ref -@pytest.mark.parametrize("ivas_br", ivas_br_list_1) +@pytest.mark.parametrize("ivas_br", ivas_br_FOA) @pytest.mark.parametrize("dtx", dtx_set) @pytest.mark.parametrize("tag", tag_list) @pytest.mark.parametrize("fs", sample_rate_list) -- GitLab From 0f9dcd33d148b54b87e603b9eb8a4185e565bec6 Mon Sep 17 00:00:00 2001 From: rtyag Date: Mon, 22 May 2023 12:59:07 +1000 Subject: [PATCH 284/331] ref file name fixes --- tests/test_sba_bs_dec_plc.py | 2 +- tests/test_sba_bs_enc.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/test_sba_bs_dec_plc.py b/tests/test_sba_bs_dec_plc.py index 0fa6f55b2d..bead7cda93 100644 --- a/tests/test_sba_bs_dec_plc.py +++ b/tests/test_sba_bs_dec_plc.py @@ -143,7 +143,7 @@ def sba_dec_plc( # ------------ run cmd ------------ tag_out = f"{tag}_ivasbr{ivas_br[:-3]}k_DTX{dtx}" - if gain_flag != -1: + if gain_flag == 1: tag_out += f'_Gain{gain_flag}' plc_tag_out = f"{tag_out}_{plc_pattern}" diff --git a/tests/test_sba_bs_enc.py b/tests/test_sba_bs_enc.py index b5f5a51f7f..09baebc9e1 100644 --- a/tests/test_sba_bs_enc.py +++ b/tests/test_sba_bs_enc.py @@ -487,7 +487,7 @@ def sba_enc( if ivas_br == 'sw_24k4_256k.bin': ivas_br = f"{br_switch_file_path}/sw_24k4_256k.bin" short_tag_ext = "" - if gain_flag != -1: + if gain_flag == 1: short_tag_ext += f'_Gain{gain_flag}' if SID == 1: short_tag_ext += f'_SID' @@ -495,7 +495,7 @@ def sba_enc( if bypass in [0, 2]: short_tag_ext += f"_pca{bypass}" # to avoid conflicting names in case of parallel test execution, differentiate all cases - if gain_flag != -1: + if gain_flag == 1: long_tag_ext = f"_Gain{gain_flag}" else: long_tag_ext = f"_pca{bypass}" @@ -607,7 +607,7 @@ def sba_dec( tag_out = f"{tag}_ivasbr{ivas_br[:-3]}k_DTX{dtx}" short_tag_ext = "" - if gain_flag != -1: + if gain_flag == 1: short_tag_ext += f'_Gain{gain_flag}' # we update only bypass = 0/2 (bypass 1 is the same as the baseline) if bypass in [0, 2]: @@ -615,7 +615,7 @@ def sba_dec( if SID == 1: short_tag_ext += f'_SID_cut' # to avoid conflicting names in case of parallel test execution, differentiate all cases - if gain_flag != -1: + if gain_flag == 1: long_tag_ext = f"_Gain{gain_flag}" else: long_tag_ext = f"_pca{bypass}" -- GitLab From 97d501e0ea6dfff39819dae13298c68c02e1475d Mon Sep 17 00:00:00 2001 From: rtyag Date: Mon, 22 May 2023 13:37:15 +1000 Subject: [PATCH 285/331] comment the assert until we have final number for dirac MD limit --- lib_enc/ivas_spar_encoder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index a8132b2a4b..439c8ba1ba 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -1119,7 +1119,7 @@ static ivas_error ivas_spar_enc_process( #ifdef ARITH_HUFF_CODER_CHANGES total_md_bits = hMetaData->nb_bits_tot - start_nb_bits; total_sba_bits = ivas_sba_get_max_md_bits( st_ivas ); - assert( total_md_bits <= total_sba_bits ); + // assert( total_md_bits <= total_sba_bits ); #endif return error; -- GitLab From be6b875f843eb56e39e2f57e3b3b8489939e70b4 Mon Sep 17 00:00:00 2001 From: Vidhya V P <100825@ittiam.com> Date: Mon, 22 May 2023 10:32:03 +0530 Subject: [PATCH 286/331] Removed the switch ARITH_HUFF_CODER_CHANGES_1 [x] Merged it with the switch ARITH_HUFF_CODER_CHANGES --- lib_com/ivas_prot.h | 5 +---- lib_com/ivas_spar_com.c | 15 ++------------- lib_com/options.h | 1 - lib_dec/ivas_spar_md_dec.c | 5 +---- lib_enc/ivas_sba_enc.c | 4 ---- lib_enc/ivas_spar_encoder.c | 5 +---- lib_enc/ivas_spar_md_enc.c | 5 +---- 7 files changed, 6 insertions(+), 34 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 68e8bbc350..ea9d86e25b 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -4521,12 +4521,9 @@ void ivas_spar_set_bitrate_config( ivas_spar_md_com_cfg *pSpar_md_cfg, /* i/o: SPAR MD config. handle */ const int16_t table_idx, /* i : config. table index */ const int16_t num_bands /* i : number of bands */ -#ifdef ARITH_HUFF_CODER_CHANGES_1 - , - const int16_t dirac2spar_md_flag -#endif #ifdef ARITH_HUFF_CODER_CHANGES , + const int16_t dirac2spar_md_flag, const int16_t enc_flag, const int16_t pca_flag, const int16_t agc_flag diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index d87588046f..ec262608a5 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -2136,12 +2136,9 @@ void ivas_spar_set_bitrate_config( ivas_spar_md_com_cfg *pSpar_md_cfg, /* i/o: SPAR MD config. handle */ const int16_t table_idx, /* i : config. table index */ const int16_t num_bands /* i : number of bands */ -#ifdef ARITH_HUFF_CODER_CHANGES_1 - , - const int16_t dirac2spar_md_flag -#endif #ifdef ARITH_HUFF_CODER_CHANGES , + const int16_t dirac2spar_md_flag, const int16_t enc_flag, const int16_t pca_flag, const int16_t agc_flag @@ -2158,8 +2155,6 @@ void ivas_spar_set_bitrate_config( int16_t wc_coarse_strat; int16_t n_input, n_dmx, n_dec; int16_t quant_strat; -#endif -#ifdef ARITH_HUFF_CODER_CHANGES_1 int16_t bands_bw; #endif pSpar_md_cfg->nchan_transport = ivas_spar_br_table_consts[table_idx].nchan_transport; @@ -2205,7 +2200,7 @@ void ivas_spar_set_bitrate_config( pSpar_md_cfg->tgt_bits_per_blk -= md_coding_bits_header; pSpar_md_cfg->max_bits_per_blk -= md_coding_bits_header; -#ifdef ARITH_HUFF_CODER_CHANGES_1 +#ifdef ARITH_HUFF_CODER_CHANGES if ( ivas_total_brate < IVAS_24k4 ) { bands_bw = 2; @@ -2235,12 +2230,8 @@ void ivas_spar_set_bitrate_config( quant_strat = QUANT_STRAT_2; } -#ifdef ARITH_HUFF_CODER_CHANGES_1 num_PR_bits_dirac_bands = ( dirac2spar_md_flag == 1 ) ? num_bands - SPAR_DIRAC_SPLIT_START_BAND : 0; num_PR_bits_dirac_bands /= bands_bw; -#else - num_PR_bits_dirac_bands = num_bands - SPAR_DIRAC_SPLIT_START_BAND; -#endif num_PR_bits_dirac_bands = max( 0, num_PR_bits_dirac_bands ); num_PR_bits_dirac_bands *= DIRAC_TO_SPAR_HBR_PRED_CHS; @@ -2254,9 +2245,7 @@ void ivas_spar_set_bitrate_config( bits_P = (int16_t) ceilf( log2f( ivas_spar_br_table_consts[table_idx].q_lvls[quant_strat][2] ) ) * ( n_dec ); wc_coarse_strat = bits_PR + bits_C + bits_P; wc_coarse_strat *= num_bands; -#ifdef ARITH_HUFF_CODER_CHANGES_1 wc_coarse_strat /= bands_bw; -#endif wc_coarse_strat -= num_PR_bits_dirac_bands; wc_coarse_strat += md_coding_bits_header; diff --git a/lib_com/options.h b/lib_com/options.h index eec4463125..61029e80eb 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -193,7 +193,6 @@ #define LBR_SBA_DIRAC_FIX /* DLB: Bug fix for DirAC at low bitrates */ #define ARITH_HUFF_CODER_CHANGES /* DLB: Optimization of metadata memory for Huffman and arithmetic coders */ -#define ARITH_HUFF_CODER_CHANGES_1 /* DLB: additional changes for Huffman and arithmetic coders*/ #define FIX_445_SNS_BUGFIXES /* FhG: bug fix for spectral tilt in SNS computation + necessary update of codebooks and converison to fixedpoint-compatible tables */ #define FIX_447_PARAMBIN_MASA_REGU_FAC /* Nokia: Issue 447: Fix issue by adjusting regularization factor minimum value. */ #define FIX_441_SBA_PARAMBIN_GAINS /* Nokia: Fix issue 441 by changing gains in SBA path of parametric binauralizer */ diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index 3545a10f19..b1948b6400 100755 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -528,12 +528,9 @@ ivas_error ivas_spar_md_dec_init( hMdDec->spar_md.num_bands = ( hMdDec->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); ivas_spar_set_bitrate_config( &hMdDec->spar_md_cfg, hMdDec->table_idx, hMdDec->spar_md.num_bands -#ifdef ARITH_HUFF_CODER_CHANGES_1 - , - hMdDec->spar_hoa_dirac2spar_md_flag -#endif #ifdef ARITH_HUFF_CODER_CHANGES , + hMdDec->spar_hoa_dirac2spar_md_flag, 0, 0, 0 #endif ); diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index 36c3ceaa1a..f66b8c3d09 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -292,9 +292,6 @@ int16_t ivas_sba_get_max_md_bits( Encoder_Struct *st_ivas ) { int16_t max_md_bits; -#ifndef ARITH_HUFF_CODER_CHANGES_1 - max_md_bits = min( st_ivas->hQMetaData->metadata_max_bits + 1, 500 ); // TODO: remove 500 once max MD bits has been defined at all bitrates in DirAC -#else int16_t max_bits; if ( ivas_get_hodirac_flag( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ) ) { @@ -305,7 +302,6 @@ int16_t ivas_sba_get_max_md_bits( max_bits = 500; } max_md_bits = min( st_ivas->hQMetaData->metadata_max_bits + 1, max_bits ); // TODO: remove 500 once max MD bits has been defined at all bitrates in DirAC -#endif if ( st_ivas->sba_mode == SBA_MODE_SPAR ) { max_md_bits += st_ivas->hSpar->hMdEnc->spar_md_cfg.max_md_bits_spar; diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 439c8ba1ba..0fa22ace29 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -731,12 +731,9 @@ static ivas_error ivas_spar_enc_process( { ivas_spar_set_bitrate_config( &hSpar->hMdEnc->spar_md_cfg, table_idx, ( hSpar->hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND -#ifdef ARITH_HUFF_CODER_CHANGES_1 - , - hSpar->hMdEnc->spar_hoa_dirac2spar_md_flag -#endif #ifdef ARITH_HUFF_CODER_CHANGES , + hSpar->hMdEnc->spar_hoa_dirac2spar_md_flag, 1, hEncoderConfig->Opt_PCA_ON, hSpar->AGC_Enable #endif diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index e371367da3..d7a22af54f 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -342,12 +342,9 @@ ivas_error ivas_spar_md_enc_init( ivas_spar_set_bitrate_config( &hMdEnc->spar_md_cfg, table_idx, ( hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND -#ifdef ARITH_HUFF_CODER_CHANGES_1 - , - hMdEnc->spar_hoa_dirac2spar_md_flag -#endif #ifdef ARITH_HUFF_CODER_CHANGES , + hMdEnc->spar_hoa_dirac2spar_md_flag, 1, hEncoderConfig->Opt_PCA_ON, #ifndef DEBUG_AGC_ENCODER_CMD_OPTION ivas_agc_enc_get_flag( ivas_spar_br_table_consts[table_idx].nchan_transport ) -- GitLab From 4e277b68fb0449c30ef3355439ef149bf5dcced6 Mon Sep 17 00:00:00 2001 From: Vidhya V P <100825@ittiam.com> Date: Mon, 22 May 2023 10:47:34 +0530 Subject: [PATCH 287/331] Resolving build warnings --- lib_enc/ivas_spar_encoder.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 0fa22ace29..d1727cfb97 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -458,7 +458,9 @@ static ivas_error ivas_spar_enc_process( #endif #ifdef ARITH_HUFF_CODER_CHANGES - int16_t start_nb_bits, total_md_bits, total_sba_bits; + int16_t start_nb_bits; + /*Commented for now*/ + //int16_t total_md_bits, total_sba_bits; #endif push_wmops( "ivas_spar_enc_process" ); @@ -1114,9 +1116,10 @@ static ivas_error ivas_spar_enc_process( pop_wmops(); #ifdef ARITH_HUFF_CODER_CHANGES - total_md_bits = hMetaData->nb_bits_tot - start_nb_bits; + /*Commented for now*/ + /*total_md_bits = hMetaData->nb_bits_tot - start_nb_bits; total_sba_bits = ivas_sba_get_max_md_bits( st_ivas ); - // assert( total_md_bits <= total_sba_bits ); + assert( total_md_bits <= total_sba_bits );*/ #endif return error; -- GitLab From 1c185abd23ce528cc8772e3d831f18999cd82e80 Mon Sep 17 00:00:00 2001 From: Simon Plain Date: Mon, 22 May 2023 09:23:58 +0200 Subject: [PATCH 288/331] Add option --- lib_com/options.h | 1 + 1 file changed, 1 insertion(+) diff --git a/lib_com/options.h b/lib_com/options.h index ed7c70ab02..3aa32b9701 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -161,6 +161,7 @@ #define FIX_HBR_MASAMETA /* Nokia: Fixes to HBR MASA metadata at 384 and 512 kbps. Addresses issues 438 and 477 as well. */ #define FIX_482_DUMMYDEC_INIT /* Nokia: fix issue #428: missing inits for dummyDec in IVAS_rend */ +#define FIX_468_16KHZ_PUPMIX /* Dlb: Fix issue 468 for Param Upmix at 16kHz sampling rate */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ -- GitLab From dafc30fe586ae9b31d76230cd7b71e5e701c4399 Mon Sep 17 00:00:00 2001 From: Sumeyra Kanik Date: Mon, 22 May 2023 09:36:24 +0200 Subject: [PATCH 289/331] Clang Format --- lib_com/ivas_stat_com.h | 12 ++++++------ lib_rend/ivas_objectRenderer.c | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index d5d1f27103..b4d0c369b3 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -59,13 +59,13 @@ typedef struct int16_t ism_metadata_flag; /* flag whether metadata are coded in particular frame of particular object */ int16_t last_ism_metadata_flag; /* last frame ism_metadata_flag */ - float azimuth; /* azimuth value read from the input metadata file */ - float elevation; /* elevation value read from the input metadata file */ - float radius; /* radius value read from the input metadata file */ - float yaw; /* yaw value read from the input metadata file */ - float pitch; /* pitch value read from the input metadata file */ + float azimuth; /* azimuth value read from the input metadata file */ + float elevation; /* elevation value read from the input metadata file */ + float radius; /* radius value read from the input metadata file */ + float yaw; /* yaw value read from the input metadata file */ + float pitch; /* pitch value read from the input metadata file */ - int16_t non_diegetic_flag; /* Non-diegetic (non-headtracked) object flag */ + int16_t non_diegetic_flag; /* Non-diegetic (non-headtracked) object flag */ ISM_METADATA_ANGLE position_angle; /* Angle structs for azimuth and elevation */ ISM_METADATA_ANGLE orientation_angle; /* Angle structs for yaw and pitch */ diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 8a09814edf..142d35fec3 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -492,7 +492,7 @@ void TDREND_Update_object_positions( #ifdef JBM_TSM_ON_TCS float *output[] #else - float output[][L_FRAME48k] /* i/o: SCE/MC channels */ + float output[][L_FRAME48k] /* i/o: SCE/MC channels */ #endif #endif ) -- GitLab From ba929d409bf1c4da21f08381c6af8656eaf30bbb Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 22 May 2023 10:00:27 +0200 Subject: [PATCH 290/331] - move IVAS_DEC_EnableVoIP() - print-out VoIP and VS info --- apps/decoder.c | 51 +++++++++++++++++++++++++++++++++++++---------- lib_dec/lib_dec.c | 13 +++++++++++- 2 files changed, 53 insertions(+), 11 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 24a9fc5959..1f36e17f24 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -398,6 +398,31 @@ int main( goto cleanup; } +#ifdef JBM_TSM_ON_TCS + /*------------------------------------------------------------------------------------------* + * Configure VoIP mode + *------------------------------------------------------------------------------------------*/ + + if ( arg.voipMode ) + { + if ( ( error = IVAS_DEC_EnableVoIP( hIvasDec, IVAS_DEC_VOIP_MODE_VOIP, 100, 60, arg.inputFormat ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nCould not enable VOIP: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } +#ifdef VARIABLE_SPEED_DECODING + else if ( arg.variableSpeedMode ) + { + if ( ( error = IVAS_DEC_EnableVoIP( hIvasDec, IVAS_DEC_VOIP_MODE_VARIABLE_SPEED, arg.tsmScale, 60, arg.inputFormat ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nCould not enable Variable Play Speed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } +#endif +#endif + #ifdef DEBUGGING /*-----------------------------------------------------------------* * Preview bitstream and print config information @@ -428,6 +453,20 @@ int main( BS_Reader_Rewind( hBsReader ); IVAS_DEC_PrintConfigWithBitstream( hIvasDec, arg.quietModeEnabled, bit_stream, num_bits ); + +#ifdef VARIABLE_SPEED_DECODING + if ( arg.variableSpeedMode ) + { + if ( arg.tsmScaleFileEnabled ) + { + fprintf( stdout, "Variable speed file: %s\n", arg.tsmScaleFileName ); + } + else + { + fprintf( stdout, "Variable speed factor: %i\n", arg.tsmScale ); + } + } +#endif } /*------------------------------------------------------------------------------------------* @@ -592,30 +631,22 @@ int main( if ( arg.voipMode ) { -#ifdef JBM_TSM_ON_TCS - if ( ( error = IVAS_DEC_EnableVoIP( hIvasDec, IVAS_DEC_VOIP_MODE_VOIP, 100, 60, arg.inputFormat ) ) != IVAS_ERR_OK ) -#else +#ifndef JBM_TSM_ON_TCS #ifdef VARIABLE_SPEED_DECODING if ( ( error = IVAS_DEC_EnableVoIP( hIvasDec, IVAS_DEC_VOIP_MODE_VOIP, 100, 60, arg.inputFormat ) ) != IVAS_ERR_OK ) #else if ( ( error = IVAS_DEC_EnableVoIP( hIvasDec, 60, arg.inputFormat ) ) != IVAS_ERR_OK ) -#endif #endif { fprintf( stderr, "\nCould not enable VOIP: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } - +#endif error = decodeVoIP( arg, hBsReader, hIvasDec ); } #ifdef VARIABLE_SPEED_DECODING else if ( arg.variableSpeedMode ) { - if ( ( error = IVAS_DEC_EnableVoIP( hIvasDec, IVAS_DEC_VOIP_MODE_VARIABLE_SPEED, arg.tsmScale, 60, arg.inputFormat ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nCould not enable Variable Play Speed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); - goto cleanup; - } error = decodeVariableSpeed( arg, hBsReader, headRotReader, refRotReader, referenceVectorReader, hIvasDec ); } #endif diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 337864b553..54a212240c 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -2671,7 +2671,7 @@ static ivas_error printConfigInfo_dec( } /*-----------------------------------------------------------------* - * Print number of output configuration + * Print output configuration *-----------------------------------------------------------------*/ if ( st_ivas->ivas_format == MONO_FORMAT ) @@ -2790,6 +2790,17 @@ static ivas_error printConfigInfo_dec( } } +#ifdef JBM_TSM_ON_TCS + /*-----------------------------------------------------------------* + * Print VoIP mode info + *-----------------------------------------------------------------*/ + + if ( st_ivas->hDecoderConfig->voip_active ) + { + fprintf( stdout, "VoIP mode: ON\n" ); + } +#endif + return IVAS_ERR_OK; } -- GitLab From 130b1ea156e989c49369dfc49361be84e72bb7c9 Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 22 May 2023 10:11:06 +0200 Subject: [PATCH 291/331] put variable speed decoding under DEBUGGING --- apps/decoder.c | 33 +++++++++++++++++++++------------ readme.txt | 2 -- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 1f36e17f24..bf69c8a2da 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -127,8 +127,6 @@ typedef struct #ifdef DEBUG_FOA_AGC FILE *agcBitstream; /* temporary */ #endif - -#endif #ifdef DEBUG_JBM_CMD_OPTION bool noBadFrameDelay; #endif @@ -143,6 +141,7 @@ typedef struct uint16_t frontendFetchSizeMs; #endif #endif +#endif } DecArguments; @@ -155,10 +154,10 @@ static bool parseCmdlIVAS_dec( int16_t argc, char **argv, DecArguments *arg ); static void usage_dec( void ); static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, HeadRotFileReader *headRotReader, HeadRotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); static ivas_error decodeVoIP( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HANDLE hIvasDec ); +#ifdef DEBUGGING #ifdef VARIABLE_SPEED_DECODING static ivas_error decodeVariableSpeed( DecArguments arg, BS_READER_HANDLE hBsReader, HeadRotFileReader *headRotReader, HeadRotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, IVAS_DEC_HANDLE hIvasDec ); #endif -#ifdef DEBUGGING static ivas_error printBitstreamInfoVoip( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HANDLE hIvasDec ); static int16_t app_own_random( int16_t *seed ); static IVAS_DEC_FORCED_REND_MODE parseForcedRendModeDec( char *forcedRendModeChar ); @@ -412,6 +411,7 @@ int main( } } #ifdef VARIABLE_SPEED_DECODING +#ifdef DEBUGGING else if ( arg.variableSpeedMode ) { if ( ( error = IVAS_DEC_EnableVoIP( hIvasDec, IVAS_DEC_VOIP_MODE_VARIABLE_SPEED, arg.tsmScale, 60, arg.inputFormat ) ) != IVAS_ERR_OK ) @@ -422,6 +422,7 @@ int main( } #endif #endif +#endif #ifdef DEBUGGING /*-----------------------------------------------------------------* @@ -455,6 +456,7 @@ int main( IVAS_DEC_PrintConfigWithBitstream( hIvasDec, arg.quietModeEnabled, bit_stream, num_bits ); #ifdef VARIABLE_SPEED_DECODING +#ifdef DEBUGGING if ( arg.variableSpeedMode ) { if ( arg.tsmScaleFileEnabled ) @@ -466,6 +468,7 @@ int main( fprintf( stdout, "Variable speed factor: %i\n", arg.tsmScale ); } } +#endif #endif } @@ -645,10 +648,12 @@ int main( error = decodeVoIP( arg, hBsReader, hIvasDec ); } #ifdef VARIABLE_SPEED_DECODING +#ifdef DEBUGGING else if ( arg.variableSpeedMode ) { error = decodeVariableSpeed( arg, hBsReader, headRotReader, refRotReader, referenceVectorReader, hIvasDec ); } +#endif #endif else { @@ -876,6 +881,8 @@ static bool parseCmdlIVAS_dec( arg->inputFormat = IVAS_DEC_INPUT_FORMAT_G192; arg->Opt_non_diegetic_pan = 0; arg->non_diegetic_pan_gain = 0.f; + +#ifdef DEBUGGING #ifdef VARIABLE_SPEED_DECODING arg->variableSpeedMode = false; arg->tsmScale = 100; @@ -889,6 +896,7 @@ static bool parseCmdlIVAS_dec( #endif #ifdef DEBUG_JBM_CMD_OPTION arg->noBadFrameDelay = false; +#endif #endif /*-----------------------------------------------------------------* @@ -1015,7 +1023,6 @@ static bool parseCmdlIVAS_dec( } #endif /* #ifdef DEBUG_MODE_INFO_TWEAK */ #endif /* #ifdef DEBUG_MODE_INFO */ -#endif /* #ifdef DEBUGGING */ #ifdef DEBUG_JBM_CMD_OPTION else if ( strcmp( argv_to_upper, "-VOIP_NO_BAD_FRAME" ) == 0 ) { @@ -1072,6 +1079,7 @@ static bool parseCmdlIVAS_dec( } #endif #endif +#endif /* #ifdef DEBUGGING */ else if ( strcmp( argv_to_upper, "-MIME" ) == 0 ) { @@ -1348,6 +1356,13 @@ static void usage_dec( void ) #ifdef DEBUG_JBM_CMD_OPTION fprintf( stdout, "-VOIP_no_bad_frame : VoIP mode: do not put out bad frames in the beginning as silence \n" ); #endif + fprintf( stdout, " The decoder may read rtpdump files containing TS26.445 Annex A.2.2\n" ); + fprintf( stdout, " EVS RTP Payload Format. The SDP parameter hf_only is required.\n" ); + fprintf( stdout, " Reading RFC4867 AMR/AMR-WB RTP payload format is not supported.\n" ); +#ifdef SUPPORT_JBM_TRACEFILE + fprintf( stdout, "-Tracefile TF : VoIP mode: Generate trace file named TF\n" ); +#endif +#ifdef DEBUGGING #ifdef VARIABLE_SPEED_DECODING fprintf( stdout, "-VS fac : Variable Speed mode: change speed of playout fac as integer in percent. fac<100 faster, fac>100 slower\n" ); #endif @@ -1355,13 +1370,7 @@ static void usage_dec( void ) #ifdef DEBUG_JBM_CMD_OPTION fprintf( stdout, "-VOIP_framesize : VoIP mode: acoustic frontend fetch frame size (must be multiples of 5!)\n" ); #endif - #endif - fprintf( stdout, " The decoder may read rtpdump files containing TS26.445 Annex A.2.2\n" ); - fprintf( stdout, " EVS RTP Payload Format. The SDP parameter hf_only is required.\n" ); - fprintf( stdout, " Reading RFC4867 AMR/AMR-WB RTP payload format is not supported.\n" ); -#ifdef SUPPORT_JBM_TRACEFILE - fprintf( stdout, "-Tracefile TF : VoIP mode: Generate trace file named TF\n" ); #endif fprintf( stdout, "-fec_cfg_file : Optimal channel aware configuration computed by the JBM \n" ); fprintf( stdout, " as described in Section 6.3.1 of TS26.448. The output is \n" ); @@ -2474,6 +2483,7 @@ cleanup: } +#ifdef DEBUGGING #ifdef VARIABLE_SPEED_DECODING /*---------------------------------------------------------------------* * decodeVariableSpeed() @@ -3005,10 +3015,9 @@ cleanup: return error; } - #endif -#ifdef DEBUGGING + /*---------------------------------------------------------------------* * parseForcedRendModeDec() * diff --git a/readme.txt b/readme.txt index 45cde4e9d0..21a5a19e79 100644 --- a/readme.txt +++ b/readme.txt @@ -245,8 +245,6 @@ Options: The decoder may read rtpdump files containing TS26.445 Annex A.2.2 EVS RTP Payload Format. The SDP parameter hf_only is required. Reading RFC4867 AMR/AMR-WB RTP payload format is not supported. --VS fac : Variable Speed mode: change speed of playout fac as integer in percent. - fac<100 faster, fac>100 slower -Tracefile TF : VoIP mode: Generate trace file named TF -fec_cfg_file : Optimal channel aware configuration computed by the JBM as described in Section 6.3.1 of TS26.448. The output is -- GitLab From 6c90257eb62cc177694048fef5fb631702947279 Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 22 May 2023 10:19:38 +0200 Subject: [PATCH 292/331] sanity check for scaling factor limitation --- apps/decoder.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index bf69c8a2da..72f30f6fed 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -1031,7 +1031,6 @@ static bool parseCmdlIVAS_dec( } #endif #ifdef VARIABLE_SPEED_DECODING - else if ( strcmp( argv_to_upper, "-VS" ) == 0 ) { i++; @@ -1045,7 +1044,6 @@ static bool parseCmdlIVAS_dec( arg->tsmScaleFileName = argv[i]; i++; } - else { if ( ( sscanf( argv[i], "%d", &tmp ) > 0 ) ) @@ -1054,6 +1052,13 @@ static bool parseCmdlIVAS_dec( } } arg->tsmScale = (uint16_t) tmp; + + if ( arg->tsmScale < 50 || arg->tsmScale > 150 ) + { + fprintf( stderr, "Error: Scaling factor value must be 50 <= fac <= 150!\n\n" ); + usage_dec(); + return false; + } } } #endif @@ -1364,7 +1369,8 @@ static void usage_dec( void ) #endif #ifdef DEBUGGING #ifdef VARIABLE_SPEED_DECODING - fprintf( stdout, "-VS fac : Variable Speed mode: change speed of playout fac as integer in percent. fac<100 faster, fac>100 slower\n" ); + fprintf( stdout, "-VS fac : Variable Speed mode: change speed of playout fac as integer in percent.\n" ); + fprintf( stdout, " 50 <= fac <= 150; fac<100 faster, fac>100 slower\n" ); #endif #ifdef JBM_TSM_ON_TCS #ifdef DEBUG_JBM_CMD_OPTION -- GitLab From 48dd19d5a7af3db3d3b0da49678fef123076aaee Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 22 May 2023 10:32:57 +0200 Subject: [PATCH 293/331] clang-format --- lib_dec/ivas_dirac_dec.c | 22 ++++++++++---------- lib_dec/ivas_spar_decoder.c | 10 ++++----- lib_rend/ivas_dirac_dec_binaural_functions.c | 21 +++++-------------- 3 files changed, 21 insertions(+), 32 deletions(-) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 501d8dc442..2ef3a1056b 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -420,12 +420,12 @@ ivas_error ivas_dirac_dec_config( { return error; } - } + } else if ( st_ivas->hDecoderConfig->ivas_total_brate <= IVAS_256k && hDirAC->azimuth2 != NULL ) { ivas_dirac_deallocate_parameters( hDirAC, 2 ); - } } + } /* band config needed only for SPAR with FOA output */ if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_FOA && st_ivas->sba_mode == SBA_MODE_SPAR && !hodirac_flag ) @@ -707,9 +707,9 @@ ivas_error ivas_dirac_dec_config( { hDirAC->proto_index_dir[hDirAC->sba_map_tc[k]] = k; } - } } } + } /* direct/diffuse responses */ if ( flag_config == DIRAC_OPEN ) @@ -1079,7 +1079,7 @@ ivas_error ivas_dirac_dec_config( { return error; } - } + } else { hDirAC->azimuth2 = NULL; @@ -1102,7 +1102,7 @@ ivas_error ivas_dirac_dec_config( if ( ( hDirAC->hConfig->dec_param_estim_old != hDirAC->hConfig->dec_param_estim ) ) { ivas_dirac_deallocate_parameters( hDirAC, 1 ); - } + } hDirAC->dirac_md_buffer_length = ( MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_DIRAC_PARAM_DEC_SFR ) * num_slots_in_subfr; hDirAC->dirac_bs_md_write_idx = DELAY_DIRAC_PARAM_DEC_SFR * num_slots_in_subfr; hDirAC->spar_to_dirac_write_idx = DELAY_DIRAC_PARAM_DEC_SFR * num_slots_in_subfr; @@ -1113,8 +1113,8 @@ ivas_error ivas_dirac_dec_config( { return error; } - } - } + } + } #ifdef JBM_TSM_ON_TCS /* allocate transport channels*/ @@ -1715,8 +1715,8 @@ void ivas_dirac_dec_read_BS( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata */ int16_t *nb_bits, /* o : number of bits read */ const SBA_MODE sba_mode, /* i : SBA mode */ - const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ - int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ + const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ + int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ) { int16_t i, j, b, dir, orig_dirac_bands; @@ -1899,8 +1899,8 @@ void ivas_qmetadata_to_dirac( MASA_DECODER_HANDLE hMasa, /* i : MASA decoder structure */ const int32_t ivas_total_brate, /* i : IVAS total bitrate */ const SBA_MODE sba_mode, /* i : SBA mode */ - const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ - int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ + const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ + int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ) { int16_t block, band; diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index a99cdba7ff..7609099b5f 100755 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -972,8 +972,8 @@ static void ivas_spar_get_skip_mat( } } } - } - } + } + } return; } @@ -1331,7 +1331,7 @@ void ivas_spar_dec_upmixer( mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], st_ivas->hTcBuffer->tc[nchan_internal - 1 - i], output_frame ); } } - } + } ivas_spar_dec_set_render_params( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS ); @@ -1561,7 +1561,7 @@ void ivas_spar_dec_upmixer( mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], output[nchan_internal - 1 - i], output_frame ); } } - } + } #endif hSpar->hFbMixer->fb_cfg->num_in_chans = num_in_ingest; @@ -1720,7 +1720,7 @@ void ivas_spar_dec_upmixer( out_im[out_ch] += cldfb_in_ts_im[in_ch][ts][cldfb_band] * cldfb_par; } } - } + } /*update CLDFB data with the parameter-modified data*/ for ( out_ch = 0; out_ch < numch_out; out_ch++ ) diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index ae338277af..525935ffbf 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -52,7 +52,7 @@ * Local constants *------------------------------------------------------------------------*/ -#define CLDFB_HALF_BIN_FREQUENCY_OFFSET 0.5f +#define CLDFB_HALF_BIN_FREQUENCY_OFFSET 0.5f #define IVAS_TDET_DUCK_MULT_FAC_PARA_BIN ( 2.0f ) #define IVAS_TDET_DUCK_MULT_FAC_PARA_BIN_LOW_BR ( 3.0f ) @@ -93,7 +93,6 @@ static void adaptTransportSignalsHeadtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackD static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, float Rmat[3][3] ); #endif - static void formulate2x2MixingMatrix( float Ein1, float Ein2, float CinRe, float CinIm, float Eout1, float Eout2, float CoutRe, float CoutIm, float Q[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Mre[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Mim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], const float regularizationFactor ); static void hrtfShGetHrtf( const int16_t bin, const int16_t aziDeg, const int16_t eleDeg, float *lRealp, float *lImagp, float *rRealp, float *rImagp ); @@ -105,10 +104,6 @@ static void matrixMul( float Are[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Ai static void matrixTransp2Mul( float Are[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Aim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Bre[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Bim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float outRe[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float outIm[BINAURAL_CHANNELS][BINAURAL_CHANNELS] ); -#ifdef JBM_TSM_ON_TCS -#endif - - /*------------------------------------------------------------------------- * ivas_dirac_dec_init_binaural_data() * @@ -213,7 +208,7 @@ ivas_error ivas_dirac_dec_init_binaural_data( return error; } } - } + } else if ( renderer_type == RENDERER_STEREO_PARAMETRIC ) { set_f( hBinaural->earlyPartEneCorrection, 1.0f, CLDFB_NO_CHANNELS_MAX ); @@ -442,7 +437,6 @@ void ivas_dirac_dec_binaural( { ivas_spar_dec_set_render_map( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS ); } - #endif if ( st_ivas->hDiracDecBin->useTdDecorr ) @@ -510,8 +504,7 @@ void ivas_dirac_dec_binaural( /*------------------------------------------------------------------------- * Local functions *------------------------------------------------------------------------*/ -#ifdef JBM_TSM_ON_TCS -#endif + static void ivas_dirac_dec_binaural_internal( Decoder_Struct *st_ivas, @@ -1374,8 +1367,6 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices( return; } -#ifdef JBM_TSM_ON_TCS -#endif static void ivas_dirac_dec_binaural_process_output( Decoder_Struct *st_ivas, @@ -1511,8 +1502,6 @@ static void ivas_dirac_dec_binaural_process_output( return; } -#ifdef JBM_TSM_ON_TCS -#endif static void adaptTransportSignalsHeadtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackData, @@ -2200,8 +2189,8 @@ static void hrtfShGetHrtf( /*! r: Configured reqularization factor value */ float configure_reqularization_factor( - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const int32_t ivas_total_brate /* i : IVAS total bitrate */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ ) { float reqularizationFactor; -- GitLab From 15941b5ce80cbd1f50ebc89defd01ddaa510ddbb Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 22 May 2023 10:42:37 +0200 Subject: [PATCH 294/331] fix compilation when DEBUGGING is deactivated --- lib_com/ivas_dirac_com.c | 7 ----- lib_com/ivas_prot.h | 56 +++++++++++++++++++--------------------- lib_enc/ivas_dirac_enc.c | 6 +++-- 3 files changed, 31 insertions(+), 38 deletions(-) diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index 7d11a0427d..d876c557ba 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -949,7 +949,6 @@ void deindex_spherical_component( void calculate_hodirac_sector_parameters( float RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : signal vector (L+1)^2 x N_bins, real part */ float ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : signal vector, imaginary part */ - const int16_t N_bins, /* i : number of bins */ const float beta, /* i : forgetting factor for average filtering */ const int16_t *band_grouping, /* i : indices of band groups */ const int16_t N_bands, /* i : number of bands (groups) */ @@ -961,9 +960,7 @@ void calculate_hodirac_sector_parameters( ) { int16_t i_sec, i_bin, i_band; - float p_real, p_imag, normI, energy, tmp_diff; - float sec_I_vec_x[NUM_ANA_SECTORS]; float sec_I_vec_y[NUM_ANA_SECTORS]; float sec_I_vec_z[NUM_ANA_SECTORS]; @@ -978,10 +975,6 @@ void calculate_hodirac_sector_parameters( static float azi_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS]; static float ele_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS]; -#ifdef DEBUGGING - assert( N_bins <= DIRAC_NO_FB_BANDS_MAX ); -#endif - for ( i_sec = 0; i_sec < NUM_ANA_SECTORS; i_sec++ ) { diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 9d8f3d0ae9..e7a723b607 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3894,9 +3894,8 @@ void ivas_dirac_dec_compute_directional_responses( const int16_t md_idx, #endif const float *surCohRatio, - const int16_t shd_rot_max_order, /* i : split-order rotation method */ - const float *p_Rmat /* i : rotation matrix */ - , + const int16_t shd_rot_max_order, /* i : split-order rotation method */ + const float *p_Rmat, /* i : rotation matrix */ const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ); @@ -3906,38 +3905,37 @@ void ivas_dirac_dec_get_frequency_axis( const int16_t num_freq_bands ); /* i : number of frequency bands */ void calculate_hodirac_sector_parameters( - float RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : signal vector (L+1)^2 x N_bins, real part */ - float ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : signal vector, imaginary part */ - const int16_t N_bins, /* i : number of bins */ - const float beta, /* i : forgetting factor for average filtering */ - const int16_t *band_grouping, /* i : indices of band groups */ - const int16_t N_bands, /* i : number of bands (groups) */ - const int16_t enc_param_start_band, /* i : first band to process */ - float *azi, /* o : array of sector azimuth angles, flat */ - float *ele, /* o : array of sector elevation angles, flat */ - float *diff, /* o : array of sector diffuseness values, flat */ - float *ene /* o : array of sector energy values, flat */ + float RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX],/* i : signal vector (L+1)^2 x N_bins, real part */ + float ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX],/* i : signal vector, imaginary part */ + const float beta, /* i : forgetting factor for average filtering */ + const int16_t *band_grouping, /* i : indices of band groups */ + const int16_t N_bands, /* i : number of bands (groups) */ + const int16_t enc_param_start_band, /* i : first band to process */ + float *azi, /* o : array of sector azimuth angles, flat */ + float *ele, /* o : array of sector elevation angles, flat */ + float *diff, /* o : array of sector diffuseness values, flat */ + float *ene /* o : array of sector energy values, flat */ ); void ivas_mc_paramupmix_enc( - Encoder_Struct *st_ivas, /* i/o: IVAS Encoder handle */ - BSTR_ENC_HANDLE hMetaData, /* i/o: IVAS Metadata bitstream handle */ - float data_f[][L_FRAME48k], /* i/o: input: CICP6, CICP12, CICP14, CICP16 or CICP19 MC data */ - const int16_t input_frame /* i : input frame length */ + Encoder_Struct *st_ivas, /* i/o: IVAS Encoder handle */ + BSTR_ENC_HANDLE hMetaData, /* i/o: IVAS Metadata bitstream handle */ + float data_f[][L_FRAME48k], /* i/o: input: CICP6, CICP12, CICP14, CICP16 or CICP19 MC data */ + const int16_t input_frame /* i : input frame length */ ); ivas_error ivas_mc_paramupmix_enc_open( - Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ ); void ivas_mc_paramupmix_enc_close( - MC_PARAMUPMIX_ENC_HANDLE *hMCParamUpmix, /* i/o: MC Param-Upmix encoder handle */ + MC_PARAMUPMIX_ENC_HANDLE *hMCParamUpmix, /* i/o: MC Param-Upmix encoder handle */ const int32_t sampling_rate ); void ivas_mc_paramupmix_dec( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */ ); int16_t ivas_mc_paramupmix_getNumTransportChannels( @@ -3945,19 +3943,19 @@ int16_t ivas_mc_paramupmix_getNumTransportChannels( ); ivas_error ivas_mc_paramupmix_dec_open( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); void ivas_mc_paramupmix_dec_close( - MC_PARAMUPMIX_DEC_HANDLE *hMCParamUpmix_out /* i/o: Parametric MC decoder handle */ + MC_PARAMUPMIX_DEC_HANDLE *hMCParamUpmix_out /* i/o: Parametric MC decoder handle */ ); void ivas_mc_paramupmix_dec_read_BS( - const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - Decoder_State *st, /* i/o: decoder state structure */ - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, /* i/o: decoder MC Param-Upmix handle */ - int16_t *nb_bits /* o : number of bits written */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + Decoder_State *st, /* i/o: decoder state structure */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, /* i/o: decoder MC Param-Upmix handle */ + int16_t *nb_bits /* o : number of bits written */ ); void ivas_param_mc_metadata_open( diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index efeb322d85..c38f44a826 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -760,8 +760,10 @@ void ivas_dirac_param_est_enc( if ( hodirac_flag ) { - - calculate_hodirac_sector_parameters( Cldfb_RealBuffer, Cldfb_ImagBuffer, l_ts, 0.20f, hDirAC->band_grouping, hDirAC->hConfig->nbands, hDirAC->hConfig->enc_param_start_band, azi_secs, ele_secs, diff_secs, ene_secs ); +#ifdef DEBUGGING + assert( l_ts <= DIRAC_NO_FB_BANDS_MAX ); +#endif + calculate_hodirac_sector_parameters( Cldfb_RealBuffer, Cldfb_ImagBuffer, 0.20f, hDirAC->band_grouping, hDirAC->hConfig->nbands, hDirAC->hConfig->enc_param_start_band, azi_secs, ele_secs, diff_secs, ene_secs ); } if ( hodirac_flag ) -- GitLab From 4b81b9ee8703d16eca7f70687f623783df1e26b0 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Mon, 22 May 2023 11:13:18 +0200 Subject: [PATCH 295/331] Unify error-to-string functions --- lib_com/ivas_error.h | 66 ++++++++++++++++++++++++++++++++++++++++---- lib_dec/lib_dec.c | 50 +-------------------------------- lib_enc/lib_enc.c | 66 +------------------------------------------- 3 files changed, 63 insertions(+), 119 deletions(-) diff --git a/lib_com/ivas_error.h b/lib_com/ivas_error.h index ce51109207..b50d8a679c 100644 --- a/lib_com/ivas_error.h +++ b/lib_com/ivas_error.h @@ -56,7 +56,7 @@ typedef enum IVAS_ERR_INVALID_SAMPLING_RATE, IVAS_ERR_NOT_CONFIGURED, IVAS_ERR_INVALID_STEREO_MODE, - IVAS_ERR_INVALID_CICP_INDEX, + IVAS_ERR_INVALID_CICP_INDEX, /* ToDo: rename, CICP not used in IVAS anymore */ IVAS_ERR_INVALID_BITRATE, IVAS_ERR_INVALID_MASA_CONFIG, IVAS_ERR_TOO_MANY_INPUTS, @@ -72,17 +72,15 @@ typedef enum IVAS_ERR_INVALID_SPAR_CONFIG, IVAS_ERR_WRONG_PARAMS, IVAS_ERR_INIT_ERROR, - IVAS_ERR_DECODER_ERROR, IVAS_ERR_WRONG_MODE, IVAS_ERR_INVALID_OUTPUT_FORMAT, IVAS_ERR_HEAD_ROTATION_NOT_SUPPORTED, IVAS_ERR_INVALID_HRTF, IVAS_ERR_INVALID_INPUT_FORMAT, - IVAS_ERR_INVALID_INDEX, + IVAS_ERR_INVALID_INDEX, /* ToDo: should be merged with IVAS_ERR_INDEX_OUT_OF_BOUNDS */ IVAS_ERR_NOT_SUPPORTED_OPTION, IVAS_ERR_NOT_IMPLEMENTED, IVAS_ERR_WAITING_FOR_BITSTREAM, - IVAS_ERR_FILE_READER_TIMESTAMP_MISMATCH, IVAS_ERR_ISM_FILE_READER_INVALID_METADATA_FORMAT, IVAS_ERR_ISM_INVALID_METADATA_VALUE, IVAS_ERR_INVALID_MASA_FORMAT_METADATA_FILE, @@ -131,7 +129,7 @@ typedef enum * renderer (lib_rend only) * *----------------------------------------*/ - IVAS_ERR_NUM_CHANNELS_UNKNOWN, + IVAS_ERR_NUM_CHANNELS_UNKNOWN = 0x6000, IVAS_ERR_INVALID_CUSTOM_LS_LAYOUT, IVAS_ERR_INVALID_INPUT_ID, IVAS_ERR_WRONG_NUM_CHANNELS, @@ -182,6 +180,64 @@ static inline const char *ivas_error_to_string( ivas_error error_code ) return "Parse error"; case IVAS_ERR_END_OF_FILE: return "End of file"; + case IVAS_ERR_WRONG_PARAMS: + return "Wrong function parameters"; + case IVAS_ERR_INVALID_BANDWIDTH: + return "Invalid bandwidth"; + case IVAS_ERR_INVALID_DTX_UPDATE_RATE: + return "Invalid DTX update rate"; + case IVAS_ERR_NOT_CONFIGURED: + return "Handle has not been configured"; + case IVAS_ERR_INVALID_STEREO_MODE: + return "Invalid stereo mode"; + case IVAS_ERR_INVALID_CICP_INDEX: + return "Invalid speaker layout"; + case IVAS_ERR_INVALID_BITRATE: + return "Invalid bitrate"; + case IVAS_ERR_INVALID_MASA_CONFIG: + return "Invalid MASA config"; + case IVAS_ERR_TOO_MANY_INPUTS: + return "Too many object inputs provided"; + case IVAS_ERR_INDEX_OUT_OF_BOUNDS: + return "Index out of bounds"; + case IVAS_ERR_RECONFIGURE_NOT_SUPPORTED: + return "Reconfigure not supported"; + case IVAS_ERR_INVALID_FEC_OFFSET: + return "Invalid FEC offset"; + case IVAS_ERR_INVALID_INPUT_BUFFER_SIZE: + return "Invalid input buffer size"; + case IVAS_ERR_DTX_NOT_SUPPORTED: + return "DTX is not supported in this IVAS format and element mode"; + case IVAS_ERR_UNEXPECTED_NULL_POINTER: + return "Unexpected NULL pointer"; + case IVAS_ERR_METADATA_NOT_EXPECTED: + return "Metadata input not expected for current configuration"; +#ifdef DEBUGGING + case IVAS_ERR_INVALID_FORCE_MODE: + return "Invalid force mode"; +#endif + case IVAS_ERR_NOT_IMPLEMENTED: + return "Not implemented"; + case IVAS_ERR_ISM_FILE_READER_INVALID_METADATA_FORMAT: + return "Invalid metadata file format"; + case IVAS_ERR_ISM_INVALID_METADATA_VALUE: + return "Invalid metadata value provided"; + case IVAS_ERR_NOT_SUPPORTED_OPTION: + return "Option not supported in this set-up"; + case IVAS_ERR_INIT_ERROR: + return "Initialization error"; + case IVAS_ERR_INVALID_BITSTREAM: + return "Invalid bitstream"; + case IVAS_ERR_WRONG_MODE: + return "Wrong mode"; + case IVAS_ERR_HEAD_ROTATION_NOT_SUPPORTED: + return "Head rotation not supported"; + case IVAS_ERR_INVALID_HRTF: + return "Unsupported HRTF filter set"; + case IVAS_ERR_INVALID_INPUT_FORMAT: + return "Invalid format of input bitstream"; + case IVAS_ERR_INVALID_INDEX: + return "Invalid index"; default: break; } diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 996e2afc19..5c75fdec01 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -2468,55 +2468,7 @@ const char *IVAS_DEC_GetErrorMessage( ivas_error error /* i : decoder error code enum */ ) { - switch ( error ) - { - case IVAS_ERR_OK: - return "no error"; - case IVAS_ERR_FAILED_ALLOC: - return "Failed allocation error"; - case IVAS_ERR_WRONG_PARAMS: - return "wrong parameters"; - case IVAS_ERR_INIT_ERROR: - return "initialization error"; - case IVAS_ERR_INVALID_BITSTREAM: - return "Invalid bitstream"; - case IVAS_ERR_DECODER_ERROR: - return "decoder error"; - case IVAS_ERR_WRONG_MODE: - return "wrong mode"; - case IVAS_ERR_INVALID_OUTPUT_FORMAT: - return "invalid output format"; - case IVAS_ERR_INVALID_SAMPLING_RATE: - return "invalid sampling rate"; - case IVAS_ERR_HEAD_ROTATION_NOT_SUPPORTED: - return "head rotation not supported"; - case IVAS_ERR_INVALID_HRTF: - return "Not supported HRTF filter set"; - case IVAS_ERR_INVALID_INPUT_FORMAT: - return "invalid format of input bitstream"; - case IVAS_ERR_INVALID_INDEX: - return "invalid index"; - case IVAS_ERR_INTERNAL: - case IVAS_ERR_INTERNAL_FATAL: - return "internal error"; - case IVAS_ERR_RECONFIGURE_NOT_SUPPORTED: - return "reconfigure not supported"; - case IVAS_ERR_UNEXPECTED_NULL_POINTER: - return "unexpected NULL pointer"; -#ifdef DEBUGGING - case IVAS_ERR_INVALID_FORCE_MODE: - return "invalid force mode"; -#endif - case IVAS_ERR_FAILED_FILE_READ: - return "could not read from file"; - case IVAS_ERR_NOT_IMPLEMENTED: - return "not implemented"; - case IVAS_ERR_UNKNOWN: - default: - break; - } - - return "unknown error"; + return ivas_error_to_string( error ); } diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 240cbb0e5a..2e56f384ec 100755 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -1480,71 +1480,7 @@ const char *IVAS_ENC_GetErrorMessage( ivas_error error /* i : encoder error code enum */ ) { - switch ( error ) - { - case IVAS_ERR_OK: - return "no error"; - case IVAS_ERR_FAILED_ALLOC: - return "Failed allocation error"; - case IVAS_ERR_WRONG_PARAMS: - return "wrong parameters"; - case IVAS_ERR_INVALID_BANDWIDTH: - return "invalid bandwidth"; - case IVAS_ERR_INVALID_DTX_UPDATE_RATE: - return "invalid DTX update rate"; - case IVAS_ERR_INVALID_SAMPLING_RATE: - return "invalid sampling rate"; - case IVAS_ERR_NOT_CONFIGURED: - return "encoder has not been configured"; - case IVAS_ERR_INVALID_STEREO_MODE: - return "invalid stereo mode"; - case IVAS_ERR_INVALID_CICP_INDEX: - return "invalid CICP index"; - case IVAS_ERR_INVALID_BITRATE: - return "invalid bitrate"; - case IVAS_ERR_INVALID_MASA_CONFIG: - return "invalid MASA config"; - case IVAS_ERR_TOO_MANY_INPUTS: - return "too many object inputs provided"; - case IVAS_ERR_INDEX_OUT_OF_BOUNDS: - return "index out of bounds"; - case IVAS_ERR_INTERNAL: - case IVAS_ERR_INTERNAL_FATAL: - return "internal error"; - case IVAS_ERR_RECONFIGURE_NOT_SUPPORTED: - return "reconfigure not supported"; - case IVAS_ERR_INVALID_FEC_OFFSET: - return "invalid FEC offset"; - case IVAS_ERR_INVALID_INPUT_BUFFER_SIZE: - return "invalid input buffer size"; - case IVAS_ERR_DTX_NOT_SUPPORTED: - return "DTX is not supported in this IVAS format and element mode"; - case IVAS_ERR_UNEXPECTED_NULL_POINTER: - return "unexpected NULL pointer"; - case IVAS_ERR_METADATA_NOT_EXPECTED: - return "metadata input not expected for current configuration"; -#ifdef DEBUGGING - case IVAS_ERR_INVALID_FORCE_MODE: - return "invalid force mode"; -#endif - case IVAS_ERR_NOT_IMPLEMENTED: - return "not implemented"; - case IVAS_ERR_FILE_READER_TIMESTAMP_MISMATCH: - return "mismatched timestamp"; - case IVAS_ERR_ISM_FILE_READER_INVALID_METADATA_FORMAT: - return "invalid metadata format"; - case IVAS_ERR_ISM_INVALID_METADATA_VALUE: - return "invalid metadata value provided"; - case IVAS_ERR_FAILED_FILE_READ: - return "could not read from file"; - case IVAS_ERR_NOT_SUPPORTED_OPTION: - return "option not supported in this set-up"; - case IVAS_ERR_UNKNOWN: - default: - break; - } - - return "unknown error"; + return ivas_error_to_string( error ); } -- GitLab From 54ec1fe8a2154b3b500df53054b196b969fb24fa Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 22 May 2023 11:43:02 +0200 Subject: [PATCH 296/331] - more code under DEBUGGING - change "uint8_t mode" to "IVAS_DEC_VOIP_MODE voipMode" --- apps/decoder.c | 5 ++++- lib_com/ivas_error.h | 6 +++--- lib_com/options.h | 2 +- lib_dec/lib_dec.c | 30 +++++++++++++++++------------- lib_dec/lib_dec.h | 2 ++ 5 files changed, 27 insertions(+), 18 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 72f30f6fed..e35f1a9def 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -2598,6 +2598,7 @@ static ivas_error decodeVariableSpeed( goto cleanup; } } + /* Reference rotation */ if ( arg.enableReferenceRotation ) { @@ -2614,6 +2615,7 @@ static ivas_error decodeVariableSpeed( goto cleanup; } } + /* Head-tracking input simulation */ if ( arg.enableHeadRotation ) { @@ -2644,12 +2646,13 @@ static ivas_error decodeVariableSpeed( writeJbmTraceFileFrameWrapper, jbmTraceWriter #endif ); - if ( error != IVAS_ERR_OK && error != IVAS_ERR_VS_FRAME_NEEDED ) + if ( error != IVAS_ERR_OK && error != IVAS_ERR_VS_FRAME_NEEDED ) { fprintf( stderr, "\nError in IVAS_DEC_VoIP_GetSamples: %s\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } + if ( error == IVAS_ERR_VS_FRAME_NEEDED ) { if ( arg.tsmScaleFileEnabled ) diff --git a/lib_com/ivas_error.h b/lib_com/ivas_error.h index ce51109207..1b03606d76 100644 --- a/lib_com/ivas_error.h +++ b/lib_com/ivas_error.h @@ -87,14 +87,14 @@ typedef enum IVAS_ERR_ISM_INVALID_METADATA_VALUE, IVAS_ERR_INVALID_MASA_FORMAT_METADATA_FILE, IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED, -#ifdef VARIABLE_SPEED_DECODING - IVAS_ERR_VS_FRAME_NEEDED, -#endif #ifdef DEBUGGING IVAS_ERR_INVALID_FORCE_MODE, #ifdef DEBUG_AGC_ENCODER_CMD_OPTION IVAS_ERR_INVALID_AGC, #endif +#ifdef VARIABLE_SPEED_DECODING + IVAS_ERR_VS_FRAME_NEEDED, +#endif #endif /*----------------------------------------* diff --git a/lib_com/options.h b/lib_com/options.h index 6f282f9d3b..4267e213c3 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -48,7 +48,7 @@ /* ################### Start DEBUGGING switches ########################### */ #ifndef RELEASE -#define DEBUGGING /* Activate debugging part of the code */ +//#define DEBUGGING /* Activate debugging part of the code */ #endif /*#define WMOPS*/ /* Activate complexity and memory counters */ /*#define WMOPS_PER_FRAME*/ /* Output per-frame complexity (writes one float value per frame to the file "wmops_analysis") */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 54a212240c..265af66a56 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -63,7 +63,7 @@ struct IVAS_DEC_VOIP JB4_DATAUNIT_HANDLE hCurrentDataUnit; /* Points to the currently processed data unit */ uint16_t *bs_conversion_buf; /* Buffer for bitstream conversion from packed to serial */ #ifdef VARIABLE_SPEED_DECODING - uint8_t mode; + IVAS_DEC_VOIP_MODE voipMode; uint16_t speedFac; bool needNewFrame; #endif @@ -588,7 +588,7 @@ ivas_error IVAS_DEC_EnableVoIP( hIvasDec->hVoIP->lastDecodedWasActive = 0; hIvasDec->hVoIP->hCurrentDataUnit = NULL; #ifdef VARIABLE_SPEED_DECODING - hIvasDec->hVoIP->mode = voipMode; + hIvasDec->hVoIP->voipMode = voipMode; hIvasDec->hVoIP->speedFac = speedFac; hIvasDec->hVoIP->needNewFrame = false; #endif @@ -627,7 +627,7 @@ ivas_error IVAS_DEC_EnableVoIP( /* initialize JBM */ #ifdef VARIABLE_SPEED_DECODING hIvasDec->hVoIP->hJBM = NULL; - if ( hIvasDec->hVoIP->mode == IVAS_DEC_VOIP_MODE_VOIP ) + if ( hIvasDec->hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VOIP ) { #endif if ( ( error = JB4_Create( &hIvasDec->hVoIP->hJBM ) != IVAS_ERR_OK ) != IVAS_ERR_OK ) @@ -674,7 +674,7 @@ ivas_error IVAS_DEC_EnableVoIP( /* create output pcm fifo*/ /* :TODO: also provide CLDFB output FIFO if things work out */ #ifdef VARIABLE_SPEED_DECODING - if ( hIvasDec->hVoIP->mode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED ) + if ( hIvasDec->hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED ) { hIvasDec->hVoIP->needNewFrame = true; } @@ -798,7 +798,7 @@ ivas_error IVAS_DEC_FeedFrame_Serial( } #ifdef VARIABLE_SPEED_DECODING - if ( hIvasDec->hVoIP != NULL && hIvasDec->hVoIP->mode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED ) + if ( hIvasDec->hVoIP != NULL && hIvasDec->hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED ) { hIvasDec->hVoIP->needNewFrame = false; } @@ -1772,6 +1772,7 @@ ivas_error IVAS_DEC_VoIP_FeedFrame( } #ifdef VARIABLE_SPEED_DECODING +#ifdef DEBUGGING /*---------------------------------------------------------------------* * IVAS_DEC_VoIP_SetScale( ) * @@ -1792,6 +1793,7 @@ ivas_error IVAS_DEC_VoIP_SetScale( return error; } #endif +#endif /*---------------------------------------------------------------------* * IVAS_DEC_VoIP_GetSamples( ) @@ -1869,6 +1871,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( while ( pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoAfterTimeScaler ) < nSamplesPerChannel ) #endif { +#ifdef DEBUGGING #ifdef VARIABLE_SPEED_DECODING if ( hVoIP->mode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED && hVoIP->needNewFrame ) { @@ -1877,6 +1880,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( return IVAS_ERR_VS_FRAME_NEEDED; } #endif +#endif #ifdef JBM_TSM_ON_TCS if ( hVoIP->nSamplesAvailableNext == 0 ) @@ -1898,7 +1902,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( dataUnit = NULL; #ifdef VARIABLE_SPEED_DECODING - if ( hVoIP->mode == IVAS_DEC_VOIP_MODE_VOIP ) + if ( hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VOIP ) { #endif /* pop one access unit from the jitter buffer */ @@ -1909,7 +1913,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( } #ifdef VARIABLE_SPEED_DECODING } - else if ( hVoIP->mode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED ) + else if ( hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED ) { scale = hVoIP->speedFac; maxScaling = hVoIP->speedFac; @@ -1937,7 +1941,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( } #ifdef VARIABLE_SPEED_DECODING - if ( hVoIP->mode == IVAS_DEC_VOIP_MODE_VOIP ) + if ( hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VOIP ) { #endif /* copy bitstream into decoder state */ @@ -2031,7 +2035,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( } #ifdef VARIABLE_SPEED_DECODING - if ( hVoIP->mode == IVAS_DEC_VOIP_MODE_VOIP ) + if ( hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VOIP ) { #endif if ( dataUnit ) @@ -2189,7 +2193,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( nSamplesRendered += nSamplesRendered_loop; #ifdef VARIABLE_SPEED_DECODING - if ( hVoIP->mode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED && hVoIP->nSamplesAvailableNext == 0 ) + if ( hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED && hVoIP->nSamplesAvailableNext == 0 ) { hVoIP->needNewFrame = true; } @@ -2204,7 +2208,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( hVoIP->nSamplesAvailableNext = max( 0, pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoOut ) - nSamplesPerChannel ); #ifdef VARIABLE_SPEED_DECODING - if ( hVoIP->mode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED && hVoIP->nSamplesAvailableNext < nSamplesPerChannel ) + if ( hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED && hVoIP->nSamplesAvailableNext < nSamplesPerChannel ) { hVoIP->needNewFrame = true; } @@ -3265,7 +3269,7 @@ ivas_error IVAS_DEC_VoIP_reconfigure( DECODER_CONFIG_HANDLE hDecoderConfig; #ifdef VARIABLE_SPEED_DECODING - startQuality = hVoIP->mode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED ? -2.0f : 1.0f; + startQuality = hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED ? -2.0f : 1.0f; #else startQuality = 1.0f; #endif @@ -3324,7 +3328,7 @@ ivas_error IVAS_DEC_VoIP_reconfigure( } } #ifdef VARIABLE_SPEED_DECODING - else if ( hIvasDec->hVoIP->mode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED ) + else if ( hIvasDec->hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED ) { if ( pcmdsp_fifo_create( &hIvasDec->hVoIP->hFifoOut ) != 0 || pcmdsp_fifo_init( hIvasDec->hVoIP->hFifoOut, (uint16_t) ( hDecoderConfig->output_Fs * 4 / FRAMES_PER_SEC ) /* 4 frames */, hDecoderConfig->nchan_out, sizeof( int16_t ) ) != 0 ) diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index 3d632b6b15..16dcecb112 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -222,12 +222,14 @@ ivas_error IVAS_DEC_VoIP_FeedFrame( ); #ifdef VARIABLE_SPEED_DECODING +#ifdef DEBUGGING /*! r: error code */ ivas_error IVAS_DEC_VoIP_SetScale( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ const int16_t scale /* i : TSM scale to set */ ); #endif +#endif /*! r: error code */ ivas_error IVAS_DEC_VoIP_GetSamples( -- GitLab From 2fc212ca8957678279a528ab31d14fdf21317f4a Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Mon, 22 May 2023 11:46:38 +0200 Subject: [PATCH 297/331] Fix instrumentation of renderer executable --- scripts/prepare_instrumentation.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/prepare_instrumentation.sh b/scripts/prepare_instrumentation.sh index c748f19aca..70d6987496 100755 --- a/scripts/prepare_instrumentation.sh +++ b/scripts/prepare_instrumentation.sh @@ -103,7 +103,8 @@ find $targetdir -name "*.[ch]" -exec sed -i.bak -e "s/\(0x[0-9a-fA-F]*\)UL/\(\(u # run wmc_tool "tools/$system/wmc_tool" -m "$targetdir/apps/encoder.c" "$targetdir/lib_enc/*.c" "$targetdir/lib_com/*.c" >> /dev/null -"tools/$system/wmc_tool" -m "$targetdir/apps/decoder.c" "$targetdir/lib_dec/*.c" "$targetdir/lib_rend/*.c" >> /dev/null +"tools/$system/wmc_tool" -m "$targetdir/apps/decoder.c" "$targetdir/lib_dec/*.c" >> /dev/null +"tools/$system/wmc_tool" -m "$targetdir/apps/renderer.c" "$targetdir/lib_rend/*.c" >> /dev/null # automatically enable #define WMOPS in options.h sed -i.bak -e "s/\/\*[[:space:]]*\(#define[[:space:]]*WMOPS\)[[:space:]]*\*\//\1/g" $targetdir/lib_com/options.h -- GitLab From 9dcdba30695ab8ad6574045fc26a4625e17e9d91 Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 22 May 2023 12:14:55 +0200 Subject: [PATCH 298/331] re-enable DEBUGGING switch --- lib_com/options.h | 2 +- lib_dec/lib_dec.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 4267e213c3..6f282f9d3b 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -48,7 +48,7 @@ /* ################### Start DEBUGGING switches ########################### */ #ifndef RELEASE -//#define DEBUGGING /* Activate debugging part of the code */ +#define DEBUGGING /* Activate debugging part of the code */ #endif /*#define WMOPS*/ /* Activate complexity and memory counters */ /*#define WMOPS_PER_FRAME*/ /* Output per-frame complexity (writes one float value per frame to the file "wmops_analysis") */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 265af66a56..ff02bb1782 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1873,7 +1873,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( { #ifdef DEBUGGING #ifdef VARIABLE_SPEED_DECODING - if ( hVoIP->mode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED && hVoIP->needNewFrame ) + if ( hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED && hVoIP->needNewFrame ) { /* we need another bs frame fed into the decoder...*/ *sampleAvailableNext = 0; -- GitLab From 40a6fe697b660e71776295c9b010bd724f94f693 Mon Sep 17 00:00:00 2001 From: Sumeyra Kanik Date: Mon, 22 May 2023 18:59:13 +0200 Subject: [PATCH 299/331] Fix format issues --- lib_dec/ivas_ism_renderer.c | 6 ------ lib_dec/ivas_sba_rendering_internal.c | 2 -- lib_rend/ivas_objectRenderer.c | 4 ++-- 3 files changed, 2 insertions(+), 10 deletions(-) diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index 779751d7b6..3b38e2d890 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -168,8 +168,6 @@ void ivas_ism_render( { if ( st_ivas->intern_config == AUDIO_CONFIG_STEREO ) { -#ifdef FIX_356_ISM_METADATA_SYNC -#endif ivas_ism_get_stereo_gains( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &gains[i][0], @@ -180,15 +178,11 @@ void ivas_ism_render( /* Head rotation: rotate the object positions depending the head's orientation */ if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 && !st_ivas->hIsmMetaData[i]->non_diegetic_flag ) { -#ifdef FIX_356_ISM_METADATA_SYNC -#endif rotateAziEle( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &azimuth, &elevation, Rmat, st_ivas->hIntSetup.is_planar_setup ); } else { // TODO tmu review when #215 is resolved -#ifdef FIX_356_ISM_METADATA_SYNC -#endif azimuth = (int16_t) floorf( st_ivas->hIsmMetaData[i]->azimuth + 0.5f ); elevation = (int16_t) floorf( st_ivas->hIsmMetaData[i]->elevation + 0.5f ); diff --git a/lib_dec/ivas_sba_rendering_internal.c b/lib_dec/ivas_sba_rendering_internal.c index ef3c51d234..71a5718436 100644 --- a/lib_dec/ivas_sba_rendering_internal.c +++ b/lib_dec/ivas_sba_rendering_internal.c @@ -334,8 +334,6 @@ void ivas_ism2sba( for ( i = 0; i < nchan_ism; i++ ) { -#ifdef FIX_356_ISM_METADATA_SYNC -#endif // TODO tmu review when #215 is resolved azimuth = (int16_t) floorf( hIsmMetaData[i]->azimuth + 0.5f ); elevation = (int16_t) floorf( hIsmMetaData[i]->elevation + 0.5f ); diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 142d35fec3..3d929e78c7 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -691,7 +691,7 @@ ivas_error ivas_td_binaural_renderer_ext( AUDIO_CONFIG transport_config; ivas_error error; #ifdef FIX_356_ISM_METADATA_SYNC - int16_t ism_md_subframe_update = 0; + int16_t ism_md_subframe_update_ext = 0; #endif #ifdef JBM_TSM_ON_TCS float *p_output[MAX_OUTPUT_CHANNELS]; @@ -744,7 +744,7 @@ ivas_error ivas_td_binaural_renderer_ext( #ifdef FIX_356_ISM_METADATA_SYNC if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, ( headRotData != NULL ) ? headRotData->headPositions : NULL, - ( headRotData != NULL ) ? headRotData->Pos : NULL, ism_md_subframe_update, p_output, output_frame ) ) != IVAS_ERR_OK ) + ( headRotData != NULL ) ? headRotData->Pos : NULL, ism_md_subframe_update_ext, p_output, output_frame ) ) != IVAS_ERR_OK ) #else if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, ( headRotData != NULL ) ? headRotData->headPositions : NULL, -- GitLab From d65780fc8c1099b57acbff9d6f1c4b47f65fd90b Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Tue, 23 May 2023 08:38:57 +0200 Subject: [PATCH 300/331] move static buffers from calculate_hodirac_sector_parameters to hDirAC --- lib_com/ivas_dirac_com.c | 23 ++++++++++++++--------- lib_com/ivas_prot.h | 3 +++ lib_com/ivas_sba_config.c | 2 +- lib_com/options.h | 2 ++ lib_enc/ivas_dirac_enc.c | 18 +++++++++++++++++- lib_enc/ivas_stat_enc.h | 12 ++++++++++++ 6 files changed, 49 insertions(+), 11 deletions(-) diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index d876c557ba..7a171f2923 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -947,6 +947,9 @@ void deindex_spherical_component( *-----------------------------------------------------------------*/ void calculate_hodirac_sector_parameters( +#ifdef FIX_485_STATIC_BUFFERS + DIRAC_ENC_HANDLE hDirAC, /* i : DirAC handle */ +#endif float RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : signal vector (L+1)^2 x N_bins, real part */ float ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : signal vector, imaginary part */ const float beta, /* i : forgetting factor for average filtering */ @@ -965,6 +968,7 @@ void calculate_hodirac_sector_parameters( float sec_I_vec_y[NUM_ANA_SECTORS]; float sec_I_vec_z[NUM_ANA_SECTORS]; +#ifndef FIX_485_STATIC_BUFFERS static int16_t firstrun_sector_params = 1; static float sec_I_vec_smth_x[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; @@ -974,6 +978,7 @@ void calculate_hodirac_sector_parameters( static float energy_smth[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; static float azi_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS]; static float ele_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS]; +#endif for ( i_sec = 0; i_sec < NUM_ANA_SECTORS; i_sec++ ) { @@ -1009,13 +1014,13 @@ void calculate_hodirac_sector_parameters( float *p_ene = &ene[i_sec * N_bands + i_band]; float *p_diff = &diff[i_sec * N_bands + i_band]; - float *p_azi_prev = &azi_prev[i_sec * N_bands + i_band]; - float *p_ele_prev = &ele_prev[i_sec * N_bands + i_band]; + float *p_azi_prev = &hDirAC->azi_prev[i_sec * N_bands + i_band]; + float *p_ele_prev = &hDirAC->ele_prev[i_sec * N_bands + i_band]; - float *p_energy_smth = &energy_smth[i_sec][i_band]; - float *p_sec_I_vec_smth_x = &sec_I_vec_smth_x[i_sec][i_band]; - float *p_sec_I_vec_smth_y = &sec_I_vec_smth_y[i_sec][i_band]; - float *p_sec_I_vec_smth_z = &sec_I_vec_smth_z[i_sec][i_band]; + float *p_energy_smth = &hDirAC->energy_smth[i_sec][i_band]; + float *p_sec_I_vec_smth_x = &hDirAC->sec_I_vec_smth_x[i_sec][i_band]; + float *p_sec_I_vec_smth_y = &hDirAC->sec_I_vec_smth_y[i_sec][i_band]; + float *p_sec_I_vec_smth_z = &hDirAC->sec_I_vec_smth_z[i_sec][i_band]; *p_sec_I_vec_x = 0.f; *p_sec_I_vec_y = 0.f; @@ -1083,7 +1088,7 @@ void calculate_hodirac_sector_parameters( } } - if ( firstrun_sector_params ) + if ( hDirAC->firstrun_sector_params ) { *p_sec_I_vec_smth_x = *p_sec_I_vec_x; *p_sec_I_vec_smth_y = *p_sec_I_vec_y; @@ -1125,7 +1130,7 @@ void calculate_hodirac_sector_parameters( } if ( tmp_diff > 0.5f ) { - if ( firstrun_sector_params ) + if ( hDirAC->firstrun_sector_params ) { *p_azi = 0.f; *p_ele = 0.f; @@ -1144,7 +1149,7 @@ void calculate_hodirac_sector_parameters( } } - firstrun_sector_params = 0; + hDirAC->firstrun_sector_params = 0; return; } diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index e7a723b607..9b6871695e 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3905,6 +3905,9 @@ void ivas_dirac_dec_get_frequency_axis( const int16_t num_freq_bands ); /* i : number of frequency bands */ void calculate_hodirac_sector_parameters( +#ifdef FIX_485_STATIC_BUFFERS + DIRAC_ENC_HANDLE hDirAC, +#endif float RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX],/* i : signal vector (L+1)^2 x N_bins, real part */ float ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX],/* i : signal vector, imaginary part */ const float beta, /* i : forgetting factor for average filtering */ diff --git a/lib_com/ivas_sba_config.c b/lib_com/ivas_sba_config.c index e7a448315f..62398f1dca 100644 --- a/lib_com/ivas_sba_config.c +++ b/lib_com/ivas_sba_config.c @@ -295,7 +295,7 @@ void ivas_sba_get_spar_hoa_md_flag( *spar_hoa_md_flag = 0; } - if ( sba_order > 1 && ivas_total_brate >= IVAS_512k ) + if ( sba_order > 1 && ivas_total_brate >= IVAS_384k ) { *spar_hoa_dirac2spar_md_flag = 0; } diff --git a/lib_com/options.h b/lib_com/options.h index 2d346ef591..9dc196207d 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -164,6 +164,8 @@ #define FIX_482_DUMMYDEC_INIT /* Nokia: fix issue #428: missing inits for dummyDec in IVAS_rend */ #define FIX_468_16KHZ_PUPMIX /* Dlb: Fix issue 468 for Param Upmix at 16kHz sampling rate */ +#define FIX_485_STATIC_BUFFERS /* FhG: move static buffers in DirAC parameter estimator to the DirAC struct */ + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index c38f44a826..3ce2f5d821 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -79,6 +79,9 @@ ivas_error ivas_dirac_enc_open( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC Config\n" ) ); } +#ifdef FIX_485_STATIC_BUFFERS + hDirAC->firstrun_sector_params = 1; +#endif /*-----------------------------------------------------------------* * DirAC main configuration @@ -763,7 +766,20 @@ void ivas_dirac_param_est_enc( #ifdef DEBUGGING assert( l_ts <= DIRAC_NO_FB_BANDS_MAX ); #endif - calculate_hodirac_sector_parameters( Cldfb_RealBuffer, Cldfb_ImagBuffer, 0.20f, hDirAC->band_grouping, hDirAC->hConfig->nbands, hDirAC->hConfig->enc_param_start_band, azi_secs, ele_secs, diff_secs, ene_secs ); + calculate_hodirac_sector_parameters( +#ifdef FIX_485_STATIC_BUFFERS + hDirAC, +#endif + Cldfb_RealBuffer, + Cldfb_ImagBuffer, + 0.20f, + hDirAC->band_grouping, + hDirAC->hConfig->nbands, + hDirAC->hConfig->enc_param_start_band, + azi_secs, + ele_secs, + diff_secs, + ene_secs ); } if ( hodirac_flag ) diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index daff0851ef..806899c343 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -600,6 +600,17 @@ typedef struct ivas_dirac_enc_data_structure float diffuseness_m[DIRAC_MAX_NBANDS]; int16_t band_grouping[DIRAC_MAX_NBANDS + 1]; int16_t block_grouping[5]; +#ifdef FIX_485_STATIC_BUFFERS + int16_t firstrun_sector_params; + + float sec_I_vec_smth_x[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; + float sec_I_vec_smth_y[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; + float sec_I_vec_smth_z[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; + + float energy_smth[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; + float azi_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS]; + float ele_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS]; +#endif int16_t dirac_to_spar_md_bands[DIRAC_MAX_NBANDS]; @@ -609,6 +620,7 @@ typedef struct ivas_dirac_enc_data_structure float **buffer_intensity_real[DIRAC_NUM_DIMS]; float *buffer_energy; + } DIRAC_ENC_DATA, *DIRAC_ENC_HANDLE; /*----------------------------------------------------------------------------------* -- GitLab From 7ec07c67de41cf39a978699c91ae86c7144b6ee6 Mon Sep 17 00:00:00 2001 From: Ke Zhao Date: Tue, 23 May 2023 16:46:58 +1000 Subject: [PATCH 301/331] Include some changes under switch UPDATE_SBA_FILTER --- lib_rend/ivas_crend.c | 8 ++++++++ lib_rend/ivas_rom_binaural_crend_head.c | 6 ++++++ lib_rend/ivas_rom_binaural_crend_head.h | 4 ++++ lib_rend/ivas_stat_rend.h | 1 + lib_util/hrtf_file_reader.c | 6 +++++- 5 files changed, 24 insertions(+), 1 deletion(-) diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index 255e997ce8..12efe39c5b 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -1308,9 +1308,17 @@ static ivas_error ivas_rend_crendConvolver( int16_t lfe_idx_in; int16_t offset, offset_in, offset_diffuse; int16_t nchan_in, nchan_out; +#ifdef UPDATE_SBA_FILTER const float *pIn; +#else + float *pIn; +#endif float *pFreq_buf_re, *pFreq_buf_im; +#ifdef UPDATE_SBA_FILTER const float *pFreq_filt_re, *pFreq_filt_im; +#else + float *pFreq_filt_re, *pFreq_filt_im; +#endif float pOut[L_FRAME48k * 2]; float tmp_out_re[L_FRAME48k], tmp_out_im[L_FRAME48k]; ivas_error error; diff --git a/lib_rend/ivas_rom_binaural_crend_head.c b/lib_rend/ivas_rom_binaural_crend_head.c index 15afa75b87..16289a832e 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.c +++ b/lib_rend/ivas_rom_binaural_crend_head.c @@ -42,7 +42,13 @@ +#ifndef UPDATE_SBA_FILTER +#include +#endif #include +#ifndef UPDATE_SBA_FILTER +#include "cnst.h" +#endif #include "ivas_cnst.h" /* clang-format off */ diff --git a/lib_rend/ivas_rom_binaural_crend_head.h b/lib_rend/ivas_rom_binaural_crend_head.h index 6aced8fa92..8f0823dc7b 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.h +++ b/lib_rend/ivas_rom_binaural_crend_head.h @@ -45,6 +45,10 @@ #ifndef _IVAS_ROM_BINAURAL_CREND_HEAD_ #define _IVAS_ROM_BINAURAL_CREND_HEAD_ +#ifndef UPDATE_SBA_FILTER +#include +#include "cnst.h" +#endif #include "ivas_cnst.h" #ifdef USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index defec0651a..877076db9a 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -739,6 +739,7 @@ typedef struct ivas_hrtfs_fastconv_struct float rightHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][7]; float rightHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][7]; #endif + #ifdef UPDATE_SBA_FILTER float FASTCONV_HOA2_latency_s; float leftHRIRReal_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]; diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index 1f5b0b9cae..d2f923bfeb 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -1111,7 +1111,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( #ifdef UPDATE_SBA_FILTER else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) #else - else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA ) + if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA ) #endif { /* HRIR_HOA3 */ @@ -1268,7 +1268,11 @@ static ivas_error create_fastconv_HRTF_from_rawdata( } #endif /* BRIR */ +#ifdef UPDATE_SBA_FILTER else if ( rend_type == RENDERER_BINAURAL_FASTCONV_ROOM && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) +#else + if ( rend_type == RENDERER_BINAURAL_FASTCONV_ROOM && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) +#endif { ( *hHRTF )->FASTCONV_BRIR_latency_s = *( (float *) ( hrtf_data_rptr ) ); hrtf_data_rptr += sizeof( float ); -- GitLab From 16dd757a3686a723857ad2b8832a8d2f7c9d3f93 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Tue, 23 May 2023 09:09:57 +0200 Subject: [PATCH 302/331] fix compilation with FIX_485_STATIC_BUFFERS disabled --- lib_com/ivas_dirac_com.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index 7a171f2923..95d122ba79 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -1014,6 +1014,7 @@ void calculate_hodirac_sector_parameters( float *p_ene = &ene[i_sec * N_bands + i_band]; float *p_diff = &diff[i_sec * N_bands + i_band]; +#ifdef FIX_485_STATIC_BUFFERS float *p_azi_prev = &hDirAC->azi_prev[i_sec * N_bands + i_band]; float *p_ele_prev = &hDirAC->ele_prev[i_sec * N_bands + i_band]; @@ -1021,7 +1022,15 @@ void calculate_hodirac_sector_parameters( float *p_sec_I_vec_smth_x = &hDirAC->sec_I_vec_smth_x[i_sec][i_band]; float *p_sec_I_vec_smth_y = &hDirAC->sec_I_vec_smth_y[i_sec][i_band]; float *p_sec_I_vec_smth_z = &hDirAC->sec_I_vec_smth_z[i_sec][i_band]; +#else + float *p_azi_prev = &azi_prev[i_sec * N_bands + i_band]; + float *p_ele_prev = &ele_prev[i_sec * N_bands + i_band]; + float *p_energy_smth = &energy_smth[i_sec][i_band]; + float *p_sec_I_vec_smth_x = &sec_I_vec_smth_x[i_sec][i_band]; + float *p_sec_I_vec_smth_y = &sec_I_vec_smth_y[i_sec][i_band]; + float *p_sec_I_vec_smth_z = &sec_I_vec_smth_z[i_sec][i_band]; +#endif *p_sec_I_vec_x = 0.f; *p_sec_I_vec_y = 0.f; *p_sec_I_vec_z = 0.f; @@ -1087,8 +1096,11 @@ void calculate_hodirac_sector_parameters( sec_z_real * sec_z_real + sec_z_imag * sec_z_imag ); } } - +#ifdef FIX_485_STATIC_BUFFERS if ( hDirAC->firstrun_sector_params ) +#else + if ( firstrun_sector_params ) +#endif { *p_sec_I_vec_smth_x = *p_sec_I_vec_x; *p_sec_I_vec_smth_y = *p_sec_I_vec_y; @@ -1130,7 +1142,11 @@ void calculate_hodirac_sector_parameters( } if ( tmp_diff > 0.5f ) { +#ifdef FIX_485_STATIC_BUFFERS if ( hDirAC->firstrun_sector_params ) +#else + if ( firstrun_sector_params ) +#endif { *p_azi = 0.f; *p_ele = 0.f; @@ -1149,7 +1165,11 @@ void calculate_hodirac_sector_parameters( } } +#ifdef FIX_485_STATIC_BUFFERS hDirAC->firstrun_sector_params = 0; +#else + firstrun_sector_params = 0; +#endif return; } -- GitLab From b4289c40577ec5aa1a7e2f40fd7559e4f3348a67 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Tue, 23 May 2023 09:34:17 +0200 Subject: [PATCH 303/331] fix pipeline errors --- lib_com/ivas_sba_config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/ivas_sba_config.c b/lib_com/ivas_sba_config.c index 62398f1dca..e7a448315f 100644 --- a/lib_com/ivas_sba_config.c +++ b/lib_com/ivas_sba_config.c @@ -295,7 +295,7 @@ void ivas_sba_get_spar_hoa_md_flag( *spar_hoa_md_flag = 0; } - if ( sba_order > 1 && ivas_total_brate >= IVAS_384k ) + if ( sba_order > 1 && ivas_total_brate >= IVAS_512k ) { *spar_hoa_dirac2spar_md_flag = 0; } -- GitLab From 2514546a3bf791a78f32d5d1b11daec35707180b Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Tue, 23 May 2023 10:53:12 +0200 Subject: [PATCH 304/331] fix msan errors --- lib_enc/ivas_dirac_enc.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index 3ce2f5d821..283c51c4be 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -81,8 +81,13 @@ ivas_error ivas_dirac_enc_open( } #ifdef FIX_485_STATIC_BUFFERS hDirAC->firstrun_sector_params = 1; + set_zero( hDirAC->sec_I_vec_smth_x[0], NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); + set_zero( hDirAC->sec_I_vec_smth_y[0], NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); + set_zero( hDirAC->sec_I_vec_smth_z[0], NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); + set_zero( hDirAC->azi_prev, NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); + set_zero( hDirAC->ele_prev, NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); + set_zero( hDirAC->energy_smth[0], NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); #endif - /*-----------------------------------------------------------------* * DirAC main configuration *-----------------------------------------------------------------*/ -- GitLab From 09958e8de17f73d22f3645507bae7c1405b20411 Mon Sep 17 00:00:00 2001 From: Sumeyra Kanik Date: Tue, 23 May 2023 11:29:22 +0200 Subject: [PATCH 305/331] Merge from main, recent updates --- lib_dec/ivas_objectRenderer_internal.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index 3f7d05a07a..081b33e55c 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -113,7 +113,7 @@ void ObjRenderIVASSubframe( float *tc_local[MAX_TRANSPORT_CHANNELS]; int16_t ch, slot_size, slots_to_render, output_frame; #ifdef FIX_356_ISM_METADATA_SYNC - int16_t ism_md_subframe_update = 0; /* Number of subframes to delay metadata to sync with audio */ + int16_t ism_md_subframe_update_jbm = 0; /* Number of subframes to delay metadata to sync with audio */ #endif for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { @@ -163,7 +163,7 @@ void ObjRenderIVASSubframe( /* Render subframe */ #ifdef FIX_356_ISM_METADATA_SYNC - TDREND_GetMix( st_ivas->hBinRendererTd, output_f_local, output_frame, 0, ism_md_subframe_update ); + TDREND_GetMix( st_ivas->hBinRendererTd, output_f_local, output_frame, 0, ism_md_subframe_update_jbm ); #else TDREND_GetMix( st_ivas->hBinRendererTd, output_f_local, output_frame, 0 ); #endif -- GitLab From d77d13e1214f32d7f5b6f3693c3fe0b17da67c6f Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 May 2023 14:13:51 +0200 Subject: [PATCH 306/331] Add FIX_499_DFT_STEREO_PLC: wrong memory addressed in DFT stereo residual PLC --- lib_com/options.h | 1 + lib_dec/ivas_stereo_dft_dec.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 889585ab2f..5eda294ed7 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -203,6 +203,7 @@ #define FIX_HBR_MASAMETA /* Nokia: Fixes to HBR MASA metadata at 384 and 512 kbps. Addresses issues 438 and 477 as well. */ #define FIX_482_DUMMYDEC_INIT /* Nokia: fix issue #428: missing inits for dummyDec in IVAS_rend */ #define FIX_468_16KHZ_PUPMIX /* Dlb: Fix issue 468 for Param Upmix at 16kHz sampling rate */ +#define FIX_499_DFT_STEREO_PLC /* Eri: Fix for issue 499: Wrong past memory addressed for computing energy of DFT stereo residual ECU frame */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_stereo_dft_dec.c b/lib_dec/ivas_stereo_dft_dec.c index 02fd3a41d3..5c2d0b37e6 100644 --- a/lib_dec/ivas_stereo_dft_dec.c +++ b/lib_dec/ivas_stereo_dft_dec.c @@ -1738,7 +1738,11 @@ void stereo_dft_dec( if ( st0->bfi && !prev_bfi ) { +#ifdef FIX_499_DFT_STEREO_PLC + idx_k0 = ( hStereoDft->past_DMX_pos + STEREO_DFT_PAST_MAX - 1 ) % STEREO_DFT_PAST_MAX; +#else idx_k0 = ( hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX; +#endif idx_k1 = ( idx_k0 + 1 ) % STEREO_DFT_PAST_MAX; /*dmx energy memory*/ hStereoDft->past_dmx_nrg = stereo_dft_dmx_swb_nrg( hStereoDft->DFT_past_DMX[idx_k0], hStereoDft->DFT_past_DMX[idx_k1], min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ) ); -- GitLab From b6028550b74bbdc4d07132429f9243883653bdf2 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 24 May 2023 09:24:26 +0200 Subject: [PATCH 307/331] fix floating point exception in noise est --- lib_com/options.h | 2 ++ lib_enc/nois_est.c | 15 +++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 0a9e37c191..a82400fe34 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -206,6 +206,8 @@ #define FIX_485_STATIC_BUFFERS /* FhG: move static buffers in DirAC parameter estimator to the DirAC struct */ +#define FIX_483 /* FhG: fix usse 483, division by zero in nois_est */ + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_enc/nois_est.c b/lib_enc/nois_est.c index 50dab41028..bf506cd9db 100644 --- a/lib_enc/nois_est.c +++ b/lib_enc/nois_est.c @@ -378,6 +378,20 @@ void noise_est( { if ( st->hSpMusClas != NULL ) { +#ifdef FIX_483 + float E; + + E = mean( lf_E, 8 ); + if ( E < 1.0f ) + { + st->hSpMusClas->ener_RAT = 0.f; + } + else + { + st->hSpMusClas->ener_RAT = 10.0f * (float) log10( E ); + st->hSpMusClas->ener_RAT /= ( Etot + 0.01f ); + } +#else st->hSpMusClas->ener_RAT = 10.0f * (float) log10( mean( lf_E, 8 ) ); st->hSpMusClas->ener_RAT /= ( Etot + 0.01f ); @@ -385,6 +399,7 @@ void noise_est( { st->hSpMusClas->ener_RAT = 0.0f; } +#endif if ( st->hSpMusClas->ener_RAT > 1.0 ) { -- GitLab From 946fee59a6b8b6913300fca476d66eb859c7741f Mon Sep 17 00:00:00 2001 From: Sumeyra Kanik Date: Wed, 24 May 2023 09:59:33 +0200 Subject: [PATCH 308/331] Revert changes related to disabling delay compensation at encoder --- apps/decoder.c | 10 +++++++++- lib_com/delay_comp.c | 14 -------------- lib_dec/ivas_dec.c | 1 + lib_dec/ivas_objectRenderer_internal.c | 10 +++++++++- lib_dec/ivas_stat_dec.h | 4 +++- lib_dec/lib_dec.c | 20 ++++++++++++-------- lib_dec/lib_dec.h | 4 ++++ 7 files changed, 38 insertions(+), 25 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 197f90b8d0..0b83b180db 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -388,12 +388,20 @@ int main( /*------------------------------------------------------------------------------------------* * Configure the decoder *------------------------------------------------------------------------------------------*/ - +#ifdef FIX_356_ISM_METADATA_SYNC +#ifdef FIX_439_OTR_PARAMS + if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.orientation_tracking, arg.renderConfigEnabled, arg.Opt_non_diegetic_pan, arg.non_diegetic_pan_gain, arg.delayCompensationEnabled ) ) != IVAS_ERR_OK ) +#else + if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.renderConfigEnabled, arg.Opt_non_diegetic_pan, arg.non_diegetic_pan_gain, arg.delayCompensationEnabled ) ) != IVAS_ERR_OK ) +#endif +#else #ifdef FIX_439_OTR_PARAMS if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.orientation_tracking, arg.renderConfigEnabled, arg.Opt_non_diegetic_pan, arg.non_diegetic_pan_gain ) ) != IVAS_ERR_OK ) #else if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.renderConfigEnabled, arg.Opt_non_diegetic_pan, arg.non_diegetic_pan_gain ) ) != IVAS_ERR_OK ) #endif +#endif + { fprintf( stderr, "\nConfigure failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; diff --git a/lib_com/delay_comp.c b/lib_com/delay_comp.c index 518a28aba7..003d942245 100644 --- a/lib_com/delay_comp.c +++ b/lib_com/delay_comp.c @@ -69,17 +69,10 @@ int32_t get_delay( { delay = IVAS_ENC_DELAY_NS; -#ifdef FIX_356_ISM_METADATA_SYNC - if ( ivas_format == ISM_FORMAT || ivas_format == MASA_FORMAT ) - { - delay = 0; /* All delay is compensated in the decoder with MASA/ISM */ - } -#else if ( ivas_format == MASA_FORMAT ) { delay = 0; /* All delay is compensated in the decoder with MASA */ } -#endif } if ( ivas_format == SBA_FORMAT ) @@ -111,17 +104,10 @@ int32_t get_delay( delay += IVAS_FB_DEC_DELAY_NS; } -#ifdef FIX_356_ISM_METADATA_SYNC - if ( ivas_format == ISM_FORMAT || ivas_format == MASA_FORMAT ) - { - delay += IVAS_ENC_DELAY_NS; /* Compensate also the encoder delay in the decoder with ISM/MASA */ - } -#else if ( ivas_format == MASA_FORMAT ) { delay += IVAS_ENC_DELAY_NS; /* Compensate also the encoder delay in the decoder with MASA */ } -#endif } } diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index 7069e7d08f..e0e6a28725 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -268,6 +268,7 @@ ivas_error ivas_dec( /* Binaural rendering */ if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) { + #ifdef JBM_TSM_ON_TCS if ( ( ivas_td_binaural_renderer( st_ivas, p_output, output_frame ) ) != IVAS_ERR_OK ) #else diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index 081b33e55c..8f7fd378f7 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -76,7 +76,15 @@ ivas_error ivas_td_binaural_renderer( ) { #ifdef FIX_356_ISM_METADATA_SYNC - int16_t ism_md_subframe_update = 2; + int16_t ism_md_subframe_update; + if ( st_ivas->hDecoderConfig->Opt_delay_comp ) + { + ism_md_subframe_update = 1; + } + else + { + ism_md_subframe_update = 2; + } return ivas_td_binaural_renderer_unwrap( st_ivas->hReverb, st_ivas->transport_config, diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index af9d5da5f4..e3b97e632d 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -1224,7 +1224,9 @@ typedef struct decoder_config_structure #ifdef JBM_TSM_ON_TCS int16_t voip_active; #endif - +#ifdef FIX_356_ISM_METADATA_SYNC + int16_t Opt_delay_comp; /* flag indicating delay compensation active */ +#endif } DECODER_CONFIG, *DECODER_CONFIG_HANDLE; diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 07166b8ddb..4488a2a9af 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -276,6 +276,11 @@ static void init_decoder_config( #ifdef JBM_TSM_ON_TCS hDecoderConfig->voip_active = 0; #endif + +#ifdef FIX_356_ISM_METADATA_SYNC + hDecoderConfig->Opt_delay_comp = 0; +#endif + return; } @@ -443,6 +448,10 @@ ivas_error IVAS_DEC_Configure( const int16_t renderConfigEnabled, /* i : enable Renderer config. file for binaural output */ const int16_t Opt_non_diegetic_pan, /* i : diegetic or not */ const float non_diegetic_pan_gain /* i : non diegetic panning gain */ +#ifdef FIX_356_ISM_METADATA_SYNC + , + const int16_t delayCompensationEnabled /* i : enable delay compensation */ +#endif ) { Decoder_Struct *st_ivas; @@ -498,6 +507,9 @@ ivas_error IVAS_DEC_Configure( hDecoderConfig->Opt_RendConfigCustom = renderConfigEnabled; hDecoderConfig->Opt_non_diegetic_pan = Opt_non_diegetic_pan; hDecoderConfig->non_diegetic_pan_gain = non_diegetic_pan_gain; +#ifdef FIX_356_ISM_METADATA_SYNC + hDecoderConfig->Opt_delay_comp = delayCompensationEnabled; +#endif /* Set decoder parameters to initial values */ if ( ( error = ivas_init_decoder_front( st_ivas ) ) != IVAS_ERR_OK ) @@ -1580,14 +1592,6 @@ ivas_error IVAS_DEC_GetDelay( nSamples[2] = (int16_t) roundf( (float) st_ivas->binaural_latency_ns * hDecoderConfig->output_Fs / 1000000000.f ); nSamples[0] = nSamples[1] + nSamples[2]; -#ifdef FIX_356_ISM_METADATA_SYNC - if ( st_ivas->ivas_format == ISM_FORMAT ) - { - /* note: in ISM, all delay is compensated at the decoder by default, so subtract the encoder delay for print-out */ - nSamples[1] -= NS2SA( hDecoderConfig->output_Fs, IVAS_ENC_DELAY_NS ); - } -#endif - *timeScale = hDecoderConfig->output_Fs; return IVAS_ERR_OK; diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index 65e36b055b..03c2ea1ebd 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -153,6 +153,10 @@ ivas_error IVAS_DEC_Configure( const int16_t renderConfigEnabled, /* i : enable Renderer config. file for binaural output */ const int16_t Opt_non_diegetic_pan, /* i : diegetic or not */ const float non_diegetic_pan_gain /* i : non diegetic panning gain */ +#ifdef FIX_356_ISM_METADATA_SYNC + , + const int16_t delayCompensationEnabled /* i : enable delay compensation */ +#endif ); void IVAS_DEC_Close( -- GitLab From 106139f8442e70b8d2f90d2c90dd78e358ea500b Mon Sep 17 00:00:00 2001 From: Sumeyra Kanik Date: Wed, 24 May 2023 10:30:22 +0200 Subject: [PATCH 309/331] Resolve merge conflict from main --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 0a9e37c191..7d9a47ba4f 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -157,7 +157,7 @@ #define FIX_411_EVS_BE_TESTS_ON_WINDOWS_FAILING /* Eri: Fix incorrect use of stack variable used for channel aware config file */ #define COMBINED_FORMAT_SIGNALING /* VA: Introduce a signaling bit for combined format coding */ -#define FIX_356_ISM_METADATA_SYNC /* Eri: issue 356: Metadata out-of-synch for -no_delay_comp */ +// #define FIX_356_ISM_METADATA_SYNC /* Eri: issue 356: Metadata out-of-synch for -no_delay_comp */ #define FIX_446_STEREO_DMX_CRASH /* FhG: fix discrepancy with EVS code that could cause crashes in rare cases */ -- GitLab From 9513b5dc7283f17776a445edab3fe8686e3c8f8f Mon Sep 17 00:00:00 2001 From: Sumeyra Kanik Date: Wed, 24 May 2023 10:31:41 +0200 Subject: [PATCH 310/331] Fix format --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 7d9a47ba4f..0a9e37c191 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -157,7 +157,7 @@ #define FIX_411_EVS_BE_TESTS_ON_WINDOWS_FAILING /* Eri: Fix incorrect use of stack variable used for channel aware config file */ #define COMBINED_FORMAT_SIGNALING /* VA: Introduce a signaling bit for combined format coding */ -// #define FIX_356_ISM_METADATA_SYNC /* Eri: issue 356: Metadata out-of-synch for -no_delay_comp */ +#define FIX_356_ISM_METADATA_SYNC /* Eri: issue 356: Metadata out-of-synch for -no_delay_comp */ #define FIX_446_STEREO_DMX_CRASH /* FhG: fix discrepancy with EVS code that could cause crashes in rare cases */ -- GitLab From 86527feecbb2ab65fd4145c8481b79dd62129715 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Wed, 24 May 2023 10:38:51 +0200 Subject: [PATCH 311/331] added non-diegetic panning to JITTER rendering, fixed a few problems with the FIX_356_ISM_METADATA_SYNC switch in this path. --- lib_com/options.h | 3 ++- lib_dec/ivas_ism_renderer.c | 4 ++++ lib_dec/ivas_jbm_dec.c | 25 +++++++++++++++++++++++++ lib_dec/ivas_objectRenderer_internal.c | 21 ++++++++++++++++++--- lib_dec/lib_dec.c | 20 ++++++++++++++++++-- 5 files changed, 67 insertions(+), 6 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 0a9e37c191..bd78b440af 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -205,8 +205,9 @@ #define FIX_468_16KHZ_PUPMIX /* Dlb: Fix issue 468 for Param Upmix at 16kHz sampling rate */ #define FIX_485_STATIC_BUFFERS /* FhG: move static buffers in DirAC parameter estimator to the DirAC struct */ +#define FIX_473_JITTER_NONDIEGETIC_PANNING /* FhG,Orange: add missing non-diegetic panning to JITTER */ -/* ################## End DEVELOPMENT switches ######################### */ + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ #endif diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index 3b38e2d890..785b86834b 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -269,7 +269,11 @@ void ivas_ism_render_sf( { /* Head rotation: rotate the object positions depending the head's orientation */ +#ifdef FIX_473_JITTER_NONDIEGETIC_PANNING + if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 && !st_ivas->hIsmMetaData[i]->non_diegetic_flag ) +#else if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 ) +#endif { rotateAziEle( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &azimuth, &elevation, Rmat, st_ivas->hIntSetup.is_planar_setup ); if ( st_ivas->hEFAPdata != NULL ) diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 2ecbc9b382..d3279030d2 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -611,6 +611,9 @@ ivas_error ivas_jbm_dec_render( int16_t nchan_remapped; int32_t output_Fs; AUDIO_CONFIG output_config; +#ifdef FIX_473_JITTER_NONDIEGETIC_PANNING + float pan_left, pan_right; +#endif int16_t nSamplesAskedLocal; ivas_error error; float *p_output[MAX_OUTPUT_CHANNELS]; @@ -669,6 +672,16 @@ ivas_error ivas_jbm_dec_render( { ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, st_ivas->nchan_transport, p_output ); } +#ifdef FIX_473_JITTER_NONDIEGETIC_PANNING + else if ( st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX ) + { + *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); + pan_left = ( st_ivas->hDecoderConfig->non_diegetic_pan_gain + 1.f ) * 0.5f; + pan_right = 1.f - pan_left; + v_multc( st_ivas->hTcBuffer->tc[0], pan_right, output[1], *nSamplesRendered ); + v_multc( st_ivas->hTcBuffer->tc[0], pan_left, output[0], *nSamplesRendered ); + } +#endif else if ( st_ivas->renderer_type == RENDERER_PARAM_ISM || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) { ivas_param_ism_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ); @@ -689,6 +702,15 @@ ivas_error ivas_jbm_dec_render( /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */ ivas_ism_render_sf( st_ivas, p_output, *nSamplesRendered ); } +#ifdef FIX_473_JITTER_NONDIEGETIC_PANNING + else if ( st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX ) + { + pan_left = ( st_ivas->hDecoderConfig->non_diegetic_pan_gain + 1.f ) * 0.5f; + pan_right = 1.f - pan_left; + v_multc( st_ivas->hTcBuffer->tc[0], pan_right, output[1], *nSamplesRendered ); + v_multc( st_ivas->hTcBuffer->tc[0], pan_left, output[0], *nSamplesRendered ); + } +#endif else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) { /* Convert to Ambisonics; used also for ISM->HOA3->binaural rendering */ @@ -1655,6 +1677,9 @@ TC_BUFFER_MODE ivas_jbm_dec_get_tc_buffer_mode( Decoder_Struct *st_ivas ) case RENDERER_PARAM_ISM: case RENDERER_BINAURAL_MIXER_CONV: case RENDERER_BINAURAL_MIXER_CONV_ROOM: +#ifdef FIX_473_JITTER_NONDIEGETIC_PANNING + case RENDERER_NON_DIEGETIC_DOWNMIX: +#endif buffer_mode = TC_BUFFER_MODE_RENDERER; break; case RENDERER_MC_PARAMMC: diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index 081b33e55c..8aa2f72f45 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -113,7 +113,8 @@ void ObjRenderIVASSubframe( float *tc_local[MAX_TRANSPORT_CHANNELS]; int16_t ch, slot_size, slots_to_render, output_frame; #ifdef FIX_356_ISM_METADATA_SYNC - int16_t ism_md_subframe_update_jbm = 0; /* Number of subframes to delay metadata to sync with audio */ + int16_t ism_md_subframe_update_jbm = st_ivas->hTcBuffer->nb_subframes - 2; /* Number of subframes to delay metadata to sync with audio */ + int16_t c_indx, nS; #endif for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { @@ -145,7 +146,21 @@ void ObjRenderIVASSubframe( /* Update object position(s) */ #ifdef FIX_356_ISM_METADATA_SYNC - TDREND_Update_object_positions( st_ivas->hBinRendererTd, st_ivas->nchan_transport, st_ivas->ivas_format, st_ivas->hIsmMetaData ); + c_indx = 0; + + for ( nS = 0; nS < st_ivas->nchan_transport; nS++ ) + { + if ( !( st_ivas->ivas_format == MC_FORMAT && nS == LFE_CHANNEL ) ) /* Skip LFE for MC */ + { + st_ivas->hBinRendererTd->Sources[c_indx]->InputFrame_p = tc_local[nS]; + st_ivas->hBinRendererTd->Sources[c_indx]->SrcRend_p->InputAvailable = TRUE; + c_indx++; + } + } + if ( subframe_idx == ism_md_subframe_update_jbm ) + { + TDREND_Update_object_positions( st_ivas->hBinRendererTd, st_ivas->nchan_transport, st_ivas->ivas_format, st_ivas->hIsmMetaData ); + } #else TDREND_Update_object_positions( st_ivas->hBinRendererTd, st_ivas->nchan_transport, LFE_CHANNEL, st_ivas->ivas_format, st_ivas->hIsmMetaData, tc_local ); #endif @@ -163,7 +178,7 @@ void ObjRenderIVASSubframe( /* Render subframe */ #ifdef FIX_356_ISM_METADATA_SYNC - TDREND_GetMix( st_ivas->hBinRendererTd, output_f_local, output_frame, 0, ism_md_subframe_update_jbm ); + TDREND_GetMix( st_ivas->hBinRendererTd, output_f_local, output_frame, 0, ism_md_subframe_update_jbm != subframe_idx ); #else TDREND_GetMix( st_ivas->hBinRendererTd, output_f_local, output_frame, 0 ); #endif diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 07166b8ddb..2b04b15c85 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -891,8 +891,20 @@ static ivas_error IVAS_DEC_Setup( if ( hIvasDec->mode == IVAS_DEC_MODE_EVS ) { - *nTransportChannels = 1; - *nOutChannels = 1; +#ifdef FIX_473_JITTER_NONDIEGETIC_PANNING + if ( hIvasDec->st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX ) + { + *nTransportChannels = MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN; + *nOutChannels = MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN; + } + else + { +#endif + *nTransportChannels = 1; + *nOutChannels = 1; +#ifdef FIX_473_JITTER_NONDIEGETIC_PANNING + } +#endif } else { @@ -2909,7 +2921,11 @@ static ivas_error evs_dec_main( if ( floatBuf != NULL ) { /* BE workaround */ +#ifdef FIX_473_JITTER_NONDIEGETIC_PANNING + int16_t pcm_buf_local[L_FRAME48k * MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN]; +#else int16_t pcm_buf_local[L_FRAME48k]; +#endif /* convert 'float' output data to 'short' */ -- GitLab From 20e060837432cce77ea22c40ca3c0f3229c56bc1 Mon Sep 17 00:00:00 2001 From: Simon Plain Date: Wed, 24 May 2023 11:23:59 +0200 Subject: [PATCH 312/331] Change enum to typedef enum --- lib_com/cnst.h | 4 ++-- lib_com/ivas_cov_smooth.c | 11 +++++------ lib_com/ivas_prot.h | 4 ++-- lib_enc/ivas_enc_cov_handler.c | 2 +- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/lib_com/cnst.h b/lib_com/cnst.h index 15582180c0..a35f5280c2 100644 --- a/lib_com/cnst.h +++ b/lib_com/cnst.h @@ -2241,11 +2241,11 @@ enum }; #ifdef FIX_489_COV_SMOOTHING -enum +typedef enum _COV_SMOOTHING_TYPE { COV_SMOOTH_SPAR, COV_SMOOTH_MC -}; +} COV_SMOOTHING_TYPE; #endif /* clang-format on */ diff --git a/lib_com/ivas_cov_smooth.c b/lib_com/ivas_cov_smooth.c index 219c315a07..e407bccc6c 100644 --- a/lib_com/ivas_cov_smooth.c +++ b/lib_com/ivas_cov_smooth.c @@ -35,13 +35,12 @@ #ifdef DEBUGGING #include "debug.h" #endif -#include "ivas_prot.h" -#include "wmc_auto.h" -#include "prot.h" - #ifdef FIX_489_COV_SMOOTHING #include "cnst.h" #endif +#include "ivas_prot.h" +#include "wmc_auto.h" +#include "prot.h" #define BAND_SMOOTH_REST_START_IDX ( 2 ) /*-----------------------------------------------------------------------------------------* @@ -57,7 +56,7 @@ static void ivas_set_up_cov_smoothing( const int16_t min_pool_size #ifdef FIX_489_COV_SMOOTHING , - const int16_t smooth_mode /* i : flag multichannel vs SPAR */ + const COV_SMOOTHING_TYPE smooth_mode /* i : flag multichannel vs SPAR */ #endif , const int32_t ivas_total_brate ) @@ -161,7 +160,7 @@ ivas_error ivas_spar_covar_smooth_enc_open( const int16_t nchan_inp /* i : number of input channels */ , #ifdef FIX_489_COV_SMOOTHING - int16_t smooth_mode, /* i : Smooth covariance for SPAR or MC */ + COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC */ #endif const int32_t ivas_total_brate /* i : IVAS total bitrate */ ) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 36db649e09..650473d852 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -4734,7 +4734,7 @@ ivas_error ivas_spar_covar_enc_open( const int16_t nchan_inp /* i : number of input channels */ , #ifdef FIX_489_COV_SMOOTHING - int16_t smooth_mode, /* i : Smooth covariance for SPAR or MC*/ + COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC*/ #endif const int32_t ivas_total_brate /* i : IVAS total bitrate */ ); @@ -4767,7 +4767,7 @@ ivas_error ivas_spar_covar_smooth_enc_open( const int16_t nchan_inp /* i : number of input channels */ , #ifdef FIX_489_COV_SMOOTHING - int16_t smooth_mode, /* i : Smooth covariance for SPAR or MC*/ + COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC*/ #endif const int32_t ivas_total_brate /* i : IVAS total bitrate */ ); diff --git a/lib_enc/ivas_enc_cov_handler.c b/lib_enc/ivas_enc_cov_handler.c index 905a55d333..61c4ccaef9 100644 --- a/lib_enc/ivas_enc_cov_handler.c +++ b/lib_enc/ivas_enc_cov_handler.c @@ -69,7 +69,7 @@ ivas_error ivas_spar_covar_enc_open( const int16_t nchan_inp /* i : number of input channels */ , #ifdef FIX_489_COV_SMOOTHING - int16_t smooth_mode, /* i : Smooth covariance for SPAR or MC */ + COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC */ #endif const int32_t ivas_total_brate /* i : IVAS total bitrate */ ) -- GitLab From f59a77898b01f4f59a2f7d4936d1df451b3f450a Mon Sep 17 00:00:00 2001 From: Vladimir Malenovsky Date: Wed, 24 May 2023 12:27:47 +0200 Subject: [PATCH 313/331] decrement the last index of the for loop to avoid ASAN error --- lib_com/options.h | 1 + lib_enc/ivas_qmetadata_enc.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 0a9e37c191..c9bc2c9077 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -205,6 +205,7 @@ #define FIX_468_16KHZ_PUPMIX /* Dlb: Fix issue 468 for Param Upmix at 16kHz sampling rate */ #define FIX_485_STATIC_BUFFERS /* FhG: move static buffers in DirAC parameter estimator to the DirAC struct */ +#define FIX_I503_ASAN_ERROR_IND_LIST /* VA: fix issue #503: address sanitizer error with IND_LIST_DYN */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index 40d5bff892..3bbf084a7e 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -2222,7 +2222,11 @@ void restore_metadata_buffer( int16_t i; #ifdef IND_LIST_DYN +#ifdef FIX_I503_ASAN_ERROR_IND_LIST + for ( i = next_ind_start; i < hMetaData->nb_ind_tot; i++ ) +#else for ( i = next_ind_start; i <= hMetaData->nb_ind_tot; i++ ) +#endif #else for ( i = next_ind_start; i <= hMetaData->next_ind; i++ ) #endif -- GitLab From 62a690006520a66679870ad3f8cd9c62bf84a5ca Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 24 May 2023 14:20:00 +0200 Subject: [PATCH 314/331] remove dead code in ivas_sba_prototype_renderer_sf() --- lib_com/ivas_prot.h | 8 -- lib_rend/ivas_sba_rendering.c | 161 ---------------------------------- 2 files changed, 169 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index eb023c8b20..556daf327b 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -4351,14 +4351,6 @@ void ivas_sba_mix_matrix_determiner( const int16_t output_frame /* i : output frame length */ ); -#ifdef JBM_TSM_ON_TCS -void ivas_sba_prototype_renderer_sf( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ - float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ - float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /* i : Input audio in CLDFB domain, imag */ -); -#endif - /* AGC */ /*! r: AGC enable flag */ int16_t ivas_agc_enc_get_flag( diff --git a/lib_rend/ivas_sba_rendering.c b/lib_rend/ivas_sba_rendering.c index fe57ed3e03..059cd847e1 100644 --- a/lib_rend/ivas_sba_rendering.c +++ b/lib_rend/ivas_sba_rendering.c @@ -44,167 +44,6 @@ #include "wmc_auto.h" -#ifdef JBM_TSM_ON_TCS -/*-------------------------------------------------------------------* - * ivas_sba_prototype_renderer_sf() - * - * Render prototype audio signals using SBA mixing matrices - *-------------------------------------------------------------------*/ - -void ivas_sba_prototype_renderer_sf( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ - float inRe[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ - float inIm[][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /* i : Input audio in CLDFB domain, imag */ -) -{ - float mixer_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; - SPAR_DEC_HANDLE hSpar; - DECODER_CONFIG_HANDLE hDecoderConfig; - int16_t num_spar_bands, spar_band; - int16_t b, ts; - int16_t num_cldfb_bands, numch_in, numch_out; - int16_t cldfb_band; - int16_t out_ch, in_ch; - int16_t firstInCh, inChEnd, firstOutCh, outChEnd; - int16_t slot_idx_start; - - push_wmops( "ivas_sba_prototype_renderer" ); - - hSpar = st_ivas->hSpar; - hDecoderConfig = st_ivas->hDecoderConfig; - num_spar_bands = hSpar->hFbMixer->pFb->filterbank_num_bands; - - num_cldfb_bands = hSpar->hFbMixer->pFb->fb_bin_to_band.num_cldfb_bands; - numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; - numch_out = hSpar->hFbMixer->fb_cfg->num_out_chans; - - if ( st_ivas->nchan_transport == 1 ) - { - firstInCh = 0; - inChEnd = 1; - firstOutCh = 0; - outChEnd = 1; - } - else /* 2 TC */ - { - firstInCh = 0; - inChEnd = 2; - firstOutCh = 1; - outChEnd = 2; - } - slot_idx_start = hSpar->slots_rendered; - - /* Apply mixing matrix */ - for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) - { - int16_t md_idx = hSpar->render_to_md_map[ts + slot_idx_start]; - - /* determine SPAR parameters for this time slot */ - ivas_spar_get_parameters( hSpar, hDecoderConfig, md_idx, numch_out, numch_in, num_spar_bands, mixer_mat ); - - for ( cldfb_band = 0; cldfb_band < num_cldfb_bands; cldfb_band++ ) - { - float out_re[IVAS_SPAR_MAX_CH]; - float out_im[IVAS_SPAR_MAX_CH]; - float cldfb_par; - ivas_fb_bin_to_band_data_t *bin2band = &hSpar->hFbMixer->pFb->fb_bin_to_band; - - for ( out_ch = firstOutCh; out_ch < outChEnd; out_ch++ ) - { - out_re[out_ch] = 0.0f; - out_im[out_ch] = 0.0f; - - for ( in_ch = firstInCh; in_ch < inChEnd; in_ch++ ) - { - if ( cldfb_band < CLDFB_PAR_WEIGHT_START_BAND ) /* tuning parameter, depends on how much SPAR Filters overlap for the CLDFB bands */ - { - spar_band = bin2band->p_cldfb_map_to_spar_band[cldfb_band]; - cldfb_par = mixer_mat[out_ch][in_ch][spar_band]; - } - else - { - cldfb_par = 0.0f; - for ( spar_band = bin2band->p_spar_start_bands[cldfb_band]; spar_band < num_spar_bands; spar_band++ ) - { - /* accumulate contributions from all SPAR bands */ - cldfb_par += mixer_mat[out_ch][in_ch][spar_band] * bin2band->pp_cldfb_weights_per_spar_band[cldfb_band][spar_band]; - } - } - - out_re[out_ch] += inRe[in_ch][ts][cldfb_band] * cldfb_par; - out_im[out_ch] += inIm[in_ch][ts][cldfb_band] * cldfb_par; - } - } - - /*update CLDFB data with the parameter-modified data*/ - for ( out_ch = firstOutCh; out_ch < outChEnd; out_ch++ ) - { - inRe[out_ch][ts][cldfb_band] = out_re[out_ch]; - inIm[out_ch][ts][cldfb_band] = out_im[out_ch]; - } - } - - /* Update mixing matrices */ - if ( ( ( slot_idx_start + ts + 1 ) == hSpar->num_slots ) || ( ( md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME ) != ( hSpar->render_to_md_map[ts + slot_idx_start + 1] / JBM_CLDFB_SLOTS_IN_SUBFRAME ) ) ) - { - /* we have crossed an unadapted parameter sf border, update previous mixing matrices */ - int16_t md_sf = md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME; - hSpar->i_subframe++; - hSpar->i_subframe = min( hSpar->i_subframe, MAX_PARAM_SPATIAL_SUBFRAMES ); - mvr2r( hSpar->hMdDec->mixer_mat_prev[1][0][0], hSpar->hMdDec->mixer_mat_prev[0][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); - mvr2r( hSpar->hMdDec->mixer_mat_prev[2][0][0], hSpar->hMdDec->mixer_mat_prev[1][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); - mvr2r( hSpar->hMdDec->mixer_mat_prev[3][0][0], hSpar->hMdDec->mixer_mat_prev[2][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); - mvr2r( hSpar->hMdDec->mixer_mat_prev[4][0][0], hSpar->hMdDec->mixer_mat_prev[3][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); - - for ( out_ch = 0; out_ch < numch_out; out_ch++ ) - { - for ( in_ch = 0; in_ch < numch_in; in_ch++ ) - { - for ( b = 0; b < num_spar_bands; b++ ) - { - hSpar->hMdDec->mixer_mat_prev[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][b + md_sf * IVAS_MAX_NUM_BANDS]; - } - } - } - } - } - - /* Create prototypes */ - if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) - { - for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) - { - if ( st_ivas->nchan_transport == 1 ) /* Dual mono */ - { - mvr2r( inRe[0][ts], inRe[1][ts], CLDFB_NO_CHANNELS_MAX ); - mvr2r( inIm[0][ts], inIm[1][ts], CLDFB_NO_CHANNELS_MAX ); - } - else if ( st_ivas->nchan_transport == 2 ) /* Opposing cardioids */ - { - float temp_signal[CLDFB_NO_CHANNELS_MAX]; - - v_add( inRe[0][ts], inRe[1][ts], temp_signal, CLDFB_NO_CHANNELS_MAX ); - v_sub( inRe[0][ts], inRe[1][ts], inRe[1][ts], CLDFB_NO_CHANNELS_MAX ); - mvr2r( temp_signal, inRe[0][ts], CLDFB_NO_CHANNELS_MAX ); - v_multc( inRe[0][ts], 0.5f, inRe[0][ts], CLDFB_NO_CHANNELS_MAX ); - v_multc( inRe[1][ts], 0.5f, inRe[1][ts], CLDFB_NO_CHANNELS_MAX ); - - v_add( inIm[0][ts], inIm[1][ts], temp_signal, CLDFB_NO_CHANNELS_MAX ); - v_sub( inIm[0][ts], inIm[1][ts], inIm[1][ts], CLDFB_NO_CHANNELS_MAX ); - mvr2r( temp_signal, inIm[0][ts], CLDFB_NO_CHANNELS_MAX ); - v_multc( inIm[0][ts], 0.5f, inIm[0][ts], CLDFB_NO_CHANNELS_MAX ); - v_multc( inIm[1][ts], 0.5f, inIm[1][ts], CLDFB_NO_CHANNELS_MAX ); - } - } - } - - pop_wmops(); - - return; -} -#endif - - /*-------------------------------------------------------------------* * ivas_sba_prototype_renderer() * -- GitLab From 7b1e13d589b4dcea8939cca4e1f1a979959eba79 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 24 May 2023 14:24:12 +0200 Subject: [PATCH 315/331] put pcmdsp_fifo_write_zero() under DEBUGGING --- lib_dec/jbm_pcmdsp_fifo.c | 2 ++ lib_dec/jbm_pcmdsp_fifo.h | 3 +++ lib_dec/lib_dec.c | 2 ++ 3 files changed, 7 insertions(+) diff --git a/lib_dec/jbm_pcmdsp_fifo.c b/lib_dec/jbm_pcmdsp_fifo.c index fd0df04ca8..108b069402 100644 --- a/lib_dec/jbm_pcmdsp_fifo.c +++ b/lib_dec/jbm_pcmdsp_fifo.c @@ -176,6 +176,7 @@ int16_t pcmdsp_fifo_write( } #ifdef JBM_TSM_ON_TCS +#ifdef DEBUGGING /* Writes the given audio data to the FIFO. */ int16_t pcmdsp_fifo_write_zero( PCMDSP_FIFO_HANDLE h, @@ -217,6 +218,7 @@ int16_t pcmdsp_fifo_write_zero( return 0; } #endif +#endif /* Reads the given number of audio samples from the FIFO. */ int16_t pcmdsp_fifo_read( diff --git a/lib_dec/jbm_pcmdsp_fifo.h b/lib_dec/jbm_pcmdsp_fifo.h index e6c64dc9e8..d16bd2b8d2 100644 --- a/lib_dec/jbm_pcmdsp_fifo.h +++ b/lib_dec/jbm_pcmdsp_fifo.h @@ -73,9 +73,12 @@ void pcmdsp_fifo_destroy( PCMDSP_FIFO_HANDLE *ph ); ivas_error pcmdsp_fifo_init( PCMDSP_FIFO_HANDLE h, uint16_t nSamplesPerChannel, uint16_t nChannels, uint16_t nBytesPerSample ); int16_t pcmdsp_fifo_write( PCMDSP_FIFO_HANDLE h, const uint8_t *samples, uint16_t nSamplesPerChannel ); + #ifdef JBM_TSM_ON_TCS +#ifdef DEBUGGING int16_t pcmdsp_fifo_write_zero( PCMDSP_FIFO_HANDLE h, uint16_t nSamplesPerChannel ); #endif +#endif int16_t pcmdsp_fifo_read( PCMDSP_FIFO_HANDLE h, uint16_t nSamplesPerChannel, uint8_t *samples ); diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 0b1cf119ac..b2fd7feeab 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1977,11 +1977,13 @@ ivas_error IVAS_DEC_VoIP_GetSamples( nSamplesTcsScaled = hVoIP->nSamplesFrame; if ( hVoIP->hFifoOut != NULL ) { +#ifdef DEBUGGING /* feed zeros to FIFO */ if ( pcmdsp_fifo_write_zero( hVoIP->hFifoOut, nSamplesTcsScaled ) != 0 ) { return IVAS_ERR_UNKNOWN; } +#endif } else { -- GitLab From 7d6579d0a7a6aff7fa9662aa2ed4b954a6996123 Mon Sep 17 00:00:00 2001 From: Jouni Paulus Date: Wed, 24 May 2023 15:17:06 +0200 Subject: [PATCH 316/331] issue #502: adjust the index list sizes for MASA content based on a set of items. modifications under switch FIX_502_IND_LIST_SIZE. --- lib_com/bitstream.c | 28 ++++++++++++++++++++++++++++ lib_com/options.h | 2 ++ 2 files changed, 30 insertions(+) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index d2aae93ed4..981dc80328 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -791,7 +791,11 @@ int16_t get_ivas_max_num_indices_metadata( /* o } else if ( ivas_total_brate <= IVAS_32k ) { +#ifdef FIX_502_IND_LIST_SIZE + return 125; +#else return 110; +#endif } else if ( ivas_total_brate <= IVAS_48k ) { @@ -799,23 +803,43 @@ int16_t get_ivas_max_num_indices_metadata( /* o } else if ( ivas_total_brate <= IVAS_96k ) { +#ifdef FIX_502_IND_LIST_SIZE + return 240; +#else return 200; +#endif } else if ( ivas_total_brate <= IVAS_128k ) { +#ifdef FIX_502_IND_LIST_SIZE + return 305; +#else return 250; +#endif } else if ( ivas_total_brate <= IVAS_160k ) { +#ifdef FIX_502_IND_LIST_SIZE + return 425; +#else return 320; +#endif } else if ( ivas_total_brate <= IVAS_192k ) { +#ifdef FIX_502_IND_LIST_SIZE + return 630; +#else return 430; +#endif } else if ( ivas_total_brate <= IVAS_256k ) { +#ifdef FIX_502_IND_LIST_SIZE + return 850; +#else return 600; +#endif } else if ( ivas_total_brate <= IVAS_384k ) { @@ -823,7 +847,11 @@ int16_t get_ivas_max_num_indices_metadata( /* o } else { +#ifdef FIX_502_IND_LIST_SIZE + return 1750; +#else return 1500; +#endif } } else if ( ivas_format == MC_FORMAT ) diff --git a/lib_com/options.h b/lib_com/options.h index bc6458d295..8d441cb9f1 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -208,6 +208,8 @@ #define FIX_485_STATIC_BUFFERS /* FhG: move static buffers in DirAC parameter estimator to the DirAC struct */ +#define FIX_502_IND_LIST_SIZE /* Fix issue #502: insufficient index buffer sizes */ + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ -- GitLab From cad2671fe80e5c180d48e97fac0c77fd818a0bd2 Mon Sep 17 00:00:00 2001 From: rhb Date: Wed, 24 May 2023 16:42:45 +0200 Subject: [PATCH 317/331] add FIX_483b which fixes use of uninitialized values in ivas_mct_core_enc --- lib_com/bitstream.c | 4 ++++ lib_com/options.h | 3 ++- lib_com/rom_com.c | 4 ++++ lib_enc/ivas_mct_core_enc.c | 9 +++++++++ lib_enc/ivas_stereo_mdct_stereo_enc.c | 4 ++++ 5 files changed, 23 insertions(+), 1 deletion(-) mode change 100644 => 100755 lib_com/bitstream.c mode change 100644 => 100755 lib_com/options.h mode change 100644 => 100755 lib_com/rom_com.c mode change 100644 => 100755 lib_enc/ivas_mct_core_enc.c mode change 100644 => 100755 lib_enc/ivas_stereo_mdct_stereo_enc.c diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c old mode 100644 new mode 100755 index d2aae93ed4..95704e1a26 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -772,7 +772,11 @@ int16_t get_ivas_max_num_indices_metadata( /* o } else if ( ivas_total_brate <= IVAS_256k ) { +#ifdef FIX_483b + return 1050; +#else return 1000; +#endif } else if ( ivas_total_brate <= IVAS_384k ) { diff --git a/lib_com/options.h b/lib_com/options.h old mode 100644 new mode 100755 index a82400fe34..fc88856516 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -206,7 +206,8 @@ #define FIX_485_STATIC_BUFFERS /* FhG: move static buffers in DirAC parameter estimator to the DirAC struct */ -#define FIX_483 /* FhG: fix usse 483, division by zero in nois_est */ +#define FIX_483 /* FhG: fix issue 483, division by zero in nois_est */ +#define FIX_483b /* FhG: fix issue 483, uninitialized values in ivas_mct_core_enc */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_com/rom_com.c b/lib_com/rom_com.c old mode 100644 new mode 100755 index e4b8ec9db9..3694cbf4be --- a/lib_com/rom_com.c +++ b/lib_com/rom_com.c @@ -21643,7 +21643,11 @@ const int16_t igf_tile_offset_table[IGF_BITRATE_UNKNOWN][2*IGF_MAX_TILES+1] = { { 4, 1, 0, 2, 40, 3, 80, 4, 140 }, /* 48000 FB (stereo TCX10) */ { 5, 2, 80, 4, 128, 6, 144, 7, 212, 9, 160 }, /* 64000 FB (stereo) */ { 3, 2, 212, 4, 280, 6, 200 }, /* 80000 FB (stereo) */ +#if 1 + { 2, 3, 200, 5, 240}, /* 96000 FB (stereo) */ +#else { 2, 3, 320, 5, 240}, /* 96000 FB (stereo) */ +#endif { 1, 2, 416} /*128000 FB (stereo) */ }; diff --git a/lib_enc/ivas_mct_core_enc.c b/lib_enc/ivas_mct_core_enc.c old mode 100644 new mode 100755 index 3bd05fca92..48a7abc42f --- a/lib_enc/ivas_mct_core_enc.c +++ b/lib_enc/ivas_mct_core_enc.c @@ -264,6 +264,11 @@ void ivas_mct_core_enc( sp_aud_decision0[i] = hCPE[cpe_id]->hCoreCoder[0]->sp_aud_decision0; +#ifdef FIX_483b + sts[i]->hTcxEnc->tns_ms_flag[0] = 0; + sts[i]->hTcxEnc->tns_ms_flag[1] = 0; +#endif + i++; } } @@ -339,7 +344,11 @@ void ivas_mct_core_enc( for ( n = 0; n < nSubframes; n++ ) { +#ifdef FIX_483b + if ( sts[ch]->hTcxEnc->tns_ms_flag[n] ) +#else if ( !sts[ch]->hTcxEnc->fUseTns[n] /*!sts[0]->fUseTns[n] && !sts[1]->fUseTns[n]*/ ) +#endif { /* power spectrum: MDCT^2 + MDST^2 */ for ( i = 0; i < L_subframeTCX; i++ ) diff --git a/lib_enc/ivas_stereo_mdct_stereo_enc.c b/lib_enc/ivas_stereo_mdct_stereo_enc.c old mode 100644 new mode 100755 index 4ef24de8a1..138c9436d6 --- a/lib_enc/ivas_stereo_mdct_stereo_enc.c +++ b/lib_enc/ivas_stereo_mdct_stereo_enc.c @@ -430,6 +430,10 @@ void stereo_coder_tcx( if ( !sts[0]->hTcxEnc->fUseTns[k] && !sts[1]->hTcxEnc->fUseTns[k] ) { +#ifdef FIX_483b + sts[0]->hTcxEnc->tns_ms_flag[k] = 1; + sts[1]->hTcxEnc->tns_ms_flag[k] = 1; +#endif ms_inv_mask_processing( hStereoMdct, sts, ms_mask, k, mdst_spectrum[0][k], mdst_spectrum[1][k], inv_mdst_spectrum[0][k], inv_mdst_spectrum[1][k], -1 ); ms_processing( hStereoMdct, sts, ms_mask, k, mdst_spectrum[0][k], mdst_spectrum[1][k], sfbConf->sfbCnt ); } -- GitLab From 9f00adc435f3a0576b6a503fc1871502671b3618 Mon Sep 17 00:00:00 2001 From: rhb Date: Wed, 24 May 2023 16:48:39 +0200 Subject: [PATCH 318/331] fix mistake of previous commit --- lib_com/rom_com.c | 4 ---- lib_enc/stat_enc.h | 4 ++++ 2 files changed, 4 insertions(+), 4 deletions(-) mode change 100644 => 100755 lib_enc/stat_enc.h diff --git a/lib_com/rom_com.c b/lib_com/rom_com.c index 3694cbf4be..e4b8ec9db9 100755 --- a/lib_com/rom_com.c +++ b/lib_com/rom_com.c @@ -21643,11 +21643,7 @@ const int16_t igf_tile_offset_table[IGF_BITRATE_UNKNOWN][2*IGF_MAX_TILES+1] = { { 4, 1, 0, 2, 40, 3, 80, 4, 140 }, /* 48000 FB (stereo TCX10) */ { 5, 2, 80, 4, 128, 6, 144, 7, 212, 9, 160 }, /* 64000 FB (stereo) */ { 3, 2, 212, 4, 280, 6, 200 }, /* 80000 FB (stereo) */ -#if 1 - { 2, 3, 200, 5, 240}, /* 96000 FB (stereo) */ -#else { 2, 3, 320, 5, 240}, /* 96000 FB (stereo) */ -#endif { 1, 2, 416} /*128000 FB (stereo) */ }; diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h old mode 100644 new mode 100755 index 77c0ea3d34..1a5c893dbd --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -1121,6 +1121,10 @@ typedef struct tcx_enc_structure float *acelp_zir; float tcx_target_bits_fac; +#ifdef FIX_483b + int16_t tns_ms_flag[2]; +#endif + } TCX_ENC_DATA, *TCX_ENC_HANDLE; /*----------------------------------------------------------------------------------* * -- GitLab From 548d03a3f9d9da9aa4befdd71d02e7ecab86470e Mon Sep 17 00:00:00 2001 From: Jouni Paulus Date: Thu, 25 May 2023 09:51:33 +0200 Subject: [PATCH 319/331] adjust the index buffer size for MASA 48kbps --- lib_com/bitstream.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index 981dc80328..5ba6577faf 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -799,7 +799,11 @@ int16_t get_ivas_max_num_indices_metadata( /* o } else if ( ivas_total_brate <= IVAS_48k ) { +#ifdef FIX_502_IND_LIST_SIZE + return 205; +#else return 180; +#endif } else if ( ivas_total_brate <= IVAS_96k ) { -- GitLab From 904e60ff58a02c59dd122e62256def15c0cd878a Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Thu, 25 May 2023 10:01:24 +0200 Subject: [PATCH 320/331] Minor cleanup --- lib_dec/ivas_objectRenderer_internal.c | 6 +++++- lib_dec/lib_dec.c | 5 +++-- lib_dec/lib_dec.h | 7 ++++--- lib_rend/ivas_objectRenderer.c | 23 +++++++++++++---------- lib_rend/ivas_prot_rend.h | 5 +++-- 5 files changed, 28 insertions(+), 18 deletions(-) diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index 8f7fd378f7..d87852ecbe 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -77,6 +77,7 @@ ivas_error ivas_td_binaural_renderer( { #ifdef FIX_356_ISM_METADATA_SYNC int16_t ism_md_subframe_update; + if ( st_ivas->hDecoderConfig->Opt_delay_comp ) { ism_md_subframe_update = 1; @@ -121,7 +122,10 @@ void ObjRenderIVASSubframe( float *tc_local[MAX_TRANSPORT_CHANNELS]; int16_t ch, slot_size, slots_to_render, output_frame; #ifdef FIX_356_ISM_METADATA_SYNC - int16_t ism_md_subframe_update_jbm = 0; /* Number of subframes to delay metadata to sync with audio */ + int16_t ism_md_subframe_update_jbm; /* Number of subframes to delay metadata to sync with audio */ + + ism_md_subframe_update_jbm = 0; + #endif for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 4488a2a9af..98e9723fae 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -447,10 +447,11 @@ ivas_error IVAS_DEC_Configure( #endif const int16_t renderConfigEnabled, /* i : enable Renderer config. file for binaural output */ const int16_t Opt_non_diegetic_pan, /* i : diegetic or not */ - const float non_diegetic_pan_gain /* i : non diegetic panning gain */ #ifdef FIX_356_ISM_METADATA_SYNC - , + const float non_diegetic_pan_gain, /* i : non diegetic panning gain */ const int16_t delayCompensationEnabled /* i : enable delay compensation */ +#else + const float non_diegetic_pan_gain /* i : non diegetic panning gain */ #endif ) { diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index 03c2ea1ebd..d8418916e2 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -152,10 +152,11 @@ ivas_error IVAS_DEC_Configure( #endif const int16_t renderConfigEnabled, /* i : enable Renderer config. file for binaural output */ const int16_t Opt_non_diegetic_pan, /* i : diegetic or not */ - const float non_diegetic_pan_gain /* i : non diegetic panning gain */ #ifdef FIX_356_ISM_METADATA_SYNC - , - const int16_t delayCompensationEnabled /* i : enable delay compensation */ + const float non_diegetic_pan_gain, /* i : non diegetic panning gain */ + const int16_t delayCompensationEnabled /* i : enable delay compensation */ +#else + const float non_diegetic_pan_gain /* i : non diegetic panning gain */ #endif ); diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 3d929e78c7..875dd5d4a2 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -278,6 +278,9 @@ ivas_error ivas_td_binaural_renderer_unwrap( int16_t subframe_idx; float reverb_signal[BINAURAL_CHANNELS][L_FRAME48k]; ivas_error error; +#ifdef FIX_356_ISM_METADATA_SYNC + int16_t c_indx, nS; +#endif #ifdef JBM_TSM_ON_TCS float *p_reverb_signal[BINAURAL_CHANNELS]; int16_t ch; @@ -291,9 +294,7 @@ ivas_error ivas_td_binaural_renderer_unwrap( subframe_length = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES; #ifdef FIX_356_ISM_METADATA_SYNC - int16_t c_indx, nS; c_indx = 0; - for ( nS = 0; nS < num_src; nS++ ) { if ( !( ivas_format == MC_FORMAT && nS == lfe_idx ) ) /* Skip LFE for MC */ @@ -369,10 +370,11 @@ ivas_error TDREND_GetMix( float output[][L_FRAME48k], /* i/o: ISM object synth / rendered output in 0,1 */ #endif const int16_t subframe_length, /* i/o: subframe length */ - const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ #ifdef FIX_356_ISM_METADATA_SYNC - , + const int16_t subframe_idx, /* i : Subframe index to 5 ms subframe */ const int16_t ism_md_subframe_update /* Number of subframes to delay ism metadata to sync with audio */ +#else + const int16_t subframe_idx, /* i : Subframe index to 5 ms subframe */ #endif ) { @@ -386,9 +388,9 @@ ivas_error TDREND_GetMix( float hrf_right_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; int16_t intp_count; float pan_left, pan_right; - #ifdef FIX_356_ISM_METADATA_SYNC int16_t subframe_update_flag; + subframe_update_flag = subframe_idx == ism_md_subframe_update; #endif @@ -415,13 +417,11 @@ ivas_error TDREND_GetMix( if ( ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING ) && ( hBinRendererTd->Listener_p->PoseUpdated || SrcSpatial_p->Updated ) ) { TDREND_SRC_REND_UpdateFiltersFromSpatialParams( hBinRendererTd, SrcRend_p, SrcSpatial_p, Src_p->hrf_left_prev, - Src_p->hrf_right_prev, hrf_left_delta, hrf_right_delta, &intp_count, &Src_p->filterlength, &Src_p->itd, &Src_p->Gain, Src_p, #ifdef FIX_356_ISM_METADATA_SYNC - subframe_update_flag + Src_p->hrf_right_prev, hrf_left_delta, hrf_right_delta, &intp_count, &Src_p->filterlength, &Src_p->itd, &Src_p->Gain, Src_p, subframe_update_flag ); #else - subframe_idx + Src_p->hrf_right_prev, hrf_left_delta, hrf_right_delta, &intp_count, &Src_p->filterlength, &Src_p->itd, &Src_p->Gain, Src_p, subframe_idx ); #endif - ); } /* Render source if needed */ @@ -691,7 +691,7 @@ ivas_error ivas_td_binaural_renderer_ext( AUDIO_CONFIG transport_config; ivas_error error; #ifdef FIX_356_ISM_METADATA_SYNC - int16_t ism_md_subframe_update_ext = 0; + int16_t ism_md_subframe_update_ext; #endif #ifdef JBM_TSM_ON_TCS float *p_output[MAX_OUTPUT_CHANNELS]; @@ -708,6 +708,9 @@ ivas_error ivas_td_binaural_renderer_ext( inConfigType = getAudioConfigType( inConfig ); lfe_idx = LFE_CHANNEL; hIsmMetaData[0] = NULL; +#ifdef FIX_356_ISM_METADATA_SYNC + ism_md_subframe_update_ext = 0; +#endif if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) { diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index bcd56aa643..de652e6f98 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -291,10 +291,11 @@ ivas_error TDREND_GetMix( float output[][L_FRAME48k], /* i/o: ISM object synth / rendered output in 0,1 */ #endif const int16_t subframe_length, /* i/o: subframe length */ - const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ #ifdef FIX_356_ISM_METADATA_SYNC - , + const int16_t subframe_idx, /* i : Subframe index to 5 ms subframe */ const int16_t ism_md_subframe_update /* Number of subframes to delay metadata to sync with audio */ +#else + const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ #endif ); -- GitLab From 1f106a026f0b868e27dffe30d52aa88f266063af Mon Sep 17 00:00:00 2001 From: Jouni Paulus Date: Thu, 25 May 2023 10:31:50 +0200 Subject: [PATCH 321/331] fix memory leak in specific MASA encoding conditions by re-using the existing spherical indexing struct. switch: FIX_505_MASA_SPHGRID_REUSE. --- lib_com/options.h | 3 +++ lib_enc/ivas_masa_enc.c | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index deb91f1805..2d1ac97a23 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -210,6 +210,9 @@ #define FIX_I503_ASAN_ERROR_IND_LIST /* VA: fix issue #503: address sanitizer error with IND_LIST_DYN */ #define FIX_473_JITTER_NONDIEGETIC_PANNING /* FhG,Orange: add missing non-diegetic panning to JITTER */ +#ifdef HR_METADATA +#define FIX_505_MASA_SPHGRID_REUSE /* Nokia: Fix issue #505: MASA spherical grid reuse fix */ +#endif /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 0c768f1a17..e62a38f380 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -65,6 +65,10 @@ static void average_masa_metadata( MASA_METADATA_FRAME *masaMetadata, float ener #ifdef HR_METADATA , const SPHERICAL_GRID_DATA *sphGrid +#ifdef FIX_505_MASA_SPHGRID_REUSE + , + const uint8_t useSphGrid +#endif #endif ); @@ -505,7 +509,9 @@ ivas_error ivas_masa_enc_config( #endif ivas_error error; #ifdef HR_METADATA +#ifndef FIX_505_MASA_SPHGRID_REUSE SPHERICAL_GRID_DATA *sphGrid; +#endif #endif error = IVAS_ERR_OK; @@ -528,6 +534,7 @@ ivas_error ivas_masa_enc_config( if ( hMasa->data.sync_state.frame_mode == MASA_FRAME_1SF && hMasa->data.sync_state.prev_offset != 0 ) { #ifdef HR_METADATA +#ifndef FIX_505_MASA_SPHGRID_REUSE if ( ( sphGrid = (SPHERICAL_GRID_DATA *) malloc( sizeof( SPHERICAL_GRID_DATA ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA spherical grid\n" ) ); @@ -541,13 +548,19 @@ ivas_error ivas_masa_enc_config( { sphGrid->no_theta = 0; } +#endif #endif /* average over sub-frames */ average_masa_metadata( &( hMasa->masaMetadata ), hMasa->data.energy #ifdef HR_METADATA , +#ifdef FIX_505_MASA_SPHGRID_REUSE + &( hMasa->data.Sph_Grid16 ), + ivas_total_brate == IVAS_512k ? TRUE : FALSE +#else sphGrid +#endif #endif ); } @@ -1826,6 +1839,10 @@ static void average_masa_metadata( #ifdef HR_METADATA , const SPHERICAL_GRID_DATA *Sph_Grid16 +#ifdef FIX_505_MASA_SPHGRID_REUSE + , + const uint8_t useSphGrid +#endif #endif ) { @@ -1875,7 +1892,11 @@ static void average_masa_metadata( hMeta->directional_meta[i].azimuth[j][k] = atan2f( y_sum, x_sum ) / EVS_PI * 180.0f; hMeta->directional_meta[i].elevation[j][k] = atan2f( z_sum, sqrtf( x_sum * x_sum + y_sum * y_sum ) ) / EVS_PI * 180.0f; #ifdef HR_METADATA +#ifdef FIX_505_MASA_SPHGRID_REUSE + if ( useSphGrid == TRUE ) +#else if ( Sph_Grid16->no_theta > 0 ) +#endif { hMeta->directional_meta[i].spherical_index[j][k] = index_theta_phi_16( &( hMeta->directional_meta[i].elevation[j][k] ), &( hMeta->directional_meta[i].azimuth[j][k] ), Sph_Grid16 ); -- GitLab From bd631ff1c43390f2f851ce21e69429976af60e7a Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Thu, 25 May 2023 10:41:15 +0200 Subject: [PATCH 322/331] Minor merge fix for compiling without JBM_TSM_ON_TCS --- lib_rend/ivas_objectRenderer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 875dd5d4a2..24885fe55a 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -757,7 +757,7 @@ ivas_error ivas_td_binaural_renderer_ext( #ifdef FIX_356_ISM_METADATA_SYNC if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, ( headRotData != NULL ) ? headRotData->headPositions : NULL, - ( headRotData != NULL ) ? headRotData->Pos : NULL, ism_md_subframe_update, output, output_frame ) ) != IVAS_ERR_OK ) + ( headRotData != NULL ) ? headRotData->Pos : NULL, ism_md_subframe_update_ext, output, output_frame ) ) != IVAS_ERR_OK ) #else if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, ( headRotData != NULL ) ? headRotData->headPositions : NULL, -- GitLab From ce840f8834dfe7eca862b6f5a0e67adf2b58e902 Mon Sep 17 00:00:00 2001 From: Sumeyra Kanik Date: Thu, 25 May 2023 10:51:16 +0200 Subject: [PATCH 323/331] Minor cleanup Cont. --- lib_rend/ivas_objectRenderer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 24885fe55a..b6427949a0 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -374,7 +374,7 @@ ivas_error TDREND_GetMix( const int16_t subframe_idx, /* i : Subframe index to 5 ms subframe */ const int16_t ism_md_subframe_update /* Number of subframes to delay ism metadata to sync with audio */ #else - const int16_t subframe_idx, /* i : Subframe index to 5 ms subframe */ + const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ #endif ) { -- GitLab From aa7e0f4a407649e8cdbd133017b00ad51bad6306 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Thu, 25 May 2023 11:48:08 +0200 Subject: [PATCH 324/331] Add fix for JBM operation under FIX_356_ISM_METADATA_SYNC --- lib_dec/ivas_objectRenderer_internal.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index 7a44c602cc..1849ce6bdf 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -125,7 +125,15 @@ void ObjRenderIVASSubframe( int16_t ism_md_subframe_update_jbm; int16_t c_indx, nS; - ism_md_subframe_update_jbm = st_ivas->hTcBuffer->nb_subframes - 2; /* Number of subframes to delay metadata to sync with audio */ + /* Number of subframes to delay metadata to sync with audio */ + if ( st_ivas->hDecoderConfig->Opt_delay_comp ) + { + ism_md_subframe_update_jbm = max( 0, st_ivas->hTcBuffer->nb_subframes - 3 ); + } + else + { + ism_md_subframe_update_jbm = st_ivas->hTcBuffer->nb_subframes - 2; + } #endif for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) -- GitLab From 807246f52edaa7c78fa2ee4ceb10df3455854a1f Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Thu, 25 May 2023 13:32:36 +0200 Subject: [PATCH 325/331] adress remaining ToDo comments, mainly invalid, last valid one done --- lib_dec/ivas_jbm_dec.c | 1 - lib_dec/lib_dec.c | 33 ++++++++++++++++++++++++++++----- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index e9c5fc91e9..0c37da2bdf 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -1732,7 +1732,6 @@ TC_BUFFER_MODE ivas_jbm_dec_get_tc_buffer_mode( TC_BUFFER_MODE buffer_mode; buffer_mode = TC_BUFFER_MODE_BUFFER; - /*:TODO: wrap this maybe nicer without directly accessing the st_ivas struct...*/ switch ( st_ivas->renderer_type ) { /* all renderers where we are done after TC decoding (might include DMX to mono/stereo */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index b2fd7feeab..fc8716c9c1 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -128,6 +128,7 @@ static ivas_error IVAS_DEC_Setup( IVAS_DEC_HANDLE hIvasDec, uint16_t *nTcBufferG static ivas_error IVAS_DEC_GetTcSamples( IVAS_DEC_HANDLE hIvasDec, float *pcmBuf, int16_t *nOutSamples ); static ivas_error IVAS_DEC_RendererFeedTcSamples( IVAS_DEC_HANDLE hIvasDec, const int16_t nSamplesForRendering, int16_t *nSamplesResidual, float *pcmBuf ); static ivas_error IVAS_DEC_GetRenderedSamples( IVAS_DEC_HANDLE hIvasDec, const uint16_t nSamplesForRendering, uint16_t *nSamplesRendered, uint16_t *nSamplesAvailableNext, int16_t *pcmBuf ); +static ivas_error IVAS_DEC_GetBufferedNumberOfSamples( IVAS_DEC_HANDLE hIvasDec, int16_t *nSamplesBuffered ); #endif /*---------------------------------------------------------------------* @@ -669,10 +670,8 @@ ivas_error IVAS_DEC_EnableVoIP( #endif #ifdef JBM_TSM_ON_TCS - /* postpone init of time scaler until we know the real number of TCs */ + /* postpone init of time scaler and output FIFO until we know the real number of TCs */ hIvasDec->hVoIP->hTimeScaler = NULL; - /* create output pcm fifo*/ - /* :TODO: also provide CLDFB output FIFO if things work out */ #ifdef VARIABLE_SPEED_DECODING if ( hIvasDec->hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED ) { @@ -1043,6 +1042,25 @@ ivas_error IVAS_DEC_GetRenderedSamples( } + return error; +} + +ivas_error IVAS_DEC_GetBufferedNumberOfSamples( + IVAS_DEC_HANDLE hIvasDec, /* i/o : IVAS decoder handle */ + int16_t *nSamplesBuffered /* o : number of samples still buffered */ +) +{ + ivas_error error; + error = IVAS_ERR_OK; + + *nSamplesBuffered = 0; + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + *nSamplesBuffered = hIvasDec->st_ivas->hTcBuffer->n_samples_buffered - hIvasDec->st_ivas->hTcBuffer->n_samples_rendered; + return error; } #endif @@ -1862,7 +1880,6 @@ ivas_error IVAS_DEC_VoIP_GetSamples( maxScaling = hVoIP->speedFac; #endif - /* TODO(mcjbm): ringbuffer capacity should be configurable by user */ #ifdef JBM_TSM_ON_TCS if ( ( hVoIP->hFifoOut != NULL && nSamplesPerChannel > hVoIP->hFifoOut->capacity ) || nSamplesPerChannel == 0 ) #else @@ -1900,7 +1917,13 @@ ivas_error IVAS_DEC_VoIP_GetSamples( } else { - extBufferedSamples = nSamplesRendered; /* TODO: JBM use renderer residual samples here */ + int16_t nSamplesBuffered; + nSamplesBuffered = 0; + if ( hIvasDec->hasBeenFedFirstGoodFrame ) + { + IVAS_DEC_GetBufferedNumberOfSamples( hIvasDec, &nSamplesBuffered ); + } + extBufferedSamples = nSamplesRendered + nSamplesBuffered; } #else extBufferedSamples = pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoAfterTimeScaler ); -- GitLab From 111ef87ed077e370dfb8eaf1d246c4d970c50b6b Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 25 May 2023 14:25:16 +0200 Subject: [PATCH 326/331] clang-format --- lib_dec/ivas_objectRenderer_internal.c | 2 +- lib_dec/lib_dec.c | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index 65ae2de79b..ba14104ed9 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -188,7 +188,7 @@ ivas_error ivas_td_binaural_renderer_sf( } if ( subframe_idx == ism_md_subframe_update_jbm ) { - TDREND_Update_object_positions( st_ivas->hBinRendererTd, st_ivas->nchan_transport, st_ivas->ivas_format, st_ivas->hIsmMetaData ); + TDREND_Update_object_positions( st_ivas->hBinRendererTd, st_ivas->nchan_transport, st_ivas->ivas_format, st_ivas->hIsmMetaData ); } #else TDREND_Update_object_positions( st_ivas->hBinRendererTd, st_ivas->nchan_transport, LFE_CHANNEL, st_ivas->ivas_format, st_ivas->hIsmMetaData, tc_local ); diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 879188a1fd..2042911833 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -452,7 +452,7 @@ ivas_error IVAS_DEC_Configure( const float non_diegetic_pan_gain, /* i : non diegetic panning gain */ const int16_t delayCompensationEnabled /* i : enable delay compensation */ #else - const float non_diegetic_pan_gain /* i : non diegetic panning gain */ + const float non_diegetic_pan_gain /* i : non diegetic panning gain */ #endif ) { @@ -909,10 +909,10 @@ static ivas_error IVAS_DEC_Setup( else { #endif - *nTransportChannels = 1; - *nOutChannels = 1; + *nTransportChannels = 1; + *nOutChannels = 1; #ifdef FIX_473_JITTER_NONDIEGETIC_PANNING - } + } #endif } else -- GitLab From 3dd12fb0687315df8054af8c7ad1d4dbc3976719 Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 25 May 2023 14:51:32 +0200 Subject: [PATCH 327/331] add jobs for scheduled sanitizer tests forISM+ modes --- .gitlab-ci.yml | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a5f33f3c6f..7f085c32f4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -976,6 +976,55 @@ sanitizer-test-planarsba: - *update-ltv-repo - python3 ci/run_scheduled_sanitizer_test.py PlanarSBA $OUT_FORMATS_CHANNEL_BASED $OUT_FORMATS_SCENE_BASED $OUT_FORMATS_BINAURAL --tests $SANITIZER_TESTS +### --- sanitizer schedule D --- + +.sanitizer-test-schedule-D: + extends: + - .sanitizer-test-template + +sanitizer-test-ism+1: + extends: .sanitizer-test-schedule-D + rules: + - if: $SANITIZER_SCHEDULE_D + timeout: 2 hours + script: + - *update-ltv-repo + - python3 ci/run_scheduled_sanitizer_test.py ISM+1 $OUT_FORMATS_CHANNEL_BASED $OUT_FORMATS_SCENE_BASED $OUT_FORMATS_BINAURAL EXT --tests $SANITIZER_TESTS + +sanitizer-test-ism+2: + extends: .sanitizer-test-schedule-D + rules: + - if: $SANITIZER_SCHEDULE_D + when: delayed + start_in: 2 hours + timeout: 3 hours + script: + - *update-ltv-repo + - python3 ci/run_scheduled_sanitizer_test.py ISM+2 $OUT_FORMATS_CHANNEL_BASED $OUT_FORMATS_SCENE_BASED $OUT_FORMATS_BINAURAL EXT --tests $SANITIZER_TESTS + +sanitizer-test-ism+3: + extends: .sanitizer-test-schedule-D + rules: + - if: $SANITIZER_SCHEDULE_D + when: delayed + start_in: 5 hours + timeout: 3 hour + script: + - *update-ltv-repo + - python3 ci/run_scheduled_sanitizer_test.py ISM+3 $OUT_FORMATS_CHANNEL_BASED $OUT_FORMATS_SCENE_BASED $OUT_FORMATS_BINAURAL EXT --tests $SANITIZER_TESTS + +sanitizer-test-ism+4: + extends: .sanitizer-test-schedule-D + rules: + - if: $SANITIZER_SCHEDULE_D + when: delayed + start_in: 8 hours + timeout: 4 hours + script: + - *update-ltv-repo + - python3 ci/run_scheduled_sanitizer_test.py ISM+4 $OUT_FORMATS_CHANNEL_BASED $OUT_FORMATS_SCENE_BASED $OUT_FORMATS_BINAURAL EXT --tests $SANITIZER_TESTS + + # GCOV/LCOV coverage analysis of self_test suite coverage-test-on-main-scheduled: extends: -- GitLab From 24f08b2668644a309c0b02c6184eb3842760e2bd Mon Sep 17 00:00:00 2001 From: Jouni Paulus Date: Thu, 25 May 2023 15:01:12 +0200 Subject: [PATCH 328/331] adjust the metadata index buffer size for McMASA 32-64kbps --- lib_com/bitstream.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index 5ba6577faf..04fdb8fe0b 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -870,7 +870,11 @@ int16_t get_ivas_max_num_indices_metadata( /* o } else if ( ivas_total_brate <= IVAS_64k ) { +#ifdef FIX_502_IND_LIST_SIZE + return 210; +#else return 200; +#endif } else if ( ivas_total_brate <= IVAS_96k ) { -- GitLab From 25af36a033f059a3e27528c0a89b82cf3638546b Mon Sep 17 00:00:00 2001 From: Jouni Paulus Date: Fri, 26 May 2023 09:29:33 +0200 Subject: [PATCH 329/331] wrap unused variables under debugging switch DEBUG_MODE_QMETADATA. this is activated by the switch: FIX_481_UNUSED_VARIABLES. --- lib_com/options.h | 3 ++ lib_dec/ivas_qmetadata_dec.c | 72 ++++++++++++++++++++++++++++++++++-- lib_enc/ivas_qmetadata_enc.c | 27 +++++++++++++- 3 files changed, 97 insertions(+), 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index ec4b88b340..ddeebb1c2e 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -212,6 +212,9 @@ #ifdef HR_METADATA #define FIX_505_MASA_SPHGRID_REUSE /* Nokia: Fix issue #505: MASA spherical grid reuse fix */ #endif + +#define FIX_481_UNUSED_VARIABLES /* Nokia: Fix issue #481: Unused debug variables */ + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index 67aefe9038..9a3044e794 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -805,11 +805,23 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( ) { int16_t d, b, m; +#ifdef FIX_481_UNUSED_VARIABLES +#ifdef DEBUG_MODE_QMETADATA + int16_t bits_diff_sum; +#endif +#else int16_t bits_diff_sum; +#endif int16_t nbands, start_band; IVAS_QDIRECTION *q_direction; int16_t start_index_0; +#ifdef FIX_481_UNUSED_VARIABLES +#ifdef DEBUG_MODE_QMETADATA int16_t bits_no_dirs_coh, bits_sur_coherence; +#endif +#else + int16_t bits_no_dirs_coh, bits_sur_coherence; +#endif uint16_t all_coherence_zero; int16_t p[MASA_MAXIMUM_CODING_SUBBANDS], dif_p[MASA_MAXIMUM_CODING_SUBBANDS]; #ifdef FIX_HBR_MASAMETA @@ -892,13 +904,25 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( #endif /*Coherence flag decoding*/ +#ifdef FIX_481_UNUSED_VARIABLES +#ifdef DEBUG_MODE_QMETADATA bits_no_dirs_coh = 0; +#endif +#else + bits_no_dirs_coh = 0; +#endif all_coherence_zero = 1; if ( hQMetaData->coherence_flag ) { /* read if coherence is zero */ all_coherence_zero = bitstream[( *index )--]; +#ifdef FIX_481_UNUSED_VARIABLES +#ifdef DEBUG_MODE_QMETADATA + bits_no_dirs_coh += 1; +#endif +#else bits_no_dirs_coh += 1; +#endif } hQMetaData->all_coherence_zero = (uint8_t) all_coherence_zero; @@ -934,7 +958,13 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( p[b] = p[b - 1] + dif_p[b] + 1; hQMetaData->twoDirBands[p[b]] = 1; } +#ifdef FIX_481_UNUSED_VARIABLES +#ifdef DEBUG_MODE_QMETADATA + bits_no_dirs_coh += ( d - *index ); +#endif +#else bits_no_dirs_coh += ( d - *index ); +#endif } #ifdef FIX_HBR_MASAMETA @@ -947,11 +977,25 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( } } #endif - bits_diff_sum = ivas_qmetadata_entropy_decode_diffuseness_hr_512( bitstream, index, &( hQMetaData->q_direction[0] ) ); +#ifdef FIX_481_UNUSED_VARIABLES +#ifdef DEBUG_MODE_QMETADATA + bits_diff_sum = +#endif +#else + bits_diff_sum = +#endif + ivas_qmetadata_entropy_decode_diffuseness_hr_512( bitstream, index, &( hQMetaData->q_direction[0] ) ); if ( hQMetaData->no_directions == 2 ) { - bits_diff_sum += ivas_qmetadata_entropy_decode_diffuseness_hr_512( bitstream, index, &( hQMetaData->q_direction[1] ) ); +#ifdef FIX_481_UNUSED_VARIABLES +#ifdef DEBUG_MODE_QMETADATA + bits_diff_sum += +#endif +#else + bits_diff_sum += +#endif + ivas_qmetadata_entropy_decode_diffuseness_hr_512( bitstream, index, &( hQMetaData->q_direction[1] ) ); } @@ -1000,11 +1044,24 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( if ( all_coherence_zero == 0 ) { - bits_sur_coherence = read_surround_coherence_hr( bitstream, index, hQMetaData ); +#ifdef FIX_481_UNUSED_VARIABLES +#ifdef DEBUG_MODE_QMETADATA + bits_sur_coherence = +#endif +#else + bits_sur_coherence = +#endif + read_surround_coherence_hr( bitstream, index, hQMetaData ); } else { +#ifdef FIX_481_UNUSED_VARIABLES +#ifdef DEBUG_MODE_QMETADATA + bits_sur_coherence = 0; +#endif +#else bits_sur_coherence = 0; +#endif /*Surround coherence*/ for ( b = 0; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) { @@ -1014,7 +1071,13 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( } } } +#ifdef FIX_481_UNUSED_VARIABLES +#ifdef DEBUG_MODE_QMETADATA bits_no_dirs_coh += bits_sur_coherence; +#endif +#else + bits_no_dirs_coh += bits_sur_coherence; +#endif for ( d = 0; d < hQMetaData->no_directions; d++ ) { @@ -1048,8 +1111,9 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( ivas_qmetadata_raw_decode_dir_512( q_direction, bitstream, index, nbands, start_band, sph_grid16 ); #ifdef DEBUG_MODE_QMETADATA - +#ifndef FIX_481_UNUSED_VARIABLES fprintf( pF, "frame %d: diff %d surcoh %d ", frame, bits_diff_sum, bits_sur_coherence ); +#endif fprintf( pF, "dir %d\n", start_index_0 - *index ); fprintf( pF_azi, "frame %d/dir/ec %d: ", frame, d ); fprintf( pF_ele, "frame %d/dir/ec %d: ", frame, d ); diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index 3bbf084a7e..3242eceb62 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -759,7 +759,13 @@ ivas_error ivas_qmetadata_enc_encode_hr_384_512( int16_t nbands, nblocks, start_band; int16_t ndirections, d; int16_t all_coherence_zero; +#ifdef FIX_481_UNUSED_VARIABLES +#ifdef DEBUG_MODE_QMETADATA int16_t bits_no_dirs_coh; +#endif +#else + int16_t bits_no_dirs_coh; +#endif int16_t bits_ec; float azimuth_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], elevation_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; ivas_error error; @@ -796,7 +802,13 @@ ivas_error ivas_qmetadata_enc_encode_hr_384_512( /* Check if coherence should be encoded */ all_coherence_zero = 1; +#ifdef FIX_481_UNUSED_VARIABLES +#ifdef DEBUG_MODE_QMETADATA bits_no_dirs_coh = 0; +#endif +#else + bits_no_dirs_coh = 0; +#endif #ifdef FIX_HBR_MASAMETA if ( hQMetaData->q_direction->cfg.inactiveBands > 0 ) { @@ -814,13 +826,26 @@ ivas_error ivas_qmetadata_enc_encode_hr_384_512( { all_coherence_zero = hQMetaData->all_coherence_zero; push_next_indice( hMetaData, all_coherence_zero, 1 ); /* signal coherence */ +#ifdef FIX_481_UNUSED_VARIABLES +#ifdef DEBUG_MODE_QMETADATA bits_no_dirs_coh += 1; +#endif +#else + bits_no_dirs_coh += 1; +#endif } /* encode 2 direction subbands position */ if ( ndirections == 2 && bits_sph_idx == 11 ) { - bits_no_dirs_coh += write_2dir_info( hMetaData, hQMetaData->twoDirBands, hQMetaData->q_direction[0].cfg.nbands, hQMetaData->numTwoDirBands ); +#ifdef FIX_481_UNUSED_VARIABLES +#ifdef DEBUG_MODE_QMETADATA + bits_no_dirs_coh += +#endif +#else + bits_no_dirs_coh += +#endif + write_2dir_info( hMetaData, hQMetaData->twoDirBands, hQMetaData->q_direction[0].cfg.nbands, hQMetaData->numTwoDirBands ); for ( i = hQMetaData->numTwoDirBands; i < hQMetaData->q_direction[0].cfg.nbands; i++ ) { -- GitLab From f30fef0c5aeeba492cba0a8ae9eaa884ae3062fd Mon Sep 17 00:00:00 2001 From: Jouni Paulus Date: Fri, 26 May 2023 09:57:59 +0200 Subject: [PATCH 330/331] apply clang formatting --- lib_dec/ivas_qmetadata_dec.c | 6 +++--- lib_enc/ivas_qmetadata_enc.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index 9a3044e794..e865d6835e 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -984,7 +984,7 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( #else bits_diff_sum = #endif - ivas_qmetadata_entropy_decode_diffuseness_hr_512( bitstream, index, &( hQMetaData->q_direction[0] ) ); + ivas_qmetadata_entropy_decode_diffuseness_hr_512( bitstream, index, &( hQMetaData->q_direction[0] ) ); if ( hQMetaData->no_directions == 2 ) { @@ -995,7 +995,7 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( #else bits_diff_sum += #endif - ivas_qmetadata_entropy_decode_diffuseness_hr_512( bitstream, index, &( hQMetaData->q_direction[1] ) ); + ivas_qmetadata_entropy_decode_diffuseness_hr_512( bitstream, index, &( hQMetaData->q_direction[1] ) ); } @@ -1051,7 +1051,7 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( #else bits_sur_coherence = #endif - read_surround_coherence_hr( bitstream, index, hQMetaData ); + read_surround_coherence_hr( bitstream, index, hQMetaData ); } else { diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index 3242eceb62..17ddbe3676 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -845,7 +845,7 @@ ivas_error ivas_qmetadata_enc_encode_hr_384_512( #else bits_no_dirs_coh += #endif - write_2dir_info( hMetaData, hQMetaData->twoDirBands, hQMetaData->q_direction[0].cfg.nbands, hQMetaData->numTwoDirBands ); + write_2dir_info( hMetaData, hQMetaData->twoDirBands, hQMetaData->q_direction[0].cfg.nbands, hQMetaData->numTwoDirBands ); for ( i = hQMetaData->numTwoDirBands; i < hQMetaData->q_direction[0].cfg.nbands; i++ ) { -- GitLab From be2233431a39b0e361df63e1b38a7b9cefa600a3 Mon Sep 17 00:00:00 2001 From: Jouni Paulus Date: Fri, 26 May 2023 10:14:51 +0200 Subject: [PATCH 331/331] restore debug print --- lib_dec/ivas_qmetadata_dec.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index e865d6835e..cc7335c221 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -1111,9 +1111,7 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( ivas_qmetadata_raw_decode_dir_512( q_direction, bitstream, index, nbands, start_band, sph_grid16 ); #ifdef DEBUG_MODE_QMETADATA -#ifndef FIX_481_UNUSED_VARIABLES fprintf( pF, "frame %d: diff %d surcoh %d ", frame, bits_diff_sum, bits_sur_coherence ); -#endif fprintf( pF, "dir %d\n", start_index_0 - *index ); fprintf( pF_azi, "frame %d/dir/ec %d: ", frame, d ); fprintf( pF_ele, "frame %d/dir/ec %d: ", frame, d ); -- GitLab