From bf1a29d15435c09245864804cd8226f06f671fcf Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Thu, 15 Feb 2024 15:03:57 +0100 Subject: [PATCH 01/11] move decoding and TSM from IVAS_DEC_GetSamples to IVAS_DEC_FeedFrame_Serial --- lib_com/options.h | 2 +- lib_dec/lib_dec.c | 118 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 119 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 1e13919859..ac34b1243d 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -161,7 +161,7 @@ #define FIX_976_USAN_PVQ_ENC_DEC_EVS_CR /* Ericsson: premature cast to unsigned detected by USAN corrected */ - +#define FIX_XXX_API_FEEDFRAME_GETSAMPLES /* #################### End BE switches ################################## */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index d8e7300c7a..1ee9b2fa61 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -91,6 +91,11 @@ struct IVAS_DEC int16_t sdp_hf_only; /* RTP payload format parameter: only Header-Full format without zero padding for size collision avoidance */ int16_t prev_ft_speech; /* RXDTX handler: previous frametype flag for G.192 format AMRWB SID_FIRST detection */ int16_t CNG; /* RXDTX handler: CNG=1, nonCNG=0 */ + +#ifdef FIX_XXX_API_FEEDFRAME_GETSAMPLES + uint16_t nSamplesFlushed; + int16_t *flushbuffer; +#endif }; @@ -172,6 +177,10 @@ ivas_error IVAS_DEC_Open( hIvasDec->hasDecodedFirstGoodFrame = false; hIvasDec->isInitialized = false; hIvasDec->updateOrientation = false; +#ifdef FIX_XXX_API_FEEDFRAME_GETSAMPLES + hIvasDec->flushbuffer = NULL; + hIvasDec->nSamplesFlushed = 0; +#endif hIvasDec->mode = mode; @@ -313,6 +322,12 @@ void IVAS_DEC_Close( { free( ( *phIvasDec )->apaExecBuffer ); } +#ifdef FIX_XXX_API_FEEDFRAME_GETSAMPLES + if ( ( *phIvasDec )->flushbuffer != NULL ) + { + free( ( *phIvasDec )->flushbuffer ); + } +#endif free( *phIvasDec ); *phIvasDec = NULL; phIvasDec = NULL; @@ -477,6 +492,15 @@ ivas_error IVAS_DEC_Configure( hIvasDec->tsm_max_scaling = 0; hIvasDec->tsm_quality = 1.0f; +#ifdef FIX_XXX_API_FEEDFRAME_GETSAMPLES + /* init flush buffer if necessary (only needed for binaural)*/ + if ( tsmEnabled && ( outputConfig == IVAS_AUDIO_CONFIG_BINAURAL || outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM || outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + { + hIvasDec->flushbuffer = (int16_t *) malloc( CPE_CHANNELS * hIvasDec->nSamplesFrame / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( int16_t ) ); + set_s( hIvasDec->flushbuffer, 0, CPE_CHANNELS * hIvasDec->nSamplesFrame / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES ); + } +#endif + return error; } @@ -729,6 +753,15 @@ ivas_error IVAS_DEC_EnableVoIP( return IVAS_ERR_FAILED_ALLOC; } +#ifdef FIX_XXX_API_FEEDFRAME_GETSAMPLES + /* init flush buffer if necessary (only needed for binaural)*/ + if ( hIvasDec->flushbuffer == NULL && ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL || hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM || hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + { + hIvasDec->flushbuffer = (int16_t *) malloc( CPE_CHANNELS * hIvasDec->nSamplesFrame / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( int16_t ) ); + set_s( hIvasDec->flushbuffer, 0, CPE_CHANNELS * hIvasDec->nSamplesFrame / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES ); + } +#endif + return error; } @@ -821,6 +854,77 @@ ivas_error IVAS_DEC_FeedFrame_Serial( hIvasDec->nSamplesRendered = 0; hIvasDec->nSamplesAvailableNext = hIvasDec->nSamplesFrame; +#ifdef FIX_XXX_API_FEEDFRAME_GETSAMPLES + /* decode TCs, do TSM and feed to renderer */ + /* setup */ + { + uint16_t l_ts, nTimeScalerOutSamples; + uint8_t nTransportChannels, nOutChannels; + int16_t nResidualSamples, nSamplesTcsScaled, nOutSamplesElse; +#ifdef SPLIT_REND_WITH_HEAD_ROT + if ( ( error = IVAS_DEC_Setup( hIvasDec, &l_ts, &nTransportChannels, &nOutChannels, &nSamplesRendered_loop, pcmType, pcm_buffer_offset( pcmBuf, pcmType, nSamplesRendered * nOutChannels ) ) ) != IVAS_ERR_OK ) +#else + if ( ( error = IVAS_DEC_Setup( hIvasDec, &l_ts, &nTransportChannels, &nOutChannels, &hIvasDec->nSamplesFlushed, hIvasDec->flushbuffer ) ) != IVAS_ERR_OK ) +#endif + + { + return error; + } +#ifdef SPLIT_REND_WITH_HEAD_ROT + /* :TODO: change nSamplesAsked also if we are in 5ms 0dof split rendering... */ +#endif + if ( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm && nTransportChannels != hIvasDec->nTransportChannelsOld ) + { + if ( ( error = IVAS_DEC_VoIP_reconfigure( hIvasDec, nTransportChannels, l_ts ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* IVAS TC decoder */ + if ( ( error = IVAS_DEC_GetTcSamples( hIvasDec, hIvasDec->apaExecBuffer, &nOutSamplesElse ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* JBM */ + if ( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm ) + { + if ( apa_set_scale( hIvasDec->hTimeScaler, hIvasDec->tsm_scale ) != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + + if ( apa_exec( hIvasDec->hTimeScaler, hIvasDec->apaExecBuffer, hIvasDec->nSamplesFrame * nTransportChannels, (uint16_t) hIvasDec->tsm_max_scaling, hIvasDec->apaExecBuffer, &nTimeScalerOutSamples ) != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + + assert( nTimeScalerOutSamples <= APA_BUF ); + nSamplesTcsScaled = nTimeScalerOutSamples / nTransportChannels; + } + else + { + nSamplesTcsScaled = hIvasDec->nSamplesFrame; + } + + /* Feed decoded transport channels samples to the renderer */ + if ( ( error = IVAS_DEC_RendererFeedTcSamples( hIvasDec, nSamplesTcsScaled, &nResidualSamples, hIvasDec->apaExecBuffer ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm ) + { + /* feed residual samples to TSM for the next call */ + if ( apa_set_renderer_residual_samples( hIvasDec->hTimeScaler, (uint16_t) nResidualSamples ) != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + } + } +#endif + return IVAS_ERR_OK; } @@ -911,6 +1015,7 @@ ivas_error IVAS_DEC_GetSamples( } else { +#ifndef FIX_XXX_API_FEEDFRAME_GETSAMPLES /* check if we need to run the setup function */ if ( !hIvasDec->isInitialized || hIvasDec->hasBeenFedFrame ) { @@ -929,8 +1034,10 @@ ivas_error IVAS_DEC_GetSamples( /* :TODO: change nSamplesAsked also if we are in 5ms 0dof split rendering... */ #endif } +#endif { /* check if we need to run the setup function, tc decoding and feeding the renderer */ +#ifndef FIX_XXX_API_FEEDFRAME_GETSAMPLES if ( !hIvasDec->isInitialized || hIvasDec->hasBeenFedFrame ) { int16_t nResidualSamples, nSamplesTcsScaled; @@ -987,6 +1094,17 @@ ivas_error IVAS_DEC_GetSamples( } hIvasDec->hasBeenFedFrame = false; } +#else + nOutChannels = (uint8_t) hIvasDec->st_ivas->hDecoderConfig->nchan_out; + hIvasDec->hasBeenFedFrame = false; + /* check for possible flushed samples from a rate switch */ + if ( hIvasDec->nSamplesFlushed > 0 ) + { + mvs2s( hIvasDec->flushbuffer, pcmBuf + nSamplesRendered * nOutChannels, hIvasDec->nSamplesFlushed * nOutChannels ); + nSamplesRendered += hIvasDec->nSamplesFlushed; + hIvasDec->nSamplesFlushed = 0; + } +#endif /* render IVAS frames directly to the output buffer */ nSamplesToRender = nSamplesAsked - nSamplesRendered; -- GitLab From 72c9211088edcbb55a47f6539fa979e88c23df17 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Tue, 19 Mar 2024 12:44:50 +0100 Subject: [PATCH 02/11] rename define --- lib_com/options.h | 4 +++- lib_dec/lib_dec.c | 16 ++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index ac34b1243d..1f09992b01 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -147,6 +147,8 @@ /* ################## Start DEVELOPMENT switches ######################### */ +#define OBJ_EDITING_INTERFACE + /* ################### Start BE switches ################################# */ /* only BE switches wrt selection floating point code */ @@ -161,7 +163,7 @@ #define FIX_976_USAN_PVQ_ENC_DEC_EVS_CR /* Ericsson: premature cast to unsigned detected by USAN corrected */ -#define FIX_XXX_API_FEEDFRAME_GETSAMPLES + /* #################### End BE switches ################################## */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 1ee9b2fa61..b92d511cbe 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -92,7 +92,7 @@ struct IVAS_DEC int16_t prev_ft_speech; /* RXDTX handler: previous frametype flag for G.192 format AMRWB SID_FIRST detection */ int16_t CNG; /* RXDTX handler: CNG=1, nonCNG=0 */ -#ifdef FIX_XXX_API_FEEDFRAME_GETSAMPLES +#ifdef OBJ_EDITING_INTERFACE uint16_t nSamplesFlushed; int16_t *flushbuffer; #endif @@ -177,7 +177,7 @@ ivas_error IVAS_DEC_Open( hIvasDec->hasDecodedFirstGoodFrame = false; hIvasDec->isInitialized = false; hIvasDec->updateOrientation = false; -#ifdef FIX_XXX_API_FEEDFRAME_GETSAMPLES +#ifdef OBJ_EDITING_INTERFACE hIvasDec->flushbuffer = NULL; hIvasDec->nSamplesFlushed = 0; #endif @@ -322,7 +322,7 @@ void IVAS_DEC_Close( { free( ( *phIvasDec )->apaExecBuffer ); } -#ifdef FIX_XXX_API_FEEDFRAME_GETSAMPLES +#ifdef OBJ_EDITING_INTERFACE if ( ( *phIvasDec )->flushbuffer != NULL ) { free( ( *phIvasDec )->flushbuffer ); @@ -492,7 +492,7 @@ ivas_error IVAS_DEC_Configure( hIvasDec->tsm_max_scaling = 0; hIvasDec->tsm_quality = 1.0f; -#ifdef FIX_XXX_API_FEEDFRAME_GETSAMPLES +#ifdef OBJ_EDITING_INTERFACE /* init flush buffer if necessary (only needed for binaural)*/ if ( tsmEnabled && ( outputConfig == IVAS_AUDIO_CONFIG_BINAURAL || outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM || outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { @@ -753,7 +753,7 @@ ivas_error IVAS_DEC_EnableVoIP( return IVAS_ERR_FAILED_ALLOC; } -#ifdef FIX_XXX_API_FEEDFRAME_GETSAMPLES +#ifdef OBJ_EDITING_INTERFACE /* init flush buffer if necessary (only needed for binaural)*/ if ( hIvasDec->flushbuffer == NULL && ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL || hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM || hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { @@ -854,7 +854,7 @@ ivas_error IVAS_DEC_FeedFrame_Serial( hIvasDec->nSamplesRendered = 0; hIvasDec->nSamplesAvailableNext = hIvasDec->nSamplesFrame; -#ifdef FIX_XXX_API_FEEDFRAME_GETSAMPLES +#ifdef OBJ_EDITING_INTERFACE /* decode TCs, do TSM and feed to renderer */ /* setup */ { @@ -1015,7 +1015,7 @@ ivas_error IVAS_DEC_GetSamples( } else { -#ifndef FIX_XXX_API_FEEDFRAME_GETSAMPLES +#ifndef OBJ_EDITING_INTERFACE /* check if we need to run the setup function */ if ( !hIvasDec->isInitialized || hIvasDec->hasBeenFedFrame ) { @@ -1037,7 +1037,7 @@ ivas_error IVAS_DEC_GetSamples( #endif { /* check if we need to run the setup function, tc decoding and feeding the renderer */ -#ifndef FIX_XXX_API_FEEDFRAME_GETSAMPLES +#ifndef OBJ_EDITING_INTERFACE if ( !hIvasDec->isInitialized || hIvasDec->hasBeenFedFrame ) { int16_t nResidualSamples, nSamplesTcsScaled; -- GitLab From a24d12dd7e652950d09436408b4b7521cb55d6f1 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Thu, 28 Mar 2024 11:48:56 +0100 Subject: [PATCH 03/11] further dissect the decoder functions to have a single point in the processing chain for editing object data, add stubs to the API for editable object data handling --- apps/decoder.c | 72 +++++++++++-- lib_com/common_api_types.h | 11 ++ lib_com/ivas_prot.h | 20 ++++ lib_com/ivas_stat_com.h | 4 + lib_dec/ivas_ism_param_dec.c | 170 ++++++++++++++++++++++++++++++- lib_dec/ivas_jbm_dec.c | 191 ++++++++++++++++++++++++++++++++++- lib_dec/ivas_mc_param_dec.c | 170 ++++++++++++++++++++++++++++++- lib_dec/ivas_stat_dec.h | 4 + lib_dec/lib_dec.c | 147 ++++++++++++++++++++++++++- lib_dec/lib_dec.h | 21 ++++ 10 files changed, 791 insertions(+), 19 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index d993eb4144..18dc59b385 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -2081,6 +2081,9 @@ static ivas_error decodeG192( #ifdef SPLIT_REND_WITH_HEAD_ROT SplitFileReadWrite *splitRendWriter = NULL; #endif +#ifdef OBJ_EDITING_INTERFACE + IVAS_EDITABLE_PARAMETERS editableParameters; +#endif for ( i = 0; i < IVAS_MAX_NUM_OBJECTS; ++i ) { @@ -2342,6 +2345,30 @@ static ivas_error decodeG192( fprintf( stderr, "\nError: could not feed frame to decoder: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } +#ifdef OBJ_EDITING_INTERFACE + /* Do object info editing here */ + /* get object parameters */ + if ( ( error = IVAS_DEC_GetEditableParameters( hIvasDec, &editableParameters ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: could not get the editable parameters: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + /* edit object parameters...*/ + /* set new object parameters*/ + if ( ( error = IVAS_DEC_SetEditableParameters( hIvasDec, editableParameters ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: could not set the editable parameters: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + /* Do the final preparations needed for rendering */ + if ( ( error = IVAS_DEC_PrepareRenderer( hIvasDec ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: could not prepare the renderer: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } +#endif } #ifdef SPLIT_REND_WITH_HEAD_ROT @@ -2932,6 +2959,11 @@ static ivas_error decodeVoIP( int16_t vec_pos_update, vec_pos_len; int16_t nOutSamples = 0; +#ifdef OBJ_EDITING_INTERFACE + bool parameterAvailableForEditing = false; + uint16_t nSamplesRendered = 0; +#endif + vec_pos_update = 0; if ( ( error = IVAS_DEC_GetRenderFramesizeMs( hIvasDec, &systemTimeInc_ms ) ) != IVAS_ERR_OK ) { @@ -3048,7 +3080,9 @@ static ivas_error decodeVoIP( while ( 1 ) { - +#ifdef OBJ_EDITING_INTERFACE + nSamplesRendered = 0; +#endif /* reference vector */ if ( arg.enableReferenceVectorTracking && vec_pos_update == 0 ) { @@ -3219,7 +3253,25 @@ static ivas_error decodeVoIP( /* decode and get samples */ - +#ifdef OBJ_EDITING_INTERFACE + while ( nSamplesRendered < nOutSamples ) + { +#endif +#ifdef OBJ_EDITING_INTERFACE +#ifdef SPLIT_REND_WITH_HEAD_ROT +#ifdef SUPPORT_JBM_TRACEFILE + if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, IVAS_DEC_PCM_INT16, (void *) pcmBuf, systemTime_ms, writeJbmTraceFileFrameWrapper, jbmTraceWriter, &nSamplesRendered, ¶meterAvailableForEditing ) ) != IVAS_ERR_OK ) +#else + if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, IVAS_DEC_PCM_INT16, (void *) pcmBuf, systemTime_ms, &nSamplesRendered, ¶meterAvailableForEditing ) ) != IVAS_ERR_OK ) +#endif +#else +#ifdef SUPPORT_JBM_TRACEFILE + if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, pcmBuf, systemTime_ms, writeJbmTraceFileFrameWrapper, jbmTraceWriter, &nSamplesRendered, ¶meterAvailableForEditing ) ) != IVAS_ERR_OK ) +#else + if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, pcmBuf, systemTime_ms, &nSamplesRendered, ¶meterAvailableForEditing ) ) != IVAS_ERR_OK ) +#endif +#endif +#else #ifdef SPLIT_REND_WITH_HEAD_ROT #ifdef SUPPORT_JBM_TRACEFILE if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, IVAS_DEC_PCM_INT16, (void *) pcmBuf, systemTime_ms, writeJbmTraceFileFrameWrapper, jbmTraceWriter ) ) != IVAS_ERR_OK ) @@ -3233,10 +3285,18 @@ static ivas_error decodeVoIP( if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, pcmBuf, systemTime_ms ) ) != IVAS_ERR_OK ) #endif #endif - { - fprintf( stderr, "\nError in IVAS_DEC_VoIP_GetSamples: %s\n", IVAS_DEC_GetErrorMessage( error ) ); - goto cleanup; - } +#endif + { + fprintf( stderr, "\nError in IVAS_DEC_VoIP_GetSamples: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } +#ifdef OBJ_EDITING_INTERFACE + if ( parameterAvailableForEditing == true ) + { + /* do the object editing here */ + } + } /* while ( nSamplesRendered < nOutSamples ) */ +#endif /* write JBM Offset file entry */ if ( jbmOffsetWriter != NULL ) diff --git a/lib_com/common_api_types.h b/lib_com/common_api_types.h index f12eb6940f..f9f55e20d4 100644 --- a/lib_com/common_api_types.h +++ b/lib_com/common_api_types.h @@ -122,9 +122,20 @@ typedef struct _IVAS_ISM_METADATA float yaw; float pitch; int16_t non_diegetic_flag; +#ifdef OBJ_EDITING_INTERFACE + float gain; +#endif } IVAS_ISM_METADATA; +typedef struct _IVAS_EDITABLE_PARAMETERS +{ + + int16_t num_obj; + IVAS_ISM_METADATA ism_metadata[IVAS_MAX_NUM_OBJECTS]; + float gain_bed; +} IVAS_EDITABLE_PARAMETERS; + typedef struct { float w, x, y, z; diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 9e15502344..2738e5b1c3 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -822,6 +822,12 @@ void ivas_jbm_dec_feed_tc_to_renderer( float *data /* i/o: transport channels/output synthesis signal */ ); +#ifdef OBJ_EDITING_INTERFACE +void ivas_jbm_dec_prepare_renderer( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); +#endif + ivas_error ivas_jbm_dec_set_discard_samples( Decoder_Struct *st_ivas /* i/o: main IVAS decoder structre */ ); @@ -1112,6 +1118,13 @@ void ivas_param_ism_dec_digest_tc( float *transport_channels_f[] /* i : synthesized core-coder transport channels/DirAC output */ ); +#ifdef OBJ_EDITING_INTERFACE +void ivas_param_ism_dec_prepare_renderer( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nCldfbSlots /* i : number of CLFBS slots in the transport channels */ +); +#endif + void ivas_ism_param_dec_tc_gain_ajust( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ const uint16_t nSamples, /* i : number of samples to be compensate */ @@ -3861,6 +3874,13 @@ void ivas_param_mc_dec_digest_tc( float *transport_channels_f[] /* i : synthesized core-coder transport channels/DirAC output*/ ); +#ifdef OBJ_EDITING_INTERFACE +void ivas_param_mc_dec_prepare_renderer( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint8_t nCldfbSlots /* i : number of CLFBS slots in the transport channels */ +); +#endif + void ivas_param_mc_dec_render( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index 434ddc6080..7ce6768040 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -87,6 +87,10 @@ typedef struct float q_azimuth_old; float q_elevation_old; +#ifdef OBJ_EDITING_INTERFACE + float gain; +#endif + } ISM_METADATA_FRAME, *ISM_METADATA_HANDLE; diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index 9337ccb08a..77a23c3c54 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -1086,14 +1086,20 @@ void ivas_param_ism_dec_digest_tc( float *transport_channels_f[] /* i : synthesized core-coder transport channels/DirAC output */ ) { - int16_t ch, nchan_transport, nchan_out, nchan_out_woLFE, i; - int16_t slot_idx, bin_idx; + int16_t ch, nchan_transport; + int16_t slot_idx; +#ifndef OBJ_EDITING_INTERFACE + int16_t nchan_out, nchan_out_woLFE, i; + int16_t bin_idx; int32_t ivas_total_brate; +#endif int16_t output_frame; +#ifndef OBJ_EDITING_INTERFACE float ref_power[CLDFB_NO_CHANNELS_MAX]; float cx_diag[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_DMX]; /* Direct Response/EFAP Gains */ float direct_response[MAX_NUM_OBJECTS][PARAM_ISM_MAX_CHAN]; +#endif PARAM_ISM_DEC_HANDLE hParamIsmDec; SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; int16_t fade_len; @@ -1107,6 +1113,8 @@ void ivas_param_ism_dec_digest_tc( fade_len = output_frame / 2; nchan_transport = st_ivas->nchan_transport; + +#ifndef OBJ_EDITING_INTERFACE ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) @@ -1120,9 +1128,10 @@ void ivas_param_ism_dec_digest_tc( nchan_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; } - +#endif push_wmops( "ivas_param_ism_dec_digest_tc" ); +#ifndef OBJ_EDITING_INTERFACE /* general setup */ ivas_jbm_dec_get_adapted_linear_interpolator( DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbSlots, hParamIsmDec->hParamIsmRendering->interpolator ); @@ -1197,7 +1206,7 @@ void ivas_param_ism_dec_digest_tc( } } } - +#endif if ( st_ivas->hDecoderConfig->Opt_tsm ) { /*TODO : FhG to check*/ @@ -1219,11 +1228,13 @@ void ivas_param_ism_dec_digest_tc( mvr2r( RealBuffer, &hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], hSpatParamRendCom->num_freq_bands ); mvr2r( ImagBuffer, &hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], hSpatParamRendCom->num_freq_bands ); } - +#ifndef OBJ_EDITING_INTERFACE ivas_param_ism_collect_slot( hParamIsmDec, &hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], &hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], ch, ref_power, cx_diag ); +#endif } } +#ifndef OBJ_EDITING_INTERFACE /* Obtain Mixing Matrix on a frame-level */ for ( bin_idx = 0; bin_idx < hSpatParamRendCom->num_freq_bands; bin_idx++ ) { @@ -1232,6 +1243,7 @@ void ivas_param_ism_dec_digest_tc( /* Compute mixing matrix */ ivas_param_ism_compute_mixing_matrix( st_ivas->nchan_ism, hParamIsmDec, st_ivas->hISMDTX, direct_response, nchan_transport, nchan_out_woLFE, cx_diag, ref_power, hParamIsmDec->hParamIsmRendering->mixing_matrix_lin ); +#endif pop_wmops(); @@ -1239,6 +1251,154 @@ void ivas_param_ism_dec_digest_tc( } +#ifdef OBJ_EDITING_INTERFACE +/*-------------------------------------------------------------------------* + * ivas_param_ism_dec_prepare_renderer() + * + * + *-------------------------------------------------------------------------*/ + +void ivas_param_ism_dec_prepare_renderer( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nCldfbSlots /* i : number of CLFBS slots in the transport channels */ +) +{ + int16_t ch, nchan_transport, nchan_out, nchan_out_woLFE, i; + int16_t slot_idx, bin_idx; + int32_t ivas_total_brate; + int16_t output_frame; + float ref_power[CLDFB_NO_CHANNELS_MAX]; + float cx_diag[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_DMX]; + /* Direct Response/EFAP Gains */ + float direct_response[MAX_NUM_OBJECTS][PARAM_ISM_MAX_CHAN]; + PARAM_ISM_DEC_HANDLE hParamIsmDec; + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + int16_t fade_len; + + /* Initialization */ + hParamIsmDec = st_ivas->hParamIsmDec; + assert( hParamIsmDec ); + hSpatParamRendCom = st_ivas->hSpatParamRendCom; + assert( hSpatParamRendCom ); + output_frame = nCldfbSlots * hSpatParamRendCom->num_freq_bands; + fade_len = output_frame / 2; + + nchan_transport = st_ivas->nchan_transport; + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + nchan_out = st_ivas->nchan_ism; + nchan_out_woLFE = nchan_out; + st_ivas->hDecoderConfig->nchan_out = nchan_out; + } + else + { + nchan_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; + nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; + } + + push_wmops( "ivas_param_ism_dec_digest_tc" ); + + /* general setup */ + ivas_jbm_dec_get_adapted_linear_interpolator( DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbSlots, hParamIsmDec->hParamIsmRendering->interpolator ); + + ivas_dirac_dec_set_md_map( st_ivas, nCldfbSlots ); + + /* set buffers to zero */ + for ( bin_idx = 0; bin_idx < CLDFB_NO_CHANNELS_MAX; bin_idx++ ) + { + set_zero( cx_diag[bin_idx], PARAM_ISM_MAX_DMX ); + } + set_zero( ref_power, CLDFB_NO_CHANNELS_MAX ); + + /* Frame-level Processing */ + /* De-quantization */ + if ( !( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) ) + { + ivas_param_ism_dec_dequant_DOA( hParamIsmDec, st_ivas->nchan_ism ); + ivas_param_ism_dec_dequant_powrat( hParamIsmDec ); + st_ivas->hISMDTX.dtx_flag = 0; + } + else + { + st_ivas->hISMDTX.dtx_flag = 1; + } + + /* obtain the direct response using EFAP */ + if ( !( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) ) + { + for ( i = 0; i < st_ivas->nchan_ism; i++ ) + { + efap_determine_gains( st_ivas->hEFAPdata, direct_response[i], hParamIsmDec->azimuth_values[i], hParamIsmDec->elevation_values[i], EFAP_MODE_EFAP ); + } + } + else + { + int16_t j; + + for ( i = 0; i < st_ivas->nchan_ism; i++ ) + { + for ( j = 0; j < nchan_out_woLFE; j++ ) + { + if ( i == j ) + { + direct_response[i][j] = 1.0f; + } + else + { + direct_response[i][j] = 0.0f; + } + } + } + + for ( j = 0; j < nchan_out_woLFE; j++ ) + { + if ( hParamIsmDec->azimuth_values[j] > 0.0f ) + { + hParamIsmDec->hParamIsmRendering->proto_matrix[j] = 1.0f; + hParamIsmDec->hParamIsmRendering->proto_matrix[nchan_out_woLFE + j] = 0.0f; + } + else + { + if ( hParamIsmDec->azimuth_values[j] < 0.0f ) + { + hParamIsmDec->hParamIsmRendering->proto_matrix[j] = 0.0f; + hParamIsmDec->hParamIsmRendering->proto_matrix[nchan_out_woLFE + j] = 1.0f; + } + else /* == 0.0f */ + { + hParamIsmDec->hParamIsmRendering->proto_matrix[j] = 0.5f; + hParamIsmDec->hParamIsmRendering->proto_matrix[nchan_out_woLFE + j] = 0.5f; + } + } + } + } + + for ( ch = 0; ch < nchan_transport; ch++ ) + { + /* CLDFB Analysis */ + for ( slot_idx = 0; slot_idx < nCldfbSlots; slot_idx++ ) + { + ivas_param_ism_collect_slot( hParamIsmDec, &hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], &hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], ch, ref_power, cx_diag ); + } + } + + /* Obtain Mixing Matrix on a frame-level */ + for ( bin_idx = 0; bin_idx < hSpatParamRendCom->num_freq_bands; bin_idx++ ) + { + set_f( hParamIsmDec->hParamIsmRendering->mixing_matrix_lin[bin_idx], 0.0f, nchan_transport * nchan_out_woLFE ); + } + + /* Compute mixing matrix */ + ivas_param_ism_compute_mixing_matrix( st_ivas->nchan_ism, hParamIsmDec, st_ivas->hISMDTX, direct_response, nchan_transport, nchan_out_woLFE, cx_diag, ref_power, hParamIsmDec->hParamIsmRendering->mixing_matrix_lin ); + + pop_wmops(); + + return; +} +#endif + /*-------------------------------------------------------------------------* * ivas_ism_param_dec_tc_gain_ajust() * diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index c7ad64a60a..d5c9b66ce3 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -808,6 +808,7 @@ void ivas_jbm_dec_feed_tc_to_renderer( } n_render_timeslots = st_ivas->hTcBuffer->n_samples_available / st_ivas->hTcBuffer->n_samples_granularity; +#ifndef OBJ_EDITING_INTERFACE if ( st_ivas->hTcBuffer->tc_buffer_mode == TC_BUFFER_MODE_BUFFER ) { ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); @@ -821,27 +822,35 @@ void ivas_jbm_dec_feed_tc_to_renderer( { ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); } - else if ( st_ivas->ivas_format == ISM_FORMAT ) + else +#endif + if ( st_ivas->ivas_format == ISM_FORMAT ) { /* Rendering */ if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { +#ifndef OBJ_EDITING_INTERFACE if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) { ivas_dirac_dec_set_md_map( st_ivas, n_render_timeslots ); ivas_param_ism_params_to_masa_param_mapping( st_ivas ); } - else if ( st_ivas->renderer_type == RENDERER_PARAM_ISM || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + else +#endif + if ( st_ivas->renderer_type == RENDERER_PARAM_ISM || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) { ivas_param_ism_dec_digest_tc( st_ivas, n_render_timeslots, p_data_f ); } } +#ifndef OBJ_EDITING_INTERFACE else /* ISM_MODE_DISC */ { ivas_ism_dec_digest_tc( st_ivas ); } +#endif } +#ifndef OBJ_EDITING_INTERFACE else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) { ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); @@ -937,8 +946,10 @@ void ivas_jbm_dec_feed_tc_to_renderer( } } } +#endif else if ( st_ivas->ivas_format == MC_FORMAT ) { +#ifndef OBJ_EDITING_INTERFACE if ( st_ivas->mc_mode == MC_MODE_MCT ) { ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); @@ -947,20 +958,194 @@ void ivas_jbm_dec_feed_tc_to_renderer( { ivas_mc_paramupmix_dec_digest_tc( st_ivas, (uint8_t) n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); } - else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) + else +#endif + if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) { ivas_param_mc_dec_digest_tc( st_ivas, (uint8_t) n_render_timeslots, p_data_f ); } +#ifndef OBJ_EDITING_INTERFACE else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) { ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); } +#endif } pop_wmops(); return; } +#ifdef OBJ_EDITING_INTERFACE +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_prepare_renderer() + * + * prepare IVAS JBM renderer routine + *--------------------------------------------------------------------------*/ + +void ivas_jbm_dec_prepare_renderer( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + int16_t n, n_render_timeslots; + + push_wmops( "ivas_jbm_dec_feed_tc_to_rendererer" ); + + n_render_timeslots = st_ivas->hTcBuffer->n_samples_available / st_ivas->hTcBuffer->n_samples_granularity; + + if ( st_ivas->hTcBuffer->tc_buffer_mode == TC_BUFFER_MODE_BUFFER ) + { + ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); + + if ( ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == MASA_ISM_FORMAT ) && st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + ivas_jbm_masa_sf_to_slot_map( st_ivas, n_render_timeslots ); + } + } + else if ( st_ivas->ivas_format == STEREO_FORMAT ) + { + ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); + } + if ( st_ivas->ivas_format == ISM_FORMAT ) + { + /* Rendering */ + if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + ivas_dirac_dec_set_md_map( st_ivas, n_render_timeslots ); + + ivas_param_ism_params_to_masa_param_mapping( st_ivas ); + } + else if ( st_ivas->renderer_type == RENDERER_PARAM_ISM || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + ivas_param_ism_dec_prepare_renderer( st_ivas, n_render_timeslots ); + } + } + else /* ISM_MODE_DISC */ + { + ivas_ism_dec_digest_tc( st_ivas ); + } + } + else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) + { + ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); + } + else if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + ivas_ism_dec_digest_tc( st_ivas ); + + /* delay the objects here for all renderers where it is needed */ + if ( +#ifdef SPLIT_REND_WITH_HEAD_ROT + ( +#endif + st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || + st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || + st_ivas->renderer_type == RENDERER_OSBA_AMBI || + st_ivas->renderer_type == RENDERER_OSBA_LS || + st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL +#ifdef SPLIT_REND_WITH_HEAD_ROT + ) && + ( st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED && st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) +#endif + ) + { + for ( n = 0; n < st_ivas->nchan_ism; n++ ) + { + delay_signal( st_ivas->hTcBuffer->tc[n], st_ivas->hTcBuffer->n_samples_available, st_ivas->hSbaIsmData->delayBuffer[n], st_ivas->hSbaIsmData->delayBuffer_size ); + } + } + + if ( !st_ivas->sba_dirac_stereo_flag ) + { + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) + { + 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 ); + } + } + else + { + ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); + + ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); + } + } + else if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + 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 ); + ivas_jbm_masa_sf_to_slot_map( st_ivas, n_render_timeslots ); + } + else + { + 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 ); + + if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + ivas_ism_dec_digest_tc( st_ivas ); + } + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_DIRAC ) + { + int16_t num_objects; + /* Delay the signal to match CLDFB delay. Delay the whole buffer. */ + num_objects = 0; + if ( ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC ) + { + num_objects = 1; + } + else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + num_objects = st_ivas->nchan_ism; + } + for ( n = 0; n < num_objects; n++ ) + { + if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC && st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC ) + { + v_multc( st_ivas->hTcBuffer->tc[CPE_CHANNELS + n], OMASA_TDREND_MATCHING_GAIN, st_ivas->hTcBuffer->tc[CPE_CHANNELS + n], st_ivas->hTcBuffer->n_samples_available ); + } + delay_signal( st_ivas->hTcBuffer->tc[CPE_CHANNELS + n], st_ivas->hTcBuffer->n_samples_available, st_ivas->hMasaIsmData->delayBuffer[n], st_ivas->hMasaIsmData->delayBuffer_size ); + } + } + } + } + else if ( st_ivas->ivas_format == MC_FORMAT ) + { + if ( st_ivas->mc_mode == MC_MODE_MCT ) + { + ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + ivas_mc_paramupmix_dec_digest_tc( st_ivas, (uint8_t) n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) + { + ivas_param_mc_dec_prepare_renderer( st_ivas, (uint8_t) n_render_timeslots ); + } + else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) + { + ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); + } + } + + pop_wmops(); + return; +} +#endif /*--------------------------------------------------------------------------* * ivas_dec_render() diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index 21bdcfb856..2dd60ccbc2 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -1331,7 +1331,171 @@ void ivas_param_mc_dec_digest_tc( ) { PARAM_MC_DEC_HANDLE hParamMC; - int16_t i, ch; + int16_t ch; + int16_t slot_idx; + int16_t nchan_transport; +#ifndef OBJ_EDITING_INTERFACE + int16_t nchan_out_transport, nchan_out_cldfb, i, param_band_idx; + int16_t nchan_out_cov; + /*CLDFB*/ + float cx[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; + float cx_imag[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; + float real_part, imag_part; + /* format converter */ + int16_t channel_active[MAX_OUTPUT_CHANNELS]; + IVAS_OUTPUT_SETUP *hSynthesisOutputSetup; +#endif + hParamMC = st_ivas->hParamMC; + assert( hParamMC ); + + push_wmops( "param_mc_dec_digest_tc" ); +#ifndef OBJ_EDITING_INTERFACE + set_s( channel_active, 0, MAX_CICP_CHANNELS ); +#endif + nchan_transport = st_ivas->nchan_transport; + +#ifndef OBJ_EDITING_INTERFACE + nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + nchan_out_cldfb = BINAURAL_CHANNELS; + set_s( channel_active, 1, nchan_out_cldfb ); + nchan_out_cov = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + hSynthesisOutputSetup = &st_ivas->hTransSetup; + } + else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_CLDFB ) + { + nchan_out_cov = nchan_out_transport; + nchan_out_cldfb = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + hSynthesisOutputSetup = &st_ivas->hTransSetup; + } + else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { + nchan_out_cov = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + nchan_out_cldfb = nchan_out_cov; + set_s( channel_active, 1, nchan_out_cov ); + hSynthesisOutputSetup = &st_ivas->hOutSetup; + } + else + { + nchan_out_cov = nchan_out_transport; + nchan_out_cldfb = nchan_out_transport; + set_s( channel_active, 1, nchan_out_cov ); + hSynthesisOutputSetup = &st_ivas->hTransSetup; + } + + /* adapt transient position */ + if ( hParamMC->hMetadataPMC->bAttackPresent ) + { + hParamMC->hMetadataPMC->attackIndex = (int16_t) max( 0, hParamMC->hMetadataPMC->attackIndex + ( ( nCldfbSlots - DEFAULT_JBM_CLDFB_TIMESLOTS ) / 2 ) ); + } + /* adapt subframes */ + hParamMC->num_slots = nCldfbSlots; + hParamMC->slots_rendered = 0; + hParamMC->subframes_rendered = 0; + ivas_jbm_dec_get_adapted_subframes( nCldfbSlots, hParamMC->subframe_nbslots, &hParamMC->nb_subframes ); + st_ivas->hTcBuffer->nb_subframes = hParamMC->nb_subframes; + mvs2s( hParamMC->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, hParamMC->nb_subframes ); + + ivas_param_mc_dec_compute_interpolator( hParamMC->hMetadataPMC->bAttackPresent, hParamMC->hMetadataPMC->attackIndex, nCldfbSlots, hParamMC->h_output_synthesis_params.interpolator ); + + for ( param_band_idx = 0; param_band_idx < PARAM_MC_MAX_PARAMETER_BANDS; param_band_idx++ ) + { + set_zero( cx[param_band_idx], PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); + set_zero( cx_imag[param_band_idx], PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); + } +#endif + /* slot loop for gathering the input data */ + for ( slot_idx = 0; slot_idx < nCldfbSlots; slot_idx++ ) + { + if ( st_ivas->hDecoderConfig->Opt_tsm ) + { + float RealBuffer[CLDFB_NO_CHANNELS_MAX]; + float ImagBuffer[CLDFB_NO_CHANNELS_MAX]; + + /* CLDFB Analysis*/ + for ( ch = 0; ch < nchan_transport; ch++ ) + { + cldfbAnalysis_ts( &( transport_channels_f[ch][hParamMC->num_freq_bands * slot_idx] ), RealBuffer, ImagBuffer, hParamMC->num_freq_bands, st_ivas->cldfbAnaDec[ch] ); + + mvr2r( RealBuffer, &hParamMC->Cldfb_RealBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport + ch * hParamMC->num_freq_bands], hParamMC->num_freq_bands ); + mvr2r( ImagBuffer, &hParamMC->Cldfb_ImagBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport + ch * hParamMC->num_freq_bands], hParamMC->num_freq_bands ); + } + } +#ifndef OBJ_EDITING_INTERFACE + if ( slot_idx >= 2 * hParamMC->hMetadataPMC->attackIndex ) + { + ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot( &hParamMC->Cldfb_RealBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport], &hParamMC->Cldfb_ImagBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport], cx, cx_imag, hParamMC, nchan_transport ); + } +#endif + } +#ifndef OBJ_EDITING_INTERFACE + /* map from complex input covariance to real values */ + for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx++ ) + { + /* Cx for transport channels */ + for ( i = 0; i < nchan_transport * nchan_transport; i++ ) + { + real_part = cx[param_band_idx][i]; + imag_part = cx_imag[param_band_idx][i]; + + /* (a-ib)(c+id) = ac + bd + i(ad-bc) */ + if ( param_band_idx < hParamMC->max_param_band_abs_cov ) + { + cx[param_band_idx][i] = sqrtf( real_part * real_part + imag_part * imag_part ); + } + else + { + cx[param_band_idx][i] = real_part; + } + } + } + + /* we have to do it similar to the encoder in case of attacks (i.e. accumulate two bands) to ensure correct DMX of the target covariance*/ + if ( hParamMC->hMetadataPMC->bAttackPresent && ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) ) + { + for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx += 2 ) + { + v_add( cx[param_band_idx], cx[param_band_idx + 1], cx[param_band_idx], nchan_transport * nchan_transport ); + mvr2r( cx[param_band_idx], cx[param_band_idx + 1], nchan_transport * nchan_transport ); + } + } + + +#ifndef FIX_1024_REMOVE_PARAMMC_MIXING_MAT + if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { + ivas_param_mc_get_mono_stereo_mixing_matrices( hParamMC, cx, hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, nchan_out_transport, nchan_transport, nchan_out_cov ); + } + else + { +#endif + /* generate mixing matrices */ + ivas_param_mc_get_mixing_matrices( hParamMC, hSynthesisOutputSetup, cx, hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, nchan_out_transport, hParamMC->synthesis_conf, nchan_transport, nchan_out_cov ); +#ifndef FIX_1024_REMOVE_PARAMMC_MIXING_MAT + } +#endif +#endif + pop_wmops(); + + return; +} + +#ifdef OBJ_EDITING_INTERFACE +/*------------------------------------------------------------------------- + * ivas_param_mc_dec_digest_tc() + * + * + *------------------------------------------------------------------------*/ + +void ivas_param_mc_dec_prepare_renderer( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint8_t nCldfbSlots /* i : number of CLFBS slots in the transport channels */ +) +{ + PARAM_MC_DEC_HANDLE hParamMC; + int16_t i; int16_t slot_idx, param_band_idx; int16_t nchan_transport, nchan_out_transport, nchan_out_cldfb; int16_t nchan_out_cov; @@ -1404,6 +1568,7 @@ void ivas_param_mc_dec_digest_tc( /* slot loop for gathering the input data */ for ( slot_idx = 0; slot_idx < nCldfbSlots; slot_idx++ ) { +#ifndef OBJ_EDITING_INTERFACE if ( st_ivas->hDecoderConfig->Opt_tsm ) { float RealBuffer[CLDFB_NO_CHANNELS_MAX]; @@ -1418,6 +1583,7 @@ void ivas_param_mc_dec_digest_tc( mvr2r( ImagBuffer, &hParamMC->Cldfb_ImagBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport + ch * hParamMC->num_freq_bands], hParamMC->num_freq_bands ); } } +#endif if ( slot_idx >= 2 * hParamMC->hMetadataPMC->attackIndex ) { ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot( &hParamMC->Cldfb_RealBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport], &hParamMC->Cldfb_ImagBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport], cx, cx_imag, hParamMC, nchan_transport ); @@ -1474,7 +1640,7 @@ void ivas_param_mc_dec_digest_tc( return; } - +#endif /*------------------------------------------------------------------------- * ivas_param_mc_dec_render() diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 4deb6748e2..ab37bc9896 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -897,6 +897,10 @@ typedef struct ivas_masa_ism_data_structure int16_t azimuth_ism_edited[MAX_NUM_OBJECTS]; int16_t elevation_ism_edited[MAX_NUM_OBJECTS]; uint8_t ism_is_edited[MAX_NUM_OBJECTS]; +#ifdef OBJ_EDITING_INTERFACE + float gain_ism[MAX_NUM_OBJECTS]; + float gain_masa; +#endif int16_t idx_separated_ism; int16_t azimuth_separated_ism[MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR]; diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index a99d38208a..7e0ad2116a 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -97,6 +97,9 @@ struct IVAS_DEC #ifdef OBJ_EDITING_INTERFACE uint16_t nSamplesFlushed; int16_t *flushbuffer; + bool hasEditableParameters; + bool enableParameterEditing; + bool hasBeenPreparedRendering; #endif }; @@ -183,6 +186,9 @@ ivas_error IVAS_DEC_Open( #ifdef OBJ_EDITING_INTERFACE hIvasDec->flushbuffer = NULL; hIvasDec->nSamplesFlushed = 0; + hIvasDec->hasEditableParameters = false; + hIvasDec->enableParameterEditing = false; + hIvasDec->hasBeenPreparedRendering = false; #endif hIvasDec->mode = mode; @@ -927,12 +933,74 @@ ivas_error IVAS_DEC_FeedFrame_Serial( } } } + hIvasDec->hasBeenPreparedRendering = false; #endif return IVAS_ERR_OK; } +#ifdef OBJ_EDITING_INTERFACE +/*---------------------------------------------------------------------* + * IVAS_DEC_GetEditableParameters( ) + * + * Main function to decode to PCM data + *---------------------------------------------------------------------*/ +ivas_error IVAS_DEC_GetEditableParameters( + IVAS_DEC_HANDLE hIvasDec, + IVAS_EDITABLE_PARAMETERS *hIvasEditableParameters ) +{ + ivas_error error; + + hIvasEditableParameters = NULL; + + + error = IVAS_ERR_OK; + + return error; +} + +/*---------------------------------------------------------------------* + * IVAS_DEC_SetEditableParameters( ) + * + * Main function to decode to PCM data + *---------------------------------------------------------------------*/ +ivas_error IVAS_DEC_SetEditableParameters( + IVAS_DEC_HANDLE hIvasDec, + IVAS_EDITABLE_PARAMETERS hIvasEditableParameters ) +{ + ivas_error error; + + error = IVAS_ERR_OK; + + return error; +} + +/*---------------------------------------------------------------------* + * IVAS_DEC_PrepareRenderer( ) + * + * Main function to decode to PCM data + *---------------------------------------------------------------------*/ +ivas_error IVAS_DEC_PrepareRenderer( + IVAS_DEC_HANDLE hIvasDec ) +{ + ivas_error error; + + error = IVAS_ERR_OK; + + if ( hIvasDec == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + ivas_jbm_dec_prepare_renderer( hIvasDec->st_ivas ); + hIvasDec->hasBeenPreparedRendering = true; + return error; +} + + +#endif + /*---------------------------------------------------------------------* * IVAS_DEC_GetSamples( ) * @@ -954,10 +1022,13 @@ ivas_error IVAS_DEC_GetSamples( ) { ivas_error error; - int16_t nOutSamplesElse, nSamplesToRender; - uint16_t nSamplesRendered, nSamplesRendered_loop, l_ts, nTimeScalerOutSamples; + int16_t nSamplesToRender; + uint16_t nSamplesRendered, nSamplesRendered_loop, l_ts; uint8_t nTransportChannels, nOutChannels; - +#ifndef OBJ_EDITING_INTERFACE + int16_t nOutSamplesElse; + uint16_t nTimeScalerOutSamples; +#endif nSamplesRendered = 0; nOutChannels = 0; nSamplesRendered_loop = 0; @@ -969,6 +1040,14 @@ ivas_error IVAS_DEC_GetSamples( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } +#ifdef OBJ_EDITING_INTERFACE + /* the rendering needs to be prepared at this point */ + if ( hIvasDec->hasBeenPreparedRendering == false ) + { + return IVAS_ERR_UNKNOWN; + } +#endif + if ( hIvasDec->updateOrientation ) { /*----------------------------------------------------------------* @@ -2598,6 +2677,11 @@ ivas_error IVAS_DEC_VoIP_GetSamples( JbmTraceFileWriterFn jbmWriterFn, void *jbmWriter #endif +#ifdef OBJ_EDITING_INTERFACE + , + uint16_t *nSamplesRendered, + bool *parametersAvailableForEditing +#endif ) { Decoder_Struct *st_ivas; @@ -2608,14 +2692,21 @@ ivas_error IVAS_DEC_VoIP_GetSamples( uint16_t extBufferedSamples; int16_t result; ivas_error error; +#ifndef OBJ_EDITING_INTERFACE int16_t nSamplesRendered; +#endif uint8_t nOutChannels; st_ivas = hIvasDec->st_ivas; hDecoderConfig = st_ivas->hDecoderConfig; hVoIP = hIvasDec->hVoIP; nOutChannels = (uint8_t) st_ivas->hDecoderConfig->nchan_out; +#ifndef OBJ_EDITING_INTERFACE nSamplesRendered = 0; +#endif +#ifdef OBJ_EDITING_INTERFACE + *parametersAvailableForEditing = false; +#endif if ( nSamplesPerChannel == 0 ) { @@ -2623,7 +2714,11 @@ ivas_error IVAS_DEC_VoIP_GetSamples( } /* make sure that the FIFO after decoder/scaler contains at least one sound card frame (i.e. 20ms) */ +#ifdef OBJ_EDITING_INTERFACE + while ( *nSamplesRendered < nSamplesPerChannel ) +#else while ( nSamplesRendered < nSamplesPerChannel ) +#endif { if ( hIvasDec->nSamplesAvailableNext == 0 ) { @@ -2736,6 +2831,14 @@ ivas_error IVAS_DEC_VoIP_GetSamples( hIvasDec->nSamplesAvailableNext = hIvasDec->nSamplesFrame; hIvasDec->nSamplesRendered = 0; } +#ifdef OBJ_EDITING_INTERFACE + /* :TODO: only return here if we really have editing initialized */ + if ( hIvasDec->hasBeenFedFirstGoodFrame && hIvasDec->hasEditableParameters == true && hIvasDec->enableParameterEditing == true ) + { + *parametersAvailableForEditing = true; + return IVAS_ERR_OK; + } +#endif } /* decode */ @@ -2744,12 +2847,21 @@ ivas_error IVAS_DEC_VoIP_GetSamples( /* codec mode to use not known yet - simply output silence */ /* directly set output zero */ int16_t nSamplesToZero = min( nSamplesPerChannel, hIvasDec->nSamplesAvailableNext ); +#ifdef OBJ_EDITING_INTERFACE +#ifdef SPLIT_REND_WITH_HEAD_ROT + set_pcm_buffer_to_zero( pcm_buffer_offset( pcmBuf, pcmType, ( *nSamplesRendered ) * nOutChannels ), pcmType, nSamplesToZero * nOutChannels ); +#else + set_s( pcmBuf + ( *nSamplesRendered ) * nOutChannels, 0, nSamplesToZero * nOutChannels ); +#endif + *nSamplesRendered += nSamplesToZero; +#else #ifdef SPLIT_REND_WITH_HEAD_ROT set_pcm_buffer_to_zero( pcm_buffer_offset( pcmBuf, pcmType, nSamplesRendered * nOutChannels ), pcmType, nSamplesToZero * nOutChannels ); #else set_s( pcmBuf + nSamplesRendered * nOutChannels, 0, nSamplesToZero * nOutChannels ); #endif nSamplesRendered += nSamplesToZero; +#endif hIvasDec->nSamplesRendered += nSamplesToZero; hIvasDec->nSamplesAvailableNext -= nSamplesToZero; update_voip_rendered20ms( hIvasDec, nSamplesToZero ); @@ -2758,9 +2870,37 @@ ivas_error IVAS_DEC_VoIP_GetSamples( { int16_t nSamplesToRender, nSamplesRendered_loop; bool tmp; +#ifdef OBJ_EDITING_INTERFACE + nSamplesToRender = nSamplesPerChannel - *nSamplesRendered; +#else nSamplesToRender = nSamplesPerChannel - nSamplesRendered; +#endif + +#ifdef OBJ_EDITING_INTERFACE + /* check if we still need to prepare the renderer */ + if ( hIvasDec->hasBeenPreparedRendering == false ) + { + + if ( ( error = IVAS_DEC_PrepareRenderer( hIvasDec ) ) != IVAS_ERR_OK ) + { + return error; + } + } +#endif /* render IVAS frames directly to the output buffer */ +#ifdef OBJ_EDITING_INTERFACE +#ifdef SPLIT_REND_WITH_HEAD_ROT + if ( ( error = IVAS_DEC_GetSamples( hIvasDec, nSamplesToRender, pcmType, pcm_buffer_offset( pcmBuf, pcmType, *nSamplesRendered * nOutChannels ), &nSamplesRendered_loop, &tmp ) ) != IVAS_ERR_OK ) +#else + if ( ( error = IVAS_DEC_GetSamples( hIvasDec, nSamplesToRender, pcmBuf + *nSamplesRendered * nOutChannels, &nSamplesRendered_loop, &tmp ) ) != IVAS_ERR_OK ) +#endif + { + return error; + } + + *nSamplesRendered += nSamplesRendered_loop; +#else #ifdef SPLIT_REND_WITH_HEAD_ROT if ( ( error = IVAS_DEC_GetSamples( hIvasDec, nSamplesToRender, pcmType, pcm_buffer_offset( pcmBuf, pcmType, nSamplesRendered * nOutChannels ), &nSamplesRendered_loop, &tmp ) ) != IVAS_ERR_OK ) #else @@ -2771,6 +2911,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( } nSamplesRendered += nSamplesRendered_loop; +#endif update_voip_rendered20ms( hIvasDec, nSamplesRendered_loop ); } } diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index 2dccb45525..5df30cbdb8 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -154,6 +154,22 @@ ivas_error IVAS_DEC_FeedFrame_Serial( int16_t bfi /* i : bad frame indicator flag */ ); +#ifdef OBJ_EDITING_INTERFACE +ivas_error IVAS_DEC_GetEditableParameters( + IVAS_DEC_HANDLE hIvasDec, + IVAS_EDITABLE_PARAMETERS *hIvasEditableParameters +); + +ivas_error IVAS_DEC_SetEditableParameters( + IVAS_DEC_HANDLE hIvasDec, + IVAS_EDITABLE_PARAMETERS hIvasEditableParameters +); + +ivas_error IVAS_DEC_PrepareRenderer( + IVAS_DEC_HANDLE hIvasDec +); +#endif + /*! r: decoder error code */ ivas_error IVAS_DEC_GetSamples( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ @@ -282,6 +298,11 @@ ivas_error IVAS_DEC_VoIP_GetSamples( , JbmTraceFileWriterFn jbmWriterFn, void* jbmWriter #endif +#ifdef OBJ_EDITING_INTERFACE + , + uint16_t *nSamplesRendered, + bool *parametersAvailableForEditing +#endif ); ivas_error IVAS_DEC_Flush( -- GitLab From 9e5c8aae3fca657614310846deeee50b2fbe8767 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Mon, 8 Apr 2024 15:12:19 +0200 Subject: [PATCH 04/11] object editing interface, start populating the API functions, add example code in the decoder, add functionality for discrete ISM object editing. --- apps/decoder.c | 72 +++++++++++++++++++++++++- lib_com/common_api_types.h | 1 - lib_com/ivas_ism_com.c | 3 ++ lib_com/ivas_prot.h | 5 ++ lib_com/options.h | 2 +- lib_dec/ivas_dirac_dec.c | 3 ++ lib_dec/ivas_init_dec.c | 7 ++- lib_dec/ivas_ism_param_dec.c | 16 ++++++ lib_dec/ivas_ism_renderer.c | 63 ++++++++++++++++++++++ lib_dec/ivas_jbm_dec.c | 5 ++ lib_dec/ivas_objectRenderer_internal.c | 19 +++++++ lib_dec/ivas_stat_dec.h | 11 ++++ lib_dec/lib_dec.c | 57 +++++++++++++++++++- lib_rend/ivas_objectRenderer.c | 9 ++++ lib_rend/ivas_objectRenderer_sources.c | 34 ++++++++++++ lib_rend/ivas_prot_rend.h | 8 +++ 16 files changed, 310 insertions(+), 5 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 18dc59b385..0a956a6846 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -55,6 +55,11 @@ #include "debug.h" #endif #include "wmc_auto.h" +#ifdef OBJ_EDITING_INTERFACE +#ifdef DEBUGGING +#include +#endif +#endif #define WMC_TOOL_SKIP @@ -144,7 +149,11 @@ typedef struct uint16_t acousticEnvironmentId; int16_t Opt_dpid_on; uint16_t directivityPatternId[IVAS_MAX_NUM_OBJECTS]; - +#ifdef OBJ_EDITING_INTERFACE +#ifdef DEBUGGING + bool objEditEnabled; +#endif +#endif } DecArguments; @@ -1096,6 +1105,13 @@ static bool parseCmdlIVAS_dec( arg->directivityPatternId[i] = 65535; } +#ifdef OBJ_EDITING_INTERFACE +#ifdef DEBUGGING + arg->objEditEnabled = false; +#endif +#endif + + /*-----------------------------------------------------------------* * Initialization *-----------------------------------------------------------------*/ @@ -1521,6 +1537,15 @@ static bool parseCmdlIVAS_dec( i += tmp; } +#ifdef OBJ_EDITING_INTERFACE +#ifdef DEBUGGING + else if ( strcmp( argv_to_upper, "-OBJ_EDIT" ) == 0 ) + { + arg->objEditEnabled = true; + i++; + } +#endif +#endif /*-----------------------------------------------------------------* * Option not recognized @@ -2355,6 +2380,51 @@ static ivas_error decodeG192( } /* edit object parameters...*/ +#ifdef DEBUGGING + if ( arg.objEditEnabled ) + { + /* put the objects equally spaced at the horizontal plane */ + /* and play a little bit with the gains... */ + int16_t obj_idx, non_diegetic_obj_idx; + int16_t num_nondiegetic_objects; + float gain_mean; + float gain_amplitude; + float gain_freq; + float gain_freq_offset; + + num_nondiegetic_objects = 0; + for ( obj_idx = 0; obj_idx < editableParameters.num_obj; obj_idx++ ) + { + if ( !editableParameters.ism_metadata[obj_idx].non_diegetic_flag ) + { + num_nondiegetic_objects++; + } + } + if ( num_nondiegetic_objects ) + { + float start_angle, angle_inc; + angle_inc = 360.0f / (float) num_nondiegetic_objects; + start_angle = angle_inc / 2.0f; + for ( obj_idx = 0, non_diegetic_obj_idx = 0; obj_idx < editableParameters.num_obj; obj_idx++ ) + { + if ( !editableParameters.ism_metadata[obj_idx].non_diegetic_flag ) + { + editableParameters.ism_metadata[obj_idx].elevation = 0.0f; + editableParameters.ism_metadata[obj_idx].azimuth = start_angle + (float) non_diegetic_obj_idx * angle_inc; + non_diegetic_obj_idx++; + } + } + } + gain_mean = 1.0f; + gain_amplitude = 0.7f; + gain_freq = ( 2.0f * 3.1415f ) / 100.0f; + gain_freq_offset = 2.0f * 3.1415f / (float) ( editableParameters.num_obj + 1 ); + for ( obj_idx = 0; obj_idx < editableParameters.num_obj; obj_idx++ ) + { + editableParameters.ism_metadata[obj_idx].gain = gain_mean + gain_amplitude * sinf( (float) frame * gain_freq + gain_freq_offset * (float) obj_idx ); + } + } +#endif /* set new object parameters*/ if ( ( error = IVAS_DEC_SetEditableParameters( hIvasDec, editableParameters ) ) != IVAS_ERR_OK ) { diff --git a/lib_com/common_api_types.h b/lib_com/common_api_types.h index f9f55e20d4..3fb7aba5ea 100644 --- a/lib_com/common_api_types.h +++ b/lib_com/common_api_types.h @@ -130,7 +130,6 @@ typedef struct _IVAS_ISM_METADATA typedef struct _IVAS_EDITABLE_PARAMETERS { - int16_t num_obj; IVAS_ISM_METADATA ism_metadata[IVAS_MAX_NUM_OBJECTS]; float gain_bed; diff --git a/lib_com/ivas_ism_com.c b/lib_com/ivas_ism_com.c index 55f6016fcf..a1ba4caf05 100644 --- a/lib_com/ivas_ism_com.c +++ b/lib_com/ivas_ism_com.c @@ -417,6 +417,9 @@ void ivas_ism_reset_metadata( hIsmMeta->radius = 1.0f; hIsmMeta->ism_metadata_flag = 0; hIsmMeta->non_diegetic_flag = 0; +#ifdef OBJ_EDITING_INTERFACE + hIsmMeta->gain = 1.0f; +#endif return; } diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 2738e5b1c3..258e005745 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -1033,6 +1033,11 @@ ivas_error ivas_ism_metadata_dec( DEC_CORE_HANDLE st0 /* i : core-coder handle */ ); +#ifdef OBJ_EDITING_INTERFACE +void ivas_ism_renderer_update_md( + Decoder_Struct *st_ivas /* i/o: main IVAS decoder handle */ +); +#endif /*----------------------------------------------------------------------------------* * Parametric ISM prototypes diff --git a/lib_com/options.h b/lib_com/options.h index 2fec4cf680..ad8c3a5f94 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -48,7 +48,7 @@ /* ################### Start DEBUGGING switches ########################### */ #ifndef RELEASE -/*#define DEBUGGING*/ /* Activate debugging part of the code */ +#define DEBUGGING /* Activate debugging part of the code */ #endif /*#define WMOPS*/ /* Activate complexity and memory counters */ /*#define WMOPS_PER_FRAME*/ /* Output per-frame complexity (writes one float value per frame to the file "wmops_analysis") */ diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index c8d52aa67e..c201c8511e 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -2286,6 +2286,9 @@ void ivas_dirac_dec_render_sf( if ( st_ivas->hEFAPdata != NULL ) { efap_determine_gains( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains[i], az1, el1, EFAP_MODE_EFAP ); +#ifdef OBJ_EDITING_INTERFACE + v_multc( st_ivas->hIsmRendererData->gains[i], st_ivas->hIsmRendererData->edited_gains[i], st_ivas->hIsmRendererData->gains[i], nchan_out_woLFE ); +#endif } } diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index b92dc19ded..26a9cb4333 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -2138,7 +2138,12 @@ ivas_error ivas_init_decoder( st_ivas->renderer_type == RENDERER_OSBA_LS || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || - st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) + st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM +#ifdef OBJ_EDITING_INTERFACE + || st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD +#endif + ) + ) { if ( ( error = ivas_ism_renderer_open( st_ivas ) ) != IVAS_ERR_OK ) { diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index 77a23c3c54..2300478bf1 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -1035,13 +1035,23 @@ void ivas_ism_dec_digest_tc( if ( st_ivas->intern_config == IVAS_AUDIO_CONFIG_STEREO ) { +#ifdef OBJ_EDITING_INTERFACE + ivas_ism_get_stereo_gains( st_ivas->hIsmRendererData->edited_azimuth[i], st_ivas->hIsmRendererData->edited_elevation[i], &st_ivas->hIsmRendererData->gains[i][0], &st_ivas->hIsmRendererData->gains[i][1] ); + v_multc( st_ivas->hIsmRendererData->gains[i], st_ivas->hIsmRendererData->edited_gains[i], st_ivas->hIsmRendererData->gains[i], CPE_CHANNELS ); +#else ivas_ism_get_stereo_gains( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &st_ivas->hIsmRendererData->gains[i][0], &st_ivas->hIsmRendererData->gains[i][1] ); +#endif } else { // TODO tmu review when #215 is resolved +#ifdef OBJ_EDITING_INTERFACE + azimuth = (int16_t) floorf( st_ivas->hIsmRendererData->edited_azimuth[i] + 0.5f ); + elevation = (int16_t) floorf( st_ivas->hIsmRendererData->edited_elevation[i] + 0.5f ); +#else azimuth = (int16_t) floorf( st_ivas->hIsmMetaData[i]->azimuth + 0.5f ); elevation = (int16_t) floorf( st_ivas->hIsmMetaData[i]->elevation + 0.5f ); +#endif if ( ( st_ivas->renderer_type == RENDERER_TD_PANNING || st_ivas->renderer_type == RENDERER_OSBA_LS || @@ -1057,6 +1067,9 @@ void ivas_ism_dec_digest_tc( if ( st_ivas->hEFAPdata != NULL ) { efap_determine_gains( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains[i], azimuth, elevation, EFAP_MODE_EFAP ); +#ifdef OBJ_EDITING_INTERFACE + v_multc( st_ivas->hIsmRendererData->gains[i], st_ivas->hIsmRendererData->edited_gains[i], st_ivas->hIsmRendererData->gains[i], st_ivas->hEFAPdata->numSpk ); +#endif } } else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || @@ -1065,6 +1078,9 @@ void ivas_ism_dec_digest_tc( { /*get HOA gets for direction (ACN/SN3D)*/ ivas_dirac_dec_get_response( azimuth, elevation, st_ivas->hIsmRendererData->gains[i], st_ivas->hIntSetup.ambisonics_order ); +#ifdef OBJ_EDITING_INTERFACE + v_multc( st_ivas->hIsmRendererData->gains[i], st_ivas->hIsmRendererData->edited_gains[i], st_ivas->hIsmRendererData->gains[i], ivas_sba_get_nchan( st_ivas->hIntSetup.ambisonics_order, 0 ) ); +#endif } } } diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index 7b321c523b..bf00dd5021 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -78,6 +78,17 @@ ivas_error ivas_ism_renderer_open( { set_f( st_ivas->hIsmRendererData->prev_gains[i], 0.0f, MAX_OUTPUT_CHANNELS ); set_f( st_ivas->hIsmRendererData->gains[i], 0.0f, MAX_OUTPUT_CHANNELS ); +#ifdef OBJ_EDITING_INTERFACE + st_ivas->hIsmRendererData->edited_gains[i] = 1.0f; + st_ivas->hIsmRendererData->edited_azimuth[i] = 0.0f; + st_ivas->hIsmRendererData->edited_elevation[i] = 0.0f; + st_ivas->hIsmRendererData->edited_pitch[i] = 0.0f; + st_ivas->hIsmRendererData->edited_yaw[i] = 0.0f; + st_ivas->hIsmRendererData->edited_radius[i] = 1.0f; + st_ivas->hIsmRendererData->last_edited_azimuth[i] = 0.0f; + st_ivas->hIsmRendererData->last_edited_elevation[i] = 0.0f; + st_ivas->hIsmRendererData->non_diegetic_flag[i] = 0; +#endif } if ( st_ivas->hDecoderConfig->Opt_tsm ) @@ -132,6 +143,11 @@ void ivas_ism_renderer_close( return; } +#ifdef OBJ_EDITING_INTERFACE + + +#endif + /*-------------------------------------------------------------------------* * ivas_ism_render_sf() @@ -234,15 +250,26 @@ void ivas_ism_render_sf( { if ( subframe_idx >= ism_md_subframe_update_jbm ) { +#ifdef OBJ_EDITING_INTERFACE + rotateAziEle( st_ivas->hIsmRendererData->edited_azimuth[i], st_ivas->hIsmRendererData->edited_elevation[i], &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat[st_ivas->hCombinedOrientationData->subframe_idx], st_ivas->hIntSetup.is_planar_setup ); +#else rotateAziEle( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat[st_ivas->hCombinedOrientationData->subframe_idx], st_ivas->hIntSetup.is_planar_setup ); +#endif } else { +#ifdef OBJ_EDITING_INTERFACE + rotateAziEle( st_ivas->hIsmRendererData->last_edited_azimuth[i], st_ivas->hIsmRendererData->last_edited_elevation[i], &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat[st_ivas->hCombinedOrientationData->subframe_idx], st_ivas->hIntSetup.is_planar_setup ); +#else rotateAziEle( st_ivas->hIsmMetaData[i]->last_azimuth, st_ivas->hIsmMetaData[i]->last_elevation, &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat[st_ivas->hCombinedOrientationData->subframe_idx], st_ivas->hIntSetup.is_planar_setup ); +#endif } if ( st_ivas->hEFAPdata != NULL ) { efap_determine_gains( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains[i], azimuth, elevation, EFAP_MODE_EFAP ); +#ifdef OBJ_EDITING_INTERFACE + v_multc( st_ivas->hIsmRendererData->gains[i], st_ivas->hIsmRendererData->edited_gains[i], st_ivas->hIsmRendererData->gains[i], nchan_out_woLFE ); +#endif } } @@ -600,3 +627,39 @@ void ivas_omasa_separate_object_render_jbm( return; } + +#ifdef OBJ_EDITING_INTERFACE +/*-------------------------------------------------------------------------* + * ivas_ism_renderer_update_md() + * + * set renderer ISM MD to the bitstream ISM MD values + *-------------------------------------------------------------------------*/ +void ivas_ism_renderer_update_md( + Decoder_Struct *st_ivas /* i/o: main IVAS decoder handle */ +) +{ + ISM_RENDERER_HANDLE hIsmRenderer; + int16_t num_obj, obj_idx; + + + num_obj = st_ivas->nchan_ism; + hIsmRenderer = st_ivas->hIsmRendererData; + + for ( obj_idx = 0; obj_idx < num_obj; obj_idx++ ) + { + hIsmRenderer->last_edited_azimuth[obj_idx] = hIsmRenderer->edited_azimuth[obj_idx]; + hIsmRenderer->last_edited_elevation[obj_idx] = hIsmRenderer->edited_elevation[obj_idx]; + hIsmRenderer->edited_azimuth[obj_idx] = st_ivas->hIsmMetaData[obj_idx]->azimuth; + hIsmRenderer->edited_elevation[obj_idx] = st_ivas->hIsmMetaData[obj_idx]->elevation; + hIsmRenderer->edited_radius[obj_idx] = st_ivas->hIsmMetaData[obj_idx]->radius; + hIsmRenderer->edited_yaw[obj_idx] = st_ivas->hIsmMetaData[obj_idx]->yaw; + hIsmRenderer->edited_pitch[obj_idx] = st_ivas->hIsmMetaData[obj_idx]->pitch; + hIsmRenderer->edited_gains[obj_idx] = st_ivas->hIsmMetaData[obj_idx]->gain; + hIsmRenderer->non_diegetic_flag[obj_idx] = st_ivas->hIsmMetaData[obj_idx]->non_diegetic_flag; + } + + return; +} + + +#endif diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index d5c9b66ce3..6d2b61534e 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -146,6 +146,7 @@ ivas_error ivas_jbm_dec_tc( } else if ( st_ivas->ivas_format == ISM_FORMAT ) { + /* Metadata decoding and configuration */ if ( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) { @@ -189,6 +190,10 @@ ivas_error ivas_jbm_dec_tc( hp20( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); } +#ifdef OBJ_EDITING_INTERFACE + ivas_ism_renderer_update_md( st_ivas ); +#endif + if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX ) { ivas_ism_mono_dmx( st_ivas, p_output, output_frame ); diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index 907affdae1..96f47ef9f0 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -173,7 +173,26 @@ ivas_error ivas_td_binaural_renderer_sf( } if ( subframe_idx == ism_md_subframe_update_jbm ) { +#ifdef OBJ_EDITING_INTERFACE + ISM_METADATA_FRAME ismMetaData[MAX_NUM_OBJECTS]; + ISM_METADATA_HANDLE hIsmMetaData[MAX_NUM_OBJECTS]; + int16_t s_idx; + s_idx = 0; + for ( nS = 0; nS < nchan_ism; nS++ ) + { + ismMetaData[nS].azimuth = st_ivas->hIsmRendererData->edited_azimuth[nS]; + ismMetaData[nS].elevation = st_ivas->hIsmRendererData->edited_elevation[nS]; + ismMetaData[nS].radius = st_ivas->hIsmRendererData->edited_radius[nS]; + ismMetaData[nS].yaw = st_ivas->hIsmRendererData->edited_yaw[nS]; + ismMetaData[nS].pitch = st_ivas->hIsmRendererData->edited_pitch[nS]; + ismMetaData[nS].non_diegetic_flag = st_ivas->hIsmRendererData->non_diegetic_flag[nS]; + ismMetaData[nS].gain = st_ivas->hIsmRendererData->edited_gains[nS]; + hIsmMetaData[nS] = &ismMetaData[nS]; + } + if ( ( error = TDREND_Update_object_positions( st_ivas->hBinRendererTd, nchan_ism, st_ivas->ivas_format, hIsmMetaData ) ) != IVAS_ERR_OK ) +#else if ( ( error = TDREND_Update_object_positions( st_ivas->hBinRendererTd, nchan_ism, st_ivas->ivas_format, st_ivas->hIsmMetaData ) ) != IVAS_ERR_OK ) +#endif { return error; } diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index ab37bc9896..7b5539cd7b 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -808,6 +808,17 @@ typedef struct renderer_struct float *interpolator; int16_t interpolator_length; float gains[MAX_CICP_CHANNELS - 1][MAX_OUTPUT_CHANNELS]; +#ifdef OBJ_EDITING_INTERFACE + float edited_gains[MAX_NUM_OBJECTS]; + float edited_azimuth[MAX_NUM_OBJECTS]; + float edited_elevation[MAX_NUM_OBJECTS]; + float edited_yaw[MAX_NUM_OBJECTS]; + float edited_pitch[MAX_NUM_OBJECTS]; + float edited_radius[MAX_NUM_OBJECTS]; + float last_edited_azimuth[MAX_NUM_OBJECTS]; + float last_edited_elevation[MAX_NUM_OBJECTS]; + int16_t non_diegetic_flag[MAX_NUM_OBJECTS]; +#endif } ISM_RENDERER_DATA, *ISM_RENDERER_HANDLE; diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 7e0ad2116a..23f1a05bc4 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -952,7 +952,32 @@ ivas_error IVAS_DEC_GetEditableParameters( { ivas_error error; - hIvasEditableParameters = NULL; + if ( hIvasEditableParameters == NULL || hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + hIvasEditableParameters->num_obj = hIvasDec->st_ivas->nchan_ism; + if ( hIvasDec->st_ivas->ivas_format == ISM_FORMAT || hIvasDec->st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + int16_t obj; + for ( obj = 0; obj < hIvasEditableParameters->num_obj; obj++ ) + { + hIvasEditableParameters->ism_metadata[obj].azimuth = hIvasDec->st_ivas->hIsmMetaData[obj]->azimuth; + hIvasEditableParameters->ism_metadata[obj].elevation = hIvasDec->st_ivas->hIsmMetaData[obj]->elevation; + hIvasEditableParameters->ism_metadata[obj].yaw = hIvasDec->st_ivas->hIsmMetaData[obj]->yaw; + hIvasEditableParameters->ism_metadata[obj].pitch = hIvasDec->st_ivas->hIsmMetaData[obj]->pitch; + hIvasEditableParameters->ism_metadata[obj].radius = hIvasDec->st_ivas->hIsmMetaData[obj]->radius; + hIvasEditableParameters->ism_metadata[obj].gain = hIvasDec->st_ivas->hIsmMetaData[obj]->gain; + hIvasEditableParameters->ism_metadata[obj].non_diegetic_flag = hIvasDec->st_ivas->hIsmMetaData[obj]->non_diegetic_flag; + } + } + else if ( hIvasDec->st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + } + else + { + } error = IVAS_ERR_OK; @@ -973,6 +998,36 @@ ivas_error IVAS_DEC_SetEditableParameters( error = IVAS_ERR_OK; + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + +#ifdef DEBUGGING + assert( hIvasEditableParameters.num_obj == hIvasDec->st_ivas->nchan_ism ); +#endif + + if ( hIvasDec->st_ivas->ivas_format == ISM_FORMAT || hIvasDec->st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + int16_t obj; + for ( obj = 0; obj < hIvasEditableParameters.num_obj; obj++ ) + { + hIvasDec->st_ivas->hIsmRendererData->edited_azimuth[obj] = hIvasEditableParameters.ism_metadata[obj].azimuth; + hIvasDec->st_ivas->hIsmRendererData->edited_elevation[obj] = hIvasEditableParameters.ism_metadata[obj].elevation; + hIvasDec->st_ivas->hIsmRendererData->edited_yaw[obj] = hIvasEditableParameters.ism_metadata[obj].yaw; + hIvasDec->st_ivas->hIsmRendererData->edited_pitch[obj] = hIvasEditableParameters.ism_metadata[obj].pitch; + hIvasDec->st_ivas->hIsmRendererData->edited_radius[obj] = hIvasEditableParameters.ism_metadata[obj].radius; + hIvasDec->st_ivas->hIsmRendererData->edited_gains[obj] = hIvasEditableParameters.ism_metadata[obj].gain; + hIvasDec->st_ivas->hIsmRendererData->non_diegetic_flag[obj] = hIvasEditableParameters.ism_metadata[obj].non_diegetic_flag; + } + } + else if ( hIvasDec->st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + } + else + { + } + return error; } diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 35d5531633..001a4d7899 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -478,6 +478,9 @@ static void TDREND_Clear_Update_flags( for ( i = 0; i < hBinRendererTd->NumOfSrcs; i++ ) { hBinRendererTd->Sources[i]->SrcSpatial_p->Updated = FALSE; +#ifdef OBJ_EDITING_INTERFACE + hBinRendererTd->Sources[i]->SrcRend_p->SrcGainUpdated = FALSE; +#endif } return; @@ -545,6 +548,12 @@ ivas_error TDREND_Update_object_positions( { return error; } +#ifdef OBJ_EDITING_INTERFACE + if ( ( error = TDREND_MIX_SRC_SetSrcGain( hBinRendererTd, nS, hIsmMetaData[nS]->gain ) ) != IVAS_ERR_OK ) + { + return error; + } +#endif } } diff --git a/lib_rend/ivas_objectRenderer_sources.c b/lib_rend/ivas_objectRenderer_sources.c index 3f580df504..e1da7043a4 100644 --- a/lib_rend/ivas_objectRenderer_sources.c +++ b/lib_rend/ivas_objectRenderer_sources.c @@ -153,6 +153,36 @@ ivas_error TDREND_MIX_SRC_SetDirAtten( return IVAS_ERR_OK; } +#ifdef OBJ_EDITING_INTERFACE +/*-------------------------------------------------------------------* + * TDREND_MIX_SRC_SetSrcGain() + * + * Set the source (i.e. overall gain) for a source for the mixer. + --------------------------------------------------------------------*/ + +ivas_error TDREND_MIX_SRC_SetSrcGain( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + const int16_t SrcInd, /* i : Source index */ + const float SrcGain_p /* i : Source gain */ +) +{ + if ( SrcInd > hBinRendererTd->MaxSrcInd ) + { + return ( IVAS_ERROR( IVAS_ERR_INVALID_INDEX, "Index exceeds max index\n" ) ); + } + else if ( SrcGain_p < *hBinRendererTd->Sources[SrcInd]->SrcRend_p->SrcGainMin_p || SrcGain_p > *hBinRendererTd->Sources[SrcInd]->SrcRend_p->SrcGainMax_p ) + { + return ( IVAS_ERROR( IVAS_ERR_INVALID_INDEX, "gain exceeds gain limits\n" ) ); + } + else + { + *hBinRendererTd->Sources[SrcInd]->SrcRend_p->SrcGain_p = SrcGain_p; + hBinRendererTd->Sources[SrcInd]->SrcRend_p->SrcGainUpdated = TRUE; + } + + return IVAS_ERR_OK; +} +#endif /*-------------------------------------------------------------------* * TDREND_MIX_SRC_SetPlayState() @@ -224,7 +254,11 @@ static void TDREND_SRC_REND_Init( { SrcRend_p->SrcGainMin_p[nC] = 0.0f; SrcRend_p->SrcGain_p[nC] = 1.0f; +#ifdef OBJ_EDITING_INTERFACE + SrcRend_p->SrcGainMax_p[nC] = 2.0f; +#else SrcRend_p->SrcGainMax_p[nC] = 1.0f; +#endif } SrcRend_p->SrcGainUpdated = FALSE; diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 7de4ed3e8c..e1f9794b4f 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -760,6 +760,14 @@ ivas_error TDREND_MIX_SRC_SetPlayState( const TDREND_PlayStatus_t PlayStatus /* i : Play state */ ); +#ifdef OBJ_EDITING_INTERFACE +ivas_error TDREND_MIX_SRC_SetSrcGain( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + const int16_t SrcInd, /* i : Source index */ + const float SrcGain_p /* i : Source gain */ +); +#endif + void TDREND_SRC_REND_UpdateFiltersFromSpatialParams( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ TDREND_SRC_REND_t *SrcRend_p, /* i/o: Source object */ -- GitLab From df367c9d1a4845ee4fe659f1800bf117c739770c Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Thu, 11 Apr 2024 08:36:01 +0200 Subject: [PATCH 05/11] fixes to make sure all modes run w/o problems when no object editing happens --- apps/decoder.c | 34 ++++++++++--------- lib_dec/ivas_jbm_dec.c | 13 +++++-- lib_dec/ivas_objectRenderer_internal.c | 47 ++++++++++++++++---------- 3 files changed, 57 insertions(+), 37 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 0a956a6846..27f01e33d7 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -2371,18 +2371,20 @@ static ivas_error decodeG192( goto cleanup; } #ifdef OBJ_EDITING_INTERFACE - /* Do object info editing here */ - /* get object parameters */ - if ( ( error = IVAS_DEC_GetEditableParameters( hIvasDec, &editableParameters ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nError: could not get the editable parameters: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); - goto cleanup; - } - - /* edit object parameters...*/ #ifdef DEBUGGING if ( arg.objEditEnabled ) { + + /* Do object info editing here */ + /* get object parameters */ + if ( ( error = IVAS_DEC_GetEditableParameters( hIvasDec, &editableParameters ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: could not get the editable parameters: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + /* edit object parameters...*/ + /* put the objects equally spaced at the horizontal plane */ /* and play a little bit with the gains... */ int16_t obj_idx, non_diegetic_obj_idx; @@ -2415,6 +2417,7 @@ static ivas_error decodeG192( } } } + /* 2 second AM of the object gains. */ gain_mean = 1.0f; gain_amplitude = 0.7f; gain_freq = ( 2.0f * 3.1415f ) / 100.0f; @@ -2423,15 +2426,14 @@ static ivas_error decodeG192( { editableParameters.ism_metadata[obj_idx].gain = gain_mean + gain_amplitude * sinf( (float) frame * gain_freq + gain_freq_offset * (float) obj_idx ); } + /* set new object parameters*/ + if ( ( error = IVAS_DEC_SetEditableParameters( hIvasDec, editableParameters ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: could not set the editable parameters: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } } #endif - /* set new object parameters*/ - if ( ( error = IVAS_DEC_SetEditableParameters( hIvasDec, editableParameters ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nError: could not set the editable parameters: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); - goto cleanup; - } - /* Do the final preparations needed for rendering */ if ( ( error = IVAS_DEC_PrepareRenderer( hIvasDec ) ) != IVAS_ERR_OK ) { diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 6d2b61534e..52a998f317 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -191,7 +191,10 @@ ivas_error ivas_jbm_dec_tc( } #ifdef OBJ_EDITING_INTERFACE - ivas_ism_renderer_update_md( st_ivas ); + if ( st_ivas->ism_mode != ISM_MODE_PARAM && ( st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_EXTERNAL && st_ivas->renderer_type != RENDERER_MONO_DOWNMIX ) ) + { + ivas_ism_renderer_update_md( st_ivas ); + } #endif if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX ) @@ -965,7 +968,11 @@ void ivas_jbm_dec_feed_tc_to_renderer( } else #endif - if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) + if ( st_ivas->mc_mode == MC_MODE_PARAMMC +#ifdef OBJ_EDITING_INTERFACE + && st_ivas->hTcBuffer->tc_buffer_mode == TC_BUFFER_MODE_RENDERER +#endif + ) { ivas_param_mc_dec_digest_tc( st_ivas, (uint8_t) n_render_timeslots, p_data_f ); } @@ -1011,7 +1018,7 @@ void ivas_jbm_dec_prepare_renderer( { ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); } - if ( st_ivas->ivas_format == ISM_FORMAT ) + else if ( st_ivas->ivas_format == ISM_FORMAT ) { /* Rendering */ if ( st_ivas->ism_mode == ISM_MODE_PARAM ) diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index 96f47ef9f0..8584644d38 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -174,28 +174,39 @@ ivas_error ivas_td_binaural_renderer_sf( if ( subframe_idx == ism_md_subframe_update_jbm ) { #ifdef OBJ_EDITING_INTERFACE - ISM_METADATA_FRAME ismMetaData[MAX_NUM_OBJECTS]; - ISM_METADATA_HANDLE hIsmMetaData[MAX_NUM_OBJECTS]; - int16_t s_idx; - s_idx = 0; - for ( nS = 0; nS < nchan_ism; nS++ ) + if ( st_ivas->ivas_format == ISM_FORMAT ) { - ismMetaData[nS].azimuth = st_ivas->hIsmRendererData->edited_azimuth[nS]; - ismMetaData[nS].elevation = st_ivas->hIsmRendererData->edited_elevation[nS]; - ismMetaData[nS].radius = st_ivas->hIsmRendererData->edited_radius[nS]; - ismMetaData[nS].yaw = st_ivas->hIsmRendererData->edited_yaw[nS]; - ismMetaData[nS].pitch = st_ivas->hIsmRendererData->edited_pitch[nS]; - ismMetaData[nS].non_diegetic_flag = st_ivas->hIsmRendererData->non_diegetic_flag[nS]; - ismMetaData[nS].gain = st_ivas->hIsmRendererData->edited_gains[nS]; - hIsmMetaData[nS] = &ismMetaData[nS]; + ISM_METADATA_FRAME ismMetaData[MAX_NUM_OBJECTS]; + ISM_METADATA_HANDLE hIsmMetaData[MAX_NUM_OBJECTS]; + int16_t s_idx; + s_idx = 0; + for ( nS = 0; nS < nchan_ism; nS++ ) + { + ismMetaData[nS].azimuth = st_ivas->hIsmRendererData->edited_azimuth[nS]; + ismMetaData[nS].elevation = st_ivas->hIsmRendererData->edited_elevation[nS]; + ismMetaData[nS].radius = st_ivas->hIsmRendererData->edited_radius[nS]; + ismMetaData[nS].yaw = st_ivas->hIsmRendererData->edited_yaw[nS]; + ismMetaData[nS].pitch = st_ivas->hIsmRendererData->edited_pitch[nS]; + ismMetaData[nS].non_diegetic_flag = st_ivas->hIsmRendererData->non_diegetic_flag[nS]; + ismMetaData[nS].gain = st_ivas->hIsmRendererData->edited_gains[nS]; + hIsmMetaData[nS] = &ismMetaData[nS]; + } + + if ( ( error = TDREND_Update_object_positions( st_ivas->hBinRendererTd, nchan_ism, st_ivas->ivas_format, hIsmMetaData ) ) != IVAS_ERR_OK ) + { + return error; + } } - if ( ( error = TDREND_Update_object_positions( st_ivas->hBinRendererTd, nchan_ism, st_ivas->ivas_format, hIsmMetaData ) ) != IVAS_ERR_OK ) -#else - if ( ( error = TDREND_Update_object_positions( st_ivas->hBinRendererTd, nchan_ism, st_ivas->ivas_format, st_ivas->hIsmMetaData ) ) != IVAS_ERR_OK ) -#endif + else { - return error; +#endif + if ( ( error = TDREND_Update_object_positions( st_ivas->hBinRendererTd, nchan_ism, st_ivas->ivas_format, st_ivas->hIsmMetaData ) ) != IVAS_ERR_OK ) + { + return error; + } +#ifdef OBJ_EDITING_INTERFACE } +#endif } /* Update the listener's location/orientation */ -- GitLab From d5210093368bf527cd48cac8c87efe6961e97c59 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Tue, 23 Apr 2024 09:47:04 +0200 Subject: [PATCH 06/11] fix Linux compile errors --- lib_dec/ivas_ism_param_dec.c | 4 ---- lib_dec/ivas_objectRenderer_internal.c | 2 -- lib_dec/lib_dec.c | 10 +++++++--- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index 2300478bf1..aacde8e88d 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -1282,22 +1282,18 @@ void ivas_param_ism_dec_prepare_renderer( int16_t ch, nchan_transport, nchan_out, nchan_out_woLFE, i; int16_t slot_idx, bin_idx; int32_t ivas_total_brate; - int16_t output_frame; float ref_power[CLDFB_NO_CHANNELS_MAX]; float cx_diag[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_DMX]; /* Direct Response/EFAP Gains */ float direct_response[MAX_NUM_OBJECTS][PARAM_ISM_MAX_CHAN]; PARAM_ISM_DEC_HANDLE hParamIsmDec; SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; - int16_t fade_len; /* Initialization */ hParamIsmDec = st_ivas->hParamIsmDec; assert( hParamIsmDec ); hSpatParamRendCom = st_ivas->hSpatParamRendCom; assert( hSpatParamRendCom ); - output_frame = nCldfbSlots * hSpatParamRendCom->num_freq_bands; - fade_len = output_frame / 2; nchan_transport = st_ivas->nchan_transport; ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index 8584644d38..4b6ac2cce6 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -178,8 +178,6 @@ ivas_error ivas_td_binaural_renderer_sf( { ISM_METADATA_FRAME ismMetaData[MAX_NUM_OBJECTS]; ISM_METADATA_HANDLE hIsmMetaData[MAX_NUM_OBJECTS]; - int16_t s_idx; - s_idx = 0; for ( nS = 0; nS < nchan_ism; nS++ ) { ismMetaData[nS].azimuth = st_ivas->hIsmRendererData->edited_azimuth[nS]; diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 23f1a05bc4..0f474d27f8 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1078,17 +1078,21 @@ ivas_error IVAS_DEC_GetSamples( { ivas_error error; int16_t nSamplesToRender; - uint16_t nSamplesRendered, nSamplesRendered_loop, l_ts; - uint8_t nTransportChannels, nOutChannels; + uint16_t nSamplesRendered, nSamplesRendered_loop; + uint8_t nOutChannels; #ifndef OBJ_EDITING_INTERFACE + uint8_t nTransportChannels; int16_t nOutSamplesElse; - uint16_t nTimeScalerOutSamples; + uint16_t nTimeScalerOutSamples. l_ts; #endif nSamplesRendered = 0; nOutChannels = 0; nSamplesRendered_loop = 0; +#ifndef OBJ_EDITING_INTERFACE l_ts = 0; nTransportChannels = 0; +#endif + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) { -- GitLab From be36c11053235f4882d17101b1611fc4c7e49255 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Mon, 29 Apr 2024 11:48:49 +0200 Subject: [PATCH 07/11] object editing interface, created two sub-defines to OBJECT_EDITING_INTERFACE: OBJECT_EDITING_API and OBJECT_EDITING_DECODER to better distinguish between changes needed for the API adaption and changes needed in the decoder itself --- apps/decoder.c | 22 ++++++------- lib_com/common_api_types.h | 4 +-- lib_com/ivas_ism_com.c | 2 +- lib_com/ivas_prot.h | 8 ++--- lib_com/ivas_stat_com.h | 2 +- lib_com/options.h | 6 +++- lib_dec/ivas_dirac_dec.c | 2 +- lib_dec/ivas_init_dec.c | 2 +- lib_dec/ivas_ism_param_dec.c | 22 ++++++------- lib_dec/ivas_ism_renderer.c | 15 +++------ lib_dec/ivas_jbm_dec.c | 18 +++++------ lib_dec/ivas_mc_param_dec.c | 30 ++++-------------- lib_dec/ivas_objectRenderer_internal.c | 4 +-- lib_dec/ivas_stat_dec.h | 4 +-- lib_dec/lib_dec.c | 44 +++++++++++++------------- lib_dec/lib_dec.h | 4 +-- lib_rend/ivas_objectRenderer.c | 4 +-- lib_rend/ivas_objectRenderer_sources.c | 4 +-- lib_rend/ivas_prot_rend.h | 2 +- 19 files changed, 91 insertions(+), 108 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 4e0489ca45..69b14167f9 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -55,7 +55,7 @@ #include "debug.h" #endif #include "wmc_auto.h" -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API #ifdef DEBUGGING #include #endif @@ -149,7 +149,7 @@ typedef struct uint16_t acousticEnvironmentId; int16_t Opt_dpid_on; uint16_t directivityPatternId[IVAS_MAX_NUM_OBJECTS]; -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API #ifdef DEBUGGING bool objEditEnabled; #endif @@ -1105,7 +1105,7 @@ static bool parseCmdlIVAS_dec( arg->directivityPatternId[i] = 65535; } -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API #ifdef DEBUGGING arg->objEditEnabled = false; #endif @@ -1537,7 +1537,7 @@ static bool parseCmdlIVAS_dec( i += tmp; } -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API #ifdef DEBUGGING else if ( strcmp( argv_to_upper, "-OBJ_EDIT" ) == 0 ) { @@ -2106,7 +2106,7 @@ static ivas_error decodeG192( #ifdef SPLIT_REND_WITH_HEAD_ROT SplitFileReadWrite *splitRendWriter = NULL; #endif -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API IVAS_EDITABLE_PARAMETERS editableParameters; #endif @@ -2370,7 +2370,7 @@ static ivas_error decodeG192( fprintf( stderr, "\nError: could not feed frame to decoder: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API #ifdef DEBUGGING if ( arg.objEditEnabled ) { @@ -3028,7 +3028,7 @@ static ivas_error decodeVoIP( int16_t vec_pos_update, vec_pos_len; int16_t nOutSamples = 0; -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API bool parameterAvailableForEditing = false; uint16_t nSamplesRendered = 0; #endif @@ -3149,7 +3149,7 @@ static ivas_error decodeVoIP( while ( 1 ) { -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API nSamplesRendered = 0; #endif /* reference vector */ @@ -3322,11 +3322,11 @@ static ivas_error decodeVoIP( /* decode and get samples */ -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API while ( nSamplesRendered < nOutSamples ) { #endif -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API #ifdef SPLIT_REND_WITH_HEAD_ROT #ifdef SUPPORT_JBM_TRACEFILE if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, IVAS_DEC_PCM_INT16, (void *) pcmBuf, systemTime_ms, writeJbmTraceFileFrameWrapper, jbmTraceWriter, &nSamplesRendered, ¶meterAvailableForEditing ) ) != IVAS_ERR_OK ) @@ -3359,7 +3359,7 @@ static ivas_error decodeVoIP( fprintf( stderr, "\nError in IVAS_DEC_VoIP_GetSamples: %s\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API if ( parameterAvailableForEditing == true ) { /* do the object editing here */ diff --git a/lib_com/common_api_types.h b/lib_com/common_api_types.h index c6793b86c3..474c467d21 100644 --- a/lib_com/common_api_types.h +++ b/lib_com/common_api_types.h @@ -122,13 +122,13 @@ typedef struct _IVAS_ISM_METADATA float yaw; float pitch; int16_t non_diegetic_flag; -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API float gain; #endif } IVAS_ISM_METADATA; -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API typedef struct _IVAS_EDITABLE_PARAMETERS { int16_t num_obj; diff --git a/lib_com/ivas_ism_com.c b/lib_com/ivas_ism_com.c index a1ba4caf05..d32e1179bc 100644 --- a/lib_com/ivas_ism_com.c +++ b/lib_com/ivas_ism_com.c @@ -417,7 +417,7 @@ void ivas_ism_reset_metadata( hIsmMeta->radius = 1.0f; hIsmMeta->ism_metadata_flag = 0; hIsmMeta->non_diegetic_flag = 0; -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_DECODER hIsmMeta->gain = 1.0f; #endif diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 3531670f71..fe5802c3e8 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -822,7 +822,7 @@ void ivas_jbm_dec_feed_tc_to_renderer( float *data /* i/o: transport channels/output synthesis signal */ ); -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API void ivas_jbm_dec_prepare_renderer( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); @@ -1033,7 +1033,7 @@ ivas_error ivas_ism_metadata_dec( DEC_CORE_HANDLE st0 /* i : core-coder handle */ ); -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_DECODER void ivas_ism_renderer_update_md( Decoder_Struct *st_ivas /* i/o: main IVAS decoder handle */ ); @@ -1116,7 +1116,7 @@ void ivas_param_ism_dec_digest_tc( float *transport_channels_f[] /* i : synthesized core-coder transport channels/DirAC output */ ); -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API void ivas_param_ism_dec_prepare_renderer( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ const uint16_t nCldfbSlots /* i : number of CLFBS slots in the transport channels */ @@ -3872,7 +3872,7 @@ void ivas_param_mc_dec_digest_tc( float *transport_channels_f[] /* i : synthesized core-coder transport channels/DirAC output*/ ); -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API void ivas_param_mc_dec_prepare_renderer( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ const uint8_t nCldfbSlots /* i : number of CLFBS slots in the transport channels */ diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index 7ce6768040..ae5653d05f 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -87,7 +87,7 @@ typedef struct float q_azimuth_old; float q_elevation_old; -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_DECODER float gain; #endif diff --git a/lib_com/options.h b/lib_com/options.h index 2cd99fffcb..fa563f0cd2 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -150,7 +150,11 @@ /* ################## Start DEVELOPMENT switches ######################### */ -#define OBJ_EDITING_INTERFACE +#define OBJ_EDITING_INTERFACE /* Interface for object editing */ +#ifdef OBJ_EDITING_INTERFACE +#define OBJ_EDITING_API /* object editing changes related to the API */ +#define OBJ_EDITING_DECODER /* object editing changes realted to the decoder functions */ +#endif /* ################### Start BE switches ################################# */ /* only BE switches wrt selection floating point code */ diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index c201c8511e..280311021a 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -2286,7 +2286,7 @@ void ivas_dirac_dec_render_sf( if ( st_ivas->hEFAPdata != NULL ) { efap_determine_gains( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains[i], az1, el1, EFAP_MODE_EFAP ); -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_DECODER v_multc( st_ivas->hIsmRendererData->gains[i], st_ivas->hIsmRendererData->edited_gains[i], st_ivas->hIsmRendererData->gains[i], nchan_out_woLFE ); #endif } diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index cee995db01..9b57805d78 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -2139,7 +2139,7 @@ ivas_error ivas_init_decoder( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_DECODER || st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD #endif ) diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index f93be45fb3..813849d79b 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -752,7 +752,7 @@ void ivas_ism_dec_digest_tc( if ( st_ivas->intern_config == IVAS_AUDIO_CONFIG_STEREO ) { -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_DECODER ivas_ism_get_stereo_gains( st_ivas->hIsmRendererData->edited_azimuth[i], st_ivas->hIsmRendererData->edited_elevation[i], &st_ivas->hIsmRendererData->gains[i][0], &st_ivas->hIsmRendererData->gains[i][1] ); v_multc( st_ivas->hIsmRendererData->gains[i], st_ivas->hIsmRendererData->edited_gains[i], st_ivas->hIsmRendererData->gains[i], CPE_CHANNELS ); #else @@ -762,7 +762,7 @@ void ivas_ism_dec_digest_tc( else { // TODO tmu review when #215 is resolved -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_DECODER azimuth = (int16_t) floorf( st_ivas->hIsmRendererData->edited_azimuth[i] + 0.5f ); elevation = (int16_t) floorf( st_ivas->hIsmRendererData->edited_elevation[i] + 0.5f ); #else @@ -784,7 +784,7 @@ void ivas_ism_dec_digest_tc( if ( st_ivas->hEFAPdata != NULL ) { efap_determine_gains( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains[i], azimuth, elevation, EFAP_MODE_EFAP ); -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_DECODER v_multc( st_ivas->hIsmRendererData->gains[i], st_ivas->hIsmRendererData->edited_gains[i], st_ivas->hIsmRendererData->gains[i], st_ivas->hEFAPdata->numSpk ); #endif } @@ -795,7 +795,7 @@ void ivas_ism_dec_digest_tc( { /*get HOA gets for direction (ACN/SN3D)*/ ivas_dirac_dec_get_response( azimuth, elevation, st_ivas->hIsmRendererData->gains[i], st_ivas->hIntSetup.ambisonics_order ); -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_DECODER v_multc( st_ivas->hIsmRendererData->gains[i], st_ivas->hIsmRendererData->edited_gains[i], st_ivas->hIsmRendererData->gains[i], ivas_sba_get_nchan( st_ivas->hIntSetup.ambisonics_order, 0 ) ); #endif } @@ -821,13 +821,13 @@ void ivas_param_ism_dec_digest_tc( { int16_t ch, nchan_transport; int16_t slot_idx; -#ifndef OBJ_EDITING_INTERFACE +#ifndef OBJ_EDITING_API int16_t nchan_out, nchan_out_woLFE, i; int16_t bin_idx; int32_t ivas_total_brate; #endif int16_t output_frame; -#ifndef OBJ_EDITING_INTERFACE +#ifndef OBJ_EDITING_API float ref_power[CLDFB_NO_CHANNELS_MAX]; float cx_diag[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_DMX]; /* Direct Response/EFAP Gains */ @@ -847,7 +847,7 @@ void ivas_param_ism_dec_digest_tc( nchan_transport = st_ivas->nchan_transport; -#ifndef OBJ_EDITING_INTERFACE +#ifndef OBJ_EDITING_API ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) @@ -864,7 +864,7 @@ void ivas_param_ism_dec_digest_tc( #endif push_wmops( "ivas_param_ism_dec_digest_tc" ); -#ifndef OBJ_EDITING_INTERFACE +#ifndef OBJ_EDITING_API /* general setup */ ivas_jbm_dec_get_adapted_linear_interpolator( DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbSlots, hParamIsmDec->hParamIsmRendering->interpolator ); @@ -961,13 +961,13 @@ void ivas_param_ism_dec_digest_tc( mvr2r( RealBuffer, &hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], hSpatParamRendCom->num_freq_bands ); mvr2r( ImagBuffer, &hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], hSpatParamRendCom->num_freq_bands ); } -#ifndef OBJ_EDITING_INTERFACE +#ifndef OBJ_EDITING_API ivas_param_ism_collect_slot( hParamIsmDec, &hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], &hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], ch, ref_power, cx_diag ); #endif } } -#ifndef OBJ_EDITING_INTERFACE +#ifndef OBJ_EDITING_API /* Obtain Mixing Matrix on a frame-level */ for ( bin_idx = 0; bin_idx < hSpatParamRendCom->num_freq_bands; bin_idx++ ) { @@ -984,7 +984,7 @@ void ivas_param_ism_dec_digest_tc( } -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API /*-------------------------------------------------------------------------* * ivas_param_ism_dec_prepare_renderer() * diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index 64c68014d4..d637bce348 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -78,7 +78,7 @@ ivas_error ivas_ism_renderer_open( { set_f( st_ivas->hIsmRendererData->prev_gains[i], 0.0f, MAX_OUTPUT_CHANNELS ); set_f( st_ivas->hIsmRendererData->gains[i], 0.0f, MAX_OUTPUT_CHANNELS ); -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_DECODER st_ivas->hIsmRendererData->edited_gains[i] = 1.0f; st_ivas->hIsmRendererData->edited_azimuth[i] = 0.0f; st_ivas->hIsmRendererData->edited_elevation[i] = 0.0f; @@ -143,11 +143,6 @@ void ivas_ism_renderer_close( return; } -#ifdef OBJ_EDITING_INTERFACE - - -#endif - /*-------------------------------------------------------------------------* * ivas_ism_render_sf() @@ -246,7 +241,7 @@ void ivas_ism_render_sf( { if ( subframe_idx >= ism_md_subframe_update_jbm ) { -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_DECODER rotateAziEle( st_ivas->hIsmRendererData->edited_azimuth[i], st_ivas->hIsmRendererData->edited_elevation[i], &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat[st_ivas->hCombinedOrientationData->subframe_idx], st_ivas->hIntSetup.is_planar_setup ); #else rotateAziEle( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat[st_ivas->hCombinedOrientationData->subframe_idx], st_ivas->hIntSetup.is_planar_setup ); @@ -254,7 +249,7 @@ void ivas_ism_render_sf( } else { -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_DECODER rotateAziEle( st_ivas->hIsmRendererData->last_edited_azimuth[i], st_ivas->hIsmRendererData->last_edited_elevation[i], &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat[st_ivas->hCombinedOrientationData->subframe_idx], st_ivas->hIntSetup.is_planar_setup ); #else rotateAziEle( st_ivas->hIsmMetaData[i]->last_azimuth, st_ivas->hIsmMetaData[i]->last_elevation, &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat[st_ivas->hCombinedOrientationData->subframe_idx], st_ivas->hIntSetup.is_planar_setup ); @@ -263,7 +258,7 @@ void ivas_ism_render_sf( if ( st_ivas->hEFAPdata != NULL ) { efap_determine_gains( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains[i], azimuth, elevation, EFAP_MODE_EFAP ); -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_DECODER v_multc( st_ivas->hIsmRendererData->gains[i], st_ivas->hIsmRendererData->edited_gains[i], st_ivas->hIsmRendererData->gains[i], nchan_out_woLFE ); #endif } @@ -624,7 +619,7 @@ void ivas_omasa_separate_object_render_jbm( return; } -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_DECODER /*-------------------------------------------------------------------------* * ivas_ism_renderer_update_md() * diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 1bbb8b381c..7819919511 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -190,7 +190,7 @@ ivas_error ivas_jbm_dec_tc( hp20( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); } -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_DECODER if ( st_ivas->ism_mode != ISM_MODE_PARAM && ( st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_EXTERNAL && st_ivas->renderer_type != RENDERER_MONO_DOWNMIX ) ) { ivas_ism_renderer_update_md( st_ivas ); @@ -825,7 +825,7 @@ void ivas_jbm_dec_feed_tc_to_renderer( } n_render_timeslots = st_ivas->hTcBuffer->n_samples_available / st_ivas->hTcBuffer->n_samples_granularity; -#ifndef OBJ_EDITING_INTERFACE +#ifndef OBJ_EDITING_API if ( st_ivas->hTcBuffer->tc_buffer_mode == TC_BUFFER_MODE_BUFFER ) { ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); @@ -846,7 +846,7 @@ void ivas_jbm_dec_feed_tc_to_renderer( /* Rendering */ if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { -#ifndef OBJ_EDITING_INTERFACE +#ifndef OBJ_EDITING_API if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) { ivas_dirac_dec_set_md_map( st_ivas, n_render_timeslots ); @@ -860,14 +860,14 @@ void ivas_jbm_dec_feed_tc_to_renderer( ivas_param_ism_dec_digest_tc( st_ivas, n_render_timeslots, p_data_f ); } } -#ifndef OBJ_EDITING_INTERFACE +#ifndef OBJ_EDITING_API else /* ISM_MODE_DISC */ { ivas_ism_dec_digest_tc( st_ivas ); } #endif } -#ifndef OBJ_EDITING_INTERFACE +#ifndef OBJ_EDITING_API else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) { ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); @@ -966,7 +966,7 @@ void ivas_jbm_dec_feed_tc_to_renderer( #endif else if ( st_ivas->ivas_format == MC_FORMAT ) { -#ifndef OBJ_EDITING_INTERFACE +#ifndef OBJ_EDITING_API if ( st_ivas->mc_mode == MC_MODE_MCT ) { ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); @@ -978,14 +978,14 @@ void ivas_jbm_dec_feed_tc_to_renderer( else #endif if ( st_ivas->mc_mode == MC_MODE_PARAMMC -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API && st_ivas->hTcBuffer->tc_buffer_mode == TC_BUFFER_MODE_RENDERER #endif ) { ivas_param_mc_dec_digest_tc( st_ivas, (uint8_t) n_render_timeslots, p_data_f ); } -#ifndef OBJ_EDITING_INTERFACE +#ifndef OBJ_EDITING_API else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) { ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); @@ -997,7 +997,7 @@ void ivas_jbm_dec_feed_tc_to_renderer( return; } -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API /*--------------------------------------------------------------------------* * ivas_jbm_dec_prepare_renderer() * diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index f65907252f..ba5cfae2b4 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -1330,7 +1330,7 @@ void ivas_param_mc_dec_digest_tc( int16_t ch; int16_t slot_idx; int16_t nchan_transport; -#ifndef OBJ_EDITING_INTERFACE +#ifndef OBJ_EDITING_API int16_t nchan_out_transport, nchan_out_cldfb, i, param_band_idx; int16_t nchan_out_cov; /*CLDFB*/ @@ -1345,12 +1345,12 @@ void ivas_param_mc_dec_digest_tc( assert( hParamMC ); push_wmops( "param_mc_dec_digest_tc" ); -#ifndef OBJ_EDITING_INTERFACE +#ifndef OBJ_EDITING_API set_s( channel_active, 0, MAX_CICP_CHANNELS ); #endif nchan_transport = st_ivas->nchan_transport; -#ifndef OBJ_EDITING_INTERFACE +#ifndef OBJ_EDITING_API nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) @@ -1419,14 +1419,14 @@ void ivas_param_mc_dec_digest_tc( mvr2r( ImagBuffer, &hParamMC->Cldfb_ImagBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport + ch * hParamMC->num_freq_bands], hParamMC->num_freq_bands ); } } -#ifndef OBJ_EDITING_INTERFACE +#ifndef OBJ_EDITING_API if ( slot_idx >= 2 * hParamMC->hMetadataPMC->attackIndex ) { ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot( &hParamMC->Cldfb_RealBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport], &hParamMC->Cldfb_ImagBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport], cx, cx_imag, hParamMC, nchan_transport ); } #endif } -#ifndef OBJ_EDITING_INTERFACE +#ifndef OBJ_EDITING_API /* map from complex input covariance to real values */ for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx++ ) { @@ -1478,9 +1478,9 @@ void ivas_param_mc_dec_digest_tc( return; } -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API /*------------------------------------------------------------------------- - * ivas_param_mc_dec_digest_tc() + * ivas_param_mc_dec_prepare_renderer() * * *------------------------------------------------------------------------*/ @@ -1564,22 +1564,6 @@ void ivas_param_mc_dec_prepare_renderer( /* slot loop for gathering the input data */ for ( slot_idx = 0; slot_idx < nCldfbSlots; slot_idx++ ) { -#ifndef OBJ_EDITING_INTERFACE - if ( st_ivas->hDecoderConfig->Opt_tsm ) - { - float RealBuffer[CLDFB_NO_CHANNELS_MAX]; - float ImagBuffer[CLDFB_NO_CHANNELS_MAX]; - - /* CLDFB Analysis*/ - for ( ch = 0; ch < nchan_transport; ch++ ) - { - cldfbAnalysis_ts( &( transport_channels_f[ch][hParamMC->num_freq_bands * slot_idx] ), RealBuffer, ImagBuffer, hParamMC->num_freq_bands, st_ivas->cldfbAnaDec[ch] ); - - mvr2r( RealBuffer, &hParamMC->Cldfb_RealBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport + ch * hParamMC->num_freq_bands], hParamMC->num_freq_bands ); - mvr2r( ImagBuffer, &hParamMC->Cldfb_ImagBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport + ch * hParamMC->num_freq_bands], hParamMC->num_freq_bands ); - } - } -#endif if ( slot_idx >= 2 * hParamMC->hMetadataPMC->attackIndex ) { ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot( &hParamMC->Cldfb_RealBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport], &hParamMC->Cldfb_ImagBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport], cx, cx_imag, hParamMC, nchan_transport ); diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index 4b6ac2cce6..958eae1266 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -173,7 +173,7 @@ ivas_error ivas_td_binaural_renderer_sf( } if ( subframe_idx == ism_md_subframe_update_jbm ) { -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_DECODER if ( st_ivas->ivas_format == ISM_FORMAT ) { ISM_METADATA_FRAME ismMetaData[MAX_NUM_OBJECTS]; @@ -202,7 +202,7 @@ ivas_error ivas_td_binaural_renderer_sf( { return error; } -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_DECODER } #endif } diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 7b5539cd7b..c92fb692a7 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -808,7 +808,7 @@ typedef struct renderer_struct float *interpolator; int16_t interpolator_length; float gains[MAX_CICP_CHANNELS - 1][MAX_OUTPUT_CHANNELS]; -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_DECODER float edited_gains[MAX_NUM_OBJECTS]; float edited_azimuth[MAX_NUM_OBJECTS]; float edited_elevation[MAX_NUM_OBJECTS]; @@ -908,7 +908,7 @@ typedef struct ivas_masa_ism_data_structure int16_t azimuth_ism_edited[MAX_NUM_OBJECTS]; int16_t elevation_ism_edited[MAX_NUM_OBJECTS]; uint8_t ism_is_edited[MAX_NUM_OBJECTS]; -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_DECODER float gain_ism[MAX_NUM_OBJECTS]; float gain_masa; #endif diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 0f474d27f8..728a3daa7c 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -94,7 +94,7 @@ struct IVAS_DEC int16_t prev_ft_speech; /* RXDTX handler: previous frametype flag for G.192 format AMRWB SID_FIRST detection */ int16_t CNG; /* RXDTX handler: CNG=1, nonCNG=0 */ -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API uint16_t nSamplesFlushed; int16_t *flushbuffer; bool hasEditableParameters; @@ -183,7 +183,7 @@ ivas_error IVAS_DEC_Open( hIvasDec->hasDecodedFirstGoodFrame = false; hIvasDec->isInitialized = false; hIvasDec->updateOrientation = false; -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API hIvasDec->flushbuffer = NULL; hIvasDec->nSamplesFlushed = 0; hIvasDec->hasEditableParameters = false; @@ -331,7 +331,7 @@ void IVAS_DEC_Close( { free( ( *phIvasDec )->apaExecBuffer ); } -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API if ( ( *phIvasDec )->flushbuffer != NULL ) { free( ( *phIvasDec )->flushbuffer ); @@ -501,7 +501,7 @@ ivas_error IVAS_DEC_Configure( hIvasDec->tsm_max_scaling = 0; hIvasDec->tsm_quality = 1.0f; -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API /* init flush buffer if necessary (only needed for binaural)*/ if ( tsmEnabled && ( outputConfig == IVAS_AUDIO_CONFIG_BINAURAL || outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM || outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { @@ -763,7 +763,7 @@ ivas_error IVAS_DEC_EnableVoIP( return IVAS_ERR_FAILED_ALLOC; } -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API /* init flush buffer if necessary (only needed for binaural)*/ if ( hIvasDec->flushbuffer == NULL && ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL || hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM || hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { @@ -864,7 +864,7 @@ ivas_error IVAS_DEC_FeedFrame_Serial( hIvasDec->nSamplesRendered = 0; hIvasDec->nSamplesAvailableNext = hIvasDec->nSamplesFrame; -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API /* decode TCs, do TSM and feed to renderer */ /* setup */ { @@ -940,7 +940,7 @@ ivas_error IVAS_DEC_FeedFrame_Serial( } -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API /*---------------------------------------------------------------------* * IVAS_DEC_GetEditableParameters( ) * @@ -1080,7 +1080,7 @@ ivas_error IVAS_DEC_GetSamples( int16_t nSamplesToRender; uint16_t nSamplesRendered, nSamplesRendered_loop; uint8_t nOutChannels; -#ifndef OBJ_EDITING_INTERFACE +#ifndef OBJ_EDITING_API uint8_t nTransportChannels; int16_t nOutSamplesElse; uint16_t nTimeScalerOutSamples. l_ts; @@ -1088,7 +1088,7 @@ ivas_error IVAS_DEC_GetSamples( nSamplesRendered = 0; nOutChannels = 0; nSamplesRendered_loop = 0; -#ifndef OBJ_EDITING_INTERFACE +#ifndef OBJ_EDITING_API l_ts = 0; nTransportChannels = 0; #endif @@ -1099,7 +1099,7 @@ ivas_error IVAS_DEC_GetSamples( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API /* the rendering needs to be prepared at this point */ if ( hIvasDec->hasBeenPreparedRendering == false ) { @@ -1157,7 +1157,7 @@ ivas_error IVAS_DEC_GetSamples( } else { -#ifndef OBJ_EDITING_INTERFACE +#ifndef OBJ_EDITING_API /* check if we need to run the setup function */ if ( !hIvasDec->isInitialized || hIvasDec->hasBeenFedFrame ) { @@ -1179,7 +1179,7 @@ ivas_error IVAS_DEC_GetSamples( #endif { /* check if we need to run the setup function, tc decoding and feeding the renderer */ -#ifndef OBJ_EDITING_INTERFACE +#ifndef OBJ_EDITING_API if ( !hIvasDec->isInitialized || hIvasDec->hasBeenFedFrame ) { int16_t nResidualSamples, nSamplesTcsScaled; @@ -2736,7 +2736,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( JbmTraceFileWriterFn jbmWriterFn, void *jbmWriter #endif -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API , uint16_t *nSamplesRendered, bool *parametersAvailableForEditing @@ -2751,7 +2751,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( uint16_t extBufferedSamples; int16_t result; ivas_error error; -#ifndef OBJ_EDITING_INTERFACE +#ifndef OBJ_EDITING_API int16_t nSamplesRendered; #endif uint8_t nOutChannels; @@ -2760,10 +2760,10 @@ ivas_error IVAS_DEC_VoIP_GetSamples( hDecoderConfig = st_ivas->hDecoderConfig; hVoIP = hIvasDec->hVoIP; nOutChannels = (uint8_t) st_ivas->hDecoderConfig->nchan_out; -#ifndef OBJ_EDITING_INTERFACE +#ifndef OBJ_EDITING_API nSamplesRendered = 0; #endif -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API *parametersAvailableForEditing = false; #endif @@ -2773,7 +2773,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( } /* make sure that the FIFO after decoder/scaler contains at least one sound card frame (i.e. 20ms) */ -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API while ( *nSamplesRendered < nSamplesPerChannel ) #else while ( nSamplesRendered < nSamplesPerChannel ) @@ -2890,7 +2890,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( hIvasDec->nSamplesAvailableNext = hIvasDec->nSamplesFrame; hIvasDec->nSamplesRendered = 0; } -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API /* :TODO: only return here if we really have editing initialized */ if ( hIvasDec->hasBeenFedFirstGoodFrame && hIvasDec->hasEditableParameters == true && hIvasDec->enableParameterEditing == true ) { @@ -2906,7 +2906,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( /* codec mode to use not known yet - simply output silence */ /* directly set output zero */ int16_t nSamplesToZero = min( nSamplesPerChannel, hIvasDec->nSamplesAvailableNext ); -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API #ifdef SPLIT_REND_WITH_HEAD_ROT set_pcm_buffer_to_zero( pcm_buffer_offset( pcmBuf, pcmType, ( *nSamplesRendered ) * nOutChannels ), pcmType, nSamplesToZero * nOutChannels ); #else @@ -2929,13 +2929,13 @@ ivas_error IVAS_DEC_VoIP_GetSamples( { int16_t nSamplesToRender, nSamplesRendered_loop; bool tmp; -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API nSamplesToRender = nSamplesPerChannel - *nSamplesRendered; #else nSamplesToRender = nSamplesPerChannel - nSamplesRendered; #endif -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API /* check if we still need to prepare the renderer */ if ( hIvasDec->hasBeenPreparedRendering == false ) { @@ -2948,7 +2948,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( #endif /* render IVAS frames directly to the output buffer */ -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API #ifdef SPLIT_REND_WITH_HEAD_ROT if ( ( error = IVAS_DEC_GetSamples( hIvasDec, nSamplesToRender, pcmType, pcm_buffer_offset( pcmBuf, pcmType, *nSamplesRendered * nOutChannels ), &nSamplesRendered_loop, &tmp ) ) != IVAS_ERR_OK ) #else diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index 5df30cbdb8..e30e030c9f 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -154,7 +154,7 @@ ivas_error IVAS_DEC_FeedFrame_Serial( int16_t bfi /* i : bad frame indicator flag */ ); -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API ivas_error IVAS_DEC_GetEditableParameters( IVAS_DEC_HANDLE hIvasDec, IVAS_EDITABLE_PARAMETERS *hIvasEditableParameters @@ -298,7 +298,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( , JbmTraceFileWriterFn jbmWriterFn, void* jbmWriter #endif -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_API , uint16_t *nSamplesRendered, bool *parametersAvailableForEditing diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 001a4d7899..05b0ad8508 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -478,7 +478,7 @@ static void TDREND_Clear_Update_flags( for ( i = 0; i < hBinRendererTd->NumOfSrcs; i++ ) { hBinRendererTd->Sources[i]->SrcSpatial_p->Updated = FALSE; -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_DECODER hBinRendererTd->Sources[i]->SrcRend_p->SrcGainUpdated = FALSE; #endif } @@ -548,7 +548,7 @@ ivas_error TDREND_Update_object_positions( { return error; } -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_DECODER if ( ( error = TDREND_MIX_SRC_SetSrcGain( hBinRendererTd, nS, hIsmMetaData[nS]->gain ) ) != IVAS_ERR_OK ) { return error; diff --git a/lib_rend/ivas_objectRenderer_sources.c b/lib_rend/ivas_objectRenderer_sources.c index e1da7043a4..5969236038 100644 --- a/lib_rend/ivas_objectRenderer_sources.c +++ b/lib_rend/ivas_objectRenderer_sources.c @@ -153,7 +153,7 @@ ivas_error TDREND_MIX_SRC_SetDirAtten( return IVAS_ERR_OK; } -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_DECODER /*-------------------------------------------------------------------* * TDREND_MIX_SRC_SetSrcGain() * @@ -254,7 +254,7 @@ static void TDREND_SRC_REND_Init( { SrcRend_p->SrcGainMin_p[nC] = 0.0f; SrcRend_p->SrcGain_p[nC] = 1.0f; -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_DECODER SrcRend_p->SrcGainMax_p[nC] = 2.0f; #else SrcRend_p->SrcGainMax_p[nC] = 1.0f; diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index e1f9794b4f..5d0da2a72c 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -760,7 +760,7 @@ ivas_error TDREND_MIX_SRC_SetPlayState( const TDREND_PlayStatus_t PlayStatus /* i : Play state */ ); -#ifdef OBJ_EDITING_INTERFACE +#ifdef OBJ_EDITING_DECODER ivas_error TDREND_MIX_SRC_SetSrcGain( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ const int16_t SrcInd, /* i : Source index */ -- GitLab From 565774e364be20cec9bd6ce4311ed92cc213a89a Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Mon, 29 Apr 2024 13:17:46 +0200 Subject: [PATCH 08/11] object editing interface, fix API changes in conjunction with split rendering, add a new define OBJ_EDITING_EXAMPLE for the example code in decoder.c since DEBUGGING is broken at the moment, clang-format, fix small bug in inactive code --- apps/decoder.c | 10 +++---- lib_com/options.h | 3 +- lib_dec/ivas_init_dec.c | 7 ++--- lib_dec/ivas_mc_param_dec.c | 2 +- lib_dec/lib_dec.c | 58 +++++++++++++++++++++++++++++++++++-- 5 files changed, 66 insertions(+), 14 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 4ae5474901..87db265e44 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -56,7 +56,7 @@ #endif #include "wmc_auto.h" #ifdef OBJ_EDITING_API -#ifdef DEBUGGING +#ifdef OBJ_EDITING_EXAMPLE #include #endif #endif @@ -165,7 +165,7 @@ typedef struct int16_t Opt_dpid_on; uint16_t directivityPatternId[IVAS_MAX_NUM_OBJECTS]; #ifdef OBJ_EDITING_API -#ifdef DEBUGGING +#ifdef OBJ_EDITING_EXAMPLE bool objEditEnabled; #endif #endif @@ -1161,7 +1161,7 @@ static bool parseCmdlIVAS_dec( } #ifdef OBJ_EDITING_API -#ifdef DEBUGGING +#ifdef OBJ_EDITING_EXAMPLE arg->objEditEnabled = false; #endif #endif @@ -1672,7 +1672,7 @@ static bool parseCmdlIVAS_dec( i += tmp; } #ifdef OBJ_EDITING_API -#ifdef DEBUGGING +#ifdef OBJ_EDITING_EXAMPLE else if ( strcmp( argv_to_upper, "-OBJ_EDIT" ) == 0 ) { arg->objEditEnabled = true; @@ -2579,7 +2579,7 @@ static ivas_error decodeG192( goto cleanup; } #ifdef OBJ_EDITING_API -#ifdef DEBUGGING +#ifdef OBJ_EDITING_EXAMPLE if ( arg.objEditEnabled ) { diff --git a/lib_com/options.h b/lib_com/options.h index 00adef5d00..e592d5a869 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -48,7 +48,7 @@ /* ################### Start DEBUGGING switches ########################### */ #ifndef RELEASE -#define DEBUGGING /* Activate debugging part of the code */ +/*#define DEBUGGING*/ /* Activate debugging part of the code */ #endif /*#define WMOPS*/ /* Activate complexity and memory counters */ /*#define WMOPS_PER_FRAME*/ /* Output per-frame complexity (writes one float value per frame to the file "wmops_analysis") */ @@ -154,6 +154,7 @@ #ifdef OBJ_EDITING_INTERFACE #define OBJ_EDITING_API /* object editing changes related to the API */ #define OBJ_EDITING_DECODER /* object editing changes realted to the decoder functions */ +#define OBJ_EDITING_EXAMPLE /* obj editing example code in decoder.c */ #endif /* ################### Start BE switches ################################# */ diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 0bb17725a0..1c5bbe24f5 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -2147,12 +2147,11 @@ ivas_error ivas_init_decoder( st_ivas->renderer_type == RENDERER_OSBA_LS || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || - st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM + st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM #ifdef OBJ_EDITING_DECODER - || st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD + || st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD #endif - ) - ) + ) ) { if ( ( error = ivas_ism_renderer_open( st_ivas ) ) != IVAS_ERR_OK ) { diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index ba5cfae2b4..11fb97c9cf 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -1332,7 +1332,7 @@ void ivas_param_mc_dec_digest_tc( int16_t nchan_transport; #ifndef OBJ_EDITING_API int16_t nchan_out_transport, nchan_out_cldfb, i, param_band_idx; - int16_t nchan_out_cov; + int16_t nchan_out_cov; /*CLDFB*/ float cx[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; float cx_imag[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 3327fa6814..639b7dc162 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -98,7 +98,12 @@ struct IVAS_DEC #ifdef OBJ_EDITING_API uint16_t nSamplesFlushed; +#ifdef SPLIT_REND_WITH_HEAD_ROT + void *flushbuffer; + IVAS_DEC_PCM_TYPE pcmType; +#else int16_t *flushbuffer; +#endif bool hasEditableParameters; bool enableParameterEditing; bool hasBeenPreparedRendering; @@ -188,6 +193,9 @@ ivas_error IVAS_DEC_Open( hIvasDec->updateOrientation = false; #ifdef OBJ_EDITING_API hIvasDec->flushbuffer = NULL; +#ifdef SPLIT_REND_WITH_HEAD_ROT + hIvasDec->pcmType = PCM_NOT_KNOW; +#endif hIvasDec->nSamplesFlushed = 0; hIvasDec->hasEditableParameters = false; hIvasDec->enableParameterEditing = false; @@ -544,8 +552,14 @@ ivas_error IVAS_DEC_Configure( /* init flush buffer if necessary (only needed for binaural)*/ if ( tsmEnabled && ( outputConfig == IVAS_AUDIO_CONFIG_BINAURAL || outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM || outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { +#ifdef SPLIT_REND_WITH_HEAD_ROT + hIvasDec->flushbuffer = (void *) malloc( CPE_CHANNELS * hIvasDec->nSamplesFrame / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( int16_t ) ); + hIvasDec->pcmType = PCM_INT16; + set_s( (int16_t *) hIvasDec->flushbuffer, 0, CPE_CHANNELS * hIvasDec->nSamplesFrame / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES ); +#else hIvasDec->flushbuffer = (int16_t *) malloc( CPE_CHANNELS * hIvasDec->nSamplesFrame / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( int16_t ) ); set_s( hIvasDec->flushbuffer, 0, CPE_CHANNELS * hIvasDec->nSamplesFrame / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES ); +#endif } #endif @@ -815,10 +829,16 @@ ivas_error IVAS_DEC_EnableVoIP( #ifdef OBJ_EDITING_API /* init flush buffer if necessary (only needed for binaural)*/ - if ( hIvasDec->flushbuffer == NULL && ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL || hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM || hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + if ( hIvasDec->flushbuffer == NULL && ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL || hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { +#ifdef SPLIT_REND_WITH_HEAD_ROT + hIvasDec->flushbuffer = (void *) malloc( CPE_CHANNELS * hIvasDec->nSamplesFrame / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( int16_t ) ); + hIvasDec->pcmType = PCM_INT16; + set_s( (int16_t *) hIvasDec->flushbuffer, 0, CPE_CHANNELS * hIvasDec->nSamplesFrame / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES ); +#else hIvasDec->flushbuffer = (int16_t *) malloc( CPE_CHANNELS * hIvasDec->nSamplesFrame / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( int16_t ) ); set_s( hIvasDec->flushbuffer, 0, CPE_CHANNELS * hIvasDec->nSamplesFrame / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES ); +#endif } #endif @@ -922,7 +942,7 @@ ivas_error IVAS_DEC_FeedFrame_Serial( uint8_t nTransportChannels, nOutChannels; int16_t nResidualSamples, nSamplesTcsScaled, nOutSamplesElse; #ifdef SPLIT_REND_WITH_HEAD_ROT - if ( ( error = IVAS_DEC_Setup( hIvasDec, &l_ts, &nTransportChannels, &nOutChannels, &nSamplesRendered_loop, pcmType, pcm_buffer_offset( pcmBuf, pcmType, nSamplesRendered * nOutChannels ) ) ) != IVAS_ERR_OK ) + if ( ( error = IVAS_DEC_Setup( hIvasDec, &l_ts, &nTransportChannels, &nOutChannels, &hIvasDec->nSamplesFlushed, hIvasDec->pcmType, hIvasDec->flushbuffer ) ) != IVAS_ERR_OK ) #else if ( ( error = IVAS_DEC_Setup( hIvasDec, &l_ts, &nTransportChannels, &nOutChannels, &hIvasDec->nSamplesFlushed, hIvasDec->flushbuffer ) ) != IVAS_ERR_OK ) #endif @@ -1133,7 +1153,7 @@ ivas_error IVAS_DEC_GetSamples( #ifndef OBJ_EDITING_API uint8_t nTransportChannels; int16_t nOutSamplesElse; - uint16_t nTimeScalerOutSamples. l_ts; + uint16_t nTimeScalerOutSamples, l_ts; #endif nSamplesRendered = 0; nOutChannels = 0; @@ -1294,7 +1314,29 @@ ivas_error IVAS_DEC_GetSamples( /* check for possible flushed samples from a rate switch */ if ( hIvasDec->nSamplesFlushed > 0 ) { +#ifdef SPLIT_REND_WITH_HEAD_ROT + void *pPcmBuffer; +#ifdef DEBUGGING + assert( hIvasDec->pcmType == pcmType ); +#endif + pPcmBuffer = pcm_buffer_offset( pcmBuf, pcmType, nSamplesRendered * nOutChannels ); + if ( pcmType == PCM_INT16 ) + { + mvs2s( (int16_t *) hIvasDec->flushbuffer, pPcmBuffer, hIvasDec->nSamplesFlushed * nOutChannels ); + } + else if ( pcmType == PCM_FLOAT32 ) + { + mvr2r( (float *) hIvasDec->flushbuffer, pPcmBuffer, hIvasDec->nSamplesFlushed * nOutChannels ); + } +#ifdef DEBUGGING + else + { + assert( 0 & "wrong PCM type for the flush buffer!" ); + } +#endif +#else mvs2s( hIvasDec->flushbuffer, pcmBuf + nSamplesRendered * nOutChannels, hIvasDec->nSamplesFlushed * nOutChannels ); +#endif nSamplesRendered += hIvasDec->nSamplesFlushed; hIvasDec->nSamplesFlushed = 0; } @@ -1382,6 +1424,16 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( numPoses = hSplitBinRend->splitrend.multiBinPoseData.num_poses; +#ifdef OBJ_EDITING_API + /* init flush buffer for rate switch if not already initizalized */ + if ( hIvasDec->flushbuffer == NULL ) + { + hIvasDec->flushbuffer = (void *) malloc( numPoses * BINAURAL_CHANNELS * hIvasDec->nSamplesFrame / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( float ) ); + hIvasDec->pcmType = PCM_FLOAT32; + set_zero( (float *) hIvasDec->flushbuffer, numPoses * BINAURAL_CHANNELS * hIvasDec->nSamplesFrame / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES ); + } +#endif + if ( st_ivas->hDecoderConfig->render_framesize != IVAS_RENDER_FRAMESIZE_20MS && ( hIvasDec->st_ivas->hRenderConfig->split_rend_config.poseCorrectionMode == ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE || hIvasDec->st_ivas->hRenderConfig->split_rend_config.dof == 0 ) ) -- GitLab From ea37c88376e03a66dd09ce3c01a5797b92ae7913 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Mon, 29 Apr 2024 13:25:28 +0200 Subject: [PATCH 09/11] ivas object editing, fix Linux comple error, use the correct PCM type enum from the API --- lib_dec/lib_dec.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 639b7dc162..c9ca141b25 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -194,7 +194,7 @@ ivas_error IVAS_DEC_Open( #ifdef OBJ_EDITING_API hIvasDec->flushbuffer = NULL; #ifdef SPLIT_REND_WITH_HEAD_ROT - hIvasDec->pcmType = PCM_NOT_KNOW; + hIvasDec->pcmType = IVAS_DEC_PCM_INVALID; #endif hIvasDec->nSamplesFlushed = 0; hIvasDec->hasEditableParameters = false; @@ -554,7 +554,7 @@ ivas_error IVAS_DEC_Configure( { #ifdef SPLIT_REND_WITH_HEAD_ROT hIvasDec->flushbuffer = (void *) malloc( CPE_CHANNELS * hIvasDec->nSamplesFrame / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( int16_t ) ); - hIvasDec->pcmType = PCM_INT16; + hIvasDec->pcmType = IVAS_DEC_PCM_INT16; set_s( (int16_t *) hIvasDec->flushbuffer, 0, CPE_CHANNELS * hIvasDec->nSamplesFrame / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES ); #else hIvasDec->flushbuffer = (int16_t *) malloc( CPE_CHANNELS * hIvasDec->nSamplesFrame / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( int16_t ) ); @@ -833,7 +833,7 @@ ivas_error IVAS_DEC_EnableVoIP( { #ifdef SPLIT_REND_WITH_HEAD_ROT hIvasDec->flushbuffer = (void *) malloc( CPE_CHANNELS * hIvasDec->nSamplesFrame / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( int16_t ) ); - hIvasDec->pcmType = PCM_INT16; + hIvasDec->pcmType = IVAS_DEC_PCM_INT16; set_s( (int16_t *) hIvasDec->flushbuffer, 0, CPE_CHANNELS * hIvasDec->nSamplesFrame / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES ); #else hIvasDec->flushbuffer = (int16_t *) malloc( CPE_CHANNELS * hIvasDec->nSamplesFrame / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( int16_t ) ); @@ -1320,11 +1320,11 @@ ivas_error IVAS_DEC_GetSamples( assert( hIvasDec->pcmType == pcmType ); #endif pPcmBuffer = pcm_buffer_offset( pcmBuf, pcmType, nSamplesRendered * nOutChannels ); - if ( pcmType == PCM_INT16 ) + if ( pcmType == IVAS_DEC_PCM_INT16 ) { mvs2s( (int16_t *) hIvasDec->flushbuffer, pPcmBuffer, hIvasDec->nSamplesFlushed * nOutChannels ); } - else if ( pcmType == PCM_FLOAT32 ) + else if ( pcmType == IVAS_DEC_PCM_FLOAT ) { mvr2r( (float *) hIvasDec->flushbuffer, pPcmBuffer, hIvasDec->nSamplesFlushed * nOutChannels ); } @@ -1429,7 +1429,7 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( if ( hIvasDec->flushbuffer == NULL ) { hIvasDec->flushbuffer = (void *) malloc( numPoses * BINAURAL_CHANNELS * hIvasDec->nSamplesFrame / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( float ) ); - hIvasDec->pcmType = PCM_FLOAT32; + hIvasDec->pcmType = IVAS_DEC_PCM_FLOAT; set_zero( (float *) hIvasDec->flushbuffer, numPoses * BINAURAL_CHANNELS * hIvasDec->nSamplesFrame / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES ); } #endif -- GitLab From 407125cdb0d8813e1145f3900a29876d55d5ddaa Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Tue, 30 Apr 2024 09:54:48 +0200 Subject: [PATCH 10/11] strip out all changes not directly related to the object editing API --- lib_com/ivas_ism_com.c | 3 -- lib_com/ivas_prot.h | 5 --- lib_com/ivas_stat_com.h | 3 -- lib_com/options.h | 1 - lib_dec/ivas_dirac_dec.c | 3 -- lib_dec/ivas_init_dec.c | 3 -- lib_dec/ivas_ism_param_dec.c | 16 -------- lib_dec/ivas_ism_renderer.c | 57 -------------------------- lib_dec/ivas_jbm_dec.c | 6 --- lib_dec/ivas_objectRenderer_internal.c | 28 ------------- lib_dec/ivas_stat_dec.h | 15 ------- lib_dec/lib_dec.c | 10 +---- lib_rend/ivas_objectRenderer.c | 9 ---- lib_rend/ivas_objectRenderer_sources.c | 34 --------------- lib_rend/ivas_prot_rend.h | 7 ---- 15 files changed, 1 insertion(+), 199 deletions(-) diff --git a/lib_com/ivas_ism_com.c b/lib_com/ivas_ism_com.c index d32e1179bc..55f6016fcf 100644 --- a/lib_com/ivas_ism_com.c +++ b/lib_com/ivas_ism_com.c @@ -417,9 +417,6 @@ void ivas_ism_reset_metadata( hIsmMeta->radius = 1.0f; hIsmMeta->ism_metadata_flag = 0; hIsmMeta->non_diegetic_flag = 0; -#ifdef OBJ_EDITING_DECODER - hIsmMeta->gain = 1.0f; -#endif return; } diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 4561a457e2..893543b3ea 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -1038,11 +1038,6 @@ ivas_error ivas_ism_metadata_dec( DEC_CORE_HANDLE st0 /* i : core-coder handle */ ); -#ifdef OBJ_EDITING_DECODER -void ivas_ism_renderer_update_md( - Decoder_Struct *st_ivas /* i/o: main IVAS decoder handle */ -); -#endif /*----------------------------------------------------------------------------------* * Parametric ISM prototypes diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index b219346d34..bc146b73e0 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -87,9 +87,6 @@ typedef struct float q_azimuth_old; float q_elevation_old; -#ifdef OBJ_EDITING_DECODER - float gain; -#endif } ISM_METADATA_FRAME, *ISM_METADATA_HANDLE; diff --git a/lib_com/options.h b/lib_com/options.h index e592d5a869..e5f15d4dd6 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -153,7 +153,6 @@ #define OBJ_EDITING_INTERFACE /* Interface for object editing */ #ifdef OBJ_EDITING_INTERFACE #define OBJ_EDITING_API /* object editing changes related to the API */ -#define OBJ_EDITING_DECODER /* object editing changes realted to the decoder functions */ #define OBJ_EDITING_EXAMPLE /* obj editing example code in decoder.c */ #endif diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index e34e883a48..29d8cdb855 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -2286,9 +2286,6 @@ void ivas_dirac_dec_render_sf( if ( st_ivas->hEFAPdata != NULL ) { efap_determine_gains( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains[i], az1, el1, EFAP_MODE_EFAP ); -#ifdef OBJ_EDITING_DECODER - v_multc( st_ivas->hIsmRendererData->gains[i], st_ivas->hIsmRendererData->edited_gains[i], st_ivas->hIsmRendererData->gains[i], nchan_out_woLFE ); -#endif } } diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 1c5bbe24f5..106255401e 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -2148,9 +2148,6 @@ ivas_error ivas_init_decoder( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM -#ifdef OBJ_EDITING_DECODER - || st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD -#endif ) ) { if ( ( error = ivas_ism_renderer_open( st_ivas ) ) != IVAS_ERR_OK ) diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index 813849d79b..48e76d2889 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -752,23 +752,13 @@ void ivas_ism_dec_digest_tc( if ( st_ivas->intern_config == IVAS_AUDIO_CONFIG_STEREO ) { -#ifdef OBJ_EDITING_DECODER - ivas_ism_get_stereo_gains( st_ivas->hIsmRendererData->edited_azimuth[i], st_ivas->hIsmRendererData->edited_elevation[i], &st_ivas->hIsmRendererData->gains[i][0], &st_ivas->hIsmRendererData->gains[i][1] ); - v_multc( st_ivas->hIsmRendererData->gains[i], st_ivas->hIsmRendererData->edited_gains[i], st_ivas->hIsmRendererData->gains[i], CPE_CHANNELS ); -#else ivas_ism_get_stereo_gains( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &st_ivas->hIsmRendererData->gains[i][0], &st_ivas->hIsmRendererData->gains[i][1] ); -#endif } else { // TODO tmu review when #215 is resolved -#ifdef OBJ_EDITING_DECODER - azimuth = (int16_t) floorf( st_ivas->hIsmRendererData->edited_azimuth[i] + 0.5f ); - elevation = (int16_t) floorf( st_ivas->hIsmRendererData->edited_elevation[i] + 0.5f ); -#else azimuth = (int16_t) floorf( st_ivas->hIsmMetaData[i]->azimuth + 0.5f ); elevation = (int16_t) floorf( st_ivas->hIsmMetaData[i]->elevation + 0.5f ); -#endif if ( ( st_ivas->renderer_type == RENDERER_TD_PANNING || st_ivas->renderer_type == RENDERER_OSBA_LS || @@ -784,9 +774,6 @@ void ivas_ism_dec_digest_tc( if ( st_ivas->hEFAPdata != NULL ) { efap_determine_gains( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains[i], azimuth, elevation, EFAP_MODE_EFAP ); -#ifdef OBJ_EDITING_DECODER - v_multc( st_ivas->hIsmRendererData->gains[i], st_ivas->hIsmRendererData->edited_gains[i], st_ivas->hIsmRendererData->gains[i], st_ivas->hEFAPdata->numSpk ); -#endif } } else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || @@ -795,9 +782,6 @@ void ivas_ism_dec_digest_tc( { /*get HOA gets for direction (ACN/SN3D)*/ ivas_dirac_dec_get_response( azimuth, elevation, st_ivas->hIsmRendererData->gains[i], st_ivas->hIntSetup.ambisonics_order ); -#ifdef OBJ_EDITING_DECODER - v_multc( st_ivas->hIsmRendererData->gains[i], st_ivas->hIsmRendererData->edited_gains[i], st_ivas->hIsmRendererData->gains[i], ivas_sba_get_nchan( st_ivas->hIntSetup.ambisonics_order, 0 ) ); -#endif } } } diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index d637bce348..b28678d24c 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -78,17 +78,6 @@ ivas_error ivas_ism_renderer_open( { set_f( st_ivas->hIsmRendererData->prev_gains[i], 0.0f, MAX_OUTPUT_CHANNELS ); set_f( st_ivas->hIsmRendererData->gains[i], 0.0f, MAX_OUTPUT_CHANNELS ); -#ifdef OBJ_EDITING_DECODER - st_ivas->hIsmRendererData->edited_gains[i] = 1.0f; - st_ivas->hIsmRendererData->edited_azimuth[i] = 0.0f; - st_ivas->hIsmRendererData->edited_elevation[i] = 0.0f; - st_ivas->hIsmRendererData->edited_pitch[i] = 0.0f; - st_ivas->hIsmRendererData->edited_yaw[i] = 0.0f; - st_ivas->hIsmRendererData->edited_radius[i] = 1.0f; - st_ivas->hIsmRendererData->last_edited_azimuth[i] = 0.0f; - st_ivas->hIsmRendererData->last_edited_elevation[i] = 0.0f; - st_ivas->hIsmRendererData->non_diegetic_flag[i] = 0; -#endif } if ( st_ivas->hDecoderConfig->Opt_tsm ) @@ -241,26 +230,15 @@ void ivas_ism_render_sf( { if ( subframe_idx >= ism_md_subframe_update_jbm ) { -#ifdef OBJ_EDITING_DECODER - rotateAziEle( st_ivas->hIsmRendererData->edited_azimuth[i], st_ivas->hIsmRendererData->edited_elevation[i], &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat[st_ivas->hCombinedOrientationData->subframe_idx], st_ivas->hIntSetup.is_planar_setup ); -#else rotateAziEle( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat[st_ivas->hCombinedOrientationData->subframe_idx], st_ivas->hIntSetup.is_planar_setup ); -#endif } else { -#ifdef OBJ_EDITING_DECODER - rotateAziEle( st_ivas->hIsmRendererData->last_edited_azimuth[i], st_ivas->hIsmRendererData->last_edited_elevation[i], &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat[st_ivas->hCombinedOrientationData->subframe_idx], st_ivas->hIntSetup.is_planar_setup ); -#else rotateAziEle( st_ivas->hIsmMetaData[i]->last_azimuth, st_ivas->hIsmMetaData[i]->last_elevation, &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat[st_ivas->hCombinedOrientationData->subframe_idx], st_ivas->hIntSetup.is_planar_setup ); -#endif } if ( st_ivas->hEFAPdata != NULL ) { efap_determine_gains( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains[i], azimuth, elevation, EFAP_MODE_EFAP ); -#ifdef OBJ_EDITING_DECODER - v_multc( st_ivas->hIsmRendererData->gains[i], st_ivas->hIsmRendererData->edited_gains[i], st_ivas->hIsmRendererData->gains[i], nchan_out_woLFE ); -#endif } } @@ -619,38 +597,3 @@ void ivas_omasa_separate_object_render_jbm( return; } -#ifdef OBJ_EDITING_DECODER -/*-------------------------------------------------------------------------* - * ivas_ism_renderer_update_md() - * - * set renderer ISM MD to the bitstream ISM MD values - *-------------------------------------------------------------------------*/ -void ivas_ism_renderer_update_md( - Decoder_Struct *st_ivas /* i/o: main IVAS decoder handle */ -) -{ - ISM_RENDERER_HANDLE hIsmRenderer; - int16_t num_obj, obj_idx; - - - num_obj = st_ivas->nchan_ism; - hIsmRenderer = st_ivas->hIsmRendererData; - - for ( obj_idx = 0; obj_idx < num_obj; obj_idx++ ) - { - hIsmRenderer->last_edited_azimuth[obj_idx] = hIsmRenderer->edited_azimuth[obj_idx]; - hIsmRenderer->last_edited_elevation[obj_idx] = hIsmRenderer->edited_elevation[obj_idx]; - hIsmRenderer->edited_azimuth[obj_idx] = st_ivas->hIsmMetaData[obj_idx]->azimuth; - hIsmRenderer->edited_elevation[obj_idx] = st_ivas->hIsmMetaData[obj_idx]->elevation; - hIsmRenderer->edited_radius[obj_idx] = st_ivas->hIsmMetaData[obj_idx]->radius; - hIsmRenderer->edited_yaw[obj_idx] = st_ivas->hIsmMetaData[obj_idx]->yaw; - hIsmRenderer->edited_pitch[obj_idx] = st_ivas->hIsmMetaData[obj_idx]->pitch; - hIsmRenderer->edited_gains[obj_idx] = st_ivas->hIsmMetaData[obj_idx]->gain; - hIsmRenderer->non_diegetic_flag[obj_idx] = st_ivas->hIsmMetaData[obj_idx]->non_diegetic_flag; - } - - return; -} - - -#endif diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 460f6e37cc..402b3adacd 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -190,12 +190,6 @@ ivas_error ivas_jbm_dec_tc( hp20( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); } -#ifdef OBJ_EDITING_DECODER - if ( st_ivas->ism_mode != ISM_MODE_PARAM && ( st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_EXTERNAL && st_ivas->renderer_type != RENDERER_MONO_DOWNMIX ) ) - { - ivas_ism_renderer_update_md( st_ivas ); - } -#endif if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX ) { diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index 911113773c..6dd6612556 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -173,38 +173,10 @@ ivas_error ivas_td_binaural_renderer_sf( } if ( subframe_idx == ism_md_subframe_update_jbm ) { -#ifdef OBJ_EDITING_DECODER - if ( st_ivas->ivas_format == ISM_FORMAT ) - { - ISM_METADATA_FRAME ismMetaData[MAX_NUM_OBJECTS]; - ISM_METADATA_HANDLE hIsmMetaData[MAX_NUM_OBJECTS]; - for ( nS = 0; nS < nchan_ism; nS++ ) - { - ismMetaData[nS].azimuth = st_ivas->hIsmRendererData->edited_azimuth[nS]; - ismMetaData[nS].elevation = st_ivas->hIsmRendererData->edited_elevation[nS]; - ismMetaData[nS].radius = st_ivas->hIsmRendererData->edited_radius[nS]; - ismMetaData[nS].yaw = st_ivas->hIsmRendererData->edited_yaw[nS]; - ismMetaData[nS].pitch = st_ivas->hIsmRendererData->edited_pitch[nS]; - ismMetaData[nS].non_diegetic_flag = st_ivas->hIsmRendererData->non_diegetic_flag[nS]; - ismMetaData[nS].gain = st_ivas->hIsmRendererData->edited_gains[nS]; - hIsmMetaData[nS] = &ismMetaData[nS]; - } - - if ( ( error = TDREND_Update_object_positions( st_ivas->hBinRendererTd, nchan_ism, st_ivas->ivas_format, hIsmMetaData ) ) != IVAS_ERR_OK ) - { - return error; - } - } - else - { -#endif if ( ( error = TDREND_Update_object_positions( st_ivas->hBinRendererTd, nchan_ism, st_ivas->ivas_format, st_ivas->hIsmMetaData ) ) != IVAS_ERR_OK ) { return error; } -#ifdef OBJ_EDITING_DECODER - } -#endif } /* Update the listener's location/orientation */ diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index cbd94f5414..38efc50126 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -809,17 +809,6 @@ typedef struct renderer_struct float *interpolator; int16_t interpolator_length; float gains[MAX_NUM_OBJECTS][MAX_OUTPUT_CHANNELS]; -#ifdef OBJ_EDITING_DECODER - float edited_gains[MAX_NUM_OBJECTS]; - float edited_azimuth[MAX_NUM_OBJECTS]; - float edited_elevation[MAX_NUM_OBJECTS]; - float edited_yaw[MAX_NUM_OBJECTS]; - float edited_pitch[MAX_NUM_OBJECTS]; - float edited_radius[MAX_NUM_OBJECTS]; - float last_edited_azimuth[MAX_NUM_OBJECTS]; - float last_edited_elevation[MAX_NUM_OBJECTS]; - int16_t non_diegetic_flag[MAX_NUM_OBJECTS]; -#endif } ISM_RENDERER_DATA, *ISM_RENDERER_HANDLE; @@ -939,10 +928,6 @@ typedef struct ivas_masa_ism_data_structure int16_t azimuth_ism_edited[MAX_NUM_OBJECTS]; int16_t elevation_ism_edited[MAX_NUM_OBJECTS]; uint8_t ism_is_edited[MAX_NUM_OBJECTS]; -#ifdef OBJ_EDITING_DECODER - float gain_ism[MAX_NUM_OBJECTS]; - float gain_masa; -#endif int16_t idx_separated_ism; int16_t azimuth_separated_ism[MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR]; diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index c9ca141b25..7eb639c14e 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1038,7 +1038,6 @@ ivas_error IVAS_DEC_GetEditableParameters( hIvasEditableParameters->ism_metadata[obj].yaw = hIvasDec->st_ivas->hIsmMetaData[obj]->yaw; hIvasEditableParameters->ism_metadata[obj].pitch = hIvasDec->st_ivas->hIsmMetaData[obj]->pitch; hIvasEditableParameters->ism_metadata[obj].radius = hIvasDec->st_ivas->hIsmMetaData[obj]->radius; - hIvasEditableParameters->ism_metadata[obj].gain = hIvasDec->st_ivas->hIsmMetaData[obj]->gain; hIvasEditableParameters->ism_metadata[obj].non_diegetic_flag = hIvasDec->st_ivas->hIsmMetaData[obj]->non_diegetic_flag; } } @@ -1076,19 +1075,12 @@ ivas_error IVAS_DEC_SetEditableParameters( #ifdef DEBUGGING assert( hIvasEditableParameters.num_obj == hIvasDec->st_ivas->nchan_ism ); #endif - + /* transfer edited values to the decoder */ if ( hIvasDec->st_ivas->ivas_format == ISM_FORMAT || hIvasDec->st_ivas->ivas_format == SBA_ISM_FORMAT ) { int16_t obj; for ( obj = 0; obj < hIvasEditableParameters.num_obj; obj++ ) { - hIvasDec->st_ivas->hIsmRendererData->edited_azimuth[obj] = hIvasEditableParameters.ism_metadata[obj].azimuth; - hIvasDec->st_ivas->hIsmRendererData->edited_elevation[obj] = hIvasEditableParameters.ism_metadata[obj].elevation; - hIvasDec->st_ivas->hIsmRendererData->edited_yaw[obj] = hIvasEditableParameters.ism_metadata[obj].yaw; - hIvasDec->st_ivas->hIsmRendererData->edited_pitch[obj] = hIvasEditableParameters.ism_metadata[obj].pitch; - hIvasDec->st_ivas->hIsmRendererData->edited_radius[obj] = hIvasEditableParameters.ism_metadata[obj].radius; - hIvasDec->st_ivas->hIsmRendererData->edited_gains[obj] = hIvasEditableParameters.ism_metadata[obj].gain; - hIvasDec->st_ivas->hIsmRendererData->non_diegetic_flag[obj] = hIvasEditableParameters.ism_metadata[obj].non_diegetic_flag; } } else if ( hIvasDec->st_ivas->ivas_format == MASA_ISM_FORMAT ) diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index e2f5caf06e..f6a14f66f0 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -475,9 +475,6 @@ static void TDREND_Clear_Update_flags( for ( i = 0; i < hBinRendererTd->NumOfSrcs; i++ ) { hBinRendererTd->Sources[i]->SrcSpatial_p->Updated = FALSE; -#ifdef OBJ_EDITING_DECODER - hBinRendererTd->Sources[i]->SrcRend_p->SrcGainUpdated = FALSE; -#endif } return; @@ -545,12 +542,6 @@ ivas_error TDREND_Update_object_positions( { return error; } -#ifdef OBJ_EDITING_DECODER - if ( ( error = TDREND_MIX_SRC_SetSrcGain( hBinRendererTd, nS, hIsmMetaData[nS]->gain ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif } } diff --git a/lib_rend/ivas_objectRenderer_sources.c b/lib_rend/ivas_objectRenderer_sources.c index 5969236038..3f580df504 100644 --- a/lib_rend/ivas_objectRenderer_sources.c +++ b/lib_rend/ivas_objectRenderer_sources.c @@ -153,36 +153,6 @@ ivas_error TDREND_MIX_SRC_SetDirAtten( return IVAS_ERR_OK; } -#ifdef OBJ_EDITING_DECODER -/*-------------------------------------------------------------------* - * TDREND_MIX_SRC_SetSrcGain() - * - * Set the source (i.e. overall gain) for a source for the mixer. - --------------------------------------------------------------------*/ - -ivas_error TDREND_MIX_SRC_SetSrcGain( - BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ - const int16_t SrcInd, /* i : Source index */ - const float SrcGain_p /* i : Source gain */ -) -{ - if ( SrcInd > hBinRendererTd->MaxSrcInd ) - { - return ( IVAS_ERROR( IVAS_ERR_INVALID_INDEX, "Index exceeds max index\n" ) ); - } - else if ( SrcGain_p < *hBinRendererTd->Sources[SrcInd]->SrcRend_p->SrcGainMin_p || SrcGain_p > *hBinRendererTd->Sources[SrcInd]->SrcRend_p->SrcGainMax_p ) - { - return ( IVAS_ERROR( IVAS_ERR_INVALID_INDEX, "gain exceeds gain limits\n" ) ); - } - else - { - *hBinRendererTd->Sources[SrcInd]->SrcRend_p->SrcGain_p = SrcGain_p; - hBinRendererTd->Sources[SrcInd]->SrcRend_p->SrcGainUpdated = TRUE; - } - - return IVAS_ERR_OK; -} -#endif /*-------------------------------------------------------------------* * TDREND_MIX_SRC_SetPlayState() @@ -254,11 +224,7 @@ static void TDREND_SRC_REND_Init( { SrcRend_p->SrcGainMin_p[nC] = 0.0f; SrcRend_p->SrcGain_p[nC] = 1.0f; -#ifdef OBJ_EDITING_DECODER - SrcRend_p->SrcGainMax_p[nC] = 2.0f; -#else SrcRend_p->SrcGainMax_p[nC] = 1.0f; -#endif } SrcRend_p->SrcGainUpdated = FALSE; diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index a423b83961..179b150e81 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -729,13 +729,6 @@ ivas_error TDREND_MIX_SRC_SetPlayState( const TDREND_PlayStatus_t PlayStatus /* i : Play state */ ); -#ifdef OBJ_EDITING_DECODER -ivas_error TDREND_MIX_SRC_SetSrcGain( - BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ - const int16_t SrcInd, /* i : Source index */ - const float SrcGain_p /* i : Source gain */ -); -#endif void TDREND_SRC_REND_UpdateFiltersFromSpatialParams( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ -- GitLab From c4cbdc8542c0913554e503d42809b8b98231b4da Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Tue, 30 Apr 2024 12:31:15 +0200 Subject: [PATCH 11/11] object editing api, fix problem with EVS and JBM, clang-format --- lib_dec/ivas_init_dec.c | 3 +-- lib_dec/ivas_ism_renderer.c | 1 - lib_dec/ivas_objectRenderer_internal.c | 8 ++++---- lib_dec/lib_dec.c | 6 ++++++ 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 106255401e..34e876b22a 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -2147,8 +2147,7 @@ ivas_error ivas_init_decoder( st_ivas->renderer_type == RENDERER_OSBA_LS || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || - st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM - ) ) + st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) { if ( ( error = ivas_ism_renderer_open( st_ivas ) ) != IVAS_ERR_OK ) { diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index b28678d24c..b890dd98e5 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -596,4 +596,3 @@ void ivas_omasa_separate_object_render_jbm( return; } - diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index 6dd6612556..174aac81da 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -173,10 +173,10 @@ ivas_error ivas_td_binaural_renderer_sf( } if ( subframe_idx == ism_md_subframe_update_jbm ) { - if ( ( error = TDREND_Update_object_positions( st_ivas->hBinRendererTd, nchan_ism, st_ivas->ivas_format, st_ivas->hIsmMetaData ) ) != IVAS_ERR_OK ) - { - return error; - } + if ( ( error = TDREND_Update_object_positions( st_ivas->hBinRendererTd, nchan_ism, st_ivas->ivas_format, st_ivas->hIsmMetaData ) ) != IVAS_ERR_OK ) + { + return error; + } } /* Update the listener's location/orientation */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 7eb639c14e..0153363b96 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -937,10 +937,16 @@ ivas_error IVAS_DEC_FeedFrame_Serial( #ifdef OBJ_EDITING_API /* decode TCs, do TSM and feed to renderer */ /* setup */ + /* special case for EVS and JBM needed here */ + if ( !( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm && !hIvasDec->hasBeenFedFirstGoodFrame && hIvasDec->mode == IVAS_DEC_MODE_EVS ) ) { uint16_t l_ts, nTimeScalerOutSamples; uint8_t nTransportChannels, nOutChannels; int16_t nResidualSamples, nSamplesTcsScaled, nOutSamplesElse; + + l_ts = 0; + nTransportChannels = 0; + #ifdef SPLIT_REND_WITH_HEAD_ROT if ( ( error = IVAS_DEC_Setup( hIvasDec, &l_ts, &nTransportChannels, &nOutChannels, &hIvasDec->nSamplesFlushed, hIvasDec->pcmType, hIvasDec->flushbuffer ) ) != IVAS_ERR_OK ) #else -- GitLab