Loading lib_com/options.h +3 −0 Original line number Diff line number Diff line Loading @@ -179,6 +179,9 @@ #define FIX_ITD_CNG /* Eri: Fix for CNG ITD */ #define FIX_REND_ISM_XFADE /* Issue 193: Crossfade inconsistencies in ISM between decoder and external renderer */ #define FIX_REND_ISM_POS_ROUNDING /* Issue 193: (TEMPORARY! Pending fix for #215) Align rounding of ISM position data in external renderer */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ #endif lib_dec/ivas_ism_renderer.c +10 −0 Original line number Diff line number Diff line Loading @@ -82,7 +82,11 @@ ivas_error ivas_ism_renderer_open( interpolator_length = (uint16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); for ( i = 0; i < interpolator_length; i++ ) { #ifdef FIX_REND_ISM_XFADE st_ivas->hIsmRendererData->interpolator[i] = (float) i / ( (float) interpolator_length - 1 ); #else st_ivas->hIsmRendererData->interpolator[i] = (float) i / ( (float) interpolator_length ); #endif } return error; Loading Loading @@ -180,8 +184,14 @@ void ivas_ism_render( } else { #ifdef FIX_REND_ISM_POS_ROUNDING // TODO tmu review when #215 is resolved azimuth = (int16_t) floorf( st_ivas->hIsmMetaData[i]->azimuth + 0.5f ); elevation = (int16_t) floorf( st_ivas->hIsmMetaData[i]->elevation + 0.5f ); #else azimuth = (int16_t) ( st_ivas->hIsmMetaData[i]->azimuth + 0.5f ); elevation = (int16_t) ( st_ivas->hIsmMetaData[i]->elevation + 0.5f ); #endif if ( st_ivas->hIntSetup.is_planar_setup ) { Loading lib_rend/ivas_sba_rendering.c +15 −0 Original line number Diff line number Diff line Loading @@ -308,20 +308,35 @@ void ivas_ism2sba( for ( i = 0; i < num_objects; i++ ) { #ifdef FIX_REND_ISM_POS_ROUNDING // TODO tmu review when #215 is resolved azimuth = (int16_t) floorf( hIsmMetaData[i]->azimuth + 0.5f ); elevation = (int16_t) floorf( hIsmMetaData[i]->elevation + 0.5f ); #else azimuth = (int16_t) ( hIsmMetaData[i]->azimuth + 0.5f ); elevation = (int16_t) ( hIsmMetaData[i]->elevation + 0.5f ); #endif /*get HOA gets for direction (ACN/SN3D)*/ ivas_dirac_dec_get_response( azimuth, elevation, gains, sba_order ); for ( j = 0; j < sba_num_chans; j++ ) { #ifdef FIX_REND_ISM_XFADE g1 = 1.f; #endif g2 = 0.f; for ( k = 0; k < output_frame; k++ ) { #ifdef FIX_REND_ISM_XFADE buffer_tmp[j][k] += ( g2 * gains[j] + g1 * hIsmRendererData->prev_gains[i][j] ) * buffer_td[i][k]; g2 += 1.f / ( output_frame - 1 ); g1 = 1.0f - g2; #else g2 += 1.f / output_frame; g1 = 1.0f - g2; buffer_tmp[j][k] += ( g2 * gains[j] + g1 * hIsmRendererData->prev_gains[i][j] ) * buffer_td[i][k]; #endif } hIsmRendererData->prev_gains[i][j] = gains[j]; } Loading lib_rend/lib_rend.c +33 −1 Original line number Diff line number Diff line Loading @@ -3791,11 +3791,27 @@ static ivas_error renderIsmToMc( wmops_sub_start( "renderIsmToMc" ); /* TODO(sgi): Possible optimization: less processing needed if position didn't change */ #ifdef FIX_REND_ISM_POS_ROUNDING // TODO tmu review when #215 is resolved if ( ( error = getEfapGains( *ismInput->base.ctx.pEfapOutWrapper, (int16_t) floorf( ismInput->currentPos.azimuth + 0.5f ), (int16_t) floorf( ismInput->currentPos.elevation + 0.5f ), currentPanGains ) ) != IVAS_ERR_OK ) #else if ( ( error = getEfapGains( *ismInput->base.ctx.pEfapOutWrapper, ismInput->currentPos.azimuth, ismInput->currentPos.elevation, currentPanGains ) ) != IVAS_ERR_OK ) #endif { return error; } #ifdef FIX_REND_ISM_POS_ROUNDING // TODO tmu review when #215 is resolved if ( ( error = getEfapGains( *ismInput->base.ctx.pEfapOutWrapper, (int16_t) floorf( ismInput->previousPos.azimuth + 0.5f ), (int16_t) floorf( ismInput->previousPos.elevation + 0.5f ), previousPanGains ) ) != IVAS_ERR_OK ) #else if ( ( error = getEfapGains( *ismInput->base.ctx.pEfapOutWrapper, ismInput->previousPos.azimuth, ismInput->previousPos.elevation, previousPanGains ) ) != IVAS_ERR_OK ) #endif { return error; } Loading Loading @@ -3832,7 +3848,15 @@ static ivas_error renderIsmToSba( return error; } #ifdef FIX_REND_ISM_POS_ROUNDING // TODO tmu review when #215 is resolved ivas_dirac_dec_get_response( (int16_t) floorf( ismInput->previousPos.azimuth + 0.5f ), (int16_t) floorf( ismInput->previousPos.elevation + 0.5f ), previousPanGains, ambiOrderOut ); #else ivas_dirac_dec_get_response( (int16_t) ismInput->previousPos.azimuth, (int16_t) ismInput->previousPos.elevation, previousPanGains, ambiOrderOut ); #endif if ( ( ismInput->currentPos.azimuth == ismInput->previousPos.azimuth ) && ( ismInput->currentPos.elevation == ismInput->previousPos.elevation ) ) Loading @@ -3841,7 +3865,15 @@ static ivas_error renderIsmToSba( } else { #ifdef FIX_REND_ISM_POS_ROUNDING // TODO tmu review when #215 is resolved ivas_dirac_dec_get_response( (int16_t) floorf( ismInput->currentPos.azimuth + 0.5f ), (int16_t) floorf( ismInput->currentPos.elevation + 0.5f ), currentPanGains, ambiOrderOut ); #else ivas_dirac_dec_get_response( (int16_t) ismInput->currentPos.azimuth, (int16_t) ismInput->currentPos.elevation, currentPanGains, ambiOrderOut ); #endif } /* Assume num channels in audio buffer to be 1. Loading Loading
lib_com/options.h +3 −0 Original line number Diff line number Diff line Loading @@ -179,6 +179,9 @@ #define FIX_ITD_CNG /* Eri: Fix for CNG ITD */ #define FIX_REND_ISM_XFADE /* Issue 193: Crossfade inconsistencies in ISM between decoder and external renderer */ #define FIX_REND_ISM_POS_ROUNDING /* Issue 193: (TEMPORARY! Pending fix for #215) Align rounding of ISM position data in external renderer */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ #endif
lib_dec/ivas_ism_renderer.c +10 −0 Original line number Diff line number Diff line Loading @@ -82,7 +82,11 @@ ivas_error ivas_ism_renderer_open( interpolator_length = (uint16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); for ( i = 0; i < interpolator_length; i++ ) { #ifdef FIX_REND_ISM_XFADE st_ivas->hIsmRendererData->interpolator[i] = (float) i / ( (float) interpolator_length - 1 ); #else st_ivas->hIsmRendererData->interpolator[i] = (float) i / ( (float) interpolator_length ); #endif } return error; Loading Loading @@ -180,8 +184,14 @@ void ivas_ism_render( } else { #ifdef FIX_REND_ISM_POS_ROUNDING // TODO tmu review when #215 is resolved azimuth = (int16_t) floorf( st_ivas->hIsmMetaData[i]->azimuth + 0.5f ); elevation = (int16_t) floorf( st_ivas->hIsmMetaData[i]->elevation + 0.5f ); #else azimuth = (int16_t) ( st_ivas->hIsmMetaData[i]->azimuth + 0.5f ); elevation = (int16_t) ( st_ivas->hIsmMetaData[i]->elevation + 0.5f ); #endif if ( st_ivas->hIntSetup.is_planar_setup ) { Loading
lib_rend/ivas_sba_rendering.c +15 −0 Original line number Diff line number Diff line Loading @@ -308,20 +308,35 @@ void ivas_ism2sba( for ( i = 0; i < num_objects; i++ ) { #ifdef FIX_REND_ISM_POS_ROUNDING // TODO tmu review when #215 is resolved azimuth = (int16_t) floorf( hIsmMetaData[i]->azimuth + 0.5f ); elevation = (int16_t) floorf( hIsmMetaData[i]->elevation + 0.5f ); #else azimuth = (int16_t) ( hIsmMetaData[i]->azimuth + 0.5f ); elevation = (int16_t) ( hIsmMetaData[i]->elevation + 0.5f ); #endif /*get HOA gets for direction (ACN/SN3D)*/ ivas_dirac_dec_get_response( azimuth, elevation, gains, sba_order ); for ( j = 0; j < sba_num_chans; j++ ) { #ifdef FIX_REND_ISM_XFADE g1 = 1.f; #endif g2 = 0.f; for ( k = 0; k < output_frame; k++ ) { #ifdef FIX_REND_ISM_XFADE buffer_tmp[j][k] += ( g2 * gains[j] + g1 * hIsmRendererData->prev_gains[i][j] ) * buffer_td[i][k]; g2 += 1.f / ( output_frame - 1 ); g1 = 1.0f - g2; #else g2 += 1.f / output_frame; g1 = 1.0f - g2; buffer_tmp[j][k] += ( g2 * gains[j] + g1 * hIsmRendererData->prev_gains[i][j] ) * buffer_td[i][k]; #endif } hIsmRendererData->prev_gains[i][j] = gains[j]; } Loading
lib_rend/lib_rend.c +33 −1 Original line number Diff line number Diff line Loading @@ -3791,11 +3791,27 @@ static ivas_error renderIsmToMc( wmops_sub_start( "renderIsmToMc" ); /* TODO(sgi): Possible optimization: less processing needed if position didn't change */ #ifdef FIX_REND_ISM_POS_ROUNDING // TODO tmu review when #215 is resolved if ( ( error = getEfapGains( *ismInput->base.ctx.pEfapOutWrapper, (int16_t) floorf( ismInput->currentPos.azimuth + 0.5f ), (int16_t) floorf( ismInput->currentPos.elevation + 0.5f ), currentPanGains ) ) != IVAS_ERR_OK ) #else if ( ( error = getEfapGains( *ismInput->base.ctx.pEfapOutWrapper, ismInput->currentPos.azimuth, ismInput->currentPos.elevation, currentPanGains ) ) != IVAS_ERR_OK ) #endif { return error; } #ifdef FIX_REND_ISM_POS_ROUNDING // TODO tmu review when #215 is resolved if ( ( error = getEfapGains( *ismInput->base.ctx.pEfapOutWrapper, (int16_t) floorf( ismInput->previousPos.azimuth + 0.5f ), (int16_t) floorf( ismInput->previousPos.elevation + 0.5f ), previousPanGains ) ) != IVAS_ERR_OK ) #else if ( ( error = getEfapGains( *ismInput->base.ctx.pEfapOutWrapper, ismInput->previousPos.azimuth, ismInput->previousPos.elevation, previousPanGains ) ) != IVAS_ERR_OK ) #endif { return error; } Loading Loading @@ -3832,7 +3848,15 @@ static ivas_error renderIsmToSba( return error; } #ifdef FIX_REND_ISM_POS_ROUNDING // TODO tmu review when #215 is resolved ivas_dirac_dec_get_response( (int16_t) floorf( ismInput->previousPos.azimuth + 0.5f ), (int16_t) floorf( ismInput->previousPos.elevation + 0.5f ), previousPanGains, ambiOrderOut ); #else ivas_dirac_dec_get_response( (int16_t) ismInput->previousPos.azimuth, (int16_t) ismInput->previousPos.elevation, previousPanGains, ambiOrderOut ); #endif if ( ( ismInput->currentPos.azimuth == ismInput->previousPos.azimuth ) && ( ismInput->currentPos.elevation == ismInput->previousPos.elevation ) ) Loading @@ -3841,7 +3865,15 @@ static ivas_error renderIsmToSba( } else { #ifdef FIX_REND_ISM_POS_ROUNDING // TODO tmu review when #215 is resolved ivas_dirac_dec_get_response( (int16_t) floorf( ismInput->currentPos.azimuth + 0.5f ), (int16_t) floorf( ismInput->currentPos.elevation + 0.5f ), currentPanGains, ambiOrderOut ); #else ivas_dirac_dec_get_response( (int16_t) ismInput->currentPos.azimuth, (int16_t) ismInput->currentPos.elevation, currentPanGains, ambiOrderOut ); #endif } /* Assume num channels in audio buffer to be 1. Loading