From 28fc705456768a10a4879ddef1c622cec2287257 Mon Sep 17 00:00:00 2001 From: Lauros Pajunen Date: Tue, 6 Feb 2024 10:55:21 +0200 Subject: [PATCH 1/9] OMASA EXT output --- apps/decoder.c | 50 +++ apps/renderer.c | 4 + lib_com/ivas_cnst.h | 6 + lib_com/ivas_prot.h | 24 ++ lib_com/options.h | 2 + lib_dec/ivas_init_dec.c | 65 ++++ lib_dec/ivas_jbm_dec.c | 64 +++- lib_dec/ivas_masa_dec.c | 64 +++- lib_dec/ivas_omasa_dec.c | 613 +++++++++++++++++++++++++++++++++++ lib_dec/ivas_output_config.c | 15 + lib_dec/ivas_sba_dec.c | 4 + lib_dec/ivas_stat_dec.h | 17 + lib_dec/lib_dec.c | 45 +++ lib_enc/ivas_masa_enc.c | 35 +- lib_rend/ivas_output_init.c | 7 + lib_util/masa_file_writer.c | 117 ++++++- lib_util/masa_file_writer.h | 8 +- 17 files changed, 1128 insertions(+), 12 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index c93d717250..6f577b438a 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -2031,6 +2031,7 @@ static ivas_error initOnFirstGoodFrame( { /* Duplicate good first frame metadata to fill the beginning of stream. */ IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta = NULL; + if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta, 0 ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); @@ -2039,7 +2040,12 @@ static ivas_error initOnFirstGoodFrame( for ( int16_t j = 0; j < numInitialBadFrames; ++j ) { +#ifdef OMASA_EXT_OUTPUT + float delayMs = (float) ( pFullDelayNumSamples[0] ) / (float) ( *delayTimeScale ); + if ( ( error = MasaFileWriter_writeFrame( *ppMasaWriter, hMasaExtOutMeta, &delayMs ) ) != IVAS_ERR_OK ) +#else if ( ( error = MasaFileWriter_writeFrame( *ppMasaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK ) +#endif { fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( *ppMasaWriter ) ); return error; @@ -2546,13 +2552,28 @@ static ivas_error decodeG192( if ( bsFormat == IVAS_DEC_BS_MASA || bsFormat == IVAS_DEC_BS_MASA_ISM ) { IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta; +#ifdef OMASA_EXT_OUTPUT + int16_t fullDelayNumSamples[3]; + float delayMs; + + /* delayNumSamples is zeroed, and delayNumSamples_orig is updated only on first good frame, so need to re-fetch delay info */ + if ( ( error = IVAS_DEC_GetDelay( hIvasDec, fullDelayNumSamples, &delayTimeScale ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nUnable to get delay of decoder: %s\n", ivas_error_to_string( error ) ); + } +#endif if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta, 0 ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } +#ifdef OMASA_EXT_OUTPUT + delayMs = (float) ( fullDelayNumSamples[0] ) / (float) ( delayTimeScale ); + if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta, &delayMs ) ) != IVAS_ERR_OK ) +#else if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK ) +#endif { fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); goto cleanup; @@ -2687,13 +2708,27 @@ static ivas_error decodeG192( if ( bsFormat == IVAS_DEC_BS_MASA || bsFormat == IVAS_DEC_BS_MASA_ISM ) { IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta; +#ifdef OMASA_EXT_OUTPUT + int16_t fullDelayNumSamples[3]; + float delayMs; + + if ( ( error = IVAS_DEC_GetDelay( hIvasDec, fullDelayNumSamples, &delayTimeScale ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nUnable to get delay of decoder: %s\n", ivas_error_to_string( error ) ); + } +#endif if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta, 0 ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } +#ifdef OMASA_EXT_OUTPUT + delayMs = (float) ( fullDelayNumSamples[0] ) / (float) ( delayTimeScale ); + if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta, &delayMs ) ) != IVAS_ERR_OK ) +#else if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK ) +#endif { fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); goto cleanup; @@ -3368,13 +3403,28 @@ static ivas_error decodeVoIP( if ( bsFormat == IVAS_DEC_BS_MASA || bsFormat == IVAS_DEC_BS_MASA_ISM ) { IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta; +#ifdef OMASA_EXT_OUTPUT + int16_t fullDelayNumSamples[3]; + float delayMs; + + /* delayNumSamples_orig is fetched only for the first good frame, but here the delay can change between frames, so need to re-fetch */ + if ( ( error = IVAS_DEC_GetDelay( hIvasDec, fullDelayNumSamples, &delayTimeScale ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nUnable to get delay of decoder: %s\n", ivas_error_to_string( error ) ); + } +#endif if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta, 1 ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } +#ifdef OMASA_EXT_OUTPUT + delayMs = (float) ( fullDelayNumSamples[0] ) / (float) ( delayTimeScale ); + if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta, &delayMs ) ) != IVAS_ERR_OK ) +#else if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK ) +#endif { fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); goto cleanup; diff --git a/apps/renderer.c b/apps/renderer.c index e230082ca8..13d2dc507c 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -2125,7 +2125,11 @@ int main( } } +#ifdef OMASA_EXT_OUTPUT + if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMetaOutput, NULL ) ) != IVAS_ERR_OK ) /* NULL -> use default metadata delay settings */ +#else if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMetaOutput ) ) != IVAS_ERR_OK ) +#endif { fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); } diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 38e9518e61..9c58681753 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -118,7 +118,13 @@ typedef enum RENDERER_NON_DIEGETIC_DOWNMIX, RENDERER_OSBA_STEREO, RENDERER_OSBA_AMBI, +#ifdef OMASA_EXT_OUTPUT + RENDERER_OSBA_LS, + RENDERER_OMASA_OBJECT_EXT, + RENDERER_OMASA_MIX_EXT +#else RENDERER_OSBA_LS +#endif } RENDERER_TYPE; #ifdef SPLIT_REND_WITH_HEAD_ROT diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index b27a002513..eaa592ca7b 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5792,6 +5792,30 @@ void ivas_omasa_rearrange_channels( const int16_t output_frame /* i : output frame length per channel */ ); +#ifdef OMASA_EXT_OUTPUT +ivas_error ivas_omasa_combine_separate_ism_with_masa_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + +void ivas_omasa_combine_separate_ism_with_masa( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float *output[], /* o : output synthesis signal */ + const int16_t nchan_ism, /* i : number of ISMs */ + const int16_t output_frame /* i : output frame length per channel */ +); + +ivas_error ivas_omasa_render_objects_from_mix_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + +void ivas_omasa_render_objects_from_mix( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float *output[], /* o : output synthesis signal */ + const int16_t nchan_ism, /* i : number of ISMs */ + const int16_t output_frame /* i : output frame length per channel */ +); + +#endif void ivas_omasa_dirac_rend_jbm( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ const uint16_t nSamplesAsked, /* i : number of samples requested */ diff --git a/lib_com/options.h b/lib_com/options.h index 73710db2b0..e42e4d3d4d 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -174,6 +174,8 @@ #define NONBE_FIX_968_ISM_BRIR_WITH_HEADROTATION_5MS_FIX /* FhG : issue #968: differences between 5ms and 20ms rendering for discrete ISM with BRIR and head rotation*/ #define NONBE_FIX_977_OSBA_GAIN_MISMATCH /* Dlb : issue 977 : Output gain mismatch for different bit rates in OSBA */ +#define OMASA_EXT_OUTPUT /* Nokia: complete the OMASA EXT output implementation */ + /* ##################### End NON-BE switches ########################### */ /* ################## End DEVELOPMENT switches ######################### */ diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index d24e043648..a9f920c8b8 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -386,6 +386,29 @@ ivas_error ivas_dec_setup( st_ivas->nchan_transport = 1; } +#ifdef OMASA_EXT_OUTPUT + /* this should be non-zero if original input format was MASA_ISM */ + st_ivas->nchan_ism = st_ivas->bit_stream[( ivas_total_brate / FRAMES_PER_SEC ) - 3] + 2 * st_ivas->bit_stream[( ivas_total_brate / FRAMES_PER_SEC ) - 2]; + + if ( st_ivas->nchan_ism > 0 ) + { + /* the input_ivas_format should be MASA_ISM_FORMAT, but we cannot initialize it now */ + if ( st_ivas->nchan_transport == 2 && st_ivas->nchan_ism == 3) + { + st_ivas->nchan_ism = 4; + } + /* for MASA_ISM_FORMAT at input the number of MASA transport channels is always 2 */ + st_ivas->nchan_transport = 2; + element_mode_flag = 1; + + /* ISM metadata */ + if ( st_ivas->hIsmMetaData[0] != NULL ) + { + /* these are not needed -> clean. EXT metafile writer in OMASA needs only the number of ISMs and writes default null-data */ + ivas_ism_metadata_close( st_ivas->hIsmMetaData, 0 ); + } + } +#endif if ( st_ivas->ini_frame > 0 ) { /* reconfigure in case a change of operation mode is detected */ @@ -1135,7 +1158,11 @@ ivas_error ivas_init_decoder( hDecoderConfig->nchan_out = audioCfg2channels( IVAS_AUDIO_CONFIG_HOA3 ); hDecoderConfig->nchan_out += st_ivas->nchan_ism; } +#ifdef OMASA_EXT_OUTPUT + else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || ( st_ivas->ism_mode == ISM_MODE_NONE && st_ivas->ivas_format == MASA_FORMAT ) ) +#else else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) +#endif { hDecoderConfig->nchan_out = st_ivas->nchan_transport + st_ivas->nchan_ism; } @@ -2072,6 +2099,32 @@ ivas_error ivas_init_decoder( return error; } } +#ifdef OMASA_EXT_OUTPUT + + if ( st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT ) + { + /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */ + if ( ( error = ivas_omasa_render_objects_from_mix_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_spat_hSpatParamRendCom_config( &st_ivas->hSpatParamRendCom, DIRAC_OPEN, 0, + st_ivas->ivas_format, st_ivas->mc_mode, output_Fs, 0, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( st_ivas->renderer_type == RENDERER_OMASA_MIX_EXT ) + { + /* Allocate 'hIsmRendererData' handle */ + if ( ( error = ivas_omasa_combine_separate_ism_with_masa_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } +#endif } if ( ( st_ivas->ivas_format == ISM_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) && @@ -2941,6 +2994,16 @@ void ivas_init_dec_get_num_cldfb_instances( *numCldfbSyntheses = 0; } break; +#ifdef OMASA_EXT_OUTPUT + case RENDERER_OMASA_OBJECT_EXT: + *numCldfbAnalyses = st_ivas->nchan_transport; + *numCldfbSyntheses = st_ivas->hDecoderConfig->nchan_out; + break; + case RENDERER_OMASA_MIX_EXT: + *numCldfbAnalyses = st_ivas->nchan_transport + 1; + *numCldfbSyntheses = 0; + break; +#endif default: assert( 0 && "Renderer not handled for CLDFB reservation." ); } @@ -3079,6 +3142,7 @@ static ivas_error doSanityChecks_IVAS( return IVAS_ERROR( IVAS_ERR_ACOUSTIC_ENVIRONMENT_NOT_SUPPORTED, "Wrong set-up: Acoustic environment is not supported in this output configuration." ); } } +#ifndef OMASA_EXT_OUTPUT if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) { @@ -3087,6 +3151,7 @@ static ivas_error doSanityChecks_IVAS( return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for combined MASA and ISM format" ); } } +#endif #ifdef DEBUGGING if ( ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) && ( ( st_ivas->ivas_format != MC_FORMAT && st_ivas->ivas_format != ISM_FORMAT ) || ( output_config != IVAS_AUDIO_CONFIG_BINAURAL && output_config != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || ( 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 ) ) ) diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index dc394dda02..15c0cc9396 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -320,6 +320,18 @@ ivas_error ivas_jbm_dec_tc( if ( st_ivas->ivas_format == MASA_FORMAT ) { ivas_masa_prerender( st_ivas, p_output, output_frame, nchan_remapped ); +#ifdef OMASA_EXT_OUTPUT + /* external output */ + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL && st_ivas->hMasa->config.input_ivas_format == MASA_ISM_FORMAT) + { + for ( n = 0; n < st_ivas->nchan_ism; n++ ) + { + set_zero( p_output[st_ivas->nchan_transport + n], output_frame ); + } + + ivas_omasa_rearrange_channels( p_output, st_ivas->nchan_ism, output_frame ); + } +#endif } else if ( st_ivas->ivas_format == SBA_FORMAT && ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) { @@ -400,6 +412,22 @@ ivas_error ivas_jbm_dec_tc( } else if ( output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) { +#ifdef OMASA_EXT_OUTPUT + if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + ivas_omasa_rearrange_channels( p_output, nchan_transport_ism, output_frame ); + } + else if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + { + /* Convert separate object to MASA, combine with the original MASA, and output combined MASA + empty objects. */ + ivas_omasa_combine_separate_ism_with_masa( st_ivas, p_output, st_ivas->nchan_ism, output_frame ); + } + else if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + { + /* Extract objects from MASA, output MASA + all objects (i.e., extracted and separated objects) */ + ivas_omasa_render_objects_from_mix( st_ivas, p_output, st_ivas->nchan_ism, output_frame ); + } +#else /* sanity check in case of bitrate switching */ if ( st_ivas->ism_mode != ISM_MASA_MODE_DISC ) { @@ -407,6 +435,7 @@ ivas_error ivas_jbm_dec_tc( } ivas_omasa_rearrange_channels( p_output, nchan_transport_ism, output_frame ); +#endif ivas_jbm_dec_copy_masa_meta_to_buffer( st_ivas ); } @@ -893,17 +922,29 @@ void ivas_jbm_dec_feed_tc_to_renderer( } else if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) { - if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC && st_ivas->ism_mode == ISM_MASA_MODE_DISC ) +#ifdef OMASA_EXT_OUTPUT + if ( st_ivas->renderer_type == RENDERER_OMASA_MIX_EXT || st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT ) { - n_render_timeslots *= ( st_ivas->hTcBuffer->n_samples_granularity / st_ivas->hSpatParamRendCom->slot_size ); + ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); + ivas_jbm_masa_sf_to_slot_map( st_ivas, n_render_timeslots ); } + else + { +#endif + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC && st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + n_render_timeslots *= ( st_ivas->hTcBuffer->n_samples_granularity / st_ivas->hSpatParamRendCom->slot_size ); + } - ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); + ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); - if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) - { - ivas_ism_dec_digest_tc( st_ivas ); + if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + ivas_ism_dec_digest_tc( st_ivas ); + } +#ifdef OMASA_EXT_OUTPUT } +#endif } else if ( st_ivas->ivas_format == MC_FORMAT ) { @@ -1190,6 +1231,13 @@ ivas_error ivas_jbm_dec_render( { ivas_omasa_dirac_rend_jbm( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output ); } +#ifdef OMASA_EXT_OUTPUT + else if ( st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT || st_ivas->renderer_type == RENDERER_OMASA_MIX_EXT ) + { + ivas_jbm_dec_tc_buffer_playout( st_ivas, nSamplesAskedLocal, nSamplesRendered, p_output ); + ivas_omasa_rearrange_channels( p_output, st_ivas->nchan_ism, *nSamplesRendered ); + } +#endif } else if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) { @@ -2677,6 +2725,10 @@ TC_BUFFER_MODE ivas_jbm_dec_get_tc_buffer_mode( case RENDERER_PARAM_ISM: case RENDERER_BINAURAL_MIXER_CONV: case RENDERER_BINAURAL_MIXER_CONV_ROOM: +#ifdef OMASA_EXT_OUTPUT + case RENDERER_OMASA_OBJECT_EXT: + case RENDERER_OMASA_MIX_EXT: +#endif case RENDERER_OSBA_AMBI: case RENDERER_OSBA_LS: buffer_mode = TC_BUFFER_MODE_RENDERER; diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 7139b734d2..1dd34ae06d 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -243,7 +243,26 @@ ivas_error ivas_masa_decode( } } } +#ifdef OMASA_EXT_OUTPUT + /* read 2 bits: + '00' - MASA format at the encoder + '01' - MASA_ISM_FORMAT at the encoder, with 1 object + '10' - MASA_ISM_FORMAT at the encoder, with 2 objects + '11' - MASA_ISM_FORMAT at the encoder, with 3 or 4 objects + reading if 3 or 4 object is performed later + */ + byteBuffer = st->bit_stream[( st->next_bit_pos )--]; + byteBuffer = byteBuffer + 2*st->bit_stream[( st->next_bit_pos )--]; + if ( byteBuffer == 0 && ivas_format == MASA_FORMAT) + { + hMasa->config.input_ivas_format = MASA_FORMAT; + } + else + { + hMasa->config.input_ivas_format = MASA_ISM_FORMAT; + } +#else /* read the MASA_ISM_FORMAT bit */ byteBuffer = st->bit_stream[( st->next_bit_pos )--]; if ( byteBuffer == 1 ) @@ -256,6 +275,7 @@ ivas_error ivas_masa_decode( } /* reserved bit */ byteBuffer = st->bit_stream[( st->next_bit_pos )--]; +#endif *nb_bits_read += MASA_HEADER_BITS; /* read number of directions */ @@ -337,6 +357,13 @@ ivas_error ivas_masa_decode( } } } +#ifdef OMASA_EXT_OUTPUT + else if ( st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT ) + { + *nb_bits_read += ivas_decode_masaism_metadata( hQMetaData, st_ivas->hMasa, st_ivas->hMasaIsmData, st_ivas->nchan_ism, st->bit_stream, &st->next_bit_pos, + st_ivas->hMasaIsmData->idx_separated_ism, ism_imp, st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx, st_ivas->hSpatParamRendCom->dirac_md_buffer_length ); + } +#endif else { *nb_bits_read += ivas_decode_masaism_metadata( hQMetaData, st_ivas->hMasa, st_ivas->hMasaIsmData, st_ivas->nchan_ism, st->bit_stream, &st->next_bit_pos, @@ -456,6 +483,12 @@ ivas_error ivas_masa_decode( dirac_bs_md_write_idx = st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx; /* Store the write-index for this frame */ ivas_qmetadata_to_dirac( hQMetaData, st_ivas->hDirAC, hMasa, st_ivas->hSpatParamRendCom, ivas_total_brate, ivas_format, 0, 0 ); } +#ifdef OMASA_EXT_OUTPUT + else if ( st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT ) + { + st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx = ( st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx + MAX_PARAM_SPATIAL_SUBFRAMES ) % st_ivas->hSpatParamRendCom->dirac_md_buffer_length; + } +#endif if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) { @@ -645,6 +678,13 @@ ivas_error ivas_masa_dec_open( nchan_transport = 1; nchan_to_allocate = 1; } +#ifdef OMASA_EXT_OUTPUT + else if ( st_ivas->ivas_format == MASA_ISM_FORMAT && ( st_ivas->renderer_type == RENDERER_OMASA_MIX_EXT || st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT ) ) + { + nchan_transport = st_ivas->nchan_transport + st_ivas->nchan_ism; + nchan_to_allocate = st_ivas->nchan_transport + st_ivas->nchan_ism; + } +#endif else if ( st_ivas->nchan_transport == 1 && ( st_ivas->renderer_type == RENDERER_DIRAC ) ) { /* addtl channel for CNG */ @@ -1443,7 +1483,16 @@ ivas_error ivas_masa_dec_reconfigure( if ( st_ivas->ivas_format == MASA_FORMAT ) { +#ifdef OMASA_EXT_OUTPUT + if ( st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_EXTERNAL ) + { + st_ivas->nchan_ism = 0; /* Initialization if it has not been already read from the end of the bitstream at the same time + with reading of the format: nchan_ism is needed in MASA format because for the EXT output in + MASA-only (pre-rendering mode of OMASA) the number of ISMs to output correct number of empty objects is needed */ + } +#else st_ivas->nchan_ism = 0; +#endif st_ivas->ism_mode = ISM_MODE_NONE; } @@ -1499,7 +1548,13 @@ ivas_error ivas_masa_dec_reconfigure( /* addtl channel for CNG */ tc_nchan_to_allocate++; } - +#ifdef OMASA_EXT_OUTPUT + else if ( st_ivas->ivas_format == MASA_ISM_FORMAT && ( st_ivas->renderer_type == RENDERER_OMASA_MIX_EXT || st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT ) ) + { + tc_nchan_transport = st_ivas->nchan_transport + st_ivas->nchan_ism; + tc_nchan_to_allocate = st_ivas->nchan_transport + st_ivas->nchan_ism; + } +#endif 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 ) { @@ -2475,6 +2530,13 @@ static int16_t ivas_decode_masaism_metadata( { hMasaIsmData->energy_ratio_ism[dir][meta_write_index][b] = energy_ratio_ism[i][band][dir]; } +#ifdef OMASA_EXT_OUTPUT + + if ( hMasaIsmData->hExtData != NULL ) + { + hMasaIsmData->hExtData->masa_render_masa_to_total[meta_write_index][b] = hMasaIsmData->masa_to_total_energy_ratio[i][band]; + } +#endif } } } diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index 33a504bae7..e5b7bc570f 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -32,6 +32,9 @@ #include "options.h" #include +#ifdef OMASA_EXT_OUTPUT +#include +#endif #include "ivas_cnst.h" #include "ivas_prot.h" #include "prot.h" @@ -48,6 +51,9 @@ *------------------------------------------------------------------------*/ #define OMASA_TDREND_MATCHING_GAIN 0.7943f +#ifdef OMASA_EXT_OUTPUT +#define EXT_RENDER_IIR_FAC 0.95f +#endif /*-------------------------------------------------------------------* * ivas_omasa_data_open() @@ -103,6 +109,41 @@ ivas_error ivas_omasa_data_open( set_s( hMasaIsmData->azimuth_separated_ism, 0, MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR ); set_s( hMasaIsmData->elevation_separated_ism, 0, MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR ); +#ifdef OMASA_EXT_OUTPUT + hMasaIsmData->hExtData = NULL; + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + MASA_ISM_EXT_DATA_HANDLE hExtData; + + if ( ( hExtData = (MASA_ISM_EXT_DATA_HANDLE) malloc( sizeof( MASA_ISM_EXT_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA ISM data\n" ) ); + } + + hExtData->prev_idx_separated_ism = 0; + + for ( ch = 0; ch < MAX_NUM_OBJECTS; ch++ ) + { + set_zero( hExtData->prev_panning_gains[ch], 2); + } + + for ( ch = 0; ch < MAX_NUM_OBJECTS; ch++ ) + { + set_zero( hExtData->ism_render_proto_energy[ch], CLDFB_NO_CHANNELS_MAX ); + set_zero( hExtData->ism_render_target_energy[ch], CLDFB_NO_CHANNELS_MAX ); + } + set_zero( hExtData->masa_render_proto_energy, CLDFB_NO_CHANNELS_MAX ); + set_zero( hExtData->masa_render_target_energy, CLDFB_NO_CHANNELS_MAX ); + + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR; sf++ ) + { + set_zero( hExtData->masa_render_masa_to_total[sf], CLDFB_NO_CHANNELS_MAX ); + } + + hMasaIsmData->hExtData = hExtData; + } + +#endif st_ivas->hMasaIsmData = hMasaIsmData; return IVAS_ERR_OK; @@ -136,6 +177,14 @@ void ivas_omasa_data_close( ( *hMasaIsmData )->delayBuffer = NULL; } +#ifdef OMASA_EXT_OUTPUT + if ( ( *hMasaIsmData )->hExtData != NULL ) + { + free( ( *hMasaIsmData )->hExtData ); + ( *hMasaIsmData )->hExtData = NULL; + } + +#endif free( *hMasaIsmData ); *hMasaIsmData = NULL; @@ -258,6 +307,49 @@ ivas_error ivas_omasa_dec_config( /* ISM MD reconfig. */ n_MD = 0; +#ifdef OMASA_EXT_OUTPUT + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + /* the full number of hIsmMetaData are needed for EXT output */ + n_MD = st_ivas->nchan_ism; + ivas_ism_metadata_close( st_ivas->hIsmMetaData, 0 ); + + if ( ( error = ivas_ism_metadata_dec_create( st_ivas, st_ivas->nchan_ism, NULL ) ) != IVAS_ERR_OK ) + { + return error; + } + + ivas_ism_metadata_close( st_ivas->hIsmMetaData, n_MD ); + } + else + { + if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + { + n_MD = 1; + + if ( st_ivas->hIsmMetaData[0] == NULL ) + { + if ( ( error = ivas_ism_metadata_dec_create( st_ivas, 1, NULL ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + n_MD = st_ivas->nchan_ism; + + ivas_ism_metadata_close( st_ivas->hIsmMetaData, 0 ); + + if ( ( error = ivas_ism_metadata_dec_create( st_ivas, st_ivas->nchan_ism, NULL ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + ivas_ism_metadata_close( st_ivas->hIsmMetaData, n_MD ); + } +#else if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) { n_MD = 1; @@ -283,6 +375,7 @@ ivas_error ivas_omasa_dec_config( } ivas_ism_metadata_close( st_ivas->hIsmMetaData, n_MD ); +#endif st_ivas->hCPE[0]->element_brate = ivas_total_brate - ism_total_brate; @@ -312,8 +405,14 @@ ivas_error ivas_omasa_dec_config( } /* objects renderer reconfig. */ +#ifdef OMASA_EXT_OUTPUT + if ( st_ivas->hMasaIsmData != NULL || st_ivas->hIsmRendererData != NULL ) + { + /* this calls also ivas_ism_renderer_close() closing st_ivas->hIsmRendererData used by the EXT renderers. also cleans st_ivas->hMasaIsmData */ +#else if ( st_ivas->hMasaIsmData != NULL ) { +#endif ivas_omasa_separate_object_renderer_close( st_ivas ); } @@ -366,6 +465,33 @@ ivas_error ivas_omasa_dec_config( } } +#ifdef OMASA_EXT_OUTPUT + if ( st_ivas->renderer_type == RENDERER_OMASA_MIX_EXT ) + { + /* Allocate 'hIsmRendererData' handle */ + if ( ( error = ivas_omasa_combine_separate_ism_with_masa_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT ) + { + DIRAC_CONFIG_FLAG common_rend_config_flag = st_ivas->hSpatParamRendCom == NULL ? DIRAC_OPEN : DIRAC_RECONFIGURE; + + /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */ + if ( ( error = ivas_omasa_render_objects_from_mix_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_spat_hSpatParamRendCom_config( &st_ivas->hSpatParamRendCom, common_rend_config_flag, 0, + st_ivas->ivas_format, st_ivas->mc_mode, st_ivas->hDecoderConfig->output_Fs, 0, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + } +#endif /*-----------------------------------------------------------------* * TD Decorrelator *-----------------------------------------------------------------*/ @@ -567,6 +693,25 @@ ivas_error ivas_omasa_ism_metadata_dec( } } } +#ifdef OMASA_EXT_OUTPUT + + else if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ && st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + azimuth_ism = (int16_t) ( st_ivas->hIsmMetaData[0]->azimuth + 0.5f ); + elevation_ism = (int16_t) ( st_ivas->hIsmMetaData[0]->elevation + 0.5f ); + + for ( block = 0; block < 2; block++ ) + { + st_ivas->hMasaIsmData->azimuth_separated_ism[block] = st_ivas->hMasaIsmData->azimuth_separated_ism[block + 2]; + st_ivas->hMasaIsmData->elevation_separated_ism[block] = st_ivas->hMasaIsmData->elevation_separated_ism[block + 2]; + } + for ( block = 2; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) + { + st_ivas->hMasaIsmData->azimuth_separated_ism[block] = azimuth_ism; + st_ivas->hMasaIsmData->elevation_separated_ism[block] = elevation_ism; + } + } +#endif } return IVAS_ERR_OK; @@ -703,3 +848,471 @@ void ivas_omasa_rearrange_channels( return; } + +#ifdef OMASA_EXT_OUTPUT +/*-------------------------------------------------------------------------* + * ivas_omasa_combine_separate_ism_with_masa_open() + * + * Open structures, reserve memory, and init values. + *-------------------------------------------------------------------------*/ + +ivas_error ivas_omasa_combine_separate_ism_with_masa_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + int16_t i; + int16_t interpolator_length; + + if ( ( st_ivas->hIsmRendererData = (ISM_RENDERER_HANDLE) malloc( sizeof( ISM_RENDERER_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for MASA ISM renderer \n" ) ); + } + + for ( i = 0; i < MAX_NUM_OBJECTS; i++ ) + { + set_zero( st_ivas->hIsmRendererData->prev_gains[i], MAX_OUTPUT_CHANNELS ); + } + + interpolator_length = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC / MAX_PARAM_SPATIAL_SUBFRAMES ); + st_ivas->hIsmRendererData->interpolator = (float *) malloc( sizeof( float ) * interpolator_length ); + + for ( i = 0; i < interpolator_length; i++ ) + { + st_ivas->hIsmRendererData->interpolator[i] = (float) i / ( (float) interpolator_length ); + } + st_ivas->hIsmRendererData->interpolator_length = interpolator_length; + + return IVAS_ERR_OK; +} + +/*--------------------------------------------------------------------------* + * ivas_omasa_combine_separate_ism_with_masa() + * + * in case of external rendering, combine separated ISM signal with MASA stream + *--------------------------------------------------------------------------*/ + +void ivas_omasa_combine_separate_ism_with_masa( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float *output[], /* i/o: output synthesis signal */ + const int16_t nchan_ism, /* i : number of ISMs */ + const int16_t output_frame /* i : output frame length per channel */ +) +{ + int16_t n, sf, band, bin, k; + MASA_DECODER_EXT_OUT_META_HANDLE masaMetaHandle; + MASA_DECODER_EXT_OUT_META_HANDLE ismMetaHandle; + MASA_DECODER_EXT_OUT_META ismMeta; + float eneMasa[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float eneIsm[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float inRe[3][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + float inIm[3][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + float azimuth, elevation; + uint16_t directionIndex; + float old_panning_gains[2]; + float new_panning_gains[2]; + float panned_signal[L_FRAME48k]; + int16_t nchan_in; + int16_t nBins; + int16_t slot; + int16_t mrange[2], brange[2]; + int16_t processing_len, offset; + float g1, g2; + + masaMetaHandle = st_ivas->hMasa->data.extOutMeta; + ismMetaHandle = &ismMeta; + + /* Compute CLDFB analysis */ + nchan_in = st_ivas->nchan_transport + 1; + nBins = output_frame / CLDFB_NO_COL_MAX; + for ( slot = 0; slot < CLDFB_NO_COL_MAX; slot++ ) + { + for ( n = 0; n < nchan_in; n++ ) + { + cldfbAnalysis_ts( + &( output[n][nBins * slot] ), + inRe[n][slot], + inIm[n][slot], + nBins, st_ivas->cldfbAnaDec[n] ); + } + } + + /* Determine energies */ + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + mrange[0] = st_ivas->hMasa->config.block_grouping[sf]; + mrange[1] = st_ivas->hMasa->config.block_grouping[sf + 1]; + + set_zero( eneMasa[sf], MASA_FREQUENCY_BANDS ); + set_zero( eneIsm[sf], MASA_FREQUENCY_BANDS ); + + for ( slot = mrange[0]; slot < mrange[1]; slot++ ) + { + for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) + { + brange[0] = st_ivas->hMasa->config.band_grouping[band]; + brange[1] = st_ivas->hMasa->config.band_grouping[band + 1]; + + if ( brange[1] > nBins ) + { + brange[1] = nBins; + } + + for ( n = 0; n < MASA_MAX_TRANSPORT_CHANNELS; n++ ) + { + for ( bin = brange[0]; bin < brange[1]; bin++ ) + { + eneMasa[sf][band] += inRe[n][slot][bin] * inRe[n][slot][bin] + inIm[n][slot][bin] * inIm[n][slot][bin]; + } + } + for ( bin = brange[0]; bin < brange[1]; bin++ ) + { + eneIsm[sf][band] += inRe[MASA_MAX_TRANSPORT_CHANNELS][slot][bin] * inRe[MASA_MAX_TRANSPORT_CHANNELS][slot][bin] + inIm[MASA_MAX_TRANSPORT_CHANNELS][slot][bin] * inIm[MASA_MAX_TRANSPORT_CHANNELS][slot][bin]; + } + } + } + } + + /* Determine MASA metadata for the object */ + ismMetaHandle->descriptiveMeta.numberOfDirections = 0u; + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + azimuth = st_ivas->hMasaIsmData->azimuth_separated_ism[sf]; + elevation = st_ivas->hMasaIsmData->elevation_separated_ism[sf]; + + directionIndex = index_theta_phi_16( &elevation, &azimuth, st_ivas->hMasa->data.sph_grid16 ); + + for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) + { + ismMetaHandle->directionIndex[0][sf][band] = directionIndex; + ismMetaHandle->directToTotalRatio[0][sf][band] = UINT8_MAX; + ismMetaHandle->spreadCoherence[0][sf][band] = 0; + ismMetaHandle->surroundCoherence[sf][band] = 0; + ismMetaHandle->diffuseToTotalRatio[sf][band] = 0; + } + } + + /* Merge MASA metadatas */ + ivas_prerend_merge_masa_metadata( masaMetaHandle, masaMetaHandle, IVAS_REND_AUDIO_CONFIG_TYPE_MASA, eneMasa, ismMetaHandle, IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED, eneIsm ); + + /* Mix the separated object audio signal to the MASA audio signals */ + ivas_get_stereo_panning_gains( st_ivas->hMasaIsmData->azimuth_separated_ism[0], st_ivas->hMasaIsmData->elevation_separated_ism[0], old_panning_gains ); + ivas_get_stereo_panning_gains( st_ivas->hMasaIsmData->azimuth_separated_ism[2], st_ivas->hMasaIsmData->elevation_separated_ism[2], new_panning_gains ); + + processing_len = output_frame / 2; + for ( n = 0; n < MASA_MAX_TRANSPORT_CHANNELS; n++ ) + { + v_multc( output[MASA_MAX_TRANSPORT_CHANNELS], old_panning_gains[n], panned_signal, processing_len ); + v_add( output[n], panned_signal, output[n], processing_len ); + } + offset = processing_len; + + processing_len = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES; + for ( n = 0; n < MASA_MAX_TRANSPORT_CHANNELS; n++ ) + { + for ( k = 0; k < processing_len; k++ ) + { + g1 = st_ivas->hIsmRendererData->interpolator[k]; + g2 = 1.0f - g1; + output[n][k + offset] += ( g1 * new_panning_gains[n] + g2 * old_panning_gains[n] ) * output[MASA_MAX_TRANSPORT_CHANNELS][k + offset]; + } + } + offset += processing_len; + + for ( n = 0; n < MASA_MAX_TRANSPORT_CHANNELS; n++ ) + { + v_multc( &output[MASA_MAX_TRANSPORT_CHANNELS][offset], new_panning_gains[n], panned_signal, processing_len ); + v_add( &output[n][offset], panned_signal, &output[n][offset], processing_len ); + } + + /* Zero output object channels */ + for ( n = 0; n < nchan_ism; n++ ) + { + set_zero( output[MASA_MAX_TRANSPORT_CHANNELS + n], output_frame ); + } + + return; +} + +/*-------------------------------------------------------------------------* + * ivas_omasa_render_objects_from_mix_open() + * + * Open structures, reserve memory, and init values. + *-------------------------------------------------------------------------*/ + +ivas_error ivas_omasa_render_objects_from_mix_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + int16_t i; + + st_ivas->hMasaIsmData->delayBuffer_nchan = 1; + + st_ivas->hMasaIsmData->delayBuffer_size = (int16_t) ( ( st_ivas->hDecoderConfig->output_Fs / 50 ) / MAX_PARAM_SPATIAL_SUBFRAMES ); + + if ( ( st_ivas->hMasaIsmData->delayBuffer = (float **) malloc( st_ivas->hMasaIsmData->delayBuffer_nchan * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for MASA ISM delay buffer \n" ) ); + } + + for ( i = 0; i < st_ivas->hMasaIsmData->delayBuffer_nchan; i++ ) + { + if ( ( st_ivas->hMasaIsmData->delayBuffer[i] = (float *) malloc( st_ivas->hMasaIsmData->delayBuffer_size * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for MASA ISM delay buffer \n" ) ); + } + set_zero( st_ivas->hMasaIsmData->delayBuffer[i], st_ivas->hMasaIsmData->delayBuffer_size ); + } + + return IVAS_ERR_OK; +} + +/*--------------------------------------------------------------------------* + * ivas_omasa_render_objects_from_mix() + * + * In case of external rendering, render objects from the transport signal + * mix containing MASA audio and object audio. + *--------------------------------------------------------------------------*/ + +void ivas_omasa_render_objects_from_mix( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float *output[], /* o : output synthesis signal */ + const int16_t nchan_ism, /* i : number of ISMs */ + const int16_t output_frame /* i : output frame length per channel */ +) +{ + int16_t n, m, i; + MASA_ISM_EXT_DATA_HANDLE hExtData; + float separated_object[L_FRAME48k]; + float rendered_objects[MAX_NUM_OBJECTS][L_FRAME48k]; + int16_t coding_delay; + float new_panning_gains[2]; + float panning_gains[2]; + float azimuth, elevation; + float inRe[3][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + float inIm[3][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + float outRe[MAX_NUM_OBJECTS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + float outIm[MAX_NUM_OBJECTS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + float ism_proto_energy[MAX_NUM_OBJECTS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + float transport_energy[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + float ism_target_energy[MAX_NUM_OBJECTS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + float masa_target_energy[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + float ism_processing_gains[MAX_NUM_OBJECTS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + float masa_processing_gains[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + int16_t slot; + int16_t sf; + int16_t bin; + int16_t nchan_transport; + int16_t nBins; + float interpVal; + float *outSlotRePr, *outSlotImPr; + int16_t md_idx; + float iir_factor_prev, iir_factor_curr; + + /* Create slot to metadata map */ + for ( sf = 0, slot = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + for ( i = 0; i < CLDFB_SLOTS_PER_SUBFRAME; i++, slot++ ) + { + st_ivas->hSpatParamRendCom->render_to_md_map[slot] = st_ivas->hSpatParamRendCom->dirac_read_idx; + } + st_ivas->hSpatParamRendCom->dirac_read_idx = ( st_ivas->hSpatParamRendCom->dirac_read_idx + 1 ) % st_ivas->hSpatParamRendCom->dirac_md_buffer_length; + } + + /* Move separated object signal and object channels */ + mvr2r( output[CPE_CHANNELS], separated_object, output_frame ); + for ( n = 0; n < nchan_ism; n++ ) + { + set_zero( output[CPE_CHANNELS + n], output_frame ); + } + + /* Delay the separated object signal by the CLDFB delay */ + delay_signal( separated_object, output_frame, st_ivas->hMasaIsmData->delayBuffer[0], st_ivas->hMasaIsmData->delayBuffer_size ); + + /* Set object metadata to the ism struct */ + for ( n = 0; n < nchan_ism; n++ ) + { + st_ivas->hIsmMetaData[n]->azimuth = st_ivas->hMasaIsmData->azimuth_ism[n][0]; + st_ivas->hIsmMetaData[n]->elevation = st_ivas->hMasaIsmData->elevation_ism[n][0]; + } + + /* Move the separated object signal to the correct output channel */ + hExtData = st_ivas->hMasaIsmData->hExtData; + coding_delay = output_frame / 20 * 17; /* 17 ms of coding and CLDFB delay */ + mvr2r( separated_object, output[CPE_CHANNELS + hExtData->prev_idx_separated_ism], coding_delay ); + mvr2r( &separated_object[coding_delay], &output[CPE_CHANNELS + st_ivas->hMasaIsmData->idx_separated_ism][coding_delay], output_frame - coding_delay ); + + /* Compute CLDFB analysis */ + nchan_transport = st_ivas->nchan_transport; + nBins = output_frame / CLDFB_NO_COL_MAX; + for ( slot = 0; slot < CLDFB_NO_COL_MAX; slot++ ) + { + for ( n = 0; n < nchan_transport; n++ ) + { + cldfbAnalysis_ts( + &( output[n][nBins * slot] ), + inRe[n][slot], + inIm[n][slot], + nBins, st_ivas->cldfbAnaDec[n] ); + } + } + + /* Create prototype signals */ + for ( n = 0; n < nchan_ism; n++ ) + { + azimuth = (float)st_ivas->hIsmMetaData[n]->azimuth; + elevation = (float)st_ivas->hIsmMetaData[n]->elevation; + ivas_get_stereo_panning_gains( azimuth, elevation, new_panning_gains ); + interpVal = 0.0f; + + for ( slot = 0; slot < CLDFB_NO_COL_MAX; slot++ ) + { + interpVal += 1.0f / (float) CLDFB_NO_COL_MAX; + for ( m = 0; m < 2; m++ ) + { + panning_gains[m] = ( 1.0f - interpVal ) * hExtData->prev_panning_gains[n][m] + interpVal * new_panning_gains[m]; + } + v_multc( inRe[0][slot], panning_gains[0], outRe[n][slot], nBins ); + v_multc( inIm[0][slot], panning_gains[0], outIm[n][slot], nBins ); + v_multc_acc( inRe[1][slot], panning_gains[1], outRe[n][slot], nBins ); + v_multc_acc( inIm[1][slot], panning_gains[1], outIm[n][slot], nBins ); + } + + for ( m = 0; m < 2; m++ ) + { + hExtData->prev_panning_gains[n][m] = new_panning_gains[m]; + } + } + + /* Determine prototype energy */ + for ( n = 0; n < nchan_ism; n++ ) + { + for ( slot = 0; slot < CLDFB_NO_COL_MAX; slot++ ) + { + for ( bin = 0; bin < nBins; bin++ ) + { + ism_proto_energy[n][slot][bin] = ( outRe[n][slot][bin] * outRe[n][slot][bin] ) + ( outIm[n][slot][bin] * outIm[n][slot][bin] ); + } + } + } + + /* Determine transport energy */ + for ( slot = 0; slot < CLDFB_NO_COL_MAX; slot++ ) + { + set_zero( transport_energy[slot], nBins ); + } + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + for ( slot = 0; slot < CLDFB_NO_COL_MAX; slot++ ) + { + for ( bin = 0; bin < nBins; bin++ ) + { + transport_energy[slot][bin] += ( inRe[n][slot][bin] * inRe[n][slot][bin] ) + ( inIm[n][slot][bin] * inIm[n][slot][bin] ); + } + } + } + + /* Determine target energy */ + for ( n = 0; n < nchan_ism; n++ ) + { + for ( slot = 0; slot < CLDFB_NO_COL_MAX; slot++ ) + { + md_idx = st_ivas->hSpatParamRendCom->render_to_md_map[slot]; + for ( bin = 0; bin < nBins; bin++ ) + { + ism_target_energy[n][slot][bin] = transport_energy[slot][bin] * st_ivas->hMasaIsmData->energy_ratio_ism[n][md_idx][bin]; + } + } + } + for ( slot = 0; slot < CLDFB_NO_COL_MAX; slot++ ) + { + md_idx = st_ivas->hSpatParamRendCom->render_to_md_map[slot]; + for ( bin = 0; bin < nBins; bin++ ) + { + masa_target_energy[slot][bin] = transport_energy[slot][bin] * hExtData->masa_render_masa_to_total[md_idx][bin]; + } + } + + /* Determine temporally smoothed energies and determine gains using them */ + iir_factor_curr = ( 1.0f - EXT_RENDER_IIR_FAC ); + iir_factor_prev = EXT_RENDER_IIR_FAC; + for ( n = 0; n < nchan_ism; n++ ) + { + for ( slot = 0; slot < CLDFB_NO_COL_MAX; slot++ ) + { + for ( bin = 0; bin < nBins; bin++ ) + { + hExtData->ism_render_proto_energy[n][bin] *= iir_factor_prev; + hExtData->ism_render_proto_energy[n][bin] += iir_factor_curr * ism_proto_energy[n][slot][bin]; + hExtData->ism_render_target_energy[n][bin] *= iir_factor_prev; + hExtData->ism_render_target_energy[n][bin] += iir_factor_curr * ism_target_energy[n][slot][bin]; + + ism_processing_gains[n][slot][bin] = fminf( 4.0f, sqrtf( hExtData->ism_render_target_energy[n][bin] / fmaxf( 1e-12f, hExtData->ism_render_proto_energy[n][bin] ) ) ); + } + } + } + for ( slot = 0; slot < CLDFB_NO_COL_MAX; slot++ ) + { + for ( bin = 0; bin < nBins; bin++ ) + { + hExtData->masa_render_proto_energy[bin] *= iir_factor_prev; + hExtData->masa_render_proto_energy[bin] += iir_factor_curr * transport_energy[slot][bin]; + hExtData->masa_render_target_energy[bin] *= iir_factor_prev; + hExtData->masa_render_target_energy[bin] += iir_factor_curr * masa_target_energy[slot][bin]; + + masa_processing_gains[slot][bin] = fminf( 4.0f, sqrtf( hExtData->masa_render_target_energy[bin] / fmaxf( 1e-12f, hExtData->masa_render_proto_energy[bin] ) ) ); + } + } + + /* Determine output signals */ + for ( n = 0; n < nchan_ism; n++ ) + { + for ( slot = 0; slot < CLDFB_NO_COL_MAX; slot++ ) + { + for ( bin = 0; bin < nBins; bin++ ) + { + outRe[n][slot][bin] *= ism_processing_gains[n][slot][bin]; + outIm[n][slot][bin] *= ism_processing_gains[n][slot][bin]; + } + } + } + for ( n = 0; n < MASA_MAX_TRANSPORT_CHANNELS; n++ ) + { + for ( slot = 0; slot < CLDFB_NO_COL_MAX; slot++ ) + { + for ( bin = 0; bin < nBins; bin++ ) + { + inRe[n][slot][bin] *= masa_processing_gains[slot][bin]; + inIm[n][slot][bin] *= masa_processing_gains[slot][bin]; + } + } + } + + /* Compute CLDFB synthesis */ + for ( slot = 0; slot < CLDFB_NO_COL_MAX; slot++ ) + { + for ( n = 0; n < nchan_transport; n++ ) + { + outSlotRePr = &( inRe[n][slot][0] ); + outSlotImPr = &( inIm[n][slot][0] ); + cldfbSynthesis( &outSlotRePr, &outSlotImPr, &( output[n][nBins * slot] ), nBins, st_ivas->cldfbSynDec[n] ); + } + + for ( n = 0; n < nchan_ism; n++ ) + { + outSlotRePr = &( outRe[n][slot][0] ); + outSlotImPr = &( outIm[n][slot][0] ); + cldfbSynthesis( &outSlotRePr, &outSlotImPr, &( rendered_objects[n][nBins * slot] ), nBins, st_ivas->cldfbSynDec[n + CPE_CHANNELS] ); + } + } + + /* Combine the rendered objects with the separated objects */ + for ( n = 0; n < nchan_ism; n++ ) + { + v_add( output[CPE_CHANNELS + n], rendered_objects[n], output[CPE_CHANNELS + n], output_frame ); + } + + hExtData->prev_idx_separated_ism = st_ivas->hMasaIsmData->idx_separated_ism; + + return; +} +#endif diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index f050edde6a..95d76bb4a0 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -437,7 +437,22 @@ void ivas_renderer_select( } else if ( output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) { +#ifdef OMASA_EXT_OUTPUT + if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + { + *renderer_type = RENDERER_OMASA_OBJECT_EXT; + } + else if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + { + *renderer_type = RENDERER_OMASA_MIX_EXT; + } + else + { + *renderer_type = RENDERER_DISABLE; + } +#else *renderer_type = RENDERER_DISABLE; +#endif } } else if ( st_ivas->ivas_format == MC_FORMAT ) diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 82e95467fd..06507688cf 100644 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -697,7 +697,11 @@ void ivas_sba_dec_digest_tc( int16_t ch_idx, nchan_transport; /* set the md map */ +#ifdef OMASA_EXT_OUTPUT + if ( st_ivas->hDirAC || st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT ) +#else if ( st_ivas->hDirAC ) +#endif { ivas_dirac_dec_set_md_map( st_ivas, nCldfbSlots ); } diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 81427d9cfa..f0cc8707b5 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -873,6 +873,20 @@ typedef struct ivas_masa_decoder_struct } MASA_DECODER, *MASA_DECODER_HANDLE; +#ifdef OMASA_EXT_OUTPUT +/* Data structure for MASA_ISM EXT rendering */ +typedef struct ivas_masa_ism_ext_data_structure +{ + int16_t prev_idx_separated_ism; + float prev_panning_gains[MAX_NUM_OBJECTS][2]; + float ism_render_proto_energy[MAX_NUM_OBJECTS][CLDFB_NO_CHANNELS_MAX]; + float ism_render_target_energy[MAX_NUM_OBJECTS][CLDFB_NO_CHANNELS_MAX]; + float masa_render_proto_energy[CLDFB_NO_CHANNELS_MAX]; + float masa_render_target_energy[CLDFB_NO_CHANNELS_MAX]; + float masa_render_masa_to_total[MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR][CLDFB_NO_CHANNELS_MAX]; +} MASA_ISM_EXT_DATA, *MASA_ISM_EXT_DATA_HANDLE; +#endif + /* Data structure for MASA_ISM rendering */ typedef struct ivas_masa_ism_data_structure { @@ -903,6 +917,9 @@ typedef struct ivas_masa_ism_data_structure int16_t delayBuffer_size; int16_t delayBuffer_nchan; +#ifdef OMASA_EXT_OUTPUT + MASA_ISM_EXT_DATA_HANDLE hExtData; +#endif } MASA_ISM_DATA, *MASA_ISM_DATA_HANDLE; diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 6b55d4322b..775c20cde2 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1434,11 +1434,26 @@ ivas_error IVAS_DEC_GetNumObjects( uint16_t *numObjects /* o : number of objects for which the decoder has been configured */ ) { +#ifdef OMASA_EXT_OUTPUT + int16_t is_masa_ism; + is_masa_ism = 0; +#endif if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } +#ifdef OMASA_EXT_OUTPUT + if ( hIvasDec->st_ivas->hMasa != NULL ) + { + if ( hIvasDec->st_ivas->hMasa->config.input_ivas_format == MASA_ISM_FORMAT ) + { + is_masa_ism = 1; + } + } + if ( hIvasDec->st_ivas->ivas_format == ISM_FORMAT || hIvasDec->st_ivas->ivas_format == SBA_ISM_FORMAT || hIvasDec->st_ivas->ivas_format == MASA_ISM_FORMAT || is_masa_ism ) +#else if ( hIvasDec->st_ivas->ivas_format == ISM_FORMAT || hIvasDec->st_ivas->ivas_format == SBA_ISM_FORMAT || hIvasDec->st_ivas->ivas_format == MASA_ISM_FORMAT ) +#endif { *numObjects = hIvasDec->st_ivas->nchan_ism; } @@ -1472,6 +1487,12 @@ ivas_error IVAS_DEC_GetFormat( *format = IVAS_DEC_BS_UNKOWN; } +#ifdef OMASA_EXT_OUTPUT + if ( *format == IVAS_DEC_BS_MASA && hIvasDec->st_ivas->hMasa->config.input_ivas_format == MASA_ISM_FORMAT ) + { + *format = IVAS_DEC_BS_MASA_ISM; + } +#endif return IVAS_ERR_OK; } @@ -1579,6 +1600,10 @@ ivas_error IVAS_DEC_GetObjectMetadata( { Decoder_Struct *st_ivas; ISM_METADATA_HANDLE hIsmMeta; +#ifdef OMASA_EXT_OUTPUT + int16_t is_masa_ism; + is_masa_ism = 0; +#endif if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) { @@ -1586,7 +1611,18 @@ ivas_error IVAS_DEC_GetObjectMetadata( } st_ivas = hIvasDec->st_ivas; +#ifdef OMASA_EXT_OUTPUT + if ( hIvasDec->st_ivas->hMasa != NULL ) + { + if ( hIvasDec->st_ivas->hMasa->config.input_ivas_format == MASA_ISM_FORMAT ) + { + is_masa_ism = 1; + } + } + if ( st_ivas->ivas_format != ISM_FORMAT && st_ivas->ivas_format != MASA_ISM_FORMAT && st_ivas->ivas_format != SBA_ISM_FORMAT && is_masa_ism == 0 ) +#else if ( st_ivas->ivas_format != ISM_FORMAT && st_ivas->ivas_format != MASA_ISM_FORMAT && st_ivas->ivas_format != SBA_ISM_FORMAT ) +#endif { return IVAS_ERR_WRONG_MODE; } @@ -2188,11 +2224,20 @@ ivas_error IVAS_DEC_GetDelay( st_ivas = hIvasDec->st_ivas; hDecoderConfig = st_ivas->hDecoderConfig; +#ifdef OMASA_EXT_OUTPUT +#ifdef SPLIT_REND_WITH_HEAD_ROT + nSamples[1] = NS2SA( hDecoderConfig->output_Fs, get_delay( DEC, hDecoderConfig->output_Fs, st_ivas->ivas_format, st_ivas->cldfbSynDec[0], hDecoderConfig->output_config ) ); +#else + nSamples[1] = NS2SA( hDecoderConfig->output_Fs, get_delay( DEC, hDecoderConfig->output_Fs, st_ivas->ivas_format, st_ivas->cldfbSynDec[0] ) ); +#endif +#else #ifdef SPLIT_REND_WITH_HEAD_ROT nSamples[1] = NS2SA( hDecoderConfig->output_Fs, get_delay( DEC, hDecoderConfig->output_Fs, st_ivas->ivas_format, st_ivas->cldfbAnaDec[0], hDecoderConfig->output_config ) ); #else nSamples[1] = NS2SA( hDecoderConfig->output_Fs, get_delay( DEC, hDecoderConfig->output_Fs, st_ivas->ivas_format, st_ivas->cldfbAnaDec[0] ) ); #endif +#endif + nSamples[2] = (int16_t) roundf( (float) st_ivas->binaural_latency_ns * hDecoderConfig->output_Fs / 1000000000.f ); nSamples[0] = nSamples[1] + nSamples[2]; diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 6019ee03cc..0b3ce68445 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -418,18 +418,49 @@ ivas_error ivas_masa_encode( } else { - /* write the number of MASA transport channels */ - push_next_indice( hMetaData, nchan_transport - 1, MASA_TRANSP_BITS ); +#ifdef OMASA_EXT_OUTPUT + if ( ivas_format == MASA_ISM_FORMAT && ism_mode == ISM_MODE_NONE ) + { + /* use the MASA number of transport channels bit to signal if there are 3 or 4 objects */ + if ( nchan_ism == 4 ) + { + push_next_indice( hMetaData, 1, MASA_TRANSP_BITS ); + } + else + { + push_next_indice( hMetaData, 0, MASA_TRANSP_BITS ); + } + } + else + { +#endif + /* write the number of MASA transport channels */ + push_next_indice( hMetaData, nchan_transport - 1, MASA_TRANSP_BITS ); +#ifdef OMASA_EXT_OUTPUT + } +#endif hQMetaData->metadata_max_bits -= MASA_TRANSP_BITS; } if ( ivas_format == MASA_ISM_FORMAT && ism_mode == ISM_MODE_NONE ) { +#ifdef OMASA_EXT_OUTPUT + if ( nchan_ism <= 3 ) + { + push_next_indice( hMetaData, nchan_ism, MASA_HEADER_BITS ); + } + else + { + push_next_indice( hMetaData, nchan_ism - 1, MASA_HEADER_BITS ); + } + hQMetaData->metadata_max_bits -= MASA_HEADER_BITS; +#else /* signal MASA_ISM_FORMAT to decoder */ push_next_indice( hMetaData, 1, 1 ); /* write reserved bit */ push_next_indice( hMetaData, 0, MASA_HEADER_BITS - 1 ); hQMetaData->metadata_max_bits -= MASA_HEADER_BITS; +#endif } else { diff --git a/lib_rend/ivas_output_init.c b/lib_rend/ivas_output_init.c index 78db534f79..d478142653 100644 --- a/lib_rend/ivas_output_init.c +++ b/lib_rend/ivas_output_init.c @@ -336,6 +336,13 @@ int16_t ivas_get_nchan_buffers_dec( nchan_out_buff = max( nchan_out_buff, audioCfg2channels( st_ivas->intern_config ) ); nchan_out_buff = max( nchan_out_buff, audioCfg2channels( output_config ) ); } + +#ifdef OMASA_EXT_OUTPUT + if ( output_config == IVAS_AUDIO_CONFIG_EXTERNAL && st_ivas->nchan_ism > 0 ) + { + nchan_out_buff = st_ivas->nchan_ism + CPE_CHANNELS; + } +#endif } else if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) { diff --git a/lib_util/masa_file_writer.c b/lib_util/masa_file_writer.c index 171eb4a2e6..636bdd0d57 100644 --- a/lib_util/masa_file_writer.c +++ b/lib_util/masa_file_writer.c @@ -41,12 +41,20 @@ typedef struct masaMetaDelayStorage { MASA_DECRIPTIVE_META descriptiveMeta; +#ifdef OMASA_EXT_OUTPUT + uint16_t directionIndex[MASA_MAXIMUM_DIRECTIONS][DELAY_MASA_PARAM_DEC_SFR + 1][MASA_FREQUENCY_BANDS]; + uint8_t directToTotalRatio[MASA_MAXIMUM_DIRECTIONS][DELAY_MASA_PARAM_DEC_SFR + 1][MASA_FREQUENCY_BANDS]; + uint8_t spreadCoherence[MASA_MAXIMUM_DIRECTIONS][DELAY_MASA_PARAM_DEC_SFR + 1][MASA_FREQUENCY_BANDS]; + uint8_t surroundCoherence[DELAY_MASA_PARAM_DEC_SFR + 1][MASA_FREQUENCY_BANDS]; + uint8_t diffuseToTotalRatio[DELAY_MASA_PARAM_DEC_SFR + 1][MASA_FREQUENCY_BANDS]; + uint8_t prevDelay; +#else uint16_t directionIndex[MASA_MAXIMUM_DIRECTIONS][DELAY_MASA_PARAM_DEC_SFR][MASA_FREQUENCY_BANDS]; uint8_t directToTotalRatio[MASA_MAXIMUM_DIRECTIONS][DELAY_MASA_PARAM_DEC_SFR][MASA_FREQUENCY_BANDS]; uint8_t spreadCoherence[MASA_MAXIMUM_DIRECTIONS][DELAY_MASA_PARAM_DEC_SFR][MASA_FREQUENCY_BANDS]; uint8_t surroundCoherence[DELAY_MASA_PARAM_DEC_SFR][MASA_FREQUENCY_BANDS]; uint8_t diffuseToTotalRatio[DELAY_MASA_PARAM_DEC_SFR][MASA_FREQUENCY_BANDS]; - +#endif } MASA_META_DELAY_STORAGE; struct MasaFileWriter @@ -88,14 +96,94 @@ static void getExtMasaMetadataFileName( static void delayMasaMetadata( MASA_DECODER_EXT_OUT_META_HANDLE extOutMeta, /* i/o: New input metadata which is inplace replaced with delayed metadata frame */ +#ifdef OMASA_EXT_OUTPUT + MASA_META_DELAY_STORAGE *delayStorage, /* i/o: Storage for 15 ms of metadata and related descriptive metadata */ + uint8_t delayNsf +#else MASA_META_DELAY_STORAGE *delayStorage /* i/o: Storage for 10 ms of metadata and related descriptive metadata */ +#endif ) { int16_t dir, sf, band; uint8_t currentNumberOfDirections; +#ifdef OMASA_EXT_OUTPUT + int16_t storeReadOffset; +#endif /* Move meta to delay and output. Always use two directions as the metadata is prepared to contain zero energy second direction * if there is 1dir meta. */ +#ifdef OMASA_EXT_OUTPUT + /* stable state expected results delay change expected results + delayNsf = 2 delayNsf = 3 delayNsf = 3 (from 2) delayNsf = 2 (from 3) + ext[0] = delayStorage[0] (prev ext[2]) ext[0] = delayStorage[0] (prev ext[1]) ext[0] = delayStorage[0] (prev ext[2]) ext[0] = delayStorage[1] (prev ext[2]) + ext[1] = delayStorage[1] (prev ext[3]) ext[1] = delayStorage[1] (prev ext[2]) ext[1] = delayStorage[1] (prev ext[3]) ext[1] = delayStorage[2] (prev ext[3]) + ext[2] = ext[0] ext[2] = delayStorage[2] (prev ext[3]) ext[2] = delayStorage[1] (prev ext[3]) ext[2] = ext[0] + ext[3] = ext[1] ext[3] = ext[0] ext[3] = ext[0] ext[3] = ext[0] + delayStorage[0] = ext[2] delayStorage[0] = ext[1] delayStorage[0] = ext[1] delayStorage[0] = ext[2] + delayStorage[1] = ext[3] delayStorage[1] = ext[2] delayStorage[1] = ext[2] delayStorage[1] = ext[3] + delayStorage[2] = ext[3] delayStorage[2] = ext[3] + */ + storeReadOffset = delayStorage->prevDelay > delayNsf ? delayStorage->prevDelay - delayNsf : 0; /* delay decreases: read later from storage -> discard one sf */ + + for ( sf = 0; sf < delayNsf; sf++ ) + { + for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) + { + uint16_t temp_u16; + uint8_t temp_u8; + int16_t toStoreIdx, reOrgIdx, storeReadIdx; + + toStoreIdx = sf + MAX_PARAM_SPATIAL_SUBFRAMES - delayNsf; + reOrgIdx = sf + delayNsf; + /* when switching to longer delay, repeat the last valid sf to fill the gap */ + storeReadIdx = ( ( sf + storeReadOffset ) < delayStorage->prevDelay ) ? sf + storeReadOffset : delayStorage->prevDelay - 1; + + for ( dir = 0; dir < MASA_MAXIMUM_DIRECTIONS; dir++ ) + { + temp_u16 = delayStorage->directionIndex[dir][storeReadIdx][band]; + delayStorage->directionIndex[dir][sf][band] = extOutMeta->directionIndex[dir][toStoreIdx][band]; + if ( reOrgIdx < MAX_PARAM_SPATIAL_SUBFRAMES ) + { + extOutMeta->directionIndex[dir][reOrgIdx][band] = extOutMeta->directionIndex[dir][sf][band]; + } + extOutMeta->directionIndex[dir][sf][band] = temp_u16; + + temp_u8 = delayStorage->directToTotalRatio[dir][storeReadIdx][band]; + delayStorage->directToTotalRatio[dir][sf][band] = extOutMeta->directToTotalRatio[dir][toStoreIdx][band]; + if ( reOrgIdx < MAX_PARAM_SPATIAL_SUBFRAMES ) + { + extOutMeta->directToTotalRatio[dir][reOrgIdx][band] = extOutMeta->directToTotalRatio[dir][sf][band]; + } + extOutMeta->directToTotalRatio[dir][sf][band] = temp_u8; + + temp_u8 = delayStorage->spreadCoherence[dir][storeReadIdx][band]; + delayStorage->spreadCoherence[dir][sf][band] = extOutMeta->spreadCoherence[dir][toStoreIdx][band]; + if ( reOrgIdx < MAX_PARAM_SPATIAL_SUBFRAMES ) + { + extOutMeta->spreadCoherence[dir][reOrgIdx][band] = extOutMeta->spreadCoherence[dir][sf][band]; + } + extOutMeta->spreadCoherence[dir][sf][band] = temp_u8; + } + + temp_u8 = delayStorage->surroundCoherence[storeReadIdx][band]; + delayStorage->surroundCoherence[sf][band] = extOutMeta->surroundCoherence[toStoreIdx][band]; + if ( reOrgIdx < MAX_PARAM_SPATIAL_SUBFRAMES ) + { + extOutMeta->surroundCoherence[reOrgIdx][band] = extOutMeta->surroundCoherence[sf][band]; + } + extOutMeta->surroundCoherence[sf][band] = temp_u8; + + temp_u8 = delayStorage->diffuseToTotalRatio[storeReadIdx][band]; + delayStorage->diffuseToTotalRatio[sf][band] = extOutMeta->diffuseToTotalRatio[toStoreIdx][band]; + if ( reOrgIdx < MAX_PARAM_SPATIAL_SUBFRAMES ) + { + extOutMeta->diffuseToTotalRatio[reOrgIdx][band] = extOutMeta->diffuseToTotalRatio[sf][band]; + } + extOutMeta->diffuseToTotalRatio[sf][band] = temp_u8; + } + } + +#else for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES - DELAY_MASA_PARAM_DEC_SFR; sf++ ) { for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) @@ -131,6 +219,7 @@ static void delayMasaMetadata( extOutMeta->diffuseToTotalRatio[sf][band] = temp_u8; } } +#endif /* Finalize descriptive meta by using new frame except for number of directions which is the larger of the two */ currentNumberOfDirections = extOutMeta->descriptiveMeta.numberOfDirections; @@ -140,6 +229,10 @@ static void delayMasaMetadata( } delayStorage->descriptiveMeta.numberOfDirections = currentNumberOfDirections; +#ifdef OMASA_EXT_OUTPUT + delayStorage->prevDelay = delayNsf; + +#endif return; } @@ -182,6 +275,9 @@ ivas_error MasaFileWriter_open( if ( !delayCompensationEnabled ) { self->delayStorage = calloc( sizeof( MASA_META_DELAY_STORAGE ), 1 ); +#ifdef OMASA_EXT_OUTPUT + self->delayStorage->prevDelay = DELAY_MASA_PARAM_DEC_SFR; +#endif } *masaWriter = self; @@ -197,8 +293,13 @@ ivas_error MasaFileWriter_open( *---------------------------------------------------------------------*/ ivas_error MasaFileWriter_writeFrame( - MasaFileWriter *self, /* i/o: MasaFileWriter handle */ + MasaFileWriter *self, /* i/o: MasaFileWriter handle */ +#ifdef OMASA_EXT_OUTPUT + MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta, /* i/o: MASA ext out meta handle to be written */ + const float *decDelay /* i : decoding audio delay */ +#else MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta /* i/o: MASA ext out meta handle to be written */ +#endif ) { if ( self == NULL ) @@ -210,6 +311,17 @@ ivas_error MasaFileWriter_writeFrame( int16_t i, sf, dir, numDirections; uint8_t writeTempOther[MASA_FREQUENCY_BANDS]; +#ifdef OMASA_EXT_OUTPUT + /* If delay storage has been reserved, then we are in the normal mode for the decoder + * (i.e., no delay compensation for PCM) which means that metadata should be delayed + * by two or three subframes (10 or 15 ms). Descriptive metadata is a combined result. */ + if ( self->delayStorage ) + { + uint8_t delayFrames = (uint8_t) ( (int32_t) ( (*decDelay) * 48000 ) / L_SPATIAL_SUBFR_48k ); + + delayMasaMetadata( hMasaExtOutMeta, self->delayStorage, delayFrames ); + } +#else /* If delay storage has been reserved, then we are in the normal mode for the decoder * (i.e., no delay compensation for PCM) which means that metadata should be delayed * by two subframes (10 ms). Descriptive metadata is a combined result. */ @@ -217,6 +329,7 @@ ivas_error MasaFileWriter_writeFrame( { delayMasaMetadata( hMasaExtOutMeta, self->delayStorage ); } +#endif numDirections = hMasaExtOutMeta->descriptiveMeta.numberOfDirections + 1; diff --git a/lib_util/masa_file_writer.h b/lib_util/masa_file_writer.h index 0619ff02e7..594b81b0ff 100644 --- a/lib_util/masa_file_writer.h +++ b/lib_util/masa_file_writer.h @@ -34,6 +34,7 @@ #define IVAS_MASA_FILE_WRITER_H #include "common_api_types.h" +#include "options.h" #include @@ -48,7 +49,12 @@ ivas_error MasaFileWriter_open( ivas_error MasaFileWriter_writeFrame( MasaFileWriter *self, /* i/o: MasaFileWriter handle */ - IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta /* i/o: MASA ext out meta handle to be written */ +#ifdef OMASA_EXT_OUTPUT + IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta, /* i/o: MASA ext out meta handle to be written */ + const float *decDelay /* i : decoding audio delay */ +#else + IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta /* i/o: MASA ext out meta handle to be written */ +#endif ); void MasaFileWriter_close( -- GitLab From 8938c3e8d80dee483e0d6d6501cb5f050bc09a57 Mon Sep 17 00:00:00 2001 From: Jouni Paulus Date: Tue, 6 Feb 2024 12:22:07 +0100 Subject: [PATCH 2/9] apply clang formatting --- apps/renderer.c | 2 +- lib_dec/ivas_init_dec.c | 2 +- lib_dec/ivas_jbm_dec.c | 2 +- lib_dec/ivas_masa_dec.c | 16 ++++++++-------- lib_dec/ivas_omasa_dec.c | 30 +++++++++++++++--------------- lib_dec/lib_dec.c | 2 +- lib_util/masa_file_writer.c | 10 +++++----- lib_util/masa_file_writer.h | 2 +- 8 files changed, 33 insertions(+), 33 deletions(-) diff --git a/apps/renderer.c b/apps/renderer.c index 13d2dc507c..f6bad90ae5 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -2126,7 +2126,7 @@ int main( } #ifdef OMASA_EXT_OUTPUT - if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMetaOutput, NULL ) ) != IVAS_ERR_OK ) /* NULL -> use default metadata delay settings */ + if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMetaOutput, NULL ) ) != IVAS_ERR_OK ) /* NULL -> use default metadata delay settings */ #else if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMetaOutput ) ) != IVAS_ERR_OK ) #endif diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index a9f920c8b8..44a662eb50 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -393,7 +393,7 @@ ivas_error ivas_dec_setup( if ( st_ivas->nchan_ism > 0 ) { /* the input_ivas_format should be MASA_ISM_FORMAT, but we cannot initialize it now */ - if ( st_ivas->nchan_transport == 2 && st_ivas->nchan_ism == 3) + if ( st_ivas->nchan_transport == 2 && st_ivas->nchan_ism == 3 ) { st_ivas->nchan_ism = 4; } diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 15c0cc9396..98268335db 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -322,7 +322,7 @@ ivas_error ivas_jbm_dec_tc( ivas_masa_prerender( st_ivas, p_output, output_frame, nchan_remapped ); #ifdef OMASA_EXT_OUTPUT /* external output */ - if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL && st_ivas->hMasa->config.input_ivas_format == MASA_ISM_FORMAT) + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL && st_ivas->hMasa->config.input_ivas_format == MASA_ISM_FORMAT ) { for ( n = 0; n < st_ivas->nchan_ism; n++ ) { diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 1dd34ae06d..8f386e9a5a 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -244,17 +244,17 @@ ivas_error ivas_masa_decode( } } #ifdef OMASA_EXT_OUTPUT - /* read 2 bits: - '00' - MASA format at the encoder - '01' - MASA_ISM_FORMAT at the encoder, with 1 object + /* read 2 bits: + '00' - MASA format at the encoder + '01' - MASA_ISM_FORMAT at the encoder, with 1 object '10' - MASA_ISM_FORMAT at the encoder, with 2 objects '11' - MASA_ISM_FORMAT at the encoder, with 3 or 4 objects - reading if 3 or 4 object is performed later + reading if 3 or 4 object is performed later */ byteBuffer = st->bit_stream[( st->next_bit_pos )--]; - byteBuffer = byteBuffer + 2*st->bit_stream[( st->next_bit_pos )--]; + byteBuffer = byteBuffer + 2 * st->bit_stream[( st->next_bit_pos )--]; - if ( byteBuffer == 0 && ivas_format == MASA_FORMAT) + if ( byteBuffer == 0 && ivas_format == MASA_FORMAT ) { hMasa->config.input_ivas_format = MASA_FORMAT; } @@ -1486,8 +1486,8 @@ ivas_error ivas_masa_dec_reconfigure( #ifdef OMASA_EXT_OUTPUT if ( st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_EXTERNAL ) { - st_ivas->nchan_ism = 0; /* Initialization if it has not been already read from the end of the bitstream at the same time - with reading of the format: nchan_ism is needed in MASA format because for the EXT output in + st_ivas->nchan_ism = 0; /* Initialization if it has not been already read from the end of the bitstream at the same time + with reading of the format: nchan_ism is needed in MASA format because for the EXT output in MASA-only (pre-rendering mode of OMASA) the number of ISMs to output correct number of empty objects is needed */ } #else diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index e5b7bc570f..4becf79cf9 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -124,7 +124,7 @@ ivas_error ivas_omasa_data_open( for ( ch = 0; ch < MAX_NUM_OBJECTS; ch++ ) { - set_zero( hExtData->prev_panning_gains[ch], 2); + set_zero( hExtData->prev_panning_gains[ch], 2 ); } for ( ch = 0; ch < MAX_NUM_OBJECTS; ch++ ) @@ -892,10 +892,10 @@ ivas_error ivas_omasa_combine_separate_ism_with_masa_open( *--------------------------------------------------------------------------*/ void ivas_omasa_combine_separate_ism_with_masa( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - float *output[], /* i/o: output synthesis signal */ - const int16_t nchan_ism, /* i : number of ISMs */ - const int16_t output_frame /* i : output frame length per channel */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float *output[], /* i/o: output synthesis signal */ + const int16_t nchan_ism, /* i : number of ISMs */ + const int16_t output_frame /* i : output frame length per channel */ ) { int16_t n, sf, band, bin, k; @@ -992,7 +992,7 @@ void ivas_omasa_combine_separate_ism_with_masa( } /* Merge MASA metadatas */ - ivas_prerend_merge_masa_metadata( masaMetaHandle, masaMetaHandle, IVAS_REND_AUDIO_CONFIG_TYPE_MASA, eneMasa, ismMetaHandle, IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED, eneIsm ); + ivas_prerend_merge_masa_metadata( masaMetaHandle, masaMetaHandle, IVAS_REND_AUDIO_CONFIG_TYPE_MASA, eneMasa, ismMetaHandle, IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED, eneIsm ); /* Mix the separated object audio signal to the MASA audio signals */ ivas_get_stereo_panning_gains( st_ivas->hMasaIsmData->azimuth_separated_ism[0], st_ivas->hMasaIsmData->elevation_separated_ism[0], old_panning_gains ); @@ -1011,7 +1011,7 @@ void ivas_omasa_combine_separate_ism_with_masa( { for ( k = 0; k < processing_len; k++ ) { - g1 = st_ivas->hIsmRendererData->interpolator[k]; + g1 = st_ivas->hIsmRendererData->interpolator[k]; g2 = 1.0f - g1; output[n][k + offset] += ( g1 * new_panning_gains[n] + g2 * old_panning_gains[n] ) * output[MASA_MAX_TRANSPORT_CHANNELS][k + offset]; } @@ -1074,10 +1074,10 @@ ivas_error ivas_omasa_render_objects_from_mix_open( *--------------------------------------------------------------------------*/ void ivas_omasa_render_objects_from_mix( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - float *output[], /* o : output synthesis signal */ - const int16_t nchan_ism, /* i : number of ISMs */ - const int16_t output_frame /* i : output frame length per channel */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float *output[], /* o : output synthesis signal */ + const int16_t nchan_ism, /* i : number of ISMs */ + const int16_t output_frame /* i : output frame length per channel */ ) { int16_t n, m, i; @@ -1159,8 +1159,8 @@ void ivas_omasa_render_objects_from_mix( /* Create prototype signals */ for ( n = 0; n < nchan_ism; n++ ) { - azimuth = (float)st_ivas->hIsmMetaData[n]->azimuth; - elevation = (float)st_ivas->hIsmMetaData[n]->elevation; + azimuth = (float) st_ivas->hIsmMetaData[n]->azimuth; + elevation = (float) st_ivas->hIsmMetaData[n]->elevation; ivas_get_stereo_panning_gains( azimuth, elevation, new_panning_gains ); interpVal = 0.0f; @@ -1190,7 +1190,7 @@ void ivas_omasa_render_objects_from_mix( { for ( bin = 0; bin < nBins; bin++ ) { - ism_proto_energy[n][slot][bin] = ( outRe[n][slot][bin] * outRe[n][slot][bin] ) + ( outIm[n][slot][bin] * outIm[n][slot][bin] ); + ism_proto_energy[n][slot][bin] = ( outRe[n][slot][bin] * outRe[n][slot][bin] ) + ( outIm[n][slot][bin] * outIm[n][slot][bin] ); } } } @@ -1206,7 +1206,7 @@ void ivas_omasa_render_objects_from_mix( { for ( bin = 0; bin < nBins; bin++ ) { - transport_energy[slot][bin] += ( inRe[n][slot][bin] * inRe[n][slot][bin] ) + ( inIm[n][slot][bin] * inIm[n][slot][bin] ); + transport_energy[slot][bin] += ( inRe[n][slot][bin] * inRe[n][slot][bin] ) + ( inIm[n][slot][bin] * inIm[n][slot][bin] ); } } } diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 775c20cde2..d75874af18 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1619,7 +1619,7 @@ ivas_error IVAS_DEC_GetObjectMetadata( is_masa_ism = 1; } } - if ( st_ivas->ivas_format != ISM_FORMAT && st_ivas->ivas_format != MASA_ISM_FORMAT && st_ivas->ivas_format != SBA_ISM_FORMAT && is_masa_ism == 0 ) + if ( st_ivas->ivas_format != ISM_FORMAT && st_ivas->ivas_format != MASA_ISM_FORMAT && st_ivas->ivas_format != SBA_ISM_FORMAT && is_masa_ism == 0 ) #else if ( st_ivas->ivas_format != ISM_FORMAT && st_ivas->ivas_format != MASA_ISM_FORMAT && st_ivas->ivas_format != SBA_ISM_FORMAT ) #endif diff --git a/lib_util/masa_file_writer.c b/lib_util/masa_file_writer.c index 636bdd0d57..0f14c4bb39 100644 --- a/lib_util/masa_file_writer.c +++ b/lib_util/masa_file_writer.c @@ -97,10 +97,10 @@ static void getExtMasaMetadataFileName( static void delayMasaMetadata( MASA_DECODER_EXT_OUT_META_HANDLE extOutMeta, /* i/o: New input metadata which is inplace replaced with delayed metadata frame */ #ifdef OMASA_EXT_OUTPUT - MASA_META_DELAY_STORAGE *delayStorage, /* i/o: Storage for 15 ms of metadata and related descriptive metadata */ + MASA_META_DELAY_STORAGE *delayStorage, /* i/o: Storage for 15 ms of metadata and related descriptive metadata */ uint8_t delayNsf #else - MASA_META_DELAY_STORAGE *delayStorage /* i/o: Storage for 10 ms of metadata and related descriptive metadata */ + MASA_META_DELAY_STORAGE *delayStorage /* i/o: Storage for 10 ms of metadata and related descriptive metadata */ #endif ) { @@ -123,7 +123,7 @@ static void delayMasaMetadata( delayStorage[1] = ext[3] delayStorage[1] = ext[2] delayStorage[1] = ext[2] delayStorage[1] = ext[3] delayStorage[2] = ext[3] delayStorage[2] = ext[3] */ - storeReadOffset = delayStorage->prevDelay > delayNsf ? delayStorage->prevDelay - delayNsf : 0; /* delay decreases: read later from storage -> discard one sf */ + storeReadOffset = delayStorage->prevDelay > delayNsf ? delayStorage->prevDelay - delayNsf : 0; /* delay decreases: read later from storage -> discard one sf */ for ( sf = 0; sf < delayNsf; sf++ ) { @@ -293,7 +293,7 @@ ivas_error MasaFileWriter_open( *---------------------------------------------------------------------*/ ivas_error MasaFileWriter_writeFrame( - MasaFileWriter *self, /* i/o: MasaFileWriter handle */ + MasaFileWriter *self, /* i/o: MasaFileWriter handle */ #ifdef OMASA_EXT_OUTPUT MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta, /* i/o: MASA ext out meta handle to be written */ const float *decDelay /* i : decoding audio delay */ @@ -317,7 +317,7 @@ ivas_error MasaFileWriter_writeFrame( * by two or three subframes (10 or 15 ms). Descriptive metadata is a combined result. */ if ( self->delayStorage ) { - uint8_t delayFrames = (uint8_t) ( (int32_t) ( (*decDelay) * 48000 ) / L_SPATIAL_SUBFR_48k ); + uint8_t delayFrames = (uint8_t) ( (int32_t) ( ( *decDelay ) * 48000 ) / L_SPATIAL_SUBFR_48k ); delayMasaMetadata( hMasaExtOutMeta, self->delayStorage, delayFrames ); } diff --git a/lib_util/masa_file_writer.h b/lib_util/masa_file_writer.h index 594b81b0ff..6568bb13b4 100644 --- a/lib_util/masa_file_writer.h +++ b/lib_util/masa_file_writer.h @@ -48,7 +48,7 @@ ivas_error MasaFileWriter_open( ); ivas_error MasaFileWriter_writeFrame( - MasaFileWriter *self, /* i/o: MasaFileWriter handle */ + MasaFileWriter *self, /* i/o: MasaFileWriter handle */ #ifdef OMASA_EXT_OUTPUT IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta, /* i/o: MASA ext out meta handle to be written */ const float *decDelay /* i : decoding audio delay */ -- GitLab From fe7fb005cc766ee6a1cdfb5085bb187d289b97f7 Mon Sep 17 00:00:00 2001 From: advasila Date: Tue, 6 Feb 2024 17:50:55 +0200 Subject: [PATCH 3/9] OMASA EXT code review 1 --- lib_com/ivas_prot.h | 20 ++++++++++---------- lib_dec/ivas_init_dec.c | 4 ++-- lib_dec/ivas_jbm_dec.c | 1 + lib_dec/ivas_masa_dec.c | 1 + lib_dec/ivas_stat_dec.h | 1 + lib_dec/lib_dec.c | 3 +++ 6 files changed, 18 insertions(+), 12 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index eaa592ca7b..f7bafa08e0 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5794,25 +5794,25 @@ void ivas_omasa_rearrange_channels( #ifdef OMASA_EXT_OUTPUT ivas_error ivas_omasa_combine_separate_ism_with_masa_open( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); void ivas_omasa_combine_separate_ism_with_masa( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - float *output[], /* o : output synthesis signal */ - const int16_t nchan_ism, /* i : number of ISMs */ - const int16_t output_frame /* i : output frame length per channel */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float *output[], /* o : output synthesis signal */ + const int16_t nchan_ism, /* i : number of ISMs */ + const int16_t output_frame /* i : output frame length per channel */ ); ivas_error ivas_omasa_render_objects_from_mix_open( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); void ivas_omasa_render_objects_from_mix( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - float *output[], /* o : output synthesis signal */ - const int16_t nchan_ism, /* i : number of ISMs */ - const int16_t output_frame /* i : output frame length per channel */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float *output[], /* o : output synthesis signal */ + const int16_t nchan_ism, /* i : number of ISMs */ + const int16_t output_frame /* i : output frame length per channel */ ); #endif diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 44a662eb50..3f93f0d24e 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -387,7 +387,7 @@ ivas_error ivas_dec_setup( } #ifdef OMASA_EXT_OUTPUT - /* this should be non-zero if original input format was MASA_ISM */ + /* this should be non-zero if original input format was MASA_ISM_FORMAT */ st_ivas->nchan_ism = st_ivas->bit_stream[( ivas_total_brate / FRAMES_PER_SEC ) - 3] + 2 * st_ivas->bit_stream[( ivas_total_brate / FRAMES_PER_SEC ) - 2]; if ( st_ivas->nchan_ism > 0 ) @@ -1159,7 +1159,7 @@ ivas_error ivas_init_decoder( hDecoderConfig->nchan_out += st_ivas->nchan_ism; } #ifdef OMASA_EXT_OUTPUT - else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || ( st_ivas->ism_mode == ISM_MODE_NONE && st_ivas->ivas_format == MASA_FORMAT ) ) + else if ( st_ivas->ivas_format == MASA_ISM_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) #else else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) #endif diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 98268335db..db6ad5af3c 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -321,6 +321,7 @@ ivas_error ivas_jbm_dec_tc( { ivas_masa_prerender( st_ivas, p_output, output_frame, nchan_remapped ); #ifdef OMASA_EXT_OUTPUT + /* external output */ if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL && st_ivas->hMasa->config.input_ivas_format == MASA_ISM_FORMAT ) { diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 8f386e9a5a..7b921c6684 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -244,6 +244,7 @@ ivas_error ivas_masa_decode( } } #ifdef OMASA_EXT_OUTPUT + /* read 2 bits: '00' - MASA format at the encoder '01' - MASA_ISM_FORMAT at the encoder, with 1 object diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index f0cc8707b5..9fb2bd0752 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -920,6 +920,7 @@ typedef struct ivas_masa_ism_data_structure #ifdef OMASA_EXT_OUTPUT MASA_ISM_EXT_DATA_HANDLE hExtData; #endif + } MASA_ISM_DATA, *MASA_ISM_DATA_HANDLE; diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index d75874af18..8bdefad104 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1438,11 +1438,13 @@ ivas_error IVAS_DEC_GetNumObjects( int16_t is_masa_ism; is_masa_ism = 0; #endif + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } #ifdef OMASA_EXT_OUTPUT + if ( hIvasDec->st_ivas->hMasa != NULL ) { if ( hIvasDec->st_ivas->hMasa->config.input_ivas_format == MASA_ISM_FORMAT ) @@ -1493,6 +1495,7 @@ ivas_error IVAS_DEC_GetFormat( *format = IVAS_DEC_BS_MASA_ISM; } #endif + return IVAS_ERR_OK; } -- GitLab From cab9c0e4251283c6dc282db0f92bca5ef36ebb1f Mon Sep 17 00:00:00 2001 From: advasila Date: Wed, 7 Feb 2024 11:32:07 +0200 Subject: [PATCH 4/9] OMASA EXT code review 2 --- lib_dec/ivas_init_dec.c | 8 +------- lib_dec/ivas_masa_dec.c | 8 ++++++++ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 3f93f0d24e..eeae4591ef 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -400,14 +400,8 @@ ivas_error ivas_dec_setup( /* for MASA_ISM_FORMAT at input the number of MASA transport channels is always 2 */ st_ivas->nchan_transport = 2; element_mode_flag = 1; - - /* ISM metadata */ - if ( st_ivas->hIsmMetaData[0] != NULL ) - { - /* these are not needed -> clean. EXT metafile writer in OMASA needs only the number of ISMs and writes default null-data */ - ivas_ism_metadata_close( st_ivas->hIsmMetaData, 0 ); - } } + #endif if ( st_ivas->ini_frame > 0 ) { diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 7b921c6684..2f3810ce56 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -609,6 +609,14 @@ ivas_error ivas_masa_dec_open( } ism_total_brate = 0; +#ifdef OMASA_EXT_OUTPUT + /* ISM metadata */ + if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hIsmMetaData[0] != NULL && st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + /* these are not needed -> clean. EXT metafile writer in OMASA needs only the number of ISMs and writes default null-data */ + ivas_ism_metadata_close( st_ivas->hIsmMetaData, 0 ); + } +#endif if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->nSCE > 0 && ( st_ivas->ism_mode == ISM_MASA_MODE_DISC || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) ) { for ( i = 0; i < st_ivas->nSCE; i++ ) -- GitLab From 37875f0b0d06a7dbd348b6e0c4eb08c81d43ba35 Mon Sep 17 00:00:00 2001 From: Jouni Paulus Date: Wed, 7 Feb 2024 11:04:01 +0100 Subject: [PATCH 5/9] address MR formatting comments --- lib_dec/ivas_omasa_dec.c | 5 +++++ lib_dec/ivas_stat_dec.h | 1 + 2 files changed, 6 insertions(+) diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index 4becf79cf9..ddcffb2179 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -491,6 +491,7 @@ ivas_error ivas_omasa_dec_config( return error; } } + #endif /*-----------------------------------------------------------------* * TD Decorrelator @@ -850,6 +851,7 @@ void ivas_omasa_rearrange_channels( } #ifdef OMASA_EXT_OUTPUT + /*-------------------------------------------------------------------------* * ivas_omasa_combine_separate_ism_with_masa_open() * @@ -885,6 +887,7 @@ ivas_error ivas_omasa_combine_separate_ism_with_masa_open( return IVAS_ERR_OK; } + /*--------------------------------------------------------------------------* * ivas_omasa_combine_separate_ism_with_masa() * @@ -1033,6 +1036,7 @@ void ivas_omasa_combine_separate_ism_with_masa( return; } + /*-------------------------------------------------------------------------* * ivas_omasa_render_objects_from_mix_open() * @@ -1066,6 +1070,7 @@ ivas_error ivas_omasa_render_objects_from_mix_open( return IVAS_ERR_OK; } + /*--------------------------------------------------------------------------* * ivas_omasa_render_objects_from_mix() * diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 9fb2bd0752..5d1b4249a4 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -884,6 +884,7 @@ typedef struct ivas_masa_ism_ext_data_structure float masa_render_proto_energy[CLDFB_NO_CHANNELS_MAX]; float masa_render_target_energy[CLDFB_NO_CHANNELS_MAX]; float masa_render_masa_to_total[MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR][CLDFB_NO_CHANNELS_MAX]; + } MASA_ISM_EXT_DATA, *MASA_ISM_EXT_DATA_HANDLE; #endif -- GitLab From 8399899fdc886a894637b02630cf615b923df98d Mon Sep 17 00:00:00 2001 From: Jouni Paulus Date: Wed, 7 Feb 2024 11:06:42 +0100 Subject: [PATCH 6/9] address MR formatting comments, cont'd --- lib_dec/ivas_omasa_dec.c | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index ddcffb2179..27a92f73a5 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -695,7 +695,6 @@ ivas_error ivas_omasa_ism_metadata_dec( } } #ifdef OMASA_EXT_OUTPUT - else if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ && st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) { azimuth_ism = (int16_t) ( st_ivas->hIsmMetaData[0]->azimuth + 0.5f ); -- GitLab From 4e6c3b5e190f4215c3ff7c6aec12012bd1fca9d1 Mon Sep 17 00:00:00 2001 From: Jouni Paulus Date: Wed, 7 Feb 2024 12:11:36 +0100 Subject: [PATCH 7/9] rename switch to include issue number: NONBE_FIX_984_OMASA_EXT_OUTPUT --- apps/decoder.c | 14 +++++++------- apps/renderer.c | 2 +- lib_com/ivas_cnst.h | 2 +- lib_com/ivas_prot.h | 2 +- lib_com/options.h | 2 +- lib_dec/ivas_init_dec.c | 10 +++++----- lib_dec/ivas_jbm_dec.c | 12 ++++++------ lib_dec/ivas_masa_dec.c | 16 ++++++++-------- lib_dec/ivas_omasa_dec.c | 18 +++++++++--------- lib_dec/ivas_output_config.c | 2 +- lib_dec/ivas_sba_dec.c | 2 +- lib_dec/ivas_stat_dec.h | 4 ++-- lib_dec/lib_dec.c | 12 ++++++------ lib_enc/ivas_masa_enc.c | 6 +++--- lib_rend/ivas_output_init.c | 2 +- lib_util/masa_file_writer.c | 16 ++++++++-------- lib_util/masa_file_writer.h | 2 +- 17 files changed, 62 insertions(+), 62 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 2d81b8bd00..c5d9aa5dc2 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -2080,7 +2080,7 @@ static ivas_error initOnFirstGoodFrame( for ( int16_t j = 0; j < numInitialBadFrames; ++j ) { -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT float delayMs = (float) ( pFullDelayNumSamples[0] ) / (float) ( *delayTimeScale ); if ( ( error = MasaFileWriter_writeFrame( *ppMasaWriter, hMasaExtOutMeta, &delayMs ) ) != IVAS_ERR_OK ) #else @@ -2592,7 +2592,7 @@ static ivas_error decodeG192( if ( bsFormat == IVAS_DEC_BS_MASA || bsFormat == IVAS_DEC_BS_MASA_ISM ) { IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta; -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT int16_t fullDelayNumSamples[3]; float delayMs; @@ -2608,7 +2608,7 @@ static ivas_error decodeG192( goto cleanup; } -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT delayMs = (float) ( fullDelayNumSamples[0] ) / (float) ( delayTimeScale ); if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta, &delayMs ) ) != IVAS_ERR_OK ) #else @@ -2748,7 +2748,7 @@ static ivas_error decodeG192( if ( bsFormat == IVAS_DEC_BS_MASA || bsFormat == IVAS_DEC_BS_MASA_ISM ) { IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta; -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT int16_t fullDelayNumSamples[3]; float delayMs; @@ -2763,7 +2763,7 @@ static ivas_error decodeG192( goto cleanup; } -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT delayMs = (float) ( fullDelayNumSamples[0] ) / (float) ( delayTimeScale ); if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta, &delayMs ) ) != IVAS_ERR_OK ) #else @@ -3443,7 +3443,7 @@ static ivas_error decodeVoIP( if ( bsFormat == IVAS_DEC_BS_MASA || bsFormat == IVAS_DEC_BS_MASA_ISM ) { IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta; -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT int16_t fullDelayNumSamples[3]; float delayMs; @@ -3459,7 +3459,7 @@ static ivas_error decodeVoIP( goto cleanup; } -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT delayMs = (float) ( fullDelayNumSamples[0] ) / (float) ( delayTimeScale ); if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta, &delayMs ) ) != IVAS_ERR_OK ) #else diff --git a/apps/renderer.c b/apps/renderer.c index 6715da4771..34badf7328 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -2152,7 +2152,7 @@ int main( } } -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMetaOutput, NULL ) ) != IVAS_ERR_OK ) /* NULL -> use default metadata delay settings */ #else if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMetaOutput ) ) != IVAS_ERR_OK ) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 9c58681753..f487e48c5b 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -118,7 +118,7 @@ typedef enum RENDERER_NON_DIEGETIC_DOWNMIX, RENDERER_OSBA_STEREO, RENDERER_OSBA_AMBI, -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT RENDERER_OSBA_LS, RENDERER_OMASA_OBJECT_EXT, RENDERER_OMASA_MIX_EXT diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index fd898f7fb4..df4a0e4e31 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5795,7 +5795,7 @@ void ivas_omasa_rearrange_channels( const int16_t output_frame /* i : output frame length per channel */ ); -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT ivas_error ivas_omasa_combine_separate_ism_with_masa_open( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); diff --git a/lib_com/options.h b/lib_com/options.h index 8d004d00d5..33a2d3faa4 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -184,7 +184,7 @@ #define NONBE_FIX_947_STEREO_DMX_EVS_POC /* Orange: Fix clicks on POC */ #define NONBE_FIX_947_STEREO_DMX_EVS_PHA /* Orange: Fix issues on PHA */ -#define OMASA_EXT_OUTPUT /* Nokia: complete the OMASA EXT output implementation */ +#define NONBE_FIX_984_OMASA_EXT_OUTPUT /* Nokia: issue #984: complete the OMASA EXT output implementation */ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 3355c4ae95..e970afcb2f 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -386,7 +386,7 @@ ivas_error ivas_dec_setup( st_ivas->nchan_transport = 1; } -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT /* this should be non-zero if original input format was MASA_ISM_FORMAT */ st_ivas->nchan_ism = st_ivas->bit_stream[( ivas_total_brate / FRAMES_PER_SEC ) - 3] + 2 * st_ivas->bit_stream[( ivas_total_brate / FRAMES_PER_SEC ) - 2]; @@ -1159,7 +1159,7 @@ ivas_error ivas_init_decoder( hDecoderConfig->nchan_out = audioCfg2channels( IVAS_AUDIO_CONFIG_HOA3 ); hDecoderConfig->nchan_out += st_ivas->nchan_ism; } -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT else if ( st_ivas->ivas_format == MASA_ISM_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) #else else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) @@ -2128,7 +2128,7 @@ ivas_error ivas_init_decoder( return error; } } -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT ) { @@ -3031,7 +3031,7 @@ void ivas_init_dec_get_num_cldfb_instances( *numCldfbSyntheses = 0; } break; -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT case RENDERER_OMASA_OBJECT_EXT: *numCldfbAnalyses = st_ivas->nchan_transport; *numCldfbSyntheses = st_ivas->hDecoderConfig->nchan_out; @@ -3179,7 +3179,7 @@ static ivas_error doSanityChecks_IVAS( return IVAS_ERROR( IVAS_ERR_ACOUSTIC_ENVIRONMENT_NOT_SUPPORTED, "Wrong set-up: Acoustic environment is not supported in this output configuration." ); } } -#ifndef OMASA_EXT_OUTPUT +#ifndef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) { diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index f8fc8c7808..20045c174e 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -320,7 +320,7 @@ ivas_error ivas_jbm_dec_tc( if ( st_ivas->ivas_format == MASA_FORMAT ) { ivas_masa_prerender( st_ivas, p_output, output_frame, nchan_remapped ); -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT /* external output */ if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL && st_ivas->hMasa->config.input_ivas_format == MASA_ISM_FORMAT ) @@ -413,7 +413,7 @@ ivas_error ivas_jbm_dec_tc( } else if ( output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) { -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) { ivas_omasa_rearrange_channels( p_output, nchan_transport_ism, output_frame ); @@ -923,7 +923,7 @@ void ivas_jbm_dec_feed_tc_to_renderer( } else if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) { -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( st_ivas->renderer_type == RENDERER_OMASA_MIX_EXT || st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT ) { ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); @@ -943,7 +943,7 @@ void ivas_jbm_dec_feed_tc_to_renderer( { ivas_ism_dec_digest_tc( st_ivas ); } -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT } #endif } @@ -1236,7 +1236,7 @@ ivas_error ivas_jbm_dec_render( { ivas_omasa_dirac_rend_jbm( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output ); } -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT else if ( st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT || st_ivas->renderer_type == RENDERER_OMASA_MIX_EXT ) { ivas_jbm_dec_tc_buffer_playout( st_ivas, nSamplesAskedLocal, nSamplesRendered, p_output ); @@ -2729,7 +2729,7 @@ TC_BUFFER_MODE ivas_jbm_dec_get_tc_buffer_mode( case RENDERER_PARAM_ISM: case RENDERER_BINAURAL_MIXER_CONV: case RENDERER_BINAURAL_MIXER_CONV_ROOM: -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT case RENDERER_OMASA_OBJECT_EXT: case RENDERER_OMASA_MIX_EXT: #endif diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 2f3810ce56..1f17bfda96 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -243,7 +243,7 @@ ivas_error ivas_masa_decode( } } } -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT /* read 2 bits: '00' - MASA format at the encoder @@ -358,7 +358,7 @@ ivas_error ivas_masa_decode( } } } -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT else if ( st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT ) { *nb_bits_read += ivas_decode_masaism_metadata( hQMetaData, st_ivas->hMasa, st_ivas->hMasaIsmData, st_ivas->nchan_ism, st->bit_stream, &st->next_bit_pos, @@ -484,7 +484,7 @@ ivas_error ivas_masa_decode( dirac_bs_md_write_idx = st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx; /* Store the write-index for this frame */ ivas_qmetadata_to_dirac( hQMetaData, st_ivas->hDirAC, hMasa, st_ivas->hSpatParamRendCom, ivas_total_brate, ivas_format, 0, 0 ); } -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT else if ( st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT ) { st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx = ( st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx + MAX_PARAM_SPATIAL_SUBFRAMES ) % st_ivas->hSpatParamRendCom->dirac_md_buffer_length; @@ -609,7 +609,7 @@ ivas_error ivas_masa_dec_open( } ism_total_brate = 0; -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT /* ISM metadata */ if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hIsmMetaData[0] != NULL && st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) { @@ -687,7 +687,7 @@ ivas_error ivas_masa_dec_open( nchan_transport = 1; nchan_to_allocate = 1; } -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT else if ( st_ivas->ivas_format == MASA_ISM_FORMAT && ( st_ivas->renderer_type == RENDERER_OMASA_MIX_EXT || st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT ) ) { nchan_transport = st_ivas->nchan_transport + st_ivas->nchan_ism; @@ -1492,7 +1492,7 @@ ivas_error ivas_masa_dec_reconfigure( if ( st_ivas->ivas_format == MASA_FORMAT ) { -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_EXTERNAL ) { st_ivas->nchan_ism = 0; /* Initialization if it has not been already read from the end of the bitstream at the same time @@ -1557,7 +1557,7 @@ ivas_error ivas_masa_dec_reconfigure( /* addtl channel for CNG */ tc_nchan_to_allocate++; } -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT else if ( st_ivas->ivas_format == MASA_ISM_FORMAT && ( st_ivas->renderer_type == RENDERER_OMASA_MIX_EXT || st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT ) ) { tc_nchan_transport = st_ivas->nchan_transport + st_ivas->nchan_ism; @@ -2539,7 +2539,7 @@ static int16_t ivas_decode_masaism_metadata( { hMasaIsmData->energy_ratio_ism[dir][meta_write_index][b] = energy_ratio_ism[i][band][dir]; } -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( hMasaIsmData->hExtData != NULL ) { diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index 27a92f73a5..fc1682dbe5 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -32,7 +32,7 @@ #include "options.h" #include -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT #include #endif #include "ivas_cnst.h" @@ -51,7 +51,7 @@ *------------------------------------------------------------------------*/ #define OMASA_TDREND_MATCHING_GAIN 0.7943f -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT #define EXT_RENDER_IIR_FAC 0.95f #endif @@ -109,7 +109,7 @@ ivas_error ivas_omasa_data_open( set_s( hMasaIsmData->azimuth_separated_ism, 0, MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR ); set_s( hMasaIsmData->elevation_separated_ism, 0, MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR ); -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT hMasaIsmData->hExtData = NULL; if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) { @@ -177,7 +177,7 @@ void ivas_omasa_data_close( ( *hMasaIsmData )->delayBuffer = NULL; } -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( ( *hMasaIsmData )->hExtData != NULL ) { free( ( *hMasaIsmData )->hExtData ); @@ -307,7 +307,7 @@ ivas_error ivas_omasa_dec_config( /* ISM MD reconfig. */ n_MD = 0; -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) { /* the full number of hIsmMetaData are needed for EXT output */ @@ -405,7 +405,7 @@ ivas_error ivas_omasa_dec_config( } /* objects renderer reconfig. */ -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( st_ivas->hMasaIsmData != NULL || st_ivas->hIsmRendererData != NULL ) { /* this calls also ivas_ism_renderer_close() closing st_ivas->hIsmRendererData used by the EXT renderers. also cleans st_ivas->hMasaIsmData */ @@ -465,7 +465,7 @@ ivas_error ivas_omasa_dec_config( } } -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( st_ivas->renderer_type == RENDERER_OMASA_MIX_EXT ) { /* Allocate 'hIsmRendererData' handle */ @@ -694,7 +694,7 @@ ivas_error ivas_omasa_ism_metadata_dec( } } } -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT else if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ && st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) { azimuth_ism = (int16_t) ( st_ivas->hIsmMetaData[0]->azimuth + 0.5f ); @@ -849,7 +849,7 @@ void ivas_omasa_rearrange_channels( return; } -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT /*-------------------------------------------------------------------------* * ivas_omasa_combine_separate_ism_with_masa_open() diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index 95d76bb4a0..78497222ab 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -437,7 +437,7 @@ void ivas_renderer_select( } else if ( output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) { -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) { *renderer_type = RENDERER_OMASA_OBJECT_EXT; diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index dab39fb108..9ce03e2ffa 100644 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -697,7 +697,7 @@ void ivas_sba_dec_digest_tc( int16_t ch_idx, nchan_transport; /* set the md map */ -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( st_ivas->hDirAC || st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT ) #else if ( st_ivas->hDirAC ) diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 9c39c7e891..f624e43e5f 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -873,7 +873,7 @@ typedef struct ivas_masa_decoder_struct } MASA_DECODER, *MASA_DECODER_HANDLE; -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT /* Data structure for MASA_ISM EXT rendering */ typedef struct ivas_masa_ism_ext_data_structure { @@ -918,7 +918,7 @@ typedef struct ivas_masa_ism_data_structure int16_t delayBuffer_size; int16_t delayBuffer_nchan; -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT MASA_ISM_EXT_DATA_HANDLE hExtData; #endif diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 19ea555c9a..a9dfc7817b 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1434,7 +1434,7 @@ ivas_error IVAS_DEC_GetNumObjects( uint16_t *numObjects /* o : number of objects for which the decoder has been configured */ ) { -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT int16_t is_masa_ism; is_masa_ism = 0; #endif @@ -1443,7 +1443,7 @@ ivas_error IVAS_DEC_GetNumObjects( { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( hIvasDec->st_ivas->hMasa != NULL ) { @@ -1489,7 +1489,7 @@ ivas_error IVAS_DEC_GetFormat( *format = IVAS_DEC_BS_UNKOWN; } -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( *format == IVAS_DEC_BS_MASA && hIvasDec->st_ivas->hMasa->config.input_ivas_format == MASA_ISM_FORMAT ) { *format = IVAS_DEC_BS_MASA_ISM; @@ -1603,7 +1603,7 @@ ivas_error IVAS_DEC_GetObjectMetadata( { Decoder_Struct *st_ivas; ISM_METADATA_HANDLE hIsmMeta; -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT int16_t is_masa_ism; is_masa_ism = 0; #endif @@ -1614,7 +1614,7 @@ ivas_error IVAS_DEC_GetObjectMetadata( } st_ivas = hIvasDec->st_ivas; -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( hIvasDec->st_ivas->hMasa != NULL ) { if ( hIvasDec->st_ivas->hMasa->config.input_ivas_format == MASA_ISM_FORMAT ) @@ -2250,7 +2250,7 @@ ivas_error IVAS_DEC_GetDelay( st_ivas = hIvasDec->st_ivas; hDecoderConfig = st_ivas->hDecoderConfig; -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT #ifdef SPLIT_REND_WITH_HEAD_ROT nSamples[1] = NS2SA( hDecoderConfig->output_Fs, get_delay( DEC, hDecoderConfig->output_Fs, st_ivas->ivas_format, st_ivas->cldfbSynDec[0], hDecoderConfig->output_config ) ); #else diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 0b3ce68445..c2bd98a44d 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -418,7 +418,7 @@ ivas_error ivas_masa_encode( } else { -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( ivas_format == MASA_ISM_FORMAT && ism_mode == ISM_MODE_NONE ) { /* use the MASA number of transport channels bit to signal if there are 3 or 4 objects */ @@ -436,7 +436,7 @@ ivas_error ivas_masa_encode( #endif /* write the number of MASA transport channels */ push_next_indice( hMetaData, nchan_transport - 1, MASA_TRANSP_BITS ); -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT } #endif hQMetaData->metadata_max_bits -= MASA_TRANSP_BITS; @@ -444,7 +444,7 @@ ivas_error ivas_masa_encode( if ( ivas_format == MASA_ISM_FORMAT && ism_mode == ISM_MODE_NONE ) { -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( nchan_ism <= 3 ) { push_next_indice( hMetaData, nchan_ism, MASA_HEADER_BITS ); diff --git a/lib_rend/ivas_output_init.c b/lib_rend/ivas_output_init.c index 1abe146efa..bf7d5ac33f 100644 --- a/lib_rend/ivas_output_init.c +++ b/lib_rend/ivas_output_init.c @@ -337,7 +337,7 @@ int16_t ivas_get_nchan_buffers_dec( nchan_out_buff = max( nchan_out_buff, audioCfg2channels( output_config ) ); } -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( output_config == IVAS_AUDIO_CONFIG_EXTERNAL && st_ivas->nchan_ism > 0 ) { nchan_out_buff = st_ivas->nchan_ism + CPE_CHANNELS; diff --git a/lib_util/masa_file_writer.c b/lib_util/masa_file_writer.c index 0f14c4bb39..5b7ab4c698 100644 --- a/lib_util/masa_file_writer.c +++ b/lib_util/masa_file_writer.c @@ -41,7 +41,7 @@ typedef struct masaMetaDelayStorage { MASA_DECRIPTIVE_META descriptiveMeta; -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT uint16_t directionIndex[MASA_MAXIMUM_DIRECTIONS][DELAY_MASA_PARAM_DEC_SFR + 1][MASA_FREQUENCY_BANDS]; uint8_t directToTotalRatio[MASA_MAXIMUM_DIRECTIONS][DELAY_MASA_PARAM_DEC_SFR + 1][MASA_FREQUENCY_BANDS]; uint8_t spreadCoherence[MASA_MAXIMUM_DIRECTIONS][DELAY_MASA_PARAM_DEC_SFR + 1][MASA_FREQUENCY_BANDS]; @@ -96,7 +96,7 @@ static void getExtMasaMetadataFileName( static void delayMasaMetadata( MASA_DECODER_EXT_OUT_META_HANDLE extOutMeta, /* i/o: New input metadata which is inplace replaced with delayed metadata frame */ -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT MASA_META_DELAY_STORAGE *delayStorage, /* i/o: Storage for 15 ms of metadata and related descriptive metadata */ uint8_t delayNsf #else @@ -106,13 +106,13 @@ static void delayMasaMetadata( { int16_t dir, sf, band; uint8_t currentNumberOfDirections; -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT int16_t storeReadOffset; #endif /* Move meta to delay and output. Always use two directions as the metadata is prepared to contain zero energy second direction * if there is 1dir meta. */ -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT /* stable state expected results delay change expected results delayNsf = 2 delayNsf = 3 delayNsf = 3 (from 2) delayNsf = 2 (from 3) ext[0] = delayStorage[0] (prev ext[2]) ext[0] = delayStorage[0] (prev ext[1]) ext[0] = delayStorage[0] (prev ext[2]) ext[0] = delayStorage[1] (prev ext[2]) @@ -229,7 +229,7 @@ static void delayMasaMetadata( } delayStorage->descriptiveMeta.numberOfDirections = currentNumberOfDirections; -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT delayStorage->prevDelay = delayNsf; #endif @@ -275,7 +275,7 @@ ivas_error MasaFileWriter_open( if ( !delayCompensationEnabled ) { self->delayStorage = calloc( sizeof( MASA_META_DELAY_STORAGE ), 1 ); -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT self->delayStorage->prevDelay = DELAY_MASA_PARAM_DEC_SFR; #endif } @@ -294,7 +294,7 @@ ivas_error MasaFileWriter_open( ivas_error MasaFileWriter_writeFrame( MasaFileWriter *self, /* i/o: MasaFileWriter handle */ -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta, /* i/o: MASA ext out meta handle to be written */ const float *decDelay /* i : decoding audio delay */ #else @@ -311,7 +311,7 @@ ivas_error MasaFileWriter_writeFrame( int16_t i, sf, dir, numDirections; uint8_t writeTempOther[MASA_FREQUENCY_BANDS]; -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT /* If delay storage has been reserved, then we are in the normal mode for the decoder * (i.e., no delay compensation for PCM) which means that metadata should be delayed * by two or three subframes (10 or 15 ms). Descriptive metadata is a combined result. */ diff --git a/lib_util/masa_file_writer.h b/lib_util/masa_file_writer.h index 6568bb13b4..5c5f8f1f68 100644 --- a/lib_util/masa_file_writer.h +++ b/lib_util/masa_file_writer.h @@ -49,7 +49,7 @@ ivas_error MasaFileWriter_open( ivas_error MasaFileWriter_writeFrame( MasaFileWriter *self, /* i/o: MasaFileWriter handle */ -#ifdef OMASA_EXT_OUTPUT +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta, /* i/o: MASA ext out meta handle to be written */ const float *decDelay /* i : decoding audio delay */ #else -- GitLab From 5ee1cf946cb78097c45f7303835bc1026d6d149b Mon Sep 17 00:00:00 2001 From: Mikko-Ville Laitinen Date: Mon, 12 Feb 2024 15:39:37 +0200 Subject: [PATCH 8/9] Write default metadata for ISM_MASA_MODE_MASA_ONE_OBJ EXT output --- lib_dec/lib_dec.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index a9dfc7817b..82beb04759 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1637,7 +1637,11 @@ ivas_error IVAS_DEC_GetObjectMetadata( hIsmMeta = st_ivas->hIsmMetaData[objectIdx]; +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + if ( hIsmMeta == NULL || zero_flag || ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) ) +#else if ( hIsmMeta == NULL || zero_flag ) +#endif { metadata->azimuth = 0.f; metadata->elevation = 0.f; -- GitLab From c56ee4c909df23498cc0c92670909291fef7528e Mon Sep 17 00:00:00 2001 From: Mikko-Ville Laitinen Date: Tue, 13 Feb 2024 09:54:20 +0200 Subject: [PATCH 9/9] Improve ISM metadata sync for ISM_MASA_MODE_PARAM_ONE_OBJ EXT --- lib_dec/ivas_omasa_dec.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index fc1682dbe5..07a97e4e6e 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -1135,8 +1135,8 @@ void ivas_omasa_render_objects_from_mix( /* Set object metadata to the ism struct */ for ( n = 0; n < nchan_ism; n++ ) { - st_ivas->hIsmMetaData[n]->azimuth = st_ivas->hMasaIsmData->azimuth_ism[n][0]; - st_ivas->hIsmMetaData[n]->elevation = st_ivas->hMasaIsmData->elevation_ism[n][0]; + st_ivas->hIsmMetaData[n]->azimuth = st_ivas->hMasaIsmData->azimuth_ism[n][st_ivas->hSpatParamRendCom->dirac_read_idx]; + st_ivas->hIsmMetaData[n]->elevation = st_ivas->hMasaIsmData->elevation_ism[n][st_ivas->hSpatParamRendCom->dirac_read_idx]; } /* Move the separated object signal to the correct output channel */ -- GitLab